xref: /openbsd-src/gnu/usr.bin/perl/cpan/Digest-SHA/src/sha.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*
2  * sha.c: routines to compute SHA-1/224/256/384/512 digests
3  *
4  * Ref: NIST FIPS PUB 180-4 Secure Hash Standard
5  *
6  * Copyright (C) 2003-2014 Mark Shelor, All Rights Reserved
7  *
8  * Version: 5.88
9  * Mon Mar 17 08:46:10 MST 2014
10  *
11  */
12 
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <stddef.h>
16 #include <string.h>
17 #include <ctype.h>
18 #include "sha.h"
19 #include "sha64bit.h"
20 
21 #define W32	SHA32			/* useful abbreviations */
22 #define C32	SHA32_CONST
23 #define SR32	SHA32_SHR
24 #define SL32	SHA32_SHL
25 #define LO32	SHA_LO32
26 #define UCHR	unsigned char
27 #define UINT	unsigned int
28 #define ULNG	unsigned long
29 #define VP	void *
30 
31 #define ROTR(x, n)	(SR32(x, n) | SL32(x, 32-(n)))
32 #define ROTL(x, n)	(SL32(x, n) | SR32(x, 32-(n)))
33 
34 #define Ch(x, y, z)	((z) ^ ((x) & ((y) ^ (z))))
35 #define Pa(x, y, z)	((x) ^ (y) ^ (z))
36 #define Ma(x, y, z)	(((x) & (y)) | ((z) & ((x) | (y))))
37 
38 #define SIGMA0(x)	(ROTR(x,  2) ^ ROTR(x, 13) ^ ROTR(x, 22))
39 #define SIGMA1(x)	(ROTR(x,  6) ^ ROTR(x, 11) ^ ROTR(x, 25))
40 #define sigma0(x)	(ROTR(x,  7) ^ ROTR(x, 18) ^ SR32(x,  3))
41 #define sigma1(x)	(ROTR(x, 17) ^ ROTR(x, 19) ^ SR32(x, 10))
42 
43 #define K1	C32(0x5a827999)		/* SHA-1 constants */
44 #define K2	C32(0x6ed9eba1)
45 #define K3	C32(0x8f1bbcdc)
46 #define K4	C32(0xca62c1d6)
47 
48 static W32 K256[64] =			/* SHA-224/256 constants */
49 {
50 	C32(0x428a2f98), C32(0x71374491), C32(0xb5c0fbcf), C32(0xe9b5dba5),
51 	C32(0x3956c25b), C32(0x59f111f1), C32(0x923f82a4), C32(0xab1c5ed5),
52 	C32(0xd807aa98), C32(0x12835b01), C32(0x243185be), C32(0x550c7dc3),
53 	C32(0x72be5d74), C32(0x80deb1fe), C32(0x9bdc06a7), C32(0xc19bf174),
54 	C32(0xe49b69c1), C32(0xefbe4786), C32(0x0fc19dc6), C32(0x240ca1cc),
55 	C32(0x2de92c6f), C32(0x4a7484aa), C32(0x5cb0a9dc), C32(0x76f988da),
56 	C32(0x983e5152), C32(0xa831c66d), C32(0xb00327c8), C32(0xbf597fc7),
57 	C32(0xc6e00bf3), C32(0xd5a79147), C32(0x06ca6351), C32(0x14292967),
58 	C32(0x27b70a85), C32(0x2e1b2138), C32(0x4d2c6dfc), C32(0x53380d13),
59 	C32(0x650a7354), C32(0x766a0abb), C32(0x81c2c92e), C32(0x92722c85),
60 	C32(0xa2bfe8a1), C32(0xa81a664b), C32(0xc24b8b70), C32(0xc76c51a3),
61 	C32(0xd192e819), C32(0xd6990624), C32(0xf40e3585), C32(0x106aa070),
62 	C32(0x19a4c116), C32(0x1e376c08), C32(0x2748774c), C32(0x34b0bcb5),
63 	C32(0x391c0cb3), C32(0x4ed8aa4a), C32(0x5b9cca4f), C32(0x682e6ff3),
64 	C32(0x748f82ee), C32(0x78a5636f), C32(0x84c87814), C32(0x8cc70208),
65 	C32(0x90befffa), C32(0xa4506ceb), C32(0xbef9a3f7), C32(0xc67178f2)
66 };
67 
68 static W32 H01[5] =			/* SHA-1 initial hash value */
69 {
70 	C32(0x67452301), C32(0xefcdab89), C32(0x98badcfe),
71 	C32(0x10325476), C32(0xc3d2e1f0)
72 };
73 
74 static W32 H0224[8] =			/* SHA-224 initial hash value */
75 {
76 	C32(0xc1059ed8), C32(0x367cd507), C32(0x3070dd17), C32(0xf70e5939),
77 	C32(0xffc00b31), C32(0x68581511), C32(0x64f98fa7), C32(0xbefa4fa4)
78 };
79 
80 static W32 H0256[8] =			/* SHA-256 initial hash value */
81 {
82 	C32(0x6a09e667), C32(0xbb67ae85), C32(0x3c6ef372), C32(0xa54ff53a),
83 	C32(0x510e527f), C32(0x9b05688c), C32(0x1f83d9ab), C32(0x5be0cd19)
84 };
85 
86 static void sha1(SHA *s, UCHR *block)		/* SHA-1 transform */
87 {
88 	W32 a, b, c, d, e;
89 	W32 W[16];
90 	W32 *wp = W;
91 	W32 *H = (W32 *) s->H;
92 
93 	SHA32_SCHED(W, block);
94 
95 /*
96  * Use SHA-1 alternate method from FIPS PUB 180-4 (ref. 6.1.3)
97  *
98  * To improve performance, unroll the loop and consolidate assignments
99  * by changing the roles of variables "a" through "e" at each step.
100  * Note that the variable "T" is no longer needed.
101  */
102 
103 #define M1(a, b, c, d, e, f, k, w)		\
104 	e += ROTL(a, 5) + f(b, c, d) + k + w;	\
105 	b =  ROTL(b, 30)
106 
107 #define M11(f, k, w)	M1(a, b, c, d, e, f, k, w);
108 #define M12(f, k, w)	M1(e, a, b, c, d, f, k, w);
109 #define M13(f, k, w)	M1(d, e, a, b, c, f, k, w);
110 #define M14(f, k, w)	M1(c, d, e, a, b, f, k, w);
111 #define M15(f, k, w)	M1(b, c, d, e, a, f, k, w);
112 
113 #define W11(s)	W[(s+ 0) & 0xf]
114 #define W12(s)	W[(s+13) & 0xf]
115 #define W13(s)	W[(s+ 8) & 0xf]
116 #define W14(s)	W[(s+ 2) & 0xf]
117 
118 #define A1(s)	(W11(s) = ROTL(W11(s) ^ W12(s) ^ W13(s) ^ W14(s), 1))
119 
120 	a = H[0]; b = H[1]; c = H[2]; d = H[3]; e = H[4];
121 
122 	M11(Ch, K1,  *wp++); M12(Ch, K1,  *wp++); M13(Ch, K1,  *wp++);
123 	M14(Ch, K1,  *wp++); M15(Ch, K1,  *wp++); M11(Ch, K1,  *wp++);
124 	M12(Ch, K1,  *wp++); M13(Ch, K1,  *wp++); M14(Ch, K1,  *wp++);
125 	M15(Ch, K1,  *wp++); M11(Ch, K1,  *wp++); M12(Ch, K1,  *wp++);
126 	M13(Ch, K1,  *wp++); M14(Ch, K1,  *wp++); M15(Ch, K1,  *wp++);
127 	M11(Ch, K1,  *wp  ); M12(Ch, K1, A1( 0)); M13(Ch, K1, A1( 1));
128 	M14(Ch, K1, A1( 2)); M15(Ch, K1, A1( 3)); M11(Pa, K2, A1( 4));
129 	M12(Pa, K2, A1( 5)); M13(Pa, K2, A1( 6)); M14(Pa, K2, A1( 7));
130 	M15(Pa, K2, A1( 8)); M11(Pa, K2, A1( 9)); M12(Pa, K2, A1(10));
131 	M13(Pa, K2, A1(11)); M14(Pa, K2, A1(12)); M15(Pa, K2, A1(13));
132 	M11(Pa, K2, A1(14)); M12(Pa, K2, A1(15)); M13(Pa, K2, A1( 0));
133 	M14(Pa, K2, A1( 1)); M15(Pa, K2, A1( 2)); M11(Pa, K2, A1( 3));
134 	M12(Pa, K2, A1( 4)); M13(Pa, K2, A1( 5)); M14(Pa, K2, A1( 6));
135 	M15(Pa, K2, A1( 7)); M11(Ma, K3, A1( 8)); M12(Ma, K3, A1( 9));
136 	M13(Ma, K3, A1(10)); M14(Ma, K3, A1(11)); M15(Ma, K3, A1(12));
137 	M11(Ma, K3, A1(13)); M12(Ma, K3, A1(14)); M13(Ma, K3, A1(15));
138 	M14(Ma, K3, A1( 0)); M15(Ma, K3, A1( 1)); M11(Ma, K3, A1( 2));
139 	M12(Ma, K3, A1( 3)); M13(Ma, K3, A1( 4)); M14(Ma, K3, A1( 5));
140 	M15(Ma, K3, A1( 6)); M11(Ma, K3, A1( 7)); M12(Ma, K3, A1( 8));
141 	M13(Ma, K3, A1( 9)); M14(Ma, K3, A1(10)); M15(Ma, K3, A1(11));
142 	M11(Pa, K4, A1(12)); M12(Pa, K4, A1(13)); M13(Pa, K4, A1(14));
143 	M14(Pa, K4, A1(15)); M15(Pa, K4, A1( 0)); M11(Pa, K4, A1( 1));
144 	M12(Pa, K4, A1( 2)); M13(Pa, K4, A1( 3)); M14(Pa, K4, A1( 4));
145 	M15(Pa, K4, A1( 5)); M11(Pa, K4, A1( 6)); M12(Pa, K4, A1( 7));
146 	M13(Pa, K4, A1( 8)); M14(Pa, K4, A1( 9)); M15(Pa, K4, A1(10));
147 	M11(Pa, K4, A1(11)); M12(Pa, K4, A1(12)); M13(Pa, K4, A1(13));
148 	M14(Pa, K4, A1(14)); M15(Pa, K4, A1(15));
149 
150 	H[0] += a; H[1] += b; H[2] += c; H[3] += d; H[4] += e;
151 }
152 
153 static void sha256(SHA *s, UCHR *block)		/* SHA-224/256 transform */
154 {
155 	W32 a, b, c, d, e, f, g, h, T1;
156 	W32 W[16];
157 	W32 *kp = K256;
158 	W32 *wp = W;
159 	W32 *H = (W32 *) s->H;
160 
161 	SHA32_SCHED(W, block);
162 
163 /*
164  * Use same technique as in sha1()
165  *
166  * To improve performance, unroll the loop and consolidate assignments
167  * by changing the roles of variables "a" through "h" at each step.
168  * Note that the variable "T2" is no longer needed.
169  */
170 
171 #define M2(a, b, c, d, e, f, g, h, w)				\
172 	T1 = h  + SIGMA1(e) + Ch(e, f, g) + (*kp++) + w;	\
173 	h  = T1 + SIGMA0(a) + Ma(a, b, c); d += T1;
174 
175 #define W21(s)	W[(s+ 0) & 0xf]
176 #define W22(s)	W[(s+14) & 0xf]
177 #define W23(s)	W[(s+ 9) & 0xf]
178 #define W24(s)	W[(s+ 1) & 0xf]
179 
180 #define A2(s)	(W21(s) += sigma1(W22(s)) + W23(s) + sigma0(W24(s)))
181 
182 #define M21(w)	M2(a, b, c, d, e, f, g, h, w)
183 #define M22(w)	M2(h, a, b, c, d, e, f, g, w)
184 #define M23(w)	M2(g, h, a, b, c, d, e, f, w)
185 #define M24(w)	M2(f, g, h, a, b, c, d, e, w)
186 #define M25(w)	M2(e, f, g, h, a, b, c, d, w)
187 #define M26(w)	M2(d, e, f, g, h, a, b, c, w)
188 #define M27(w)	M2(c, d, e, f, g, h, a, b, w)
189 #define M28(w)	M2(b, c, d, e, f, g, h, a, w)
190 
191 	a = H[0]; b = H[1]; c = H[2]; d = H[3];
192 	e = H[4]; f = H[5]; g = H[6]; h = H[7];
193 
194 	M21( *wp++); M22( *wp++); M23( *wp++); M24( *wp++);
195 	M25( *wp++); M26( *wp++); M27( *wp++); M28( *wp++);
196 	M21( *wp++); M22( *wp++); M23( *wp++); M24( *wp++);
197 	M25( *wp++); M26( *wp++); M27( *wp++); M28( *wp  );
198 	M21(A2( 0)); M22(A2( 1)); M23(A2( 2)); M24(A2( 3));
199 	M25(A2( 4)); M26(A2( 5)); M27(A2( 6)); M28(A2( 7));
200 	M21(A2( 8)); M22(A2( 9)); M23(A2(10)); M24(A2(11));
201 	M25(A2(12)); M26(A2(13)); M27(A2(14)); M28(A2(15));
202 	M21(A2( 0)); M22(A2( 1)); M23(A2( 2)); M24(A2( 3));
203 	M25(A2( 4)); M26(A2( 5)); M27(A2( 6)); M28(A2( 7));
204 	M21(A2( 8)); M22(A2( 9)); M23(A2(10)); M24(A2(11));
205 	M25(A2(12)); M26(A2(13)); M27(A2(14)); M28(A2(15));
206 	M21(A2( 0)); M22(A2( 1)); M23(A2( 2)); M24(A2( 3));
207 	M25(A2( 4)); M26(A2( 5)); M27(A2( 6)); M28(A2( 7));
208 	M21(A2( 8)); M22(A2( 9)); M23(A2(10)); M24(A2(11));
209 	M25(A2(12)); M26(A2(13)); M27(A2(14)); M28(A2(15));
210 
211 	H[0] += a; H[1] += b; H[2] += c; H[3] += d;
212 	H[4] += e; H[5] += f; H[6] += g; H[7] += h;
213 }
214 
215 #include "sha64bit.c"
216 
217 #define SETBIT(s, pos)	s[(pos) >> 3] |=  (0x01 << (7 - (pos) % 8))
218 #define CLRBIT(s, pos)	s[(pos) >> 3] &= ~(0x01 << (7 - (pos) % 8))
219 #define NBYTES(nbits)	(((nbits) + 7) >> 3)
220 #define HEXLEN(nbytes)	((nbytes) << 1)
221 #define B64LEN(nbytes)	(((nbytes) % 3 == 0) ? ((nbytes) / 3) * 4 \
222 			: ((nbytes) / 3) * 4 + ((nbytes) % 3) + 1)
223 
224 /* w32mem: writes 32-bit word to memory in big-endian order */
225 static UCHR *w32mem(UCHR *mem, W32 w32)
226 {
227 	int i;
228 
229 	for (i = 0; i < 4; i++)
230 		*mem++ = (UCHR) (SR32(w32, 24-i*8) & 0xff);
231 	return(mem);
232 }
233 
234 /* memw32: returns 32-bit word from memory written in big-endian order */
235 static W32 memw32(UCHR *mem)
236 {
237 	int i;
238 	W32 w = 0;
239 
240 	for (i = 0; i < 4; i++)
241 		w = (w << 8) + *mem++;
242 	return(w);
243 }
244 
245 /* digcpy: writes current state to digest buffer */
246 static UCHR *digcpy(SHA *s)
247 {
248 	int i;
249 	UCHR *d = s->digest;
250 	W32 *p32 = (W32 *) s->H;
251 	W64 *p64 = (W64 *) s->H;
252 
253 	if (s->alg <= SHA256)
254 		for (i = 0; i < 8; i++, d += 4)
255 			w32mem(d, *p32++);
256 	else
257 		for (i = 0; i < 8; i++, d += 8) {
258 			w32mem(d, (W32) ((*p64 >> 16) >> 16));
259 			w32mem(d+4, (W32) (*p64++ & SHA32_MAX));
260 		}
261 	return(s->digest);
262 }
263 
264 /* statecpy: writes buffer to current state (opposite of digcpy) */
265 static UCHR *statecpy(SHA *s, UCHR *buf)
266 {
267 	int i;
268 	W32 *p32 = (W32 *) s->H;
269 	W64 *p64 = (W64 *) s->H;
270 
271 	if (s->alg <= SHA256)
272 		for (i = 0; i < 8; i++, buf += 4)
273 			*p32++ = memw32(buf);
274 	else
275 		for (i = 0; i < 8; i++, buf += 8)
276 			*p64++ = ((W64) memw32(buf) << 32) +
277 					memw32(buf+4);
278 	return(buf);
279 }
280 
281 #define SHA_INIT(algo, transform) 					\
282 	do {								\
283 		memset(s, 0, sizeof(SHA));				\
284 		s->alg = algo; s->sha = sha ## transform;		\
285 		memcpy(s->H, H0 ## algo, sizeof(H0 ## algo));		\
286 		s->blocksize = SHA ## algo ## _BLOCK_BITS;		\
287 		s->digestlen = SHA ## algo ## _DIGEST_BITS >> 3;	\
288 	} while (0)
289 
290 /* sharewind: re-initializes the digest object */
291 static void sharewind(SHA *s)
292 {
293 	if      (s->alg == SHA1)   SHA_INIT(1, 1);
294 	else if (s->alg == SHA224) SHA_INIT(224, 256);
295 	else if (s->alg == SHA256) SHA_INIT(256, 256);
296 	else if (s->alg == SHA384) SHA_INIT(384, 512);
297 	else if (s->alg == SHA512) SHA_INIT(512, 512);
298 	else if (s->alg == SHA512224) SHA_INIT(512224, 512);
299 	else if (s->alg == SHA512256) SHA_INIT(512256, 512);
300 }
301 
302 /* shaopen: creates a new digest object */
303 static SHA *shaopen(int alg)
304 {
305 	SHA *s = NULL;
306 
307 	if (alg != SHA1 && alg != SHA224 && alg != SHA256 &&
308 		alg != SHA384    && alg != SHA512 &&
309 		alg != SHA512224 && alg != SHA512256)
310 		return(NULL);
311 	if (alg >= SHA384 && !sha_384_512)
312 		return(NULL);
313 	SHA_newz(0, s, 1, SHA);
314 	if (s == NULL)
315 		return(NULL);
316 	s->alg = alg;
317 	sharewind(s);
318 	return(s);
319 }
320 
321 /* shaclose: de-allocates digest object */
322 static int shaclose(SHA *s)
323 {
324 	if (s != NULL) {
325 		memset(s, 0, sizeof(SHA));
326 		SHA_free(s);
327 	}
328 	return(0);
329 }
330 
331 /* shadirect: updates state directly (w/o going through s->block) */
332 static ULNG shadirect(UCHR *bitstr, ULNG bitcnt, SHA *s)
333 {
334 	ULNG savecnt = bitcnt;
335 
336 	while (bitcnt >= s->blocksize) {
337 		s->sha(s, bitstr);
338 		bitstr += (s->blocksize >> 3);
339 		bitcnt -= s->blocksize;
340 	}
341 	if (bitcnt > 0) {
342 		memcpy(s->block, bitstr, NBYTES(bitcnt));
343 		s->blockcnt = bitcnt;
344 	}
345 	return(savecnt);
346 }
347 
348 /* shabytes: updates state for byte-aligned input data */
349 static ULNG shabytes(UCHR *bitstr, ULNG bitcnt, SHA *s)
350 {
351 	UINT offset;
352 	UINT nbits;
353 	ULNG savecnt = bitcnt;
354 
355 	offset = s->blockcnt >> 3;
356 	if (s->blockcnt + bitcnt >= s->blocksize) {
357 		nbits = s->blocksize - s->blockcnt;
358 		memcpy(s->block+offset, bitstr, nbits>>3);
359 		bitcnt -= nbits;
360 		bitstr += (nbits >> 3);
361 		s->sha(s, s->block), s->blockcnt = 0;
362 		shadirect(bitstr, bitcnt, s);
363 	}
364 	else {
365 		memcpy(s->block+offset, bitstr, NBYTES(bitcnt));
366 		s->blockcnt += bitcnt;
367 	}
368 	return(savecnt);
369 }
370 
371 /* shabits: updates state for bit-aligned input data */
372 static ULNG shabits(UCHR *bitstr, ULNG bitcnt, SHA *s)
373 {
374 	UINT i;
375 	UINT gap;
376 	ULNG nbits;
377 	UCHR buf[1<<9];
378 	UINT bufsize = sizeof(buf);
379 	ULNG bufbits = (ULNG) bufsize << 3;
380 	UINT nbytes = NBYTES(bitcnt);
381 	ULNG savecnt = bitcnt;
382 
383 	gap = 8 - s->blockcnt % 8;
384 	s->block[s->blockcnt>>3] &= ~0 << gap;
385 	s->block[s->blockcnt>>3] |= *bitstr >> (8 - gap);
386 	s->blockcnt += bitcnt < gap ? bitcnt : gap;
387 	if (bitcnt < gap)
388 		return(savecnt);
389 	if (s->blockcnt == s->blocksize)
390 		s->sha(s, s->block), s->blockcnt = 0;
391 	if ((bitcnt -= gap) == 0)
392 		return(savecnt);
393 	while (nbytes > bufsize) {
394 		for (i = 0; i < bufsize; i++)
395 			buf[i] = bitstr[i] << gap | bitstr[i+1] >> (8-gap);
396 		nbits = bitcnt < bufbits ? bitcnt : bufbits;
397 		shabytes(buf, nbits, s);
398 		bitcnt -= nbits, bitstr += bufsize, nbytes -= bufsize;
399 	}
400 	for (i = 0; i < nbytes - 1; i++)
401 		buf[i] = bitstr[i] << gap | bitstr[i+1] >> (8-gap);
402 	buf[nbytes-1] = bitstr[nbytes-1] << gap;
403 	shabytes(buf, bitcnt, s);
404 	return(savecnt);
405 }
406 
407 /* shawrite: triggers a state update using data in bitstr/bitcnt */
408 static ULNG shawrite(UCHR *bitstr, ULNG bitcnt, SHA *s)
409 {
410 	if (bitcnt < 1)
411 		return(0);
412 	if (SHA_LO32(s->lenll += bitcnt) < bitcnt)
413 		if (SHA_LO32(++s->lenlh) == 0)
414 			if (SHA_LO32(++s->lenhl) == 0)
415 				s->lenhh++;
416 	if (s->blockcnt == 0)
417 		return(shadirect(bitstr, bitcnt, s));
418 	else if (s->blockcnt % 8 == 0)
419 		return(shabytes(bitstr, bitcnt, s));
420 	else
421 		return(shabits(bitstr, bitcnt, s));
422 }
423 
424 /* shafinish: pads remaining block(s) and computes final digest state */
425 static void shafinish(SHA *s)
426 {
427 	UINT lenpos, lhpos, llpos;
428 
429 	lenpos = s->blocksize == SHA1_BLOCK_BITS ? 448 : 896;
430 	lhpos  = s->blocksize == SHA1_BLOCK_BITS ?  56 : 120;
431 	llpos  = s->blocksize == SHA1_BLOCK_BITS ?  60 : 124;
432 	SETBIT(s->block, s->blockcnt), s->blockcnt++;
433 	while (s->blockcnt > lenpos)
434 		if (s->blockcnt < s->blocksize)
435 			CLRBIT(s->block, s->blockcnt), s->blockcnt++;
436 		else
437 			s->sha(s, s->block), s->blockcnt = 0;
438 	while (s->blockcnt < lenpos)
439 		CLRBIT(s->block, s->blockcnt), s->blockcnt++;
440 	if (s->blocksize > SHA1_BLOCK_BITS) {
441 		w32mem(s->block + 112, s->lenhh);
442 		w32mem(s->block + 116, s->lenhl);
443 	}
444 	w32mem(s->block + lhpos, s->lenlh);
445 	w32mem(s->block + llpos, s->lenll);
446 	s->sha(s, s->block);
447 }
448 
449 /* xmap: translation map for hexadecimal encoding */
450 static char xmap[] =
451 	"0123456789abcdef";
452 
453 /* shahex: returns pointer to current digest (hexadecimal) */
454 static char *shahex(SHA *s)
455 {
456 	int i;
457 	char *h;
458 	UCHR *d;
459 
460 	d = digcpy(s);
461 	s->hex[0] = '\0';
462 	if (HEXLEN((size_t) s->digestlen) >= sizeof(s->hex))
463 		return(s->hex);
464 	for (i = 0, h = s->hex; i < s->digestlen; i++) {
465 		*h++ = xmap[(*d >> 4) & 0x0f];
466 		*h++ = xmap[(*d++   ) & 0x0f];
467 	}
468 	*h = '\0';
469 	return(s->hex);
470 }
471 
472 /* bmap: translation map for Base 64 encoding */
473 static char bmap[] =
474 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
475 
476 /* encbase64: encodes input (0 to 3 bytes) into Base 64 */
477 static void encbase64(UCHR *in, int n, char *out)
478 {
479 	UCHR byte[3] = {0, 0, 0};
480 
481 	out[0] = '\0';
482 	if (n < 1 || n > 3)
483 		return;
484 	memcpy(byte, in, n);
485 	out[0] = bmap[byte[0] >> 2];
486 	out[1] = bmap[((byte[0] & 0x03) << 4) | (byte[1] >> 4)];
487 	out[2] = bmap[((byte[1] & 0x0f) << 2) | (byte[2] >> 6)];
488 	out[3] = bmap[byte[2] & 0x3f];
489 	out[n+1] = '\0';
490 }
491 
492 /* shabase64: returns pointer to current digest (Base 64) */
493 static char *shabase64(SHA *s)
494 {
495 	int n;
496 	UCHR *q;
497 	char out[5];
498 
499 	q = digcpy(s);
500 	s->base64[0] = '\0';
501 	if (B64LEN((size_t) s->digestlen) >= sizeof(s->base64))
502 		return(s->base64);
503 	for (n = s->digestlen; n > 3; n -= 3, q += 3) {
504 		encbase64(q, 3, out);
505 		strcat(s->base64, out);
506 	}
507 	encbase64(q, n, out);
508 	strcat(s->base64, out);
509 	return(s->base64);
510 }
511 
512 /* shadup: duplicates current digest object */
513 static SHA *shadup(SHA *s)
514 {
515 	SHA *p;
516 
517 	SHA_new(0, p, 1, SHA);
518 	if (p == NULL)
519 		return(NULL);
520 	memcpy(p, s, sizeof(SHA));
521 	return(p);
522 }
523 
524 /* hmacopen: creates a new HMAC-SHA digest object */
525 static HMAC *hmacopen(int alg, UCHR *key, UINT keylen)
526 {
527 	UINT i;
528 	HMAC *h;
529 
530 	SHA_newz(0, h, 1, HMAC);
531 	if (h == NULL)
532 		return(NULL);
533 	if ((h->isha = shaopen(alg)) == NULL) {
534 		SHA_free(h);
535 		return(NULL);
536 	}
537 	if ((h->osha = shaopen(alg)) == NULL) {
538 		shaclose(h->isha);
539 		SHA_free(h);
540 		return(NULL);
541 	}
542 	if (keylen <= h->osha->blocksize / 8)
543 		memcpy(h->key, key, keylen);
544 	else {
545 		if ((h->ksha = shaopen(alg)) == NULL) {
546 			shaclose(h->isha);
547 			shaclose(h->osha);
548 			SHA_free(h);
549 			return(NULL);
550 		}
551 		shawrite(key, keylen * 8, h->ksha);
552 		shafinish(h->ksha);
553 		memcpy(h->key, digcpy(h->ksha), h->ksha->digestlen);
554 		shaclose(h->ksha);
555 	}
556 	for (i = 0; i < h->osha->blocksize / 8; i++)
557 		h->key[i] ^= 0x5c;
558 	shawrite(h->key, h->osha->blocksize, h->osha);
559 	for (i = 0; i < h->isha->blocksize / 8; i++)
560 		h->key[i] ^= (0x5c ^ 0x36);
561 	shawrite(h->key, h->isha->blocksize, h->isha);
562 	memset(h->key, 0, sizeof(h->key));
563 	return(h);
564 }
565 
566 /* hmacwrite: triggers a state update using data in bitstr/bitcnt */
567 static ULNG hmacwrite(UCHR *bitstr, ULNG bitcnt, HMAC *h)
568 {
569 	return(shawrite(bitstr, bitcnt, h->isha));
570 }
571 
572 /* hmacfinish: computes final digest state */
573 static void hmacfinish(HMAC *h)
574 {
575 	shafinish(h->isha);
576 	shawrite(digcpy(h->isha), h->isha->digestlen * 8, h->osha);
577 	shaclose(h->isha);
578 	shafinish(h->osha);
579 }
580 
581 /* hmachex: returns pointer to digest (hexadecimal) */
582 static char *hmachex(HMAC *h)
583 {
584 	return(shahex(h->osha));
585 }
586 
587 /* hmacbase64: returns pointer to digest (Base 64) */
588 static char *hmacbase64(HMAC *h)
589 {
590 	return(shabase64(h->osha));
591 }
592 
593 /* hmacclose: de-allocates digest object */
594 static int hmacclose(HMAC *h)
595 {
596 	if (h != NULL) {
597 		shaclose(h->osha);
598 		memset(h, 0, sizeof(HMAC));
599 		SHA_free(h);
600 	}
601 	return(0);
602 }
603