argon2 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +6 -5
  4. data/ext/argon2_wrap/argon_wrap.c +2 -1
  5. data/ext/argon2_wrap/test.c +5 -5
  6. data/ext/phc-winner-argon2/.gitattributes +5 -0
  7. data/ext/phc-winner-argon2/.gitignore +5 -0
  8. data/ext/phc-winner-argon2/Argon2.sln +98 -0
  9. data/ext/phc-winner-argon2/CHANGELOG.md +11 -0
  10. data/ext/phc-winner-argon2/Makefile +7 -2
  11. data/ext/phc-winner-argon2/README.md +27 -15
  12. data/ext/phc-winner-argon2/appveyor.yml +25 -0
  13. data/ext/phc-winner-argon2/export.sh +7 -0
  14. data/ext/phc-winner-argon2/include/argon2.h +24 -1
  15. data/ext/phc-winner-argon2/kats/argon2d +3 -1
  16. data/ext/phc-winner-argon2/kats/argon2d.shasum +1 -1
  17. data/ext/phc-winner-argon2/kats/argon2d_v16 +12304 -0
  18. data/ext/phc-winner-argon2/kats/argon2d_v16.shasum +1 -0
  19. data/ext/phc-winner-argon2/kats/argon2i +3 -1
  20. data/ext/phc-winner-argon2/kats/argon2i.shasum +1 -1
  21. data/ext/phc-winner-argon2/kats/argon2i_v16 +12304 -0
  22. data/ext/phc-winner-argon2/kats/argon2i_v16.shasum +1 -0
  23. data/ext/phc-winner-argon2/kats/check-sums.ps1 +42 -0
  24. data/ext/phc-winner-argon2/kats/check-sums.sh +1 -1
  25. data/ext/phc-winner-argon2/kats/test.ps1 +50 -0
  26. data/ext/phc-winner-argon2/kats/test.sh +45 -43
  27. data/ext/phc-winner-argon2/man/argon2.1 +47 -0
  28. data/ext/phc-winner-argon2/src/argon2.c +29 -15
  29. data/ext/phc-winner-argon2/src/bench.c +5 -22
  30. data/ext/phc-winner-argon2/src/core.c +3 -3
  31. data/ext/phc-winner-argon2/src/core.h +1 -3
  32. data/ext/phc-winner-argon2/src/encoding.c +22 -3
  33. data/ext/phc-winner-argon2/src/encoding.h +6 -0
  34. data/ext/phc-winner-argon2/src/genkat.c +23 -5
  35. data/ext/phc-winner-argon2/src/opt.c +42 -2
  36. data/ext/phc-winner-argon2/src/opt.h +10 -0
  37. data/ext/phc-winner-argon2/src/ref.c +51 -1
  38. data/ext/phc-winner-argon2/src/ref.h +10 -0
  39. data/ext/phc-winner-argon2/src/run.c +67 -42
  40. data/ext/phc-winner-argon2/src/test.c +160 -68
  41. data/ext/phc-winner-argon2/src/thread.c +1 -1
  42. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +158 -0
  43. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters +69 -0
  44. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +158 -0
  45. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters +69 -0
  46. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +167 -0
  47. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters +72 -0
  48. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +159 -0
  49. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters +69 -0
  50. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +158 -0
  51. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters +69 -0
  52. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +158 -0
  53. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters +69 -0
  54. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +159 -0
  55. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters +72 -0
  56. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +158 -0
  57. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters +69 -0
  58. data/lib/argon2.rb +5 -1
  59. data/lib/argon2/version.rb +1 -1
  60. metadata +29 -3
@@ -0,0 +1 @@
1
+ 334f03e627afb67b946a530b90d2e11fb2e6abb44df992c0fb3198c7bacf5930 argon2i_v16
@@ -0,0 +1,42 @@
1
+ Set-Variable tempfile -option Constant -value "tempfile"
2
+
3
+ function hash($path) {
4
+ $fullPath = Resolve-Path $path
5
+ $hash = new-object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider
6
+
7
+ $contents = [IO.File]::ReadAllText($fullPath) -replace "`r`n?", "`n"
8
+ # create UTF-8 encoding without signature
9
+ $utf8 = New-Object System.Text.UTF8Encoding $false
10
+ # write the text back
11
+ [IO.File]::WriteAllText($tempfile, $contents, $utf8)
12
+
13
+ $file = [System.IO.File]::Open($tempfile,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
14
+ $result = [System.BitConverter]::ToString($hash.ComputeHash($file))
15
+ $file.Dispose()
16
+
17
+ if (Test-Path $tempfile) {
18
+ Remove-Item $tempfile
19
+ }
20
+
21
+ return $result
22
+ }
23
+
24
+ function main() {
25
+ $files = $(Get-ChildItem * | Where-Object { $_.Name -match '^[a-z2]*(_v)?[0-9]*$' } | select -ExpandProperty name)
26
+
27
+ foreach ($file in $files) {
28
+ $new = $(hash $file).replace("-","")
29
+ $new = $new.ToLower()
30
+
31
+ $old=$(Get-Content $file".shasum")
32
+ $old = $old.Substring(0, $old.IndexOf(" "))
33
+
34
+ if ($new -eq $old) {
35
+ Write-Host $file "`tOK"
36
+ } else {
37
+ Write-Host $file "`tERROR"
38
+ }
39
+ }
40
+ }
41
+
42
+ main
@@ -1,6 +1,6 @@
1
1
  #!/bin/sh
2
2
 
3
- for file in `ls | grep '^[a-z2]*$' | xargs`
3
+ for file in `ls | grep '^[a-z2]*\(_v\)\?[0-9]*$' | xargs`
4
4
  do
5
5
  new=`shasum -a 256 $file`
6
6
  old=`cat $file.shasum`
@@ -0,0 +1,50 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ Set-Variable tempfile -option Constant -value "tempfile"
4
+
5
+ function CompareFiles($f1, $f2, $i) {
6
+ $f1_content = $(Get-Content $f1)
7
+ $f2_content = $(Get-Content $f2)
8
+
9
+ if (Compare-Object $f1_content $f2_content) {
10
+ Write-Host -NoNewline "ERROR"
11
+ exit $i
12
+ } else {
13
+ Write-Host -NoNewline "OK"
14
+ }
15
+ }
16
+
17
+ function main() {
18
+ $i = 0
19
+ foreach ($opt in @("Ref", "Opt")) {
20
+ Write-Output "$opt"
21
+
22
+ foreach ($version in @(16, 19)) {
23
+ foreach ($type in @("i", "d")) {
24
+ $i++
25
+
26
+ if ("Ref" -eq $opt) {
27
+ vs2015\build\Argon2RefGenKAT.exe $type $version > $tempfile
28
+ } else {
29
+ vs2015\build\Argon2OptGenKAT.exe $type $version > $tempfile
30
+ }
31
+
32
+ if (19 -eq $version) {
33
+ $kats = "kats\argon2" + $type
34
+ } else {
35
+ $kats = "kats\argon2" + $type + "_v" + $version
36
+ }
37
+
38
+ Write-Host -NoNewline "Argon2$type v=$version : "
39
+ CompareFiles $tempfile $kats $i
40
+ Write-Output ""
41
+ }
42
+ }
43
+ }
44
+
45
+ if (Test-Path $tempfile) {
46
+ Remove-Item $tempfile
47
+ }
48
+ }
49
+
50
+ main
@@ -1,47 +1,49 @@
1
1
  #!/bin/sh
2
2
 
3
- make genkat > /dev/null
4
- if [ $? -ne 0 ]
5
- then
6
- exit $?
7
- fi
8
-
9
- printf "argon2i "
10
- ./genkat i > tmp
11
- if diff tmp kats/argon2i
12
- then printf "OK"
13
- else printf "ERROR"
14
- fi
15
- printf "\n"
16
-
17
- printf "argon2d "
18
- ./genkat d > tmp
19
- if diff tmp kats/argon2d
20
- then printf "OK"
21
- else printf "ERROR"
22
- fi
23
- printf "\n"
24
-
25
- make genkat OPT=TRUE > /dev/null
26
- if [ $? -ne 0 ]
27
- then
28
- exit $?
29
- fi
30
-
31
- printf "argon2i "
32
- ./genkat i > tmp
33
- if diff tmp kats/argon2i
34
- then printf "OK"
35
- else printf "ERROR"
36
- fi
37
- printf "\n"
38
-
39
- printf "argon2d "
40
- ./genkat d > tmp
41
- if diff tmp kats/argon2d
42
- then printf "OK"
43
- else printf "ERROR"
44
- fi
45
- printf "\n"
3
+ for opttest in "" "OPTTEST=1"
4
+ do
5
+ if [ "" = "$opttest" ]
6
+ then
7
+ printf "Default build\n"
8
+ else
9
+ printf "Force OPTTEST=1\n"
10
+ fi
11
+
12
+ make genkat $opttest > /dev/null
13
+ if [ $? -ne 0 ]
14
+ then
15
+ exit $?
16
+ fi
17
+
18
+ i=0
19
+ for version in 16 19
20
+ do
21
+ for type in i d
22
+ do
23
+ i=$(($i+1))
24
+
25
+ printf "argon2$type v=$version: "
26
+
27
+ if [ 19 -eq $version ]
28
+ then
29
+ kats="kats/argon2"$type
30
+ else
31
+ kats="kats/argon2"$type"_v"$version
32
+ fi
33
+
34
+ ./genkat $type $version > tmp
35
+ if diff tmp $kats
36
+ then
37
+ printf "OK"
38
+ else
39
+ printf "ERROR"
40
+ exit $i
41
+ fi
42
+ printf "\n"
43
+ done
44
+ done
45
+ done
46
46
 
47
47
  rm -f tmp
48
+
49
+ exit 0
@@ -0,0 +1,47 @@
1
+ .TH ARGON2 "1" "April 2016" "argon2 " "User Commands"
2
+
3
+ .SH NAME
4
+ argon2 \- generate argon2 hashes
5
+
6
+ .SH SYNOPSIS
7
+ .B argon2 salt
8
+ .RB [ OPTIONS ]
9
+
10
+ .SH DESCRIPTION
11
+ Generate Argon2 hashes from the command line.
12
+
13
+ The supplied salt (the first argument to the command) must be at least
14
+ 8 octets in length, and the password is supplied on standard input.
15
+
16
+ By default, this uses Argon2i variant (where memory access is
17
+ independent of secret data) which is the preferred one for password
18
+ hashing and password-based key derivation.
19
+
20
+ .SH OPTIONS
21
+ .TP
22
+ .B \-d
23
+ Use Argon2d instead of Argon2i (Argon2i is the default)
24
+ .TP
25
+ .BI \-t " N"
26
+ Sets the number of iterations to N (default = 3)
27
+ .TP
28
+ .BI \-m " N"
29
+ Sets the memory usage of 2^N KiB (default = 12)
30
+ .TP
31
+ .BI \-p " N"
32
+ Sets parallelism to N threads (default = 1)
33
+ .TP
34
+ .BI \-h " N"
35
+ Sets hash output length to N bytes (default = 32)
36
+ .TP
37
+ .B \-e
38
+ Output only encoded hash
39
+ .TP
40
+ .B \-r
41
+ Output only the raw bytes of the hash
42
+
43
+ .SH COPYRIGHT
44
+ This manpage was written by \fBDaniel Kahn Gillmor\fR for the Debian
45
+ distribution (but may be used by others). It is released, like the
46
+ rest of this Argon2 implementation, under the terms of Creative
47
+ Commons 0 (CC0)
@@ -46,6 +46,7 @@ int argon2_ctx(argon2_context *context, argon2_type type) {
46
46
  /* Ensure that all segments have equal length */
47
47
  memory_blocks = segment_length * (context->lanes * ARGON2_SYNC_POINTS);
48
48
 
49
+ instance.version = context->version;
49
50
  instance.memory = NULL;
50
51
  instance.passes = context->t_cost;
51
52
  instance.memory_blocks = memory_blocks;
@@ -80,24 +81,19 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
80
81
  const uint32_t parallelism, const void *pwd,
81
82
  const size_t pwdlen, const void *salt, const size_t saltlen,
82
83
  void *hash, const size_t hashlen, char *encoded,
83
- const size_t encodedlen, argon2_type type) {
84
+ const size_t encodedlen, argon2_type type,
85
+ const uint32_t version){
84
86
 
85
87
  argon2_context context;
86
88
  int result;
87
89
  uint8_t *out;
88
90
 
89
- /* Detect and reject overflowing sizes */
90
- /* TODO: This should probably be fixed in the function signature */
91
- if (pwdlen > ARGON2_MAX_PWD_LENGTH) {
92
- return ARGON2_PWD_TOO_LONG;
93
- }
94
-
95
91
  if (hashlen > ARGON2_MAX_OUTLEN) {
96
92
  return ARGON2_OUTPUT_TOO_LONG;
97
93
  }
98
94
 
99
- if (saltlen > ARGON2_MAX_SALT_LENGTH) {
100
- return ARGON2_SALT_TOO_LONG;
95
+ if (hashlen < ARGON2_MIN_OUTLEN) {
96
+ return ARGON2_OUTPUT_TOO_SHORT;
101
97
  }
102
98
 
103
99
  out = malloc(hashlen);
@@ -122,6 +118,7 @@ int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
122
118
  context.allocate_cbk = NULL;
123
119
  context.free_cbk = NULL;
124
120
  context.flags = ARGON2_DEFAULT_FLAGS;
121
+ context.version = version;
125
122
 
126
123
  result = argon2_ctx(&context, type);
127
124
 
@@ -158,7 +155,8 @@ int argon2i_hash_encoded(const uint32_t t_cost, const uint32_t m_cost,
158
155
  char *encoded, const size_t encodedlen) {
159
156
 
160
157
  return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen,
161
- NULL, hashlen, encoded, encodedlen, Argon2_i);
158
+ NULL, hashlen, encoded, encodedlen, Argon2_i,
159
+ ARGON2_VERSION_NUMBER);
162
160
  }
163
161
 
164
162
  int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
@@ -167,7 +165,7 @@ int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
167
165
  const size_t saltlen, void *hash, const size_t hashlen) {
168
166
 
169
167
  return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen,
170
- hash, hashlen, NULL, 0, Argon2_i);
168
+ hash, hashlen, NULL, 0, Argon2_i, ARGON2_VERSION_NUMBER);
171
169
  }
172
170
 
173
171
  int argon2d_hash_encoded(const uint32_t t_cost, const uint32_t m_cost,
@@ -177,7 +175,8 @@ int argon2d_hash_encoded(const uint32_t t_cost, const uint32_t m_cost,
177
175
  char *encoded, const size_t encodedlen) {
178
176
 
179
177
  return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen,
180
- NULL, hashlen, encoded, encodedlen, Argon2_d);
178
+ NULL, hashlen, encoded, encodedlen, Argon2_d,
179
+ ARGON2_VERSION_NUMBER);
181
180
  }
182
181
 
183
182
  int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
@@ -186,7 +185,7 @@ int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
186
185
  const size_t saltlen, void *hash, const size_t hashlen) {
187
186
 
188
187
  return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen,
189
- hash, hashlen, NULL, 0, Argon2_d);
188
+ hash, hashlen, NULL, 0, Argon2_d, ARGON2_VERSION_NUMBER);
190
189
  }
191
190
 
192
191
  static int argon2_compare(const uint8_t *b1, const uint8_t *b2, size_t len) {
@@ -206,9 +205,14 @@ int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen,
206
205
  uint8_t *out;
207
206
  int ret;
208
207
  int decode_result;
208
+ uint32_t encoded_len;
209
+
210
+ if(encoded == NULL) {
211
+ return ARGON2_DECODING_FAIL;
212
+ }
209
213
 
210
214
  /* max values, to be updated in decode_string */
211
- uint32_t encoded_len = strlen(encoded);
215
+ encoded_len = strlen(encoded);
212
216
  ctx.adlen = encoded_len;
213
217
  ctx.saltlen = encoded_len;
214
218
  ctx.outlen = encoded_len;
@@ -216,6 +220,8 @@ int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen,
216
220
  ctx.free_cbk = NULL;
217
221
  ctx.secret = NULL;
218
222
  ctx.secretlen = 0;
223
+ ctx.pwdlen = 0;
224
+ ctx.pwd = NULL;
219
225
  ctx.ad = malloc(ctx.adlen);
220
226
  ctx.salt = malloc(ctx.saltlen);
221
227
  ctx.out = malloc(ctx.outlen);
@@ -242,7 +248,8 @@ int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen,
242
248
  }
243
249
 
244
250
  ret = argon2_hash(ctx.t_cost, ctx.m_cost, ctx.threads, pwd, pwdlen,
245
- ctx.salt, ctx.saltlen, out, ctx.outlen, NULL, 0, type);
251
+ ctx.salt, ctx.saltlen, out, ctx.outlen, NULL, 0, type,
252
+ ctx.version);
246
253
 
247
254
  free(ctx.ad);
248
255
  free(ctx.salt);
@@ -376,3 +383,10 @@ const char *argon2_error_message(int error_code) {
376
383
  return "Unknown error code";
377
384
  }
378
385
  }
386
+
387
+ size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, uint32_t parallelism,
388
+ uint32_t saltlen, uint32_t hashlen) {
389
+ return strlen("$argon2x$v=$m=,t=,p=$$") + numlen(t_cost) + numlen(m_cost)
390
+ + numlen(parallelism) + b64len(saltlen) + b64len(hashlen)
391
+ + numlen(ARGON2_VERSION_NUMBER);
392
+ }
@@ -52,7 +52,6 @@ static void benchmark() {
52
52
  for (m_cost = (uint32_t)1 << 10; m_cost <= (uint32_t)1 << 22; m_cost *= 2) {
53
53
  unsigned i;
54
54
  for (i = 0; i < 4; ++i) {
55
- argon2_context context;
56
55
  uint32_t thread_n = thread_test[i];
57
56
  uint64_t stop_cycles, stop_cycles_i;
58
57
  clock_t stop_time;
@@ -61,28 +60,12 @@ static void benchmark() {
61
60
 
62
61
  clock_t start_time = clock();
63
62
  uint64_t start_cycles = rdtsc();
64
-
65
- context.out = out;
66
- context.outlen = outlen;
67
- context.pwd = pwd_array;
68
- context.pwdlen = inlen;
69
- context.salt = salt_array;
70
- context.saltlen = inlen;
71
- context.secret = NULL;
72
- context.secretlen = 0;
73
- context.ad = NULL;
74
- context.adlen = 0;
75
- context.t_cost = t_cost;
76
- context.m_cost = m_cost;
77
- context.lanes = thread_n;
78
- context.threads = thread_n;
79
- context.allocate_cbk = NULL;
80
- context.free_cbk = NULL;
81
- context.flags = 0;
82
-
83
- argon2d_ctx(&context);
63
+
64
+ argon2d_hash_raw(t_cost, m_cost, thread_n, pwd_array, inlen,
65
+ salt_array, inlen, out, outlen);
84
66
  stop_cycles = rdtsc();
85
- argon2i_ctx(&context);
67
+ argon2i_hash_raw(t_cost, m_cost, thread_n, pwd_array, inlen,
68
+ salt_array, inlen, out, outlen);
86
69
  stop_cycles_i = rdtsc();
87
70
  stop_time = clock();
88
71
 
@@ -88,7 +88,7 @@ int allocate_memory(block **memory, uint32_t m_cost) {
88
88
  return ARGON2_MEMORY_ALLOCATION_ERROR;
89
89
  }
90
90
 
91
- *memory = (block *)calloc(memory_size, 1); /*2. Try to allocate*/
91
+ *memory = (block *)malloc(memory_size); /*2. Try to allocate*/
92
92
 
93
93
  if (!*memory) {
94
94
  return ARGON2_MEMORY_ALLOCATION_ERROR;
@@ -103,7 +103,7 @@ void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) {
103
103
  #if defined(_MSC_VER) && VC_GE_2005(_MSC_VER)
104
104
  SecureZeroMemory(v, n);
105
105
  #elif defined memset_s
106
- memset_s(v, n);
106
+ memset_s(v, n, 0, n);
107
107
  #elif defined(__OpenBSD__)
108
108
  explicit_bzero(v, n);
109
109
  #else
@@ -508,7 +508,7 @@ void initial_hash(uint8_t *blockhash, argon2_context *context,
508
508
  store32(&value, context->t_cost);
509
509
  blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
510
510
 
511
- store32(&value, ARGON2_VERSION_NUMBER);
511
+ store32(&value, context->version);
512
512
  blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value));
513
513
 
514
514
  store32(&value, (uint32_t)type);
@@ -30,9 +30,6 @@
30
30
  * constants**************************************************/
31
31
 
32
32
  enum argon2_core_constants {
33
- /* Version of the algorithm */
34
- ARGON2_VERSION_NUMBER = 0x13,
35
-
36
33
  /* Memory block size in bytes */
37
34
  ARGON2_BLOCK_SIZE = 1024,
38
35
  ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 8,
@@ -77,6 +74,7 @@ void xor_block(block *dst, const block *src);
77
74
  */
78
75
  typedef struct Argon2_instance_t {
79
76
  block *memory; /* Memory pointer */
77
+ uint32_t version;
80
78
  uint32_t passes; /* Number of passes */
81
79
  uint32_t memory_blocks; /* Number of blocks in memory */
82
80
  uint32_t segment_length;