argon2 0.1.4 → 1.0.0

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -9
  3. data/.travis.yml +0 -1
  4. data/CONTRIBUTING.md +12 -0
  5. data/Changelog.md +10 -11
  6. data/README.md +23 -14
  7. data/ext/argon2_wrap/Makefile +8 -6
  8. data/ext/argon2_wrap/argon_wrap.c +23 -12
  9. data/ext/argon2_wrap/test.c +14 -42
  10. data/ext/phc-winner-argon2/.gitignore +5 -1
  11. data/ext/phc-winner-argon2/.travis.yml +14 -0
  12. data/ext/phc-winner-argon2/Makefile +33 -12
  13. data/ext/phc-winner-argon2/README.md +48 -19
  14. data/ext/phc-winner-argon2/argon2-specs.pdf +0 -0
  15. data/ext/phc-winner-argon2/{src → include}/argon2.h +137 -137
  16. data/ext/phc-winner-argon2/kats/argon2d +12290 -12290
  17. data/ext/phc-winner-argon2/kats/argon2d.shasum +1 -1
  18. data/ext/phc-winner-argon2/kats/argon2i +12290 -12290
  19. data/ext/phc-winner-argon2/kats/argon2i.shasum +1 -1
  20. data/ext/phc-winner-argon2/opt.o +0 -0
  21. data/ext/phc-winner-argon2/src/argon2.c +125 -145
  22. data/ext/phc-winner-argon2/src/bench.c +5 -5
  23. data/ext/phc-winner-argon2/src/core.c +15 -20
  24. data/ext/phc-winner-argon2/src/core.h +5 -2
  25. data/ext/phc-winner-argon2/src/encoding.c +45 -72
  26. data/ext/phc-winner-argon2/src/encoding.h +24 -0
  27. data/ext/phc-winner-argon2/src/genkat.c +2 -2
  28. data/ext/phc-winner-argon2/src/opt.c +19 -10
  29. data/ext/phc-winner-argon2/src/opt.h +5 -17
  30. data/ext/phc-winner-argon2/src/ref.c +12 -9
  31. data/ext/phc-winner-argon2/src/ref.h +4 -12
  32. data/ext/phc-winner-argon2/src/run.c +67 -42
  33. data/ext/phc-winner-argon2/src/test.c +131 -0
  34. data/lib/argon2.rb +6 -5
  35. data/lib/argon2/constants.rb +3 -2
  36. data/lib/argon2/engine.rb +1 -0
  37. data/lib/argon2/errors.rb +37 -36
  38. data/lib/argon2/ffi_engine.rb +10 -10
  39. data/lib/argon2/version.rb +2 -1
  40. metadata +7 -12
@@ -1 +1 @@
1
- 82ca18d6df38a67b1a52f610f19f1917e5b118014fe31995c83350b92319fa06 argon2i
1
+ 0d703f555eb72b8b36b4f486333aa130a5ebe32f39a96bbc439def0db569115a argon2i
@@ -11,102 +11,16 @@
11
11
  * <http://creativecommons.org/publicdomain/zero/1.0/>.
12
12
  */
13
13
 
14
- #include <stdint.h>
15
14
  #include <string.h>
16
15
  #include <stdlib.h>
17
16
  #include <stdio.h>
18
- #include <limits.h>
19
17
 
20
18
  #include "argon2.h"
21
19
  #include "encoding.h"
22
20
  #include "core.h"
23
21
 
24
- /* Error messages */
25
- static const char *Argon2_ErrorMessage[] = {
26
- /*{ARGON2_OK, */ "OK",
27
- /*},
28
-
29
- {ARGON2_OUTPUT_PTR_NULL, */ "Output pointer is NULL",
30
- /*},
31
-
32
- {ARGON2_OUTPUT_TOO_SHORT, */ "Output is too short",
33
- /*},
34
- {ARGON2_OUTPUT_TOO_LONG, */ "Output is too long",
35
- /*},
36
-
37
- {ARGON2_PWD_TOO_SHORT, */ "Password is too short",
38
- /*},
39
- {ARGON2_PWD_TOO_LONG, */ "Password is too long",
40
- /*},
41
-
42
- {ARGON2_SALT_TOO_SHORT, */ "Salt is too short",
43
- /*},
44
- {ARGON2_SALT_TOO_LONG, */ "Salt is too long",
45
- /*},
46
-
47
- {ARGON2_AD_TOO_SHORT, */ "Associated data is too short",
48
- /*},
49
- {ARGON2_AD_TOO_LONG, */ "Associated date is too long",
50
- /*},
51
-
52
- {ARGON2_SECRET_TOO_SHORT, */ "Secret is too short",
53
- /*},
54
- {ARGON2_SECRET_TOO_LONG, */ "Secret is too long",
55
- /*},
56
-
57
- {ARGON2_TIME_TOO_SMALL, */ "Time cost is too small",
58
- /*},
59
- {ARGON2_TIME_TOO_LARGE, */ "Time cost is too large",
60
- /*},
61
-
62
- {ARGON2_MEMORY_TOO_LITTLE, */ "Memory cost is too small",
63
- /*},
64
- {ARGON2_MEMORY_TOO_MUCH, */ "Memory cost is too large",
65
- /*},
66
-
67
- {ARGON2_LANES_TOO_FEW, */ "Too few lanes",
68
- /*},
69
- {ARGON2_LANES_TOO_MANY, */ "Too many lanes",
70
- /*},
71
-
72
- {ARGON2_PWD_PTR_MISMATCH, */ "Password pointer is NULL, but password length is not 0",
73
- /*},
74
- {ARGON2_SALT_PTR_MISMATCH, */ "Salt pointer is NULL, but salt length is not 0",
75
- /*},
76
- {ARGON2_SECRET_PTR_MISMATCH, */ "Secret pointer is NULL, but secret length is not 0",
77
- /*},
78
- {ARGON2_AD_PTR_MISMATCH, */ "Associated data pointer is NULL, but ad length is not 0",
79
- /*},
80
-
81
- {ARGON2_MEMORY_ALLOCATION_ERROR, */ "Memory allocation error",
82
- /*},
83
-
84
- {ARGON2_FREE_MEMORY_CBK_NULL, */ "The free memory callback is NULL",
85
- /*},
86
- {ARGON2_ALLOCATE_MEMORY_CBK_NULL, */ "The allocate memory callback is NULL",
87
- /*},
88
-
89
- {ARGON2_INCORRECT_PARAMETER, */ "Argon2_Context context is NULL",
90
- /*},
91
- {ARGON2_INCORRECT_TYPE, */ "There is no such version of Argon2",
92
- /*},
93
-
94
- {ARGON2_OUT_PTR_MISMATCH, */ "Output pointer mismatch",
95
- /*},
96
-
97
- {ARGON2_THREADS_TOO_FEW, */ "Not enough threads",
98
- /*},
99
- {ARGON2_THREADS_TOO_MANY, */ "Too many threads",
100
- /*},
101
- {ARGON2_MISSING_ARGS, */ "Missing arguments",
102
- /*},
103
- {ARGON2_ENCODING_FAIL, */ "Encoding failed",
104
- /*},
105
- {ARGON2_DECODING_FAIL, */ "Decoding failed", /*},*/
106
- };
107
-
108
-
109
- int argon2_core(argon2_context *context, argon2_type type) {
22
+
23
+ int argon2_ctx(argon2_context *context, argon2_type type) {
110
24
  /* 1. Validate all inputs */
111
25
  int result = validate_inputs(context);
112
26
  uint32_t memory_blocks, segment_length;
@@ -151,15 +65,17 @@ int argon2_core(argon2_context *context, argon2_type type) {
151
65
  }
152
66
 
153
67
  /* 4. Filling memory */
154
- fill_memory_blocks(&instance);
68
+ result = fill_memory_blocks(&instance);
155
69
 
70
+ if (ARGON2_OK != result) {
71
+ return result;
72
+ }
156
73
  /* 5. Finalization */
157
74
  finalize(context, &instance);
158
75
 
159
76
  return ARGON2_OK;
160
77
  }
161
78
 
162
-
163
79
  int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
164
80
  const uint32_t parallelism, const void *pwd,
165
81
  const size_t pwdlen, const void *salt, const size_t saltlen,
@@ -172,15 +88,15 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
172
88
 
173
89
  /* Detect and reject overflowing sizes */
174
90
  /* TODO: This should probably be fixed in the function signature */
175
- if (pwdlen > UINT32_MAX) {
91
+ if (pwdlen > ARGON2_MAX_PWD_LENGTH) {
176
92
  return ARGON2_PWD_TOO_LONG;
177
93
  }
178
94
 
179
- if (hashlen > UINT32_MAX) {
95
+ if (hashlen > ARGON2_MAX_OUTLEN) {
180
96
  return ARGON2_OUTPUT_TOO_LONG;
181
97
  }
182
98
 
183
- if (saltlen > UINT32_MAX) {
99
+ if (saltlen > ARGON2_MAX_SALT_LENGTH) {
184
100
  return ARGON2_SALT_TOO_LONG;
185
101
  }
186
102
 
@@ -191,9 +107,9 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
191
107
 
192
108
  context.out = (uint8_t *)out;
193
109
  context.outlen = (uint32_t)hashlen;
194
- context.pwd = (uint8_t *)pwd;
110
+ context.pwd = CONST_CAST(uint8_t *)pwd;
195
111
  context.pwdlen = (uint32_t)pwdlen;
196
- context.salt = (uint8_t *)salt;
112
+ context.salt = CONST_CAST(uint8_t *)salt;
197
113
  context.saltlen = (uint32_t)saltlen;
198
114
  context.secret = NULL;
199
115
  context.secretlen = 0;
@@ -207,10 +123,10 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
207
123
  context.free_cbk = NULL;
208
124
  context.flags = ARGON2_DEFAULT_FLAGS;
209
125
 
210
- result = argon2_core(&context, type);
126
+ result = argon2_ctx(&context, type);
211
127
 
212
128
  if (result != ARGON2_OK) {
213
- memset(out, 0x00, hashlen);
129
+ secure_wipe_memory(out, hashlen);
214
130
  free(out);
215
131
  return result;
216
132
  }
@@ -222,14 +138,14 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
222
138
 
223
139
  /* if encoding requested, write it */
224
140
  if (encoded && encodedlen) {
225
- if (!encode_string(encoded, encodedlen, &context, type)) {
226
- memset(out, 0x00, hashlen);
227
- memset(encoded, 0x00, encodedlen);
141
+ if (encode_string(encoded, encodedlen, &context, type) != ARGON2_OK) {
142
+ secure_wipe_memory(out, hashlen); /* wipe buffers if error */
143
+ secure_wipe_memory(encoded, encodedlen);
228
144
  free(out);
229
145
  return ARGON2_ENCODING_FAIL;
230
146
  }
231
147
  }
232
-
148
+ secure_wipe_memory(out, hashlen);
233
149
  free(out);
234
150
 
235
151
  return ARGON2_OK;
@@ -273,7 +189,7 @@ int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
273
189
  hash, hashlen, NULL, 0, Argon2_d);
274
190
  }
275
191
 
276
- int argon2_compare(const uint8_t *b1, const uint8_t *b2, size_t len) {
192
+ static int argon2_compare(const uint8_t *b1, const uint8_t *b2, size_t len) {
277
193
  size_t i;
278
194
  uint8_t d = 0U;
279
195
 
@@ -289,12 +205,17 @@ int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen,
289
205
  argon2_context ctx;
290
206
  uint8_t *out;
291
207
  int ret;
208
+ int decode_result;
292
209
 
293
210
  /* max values, to be updated in decode_string */
294
- ctx.adlen = 512;
295
- ctx.saltlen = 512;
296
- ctx.outlen = 512;
297
-
211
+ uint32_t encoded_len = strlen(encoded);
212
+ ctx.adlen = encoded_len;
213
+ ctx.saltlen = encoded_len;
214
+ ctx.outlen = encoded_len;
215
+ ctx.allocate_cbk = NULL;
216
+ ctx.free_cbk = NULL;
217
+ ctx.secret = NULL;
218
+ ctx.secretlen = 0;
298
219
  ctx.ad = malloc(ctx.adlen);
299
220
  ctx.salt = malloc(ctx.saltlen);
300
221
  ctx.out = malloc(ctx.outlen);
@@ -311,30 +232,28 @@ int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen,
311
232
  free(ctx.out);
312
233
  return ARGON2_MEMORY_ALLOCATION_ERROR;
313
234
  }
314
-
315
- if(decode_string(&ctx, encoded, type) != 1) {
235
+ decode_result = decode_string(&ctx, encoded, type);
236
+ if (decode_result != ARGON2_OK) {
316
237
  free(ctx.ad);
317
238
  free(ctx.salt);
318
239
  free(ctx.out);
319
240
  free(out);
320
- return ARGON2_DECODING_FAIL;
241
+ return decode_result;
321
242
  }
322
243
 
323
- ret = argon2_hash(ctx.t_cost, ctx.m_cost, ctx.threads, pwd, pwdlen, ctx.salt,
324
- ctx.saltlen, out, ctx.outlen, NULL, 0, type);
244
+ ret = argon2_hash(ctx.t_cost, ctx.m_cost, ctx.threads, pwd, pwdlen,
245
+ ctx.salt, ctx.saltlen, out, ctx.outlen, NULL, 0, type);
325
246
 
326
247
  free(ctx.ad);
327
248
  free(ctx.salt);
328
249
 
329
- if (ret != ARGON2_OK || argon2_compare(out, ctx.out, ctx.outlen)) {
330
- free(out);
331
- free(ctx.out);
332
- return ARGON2_DECODING_FAIL;
250
+ if (ret == ARGON2_OK && argon2_compare(out, ctx.out, ctx.outlen)) {
251
+ ret = ARGON2_VERIFY_MISMATCH;
333
252
  }
334
253
  free(out);
335
254
  free(ctx.out);
336
255
 
337
- return ARGON2_OK;
256
+ return ret;
338
257
  }
339
258
 
340
259
  int argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen) {
@@ -347,17 +266,22 @@ int argon2d_verify(const char *encoded, const void *pwd, const size_t pwdlen) {
347
266
  return argon2_verify(encoded, pwd, pwdlen, Argon2_d);
348
267
  }
349
268
 
350
- int argon2d(argon2_context *context) { return argon2_core(context, Argon2_d); }
269
+ int argon2d_ctx(argon2_context *context) {
270
+ return argon2_ctx(context, Argon2_d);
271
+ }
351
272
 
352
- int argon2i(argon2_context *context) { return argon2_core(context, Argon2_i); }
273
+ int argon2i_ctx(argon2_context *context) {
274
+ return argon2_ctx(context, Argon2_i);
275
+ }
353
276
 
354
- int verify_d(argon2_context *context, const char *hash) {
277
+ int argon2_verify_ctx(argon2_context *context, const char *hash,
278
+ argon2_type type) {
355
279
  int result;
356
280
  if (0 == context->outlen || NULL == hash) {
357
281
  return ARGON2_OUT_PTR_MISMATCH;
358
282
  }
359
283
 
360
- result = argon2_core(context, Argon2_d);
284
+ result = argon2_ctx(context, type);
361
285
 
362
286
  if (ARGON2_OK != result) {
363
287
  return result;
@@ -366,33 +290,89 @@ int verify_d(argon2_context *context, const char *hash) {
366
290
  return 0 == memcmp(hash, context->out, context->outlen);
367
291
  }
368
292
 
369
- int verify_i(argon2_context *context, const char *hash) {
370
- int result;
371
- if (0 == context->outlen || NULL == hash) {
372
- return ARGON2_OUT_PTR_MISMATCH;
373
- }
374
-
375
- result = argon2_core(context, Argon2_i);
376
-
377
- if (ARGON2_OK != result) {
378
- return result;
379
- }
380
-
381
- return 0 == memcmp(hash, context->out, context->outlen);
293
+ int argon2d_verify_ctx(argon2_context *context, const char *hash) {
294
+ return argon2_verify_ctx(context, hash, Argon2_d);
382
295
  }
383
296
 
297
+ int argon2i_verify_ctx(argon2_context *context, const char *hash) {
298
+ return argon2_verify_ctx(context, hash, Argon2_i);
299
+ }
384
300
 
385
- const char *error_message(int error_code) {
386
- enum {
387
- /* Make sure---at compile time---that the enum size matches the array
388
- size */
389
- ERROR_STRING_CHECK =
390
- 1 /
391
- !!((sizeof(Argon2_ErrorMessage) / sizeof(Argon2_ErrorMessage[0])) ==
392
- ARGON2_ERROR_CODES_LENGTH)
393
- };
394
- if (error_code < ARGON2_ERROR_CODES_LENGTH) {
395
- return Argon2_ErrorMessage[(argon2_error_codes)error_code];
301
+ const char *argon2_error_message(int error_code) {
302
+ switch (error_code) {
303
+ case ARGON2_OK:
304
+ return "OK";
305
+ case ARGON2_OUTPUT_PTR_NULL:
306
+ return "Output pointer is NULL";
307
+ case ARGON2_OUTPUT_TOO_SHORT:
308
+ return "Output is too short";
309
+ case ARGON2_OUTPUT_TOO_LONG:
310
+ return "Output is too long";
311
+ case ARGON2_PWD_TOO_SHORT:
312
+ return "Password is too short";
313
+ case ARGON2_PWD_TOO_LONG:
314
+ return "Password is too long";
315
+ case ARGON2_SALT_TOO_SHORT:
316
+ return "Salt is too short";
317
+ case ARGON2_SALT_TOO_LONG:
318
+ return "Salt is too long";
319
+ case ARGON2_AD_TOO_SHORT:
320
+ return "Associated data is too short";
321
+ case ARGON2_AD_TOO_LONG:
322
+ return "Associated data is too long";
323
+ case ARGON2_SECRET_TOO_SHORT:
324
+ return "Secret is too short";
325
+ case ARGON2_SECRET_TOO_LONG:
326
+ return "Secret is too long";
327
+ case ARGON2_TIME_TOO_SMALL:
328
+ return "Time cost is too small";
329
+ case ARGON2_TIME_TOO_LARGE:
330
+ return "Time cost is too large";
331
+ case ARGON2_MEMORY_TOO_LITTLE:
332
+ return "Memory cost is too small";
333
+ case ARGON2_MEMORY_TOO_MUCH:
334
+ return "Memory cost is too large";
335
+ case ARGON2_LANES_TOO_FEW:
336
+ return "Too few lanes";
337
+ case ARGON2_LANES_TOO_MANY:
338
+ return "Too many lanes";
339
+ case ARGON2_PWD_PTR_MISMATCH:
340
+ return "Password pointer is NULL, but password length is not 0";
341
+ case ARGON2_SALT_PTR_MISMATCH:
342
+ return "Salt pointer is NULL, but salt length is not 0";
343
+ case ARGON2_SECRET_PTR_MISMATCH:
344
+ return "Secret pointer is NULL, but secret length is not 0";
345
+ case ARGON2_AD_PTR_MISMATCH:
346
+ return "Associated data pointer is NULL, but ad length is not 0";
347
+ case ARGON2_MEMORY_ALLOCATION_ERROR:
348
+ return "Memory allocation error";
349
+ case ARGON2_FREE_MEMORY_CBK_NULL:
350
+ return "The free memory callback is NULL";
351
+ case ARGON2_ALLOCATE_MEMORY_CBK_NULL:
352
+ return "The allocate memory callback is NULL";
353
+ case ARGON2_INCORRECT_PARAMETER:
354
+ return "Argon2_Context context is NULL";
355
+ case ARGON2_INCORRECT_TYPE:
356
+ return "There is no such version of Argon2";
357
+ case ARGON2_OUT_PTR_MISMATCH:
358
+ return "Output pointer mismatch";
359
+ case ARGON2_THREADS_TOO_FEW:
360
+ return "Not enough threads";
361
+ case ARGON2_THREADS_TOO_MANY:
362
+ return "Too many threads";
363
+ case ARGON2_MISSING_ARGS:
364
+ return "Missing arguments";
365
+ case ARGON2_ENCODING_FAIL:
366
+ return "Encoding failed";
367
+ case ARGON2_DECODING_FAIL:
368
+ return "Decoding failed";
369
+ case ARGON2_THREAD_FAIL:
370
+ return "Threading failure";
371
+ case ARGON2_DECODING_LENGTH_FAIL:
372
+ return "Some of encoded parameters are too long or too short";
373
+ case ARGON2_VERIFY_MISMATCH:
374
+ return "The password does not match the supplied hash";
375
+ default:
376
+ return "Unknown error code";
396
377
  }
397
- return "Unknown error code.";
398
378
  }
@@ -42,16 +42,16 @@ static void benchmark() {
42
42
  #undef BENCH_INLEN
43
43
  #undef BENCH_OUTLEN
44
44
 
45
- uint32_t t_cost = 1;
45
+ uint32_t t_cost = 3;
46
46
  uint32_t m_cost;
47
- uint32_t thread_test[6] = {1, 2, 4, 6, 8, 16};
47
+ uint32_t thread_test[4] = {1, 2, 4, 8};
48
48
 
49
49
  memset(pwd_array, 0, inlen);
50
50
  memset(salt_array, 1, inlen);
51
51
 
52
52
  for (m_cost = (uint32_t)1 << 10; m_cost <= (uint32_t)1 << 22; m_cost *= 2) {
53
53
  unsigned i;
54
- for (i = 0; i < 6; ++i) {
54
+ for (i = 0; i < 4; ++i) {
55
55
  argon2_context context;
56
56
  uint32_t thread_n = thread_test[i];
57
57
  uint64_t stop_cycles, stop_cycles_i;
@@ -80,9 +80,9 @@ static void benchmark() {
80
80
  context.free_cbk = NULL;
81
81
  context.flags = 0;
82
82
 
83
- argon2d(&context);
83
+ argon2d_ctx(&context);
84
84
  stop_cycles = rdtsc();
85
- argon2i(&context);
85
+ argon2i_ctx(&context);
86
86
  stop_cycles_i = rdtsc();
87
87
  stop_time = clock();
88
88
 
@@ -88,12 +88,11 @@ int allocate_memory(block **memory, uint32_t m_cost) {
88
88
  return ARGON2_MEMORY_ALLOCATION_ERROR;
89
89
  }
90
90
 
91
- *memory = (block *)malloc(memory_size); /*2. Try to allocate*/
91
+ *memory = (block *)calloc(memory_size, 1); /*2. Try to allocate*/
92
92
 
93
93
  if (!*memory) {
94
94
  return ARGON2_MEMORY_ALLOCATION_ERROR;
95
95
  }
96
-
97
96
  return ARGON2_OK;
98
97
  } else {
99
98
  return ARGON2_MEMORY_ALLOCATION_ERROR;
@@ -249,25 +248,25 @@ static void *fill_segment_thr(void *thread_data)
249
248
  return 0;
250
249
  }
251
250
 
252
- void fill_memory_blocks(argon2_instance_t *instance) {
251
+ int fill_memory_blocks(argon2_instance_t *instance) {
253
252
  uint32_t r, s;
254
253
  argon2_thread_handle_t *thread = NULL;
255
254
  argon2_thread_data *thr_data = NULL;
256
255
 
257
256
  if (instance == NULL || instance->lanes == 0) {
258
- return;
257
+ return ARGON2_THREAD_FAIL;
259
258
  }
260
259
 
261
260
  /* 1. Allocating space for threads */
262
261
  thread = calloc(instance->lanes, sizeof(argon2_thread_handle_t));
263
262
  if (thread == NULL) {
264
- return;
263
+ return ARGON2_MEMORY_ALLOCATION_ERROR;
265
264
  }
266
265
 
267
266
  thr_data = calloc(instance->lanes, sizeof(argon2_thread_data));
268
267
  if (thr_data == NULL) {
269
268
  free(thread);
270
- return;
269
+ return ARGON2_MEMORY_ALLOCATION_ERROR;
271
270
  }
272
271
 
273
272
  for (r = 0; r < instance->passes; ++r) {
@@ -283,10 +282,9 @@ void fill_memory_blocks(argon2_instance_t *instance) {
283
282
  if (l >= instance->threads) {
284
283
  rc = argon2_thread_join(thread[l - instance->threads]);
285
284
  if (rc) {
286
- printf(
287
- "ERROR; return code from pthread_join() #1 is %d\n",
288
- rc);
289
- exit(-1);
285
+ free(thr_data);
286
+ free(thread);
287
+ return ARGON2_THREAD_FAIL;
290
288
  }
291
289
  }
292
290
 
@@ -302,13 +300,12 @@ void fill_memory_blocks(argon2_instance_t *instance) {
302
300
  rc = argon2_thread_create(&thread[l], &fill_segment_thr,
303
301
  (void *)&thr_data[l]);
304
302
  if (rc) {
305
- printf("ERROR; return code from argon2_thread_create() is "
306
- "%d\n",
307
- rc);
308
- exit(-1);
303
+ free(thr_data);
304
+ free(thread);
305
+ return ARGON2_THREAD_FAIL;
309
306
  }
310
307
 
311
- /* FillSegment(instance, position); */
308
+ /* fill_segment(instance, position); */
312
309
  /*Non-thread equivalent of the lines above */
313
310
  }
314
311
 
@@ -317,9 +314,7 @@ void fill_memory_blocks(argon2_instance_t *instance) {
317
314
  ++l) {
318
315
  rc = argon2_thread_join(thread[l]);
319
316
  if (rc) {
320
- printf("ERROR; return code from pthread_join() is %d\n",
321
- rc);
322
- exit(-1);
317
+ return ARGON2_THREAD_FAIL;
323
318
  }
324
319
  }
325
320
  }
@@ -335,6 +330,7 @@ void fill_memory_blocks(argon2_instance_t *instance) {
335
330
  if (thr_data != NULL) {
336
331
  free(thr_data);
337
332
  }
333
+ return ARGON2_OK;
338
334
  }
339
335
 
340
336
  int validate_inputs(const argon2_context *context) {
@@ -424,7 +420,7 @@ int validate_inputs(const argon2_context *context) {
424
420
  return ARGON2_MEMORY_TOO_MUCH;
425
421
  }
426
422
 
427
- if (context->m_cost < 8*context->lanes) {
423
+ if (context->m_cost < 8 * context->lanes) {
428
424
  return ARGON2_MEMORY_TOO_LITTLE;
429
425
  }
430
426
 
@@ -609,4 +605,3 @@ int initialize(argon2_instance_t *instance, argon2_context *context) {
609
605
 
610
606
  return ARGON2_OK;
611
607
  }
612
-