argon2 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -4
  3. data/Changelog.md +3 -0
  4. data/README.md +2 -0
  5. data/argon2.gemspec +1 -1
  6. data/ext/argon2_wrap/Makefile +6 -0
  7. data/ext/argon2_wrap/argon_wrap.c +1 -7
  8. data/ext/phc-winner-argon2/.gitignore +1 -0
  9. data/ext/phc-winner-argon2/Argon2.sln +64 -2
  10. data/ext/phc-winner-argon2/CHANGELOG.md +8 -1
  11. data/ext/phc-winner-argon2/LICENSE +301 -18
  12. data/ext/phc-winner-argon2/Makefile +85 -20
  13. data/ext/phc-winner-argon2/README.md +73 -30
  14. data/ext/phc-winner-argon2/argon2-specs.pdf +0 -0
  15. data/ext/phc-winner-argon2/include/argon2.h +73 -10
  16. data/ext/phc-winner-argon2/kats/argon2id +12304 -0
  17. data/ext/phc-winner-argon2/kats/argon2id.shasum +1 -0
  18. data/ext/phc-winner-argon2/kats/argon2id_v16 +12304 -0
  19. data/ext/phc-winner-argon2/kats/argon2id_v16.shasum +1 -0
  20. data/ext/phc-winner-argon2/kats/test.ps1 +1 -1
  21. data/ext/phc-winner-argon2/kats/test.sh +1 -1
  22. data/ext/phc-winner-argon2/latex/IEEEtran.cls +6347 -0
  23. data/ext/phc-winner-argon2/latex/argon2-spec.tex +920 -0
  24. data/ext/phc-winner-argon2/latex/pics/argon2-par.pdf +0 -0
  25. data/ext/phc-winner-argon2/latex/pics/compression.pdf +0 -0
  26. data/ext/phc-winner-argon2/latex/pics/generic.pdf +0 -0
  27. data/ext/phc-winner-argon2/latex/pics/power-distribution.jpg +0 -0
  28. data/ext/phc-winner-argon2/latex/tradeoff.bib +822 -0
  29. data/ext/phc-winner-argon2/libargon2.pc +16 -0
  30. data/ext/phc-winner-argon2/man/argon2.1 +13 -3
  31. data/ext/phc-winner-argon2/src/argon2.c +112 -68
  32. data/ext/phc-winner-argon2/src/bench.c +44 -27
  33. data/ext/phc-winner-argon2/src/blake2/blake2-impl.h +18 -5
  34. data/ext/phc-winner-argon2/src/blake2/blake2.h +17 -0
  35. data/ext/phc-winner-argon2/src/blake2/blake2b.c +25 -7
  36. data/ext/phc-winner-argon2/src/blake2/blamka-round-opt.h +17 -0
  37. data/ext/phc-winner-argon2/src/blake2/blamka-round-ref.h +17 -0
  38. data/ext/phc-winner-argon2/src/core.c +138 -110
  39. data/ext/phc-winner-argon2/src/core.h +41 -26
  40. data/ext/phc-winner-argon2/src/encoding.c +79 -55
  41. data/ext/phc-winner-argon2/src/encoding.h +25 -8
  42. data/ext/phc-winner-argon2/src/genkat.c +35 -39
  43. data/ext/phc-winner-argon2/src/genkat.h +11 -7
  44. data/ext/phc-winner-argon2/src/opt.c +65 -99
  45. data/ext/phc-winner-argon2/src/opt.h +15 -32
  46. data/ext/phc-winner-argon2/src/ref.c +50 -93
  47. data/ext/phc-winner-argon2/src/ref.h +15 -31
  48. data/ext/phc-winner-argon2/src/run.c +73 -30
  49. data/ext/phc-winner-argon2/src/test.c +33 -2
  50. data/ext/phc-winner-argon2/src/thread.c +21 -0
  51. data/ext/phc-winner-argon2/src/thread.h +21 -0
  52. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +69 -1
  53. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +69 -1
  54. data/ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj +225 -0
  55. data/ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters +66 -0
  56. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +73 -1
  57. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +69 -1
  58. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +69 -1
  59. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +69 -1
  60. data/ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj +225 -0
  61. data/ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters +66 -0
  62. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +69 -1
  63. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +69 -1
  64. data/lib/argon2.rb +3 -3
  65. data/lib/argon2/ffi_engine.rb +3 -3
  66. data/lib/argon2/version.rb +1 -1
  67. metadata +21 -5
@@ -1,3 +1,20 @@
1
+ /*
2
+ * Argon2 reference source code package - reference C implementations
3
+ *
4
+ * Copyright 2015
5
+ * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6
+ *
7
+ * You may use this work under the terms of a Creative Commons CC0 1.0
8
+ * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9
+ * these licenses can be found at:
10
+ *
11
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12
+ * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * You should have received a copy of both of these licenses along with this
15
+ * software. If not, they may be obtained at the above URLs.
16
+ */
17
+
1
18
  #ifndef PORTABLE_BLAKE2_H
2
19
  #define PORTABLE_BLAKE2_H
3
20
 
@@ -1,3 +1,20 @@
1
+ /*
2
+ * Argon2 reference source code package - reference C implementations
3
+ *
4
+ * Copyright 2015
5
+ * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6
+ *
7
+ * You may use this work under the terms of a Creative Commons CC0 1.0
8
+ * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9
+ * these licenses can be found at:
10
+ *
11
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12
+ * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * You should have received a copy of both of these licenses along with this
15
+ * software. If not, they may be obtained at the above URLs.
16
+ */
17
+
1
18
  #include <stdint.h>
2
19
  #include <string.h>
3
20
  #include <stdio.h>
@@ -44,7 +61,7 @@ static BLAKE2_INLINE void blake2b_increment_counter(blake2b_state *S,
44
61
  }
45
62
 
46
63
  static BLAKE2_INLINE void blake2b_invalidate_state(blake2b_state *S) {
47
- burn(S, sizeof(*S)); /* wipe */
64
+ clear_internal_memory(S, sizeof(*S)); /* wipe */
48
65
  blake2b_set_lastblock(S); /* invalidate for further use */
49
66
  }
50
67
 
@@ -140,7 +157,8 @@ int blake2b_init_key(blake2b_state *S, size_t outlen, const void *key,
140
157
  memset(block, 0, BLAKE2B_BLOCKBYTES);
141
158
  memcpy(block, key, keylen);
142
159
  blake2b_update(S, block, BLAKE2B_BLOCKBYTES);
143
- burn(block, BLAKE2B_BLOCKBYTES); /* Burn the key from stack */
160
+ /* Burn the key from stack */
161
+ clear_internal_memory(block, BLAKE2B_BLOCKBYTES);
144
162
  }
145
163
  return 0;
146
164
  }
@@ -267,9 +285,9 @@ int blake2b_final(blake2b_state *S, void *out, size_t outlen) {
267
285
  }
268
286
 
269
287
  memcpy(out, buffer, S->outlen);
270
- burn(buffer, sizeof(buffer));
271
- burn(S->buf, sizeof(S->buf));
272
- burn(S->h, sizeof(S->h));
288
+ clear_internal_memory(buffer, sizeof(buffer));
289
+ clear_internal_memory(S->buf, sizeof(S->buf));
290
+ clear_internal_memory(S->h, sizeof(S->h));
273
291
  return 0;
274
292
  }
275
293
 
@@ -307,7 +325,7 @@ int blake2b(void *out, size_t outlen, const void *in, size_t inlen,
307
325
  ret = blake2b_final(&S, out, outlen);
308
326
 
309
327
  fail:
310
- burn(&S, sizeof(S));
328
+ clear_internal_memory(&S, sizeof(S));
311
329
  return ret;
312
330
  }
313
331
 
@@ -365,7 +383,7 @@ int blake2b_long(void *pout, size_t outlen, const void *in, size_t inlen) {
365
383
  memcpy(out, out_buffer, toproduce);
366
384
  }
367
385
  fail:
368
- burn(&blake_state, sizeof(blake_state));
386
+ clear_internal_memory(&blake_state, sizeof(blake_state));
369
387
  return ret;
370
388
  #undef TRY
371
389
  }
@@ -1,3 +1,20 @@
1
+ /*
2
+ * Argon2 reference source code package - reference C implementations
3
+ *
4
+ * Copyright 2015
5
+ * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6
+ *
7
+ * You may use this work under the terms of a Creative Commons CC0 1.0
8
+ * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9
+ * these licenses can be found at:
10
+ *
11
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12
+ * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * You should have received a copy of both of these licenses along with this
15
+ * software. If not, they may be obtained at the above URLs.
16
+ */
17
+
1
18
  #ifndef BLAKE_ROUND_MKA_OPT_H
2
19
  #define BLAKE_ROUND_MKA_OPT_H
3
20
 
@@ -1,3 +1,20 @@
1
+ /*
2
+ * Argon2 reference source code package - reference C implementations
3
+ *
4
+ * Copyright 2015
5
+ * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6
+ *
7
+ * You may use this work under the terms of a Creative Commons CC0 1.0
8
+ * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9
+ * these licenses can be found at:
10
+ *
11
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12
+ * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * You should have received a copy of both of these licenses along with this
15
+ * software. If not, they may be obtained at the above URLs.
16
+ */
17
+
1
18
  #ifndef BLAKE_ROUND_MKA_H
2
19
  #define BLAKE_ROUND_MKA_H
3
20
 
@@ -1,14 +1,18 @@
1
1
  /*
2
- * Argon2 source code package
2
+ * Argon2 reference source code package - reference C implementations
3
3
  *
4
- * Written by Daniel Dinu and Dmitry Khovratovich, 2015
4
+ * Copyright 2015
5
+ * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
5
6
  *
6
- * This work is licensed under a Creative Commons CC0 1.0 License/Waiver.
7
+ * You may use this work under the terms of a Creative Commons CC0 1.0
8
+ * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9
+ * these licenses can be found at:
7
10
  *
8
- * You should have received a copy of the CC0 Public Domain Dedication along
9
- * with
10
- * this software. If not, see
11
- * <http://creativecommons.org/publicdomain/zero/1.0/>.
11
+ * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12
+ * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * You should have received a copy of both of these licenses along with this
15
+ * software. If not, they may be obtained at the above URLs.
12
16
  */
13
17
 
14
18
  /*For memory wiping*/
@@ -78,25 +82,43 @@ static void store_block(void *output, const block *src) {
78
82
  }
79
83
  }
80
84
 
81
- /***************Memory allocators*****************/
82
- int allocate_memory(block **memory, uint32_t m_cost) {
83
- if (memory != NULL) {
84
- size_t memory_size = sizeof(block) * m_cost;
85
- if (m_cost != 0 &&
86
- memory_size / m_cost !=
87
- sizeof(block)) { /*1. Check for multiplication overflow*/
88
- return ARGON2_MEMORY_ALLOCATION_ERROR;
89
- }
85
+ /***************Memory functions*****************/
90
86
 
91
- *memory = (block *)malloc(memory_size); /*2. Try to allocate*/
87
+ int allocate_memory(const argon2_context *context, uint8_t **memory,
88
+ size_t num, size_t size) {
89
+ size_t memory_size = num*size;
90
+ if (memory == NULL) {
91
+ return ARGON2_MEMORY_ALLOCATION_ERROR;
92
+ }
92
93
 
93
- if (!*memory) {
94
- return ARGON2_MEMORY_ALLOCATION_ERROR;
95
- }
96
- return ARGON2_OK;
94
+ /* 1. Check for multiplication overflow */
95
+ if (size != 0 && memory_size / size != num) {
96
+ return ARGON2_MEMORY_ALLOCATION_ERROR;
97
+ }
98
+
99
+ /* 2. Try to allocate with appropriate allocator */
100
+ if (context->allocate_cbk) {
101
+ (context->allocate_cbk)(memory, memory_size);
97
102
  } else {
103
+ *memory = malloc(memory_size);
104
+ }
105
+
106
+ if (*memory == NULL) {
98
107
  return ARGON2_MEMORY_ALLOCATION_ERROR;
99
108
  }
109
+
110
+ return ARGON2_OK;
111
+ }
112
+
113
+ void free_memory(const argon2_context *context, uint8_t *memory,
114
+ size_t num, size_t size) {
115
+ size_t memory_size = num*size;
116
+ clear_internal_memory(memory, memory_size);
117
+ if (context->free_cbk) {
118
+ (context->free_cbk)(memory, memory_size);
119
+ } else {
120
+ free(memory);
121
+ }
100
122
  }
101
123
 
102
124
  void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) {
@@ -112,17 +134,14 @@ void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) {
112
134
  #endif
113
135
  }
114
136
 
115
- /*********Memory functions*/
116
-
117
- void clear_memory(argon2_instance_t *instance, int clear) {
118
- if (instance->memory != NULL && clear) {
119
- secure_wipe_memory(instance->memory,
120
- sizeof(block) * instance->memory_blocks);
121
- }
137
+ /* Memory clear flag defaults to true. */
138
+ int FLAG_clear_internal_memory = 1;
139
+ void clear_internal_memory(void *v, size_t n) {
140
+ if (FLAG_clear_internal_memory && v) {
141
+ secure_wipe_memory(v, n);
142
+ }
122
143
  }
123
144
 
124
- void free_memory(block *memory) { free(memory); }
125
-
126
145
  void finalize(const argon2_context *context, argon2_instance_t *instance) {
127
146
  if (context != NULL && instance != NULL) {
128
147
  block blockhash;
@@ -143,26 +162,17 @@ void finalize(const argon2_context *context, argon2_instance_t *instance) {
143
162
  store_block(blockhash_bytes, &blockhash);
144
163
  blake2b_long(context->out, context->outlen, blockhash_bytes,
145
164
  ARGON2_BLOCK_SIZE);
146
- secure_wipe_memory(blockhash.v,
147
- ARGON2_BLOCK_SIZE); /* clear blockhash */
148
- secure_wipe_memory(blockhash_bytes,
149
- ARGON2_BLOCK_SIZE); /* clear blockhash_bytes */
165
+ /* clear blockhash and blockhash_bytes */
166
+ clear_internal_memory(blockhash.v, ARGON2_BLOCK_SIZE);
167
+ clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
150
168
  }
151
169
 
152
170
  #ifdef GENKAT
153
171
  print_tag(context->out, context->outlen);
154
172
  #endif
155
173
 
156
- /* Clear memory */
157
- clear_memory(instance, context->flags & ARGON2_FLAG_CLEAR_PASSWORD);
158
-
159
- /* Deallocate the memory */
160
- if (NULL != context->free_cbk) {
161
- context->free_cbk((uint8_t *)instance->memory,
162
- instance->memory_blocks * sizeof(block));
163
- } else {
164
- free_memory(instance->memory);
165
- }
174
+ free_memory(context, (uint8_t *)instance->memory,
175
+ instance->memory_blocks, sizeof(block));
166
176
  }
167
177
  }
168
178
 
@@ -236,42 +246,60 @@ uint32_t index_alpha(const argon2_instance_t *instance,
236
246
  return absolute_position;
237
247
  }
238
248
 
249
+ /* Single-threaded version for p=1 case */
250
+ static int fill_memory_blocks_st(argon2_instance_t *instance) {
251
+ uint32_t r, s, l;
252
+
253
+ for (r = 0; r < instance->passes; ++r) {
254
+ for (s = 0; s < ARGON2_SYNC_POINTS; ++s) {
255
+ for (l = 0; l < instance->lanes; ++l) {
256
+ argon2_position_t position = {r, l, (uint8_t)s, 0};
257
+ fill_segment(instance, position);
258
+ }
259
+ }
260
+ #ifdef GENKAT
261
+ internal_kat(instance, r); /* Print all memory blocks */
262
+ #endif
263
+ }
264
+ return ARGON2_OK;
265
+ }
266
+
267
+ #if !defined(ARGON2_NO_THREADS)
268
+
239
269
  #ifdef _WIN32
240
270
  static unsigned __stdcall fill_segment_thr(void *thread_data)
241
271
  #else
242
272
  static void *fill_segment_thr(void *thread_data)
243
273
  #endif
244
274
  {
245
- argon2_thread_data *my_data = (argon2_thread_data *)thread_data;
275
+ argon2_thread_data *my_data = thread_data;
246
276
  fill_segment(my_data->instance_ptr, my_data->pos);
247
277
  argon2_thread_exit();
248
278
  return 0;
249
279
  }
250
280
 
251
- int fill_memory_blocks(argon2_instance_t *instance) {
281
+ /* Multi-threaded version for p > 1 case */
282
+ static int fill_memory_blocks_mt(argon2_instance_t *instance) {
252
283
  uint32_t r, s;
253
284
  argon2_thread_handle_t *thread = NULL;
254
285
  argon2_thread_data *thr_data = NULL;
255
-
256
- if (instance == NULL || instance->lanes == 0) {
257
- return ARGON2_THREAD_FAIL;
258
- }
286
+ int rc = ARGON2_OK;
259
287
 
260
288
  /* 1. Allocating space for threads */
261
289
  thread = calloc(instance->lanes, sizeof(argon2_thread_handle_t));
262
290
  if (thread == NULL) {
263
- return ARGON2_MEMORY_ALLOCATION_ERROR;
291
+ rc = ARGON2_MEMORY_ALLOCATION_ERROR;
292
+ goto fail;
264
293
  }
265
294
 
266
295
  thr_data = calloc(instance->lanes, sizeof(argon2_thread_data));
267
296
  if (thr_data == NULL) {
268
- free(thread);
269
- return ARGON2_MEMORY_ALLOCATION_ERROR;
297
+ rc = ARGON2_MEMORY_ALLOCATION_ERROR;
298
+ goto fail;
270
299
  }
271
300
 
272
301
  for (r = 0; r < instance->passes; ++r) {
273
302
  for (s = 0; s < ARGON2_SYNC_POINTS; ++s) {
274
- int rc;
275
303
  uint32_t l;
276
304
 
277
305
  /* 2. Calling threads */
@@ -280,11 +308,9 @@ int fill_memory_blocks(argon2_instance_t *instance) {
280
308
 
281
309
  /* 2.1 Join a thread if limit is exceeded */
282
310
  if (l >= instance->threads) {
283
- rc = argon2_thread_join(thread[l - instance->threads]);
284
- if (rc) {
285
- free(thr_data);
286
- free(thread);
287
- return ARGON2_THREAD_FAIL;
311
+ if (argon2_thread_join(thread[l - instance->threads])) {
312
+ rc = ARGON2_THREAD_FAIL;
313
+ goto fail;
288
314
  }
289
315
  }
290
316
 
@@ -297,12 +323,10 @@ int fill_memory_blocks(argon2_instance_t *instance) {
297
323
  instance; /* preparing the thread input */
298
324
  memcpy(&(thr_data[l].pos), &position,
299
325
  sizeof(argon2_position_t));
300
- rc = argon2_thread_create(&thread[l], &fill_segment_thr,
301
- (void *)&thr_data[l]);
302
- if (rc) {
303
- free(thr_data);
304
- free(thread);
305
- return ARGON2_THREAD_FAIL;
326
+ if (argon2_thread_create(&thread[l], &fill_segment_thr,
327
+ (void *)&thr_data[l])) {
328
+ rc = ARGON2_THREAD_FAIL;
329
+ goto fail;
306
330
  }
307
331
 
308
332
  /* fill_segment(instance, position); */
@@ -312,9 +336,9 @@ int fill_memory_blocks(argon2_instance_t *instance) {
312
336
  /* 3. Joining remaining threads */
313
337
  for (l = instance->lanes - instance->threads; l < instance->lanes;
314
338
  ++l) {
315
- rc = argon2_thread_join(thread[l]);
316
- if (rc) {
317
- return ARGON2_THREAD_FAIL;
339
+ if (argon2_thread_join(thread[l])) {
340
+ rc = ARGON2_THREAD_FAIL;
341
+ goto fail;
318
342
  }
319
343
  }
320
344
  }
@@ -324,13 +348,28 @@ int fill_memory_blocks(argon2_instance_t *instance) {
324
348
  #endif
325
349
  }
326
350
 
351
+ fail:
327
352
  if (thread != NULL) {
328
353
  free(thread);
329
354
  }
330
355
  if (thr_data != NULL) {
331
356
  free(thr_data);
332
357
  }
333
- return ARGON2_OK;
358
+ return rc;
359
+ }
360
+
361
+ #endif /* ARGON2_NO_THREADS */
362
+
363
+ int fill_memory_blocks(argon2_instance_t *instance) {
364
+ if (instance == NULL || instance->lanes == 0) {
365
+ return ARGON2_INCORRECT_PARAMETER;
366
+ }
367
+ #if defined(ARGON2_NO_THREADS)
368
+ return fill_memory_blocks_st(instance);
369
+ #else
370
+ return instance->threads == 1 ?
371
+ fill_memory_blocks_st(instance) : fill_memory_blocks_mt(instance);
372
+ #endif
334
373
  }
335
374
 
336
375
  int validate_inputs(const argon2_context *context) {
@@ -351,37 +390,37 @@ int validate_inputs(const argon2_context *context) {
351
390
  return ARGON2_OUTPUT_TOO_LONG;
352
391
  }
353
392
 
354
- /* Validate password length */
393
+ /* Validate password (required param) */
355
394
  if (NULL == context->pwd) {
356
395
  if (0 != context->pwdlen) {
357
396
  return ARGON2_PWD_PTR_MISMATCH;
358
397
  }
359
- } else {
360
- if (ARGON2_MIN_PWD_LENGTH > context->pwdlen) {
361
- return ARGON2_PWD_TOO_SHORT;
362
- }
398
+ }
363
399
 
364
- if (ARGON2_MAX_PWD_LENGTH < context->pwdlen) {
365
- return ARGON2_PWD_TOO_LONG;
366
- }
400
+ if (ARGON2_MIN_PWD_LENGTH > context->pwdlen) {
401
+ return ARGON2_PWD_TOO_SHORT;
402
+ }
403
+
404
+ if (ARGON2_MAX_PWD_LENGTH < context->pwdlen) {
405
+ return ARGON2_PWD_TOO_LONG;
367
406
  }
368
407
 
369
- /* Validate salt length */
408
+ /* Validate salt (required param) */
370
409
  if (NULL == context->salt) {
371
410
  if (0 != context->saltlen) {
372
411
  return ARGON2_SALT_PTR_MISMATCH;
373
412
  }
374
- } else {
375
- if (ARGON2_MIN_SALT_LENGTH > context->saltlen) {
376
- return ARGON2_SALT_TOO_SHORT;
377
- }
413
+ }
378
414
 
379
- if (ARGON2_MAX_SALT_LENGTH < context->saltlen) {
380
- return ARGON2_SALT_TOO_LONG;
381
- }
415
+ if (ARGON2_MIN_SALT_LENGTH > context->saltlen) {
416
+ return ARGON2_SALT_TOO_SHORT;
382
417
  }
383
418
 
384
- /* Validate secret length */
419
+ if (ARGON2_MAX_SALT_LENGTH < context->saltlen) {
420
+ return ARGON2_SALT_TOO_LONG;
421
+ }
422
+
423
+ /* Validate secret (optional param) */
385
424
  if (NULL == context->secret) {
386
425
  if (0 != context->secretlen) {
387
426
  return ARGON2_SECRET_PTR_MISMATCH;
@@ -390,13 +429,12 @@ int validate_inputs(const argon2_context *context) {
390
429
  if (ARGON2_MIN_SECRET > context->secretlen) {
391
430
  return ARGON2_SECRET_TOO_SHORT;
392
431
  }
393
-
394
432
  if (ARGON2_MAX_SECRET < context->secretlen) {
395
433
  return ARGON2_SECRET_TOO_LONG;
396
434
  }
397
435
  }
398
436
 
399
- /* Validate associated data */
437
+ /* Validate associated data (optional param) */
400
438
  if (NULL == context->ad) {
401
439
  if (0 != context->adlen) {
402
440
  return ARGON2_AD_PTR_MISMATCH;
@@ -405,7 +443,6 @@ int validate_inputs(const argon2_context *context) {
405
443
  if (ARGON2_MIN_AD_LENGTH > context->adlen) {
406
444
  return ARGON2_AD_TOO_SHORT;
407
445
  }
408
-
409
446
  if (ARGON2_MAX_AD_LENGTH < context->adlen) {
410
447
  return ARGON2_AD_TOO_LONG;
411
448
  }
@@ -464,8 +501,8 @@ int validate_inputs(const argon2_context *context) {
464
501
 
465
502
  void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) {
466
503
  uint32_t l;
467
- /* Make the first and second block in each lane as G(H0||i||0) or
468
- G(H0||i||1) */
504
+ /* Make the first and second block in each lane as G(H0||0||i) or
505
+ G(H0||1||i) */
469
506
  uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE];
470
507
  for (l = 0; l < instance->lanes; ++l) {
471
508
 
@@ -482,7 +519,7 @@ void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) {
482
519
  load_block(&instance->memory[l * instance->lane_length + 1],
483
520
  blockhash_bytes);
484
521
  }
485
- secure_wipe_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
522
+ clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE);
486
523
  }
487
524
 
488
525
  void initial_hash(uint8_t *blockhash, argon2_context *context,
@@ -565,22 +602,13 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
565
602
 
566
603
  if (instance == NULL || context == NULL)
567
604
  return ARGON2_INCORRECT_PARAMETER;
605
+ instance->context_ptr = context;
568
606
 
569
607
  /* 1. Memory allocation */
570
-
571
- if (NULL != context->allocate_cbk) {
572
- uint8_t *p;
573
- result = context->allocate_cbk(&p, instance->memory_blocks *
574
- ARGON2_BLOCK_SIZE);
575
- if (ARGON2_OK != result) {
576
- return result;
577
- }
578
- memcpy(&(instance->memory), p, sizeof(instance->memory));
579
- } else {
580
- result = allocate_memory(&(instance->memory), instance->memory_blocks);
581
- if (ARGON2_OK != result) {
582
- return result;
583
- }
608
+ result = allocate_memory(context, (uint8_t **)&(instance->memory),
609
+ instance->memory_blocks, sizeof(block));
610
+ if (result != ARGON2_OK) {
611
+ return result;
584
612
  }
585
613
 
586
614
  /* 2. Initial hashing */
@@ -589,9 +617,9 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
589
617
  /* Hashing all inputs */
590
618
  initial_hash(blockhash, context, instance->type);
591
619
  /* Zeroing 8 extra bytes */
592
- secure_wipe_memory(blockhash + ARGON2_PREHASH_DIGEST_LENGTH,
593
- ARGON2_PREHASH_SEED_LENGTH -
594
- ARGON2_PREHASH_DIGEST_LENGTH);
620
+ clear_internal_memory(blockhash + ARGON2_PREHASH_DIGEST_LENGTH,
621
+ ARGON2_PREHASH_SEED_LENGTH -
622
+ ARGON2_PREHASH_DIGEST_LENGTH);
595
623
 
596
624
  #ifdef GENKAT
597
625
  initial_kat(blockhash, context, instance->type);
@@ -601,7 +629,7 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
601
629
  */
602
630
  fill_first_blocks(blockhash, instance);
603
631
  /* Clearing the hash */
604
- secure_wipe_memory(blockhash, ARGON2_PREHASH_SEED_LENGTH);
632
+ clear_internal_memory(blockhash, ARGON2_PREHASH_SEED_LENGTH);
605
633
 
606
634
  return ARGON2_OK;
607
635
  }