1 /*
2 * validator/val_secalgo.c - validator security algorithm functions.
3 *
4 * Copyright (c) 2012, NLnet Labs. All rights reserved.
5 *
6 * This software is open source.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 *
15 * Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 *
19 * Neither the name of the NLNET LABS nor the names of its contributors may
20 * be used to endorse or promote products derived from this software without
21 * specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 /**
37 * \file
38 *
39 * This file contains helper functions for the validator module.
40 * These functions take raw data buffers, formatted for crypto verification,
41 * and do the library calls (for the crypto library in use).
42 */
43 #include "config.h"
44 /* packed_rrset on top to define enum types (forced by c99 standard) */
45 #include "util/data/packed_rrset.h"
46 #include "validator/val_secalgo.h"
47 #include "validator/val_nsec3.h"
48 #include "util/log.h"
49 #include "sldns/rrdef.h"
50 #include "sldns/keyraw.h"
51 #include "sldns/sbuffer.h"
52
53 #if !defined(HAVE_SSL) && !defined(HAVE_NSS) && !defined(HAVE_NETTLE)
54 #error "Need crypto library to do digital signature cryptography"
55 #endif
56
57 /** fake DSA support for unit tests */
58 int fake_dsa = 0;
59 /** fake SHA1 support for unit tests */
60 int fake_sha1 = 0;
61
62 /* OpenSSL implementation */
63 #ifdef HAVE_SSL
64 #ifdef HAVE_OPENSSL_ERR_H
65 #include <openssl/err.h>
66 #endif
67
68 #ifdef HAVE_OPENSSL_RAND_H
69 #include <openssl/rand.h>
70 #endif
71
72 #ifdef HAVE_OPENSSL_CONF_H
73 #include <openssl/conf.h>
74 #endif
75
76 #ifdef HAVE_OPENSSL_ENGINE_H
77 #include <openssl/engine.h>
78 #endif
79
80 #if defined(HAVE_OPENSSL_DSA_H) && defined(USE_DSA)
81 #include <openssl/dsa.h>
82 #endif
83
84 /**
85 * Output a libcrypto openssl error to the logfile.
86 * @param str: string to add to it.
87 * @param e: the error to output, error number from ERR_get_error().
88 */
89 static void
log_crypto_error(const char * str,unsigned long e)90 log_crypto_error(const char* str, unsigned long e)
91 {
92 char buf[128];
93 /* or use ERR_error_string if ERR_error_string_n is not avail TODO */
94 ERR_error_string_n(e, buf, sizeof(buf));
95 /* buf now contains */
96 /* error:[error code]:[library name]:[function name]:[reason string] */
97 log_err("%s crypto %s", str, buf);
98 }
99
100 /**
101 * Output a libcrypto openssl error to the logfile as a debug message.
102 * @param level: debug level to use in verbose() call
103 * @param str: string to add to it.
104 * @param e: the error to output, error number from ERR_get_error().
105 */
106 static void
log_crypto_verbose(enum verbosity_value level,const char * str,unsigned long e)107 log_crypto_verbose(enum verbosity_value level, const char* str, unsigned long e)
108 {
109 char buf[128];
110 /* or use ERR_error_string if ERR_error_string_n is not avail TODO */
111 ERR_error_string_n(e, buf, sizeof(buf));
112 /* buf now contains */
113 /* error:[error code]:[library name]:[function name]:[reason string] */
114 verbose(level, "%s crypto %s", str, buf);
115 }
116
117 /* return size of digest if supported, or 0 otherwise */
118 size_t
nsec3_hash_algo_size_supported(int id)119 nsec3_hash_algo_size_supported(int id)
120 {
121 switch(id) {
122 case NSEC3_HASH_SHA1:
123 return SHA_DIGEST_LENGTH;
124 default:
125 return 0;
126 }
127 }
128
129 /* perform nsec3 hash. return false on failure */
130 int
secalgo_nsec3_hash(int algo,unsigned char * buf,size_t len,unsigned char * res)131 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
132 unsigned char* res)
133 {
134 switch(algo) {
135 case NSEC3_HASH_SHA1:
136 #ifdef OPENSSL_FIPS
137 if(!sldns_digest_evp(buf, len, res, EVP_sha1()))
138 log_crypto_error("could not digest with EVP_sha1",
139 ERR_get_error());
140 #else
141 (void)SHA1(buf, len, res);
142 #endif
143 return 1;
144 default:
145 return 0;
146 }
147 }
148
149 void
secalgo_hash_sha256(unsigned char * buf,size_t len,unsigned char * res)150 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
151 {
152 #ifdef OPENSSL_FIPS
153 if(!sldns_digest_evp(buf, len, res, EVP_sha256()))
154 log_crypto_error("could not digest with EVP_sha256",
155 ERR_get_error());
156 #else
157 (void)SHA256(buf, len, res);
158 #endif
159 }
160
161 /** hash structure for keeping track of running hashes */
162 struct secalgo_hash {
163 /** the openssl message digest context */
164 EVP_MD_CTX* ctx;
165 };
166
167 /** create secalgo hash with hash type */
secalgo_hash_create_md(const EVP_MD * md)168 static struct secalgo_hash* secalgo_hash_create_md(const EVP_MD* md)
169 {
170 struct secalgo_hash* h;
171 if(!md)
172 return NULL;
173 h = calloc(1, sizeof(*h));
174 if(!h)
175 return NULL;
176 h->ctx = EVP_MD_CTX_create();
177 if(!h->ctx) {
178 free(h);
179 return NULL;
180 }
181 if(!EVP_DigestInit_ex(h->ctx, md, NULL)) {
182 EVP_MD_CTX_destroy(h->ctx);
183 free(h);
184 return NULL;
185 }
186 return h;
187 }
188
secalgo_hash_create_sha384(void)189 struct secalgo_hash* secalgo_hash_create_sha384(void)
190 {
191 return secalgo_hash_create_md(EVP_sha384());
192 }
193
secalgo_hash_create_sha512(void)194 struct secalgo_hash* secalgo_hash_create_sha512(void)
195 {
196 return secalgo_hash_create_md(EVP_sha512());
197 }
198
secalgo_hash_update(struct secalgo_hash * hash,uint8_t * data,size_t len)199 int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
200 {
201 return EVP_DigestUpdate(hash->ctx, (unsigned char*)data,
202 (unsigned int)len);
203 }
204
secalgo_hash_final(struct secalgo_hash * hash,uint8_t * result,size_t maxlen,size_t * resultlen)205 int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
206 size_t maxlen, size_t* resultlen)
207 {
208 if(EVP_MD_CTX_size(hash->ctx) > (int)maxlen) {
209 *resultlen = 0;
210 log_err("secalgo_hash_final: hash buffer too small");
211 return 0;
212 }
213 *resultlen = EVP_MD_CTX_size(hash->ctx);
214 return EVP_DigestFinal_ex(hash->ctx, result, NULL);
215 }
216
secalgo_hash_delete(struct secalgo_hash * hash)217 void secalgo_hash_delete(struct secalgo_hash* hash)
218 {
219 if(!hash) return;
220 EVP_MD_CTX_destroy(hash->ctx);
221 free(hash);
222 }
223
224 /**
225 * Return size of DS digest according to its hash algorithm.
226 * @param algo: DS digest algo.
227 * @return size in bytes of digest, or 0 if not supported.
228 */
229 size_t
ds_digest_size_supported(int algo)230 ds_digest_size_supported(int algo)
231 {
232 switch(algo) {
233 case LDNS_SHA1:
234 #if defined(HAVE_EVP_SHA1) && defined(USE_SHA1)
235 #ifdef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED
236 if (EVP_default_properties_is_fips_enabled(NULL))
237 return 0;
238 #endif
239 return SHA_DIGEST_LENGTH;
240 #else
241 if(fake_sha1) return 20;
242 return 0;
243 #endif
244 #ifdef HAVE_EVP_SHA256
245 case LDNS_SHA256:
246 return SHA256_DIGEST_LENGTH;
247 #endif
248 #ifdef USE_GOST
249 case LDNS_HASH_GOST:
250 /* we support GOST if it can be loaded */
251 (void)sldns_key_EVP_load_gost_id();
252 if(EVP_get_digestbyname("md_gost94"))
253 return 32;
254 else return 0;
255 #endif
256 #ifdef USE_ECDSA
257 case LDNS_SHA384:
258 return SHA384_DIGEST_LENGTH;
259 #endif
260 default: break;
261 }
262 return 0;
263 }
264
265 #ifdef USE_GOST
266 /** Perform GOST hash */
267 static int
do_gost94(unsigned char * data,size_t len,unsigned char * dest)268 do_gost94(unsigned char* data, size_t len, unsigned char* dest)
269 {
270 const EVP_MD* md = EVP_get_digestbyname("md_gost94");
271 if(!md)
272 return 0;
273 return sldns_digest_evp(data, (unsigned int)len, dest, md);
274 }
275 #endif
276
277 int
secalgo_ds_digest(int algo,unsigned char * buf,size_t len,unsigned char * res)278 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
279 unsigned char* res)
280 {
281 switch(algo) {
282 #if defined(HAVE_EVP_SHA1) && defined(USE_SHA1)
283 case LDNS_SHA1:
284 #ifdef OPENSSL_FIPS
285 if(!sldns_digest_evp(buf, len, res, EVP_sha1()))
286 log_crypto_error("could not digest with EVP_sha1",
287 ERR_get_error());
288 #else
289 (void)SHA1(buf, len, res);
290 #endif
291 return 1;
292 #endif
293 #ifdef HAVE_EVP_SHA256
294 case LDNS_SHA256:
295 #ifdef OPENSSL_FIPS
296 if(!sldns_digest_evp(buf, len, res, EVP_sha256()))
297 log_crypto_error("could not digest with EVP_sha256",
298 ERR_get_error());
299 #else
300 (void)SHA256(buf, len, res);
301 #endif
302 return 1;
303 #endif
304 #ifdef USE_GOST
305 case LDNS_HASH_GOST:
306 if(do_gost94(buf, len, res))
307 return 1;
308 break;
309 #endif
310 #ifdef USE_ECDSA
311 case LDNS_SHA384:
312 #ifdef OPENSSL_FIPS
313 if(!sldns_digest_evp(buf, len, res, EVP_sha384()))
314 log_crypto_error("could not digest with EVP_sha384",
315 ERR_get_error());
316 #else
317 (void)SHA384(buf, len, res);
318 #endif
319 return 1;
320 #endif
321 default:
322 verbose(VERB_QUERY, "unknown DS digest algorithm %d",
323 algo);
324 break;
325 }
326 return 0;
327 }
328
329 /** return true if DNSKEY algorithm id is supported */
330 int
dnskey_algo_id_is_supported(int id)331 dnskey_algo_id_is_supported(int id)
332 {
333 switch(id) {
334 case LDNS_RSAMD5:
335 /* RFC 6725 deprecates RSAMD5 */
336 return 0;
337 case LDNS_DSA:
338 case LDNS_DSA_NSEC3:
339 #if defined(USE_DSA) && defined(USE_SHA1)
340 return 1;
341 #else
342 if(fake_dsa || fake_sha1) return 1;
343 return 0;
344 #endif
345
346 case LDNS_RSASHA1:
347 case LDNS_RSASHA1_NSEC3:
348 #ifdef USE_SHA1
349 #ifdef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED
350 return !EVP_default_properties_is_fips_enabled(NULL);
351 #else
352 return 1;
353 #endif
354 #else
355 if(fake_sha1) return 1;
356 return 0;
357 #endif
358
359 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
360 case LDNS_RSASHA256:
361 #endif
362 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
363 case LDNS_RSASHA512:
364 #endif
365 #ifdef USE_ECDSA
366 case LDNS_ECDSAP256SHA256:
367 case LDNS_ECDSAP384SHA384:
368 #endif
369 #if (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) || defined(USE_ECDSA)
370 return 1;
371 #endif
372 #ifdef USE_ED25519
373 case LDNS_ED25519:
374 #endif
375 #ifdef USE_ED448
376 case LDNS_ED448:
377 #endif
378 #if defined(USE_ED25519) || defined(USE_ED448)
379 #ifdef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED
380 return !EVP_default_properties_is_fips_enabled(NULL);
381 #else
382 return 1;
383 #endif
384 #endif
385
386 #ifdef USE_GOST
387 case LDNS_ECC_GOST:
388 /* we support GOST if it can be loaded */
389 return sldns_key_EVP_load_gost_id();
390 #endif
391 default:
392 return 0;
393 }
394 }
395
396 #ifdef USE_DSA
397 /**
398 * Setup DSA key digest in DER encoding ...
399 * @param sig: input is signature output alloced ptr (unless failure).
400 * caller must free alloced ptr if this routine returns true.
401 * @param len: input is initial siglen, output is output len.
402 * @return false on failure.
403 */
404 static int
setup_dsa_sig(unsigned char ** sig,unsigned int * len)405 setup_dsa_sig(unsigned char** sig, unsigned int* len)
406 {
407 unsigned char* orig = *sig;
408 unsigned int origlen = *len;
409 int newlen;
410 BIGNUM *R, *S;
411 DSA_SIG *dsasig;
412
413 /* extract the R and S field from the sig buffer */
414 if(origlen < 1 + 2*SHA_DIGEST_LENGTH)
415 return 0;
416 R = BN_new();
417 if(!R) return 0;
418 (void) BN_bin2bn(orig + 1, SHA_DIGEST_LENGTH, R);
419 S = BN_new();
420 if(!S) return 0;
421 (void) BN_bin2bn(orig + 21, SHA_DIGEST_LENGTH, S);
422 dsasig = DSA_SIG_new();
423 if(!dsasig) return 0;
424
425 #ifdef HAVE_DSA_SIG_SET0
426 if(!DSA_SIG_set0(dsasig, R, S)) {
427 DSA_SIG_free(dsasig);
428 return 0;
429 }
430 #else
431 # ifndef S_SPLINT_S
432 dsasig->r = R;
433 dsasig->s = S;
434 # endif /* S_SPLINT_S */
435 #endif
436 *sig = NULL;
437 newlen = i2d_DSA_SIG(dsasig, sig);
438 if(newlen < 0) {
439 DSA_SIG_free(dsasig);
440 free(*sig);
441 return 0;
442 }
443 *len = (unsigned int)newlen;
444 DSA_SIG_free(dsasig);
445 return 1;
446 }
447 #endif /* USE_DSA */
448
449 #ifdef USE_ECDSA
450 /**
451 * Setup the ECDSA signature in its encoding that the library wants.
452 * Converts from plain numbers to ASN formatted.
453 * @param sig: input is signature, output alloced ptr (unless failure).
454 * caller must free alloced ptr if this routine returns true.
455 * @param len: input is initial siglen, output is output len.
456 * @return false on failure.
457 */
458 static int
setup_ecdsa_sig(unsigned char ** sig,unsigned int * len)459 setup_ecdsa_sig(unsigned char** sig, unsigned int* len)
460 {
461 /* convert from two BIGNUMs in the rdata buffer, to ASN notation.
462 * ASN preamble: 30440220 <R 32bytefor256> 0220 <S 32bytefor256>
463 * the '20' is the length of that field (=bnsize).
464 i * the '44' is the total remaining length.
465 * if negative, start with leading zero.
466 * if starts with 00s, remove them from the number.
467 */
468 uint8_t pre[] = {0x30, 0x44, 0x02, 0x20};
469 int pre_len = 4;
470 uint8_t mid[] = {0x02, 0x20};
471 int mid_len = 2;
472 int raw_sig_len, r_high, s_high, r_rem=0, s_rem=0;
473 int bnsize = (int)((*len)/2);
474 unsigned char* d = *sig;
475 uint8_t* p;
476 /* if too short or not even length, fails */
477 if(*len < 16 || bnsize*2 != (int)*len)
478 return 0;
479
480 /* strip leading zeroes from r (but not last one) */
481 while(r_rem < bnsize-1 && d[r_rem] == 0)
482 r_rem++;
483 /* strip leading zeroes from s (but not last one) */
484 while(s_rem < bnsize-1 && d[bnsize+s_rem] == 0)
485 s_rem++;
486
487 r_high = ((d[0+r_rem]&0x80)?1:0);
488 s_high = ((d[bnsize+s_rem]&0x80)?1:0);
489 raw_sig_len = pre_len + r_high + bnsize - r_rem + mid_len +
490 s_high + bnsize - s_rem;
491 *sig = (unsigned char*)malloc((size_t)raw_sig_len);
492 if(!*sig)
493 return 0;
494 p = (uint8_t*)*sig;
495 p[0] = pre[0];
496 p[1] = (uint8_t)(raw_sig_len-2);
497 p[2] = pre[2];
498 p[3] = (uint8_t)(bnsize + r_high - r_rem);
499 p += 4;
500 if(r_high) {
501 *p = 0;
502 p += 1;
503 }
504 memmove(p, d+r_rem, (size_t)bnsize-r_rem);
505 p += bnsize-r_rem;
506 memmove(p, mid, (size_t)mid_len-1);
507 p += mid_len-1;
508 *p = (uint8_t)(bnsize + s_high - s_rem);
509 p += 1;
510 if(s_high) {
511 *p = 0;
512 p += 1;
513 }
514 memmove(p, d+bnsize+s_rem, (size_t)bnsize-s_rem);
515 *len = (unsigned int)raw_sig_len;
516 return 1;
517 }
518 #endif /* USE_ECDSA */
519
520 #ifdef USE_ECDSA_EVP_WORKAROUND
521 static EVP_MD ecdsa_evp_256_md;
522 static EVP_MD ecdsa_evp_384_md;
ecdsa_evp_workaround_init(void)523 void ecdsa_evp_workaround_init(void)
524 {
525 /* openssl before 1.0.0 fixes RSA with the SHA256
526 * hash in EVP. We create one for ecdsa_sha256 */
527 ecdsa_evp_256_md = *EVP_sha256();
528 ecdsa_evp_256_md.required_pkey_type[0] = EVP_PKEY_EC;
529 ecdsa_evp_256_md.verify = (void*)ECDSA_verify;
530
531 ecdsa_evp_384_md = *EVP_sha384();
532 ecdsa_evp_384_md.required_pkey_type[0] = EVP_PKEY_EC;
533 ecdsa_evp_384_md.verify = (void*)ECDSA_verify;
534 }
535 #endif /* USE_ECDSA_EVP_WORKAROUND */
536
537 /**
538 * Setup key and digest for verification. Adjust sig if necessary.
539 *
540 * @param algo: key algorithm
541 * @param evp_key: EVP PKEY public key to create.
542 * @param digest_type: digest type to use
543 * @param key: key to setup for.
544 * @param keylen: length of key.
545 * @return false on failure.
546 */
547 static int
setup_key_digest(int algo,EVP_PKEY ** evp_key,const EVP_MD ** digest_type,unsigned char * key,size_t keylen)548 setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
549 unsigned char* key, size_t keylen)
550 {
551 switch(algo) {
552 #if defined(USE_DSA) && defined(USE_SHA1)
553 case LDNS_DSA:
554 case LDNS_DSA_NSEC3:
555 *evp_key = sldns_key_dsa2pkey_raw(key, keylen);
556 if(!*evp_key) {
557 verbose(VERB_QUERY, "verify: sldns_key_dsa2pkey failed");
558 return 0;
559 }
560 #ifdef HAVE_EVP_DSS1
561 *digest_type = EVP_dss1();
562 #else
563 *digest_type = EVP_sha1();
564 #endif
565
566 break;
567 #endif /* USE_DSA && USE_SHA1 */
568
569 #if defined(USE_SHA1) || (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2))
570 #ifdef USE_SHA1
571 case LDNS_RSASHA1:
572 case LDNS_RSASHA1_NSEC3:
573 #endif
574 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
575 case LDNS_RSASHA256:
576 #endif
577 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
578 case LDNS_RSASHA512:
579 #endif
580 *evp_key = sldns_key_rsa2pkey_raw(key, keylen);
581 if(!*evp_key) {
582 verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey SHA failed");
583 return 0;
584 }
585
586 /* select SHA version */
587 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
588 if(algo == LDNS_RSASHA256)
589 *digest_type = EVP_sha256();
590 else
591 #endif
592 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
593 if(algo == LDNS_RSASHA512)
594 *digest_type = EVP_sha512();
595 else
596 #endif
597 #ifdef USE_SHA1
598 *digest_type = EVP_sha1();
599 #else
600 { verbose(VERB_QUERY, "no digest available"); return 0; }
601 #endif
602 break;
603 #endif /* defined(USE_SHA1) || (defined(HAVE_EVP_SHA256) && defined(USE_SHA2)) || (defined(HAVE_EVP_SHA512) && defined(USE_SHA2)) */
604
605 case LDNS_RSAMD5:
606 *evp_key = sldns_key_rsa2pkey_raw(key, keylen);
607 if(!*evp_key) {
608 verbose(VERB_QUERY, "verify: sldns_key_rsa2pkey MD5 failed");
609 return 0;
610 }
611 *digest_type = EVP_md5();
612
613 break;
614 #ifdef USE_GOST
615 case LDNS_ECC_GOST:
616 *evp_key = sldns_gost2pkey_raw(key, keylen);
617 if(!*evp_key) {
618 verbose(VERB_QUERY, "verify: "
619 "sldns_gost2pkey_raw failed");
620 return 0;
621 }
622 *digest_type = EVP_get_digestbyname("md_gost94");
623 if(!*digest_type) {
624 verbose(VERB_QUERY, "verify: "
625 "EVP_getdigest md_gost94 failed");
626 return 0;
627 }
628 break;
629 #endif
630 #ifdef USE_ECDSA
631 case LDNS_ECDSAP256SHA256:
632 *evp_key = sldns_ecdsa2pkey_raw(key, keylen,
633 LDNS_ECDSAP256SHA256);
634 if(!*evp_key) {
635 verbose(VERB_QUERY, "verify: "
636 "sldns_ecdsa2pkey_raw failed");
637 return 0;
638 }
639 #ifdef USE_ECDSA_EVP_WORKAROUND
640 *digest_type = &ecdsa_evp_256_md;
641 #else
642 *digest_type = EVP_sha256();
643 #endif
644 break;
645 case LDNS_ECDSAP384SHA384:
646 *evp_key = sldns_ecdsa2pkey_raw(key, keylen,
647 LDNS_ECDSAP384SHA384);
648 if(!*evp_key) {
649 verbose(VERB_QUERY, "verify: "
650 "sldns_ecdsa2pkey_raw failed");
651 return 0;
652 }
653 #ifdef USE_ECDSA_EVP_WORKAROUND
654 *digest_type = &ecdsa_evp_384_md;
655 #else
656 *digest_type = EVP_sha384();
657 #endif
658 break;
659 #endif /* USE_ECDSA */
660 #ifdef USE_ED25519
661 case LDNS_ED25519:
662 *evp_key = sldns_ed255192pkey_raw(key, keylen);
663 if(!*evp_key) {
664 verbose(VERB_QUERY, "verify: "
665 "sldns_ed255192pkey_raw failed");
666 return 0;
667 }
668 *digest_type = NULL;
669 break;
670 #endif /* USE_ED25519 */
671 #ifdef USE_ED448
672 case LDNS_ED448:
673 *evp_key = sldns_ed4482pkey_raw(key, keylen);
674 if(!*evp_key) {
675 verbose(VERB_QUERY, "verify: "
676 "sldns_ed4482pkey_raw failed");
677 return 0;
678 }
679 *digest_type = NULL;
680 break;
681 #endif /* USE_ED448 */
682 default:
683 verbose(VERB_QUERY, "verify: unknown algorithm %d",
684 algo);
685 return 0;
686 }
687 return 1;
688 }
689
690 static void
digest_ctx_free(EVP_MD_CTX * ctx,EVP_PKEY * evp_key,unsigned char * sigblock,int dofree,int docrypto_free)691 digest_ctx_free(EVP_MD_CTX* ctx, EVP_PKEY *evp_key,
692 unsigned char* sigblock, int dofree, int docrypto_free)
693 {
694 #ifdef HAVE_EVP_MD_CTX_NEW
695 EVP_MD_CTX_destroy(ctx);
696 #else
697 EVP_MD_CTX_cleanup(ctx);
698 free(ctx);
699 #endif
700 EVP_PKEY_free(evp_key);
701 if(dofree) free(sigblock);
702 else if(docrypto_free) OPENSSL_free(sigblock);
703 }
704
705 static enum sec_status
digest_error_status(const char * str)706 digest_error_status(const char *str)
707 {
708 unsigned long e = ERR_get_error();
709 #ifdef EVP_R_INVALID_DIGEST
710 if (ERR_GET_LIB(e) == ERR_LIB_EVP &&
711 ERR_GET_REASON(e) == EVP_R_INVALID_DIGEST) {
712 log_crypto_verbose(VERB_ALGO, str, e);
713 return sec_status_indeterminate;
714 }
715 #endif
716 log_crypto_verbose(VERB_QUERY, str, e);
717 return sec_status_unchecked;
718 }
719
720 /**
721 * Check a canonical sig+rrset and signature against a dnskey
722 * @param buf: buffer with data to verify, the first rrsig part and the
723 * canonicalized rrset.
724 * @param algo: DNSKEY algorithm.
725 * @param sigblock: signature rdata field from RRSIG
726 * @param sigblock_len: length of sigblock data.
727 * @param key: public key data from DNSKEY RR.
728 * @param keylen: length of keydata.
729 * @param reason: bogus reason in more detail.
730 * @return secure if verification succeeded, bogus on crypto failure,
731 * unchecked on format errors and alloc failures, indeterminate
732 * if digest is not supported by the crypto library (openssl3+ only).
733 */
734 enum sec_status
verify_canonrrset(sldns_buffer * buf,int algo,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen,char ** reason)735 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
736 unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
737 char** reason)
738 {
739 const EVP_MD *digest_type;
740 EVP_MD_CTX* ctx;
741 int res, dofree = 0, docrypto_free = 0;
742 EVP_PKEY *evp_key = NULL;
743
744 #ifndef USE_DSA
745 if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&(fake_dsa||fake_sha1))
746 return sec_status_secure;
747 #endif
748 if(fake_sha1 && (algo == LDNS_DSA || algo == LDNS_DSA_NSEC3 || algo == LDNS_RSASHA1 || algo == LDNS_RSASHA1_NSEC3))
749 return sec_status_secure;
750
751 if(!setup_key_digest(algo, &evp_key, &digest_type, key, keylen)) {
752 verbose(VERB_QUERY, "verify: failed to setup key");
753 *reason = "use of key for crypto failed";
754 EVP_PKEY_free(evp_key);
755 return sec_status_bogus;
756 }
757 #ifdef USE_DSA
758 /* if it is a DSA signature in bind format, convert to DER format */
759 if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&
760 sigblock_len == 1+2*SHA_DIGEST_LENGTH) {
761 if(!setup_dsa_sig(&sigblock, &sigblock_len)) {
762 verbose(VERB_QUERY, "verify: failed to setup DSA sig");
763 *reason = "use of key for DSA crypto failed";
764 EVP_PKEY_free(evp_key);
765 return sec_status_bogus;
766 }
767 docrypto_free = 1;
768 }
769 #endif
770 #if defined(USE_ECDSA) && defined(USE_DSA)
771 else
772 #endif
773 #ifdef USE_ECDSA
774 if(algo == LDNS_ECDSAP256SHA256 || algo == LDNS_ECDSAP384SHA384) {
775 /* EVP uses ASN prefix on sig, which is not in the wire data */
776 if(!setup_ecdsa_sig(&sigblock, &sigblock_len)) {
777 verbose(VERB_QUERY, "verify: failed to setup ECDSA sig");
778 *reason = "use of signature for ECDSA crypto failed";
779 EVP_PKEY_free(evp_key);
780 return sec_status_bogus;
781 }
782 dofree = 1;
783 }
784 #endif /* USE_ECDSA */
785
786 /* do the signature cryptography work */
787 #ifdef HAVE_EVP_MD_CTX_NEW
788 ctx = EVP_MD_CTX_new();
789 #else
790 ctx = (EVP_MD_CTX*)malloc(sizeof(*ctx));
791 if(ctx) EVP_MD_CTX_init(ctx);
792 #endif
793 if(!ctx) {
794 log_err("EVP_MD_CTX_new: malloc failure");
795 EVP_PKEY_free(evp_key);
796 if(dofree) free(sigblock);
797 else if(docrypto_free) OPENSSL_free(sigblock);
798 return sec_status_unchecked;
799 }
800 #ifndef HAVE_EVP_DIGESTVERIFY
801 if(EVP_DigestInit(ctx, digest_type) == 0) {
802 enum sec_status sec;
803 sec = digest_error_status("verify: EVP_DigestInit failed");
804 digest_ctx_free(ctx, evp_key, sigblock,
805 dofree, docrypto_free);
806 return sec;
807 }
808 if(EVP_DigestUpdate(ctx, (unsigned char*)sldns_buffer_begin(buf),
809 (unsigned int)sldns_buffer_limit(buf)) == 0) {
810 log_crypto_verbose(VERB_QUERY, "verify: EVP_DigestUpdate failed",
811 ERR_get_error());
812 digest_ctx_free(ctx, evp_key, sigblock,
813 dofree, docrypto_free);
814 return sec_status_unchecked;
815 }
816
817 res = EVP_VerifyFinal(ctx, sigblock, sigblock_len, evp_key);
818 #else /* HAVE_EVP_DIGESTVERIFY */
819 if(EVP_DigestVerifyInit(ctx, NULL, digest_type, NULL, evp_key) == 0) {
820 enum sec_status sec;
821 sec = digest_error_status("verify: EVP_DigestVerifyInit failed");
822 digest_ctx_free(ctx, evp_key, sigblock,
823 dofree, docrypto_free);
824 return sec;
825 }
826 res = EVP_DigestVerify(ctx, sigblock, sigblock_len,
827 (unsigned char*)sldns_buffer_begin(buf),
828 sldns_buffer_limit(buf));
829 #endif
830 digest_ctx_free(ctx, evp_key, sigblock,
831 dofree, docrypto_free);
832
833 if(res == 1) {
834 return sec_status_secure;
835 } else if(res == 0) {
836 verbose(VERB_QUERY, "verify: signature mismatch");
837 *reason = "signature crypto failed";
838 return sec_status_bogus;
839 }
840
841 log_crypto_error("verify:", ERR_get_error());
842 return sec_status_unchecked;
843 }
844
845 /**************************************************/
846 #elif defined(HAVE_NSS)
847 /* libnss implementation */
848 /* nss3 */
849 #include "sechash.h"
850 #include "pk11pub.h"
851 #include "keyhi.h"
852 #include "secerr.h"
853 #include "cryptohi.h"
854 /* nspr4 */
855 #include "prerror.h"
856
857 /* return size of digest if supported, or 0 otherwise */
858 size_t
nsec3_hash_algo_size_supported(int id)859 nsec3_hash_algo_size_supported(int id)
860 {
861 switch(id) {
862 case NSEC3_HASH_SHA1:
863 return SHA1_LENGTH;
864 default:
865 return 0;
866 }
867 }
868
869 /* perform nsec3 hash. return false on failure */
870 int
secalgo_nsec3_hash(int algo,unsigned char * buf,size_t len,unsigned char * res)871 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
872 unsigned char* res)
873 {
874 switch(algo) {
875 case NSEC3_HASH_SHA1:
876 (void)HASH_HashBuf(HASH_AlgSHA1, res, buf, (unsigned long)len);
877 return 1;
878 default:
879 return 0;
880 }
881 }
882
883 void
secalgo_hash_sha256(unsigned char * buf,size_t len,unsigned char * res)884 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
885 {
886 (void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
887 }
888
889 /** the secalgo hash structure */
890 struct secalgo_hash {
891 /** hash context */
892 HASHContext* ctx;
893 };
894
895 /** create hash struct of type */
secalgo_hash_create_type(HASH_HashType tp)896 static struct secalgo_hash* secalgo_hash_create_type(HASH_HashType tp)
897 {
898 struct secalgo_hash* h = calloc(1, sizeof(*h));
899 if(!h)
900 return NULL;
901 h->ctx = HASH_Create(tp);
902 if(!h->ctx) {
903 free(h);
904 return NULL;
905 }
906 return h;
907 }
908
secalgo_hash_create_sha384(void)909 struct secalgo_hash* secalgo_hash_create_sha384(void)
910 {
911 return secalgo_hash_create_type(HASH_AlgSHA384);
912 }
913
secalgo_hash_create_sha512(void)914 struct secalgo_hash* secalgo_hash_create_sha512(void)
915 {
916 return secalgo_hash_create_type(HASH_AlgSHA512);
917 }
918
secalgo_hash_update(struct secalgo_hash * hash,uint8_t * data,size_t len)919 int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
920 {
921 HASH_Update(hash->ctx, (unsigned char*)data, (unsigned int)len);
922 return 1;
923 }
924
secalgo_hash_final(struct secalgo_hash * hash,uint8_t * result,size_t maxlen,size_t * resultlen)925 int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
926 size_t maxlen, size_t* resultlen)
927 {
928 unsigned int reslen = 0;
929 if(HASH_ResultLenContext(hash->ctx) > (unsigned int)maxlen) {
930 *resultlen = 0;
931 log_err("secalgo_hash_final: hash buffer too small");
932 return 0;
933 }
934 HASH_End(hash->ctx, (unsigned char*)result, &reslen,
935 (unsigned int)maxlen);
936 *resultlen = (size_t)reslen;
937 return 1;
938 }
939
secalgo_hash_delete(struct secalgo_hash * hash)940 void secalgo_hash_delete(struct secalgo_hash* hash)
941 {
942 if(!hash) return;
943 HASH_Destroy(hash->ctx);
944 free(hash);
945 }
946
947 size_t
ds_digest_size_supported(int algo)948 ds_digest_size_supported(int algo)
949 {
950 /* uses libNSS */
951 switch(algo) {
952 #ifdef USE_SHA1
953 case LDNS_SHA1:
954 return SHA1_LENGTH;
955 #endif
956 #ifdef USE_SHA2
957 case LDNS_SHA256:
958 return SHA256_LENGTH;
959 #endif
960 #ifdef USE_ECDSA
961 case LDNS_SHA384:
962 return SHA384_LENGTH;
963 #endif
964 /* GOST not supported in NSS */
965 case LDNS_HASH_GOST:
966 default: break;
967 }
968 return 0;
969 }
970
971 int
secalgo_ds_digest(int algo,unsigned char * buf,size_t len,unsigned char * res)972 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
973 unsigned char* res)
974 {
975 /* uses libNSS */
976 switch(algo) {
977 #ifdef USE_SHA1
978 case LDNS_SHA1:
979 return HASH_HashBuf(HASH_AlgSHA1, res, buf, len)
980 == SECSuccess;
981 #endif
982 #if defined(USE_SHA2)
983 case LDNS_SHA256:
984 return HASH_HashBuf(HASH_AlgSHA256, res, buf, len)
985 == SECSuccess;
986 #endif
987 #ifdef USE_ECDSA
988 case LDNS_SHA384:
989 return HASH_HashBuf(HASH_AlgSHA384, res, buf, len)
990 == SECSuccess;
991 #endif
992 case LDNS_HASH_GOST:
993 default:
994 verbose(VERB_QUERY, "unknown DS digest algorithm %d",
995 algo);
996 break;
997 }
998 return 0;
999 }
1000
1001 int
dnskey_algo_id_is_supported(int id)1002 dnskey_algo_id_is_supported(int id)
1003 {
1004 /* uses libNSS */
1005 switch(id) {
1006 case LDNS_RSAMD5:
1007 /* RFC 6725 deprecates RSAMD5 */
1008 return 0;
1009 #if defined(USE_SHA1) || defined(USE_SHA2)
1010 #if defined(USE_DSA) && defined(USE_SHA1)
1011 case LDNS_DSA:
1012 case LDNS_DSA_NSEC3:
1013 #endif
1014 #ifdef USE_SHA1
1015 case LDNS_RSASHA1:
1016 case LDNS_RSASHA1_NSEC3:
1017 #endif
1018 #ifdef USE_SHA2
1019 case LDNS_RSASHA256:
1020 #endif
1021 #ifdef USE_SHA2
1022 case LDNS_RSASHA512:
1023 #endif
1024 return 1;
1025 #endif /* SHA1 or SHA2 */
1026
1027 #ifdef USE_ECDSA
1028 case LDNS_ECDSAP256SHA256:
1029 case LDNS_ECDSAP384SHA384:
1030 return PK11_TokenExists(CKM_ECDSA);
1031 #endif
1032 case LDNS_ECC_GOST:
1033 default:
1034 return 0;
1035 }
1036 }
1037
1038 /* return a new public key for NSS */
nss_key_create(KeyType ktype)1039 static SECKEYPublicKey* nss_key_create(KeyType ktype)
1040 {
1041 SECKEYPublicKey* key;
1042 PLArenaPool* arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1043 if(!arena) {
1044 log_err("out of memory, PORT_NewArena failed");
1045 return NULL;
1046 }
1047 key = PORT_ArenaZNew(arena, SECKEYPublicKey);
1048 if(!key) {
1049 log_err("out of memory, PORT_ArenaZNew failed");
1050 PORT_FreeArena(arena, PR_FALSE);
1051 return NULL;
1052 }
1053 key->arena = arena;
1054 key->keyType = ktype;
1055 key->pkcs11Slot = NULL;
1056 key->pkcs11ID = CK_INVALID_HANDLE;
1057 return key;
1058 }
1059
nss_buf2ecdsa(unsigned char * key,size_t len,int algo)1060 static SECKEYPublicKey* nss_buf2ecdsa(unsigned char* key, size_t len, int algo)
1061 {
1062 SECKEYPublicKey* pk;
1063 SECItem pub = {siBuffer, NULL, 0};
1064 SECItem params = {siBuffer, NULL, 0};
1065 static unsigned char param256[] = {
1066 /* OBJECTIDENTIFIER 1.2.840.10045.3.1.7 (P-256)
1067 * {iso(1) member-body(2) us(840) ansi-x962(10045) curves(3) prime(1) prime256v1(7)} */
1068 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
1069 };
1070 static unsigned char param384[] = {
1071 /* OBJECTIDENTIFIER 1.3.132.0.34 (P-384)
1072 * {iso(1) identified-organization(3) certicom(132) curve(0) ansip384r1(34)} */
1073 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22
1074 };
1075 unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */
1076
1077 /* check length, which uncompressed must be 2 bignums */
1078 if(algo == LDNS_ECDSAP256SHA256) {
1079 if(len != 2*256/8) return NULL;
1080 /* ECCurve_X9_62_PRIME_256V1 */
1081 } else if(algo == LDNS_ECDSAP384SHA384) {
1082 if(len != 2*384/8) return NULL;
1083 /* ECCurve_X9_62_PRIME_384R1 */
1084 } else return NULL;
1085
1086 buf[0] = 0x04; /* POINT_FORM_UNCOMPRESSED */
1087 memmove(buf+1, key, len);
1088 pub.data = buf;
1089 pub.len = len+1;
1090 if(algo == LDNS_ECDSAP256SHA256) {
1091 params.data = param256;
1092 params.len = sizeof(param256);
1093 } else {
1094 params.data = param384;
1095 params.len = sizeof(param384);
1096 }
1097
1098 pk = nss_key_create(ecKey);
1099 if(!pk)
1100 return NULL;
1101 pk->u.ec.size = (len/2)*8;
1102 if(SECITEM_CopyItem(pk->arena, &pk->u.ec.publicValue, &pub)) {
1103 SECKEY_DestroyPublicKey(pk);
1104 return NULL;
1105 }
1106 if(SECITEM_CopyItem(pk->arena, &pk->u.ec.DEREncodedParams, ¶ms)) {
1107 SECKEY_DestroyPublicKey(pk);
1108 return NULL;
1109 }
1110
1111 return pk;
1112 }
1113
1114 #if defined(USE_DSA) && defined(USE_SHA1)
nss_buf2dsa(unsigned char * key,size_t len)1115 static SECKEYPublicKey* nss_buf2dsa(unsigned char* key, size_t len)
1116 {
1117 SECKEYPublicKey* pk;
1118 uint8_t T;
1119 uint16_t length;
1120 uint16_t offset;
1121 SECItem Q = {siBuffer, NULL, 0};
1122 SECItem P = {siBuffer, NULL, 0};
1123 SECItem G = {siBuffer, NULL, 0};
1124 SECItem Y = {siBuffer, NULL, 0};
1125
1126 if(len == 0)
1127 return NULL;
1128 T = (uint8_t)key[0];
1129 length = (64 + T * 8);
1130 offset = 1;
1131
1132 if (T > 8) {
1133 return NULL;
1134 }
1135 if(len < (size_t)1 + SHA1_LENGTH + 3*length)
1136 return NULL;
1137
1138 Q.data = key+offset;
1139 Q.len = SHA1_LENGTH;
1140 offset += SHA1_LENGTH;
1141
1142 P.data = key+offset;
1143 P.len = length;
1144 offset += length;
1145
1146 G.data = key+offset;
1147 G.len = length;
1148 offset += length;
1149
1150 Y.data = key+offset;
1151 Y.len = length;
1152 offset += length;
1153
1154 pk = nss_key_create(dsaKey);
1155 if(!pk)
1156 return NULL;
1157 if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.prime, &P)) {
1158 SECKEY_DestroyPublicKey(pk);
1159 return NULL;
1160 }
1161 if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.subPrime, &Q)) {
1162 SECKEY_DestroyPublicKey(pk);
1163 return NULL;
1164 }
1165 if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.base, &G)) {
1166 SECKEY_DestroyPublicKey(pk);
1167 return NULL;
1168 }
1169 if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.publicValue, &Y)) {
1170 SECKEY_DestroyPublicKey(pk);
1171 return NULL;
1172 }
1173 return pk;
1174 }
1175 #endif /* USE_DSA && USE_SHA1 */
1176
nss_buf2rsa(unsigned char * key,size_t len)1177 static SECKEYPublicKey* nss_buf2rsa(unsigned char* key, size_t len)
1178 {
1179 SECKEYPublicKey* pk;
1180 uint16_t exp;
1181 uint16_t offset;
1182 uint16_t int16;
1183 SECItem modulus = {siBuffer, NULL, 0};
1184 SECItem exponent = {siBuffer, NULL, 0};
1185 if(len == 0)
1186 return NULL;
1187 if(key[0] == 0) {
1188 if(len < 3)
1189 return NULL;
1190 /* the exponent is too large so it's places further */
1191 memmove(&int16, key+1, 2);
1192 exp = ntohs(int16);
1193 offset = 3;
1194 } else {
1195 exp = key[0];
1196 offset = 1;
1197 }
1198
1199 /* key length at least one */
1200 if(len < (size_t)offset + exp + 1)
1201 return NULL;
1202
1203 exponent.data = key+offset;
1204 exponent.len = exp;
1205 offset += exp;
1206 modulus.data = key+offset;
1207 modulus.len = (len - offset);
1208
1209 pk = nss_key_create(rsaKey);
1210 if(!pk)
1211 return NULL;
1212 if(SECITEM_CopyItem(pk->arena, &pk->u.rsa.modulus, &modulus)) {
1213 SECKEY_DestroyPublicKey(pk);
1214 return NULL;
1215 }
1216 if(SECITEM_CopyItem(pk->arena, &pk->u.rsa.publicExponent, &exponent)) {
1217 SECKEY_DestroyPublicKey(pk);
1218 return NULL;
1219 }
1220 return pk;
1221 }
1222
1223 /**
1224 * Setup key and digest for verification. Adjust sig if necessary.
1225 *
1226 * @param algo: key algorithm
1227 * @param evp_key: EVP PKEY public key to create.
1228 * @param digest_type: digest type to use
1229 * @param key: key to setup for.
1230 * @param keylen: length of key.
1231 * @param prefix: if returned, the ASN prefix for the hashblob.
1232 * @param prefixlen: length of the prefix.
1233 * @return false on failure.
1234 */
1235 static int
nss_setup_key_digest(int algo,SECKEYPublicKey ** pubkey,HASH_HashType * htype,unsigned char * key,size_t keylen,unsigned char ** prefix,size_t * prefixlen)1236 nss_setup_key_digest(int algo, SECKEYPublicKey** pubkey, HASH_HashType* htype,
1237 unsigned char* key, size_t keylen, unsigned char** prefix,
1238 size_t* prefixlen)
1239 {
1240 /* uses libNSS */
1241
1242 /* hash prefix for md5, RFC2537 */
1243 static unsigned char p_md5[] = {0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a,
1244 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10};
1245 /* hash prefix to prepend to hash output, from RFC3110 */
1246 static unsigned char p_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B,
1247 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14};
1248 /* from RFC5702 */
1249 static unsigned char p_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60,
1250 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20};
1251 static unsigned char p_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60,
1252 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40};
1253 /* from RFC6234 */
1254 /* for future RSASHA384 ..
1255 static unsigned char p_sha384[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60,
1256 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30};
1257 */
1258
1259 switch(algo) {
1260
1261 #if defined(USE_SHA1) || defined(USE_SHA2)
1262 #if defined(USE_DSA) && defined(USE_SHA1)
1263 case LDNS_DSA:
1264 case LDNS_DSA_NSEC3:
1265 *pubkey = nss_buf2dsa(key, keylen);
1266 if(!*pubkey) {
1267 log_err("verify: malloc failure in crypto");
1268 return 0;
1269 }
1270 *htype = HASH_AlgSHA1;
1271 /* no prefix for DSA verification */
1272 break;
1273 #endif
1274 #ifdef USE_SHA1
1275 case LDNS_RSASHA1:
1276 case LDNS_RSASHA1_NSEC3:
1277 #endif
1278 #ifdef USE_SHA2
1279 case LDNS_RSASHA256:
1280 #endif
1281 #ifdef USE_SHA2
1282 case LDNS_RSASHA512:
1283 #endif
1284 *pubkey = nss_buf2rsa(key, keylen);
1285 if(!*pubkey) {
1286 log_err("verify: malloc failure in crypto");
1287 return 0;
1288 }
1289 /* select SHA version */
1290 #ifdef USE_SHA2
1291 if(algo == LDNS_RSASHA256) {
1292 *htype = HASH_AlgSHA256;
1293 *prefix = p_sha256;
1294 *prefixlen = sizeof(p_sha256);
1295 } else
1296 #endif
1297 #ifdef USE_SHA2
1298 if(algo == LDNS_RSASHA512) {
1299 *htype = HASH_AlgSHA512;
1300 *prefix = p_sha512;
1301 *prefixlen = sizeof(p_sha512);
1302 } else
1303 #endif
1304 #ifdef USE_SHA1
1305 {
1306 *htype = HASH_AlgSHA1;
1307 *prefix = p_sha1;
1308 *prefixlen = sizeof(p_sha1);
1309 }
1310 #else
1311 {
1312 verbose(VERB_QUERY, "verify: no digest algo");
1313 return 0;
1314 }
1315 #endif
1316
1317 break;
1318 #endif /* SHA1 or SHA2 */
1319
1320 case LDNS_RSAMD5:
1321 *pubkey = nss_buf2rsa(key, keylen);
1322 if(!*pubkey) {
1323 log_err("verify: malloc failure in crypto");
1324 return 0;
1325 }
1326 *htype = HASH_AlgMD5;
1327 *prefix = p_md5;
1328 *prefixlen = sizeof(p_md5);
1329
1330 break;
1331 #ifdef USE_ECDSA
1332 case LDNS_ECDSAP256SHA256:
1333 *pubkey = nss_buf2ecdsa(key, keylen,
1334 LDNS_ECDSAP256SHA256);
1335 if(!*pubkey) {
1336 log_err("verify: malloc failure in crypto");
1337 return 0;
1338 }
1339 *htype = HASH_AlgSHA256;
1340 /* no prefix for DSA verification */
1341 break;
1342 case LDNS_ECDSAP384SHA384:
1343 *pubkey = nss_buf2ecdsa(key, keylen,
1344 LDNS_ECDSAP384SHA384);
1345 if(!*pubkey) {
1346 log_err("verify: malloc failure in crypto");
1347 return 0;
1348 }
1349 *htype = HASH_AlgSHA384;
1350 /* no prefix for DSA verification */
1351 break;
1352 #endif /* USE_ECDSA */
1353 case LDNS_ECC_GOST:
1354 default:
1355 verbose(VERB_QUERY, "verify: unknown algorithm %d",
1356 algo);
1357 return 0;
1358 }
1359 return 1;
1360 }
1361
1362 /**
1363 * Check a canonical sig+rrset and signature against a dnskey
1364 * @param buf: buffer with data to verify, the first rrsig part and the
1365 * canonicalized rrset.
1366 * @param algo: DNSKEY algorithm.
1367 * @param sigblock: signature rdata field from RRSIG
1368 * @param sigblock_len: length of sigblock data.
1369 * @param key: public key data from DNSKEY RR.
1370 * @param keylen: length of keydata.
1371 * @param reason: bogus reason in more detail.
1372 * @return secure if verification succeeded, bogus on crypto failure,
1373 * unchecked on format errors and alloc failures.
1374 */
1375 enum sec_status
verify_canonrrset(sldns_buffer * buf,int algo,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen,char ** reason)1376 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
1377 unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
1378 char** reason)
1379 {
1380 /* uses libNSS */
1381 /* large enough for the different hashes */
1382 unsigned char hash[HASH_LENGTH_MAX];
1383 unsigned char hash2[HASH_LENGTH_MAX*2];
1384 HASH_HashType htype = 0;
1385 SECKEYPublicKey* pubkey = NULL;
1386 SECItem secsig = {siBuffer, sigblock, sigblock_len};
1387 SECItem sechash = {siBuffer, hash, 0};
1388 SECStatus res;
1389 unsigned char* prefix = NULL; /* prefix for hash, RFC3110, RFC5702 */
1390 size_t prefixlen = 0;
1391 int err;
1392
1393 if(!nss_setup_key_digest(algo, &pubkey, &htype, key, keylen,
1394 &prefix, &prefixlen)) {
1395 verbose(VERB_QUERY, "verify: failed to setup key");
1396 *reason = "use of key for crypto failed";
1397 SECKEY_DestroyPublicKey(pubkey);
1398 return sec_status_bogus;
1399 }
1400
1401 #if defined(USE_DSA) && defined(USE_SHA1)
1402 /* need to convert DSA, ECDSA signatures? */
1403 if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3)) {
1404 if(sigblock_len == 1+2*SHA1_LENGTH) {
1405 secsig.data ++;
1406 secsig.len --;
1407 } else {
1408 SECItem* p = DSAU_DecodeDerSig(&secsig);
1409 if(!p) {
1410 verbose(VERB_QUERY, "verify: failed DER decode");
1411 *reason = "signature DER decode failed";
1412 SECKEY_DestroyPublicKey(pubkey);
1413 return sec_status_bogus;
1414 }
1415 if(SECITEM_CopyItem(pubkey->arena, &secsig, p)) {
1416 log_err("alloc failure in DER decode");
1417 SECKEY_DestroyPublicKey(pubkey);
1418 SECITEM_FreeItem(p, PR_TRUE);
1419 return sec_status_unchecked;
1420 }
1421 SECITEM_FreeItem(p, PR_TRUE);
1422 }
1423 }
1424 #endif /* USE_DSA */
1425
1426 /* do the signature cryptography work */
1427 /* hash the data */
1428 sechash.len = HASH_ResultLen(htype);
1429 if(sechash.len > sizeof(hash)) {
1430 verbose(VERB_QUERY, "verify: hash too large for buffer");
1431 SECKEY_DestroyPublicKey(pubkey);
1432 return sec_status_unchecked;
1433 }
1434 if(HASH_HashBuf(htype, hash, (unsigned char*)sldns_buffer_begin(buf),
1435 (unsigned int)sldns_buffer_limit(buf)) != SECSuccess) {
1436 verbose(VERB_QUERY, "verify: HASH_HashBuf failed");
1437 SECKEY_DestroyPublicKey(pubkey);
1438 return sec_status_unchecked;
1439 }
1440 if(prefix) {
1441 int hashlen = sechash.len;
1442 if(prefixlen+hashlen > sizeof(hash2)) {
1443 verbose(VERB_QUERY, "verify: hashprefix too large");
1444 SECKEY_DestroyPublicKey(pubkey);
1445 return sec_status_unchecked;
1446 }
1447 sechash.data = hash2;
1448 sechash.len = prefixlen+hashlen;
1449 memcpy(sechash.data, prefix, prefixlen);
1450 memmove(sechash.data+prefixlen, hash, hashlen);
1451 }
1452
1453 /* verify the signature */
1454 res = PK11_Verify(pubkey, &secsig, &sechash, NULL /*wincx*/);
1455 SECKEY_DestroyPublicKey(pubkey);
1456
1457 if(res == SECSuccess) {
1458 return sec_status_secure;
1459 }
1460 err = PORT_GetError();
1461 if(err != SEC_ERROR_BAD_SIGNATURE) {
1462 /* failed to verify */
1463 verbose(VERB_QUERY, "verify: PK11_Verify failed: %s",
1464 PORT_ErrorToString(err));
1465 /* if it is not supported, like ECC is removed, we get,
1466 * SEC_ERROR_NO_MODULE */
1467 if(err == SEC_ERROR_NO_MODULE)
1468 return sec_status_unchecked;
1469 /* but other errors are commonly returned
1470 * for a bad signature from NSS. Thus we return bogus,
1471 * not unchecked */
1472 *reason = "signature crypto failed";
1473 return sec_status_bogus;
1474 }
1475 verbose(VERB_QUERY, "verify: signature mismatch: %s",
1476 PORT_ErrorToString(err));
1477 *reason = "signature crypto failed";
1478 return sec_status_bogus;
1479 }
1480
1481 #elif defined(HAVE_NETTLE)
1482
1483 #include "sha.h"
1484 #include "bignum.h"
1485 #include "macros.h"
1486 #include "rsa.h"
1487 #include "dsa.h"
1488 #ifdef HAVE_NETTLE_DSA_COMPAT_H
1489 #include "dsa-compat.h"
1490 #endif
1491 #include "asn1.h"
1492 #ifdef USE_ECDSA
1493 #include "ecdsa.h"
1494 #include "ecc-curve.h"
1495 #endif
1496 #ifdef HAVE_NETTLE_EDDSA_H
1497 #include "eddsa.h"
1498 #endif
1499
1500 static int
_digest_nettle(int algo,uint8_t * buf,size_t len,unsigned char * res)1501 _digest_nettle(int algo, uint8_t* buf, size_t len,
1502 unsigned char* res)
1503 {
1504 switch(algo) {
1505 case SHA1_DIGEST_SIZE:
1506 {
1507 struct sha1_ctx ctx;
1508 sha1_init(&ctx);
1509 sha1_update(&ctx, len, buf);
1510 sha1_digest(&ctx, SHA1_DIGEST_SIZE, res);
1511 return 1;
1512 }
1513 case SHA256_DIGEST_SIZE:
1514 {
1515 struct sha256_ctx ctx;
1516 sha256_init(&ctx);
1517 sha256_update(&ctx, len, buf);
1518 sha256_digest(&ctx, SHA256_DIGEST_SIZE, res);
1519 return 1;
1520 }
1521 case SHA384_DIGEST_SIZE:
1522 {
1523 struct sha384_ctx ctx;
1524 sha384_init(&ctx);
1525 sha384_update(&ctx, len, buf);
1526 sha384_digest(&ctx, SHA384_DIGEST_SIZE, res);
1527 return 1;
1528 }
1529 case SHA512_DIGEST_SIZE:
1530 {
1531 struct sha512_ctx ctx;
1532 sha512_init(&ctx);
1533 sha512_update(&ctx, len, buf);
1534 sha512_digest(&ctx, SHA512_DIGEST_SIZE, res);
1535 return 1;
1536 }
1537 default:
1538 break;
1539 }
1540 return 0;
1541 }
1542
1543 /* return size of digest if supported, or 0 otherwise */
1544 size_t
nsec3_hash_algo_size_supported(int id)1545 nsec3_hash_algo_size_supported(int id)
1546 {
1547 switch(id) {
1548 case NSEC3_HASH_SHA1:
1549 return SHA1_DIGEST_SIZE;
1550 default:
1551 return 0;
1552 }
1553 }
1554
1555 /* perform nsec3 hash. return false on failure */
1556 int
secalgo_nsec3_hash(int algo,unsigned char * buf,size_t len,unsigned char * res)1557 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
1558 unsigned char* res)
1559 {
1560 switch(algo) {
1561 case NSEC3_HASH_SHA1:
1562 return _digest_nettle(SHA1_DIGEST_SIZE, (uint8_t*)buf, len,
1563 res);
1564 default:
1565 return 0;
1566 }
1567 }
1568
1569 void
secalgo_hash_sha256(unsigned char * buf,size_t len,unsigned char * res)1570 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
1571 {
1572 _digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
1573 }
1574
1575 /** secalgo hash structure */
1576 struct secalgo_hash {
1577 /** if it is 384 or 512 */
1578 int active;
1579 /** context for sha384 */
1580 struct sha384_ctx ctx384;
1581 /** context for sha512 */
1582 struct sha512_ctx ctx512;
1583 };
1584
secalgo_hash_create_sha384(void)1585 struct secalgo_hash* secalgo_hash_create_sha384(void)
1586 {
1587 struct secalgo_hash* h = calloc(1, sizeof(*h));
1588 if(!h)
1589 return NULL;
1590 h->active = 384;
1591 sha384_init(&h->ctx384);
1592 return h;
1593 }
1594
secalgo_hash_create_sha512(void)1595 struct secalgo_hash* secalgo_hash_create_sha512(void)
1596 {
1597 struct secalgo_hash* h = calloc(1, sizeof(*h));
1598 if(!h)
1599 return NULL;
1600 h->active = 512;
1601 sha512_init(&h->ctx512);
1602 return h;
1603 }
1604
secalgo_hash_update(struct secalgo_hash * hash,uint8_t * data,size_t len)1605 int secalgo_hash_update(struct secalgo_hash* hash, uint8_t* data, size_t len)
1606 {
1607 if(hash->active == 384) {
1608 sha384_update(&hash->ctx384, len, data);
1609 } else if(hash->active == 512) {
1610 sha512_update(&hash->ctx512, len, data);
1611 } else {
1612 return 0;
1613 }
1614 return 1;
1615 }
1616
secalgo_hash_final(struct secalgo_hash * hash,uint8_t * result,size_t maxlen,size_t * resultlen)1617 int secalgo_hash_final(struct secalgo_hash* hash, uint8_t* result,
1618 size_t maxlen, size_t* resultlen)
1619 {
1620 if(hash->active == 384) {
1621 if(SHA384_DIGEST_SIZE > maxlen) {
1622 *resultlen = 0;
1623 log_err("secalgo_hash_final: hash buffer too small");
1624 return 0;
1625 }
1626 *resultlen = SHA384_DIGEST_SIZE;
1627 sha384_digest(&hash->ctx384, SHA384_DIGEST_SIZE,
1628 (unsigned char*)result);
1629 } else if(hash->active == 512) {
1630 if(SHA512_DIGEST_SIZE > maxlen) {
1631 *resultlen = 0;
1632 log_err("secalgo_hash_final: hash buffer too small");
1633 return 0;
1634 }
1635 *resultlen = SHA512_DIGEST_SIZE;
1636 sha512_digest(&hash->ctx512, SHA512_DIGEST_SIZE,
1637 (unsigned char*)result);
1638 } else {
1639 *resultlen = 0;
1640 return 0;
1641 }
1642 return 1;
1643 }
1644
secalgo_hash_delete(struct secalgo_hash * hash)1645 void secalgo_hash_delete(struct secalgo_hash* hash)
1646 {
1647 if(!hash) return;
1648 free(hash);
1649 }
1650
1651 /**
1652 * Return size of DS digest according to its hash algorithm.
1653 * @param algo: DS digest algo.
1654 * @return size in bytes of digest, or 0 if not supported.
1655 */
1656 size_t
ds_digest_size_supported(int algo)1657 ds_digest_size_supported(int algo)
1658 {
1659 switch(algo) {
1660 case LDNS_SHA1:
1661 #ifdef USE_SHA1
1662 return SHA1_DIGEST_SIZE;
1663 #else
1664 if(fake_sha1) return 20;
1665 return 0;
1666 #endif
1667 #ifdef USE_SHA2
1668 case LDNS_SHA256:
1669 return SHA256_DIGEST_SIZE;
1670 #endif
1671 #ifdef USE_ECDSA
1672 case LDNS_SHA384:
1673 return SHA384_DIGEST_SIZE;
1674 #endif
1675 /* GOST not supported */
1676 case LDNS_HASH_GOST:
1677 default:
1678 break;
1679 }
1680 return 0;
1681 }
1682
1683 int
secalgo_ds_digest(int algo,unsigned char * buf,size_t len,unsigned char * res)1684 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
1685 unsigned char* res)
1686 {
1687 switch(algo) {
1688 #ifdef USE_SHA1
1689 case LDNS_SHA1:
1690 return _digest_nettle(SHA1_DIGEST_SIZE, buf, len, res);
1691 #endif
1692 #if defined(USE_SHA2)
1693 case LDNS_SHA256:
1694 return _digest_nettle(SHA256_DIGEST_SIZE, buf, len, res);
1695 #endif
1696 #ifdef USE_ECDSA
1697 case LDNS_SHA384:
1698 return _digest_nettle(SHA384_DIGEST_SIZE, buf, len, res);
1699
1700 #endif
1701 case LDNS_HASH_GOST:
1702 default:
1703 verbose(VERB_QUERY, "unknown DS digest algorithm %d",
1704 algo);
1705 break;
1706 }
1707 return 0;
1708 }
1709
1710 int
dnskey_algo_id_is_supported(int id)1711 dnskey_algo_id_is_supported(int id)
1712 {
1713 /* uses libnettle */
1714 switch(id) {
1715 case LDNS_DSA:
1716 case LDNS_DSA_NSEC3:
1717 #if defined(USE_DSA) && defined(USE_SHA1)
1718 return 1;
1719 #else
1720 if(fake_dsa || fake_sha1) return 1;
1721 return 0;
1722 #endif
1723 case LDNS_RSASHA1:
1724 case LDNS_RSASHA1_NSEC3:
1725 #ifdef USE_SHA1
1726 return 1;
1727 #else
1728 if(fake_sha1) return 1;
1729 return 0;
1730 #endif
1731 #ifdef USE_SHA2
1732 case LDNS_RSASHA256:
1733 case LDNS_RSASHA512:
1734 #endif
1735 #ifdef USE_ECDSA
1736 case LDNS_ECDSAP256SHA256:
1737 case LDNS_ECDSAP384SHA384:
1738 #endif
1739 return 1;
1740 #ifdef USE_ED25519
1741 case LDNS_ED25519:
1742 return 1;
1743 #endif
1744 case LDNS_RSAMD5: /* RFC 6725 deprecates RSAMD5 */
1745 case LDNS_ECC_GOST:
1746 default:
1747 return 0;
1748 }
1749 }
1750
1751 #if defined(USE_DSA) && defined(USE_SHA1)
1752 static char *
_verify_nettle_dsa(sldns_buffer * buf,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen)1753 _verify_nettle_dsa(sldns_buffer* buf, unsigned char* sigblock,
1754 unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
1755 {
1756 uint8_t digest[SHA1_DIGEST_SIZE];
1757 uint8_t key_t_value;
1758 int res = 0;
1759 size_t offset;
1760 struct dsa_public_key pubkey;
1761 struct dsa_signature signature;
1762 unsigned int expected_len;
1763
1764 /* Extract DSA signature from the record */
1765 nettle_dsa_signature_init(&signature);
1766 /* Signature length: 41 bytes - RFC 2536 sec. 3 */
1767 if(sigblock_len == 41) {
1768 if(key[0] != sigblock[0])
1769 return "invalid T value in DSA signature or pubkey";
1770 nettle_mpz_set_str_256_u(signature.r, 20, sigblock+1);
1771 nettle_mpz_set_str_256_u(signature.s, 20, sigblock+1+20);
1772 } else {
1773 /* DER encoded, decode the ASN1 notated R and S bignums */
1774 /* SEQUENCE { r INTEGER, s INTEGER } */
1775 struct asn1_der_iterator i, seq;
1776 if(asn1_der_iterator_first(&i, sigblock_len,
1777 (uint8_t*)sigblock) != ASN1_ITERATOR_CONSTRUCTED
1778 || i.type != ASN1_SEQUENCE)
1779 return "malformed DER encoded DSA signature";
1780 /* decode this element of i using the seq iterator */
1781 if(asn1_der_decode_constructed(&i, &seq) !=
1782 ASN1_ITERATOR_PRIMITIVE || seq.type != ASN1_INTEGER)
1783 return "malformed DER encoded DSA signature";
1784 if(!asn1_der_get_bignum(&seq, signature.r, 20*8))
1785 return "malformed DER encoded DSA signature";
1786 if(asn1_der_iterator_next(&seq) != ASN1_ITERATOR_PRIMITIVE
1787 || seq.type != ASN1_INTEGER)
1788 return "malformed DER encoded DSA signature";
1789 if(!asn1_der_get_bignum(&seq, signature.s, 20*8))
1790 return "malformed DER encoded DSA signature";
1791 if(asn1_der_iterator_next(&i) != ASN1_ITERATOR_END)
1792 return "malformed DER encoded DSA signature";
1793 }
1794
1795 /* Validate T values constraints - RFC 2536 sec. 2 & sec. 3 */
1796 key_t_value = key[0];
1797 if (key_t_value > 8) {
1798 return "invalid T value in DSA pubkey";
1799 }
1800
1801 /* Pubkey minimum length: 21 bytes - RFC 2536 sec. 2 */
1802 if (keylen < 21) {
1803 return "DSA pubkey too short";
1804 }
1805
1806 expected_len = 1 + /* T */
1807 20 + /* Q */
1808 (64 + key_t_value*8) + /* P */
1809 (64 + key_t_value*8) + /* G */
1810 (64 + key_t_value*8); /* Y */
1811 if (keylen != expected_len ) {
1812 return "invalid DSA pubkey length";
1813 }
1814
1815 /* Extract DSA pubkey from the record */
1816 nettle_dsa_public_key_init(&pubkey);
1817 offset = 1;
1818 nettle_mpz_set_str_256_u(pubkey.q, 20, key+offset);
1819 offset += 20;
1820 nettle_mpz_set_str_256_u(pubkey.p, (64 + key_t_value*8), key+offset);
1821 offset += (64 + key_t_value*8);
1822 nettle_mpz_set_str_256_u(pubkey.g, (64 + key_t_value*8), key+offset);
1823 offset += (64 + key_t_value*8);
1824 nettle_mpz_set_str_256_u(pubkey.y, (64 + key_t_value*8), key+offset);
1825
1826 /* Digest content of "buf" and verify its DSA signature in "sigblock"*/
1827 res = _digest_nettle(SHA1_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1828 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1829 res &= dsa_sha1_verify_digest(&pubkey, digest, &signature);
1830
1831 /* Clear and return */
1832 nettle_dsa_signature_clear(&signature);
1833 nettle_dsa_public_key_clear(&pubkey);
1834 if (!res)
1835 return "DSA signature verification failed";
1836 else
1837 return NULL;
1838 }
1839 #endif /* USE_DSA */
1840
1841 static char *
_verify_nettle_rsa(sldns_buffer * buf,unsigned int digest_size,char * sigblock,unsigned int sigblock_len,uint8_t * key,unsigned int keylen)1842 _verify_nettle_rsa(sldns_buffer* buf, unsigned int digest_size, char* sigblock,
1843 unsigned int sigblock_len, uint8_t* key, unsigned int keylen)
1844 {
1845 uint16_t exp_len = 0;
1846 size_t exp_offset = 0, mod_offset = 0;
1847 struct rsa_public_key pubkey;
1848 mpz_t signature;
1849 int res = 0;
1850
1851 /* RSA pubkey parsing as per RFC 3110 sec. 2 */
1852 if( keylen <= 1) {
1853 return "null RSA key";
1854 }
1855 if (key[0] != 0) {
1856 /* 1-byte length */
1857 exp_len = key[0];
1858 exp_offset = 1;
1859 } else {
1860 /* 1-byte NUL + 2-bytes exponent length */
1861 if (keylen < 3) {
1862 return "incorrect RSA key length";
1863 }
1864 exp_len = READ_UINT16(key+1);
1865 if (exp_len == 0)
1866 return "null RSA exponent length";
1867 exp_offset = 3;
1868 }
1869 /* Check that we are not over-running input length */
1870 if (keylen < exp_offset + exp_len + 1) {
1871 return "RSA key content shorter than expected";
1872 }
1873 mod_offset = exp_offset + exp_len;
1874 nettle_rsa_public_key_init(&pubkey);
1875 nettle_mpz_set_str_256_u(pubkey.e, exp_len, &key[exp_offset]);
1876 nettle_mpz_set_str_256_u(pubkey.n, keylen - mod_offset, &key[mod_offset]);
1877 pubkey.size = nettle_mpz_sizeinbase_256_u(pubkey.n);
1878
1879 /* Digest content of "buf" and verify its RSA signature in "sigblock"*/
1880 nettle_mpz_init_set_str_256_u(signature, sigblock_len, (uint8_t*)sigblock);
1881 switch (digest_size) {
1882 case SHA1_DIGEST_SIZE:
1883 {
1884 uint8_t digest[SHA1_DIGEST_SIZE];
1885 res = _digest_nettle(SHA1_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1886 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1887 res &= rsa_sha1_verify_digest(&pubkey, digest, signature);
1888 break;
1889 }
1890 case SHA256_DIGEST_SIZE:
1891 {
1892 uint8_t digest[SHA256_DIGEST_SIZE];
1893 res = _digest_nettle(SHA256_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1894 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1895 res &= rsa_sha256_verify_digest(&pubkey, digest, signature);
1896 break;
1897 }
1898 case SHA512_DIGEST_SIZE:
1899 {
1900 uint8_t digest[SHA512_DIGEST_SIZE];
1901 res = _digest_nettle(SHA512_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1902 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1903 res &= rsa_sha512_verify_digest(&pubkey, digest, signature);
1904 break;
1905 }
1906 default:
1907 break;
1908 }
1909
1910 /* Clear and return */
1911 nettle_rsa_public_key_clear(&pubkey);
1912 mpz_clear(signature);
1913 if (!res) {
1914 return "RSA signature verification failed";
1915 } else {
1916 return NULL;
1917 }
1918 }
1919
1920 #ifdef USE_ECDSA
1921 static char *
_verify_nettle_ecdsa(sldns_buffer * buf,unsigned int digest_size,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen)1922 _verify_nettle_ecdsa(sldns_buffer* buf, unsigned int digest_size, unsigned char* sigblock,
1923 unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
1924 {
1925 int res = 0;
1926 struct ecc_point pubkey;
1927 struct dsa_signature signature;
1928
1929 /* Always matched strength, as per RFC 6605 sec. 1 */
1930 if (sigblock_len != 2*digest_size || keylen != 2*digest_size) {
1931 return "wrong ECDSA signature length";
1932 }
1933
1934 /* Parse ECDSA signature as per RFC 6605 sec. 4 */
1935 nettle_dsa_signature_init(&signature);
1936 switch (digest_size) {
1937 case SHA256_DIGEST_SIZE:
1938 {
1939 uint8_t digest[SHA256_DIGEST_SIZE];
1940 mpz_t x, y;
1941 nettle_ecc_point_init(&pubkey, nettle_get_secp_256r1());
1942 nettle_mpz_init_set_str_256_u(x, SHA256_DIGEST_SIZE, key);
1943 nettle_mpz_init_set_str_256_u(y, SHA256_DIGEST_SIZE, key+SHA256_DIGEST_SIZE);
1944 nettle_mpz_set_str_256_u(signature.r, SHA256_DIGEST_SIZE, sigblock);
1945 nettle_mpz_set_str_256_u(signature.s, SHA256_DIGEST_SIZE, sigblock+SHA256_DIGEST_SIZE);
1946 res = _digest_nettle(SHA256_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1947 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1948 res &= nettle_ecc_point_set(&pubkey, x, y);
1949 res &= nettle_ecdsa_verify (&pubkey, SHA256_DIGEST_SIZE, digest, &signature);
1950 mpz_clear(x);
1951 mpz_clear(y);
1952 nettle_ecc_point_clear(&pubkey);
1953 break;
1954 }
1955 case SHA384_DIGEST_SIZE:
1956 {
1957 uint8_t digest[SHA384_DIGEST_SIZE];
1958 mpz_t x, y;
1959 nettle_ecc_point_init(&pubkey, nettle_get_secp_384r1());
1960 nettle_mpz_init_set_str_256_u(x, SHA384_DIGEST_SIZE, key);
1961 nettle_mpz_init_set_str_256_u(y, SHA384_DIGEST_SIZE, key+SHA384_DIGEST_SIZE);
1962 nettle_mpz_set_str_256_u(signature.r, SHA384_DIGEST_SIZE, sigblock);
1963 nettle_mpz_set_str_256_u(signature.s, SHA384_DIGEST_SIZE, sigblock+SHA384_DIGEST_SIZE);
1964 res = _digest_nettle(SHA384_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1965 (unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1966 res &= nettle_ecc_point_set(&pubkey, x, y);
1967 res &= nettle_ecdsa_verify (&pubkey, SHA384_DIGEST_SIZE, digest, &signature);
1968 mpz_clear(x);
1969 mpz_clear(y);
1970 nettle_ecc_point_clear(&pubkey);
1971 break;
1972 }
1973 default:
1974 return "unknown ECDSA algorithm";
1975 }
1976
1977 /* Clear and return */
1978 nettle_dsa_signature_clear(&signature);
1979 if (!res)
1980 return "ECDSA signature verification failed";
1981 else
1982 return NULL;
1983 }
1984 #endif
1985
1986 #ifdef USE_ED25519
1987 static char *
_verify_nettle_ed25519(sldns_buffer * buf,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen)1988 _verify_nettle_ed25519(sldns_buffer* buf, unsigned char* sigblock,
1989 unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
1990 {
1991 int res = 0;
1992
1993 if(sigblock_len != ED25519_SIGNATURE_SIZE) {
1994 return "wrong ED25519 signature length";
1995 }
1996 if(keylen != ED25519_KEY_SIZE) {
1997 return "wrong ED25519 key length";
1998 }
1999
2000 res = ed25519_sha512_verify((uint8_t*)key, sldns_buffer_limit(buf),
2001 sldns_buffer_begin(buf), (uint8_t*)sigblock);
2002
2003 if (!res)
2004 return "ED25519 signature verification failed";
2005 else
2006 return NULL;
2007 }
2008 #endif
2009
2010 /**
2011 * Check a canonical sig+rrset and signature against a dnskey
2012 * @param buf: buffer with data to verify, the first rrsig part and the
2013 * canonicalized rrset.
2014 * @param algo: DNSKEY algorithm.
2015 * @param sigblock: signature rdata field from RRSIG
2016 * @param sigblock_len: length of sigblock data.
2017 * @param key: public key data from DNSKEY RR.
2018 * @param keylen: length of keydata.
2019 * @param reason: bogus reason in more detail.
2020 * @return secure if verification succeeded, bogus on crypto failure,
2021 * unchecked on format errors and alloc failures.
2022 */
2023 enum sec_status
verify_canonrrset(sldns_buffer * buf,int algo,unsigned char * sigblock,unsigned int sigblock_len,unsigned char * key,unsigned int keylen,char ** reason)2024 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
2025 unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
2026 char** reason)
2027 {
2028 unsigned int digest_size = 0;
2029
2030 if (sigblock_len == 0 || keylen == 0) {
2031 *reason = "null signature";
2032 return sec_status_bogus;
2033 }
2034
2035 #ifndef USE_DSA
2036 if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&(fake_dsa||fake_sha1))
2037 return sec_status_secure;
2038 #endif
2039 #ifndef USE_SHA1
2040 if(fake_sha1 && (algo == LDNS_DSA || algo == LDNS_DSA_NSEC3 || algo == LDNS_RSASHA1 || algo == LDNS_RSASHA1_NSEC3))
2041 return sec_status_secure;
2042 #endif
2043
2044 switch(algo) {
2045 #if defined(USE_DSA) && defined(USE_SHA1)
2046 case LDNS_DSA:
2047 case LDNS_DSA_NSEC3:
2048 *reason = _verify_nettle_dsa(buf, sigblock, sigblock_len, key, keylen);
2049 if (*reason != NULL)
2050 return sec_status_bogus;
2051 else
2052 return sec_status_secure;
2053 #endif /* USE_DSA */
2054
2055 #ifdef USE_SHA1
2056 case LDNS_RSASHA1:
2057 case LDNS_RSASHA1_NSEC3:
2058 digest_size = (digest_size ? digest_size : SHA1_DIGEST_SIZE);
2059 #endif
2060 /* double fallthrough annotation to please gcc parser */
2061 ATTR_FALLTHROUGH
2062 /* fallthrough */
2063 #ifdef USE_SHA2
2064 /* fallthrough */
2065 case LDNS_RSASHA256:
2066 digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
2067 ATTR_FALLTHROUGH
2068 /* fallthrough */
2069 case LDNS_RSASHA512:
2070 digest_size = (digest_size ? digest_size : SHA512_DIGEST_SIZE);
2071
2072 #endif
2073 *reason = _verify_nettle_rsa(buf, digest_size, (char*)sigblock,
2074 sigblock_len, key, keylen);
2075 if (*reason != NULL)
2076 return sec_status_bogus;
2077 else
2078 return sec_status_secure;
2079
2080 #ifdef USE_ECDSA
2081 case LDNS_ECDSAP256SHA256:
2082 digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
2083 ATTR_FALLTHROUGH
2084 /* fallthrough */
2085 case LDNS_ECDSAP384SHA384:
2086 digest_size = (digest_size ? digest_size : SHA384_DIGEST_SIZE);
2087 *reason = _verify_nettle_ecdsa(buf, digest_size, sigblock,
2088 sigblock_len, key, keylen);
2089 if (*reason != NULL)
2090 return sec_status_bogus;
2091 else
2092 return sec_status_secure;
2093 #endif
2094 #ifdef USE_ED25519
2095 case LDNS_ED25519:
2096 *reason = _verify_nettle_ed25519(buf, sigblock, sigblock_len,
2097 key, keylen);
2098 if (*reason != NULL)
2099 return sec_status_bogus;
2100 else
2101 return sec_status_secure;
2102 #endif
2103 case LDNS_RSAMD5:
2104 case LDNS_ECC_GOST:
2105 default:
2106 *reason = "unable to verify signature, unknown algorithm";
2107 return sec_status_bogus;
2108 }
2109 }
2110
2111 #endif /* HAVE_SSL or HAVE_NSS or HAVE_NETTLE */
2112