Return to sha2.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / lib / isc |
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: }