argon2 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  }