1
2 #include <errno.h>
3 #include <string.h>
4
5 #include "core.h"
6 #include "crypto_pwhash.h"
7
8 int
crypto_pwhash_alg_argon2i13(void)9 crypto_pwhash_alg_argon2i13(void)
10 {
11 return crypto_pwhash_ALG_ARGON2I13;
12 }
13
14 int
crypto_pwhash_alg_argon2id13(void)15 crypto_pwhash_alg_argon2id13(void)
16 {
17 return crypto_pwhash_ALG_ARGON2ID13;
18 }
19
20 int
crypto_pwhash_alg_default(void)21 crypto_pwhash_alg_default(void)
22 {
23 return crypto_pwhash_ALG_DEFAULT;
24 }
25
26 size_t
crypto_pwhash_bytes_min(void)27 crypto_pwhash_bytes_min(void)
28 {
29 return crypto_pwhash_BYTES_MIN;
30 }
31
32 size_t
crypto_pwhash_bytes_max(void)33 crypto_pwhash_bytes_max(void)
34 {
35 return crypto_pwhash_BYTES_MAX;
36 }
37
38 size_t
crypto_pwhash_passwd_min(void)39 crypto_pwhash_passwd_min(void)
40 {
41 return crypto_pwhash_PASSWD_MIN;
42 }
43
44 size_t
crypto_pwhash_passwd_max(void)45 crypto_pwhash_passwd_max(void)
46 {
47 return crypto_pwhash_PASSWD_MAX;
48 }
49
50 size_t
crypto_pwhash_saltbytes(void)51 crypto_pwhash_saltbytes(void)
52 {
53 return crypto_pwhash_SALTBYTES;
54 }
55
56 size_t
crypto_pwhash_strbytes(void)57 crypto_pwhash_strbytes(void)
58 {
59 return crypto_pwhash_STRBYTES;
60 }
61
62 const char *
crypto_pwhash_strprefix(void)63 crypto_pwhash_strprefix(void)
64 {
65 return crypto_pwhash_STRPREFIX;
66 }
67
68 size_t
crypto_pwhash_opslimit_min(void)69 crypto_pwhash_opslimit_min(void)
70 {
71 return crypto_pwhash_OPSLIMIT_MIN;
72 }
73
74 size_t
crypto_pwhash_opslimit_max(void)75 crypto_pwhash_opslimit_max(void)
76 {
77 return crypto_pwhash_OPSLIMIT_MAX;
78 }
79
80 size_t
crypto_pwhash_memlimit_min(void)81 crypto_pwhash_memlimit_min(void)
82 {
83 return crypto_pwhash_MEMLIMIT_MIN;
84 }
85
86 size_t
crypto_pwhash_memlimit_max(void)87 crypto_pwhash_memlimit_max(void)
88 {
89 return crypto_pwhash_MEMLIMIT_MAX;
90 }
91
92 size_t
crypto_pwhash_opslimit_interactive(void)93 crypto_pwhash_opslimit_interactive(void)
94 {
95 return crypto_pwhash_OPSLIMIT_INTERACTIVE;
96 }
97
98 size_t
crypto_pwhash_memlimit_interactive(void)99 crypto_pwhash_memlimit_interactive(void)
100 {
101 return crypto_pwhash_MEMLIMIT_INTERACTIVE;
102 }
103
104 size_t
crypto_pwhash_opslimit_moderate(void)105 crypto_pwhash_opslimit_moderate(void)
106 {
107 return crypto_pwhash_OPSLIMIT_MODERATE;
108 }
109
110 size_t
crypto_pwhash_memlimit_moderate(void)111 crypto_pwhash_memlimit_moderate(void)
112 {
113 return crypto_pwhash_MEMLIMIT_MODERATE;
114 }
115
116 size_t
crypto_pwhash_opslimit_sensitive(void)117 crypto_pwhash_opslimit_sensitive(void)
118 {
119 return crypto_pwhash_OPSLIMIT_SENSITIVE;
120 }
121
122 size_t
crypto_pwhash_memlimit_sensitive(void)123 crypto_pwhash_memlimit_sensitive(void)
124 {
125 return crypto_pwhash_MEMLIMIT_SENSITIVE;
126 }
127
128 int
crypto_pwhash(unsigned char * const out,unsigned long long outlen,const char * const passwd,unsigned long long passwdlen,const unsigned char * const salt,unsigned long long opslimit,size_t memlimit,int alg)129 crypto_pwhash(unsigned char * const out, unsigned long long outlen,
130 const char * const passwd, unsigned long long passwdlen,
131 const unsigned char * const salt,
132 unsigned long long opslimit, size_t memlimit, int alg)
133 {
134 switch (alg) {
135 case crypto_pwhash_ALG_ARGON2I13:
136 return crypto_pwhash_argon2i(out, outlen, passwd, passwdlen, salt,
137 opslimit, memlimit, alg);
138 case crypto_pwhash_ALG_ARGON2ID13:
139 return crypto_pwhash_argon2id(out, outlen, passwd, passwdlen, salt,
140 opslimit, memlimit, alg);
141 default:
142 errno = EINVAL;
143 return -1;
144 }
145 }
146
147 int
crypto_pwhash_str(char out[crypto_pwhash_STRBYTES],const char * const passwd,unsigned long long passwdlen,unsigned long long opslimit,size_t memlimit)148 crypto_pwhash_str(char out[crypto_pwhash_STRBYTES],
149 const char * const passwd, unsigned long long passwdlen,
150 unsigned long long opslimit, size_t memlimit)
151 {
152 return crypto_pwhash_argon2id_str(out, passwd, passwdlen,
153 opslimit, memlimit);
154 }
155
156 int
crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES],const char * const passwd,unsigned long long passwdlen,unsigned long long opslimit,size_t memlimit,int alg)157 crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES],
158 const char * const passwd, unsigned long long passwdlen,
159 unsigned long long opslimit, size_t memlimit, int alg)
160 {
161 switch (alg) {
162 case crypto_pwhash_ALG_ARGON2I13:
163 return crypto_pwhash_argon2i_str(out, passwd, passwdlen,
164 opslimit, memlimit);
165 case crypto_pwhash_ALG_ARGON2ID13:
166 return crypto_pwhash_argon2id_str(out, passwd, passwdlen,
167 opslimit, memlimit);
168 }
169 sodium_misuse();
170 /* NOTREACHED */
171 }
172
173 int
crypto_pwhash_str_verify(const char str[crypto_pwhash_STRBYTES],const char * const passwd,unsigned long long passwdlen)174 crypto_pwhash_str_verify(const char str[crypto_pwhash_STRBYTES],
175 const char * const passwd,
176 unsigned long long passwdlen)
177 {
178 if (strncmp(str, crypto_pwhash_argon2id_STRPREFIX,
179 sizeof crypto_pwhash_argon2id_STRPREFIX - 1) == 0) {
180 return crypto_pwhash_argon2id_str_verify(str, passwd, passwdlen);
181 }
182 if (strncmp(str, crypto_pwhash_argon2i_STRPREFIX,
183 sizeof crypto_pwhash_argon2i_STRPREFIX - 1) == 0) {
184 return crypto_pwhash_argon2i_str_verify(str, passwd, passwdlen);
185 }
186 errno = EINVAL;
187
188 return -1;
189 }
190
191 int
crypto_pwhash_str_needs_rehash(const char str[crypto_pwhash_STRBYTES],unsigned long long opslimit,size_t memlimit)192 crypto_pwhash_str_needs_rehash(const char str[crypto_pwhash_STRBYTES],
193 unsigned long long opslimit, size_t memlimit)
194 {
195 if (strncmp(str, crypto_pwhash_argon2id_STRPREFIX,
196 sizeof crypto_pwhash_argon2id_STRPREFIX - 1) == 0) {
197 return crypto_pwhash_argon2id_str_needs_rehash(str, opslimit, memlimit);
198 }
199 if (strncmp(str, crypto_pwhash_argon2i_STRPREFIX,
200 sizeof crypto_pwhash_argon2i_STRPREFIX - 1) == 0) {
201 return crypto_pwhash_argon2i_str_needs_rehash(str, opslimit, memlimit);
202 }
203 errno = EINVAL;
204
205 return -1;
206 }
207
208 const char *
crypto_pwhash_primitive(void)209 crypto_pwhash_primitive(void) {
210 return crypto_pwhash_PRIMITIVE;
211 }
212