scrypt 2.0.2 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/ext/scrypt/sha256.c CHANGED
@@ -1,66 +1,67 @@
1
- /*-
2
- * Copyright 2005,2007,2009 Colin Percival
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions
7
- * are met:
8
- * 1. Redistributions of source code must retain the above copyright
9
- * notice, this list of conditions and the following disclaimer.
10
- * 2. Redistributions in binary form must reproduce the above copyright
11
- * notice, this list of conditions and the following disclaimer in the
12
- * documentation and/or other materials provided with the distribution.
13
- *
14
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
- * SUCH DAMAGE.
25
- */
26
- #include "scrypt_platform.h"
27
-
28
- #include <sys/types.h>
29
-
1
+ #include <assert.h>
30
2
  #include <stdint.h>
31
3
  #include <string.h>
32
4
 
5
+ #include "insecure_memzero.h"
33
6
  #include "sysendian.h"
34
7
 
35
8
  #include "sha256.h"
36
9
 
37
10
  /*
38
11
  * Encode a length len/4 vector of (uint32_t) into a length len vector of
39
- * (unsigned char) in big-endian form. Assumes len is a multiple of 4.
12
+ * (uint8_t) in big-endian form. Assumes len is a multiple of 4.
40
13
  */
41
14
  static void
42
- be32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)
15
+ be32enc_vect(uint8_t * dst, const uint32_t * src, size_t len)
43
16
  {
44
17
  size_t i;
45
18
 
19
+ /* Sanity-check. */
20
+ assert(len % 4 == 0);
21
+
22
+ /* Encode vector, one word at a time. */
46
23
  for (i = 0; i < len / 4; i++)
47
24
  be32enc(dst + i * 4, src[i]);
48
25
  }
49
26
 
50
27
  /*
51
- * Decode a big-endian length len vector of (unsigned char) into a length
28
+ * Decode a big-endian length len vector of (uint8_t) into a length
52
29
  * len/4 vector of (uint32_t). Assumes len is a multiple of 4.
53
30
  */
54
31
  static void
55
- be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
32
+ be32dec_vect(uint32_t * dst, const uint8_t * src, size_t len)
56
33
  {
57
34
  size_t i;
58
35
 
36
+ /* Sanity-check. */
37
+ assert(len % 4 == 0);
38
+
39
+ /* Decode vector, one word at a time. */
59
40
  for (i = 0; i < len / 4; i++)
60
41
  dst[i] = be32dec(src + i * 4);
61
42
  }
62
43
 
63
- /* Elementary functions used by scrypt_SHA256 */
44
+ /* SHA256 round constants. */
45
+ static const uint32_t K[64] = {
46
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
47
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
48
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
49
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
50
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
51
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
52
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
53
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
54
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
55
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
56
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
57
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
58
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
59
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
60
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
61
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
62
+ };
63
+
64
+ /* Elementary functions used by SHA256 */
64
65
  #define Ch(x, y, z) ((x & (y ^ z)) ^ z)
65
66
  #define Maj(x, y, z) ((x & (y | z)) | (y & z))
66
67
  #define SHR(x, n) (x >> n)
@@ -70,118 +71,86 @@ be32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)
70
71
  #define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))
71
72
  #define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))
72
73
 
73
- /* scrypt_SHA256 round function */
74
+ /* SHA256 round function */
74
75
  #define RND(a, b, c, d, e, f, g, h, k) \
75
- t0 = h + S1(e) + Ch(e, f, g) + k; \
76
- t1 = S0(a) + Maj(a, b, c); \
77
- d += t0; \
78
- h = t0 + t1;
76
+ h += S1(e) + Ch(e, f, g) + k; \
77
+ d += h; \
78
+ h += S0(a) + Maj(a, b, c);
79
79
 
80
80
  /* Adjusted round function for rotating state */
81
- #define RNDr(S, W, i, k) \
81
+ #define RNDr(S, W, i, ii) \
82
82
  RND(S[(64 - i) % 8], S[(65 - i) % 8], \
83
- S[(66 - i) % 8], S[(67 - i) % 8], \
84
- S[(68 - i) % 8], S[(69 - i) % 8], \
85
- S[(70 - i) % 8], S[(71 - i) % 8], \
86
- W[i] + k)
83
+ S[(66 - i) % 8], S[(67 - i) % 8], \
84
+ S[(68 - i) % 8], S[(69 - i) % 8], \
85
+ S[(70 - i) % 8], S[(71 - i) % 8], \
86
+ W[i + ii] + K[i + ii])
87
+
88
+ /* Message schedule computation */
89
+ #define MSCH(W, ii, i) \
90
+ W[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii]
87
91
 
88
92
  /*
89
- * scrypt_SHA256 block compression function. The 256-bit state is transformed via
93
+ * SHA256 block compression function. The 256-bit state is transformed via
90
94
  * the 512-bit input block to produce a new state.
91
95
  */
92
96
  static void
93
- scrypt_SHA256_Transform(uint32_t * state, const unsigned char block[64])
97
+ SHA256_Transform(uint32_t state[static restrict 8],
98
+ const uint8_t block[static restrict 64],
99
+ uint32_t W[static restrict 64], uint32_t S[static restrict 8])
94
100
  {
95
- uint32_t W[64];
96
- uint32_t S[8];
97
- uint32_t t0, t1;
98
101
  int i;
99
102
 
100
- /* 1. Prepare message schedule W. */
103
+ /* 1. Prepare the first part of the message schedule W. */
101
104
  be32dec_vect(W, block, 64);
102
- for (i = 16; i < 64; i++)
103
- W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];
104
105
 
105
106
  /* 2. Initialize working variables. */
106
107
  memcpy(S, state, 32);
107
108
 
108
109
  /* 3. Mix. */
109
- RNDr(S, W, 0, 0x428a2f98);
110
- RNDr(S, W, 1, 0x71374491);
111
- RNDr(S, W, 2, 0xb5c0fbcf);
112
- RNDr(S, W, 3, 0xe9b5dba5);
113
- RNDr(S, W, 4, 0x3956c25b);
114
- RNDr(S, W, 5, 0x59f111f1);
115
- RNDr(S, W, 6, 0x923f82a4);
116
- RNDr(S, W, 7, 0xab1c5ed5);
117
- RNDr(S, W, 8, 0xd807aa98);
118
- RNDr(S, W, 9, 0x12835b01);
119
- RNDr(S, W, 10, 0x243185be);
120
- RNDr(S, W, 11, 0x550c7dc3);
121
- RNDr(S, W, 12, 0x72be5d74);
122
- RNDr(S, W, 13, 0x80deb1fe);
123
- RNDr(S, W, 14, 0x9bdc06a7);
124
- RNDr(S, W, 15, 0xc19bf174);
125
- RNDr(S, W, 16, 0xe49b69c1);
126
- RNDr(S, W, 17, 0xefbe4786);
127
- RNDr(S, W, 18, 0x0fc19dc6);
128
- RNDr(S, W, 19, 0x240ca1cc);
129
- RNDr(S, W, 20, 0x2de92c6f);
130
- RNDr(S, W, 21, 0x4a7484aa);
131
- RNDr(S, W, 22, 0x5cb0a9dc);
132
- RNDr(S, W, 23, 0x76f988da);
133
- RNDr(S, W, 24, 0x983e5152);
134
- RNDr(S, W, 25, 0xa831c66d);
135
- RNDr(S, W, 26, 0xb00327c8);
136
- RNDr(S, W, 27, 0xbf597fc7);
137
- RNDr(S, W, 28, 0xc6e00bf3);
138
- RNDr(S, W, 29, 0xd5a79147);
139
- RNDr(S, W, 30, 0x06ca6351);
140
- RNDr(S, W, 31, 0x14292967);
141
- RNDr(S, W, 32, 0x27b70a85);
142
- RNDr(S, W, 33, 0x2e1b2138);
143
- RNDr(S, W, 34, 0x4d2c6dfc);
144
- RNDr(S, W, 35, 0x53380d13);
145
- RNDr(S, W, 36, 0x650a7354);
146
- RNDr(S, W, 37, 0x766a0abb);
147
- RNDr(S, W, 38, 0x81c2c92e);
148
- RNDr(S, W, 39, 0x92722c85);
149
- RNDr(S, W, 40, 0xa2bfe8a1);
150
- RNDr(S, W, 41, 0xa81a664b);
151
- RNDr(S, W, 42, 0xc24b8b70);
152
- RNDr(S, W, 43, 0xc76c51a3);
153
- RNDr(S, W, 44, 0xd192e819);
154
- RNDr(S, W, 45, 0xd6990624);
155
- RNDr(S, W, 46, 0xf40e3585);
156
- RNDr(S, W, 47, 0x106aa070);
157
- RNDr(S, W, 48, 0x19a4c116);
158
- RNDr(S, W, 49, 0x1e376c08);
159
- RNDr(S, W, 50, 0x2748774c);
160
- RNDr(S, W, 51, 0x34b0bcb5);
161
- RNDr(S, W, 52, 0x391c0cb3);
162
- RNDr(S, W, 53, 0x4ed8aa4a);
163
- RNDr(S, W, 54, 0x5b9cca4f);
164
- RNDr(S, W, 55, 0x682e6ff3);
165
- RNDr(S, W, 56, 0x748f82ee);
166
- RNDr(S, W, 57, 0x78a5636f);
167
- RNDr(S, W, 58, 0x84c87814);
168
- RNDr(S, W, 59, 0x8cc70208);
169
- RNDr(S, W, 60, 0x90befffa);
170
- RNDr(S, W, 61, 0xa4506ceb);
171
- RNDr(S, W, 62, 0xbef9a3f7);
172
- RNDr(S, W, 63, 0xc67178f2);
173
-
174
- /* 4. Mix local working variables into global state */
110
+ for (i = 0; i < 64; i += 16) {
111
+ RNDr(S, W, 0, i);
112
+ RNDr(S, W, 1, i);
113
+ RNDr(S, W, 2, i);
114
+ RNDr(S, W, 3, i);
115
+ RNDr(S, W, 4, i);
116
+ RNDr(S, W, 5, i);
117
+ RNDr(S, W, 6, i);
118
+ RNDr(S, W, 7, i);
119
+ RNDr(S, W, 8, i);
120
+ RNDr(S, W, 9, i);
121
+ RNDr(S, W, 10, i);
122
+ RNDr(S, W, 11, i);
123
+ RNDr(S, W, 12, i);
124
+ RNDr(S, W, 13, i);
125
+ RNDr(S, W, 14, i);
126
+ RNDr(S, W, 15, i);
127
+
128
+ if (i == 48)
129
+ break;
130
+ MSCH(W, 0, i);
131
+ MSCH(W, 1, i);
132
+ MSCH(W, 2, i);
133
+ MSCH(W, 3, i);
134
+ MSCH(W, 4, i);
135
+ MSCH(W, 5, i);
136
+ MSCH(W, 6, i);
137
+ MSCH(W, 7, i);
138
+ MSCH(W, 8, i);
139
+ MSCH(W, 9, i);
140
+ MSCH(W, 10, i);
141
+ MSCH(W, 11, i);
142
+ MSCH(W, 12, i);
143
+ MSCH(W, 13, i);
144
+ MSCH(W, 14, i);
145
+ MSCH(W, 15, i);
146
+ }
147
+
148
+ /* 4. Mix local working variables into global state. */
175
149
  for (i = 0; i < 8; i++)
176
150
  state[i] += S[i];
177
-
178
- /* Clean the stack. */
179
- memset(W, 0, 256);
180
- memset(S, 0, 32);
181
- t0 = t1 = 0;
182
151
  }
183
152
 
184
- static unsigned char PAD[64] = {
153
+ static const uint8_t PAD[64] = {
185
154
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
186
155
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
187
156
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -190,180 +159,313 @@ static unsigned char PAD[64] = {
190
159
 
191
160
  /* Add padding and terminating bit-count. */
192
161
  static void
193
- scrypt_SHA256_Pad(scrypt_SHA256_CTX * ctx)
162
+ SHA256_Pad(SHA256_CTX * ctx, uint32_t tmp32[static restrict 72])
194
163
  {
195
- unsigned char len[8];
196
- uint32_t r, plen;
197
-
198
- /*
199
- * Convert length to a vector of bytes -- we do this now rather
200
- * than later because the length will change after we pad.
201
- */
202
- be32enc_vect(len, ctx->count, 8);
203
-
204
- /* Add 1--64 bytes so that the resulting length is 56 mod 64 */
205
- r = (ctx->count[1] >> 3) & 0x3f;
206
- plen = (r < 56) ? (56 - r) : (120 - r);
207
- scrypt_SHA256_Update(ctx, PAD, (size_t)plen);
208
-
209
- /* Add the terminating bit-count */
210
- scrypt_SHA256_Update(ctx, len, 8);
164
+ size_t r;
165
+
166
+ /* Figure out how many bytes we have buffered. */
167
+ r = (ctx->count >> 3) & 0x3f;
168
+
169
+ /* Pad to 56 mod 64, transforming if we finish a block en route. */
170
+ if (r < 56) {
171
+ /* Pad to 56 mod 64. */
172
+ memcpy(&ctx->buf[r], PAD, 56 - r);
173
+ } else {
174
+ /* Finish the current block and mix. */
175
+ memcpy(&ctx->buf[r], PAD, 64 - r);
176
+ SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);
177
+
178
+ /* The start of the final block is all zeroes. */
179
+ memset(&ctx->buf[0], 0, 56);
180
+ }
181
+
182
+ /* Add the terminating bit-count. */
183
+ be64enc(&ctx->buf[56], ctx->count);
184
+
185
+ /* Mix in the final block. */
186
+ SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);
211
187
  }
212
188
 
213
- /* SHA-256 initialization. Begins a SHA-256 operation. */
189
+ /* Magic initialization constants. */
190
+ static const uint32_t initstate[8] = {
191
+ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
192
+ 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19
193
+ };
194
+
195
+ /**
196
+ * SHA256_Init(ctx):
197
+ * Initialize the SHA256 context ${ctx}.
198
+ */
214
199
  void
215
- scrypt_SHA256_Init(scrypt_SHA256_CTX * ctx)
200
+ SHA256_Init(SHA256_CTX * ctx)
216
201
  {
217
202
 
218
- /* Zero bits processed so far */
219
- ctx->count[0] = ctx->count[1] = 0;
220
-
221
- /* Magic initialization constants */
222
- ctx->state[0] = 0x6A09E667;
223
- ctx->state[1] = 0xBB67AE85;
224
- ctx->state[2] = 0x3C6EF372;
225
- ctx->state[3] = 0xA54FF53A;
226
- ctx->state[4] = 0x510E527F;
227
- ctx->state[5] = 0x9B05688C;
228
- ctx->state[6] = 0x1F83D9AB;
229
- ctx->state[7] = 0x5BE0CD19;
203
+ /* Zero bits processed so far. */
204
+ ctx->count = 0;
205
+
206
+ /* Initialize state. */
207
+ memcpy(ctx->state, initstate, sizeof(initstate));
230
208
  }
231
209
 
232
- /* Add bytes into the hash */
233
- void
234
- scrypt_SHA256_Update(scrypt_SHA256_CTX * ctx, const void *in, size_t len)
210
+ /**
211
+ * SHA256_Update(ctx, in, len):
212
+ * Input ${len} bytes from ${in} into the SHA256 context ${ctx}.
213
+ */
214
+ static void
215
+ _SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len,
216
+ uint32_t tmp32[static restrict 72])
235
217
  {
236
- uint32_t bitlen[2];
237
218
  uint32_t r;
238
- const unsigned char *src = in;
219
+ const uint8_t * src = in;
239
220
 
240
- /* Number of bytes left in the buffer from previous updates */
241
- r = (ctx->count[1] >> 3) & 0x3f;
221
+ /* Return immediately if we have nothing to do. */
222
+ if (len == 0)
223
+ return;
242
224
 
243
- /* Convert the length into a number of bits */
244
- bitlen[1] = ((uint32_t)len) << 3;
245
- bitlen[0] = (uint32_t)(len >> 29);
225
+ /* Number of bytes left in the buffer from previous updates. */
226
+ r = (ctx->count >> 3) & 0x3f;
246
227
 
247
- /* Update number of bits */
248
- if ((ctx->count[1] += bitlen[1]) < bitlen[1])
249
- ctx->count[0]++;
250
- ctx->count[0] += bitlen[0];
228
+ /* Update number of bits. */
229
+ ctx->count += (uint64_t)(len) << 3;
251
230
 
252
- /* Handle the case where we don't need to perform any transforms */
231
+ /* Handle the case where we don't need to perform any transforms. */
253
232
  if (len < 64 - r) {
254
233
  memcpy(&ctx->buf[r], src, len);
255
234
  return;
256
235
  }
257
236
 
258
- /* Finish the current block */
237
+ /* Finish the current block. */
259
238
  memcpy(&ctx->buf[r], src, 64 - r);
260
- scrypt_SHA256_Transform(ctx->state, ctx->buf);
239
+ SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]);
261
240
  src += 64 - r;
262
241
  len -= 64 - r;
263
242
 
264
- /* Perform complete blocks */
243
+ /* Perform complete blocks. */
265
244
  while (len >= 64) {
266
- scrypt_SHA256_Transform(ctx->state, src);
245
+ SHA256_Transform(ctx->state, src, &tmp32[0], &tmp32[64]);
267
246
  src += 64;
268
247
  len -= 64;
269
248
  }
270
249
 
271
- /* Copy left over data into buffer */
250
+ /* Copy left over data into buffer. */
272
251
  memcpy(ctx->buf, src, len);
273
252
  }
274
253
 
275
- /*
276
- * SHA-256 finalization. Pads the input data, exports the hash value,
277
- * and clears the context state.
278
- */
254
+ /* Wrapper function for intermediate-values sanitization. */
279
255
  void
280
- scrypt_SHA256_Final(unsigned char digest[32], scrypt_SHA256_CTX * ctx)
256
+ SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len)
257
+ {
258
+ uint32_t tmp32[72];
259
+
260
+ /* Call the real function. */
261
+ _SHA256_Update(ctx, in, len, tmp32);
262
+
263
+ /* Clean the stack. */
264
+ insecure_memzero(tmp32, 288);
265
+ }
266
+
267
+ /**
268
+ * SHA256_Final(digest, ctx):
269
+ * Output the SHA256 hash of the data input to the context ${ctx} into the
270
+ * buffer ${digest}.
271
+ */
272
+ static void
273
+ _SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx,
274
+ uint32_t tmp32[static restrict 72])
281
275
  {
282
276
 
283
- /* Add padding */
284
- scrypt_SHA256_Pad(ctx);
277
+ /* Add padding. */
278
+ SHA256_Pad(ctx, tmp32);
285
279
 
286
- /* Write the hash */
280
+ /* Write the hash. */
287
281
  be32enc_vect(digest, ctx->state, 32);
282
+ }
288
283
 
289
- /* Clear the context state */
290
- memset((void *)ctx, 0, sizeof(*ctx));
284
+ /* Wrapper function for intermediate-values sanitization. */
285
+ void
286
+ SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx)
287
+ {
288
+ uint32_t tmp32[72];
289
+
290
+ /* Call the real function. */
291
+ _SHA256_Final(digest, ctx, tmp32);
292
+
293
+ /* Clear the context state. */
294
+ insecure_memzero(ctx, sizeof(SHA256_CTX));
295
+
296
+ /* Clean the stack. */
297
+ insecure_memzero(tmp32, 288);
291
298
  }
292
299
 
293
- /* Initialize an HMAC-scrypt_SHA256 operation with the given key. */
300
+ /**
301
+ * SHA256_Buf(in, len, digest):
302
+ * Compute the SHA256 hash of ${len} bytes from $in} and write it to ${digest}.
303
+ */
294
304
  void
295
- HMAC_scrypt_SHA256_Init(HMAC_scrypt_SHA256_CTX * ctx, const void * _K, size_t Klen)
305
+ SHA256_Buf(const void * in, size_t len, uint8_t digest[32])
296
306
  {
297
- unsigned char pad[64];
298
- unsigned char khash[32];
299
- const unsigned char * K = _K;
307
+ SHA256_CTX ctx;
308
+ uint32_t tmp32[72];
309
+
310
+ SHA256_Init(&ctx);
311
+ _SHA256_Update(&ctx, in, len, tmp32);
312
+ _SHA256_Final(digest, &ctx, tmp32);
313
+
314
+ /* Clean the stack. */
315
+ insecure_memzero(&ctx, sizeof(SHA256_CTX));
316
+ insecure_memzero(tmp32, 288);
317
+ }
318
+
319
+ /**
320
+ * HMAC_SHA256_Init(ctx, K, Klen):
321
+ * Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from
322
+ * ${K}.
323
+ */
324
+ static void
325
+ _HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen,
326
+ uint32_t tmp32[static restrict 72], uint8_t pad[static restrict 64],
327
+ uint8_t khash[static restrict 32])
328
+ {
329
+ const uint8_t * K = _K;
300
330
  size_t i;
301
331
 
302
- /* If Klen > 64, the key is really scrypt_SHA256(K). */
332
+ /* If Klen > 64, the key is really SHA256(K). */
303
333
  if (Klen > 64) {
304
- scrypt_SHA256_Init(&ctx->ictx);
305
- scrypt_SHA256_Update(&ctx->ictx, K, Klen);
306
- scrypt_SHA256_Final(khash, &ctx->ictx);
334
+ SHA256_Init(&ctx->ictx);
335
+ _SHA256_Update(&ctx->ictx, K, Klen, tmp32);
336
+ _SHA256_Final(khash, &ctx->ictx, tmp32);
307
337
  K = khash;
308
338
  Klen = 32;
309
339
  }
310
340
 
311
- /* Inner scrypt_SHA256 operation is scrypt_SHA256(K xor [block of 0x36] || data). */
312
- scrypt_SHA256_Init(&ctx->ictx);
341
+ /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */
342
+ SHA256_Init(&ctx->ictx);
313
343
  memset(pad, 0x36, 64);
314
344
  for (i = 0; i < Klen; i++)
315
345
  pad[i] ^= K[i];
316
- scrypt_SHA256_Update(&ctx->ictx, pad, 64);
346
+ _SHA256_Update(&ctx->ictx, pad, 64, tmp32);
317
347
 
318
- /* Outer scrypt_SHA256 operation is scrypt_SHA256(K xor [block of 0x5c] || hash). */
319
- scrypt_SHA256_Init(&ctx->octx);
348
+ /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */
349
+ SHA256_Init(&ctx->octx);
320
350
  memset(pad, 0x5c, 64);
321
351
  for (i = 0; i < Klen; i++)
322
352
  pad[i] ^= K[i];
323
- scrypt_SHA256_Update(&ctx->octx, pad, 64);
353
+ _SHA256_Update(&ctx->octx, pad, 64, tmp32);
354
+ }
355
+
356
+ /* Wrapper function for intermediate-values sanitization. */
357
+ void
358
+ HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen)
359
+ {
360
+ uint32_t tmp32[72];
361
+ uint8_t pad[64];
362
+ uint8_t khash[32];
363
+
364
+ /* Call the real function. */
365
+ _HMAC_SHA256_Init(ctx, _K, Klen, tmp32, pad, khash);
324
366
 
325
367
  /* Clean the stack. */
326
- memset(khash, 0, 32);
368
+ insecure_memzero(tmp32, 288);
369
+ insecure_memzero(khash, 32);
370
+ insecure_memzero(pad, 64);
371
+ }
372
+
373
+ /**
374
+ * HMAC_SHA256_Update(ctx, in, len):
375
+ * Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}.
376
+ */
377
+ static void
378
+ _HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len,
379
+ uint32_t tmp32[static restrict 72])
380
+ {
381
+
382
+ /* Feed data to the inner SHA256 operation. */
383
+ _SHA256_Update(&ctx->ictx, in, len, tmp32);
327
384
  }
328
385
 
329
- /* Add bytes to the HMAC-scrypt_SHA256 operation. */
386
+ /* Wrapper function for intermediate-values sanitization. */
330
387
  void
331
- HMAC_scrypt_SHA256_Update(HMAC_scrypt_SHA256_CTX * ctx, const void *in, size_t len)
388
+ HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len)
332
389
  {
390
+ uint32_t tmp32[72];
333
391
 
334
- /* Feed data to the inner scrypt_SHA256 operation. */
335
- scrypt_SHA256_Update(&ctx->ictx, in, len);
392
+ /* Call the real function. */
393
+ _HMAC_SHA256_Update(ctx, in, len, tmp32);
394
+
395
+ /* Clean the stack. */
396
+ insecure_memzero(tmp32, 288);
397
+ }
398
+
399
+ /**
400
+ * HMAC_SHA256_Final(digest, ctx):
401
+ * Output the HMAC-SHA256 of the data input to the context ${ctx} into the
402
+ * buffer ${digest}.
403
+ */
404
+ static void
405
+ _HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx,
406
+ uint32_t tmp32[static restrict 72], uint8_t ihash[static restrict 32])
407
+ {
408
+
409
+ /* Finish the inner SHA256 operation. */
410
+ _SHA256_Final(ihash, &ctx->ictx, tmp32);
411
+
412
+ /* Feed the inner hash to the outer SHA256 operation. */
413
+ _SHA256_Update(&ctx->octx, ihash, 32, tmp32);
414
+
415
+ /* Finish the outer SHA256 operation. */
416
+ _SHA256_Final(digest, &ctx->octx, tmp32);
336
417
  }
337
418
 
338
- /* Finish an HMAC-scrypt_SHA256 operation. */
419
+ /* Wrapper function for intermediate-values sanitization. */
339
420
  void
340
- HMAC_scrypt_SHA256_Final(unsigned char digest[32], HMAC_scrypt_SHA256_CTX * ctx)
421
+ HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx)
341
422
  {
342
- unsigned char ihash[32];
423
+ uint32_t tmp32[72];
424
+ uint8_t ihash[32];
343
425
 
344
- /* Finish the inner scrypt_SHA256 operation. */
345
- scrypt_SHA256_Final(ihash, &ctx->ictx);
426
+ /* Call the real function. */
427
+ _HMAC_SHA256_Final(digest, ctx, tmp32, ihash);
346
428
 
347
- /* Feed the inner hash to the outer scrypt_SHA256 operation. */
348
- scrypt_SHA256_Update(&ctx->octx, ihash, 32);
429
+ /* Clean the stack. */
430
+ insecure_memzero(tmp32, 288);
431
+ insecure_memzero(ihash, 32);
432
+ }
433
+
434
+ /**
435
+ * HMAC_SHA256_Buf(K, Klen, in, len, digest):
436
+ * Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of
437
+ * length ${Klen}, and write the result to ${digest}.
438
+ */
439
+ void
440
+ HMAC_SHA256_Buf(const void * K, size_t Klen, const void * in, size_t len,
441
+ uint8_t digest[32])
442
+ {
443
+ HMAC_SHA256_CTX ctx;
444
+ uint32_t tmp32[72];
445
+ uint8_t tmp8[96];
349
446
 
350
- /* Finish the outer scrypt_SHA256 operation. */
351
- scrypt_SHA256_Final(digest, &ctx->octx);
447
+ _HMAC_SHA256_Init(&ctx, K, Klen, tmp32, &tmp8[0], &tmp8[64]);
448
+ _HMAC_SHA256_Update(&ctx, in, len, tmp32);
449
+ _HMAC_SHA256_Final(digest, &ctx, tmp32, &tmp8[0]);
352
450
 
353
451
  /* Clean the stack. */
354
- memset(ihash, 0, 32);
452
+ insecure_memzero(&ctx, sizeof(HMAC_SHA256_CTX));
453
+ insecure_memzero(tmp32, 288);
454
+ insecure_memzero(tmp8, 96);
355
455
  }
356
456
 
357
457
  /**
358
- * PBKDF2_scrypt_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
359
- * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-scrypt_SHA256 as the PRF, and
458
+ * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):
459
+ * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and
360
460
  * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1).
361
461
  */
362
462
  void
363
- PBKDF2_scrypt_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
463
+ PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,
364
464
  size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)
365
465
  {
366
- HMAC_scrypt_SHA256_CTX PShctx, hctx;
466
+ HMAC_SHA256_CTX Phctx, PShctx, hctx;
467
+ uint32_t tmp32[72];
468
+ uint8_t tmp8[96];
367
469
  size_t i;
368
470
  uint8_t ivec[4];
369
471
  uint8_t U[32];
@@ -372,9 +474,16 @@ PBKDF2_scrypt_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * s
372
474
  int k;
373
475
  size_t clen;
374
476
 
477
+ /* Sanity-check. */
478
+ assert(dkLen <= 32 * (size_t)(UINT32_MAX));
479
+
480
+ /* Compute HMAC state after processing P. */
481
+ _HMAC_SHA256_Init(&Phctx, passwd, passwdlen,
482
+ tmp32, &tmp8[0], &tmp8[64]);
483
+
375
484
  /* Compute HMAC state after processing P and S. */
376
- HMAC_scrypt_SHA256_Init(&PShctx, passwd, passwdlen);
377
- HMAC_scrypt_SHA256_Update(&PShctx, salt, saltlen);
485
+ memcpy(&PShctx, &Phctx, sizeof(HMAC_SHA256_CTX));
486
+ _HMAC_SHA256_Update(&PShctx, salt, saltlen, tmp32);
378
487
 
379
488
  /* Iterate through the blocks. */
380
489
  for (i = 0; i * 32 < dkLen; i++) {
@@ -382,18 +491,18 @@ PBKDF2_scrypt_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * s
382
491
  be32enc(ivec, (uint32_t)(i + 1));
383
492
 
384
493
  /* Compute U_1 = PRF(P, S || INT(i)). */
385
- memcpy(&hctx, &PShctx, sizeof(HMAC_scrypt_SHA256_CTX));
386
- HMAC_scrypt_SHA256_Update(&hctx, ivec, 4);
387
- HMAC_scrypt_SHA256_Final(U, &hctx);
494
+ memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX));
495
+ _HMAC_SHA256_Update(&hctx, ivec, 4, tmp32);
496
+ _HMAC_SHA256_Final(U, &hctx, tmp32, tmp8);
388
497
 
389
498
  /* T_i = U_1 ... */
390
499
  memcpy(T, U, 32);
391
500
 
392
501
  for (j = 2; j <= c; j++) {
393
502
  /* Compute U_j. */
394
- HMAC_scrypt_SHA256_Init(&hctx, passwd, passwdlen);
395
- HMAC_scrypt_SHA256_Update(&hctx, U, 32);
396
- HMAC_scrypt_SHA256_Final(U, &hctx);
503
+ memcpy(&hctx, &Phctx, sizeof(HMAC_SHA256_CTX));
504
+ _HMAC_SHA256_Update(&hctx, U, 32, tmp32);
505
+ _HMAC_SHA256_Final(U, &hctx, tmp32, tmp8);
397
506
 
398
507
  /* ... xor U_j ... */
399
508
  for (k = 0; k < 32; k++)
@@ -407,6 +516,12 @@ PBKDF2_scrypt_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * s
407
516
  memcpy(&buf[i * 32], T, clen);
408
517
  }
409
518
 
410
- /* Clean PShctx, since we never called _Final on it. */
411
- memset(&PShctx, 0, sizeof(HMAC_scrypt_SHA256_CTX));
519
+ /* Clean the stack. */
520
+ insecure_memzero(&Phctx, sizeof(HMAC_SHA256_CTX));
521
+ insecure_memzero(&PShctx, sizeof(HMAC_SHA256_CTX));
522
+ insecure_memzero(&hctx, sizeof(HMAC_SHA256_CTX));
523
+ insecure_memzero(tmp32, 288);
524
+ insecure_memzero(tmp8, 96);
525
+ insecure_memzero(U, 32);
526
+ insecure_memzero(T, 32);
412
527
  }