Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | #ifndef OPENSSL_NO_SRP | - |
15 | # include "internal/cryptlib.h" | - |
16 | # include "internal/evp_int.h" | - |
17 | # include <openssl/sha.h> | - |
18 | # include <openssl/srp.h> | - |
19 | # include <openssl/evp.h> | - |
20 | # include <openssl/buffer.h> | - |
21 | # include <openssl/rand.h> | - |
22 | # include <openssl/txt_db.h> | - |
23 | # include <openssl/err.h> | - |
24 | | - |
25 | # define SRP_RANDOM_SALT_LEN 20 | - |
26 | # define MAX_LEN 2500 | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | static int t_fromb64(unsigned char *a, size_t alen, const char *src) | - |
42 | { | - |
43 | EVP_ENCODE_CTX *ctx; | - |
44 | int outl = 0, outl2 = 0; | - |
45 | size_t size, padsize; | - |
46 | const unsigned char *pad = (const unsigned char *)"00"; | - |
47 | | - |
48 | while (*src == ' ' || *src == '\t' || *src == '\n')TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
49 | ++src; never executed: ++src; | 0 |
50 | size = strlen(src); | - |
51 | padsize = 4 - (size & 3); | - |
52 | padsize &= 3; | - |
53 | | - |
54 | | - |
55 | if (size > INT_MAX || ((size + padsize) / 4) * 3 > alen)TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
56 | return -1; never executed: return -1; | 0 |
57 | | - |
58 | ctx = EVP_ENCODE_CTX_new(); | - |
59 | if (ctx == NULL)TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
60 | return -1; never executed: return -1; | 0 |
61 | | - |
62 | | - |
63 | | - |
64 | | - |
65 | | - |
66 | | - |
67 | | - |
68 | | - |
69 | | - |
70 | | - |
71 | | - |
72 | if (padsize == 3) {TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
73 | outl = -1; | - |
74 | goto err; never executed: goto err; | 0 |
75 | } | - |
76 | | - |
77 | | - |
78 | | - |
79 | EVP_DecodeInit(ctx); | - |
80 | evp_encode_ctx_set_flags(ctx, EVP_ENCODE_CTX_USE_SRP_ALPHABET); | - |
81 | | - |
82 | | - |
83 | if (padsize != 0TRUE | evaluated 8 times by 1 test | FALSE | never evaluated |
| 0-8 |
84 | && EVP_DecodeUpdate(ctx, a, &outl, pad, padsize) < 0) {TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
85 | outl = -1; | - |
86 | goto err; never executed: goto err; | 0 |
87 | } | - |
88 | if (EVP_DecodeUpdate(ctx, a, &outl2, (const unsigned char *)src, size) < 0) {TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
89 | outl = -1; | - |
90 | goto err; never executed: goto err; | 0 |
91 | } | - |
92 | outl += outl2; | - |
93 | EVP_DecodeFinal(ctx, a + outl, &outl2); | - |
94 | outl += outl2; | - |
95 | | - |
96 | | - |
97 | if (padsize != 0) {TRUE | evaluated 8 times by 1 test | FALSE | never evaluated |
| 0-8 |
98 | if ((int)padsize >= outl) {TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
99 | outl = -1; | - |
100 | goto err; never executed: goto err; | 0 |
101 | } | - |
102 | | - |
103 | | - |
104 | | - |
105 | | - |
106 | | - |
107 | | - |
108 | | - |
109 | | - |
110 | | - |
111 | | - |
112 | | - |
113 | | - |
114 | | - |
115 | | - |
116 | memmove(a, a + padsize, outl - padsize); | - |
117 | outl -= padsize; | - |
118 | }executed 8 times by 1 test: end of block | 8 |
119 | | - |
120 | err:code before this statement executed 8 times by 1 test: err: | 8 |
121 | EVP_ENCODE_CTX_free(ctx); | - |
122 | | - |
123 | return outl;executed 8 times by 1 test: return outl; | 8 |
124 | } | - |
125 | | - |
126 | | - |
127 | | - |
128 | | - |
129 | | - |
130 | static int t_tob64(char *dst, const unsigned char *src, int size) | - |
131 | { | - |
132 | EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); | - |
133 | int outl = 0, outl2 = 0; | - |
134 | unsigned char pad[2] = {0, 0}; | - |
135 | size_t leadz = 0; | - |
136 | | - |
137 | if (ctx == NULL)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
138 | return 0; never executed: return 0; | 0 |
139 | | - |
140 | EVP_EncodeInit(ctx); | - |
141 | evp_encode_ctx_set_flags(ctx, EVP_ENCODE_CTX_NO_NEWLINES | - |
142 | | EVP_ENCODE_CTX_USE_SRP_ALPHABET); | - |
143 | | - |
144 | | - |
145 | | - |
146 | | - |
147 | | - |
148 | | - |
149 | leadz = 3 - (size % 3); | - |
150 | if (leadz != 3TRUE | evaluated 4 times by 1 test | FALSE | never evaluated |
| 0-4 |
151 | && !EVP_EncodeUpdate(ctx, (unsigned char *)dst, &outl, pad,TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
152 | leadz)) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
153 | EVP_ENCODE_CTX_free(ctx); | - |
154 | return 0; never executed: return 0; | 0 |
155 | } | - |
156 | | - |
157 | if (!EVP_EncodeUpdate(ctx, (unsigned char *)dst + outl, &outl2, src,TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
158 | size)) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
159 | EVP_ENCODE_CTX_free(ctx); | - |
160 | return 0; never executed: return 0; | 0 |
161 | } | - |
162 | outl += outl2; | - |
163 | EVP_EncodeFinal(ctx, (unsigned char *)dst + outl, &outl2); | - |
164 | outl += outl2; | - |
165 | | - |
166 | | - |
167 | if (leadz != 3) {TRUE | evaluated 4 times by 1 test | FALSE | never evaluated |
| 0-4 |
168 | memmove(dst, dst + leadz, outl - leadz); | - |
169 | dst[outl - leadz] = '\0'; | - |
170 | }executed 4 times by 1 test: end of block | 4 |
171 | | - |
172 | EVP_ENCODE_CTX_free(ctx); | - |
173 | return 1;executed 4 times by 1 test: return 1; | 4 |
174 | } | - |
175 | | - |
176 | void SRP_user_pwd_free(SRP_user_pwd *user_pwd) | - |
177 | { | - |
178 | if (user_pwd == NULL)TRUE | evaluated 6 times by 1 test | FALSE | evaluated 12 times by 1 test |
| 6-12 |
179 | return;executed 6 times by 1 test: return; | 6 |
180 | BN_free(user_pwd->s); | - |
181 | BN_clear_free(user_pwd->v); | - |
182 | OPENSSL_free(user_pwd->id); | - |
183 | OPENSSL_free(user_pwd->info); | - |
184 | OPENSSL_free(user_pwd); | - |
185 | }executed 12 times by 1 test: end of block | 12 |
186 | | - |
187 | static SRP_user_pwd *SRP_user_pwd_new(void) | - |
188 | { | - |
189 | SRP_user_pwd *ret; | - |
190 | | - |
191 | if ((ret = OPENSSL_malloc(sizeof(*ret))) == NULL) {TRUE | never evaluated | FALSE | evaluated 10 times by 1 test |
| 0-10 |
192 | | - |
193 | return NULL; never executed: return ((void *)0) ; | 0 |
194 | } | - |
195 | ret->N = NULL; | - |
196 | ret->g = NULL; | - |
197 | ret->s = NULL; | - |
198 | ret->v = NULL; | - |
199 | ret->id = NULL; | - |
200 | ret->info = NULL; | - |
201 | return ret;executed 10 times by 1 test: return ret; | 10 |
202 | } | - |
203 | | - |
204 | static void SRP_user_pwd_set_gN(SRP_user_pwd *vinfo, const BIGNUM *g, | - |
205 | const BIGNUM *N) | - |
206 | { | - |
207 | vinfo->N = N; | - |
208 | vinfo->g = g; | - |
209 | }executed 10 times by 1 test: end of block | 10 |
210 | | - |
211 | static int SRP_user_pwd_set_ids(SRP_user_pwd *vinfo, const char *id, | - |
212 | const char *info) | - |
213 | { | - |
214 | if (id != NULL && NULL == (vinfo->id = OPENSSL_strdup(id)))TRUE | evaluated 10 times by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | evaluated 10 times by 1 test |
| 0-10 |
215 | return 0; never executed: return 0; | 0 |
216 | return (info == NULL || NULL != (vinfo->info = OPENSSL_strdup(info)));executed 10 times by 1 test: return (info == ((void *)0) || ((void *)0) != (vinfo->info = CRYPTO_strdup(info, __FILE__, 216))); TRUE | evaluated 2 times by 1 test | FALSE | evaluated 8 times by 1 test |
TRUE | evaluated 8 times by 1 test | FALSE | never evaluated |
| 0-10 |
217 | } | - |
218 | | - |
219 | static int SRP_user_pwd_set_sv(SRP_user_pwd *vinfo, const char *s, | - |
220 | const char *v) | - |
221 | { | - |
222 | unsigned char tmp[MAX_LEN]; | - |
223 | int len; | - |
224 | | - |
225 | vinfo->v = NULL; | - |
226 | vinfo->s = NULL; | - |
227 | | - |
228 | len = t_fromb64(tmp, sizeof(tmp), v); | - |
229 | if (len < 0)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
230 | return 0; never executed: return 0; | 0 |
231 | if (NULL == (vinfo->v = BN_bin2bn(tmp, len, NULL)))TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
232 | return 0; never executed: return 0; | 0 |
233 | len = t_fromb64(tmp, sizeof(tmp), s); | - |
234 | if (len < 0)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
235 | goto err; never executed: goto err; | 0 |
236 | vinfo->s = BN_bin2bn(tmp, len, NULL); | - |
237 | if (vinfo->s == NULL)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
238 | goto err; never executed: goto err; | 0 |
239 | return 1;executed 4 times by 1 test: return 1; | 4 |
240 | err: | - |
241 | BN_free(vinfo->v); | - |
242 | vinfo->v = NULL; | - |
243 | return 0; never executed: return 0; | 0 |
244 | } | - |
245 | | - |
246 | static int SRP_user_pwd_set_sv_BN(SRP_user_pwd *vinfo, BIGNUM *s, BIGNUM *v) | - |
247 | { | - |
248 | vinfo->v = v; | - |
249 | vinfo->s = s; | - |
250 | return (vinfo->s != NULL && vinfo->v != NULL);executed 6 times by 1 test: return (vinfo->s != ((void *)0) && vinfo->v != ((void *)0) ); TRUE | evaluated 6 times by 1 test | FALSE | never evaluated |
TRUE | evaluated 6 times by 1 test | FALSE | never evaluated |
| 0-6 |
251 | } | - |
252 | | - |
253 | static SRP_user_pwd *srp_user_pwd_dup(SRP_user_pwd *src) | - |
254 | { | - |
255 | SRP_user_pwd *ret; | - |
256 | | - |
257 | if (src == NULL)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
258 | return NULL; never executed: return ((void *)0) ; | 0 |
259 | if ((ret = SRP_user_pwd_new()) == NULL)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
260 | return NULL; never executed: return ((void *)0) ; | 0 |
261 | | - |
262 | SRP_user_pwd_set_gN(ret, src->g, src->N); | - |
263 | if (!SRP_user_pwd_set_ids(ret, src->id, src->info)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
264 | || !SRP_user_pwd_set_sv_BN(ret, BN_dup(src->s), BN_dup(src->v))) {TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
265 | SRP_user_pwd_free(ret); | - |
266 | return NULL; never executed: return ((void *)0) ; | 0 |
267 | } | - |
268 | return ret;executed 6 times by 1 test: return ret; | 6 |
269 | } | - |
270 | | - |
271 | SRP_VBASE *SRP_VBASE_new(char *seed_key) | - |
272 | { | - |
273 | SRP_VBASE *vb = OPENSSL_malloc(sizeof(*vb)); | - |
274 | | - |
275 | if (vb == NULL)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
276 | return NULL; never executed: return ((void *)0) ; | 0 |
277 | if ((vb->users_pwd = sk_SRP_user_pwd_new_null()) == NULLTRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
278 | || (vb->gN_cache = sk_SRP_gN_cache_new_null()) == NULL) {TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
279 | OPENSSL_free(vb); | - |
280 | return NULL; never executed: return ((void *)0) ; | 0 |
281 | } | - |
282 | vb->default_g = NULL; | - |
283 | vb->default_N = NULL; | - |
284 | vb->seed_key = NULL; | - |
285 | if ((seed_key != NULL) && (vb->seed_key = OPENSSL_strdup(seed_key)) == NULL) {TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
TRUE | never evaluated | FALSE | never evaluated |
| 0-6 |
286 | sk_SRP_user_pwd_free(vb->users_pwd); | - |
287 | sk_SRP_gN_cache_free(vb->gN_cache); | - |
288 | OPENSSL_free(vb); | - |
289 | return NULL; never executed: return ((void *)0) ; | 0 |
290 | } | - |
291 | return vb;executed 6 times by 1 test: return vb; | 6 |
292 | } | - |
293 | | - |
294 | void SRP_VBASE_free(SRP_VBASE *vb) | - |
295 | { | - |
296 | if (!vb)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
297 | return; never executed: return; | 0 |
298 | sk_SRP_user_pwd_pop_free(vb->users_pwd, SRP_user_pwd_free); | - |
299 | sk_SRP_gN_cache_free(vb->gN_cache); | - |
300 | OPENSSL_free(vb->seed_key); | - |
301 | OPENSSL_free(vb); | - |
302 | }executed 6 times by 1 test: end of block | 6 |
303 | | - |
304 | static SRP_gN_cache *SRP_gN_new_init(const char *ch) | - |
305 | { | - |
306 | unsigned char tmp[MAX_LEN]; | - |
307 | int len; | - |
308 | SRP_gN_cache *newgN = OPENSSL_malloc(sizeof(*newgN)); | - |
309 | | - |
310 | if (newgN == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
311 | return NULL; never executed: return ((void *)0) ; | 0 |
312 | | - |
313 | len = t_fromb64(tmp, sizeof(tmp), ch); | - |
314 | if (len < 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
315 | goto err; never executed: goto err; | 0 |
316 | | - |
317 | if ((newgN->b64_bn = OPENSSL_strdup(ch)) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
318 | goto err; never executed: goto err; | 0 |
319 | | - |
320 | if ((newgN->bn = BN_bin2bn(tmp, len, NULL)))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
321 | return newgN; never executed: return newgN; | 0 |
322 | | - |
323 | OPENSSL_free(newgN->b64_bn); | - |
324 | err: code before this statement never executed: err: | 0 |
325 | OPENSSL_free(newgN); | - |
326 | return NULL; never executed: return ((void *)0) ; | 0 |
327 | } | - |
328 | | - |
329 | static void SRP_gN_free(SRP_gN_cache *gN_cache) | - |
330 | { | - |
331 | if (gN_cache == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
332 | return; never executed: return; | 0 |
333 | OPENSSL_free(gN_cache->b64_bn); | - |
334 | BN_free(gN_cache->bn); | - |
335 | OPENSSL_free(gN_cache); | - |
336 | } never executed: end of block | 0 |
337 | | - |
338 | static SRP_gN *SRP_get_gN_by_id(const char *id, STACK_OF(SRP_gN) *gN_tab) | - |
339 | { | - |
340 | int i; | - |
341 | | - |
342 | SRP_gN *gN; | - |
343 | if (gN_tab != NULL)TRUE | evaluated 4 times by 1 test | FALSE | evaluated 2 times by 1 test |
| 2-4 |
344 | for (i = 0; i < sk_SRP_gN_num(gN_tab); i++) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
345 | gN = sk_SRP_gN_value(gN_tab, i); | - |
346 | if (gN && (id == NULL || strcmp(gN->id, id) == 0)) never executed: __result = (((const unsigned char *) (const char *) ( gN->id ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( id ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
347 | return gN; never executed: return gN; | 0 |
348 | } never executed: end of block | 0 |
349 | | - |
350 | return SRP_get_default_gN(id);executed 6 times by 1 test: return SRP_get_default_gN(id); | 6 |
351 | } | - |
352 | | - |
353 | static BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch) | - |
354 | { | - |
355 | int i; | - |
356 | if (gN_cache == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
357 | return NULL; never executed: return ((void *)0) ; | 0 |
358 | | - |
359 | | - |
360 | for (i = 0; i < sk_SRP_gN_cache_num(gN_cache); i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
361 | SRP_gN_cache *cache = sk_SRP_gN_cache_value(gN_cache, i); | - |
362 | if (strcmp(cache->b64_bn, ch) == 0) never executed: __result = (((const unsigned char *) (const char *) ( cache->b64_bn ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( ch ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
363 | return cache->bn; never executed: return cache->bn; | 0 |
364 | } never executed: end of block | 0 |
365 | { | - |
366 | SRP_gN_cache *newgN = SRP_gN_new_init(ch); | - |
367 | if (newgN) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
368 | if (sk_SRP_gN_cache_insert(gN_cache, newgN, 0) > 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
369 | return newgN->bn; never executed: return newgN->bn; | 0 |
370 | SRP_gN_free(newgN); | - |
371 | } never executed: end of block | 0 |
372 | } | - |
373 | return NULL; never executed: return ((void *)0) ; | 0 |
374 | } | - |
375 | | - |
376 | | - |
377 | | - |
378 | | - |
379 | | - |
380 | | - |
381 | | - |
382 | int SRP_VBASE_init(SRP_VBASE *vb, char *verifier_file) | - |
383 | { | - |
384 | int error_code; | - |
385 | STACK_OF(SRP_gN) *SRP_gN_tab = sk_SRP_gN_new_null(); | - |
386 | char *last_index = NULL; | - |
387 | int i; | - |
388 | char **pp; | - |
389 | | - |
390 | SRP_gN *gN = NULL; | - |
391 | SRP_user_pwd *user_pwd = NULL; | - |
392 | | - |
393 | TXT_DB *tmpdb = NULL; | - |
394 | BIO *in = BIO_new(BIO_s_file()); | - |
395 | | - |
396 | error_code = SRP_ERR_OPEN_FILE; | - |
397 | | - |
398 | if (in == NULL || BIO_read_filename(in, verifier_file) <= 0)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
399 | goto err; never executed: goto err; | 0 |
400 | | - |
401 | error_code = SRP_ERR_VBASE_INCOMPLETE_FILE; | - |
402 | | - |
403 | if ((tmpdb = TXT_DB_read(in, DB_NUMBER)) == NULL)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
404 | goto err; never executed: goto err; | 0 |
405 | | - |
406 | error_code = SRP_ERR_MEMORY; | - |
407 | | - |
408 | if (vb->seed_key) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
409 | last_index = SRP_get_default_gN(NULL)->id; | - |
410 | } never executed: end of block | 0 |
411 | for (i = 0; i < sk_OPENSSL_PSTRING_num(tmpdb->data); i++) {TRUE | evaluated 4 times by 1 test | FALSE | evaluated 4 times by 1 test |
| 4 |
412 | pp = sk_OPENSSL_PSTRING_value(tmpdb->data, i); | - |
413 | if (pp[DB_srptype][0] == DB_SRP_INDEX) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
414 | | - |
415 | | - |
416 | | - |
417 | | - |
418 | if ((gN = OPENSSL_malloc(sizeof(*gN))) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
419 | goto err; never executed: goto err; | 0 |
420 | | - |
421 | if ((gN->id = OPENSSL_strdup(pp[DB_srpid])) == NULLTRUE | never evaluated | FALSE | never evaluated |
| 0 |
422 | || (gN->N = SRP_gN_place_bn(vb->gN_cache, pp[DB_srpverifier]))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
423 | == NULLTRUE | never evaluated | FALSE | never evaluated |
| 0 |
424 | || (gN->g = SRP_gN_place_bn(vb->gN_cache, pp[DB_srpsalt]))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
425 | == NULLTRUE | never evaluated | FALSE | never evaluated |
| 0 |
426 | || sk_SRP_gN_insert(SRP_gN_tab, gN, 0) == 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
427 | goto err; never executed: goto err; | 0 |
428 | | - |
429 | gN = NULL; | - |
430 | | - |
431 | if (vb->seed_key != NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
432 | last_index = pp[DB_srpid]; | - |
433 | } never executed: end of block | 0 |
434 | } else if (pp[DB_srptype][0] == DB_SRP_VALID) { never executed: end of block TRUE | evaluated 4 times by 1 test | FALSE | never evaluated |
| 0-4 |
435 | | - |
436 | const SRP_gN *lgN; | - |
437 | | - |
438 | if ((lgN = SRP_get_gN_by_id(pp[DB_srpgN], SRP_gN_tab)) != NULL) {TRUE | evaluated 4 times by 1 test | FALSE | never evaluated |
| 0-4 |
439 | error_code = SRP_ERR_MEMORY; | - |
440 | if ((user_pwd = SRP_user_pwd_new()) == NULL)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
441 | goto err; never executed: goto err; | 0 |
442 | | - |
443 | SRP_user_pwd_set_gN(user_pwd, lgN->g, lgN->N); | - |
444 | if (!SRP_user_pwd_set_idsTRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
445 | (user_pwd, pp[DB_srpid], pp[DB_srpinfo]))TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
446 | goto err; never executed: goto err; | 0 |
447 | | - |
448 | error_code = SRP_ERR_VBASE_BN_LIB; | - |
449 | if (!SRP_user_pwd_set_svTRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
450 | (user_pwd, pp[DB_srpsalt], pp[DB_srpverifier]))TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
451 | goto err; never executed: goto err; | 0 |
452 | | - |
453 | if (sk_SRP_user_pwd_insert(vb->users_pwd, user_pwd, 0) == 0)TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
454 | goto err; never executed: goto err; | 0 |
455 | user_pwd = NULL; | - |
456 | }executed 4 times by 1 test: end of block | 4 |
457 | }executed 4 times by 1 test: end of block | 4 |
458 | }executed 4 times by 1 test: end of block | 4 |
459 | | - |
460 | if (last_index != NULL) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
461 | | - |
462 | | - |
463 | if (((gN = SRP_get_gN_by_id(last_index, SRP_gN_tab)) == NULL)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
464 | error_code = SRP_ERR_VBASE_BN_LIB; | - |
465 | goto err; never executed: goto err; | 0 |
466 | } | - |
467 | vb->default_g = gN->g; | - |
468 | vb->default_N = gN->N; | - |
469 | gN = NULL; | - |
470 | } never executed: end of block | 0 |
471 | error_code = SRP_NO_ERROR; | - |
472 | | - |
473 | err:code before this statement executed 4 times by 1 test: err: | 4 |
474 | | - |
475 | | - |
476 | | - |
477 | | - |
478 | | - |
479 | if (gN != NULL) {TRUE | never evaluated | FALSE | evaluated 4 times by 1 test |
| 0-4 |
480 | OPENSSL_free(gN->id); | - |
481 | OPENSSL_free(gN); | - |
482 | } never executed: end of block | 0 |
483 | | - |
484 | SRP_user_pwd_free(user_pwd); | - |
485 | | - |
486 | TXT_DB_free(tmpdb); | - |
487 | BIO_free_all(in); | - |
488 | | - |
489 | sk_SRP_gN_free(SRP_gN_tab); | - |
490 | | - |
491 | return error_code;executed 4 times by 1 test: return error_code; | 4 |
492 | | - |
493 | } | - |
494 | | - |
495 | static SRP_user_pwd *find_user(SRP_VBASE *vb, char *username) | - |
496 | { | - |
497 | int i; | - |
498 | SRP_user_pwd *user; | - |
499 | | - |
500 | if (vb == NULL)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
501 | return NULL; never executed: return ((void *)0) ; | 0 |
502 | | - |
503 | for (i = 0; i < sk_SRP_user_pwd_num(vb->users_pwd); i++) {TRUE | evaluated 6 times by 1 test | FALSE | never evaluated |
| 0-6 |
504 | user = sk_SRP_user_pwd_value(vb->users_pwd, i); | - |
505 | if (strcmp(user->id, username) == 0) never executed: __result = (((const unsigned char *) (const char *) ( user->id ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( username ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | evaluated 6 times by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0-6 |
506 | return user;executed 6 times by 1 test: return user; | 6 |
507 | } never executed: end of block | 0 |
508 | | - |
509 | return NULL; never executed: return ((void *)0) ; | 0 |
510 | } | - |
511 | | - |
512 | # if OPENSSL_API_COMPAT < 0x10100000L | - |
513 | | - |
514 | | - |
515 | | - |
516 | | - |
517 | | - |
518 | | - |
519 | SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username) | - |
520 | { | - |
521 | return find_user(vb, username); never executed: return find_user(vb, username); | 0 |
522 | } | - |
523 | # endif | - |
524 | | - |
525 | | - |
526 | | - |
527 | | - |
528 | | - |
529 | SRP_user_pwd *SRP_VBASE_get1_by_user(SRP_VBASE *vb, char *username) | - |
530 | { | - |
531 | SRP_user_pwd *user; | - |
532 | unsigned char digv[SHA_DIGEST_LENGTH]; | - |
533 | unsigned char digs[SHA_DIGEST_LENGTH]; | - |
534 | EVP_MD_CTX *ctxt = NULL; | - |
535 | | - |
536 | if (vb == NULL)TRUE | never evaluated | FALSE | evaluated 6 times by 1 test |
| 0-6 |
537 | return NULL; never executed: return ((void *)0) ; | 0 |
538 | | - |
539 | if ((user = find_user(vb, username)) != NULL)TRUE | evaluated 6 times by 1 test | FALSE | never evaluated |
| 0-6 |
540 | return srp_user_pwd_dup(user);executed 6 times by 1 test: return srp_user_pwd_dup(user); | 6 |
541 | | - |
542 | if ((vb->seed_key == NULL) ||TRUE | never evaluated | FALSE | never evaluated |
| 0 |
543 | (vb->default_g == NULL) || (vb->default_N == NULL))TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
544 | return NULL; never executed: return ((void *)0) ; | 0 |
545 | | - |
546 | | - |
547 | | - |
548 | if ((user = SRP_user_pwd_new()) == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
549 | return NULL; never executed: return ((void *)0) ; | 0 |
550 | | - |
551 | SRP_user_pwd_set_gN(user, vb->default_g, vb->default_N); | - |
552 | | - |
553 | if (!SRP_user_pwd_set_ids(user, username, NULL))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
554 | goto err; never executed: goto err; | 0 |
555 | | - |
556 | if (RAND_priv_bytes(digv, SHA_DIGEST_LENGTH) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
557 | goto err; never executed: goto err; | 0 |
558 | ctxt = EVP_MD_CTX_new(); | - |
559 | if (ctxt == NULLTRUE | never evaluated | FALSE | never evaluated |
| 0 |
560 | || !EVP_DigestInit_ex(ctxt, EVP_sha1(), NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
561 | || !EVP_DigestUpdate(ctxt, vb->seed_key, strlen(vb->seed_key))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
562 | || !EVP_DigestUpdate(ctxt, username, strlen(username))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
563 | || !EVP_DigestFinal_ex(ctxt, digs, NULL))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
564 | goto err; never executed: goto err; | 0 |
565 | EVP_MD_CTX_free(ctxt); | - |
566 | ctxt = NULL; | - |
567 | if (SRP_user_pwd_set_sv_BN(user,TRUE | never evaluated | FALSE | never evaluated |
| 0 |
568 | BN_bin2bn(digs, SHA_DIGEST_LENGTH, NULL),TRUE | never evaluated | FALSE | never evaluated |
| 0 |
569 | BN_bin2bn(digv, SHA_DIGEST_LENGTH, NULL)))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
570 | return user; never executed: return user; | 0 |
571 | | - |
572 | err: code before this statement never executed: err: | 0 |
573 | EVP_MD_CTX_free(ctxt); | - |
574 | SRP_user_pwd_free(user); | - |
575 | return NULL; never executed: return ((void *)0) ; | 0 |
576 | } | - |
577 | | - |
578 | | - |
579 | | - |
580 | | - |
581 | char *SRP_create_verifier(const char *user, const char *pass, char **salt, | - |
582 | char **verifier, const char *N, const char *g) | - |
583 | { | - |
584 | int len; | - |
585 | char *result = NULL, *vf = NULL; | - |
586 | const BIGNUM *N_bn = NULL, *g_bn = NULL; | - |
587 | BIGNUM *N_bn_alloc = NULL, *g_bn_alloc = NULL, *s = NULL, *v = NULL; | - |
588 | unsigned char tmp[MAX_LEN]; | - |
589 | unsigned char tmp2[MAX_LEN]; | - |
590 | char *defgNid = NULL; | - |
591 | int vfsize = 0; | - |
592 | | - |
593 | if ((user == NULL) ||TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
594 | (pass == NULL) || (salt == NULL) || (verifier == NULL))TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
595 | goto err; never executed: goto err; | 0 |
596 | | - |
597 | if (N) {TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
598 | if ((len = t_fromb64(tmp, sizeof(tmp), N)) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
599 | goto err; never executed: goto err; | 0 |
600 | N_bn_alloc = BN_bin2bn(tmp, len, NULL); | - |
601 | N_bn = N_bn_alloc; | - |
602 | if ((len = t_fromb64(tmp, sizeof(tmp) ,g)) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
603 | goto err; never executed: goto err; | 0 |
604 | g_bn_alloc = BN_bin2bn(tmp, len, NULL); | - |
605 | g_bn = g_bn_alloc; | - |
606 | defgNid = "*"; | - |
607 | } else { never executed: end of block | 0 |
608 | SRP_gN *gN = SRP_get_gN_by_id(g, NULL); | - |
609 | if (gN == NULL)TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
610 | goto err; never executed: goto err; | 0 |
611 | N_bn = gN->N; | - |
612 | g_bn = gN->g; | - |
613 | defgNid = gN->id; | - |
614 | }executed 2 times by 1 test: end of block | 2 |
615 | | - |
616 | if (*salt == NULL) {TRUE | evaluated 2 times by 1 test | FALSE | never evaluated |
| 0-2 |
617 | if (RAND_bytes(tmp2, SRP_RANDOM_SALT_LEN) <= 0)TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
618 | goto err; never executed: goto err; | 0 |
619 | | - |
620 | s = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL); | - |
621 | } else {executed 2 times by 1 test: end of block | 2 |
622 | if ((len = t_fromb64(tmp2, sizeof(tmp2), *salt)) <= 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
623 | goto err; never executed: goto err; | 0 |
624 | s = BN_bin2bn(tmp2, len, NULL); | - |
625 | } never executed: end of block | 0 |
626 | | - |
627 | if (!SRP_create_verifier_BN(user, pass, &s, &v, N_bn, g_bn))TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
628 | goto err; never executed: goto err; | 0 |
629 | | - |
630 | BN_bn2bin(v, tmp); | - |
631 | vfsize = BN_num_bytes(v) * 2; | - |
632 | if (((vf = OPENSSL_malloc(vfsize)) == NULL))TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
633 | goto err; never executed: goto err; | 0 |
634 | t_tob64(vf, tmp, BN_num_bytes(v)); | - |
635 | | - |
636 | if (*salt == NULL) {TRUE | evaluated 2 times by 1 test | FALSE | never evaluated |
| 0-2 |
637 | char *tmp_salt; | - |
638 | | - |
639 | if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) {TRUE | never evaluated | FALSE | evaluated 2 times by 1 test |
| 0-2 |
640 | goto err; never executed: goto err; | 0 |
641 | } | - |
642 | t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN); | - |
643 | *salt = tmp_salt; | - |
644 | }executed 2 times by 1 test: end of block | 2 |
645 | | - |
646 | *verifier = vf; | - |
647 | vf = NULL; | - |
648 | result = defgNid; | - |
649 | | - |
650 | err:code before this statement executed 2 times by 1 test: err: | 2 |
651 | BN_free(N_bn_alloc); | - |
652 | BN_free(g_bn_alloc); | - |
653 | OPENSSL_clear_free(vf, vfsize); | - |
654 | BN_clear_free(s); | - |
655 | BN_clear_free(v); | - |
656 | return result;executed 2 times by 1 test: return result; | 2 |
657 | } | - |
658 | | - |
659 | | - |
660 | | - |
661 | | - |
662 | | - |
663 | | - |
664 | | - |
665 | | - |
666 | | - |
667 | | - |
668 | int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, | - |
669 | BIGNUM **verifier, const BIGNUM *N, | - |
670 | const BIGNUM *g) | - |
671 | { | - |
672 | int result = 0; | - |
673 | BIGNUM *x = NULL; | - |
674 | BN_CTX *bn_ctx = BN_CTX_new(); | - |
675 | unsigned char tmp2[MAX_LEN]; | - |
676 | BIGNUM *salttmp = NULL; | - |
677 | | - |
678 | if ((user == NULL) ||TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
679 | (pass == NULL) ||TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
680 | (salt == NULL) ||TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
681 | (verifier == NULL) || (N == NULL) || (g == NULL) || (bn_ctx == NULL))TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
682 | goto err; never executed: goto err; | 0 |
683 | | - |
684 | if (*salt == NULL) {TRUE | evaluated 8 times by 1 test | FALSE | evaluated 3 times by 1 test |
| 3-8 |
685 | if (RAND_bytes(tmp2, SRP_RANDOM_SALT_LEN) <= 0)TRUE | never evaluated | FALSE | evaluated 8 times by 1 test |
| 0-8 |
686 | goto err; never executed: goto err; | 0 |
687 | | - |
688 | salttmp = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL); | - |
689 | } else {executed 8 times by 1 test: end of block | 8 |
690 | salttmp = *salt; | - |
691 | }executed 3 times by 1 test: end of block | 3 |
692 | | - |
693 | x = SRP_Calc_x(salttmp, user, pass); | - |
694 | | - |
695 | *verifier = BN_new(); | - |
696 | if (*verifier == NULL)TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
697 | goto err; never executed: goto err; | 0 |
698 | | - |
699 | if (!BN_mod_exp(*verifier, g, x, N, bn_ctx)) {TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
700 | BN_clear_free(*verifier); | - |
701 | goto err; never executed: goto err; | 0 |
702 | } | - |
703 | | - |
704 | result = 1; | - |
705 | *salt = salttmp; | - |
706 | | - |
707 | err:code before this statement executed 11 times by 1 test: err: | 11 |
708 | if (salt != NULL && *salt != salttmp)TRUE | evaluated 11 times by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | evaluated 11 times by 1 test |
| 0-11 |
709 | BN_clear_free(salttmp); never executed: BN_clear_free(salttmp); | 0 |
710 | BN_clear_free(x); | - |
711 | BN_CTX_free(bn_ctx); | - |
712 | return result;executed 11 times by 1 test: return result; | 11 |
713 | } | - |
714 | | - |
715 | #endif | - |
| | |