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.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -9
- data/.travis.yml +0 -1
- data/CONTRIBUTING.md +12 -0
- data/Changelog.md +10 -11
- data/README.md +23 -14
- data/ext/argon2_wrap/Makefile +8 -6
- data/ext/argon2_wrap/argon_wrap.c +23 -12
- data/ext/argon2_wrap/test.c +14 -42
- data/ext/phc-winner-argon2/.gitignore +5 -1
- data/ext/phc-winner-argon2/.travis.yml +14 -0
- data/ext/phc-winner-argon2/Makefile +33 -12
- data/ext/phc-winner-argon2/README.md +48 -19
- data/ext/phc-winner-argon2/argon2-specs.pdf +0 -0
- data/ext/phc-winner-argon2/{src → include}/argon2.h +137 -137
- data/ext/phc-winner-argon2/kats/argon2d +12290 -12290
- data/ext/phc-winner-argon2/kats/argon2d.shasum +1 -1
- data/ext/phc-winner-argon2/kats/argon2i +12290 -12290
- data/ext/phc-winner-argon2/kats/argon2i.shasum +1 -1
- data/ext/phc-winner-argon2/opt.o +0 -0
- data/ext/phc-winner-argon2/src/argon2.c +125 -145
- data/ext/phc-winner-argon2/src/bench.c +5 -5
- data/ext/phc-winner-argon2/src/core.c +15 -20
- data/ext/phc-winner-argon2/src/core.h +5 -2
- data/ext/phc-winner-argon2/src/encoding.c +45 -72
- data/ext/phc-winner-argon2/src/encoding.h +24 -0
- data/ext/phc-winner-argon2/src/genkat.c +2 -2
- data/ext/phc-winner-argon2/src/opt.c +19 -10
- data/ext/phc-winner-argon2/src/opt.h +5 -17
- data/ext/phc-winner-argon2/src/ref.c +12 -9
- data/ext/phc-winner-argon2/src/ref.h +4 -12
- data/ext/phc-winner-argon2/src/run.c +67 -42
- data/ext/phc-winner-argon2/src/test.c +131 -0
- data/lib/argon2.rb +6 -5
- data/lib/argon2/constants.rb +3 -2
- data/lib/argon2/engine.rb +1 -0
- data/lib/argon2/errors.rb +37 -36
- data/lib/argon2/ffi_engine.rb +10 -10
- data/lib/argon2/version.rb +2 -1
- metadata +7 -12
@@ -1,21 +1,34 @@
|
|
1
1
|
# Argon2
|
2
2
|
|
3
|
+
[](https://travis-ci.org/P-H-C/phc-winner-argon2)
|
4
|
+
[](https://codecov.io/github/P-H-C/phc-winner-argon2?branch=master)
|
5
|
+
|
3
6
|
This is the reference C implementation of Argon2, the password-hashing
|
4
7
|
function that won the [Password Hashing Competition
|
5
|
-
(PHC)](https://password-hashing.net).
|
8
|
+
(PHC)](https://password-hashing.net).
|
9
|
+
|
10
|
+
Argon2 is a password-hashing function that summarizes the state of the
|
11
|
+
art in the design of memory-hard functions and can be used to hash
|
12
|
+
passwords for credential storage, key derivation, or other applications.
|
6
13
|
|
7
|
-
|
8
|
-
|
14
|
+
It has a simple design aimed at the highest memory filling rate and
|
15
|
+
effective use of multiple computing units, while still providing defense
|
16
|
+
against tradeoff attacks (by exploiting the cache and memory organization
|
17
|
+
of the recent processors).
|
9
18
|
|
10
|
-
|
11
|
-
|
12
|
-
|
19
|
+
Argon2 has two variants: Argon2d and Argon2i. Argon2d is faster and
|
20
|
+
uses data-depending memory access, which makes it highly resistant
|
21
|
+
against GPU cracking attacks and suitable for applications with no threats
|
22
|
+
from side-channel timing attacks (eg. cryptocurrencies). Argon2i instead
|
23
|
+
uses data-independent memory access, which is preferred for password
|
24
|
+
hashing and password-based key derivation, but it is slower as it makes
|
25
|
+
more passes over the memory to protect from tradeoff attacks.
|
13
26
|
|
14
|
-
Argon2i and Argon2d are parametrized by
|
27
|
+
Argon2i and Argon2d are parametrized by:
|
15
28
|
|
16
29
|
* A **time** cost, which defines the amount of computation realized and
|
17
30
|
therefore the execution time, given in number of iterations
|
18
|
-
* A **memory** cost, which defines the memory usage, given in kibibytes
|
31
|
+
* A **memory** cost, which defines the memory usage, given in kibibytes
|
19
32
|
* A **parallelism** degree, which defines the number of parallel threads
|
20
33
|
|
21
34
|
The [Argon2 document](argon2-specs.pdf) gives detailed specs and design
|
@@ -39,23 +52,25 @@ on your system. To show usage instructions, run
|
|
39
52
|
Usage: ./argon2 salt [-d] [-t iterations] [-m memory] [-p parallelism]
|
40
53
|
Password is read from stdin
|
41
54
|
Parameters:
|
42
|
-
salt The salt to use, at
|
55
|
+
salt The salt to use, at least 8 characters
|
43
56
|
-d Use Argon2d instead of Argon2i (which is the default)
|
44
57
|
-t N Sets the number of iterations to N (default = 3)
|
45
58
|
-m N Sets the memory usage of 2^N KiB (default 12)
|
46
59
|
-p N Sets parallelism to N threads (default 1)
|
60
|
+
-h N Sets hash output length to N bytes (default 32)
|
47
61
|
```
|
48
62
|
For example, to hash "password" using "somesalt" as a salt and doing 2
|
49
|
-
iterations, consuming 64 MiB,
|
63
|
+
iterations, consuming 64 MiB, using four parallel threads and an output hash
|
64
|
+
of 24 bytes
|
50
65
|
```
|
51
|
-
$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4
|
66
|
+
$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4 -h 24
|
52
67
|
Type: Argon2i
|
53
68
|
Iterations: 2
|
54
69
|
Memory: 65536 KiB
|
55
70
|
Parallelism: 4
|
56
|
-
Hash:
|
57
|
-
Encoded: $argon2i$m=65536,t=2,p=4$
|
58
|
-
0.
|
71
|
+
Hash: 5a028f1a99c9eae671ee448ab80057b78510430865abe57f
|
72
|
+
Encoded: $argon2i$m=65536,t=2,p=4$c29tZXNhbHQ$WgKPGpnJ6uZx7kSKuABXt4UQQwhlq+V/
|
73
|
+
0.188 seconds
|
59
74
|
Verification ok
|
60
75
|
```
|
61
76
|
|
@@ -68,7 +83,7 @@ The example program below hashes the string "password" with Argon2i
|
|
68
83
|
using the high-level API and then using the low-level API. While the
|
69
84
|
high-level API only takes input/output buffers and the two cost
|
70
85
|
parameters, the low-level API additionally takes parallelism parameters
|
71
|
-
and several others, as defined in [`
|
86
|
+
and several others, as defined in [`include/argon2.h`](include/argon2.h).
|
72
87
|
|
73
88
|
|
74
89
|
Here the time cost `t_cost` is set to 2 iterations, the
|
@@ -110,12 +125,12 @@ int main(void)
|
|
110
125
|
uint32_t lanes = parallelism;
|
111
126
|
uint32_t threads = parallelism;
|
112
127
|
argon2_context context = {
|
113
|
-
hash2, HASHLEN,
|
114
|
-
pwd, pwdlen,
|
128
|
+
hash2, HASHLEN,
|
129
|
+
pwd, pwdlen,
|
115
130
|
salt, SALTLEN,
|
116
131
|
NULL, 0, /* secret data */
|
117
132
|
NULL, 0, /* associated data */
|
118
|
-
t_cost, m_cost, parallelism, parallelism,
|
133
|
+
t_cost, m_cost, parallelism, parallelism,
|
119
134
|
NULL, NULL, /* custom memory allocation / deallocation functions */
|
120
135
|
ARGON2_DEFAULT_FLAGS /* by default the password is zeroed on exit */
|
121
136
|
};
|
@@ -140,7 +155,7 @@ To use Argon2d instead of Argon2i call `argon2d_hash` instead of
|
|
140
155
|
To produce the crypt-like encoding rather than the raw hash, call
|
141
156
|
`argon2i_hash_encoded` for Argon2i and `argon2d_hash_encoded` for Argon2d.
|
142
157
|
|
143
|
-
See [`
|
158
|
+
See [`include/argon2.h`](include/argon2.h) for API details.
|
144
159
|
|
145
160
|
*Note: in this example the salt is set to the all-`0x00` string for the
|
146
161
|
sake of simplicity, but in your application you should use a random salt.*
|
@@ -183,10 +198,24 @@ Argon2i 1 iterations 4096 MiB 4 threads: 2.72 cpb 11124.86 Mcycles
|
|
183
198
|
Bindings are available for the following languages (make sure to read
|
184
199
|
their documentation):
|
185
200
|
|
201
|
+
* [Go](https://github.com/tvdburgt/go-argon2) by [@tvdburgt](https://github.com/tvdburgt)
|
202
|
+
* [Haskell](https://hackage.haskell.org/package/argon2-1.0.0/docs/Crypto-Argon2.html) by [@ocharles](https://github.com/ocharles)
|
186
203
|
* [Javascript](https://github.com/ranisalt/node-argon2), by [@ranisalt](https://github.com/ranisalt)
|
204
|
+
* [JVM](https://github.com/phxql/argon2-jvm) by [@phXql](https://github.com/phxql)
|
205
|
+
* [Lua](https://github.com/thibaultCha/lua-argon2) by [@thibaultCha](https://github.com/thibaultCha)
|
206
|
+
* [OCaml](https://github.com/Khady/ocaml-argon2) by [@Khady](https://github.com/Khady)
|
187
207
|
* [Python](https://pypi.python.org/pypi/argon2), by [@flamewow](https://github.com/flamewow)
|
208
|
+
* [Python](https://pypi.python.org/pypi/argon2_cffi), by [@hynek](https://github.com/hynek)
|
188
209
|
* [Ruby](https://github.com/technion/ruby-argon2) by [@technion](https://github.com/technion)
|
210
|
+
* [Rust](https://github.com/quininer/argon2-rs) by [@quininer](https://github.com/quininer)
|
211
|
+
|
212
|
+
## Test Suite
|
213
|
+
|
214
|
+
There are two sets of test suites. One is a low level test for the hash
|
215
|
+
function, the other tests the higher level API. Both of these are built and
|
216
|
+
executed by running:
|
189
217
|
|
218
|
+
`make test`
|
190
219
|
|
191
220
|
## Intellectual property
|
192
221
|
|
Binary file
|
@@ -5,11 +5,11 @@
|
|
5
5
|
*
|
6
6
|
* This work is licensed under a Creative Commons CC0 1.0 License/Waiver.
|
7
7
|
*
|
8
|
-
* You should have received a copy of the CC0 Public Domain Dedication
|
9
|
-
* with
|
10
|
-
* this software. If not, see
|
8
|
+
* You should have received a copy of the CC0 Public Domain Dedication
|
9
|
+
* along with this software. If not, see
|
11
10
|
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
12
11
|
*/
|
12
|
+
|
13
13
|
#ifndef ARGON2_H
|
14
14
|
#define ARGON2_H
|
15
15
|
|
@@ -21,8 +21,16 @@
|
|
21
21
|
extern "C" {
|
22
22
|
#endif
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
/* Symbols visibility control */
|
25
|
+
#ifdef A2_VISCTL
|
26
|
+
#define ARGON2_PUBLIC __attribute__((visibility("default")))
|
27
|
+
#else
|
28
|
+
#define ARGON2_PUBLIC
|
29
|
+
#endif
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Argon2 input parameter restrictions
|
33
|
+
*/
|
26
34
|
|
27
35
|
/* Minimum and maximum number of lanes (degree of parallelism) */
|
28
36
|
#define ARGON2_MIN_LANES UINT32_C(1)
|
@@ -43,8 +51,7 @@ extern "C" {
|
|
43
51
|
#define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) /* 2 blocks per slice */
|
44
52
|
|
45
53
|
#define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b))
|
46
|
-
/* Max memory size is
|
47
|
-
*/
|
54
|
+
/* Max memory size is addressing-space/2, topping at 2^32 blocks (4 TB) */
|
48
55
|
#define ARGON2_MAX_MEMORY_BITS \
|
49
56
|
ARGON2_MIN(UINT32_C(32), (sizeof(void *) * CHAR_BIT - 10 - 1))
|
50
57
|
#define ARGON2_MAX_MEMORY \
|
@@ -79,59 +86,61 @@ extern "C" {
|
|
79
86
|
typedef enum Argon2_ErrorCodes {
|
80
87
|
ARGON2_OK = 0,
|
81
88
|
|
82
|
-
ARGON2_OUTPUT_PTR_NULL = 1,
|
89
|
+
ARGON2_OUTPUT_PTR_NULL = -1,
|
90
|
+
|
91
|
+
ARGON2_OUTPUT_TOO_SHORT = -2,
|
92
|
+
ARGON2_OUTPUT_TOO_LONG = -3,
|
83
93
|
|
84
|
-
|
85
|
-
|
94
|
+
ARGON2_PWD_TOO_SHORT = -4,
|
95
|
+
ARGON2_PWD_TOO_LONG = -5,
|
86
96
|
|
87
|
-
|
88
|
-
|
97
|
+
ARGON2_SALT_TOO_SHORT = -6,
|
98
|
+
ARGON2_SALT_TOO_LONG = -7,
|
89
99
|
|
90
|
-
|
91
|
-
|
100
|
+
ARGON2_AD_TOO_SHORT = -8,
|
101
|
+
ARGON2_AD_TOO_LONG = -9,
|
92
102
|
|
93
|
-
|
94
|
-
|
103
|
+
ARGON2_SECRET_TOO_SHORT = -10,
|
104
|
+
ARGON2_SECRET_TOO_LONG = -11,
|
95
105
|
|
96
|
-
|
97
|
-
|
106
|
+
ARGON2_TIME_TOO_SMALL = -12,
|
107
|
+
ARGON2_TIME_TOO_LARGE = -13,
|
98
108
|
|
99
|
-
|
100
|
-
|
109
|
+
ARGON2_MEMORY_TOO_LITTLE = -14,
|
110
|
+
ARGON2_MEMORY_TOO_MUCH = -15,
|
101
111
|
|
102
|
-
|
103
|
-
|
112
|
+
ARGON2_LANES_TOO_FEW = -16,
|
113
|
+
ARGON2_LANES_TOO_MANY = -17,
|
104
114
|
|
105
|
-
|
106
|
-
|
115
|
+
ARGON2_PWD_PTR_MISMATCH = -18, /* NULL ptr with non-zero length */
|
116
|
+
ARGON2_SALT_PTR_MISMATCH = -19, /* NULL ptr with non-zero length */
|
117
|
+
ARGON2_SECRET_PTR_MISMATCH = -20, /* NULL ptr with non-zero length */
|
118
|
+
ARGON2_AD_PTR_MISMATCH = -21, /* NULL ptr with non-zero length */
|
107
119
|
|
108
|
-
|
109
|
-
ARGON2_SALT_PTR_MISMATCH = 19, /* NULL ptr with non-zero length */
|
110
|
-
ARGON2_SECRET_PTR_MISMATCH = 20, /* NULL ptr with non-zero length */
|
111
|
-
ARGON2_AD_PTR_MISMATCH = 21, /* NULL ptr with non-zero length */
|
120
|
+
ARGON2_MEMORY_ALLOCATION_ERROR = -22,
|
112
121
|
|
113
|
-
|
122
|
+
ARGON2_FREE_MEMORY_CBK_NULL = -23,
|
123
|
+
ARGON2_ALLOCATE_MEMORY_CBK_NULL = -24,
|
114
124
|
|
115
|
-
|
116
|
-
|
125
|
+
ARGON2_INCORRECT_PARAMETER = -25,
|
126
|
+
ARGON2_INCORRECT_TYPE = -26,
|
117
127
|
|
118
|
-
|
119
|
-
ARGON2_INCORRECT_TYPE = 26,
|
128
|
+
ARGON2_OUT_PTR_MISMATCH = -27,
|
120
129
|
|
121
|
-
|
130
|
+
ARGON2_THREADS_TOO_FEW = -28,
|
131
|
+
ARGON2_THREADS_TOO_MANY = -29,
|
122
132
|
|
123
|
-
|
124
|
-
ARGON2_THREADS_TOO_MANY = 29,
|
133
|
+
ARGON2_MISSING_ARGS = -30,
|
125
134
|
|
126
|
-
|
135
|
+
ARGON2_ENCODING_FAIL = -31,
|
127
136
|
|
128
|
-
|
137
|
+
ARGON2_DECODING_FAIL = -32,
|
129
138
|
|
130
|
-
|
139
|
+
ARGON2_THREAD_FAIL = -33,
|
131
140
|
|
132
|
-
|
133
|
-
|
134
|
-
|
141
|
+
ARGON2_DECODING_LENGTH_FAIL = -34,
|
142
|
+
|
143
|
+
ARGON2_VERIFY_MISMATCH = -35
|
135
144
|
} argon2_error_codes;
|
136
145
|
|
137
146
|
/* Memory allocator types --- for external allocation */
|
@@ -141,28 +150,29 @@ typedef void (*deallocate_fptr)(uint8_t *memory, size_t bytes_to_allocate);
|
|
141
150
|
/* Argon2 external data structures */
|
142
151
|
|
143
152
|
/*
|
144
|
-
*****
|
145
|
-
*
|
146
|
-
*
|
147
|
-
*
|
148
|
-
*
|
149
|
-
*
|
150
|
-
*
|
151
|
-
*
|
153
|
+
*****
|
154
|
+
* Context: structure to hold Argon2 inputs:
|
155
|
+
* output array and its length,
|
156
|
+
* password and its length,
|
157
|
+
* salt and its length,
|
158
|
+
* secret and its length,
|
159
|
+
* associated data and its length,
|
160
|
+
* number of passes, amount of used memory (in KBytes, can be rounded up a bit)
|
161
|
+
* number of parallel threads that will be run.
|
152
162
|
* All the parameters above affect the output hash value.
|
153
163
|
* Additionally, two function pointers can be provided to allocate and
|
154
|
-
deallocate the memory (if NULL, memory will be allocated internally).
|
164
|
+
* deallocate the memory (if NULL, memory will be allocated internally).
|
155
165
|
* Also, three flags indicate whether to erase password, secret as soon as they
|
156
|
-
are pre-hashed (and thus not needed anymore), and the entire memory
|
157
|
-
|
158
|
-
Simplest situation: you have output array out[8], password is stored in
|
159
|
-
pwd[32], salt is stored in salt[16], you do not have keys nor associated
|
160
|
-
You need to spend 1 GB of RAM and you run 5 passes of Argon2d with
|
161
|
-
lanes.
|
162
|
-
You want to erase the password, but you're OK with last pass not being
|
163
|
-
You want to use the default memory allocator.
|
164
|
-
Then you initialize
|
165
|
-
Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false)
|
166
|
+
* are pre-hashed (and thus not needed anymore), and the entire memory
|
167
|
+
*****
|
168
|
+
* Simplest situation: you have output array out[8], password is stored in
|
169
|
+
* pwd[32], salt is stored in salt[16], you do not have keys nor associated
|
170
|
+
* data. You need to spend 1 GB of RAM and you run 5 passes of Argon2d with
|
171
|
+
* 4 parallel lanes.
|
172
|
+
* You want to erase the password, but you're OK with last pass not being
|
173
|
+
* erased. You want to use the default memory allocator.
|
174
|
+
* Then you initialize:
|
175
|
+
Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false)
|
166
176
|
*/
|
167
177
|
typedef struct Argon2_Context {
|
168
178
|
uint8_t *out; /* output array */
|
@@ -194,18 +204,17 @@ typedef struct Argon2_Context {
|
|
194
204
|
/* Argon2 primitive type */
|
195
205
|
typedef enum Argon2_type { Argon2_d = 0, Argon2_i = 1 } argon2_type;
|
196
206
|
|
197
|
-
|
198
207
|
/*
|
199
208
|
* Function that performs memory-hard hashing with certain degree of parallelism
|
200
209
|
* @param context Pointer to the Argon2 internal structure
|
201
210
|
* @return Error code if smth is wrong, ARGON2_OK otherwise
|
202
211
|
*/
|
203
|
-
int
|
212
|
+
ARGON2_PUBLIC int argon2_ctx(argon2_context *context, argon2_type type);
|
204
213
|
|
205
214
|
/**
|
206
215
|
* Hashes a password with Argon2i, producing an encoded hash
|
207
216
|
* @param t_cost Number of iterations
|
208
|
-
* @param m_cost Sets memory usage to
|
217
|
+
* @param m_cost Sets memory usage to m_cost kibibytes
|
209
218
|
* @param parallelism Number of threads and compute lanes
|
210
219
|
* @param pwd Pointer to password
|
211
220
|
* @param pwdlen Password size in bytes
|
@@ -217,130 +226,121 @@ int argon2_core(argon2_context *context, argon2_type type);
|
|
217
226
|
* @pre Different parallelism levels will give different results
|
218
227
|
* @pre Returns ARGON2_OK if successful
|
219
228
|
*/
|
220
|
-
int argon2i_hash_encoded(const uint32_t t_cost,
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
229
|
+
ARGON2_PUBLIC int argon2i_hash_encoded(const uint32_t t_cost,
|
230
|
+
const uint32_t m_cost,
|
231
|
+
const uint32_t parallelism,
|
232
|
+
const void *pwd, const size_t pwdlen,
|
233
|
+
const void *salt, const size_t saltlen,
|
234
|
+
const size_t hashlen, char *encoded,
|
235
|
+
const size_t encodedlen);
|
225
236
|
|
226
237
|
/**
|
227
|
-
* Hashes a password with Argon2i, producing a raw hash
|
238
|
+
* Hashes a password with Argon2i, producing a raw hash by allocating memory at
|
239
|
+
* @hash
|
228
240
|
* @param t_cost Number of iterations
|
229
|
-
* @param m_cost Sets memory usage to
|
241
|
+
* @param m_cost Sets memory usage to m_cost kibibytes
|
230
242
|
* @param parallelism Number of threads and compute lanes
|
231
243
|
* @param pwd Pointer to password
|
232
244
|
* @param pwdlen Password size in bytes
|
233
245
|
* @param salt Pointer to salt
|
234
246
|
* @param saltlen Salt size in bytes
|
235
|
-
* @param hash Buffer where to write the raw hash
|
247
|
+
* @param hash Buffer where to write the raw hash - updated by the function
|
236
248
|
* @param hashlen Desired length of the hash in bytes
|
237
249
|
* @pre Different parallelism levels will give different results
|
238
250
|
* @pre Returns ARGON2_OK if successful
|
239
251
|
*/
|
240
|
-
int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
252
|
+
ARGON2_PUBLIC int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
|
253
|
+
const uint32_t parallelism, const void *pwd,
|
254
|
+
const size_t pwdlen, const void *salt,
|
255
|
+
const size_t saltlen, void *hash,
|
256
|
+
const size_t hashlen);
|
257
|
+
|
258
|
+
ARGON2_PUBLIC int argon2d_hash_encoded(const uint32_t t_cost,
|
259
|
+
const uint32_t m_cost,
|
260
|
+
const uint32_t parallelism,
|
261
|
+
const void *pwd, const size_t pwdlen,
|
262
|
+
const void *salt, const size_t saltlen,
|
263
|
+
const size_t hashlen, char *encoded,
|
264
|
+
const size_t encodedlen);
|
265
|
+
|
266
|
+
ARGON2_PUBLIC int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
|
267
|
+
const uint32_t parallelism, const void *pwd,
|
268
|
+
const size_t pwdlen, const void *salt,
|
269
|
+
const size_t saltlen, void *hash,
|
270
|
+
const size_t hashlen);
|
255
271
|
|
256
272
|
/* generic function underlying the above ones */
|
257
|
-
int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
273
|
+
ARGON2_PUBLIC int argon2_hash(const uint32_t t_cost, const uint32_t m_cost,
|
274
|
+
const uint32_t parallelism, const void *pwd,
|
275
|
+
const size_t pwdlen, const void *salt,
|
276
|
+
const size_t saltlen, void *hash,
|
277
|
+
const size_t hashlen, char *encoded,
|
278
|
+
const size_t encodedlen, argon2_type type);
|
262
279
|
|
263
280
|
/**
|
264
281
|
* Verifies a password against an encoded string
|
282
|
+
* Encoded string is restricted as in validate_inputs()
|
265
283
|
* @param encoded String encoding parameters, salt, hash
|
266
284
|
* @param pwd Pointer to password
|
267
285
|
* @pre Returns ARGON2_OK if successful
|
268
286
|
*/
|
269
|
-
int argon2i_verify(const char *encoded, const void *pwd,
|
287
|
+
ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd,
|
288
|
+
const size_t pwdlen);
|
270
289
|
|
271
|
-
int argon2d_verify(const char *encoded, const void *pwd,
|
290
|
+
ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd,
|
291
|
+
const size_t pwdlen);
|
272
292
|
|
273
293
|
/* generic function underlying the above ones */
|
274
|
-
int argon2_verify(const char *encoded, const void *pwd,
|
275
|
-
|
294
|
+
ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd,
|
295
|
+
const size_t pwdlen, argon2_type type);
|
276
296
|
|
277
|
-
|
278
|
-
*
|
297
|
+
/**
|
298
|
+
* Argon2d: Version of Argon2 that picks memory blocks depending
|
279
299
|
* on the password and salt. Only for side-channel-free
|
280
|
-
* environment
|
281
|
-
|
282
|
-
* @return Zero if successful, a non zero error code otherwise
|
283
|
-
*/
|
284
|
-
int argon2d(argon2_context *context);
|
285
|
-
|
286
|
-
/*
|
287
|
-
* * **************Argon2i: Version of Argon2 that picks memory blocks
|
288
|
-
*independent on the password and salt. Good for side-channels,
|
289
|
-
******************* but worse w.r.t. tradeoff attacks if
|
290
|
-
*******************only one pass is used***************
|
291
|
-
* @param context Pointer to current Argon2 context
|
292
|
-
* @return Zero if successful, a non zero error code otherwise
|
293
|
-
*/
|
294
|
-
int argon2i(argon2_context *context);
|
295
|
-
|
296
|
-
/*
|
297
|
-
* * **************Argon2di: Reserved name***************
|
300
|
+
* environment!!
|
301
|
+
*****
|
298
302
|
* @param context Pointer to current Argon2 context
|
299
303
|
* @return Zero if successful, a non zero error code otherwise
|
300
304
|
*/
|
301
|
-
int
|
305
|
+
ARGON2_PUBLIC int argon2d_ctx(argon2_context *context);
|
302
306
|
|
303
|
-
|
304
|
-
*
|
305
|
-
*
|
306
|
-
*
|
307
|
-
|
308
|
-
*/
|
309
|
-
int argon2ds(argon2_context *context);
|
310
|
-
|
311
|
-
/*
|
312
|
-
* * **************Argon2id: First half-pass over memory is
|
313
|
-
*password-independent, the rest are password-dependent
|
314
|
-
********************OK against side channels: they reduce to 1/2-pass
|
315
|
-
*Argon2i***************
|
307
|
+
/**
|
308
|
+
* Argon2i: Version of Argon2 that picks memory blocks
|
309
|
+
* independent on the password and salt. Good for side-channels,
|
310
|
+
* but worse w.r.t. tradeoff attacks if only one pass is used.
|
311
|
+
*****
|
316
312
|
* @param context Pointer to current Argon2 context
|
317
313
|
* @return Zero if successful, a non zero error code otherwise
|
318
314
|
*/
|
319
|
-
int
|
315
|
+
ARGON2_PUBLIC int argon2i_ctx(argon2_context *context);
|
320
316
|
|
321
|
-
|
317
|
+
/**
|
322
318
|
* Verify if a given password is correct for Argon2d hashing
|
323
319
|
* @param context Pointer to current Argon2 context
|
324
320
|
* @param hash The password hash to verify. The length of the hash is
|
325
321
|
* specified by the context outlen member
|
326
322
|
* @return Zero if successful, a non zero error code otherwise
|
327
323
|
*/
|
328
|
-
int
|
324
|
+
ARGON2_PUBLIC int argon2d_verify_ctx(argon2_context *context, const char *hash);
|
329
325
|
|
330
|
-
|
326
|
+
/**
|
331
327
|
* Verify if a given password is correct for Argon2i hashing
|
332
328
|
* @param context Pointer to current Argon2 context
|
333
329
|
* @param hash The password hash to verify. The length of the hash is
|
334
330
|
* specified by the context outlen member
|
335
331
|
* @return Zero if successful, a non zero error code otherwise
|
336
332
|
*/
|
337
|
-
int
|
333
|
+
ARGON2_PUBLIC int argon2i_verify_ctx(argon2_context *context, const char *hash);
|
338
334
|
|
339
|
-
/*
|
335
|
+
/* generic function underlying the above ones */
|
336
|
+
ARGON2_PUBLIC int argon2_verify_ctx(argon2_context *context, const char *hash,
|
337
|
+
argon2_type type);
|
338
|
+
|
339
|
+
/**
|
340
340
|
* Get the associated error message for given error code
|
341
341
|
* @return The error message associated with the given error code
|
342
342
|
*/
|
343
|
-
const char *
|
343
|
+
ARGON2_PUBLIC const char *argon2_error_message(int error_code);
|
344
344
|
|
345
345
|
#if defined(__cplusplus)
|
346
346
|
}
|