root/crypto/sha2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. SHA256_Init
  2. SHA256_Transform
  3. SHA256_Transform
  4. SHA256_Update
  5. SHA256_Final
  6. SHA512_Init
  7. SHA512_Transform
  8. SHA512_Transform
  9. SHA512_Update
  10. SHA512_Last
  11. SHA512_Final
  12. SHA384_Init
  13. SHA384_Update
  14. SHA384_Final

    1 /*      $OpenBSD: sha2.c,v 1.6 2004/05/03 02:57:36 millert Exp $        */
    2 
    3 /*
    4  * FILE:        sha2.c
    5  * AUTHOR:      Aaron D. Gifford <me@aarongifford.com>
    6  * 
    7  * Copyright (c) 2000-2001, Aaron D. Gifford
    8  * All rights reserved.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  * 3. Neither the name of the copyright holder nor the names of contributors
   19  *    may be used to endorse or promote products derived from this software
   20  *    without specific prior written permission.
   21  * 
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
   23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
   26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   32  * SUCH DAMAGE.
   33  *
   34  * $From: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
   35  */
   36 
   37 #include <sys/param.h>
   38 #include <sys/time.h>
   39 #include <sys/systm.h>
   40 #include <crypto/sha2.h>
   41 
   42 /*
   43  * UNROLLED TRANSFORM LOOP NOTE:
   44  * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
   45  * loop version for the hash transform rounds (defined using macros
   46  * later in this file).  Either define on the command line, for example:
   47  *
   48  *   cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
   49  *
   50  * or define below:
   51  *
   52  *   #define SHA2_UNROLL_TRANSFORM
   53  *
   54  */
   55 
   56 
   57 /*** SHA-256/384/512 Machine Architecture Definitions *****************/
   58 /*
   59  * BYTE_ORDER NOTE:
   60  *
   61  * Please make sure that your system defines BYTE_ORDER.  If your
   62  * architecture is little-endian, make sure it also defines
   63  * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
   64  * equivilent.
   65  *
   66  * If your system does not define the above, then you can do so by
   67  * hand like this:
   68  *
   69  *   #define LITTLE_ENDIAN 1234
   70  *   #define BIG_ENDIAN    4321
   71  *
   72  * And for little-endian machines, add:
   73  *
   74  *   #define BYTE_ORDER LITTLE_ENDIAN 
   75  *
   76  * Or for big-endian machines:
   77  *
   78  *   #define BYTE_ORDER BIG_ENDIAN
   79  *
   80  * The FreeBSD machine this was written on defines BYTE_ORDER
   81  * appropriately by including <sys/types.h> (which in turn includes
   82  * <machine/endian.h> where the appropriate definitions are actually
   83  * made).
   84  */
   85 #if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
   86 #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
   87 #endif
   88 
   89 
   90 /*** SHA-256/384/512 Various Length Definitions ***********************/
   91 /* NOTE: Most of these are in sha2.h */
   92 #define SHA256_SHORT_BLOCK_LENGTH       (SHA256_BLOCK_LENGTH - 8)
   93 #define SHA384_SHORT_BLOCK_LENGTH       (SHA384_BLOCK_LENGTH - 16)
   94 #define SHA512_SHORT_BLOCK_LENGTH       (SHA512_BLOCK_LENGTH - 16)
   95 
   96 
   97 /*** ENDIAN REVERSAL MACROS *******************************************/
   98 #if BYTE_ORDER == LITTLE_ENDIAN
   99 #define REVERSE32(w,x)  { \
  100         u_int32_t tmp = (w); \
  101         tmp = (tmp >> 16) | (tmp << 16); \
  102         (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
  103 }
  104 #define REVERSE64(w,x)  { \
  105         u_int64_t tmp = (w); \
  106         tmp = (tmp >> 32) | (tmp << 32); \
  107         tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
  108               ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
  109         (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
  110               ((tmp & 0x0000ffff0000ffffULL) << 16); \
  111 }
  112 #endif /* BYTE_ORDER == LITTLE_ENDIAN */
  113 
  114 /*
  115  * Macro for incrementally adding the unsigned 64-bit integer n to the
  116  * unsigned 128-bit integer (represented using a two-element array of
  117  * 64-bit words):
  118  */
  119 #define ADDINC128(w,n)  { \
  120         (w)[0] += (u_int64_t)(n); \
  121         if ((w)[0] < (n)) { \
  122                 (w)[1]++; \
  123         } \
  124 }
  125 
  126 /*** THE SIX LOGICAL FUNCTIONS ****************************************/
  127 /*
  128  * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
  129  *
  130  *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
  131  *   S is a ROTATION) because the SHA-256/384/512 description document
  132  *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
  133  *   same "backwards" definition.
  134  */
  135 /* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
  136 #define R(b,x)          ((x) >> (b))
  137 /* 32-bit Rotate-right (used in SHA-256): */
  138 #define S32(b,x)        (((x) >> (b)) | ((x) << (32 - (b))))
  139 /* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
  140 #define S64(b,x)        (((x) >> (b)) | ((x) << (64 - (b))))
  141 
  142 /* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
  143 #define Ch(x,y,z)       (((x) & (y)) ^ ((~(x)) & (z)))
  144 #define Maj(x,y,z)      (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
  145 
  146 /* Four of six logical functions used in SHA-256: */
  147 #define Sigma0_256(x)   (S32(2,  (x)) ^ S32(13, (x)) ^ S32(22, (x)))
  148 #define Sigma1_256(x)   (S32(6,  (x)) ^ S32(11, (x)) ^ S32(25, (x)))
  149 #define sigma0_256(x)   (S32(7,  (x)) ^ S32(18, (x)) ^ R(3 ,   (x)))
  150 #define sigma1_256(x)   (S32(17, (x)) ^ S32(19, (x)) ^ R(10,   (x)))
  151 
  152 /* Four of six logical functions used in SHA-384 and SHA-512: */
  153 #define Sigma0_512(x)   (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
  154 #define Sigma1_512(x)   (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
  155 #define sigma0_512(x)   (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7,   (x)))
  156 #define sigma1_512(x)   (S64(19, (x)) ^ S64(61, (x)) ^ R( 6,   (x)))
  157 
  158 /*** INTERNAL FUNCTION PROTOTYPES *************************************/
  159 /* NOTE: These should not be accessed directly from outside this
  160  * library -- they are intended for private internal visibility/use
  161  * only.
  162  */
  163 void SHA512_Last(SHA512_CTX *);
  164 void SHA256_Transform(SHA256_CTX *, const u_int8_t *);
  165 void SHA512_Transform(SHA512_CTX *, const u_int8_t *);
  166 
  167 
  168 /*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
  169 /* Hash constant words K for SHA-256: */
  170 const static u_int32_t K256[64] = {
  171         0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
  172         0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
  173         0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
  174         0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
  175         0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
  176         0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
  177         0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
  178         0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
  179         0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
  180         0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
  181         0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
  182         0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
  183         0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
  184         0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
  185         0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
  186         0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
  187 };
  188 
  189 /* Initial hash value H for SHA-256: */
  190 const static u_int32_t sha256_initial_hash_value[8] = {
  191         0x6a09e667UL,
  192         0xbb67ae85UL,
  193         0x3c6ef372UL,
  194         0xa54ff53aUL,
  195         0x510e527fUL,
  196         0x9b05688cUL,
  197         0x1f83d9abUL,
  198         0x5be0cd19UL
  199 };
  200 
  201 /* Hash constant words K for SHA-384 and SHA-512: */
  202 const static u_int64_t K512[80] = {
  203         0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
  204         0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
  205         0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
  206         0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
  207         0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
  208         0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
  209         0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
  210         0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
  211         0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
  212         0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
  213         0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
  214         0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
  215         0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
  216         0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
  217         0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
  218         0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
  219         0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
  220         0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
  221         0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
  222         0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
  223         0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
  224         0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
  225         0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
  226         0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
  227         0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
  228         0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
  229         0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
  230         0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
  231         0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
  232         0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
  233         0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
  234         0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
  235         0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
  236         0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
  237         0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
  238         0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
  239         0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
  240         0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
  241         0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
  242         0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
  243 };
  244 
  245 /* Initial hash value H for SHA-384 */
  246 const static u_int64_t sha384_initial_hash_value[8] = {
  247         0xcbbb9d5dc1059ed8ULL,
  248         0x629a292a367cd507ULL,
  249         0x9159015a3070dd17ULL,
  250         0x152fecd8f70e5939ULL,
  251         0x67332667ffc00b31ULL,
  252         0x8eb44a8768581511ULL,
  253         0xdb0c2e0d64f98fa7ULL,
  254         0x47b5481dbefa4fa4ULL
  255 };
  256 
  257 /* Initial hash value H for SHA-512 */
  258 const static u_int64_t sha512_initial_hash_value[8] = {
  259         0x6a09e667f3bcc908ULL,
  260         0xbb67ae8584caa73bULL,
  261         0x3c6ef372fe94f82bULL,
  262         0xa54ff53a5f1d36f1ULL,
  263         0x510e527fade682d1ULL,
  264         0x9b05688c2b3e6c1fULL,
  265         0x1f83d9abfb41bd6bULL,
  266         0x5be0cd19137e2179ULL
  267 };
  268 
  269 
  270 /*** SHA-256: *********************************************************/
  271 void
  272 SHA256_Init(SHA256_CTX *context)
  273 {
  274         if (context == NULL)
  275                 return;
  276         bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
  277         bzero(context->buffer, SHA256_BLOCK_LENGTH);
  278         context->bitcount = 0;
  279 }
  280 
  281 #ifdef SHA2_UNROLL_TRANSFORM
  282 
  283 /* Unrolled SHA-256 round macros: */
  284 
  285 #define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) do {                              \
  286         W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) |          \
  287             ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24);        \
  288         data += 4;                                                          \
  289         T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] + W256[j]; \
  290         (d) += T1;                                                          \
  291         (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c));                    \
  292         j++;                                                                \
  293 } while(0)
  294 
  295 #define ROUND256(a,b,c,d,e,f,g,h) do {                                      \
  296         s0 = W256[(j+1)&0x0f];                                              \
  297         s0 = sigma0_256(s0);                                                \
  298         s1 = W256[(j+14)&0x0f];                                             \
  299         s1 = sigma1_256(s1);                                                \
  300         T1 = (h) + Sigma1_256((e)) + Ch((e), (f), (g)) + K256[j] +          \
  301              (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);                  \
  302         (d) += T1;                                                          \
  303         (h) = T1 + Sigma0_256((a)) + Maj((a), (b), (c));                    \
  304         j++;                                                                \
  305 } while(0)
  306 
  307 void
  308 SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
  309 {
  310         u_int32_t       a, b, c, d, e, f, g, h, s0, s1;
  311         u_int32_t       T1, *W256;
  312         int             j;
  313 
  314         W256 = (u_int32_t *)context->buffer;
  315 
  316         /* Initialize registers with the prev. intermediate value */
  317         a = context->state[0];
  318         b = context->state[1];
  319         c = context->state[2];
  320         d = context->state[3];
  321         e = context->state[4];
  322         f = context->state[5];
  323         g = context->state[6];
  324         h = context->state[7];
  325 
  326         j = 0;
  327         do {
  328                 /* Rounds 0 to 15 (unrolled): */
  329                 ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
  330                 ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
  331                 ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
  332                 ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
  333                 ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
  334                 ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
  335                 ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
  336                 ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
  337         } while (j < 16);
  338 
  339         /* Now for the remaining rounds to 64: */
  340         do {
  341                 ROUND256(a,b,c,d,e,f,g,h);
  342                 ROUND256(h,a,b,c,d,e,f,g);
  343                 ROUND256(g,h,a,b,c,d,e,f);
  344                 ROUND256(f,g,h,a,b,c,d,e);
  345                 ROUND256(e,f,g,h,a,b,c,d);
  346                 ROUND256(d,e,f,g,h,a,b,c);
  347                 ROUND256(c,d,e,f,g,h,a,b);
  348                 ROUND256(b,c,d,e,f,g,h,a);
  349         } while (j < 64);
  350 
  351         /* Compute the current intermediate hash value */
  352         context->state[0] += a;
  353         context->state[1] += b;
  354         context->state[2] += c;
  355         context->state[3] += d;
  356         context->state[4] += e;
  357         context->state[5] += f;
  358         context->state[6] += g;
  359         context->state[7] += h;
  360 
  361         /* Clean up */
  362         a = b = c = d = e = f = g = h = T1 = 0;
  363 }
  364 
  365 #else /* SHA2_UNROLL_TRANSFORM */
  366 
  367 void
  368 SHA256_Transform(SHA256_CTX *context, const u_int8_t *data)
  369 {
  370         u_int32_t       a, b, c, d, e, f, g, h, s0, s1;
  371         u_int32_t       T1, T2, *W256;
  372         int             j;
  373 
  374         W256 = (u_int32_t *)context->buffer;
  375 
  376         /* Initialize registers with the prev. intermediate value */
  377         a = context->state[0];
  378         b = context->state[1];
  379         c = context->state[2];
  380         d = context->state[3];
  381         e = context->state[4];
  382         f = context->state[5];
  383         g = context->state[6];
  384         h = context->state[7];
  385 
  386         j = 0;
  387         do {
  388                 W256[j] = (u_int32_t)data[3] | ((u_int32_t)data[2] << 8) |
  389                     ((u_int32_t)data[1] << 16) | ((u_int32_t)data[0] << 24);
  390                 data += 4;
  391                 /* Apply the SHA-256 compression function to update a..h */
  392                 T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
  393                 T2 = Sigma0_256(a) + Maj(a, b, c);
  394                 h = g;
  395                 g = f;
  396                 f = e;
  397                 e = d + T1;
  398                 d = c;
  399                 c = b;
  400                 b = a;
  401                 a = T1 + T2;
  402 
  403                 j++;
  404         } while (j < 16);
  405 
  406         do {
  407                 /* Part of the message block expansion: */
  408                 s0 = W256[(j+1)&0x0f];
  409                 s0 = sigma0_256(s0);
  410                 s1 = W256[(j+14)&0x0f]; 
  411                 s1 = sigma1_256(s1);
  412 
  413                 /* Apply the SHA-256 compression function to update a..h */
  414                 T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
  415                      (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
  416                 T2 = Sigma0_256(a) + Maj(a, b, c);
  417                 h = g;
  418                 g = f;
  419                 f = e;
  420                 e = d + T1;
  421                 d = c;
  422                 c = b;
  423                 b = a;
  424                 a = T1 + T2;
  425 
  426                 j++;
  427         } while (j < 64);
  428 
  429         /* Compute the current intermediate hash value */
  430         context->state[0] += a;
  431         context->state[1] += b;
  432         context->state[2] += c;
  433         context->state[3] += d;
  434         context->state[4] += e;
  435         context->state[5] += f;
  436         context->state[6] += g;
  437         context->state[7] += h;
  438 
  439         /* Clean up */
  440         a = b = c = d = e = f = g = h = T1 = T2 = 0;
  441 }
  442 
  443 #endif /* SHA2_UNROLL_TRANSFORM */
  444 
  445 void
  446 SHA256_Update(SHA256_CTX *context, const u_int8_t *data, size_t len)
  447 {
  448         size_t  freespace, usedspace;
  449 
  450         /* Calling with no data is valid (we do nothing) */
  451         if (len == 0)
  452                 return;
  453 
  454         usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
  455         if (usedspace > 0) {
  456                 /* Calculate how much free space is available in the buffer */
  457                 freespace = SHA256_BLOCK_LENGTH - usedspace;
  458 
  459                 if (len >= freespace) {
  460                         /* Fill the buffer completely and process it */
  461                         bcopy(data, &context->buffer[usedspace], freespace);
  462                         context->bitcount += freespace << 3;
  463                         len -= freespace;
  464                         data += freespace;
  465                         SHA256_Transform(context, context->buffer);
  466                 } else {
  467                         /* The buffer is not yet full */
  468                         bcopy(data, &context->buffer[usedspace], len);
  469                         context->bitcount += len << 3;
  470                         /* Clean up: */
  471                         usedspace = freespace = 0;
  472                         return;
  473                 }
  474         }
  475         while (len >= SHA256_BLOCK_LENGTH) {
  476                 /* Process as many complete blocks as we can */
  477                 SHA256_Transform(context, data);
  478                 context->bitcount += SHA256_BLOCK_LENGTH << 3;
  479                 len -= SHA256_BLOCK_LENGTH;
  480                 data += SHA256_BLOCK_LENGTH;
  481         }
  482         if (len > 0) {
  483                 /* There's left-overs, so save 'em */
  484                 bcopy(data, context->buffer, len);
  485                 context->bitcount += len << 3;
  486         }
  487         /* Clean up: */
  488         usedspace = freespace = 0;
  489 }
  490 
  491 void
  492 SHA256_Final(u_int8_t digest[], SHA256_CTX *context)
  493 {
  494         u_int32_t       *d = (u_int32_t *)digest;
  495         unsigned int    usedspace;
  496 
  497         /* If no digest buffer is passed, we don't bother doing this: */
  498         if (digest != NULL) {
  499                 usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
  500 #if BYTE_ORDER == LITTLE_ENDIAN
  501                 /* Convert FROM host byte order */
  502                 REVERSE64(context->bitcount,context->bitcount);
  503 #endif
  504                 if (usedspace > 0) {
  505                         /* Begin padding with a 1 bit: */
  506                         context->buffer[usedspace++] = 0x80;
  507 
  508                         if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
  509                                 /* Set-up for the last transform: */
  510                                 bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
  511                         } else {
  512                                 if (usedspace < SHA256_BLOCK_LENGTH) {
  513                                         bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
  514                                 }
  515                                 /* Do second-to-last transform: */
  516                                 SHA256_Transform(context, context->buffer);
  517 
  518                                 /* And set-up for the last transform: */
  519                                 bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
  520                         }
  521                 } else {
  522                         /* Set-up for the last transform: */
  523                         bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
  524 
  525                         /* Begin padding with a 1 bit: */
  526                         *context->buffer = 0x80;
  527                 }
  528                 /* Set the bit count: */
  529                 *(u_int64_t *)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
  530 
  531                 /* Final transform: */
  532                 SHA256_Transform(context, context->buffer);
  533 
  534 #if BYTE_ORDER == LITTLE_ENDIAN
  535                 {
  536                         /* Convert TO host byte order */
  537                         int     j;
  538                         for (j = 0; j < 8; j++) {
  539                                 REVERSE32(context->state[j],context->state[j]);
  540                                 *d++ = context->state[j];
  541                         }
  542                 }
  543 #else
  544                 bcopy(context->state, d, SHA256_DIGEST_LENGTH);
  545 #endif
  546         }
  547 
  548         /* Clean up state data: */
  549         bzero(context, sizeof(*context));
  550         usedspace = 0;
  551 }
  552 
  553 
  554 /*** SHA-512: *********************************************************/
  555 void
  556 SHA512_Init(SHA512_CTX *context)
  557 {
  558         if (context == NULL)
  559                 return;
  560         bcopy(sha512_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
  561         bzero(context->buffer, SHA512_BLOCK_LENGTH);
  562         context->bitcount[0] = context->bitcount[1] =  0;
  563 }
  564 
  565 #ifdef SHA2_UNROLL_TRANSFORM
  566 
  567 /* Unrolled SHA-512 round macros: */
  568 
  569 #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) do {                              \
  570         W512[j] = (u_int64_t)data[7] | ((u_int64_t)data[6] << 8) |          \
  571             ((u_int64_t)data[5] << 16) | ((u_int64_t)data[4] << 24) |       \
  572             ((u_int64_t)data[3] << 32) | ((u_int64_t)data[2] << 40) |       \
  573             ((u_int64_t)data[1] << 48) | ((u_int64_t)data[0] << 56);        \
  574         data += 8;                                                          \
  575         T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] + W512[j]; \
  576         (d) += T1;                                                          \
  577         (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c));                    \
  578         j++;                                                                \
  579 } while(0)
  580 
  581 
  582 #define ROUND512(a,b,c,d,e,f,g,h) do {                                      \
  583         s0 = W512[(j+1)&0x0f];                                              \
  584         s0 = sigma0_512(s0);                                                \
  585         s1 = W512[(j+14)&0x0f];                                             \
  586         s1 = sigma1_512(s1);                                                \
  587         T1 = (h) + Sigma1_512((e)) + Ch((e), (f), (g)) + K512[j] +          \
  588              (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);                  \
  589         (d) += T1;                                                          \
  590         (h) = T1 + Sigma0_512((a)) + Maj((a), (b), (c));                    \
  591         j++;                                                                \
  592 } while(0)
  593 
  594 void
  595 SHA512_Transform(SHA512_CTX *context, const u_int8_t *data)
  596 {
  597         u_int64_t       a, b, c, d, e, f, g, h, s0, s1;
  598         u_int64_t       T1, *W512 = (u_int64_t *)context->buffer;
  599         int             j;
  600 
  601         /* Initialize registers with the prev. intermediate value */
  602         a = context->state[0];
  603         b = context->state[1];
  604         c = context->state[2];
  605         d = context->state[3];
  606         e = context->state[4];
  607         f = context->state[5];
  608         g = context->state[6];
  609         h = context->state[7];
  610 
  611         j = 0;
  612         do {
  613                 ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
  614                 ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
  615                 ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
  616                 ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
  617                 ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
  618                 ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
  619                 ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
  620                 ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
  621         } while (j < 16);
  622 
  623         /* Now for the remaining rounds up to 79: */
  624         do {
  625                 ROUND512(a,b,c,d,e,f,g,h);
  626                 ROUND512(h,a,b,c,d,e,f,g);
  627                 ROUND512(g,h,a,b,c,d,e,f);
  628                 ROUND512(f,g,h,a,b,c,d,e);
  629                 ROUND512(e,f,g,h,a,b,c,d);
  630                 ROUND512(d,e,f,g,h,a,b,c);
  631                 ROUND512(c,d,e,f,g,h,a,b);
  632                 ROUND512(b,c,d,e,f,g,h,a);
  633         } while (j < 80);
  634 
  635         /* Compute the current intermediate hash value */
  636         context->state[0] += a;
  637         context->state[1] += b;
  638         context->state[2] += c;
  639         context->state[3] += d;
  640         context->state[4] += e;
  641         context->state[5] += f;
  642         context->state[6] += g;
  643         context->state[7] += h;
  644 
  645         /* Clean up */
  646         a = b = c = d = e = f = g = h = T1 = 0;
  647 }
  648 
  649 #else /* SHA2_UNROLL_TRANSFORM */
  650 
  651 void
  652 SHA512_Transform(SHA512_CTX *context, const u_int8_t *data)
  653 {
  654         u_int64_t       a, b, c, d, e, f, g, h, s0, s1;
  655         u_int64_t       T1, T2, *W512 = (u_int64_t *)context->buffer;
  656         int             j;
  657 
  658         /* Initialize registers with the prev. intermediate value */
  659         a = context->state[0];
  660         b = context->state[1];
  661         c = context->state[2];
  662         d = context->state[3];
  663         e = context->state[4];
  664         f = context->state[5];
  665         g = context->state[6];
  666         h = context->state[7];
  667 
  668         j = 0;
  669         do {
  670                 W512[j] = (u_int64_t)data[7] | ((u_int64_t)data[6] << 8) |
  671                     ((u_int64_t)data[5] << 16) | ((u_int64_t)data[4] << 24) |
  672                     ((u_int64_t)data[3] << 32) | ((u_int64_t)data[2] << 40) |
  673                     ((u_int64_t)data[1] << 48) | ((u_int64_t)data[0] << 56);
  674                 data += 8;
  675                 /* Apply the SHA-512 compression function to update a..h */
  676                 T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
  677                 T2 = Sigma0_512(a) + Maj(a, b, c);
  678                 h = g;
  679                 g = f;
  680                 f = e;
  681                 e = d + T1;
  682                 d = c;
  683                 c = b;
  684                 b = a;
  685                 a = T1 + T2;
  686 
  687                 j++;
  688         } while (j < 16);
  689 
  690         do {
  691                 /* Part of the message block expansion: */
  692                 s0 = W512[(j+1)&0x0f];
  693                 s0 = sigma0_512(s0);
  694                 s1 = W512[(j+14)&0x0f];
  695                 s1 =  sigma1_512(s1);
  696 
  697                 /* Apply the SHA-512 compression function to update a..h */
  698                 T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
  699                      (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
  700                 T2 = Sigma0_512(a) + Maj(a, b, c);
  701                 h = g;
  702                 g = f;
  703                 f = e;
  704                 e = d + T1;
  705                 d = c;
  706                 c = b;
  707                 b = a;
  708                 a = T1 + T2;
  709 
  710                 j++;
  711         } while (j < 80);
  712 
  713         /* Compute the current intermediate hash value */
  714         context->state[0] += a;
  715         context->state[1] += b;
  716         context->state[2] += c;
  717         context->state[3] += d;
  718         context->state[4] += e;
  719         context->state[5] += f;
  720         context->state[6] += g;
  721         context->state[7] += h;
  722 
  723         /* Clean up */
  724         a = b = c = d = e = f = g = h = T1 = T2 = 0;
  725 }
  726 
  727 #endif /* SHA2_UNROLL_TRANSFORM */
  728 
  729 void
  730 SHA512_Update(SHA512_CTX *context, const u_int8_t *data, size_t len)
  731 {
  732         size_t  freespace, usedspace;
  733 
  734         /* Calling with no data is valid (we do nothing) */
  735         if (len == 0)
  736                 return;
  737 
  738         usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
  739         if (usedspace > 0) {
  740                 /* Calculate how much free space is available in the buffer */
  741                 freespace = SHA512_BLOCK_LENGTH - usedspace;
  742 
  743                 if (len >= freespace) {
  744                         /* Fill the buffer completely and process it */
  745                         bcopy(data, &context->buffer[usedspace], freespace);
  746                         ADDINC128(context->bitcount, freespace << 3);
  747                         len -= freespace;
  748                         data += freespace;
  749                         SHA512_Transform(context, context->buffer);
  750                 } else {
  751                         /* The buffer is not yet full */
  752                         bcopy(data, &context->buffer[usedspace], len);
  753                         ADDINC128(context->bitcount, len << 3);
  754                         /* Clean up: */
  755                         usedspace = freespace = 0;
  756                         return;
  757                 }
  758         }
  759         while (len >= SHA512_BLOCK_LENGTH) {
  760                 /* Process as many complete blocks as we can */
  761                 SHA512_Transform(context, data);
  762                 ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
  763                 len -= SHA512_BLOCK_LENGTH;
  764                 data += SHA512_BLOCK_LENGTH;
  765         }
  766         if (len > 0) {
  767                 /* There's left-overs, so save 'em */
  768                 bcopy(data, context->buffer, len);
  769                 ADDINC128(context->bitcount, len << 3);
  770         }
  771         /* Clean up: */
  772         usedspace = freespace = 0;
  773 }
  774 
  775 void
  776 SHA512_Last(SHA512_CTX *context)
  777 {
  778         unsigned int    usedspace;
  779 
  780         usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
  781 #if BYTE_ORDER == LITTLE_ENDIAN
  782         /* Convert FROM host byte order */
  783         REVERSE64(context->bitcount[0],context->bitcount[0]);
  784         REVERSE64(context->bitcount[1],context->bitcount[1]);
  785 #endif
  786         if (usedspace > 0) {
  787                 /* Begin padding with a 1 bit: */
  788                 context->buffer[usedspace++] = 0x80;
  789 
  790                 if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
  791                         /* Set-up for the last transform: */
  792                         bzero(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
  793                 } else {
  794                         if (usedspace < SHA512_BLOCK_LENGTH) {
  795                                 bzero(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
  796                         }
  797                         /* Do second-to-last transform: */
  798                         SHA512_Transform(context, context->buffer);
  799 
  800                         /* And set-up for the last transform: */
  801                         bzero(context->buffer, SHA512_BLOCK_LENGTH - 2);
  802                 }
  803         } else {
  804                 /* Prepare for final transform: */
  805                 bzero(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
  806 
  807                 /* Begin padding with a 1 bit: */
  808                 *context->buffer = 0x80;
  809         }
  810         /* Store the length of input data (in bits): */
  811         *(u_int64_t *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
  812         *(u_int64_t *)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
  813 
  814         /* Final transform: */
  815         SHA512_Transform(context, context->buffer);
  816 }
  817 
  818 void
  819 SHA512_Final(u_int8_t digest[], SHA512_CTX *context)
  820 {
  821         u_int64_t       *d = (u_int64_t *)digest;
  822 
  823         /* If no digest buffer is passed, we don't bother doing this: */
  824         if (digest != NULL) {
  825                 SHA512_Last(context);
  826 
  827                 /* Save the hash data for output: */
  828 #if BYTE_ORDER == LITTLE_ENDIAN
  829                 {
  830                         /* Convert TO host byte order */
  831                         int     j;
  832                         for (j = 0; j < 8; j++) {
  833                                 REVERSE64(context->state[j],context->state[j]);
  834                                 *d++ = context->state[j];
  835                         }
  836                 }
  837 #else
  838                 bcopy(context->state, d, SHA512_DIGEST_LENGTH);
  839 #endif
  840         }
  841 
  842         /* Zero out state data */
  843         bzero(context, sizeof(*context));
  844 }
  845 
  846 
  847 /*** SHA-384: *********************************************************/
  848 void
  849 SHA384_Init(SHA384_CTX *context)
  850 {
  851         if (context == NULL)
  852                 return;
  853         bcopy(sha384_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
  854         bzero(context->buffer, SHA384_BLOCK_LENGTH);
  855         context->bitcount[0] = context->bitcount[1] = 0;
  856 }
  857 
  858 void
  859 SHA384_Update(SHA384_CTX *context, const u_int8_t *data, size_t len)
  860 {
  861         SHA512_Update((SHA512_CTX *)context, data, len);
  862 }
  863 
  864 void
  865 SHA384_Final(u_int8_t digest[], SHA384_CTX *context)
  866 {
  867         u_int64_t       *d = (u_int64_t *)digest;
  868 
  869         /* If no digest buffer is passed, we don't bother doing this: */
  870         if (digest != NULL) {
  871                 SHA512_Last((SHA512_CTX *)context);
  872 
  873                 /* Save the hash data for output: */
  874 #if BYTE_ORDER == LITTLE_ENDIAN
  875                 {
  876                         /* Convert TO host byte order */
  877                         int     j;
  878                         for (j = 0; j < 6; j++) {
  879                                 REVERSE64(context->state[j],context->state[j]);
  880                                 *d++ = context->state[j];
  881                         }
  882                 }
  883 #else
  884                 bcopy(context->state, d, SHA384_DIGEST_LENGTH);
  885 #endif
  886         }
  887 
  888         /* Zero out state data */
  889         bzero(context, sizeof(*context));
  890 }

/* [<][>][^][v][top][bottom][index][help] */