sha512.c revision 221304ee937bc0910948a8be1320cb8cc4eb6d36
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
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA384_Init (SHA512_CTX *c)
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
64221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm))
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* maintain dword order required by assembler module */
66221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	unsigned int *h = (unsigned int *)c->h;
67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[0]  = 0xcbbb9d5d; h[1]  = 0xc1059ed8;
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[2]  = 0x629a292a; h[3]  = 0x367cd507;
70221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[4]  = 0x9159015a; h[5]  = 0x3070dd17;
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[6]  = 0x152fecd8; h[7]  = 0xf70e5939;
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[8]  = 0x67332667; h[9]  = 0xffc00b31;
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[10] = 0x8eb44a87; h[11] = 0x68581511;
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[12] = 0xdb0c2e0d; h[13] = 0x64f98fa7;
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[14] = 0x47b5481d; h[15] = 0xbefa4fa4;
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[0]=U64(0xcbbb9d5dc1059ed8);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[1]=U64(0x629a292a367cd507);
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[2]=U64(0x9159015a3070dd17);
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[3]=U64(0x152fecd8f70e5939);
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[4]=U64(0x67332667ffc00b31);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[5]=U64(0x8eb44a8768581511);
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[6]=U64(0xdb0c2e0d64f98fa7);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[7]=U64(0x47b5481dbefa4fa4);
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->Nl=0;        c->Nh=0;
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->num=0;       c->md_len=SHA384_DIGEST_LENGTH;
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return 1;
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA512_Init (SHA512_CTX *c)
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm))
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* maintain dword order required by assembler module */
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	unsigned int *h = (unsigned int *)c->h;
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[0]  = 0x6a09e667; h[1]  = 0xf3bcc908;
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[2]  = 0xbb67ae85; h[3]  = 0x84caa73b;
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[4]  = 0x3c6ef372; h[5]  = 0xfe94f82b;
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[6]  = 0xa54ff53a; h[7]  = 0x5f1d36f1;
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[8]  = 0x510e527f; h[9]  = 0xade682d1;
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[10] = 0x9b05688c; h[11] = 0x2b3e6c1f;
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[12] = 0x1f83d9ab; h[13] = 0xfb41bd6b;
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	h[14] = 0x5be0cd19; h[15] = 0x137e2179;
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[0]=U64(0x6a09e667f3bcc908);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[1]=U64(0xbb67ae8584caa73b);
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[2]=U64(0x3c6ef372fe94f82b);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[3]=U64(0xa54ff53a5f1d36f1);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[4]=U64(0x510e527fade682d1);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[5]=U64(0x9b05688c2b3e6c1f);
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[6]=U64(0x1f83d9abfb41bd6b);
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->h[7]=U64(0x5be0cd19137e2179);
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->Nl=0;        c->Nh=0;
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        c->num=0;       c->md_len=SHA512_DIGEST_LENGTH;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return 1;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_ASM
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA512_Final (unsigned char *md, SHA512_CTX *c)
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *p=(unsigned char *)c->u.p;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t n=c->num;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[n]=0x80;	/* There always is a room for one */
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n++;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n > (sizeof(c->u)-16))
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset (p+n,0,sizeof(c->u)-n), n=0,
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sha512_block_data_order (c,p,1);
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset (p+n,0,sizeof(c->u)-16-n);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef	B_ENDIAN
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->u.d[SHA_LBLOCK-2] = c->Nh;
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->u.d[SHA_LBLOCK-1] = c->Nl;
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-1]  = (unsigned char)(c->Nl);
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-2]  = (unsigned char)(c->Nl>>8);
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-3]  = (unsigned char)(c->Nl>>16);
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-4]  = (unsigned char)(c->Nl>>24);
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-5]  = (unsigned char)(c->Nl>>32);
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-6]  = (unsigned char)(c->Nl>>40);
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-7]  = (unsigned char)(c->Nl>>48);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-8]  = (unsigned char)(c->Nl>>56);
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-9]  = (unsigned char)(c->Nh);
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-10] = (unsigned char)(c->Nh>>8);
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-11] = (unsigned char)(c->Nh>>16);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-12] = (unsigned char)(c->Nh>>24);
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-13] = (unsigned char)(c->Nh>>32);
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-14] = (unsigned char)(c->Nh>>40);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-15] = (unsigned char)(c->Nh>>48);
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	p[sizeof(c->u)-16] = (unsigned char)(c->Nh>>56);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sha512_block_data_order (c,p,1);
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md==0) return 0;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(SHA512_ASM) && (defined(__arm__) || defined(__arm))
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* recall assembler dword order... */
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	n = c->md_len;
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (n == SHA384_DIGEST_LENGTH || n == SHA512_DIGEST_LENGTH)
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		unsigned int *h = (unsigned int *)c->h, t;
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		for (n/=4;n;n--)
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			t = *(h++);
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			*(md++) = (unsigned char)(t>>24);
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			*(md++) = (unsigned char)(t>>16);
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			*(md++) = (unsigned char)(t>>8);
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			*(md++) = (unsigned char)(t);
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else	return 0;
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (c->md_len)
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Let compiler decide if it's appropriate to unroll... */
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case SHA384_DIGEST_LENGTH:
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (n=0;n<SHA384_DIGEST_LENGTH/8;n++)
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHA_LONG64 t = c->h[n];
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>56);
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>48);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>40);
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>32);
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>24);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>16);
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>8);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t);
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case SHA512_DIGEST_LENGTH:
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			for (n=0;n<SHA512_DIGEST_LENGTH/8;n++)
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				SHA_LONG64 t = c->h[n];
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>56);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>48);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>40);
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>32);
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>24);
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>16);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t>>8);
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				*(md++)	= (unsigned char)(t);
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* ... as well as make sure md_len is not abused. */
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		default:	return 0;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA384_Final (unsigned char *md,SHA512_CTX *c)
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   return SHA512_Final (md,c);   }
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA512_Update (SHA512_CTX *c, const void *_data, size_t len)
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	l;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char  *p=c->u.p;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const unsigned char *data=(const unsigned char *)_data;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len==0) return  1;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l = (c->Nl+(((SHA_LONG64)len)<<3))&U64(0xffffffffffffffff);
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (l < c->Nl)		c->Nh++;
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (sizeof(len)>=8)	c->Nh+=(((SHA_LONG64)len)>>61);
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c->Nl=l;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (c->num != 0)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		size_t n = sizeof(c->u) - c->num;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (len < n)
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			memcpy (p+c->num,data,len), c->num += (unsigned int)len;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	{
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy (p+c->num,data,n), c->num = 0;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len-=n, data+=n;
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sha512_block_data_order (c,p,1);
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len >= sizeof(c->u))
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_BLOCK_CAN_MANAGE_UNALIGNED_DATA
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((size_t)data%sizeof(c->u.d[0]) != 0)
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (len >= sizeof(c->u))
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				memcpy (p,data,sizeof(c->u)),
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				sha512_block_data_order (c,p,1),
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				len  -= sizeof(c->u),
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				data += sizeof(c->u);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			sha512_block_data_order (c,data,len/sizeof(c->u)),
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data += len,
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			len  %= sizeof(c->u),
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			data -= len;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (len != 0)	memcpy (p,data,len), c->num = (int)len;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint SHA384_Update (SHA512_CTX *c, const void *data, size_t len)
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   return SHA512_Update (c,data,len);   }
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid SHA512_Transform (SHA512_CTX *c, const unsigned char *data)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{   sha512_block_data_order (c,data,1);  }
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md)
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_CTX c;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char m[SHA384_DIGEST_LENGTH];
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md == NULL) md=m;
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA384_Init(&c);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Update(&c,d,n);
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Final(md,&c);
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&c,sizeof(c));
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(md);
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_CTX c;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static unsigned char m[SHA512_DIGEST_LENGTH];
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (md == NULL) md=m;
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Init(&c);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Update(&c,d,n);
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA512_Final(md,&c);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_cleanse(&c,sizeof(c));
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(md);
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SHA512_ASM
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const SHA_LONG64 K512[80] = {
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x428a2f98d728ae22),U64(0x7137449123ef65cd),
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xb5c0fbcfec4d3b2f),U64(0xe9b5dba58189dbbc),
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x3956c25bf348b538),U64(0x59f111f1b605d019),
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x923f82a4af194f9b),U64(0xab1c5ed5da6d8118),
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xd807aa98a3030242),U64(0x12835b0145706fbe),
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x243185be4ee4b28c),U64(0x550c7dc3d5ffb4e2),
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x72be5d74f27b896f),U64(0x80deb1fe3b1696b1),
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x9bdc06a725c71235),U64(0xc19bf174cf692694),
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xe49b69c19ef14ad2),U64(0xefbe4786384f25e3),
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x0fc19dc68b8cd5b5),U64(0x240ca1cc77ac9c65),
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x2de92c6f592b0275),U64(0x4a7484aa6ea6e483),
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5cb0a9dcbd41fbd4),U64(0x76f988da831153b5),
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x983e5152ee66dfab),U64(0xa831c66d2db43210),
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xb00327c898fb213f),U64(0xbf597fc7beef0ee4),
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xc6e00bf33da88fc2),U64(0xd5a79147930aa725),
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x06ca6351e003826f),U64(0x142929670a0e6e70),
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x27b70a8546d22ffc),U64(0x2e1b21385c26c926),
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x4d2c6dfc5ac42aed),U64(0x53380d139d95b3df),
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x650a73548baf63de),U64(0x766a0abb3c77b2a8),
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x81c2c92e47edaee6),U64(0x92722c851482353b),
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xa2bfe8a14cf10364),U64(0xa81a664bbc423001),
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xc24b8b70d0f89791),U64(0xc76c51a30654be30),
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xd192e819d6ef5218),U64(0xd69906245565a910),
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xf40e35855771202a),U64(0x106aa07032bbd1b8),
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x19a4c116b8d2d0c8),U64(0x1e376c085141ab53),
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x2748774cdf8eeb99),U64(0x34b0bcb5e19b48a8),
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x391c0cb3c5c95a63),U64(0x4ed8aa4ae3418acb),
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5b9cca4f7763e373),U64(0x682e6ff3d6b2b8a3),
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x748f82ee5defb2fc),U64(0x78a5636f43172f60),
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x84c87814a1f0ab72),U64(0x8cc702081a6439ec),
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x90befffa23631e28),U64(0xa4506cebde82bde9),
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xbef9a3f7b2c67915),U64(0xc67178f2e372532b),
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xca273eceea26619c),U64(0xd186b8c721c0c207),
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0xeada7dd6cde0eb1e),U64(0xf57d4f7fee6ed178),
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x06f067aa72176fba),U64(0x0a637dc5a2c898a6),
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x113f9804bef90dae),U64(0x1b710b35131c471b),
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x28db77f523047d84),U64(0x32caab7b40c72493),
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x3c9ebe0a15c9bebc),U64(0x431d67c49c100d4c),
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x4cc5d4becb3e42b6),U64(0x597f299cfc657e2a),
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        U64(0x5fcb6fab3ad6faec),U64(0x6c44198c4a475817) };
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef PEDANTIC
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# if defined(__GNUC__) && __GNUC__>=2 && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(__x86_64) || defined(__x86_64__)
353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   define ROTR(a,n)	({ SHA_LONG64 ret;		\
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("rorq %1,%0"	\
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)		\
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "J"(n),"0"(a)		\
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "cc"); ret;		})
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if !defined(B_ENDIAN)
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ SHA_LONG64 ret=*((const SHA_LONG64 *)(&(x)));	\
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("bswapq	%0"		\
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)			\
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(ret)); ret;		})
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  elif (defined(__i386) || defined(__i386__)) && !defined(B_ENDIAN)
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if defined(I386_ONLY)
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 unsigned int hi=p[0],lo=p[1];		\
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm("xchgb %%ah,%%al;xchgb %%dh,%%dl;"\
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    "roll $16,%%eax; roll $16,%%edx; "\
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    "xchgb %%ah,%%al;xchgb %%dh,%%dl;" \
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=a"(lo),"=d"(hi)		\
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(lo),"1"(hi) : "cc");	\
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				((SHA_LONG64)hi)<<32|lo;	})
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   else
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    define PULL64(x) ({ const unsigned int *p=(const unsigned int *)(&(x));\
376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 unsigned int hi=p[0],lo=p[1];		\
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("bswapl %0; bswapl %1;"	\
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(lo),"=r"(hi)		\
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "0"(lo),"1"(hi));		\
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				((SHA_LONG64)hi)<<32|lo;	})
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  elif (defined(_ARCH_PPC) && defined(__64BIT__)) || defined(_ARCH_PPC64)
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   define ROTR(a,n)	({ SHA_LONG64 ret;		\
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				asm ("rotrdi %0,%1,%2"	\
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "=r"(ret)		\
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				: "r"(a),"K"(n)); ret;	})
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# elif defined(_MSC_VER)
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(_WIN64)	/* applies to both IA-64 and AMD64 */
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#   pragma intrinsic(_rotr64)
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   define ROTR(a,n)	_rotr64((a),n)
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  if defined(_M_IX86) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if defined(I386_ONLY)
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static SHA_LONG64 __fastcall __pull64be(const void *x)
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {	_asm	mov	edx, [ecx + 0]
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	mov	eax, [ecx + 4]
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	dh,dl
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	ah,al
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	rol	edx,16
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	rol	eax,16
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	dh,dl
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	xchg	ah,al
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   else
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static SHA_LONG64 __fastcall __pull64be(const void *x)
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {	_asm	mov	edx, [ecx + 0]
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	mov	eax, [ecx + 4]
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	bswap	edx
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_asm	bswap	eax
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   define PULL64(x) __pull64be(&(x))
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   if _MSC_VER<=1200
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#    pragma inline_depth(0)
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#   endif
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  endif
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef PULL64
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define B(x,j)    (((SHA_LONG64)(*(((const unsigned char *)(&x))+j)))<<((7-j)*8))
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe 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))
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef ROTR
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ROTR(x,s)	(((x)>>s) | (x)<<(64-s))
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Ch(x,y,z)	(((x) & (y)) ^ ((~(x)) & (z)))
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define Maj(x,y,z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(__i386) || defined(__i386__) || defined(_M_IX86)
440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom/*
441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * This code should give better results on 32-bit CPU with less than
442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * ~24 registers, both size and performance wise...
443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom */
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const SHA_LONG64 *W=in;
447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	SHA_LONG64	A,E,T;
448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	SHA_LONG64	X[9+80],*F;
449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int i;
450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			while (num--) {
452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F    = X+80;
454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	A    = ctx->h[0];	F[1] = ctx->h[1];
455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F[2] = ctx->h[2];	F[3] = ctx->h[3];
456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	E    = ctx->h[4];	F[5] = ctx->h[5];
457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	F[6] = ctx->h[6];	F[7] = ctx->h[7];
458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i=0;i<16;i++,F--)
460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef B_ENDIAN
462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T = W[i];
463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else
464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T = PULL64(W[i]);
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[0] = A;
467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[4] = E;
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[8] = T;
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		E    = F[3] + T;
471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (;i<80;i++,F--)
475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T    = sigma0(F[8+16-1]);
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += sigma1(F[8+16-14]);
478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[8+16] + F[8+16-9];
479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[0] = A;
481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[4] = E;
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		F[8] = T;
483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		T   += F[7] + Sigma1(E) + Ch(E,F[5],F[6]) + K512[i];
484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		E    = F[3] + T;
485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		A    = T + Sigma0(A) + Maj(A,F[1],F[2]);
486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[0] += A;		ctx->h[1] += F[1];
489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[2] += F[2];	ctx->h[3] += F[3];
490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[4] += E;		ctx->h[5] += F[5];
491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->h[6] += F[6];	ctx->h[7] += F[7];
492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			W+=SHA_LBLOCK;
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#elif defined(OPENSSL_SMALL_FOOTPRINT)
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const SHA_LONG64 *W=in;
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1,T2;
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	X[16];
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (num--) {
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0;i<16;i++)
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef B_ENDIAN
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i] = W[i];
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i] = PULL64(W[i]);
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T2 = Sigma0(a) + Maj(a,b,c);
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h = g;	g = f;	f = e;	e = d + T1;
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		d = c;	c = b;	b = a;	a = T1 + T2;
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;i<80;i++)
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s0 = X[(i+1)&0x0f];	s0 = sigma0(s0);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s1 = X[(i+14)&0x0f];	s1 = sigma1(s1);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 = X[i&0xf] += s0 + s1 + X[(i+9)&0xf];
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		T2 = Sigma0(a) + Maj(a,b,c);
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		h = g;	g = f;	f = e;	e = d + T1;
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		d = c;	c = b;	b = a;	a = T1 + T2;
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			W+=SHA_LBLOCK;
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define	ROUND_00_15(i,a,b,c,d,e,f,g,h)		do {	\
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 += h + Sigma1(e) + Ch(e,f,g) + K512[i];	\
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	h = Sigma0(a) + Maj(a,b,c);			\
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	d += T1;	h += T1;		} while (0)
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define	ROUND_16_80(i,j,a,b,c,d,e,f,g,h,X)	do {	\
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	s0 = X[(j+1)&0x0f];	s0 = sigma0(s0);	\
552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	s1 = X[(j+14)&0x0f];	s1 = sigma1(s1);	\
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	T1 = X[(j)&0x0f] += s0 + s1 + X[(j+9)&0x0f];	\
554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ROUND_00_15(i+j,a,b,c,d,e,f,g,h);		} while (0)
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void sha512_block_data_order (SHA512_CTX *ctx, const void *in, size_t num)
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const SHA_LONG64 *W=in;
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	a,b,c,d,e,f,g,h,s0,s1,T1;
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_LONG64	X[16];
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			while (num--) {
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	a = ctx->h[0];	b = ctx->h[1];	c = ctx->h[2];	d = ctx->h[3];
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e = ctx->h[4];	f = ctx->h[5];	g = ctx->h[6];	h = ctx->h[7];
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef B_ENDIAN
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[0] = W[0];	ROUND_00_15(0,a,b,c,d,e,f,g,h);
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[1] = W[1];	ROUND_00_15(1,h,a,b,c,d,e,f,g);
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[2] = W[2];	ROUND_00_15(2,g,h,a,b,c,d,e,f);
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[3] = W[3];	ROUND_00_15(3,f,g,h,a,b,c,d,e);
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[4] = W[4];	ROUND_00_15(4,e,f,g,h,a,b,c,d);
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[5] = W[5];	ROUND_00_15(5,d,e,f,g,h,a,b,c);
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[6] = W[6];	ROUND_00_15(6,c,d,e,f,g,h,a,b);
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[7] = W[7];	ROUND_00_15(7,b,c,d,e,f,g,h,a);
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[8] = W[8];	ROUND_00_15(8,a,b,c,d,e,f,g,h);
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[9] = W[9];	ROUND_00_15(9,h,a,b,c,d,e,f,g);
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[10] = W[10];	ROUND_00_15(10,g,h,a,b,c,d,e,f);
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[11] = W[11];	ROUND_00_15(11,f,g,h,a,b,c,d,e);
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[12] = W[12];	ROUND_00_15(12,e,f,g,h,a,b,c,d);
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[13] = W[13];	ROUND_00_15(13,d,e,f,g,h,a,b,c);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[14] = W[14];	ROUND_00_15(14,c,d,e,f,g,h,a,b);
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[15] = W[15];	ROUND_00_15(15,b,c,d,e,f,g,h,a);
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[0]  = PULL64(W[0]);	ROUND_00_15(0,a,b,c,d,e,f,g,h);
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[1]  = PULL64(W[1]);	ROUND_00_15(1,h,a,b,c,d,e,f,g);
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[2]  = PULL64(W[2]);	ROUND_00_15(2,g,h,a,b,c,d,e,f);
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[3]  = PULL64(W[3]);	ROUND_00_15(3,f,g,h,a,b,c,d,e);
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[4]  = PULL64(W[4]);	ROUND_00_15(4,e,f,g,h,a,b,c,d);
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[5]  = PULL64(W[5]);	ROUND_00_15(5,d,e,f,g,h,a,b,c);
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[6]  = PULL64(W[6]);	ROUND_00_15(6,c,d,e,f,g,h,a,b);
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[7]  = PULL64(W[7]);	ROUND_00_15(7,b,c,d,e,f,g,h,a);
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[8]  = PULL64(W[8]);	ROUND_00_15(8,a,b,c,d,e,f,g,h);
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[9]  = PULL64(W[9]);	ROUND_00_15(9,h,a,b,c,d,e,f,g);
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[10] = PULL64(W[10]);	ROUND_00_15(10,g,h,a,b,c,d,e,f);
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[11] = PULL64(W[11]);	ROUND_00_15(11,f,g,h,a,b,c,d,e);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[12] = PULL64(W[12]);	ROUND_00_15(12,e,f,g,h,a,b,c,d);
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[13] = PULL64(W[13]);	ROUND_00_15(13,d,e,f,g,h,a,b,c);
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[14] = PULL64(W[14]);	ROUND_00_15(14,c,d,e,f,g,h,a,b);
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T1 = X[15] = PULL64(W[15]);	ROUND_00_15(15,b,c,d,e,f,g,h,a);
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	for (i=16;i<80;i+=16)
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 0,a,b,c,d,e,f,g,h,X);
607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 1,h,a,b,c,d,e,f,g,X);
608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 2,g,h,a,b,c,d,e,f,X);
609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 3,f,g,h,a,b,c,d,e,X);
610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 4,e,f,g,h,a,b,c,d,X);
611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 5,d,e,f,g,h,a,b,c,X);
612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 6,c,d,e,f,g,h,a,b,X);
613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 7,b,c,d,e,f,g,h,a,X);
614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 8,a,b,c,d,e,f,g,h,X);
615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i, 9,h,a,b,c,d,e,f,g,X);
616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,10,g,h,a,b,c,d,e,f,X);
617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,11,f,g,h,a,b,c,d,e,X);
618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,12,e,f,g,h,a,b,c,d,X);
619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,13,d,e,f,g,h,a,b,c,X);
620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,14,c,d,e,f,g,h,a,b,X);
621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ROUND_16_80(i,15,b,c,d,e,f,g,h,a,X);
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[0] += a;	ctx->h[1] += b;	ctx->h[2] += c;	ctx->h[3] += d;
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->h[4] += e;	ctx->h[5] += f;	ctx->h[6] += g;	ctx->h[7] += h;
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			W+=SHA_LBLOCK;
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* SHA512_ASM */
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else /* !OPENSSL_NO_SHA512 */
63698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#if defined(PEDANTIC) || defined(__DECC) || defined(OPENSSL_SYS_MACOSX)
638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void *dummy=&dummy;
639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
64098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom
641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif /* !OPENSSL_NO_SHA512 */
642