Home | History | Annotate | Download | only in crc
      1 /*
      2  * Cryptographic API.
      3  *
      4  * SHA-256, as specified in
      5  * http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf
      6  *
      7  * SHA-256 code by Jean-Luc Cooke <jlcooke (at) certainkey.com>.
      8  *
      9  * Copyright (c) Jean-Luc Cooke <jlcooke (at) certainkey.com>
     10  * Copyright (c) Andrew McDonald <andrew (at) mcdonald.org.uk>
     11  * Copyright (c) 2002 James Morris <jmorris (at) intercode.com.au>
     12  *
     13  * This program is free software; you can redistribute it and/or modify it
     14  * under the terms of the GNU General Public License as published by the Free
     15  * Software Foundation; either version 2 of the License, or (at your option)
     16  * any later version.
     17  *
     18  */
     19 #include <string.h>
     20 #include <inttypes.h>
     21 
     22 #include "../lib/bswap.h"
     23 #include "sha256.h"
     24 
     25 #define SHA256_DIGEST_SIZE	32
     26 #define SHA256_HMAC_BLOCK_SIZE	64
     27 
     28 static inline uint32_t Ch(uint32_t x, uint32_t y, uint32_t z)
     29 {
     30 	return z ^ (x & (y ^ z));
     31 }
     32 
     33 static inline uint32_t Maj(uint32_t x, uint32_t y, uint32_t z)
     34 {
     35 	return (x & y) | (z & (x | y));
     36 }
     37 
     38 #define e0(x)       (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22))
     39 #define e1(x)       (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25))
     40 #define s0(x)       (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3))
     41 #define s1(x)       (ror32(x,17) ^ ror32(x,19) ^ (x >> 10))
     42 
     43 #define H0         0x6a09e667
     44 #define H1         0xbb67ae85
     45 #define H2         0x3c6ef372
     46 #define H3         0xa54ff53a
     47 #define H4         0x510e527f
     48 #define H5         0x9b05688c
     49 #define H6         0x1f83d9ab
     50 #define H7         0x5be0cd19
     51 
     52 static inline uint32_t ror32(uint32_t word, unsigned int shift)
     53 {
     54 	 return (word >> shift) | (word << (32 - shift));
     55 }
     56 
     57 static inline void LOAD_OP(int I, uint32_t *W, const uint8_t *input)
     58 {
     59 	W[I] = __be32_to_cpu(((uint32_t *)(input))[I]);
     60 }
     61 
     62 static inline void BLEND_OP(int I, uint32_t *W)
     63 {
     64 	W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
     65 }
     66 
     67 static void sha256_transform(uint32_t *state, const uint8_t *input)
     68 {
     69 	uint32_t a, b, c, d, e, f, g, h, t1, t2;
     70 	uint32_t W[64];
     71 	int i;
     72 
     73 	/* load the input */
     74 	for (i = 0; i < 16; i++)
     75 		LOAD_OP(i, W, input);
     76 
     77 	/* now blend */
     78 	for (i = 16; i < 64; i++)
     79 		BLEND_OP(i, W);
     80 
     81 	/* load the state into our registers */
     82 	a=state[0];  b=state[1];  c=state[2];  d=state[3];
     83 	e=state[4];  f=state[5];  g=state[6];  h=state[7];
     84 
     85 	/* now iterate */
     86 	t1 = h + e1(e) + Ch(e,f,g) + 0x428a2f98 + W[ 0];
     87 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
     88 	t1 = g + e1(d) + Ch(d,e,f) + 0x71374491 + W[ 1];
     89 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
     90 	t1 = f + e1(c) + Ch(c,d,e) + 0xb5c0fbcf + W[ 2];
     91 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
     92 	t1 = e + e1(b) + Ch(b,c,d) + 0xe9b5dba5 + W[ 3];
     93 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
     94 	t1 = d + e1(a) + Ch(a,b,c) + 0x3956c25b + W[ 4];
     95 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
     96 	t1 = c + e1(h) + Ch(h,a,b) + 0x59f111f1 + W[ 5];
     97 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
     98 	t1 = b + e1(g) + Ch(g,h,a) + 0x923f82a4 + W[ 6];
     99 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    100 	t1 = a + e1(f) + Ch(f,g,h) + 0xab1c5ed5 + W[ 7];
    101 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    102 
    103 	t1 = h + e1(e) + Ch(e,f,g) + 0xd807aa98 + W[ 8];
    104 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    105 	t1 = g + e1(d) + Ch(d,e,f) + 0x12835b01 + W[ 9];
    106 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    107 	t1 = f + e1(c) + Ch(c,d,e) + 0x243185be + W[10];
    108 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    109 	t1 = e + e1(b) + Ch(b,c,d) + 0x550c7dc3 + W[11];
    110 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    111 	t1 = d + e1(a) + Ch(a,b,c) + 0x72be5d74 + W[12];
    112 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    113 	t1 = c + e1(h) + Ch(h,a,b) + 0x80deb1fe + W[13];
    114 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    115 	t1 = b + e1(g) + Ch(g,h,a) + 0x9bdc06a7 + W[14];
    116 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    117 	t1 = a + e1(f) + Ch(f,g,h) + 0xc19bf174 + W[15];
    118 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    119 
    120 	t1 = h + e1(e) + Ch(e,f,g) + 0xe49b69c1 + W[16];
    121 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    122 	t1 = g + e1(d) + Ch(d,e,f) + 0xefbe4786 + W[17];
    123 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    124 	t1 = f + e1(c) + Ch(c,d,e) + 0x0fc19dc6 + W[18];
    125 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    126 	t1 = e + e1(b) + Ch(b,c,d) + 0x240ca1cc + W[19];
    127 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    128 	t1 = d + e1(a) + Ch(a,b,c) + 0x2de92c6f + W[20];
    129 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    130 	t1 = c + e1(h) + Ch(h,a,b) + 0x4a7484aa + W[21];
    131 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    132 	t1 = b + e1(g) + Ch(g,h,a) + 0x5cb0a9dc + W[22];
    133 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    134 	t1 = a + e1(f) + Ch(f,g,h) + 0x76f988da + W[23];
    135 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    136 
    137 	t1 = h + e1(e) + Ch(e,f,g) + 0x983e5152 + W[24];
    138 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    139 	t1 = g + e1(d) + Ch(d,e,f) + 0xa831c66d + W[25];
    140 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    141 	t1 = f + e1(c) + Ch(c,d,e) + 0xb00327c8 + W[26];
    142 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    143 	t1 = e + e1(b) + Ch(b,c,d) + 0xbf597fc7 + W[27];
    144 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    145 	t1 = d + e1(a) + Ch(a,b,c) + 0xc6e00bf3 + W[28];
    146 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    147 	t1 = c + e1(h) + Ch(h,a,b) + 0xd5a79147 + W[29];
    148 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    149 	t1 = b + e1(g) + Ch(g,h,a) + 0x06ca6351 + W[30];
    150 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    151 	t1 = a + e1(f) + Ch(f,g,h) + 0x14292967 + W[31];
    152 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    153 
    154 	t1 = h + e1(e) + Ch(e,f,g) + 0x27b70a85 + W[32];
    155 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    156 	t1 = g + e1(d) + Ch(d,e,f) + 0x2e1b2138 + W[33];
    157 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    158 	t1 = f + e1(c) + Ch(c,d,e) + 0x4d2c6dfc + W[34];
    159 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    160 	t1 = e + e1(b) + Ch(b,c,d) + 0x53380d13 + W[35];
    161 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    162 	t1 = d + e1(a) + Ch(a,b,c) + 0x650a7354 + W[36];
    163 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    164 	t1 = c + e1(h) + Ch(h,a,b) + 0x766a0abb + W[37];
    165 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    166 	t1 = b + e1(g) + Ch(g,h,a) + 0x81c2c92e + W[38];
    167 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    168 	t1 = a + e1(f) + Ch(f,g,h) + 0x92722c85 + W[39];
    169 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    170 
    171 	t1 = h + e1(e) + Ch(e,f,g) + 0xa2bfe8a1 + W[40];
    172 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    173 	t1 = g + e1(d) + Ch(d,e,f) + 0xa81a664b + W[41];
    174 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    175 	t1 = f + e1(c) + Ch(c,d,e) + 0xc24b8b70 + W[42];
    176 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    177 	t1 = e + e1(b) + Ch(b,c,d) + 0xc76c51a3 + W[43];
    178 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    179 	t1 = d + e1(a) + Ch(a,b,c) + 0xd192e819 + W[44];
    180 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    181 	t1 = c + e1(h) + Ch(h,a,b) + 0xd6990624 + W[45];
    182 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    183 	t1 = b + e1(g) + Ch(g,h,a) + 0xf40e3585 + W[46];
    184 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    185 	t1 = a + e1(f) + Ch(f,g,h) + 0x106aa070 + W[47];
    186 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    187 
    188 	t1 = h + e1(e) + Ch(e,f,g) + 0x19a4c116 + W[48];
    189 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    190 	t1 = g + e1(d) + Ch(d,e,f) + 0x1e376c08 + W[49];
    191 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    192 	t1 = f + e1(c) + Ch(c,d,e) + 0x2748774c + W[50];
    193 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    194 	t1 = e + e1(b) + Ch(b,c,d) + 0x34b0bcb5 + W[51];
    195 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    196 	t1 = d + e1(a) + Ch(a,b,c) + 0x391c0cb3 + W[52];
    197 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    198 	t1 = c + e1(h) + Ch(h,a,b) + 0x4ed8aa4a + W[53];
    199 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    200 	t1 = b + e1(g) + Ch(g,h,a) + 0x5b9cca4f + W[54];
    201 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    202 	t1 = a + e1(f) + Ch(f,g,h) + 0x682e6ff3 + W[55];
    203 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    204 
    205 	t1 = h + e1(e) + Ch(e,f,g) + 0x748f82ee + W[56];
    206 	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
    207 	t1 = g + e1(d) + Ch(d,e,f) + 0x78a5636f + W[57];
    208 	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
    209 	t1 = f + e1(c) + Ch(c,d,e) + 0x84c87814 + W[58];
    210 	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
    211 	t1 = e + e1(b) + Ch(b,c,d) + 0x8cc70208 + W[59];
    212 	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
    213 	t1 = d + e1(a) + Ch(a,b,c) + 0x90befffa + W[60];
    214 	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
    215 	t1 = c + e1(h) + Ch(h,a,b) + 0xa4506ceb + W[61];
    216 	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
    217 	t1 = b + e1(g) + Ch(g,h,a) + 0xbef9a3f7 + W[62];
    218 	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
    219 	t1 = a + e1(f) + Ch(f,g,h) + 0xc67178f2 + W[63];
    220 	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
    221 
    222 	state[0] += a; state[1] += b; state[2] += c; state[3] += d;
    223 	state[4] += e; state[5] += f; state[6] += g; state[7] += h;
    224 
    225 	/* clear any sensitive info... */
    226 	a = b = c = d = e = f = g = h = t1 = t2 = 0;
    227 	memset(W, 0, 64 * sizeof(uint32_t));
    228 }
    229 
    230 void fio_sha256_init(struct fio_sha256_ctx *sctx)
    231 {
    232 	sctx->state[0] = H0;
    233 	sctx->state[1] = H1;
    234 	sctx->state[2] = H2;
    235 	sctx->state[3] = H3;
    236 	sctx->state[4] = H4;
    237 	sctx->state[5] = H5;
    238 	sctx->state[6] = H6;
    239 	sctx->state[7] = H7;
    240 	sctx->count = 0;
    241 }
    242 
    243 void fio_sha256_update(struct fio_sha256_ctx *sctx, const uint8_t *data,
    244 		       unsigned int len)
    245 {
    246 	unsigned int partial, done;
    247 	const uint8_t *src;
    248 
    249 	partial = sctx->count & 0x3f;
    250 	sctx->count += len;
    251 	done = 0;
    252 	src = data;
    253 
    254 	if ((partial + len) > 63) {
    255 		if (partial) {
    256 			done = -partial;
    257 			memcpy(sctx->buf + partial, data, done + 64);
    258 			src = sctx->buf;
    259 		}
    260 
    261 		do {
    262 			sha256_transform(sctx->state, src);
    263 			done += 64;
    264 			src = data + done;
    265 		} while (done + 63 < len);
    266 
    267 		partial = 0;
    268 	}
    269 	memcpy(sctx->buf + partial, src, len - done);
    270 }
    271 
    272 void fio_sha256_final(struct fio_sha256_ctx *sctx)
    273 {
    274 	uint64_t bits;
    275 	unsigned int index, pad_len;
    276 	int i;
    277 	static const uint8_t padding[64] = { 0x80, };
    278 
    279 	/* Save number of bits */
    280 	bits = (uint64_t) sctx->count << 3;
    281 
    282 	/* Pad out to 56 mod 64. */
    283 	index = sctx->count & 0x3f;
    284 	pad_len = (index < 56) ? (56 - index) : ((64+56) - index);
    285 	fio_sha256_update(sctx, padding, pad_len);
    286 
    287 	/* Append length (before padding) */
    288 	fio_sha256_update(sctx, (const uint8_t *)&bits, sizeof(bits));
    289 
    290 	/* Store state in digest */
    291 	for (i = 0; i < 8; i++)
    292 		sctx->buf[i] = sctx->state[i];
    293 }
    294