Annotation of embedaddon/ntp/lib/isc/sha2.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2005-2007, 2009 Internet Systems Consortium, Inc. ("ISC")
3: *
4: * Permission to use, copy, modify, and/or distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9: * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10: * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11: * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12: * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13: * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14: * PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: /* $Id: sha2.c,v 1.13.332.2 2009/01/18 23:47:41 tbox Exp $ */
18:
19: /* $FreeBSD: src/sys/crypto/sha2/sha2.c,v 1.2.2.2 2002/03/05 08:36:47 ume Exp $ */
20: /* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
21:
22: /*
23: * sha2.c
24: *
25: * Version 1.0.0beta1
26: *
27: * Written by Aaron D. Gifford <me@aarongifford.com>
28: *
29: * Copyright 2000 Aaron D. Gifford. All rights reserved.
30: *
31: * Redistribution and use in source and binary forms, with or without
32: * modification, are permitted provided that the following conditions
33: * are met:
34: * 1. Redistributions of source code must retain the above copyright
35: * notice, this list of conditions and the following disclaimer.
36: * 2. Redistributions in binary form must reproduce the above copyright
37: * notice, this list of conditions and the following disclaimer in the
38: * documentation and/or other materials provided with the distribution.
39: * 3. Neither the name of the copyright holder nor the names of contributors
40: * may be used to endorse or promote products derived from this software
41: * without specific prior written permission.
42: *
43: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
44: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
47: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53: * SUCH DAMAGE.
54: *
55: */
56:
57:
58: #include <config.h>
59:
60: #include <isc/assertions.h>
61: #include <isc/sha2.h>
62: #include <isc/string.h>
63: #include <isc/util.h>
64:
65: /*
66: * UNROLLED TRANSFORM LOOP NOTE:
67: * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
68: * loop version for the hash transform rounds (defined using macros
69: * later in this file). Either define on the command line, for example:
70: *
71: * cc -DISC_SHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
72: *
73: * or define below:
74: *
75: * \#define ISC_SHA2_UNROLL_TRANSFORM
76: *
77: */
78:
79: /*** SHA-256/384/512 Machine Architecture Definitions *****************/
80: /*
81: * BYTE_ORDER NOTE:
82: *
83: * Please make sure that your system defines BYTE_ORDER. If your
84: * architecture is little-endian, make sure it also defines
85: * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
86: * equivalent.
87: *
88: * If your system does not define the above, then you can do so by
89: * hand like this:
90: *
91: * \#define LITTLE_ENDIAN 1234
92: * \#define BIG_ENDIAN 4321
93: *
94: * And for little-endian machines, add:
95: *
96: * \#define BYTE_ORDER LITTLE_ENDIAN
97: *
98: * Or for big-endian machines:
99: *
100: * \#define BYTE_ORDER BIG_ENDIAN
101: *
102: * The FreeBSD machine this was written on defines BYTE_ORDER
103: * appropriately by including <sys/types.h> (which in turn includes
104: * <machine/endian.h> where the appropriate definitions are actually
105: * made).
106: */
107: #if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
108: #ifndef BYTE_ORDER
109: #ifndef BIG_ENDIAN
110: #define BIG_ENDIAN 4321
111: #endif
112: #ifndef LITTLE_ENDIAN
113: #define LITTLE_ENDIAN 1234
114: #endif
115: #ifdef WORDS_BIGENDIAN
116: #define BYTE_ORDER BIG_ENDIAN
117: #else
118: #define BYTE_ORDER LITTLE_ENDIAN
119: #endif
120: #else
121: #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
122: #endif
123: #endif
124:
125: /*** SHA-256/384/512 Various Length Definitions ***********************/
126: /* NOTE: Most of these are in sha2.h */
127: #define ISC_SHA256_SHORT_BLOCK_LENGTH (ISC_SHA256_BLOCK_LENGTH - 8)
128: #define ISC_SHA384_SHORT_BLOCK_LENGTH (ISC_SHA384_BLOCK_LENGTH - 16)
129: #define ISC_SHA512_SHORT_BLOCK_LENGTH (ISC_SHA512_BLOCK_LENGTH - 16)
130:
131:
132: /*** ENDIAN REVERSAL MACROS *******************************************/
133: #if BYTE_ORDER == LITTLE_ENDIAN
134: #define REVERSE32(w,x) { \
135: isc_uint32_t tmp = (w); \
136: tmp = (tmp >> 16) | (tmp << 16); \
137: (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
138: }
139: #ifdef WIN32
140: #define REVERSE64(w,x) { \
141: isc_uint64_t tmp = (w); \
142: tmp = (tmp >> 32) | (tmp << 32); \
143: tmp = ((tmp & 0xff00ff00ff00ff00UL) >> 8) | \
144: ((tmp & 0x00ff00ff00ff00ffUL) << 8); \
145: (x) = ((tmp & 0xffff0000ffff0000UL) >> 16) | \
146: ((tmp & 0x0000ffff0000ffffUL) << 16); \
147: }
148: #else
149: #define REVERSE64(w,x) { \
150: isc_uint64_t tmp = (w); \
151: tmp = (tmp >> 32) | (tmp << 32); \
152: tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
153: ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
154: (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
155: ((tmp & 0x0000ffff0000ffffULL) << 16); \
156: }
157: #endif
158: #endif /* BYTE_ORDER == LITTLE_ENDIAN */
159:
160: /*
161: * Macro for incrementally adding the unsigned 64-bit integer n to the
162: * unsigned 128-bit integer (represented using a two-element array of
163: * 64-bit words):
164: */
165: #define ADDINC128(w,n) { \
166: (w)[0] += (isc_uint64_t)(n); \
167: if ((w)[0] < (n)) { \
168: (w)[1]++; \
169: } \
170: }
171:
172: /*** THE SIX LOGICAL FUNCTIONS ****************************************/
173: /*
174: * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
175: *
176: * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
177: * S is a ROTATION) because the SHA-256/384/512 description document
178: * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
179: * same "backwards" definition.
180: */
181: /* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
182: #define R(b,x) ((x) >> (b))
183: /* 32-bit Rotate-right (used in SHA-256): */
184: #define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
185: /* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
186: #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
187:
188: /* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
189: #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
190: #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
191:
192: /* Four of six logical functions used in SHA-256: */
193: #define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
194: #define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
195: #define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
196: #define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
197:
198: /* Four of six logical functions used in SHA-384 and SHA-512: */
199: #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
200: #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
201: #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
202: #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
203:
204: /*** INTERNAL FUNCTION PROTOTYPES *************************************/
205: /* NOTE: These should not be accessed directly from outside this
206: * library -- they are intended for private internal visibility/use
207: * only.
208: */
209: void isc_sha512_last(isc_sha512_t *);
210: void isc_sha256_transform(isc_sha256_t *, const isc_uint32_t*);
211: void isc_sha512_transform(isc_sha512_t *, const isc_uint64_t*);
212:
213:
214: /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
215: /* Hash constant words K for SHA-224 and SHA-256: */
216: static const isc_uint32_t K256[64] = {
217: 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
218: 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
219: 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
220: 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
221: 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
222: 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
223: 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
224: 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
225: 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
226: 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
227: 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
228: 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
229: 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
230: 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
231: 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
232: 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
233: };
234:
235: /* Initial hash value H for SHA-224: */
236: static const isc_uint32_t sha224_initial_hash_value[8] = {
237: 0xc1059ed8UL,
238: 0x367cd507UL,
239: 0x3070dd17UL,
240: 0xf70e5939UL,
241: 0xffc00b31UL,
242: 0x68581511UL,
243: 0x64f98fa7UL,
244: 0xbefa4fa4UL
245: };
246:
247: /* Initial hash value H for SHA-256: */
248: static const isc_uint32_t sha256_initial_hash_value[8] = {
249: 0x6a09e667UL,
250: 0xbb67ae85UL,
251: 0x3c6ef372UL,
252: 0xa54ff53aUL,
253: 0x510e527fUL,
254: 0x9b05688cUL,
255: 0x1f83d9abUL,
256: 0x5be0cd19UL
257: };
258:
259: #ifdef WIN32
260: /* Hash constant words K for SHA-384 and SHA-512: */
261: static const isc_uint64_t K512[80] = {
262: 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL,
263: 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL,
264: 0x3956c25bf348b538UL, 0x59f111f1b605d019UL,
265: 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL,
266: 0xd807aa98a3030242UL, 0x12835b0145706fbeUL,
267: 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL,
268: 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL,
269: 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL,
270: 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL,
271: 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL,
272: 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL,
273: 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL,
274: 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL,
275: 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL,
276: 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL,
277: 0x06ca6351e003826fUL, 0x142929670a0e6e70UL,
278: 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL,
279: 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL,
280: 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL,
281: 0x81c2c92e47edaee6UL, 0x92722c851482353bUL,
282: 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL,
283: 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL,
284: 0xd192e819d6ef5218UL, 0xd69906245565a910UL,
285: 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL,
286: 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL,
287: 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL,
288: 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL,
289: 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL,
290: 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL,
291: 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL,
292: 0x90befffa23631e28UL, 0xa4506cebde82bde9UL,
293: 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL,
294: 0xca273eceea26619cUL, 0xd186b8c721c0c207UL,
295: 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL,
296: 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL,
297: 0x113f9804bef90daeUL, 0x1b710b35131c471bUL,
298: 0x28db77f523047d84UL, 0x32caab7b40c72493UL,
299: 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL,
300: 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL,
301: 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL
302: };
303:
304: /* Initial hash value H for SHA-384: */
305: static const isc_uint64_t sha384_initial_hash_value[8] = {
306: 0xcbbb9d5dc1059ed8UL,
307: 0x629a292a367cd507UL,
308: 0x9159015a3070dd17UL,
309: 0x152fecd8f70e5939UL,
310: 0x67332667ffc00b31UL,
311: 0x8eb44a8768581511UL,
312: 0xdb0c2e0d64f98fa7UL,
313: 0x47b5481dbefa4fa4UL
314: };
315:
316: /* Initial hash value H for SHA-512: */
317: static const isc_uint64_t sha512_initial_hash_value[8] = {
318: 0x6a09e667f3bcc908U,
319: 0xbb67ae8584caa73bUL,
320: 0x3c6ef372fe94f82bUL,
321: 0xa54ff53a5f1d36f1UL,
322: 0x510e527fade682d1UL,
323: 0x9b05688c2b3e6c1fUL,
324: 0x1f83d9abfb41bd6bUL,
325: 0x5be0cd19137e2179UL
326: };
327: #else
328: /* Hash constant words K for SHA-384 and SHA-512: */
329: static const isc_uint64_t K512[80] = {
330: 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
331: 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
332: 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
333: 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
334: 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
335: 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
336: 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
337: 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
338: 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
339: 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
340: 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
341: 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
342: 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
343: 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
344: 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
345: 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
346: 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
347: 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
348: 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
349: 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
350: 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
351: 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
352: 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
353: 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
354: 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
355: 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
356: 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
357: 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
358: 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
359: 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
360: 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
361: 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
362: 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
363: 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
364: 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
365: 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
366: 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
367: 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
368: 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
369: 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
370: };
371:
372: /* Initial hash value H for SHA-384: */
373: static const isc_uint64_t sha384_initial_hash_value[8] = {
374: 0xcbbb9d5dc1059ed8ULL,
375: 0x629a292a367cd507ULL,
376: 0x9159015a3070dd17ULL,
377: 0x152fecd8f70e5939ULL,
378: 0x67332667ffc00b31ULL,
379: 0x8eb44a8768581511ULL,
380: 0xdb0c2e0d64f98fa7ULL,
381: 0x47b5481dbefa4fa4ULL
382: };
383:
384: /* Initial hash value H for SHA-512: */
385: static const isc_uint64_t sha512_initial_hash_value[8] = {
386: 0x6a09e667f3bcc908ULL,
387: 0xbb67ae8584caa73bULL,
388: 0x3c6ef372fe94f82bULL,
389: 0xa54ff53a5f1d36f1ULL,
390: 0x510e527fade682d1ULL,
391: 0x9b05688c2b3e6c1fULL,
392: 0x1f83d9abfb41bd6bULL,
393: 0x5be0cd19137e2179ULL
394: };
395: #endif
396:
397: /*
398: * Constant used by SHA256/384/512_End() functions for converting the
399: * digest to a readable hexadecimal character string:
400: */
401: static const char *sha2_hex_digits = "0123456789abcdef";
402:
403:
404:
405: /*** SHA-224: *********************************************************/
406: void
407: isc_sha224_init(isc_sha224_t *context) {
408: if (context == (isc_sha256_t *)0) {
409: return;
410: }
411: memcpy(context->state, sha224_initial_hash_value,
412: ISC_SHA256_DIGESTLENGTH);
413: memset(context->buffer, 0, ISC_SHA256_BLOCK_LENGTH);
414: context->bitcount = 0;
415: }
416:
417: void
418: isc_sha224_update(isc_sha224_t *context, const isc_uint8_t* data, size_t len) {
419: isc_sha256_update((isc_sha256_t *)context, data, len);
420: }
421:
422: void
423: isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
424: isc_uint8_t sha256_digest[ISC_SHA256_DIGESTLENGTH];
425: isc_sha256_final(sha256_digest, (isc_sha256_t *)context);
426: memcpy(digest, sha256_digest, ISC_SHA224_DIGESTLENGTH);
427: memset(sha256_digest, 0, ISC_SHA256_DIGESTLENGTH);
428: }
429:
430: char *
431: isc_sha224_end(isc_sha224_t *context, char buffer[]) {
432: isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
433: unsigned int i;
434:
435: /* Sanity check: */
436: REQUIRE(context != (isc_sha224_t *)0);
437:
438: if (buffer != (char*)0) {
439: isc_sha224_final(digest, context);
440:
441: for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
442: *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
443: *buffer++ = sha2_hex_digits[*d & 0x0f];
444: d++;
445: }
446: *buffer = (char)0;
447: } else {
448: memset(context, 0, sizeof(context));
449: }
450: memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
451: return buffer;
452: }
453:
454: char*
455: isc_sha224_data(const isc_uint8_t *data, size_t len,
456: char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
457: {
458: isc_sha224_t context;
459:
460: isc_sha224_init(&context);
461: isc_sha224_update(&context, data, len);
462: return (isc_sha224_end(&context, digest));
463: }
464:
465: /*** SHA-256: *********************************************************/
466: void
467: isc_sha256_init(isc_sha256_t *context) {
468: if (context == (isc_sha256_t *)0) {
469: return;
470: }
471: memcpy(context->state, sha256_initial_hash_value,
472: ISC_SHA256_DIGESTLENGTH);
473: memset(context->buffer, 0, ISC_SHA256_BLOCK_LENGTH);
474: context->bitcount = 0;
475: }
476:
477: #ifdef ISC_SHA2_UNROLL_TRANSFORM
478:
479: /* Unrolled SHA-256 round macros: */
480:
481: #if BYTE_ORDER == LITTLE_ENDIAN
482:
483: #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
484: REVERSE32(*data++, W256[j]); \
485: T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
486: K256[j] + W256[j]; \
487: (d) += T1; \
488: (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
489: j++
490:
491:
492: #else /* BYTE_ORDER == LITTLE_ENDIAN */
493:
494: #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
495: T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
496: K256[j] + (W256[j] = *data++); \
497: (d) += T1; \
498: (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
499: j++
500:
501: #endif /* BYTE_ORDER == LITTLE_ENDIAN */
502:
503: #define ROUND256(a,b,c,d,e,f,g,h) \
504: s0 = W256[(j+1)&0x0f]; \
505: s0 = sigma0_256(s0); \
506: s1 = W256[(j+14)&0x0f]; \
507: s1 = sigma1_256(s1); \
508: T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
509: (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
510: (d) += T1; \
511: (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
512: j++
513:
514: void isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
515: isc_uint32_t a, b, c, d, e, f, g, h, s0, s1;
516: isc_uint32_t T1, *W256;
517: int j;
518:
519: W256 = (isc_uint32_t*)context->buffer;
520:
521: /* Initialize registers with the prev. intermediate value */
522: a = context->state[0];
523: b = context->state[1];
524: c = context->state[2];
525: d = context->state[3];
526: e = context->state[4];
527: f = context->state[5];
528: g = context->state[6];
529: h = context->state[7];
530:
531: j = 0;
532: do {
533: /* Rounds 0 to 15 (unrolled): */
534: ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
535: ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
536: ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
537: ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
538: ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
539: ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
540: ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
541: ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
542: } while (j < 16);
543:
544: /* Now for the remaining rounds to 64: */
545: do {
546: ROUND256(a,b,c,d,e,f,g,h);
547: ROUND256(h,a,b,c,d,e,f,g);
548: ROUND256(g,h,a,b,c,d,e,f);
549: ROUND256(f,g,h,a,b,c,d,e);
550: ROUND256(e,f,g,h,a,b,c,d);
551: ROUND256(d,e,f,g,h,a,b,c);
552: ROUND256(c,d,e,f,g,h,a,b);
553: ROUND256(b,c,d,e,f,g,h,a);
554: } while (j < 64);
555:
556: /* Compute the current intermediate hash value */
557: context->state[0] += a;
558: context->state[1] += b;
559: context->state[2] += c;
560: context->state[3] += d;
561: context->state[4] += e;
562: context->state[5] += f;
563: context->state[6] += g;
564: context->state[7] += h;
565:
566: /* Clean up */
567: a = b = c = d = e = f = g = h = T1 = 0;
568: }
569:
570: #else /* ISC_SHA2_UNROLL_TRANSFORM */
571:
572: void
573: isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
574: isc_uint32_t a, b, c, d, e, f, g, h, s0, s1;
575: isc_uint32_t T1, T2, *W256;
576: int j;
577:
578: W256 = (isc_uint32_t*)context->buffer;
579:
580: /* Initialize registers with the prev. intermediate value */
581: a = context->state[0];
582: b = context->state[1];
583: c = context->state[2];
584: d = context->state[3];
585: e = context->state[4];
586: f = context->state[5];
587: g = context->state[6];
588: h = context->state[7];
589:
590: j = 0;
591: do {
592: #if BYTE_ORDER == LITTLE_ENDIAN
593: /* Copy data while converting to host byte order */
594: REVERSE32(*data++,W256[j]);
595: /* Apply the SHA-256 compression function to update a..h */
596: T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
597: #else /* BYTE_ORDER == LITTLE_ENDIAN */
598: /* Apply the SHA-256 compression function to update a..h with copy */
599: T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
600: #endif /* BYTE_ORDER == LITTLE_ENDIAN */
601: T2 = Sigma0_256(a) + Maj(a, b, c);
602: h = g;
603: g = f;
604: f = e;
605: e = d + T1;
606: d = c;
607: c = b;
608: b = a;
609: a = T1 + T2;
610:
611: j++;
612: } while (j < 16);
613:
614: do {
615: /* Part of the message block expansion: */
616: s0 = W256[(j+1)&0x0f];
617: s0 = sigma0_256(s0);
618: s1 = W256[(j+14)&0x0f];
619: s1 = sigma1_256(s1);
620:
621: /* Apply the SHA-256 compression function to update a..h */
622: T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
623: (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
624: T2 = Sigma0_256(a) + Maj(a, b, c);
625: h = g;
626: g = f;
627: f = e;
628: e = d + T1;
629: d = c;
630: c = b;
631: b = a;
632: a = T1 + T2;
633:
634: j++;
635: } while (j < 64);
636:
637: /* Compute the current intermediate hash value */
638: context->state[0] += a;
639: context->state[1] += b;
640: context->state[2] += c;
641: context->state[3] += d;
642: context->state[4] += e;
643: context->state[5] += f;
644: context->state[6] += g;
645: context->state[7] += h;
646:
647: /* Clean up */
648: a = b = c = d = e = f = g = h = T1 = T2 = 0;
649: }
650:
651: #endif /* ISC_SHA2_UNROLL_TRANSFORM */
652:
653: void
654: isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
655: unsigned int freespace, usedspace;
656:
657: if (len == 0U) {
658: /* Calling with no data is valid - we do nothing */
659: return;
660: }
661:
662: /* Sanity check: */
663: REQUIRE(context != (isc_sha256_t *)0 && data != (isc_uint8_t*)0);
664:
665: usedspace = (unsigned int)((context->bitcount >> 3) %
666: ISC_SHA256_BLOCK_LENGTH);
667: if (usedspace > 0) {
668: /* Calculate how much free space is available in the buffer */
669: freespace = ISC_SHA256_BLOCK_LENGTH - usedspace;
670:
671: if (len >= freespace) {
672: /* Fill the buffer completely and process it */
673: memcpy(&context->buffer[usedspace], data, freespace);
674: context->bitcount += freespace << 3;
675: len -= freespace;
676: data += freespace;
677: isc_sha256_transform(context,
678: (isc_uint32_t*)context->buffer);
679: } else {
680: /* The buffer is not yet full */
681: memcpy(&context->buffer[usedspace], data, len);
682: context->bitcount += len << 3;
683: /* Clean up: */
684: usedspace = freespace = 0;
685: return;
686: }
687: }
688: while (len >= ISC_SHA256_BLOCK_LENGTH) {
689: /* Process as many complete blocks as we can */
690: memcpy(context->buffer, data, ISC_SHA256_BLOCK_LENGTH);
691: isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
692: context->bitcount += ISC_SHA256_BLOCK_LENGTH << 3;
693: len -= ISC_SHA256_BLOCK_LENGTH;
694: data += ISC_SHA256_BLOCK_LENGTH;
695: }
696: if (len > 0U) {
697: /* There's left-overs, so save 'em */
698: memcpy(context->buffer, data, len);
699: context->bitcount += len << 3;
700: }
701: /* Clean up: */
702: usedspace = freespace = 0;
703: }
704:
705: void
706: isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
707: isc_uint32_t *d = (isc_uint32_t*)digest;
708: unsigned int usedspace;
709:
710: /* Sanity check: */
711: REQUIRE(context != (isc_sha256_t *)0);
712:
713: /* If no digest buffer is passed, we don't bother doing this: */
714: if (digest != (isc_uint8_t*)0) {
715: usedspace = (unsigned int)((context->bitcount >> 3) %
716: ISC_SHA256_BLOCK_LENGTH);
717: #if BYTE_ORDER == LITTLE_ENDIAN
718: /* Convert FROM host byte order */
719: REVERSE64(context->bitcount,context->bitcount);
720: #endif
721: if (usedspace > 0) {
722: /* Begin padding with a 1 bit: */
723: context->buffer[usedspace++] = 0x80;
724:
725: if (usedspace <= ISC_SHA256_SHORT_BLOCK_LENGTH) {
726: /* Set-up for the last transform: */
727: memset(&context->buffer[usedspace], 0,
728: ISC_SHA256_SHORT_BLOCK_LENGTH - usedspace);
729: } else {
730: if (usedspace < ISC_SHA256_BLOCK_LENGTH) {
731: memset(&context->buffer[usedspace], 0,
732: ISC_SHA256_BLOCK_LENGTH -
733: usedspace);
734: }
735: /* Do second-to-last transform: */
736: isc_sha256_transform(context,
737: (isc_uint32_t*)context->buffer);
738:
739: /* And set-up for the last transform: */
740: memset(context->buffer, 0,
741: ISC_SHA256_SHORT_BLOCK_LENGTH);
742: }
743: } else {
744: /* Set-up for the last transform: */
745: memset(context->buffer, 0, ISC_SHA256_SHORT_BLOCK_LENGTH);
746:
747: /* Begin padding with a 1 bit: */
748: *context->buffer = 0x80;
749: }
750: /* Set the bit count: */
751: *(isc_uint64_t*)&context->buffer[ISC_SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
752:
753: /* Final transform: */
754: isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
755:
756: #if BYTE_ORDER == LITTLE_ENDIAN
757: {
758: /* Convert TO host byte order */
759: int j;
760: for (j = 0; j < 8; j++) {
761: REVERSE32(context->state[j],context->state[j]);
762: *d++ = context->state[j];
763: }
764: }
765: #else
766: memcpy(d, context->state, ISC_SHA256_DIGESTLENGTH);
767: #endif
768: }
769:
770: /* Clean up state data: */
771: memset(context, 0, sizeof(context));
772: usedspace = 0;
773: }
774:
775: char *
776: isc_sha256_end(isc_sha256_t *context, char buffer[]) {
777: isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
778: unsigned int i;
779:
780: /* Sanity check: */
781: REQUIRE(context != (isc_sha256_t *)0);
782:
783: if (buffer != (char*)0) {
784: isc_sha256_final(digest, context);
785:
786: for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
787: *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
788: *buffer++ = sha2_hex_digits[*d & 0x0f];
789: d++;
790: }
791: *buffer = (char)0;
792: } else {
793: memset(context, 0, sizeof(context));
794: }
795: memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
796: return buffer;
797: }
798:
799: char *
800: isc_sha256_data(const isc_uint8_t* data, size_t len,
801: char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
802: {
803: isc_sha256_t context;
804:
805: isc_sha256_init(&context);
806: isc_sha256_update(&context, data, len);
807: return (isc_sha256_end(&context, digest));
808: }
809:
810:
811: /*** SHA-512: *********************************************************/
812: void
813: isc_sha512_init(isc_sha512_t *context) {
814: if (context == (isc_sha512_t *)0) {
815: return;
816: }
817: memcpy(context->state, sha512_initial_hash_value,
818: ISC_SHA512_DIGESTLENGTH);
819: memset(context->buffer, 0, ISC_SHA512_BLOCK_LENGTH);
820: context->bitcount[0] = context->bitcount[1] = 0;
821: }
822:
823: #ifdef ISC_SHA2_UNROLL_TRANSFORM
824:
825: /* Unrolled SHA-512 round macros: */
826: #if BYTE_ORDER == LITTLE_ENDIAN
827:
828: #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
829: REVERSE64(*data++, W512[j]); \
830: T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
831: K512[j] + W512[j]; \
832: (d) += T1, \
833: (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
834: j++
835:
836:
837: #else /* BYTE_ORDER == LITTLE_ENDIAN */
838:
839: #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
840: T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
841: K512[j] + (W512[j] = *data++); \
842: (d) += T1; \
843: (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
844: j++
845:
846: #endif /* BYTE_ORDER == LITTLE_ENDIAN */
847:
848: #define ROUND512(a,b,c,d,e,f,g,h) \
849: s0 = W512[(j+1)&0x0f]; \
850: s0 = sigma0_512(s0); \
851: s1 = W512[(j+14)&0x0f]; \
852: s1 = sigma1_512(s1); \
853: T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
854: (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
855: (d) += T1; \
856: (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
857: j++
858:
859: void isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
860: isc_uint64_t a, b, c, d, e, f, g, h, s0, s1;
861: isc_uint64_t T1, *W512 = (isc_uint64_t*)context->buffer;
862: int j;
863:
864: /* Initialize registers with the prev. intermediate value */
865: a = context->state[0];
866: b = context->state[1];
867: c = context->state[2];
868: d = context->state[3];
869: e = context->state[4];
870: f = context->state[5];
871: g = context->state[6];
872: h = context->state[7];
873:
874: j = 0;
875: do {
876: ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
877: ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
878: ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
879: ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
880: ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
881: ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
882: ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
883: ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
884: } while (j < 16);
885:
886: /* Now for the remaining rounds up to 79: */
887: do {
888: ROUND512(a,b,c,d,e,f,g,h);
889: ROUND512(h,a,b,c,d,e,f,g);
890: ROUND512(g,h,a,b,c,d,e,f);
891: ROUND512(f,g,h,a,b,c,d,e);
892: ROUND512(e,f,g,h,a,b,c,d);
893: ROUND512(d,e,f,g,h,a,b,c);
894: ROUND512(c,d,e,f,g,h,a,b);
895: ROUND512(b,c,d,e,f,g,h,a);
896: } while (j < 80);
897:
898: /* Compute the current intermediate hash value */
899: context->state[0] += a;
900: context->state[1] += b;
901: context->state[2] += c;
902: context->state[3] += d;
903: context->state[4] += e;
904: context->state[5] += f;
905: context->state[6] += g;
906: context->state[7] += h;
907:
908: /* Clean up */
909: a = b = c = d = e = f = g = h = T1 = 0;
910: }
911:
912: #else /* ISC_SHA2_UNROLL_TRANSFORM */
913:
914: void
915: isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
916: isc_uint64_t a, b, c, d, e, f, g, h, s0, s1;
917: isc_uint64_t T1, T2, *W512 = (isc_uint64_t*)context->buffer;
918: int j;
919:
920: /* Initialize registers with the prev. intermediate value */
921: a = context->state[0];
922: b = context->state[1];
923: c = context->state[2];
924: d = context->state[3];
925: e = context->state[4];
926: f = context->state[5];
927: g = context->state[6];
928: h = context->state[7];
929:
930: j = 0;
931: do {
932: #if BYTE_ORDER == LITTLE_ENDIAN
933: /* Convert TO host byte order */
934: REVERSE64(*data++, W512[j]);
935: /* Apply the SHA-512 compression function to update a..h */
936: T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
937: #else /* BYTE_ORDER == LITTLE_ENDIAN */
938: /* Apply the SHA-512 compression function to update a..h with copy */
939: T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
940: #endif /* BYTE_ORDER == LITTLE_ENDIAN */
941: T2 = Sigma0_512(a) + Maj(a, b, c);
942: h = g;
943: g = f;
944: f = e;
945: e = d + T1;
946: d = c;
947: c = b;
948: b = a;
949: a = T1 + T2;
950:
951: j++;
952: } while (j < 16);
953:
954: do {
955: /* Part of the message block expansion: */
956: s0 = W512[(j+1)&0x0f];
957: s0 = sigma0_512(s0);
958: s1 = W512[(j+14)&0x0f];
959: s1 = sigma1_512(s1);
960:
961: /* Apply the SHA-512 compression function to update a..h */
962: T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
963: (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
964: T2 = Sigma0_512(a) + Maj(a, b, c);
965: h = g;
966: g = f;
967: f = e;
968: e = d + T1;
969: d = c;
970: c = b;
971: b = a;
972: a = T1 + T2;
973:
974: j++;
975: } while (j < 80);
976:
977: /* Compute the current intermediate hash value */
978: context->state[0] += a;
979: context->state[1] += b;
980: context->state[2] += c;
981: context->state[3] += d;
982: context->state[4] += e;
983: context->state[5] += f;
984: context->state[6] += g;
985: context->state[7] += h;
986:
987: /* Clean up */
988: a = b = c = d = e = f = g = h = T1 = T2 = 0;
989: }
990:
991: #endif /* ISC_SHA2_UNROLL_TRANSFORM */
992:
993: void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
994: unsigned int freespace, usedspace;
995:
996: if (len == 0U) {
997: /* Calling with no data is valid - we do nothing */
998: return;
999: }
1000:
1001: /* Sanity check: */
1002: REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
1003:
1004: usedspace = (unsigned int)((context->bitcount[0] >> 3) %
1005: ISC_SHA512_BLOCK_LENGTH);
1006: if (usedspace > 0) {
1007: /* Calculate how much free space is available in the buffer */
1008: freespace = ISC_SHA512_BLOCK_LENGTH - usedspace;
1009:
1010: if (len >= freespace) {
1011: /* Fill the buffer completely and process it */
1012: memcpy(&context->buffer[usedspace], data, freespace);
1013: ADDINC128(context->bitcount, freespace << 3);
1014: len -= freespace;
1015: data += freespace;
1016: isc_sha512_transform(context,
1017: (isc_uint64_t*)context->buffer);
1018: } else {
1019: /* The buffer is not yet full */
1020: memcpy(&context->buffer[usedspace], data, len);
1021: ADDINC128(context->bitcount, len << 3);
1022: /* Clean up: */
1023: usedspace = freespace = 0;
1024: return;
1025: }
1026: }
1027: while (len >= ISC_SHA512_BLOCK_LENGTH) {
1028: /* Process as many complete blocks as we can */
1029: memcpy(context->buffer, data, ISC_SHA512_BLOCK_LENGTH);
1030: isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
1031: ADDINC128(context->bitcount, ISC_SHA512_BLOCK_LENGTH << 3);
1032: len -= ISC_SHA512_BLOCK_LENGTH;
1033: data += ISC_SHA512_BLOCK_LENGTH;
1034: }
1035: if (len > 0U) {
1036: /* There's left-overs, so save 'em */
1037: memcpy(context->buffer, data, len);
1038: ADDINC128(context->bitcount, len << 3);
1039: }
1040: /* Clean up: */
1041: usedspace = freespace = 0;
1042: }
1043:
1044: void isc_sha512_last(isc_sha512_t *context) {
1045: unsigned int usedspace;
1046:
1047: usedspace = (unsigned int)((context->bitcount[0] >> 3) %
1048: ISC_SHA512_BLOCK_LENGTH);
1049: #if BYTE_ORDER == LITTLE_ENDIAN
1050: /* Convert FROM host byte order */
1051: REVERSE64(context->bitcount[0],context->bitcount[0]);
1052: REVERSE64(context->bitcount[1],context->bitcount[1]);
1053: #endif
1054: if (usedspace > 0) {
1055: /* Begin padding with a 1 bit: */
1056: context->buffer[usedspace++] = 0x80;
1057:
1058: if (usedspace <= ISC_SHA512_SHORT_BLOCK_LENGTH) {
1059: /* Set-up for the last transform: */
1060: memset(&context->buffer[usedspace], 0,
1061: ISC_SHA512_SHORT_BLOCK_LENGTH - usedspace);
1062: } else {
1063: if (usedspace < ISC_SHA512_BLOCK_LENGTH) {
1064: memset(&context->buffer[usedspace], 0,
1065: ISC_SHA512_BLOCK_LENGTH - usedspace);
1066: }
1067: /* Do second-to-last transform: */
1068: isc_sha512_transform(context,
1069: (isc_uint64_t*)context->buffer);
1070:
1071: /* And set-up for the last transform: */
1072: memset(context->buffer, 0, ISC_SHA512_BLOCK_LENGTH - 2);
1073: }
1074: } else {
1075: /* Prepare for final transform: */
1076: memset(context->buffer, 0, ISC_SHA512_SHORT_BLOCK_LENGTH);
1077:
1078: /* Begin padding with a 1 bit: */
1079: *context->buffer = 0x80;
1080: }
1081: /* Store the length of input data (in bits): */
1082: *(isc_uint64_t*)&context->buffer[ISC_SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
1083: *(isc_uint64_t*)&context->buffer[ISC_SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
1084:
1085: /* Final transform: */
1086: isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
1087: }
1088:
1089: void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
1090: isc_uint64_t *d = (isc_uint64_t*)digest;
1091:
1092: /* Sanity check: */
1093: REQUIRE(context != (isc_sha512_t *)0);
1094:
1095: /* If no digest buffer is passed, we don't bother doing this: */
1096: if (digest != (isc_uint8_t*)0) {
1097: isc_sha512_last(context);
1098:
1099: /* Save the hash data for output: */
1100: #if BYTE_ORDER == LITTLE_ENDIAN
1101: {
1102: /* Convert TO host byte order */
1103: int j;
1104: for (j = 0; j < 8; j++) {
1105: REVERSE64(context->state[j],context->state[j]);
1106: *d++ = context->state[j];
1107: }
1108: }
1109: #else
1110: memcpy(d, context->state, ISC_SHA512_DIGESTLENGTH);
1111: #endif
1112: }
1113:
1114: /* Zero out state data */
1115: memset(context, 0, sizeof(context));
1116: }
1117:
1118: char *
1119: isc_sha512_end(isc_sha512_t *context, char buffer[]) {
1120: isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
1121: unsigned int i;
1122:
1123: /* Sanity check: */
1124: REQUIRE(context != (isc_sha512_t *)0);
1125:
1126: if (buffer != (char*)0) {
1127: isc_sha512_final(digest, context);
1128:
1129: for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
1130: *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
1131: *buffer++ = sha2_hex_digits[*d & 0x0f];
1132: d++;
1133: }
1134: *buffer = (char)0;
1135: } else {
1136: memset(context, 0, sizeof(context));
1137: }
1138: memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
1139: return buffer;
1140: }
1141:
1142: char *
1143: isc_sha512_data(const isc_uint8_t *data, size_t len,
1144: char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
1145: {
1146: isc_sha512_t context;
1147:
1148: isc_sha512_init(&context);
1149: isc_sha512_update(&context, data, len);
1150: return (isc_sha512_end(&context, digest));
1151: }
1152:
1153:
1154: /*** SHA-384: *********************************************************/
1155: void
1156: isc_sha384_init(isc_sha384_t *context) {
1157: if (context == (isc_sha384_t *)0) {
1158: return;
1159: }
1160: memcpy(context->state, sha384_initial_hash_value,
1161: ISC_SHA512_DIGESTLENGTH);
1162: memset(context->buffer, 0, ISC_SHA384_BLOCK_LENGTH);
1163: context->bitcount[0] = context->bitcount[1] = 0;
1164: }
1165:
1166: void
1167: isc_sha384_update(isc_sha384_t *context, const isc_uint8_t* data, size_t len) {
1168: isc_sha512_update((isc_sha512_t *)context, data, len);
1169: }
1170:
1171: void
1172: isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
1173: isc_uint64_t *d = (isc_uint64_t*)digest;
1174:
1175: /* Sanity check: */
1176: REQUIRE(context != (isc_sha384_t *)0);
1177:
1178: /* If no digest buffer is passed, we don't bother doing this: */
1179: if (digest != (isc_uint8_t*)0) {
1180: isc_sha512_last((isc_sha512_t *)context);
1181:
1182: /* Save the hash data for output: */
1183: #if BYTE_ORDER == LITTLE_ENDIAN
1184: {
1185: /* Convert TO host byte order */
1186: int j;
1187: for (j = 0; j < 6; j++) {
1188: REVERSE64(context->state[j],context->state[j]);
1189: *d++ = context->state[j];
1190: }
1191: }
1192: #else
1193: memcpy(d, context->state, ISC_SHA384_DIGESTLENGTH);
1194: #endif
1195: }
1196:
1197: /* Zero out state data */
1198: memset(context, 0, sizeof(context));
1199: }
1200:
1201: char *
1202: isc_sha384_end(isc_sha384_t *context, char buffer[]) {
1203: isc_uint8_t digest[ISC_SHA384_DIGESTLENGTH], *d = digest;
1204: unsigned int i;
1205:
1206: /* Sanity check: */
1207: REQUIRE(context != (isc_sha384_t *)0);
1208:
1209: if (buffer != (char*)0) {
1210: isc_sha384_final(digest, context);
1211:
1212: for (i = 0; i < ISC_SHA384_DIGESTLENGTH; i++) {
1213: *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
1214: *buffer++ = sha2_hex_digits[*d & 0x0f];
1215: d++;
1216: }
1217: *buffer = (char)0;
1218: } else {
1219: memset(context, 0, sizeof(context));
1220: }
1221: memset(digest, 0, ISC_SHA384_DIGESTLENGTH);
1222: return buffer;
1223: }
1224:
1225: char*
1226: isc_sha384_data(const isc_uint8_t *data, size_t len,
1227: char digest[ISC_SHA384_DIGESTSTRINGLENGTH])
1228: {
1229: isc_sha384_t context;
1230:
1231: isc_sha384_init(&context);
1232: isc_sha384_update(&context, data, len);
1233: return (isc_sha384_end(&context, digest));
1234: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>