sha_locl.h revision 392aa7cc7d2b122614c5393c3e357da07fd07af3
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/* crypto/sha/sha_locl.h */
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * All rights reserved.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This package is an SSL implementation written
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * by Eric Young (eay@cryptsoft.com).
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The implementation was written so as to conform with Netscapes SSL.
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * This library is free for commercial and non-commercial use as long as
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * the following conditions are aheared to.  The following conditions
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * apply to all code found in this distribution, be it the RC4, RSA,
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * included with this distribution is covered by the same copyright terms
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * except that the holder is Tim Hudson (tjh@cryptsoft.com).
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Copyright remains Eric Young's, and as such any Copyright notices in
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * the code are not to be removed.
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * If this package is used in a product, Eric Young should be given attribution
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * as the author of the parts of the library used.
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * This can be in the form of a textual message at program startup or
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * in documentation (online or textual) provided with the package.
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch * Redistribution and use in source and binary forms, with or without
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * modification, are permitted provided that the following conditions
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * are met:
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * 1. Redistributions of source code must retain the copyright
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * 3. All advertising materials mentioning features or use of this software
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    must display the following acknowledgement:
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    "This product includes cryptographic software written by
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *     Eric Young (eay@cryptsoft.com)"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    The word 'cryptographic' can be left out if the rouines from the library
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    being used are not cryptographic related :-).
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 4. If you include any Windows specific code (or a derivative thereof) from
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    the apps directory (application code) you must include an acknowledgement:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * SUCH DAMAGE.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * The licence and distribution terms for any publically available version or
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * derivative of this code cannot be changed.  i.e. this code cannot simply be
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * copied and put under another distribution licence
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * [including the GNU Public Licence.]
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdlib.h>
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h>
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <openssl/opensslconf.h>
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <openssl/sha.h>
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define DATA_ORDER_IS_BIG_ENDIAN
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HASH_LONG               SHA_LONG
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HASH_CTX                SHA_CTX
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HASH_CBLOCK             SHA_CBLOCK
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HASH_MAKE_STRING(c,s)   do {	\
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned long ll;		\
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ll=(c)->h0; HOST_l2c(ll,(s));	\
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ll=(c)->h1; HOST_l2c(ll,(s));	\
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ll=(c)->h2; HOST_l2c(ll,(s));	\
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ll=(c)->h3; HOST_l2c(ll,(s));	\
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	ll=(c)->h4; HOST_l2c(ll,(s));	\
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	} while (0)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(SHA_0)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_UPDATE             	SHA_Update
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_TRANSFORM          	SHA_Transform
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_FINAL              	SHA_Final
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# define HASH_INIT			SHA_Init
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch# define HASH_BLOCK_DATA_ORDER   	sha_block_data_order
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define Xupdate(a,ix,ia,ib,ic,id)	(ix=(a)=(ia^ib^ic^id))
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void sha_block_data_order (SHA_CTX *c, const void *p,size_t num);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(SHA_1)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_UPDATE             	SHA1_Update
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_TRANSFORM          	SHA1_Transform
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_FINAL              	SHA1_Final
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_INIT			SHA1_Init
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define HASH_BLOCK_DATA_ORDER   	sha1_block_data_order
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# if defined(__MWERKS__) && defined(__MC68K__)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* Metrowerks for Motorola fails otherwise:-( <appro@fy.chalmers.se> */
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  define Xupdate(a,ix,ia,ib,ic,id)	do { (a)=(ia^ib^ic^id);		\
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)					     ix=(a)=ROTATE((a),1);	\
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)					} while (0)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# else
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  define Xupdate(a,ix,ia,ib,ic,id)	( (a)=(ia^ib^ic^id),	\
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)					  ix=(a)=ROTATE((a),1)	\
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)					)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# endif
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SHA1_ASM
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void sha1_block_data_order (SHA_CTX *c, const void *p,size_t num);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# error "Either SHA_0 or SHA_1 must be defined."
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "md32_common.h"
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define INIT_DATA_h0 0x67452301UL
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define INIT_DATA_h1 0xefcdab89UL
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define INIT_DATA_h2 0x98badcfeUL
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define INIT_DATA_h3 0x10325476UL
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define INIT_DATA_h4 0xc3d2e1f0UL
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SHA_0
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)fips_md_init(SHA)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)fips_md_init_ctx(SHA1, SHA)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	memset (c,0,sizeof(*c));
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h0=INIT_DATA_h0;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h1=INIT_DATA_h1;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h2=INIT_DATA_h2;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h3=INIT_DATA_h3;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h4=INIT_DATA_h4;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	return 1;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define K_00_19	0x5a827999UL
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define K_20_39 0x6ed9eba1UL
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define K_40_59 0x8f1bbcdcUL
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define K_60_79 0xca62c1d6UL
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* As  pointed out by Wei Dai <weidai@eskimo.com>, F() below can be
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * simplified to the code in F_00_19.  Wei attributes these optimisations
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * #define F(x,y,z) (((x) & (y))  |  ((~(x)) & (z)))
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * I've just become aware of another tweak to be made, again from Wei Dai,
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * in F_40_59, (x&a)|(y&a) -> (x|y)&a
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) */
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define	F_00_19(b,c,d)	((((c) ^ (d)) & (b)) ^ (d))
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define	F_20_39(b,c,d)	((b) ^ (c) ^ (d))
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define F_40_59(b,c,d)	(((b) & (c)) | (((b)|(c)) & (d)))
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define	F_60_79(b,c,d)	F_20_39(b,c,d)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef OPENSSL_SMALL_FOOTPRINT
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_00_15(i,a,b,c,d,e,f,xi) \
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(f)=xi+(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(b)=ROTATE((b),30);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_16_19(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(f,xi,xa,xb,xc,xd); \
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(f)+=(e)+K_00_19+ROTATE((a),5)+F_00_19((b),(c),(d)); \
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(b)=ROTATE((b),30);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_20_31(i,a,b,c,d,e,f,xi,xa,xb,xc,xd) \
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(f,xi,xa,xb,xc,xd); \
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(b)=ROTATE((b),30);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_32_39(i,a,b,c,d,e,f,xa,xb,xc,xd) \
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(f,xa,xa,xb,xc,xd); \
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(f)+=(e)+K_20_39+ROTATE((a),5)+F_20_39((b),(c),(d)); \
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(b)=ROTATE((b),30);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_40_59(i,a,b,c,d,e,f,xa,xb,xc,xd) \
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(f,xa,xa,xb,xc,xd); \
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(f)+=(e)+K_40_59+ROTATE((a),5)+F_40_59((b),(c),(d)); \
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	(b)=ROTATE((b),30);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define BODY_60_79(i,a,b,c,d,e,f,xa,xb,xc,xd) \
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	Xupdate(f,xa,xa,xb,xc,xd); \
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	(f)=xa+(e)+K_60_79+ROTATE((a),5)+F_60_79((b),(c),(d)); \
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	(b)=ROTATE((b),30);
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifdef X
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#undef X
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MD32_XARRAY
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /*
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * Originally X was an array. As it's automatic it's natural
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * to expect RISC compiler to accomodate at least part of it in
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * the register bank, isn't it? Unfortunately not all compilers
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * "find" this expectation reasonable:-( On order to make such
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * compilers generate better code I replace X[] with a bunch of
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * X0, X1, etc. See the function body below...
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   *					<appro@fy.chalmers.se>
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# define X(i)	XX##i
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /*
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * However! Some compilers (most notably HP C) get overwhelmed by
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   * that many local variables so that we have to have the way to
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   * fall down to the original behavior.
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   */
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)# define X(i)	XX[i]
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(SHA_1) || !defined(SHA1_ASM)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void HASH_BLOCK_DATA_ORDER (SHA_CTX *c, const void *p, size_t num)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	const unsigned char *data=p;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	register unsigned MD32_REG_T A,B,C,D,E,T,l;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MD32_XARRAY
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	unsigned MD32_REG_T	XX0, XX1, XX2, XX3, XX4, XX5, XX6, XX7,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)				XX8, XX9,XX10,XX11,XX12,XX13,XX14,XX15;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	SHA_LONG	XX[16];
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	A=c->h0;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	B=c->h1;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	C=c->h2;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	D=c->h3;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	E=c->h4;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (;;)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			{
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	const union { long one; char little; } is_endian = {1};
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)	if (!is_endian.little && sizeof(SHA_LONG)==4 && ((size_t)p%4)==0)
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)		{
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)		const SHA_LONG *W=(const SHA_LONG *)data;
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)		X( 0) = W[0];				X( 1) = W[ 1];
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 0,A,B,C,D,E,T,X( 0));	X( 2) = W[ 2];
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 1,T,A,B,C,D,E,X( 1));	X( 3) = W[ 3];
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 2,E,T,A,B,C,D,X( 2));	X( 4) = W[ 4];
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 3,D,E,T,A,B,C,X( 3));	X( 5) = W[ 5];
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 4,C,D,E,T,A,B,X( 4));	X( 6) = W[ 6];
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 5,B,C,D,E,T,A,X( 5));	X( 7) = W[ 7];
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 6,A,B,C,D,E,T,X( 6));	X( 8) = W[ 8];
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 7,T,A,B,C,D,E,X( 7));	X( 9) = W[ 9];
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 8,E,T,A,B,C,D,X( 8));	X(10) = W[10];
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 9,D,E,T,A,B,C,X( 9));	X(11) = W[11];
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(10,C,D,E,T,A,B,X(10));	X(12) = W[12];
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(11,B,C,D,E,T,A,X(11));	X(13) = W[13];
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(12,A,B,C,D,E,T,X(12));	X(14) = W[14];
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(13,T,A,B,C,D,E,X(13));	X(15) = W[15];
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(14,E,T,A,B,C,D,X(14));
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(15,D,E,T,A,B,C,X(15));
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		data += SHA_CBLOCK;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	else
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		{
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		HOST_c2l(data,l); X( 0)=l;		HOST_c2l(data,l); X( 1)=l;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 0,A,B,C,D,E,T,X( 0));	HOST_c2l(data,l); X( 2)=l;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 1,T,A,B,C,D,E,X( 1));	HOST_c2l(data,l); X( 3)=l;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 2,E,T,A,B,C,D,X( 2));	HOST_c2l(data,l); X( 4)=l;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 3,D,E,T,A,B,C,X( 3));	HOST_c2l(data,l); X( 5)=l;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 4,C,D,E,T,A,B,X( 4));	HOST_c2l(data,l); X( 6)=l;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 5,B,C,D,E,T,A,X( 5));	HOST_c2l(data,l); X( 7)=l;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 6,A,B,C,D,E,T,X( 6));	HOST_c2l(data,l); X( 8)=l;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 7,T,A,B,C,D,E,X( 7));	HOST_c2l(data,l); X( 9)=l;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 8,E,T,A,B,C,D,X( 8));	HOST_c2l(data,l); X(10)=l;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15( 9,D,E,T,A,B,C,X( 9));	HOST_c2l(data,l); X(11)=l;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(10,C,D,E,T,A,B,X(10));	HOST_c2l(data,l); X(12)=l;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(11,B,C,D,E,T,A,X(11));	HOST_c2l(data,l); X(13)=l;
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(12,A,B,C,D,E,T,X(12));	HOST_c2l(data,l); X(14)=l;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(13,T,A,B,C,D,E,X(13));	HOST_c2l(data,l); X(15)=l;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(14,E,T,A,B,C,D,X(14));
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		BODY_00_15(15,D,E,T,A,B,C,X(15));
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		}
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_16_19(16,C,D,E,T,A,B,X( 0),X( 0),X( 2),X( 8),X(13));
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_16_19(17,B,C,D,E,T,A,X( 1),X( 1),X( 3),X( 9),X(14));
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_16_19(18,A,B,C,D,E,T,X( 2),X( 2),X( 4),X(10),X(15));
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_16_19(19,T,A,B,C,D,E,X( 3),X( 3),X( 5),X(11),X( 0));
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_20_31(20,E,T,A,B,C,D,X( 4),X( 4),X( 6),X(12),X( 1));
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(21,D,E,T,A,B,C,X( 5),X( 5),X( 7),X(13),X( 2));
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(22,C,D,E,T,A,B,X( 6),X( 6),X( 8),X(14),X( 3));
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(23,B,C,D,E,T,A,X( 7),X( 7),X( 9),X(15),X( 4));
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(24,A,B,C,D,E,T,X( 8),X( 8),X(10),X( 0),X( 5));
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(25,T,A,B,C,D,E,X( 9),X( 9),X(11),X( 1),X( 6));
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(26,E,T,A,B,C,D,X(10),X(10),X(12),X( 2),X( 7));
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(27,D,E,T,A,B,C,X(11),X(11),X(13),X( 3),X( 8));
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(28,C,D,E,T,A,B,X(12),X(12),X(14),X( 4),X( 9));
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(29,B,C,D,E,T,A,X(13),X(13),X(15),X( 5),X(10));
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(30,A,B,C,D,E,T,X(14),X(14),X( 0),X( 6),X(11));
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_20_31(31,T,A,B,C,D,E,X(15),X(15),X( 1),X( 7),X(12));
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(32,E,T,A,B,C,D,X( 0),X( 2),X( 8),X(13));
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(33,D,E,T,A,B,C,X( 1),X( 3),X( 9),X(14));
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(34,C,D,E,T,A,B,X( 2),X( 4),X(10),X(15));
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(35,B,C,D,E,T,A,X( 3),X( 5),X(11),X( 0));
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(36,A,B,C,D,E,T,X( 4),X( 6),X(12),X( 1));
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(37,T,A,B,C,D,E,X( 5),X( 7),X(13),X( 2));
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(38,E,T,A,B,C,D,X( 6),X( 8),X(14),X( 3));
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_32_39(39,D,E,T,A,B,C,X( 7),X( 9),X(15),X( 4));
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_40_59(40,C,D,E,T,A,B,X( 8),X(10),X( 0),X( 5));
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_40_59(41,B,C,D,E,T,A,X( 9),X(11),X( 1),X( 6));
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci	BODY_40_59(42,A,B,C,D,E,T,X(10),X(12),X( 2),X( 7));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(43,T,A,B,C,D,E,X(11),X(13),X( 3),X( 8));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(44,E,T,A,B,C,D,X(12),X(14),X( 4),X( 9));
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(45,D,E,T,A,B,C,X(13),X(15),X( 5),X(10));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(46,C,D,E,T,A,B,X(14),X( 0),X( 6),X(11));
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(47,B,C,D,E,T,A,X(15),X( 1),X( 7),X(12));
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(48,A,B,C,D,E,T,X( 0),X( 2),X( 8),X(13));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(49,T,A,B,C,D,E,X( 1),X( 3),X( 9),X(14));
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(50,E,T,A,B,C,D,X( 2),X( 4),X(10),X(15));
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(51,D,E,T,A,B,C,X( 3),X( 5),X(11),X( 0));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(52,C,D,E,T,A,B,X( 4),X( 6),X(12),X( 1));
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(53,B,C,D,E,T,A,X( 5),X( 7),X(13),X( 2));
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(54,A,B,C,D,E,T,X( 6),X( 8),X(14),X( 3));
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(55,T,A,B,C,D,E,X( 7),X( 9),X(15),X( 4));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(56,E,T,A,B,C,D,X( 8),X(10),X( 0),X( 5));
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_40_59(57,D,E,T,A,B,C,X( 9),X(11),X( 1),X( 6));
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	BODY_40_59(58,C,D,E,T,A,B,X(10),X(12),X( 2),X( 7));
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	BODY_40_59(59,B,C,D,E,T,A,X(11),X(13),X( 3),X( 8));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(60,A,B,C,D,E,T,X(12),X(14),X( 4),X( 9));
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(61,T,A,B,C,D,E,X(13),X(15),X( 5),X(10));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(62,E,T,A,B,C,D,X(14),X( 0),X( 6),X(11));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(63,D,E,T,A,B,C,X(15),X( 1),X( 7),X(12));
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	BODY_60_79(64,C,D,E,T,A,B,X( 0),X( 2),X( 8),X(13));
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	BODY_60_79(65,B,C,D,E,T,A,X( 1),X( 3),X( 9),X(14));
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(66,A,B,C,D,E,T,X( 2),X( 4),X(10),X(15));
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(67,T,A,B,C,D,E,X( 3),X( 5),X(11),X( 0));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(68,E,T,A,B,C,D,X( 4),X( 6),X(12),X( 1));
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(69,D,E,T,A,B,C,X( 5),X( 7),X(13),X( 2));
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(70,C,D,E,T,A,B,X( 6),X( 8),X(14),X( 3));
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(71,B,C,D,E,T,A,X( 7),X( 9),X(15),X( 4));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(72,A,B,C,D,E,T,X( 8),X(10),X( 0),X( 5));
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(73,T,A,B,C,D,E,X( 9),X(11),X( 1),X( 6));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(74,E,T,A,B,C,D,X(10),X(12),X( 2),X( 7));
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(75,D,E,T,A,B,C,X(11),X(13),X( 3),X( 8));
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(76,C,D,E,T,A,B,X(12),X(14),X( 4),X( 9));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(77,B,C,D,E,T,A,X(13),X(15),X( 5),X(10));
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(78,A,B,C,D,E,T,X(14),X( 0),X( 6),X(11));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	BODY_60_79(79,T,A,B,C,D,E,X(15),X( 1),X( 7),X(12));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h0=(c->h0+E)&0xffffffffL;
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	c->h1=(c->h1+T)&0xffffffffL;
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	c->h2=(c->h2+A)&0xffffffffL;
3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	c->h3=(c->h3+B)&0xffffffffL;
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	c->h4=(c->h4+C)&0xffffffffL;
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	if (--num == 0) break;
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	A=c->h0;
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	B=c->h1;
3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	C=c->h2;
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	D=c->h3;
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	E=c->h4;
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)			}
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	}
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else	/* OPENSSL_SMALL_FOOTPRINT */
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_00_15(xi)		 do {	\
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	T=E+K_00_19+F_00_19(B,C,D);	\
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	E=D, D=C, C=ROTATE(B,30), B=A;	\
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	A=ROTATE(A,5)+T+xi;	    } while(0)
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define BODY_16_19(xa,xb,xc,xd)	 do {	\
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(T,xa,xa,xb,xc,xd);	\
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	T+=E+K_00_19+F_00_19(B,C,D);	\
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	E=D, D=C, C=ROTATE(B,30), B=A;	\
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	A=ROTATE(A,5)+T;	    } while(0)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_20_39(xa,xb,xc,xd)	 do {	\
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(T,xa,xa,xb,xc,xd);	\
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	T+=E+K_20_39+F_20_39(B,C,D);	\
381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	E=D, D=C, C=ROTATE(B,30), B=A;	\
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	A=ROTATE(A,5)+T;	    } while(0)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_40_59(xa,xb,xc,xd)	 do {	\
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(T,xa,xa,xb,xc,xd);	\
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	T+=E+K_40_59+F_40_59(B,C,D);	\
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	E=D, D=C, C=ROTATE(B,30), B=A;	\
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	A=ROTATE(A,5)+T;	    } while(0)
389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BODY_60_79(xa,xb,xc,xd)	 do {	\
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	Xupdate(T,xa,xa,xb,xc,xd);	\
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	T=E+K_60_79+F_60_79(B,C,D);	\
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	E=D, D=C, C=ROTATE(B,30), B=A;	\
394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	A=ROTATE(A,5)+T+xa;	    } while(0)
395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(SHA_1) || !defined(SHA1_ASM)
397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static void HASH_BLOCK_DATA_ORDER (SHA_CTX *c, const void *p, size_t num)
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	{
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	const unsigned char *data=p;
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	register unsigned MD32_REG_T A,B,C,D,E,T,l;
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	int i;
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	SHA_LONG	X[16];
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	A=c->h0;
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	B=c->h1;
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	C=c->h2;
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	D=c->h3;
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	E=c->h4;
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	for (;;)
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)		{
412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	for (i=0;i<16;i++)
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	{ HOST_c2l(data,l); X[i]=l; BODY_00_15(X[i]); }
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	for (i=0;i<4;i++)
415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	{ BODY_16_19(X[i],       X[i+2],      X[i+8],     X[(i+13)&15]); }
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (;i<24;i++)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{ BODY_20_39(X[i&15],    X[(i+2)&15], X[(i+8)&15],X[(i+13)&15]); }
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (i=0;i<20;i++)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	{ BODY_40_59(X[(i+8)&15],X[(i+10)&15],X[i&15],    X[(i+5)&15]);  }
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	for (i=4;i<24;i++)
421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)	{ BODY_60_79(X[(i+8)&15],X[(i+10)&15],X[i&15],    X[(i+5)&15]);  }
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h0=(c->h0+A)&0xffffffffL;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h1=(c->h1+B)&0xffffffffL;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h2=(c->h2+C)&0xffffffffL;
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h3=(c->h3+D)&0xffffffffL;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	c->h4=(c->h4+E)&0xffffffffL;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	if (--num == 0) break;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	A=c->h0;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	B=c->h1;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	C=c->h2;
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	D=c->h3;
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)	E=c->h4;
436a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)		}
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	}
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)