xref: /netbsd-src/external/apache2/argon2/dist/phc-winner-argon2/src/test.c (revision 0090dad1538a6131df82f874b870c800d894ee40)
1*0090dad1Sjhigh /*
2*0090dad1Sjhigh  * Argon2 reference source code package - reference C implementations
3*0090dad1Sjhigh  *
4*0090dad1Sjhigh  * Copyright 2015
5*0090dad1Sjhigh  * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves
6*0090dad1Sjhigh  *
7*0090dad1Sjhigh  * You may use this work under the terms of a Creative Commons CC0 1.0
8*0090dad1Sjhigh  * License/Waiver or the Apache Public License 2.0, at your option. The terms of
9*0090dad1Sjhigh  * these licenses can be found at:
10*0090dad1Sjhigh  *
11*0090dad1Sjhigh  * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
12*0090dad1Sjhigh  * - Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0
13*0090dad1Sjhigh  *
14*0090dad1Sjhigh  * You should have received a copy of both of these licenses along with this
15*0090dad1Sjhigh  * software. If not, they may be obtained at the above URLs.
16*0090dad1Sjhigh  */
17*0090dad1Sjhigh 
18*0090dad1Sjhigh #include <stdio.h>
19*0090dad1Sjhigh #include <stdint.h>
20*0090dad1Sjhigh #include <stdlib.h>
21*0090dad1Sjhigh #include <string.h>
22*0090dad1Sjhigh #include <time.h>
23*0090dad1Sjhigh #include <assert.h>
24*0090dad1Sjhigh 
25*0090dad1Sjhigh #include "argon2.h"
26*0090dad1Sjhigh 
27*0090dad1Sjhigh #define OUT_LEN 32
28*0090dad1Sjhigh #define ENCODED_LEN 108
29*0090dad1Sjhigh 
30*0090dad1Sjhigh /* Test harness will assert:
31*0090dad1Sjhigh  * argon2_hash() returns ARGON2_OK
32*0090dad1Sjhigh  * HEX output matches expected
33*0090dad1Sjhigh  * encoded output matches expected
34*0090dad1Sjhigh  * argon2_verify() correctly verifies value
35*0090dad1Sjhigh  */
36*0090dad1Sjhigh 
hashtest(uint32_t version,uint32_t t,uint32_t m,uint32_t p,char * pwd,char * salt,char * hexref,char * mcfref,argon2_type type)37*0090dad1Sjhigh void hashtest(uint32_t version, uint32_t t, uint32_t m, uint32_t p, char *pwd,
38*0090dad1Sjhigh               char *salt, char *hexref, char *mcfref, argon2_type type) {
39*0090dad1Sjhigh     unsigned char out[OUT_LEN];
40*0090dad1Sjhigh     unsigned char hex_out[OUT_LEN * 2 + 4];
41*0090dad1Sjhigh     char encoded[ENCODED_LEN];
42*0090dad1Sjhigh     int ret, i;
43*0090dad1Sjhigh 
44*0090dad1Sjhigh     printf("Hash test: $v=%d t=%d, m=%d, p=%d, pass=%s, salt=%s: ", version,
45*0090dad1Sjhigh            t, m, p, pwd, salt);
46*0090dad1Sjhigh 
47*0090dad1Sjhigh     ret = argon2_hash(t, 1 << m, p, pwd, strlen(pwd), salt, strlen(salt), out,
48*0090dad1Sjhigh                       OUT_LEN, encoded, ENCODED_LEN, type, version);
49*0090dad1Sjhigh     assert(ret == ARGON2_OK);
50*0090dad1Sjhigh 
51*0090dad1Sjhigh     for (i = 0; i < OUT_LEN; ++i)
52*0090dad1Sjhigh         sprintf((char *)(hex_out + i * 2), "%02x", out[i]);
53*0090dad1Sjhigh     assert(memcmp(hex_out, hexref, OUT_LEN * 2) == 0);
54*0090dad1Sjhigh 
55*0090dad1Sjhigh     if (ARGON2_VERSION_NUMBER == version) {
56*0090dad1Sjhigh         assert(memcmp(encoded, mcfref, strlen(mcfref)) == 0);
57*0090dad1Sjhigh     }
58*0090dad1Sjhigh 
59*0090dad1Sjhigh     ret = argon2_verify(encoded, pwd, strlen(pwd), type);
60*0090dad1Sjhigh     assert(ret == ARGON2_OK);
61*0090dad1Sjhigh     ret = argon2_verify(mcfref, pwd, strlen(pwd), type);
62*0090dad1Sjhigh     assert(ret == ARGON2_OK);
63*0090dad1Sjhigh 
64*0090dad1Sjhigh     printf("PASS\n");
65*0090dad1Sjhigh }
66*0090dad1Sjhigh 
main()67*0090dad1Sjhigh int main() {
68*0090dad1Sjhigh     int ret;
69*0090dad1Sjhigh     unsigned char out[OUT_LEN];
70*0090dad1Sjhigh     char const *msg;
71*0090dad1Sjhigh     int version;
72*0090dad1Sjhigh 
73*0090dad1Sjhigh     version = ARGON2_VERSION_10;
74*0090dad1Sjhigh     printf("Test Argon2i version number: %02x\n", version);
75*0090dad1Sjhigh 
76*0090dad1Sjhigh     /* Multiple test cases for various input values */
77*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "somesalt",
78*0090dad1Sjhigh              "f6c4db4a54e2a370627aff3db6176b94a2a209a62c8e36152711802f7b30c694",
79*0090dad1Sjhigh              "$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ"
80*0090dad1Sjhigh              "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", Argon2_i);
81*0090dad1Sjhigh #ifdef TEST_LARGE_RAM
82*0090dad1Sjhigh     hashtest(version, 2, 20, 1, "password", "somesalt",
83*0090dad1Sjhigh             "9690ec55d28d3ed32562f2e73ea62b02b018757643a2ae6e79528459de8106e9",
84*0090dad1Sjhigh             "$argon2i$m=1048576,t=2,p=1$c29tZXNhbHQ"
85*0090dad1Sjhigh             "$lpDsVdKNPtMlYvLnPqYrArAYdXZDoq5ueVKEWd6BBuk", Argon2_i);
86*0090dad1Sjhigh #endif
87*0090dad1Sjhigh     hashtest(version, 2, 18, 1, "password", "somesalt",
88*0090dad1Sjhigh              "3e689aaa3d28a77cf2bc72a51ac53166761751182f1ee292e3f677a7da4c2467",
89*0090dad1Sjhigh              "$argon2i$m=262144,t=2,p=1$c29tZXNhbHQ"
90*0090dad1Sjhigh              "$Pmiaqj0op3zyvHKlGsUxZnYXURgvHuKS4/Z3p9pMJGc", Argon2_i);
91*0090dad1Sjhigh     hashtest(version, 2, 8, 1, "password", "somesalt",
92*0090dad1Sjhigh              "fd4dd83d762c49bdeaf57c47bdcd0c2f1babf863fdeb490df63ede9975fccf06",
93*0090dad1Sjhigh              "$argon2i$m=256,t=2,p=1$c29tZXNhbHQ"
94*0090dad1Sjhigh              "$/U3YPXYsSb3q9XxHvc0MLxur+GP960kN9j7emXX8zwY", Argon2_i);
95*0090dad1Sjhigh     hashtest(version, 2, 8, 2, "password", "somesalt",
96*0090dad1Sjhigh              "b6c11560a6a9d61eac706b79a2f97d68b4463aa3ad87e00c07e2b01e90c564fb",
97*0090dad1Sjhigh              "$argon2i$m=256,t=2,p=2$c29tZXNhbHQ"
98*0090dad1Sjhigh              "$tsEVYKap1h6scGt5ovl9aLRGOqOth+AMB+KwHpDFZPs", Argon2_i);
99*0090dad1Sjhigh     hashtest(version, 1, 16, 1, "password", "somesalt",
100*0090dad1Sjhigh              "81630552b8f3b1f48cdb1992c4c678643d490b2b5eb4ff6c4b3438b5621724b2",
101*0090dad1Sjhigh              "$argon2i$m=65536,t=1,p=1$c29tZXNhbHQ"
102*0090dad1Sjhigh              "$gWMFUrjzsfSM2xmSxMZ4ZD1JCytetP9sSzQ4tWIXJLI", Argon2_i);
103*0090dad1Sjhigh     hashtest(version, 4, 16, 1, "password", "somesalt",
104*0090dad1Sjhigh              "f212f01615e6eb5d74734dc3ef40ade2d51d052468d8c69440a3a1f2c1c2847b",
105*0090dad1Sjhigh              "$argon2i$m=65536,t=4,p=1$c29tZXNhbHQ"
106*0090dad1Sjhigh              "$8hLwFhXm6110c03D70Ct4tUdBSRo2MaUQKOh8sHChHs", Argon2_i);
107*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "differentpassword", "somesalt",
108*0090dad1Sjhigh              "e9c902074b6754531a3a0be519e5baf404b30ce69b3f01ac3bf21229960109a3",
109*0090dad1Sjhigh              "$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ"
110*0090dad1Sjhigh              "$6ckCB0tnVFMaOgvlGeW69ASzDOabPwGsO/ISKZYBCaM", Argon2_i);
111*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "diffsalt",
112*0090dad1Sjhigh              "79a103b90fe8aef8570cb31fc8b22259778916f8336b7bdac3892569d4f1c497",
113*0090dad1Sjhigh              "$argon2i$m=65536,t=2,p=1$ZGlmZnNhbHQ"
114*0090dad1Sjhigh              "$eaEDuQ/orvhXDLMfyLIiWXeJFvgza3vaw4kladTxxJc", Argon2_i);
115*0090dad1Sjhigh 
116*0090dad1Sjhigh     /* Error state tests */
117*0090dad1Sjhigh 
118*0090dad1Sjhigh     /* Handle an invalid encoding correctly (it is missing a $) */
119*0090dad1Sjhigh     ret = argon2_verify("$argon2i$m=65536,t=2,p=1c29tZXNhbHQ"
120*0090dad1Sjhigh                         "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ",
121*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
122*0090dad1Sjhigh     assert(ret == ARGON2_DECODING_FAIL);
123*0090dad1Sjhigh     printf("Recognise an invalid encoding: PASS\n");
124*0090dad1Sjhigh 
125*0090dad1Sjhigh     /* Handle an invalid encoding correctly (it is missing a $) */
126*0090dad1Sjhigh     ret = argon2_verify("$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ"
127*0090dad1Sjhigh                         "9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ",
128*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
129*0090dad1Sjhigh     assert(ret == ARGON2_DECODING_FAIL);
130*0090dad1Sjhigh     printf("Recognise an invalid encoding: PASS\n");
131*0090dad1Sjhigh 
132*0090dad1Sjhigh     /* Handle an invalid encoding correctly (salt is too short) */
133*0090dad1Sjhigh     ret = argon2_verify("$argon2i$m=65536,t=2,p=1$"
134*0090dad1Sjhigh                         "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ",
135*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
136*0090dad1Sjhigh     assert(ret == ARGON2_SALT_TOO_SHORT);
137*0090dad1Sjhigh     printf("Recognise an invalid salt in encoding: PASS\n");
138*0090dad1Sjhigh 
139*0090dad1Sjhigh     /* Handle an mismatching hash (the encoded password is "passwore") */
140*0090dad1Sjhigh     ret = argon2_verify("$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ"
141*0090dad1Sjhigh                         "$b2G3seW+uPzerwQQC+/E1K50CLLO7YXy0JRcaTuswRo",
142*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
143*0090dad1Sjhigh     assert(ret == ARGON2_VERIFY_MISMATCH);
144*0090dad1Sjhigh     printf("Verify with mismatched password: PASS\n");
145*0090dad1Sjhigh 
146*0090dad1Sjhigh     msg = argon2_error_message(ARGON2_DECODING_FAIL);
147*0090dad1Sjhigh     assert(strcmp(msg, "Decoding failed") == 0);
148*0090dad1Sjhigh     printf("Decode an error message: PASS\n");
149*0090dad1Sjhigh 
150*0090dad1Sjhigh     printf("\n");
151*0090dad1Sjhigh 
152*0090dad1Sjhigh     version = ARGON2_VERSION_NUMBER;
153*0090dad1Sjhigh     printf("Test Argon2i version number: %02x\n", version);
154*0090dad1Sjhigh 
155*0090dad1Sjhigh     /* Multiple test cases for various input values */
156*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "somesalt",
157*0090dad1Sjhigh              "c1628832147d9720c5bd1cfd61367078729f6dfb6f8fea9ff98158e0d7816ed0",
158*0090dad1Sjhigh              "$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
159*0090dad1Sjhigh              "$wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA", Argon2_i);
160*0090dad1Sjhigh #ifdef TEST_LARGE_RAM
161*0090dad1Sjhigh     hashtest(version, 2, 20, 1, "password", "somesalt",
162*0090dad1Sjhigh              "d1587aca0922c3b5d6a83edab31bee3c4ebaef342ed6127a55d19b2351ad1f41",
163*0090dad1Sjhigh              "$argon2i$v=19$m=1048576,t=2,p=1$c29tZXNhbHQ"
164*0090dad1Sjhigh              "$0Vh6ygkiw7XWqD7asxvuPE667zQu1hJ6VdGbI1GtH0E", Argon2_i);
165*0090dad1Sjhigh #endif
166*0090dad1Sjhigh     hashtest(version, 2, 18, 1, "password", "somesalt",
167*0090dad1Sjhigh              "296dbae80b807cdceaad44ae741b506f14db0959267b183b118f9b24229bc7cb",
168*0090dad1Sjhigh              "$argon2i$v=19$m=262144,t=2,p=1$c29tZXNhbHQ"
169*0090dad1Sjhigh              "$KW266AuAfNzqrUSudBtQbxTbCVkmexg7EY+bJCKbx8s", Argon2_i);
170*0090dad1Sjhigh     hashtest(version, 2, 8, 1, "password", "somesalt",
171*0090dad1Sjhigh              "89e9029f4637b295beb027056a7336c414fadd43f6b208645281cb214a56452f",
172*0090dad1Sjhigh              "$argon2i$v=19$m=256,t=2,p=1$c29tZXNhbHQ"
173*0090dad1Sjhigh              "$iekCn0Y3spW+sCcFanM2xBT63UP2sghkUoHLIUpWRS8", Argon2_i);
174*0090dad1Sjhigh     hashtest(version, 2, 8, 2, "password", "somesalt",
175*0090dad1Sjhigh              "4ff5ce2769a1d7f4c8a491df09d41a9fbe90e5eb02155a13e4c01e20cd4eab61",
176*0090dad1Sjhigh              "$argon2i$v=19$m=256,t=2,p=2$c29tZXNhbHQ"
177*0090dad1Sjhigh              "$T/XOJ2mh1/TIpJHfCdQan76Q5esCFVoT5MAeIM1Oq2E", Argon2_i);
178*0090dad1Sjhigh     hashtest(version, 1, 16, 1, "password", "somesalt",
179*0090dad1Sjhigh              "d168075c4d985e13ebeae560cf8b94c3b5d8a16c51916b6f4ac2da3ac11bbecf",
180*0090dad1Sjhigh              "$argon2i$v=19$m=65536,t=1,p=1$c29tZXNhbHQ"
181*0090dad1Sjhigh              "$0WgHXE2YXhPr6uVgz4uUw7XYoWxRkWtvSsLaOsEbvs8", Argon2_i);
182*0090dad1Sjhigh     hashtest(version, 4, 16, 1, "password", "somesalt",
183*0090dad1Sjhigh              "aaa953d58af3706ce3df1aefd4a64a84e31d7f54175231f1285259f88174ce5b",
184*0090dad1Sjhigh              "$argon2i$v=19$m=65536,t=4,p=1$c29tZXNhbHQ"
185*0090dad1Sjhigh              "$qqlT1YrzcGzj3xrv1KZKhOMdf1QXUjHxKFJZ+IF0zls", Argon2_i);
186*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "differentpassword", "somesalt",
187*0090dad1Sjhigh              "14ae8da01afea8700c2358dcef7c5358d9021282bd88663a4562f59fb74d22ee",
188*0090dad1Sjhigh              "$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
189*0090dad1Sjhigh              "$FK6NoBr+qHAMI1jc73xTWNkCEoK9iGY6RWL1n7dNIu4", Argon2_i);
190*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "diffsalt",
191*0090dad1Sjhigh              "b0357cccfbef91f3860b0dba447b2348cbefecadaf990abfe9cc40726c521271",
192*0090dad1Sjhigh              "$argon2i$v=19$m=65536,t=2,p=1$ZGlmZnNhbHQ"
193*0090dad1Sjhigh              "$sDV8zPvvkfOGCw26RHsjSMvv7K2vmQq/6cxAcmxSEnE", Argon2_i);
194*0090dad1Sjhigh 
195*0090dad1Sjhigh 
196*0090dad1Sjhigh     /* Error state tests */
197*0090dad1Sjhigh 
198*0090dad1Sjhigh     /* Handle an invalid encoding correctly (it is missing a $) */
199*0090dad1Sjhigh     ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1c29tZXNhbHQ"
200*0090dad1Sjhigh                         "$wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA",
201*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
202*0090dad1Sjhigh     assert(ret == ARGON2_DECODING_FAIL);
203*0090dad1Sjhigh     printf("Recognise an invalid encoding: PASS\n");
204*0090dad1Sjhigh 
205*0090dad1Sjhigh     /* Handle an invalid encoding correctly (it is missing a $) */
206*0090dad1Sjhigh     ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
207*0090dad1Sjhigh                         "wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA",
208*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
209*0090dad1Sjhigh     assert(ret == ARGON2_DECODING_FAIL);
210*0090dad1Sjhigh     printf("Recognise an invalid encoding: PASS\n");
211*0090dad1Sjhigh 
212*0090dad1Sjhigh     /* Handle an invalid encoding correctly (salt is too short) */
213*0090dad1Sjhigh     ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$"
214*0090dad1Sjhigh                         "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ",
215*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
216*0090dad1Sjhigh     assert(ret == ARGON2_SALT_TOO_SHORT);
217*0090dad1Sjhigh     printf("Recognise an invalid salt in encoding: PASS\n");
218*0090dad1Sjhigh 
219*0090dad1Sjhigh     /* Handle an mismatching hash (the encoded password is "passwore") */
220*0090dad1Sjhigh     ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
221*0090dad1Sjhigh                         "$8iIuixkI73Js3G1uMbezQXD0b8LG4SXGsOwoQkdAQIM",
222*0090dad1Sjhigh                         "password", strlen("password"), Argon2_i);
223*0090dad1Sjhigh     assert(ret == ARGON2_VERIFY_MISMATCH);
224*0090dad1Sjhigh     printf("Verify with mismatched password: PASS\n");
225*0090dad1Sjhigh 
226*0090dad1Sjhigh     msg = argon2_error_message(ARGON2_DECODING_FAIL);
227*0090dad1Sjhigh     assert(strcmp(msg, "Decoding failed") == 0);
228*0090dad1Sjhigh     printf("Decode an error message: PASS\n\n");
229*0090dad1Sjhigh 
230*0090dad1Sjhigh     printf("Test Argon2id version number: %02x\n", version);
231*0090dad1Sjhigh 
232*0090dad1Sjhigh     /* Multiple test cases for various input values */
233*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "somesalt",
234*0090dad1Sjhigh              "09316115d5cf24ed5a15a31a3ba326e5cf32edc24702987c02b6566f61913cf7",
235*0090dad1Sjhigh              "$argon2id$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
236*0090dad1Sjhigh              "$CTFhFdXPJO1aFaMaO6Mm5c8y7cJHAph8ArZWb2GRPPc", Argon2_id);
237*0090dad1Sjhigh     hashtest(version, 2, 18, 1, "password", "somesalt",
238*0090dad1Sjhigh              "78fe1ec91fb3aa5657d72e710854e4c3d9b9198c742f9616c2f085bed95b2e8c",
239*0090dad1Sjhigh              "$argon2id$v=19$m=262144,t=2,p=1$c29tZXNhbHQ"
240*0090dad1Sjhigh              "$eP4eyR+zqlZX1y5xCFTkw9m5GYx0L5YWwvCFvtlbLow", Argon2_id);
241*0090dad1Sjhigh     hashtest(version, 2, 8, 1, "password", "somesalt",
242*0090dad1Sjhigh              "9dfeb910e80bad0311fee20f9c0e2b12c17987b4cac90c2ef54d5b3021c68bfe",
243*0090dad1Sjhigh              "$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ"
244*0090dad1Sjhigh              "$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4", Argon2_id);
245*0090dad1Sjhigh     hashtest(version, 2, 8, 2, "password", "somesalt",
246*0090dad1Sjhigh              "6d093c501fd5999645e0ea3bf620d7b8be7fd2db59c20d9fff9539da2bf57037",
247*0090dad1Sjhigh              "$argon2id$v=19$m=256,t=2,p=2$c29tZXNhbHQ"
248*0090dad1Sjhigh              "$bQk8UB/VmZZF4Oo79iDXuL5/0ttZwg2f/5U52iv1cDc", Argon2_id);
249*0090dad1Sjhigh     hashtest(version, 1, 16, 1, "password", "somesalt",
250*0090dad1Sjhigh              "f6a5adc1ba723dddef9b5ac1d464e180fcd9dffc9d1cbf76cca2fed795d9ca98",
251*0090dad1Sjhigh              "$argon2id$v=19$m=65536,t=1,p=1$c29tZXNhbHQ"
252*0090dad1Sjhigh              "$9qWtwbpyPd3vm1rB1GThgPzZ3/ydHL92zKL+15XZypg", Argon2_id);
253*0090dad1Sjhigh     hashtest(version, 4, 16, 1, "password", "somesalt",
254*0090dad1Sjhigh              "9025d48e68ef7395cca9079da4c4ec3affb3c8911fe4f86d1a2520856f63172c",
255*0090dad1Sjhigh              "$argon2id$v=19$m=65536,t=4,p=1$c29tZXNhbHQ"
256*0090dad1Sjhigh              "$kCXUjmjvc5XMqQedpMTsOv+zyJEf5PhtGiUghW9jFyw", Argon2_id);
257*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "differentpassword", "somesalt",
258*0090dad1Sjhigh              "0b84d652cf6b0c4beaef0dfe278ba6a80df6696281d7e0d2891b817d8c458fde",
259*0090dad1Sjhigh              "$argon2id$v=19$m=65536,t=2,p=1$c29tZXNhbHQ"
260*0090dad1Sjhigh              "$C4TWUs9rDEvq7w3+J4umqA32aWKB1+DSiRuBfYxFj94", Argon2_id);
261*0090dad1Sjhigh     hashtest(version, 2, 16, 1, "password", "diffsalt",
262*0090dad1Sjhigh              "bdf32b05ccc42eb15d58fd19b1f856b113da1e9a5874fdcc544308565aa8141c",
263*0090dad1Sjhigh              "$argon2id$v=19$m=65536,t=2,p=1$ZGlmZnNhbHQ"
264*0090dad1Sjhigh              "$vfMrBczELrFdWP0ZsfhWsRPaHppYdP3MVEMIVlqoFBw", Argon2_id);
265*0090dad1Sjhigh 
266*0090dad1Sjhigh     /* Common error state tests */
267*0090dad1Sjhigh 
268*0090dad1Sjhigh     printf("\n");
269*0090dad1Sjhigh     printf("Common error state tests\n");
270*0090dad1Sjhigh 
271*0090dad1Sjhigh     ret = argon2_hash(2, 1, 1, "password", strlen("password"),
272*0090dad1Sjhigh                       "diffsalt", strlen("diffsalt"),
273*0090dad1Sjhigh                       out, OUT_LEN, NULL, 0, Argon2_id, version);
274*0090dad1Sjhigh     assert(ret == ARGON2_MEMORY_TOO_LITTLE);
275*0090dad1Sjhigh     printf("Fail on invalid memory: PASS\n");
276*0090dad1Sjhigh 
277*0090dad1Sjhigh     ret = argon2_hash(2, 1 << 12, 1, NULL, strlen("password"),
278*0090dad1Sjhigh                       "diffsalt", strlen("diffsalt"),
279*0090dad1Sjhigh                       out, OUT_LEN, NULL, 0, Argon2_id, version);
280*0090dad1Sjhigh     assert(ret == ARGON2_PWD_PTR_MISMATCH);
281*0090dad1Sjhigh     printf("Fail on invalid null pointer: PASS\n");
282*0090dad1Sjhigh 
283*0090dad1Sjhigh     ret = argon2_hash(2, 1 << 12, 1, "password", strlen("password"), "s", 1,
284*0090dad1Sjhigh                       out, OUT_LEN, NULL, 0, Argon2_id, version);
285*0090dad1Sjhigh     assert(ret == ARGON2_SALT_TOO_SHORT);
286*0090dad1Sjhigh     printf("Fail on salt too short: PASS\n");
287*0090dad1Sjhigh 
288*0090dad1Sjhigh     return 0;
289*0090dad1Sjhigh }
290