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