2 * SHA-256 hash implementation and interface functions
3 * Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
23 * hmac_sha256_vector - HMAC-SHA256 over data vector (RFC 2104)
24 * @key: Key for HMAC operations
25 * @key_len: Length of the key in bytes
26 * @num_elem: Number of elements in the data vector
27 * @addr: Pointers to the data areas
28 * @len: Lengths of the data blocks
29 * @mac: Buffer for the hash (32 bytes)
31 void hmac_sha256_vector(const u8
*key
, size_t key_len
, size_t num_elem
,
32 const u8
*addr
[], const size_t *len
, u8
*mac
)
34 unsigned char k_pad
[64]; /* padding - key XORd with ipad/opad */
41 * Fixed limit on the number of fragments to avoid having to
42 * allocate memory (which could fail).
47 /* if key is longer than 64 bytes reset it to key = SHA256(key) */
49 sha256_vector(1, &key
, &key_len
, tk
);
54 /* the HMAC_SHA256 transform looks like:
56 * SHA256(K XOR opad, SHA256(K XOR ipad, text))
58 * where K is an n byte key
59 * ipad is the byte 0x36 repeated 64 times
60 * opad is the byte 0x5c repeated 64 times
61 * and text is the data being protected */
63 /* start out by storing key in ipad */
64 memset(k_pad
, 0, sizeof(k_pad
));
65 memcpy(k_pad
, key
, key_len
);
66 /* XOR key with ipad values */
67 for (i
= 0; i
< 64; i
++)
70 /* perform inner SHA256 */
73 for (i
= 0; i
< num_elem
; i
++) {
74 _addr
[i
+ 1] = addr
[i
];
77 sha256_vector(1 + num_elem
, _addr
, _len
, mac
);
79 memset(k_pad
, 0, sizeof(k_pad
));
80 memcpy(k_pad
, key
, key_len
);
81 /* XOR key with opad values */
82 for (i
= 0; i
< 64; i
++)
85 /* perform outer SHA256 */
89 _len
[1] = SHA256_MAC_LEN
;
90 sha256_vector(2, _addr
, _len
, mac
);
95 * hmac_sha256 - HMAC-SHA256 over data buffer (RFC 2104)
96 * @key: Key for HMAC operations
97 * @key_len: Length of the key in bytes
98 * @data: Pointers to the data area
99 * @data_len: Length of the data area
100 * @mac: Buffer for the hash (20 bytes)
102 void hmac_sha256(const u8
*key
, size_t key_len
, const u8
*data
,
103 size_t data_len
, u8
*mac
)
105 hmac_sha256_vector(key
, key_len
, 1, &data
, &data_len
, mac
);
110 * sha256_prf - SHA256-based Pseudo-Random Function (IEEE 802.11r, 8.5A.3)
112 * @key_len: Length of the key in bytes
113 * @label: A unique label for each purpose of the PRF
114 * @data: Extra data to bind into the key
115 * @data_len: Length of the data
116 * @buf: Buffer for the generated pseudo-random key
117 * @buf_len: Number of bytes of key to generate
119 * This function is used to derive new, cryptographically separate keys from a
122 void sha256_prf(const u8
*key
, size_t key_len
, const char *label
,
123 const u8
*data
, size_t data_len
, u8
*buf
, size_t buf_len
)
127 u8 hash
[SHA256_MAC_LEN
];
132 addr
[0] = counter_le
;
134 addr
[1] = (u8
*) label
;
135 len
[1] = strlen(label
) + 1;
140 while (pos
< buf_len
) {
141 plen
= buf_len
- pos
;
142 WPA_PUT_LE16(counter_le
, counter
);
143 if (plen
>= SHA256_MAC_LEN
) {
144 hmac_sha256_vector(key
, key_len
, 3, addr
, len
,
146 pos
+= SHA256_MAC_LEN
;
148 hmac_sha256_vector(key
, key_len
, 3, addr
, len
, hash
);
149 memcpy(&buf
[pos
], hash
, plen
);
157 #ifdef INTERNAL_SHA256
159 struct sha256_state
{
161 u32 state
[8], curlen
;
165 static void sha256_init(struct sha256_state
*md
);
166 static int sha256_process(struct sha256_state
*md
, const unsigned char *in
,
167 unsigned long inlen
);
168 static int sha256_done(struct sha256_state
*md
, unsigned char *out
);
172 * sha256_vector - SHA256 hash for data vector
173 * @num_elem: Number of elements in the data vector
174 * @addr: Pointers to the data areas
175 * @len: Lengths of the data blocks
176 * @mac: Buffer for the hash
178 void sha256_vector(size_t num_elem
, const u8
*addr
[], const size_t *len
,
181 struct sha256_state ctx
;
185 for (i
= 0; i
< num_elem
; i
++)
186 sha256_process(&ctx
, addr
[i
], len
[i
]);
187 sha256_done(&ctx
, mac
);
191 /* ===== start - public domain SHA256 implementation ===== */
193 /* This is based on SHA256 implementation in LibTomCrypt that was released into
194 * public domain by Tom St Denis. */
197 static const unsigned long K
[64] = {
198 0x428a2f98UL
, 0x71374491UL
, 0xb5c0fbcfUL
, 0xe9b5dba5UL
, 0x3956c25bUL
,
199 0x59f111f1UL
, 0x923f82a4UL
, 0xab1c5ed5UL
, 0xd807aa98UL
, 0x12835b01UL
,
200 0x243185beUL
, 0x550c7dc3UL
, 0x72be5d74UL
, 0x80deb1feUL
, 0x9bdc06a7UL
,
201 0xc19bf174UL
, 0xe49b69c1UL
, 0xefbe4786UL
, 0x0fc19dc6UL
, 0x240ca1ccUL
,
202 0x2de92c6fUL
, 0x4a7484aaUL
, 0x5cb0a9dcUL
, 0x76f988daUL
, 0x983e5152UL
,
203 0xa831c66dUL
, 0xb00327c8UL
, 0xbf597fc7UL
, 0xc6e00bf3UL
, 0xd5a79147UL
,
204 0x06ca6351UL
, 0x14292967UL
, 0x27b70a85UL
, 0x2e1b2138UL
, 0x4d2c6dfcUL
,
205 0x53380d13UL
, 0x650a7354UL
, 0x766a0abbUL
, 0x81c2c92eUL
, 0x92722c85UL
,
206 0xa2bfe8a1UL
, 0xa81a664bUL
, 0xc24b8b70UL
, 0xc76c51a3UL
, 0xd192e819UL
,
207 0xd6990624UL
, 0xf40e3585UL
, 0x106aa070UL
, 0x19a4c116UL
, 0x1e376c08UL
,
208 0x2748774cUL
, 0x34b0bcb5UL
, 0x391c0cb3UL
, 0x4ed8aa4aUL
, 0x5b9cca4fUL
,
209 0x682e6ff3UL
, 0x748f82eeUL
, 0x78a5636fUL
, 0x84c87814UL
, 0x8cc70208UL
,
210 0x90befffaUL
, 0xa4506cebUL
, 0xbef9a3f7UL
, 0xc67178f2UL
214 /* Various logical functions */
216 ( ((((unsigned long) (x) & 0xFFFFFFFFUL) >> (unsigned long) ((y) & 31)) | \
217 ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
218 #define Ch(x,y,z) (z ^ (x & (y ^ z)))
219 #define Maj(x,y,z) (((x | y) & z) | (x & y))
220 #define S(x, n) RORc((x), (n))
221 #define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))
222 #define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))
223 #define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))
224 #define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))
225 #define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))
227 #define MIN(x, y) (((x) < (y)) ? (x) : (y))
230 /* compress 512-bits */
231 static int sha256_compress(struct sha256_state
*md
, unsigned char *buf
)
233 u32 S
[8], W
[64], t0
, t1
;
237 /* copy state into S */
238 for (i
= 0; i
< 8; i
++) {
242 /* copy the state into 512-bits into W[0..15] */
243 for (i
= 0; i
< 16; i
++)
244 W
[i
] = WPA_GET_BE32(buf
+ (4 * i
));
247 for (i
= 16; i
< 64; i
++) {
248 W
[i
] = Gamma1(W
[i
- 2]) + W
[i
- 7] + Gamma0(W
[i
- 15]) +
253 #define RND(a,b,c,d,e,f,g,h,i) \
254 t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \
255 t1 = Sigma0(a) + Maj(a, b, c); \
259 for (i
= 0; i
< 64; ++i
) {
260 RND(S
[0], S
[1], S
[2], S
[3], S
[4], S
[5], S
[6], S
[7], i
);
261 t
= S
[7]; S
[7] = S
[6]; S
[6] = S
[5]; S
[5] = S
[4];
262 S
[4] = S
[3]; S
[3] = S
[2]; S
[2] = S
[1]; S
[1] = S
[0]; S
[0] = t
;
266 for (i
= 0; i
< 8; i
++) {
267 md
->state
[i
] = md
->state
[i
] + S
[i
];
273 /* Initialize the hash state */
274 static void sha256_init(struct sha256_state
*md
)
278 md
->state
[0] = 0x6A09E667UL
;
279 md
->state
[1] = 0xBB67AE85UL
;
280 md
->state
[2] = 0x3C6EF372UL
;
281 md
->state
[3] = 0xA54FF53AUL
;
282 md
->state
[4] = 0x510E527FUL
;
283 md
->state
[5] = 0x9B05688CUL
;
284 md
->state
[6] = 0x1F83D9ABUL
;
285 md
->state
[7] = 0x5BE0CD19UL
;
289 Process a block of memory though the hash
290 @param md The hash state
291 @param in The data to hash
292 @param inlen The length of the data (octets)
293 @return CRYPT_OK if successful
295 static int sha256_process(struct sha256_state
*md
, const unsigned char *in
,
299 #define block_size 64
301 if (md
->curlen
> sizeof(md
->buf
))
305 if (md
->curlen
== 0 && inlen
>= block_size
) {
306 if (sha256_compress(md
, (unsigned char *) in
) < 0)
308 md
->length
+= block_size
* 8;
312 n
= MIN(inlen
, (block_size
- md
->curlen
));
313 memcpy(md
->buf
+ md
->curlen
, in
, n
);
317 if (md
->curlen
== block_size
) {
318 if (sha256_compress(md
, md
->buf
) < 0)
320 md
->length
+= 8 * block_size
;
331 Terminate the hash to get the digest
332 @param md The hash state
333 @param out [out] The destination of the hash (32 bytes)
334 @return CRYPT_OK if successful
336 static int sha256_done(struct sha256_state
*md
, unsigned char *out
)
340 if (md
->curlen
>= sizeof(md
->buf
))
343 /* increase the length of the message */
344 md
->length
+= md
->curlen
* 8;
346 /* append the '1' bit */
347 md
->buf
[md
->curlen
++] = (unsigned char) 0x80;
349 /* if the length is currently above 56 bytes we append zeros
350 * then compress. Then we can fall back to padding zeros and length
351 * encoding like normal.
353 if (md
->curlen
> 56) {
354 while (md
->curlen
< 64) {
355 md
->buf
[md
->curlen
++] = (unsigned char) 0;
357 sha256_compress(md
, md
->buf
);
361 /* pad upto 56 bytes of zeroes */
362 while (md
->curlen
< 56) {
363 md
->buf
[md
->curlen
++] = (unsigned char) 0;
367 WPA_PUT_BE64(md
->buf
+ 56, md
->length
);
368 sha256_compress(md
, md
->buf
);
371 for (i
= 0; i
< 8; i
++)
372 WPA_PUT_BE32(out
+ (4 * i
), md
->state
[i
]);
377 /* ===== end - public domain SHA256 implementation ===== */
379 #endif /* INTERNAL_SHA256 */