xref: /netbsd-src/external/apache2/argon2/dist/phc-winner-argon2/src/genkat.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 <stdlib.h>
20*0090dad1Sjhigh #include <string.h>
21*0090dad1Sjhigh #include "argon2.h"
22*0090dad1Sjhigh #include "core.h"
23*0090dad1Sjhigh 
initial_kat(const uint8_t * blockhash,const argon2_context * context,argon2_type type)24*0090dad1Sjhigh void initial_kat(const uint8_t *blockhash, const argon2_context *context,
25*0090dad1Sjhigh                  argon2_type type) {
26*0090dad1Sjhigh     unsigned i;
27*0090dad1Sjhigh 
28*0090dad1Sjhigh     if (blockhash != NULL && context != NULL) {
29*0090dad1Sjhigh         printf("=======================================\n");
30*0090dad1Sjhigh 
31*0090dad1Sjhigh         printf("%s version number %d\n", argon2_type2string(type, 1),
32*0090dad1Sjhigh                context->version);
33*0090dad1Sjhigh 
34*0090dad1Sjhigh         printf("=======================================\n");
35*0090dad1Sjhigh 
36*0090dad1Sjhigh 
37*0090dad1Sjhigh         printf("Memory: %u KiB, Iterations: %u, Parallelism: %u lanes, Tag "
38*0090dad1Sjhigh                "length: %u bytes\n",
39*0090dad1Sjhigh                context->m_cost, context->t_cost, context->lanes,
40*0090dad1Sjhigh                context->outlen);
41*0090dad1Sjhigh 
42*0090dad1Sjhigh         printf("Password[%u]: ", context->pwdlen);
43*0090dad1Sjhigh 
44*0090dad1Sjhigh         if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) {
45*0090dad1Sjhigh             printf("CLEARED\n");
46*0090dad1Sjhigh         } else {
47*0090dad1Sjhigh             for (i = 0; i < context->pwdlen; ++i) {
48*0090dad1Sjhigh                 printf("%2.2x ", ((unsigned char *)context->pwd)[i]);
49*0090dad1Sjhigh             }
50*0090dad1Sjhigh 
51*0090dad1Sjhigh             printf("\n");
52*0090dad1Sjhigh         }
53*0090dad1Sjhigh 
54*0090dad1Sjhigh         printf("Salt[%u]: ", context->saltlen);
55*0090dad1Sjhigh 
56*0090dad1Sjhigh         for (i = 0; i < context->saltlen; ++i) {
57*0090dad1Sjhigh             printf("%2.2x ", ((unsigned char *)context->salt)[i]);
58*0090dad1Sjhigh         }
59*0090dad1Sjhigh 
60*0090dad1Sjhigh         printf("\n");
61*0090dad1Sjhigh 
62*0090dad1Sjhigh         printf("Secret[%u]: ", context->secretlen);
63*0090dad1Sjhigh 
64*0090dad1Sjhigh         if (context->flags & ARGON2_FLAG_CLEAR_SECRET) {
65*0090dad1Sjhigh             printf("CLEARED\n");
66*0090dad1Sjhigh         } else {
67*0090dad1Sjhigh             for (i = 0; i < context->secretlen; ++i) {
68*0090dad1Sjhigh                 printf("%2.2x ", ((unsigned char *)context->secret)[i]);
69*0090dad1Sjhigh             }
70*0090dad1Sjhigh 
71*0090dad1Sjhigh             printf("\n");
72*0090dad1Sjhigh         }
73*0090dad1Sjhigh 
74*0090dad1Sjhigh         printf("Associated data[%u]: ", context->adlen);
75*0090dad1Sjhigh 
76*0090dad1Sjhigh         for (i = 0; i < context->adlen; ++i) {
77*0090dad1Sjhigh             printf("%2.2x ", ((unsigned char *)context->ad)[i]);
78*0090dad1Sjhigh         }
79*0090dad1Sjhigh 
80*0090dad1Sjhigh         printf("\n");
81*0090dad1Sjhigh 
82*0090dad1Sjhigh         printf("Pre-hashing digest: ");
83*0090dad1Sjhigh 
84*0090dad1Sjhigh         for (i = 0; i < ARGON2_PREHASH_DIGEST_LENGTH; ++i) {
85*0090dad1Sjhigh             printf("%2.2x ", ((unsigned char *)blockhash)[i]);
86*0090dad1Sjhigh         }
87*0090dad1Sjhigh 
88*0090dad1Sjhigh         printf("\n");
89*0090dad1Sjhigh     }
90*0090dad1Sjhigh }
91*0090dad1Sjhigh 
print_tag(const void * out,uint32_t outlen)92*0090dad1Sjhigh void print_tag(const void *out, uint32_t outlen) {
93*0090dad1Sjhigh     unsigned i;
94*0090dad1Sjhigh     if (out != NULL) {
95*0090dad1Sjhigh         printf("Tag: ");
96*0090dad1Sjhigh 
97*0090dad1Sjhigh         for (i = 0; i < outlen; ++i) {
98*0090dad1Sjhigh             printf("%2.2x ", ((uint8_t *)out)[i]);
99*0090dad1Sjhigh         }
100*0090dad1Sjhigh 
101*0090dad1Sjhigh         printf("\n");
102*0090dad1Sjhigh     }
103*0090dad1Sjhigh }
104*0090dad1Sjhigh 
internal_kat(const argon2_instance_t * instance,uint32_t pass)105*0090dad1Sjhigh void internal_kat(const argon2_instance_t *instance, uint32_t pass) {
106*0090dad1Sjhigh 
107*0090dad1Sjhigh     if (instance != NULL) {
108*0090dad1Sjhigh         uint32_t i, j;
109*0090dad1Sjhigh         printf("\n After pass %u:\n", pass);
110*0090dad1Sjhigh 
111*0090dad1Sjhigh         for (i = 0; i < instance->memory_blocks; ++i) {
112*0090dad1Sjhigh             uint32_t how_many_words =
113*0090dad1Sjhigh                 (instance->memory_blocks > ARGON2_QWORDS_IN_BLOCK)
114*0090dad1Sjhigh                     ? 1
115*0090dad1Sjhigh                     : ARGON2_QWORDS_IN_BLOCK;
116*0090dad1Sjhigh 
117*0090dad1Sjhigh             for (j = 0; j < how_many_words; ++j)
118*0090dad1Sjhigh                 printf("Block %.4u [%3u]: %016llx\n", i, j,
119*0090dad1Sjhigh                        (unsigned long long)instance->memory[i].v[j]);
120*0090dad1Sjhigh         }
121*0090dad1Sjhigh     }
122*0090dad1Sjhigh }
123*0090dad1Sjhigh 
fatal(const char * error)124*0090dad1Sjhigh static void fatal(const char *error) {
125*0090dad1Sjhigh     fprintf(stderr, "Error: %s\n", error);
126*0090dad1Sjhigh     exit(1);
127*0090dad1Sjhigh }
128*0090dad1Sjhigh 
generate_testvectors(argon2_type type,const uint32_t version)129*0090dad1Sjhigh static void generate_testvectors(argon2_type type, const uint32_t version) {
130*0090dad1Sjhigh #define TEST_OUTLEN 32
131*0090dad1Sjhigh #define TEST_PWDLEN 32
132*0090dad1Sjhigh #define TEST_SALTLEN 16
133*0090dad1Sjhigh #define TEST_SECRETLEN 8
134*0090dad1Sjhigh #define TEST_ADLEN 12
135*0090dad1Sjhigh     argon2_context context;
136*0090dad1Sjhigh 
137*0090dad1Sjhigh     unsigned char out[TEST_OUTLEN];
138*0090dad1Sjhigh     unsigned char pwd[TEST_PWDLEN];
139*0090dad1Sjhigh     unsigned char salt[TEST_SALTLEN];
140*0090dad1Sjhigh     unsigned char secret[TEST_SECRETLEN];
141*0090dad1Sjhigh     unsigned char ad[TEST_ADLEN];
142*0090dad1Sjhigh     const allocate_fptr myown_allocator = NULL;
143*0090dad1Sjhigh     const deallocate_fptr myown_deallocator = NULL;
144*0090dad1Sjhigh 
145*0090dad1Sjhigh     unsigned t_cost = 3;
146*0090dad1Sjhigh     unsigned m_cost = 32;
147*0090dad1Sjhigh     unsigned lanes = 4;
148*0090dad1Sjhigh 
149*0090dad1Sjhigh     memset(pwd, 1, TEST_OUTLEN);
150*0090dad1Sjhigh     memset(salt, 2, TEST_SALTLEN);
151*0090dad1Sjhigh     memset(secret, 3, TEST_SECRETLEN);
152*0090dad1Sjhigh     memset(ad, 4, TEST_ADLEN);
153*0090dad1Sjhigh 
154*0090dad1Sjhigh     context.out = out;
155*0090dad1Sjhigh     context.outlen = TEST_OUTLEN;
156*0090dad1Sjhigh     context.version = version;
157*0090dad1Sjhigh     context.pwd = pwd;
158*0090dad1Sjhigh     context.pwdlen = TEST_PWDLEN;
159*0090dad1Sjhigh     context.salt = salt;
160*0090dad1Sjhigh     context.saltlen = TEST_SALTLEN;
161*0090dad1Sjhigh     context.secret = secret;
162*0090dad1Sjhigh     context.secretlen = TEST_SECRETLEN;
163*0090dad1Sjhigh     context.ad = ad;
164*0090dad1Sjhigh     context.adlen = TEST_ADLEN;
165*0090dad1Sjhigh     context.t_cost = t_cost;
166*0090dad1Sjhigh     context.m_cost = m_cost;
167*0090dad1Sjhigh     context.lanes = lanes;
168*0090dad1Sjhigh     context.threads = lanes;
169*0090dad1Sjhigh     context.allocate_cbk = myown_allocator;
170*0090dad1Sjhigh     context.free_cbk = myown_deallocator;
171*0090dad1Sjhigh     context.flags = ARGON2_DEFAULT_FLAGS;
172*0090dad1Sjhigh 
173*0090dad1Sjhigh #undef TEST_OUTLEN
174*0090dad1Sjhigh #undef TEST_PWDLEN
175*0090dad1Sjhigh #undef TEST_SALTLEN
176*0090dad1Sjhigh #undef TEST_SECRETLEN
177*0090dad1Sjhigh #undef TEST_ADLEN
178*0090dad1Sjhigh 
179*0090dad1Sjhigh     argon2_ctx(&context, type);
180*0090dad1Sjhigh }
181*0090dad1Sjhigh 
main(int argc,char * argv[])182*0090dad1Sjhigh int main(int argc, char *argv[]) {
183*0090dad1Sjhigh     /* Get and check Argon2 type */
184*0090dad1Sjhigh     const char *type_str = (argc > 1) ? argv[1] : "i";
185*0090dad1Sjhigh     argon2_type type = Argon2_i;
186*0090dad1Sjhigh     uint32_t version = ARGON2_VERSION_NUMBER;
187*0090dad1Sjhigh     if (!strcmp(type_str, "d")) {
188*0090dad1Sjhigh         type = Argon2_d;
189*0090dad1Sjhigh     } else if (!strcmp(type_str, "i")) {
190*0090dad1Sjhigh         type = Argon2_i;
191*0090dad1Sjhigh     } else if (!strcmp(type_str, "id")) {
192*0090dad1Sjhigh         type = Argon2_id;
193*0090dad1Sjhigh     } else {
194*0090dad1Sjhigh         fatal("wrong Argon2 type");
195*0090dad1Sjhigh     }
196*0090dad1Sjhigh 
197*0090dad1Sjhigh     /* Get and check Argon2 version number */
198*0090dad1Sjhigh     if (argc > 2) {
199*0090dad1Sjhigh         version = strtoul(argv[2], NULL, 10);
200*0090dad1Sjhigh     }
201*0090dad1Sjhigh     if (ARGON2_VERSION_10 != version && ARGON2_VERSION_NUMBER != version) {
202*0090dad1Sjhigh         fatal("wrong Argon2 version number");
203*0090dad1Sjhigh     }
204*0090dad1Sjhigh 
205*0090dad1Sjhigh     generate_testvectors(type, version);
206*0090dad1Sjhigh     return ARGON2_OK;
207*0090dad1Sjhigh }
208