1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/sha/sha512.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2004 The OpenSSL Project.  All rights reserved
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * according to the OpenSSL license [found in ../../LICENSE].
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslconf.h>
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA512)
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLEMENTATION NOTES.
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * As you might have noticed 32-bit hash algorithms:
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - permit SHA_LONG to be wider than 32-bit (case on CRAY);
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - optimized versions implement two transform functions: one operating
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   on [aligned] data in host byte order and one - on data in input
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   stream byte order;
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - share common byte-order neutral collector and padding function
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   implementations, ../md32_common.h;
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Neither of the above applies to this SHA-512 implementations. Reasons
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [in reverse order] are:
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - it's the only 64-bit hash algorithm for the moment of this writing,
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   there is no need for common collector/padding implementation [yet];
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - by supporting only one transform function [which operates on
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   *aligned* data in input stream byte order, big-endian in this case]
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   we minimize burden of maintenance in two ways: a) collector/padding
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   function is simpler; b) only one transform function to stare at;
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * - SHA_LONG64 is required to be exactly 64-bit in order to be able to
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   apply a number of optimizations to mitigate potential performance
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *   penalties caused by previous design decision;
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Caveat lector.
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Implementation relies on the fact that "long long" is 64-bit on
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * both 32- and 64-bit platforms. If some compiler vendor comes up
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * with 128-bit long long, adjustment to sha.h would be required.
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * As this implementation relies on 64-bit integer type, it's totally
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * inappropriate for platforms which don't support it, most notably
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16-bit platforms.
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *					<appro@fy.chalmers.se>
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h>
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h>
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/sha.h>
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslv.h>
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char SHA512_version[]="SHA-512" OPENSSL_VERSION_PTEXT;
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    defined(__x86_64) || defined(_M_AMD64) || defined(_M_X64) || \
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    defined(__s390__) || defined(__s390x__) || \
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    defined(SHA512_ASM)
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
62392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromfips_md_init_ctx(SHA384, SHA512)
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[0]=U64(0xcbbb9d5dc1059ed8);
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[1]=U64(0x629a292a367cd507);
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[2]=U64(0x9159015a3070dd17);
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[3]=U64(0x152fecd8f70e5939);
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[4]=U64(0x67332667ffc00b31);
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[5]=U64(0x8eb44a8768581511);
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[6]=U64(0xdb0c2e0d64f98fa7);
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[7]=U64(0x47b5481dbefa4fa4);
72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->Nl=0;        c->Nh=0;
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->num=0;       c->md_len=SHA384_DIGEST_LENGTH;
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return 1;
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromfips_md_init(SHA512)
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[0]=U64(0x6a09e667f3bcc908);
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[1]=U64(0xbb67ae8584caa73b);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[2]=U64(0x3c6ef372fe94f82b);
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[3]=U64(0xa54ff53a5f1d36f1);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[4]=U64(0x510e527fade682d1);
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[5]=U64(0x9b05688c2b3e6c1f);
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[6]=U64(0x1f83d9abfb41bd6b);
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[7]=U64(0x5be0cd19137e2179);
88392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->Nl=0;        c->Nh=0;
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->num=0;       c->md_len=SHA512_DIGEST_LENGTH;
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return 1;
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_ASM
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA512_Final (unsigned char *md, SHA512_CTX *c)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p=(unsigned char *)c->u.p;
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t n=c->num;
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[n]=0x80;	/* There always is a room for one */
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n++;
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n > (sizeof(c->u)-16))
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset (p+n,0,sizeof(c->u)-n), n=0,
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sha512_block_data_order (c,p,1);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset (p+n,0,sizeof(c->u)-16-n);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef	B_ENDIAN
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->u.d[SHA_LBLOCK-2] = c->Nh;
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->u.d[SHA_LBLOCK-1] = c->Nl;
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-1]  = (unsigned char)(c->Nl);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-2]  = (unsigned char)(c->Nl>>8);
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-3]  = (unsigned char)(c->Nl>>16);
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-4]  = (unsigned char)(c->Nl>>24);
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-5]  = (unsigned char)(c->Nl>>32);
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-6]  = (unsigned char)(c->Nl>>40);
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-7]  = (unsigned char)(c->Nl>>48);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-8]  = (unsigned char)(c->Nl>>56);
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-9]  = (unsigned char)(c->Nh);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-10] = (unsigned char)(c->Nh>>8);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-11] = (unsigned char)(c->Nh>>16);
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-12] = (unsigned char)(c->Nh>>24);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-13] = (unsigned char)(c->Nh>>32);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-14] = (unsigned char)(c->Nh>>40);
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-15] = (unsigned char)(c->Nh>>48);
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-16] = (unsigned char)(c->Nh>>56);
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sha512_block_data_order (c,p,1);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md==0) return 0;
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (c->md_len)
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Let compiler decide if it's appropriate to unroll... */
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case SHA384_DIGEST_LENGTH:
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (n=0;n<SHA384_DIGEST_LENGTH/8;n++)
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHA_LONG64 t = c->h[n];
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>56);
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>48);
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>40);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>32);
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>24);
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>16);
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>8);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t);
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case SHA512_DIGEST_LENGTH:
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (n=0;n<SHA512_DIGEST_LENGTH/8;n++)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHA_LONG64 t = c->h[n];
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>56);
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>48);
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>40);
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>32);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>24);
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>16);
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>8);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t);
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* ... as well as make sure md_len is not abused. */
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		default:	return 0;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
173392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA384_Final (unsigned char *md,SHA512_CTX *c)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   return SHA512_Final (md,c);   }
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA512_Update (SHA512_CTX *c, const void *_data, size_t len)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	l;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char  *p=c->u.p;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *data=(const unsigned char *)_data;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len==0) return  1;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l = (c->Nl+(((SHA_LONG64)len)<<3))&U64(0xffffffffffffffff);
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (l < c->Nl)		c->Nh++;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sizeof(len)>=8)	c->Nh+=(((SHA_LONG64)len)>>61);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->Nl=l;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c->num != 0)
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		size_t n = sizeof(c->u) - c->num;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (len < n)
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			memcpy (p+c->num,data,len), c->num += (unsigned int)len;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	{
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy (p+c->num,data,n), c->num = 0;
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len-=n, data+=n;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sha512_block_data_order (c,p,1);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len >= sizeof(c->u))
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((size_t)data%sizeof(c->u.d[0]) != 0)
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (len >= sizeof(c->u))
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				memcpy (p,data,sizeof(c->u)),
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sha512_block_data_order (c,p,1),
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				len  -= sizeof(c->u),
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				data += sizeof(c->u);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sha512_block_data_order (c,data,len/sizeof(c->u)),
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data += len,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len  %= sizeof(c->u),
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data -= len;
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len != 0)	memcpy (p,data,len), c->num = (int)len;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA384_Update (SHA512_CTX *c, const void *data, size_t len)
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   return SHA512_Update (c,data,len);   }
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid SHA512_Transform (SHA512_CTX *c, const unsigned char *data)
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   sha512_block_data_order (c,data,1);  }
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_CTX c;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char m[SHA384_DIGEST_LENGTH];
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md == NULL) md=m;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA384_Init(&c);
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Update(&c,d,n);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Final(md,&c);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&c,sizeof(c));
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(md);
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_CTX c;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char m[SHA512_DIGEST_LENGTH];
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md == NULL) md=m;
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Init(&c);
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Update(&c,d,n);
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Final(md,&c);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&c,sizeof(c));
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(md);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_ASM
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const SHA_LONG64 K512[80] = {
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x428a2f98d728ae22),U64(0x7137449123ef65cd),
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xb5c0fbcfec4d3b2f),U64(0xe9b5dba58189dbbc),
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x3956c25bf348b538),U64(0x59f111f1b605d019),
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x923f82a4af194f9b),U64(0xab1c5ed5da6d8118),
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xd807aa98a3030242),U64(0x12835b0145706fbe),
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x243185be4ee4b28c),U64(0x550c7dc3d5ffb4e2),
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x72be5d74f27b896f),U64(0x80deb1fe3b1696b1),
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x9bdc06a725c71235),U64(0xc19bf174cf692694),
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xe49b69c19ef14ad2),U64(0xefbe4786384f25e3),
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x0fc19dc68b8cd5b5),U64(0x240ca1cc77ac9c65),
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x2de92c6f592b0275),U64(0x4a7484aa6ea6e483),
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5cb0a9dcbd41fbd4),U64(0x76f988da831153b5),
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x983e5152ee66dfab),U64(0xa831c66d2db43210),
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xb00327c898fb213f),U64(0xbf597fc7beef0ee4),
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xc6e00bf33da88fc2),U64(0xd5a79147930aa725),
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x06ca6351e003826f),U64(0x142929670a0e6e70),
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x27b70a8546d22ffc),U64(0x2e1b21385c26c926),
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x4d2c6dfc5ac42aed),U64(0x53380d139d95b3df),
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x650a73548baf63de),U64(0x766a0abb3c77b2a8),
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x81c2c92e47edaee6),U64(0x92722c851482353b),
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xa2bfe8a14cf10364),U64(0xa81a664bbc423001),
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xc24b8b70d0f89791),U64(0xc76c51a30654be30),
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xd192e819d6ef5218),U64(0xd69906245565a910),
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xf40e35855771202a),U64(0x106aa07032bbd1b8),
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x19a4c116b8d2d0c8),U64(0x1e376c085141ab53),
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x2748774cdf8eeb99),U64(0x34b0bcb5e19b48a8),
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x391c0cb3c5c95a63),U64(0x4ed8aa4ae3418acb),
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5b9cca4f7763e373),U64(0x682e6ff3d6b2b8a3),
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x748f82ee5defb2fc),U64(0x78a5636f43172f60),
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x84c87814a1f0ab72),U64(0x8cc702081a6439ec),
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x90befffa23631e28),U64(0xa4506cebde82bde9),
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xbef9a3f7b2c67915),U64(0xc67178f2e372532b),
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xca273eceea26619c),U64(0xd186b8c721c0c207),
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xeada7dd6cde0eb1e),U64(0xf57d4f7fee6ed178),
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x06f067aa72176fba),U64(0x0a637dc5a2c898a6),
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x113f9804bef90dae),U64(0x1b710b35131c471b),
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x28db77f523047d84),U64(0x32caab7b40c72493),
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x3c9ebe0a15c9bebc),U64(0x431d67c49c100d4c),
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x4cc5d4becb3e42b6),U64(0x597f299cfc657e2a),
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5fcb6fab3ad6faec),U64(0x6c44198c4a475817) };
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef PEDANTIC
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(__x86_64) || defined(__x86_64__)
309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   define ROTR(a,n)	({ SHA_LONG64 ret;		\
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("rorq %1,%0"	\
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)		\
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "J"(n),"0"(a)		\
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "cc"); ret;		})
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if !defined(B_ENDIAN)
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ SHA_LONG64 ret=*((const SHA_LONG64 *)(&(x)));	\
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("bswapq	%0"		\
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)			\
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(ret)); ret;		})
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  elif (defined(__i386) || defined(__i386__)) && !defined(B_ENDIAN)
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if defined(I386_ONLY)
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 unsigned int hi=p[0],lo=p[1];		\
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm("xchgb %%ah,%%al;xchgb %%dh,%%dl;"\
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    "roll $16,%%eax; roll $16,%%edx; "\
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    "xchgb %%ah,%%al;xchgb %%dh,%%dl;" \
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=a"(lo),"=d"(hi)		\
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(lo),"1"(hi) : "cc");	\
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				((SHA_LONG64)hi)<<32|lo;	})
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   else
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\
332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 unsigned int hi=p[0],lo=p[1];		\
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("bswapl %0; bswapl %1;"	\
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(lo),"=r"(hi)		\
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(lo),"1"(hi));		\
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				((SHA_LONG64)hi)<<32|lo;	})
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  elif (defined(_ARCH_PPC) && defined(__64BIT__)) || defined(_ARCH_PPC64)
339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   define ROTR(a,n)	({ SHA_LONG64 ret;		\
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("rotrdi %0,%1,%2"	\
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)		\
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "r"(a),"K"(n)); ret;	})
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# elif defined(_MSC_VER)
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(_WIN64)	/* applies to both IA-64 and AMD64 */
346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   pragma intrinsic(_rotr64)
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   define ROTR(a,n)	_rotr64((a),n)
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(_M_IX86) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if defined(I386_ONLY)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static SHA_LONG64 __fastcall __pull64be(const void *x)
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {	_asm	mov	edx, [ecx + 0]
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	mov	eax, [ecx + 4]
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	dh,dl
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	ah,al
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	rol	edx,16
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	rol	eax,16
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	dh,dl
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	ah,al
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   else
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static SHA_LONG64 __fastcall __pull64be(const void *x)
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {	_asm	mov	edx, [ecx + 0]
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	mov	eax, [ecx + 4]
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	bswap	edx
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	bswap	eax
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   define PULL64(x) __pull64be(&(x))
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if _MSC_VER<=1200
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    pragma inline_depth(0)
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef PULL64
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define B(x,j)    (((SHA_LONG64)(*(((const unsigned char *)(&x))+j)))<<((7-j)*8))
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#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))
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef ROTR
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ROTR(x,s)	(((x)>>s) | (x)<<(64-s))
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Ch(x,y,z)	(((x) & (y)) ^ ((~(x)) & (z)))
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Maj(x,y,z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(__i386) || defined(__i386__) || defined(_M_IX86)
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/*
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This code should give better results on 32-bit CPU with less than
398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ~24 registers, both size and performance wise...
399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const SHA_LONG64 *W=in;
403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	SHA_LONG64	A,E,T;
404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	SHA_LONG64	X[9+80],*F;
405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int i;
406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			while (num--) {
408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F    = X+80;
410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	A    = ctx->h[0];	F[1] = ctx->h[1];
411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F[2] = ctx->h[2];	F[3] = ctx->h[3];
412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	E    = ctx->h[4];	F[5] = ctx->h[5];
413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F[6] = ctx->h[6];	F[7] = ctx->h[7];
414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i=0;i<16;i++,F--)
416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef B_ENDIAN
418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T = W[i];
419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T = PULL64(W[i]);
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[0] = A;
423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[4] = E;
424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[8] = T;
425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		E    = F[3] + T;
427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (;i<80;i++,F--)
431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T    = sigma0(F[8+16-1]);
433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += sigma1(F[8+16-14]);
434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[8+16] + F[8+16-9];
435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[0] = A;
437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[4] = E;
438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[8] = T;
439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		E    = F[3] + T;
441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[0] += A;		ctx->h[1] += F[1];
445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[2] += F[2];	ctx->h[3] += F[3];
446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[4] += E;		ctx->h[5] += F[5];
447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[6] += F[6];	ctx->h[7] += F[7];
448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			W+=SHA_LBLOCK;
450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#elif defined(OPENSSL_SMALL_FOOTPRINT)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const SHA_LONG64 *W=in;
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1,T2;
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	X[16];
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (num--) {
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0;i<16;i++)
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef B_ENDIAN
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i] = W[i];
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i] = PULL64(W[i]);
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T2 = Sigma0(a) + Maj(a,b,c);
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h = g;	g = f;	f = e;	e = d + T1;
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		d = c;	c = b;	b = a;	a = T1 + T2;
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;i<80;i++)
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s0 = X[(i+1)&0x0f];	s0 = sigma0(s0);
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s1 = X[(i+14)&0x0f];	s1 = sigma1(s1);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i&0xf] += s0 + s1 + X[(i+9)&0xf];
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T2 = Sigma0(a) + Maj(a,b,c);
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h = g;	g = f;	f = e;	e = d + T1;
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		d = c;	c = b;	b = a;	a = T1 + T2;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			W+=SHA_LBLOCK;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define	ROUND_00_15(i,a,b,c,d,e,f,g,h)		do {	\
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];	\
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h = Sigma0(a) + Maj(a,b,c);			\
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	d += T1;	h += T1;		} while (0)
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define	ROUND_16_80(i,j,a,b,c,d,e,f,g,h,X)	do {	\
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	s0 = X[(j+1)&0x0f];	s0 = sigma0(s0);	\
508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	s1 = X[(j+14)&0x0f];	s1 = sigma1(s1);	\
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	T1 = X[(j)&0x0f] += s0 + s1 + X[(j+9)&0x0f];	\
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ROUND_00_15(i+j,a,b,c,d,e,f,g,h);		} while (0)
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const SHA_LONG64 *W=in;
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1;
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	X[16];
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (num--) {
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef B_ENDIAN
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[0] = W[0];	ROUND_00_15(0,a,b,c,d,e,f,g,h);
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[1] = W[1];	ROUND_00_15(1,h,a,b,c,d,e,f,g);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[2] = W[2];	ROUND_00_15(2,g,h,a,b,c,d,e,f);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[3] = W[3];	ROUND_00_15(3,f,g,h,a,b,c,d,e);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[4] = W[4];	ROUND_00_15(4,e,f,g,h,a,b,c,d);
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[5] = W[5];	ROUND_00_15(5,d,e,f,g,h,a,b,c);
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[6] = W[6];	ROUND_00_15(6,c,d,e,f,g,h,a,b);
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[7] = W[7];	ROUND_00_15(7,b,c,d,e,f,g,h,a);
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[8] = W[8];	ROUND_00_15(8,a,b,c,d,e,f,g,h);
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[9] = W[9];	ROUND_00_15(9,h,a,b,c,d,e,f,g);
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[10] = W[10];	ROUND_00_15(10,g,h,a,b,c,d,e,f);
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[11] = W[11];	ROUND_00_15(11,f,g,h,a,b,c,d,e);
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[12] = W[12];	ROUND_00_15(12,e,f,g,h,a,b,c,d);
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[13] = W[13];	ROUND_00_15(13,d,e,f,g,h,a,b,c);
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[14] = W[14];	ROUND_00_15(14,c,d,e,f,g,h,a,b);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[15] = W[15];	ROUND_00_15(15,b,c,d,e,f,g,h,a);
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[0]  = PULL64(W[0]);	ROUND_00_15(0,a,b,c,d,e,f,g,h);
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[1]  = PULL64(W[1]);	ROUND_00_15(1,h,a,b,c,d,e,f,g);
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[2]  = PULL64(W[2]);	ROUND_00_15(2,g,h,a,b,c,d,e,f);
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[3]  = PULL64(W[3]);	ROUND_00_15(3,f,g,h,a,b,c,d,e);
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[4]  = PULL64(W[4]);	ROUND_00_15(4,e,f,g,h,a,b,c,d);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[5]  = PULL64(W[5]);	ROUND_00_15(5,d,e,f,g,h,a,b,c);
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[6]  = PULL64(W[6]);	ROUND_00_15(6,c,d,e,f,g,h,a,b);
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[7]  = PULL64(W[7]);	ROUND_00_15(7,b,c,d,e,f,g,h,a);
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[8]  = PULL64(W[8]);	ROUND_00_15(8,a,b,c,d,e,f,g,h);
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[9]  = PULL64(W[9]);	ROUND_00_15(9,h,a,b,c,d,e,f,g);
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[10] = PULL64(W[10]);	ROUND_00_15(10,g,h,a,b,c,d,e,f);
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[11] = PULL64(W[11]);	ROUND_00_15(11,f,g,h,a,b,c,d,e);
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[12] = PULL64(W[12]);	ROUND_00_15(12,e,f,g,h,a,b,c,d);
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[13] = PULL64(W[13]);	ROUND_00_15(13,d,e,f,g,h,a,b,c);
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[14] = PULL64(W[14]);	ROUND_00_15(14,c,d,e,f,g,h,a,b);
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[15] = PULL64(W[15]);	ROUND_00_15(15,b,c,d,e,f,g,h,a);
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i=16;i<80;i+=16)
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 0,a,b,c,d,e,f,g,h,X);
563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 1,h,a,b,c,d,e,f,g,X);
564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 2,g,h,a,b,c,d,e,f,X);
565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 3,f,g,h,a,b,c,d,e,X);
566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 4,e,f,g,h,a,b,c,d,X);
567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 5,d,e,f,g,h,a,b,c,X);
568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 6,c,d,e,f,g,h,a,b,X);
569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 7,b,c,d,e,f,g,h,a,X);
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 8,a,b,c,d,e,f,g,h,X);
571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 9,h,a,b,c,d,e,f,g,X);
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,10,g,h,a,b,c,d,e,f,X);
573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,11,f,g,h,a,b,c,d,e,X);
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,12,e,f,g,h,a,b,c,d,X);
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,13,d,e,f,g,h,a,b,c,X);
576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,14,c,d,e,f,g,h,a,b,X);
577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,15,b,c,d,e,f,g,h,a,X);
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			W+=SHA_LBLOCK;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* SHA512_ASM */
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
591221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else /* !OPENSSL_NO_SHA512 */
59298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
593221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(PEDANTIC) || defined(__DECC) || defined(OPENSSL_SYS_MACOSX)
594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void *dummy=&dummy;
595221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
59698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif /* !OPENSSL_NO_SHA512 */
598