xref: /dragonfly/crypto/libressl/crypto/sha/sha512.c (revision de0e0e4d)
1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: sha512.c,v 1.16 2021/11/09 18:40:21 bcook Exp $ */
2f5b1c8a1SJohn Marino /* ====================================================================
3f5b1c8a1SJohn Marino  * Copyright (c) 2004 The OpenSSL Project.  All rights reserved
4f5b1c8a1SJohn Marino  * according to the OpenSSL license [found in ../../LICENSE].
5f5b1c8a1SJohn Marino  * ====================================================================
6f5b1c8a1SJohn Marino  */
7f5b1c8a1SJohn Marino 
8*de0e0e4dSAntonio Huete Jimenez #include <endian.h>
9f5b1c8a1SJohn Marino #include <stdlib.h>
10f5b1c8a1SJohn Marino #include <string.h>
11f5b1c8a1SJohn Marino 
12f5b1c8a1SJohn Marino #include <openssl/opensslconf.h>
13f5b1c8a1SJohn Marino 
14f5b1c8a1SJohn Marino #if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512)
15f5b1c8a1SJohn Marino /*
16f5b1c8a1SJohn Marino  * IMPLEMENTATION NOTES.
17f5b1c8a1SJohn Marino  *
18f5b1c8a1SJohn Marino  * As you might have noticed 32-bit hash algorithms:
19f5b1c8a1SJohn Marino  *
20f5b1c8a1SJohn Marino  * - permit SHA_LONG to be wider than 32-bit (case on CRAY);
21f5b1c8a1SJohn Marino  * - optimized versions implement two transform functions: one operating
22f5b1c8a1SJohn Marino  *   on [aligned] data in host byte order and one - on data in input
23f5b1c8a1SJohn Marino  *   stream byte order;
24f5b1c8a1SJohn Marino  * - share common byte-order neutral collector and padding function
25f5b1c8a1SJohn Marino  *   implementations, ../md32_common.h;
26f5b1c8a1SJohn Marino  *
27f5b1c8a1SJohn Marino  * Neither of the above applies to this SHA-512 implementations. Reasons
28f5b1c8a1SJohn Marino  * [in reverse order] are:
29f5b1c8a1SJohn Marino  *
30f5b1c8a1SJohn Marino  * - it's the only 64-bit hash algorithm for the moment of this writing,
31f5b1c8a1SJohn Marino  *   there is no need for common collector/padding implementation [yet];
32f5b1c8a1SJohn Marino  * - by supporting only one transform function [which operates on
33f5b1c8a1SJohn Marino  *   *aligned* data in input stream byte order, big-endian in this case]
34f5b1c8a1SJohn Marino  *   we minimize burden of maintenance in two ways: a) collector/padding
35f5b1c8a1SJohn Marino  *   function is simpler; b) only one transform function to stare at;
36f5b1c8a1SJohn Marino  * - SHA_LONG64 is required to be exactly 64-bit in order to be able to
37f5b1c8a1SJohn Marino  *   apply a number of optimizations to mitigate potential performance
38f5b1c8a1SJohn Marino  *   penalties caused by previous design decision;
39f5b1c8a1SJohn Marino  *
40f5b1c8a1SJohn Marino  * Caveat lector.
41f5b1c8a1SJohn Marino  *
42f5b1c8a1SJohn Marino  * Implementation relies on the fact that "long long" is 64-bit on
43f5b1c8a1SJohn Marino  * both 32- and 64-bit platforms. If some compiler vendor comes up
44f5b1c8a1SJohn Marino  * with 128-bit long long, adjustment to sha.h would be required.
45f5b1c8a1SJohn Marino  * As this implementation relies on 64-bit integer type, it's totally
46f5b1c8a1SJohn Marino  * inappropriate for platforms which don't support it, most notably
47f5b1c8a1SJohn Marino  * 16-bit platforms.
48f5b1c8a1SJohn Marino  *					<appro@fy.chalmers.se>
49f5b1c8a1SJohn Marino  */
50f5b1c8a1SJohn Marino 
51f5b1c8a1SJohn Marino #include <openssl/crypto.h>
52f5b1c8a1SJohn Marino #include <openssl/opensslv.h>
53f5b1c8a1SJohn Marino #include <openssl/sha.h>
54f5b1c8a1SJohn Marino 
55f5b1c8a1SJohn Marino #if !defined(__STRICT_ALIGNMENT) || defined(SHA512_ASM)
56f5b1c8a1SJohn Marino #define SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
57f5b1c8a1SJohn Marino #endif
58f5b1c8a1SJohn Marino 
SHA384_Init(SHA512_CTX * c)59f5b1c8a1SJohn Marino int SHA384_Init(SHA512_CTX *c)
60f5b1c8a1SJohn Marino 	{
61f5b1c8a1SJohn Marino 	c->h[0]=U64(0xcbbb9d5dc1059ed8);
62f5b1c8a1SJohn Marino 	c->h[1]=U64(0x629a292a367cd507);
63f5b1c8a1SJohn Marino 	c->h[2]=U64(0x9159015a3070dd17);
64f5b1c8a1SJohn Marino 	c->h[3]=U64(0x152fecd8f70e5939);
65f5b1c8a1SJohn Marino 	c->h[4]=U64(0x67332667ffc00b31);
66f5b1c8a1SJohn Marino 	c->h[5]=U64(0x8eb44a8768581511);
67f5b1c8a1SJohn Marino 	c->h[6]=U64(0xdb0c2e0d64f98fa7);
68f5b1c8a1SJohn Marino 	c->h[7]=U64(0x47b5481dbefa4fa4);
69f5b1c8a1SJohn Marino 
70f5b1c8a1SJohn Marino         c->Nl=0;        c->Nh=0;
71f5b1c8a1SJohn Marino         c->num=0;       c->md_len=SHA384_DIGEST_LENGTH;
72f5b1c8a1SJohn Marino         return 1;
73f5b1c8a1SJohn Marino 	}
74f5b1c8a1SJohn Marino 
SHA512_Init(SHA512_CTX * c)75f5b1c8a1SJohn Marino int SHA512_Init(SHA512_CTX *c)
76f5b1c8a1SJohn Marino 	{
77f5b1c8a1SJohn Marino 	c->h[0]=U64(0x6a09e667f3bcc908);
78f5b1c8a1SJohn Marino 	c->h[1]=U64(0xbb67ae8584caa73b);
79f5b1c8a1SJohn Marino 	c->h[2]=U64(0x3c6ef372fe94f82b);
80f5b1c8a1SJohn Marino 	c->h[3]=U64(0xa54ff53a5f1d36f1);
81f5b1c8a1SJohn Marino 	c->h[4]=U64(0x510e527fade682d1);
82f5b1c8a1SJohn Marino 	c->h[5]=U64(0x9b05688c2b3e6c1f);
83f5b1c8a1SJohn Marino 	c->h[6]=U64(0x1f83d9abfb41bd6b);
84f5b1c8a1SJohn Marino 	c->h[7]=U64(0x5be0cd19137e2179);
85f5b1c8a1SJohn Marino 
86f5b1c8a1SJohn Marino         c->Nl=0;        c->Nh=0;
87f5b1c8a1SJohn Marino         c->num=0;       c->md_len=SHA512_DIGEST_LENGTH;
88f5b1c8a1SJohn Marino         return 1;
89f5b1c8a1SJohn Marino 	}
90f5b1c8a1SJohn Marino 
91f5b1c8a1SJohn Marino #ifndef SHA512_ASM
92f5b1c8a1SJohn Marino static
93f5b1c8a1SJohn Marino #endif
94f5b1c8a1SJohn Marino void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num);
95f5b1c8a1SJohn Marino 
SHA512_Final(unsigned char * md,SHA512_CTX * c)96f5b1c8a1SJohn Marino int SHA512_Final (unsigned char *md, SHA512_CTX *c)
97f5b1c8a1SJohn Marino 	{
98f5b1c8a1SJohn Marino 	unsigned char *p=(unsigned char *)c->u.p;
99f5b1c8a1SJohn Marino 	size_t n=c->num;
100f5b1c8a1SJohn Marino 
101f5b1c8a1SJohn Marino 	p[n]=0x80;	/* There always is a room for one */
102f5b1c8a1SJohn Marino 	n++;
103f5b1c8a1SJohn Marino 	if (n > (sizeof(c->u)-16))
104f5b1c8a1SJohn Marino 		memset (p+n,0,sizeof(c->u)-n), n=0,
105f5b1c8a1SJohn Marino 		sha512_block_data_order (c,p,1);
106f5b1c8a1SJohn Marino 
107f5b1c8a1SJohn Marino 	memset (p+n,0,sizeof(c->u)-16-n);
108f5b1c8a1SJohn Marino #if BYTE_ORDER == BIG_ENDIAN
109f5b1c8a1SJohn Marino 	c->u.d[SHA_LBLOCK-2] = c->Nh;
110f5b1c8a1SJohn Marino 	c->u.d[SHA_LBLOCK-1] = c->Nl;
111f5b1c8a1SJohn Marino #else
112f5b1c8a1SJohn Marino 	p[sizeof(c->u)-1]  = (unsigned char)(c->Nl);
113f5b1c8a1SJohn Marino 	p[sizeof(c->u)-2]  = (unsigned char)(c->Nl>>8);
114f5b1c8a1SJohn Marino 	p[sizeof(c->u)-3]  = (unsigned char)(c->Nl>>16);
115f5b1c8a1SJohn Marino 	p[sizeof(c->u)-4]  = (unsigned char)(c->Nl>>24);
116f5b1c8a1SJohn Marino 	p[sizeof(c->u)-5]  = (unsigned char)(c->Nl>>32);
117f5b1c8a1SJohn Marino 	p[sizeof(c->u)-6]  = (unsigned char)(c->Nl>>40);
118f5b1c8a1SJohn Marino 	p[sizeof(c->u)-7]  = (unsigned char)(c->Nl>>48);
119f5b1c8a1SJohn Marino 	p[sizeof(c->u)-8]  = (unsigned char)(c->Nl>>56);
120f5b1c8a1SJohn Marino 	p[sizeof(c->u)-9]  = (unsigned char)(c->Nh);
121f5b1c8a1SJohn Marino 	p[sizeof(c->u)-10] = (unsigned char)(c->Nh>>8);
122f5b1c8a1SJohn Marino 	p[sizeof(c->u)-11] = (unsigned char)(c->Nh>>16);
123f5b1c8a1SJohn Marino 	p[sizeof(c->u)-12] = (unsigned char)(c->Nh>>24);
124f5b1c8a1SJohn Marino 	p[sizeof(c->u)-13] = (unsigned char)(c->Nh>>32);
125f5b1c8a1SJohn Marino 	p[sizeof(c->u)-14] = (unsigned char)(c->Nh>>40);
126f5b1c8a1SJohn Marino 	p[sizeof(c->u)-15] = (unsigned char)(c->Nh>>48);
127f5b1c8a1SJohn Marino 	p[sizeof(c->u)-16] = (unsigned char)(c->Nh>>56);
128f5b1c8a1SJohn Marino #endif
129f5b1c8a1SJohn Marino 
130f5b1c8a1SJohn Marino 	sha512_block_data_order (c,p,1);
131f5b1c8a1SJohn Marino 
132f5b1c8a1SJohn Marino 	if (md==0) return 0;
133f5b1c8a1SJohn Marino 
134f5b1c8a1SJohn Marino 	switch (c->md_len)
135f5b1c8a1SJohn Marino 		{
136f5b1c8a1SJohn Marino 		/* Let compiler decide if it's appropriate to unroll... */
137f5b1c8a1SJohn Marino 		case SHA384_DIGEST_LENGTH:
138f5b1c8a1SJohn Marino 			for (n=0;n<SHA384_DIGEST_LENGTH/8;n++)
139f5b1c8a1SJohn Marino 				{
140f5b1c8a1SJohn Marino 				SHA_LONG64 t = c->h[n];
141f5b1c8a1SJohn Marino 
142f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>56);
143f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>48);
144f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>40);
145f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>32);
146f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>24);
147f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>16);
148f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>8);
149f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t);
150f5b1c8a1SJohn Marino 				}
151f5b1c8a1SJohn Marino 			break;
152f5b1c8a1SJohn Marino 		case SHA512_DIGEST_LENGTH:
153f5b1c8a1SJohn Marino 			for (n=0;n<SHA512_DIGEST_LENGTH/8;n++)
154f5b1c8a1SJohn Marino 				{
155f5b1c8a1SJohn Marino 				SHA_LONG64 t = c->h[n];
156f5b1c8a1SJohn Marino 
157f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>56);
158f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>48);
159f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>40);
160f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>32);
161f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>24);
162f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>16);
163f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t>>8);
164f5b1c8a1SJohn Marino 				*(md++)	= (unsigned char)(t);
165f5b1c8a1SJohn Marino 				}
166f5b1c8a1SJohn Marino 			break;
167f5b1c8a1SJohn Marino 		/* ... as well as make sure md_len is not abused. */
168f5b1c8a1SJohn Marino 		default:	return 0;
169f5b1c8a1SJohn Marino 		}
170f5b1c8a1SJohn Marino 
171f5b1c8a1SJohn Marino 	return 1;
172f5b1c8a1SJohn Marino 	}
173f5b1c8a1SJohn Marino 
SHA384_Final(unsigned char * md,SHA512_CTX * c)174f5b1c8a1SJohn Marino int SHA384_Final (unsigned char *md,SHA512_CTX *c)
175f5b1c8a1SJohn Marino {   return SHA512_Final (md,c);   }
176f5b1c8a1SJohn Marino 
SHA512_Update(SHA512_CTX * c,const void * _data,size_t len)177f5b1c8a1SJohn Marino int SHA512_Update (SHA512_CTX *c, const void *_data, size_t len)
178f5b1c8a1SJohn Marino 	{
179f5b1c8a1SJohn Marino 	SHA_LONG64	l;
180f5b1c8a1SJohn Marino 	unsigned char  *p=c->u.p;
181f5b1c8a1SJohn Marino 	const unsigned char *data=(const unsigned char *)_data;
182f5b1c8a1SJohn Marino 
183f5b1c8a1SJohn Marino 	if (len==0) return  1;
184f5b1c8a1SJohn Marino 
185f5b1c8a1SJohn Marino 	l = (c->Nl+(((SHA_LONG64)len)<<3))&U64(0xffffffffffffffff);
186f5b1c8a1SJohn Marino 	if (l < c->Nl)		c->Nh++;
187f5b1c8a1SJohn Marino 	if (sizeof(len)>=8)	c->Nh+=(((SHA_LONG64)len)>>61);
188f5b1c8a1SJohn Marino 	c->Nl=l;
189f5b1c8a1SJohn Marino 
190f5b1c8a1SJohn Marino 	if (c->num != 0)
191f5b1c8a1SJohn Marino 		{
192f5b1c8a1SJohn Marino 		size_t n = sizeof(c->u) - c->num;
193f5b1c8a1SJohn Marino 
194f5b1c8a1SJohn Marino 		if (len < n)
195f5b1c8a1SJohn Marino 			{
196f5b1c8a1SJohn Marino 			memcpy (p+c->num,data,len), c->num += (unsigned int)len;
197f5b1c8a1SJohn Marino 			return 1;
198f5b1c8a1SJohn Marino 			}
199f5b1c8a1SJohn Marino 		else	{
200f5b1c8a1SJohn Marino 			memcpy (p+c->num,data,n), c->num = 0;
201f5b1c8a1SJohn Marino 			len-=n, data+=n;
202f5b1c8a1SJohn Marino 			sha512_block_data_order (c,p,1);
203f5b1c8a1SJohn Marino 			}
204f5b1c8a1SJohn Marino 		}
205f5b1c8a1SJohn Marino 
206f5b1c8a1SJohn Marino 	if (len >= sizeof(c->u))
207f5b1c8a1SJohn Marino 		{
208f5b1c8a1SJohn Marino #ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
209f5b1c8a1SJohn Marino 		if ((size_t)data%sizeof(c->u.d[0]) != 0)
210f5b1c8a1SJohn Marino 			while (len >= sizeof(c->u))
211f5b1c8a1SJohn Marino 				memcpy (p,data,sizeof(c->u)),
212f5b1c8a1SJohn Marino 				sha512_block_data_order (c,p,1),
213f5b1c8a1SJohn Marino 				len  -= sizeof(c->u),
214f5b1c8a1SJohn Marino 				data += sizeof(c->u);
215f5b1c8a1SJohn Marino 		else
216f5b1c8a1SJohn Marino #endif
217f5b1c8a1SJohn Marino 			sha512_block_data_order (c,data,len/sizeof(c->u)),
218f5b1c8a1SJohn Marino 			data += len,
219f5b1c8a1SJohn Marino 			len  %= sizeof(c->u),
220f5b1c8a1SJohn Marino 			data -= len;
221f5b1c8a1SJohn Marino 		}
222f5b1c8a1SJohn Marino 
223f5b1c8a1SJohn Marino 	if (len != 0)	memcpy (p,data,len), c->num = (int)len;
224f5b1c8a1SJohn Marino 
225f5b1c8a1SJohn Marino 	return 1;
226f5b1c8a1SJohn Marino 	}
227f5b1c8a1SJohn Marino 
SHA384_Update(SHA512_CTX * c,const void * data,size_t len)228f5b1c8a1SJohn Marino int SHA384_Update (SHA512_CTX *c, const void *data, size_t len)
229f5b1c8a1SJohn Marino {   return SHA512_Update (c,data,len);   }
230f5b1c8a1SJohn Marino 
SHA512_Transform(SHA512_CTX * c,const unsigned char * data)231f5b1c8a1SJohn Marino void SHA512_Transform (SHA512_CTX *c, const unsigned char *data)
232f5b1c8a1SJohn Marino 	{
233f5b1c8a1SJohn Marino #ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
234f5b1c8a1SJohn Marino 	if ((size_t)data%sizeof(c->u.d[0]) != 0)
235f5b1c8a1SJohn Marino 		memcpy(c->u.p,data,sizeof(c->u.p)),
236f5b1c8a1SJohn Marino 		data = c->u.p;
237f5b1c8a1SJohn Marino #endif
238f5b1c8a1SJohn Marino 	sha512_block_data_order (c,data,1);
239f5b1c8a1SJohn Marino 	}
240f5b1c8a1SJohn Marino 
SHA384(const unsigned char * d,size_t n,unsigned char * md)241f5b1c8a1SJohn Marino unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md)
242f5b1c8a1SJohn Marino 	{
243f5b1c8a1SJohn Marino 	SHA512_CTX c;
244f5b1c8a1SJohn Marino 	static unsigned char m[SHA384_DIGEST_LENGTH];
245f5b1c8a1SJohn Marino 
246f5b1c8a1SJohn Marino 	if (md == NULL) md=m;
247f5b1c8a1SJohn Marino 	SHA384_Init(&c);
248f5b1c8a1SJohn Marino 	SHA512_Update(&c,d,n);
249f5b1c8a1SJohn Marino 	SHA512_Final(md,&c);
250f5b1c8a1SJohn Marino 	explicit_bzero(&c,sizeof(c));
251f5b1c8a1SJohn Marino 	return(md);
252f5b1c8a1SJohn Marino 	}
253f5b1c8a1SJohn Marino 
SHA512(const unsigned char * d,size_t n,unsigned char * md)254f5b1c8a1SJohn Marino unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md)
255f5b1c8a1SJohn Marino 	{
256f5b1c8a1SJohn Marino 	SHA512_CTX c;
257f5b1c8a1SJohn Marino 	static unsigned char m[SHA512_DIGEST_LENGTH];
258f5b1c8a1SJohn Marino 
259f5b1c8a1SJohn Marino 	if (md == NULL) md=m;
260f5b1c8a1SJohn Marino 	SHA512_Init(&c);
261f5b1c8a1SJohn Marino 	SHA512_Update(&c,d,n);
262f5b1c8a1SJohn Marino 	SHA512_Final(md,&c);
263f5b1c8a1SJohn Marino 	explicit_bzero(&c,sizeof(c));
264f5b1c8a1SJohn Marino 	return(md);
265f5b1c8a1SJohn Marino 	}
266f5b1c8a1SJohn Marino 
267f5b1c8a1SJohn Marino #ifndef SHA512_ASM
268f5b1c8a1SJohn Marino static const SHA_LONG64 K512[80] = {
269f5b1c8a1SJohn Marino         U64(0x428a2f98d728ae22),U64(0x7137449123ef65cd),
270f5b1c8a1SJohn Marino         U64(0xb5c0fbcfec4d3b2f),U64(0xe9b5dba58189dbbc),
271f5b1c8a1SJohn Marino         U64(0x3956c25bf348b538),U64(0x59f111f1b605d019),
272f5b1c8a1SJohn Marino         U64(0x923f82a4af194f9b),U64(0xab1c5ed5da6d8118),
273f5b1c8a1SJohn Marino         U64(0xd807aa98a3030242),U64(0x12835b0145706fbe),
274f5b1c8a1SJohn Marino         U64(0x243185be4ee4b28c),U64(0x550c7dc3d5ffb4e2),
275f5b1c8a1SJohn Marino         U64(0x72be5d74f27b896f),U64(0x80deb1fe3b1696b1),
276f5b1c8a1SJohn Marino         U64(0x9bdc06a725c71235),U64(0xc19bf174cf692694),
277f5b1c8a1SJohn Marino         U64(0xe49b69c19ef14ad2),U64(0xefbe4786384f25e3),
278f5b1c8a1SJohn Marino         U64(0x0fc19dc68b8cd5b5),U64(0x240ca1cc77ac9c65),
279f5b1c8a1SJohn Marino         U64(0x2de92c6f592b0275),U64(0x4a7484aa6ea6e483),
280f5b1c8a1SJohn Marino         U64(0x5cb0a9dcbd41fbd4),U64(0x76f988da831153b5),
281f5b1c8a1SJohn Marino         U64(0x983e5152ee66dfab),U64(0xa831c66d2db43210),
282f5b1c8a1SJohn Marino         U64(0xb00327c898fb213f),U64(0xbf597fc7beef0ee4),
283f5b1c8a1SJohn Marino         U64(0xc6e00bf33da88fc2),U64(0xd5a79147930aa725),
284f5b1c8a1SJohn Marino         U64(0x06ca6351e003826f),U64(0x142929670a0e6e70),
285f5b1c8a1SJohn Marino         U64(0x27b70a8546d22ffc),U64(0x2e1b21385c26c926),
286f5b1c8a1SJohn Marino         U64(0x4d2c6dfc5ac42aed),U64(0x53380d139d95b3df),
287f5b1c8a1SJohn Marino         U64(0x650a73548baf63de),U64(0x766a0abb3c77b2a8),
288f5b1c8a1SJohn Marino         U64(0x81c2c92e47edaee6),U64(0x92722c851482353b),
289f5b1c8a1SJohn Marino         U64(0xa2bfe8a14cf10364),U64(0xa81a664bbc423001),
290f5b1c8a1SJohn Marino         U64(0xc24b8b70d0f89791),U64(0xc76c51a30654be30),
291f5b1c8a1SJohn Marino         U64(0xd192e819d6ef5218),U64(0xd69906245565a910),
292f5b1c8a1SJohn Marino         U64(0xf40e35855771202a),U64(0x106aa07032bbd1b8),
293f5b1c8a1SJohn Marino         U64(0x19a4c116b8d2d0c8),U64(0x1e376c085141ab53),
294f5b1c8a1SJohn Marino         U64(0x2748774cdf8eeb99),U64(0x34b0bcb5e19b48a8),
295f5b1c8a1SJohn Marino         U64(0x391c0cb3c5c95a63),U64(0x4ed8aa4ae3418acb),
296f5b1c8a1SJohn Marino         U64(0x5b9cca4f7763e373),U64(0x682e6ff3d6b2b8a3),
297f5b1c8a1SJohn Marino         U64(0x748f82ee5defb2fc),U64(0x78a5636f43172f60),
298f5b1c8a1SJohn Marino         U64(0x84c87814a1f0ab72),U64(0x8cc702081a6439ec),
299f5b1c8a1SJohn Marino         U64(0x90befffa23631e28),U64(0xa4506cebde82bde9),
300f5b1c8a1SJohn Marino         U64(0xbef9a3f7b2c67915),U64(0xc67178f2e372532b),
301f5b1c8a1SJohn Marino         U64(0xca273eceea26619c),U64(0xd186b8c721c0c207),
302f5b1c8a1SJohn Marino         U64(0xeada7dd6cde0eb1e),U64(0xf57d4f7fee6ed178),
303f5b1c8a1SJohn Marino         U64(0x06f067aa72176fba),U64(0x0a637dc5a2c898a6),
304f5b1c8a1SJohn Marino         U64(0x113f9804bef90dae),U64(0x1b710b35131c471b),
305f5b1c8a1SJohn Marino         U64(0x28db77f523047d84),U64(0x32caab7b40c72493),
306f5b1c8a1SJohn Marino         U64(0x3c9ebe0a15c9bebc),U64(0x431d67c49c100d4c),
307f5b1c8a1SJohn Marino         U64(0x4cc5d4becb3e42b6),U64(0x597f299cfc657e2a),
308f5b1c8a1SJohn Marino         U64(0x5fcb6fab3ad6faec),U64(0x6c44198c4a475817) };
309f5b1c8a1SJohn Marino 
310f5b1c8a1SJohn Marino #if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
311f5b1c8a1SJohn Marino # if defined(__x86_64) || defined(__x86_64__)
312f5b1c8a1SJohn Marino #  define ROTR(a,n)	({ SHA_LONG64 ret;		\
313f5b1c8a1SJohn Marino 				asm ("rorq %1,%0"	\
314f5b1c8a1SJohn Marino 				: "=r"(ret)		\
315f5b1c8a1SJohn Marino 				: "J"(n),"0"(a)		\
316f5b1c8a1SJohn Marino 				: "cc"); ret;		})
317f5b1c8a1SJohn Marino #   define PULL64(x) ({ SHA_LONG64 ret=*((const SHA_LONG64 *)(&(x)));	\
318f5b1c8a1SJohn Marino 				asm ("bswapq	%0"		\
319f5b1c8a1SJohn Marino 				: "=r"(ret)			\
320f5b1c8a1SJohn Marino 				: "0"(ret)); ret;		})
321f5b1c8a1SJohn Marino # elif (defined(__i386) || defined(__i386__))
322f5b1c8a1SJohn Marino #   define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\
323f5b1c8a1SJohn Marino 			 unsigned int hi=p[0],lo=p[1];		\
324f5b1c8a1SJohn Marino 				asm ("bswapl %0; bswapl %1;"	\
325f5b1c8a1SJohn Marino 				: "=r"(lo),"=r"(hi)		\
326f5b1c8a1SJohn Marino 				: "0"(lo),"1"(hi));		\
327f5b1c8a1SJohn Marino 				((SHA_LONG64)hi)<<32|lo;	})
328f5b1c8a1SJohn Marino # elif (defined(_ARCH_PPC) && defined(__64BIT__)) || defined(_ARCH_PPC64)
329f5b1c8a1SJohn Marino #  define ROTR(a,n)	({ SHA_LONG64 ret;		\
330f5b1c8a1SJohn Marino 				asm ("rotrdi %0,%1,%2"	\
331f5b1c8a1SJohn Marino 				: "=r"(ret)		\
332f5b1c8a1SJohn Marino 				: "r"(a),"K"(n)); ret;	})
333f5b1c8a1SJohn Marino # endif
334f5b1c8a1SJohn Marino #endif
335f5b1c8a1SJohn Marino 
336f5b1c8a1SJohn Marino #ifndef PULL64
337f5b1c8a1SJohn Marino #define B(x,j)    (((SHA_LONG64)(*(((const unsigned char *)(&x))+j)))<<((7-j)*8))
338f5b1c8a1SJohn Marino #define PULL64(x) (B(x,0)|B(x,1)|B(x,2)|B(x,3)|B(x,4)|B(x,5)|B(x,6)|B(x,7))
339f5b1c8a1SJohn Marino #endif
340f5b1c8a1SJohn Marino 
341f5b1c8a1SJohn Marino #ifndef ROTR
342f5b1c8a1SJohn Marino #define ROTR(x,s)	(((x)>>s) | (x)<<(64-s))
343f5b1c8a1SJohn Marino #endif
344f5b1c8a1SJohn Marino 
345f5b1c8a1SJohn Marino #define Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
346f5b1c8a1SJohn Marino #define Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
347f5b1c8a1SJohn Marino #define sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
348f5b1c8a1SJohn Marino #define sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
349f5b1c8a1SJohn Marino 
350f5b1c8a1SJohn Marino #define Ch(x,y,z)	(((x) & (y)) ^ ((~(x)) & (z)))
351f5b1c8a1SJohn Marino #define Maj(x,y,z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
352f5b1c8a1SJohn Marino 
353f5b1c8a1SJohn Marino 
354f5b1c8a1SJohn Marino #if defined(__i386) || defined(__i386__) || defined(_M_IX86)
355f5b1c8a1SJohn Marino /*
356f5b1c8a1SJohn Marino  * This code should give better results on 32-bit CPU with less than
357f5b1c8a1SJohn Marino  * ~24 registers, both size and performance wise...
358f5b1c8a1SJohn Marino  */
sha512_block_data_order(SHA512_CTX * ctx,const void * in,size_t num)359f5b1c8a1SJohn Marino static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
360f5b1c8a1SJohn Marino 	{
361f5b1c8a1SJohn Marino 	const SHA_LONG64 *W=in;
362f5b1c8a1SJohn Marino 	SHA_LONG64	A,E,T;
363f5b1c8a1SJohn Marino 	SHA_LONG64	X[9+80],*F;
364f5b1c8a1SJohn Marino 	int i;
365f5b1c8a1SJohn Marino 
366f5b1c8a1SJohn Marino 			while (num--) {
367f5b1c8a1SJohn Marino 
368f5b1c8a1SJohn Marino 	F    = X+80;
369f5b1c8a1SJohn Marino 	A    = ctx->h[0];	F[1] = ctx->h[1];
370f5b1c8a1SJohn Marino 	F[2] = ctx->h[2];	F[3] = ctx->h[3];
371f5b1c8a1SJohn Marino 	E    = ctx->h[4];	F[5] = ctx->h[5];
372f5b1c8a1SJohn Marino 	F[6] = ctx->h[6];	F[7] = ctx->h[7];
373f5b1c8a1SJohn Marino 
374f5b1c8a1SJohn Marino 	for (i=0;i<16;i++,F--)
375f5b1c8a1SJohn Marino 		{
376f5b1c8a1SJohn Marino 		T = PULL64(W[i]);
377f5b1c8a1SJohn Marino 		F[0] = A;
378f5b1c8a1SJohn Marino 		F[4] = E;
379f5b1c8a1SJohn Marino 		F[8] = T;
380f5b1c8a1SJohn Marino 		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
381f5b1c8a1SJohn Marino 		E    = F[3] + T;
382f5b1c8a1SJohn Marino 		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
383f5b1c8a1SJohn Marino 		}
384f5b1c8a1SJohn Marino 
385f5b1c8a1SJohn Marino 	for (;i<80;i++,F--)
386f5b1c8a1SJohn Marino 		{
387f5b1c8a1SJohn Marino 		T    = sigma0(F[8+16-1]);
388f5b1c8a1SJohn Marino 		T   += sigma1(F[8+16-14]);
389f5b1c8a1SJohn Marino 		T   += F[8+16] + F[8+16-9];
390f5b1c8a1SJohn Marino 
391f5b1c8a1SJohn Marino 		F[0] = A;
392f5b1c8a1SJohn Marino 		F[4] = E;
393f5b1c8a1SJohn Marino 		F[8] = T;
394f5b1c8a1SJohn Marino 		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
395f5b1c8a1SJohn Marino 		E    = F[3] + T;
396f5b1c8a1SJohn Marino 		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
397f5b1c8a1SJohn Marino 		}
398f5b1c8a1SJohn Marino 
399f5b1c8a1SJohn Marino 	ctx->h[0] += A;		ctx->h[1] += F[1];
400f5b1c8a1SJohn Marino 	ctx->h[2] += F[2];	ctx->h[3] += F[3];
401f5b1c8a1SJohn Marino 	ctx->h[4] += E;		ctx->h[5] += F[5];
402f5b1c8a1SJohn Marino 	ctx->h[6] += F[6];	ctx->h[7] += F[7];
403f5b1c8a1SJohn Marino 
404f5b1c8a1SJohn Marino 			W+=SHA_LBLOCK;
405f5b1c8a1SJohn Marino 			}
406f5b1c8a1SJohn Marino 	}
407f5b1c8a1SJohn Marino 
408f5b1c8a1SJohn Marino #elif defined(OPENSSL_SMALL_FOOTPRINT)
409f5b1c8a1SJohn Marino 
sha512_block_data_order(SHA512_CTX * ctx,const void * in,size_t num)410f5b1c8a1SJohn Marino static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
411f5b1c8a1SJohn Marino 	{
412f5b1c8a1SJohn Marino 	const SHA_LONG64 *W=in;
413f5b1c8a1SJohn Marino 	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1,T2;
414f5b1c8a1SJohn Marino 	SHA_LONG64	X[16];
415f5b1c8a1SJohn Marino 	int i;
416f5b1c8a1SJohn Marino 
417f5b1c8a1SJohn Marino 			while (num--) {
418f5b1c8a1SJohn Marino 
419f5b1c8a1SJohn Marino 	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
420f5b1c8a1SJohn Marino 	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
421f5b1c8a1SJohn Marino 
422f5b1c8a1SJohn Marino 	for (i=0;i<16;i++)
423f5b1c8a1SJohn Marino 		{
424f5b1c8a1SJohn Marino #if BYTE_ORDER == BIG_ENDIAN
425f5b1c8a1SJohn Marino 		T1 = X[i] = W[i];
426f5b1c8a1SJohn Marino #else
427f5b1c8a1SJohn Marino 		T1 = X[i] = PULL64(W[i]);
428f5b1c8a1SJohn Marino #endif
429f5b1c8a1SJohn Marino 		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
430f5b1c8a1SJohn Marino 		T2 = Sigma0(a) + Maj(a,b,c);
431f5b1c8a1SJohn Marino 		h = g;	g = f;	f = e;	e = d + T1;
432f5b1c8a1SJohn Marino 		d = c;	c = b;	b = a;	a = T1 + T2;
433f5b1c8a1SJohn Marino 		}
434f5b1c8a1SJohn Marino 
435f5b1c8a1SJohn Marino 	for (;i<80;i++)
436f5b1c8a1SJohn Marino 		{
437f5b1c8a1SJohn Marino 		s0 = X[(i+1)&0x0f];	s0 = sigma0(s0);
438f5b1c8a1SJohn Marino 		s1 = X[(i+14)&0x0f];	s1 = sigma1(s1);
439f5b1c8a1SJohn Marino 
440f5b1c8a1SJohn Marino 		T1 = X[i&0xf] += s0 + s1 + X[(i+9)&0xf];
441f5b1c8a1SJohn Marino 		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
442f5b1c8a1SJohn Marino 		T2 = Sigma0(a) + Maj(a,b,c);
443f5b1c8a1SJohn Marino 		h = g;	g = f;	f = e;	e = d + T1;
444f5b1c8a1SJohn Marino 		d = c;	c = b;	b = a;	a = T1 + T2;
445f5b1c8a1SJohn Marino 		}
446f5b1c8a1SJohn Marino 
447f5b1c8a1SJohn Marino 	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
448f5b1c8a1SJohn Marino 	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
449f5b1c8a1SJohn Marino 
450f5b1c8a1SJohn Marino 			W+=SHA_LBLOCK;
451f5b1c8a1SJohn Marino 			}
452f5b1c8a1SJohn Marino 	}
453f5b1c8a1SJohn Marino 
454f5b1c8a1SJohn Marino #else
455f5b1c8a1SJohn Marino 
456f5b1c8a1SJohn Marino #define	ROUND_00_15(i,a,b,c,d,e,f,g,h)		do {	\
457f5b1c8a1SJohn Marino 	T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];	\
458f5b1c8a1SJohn Marino 	h = Sigma0(a) + Maj(a,b,c);			\
459f5b1c8a1SJohn Marino 	d += T1;	h += T1;		} while (0)
460f5b1c8a1SJohn Marino 
461f5b1c8a1SJohn Marino #define	ROUND_16_80(i,j,a,b,c,d,e,f,g,h,X)	do {	\
462f5b1c8a1SJohn Marino 	s0 = X[(j+1)&0x0f];	s0 = sigma0(s0);	\
463f5b1c8a1SJohn Marino 	s1 = X[(j+14)&0x0f];	s1 = sigma1(s1);	\
464f5b1c8a1SJohn Marino 	T1 = X[(j)&0x0f] += s0 + s1 + X[(j+9)&0x0f];	\
465f5b1c8a1SJohn Marino 	ROUND_00_15(i+j,a,b,c,d,e,f,g,h);		} while (0)
466f5b1c8a1SJohn Marino 
sha512_block_data_order(SHA512_CTX * ctx,const void * in,size_t num)467f5b1c8a1SJohn Marino static void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
468f5b1c8a1SJohn Marino 	{
469f5b1c8a1SJohn Marino 	const SHA_LONG64 *W=in;
470f5b1c8a1SJohn Marino 	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1;
471f5b1c8a1SJohn Marino 	SHA_LONG64	X[16];
472f5b1c8a1SJohn Marino 	int i;
473f5b1c8a1SJohn Marino 
474f5b1c8a1SJohn Marino 			while (num--) {
475f5b1c8a1SJohn Marino 
476f5b1c8a1SJohn Marino 	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
477f5b1c8a1SJohn Marino 	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
478f5b1c8a1SJohn Marino 
479f5b1c8a1SJohn Marino #if BYTE_ORDER == BIG_ENDIAN
480f5b1c8a1SJohn Marino 	T1 = X[0] = W[0];	ROUND_00_15(0,a,b,c,d,e,f,g,h);
481f5b1c8a1SJohn Marino 	T1 = X[1] = W[1];	ROUND_00_15(1,h,a,b,c,d,e,f,g);
482f5b1c8a1SJohn Marino 	T1 = X[2] = W[2];	ROUND_00_15(2,g,h,a,b,c,d,e,f);
483f5b1c8a1SJohn Marino 	T1 = X[3] = W[3];	ROUND_00_15(3,f,g,h,a,b,c,d,e);
484f5b1c8a1SJohn Marino 	T1 = X[4] = W[4];	ROUND_00_15(4,e,f,g,h,a,b,c,d);
485f5b1c8a1SJohn Marino 	T1 = X[5] = W[5];	ROUND_00_15(5,d,e,f,g,h,a,b,c);
486f5b1c8a1SJohn Marino 	T1 = X[6] = W[6];	ROUND_00_15(6,c,d,e,f,g,h,a,b);
487f5b1c8a1SJohn Marino 	T1 = X[7] = W[7];	ROUND_00_15(7,b,c,d,e,f,g,h,a);
488f5b1c8a1SJohn Marino 	T1 = X[8] = W[8];	ROUND_00_15(8,a,b,c,d,e,f,g,h);
489f5b1c8a1SJohn Marino 	T1 = X[9] = W[9];	ROUND_00_15(9,h,a,b,c,d,e,f,g);
490f5b1c8a1SJohn Marino 	T1 = X[10] = W[10];	ROUND_00_15(10,g,h,a,b,c,d,e,f);
491f5b1c8a1SJohn Marino 	T1 = X[11] = W[11];	ROUND_00_15(11,f,g,h,a,b,c,d,e);
492f5b1c8a1SJohn Marino 	T1 = X[12] = W[12];	ROUND_00_15(12,e,f,g,h,a,b,c,d);
493f5b1c8a1SJohn Marino 	T1 = X[13] = W[13];	ROUND_00_15(13,d,e,f,g,h,a,b,c);
494f5b1c8a1SJohn Marino 	T1 = X[14] = W[14];	ROUND_00_15(14,c,d,e,f,g,h,a,b);
495f5b1c8a1SJohn Marino 	T1 = X[15] = W[15];	ROUND_00_15(15,b,c,d,e,f,g,h,a);
496f5b1c8a1SJohn Marino #else
497f5b1c8a1SJohn Marino 	T1 = X[0]  = PULL64(W[0]);	ROUND_00_15(0,a,b,c,d,e,f,g,h);
498f5b1c8a1SJohn Marino 	T1 = X[1]  = PULL64(W[1]);	ROUND_00_15(1,h,a,b,c,d,e,f,g);
499f5b1c8a1SJohn Marino 	T1 = X[2]  = PULL64(W[2]);	ROUND_00_15(2,g,h,a,b,c,d,e,f);
500f5b1c8a1SJohn Marino 	T1 = X[3]  = PULL64(W[3]);	ROUND_00_15(3,f,g,h,a,b,c,d,e);
501f5b1c8a1SJohn Marino 	T1 = X[4]  = PULL64(W[4]);	ROUND_00_15(4,e,f,g,h,a,b,c,d);
502f5b1c8a1SJohn Marino 	T1 = X[5]  = PULL64(W[5]);	ROUND_00_15(5,d,e,f,g,h,a,b,c);
503f5b1c8a1SJohn Marino 	T1 = X[6]  = PULL64(W[6]);	ROUND_00_15(6,c,d,e,f,g,h,a,b);
504f5b1c8a1SJohn Marino 	T1 = X[7]  = PULL64(W[7]);	ROUND_00_15(7,b,c,d,e,f,g,h,a);
505f5b1c8a1SJohn Marino 	T1 = X[8]  = PULL64(W[8]);	ROUND_00_15(8,a,b,c,d,e,f,g,h);
506f5b1c8a1SJohn Marino 	T1 = X[9]  = PULL64(W[9]);	ROUND_00_15(9,h,a,b,c,d,e,f,g);
507f5b1c8a1SJohn Marino 	T1 = X[10] = PULL64(W[10]);	ROUND_00_15(10,g,h,a,b,c,d,e,f);
508f5b1c8a1SJohn Marino 	T1 = X[11] = PULL64(W[11]);	ROUND_00_15(11,f,g,h,a,b,c,d,e);
509f5b1c8a1SJohn Marino 	T1 = X[12] = PULL64(W[12]);	ROUND_00_15(12,e,f,g,h,a,b,c,d);
510f5b1c8a1SJohn Marino 	T1 = X[13] = PULL64(W[13]);	ROUND_00_15(13,d,e,f,g,h,a,b,c);
511f5b1c8a1SJohn Marino 	T1 = X[14] = PULL64(W[14]);	ROUND_00_15(14,c,d,e,f,g,h,a,b);
512f5b1c8a1SJohn Marino 	T1 = X[15] = PULL64(W[15]);	ROUND_00_15(15,b,c,d,e,f,g,h,a);
513f5b1c8a1SJohn Marino #endif
514f5b1c8a1SJohn Marino 
515f5b1c8a1SJohn Marino 	for (i=16;i<80;i+=16)
516f5b1c8a1SJohn Marino 		{
517f5b1c8a1SJohn Marino 		ROUND_16_80(i, 0,a,b,c,d,e,f,g,h,X);
518f5b1c8a1SJohn Marino 		ROUND_16_80(i, 1,h,a,b,c,d,e,f,g,X);
519f5b1c8a1SJohn Marino 		ROUND_16_80(i, 2,g,h,a,b,c,d,e,f,X);
520f5b1c8a1SJohn Marino 		ROUND_16_80(i, 3,f,g,h,a,b,c,d,e,X);
521f5b1c8a1SJohn Marino 		ROUND_16_80(i, 4,e,f,g,h,a,b,c,d,X);
522f5b1c8a1SJohn Marino 		ROUND_16_80(i, 5,d,e,f,g,h,a,b,c,X);
523f5b1c8a1SJohn Marino 		ROUND_16_80(i, 6,c,d,e,f,g,h,a,b,X);
524f5b1c8a1SJohn Marino 		ROUND_16_80(i, 7,b,c,d,e,f,g,h,a,X);
525f5b1c8a1SJohn Marino 		ROUND_16_80(i, 8,a,b,c,d,e,f,g,h,X);
526f5b1c8a1SJohn Marino 		ROUND_16_80(i, 9,h,a,b,c,d,e,f,g,X);
527f5b1c8a1SJohn Marino 		ROUND_16_80(i,10,g,h,a,b,c,d,e,f,X);
528f5b1c8a1SJohn Marino 		ROUND_16_80(i,11,f,g,h,a,b,c,d,e,X);
529f5b1c8a1SJohn Marino 		ROUND_16_80(i,12,e,f,g,h,a,b,c,d,X);
530f5b1c8a1SJohn Marino 		ROUND_16_80(i,13,d,e,f,g,h,a,b,c,X);
531f5b1c8a1SJohn Marino 		ROUND_16_80(i,14,c,d,e,f,g,h,a,b,X);
532f5b1c8a1SJohn Marino 		ROUND_16_80(i,15,b,c,d,e,f,g,h,a,X);
533f5b1c8a1SJohn Marino 		}
534f5b1c8a1SJohn Marino 
535f5b1c8a1SJohn Marino 	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
536f5b1c8a1SJohn Marino 	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
537f5b1c8a1SJohn Marino 
538f5b1c8a1SJohn Marino 			W+=SHA_LBLOCK;
539f5b1c8a1SJohn Marino 			}
540f5b1c8a1SJohn Marino 	}
541f5b1c8a1SJohn Marino 
542f5b1c8a1SJohn Marino #endif
543f5b1c8a1SJohn Marino 
544f5b1c8a1SJohn Marino #endif /* SHA512_ASM */
545f5b1c8a1SJohn Marino 
546f5b1c8a1SJohn Marino #endif /* !OPENSSL_NO_SHA512 */
547