Home | History | Annotate | Download | only in sha
      1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      2  * All rights reserved.
      3  *
      4  * This package is an SSL implementation written
      5  * by Eric Young (eay (at) cryptsoft.com).
      6  * The implementation was written so as to conform with Netscapes SSL.
      7  *
      8  * This library is free for commercial and non-commercial use as long as
      9  * the following conditions are aheared to.  The following conditions
     10  * apply to all code found in this distribution, be it the RC4, RSA,
     11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     12  * included with this distribution is covered by the same copyright terms
     13  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     14  *
     15  * Copyright remains Eric Young's, and as such any Copyright notices in
     16  * the code are not to be removed.
     17  * If this package is used in a product, Eric Young should be given attribution
     18  * as the author of the parts of the library used.
     19  * This can be in the form of a textual message at program startup or
     20  * in documentation (online or textual) provided with the package.
     21  *
     22  * Redistribution and use in source and binary forms, with or without
     23  * modification, are permitted provided that the following conditions
     24  * are met:
     25  * 1. Redistributions of source code must retain the copyright
     26  *    notice, this list of conditions and the following disclaimer.
     27  * 2. Redistributions in binary form must reproduce the above copyright
     28  *    notice, this list of conditions and the following disclaimer in the
     29  *    documentation and/or other materials provided with the distribution.
     30  * 3. All advertising materials mentioning features or use of this software
     31  *    must display the following acknowledgement:
     32  *    "This product includes cryptographic software written by
     33  *     Eric Young (eay (at) cryptsoft.com)"
     34  *    The word 'cryptographic' can be left out if the rouines from the library
     35  *    being used are not cryptographic related :-).
     36  * 4. If you include any Windows specific code (or a derivative thereof) from
     37  *    the apps directory (application code) you must include an acknowledgement:
     38  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     39  *
     40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     50  * SUCH DAMAGE.
     51  *
     52  * The licence and distribution terms for any publically available version or
     53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     54  * copied and put under another distribution licence
     55  * [including the GNU Public Licence.] */
     56 
     57 #include <openssl/sha.h>
     58 
     59 #include <string.h>
     60 
     61 #include <openssl/mem.h>
     62 
     63 #include "../internal.h"
     64 
     65 
     66 #if !defined(OPENSSL_NO_ASM) &&                         \
     67     (defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
     68      defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))
     69 #define SHA256_ASM
     70 #endif
     71 
     72 int SHA224_Init(SHA256_CTX *sha) {
     73   OPENSSL_memset(sha, 0, sizeof(SHA256_CTX));
     74   sha->h[0] = 0xc1059ed8UL;
     75   sha->h[1] = 0x367cd507UL;
     76   sha->h[2] = 0x3070dd17UL;
     77   sha->h[3] = 0xf70e5939UL;
     78   sha->h[4] = 0xffc00b31UL;
     79   sha->h[5] = 0x68581511UL;
     80   sha->h[6] = 0x64f98fa7UL;
     81   sha->h[7] = 0xbefa4fa4UL;
     82   sha->md_len = SHA224_DIGEST_LENGTH;
     83   return 1;
     84 }
     85 
     86 int SHA256_Init(SHA256_CTX *sha) {
     87   OPENSSL_memset(sha, 0, sizeof(SHA256_CTX));
     88   sha->h[0] = 0x6a09e667UL;
     89   sha->h[1] = 0xbb67ae85UL;
     90   sha->h[2] = 0x3c6ef372UL;
     91   sha->h[3] = 0xa54ff53aUL;
     92   sha->h[4] = 0x510e527fUL;
     93   sha->h[5] = 0x9b05688cUL;
     94   sha->h[6] = 0x1f83d9abUL;
     95   sha->h[7] = 0x5be0cd19UL;
     96   sha->md_len = SHA256_DIGEST_LENGTH;
     97   return 1;
     98 }
     99 
    100 uint8_t *SHA224(const uint8_t *data, size_t len, uint8_t *out) {
    101   SHA256_CTX ctx;
    102   static uint8_t buf[SHA224_DIGEST_LENGTH];
    103 
    104   /* TODO(fork): remove this static buffer. */
    105   if (out == NULL) {
    106     out = buf;
    107   }
    108   SHA224_Init(&ctx);
    109   SHA224_Update(&ctx, data, len);
    110   SHA224_Final(out, &ctx);
    111   OPENSSL_cleanse(&ctx, sizeof(ctx));
    112   return out;
    113 }
    114 
    115 uint8_t *SHA256(const uint8_t *data, size_t len, uint8_t *out) {
    116   SHA256_CTX ctx;
    117   static uint8_t buf[SHA256_DIGEST_LENGTH];
    118 
    119   /* TODO(fork): remove this static buffer. */
    120   if (out == NULL) {
    121     out = buf;
    122   }
    123   SHA256_Init(&ctx);
    124   SHA256_Update(&ctx, data, len);
    125   SHA256_Final(out, &ctx);
    126   OPENSSL_cleanse(&ctx, sizeof(ctx));
    127   return out;
    128 }
    129 
    130 int SHA224_Update(SHA256_CTX *ctx, const void *data, size_t len) {
    131   return SHA256_Update(ctx, data, len);
    132 }
    133 
    134 int SHA224_Final(uint8_t *md, SHA256_CTX *ctx) {
    135   return SHA256_Final(md, ctx);
    136 }
    137 
    138 #define DATA_ORDER_IS_BIG_ENDIAN
    139 
    140 #define HASH_CTX SHA256_CTX
    141 #define HASH_CBLOCK 64
    142 
    143 /* Note that FIPS180-2 discusses "Truncation of the Hash Function Output."
    144  * default: case below covers for it. It's not clear however if it's permitted
    145  * to truncate to amount of bytes not divisible by 4. I bet not, but if it is,
    146  * then default: case shall be extended. For reference. Idea behind separate
    147  * cases for pre-defined lenghts is to let the compiler decide if it's
    148  * appropriate to unroll small loops.
    149  *
    150  * TODO(davidben): The small |md_len| case is one of the few places a low-level
    151  * hash 'final' function can fail. This should never happen. */
    152 #define HASH_MAKE_STRING(c, s)                              \
    153   do {                                                      \
    154     uint32_t ll;                                            \
    155     unsigned int nn;                                        \
    156     switch ((c)->md_len) {                                  \
    157       case SHA224_DIGEST_LENGTH:                            \
    158         for (nn = 0; nn < SHA224_DIGEST_LENGTH / 4; nn++) { \
    159           ll = (c)->h[nn];                                  \
    160           HOST_l2c(ll, (s));                                \
    161         }                                                   \
    162         break;                                              \
    163       case SHA256_DIGEST_LENGTH:                            \
    164         for (nn = 0; nn < SHA256_DIGEST_LENGTH / 4; nn++) { \
    165           ll = (c)->h[nn];                                  \
    166           HOST_l2c(ll, (s));                                \
    167         }                                                   \
    168         break;                                              \
    169       default:                                              \
    170         if ((c)->md_len > SHA256_DIGEST_LENGTH) {           \
    171           return 0;                                         \
    172         }                                                   \
    173         for (nn = 0; nn < (c)->md_len / 4; nn++) {          \
    174           ll = (c)->h[nn];                                  \
    175           HOST_l2c(ll, (s));                                \
    176         }                                                   \
    177         break;                                              \
    178     }                                                       \
    179   } while (0)
    180 
    181 
    182 #define HASH_UPDATE SHA256_Update
    183 #define HASH_TRANSFORM SHA256_Transform
    184 #define HASH_FINAL SHA256_Final
    185 #define HASH_BLOCK_DATA_ORDER sha256_block_data_order
    186 #ifndef SHA256_ASM
    187 static
    188 #endif
    189 void sha256_block_data_order(uint32_t *state, const uint8_t *in, size_t num);
    190 
    191 #include "../digest/md32_common.h"
    192 
    193 #ifndef SHA256_ASM
    194 static const uint32_t K256[64] = {
    195     0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
    196     0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
    197     0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL,
    198     0xc19bf174UL, 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
    199     0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, 0x983e5152UL,
    200     0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL,
    201     0x06ca6351UL, 0x14292967UL, 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL,
    202     0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
    203     0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL,
    204     0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, 0x19a4c116UL, 0x1e376c08UL,
    205     0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL,
    206     0x682e6ff3UL, 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
    207     0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL};
    208 
    209 #define ROTATE(a, n) (((a) << (n)) | ((a) >> (32 - (n))))
    210 
    211 /* FIPS specification refers to right rotations, while our ROTATE macro
    212  * is left one. This is why you might notice that rotation coefficients
    213  * differ from those observed in FIPS document by 32-N... */
    214 #define Sigma0(x) (ROTATE((x), 30) ^ ROTATE((x), 19) ^ ROTATE((x), 10))
    215 #define Sigma1(x) (ROTATE((x), 26) ^ ROTATE((x), 21) ^ ROTATE((x), 7))
    216 #define sigma0(x) (ROTATE((x), 25) ^ ROTATE((x), 14) ^ ((x) >> 3))
    217 #define sigma1(x) (ROTATE((x), 15) ^ ROTATE((x), 13) ^ ((x) >> 10))
    218 
    219 #define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
    220 #define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
    221 
    222 #define ROUND_00_15(i, a, b, c, d, e, f, g, h)   \
    223   do {                                           \
    224     T1 += h + Sigma1(e) + Ch(e, f, g) + K256[i]; \
    225     h = Sigma0(a) + Maj(a, b, c);                \
    226     d += T1;                                     \
    227     h += T1;                                     \
    228   } while (0)
    229 
    230 #define ROUND_16_63(i, a, b, c, d, e, f, g, h, X)      \
    231   do {                                                 \
    232     s0 = X[(i + 1) & 0x0f];                            \
    233     s0 = sigma0(s0);                                   \
    234     s1 = X[(i + 14) & 0x0f];                           \
    235     s1 = sigma1(s1);                                   \
    236     T1 = X[(i) & 0x0f] += s0 + s1 + X[(i + 9) & 0x0f]; \
    237     ROUND_00_15(i, a, b, c, d, e, f, g, h);            \
    238   } while (0)
    239 
    240 static void sha256_block_data_order(uint32_t *state, const uint8_t *data,
    241                                     size_t num) {
    242   uint32_t a, b, c, d, e, f, g, h, s0, s1, T1;
    243   uint32_t X[16];
    244   int i;
    245 
    246   while (num--) {
    247     a = state[0];
    248     b = state[1];
    249     c = state[2];
    250     d = state[3];
    251     e = state[4];
    252     f = state[5];
    253     g = state[6];
    254     h = state[7];
    255 
    256     uint32_t l;
    257 
    258     HOST_c2l(data, l);
    259     T1 = X[0] = l;
    260     ROUND_00_15(0, a, b, c, d, e, f, g, h);
    261     HOST_c2l(data, l);
    262     T1 = X[1] = l;
    263     ROUND_00_15(1, h, a, b, c, d, e, f, g);
    264     HOST_c2l(data, l);
    265     T1 = X[2] = l;
    266     ROUND_00_15(2, g, h, a, b, c, d, e, f);
    267     HOST_c2l(data, l);
    268     T1 = X[3] = l;
    269     ROUND_00_15(3, f, g, h, a, b, c, d, e);
    270     HOST_c2l(data, l);
    271     T1 = X[4] = l;
    272     ROUND_00_15(4, e, f, g, h, a, b, c, d);
    273     HOST_c2l(data, l);
    274     T1 = X[5] = l;
    275     ROUND_00_15(5, d, e, f, g, h, a, b, c);
    276     HOST_c2l(data, l);
    277     T1 = X[6] = l;
    278     ROUND_00_15(6, c, d, e, f, g, h, a, b);
    279     HOST_c2l(data, l);
    280     T1 = X[7] = l;
    281     ROUND_00_15(7, b, c, d, e, f, g, h, a);
    282     HOST_c2l(data, l);
    283     T1 = X[8] = l;
    284     ROUND_00_15(8, a, b, c, d, e, f, g, h);
    285     HOST_c2l(data, l);
    286     T1 = X[9] = l;
    287     ROUND_00_15(9, h, a, b, c, d, e, f, g);
    288     HOST_c2l(data, l);
    289     T1 = X[10] = l;
    290     ROUND_00_15(10, g, h, a, b, c, d, e, f);
    291     HOST_c2l(data, l);
    292     T1 = X[11] = l;
    293     ROUND_00_15(11, f, g, h, a, b, c, d, e);
    294     HOST_c2l(data, l);
    295     T1 = X[12] = l;
    296     ROUND_00_15(12, e, f, g, h, a, b, c, d);
    297     HOST_c2l(data, l);
    298     T1 = X[13] = l;
    299     ROUND_00_15(13, d, e, f, g, h, a, b, c);
    300     HOST_c2l(data, l);
    301     T1 = X[14] = l;
    302     ROUND_00_15(14, c, d, e, f, g, h, a, b);
    303     HOST_c2l(data, l);
    304     T1 = X[15] = l;
    305     ROUND_00_15(15, b, c, d, e, f, g, h, a);
    306 
    307     for (i = 16; i < 64; i += 8) {
    308       ROUND_16_63(i + 0, a, b, c, d, e, f, g, h, X);
    309       ROUND_16_63(i + 1, h, a, b, c, d, e, f, g, X);
    310       ROUND_16_63(i + 2, g, h, a, b, c, d, e, f, X);
    311       ROUND_16_63(i + 3, f, g, h, a, b, c, d, e, X);
    312       ROUND_16_63(i + 4, e, f, g, h, a, b, c, d, X);
    313       ROUND_16_63(i + 5, d, e, f, g, h, a, b, c, X);
    314       ROUND_16_63(i + 6, c, d, e, f, g, h, a, b, X);
    315       ROUND_16_63(i + 7, b, c, d, e, f, g, h, a, X);
    316     }
    317 
    318     state[0] += a;
    319     state[1] += b;
    320     state[2] += c;
    321     state[3] += d;
    322     state[4] += e;
    323     state[5] += f;
    324     state[6] += g;
    325     state[7] += h;
    326   }
    327 }
    328 
    329 #endif /* SHA256_ASM */
    330