1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * SHA1 hash implementation and interface functions
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2003-2005, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker */
8*03f9172cSAndroid Build Coastguard Worker
9*03f9172cSAndroid Build Coastguard Worker #include "includes.h"
10*03f9172cSAndroid Build Coastguard Worker
11*03f9172cSAndroid Build Coastguard Worker #include "common.h"
12*03f9172cSAndroid Build Coastguard Worker #include "sha1.h"
13*03f9172cSAndroid Build Coastguard Worker #include "sha1_i.h"
14*03f9172cSAndroid Build Coastguard Worker #include "md5.h"
15*03f9172cSAndroid Build Coastguard Worker #include "crypto.h"
16*03f9172cSAndroid Build Coastguard Worker
17*03f9172cSAndroid Build Coastguard Worker typedef struct SHA1Context SHA1_CTX;
18*03f9172cSAndroid Build Coastguard Worker
19*03f9172cSAndroid Build Coastguard Worker void SHA1Transform(u32 state[5], const unsigned char buffer[64]);
20*03f9172cSAndroid Build Coastguard Worker
21*03f9172cSAndroid Build Coastguard Worker
22*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_CRYPTO_INTERNAL
23*03f9172cSAndroid Build Coastguard Worker /**
24*03f9172cSAndroid Build Coastguard Worker * sha1_vector - SHA-1 hash for data vector
25*03f9172cSAndroid Build Coastguard Worker * @num_elem: Number of elements in the data vector
26*03f9172cSAndroid Build Coastguard Worker * @addr: Pointers to the data areas
27*03f9172cSAndroid Build Coastguard Worker * @len: Lengths of the data blocks
28*03f9172cSAndroid Build Coastguard Worker * @mac: Buffer for the hash
29*03f9172cSAndroid Build Coastguard Worker * Returns: 0 on success, -1 of failure
30*03f9172cSAndroid Build Coastguard Worker */
sha1_vector(size_t num_elem,const u8 * addr[],const size_t * len,u8 * mac)31*03f9172cSAndroid Build Coastguard Worker int sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, u8 *mac)
32*03f9172cSAndroid Build Coastguard Worker {
33*03f9172cSAndroid Build Coastguard Worker SHA1_CTX ctx;
34*03f9172cSAndroid Build Coastguard Worker size_t i;
35*03f9172cSAndroid Build Coastguard Worker
36*03f9172cSAndroid Build Coastguard Worker if (TEST_FAIL())
37*03f9172cSAndroid Build Coastguard Worker return -1;
38*03f9172cSAndroid Build Coastguard Worker
39*03f9172cSAndroid Build Coastguard Worker SHA1Init(&ctx);
40*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < num_elem; i++)
41*03f9172cSAndroid Build Coastguard Worker SHA1Update(&ctx, addr[i], len[i]);
42*03f9172cSAndroid Build Coastguard Worker SHA1Final(mac, &ctx);
43*03f9172cSAndroid Build Coastguard Worker return 0;
44*03f9172cSAndroid Build Coastguard Worker }
45*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CRYPTO_INTERNAL */
46*03f9172cSAndroid Build Coastguard Worker
47*03f9172cSAndroid Build Coastguard Worker
48*03f9172cSAndroid Build Coastguard Worker /* ===== start - public domain SHA1 implementation ===== */
49*03f9172cSAndroid Build Coastguard Worker
50*03f9172cSAndroid Build Coastguard Worker /*
51*03f9172cSAndroid Build Coastguard Worker SHA-1 in C
52*03f9172cSAndroid Build Coastguard Worker By Steve Reid <[email protected]>
53*03f9172cSAndroid Build Coastguard Worker 100% Public Domain
54*03f9172cSAndroid Build Coastguard Worker
55*03f9172cSAndroid Build Coastguard Worker -----------------
56*03f9172cSAndroid Build Coastguard Worker Modified 7/98
57*03f9172cSAndroid Build Coastguard Worker By James H. Brown <[email protected]>
58*03f9172cSAndroid Build Coastguard Worker Still 100% Public Domain
59*03f9172cSAndroid Build Coastguard Worker
60*03f9172cSAndroid Build Coastguard Worker Corrected a problem which generated improper hash values on 16 bit machines
61*03f9172cSAndroid Build Coastguard Worker Routine SHA1Update changed from
62*03f9172cSAndroid Build Coastguard Worker void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
63*03f9172cSAndroid Build Coastguard Worker len)
64*03f9172cSAndroid Build Coastguard Worker to
65*03f9172cSAndroid Build Coastguard Worker void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
66*03f9172cSAndroid Build Coastguard Worker long len)
67*03f9172cSAndroid Build Coastguard Worker
68*03f9172cSAndroid Build Coastguard Worker The 'len' parameter was declared an int which works fine on 32 bit machines.
69*03f9172cSAndroid Build Coastguard Worker However, on 16 bit machines an int is too small for the shifts being done
70*03f9172cSAndroid Build Coastguard Worker against
71*03f9172cSAndroid Build Coastguard Worker it. This caused the hash function to generate incorrect values if len was
72*03f9172cSAndroid Build Coastguard Worker greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().
73*03f9172cSAndroid Build Coastguard Worker
74*03f9172cSAndroid Build Coastguard Worker Since the file IO in main() reads 16K at a time, any file 8K or larger would
75*03f9172cSAndroid Build Coastguard Worker be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million
76*03f9172cSAndroid Build Coastguard Worker "a"s).
77*03f9172cSAndroid Build Coastguard Worker
78*03f9172cSAndroid Build Coastguard Worker I also changed the declaration of variables i & j in SHA1Update to
79*03f9172cSAndroid Build Coastguard Worker unsigned long from unsigned int for the same reason.
80*03f9172cSAndroid Build Coastguard Worker
81*03f9172cSAndroid Build Coastguard Worker These changes should make no difference to any 32 bit implementations since
82*03f9172cSAndroid Build Coastguard Worker an
83*03f9172cSAndroid Build Coastguard Worker int and a long are the same size in those environments.
84*03f9172cSAndroid Build Coastguard Worker
85*03f9172cSAndroid Build Coastguard Worker --
86*03f9172cSAndroid Build Coastguard Worker I also corrected a few compiler warnings generated by Borland C.
87*03f9172cSAndroid Build Coastguard Worker 1. Added #include <process.h> for exit() prototype
88*03f9172cSAndroid Build Coastguard Worker 2. Removed unused variable 'j' in SHA1Final
89*03f9172cSAndroid Build Coastguard Worker 3. Changed exit(0) to return(0) at end of main.
90*03f9172cSAndroid Build Coastguard Worker
91*03f9172cSAndroid Build Coastguard Worker ALL changes I made can be located by searching for comments containing 'JHB'
92*03f9172cSAndroid Build Coastguard Worker -----------------
93*03f9172cSAndroid Build Coastguard Worker Modified 8/98
94*03f9172cSAndroid Build Coastguard Worker By Steve Reid <[email protected]>
95*03f9172cSAndroid Build Coastguard Worker Still 100% public domain
96*03f9172cSAndroid Build Coastguard Worker
97*03f9172cSAndroid Build Coastguard Worker 1- Removed #include <process.h> and used return() instead of exit()
98*03f9172cSAndroid Build Coastguard Worker 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)
99*03f9172cSAndroid Build Coastguard Worker 3- Changed email address from [email protected] to [email protected]
100*03f9172cSAndroid Build Coastguard Worker
101*03f9172cSAndroid Build Coastguard Worker -----------------
102*03f9172cSAndroid Build Coastguard Worker Modified 4/01
103*03f9172cSAndroid Build Coastguard Worker By Saul Kravitz <[email protected]>
104*03f9172cSAndroid Build Coastguard Worker Still 100% PD
105*03f9172cSAndroid Build Coastguard Worker Modified to run on Compaq Alpha hardware.
106*03f9172cSAndroid Build Coastguard Worker
107*03f9172cSAndroid Build Coastguard Worker -----------------
108*03f9172cSAndroid Build Coastguard Worker Modified 4/01
109*03f9172cSAndroid Build Coastguard Worker By Jouni Malinen <[email protected]>
110*03f9172cSAndroid Build Coastguard Worker Minor changes to match the coding style used in Dynamics.
111*03f9172cSAndroid Build Coastguard Worker
112*03f9172cSAndroid Build Coastguard Worker Modified September 24, 2004
113*03f9172cSAndroid Build Coastguard Worker By Jouni Malinen <[email protected]>
114*03f9172cSAndroid Build Coastguard Worker Fixed alignment issue in SHA1Transform when SHA1HANDSOFF is defined.
115*03f9172cSAndroid Build Coastguard Worker
116*03f9172cSAndroid Build Coastguard Worker */
117*03f9172cSAndroid Build Coastguard Worker
118*03f9172cSAndroid Build Coastguard Worker /*
119*03f9172cSAndroid Build Coastguard Worker Test Vectors (from FIPS PUB 180-1)
120*03f9172cSAndroid Build Coastguard Worker "abc"
121*03f9172cSAndroid Build Coastguard Worker A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
122*03f9172cSAndroid Build Coastguard Worker "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
123*03f9172cSAndroid Build Coastguard Worker 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
124*03f9172cSAndroid Build Coastguard Worker A million repetitions of "a"
125*03f9172cSAndroid Build Coastguard Worker 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
126*03f9172cSAndroid Build Coastguard Worker */
127*03f9172cSAndroid Build Coastguard Worker
128*03f9172cSAndroid Build Coastguard Worker #define SHA1HANDSOFF
129*03f9172cSAndroid Build Coastguard Worker
130*03f9172cSAndroid Build Coastguard Worker #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
131*03f9172cSAndroid Build Coastguard Worker
132*03f9172cSAndroid Build Coastguard Worker /* blk0() and blk() perform the initial expand. */
133*03f9172cSAndroid Build Coastguard Worker /* I got the idea of expanding during the round function from SSLeay */
134*03f9172cSAndroid Build Coastguard Worker #ifndef WORDS_BIGENDIAN
135*03f9172cSAndroid Build Coastguard Worker #define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
136*03f9172cSAndroid Build Coastguard Worker (rol(block->l[i], 8) & 0x00FF00FF))
137*03f9172cSAndroid Build Coastguard Worker #else
138*03f9172cSAndroid Build Coastguard Worker #define blk0(i) block->l[i]
139*03f9172cSAndroid Build Coastguard Worker #endif
140*03f9172cSAndroid Build Coastguard Worker #define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
141*03f9172cSAndroid Build Coastguard Worker block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
142*03f9172cSAndroid Build Coastguard Worker
143*03f9172cSAndroid Build Coastguard Worker /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
144*03f9172cSAndroid Build Coastguard Worker #define R0(v,w,x,y,z,i) \
145*03f9172cSAndroid Build Coastguard Worker z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
146*03f9172cSAndroid Build Coastguard Worker w = rol(w, 30);
147*03f9172cSAndroid Build Coastguard Worker #define R1(v,w,x,y,z,i) \
148*03f9172cSAndroid Build Coastguard Worker z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
149*03f9172cSAndroid Build Coastguard Worker w = rol(w, 30);
150*03f9172cSAndroid Build Coastguard Worker #define R2(v,w,x,y,z,i) \
151*03f9172cSAndroid Build Coastguard Worker z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30);
152*03f9172cSAndroid Build Coastguard Worker #define R3(v,w,x,y,z,i) \
153*03f9172cSAndroid Build Coastguard Worker z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
154*03f9172cSAndroid Build Coastguard Worker w = rol(w, 30);
155*03f9172cSAndroid Build Coastguard Worker #define R4(v,w,x,y,z,i) \
156*03f9172cSAndroid Build Coastguard Worker z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
157*03f9172cSAndroid Build Coastguard Worker w=rol(w, 30);
158*03f9172cSAndroid Build Coastguard Worker
159*03f9172cSAndroid Build Coastguard Worker
160*03f9172cSAndroid Build Coastguard Worker #ifdef VERBOSE /* SAK */
SHAPrintContext(SHA1_CTX * context,char * msg)161*03f9172cSAndroid Build Coastguard Worker void SHAPrintContext(SHA1_CTX *context, char *msg)
162*03f9172cSAndroid Build Coastguard Worker {
163*03f9172cSAndroid Build Coastguard Worker printf("%s (%d,%d) %x %x %x %x %x\n",
164*03f9172cSAndroid Build Coastguard Worker msg,
165*03f9172cSAndroid Build Coastguard Worker context->count[0], context->count[1],
166*03f9172cSAndroid Build Coastguard Worker context->state[0],
167*03f9172cSAndroid Build Coastguard Worker context->state[1],
168*03f9172cSAndroid Build Coastguard Worker context->state[2],
169*03f9172cSAndroid Build Coastguard Worker context->state[3],
170*03f9172cSAndroid Build Coastguard Worker context->state[4]);
171*03f9172cSAndroid Build Coastguard Worker }
172*03f9172cSAndroid Build Coastguard Worker #endif
173*03f9172cSAndroid Build Coastguard Worker
174*03f9172cSAndroid Build Coastguard Worker /* Hash a single 512-bit block. This is the core of the algorithm. */
175*03f9172cSAndroid Build Coastguard Worker
SHA1Transform(u32 state[5],const unsigned char buffer[64])176*03f9172cSAndroid Build Coastguard Worker void SHA1Transform(u32 state[5], const unsigned char buffer[64])
177*03f9172cSAndroid Build Coastguard Worker {
178*03f9172cSAndroid Build Coastguard Worker u32 a, b, c, d, e;
179*03f9172cSAndroid Build Coastguard Worker typedef union {
180*03f9172cSAndroid Build Coastguard Worker unsigned char c[64];
181*03f9172cSAndroid Build Coastguard Worker u32 l[16];
182*03f9172cSAndroid Build Coastguard Worker } CHAR64LONG16;
183*03f9172cSAndroid Build Coastguard Worker CHAR64LONG16* block;
184*03f9172cSAndroid Build Coastguard Worker #ifdef SHA1HANDSOFF
185*03f9172cSAndroid Build Coastguard Worker CHAR64LONG16 workspace;
186*03f9172cSAndroid Build Coastguard Worker block = &workspace;
187*03f9172cSAndroid Build Coastguard Worker os_memcpy(block, buffer, 64);
188*03f9172cSAndroid Build Coastguard Worker #else
189*03f9172cSAndroid Build Coastguard Worker block = (CHAR64LONG16 *) buffer;
190*03f9172cSAndroid Build Coastguard Worker #endif
191*03f9172cSAndroid Build Coastguard Worker /* Copy context->state[] to working vars */
192*03f9172cSAndroid Build Coastguard Worker a = state[0];
193*03f9172cSAndroid Build Coastguard Worker b = state[1];
194*03f9172cSAndroid Build Coastguard Worker c = state[2];
195*03f9172cSAndroid Build Coastguard Worker d = state[3];
196*03f9172cSAndroid Build Coastguard Worker e = state[4];
197*03f9172cSAndroid Build Coastguard Worker /* 4 rounds of 20 operations each. Loop unrolled. */
198*03f9172cSAndroid Build Coastguard Worker R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
199*03f9172cSAndroid Build Coastguard Worker R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
200*03f9172cSAndroid Build Coastguard Worker R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
201*03f9172cSAndroid Build Coastguard Worker R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
202*03f9172cSAndroid Build Coastguard Worker R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
203*03f9172cSAndroid Build Coastguard Worker R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
204*03f9172cSAndroid Build Coastguard Worker R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
205*03f9172cSAndroid Build Coastguard Worker R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
206*03f9172cSAndroid Build Coastguard Worker R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
207*03f9172cSAndroid Build Coastguard Worker R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
208*03f9172cSAndroid Build Coastguard Worker R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
209*03f9172cSAndroid Build Coastguard Worker R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
210*03f9172cSAndroid Build Coastguard Worker R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
211*03f9172cSAndroid Build Coastguard Worker R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
212*03f9172cSAndroid Build Coastguard Worker R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
213*03f9172cSAndroid Build Coastguard Worker R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
214*03f9172cSAndroid Build Coastguard Worker R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
215*03f9172cSAndroid Build Coastguard Worker R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
216*03f9172cSAndroid Build Coastguard Worker R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
217*03f9172cSAndroid Build Coastguard Worker R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
218*03f9172cSAndroid Build Coastguard Worker /* Add the working vars back into context.state[] */
219*03f9172cSAndroid Build Coastguard Worker state[0] += a;
220*03f9172cSAndroid Build Coastguard Worker state[1] += b;
221*03f9172cSAndroid Build Coastguard Worker state[2] += c;
222*03f9172cSAndroid Build Coastguard Worker state[3] += d;
223*03f9172cSAndroid Build Coastguard Worker state[4] += e;
224*03f9172cSAndroid Build Coastguard Worker /* Wipe variables */
225*03f9172cSAndroid Build Coastguard Worker a = b = c = d = e = 0;
226*03f9172cSAndroid Build Coastguard Worker #ifdef SHA1HANDSOFF
227*03f9172cSAndroid Build Coastguard Worker forced_memzero(block, 64);
228*03f9172cSAndroid Build Coastguard Worker #endif
229*03f9172cSAndroid Build Coastguard Worker }
230*03f9172cSAndroid Build Coastguard Worker
231*03f9172cSAndroid Build Coastguard Worker
232*03f9172cSAndroid Build Coastguard Worker /* SHA1Init - Initialize new context */
233*03f9172cSAndroid Build Coastguard Worker
SHA1Init(SHA1_CTX * context)234*03f9172cSAndroid Build Coastguard Worker void SHA1Init(SHA1_CTX* context)
235*03f9172cSAndroid Build Coastguard Worker {
236*03f9172cSAndroid Build Coastguard Worker /* SHA1 initialization constants */
237*03f9172cSAndroid Build Coastguard Worker context->state[0] = 0x67452301;
238*03f9172cSAndroid Build Coastguard Worker context->state[1] = 0xEFCDAB89;
239*03f9172cSAndroid Build Coastguard Worker context->state[2] = 0x98BADCFE;
240*03f9172cSAndroid Build Coastguard Worker context->state[3] = 0x10325476;
241*03f9172cSAndroid Build Coastguard Worker context->state[4] = 0xC3D2E1F0;
242*03f9172cSAndroid Build Coastguard Worker context->count[0] = context->count[1] = 0;
243*03f9172cSAndroid Build Coastguard Worker }
244*03f9172cSAndroid Build Coastguard Worker
245*03f9172cSAndroid Build Coastguard Worker
246*03f9172cSAndroid Build Coastguard Worker /* Run your data through this. */
247*03f9172cSAndroid Build Coastguard Worker
SHA1Update(SHA1_CTX * context,const void * _data,u32 len)248*03f9172cSAndroid Build Coastguard Worker void SHA1Update(SHA1_CTX* context, const void *_data, u32 len)
249*03f9172cSAndroid Build Coastguard Worker {
250*03f9172cSAndroid Build Coastguard Worker u32 i, j;
251*03f9172cSAndroid Build Coastguard Worker const unsigned char *data = _data;
252*03f9172cSAndroid Build Coastguard Worker
253*03f9172cSAndroid Build Coastguard Worker #ifdef VERBOSE
254*03f9172cSAndroid Build Coastguard Worker SHAPrintContext(context, "before");
255*03f9172cSAndroid Build Coastguard Worker #endif
256*03f9172cSAndroid Build Coastguard Worker j = (context->count[0] >> 3) & 63;
257*03f9172cSAndroid Build Coastguard Worker if ((context->count[0] += len << 3) < (len << 3))
258*03f9172cSAndroid Build Coastguard Worker context->count[1]++;
259*03f9172cSAndroid Build Coastguard Worker context->count[1] += (len >> 29);
260*03f9172cSAndroid Build Coastguard Worker if ((j + len) > 63) {
261*03f9172cSAndroid Build Coastguard Worker os_memcpy(&context->buffer[j], data, (i = 64-j));
262*03f9172cSAndroid Build Coastguard Worker SHA1Transform(context->state, context->buffer);
263*03f9172cSAndroid Build Coastguard Worker for ( ; i + 63 < len; i += 64) {
264*03f9172cSAndroid Build Coastguard Worker SHA1Transform(context->state, &data[i]);
265*03f9172cSAndroid Build Coastguard Worker }
266*03f9172cSAndroid Build Coastguard Worker j = 0;
267*03f9172cSAndroid Build Coastguard Worker }
268*03f9172cSAndroid Build Coastguard Worker else i = 0;
269*03f9172cSAndroid Build Coastguard Worker os_memcpy(&context->buffer[j], &data[i], len - i);
270*03f9172cSAndroid Build Coastguard Worker #ifdef VERBOSE
271*03f9172cSAndroid Build Coastguard Worker SHAPrintContext(context, "after ");
272*03f9172cSAndroid Build Coastguard Worker #endif
273*03f9172cSAndroid Build Coastguard Worker }
274*03f9172cSAndroid Build Coastguard Worker
275*03f9172cSAndroid Build Coastguard Worker
276*03f9172cSAndroid Build Coastguard Worker /* Add padding and return the message digest. */
277*03f9172cSAndroid Build Coastguard Worker
SHA1Final(unsigned char digest[20],SHA1_CTX * context)278*03f9172cSAndroid Build Coastguard Worker void SHA1Final(unsigned char digest[20], SHA1_CTX* context)
279*03f9172cSAndroid Build Coastguard Worker {
280*03f9172cSAndroid Build Coastguard Worker u32 i;
281*03f9172cSAndroid Build Coastguard Worker unsigned char finalcount[8];
282*03f9172cSAndroid Build Coastguard Worker
283*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < 8; i++) {
284*03f9172cSAndroid Build Coastguard Worker finalcount[i] = (unsigned char)
285*03f9172cSAndroid Build Coastguard Worker ((context->count[(i >= 4 ? 0 : 1)] >>
286*03f9172cSAndroid Build Coastguard Worker ((3-(i & 3)) * 8) ) & 255); /* Endian independent */
287*03f9172cSAndroid Build Coastguard Worker }
288*03f9172cSAndroid Build Coastguard Worker SHA1Update(context, (unsigned char *) "\200", 1);
289*03f9172cSAndroid Build Coastguard Worker while ((context->count[0] & 504) != 448) {
290*03f9172cSAndroid Build Coastguard Worker SHA1Update(context, (unsigned char *) "\0", 1);
291*03f9172cSAndroid Build Coastguard Worker }
292*03f9172cSAndroid Build Coastguard Worker SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform()
293*03f9172cSAndroid Build Coastguard Worker */
294*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < 20; i++) {
295*03f9172cSAndroid Build Coastguard Worker digest[i] = (unsigned char)
296*03f9172cSAndroid Build Coastguard Worker ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) &
297*03f9172cSAndroid Build Coastguard Worker 255);
298*03f9172cSAndroid Build Coastguard Worker }
299*03f9172cSAndroid Build Coastguard Worker /* Wipe variables */
300*03f9172cSAndroid Build Coastguard Worker os_memset(context->buffer, 0, 64);
301*03f9172cSAndroid Build Coastguard Worker os_memset(context->state, 0, 20);
302*03f9172cSAndroid Build Coastguard Worker os_memset(context->count, 0, 8);
303*03f9172cSAndroid Build Coastguard Worker forced_memzero(finalcount, sizeof(finalcount));
304*03f9172cSAndroid Build Coastguard Worker }
305*03f9172cSAndroid Build Coastguard Worker
306*03f9172cSAndroid Build Coastguard Worker /* ===== end - public domain SHA1 implementation ===== */
307