xref: /freebsd/contrib/unbound/validator/val_secalgo.c (revision 63a938566d524836885917d95bd491aa4400b181)
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 /* OpenSSL implementation */
58 #ifdef HAVE_SSL
59 #ifdef HAVE_OPENSSL_ERR_H
60 #include <openssl/err.h>
61 #endif
62 
63 #ifdef HAVE_OPENSSL_RAND_H
64 #include <openssl/rand.h>
65 #endif
66 
67 #ifdef HAVE_OPENSSL_CONF_H
68 #include <openssl/conf.h>
69 #endif
70 
71 #ifdef HAVE_OPENSSL_ENGINE_H
72 #include <openssl/engine.h>
73 #endif
74 
75 /* return size of digest if supported, or 0 otherwise */
76 size_t
77 nsec3_hash_algo_size_supported(int id)
78 {
79 	switch(id) {
80 	case NSEC3_HASH_SHA1:
81 		return SHA_DIGEST_LENGTH;
82 	default:
83 		return 0;
84 	}
85 }
86 
87 /* perform nsec3 hash. return false on failure */
88 int
89 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
90         unsigned char* res)
91 {
92 	switch(algo) {
93 	case NSEC3_HASH_SHA1:
94 		(void)SHA1(buf, len, res);
95 		return 1;
96 	default:
97 		return 0;
98 	}
99 }
100 
101 void
102 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
103 {
104 	(void)SHA256(buf, len, res);
105 }
106 
107 /**
108  * Return size of DS digest according to its hash algorithm.
109  * @param algo: DS digest algo.
110  * @return size in bytes of digest, or 0 if not supported.
111  */
112 size_t
113 ds_digest_size_supported(int algo)
114 {
115 	switch(algo) {
116 #ifdef HAVE_EVP_SHA1
117 		case LDNS_SHA1:
118 			return SHA_DIGEST_LENGTH;
119 #endif
120 #ifdef HAVE_EVP_SHA256
121 		case LDNS_SHA256:
122 			return SHA256_DIGEST_LENGTH;
123 #endif
124 #ifdef USE_GOST
125 		case LDNS_HASH_GOST:
126 			/* we support GOST if it can be loaded */
127 			(void)sldns_key_EVP_load_gost_id();
128 			if(EVP_get_digestbyname("md_gost94"))
129 				return 32;
130 			else	return 0;
131 #endif
132 #ifdef USE_ECDSA
133 		case LDNS_SHA384:
134 			return SHA384_DIGEST_LENGTH;
135 #endif
136 		default: break;
137 	}
138 	return 0;
139 }
140 
141 #ifdef USE_GOST
142 /** Perform GOST hash */
143 static int
144 do_gost94(unsigned char* data, size_t len, unsigned char* dest)
145 {
146 	const EVP_MD* md = EVP_get_digestbyname("md_gost94");
147 	if(!md)
148 		return 0;
149 	return sldns_digest_evp(data, (unsigned int)len, dest, md);
150 }
151 #endif
152 
153 int
154 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
155 	unsigned char* res)
156 {
157 	switch(algo) {
158 #ifdef HAVE_EVP_SHA1
159 		case LDNS_SHA1:
160 			(void)SHA1(buf, len, res);
161 			return 1;
162 #endif
163 #ifdef HAVE_EVP_SHA256
164 		case LDNS_SHA256:
165 			(void)SHA256(buf, len, res);
166 			return 1;
167 #endif
168 #ifdef USE_GOST
169 		case LDNS_HASH_GOST:
170 			if(do_gost94(buf, len, res))
171 				return 1;
172 			break;
173 #endif
174 #ifdef USE_ECDSA
175 		case LDNS_SHA384:
176 			(void)SHA384(buf, len, res);
177 			return 1;
178 #endif
179 		default:
180 			verbose(VERB_QUERY, "unknown DS digest algorithm %d",
181 				algo);
182 			break;
183 	}
184 	return 0;
185 }
186 
187 /** return true if DNSKEY algorithm id is supported */
188 int
189 dnskey_algo_id_is_supported(int id)
190 {
191 	switch(id) {
192 	case LDNS_RSAMD5:
193 		/* RFC 6725 deprecates RSAMD5 */
194 		return 0;
195 #ifdef USE_DSA
196 	case LDNS_DSA:
197 	case LDNS_DSA_NSEC3:
198 #endif
199 	case LDNS_RSASHA1:
200 	case LDNS_RSASHA1_NSEC3:
201 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
202 	case LDNS_RSASHA256:
203 #endif
204 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
205 	case LDNS_RSASHA512:
206 #endif
207 #ifdef USE_ECDSA
208 	case LDNS_ECDSAP256SHA256:
209 	case LDNS_ECDSAP384SHA384:
210 #endif
211 		return 1;
212 #ifdef USE_GOST
213 	case LDNS_ECC_GOST:
214 		/* we support GOST if it can be loaded */
215 		return sldns_key_EVP_load_gost_id();
216 #endif
217 	default:
218 		return 0;
219 	}
220 }
221 
222 /**
223  * Output a libcrypto openssl error to the logfile.
224  * @param str: string to add to it.
225  * @param e: the error to output, error number from ERR_get_error().
226  */
227 static void
228 log_crypto_error(const char* str, unsigned long e)
229 {
230 	char buf[128];
231 	/* or use ERR_error_string if ERR_error_string_n is not avail TODO */
232 	ERR_error_string_n(e, buf, sizeof(buf));
233 	/* buf now contains */
234 	/* error:[error code]:[library name]:[function name]:[reason string] */
235 	log_err("%s crypto %s", str, buf);
236 }
237 
238 #ifdef USE_DSA
239 /**
240  * Setup DSA key digest in DER encoding ...
241  * @param sig: input is signature output alloced ptr (unless failure).
242  * 	caller must free alloced ptr if this routine returns true.
243  * @param len: input is initial siglen, output is output len.
244  * @return false on failure.
245  */
246 static int
247 setup_dsa_sig(unsigned char** sig, unsigned int* len)
248 {
249 	unsigned char* orig = *sig;
250 	unsigned int origlen = *len;
251 	int newlen;
252 	BIGNUM *R, *S;
253 	DSA_SIG *dsasig;
254 
255 	/* extract the R and S field from the sig buffer */
256 	if(origlen < 1 + 2*SHA_DIGEST_LENGTH)
257 		return 0;
258 	R = BN_new();
259 	if(!R) return 0;
260 	(void) BN_bin2bn(orig + 1, SHA_DIGEST_LENGTH, R);
261 	S = BN_new();
262 	if(!S) return 0;
263 	(void) BN_bin2bn(orig + 21, SHA_DIGEST_LENGTH, S);
264 	dsasig = DSA_SIG_new();
265 	if(!dsasig) return 0;
266 
267 	dsasig->r = R;
268 	dsasig->s = S;
269 	*sig = NULL;
270 	newlen = i2d_DSA_SIG(dsasig, sig);
271 	if(newlen < 0) {
272 		DSA_SIG_free(dsasig);
273 		free(*sig);
274 		return 0;
275 	}
276 	*len = (unsigned int)newlen;
277 	DSA_SIG_free(dsasig);
278 	return 1;
279 }
280 #endif /* USE_DSA */
281 
282 #ifdef USE_ECDSA
283 /**
284  * Setup the ECDSA signature in its encoding that the library wants.
285  * Converts from plain numbers to ASN formatted.
286  * @param sig: input is signature, output alloced ptr (unless failure).
287  * 	caller must free alloced ptr if this routine returns true.
288  * @param len: input is initial siglen, output is output len.
289  * @return false on failure.
290  */
291 static int
292 setup_ecdsa_sig(unsigned char** sig, unsigned int* len)
293 {
294         /* convert from two BIGNUMs in the rdata buffer, to ASN notation.
295 	 * ASN preable:  30440220 <R 32bytefor256> 0220 <S 32bytefor256>
296 	 * the '20' is the length of that field (=bnsize).
297 i	 * the '44' is the total remaining length.
298 	 * if negative, start with leading zero.
299 	 * if starts with 00s, remove them from the number.
300 	 */
301         uint8_t pre[] = {0x30, 0x44, 0x02, 0x20};
302         int pre_len = 4;
303         uint8_t mid[] = {0x02, 0x20};
304         int mid_len = 2;
305         int raw_sig_len, r_high, s_high, r_rem=0, s_rem=0;
306 	int bnsize = (int)((*len)/2);
307         unsigned char* d = *sig;
308 	uint8_t* p;
309 	/* if too short or not even length, fails */
310 	if(*len < 16 || bnsize*2 != (int)*len)
311 		return 0;
312 
313         /* strip leading zeroes from r (but not last one) */
314         while(r_rem < bnsize-1 && d[r_rem] == 0)
315                 r_rem++;
316         /* strip leading zeroes from s (but not last one) */
317         while(s_rem < bnsize-1 && d[bnsize+s_rem] == 0)
318                 s_rem++;
319 
320         r_high = ((d[0+r_rem]&0x80)?1:0);
321         s_high = ((d[bnsize+s_rem]&0x80)?1:0);
322         raw_sig_len = pre_len + r_high + bnsize - r_rem + mid_len +
323                 s_high + bnsize - s_rem;
324 	*sig = (unsigned char*)malloc((size_t)raw_sig_len);
325 	if(!*sig)
326 		return 0;
327 	p = (uint8_t*)*sig;
328 	p[0] = pre[0];
329 	p[1] = (uint8_t)(raw_sig_len-2);
330 	p[2] = pre[2];
331 	p[3] = (uint8_t)(bnsize + r_high - r_rem);
332 	p += 4;
333 	if(r_high) {
334 		*p = 0;
335 		p += 1;
336 	}
337 	memmove(p, d+r_rem, (size_t)bnsize-r_rem);
338 	p += bnsize-r_rem;
339 	memmove(p, mid, (size_t)mid_len-1);
340 	p += mid_len-1;
341 	*p = (uint8_t)(bnsize + s_high - s_rem);
342 	p += 1;
343         if(s_high) {
344 		*p = 0;
345 		p += 1;
346 	}
347 	memmove(p, d+bnsize+s_rem, (size_t)bnsize-s_rem);
348 	*len = (unsigned int)raw_sig_len;
349 	return 1;
350 }
351 #endif /* USE_ECDSA */
352 
353 #ifdef USE_ECDSA_EVP_WORKAROUND
354 static EVP_MD ecdsa_evp_256_md;
355 static EVP_MD ecdsa_evp_384_md;
356 void ecdsa_evp_workaround_init(void)
357 {
358 	/* openssl before 1.0.0 fixes RSA with the SHA256
359 	 * hash in EVP.  We create one for ecdsa_sha256 */
360 	ecdsa_evp_256_md = *EVP_sha256();
361 	ecdsa_evp_256_md.required_pkey_type[0] = EVP_PKEY_EC;
362 	ecdsa_evp_256_md.verify = (void*)ECDSA_verify;
363 
364 	ecdsa_evp_384_md = *EVP_sha384();
365 	ecdsa_evp_384_md.required_pkey_type[0] = EVP_PKEY_EC;
366 	ecdsa_evp_384_md.verify = (void*)ECDSA_verify;
367 }
368 #endif /* USE_ECDSA_EVP_WORKAROUND */
369 
370 /**
371  * Setup key and digest for verification. Adjust sig if necessary.
372  *
373  * @param algo: key algorithm
374  * @param evp_key: EVP PKEY public key to create.
375  * @param digest_type: digest type to use
376  * @param key: key to setup for.
377  * @param keylen: length of key.
378  * @return false on failure.
379  */
380 static int
381 setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
382 	unsigned char* key, size_t keylen)
383 {
384 #ifdef USE_DSA
385 	DSA* dsa;
386 #endif
387 	RSA* rsa;
388 
389 	switch(algo) {
390 #ifdef USE_DSA
391 		case LDNS_DSA:
392 		case LDNS_DSA_NSEC3:
393 			*evp_key = EVP_PKEY_new();
394 			if(!*evp_key) {
395 				log_err("verify: malloc failure in crypto");
396 				return 0;
397 			}
398 			dsa = sldns_key_buf2dsa_raw(key, keylen);
399 			if(!dsa) {
400 				verbose(VERB_QUERY, "verify: "
401 					"sldns_key_buf2dsa_raw failed");
402 				return 0;
403 			}
404 			if(EVP_PKEY_assign_DSA(*evp_key, dsa) == 0) {
405 				verbose(VERB_QUERY, "verify: "
406 					"EVP_PKEY_assign_DSA failed");
407 				return 0;
408 			}
409 			*digest_type = EVP_dss1();
410 
411 			break;
412 #endif /* USE_DSA */
413 		case LDNS_RSASHA1:
414 		case LDNS_RSASHA1_NSEC3:
415 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
416 		case LDNS_RSASHA256:
417 #endif
418 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
419 		case LDNS_RSASHA512:
420 #endif
421 			*evp_key = EVP_PKEY_new();
422 			if(!*evp_key) {
423 				log_err("verify: malloc failure in crypto");
424 				return 0;
425 			}
426 			rsa = sldns_key_buf2rsa_raw(key, keylen);
427 			if(!rsa) {
428 				verbose(VERB_QUERY, "verify: "
429 					"sldns_key_buf2rsa_raw SHA failed");
430 				return 0;
431 			}
432 			if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) {
433 				verbose(VERB_QUERY, "verify: "
434 					"EVP_PKEY_assign_RSA SHA failed");
435 				return 0;
436 			}
437 
438 			/* select SHA version */
439 #if defined(HAVE_EVP_SHA256) && defined(USE_SHA2)
440 			if(algo == LDNS_RSASHA256)
441 				*digest_type = EVP_sha256();
442 			else
443 #endif
444 #if defined(HAVE_EVP_SHA512) && defined(USE_SHA2)
445 				if(algo == LDNS_RSASHA512)
446 				*digest_type = EVP_sha512();
447 			else
448 #endif
449 				*digest_type = EVP_sha1();
450 
451 			break;
452 		case LDNS_RSAMD5:
453 			*evp_key = EVP_PKEY_new();
454 			if(!*evp_key) {
455 				log_err("verify: malloc failure in crypto");
456 				return 0;
457 			}
458 			rsa = sldns_key_buf2rsa_raw(key, keylen);
459 			if(!rsa) {
460 				verbose(VERB_QUERY, "verify: "
461 					"sldns_key_buf2rsa_raw MD5 failed");
462 				return 0;
463 			}
464 			if(EVP_PKEY_assign_RSA(*evp_key, rsa) == 0) {
465 				verbose(VERB_QUERY, "verify: "
466 					"EVP_PKEY_assign_RSA MD5 failed");
467 				return 0;
468 			}
469 			*digest_type = EVP_md5();
470 
471 			break;
472 #ifdef USE_GOST
473 		case LDNS_ECC_GOST:
474 			*evp_key = sldns_gost2pkey_raw(key, keylen);
475 			if(!*evp_key) {
476 				verbose(VERB_QUERY, "verify: "
477 					"sldns_gost2pkey_raw failed");
478 				return 0;
479 			}
480 			*digest_type = EVP_get_digestbyname("md_gost94");
481 			if(!*digest_type) {
482 				verbose(VERB_QUERY, "verify: "
483 					"EVP_getdigest md_gost94 failed");
484 				return 0;
485 			}
486 			break;
487 #endif
488 #ifdef USE_ECDSA
489 		case LDNS_ECDSAP256SHA256:
490 			*evp_key = sldns_ecdsa2pkey_raw(key, keylen,
491 				LDNS_ECDSAP256SHA256);
492 			if(!*evp_key) {
493 				verbose(VERB_QUERY, "verify: "
494 					"sldns_ecdsa2pkey_raw failed");
495 				return 0;
496 			}
497 #ifdef USE_ECDSA_EVP_WORKAROUND
498 			*digest_type = &ecdsa_evp_256_md;
499 #else
500 			*digest_type = EVP_sha256();
501 #endif
502 			break;
503 		case LDNS_ECDSAP384SHA384:
504 			*evp_key = sldns_ecdsa2pkey_raw(key, keylen,
505 				LDNS_ECDSAP384SHA384);
506 			if(!*evp_key) {
507 				verbose(VERB_QUERY, "verify: "
508 					"sldns_ecdsa2pkey_raw failed");
509 				return 0;
510 			}
511 #ifdef USE_ECDSA_EVP_WORKAROUND
512 			*digest_type = &ecdsa_evp_384_md;
513 #else
514 			*digest_type = EVP_sha384();
515 #endif
516 			break;
517 #endif /* USE_ECDSA */
518 		default:
519 			verbose(VERB_QUERY, "verify: unknown algorithm %d",
520 				algo);
521 			return 0;
522 	}
523 	return 1;
524 }
525 
526 /**
527  * Check a canonical sig+rrset and signature against a dnskey
528  * @param buf: buffer with data to verify, the first rrsig part and the
529  *	canonicalized rrset.
530  * @param algo: DNSKEY algorithm.
531  * @param sigblock: signature rdata field from RRSIG
532  * @param sigblock_len: length of sigblock data.
533  * @param key: public key data from DNSKEY RR.
534  * @param keylen: length of keydata.
535  * @param reason: bogus reason in more detail.
536  * @return secure if verification succeeded, bogus on crypto failure,
537  *	unchecked on format errors and alloc failures.
538  */
539 enum sec_status
540 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
541 	unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
542 	char** reason)
543 {
544 	const EVP_MD *digest_type;
545 	EVP_MD_CTX* ctx;
546 	int res, dofree = 0, docrypto_free = 0;
547 	EVP_PKEY *evp_key = NULL;
548 
549 	if(!setup_key_digest(algo, &evp_key, &digest_type, key, keylen)) {
550 		verbose(VERB_QUERY, "verify: failed to setup key");
551 		*reason = "use of key for crypto failed";
552 		EVP_PKEY_free(evp_key);
553 		return sec_status_bogus;
554 	}
555 #ifdef USE_DSA
556 	/* if it is a DSA signature in bind format, convert to DER format */
557 	if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&
558 		sigblock_len == 1+2*SHA_DIGEST_LENGTH) {
559 		if(!setup_dsa_sig(&sigblock, &sigblock_len)) {
560 			verbose(VERB_QUERY, "verify: failed to setup DSA sig");
561 			*reason = "use of key for DSA crypto failed";
562 			EVP_PKEY_free(evp_key);
563 			return sec_status_bogus;
564 		}
565 		docrypto_free = 1;
566 	}
567 #endif
568 #if defined(USE_ECDSA) && defined(USE_DSA)
569 	else
570 #endif
571 #ifdef USE_ECDSA
572 	if(algo == LDNS_ECDSAP256SHA256 || algo == LDNS_ECDSAP384SHA384) {
573 		/* EVP uses ASN prefix on sig, which is not in the wire data */
574 		if(!setup_ecdsa_sig(&sigblock, &sigblock_len)) {
575 			verbose(VERB_QUERY, "verify: failed to setup ECDSA sig");
576 			*reason = "use of signature for ECDSA crypto failed";
577 			EVP_PKEY_free(evp_key);
578 			return sec_status_bogus;
579 		}
580 		dofree = 1;
581 	}
582 #endif /* USE_ECDSA */
583 
584 	/* do the signature cryptography work */
585 #ifdef HAVE_EVP_MD_CTX_NEW
586 	ctx = EVP_MD_CTX_new();
587 #else
588 	ctx = (EVP_MD_CTX*)malloc(sizeof(*ctx));
589 	if(ctx) EVP_MD_CTX_init(ctx);
590 #endif
591 	if(!ctx) {
592 		log_err("EVP_MD_CTX_new: malloc failure");
593 		EVP_PKEY_free(evp_key);
594 		if(dofree) free(sigblock);
595 		else if(docrypto_free) OPENSSL_free(sigblock);
596 		return sec_status_unchecked;
597 	}
598 	if(EVP_VerifyInit(ctx, digest_type) == 0) {
599 		verbose(VERB_QUERY, "verify: EVP_VerifyInit failed");
600 		EVP_MD_CTX_destroy(ctx);
601 		EVP_PKEY_free(evp_key);
602 		if(dofree) free(sigblock);
603 		else if(docrypto_free) OPENSSL_free(sigblock);
604 		return sec_status_unchecked;
605 	}
606 	if(EVP_VerifyUpdate(ctx, (unsigned char*)sldns_buffer_begin(buf),
607 		(unsigned int)sldns_buffer_limit(buf)) == 0) {
608 		verbose(VERB_QUERY, "verify: EVP_VerifyUpdate failed");
609 		EVP_MD_CTX_destroy(ctx);
610 		EVP_PKEY_free(evp_key);
611 		if(dofree) free(sigblock);
612 		else if(docrypto_free) OPENSSL_free(sigblock);
613 		return sec_status_unchecked;
614 	}
615 
616 	res = EVP_VerifyFinal(ctx, sigblock, sigblock_len, evp_key);
617 #ifdef HAVE_EVP_MD_CTX_NEW
618 	EVP_MD_CTX_destroy(ctx);
619 #else
620 	EVP_MD_CTX_cleanup(ctx);
621 	free(ctx);
622 #endif
623 	EVP_PKEY_free(evp_key);
624 
625 	if(dofree) free(sigblock);
626 	else if(docrypto_free) OPENSSL_free(sigblock);
627 
628 	if(res == 1) {
629 		return sec_status_secure;
630 	} else if(res == 0) {
631 		verbose(VERB_QUERY, "verify: signature mismatch");
632 		*reason = "signature crypto failed";
633 		return sec_status_bogus;
634 	}
635 
636 	log_crypto_error("verify:", ERR_get_error());
637 	return sec_status_unchecked;
638 }
639 
640 /**************************************************/
641 #elif defined(HAVE_NSS)
642 /* libnss implementation */
643 /* nss3 */
644 #include "sechash.h"
645 #include "pk11pub.h"
646 #include "keyhi.h"
647 #include "secerr.h"
648 #include "cryptohi.h"
649 /* nspr4 */
650 #include "prerror.h"
651 
652 /* return size of digest if supported, or 0 otherwise */
653 size_t
654 nsec3_hash_algo_size_supported(int id)
655 {
656 	switch(id) {
657 	case NSEC3_HASH_SHA1:
658 		return SHA1_LENGTH;
659 	default:
660 		return 0;
661 	}
662 }
663 
664 /* perform nsec3 hash. return false on failure */
665 int
666 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
667         unsigned char* res)
668 {
669 	switch(algo) {
670 	case NSEC3_HASH_SHA1:
671 		(void)HASH_HashBuf(HASH_AlgSHA1, res, buf, (unsigned long)len);
672 		return 1;
673 	default:
674 		return 0;
675 	}
676 }
677 
678 void
679 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
680 {
681 	(void)HASH_HashBuf(HASH_AlgSHA256, res, buf, (unsigned long)len);
682 }
683 
684 size_t
685 ds_digest_size_supported(int algo)
686 {
687 	/* uses libNSS */
688 	switch(algo) {
689 		case LDNS_SHA1:
690 			return SHA1_LENGTH;
691 #ifdef USE_SHA2
692 		case LDNS_SHA256:
693 			return SHA256_LENGTH;
694 #endif
695 #ifdef USE_ECDSA
696 		case LDNS_SHA384:
697 			return SHA384_LENGTH;
698 #endif
699 		/* GOST not supported in NSS */
700 		case LDNS_HASH_GOST:
701 		default: break;
702 	}
703 	return 0;
704 }
705 
706 int
707 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
708 	unsigned char* res)
709 {
710 	/* uses libNSS */
711 	switch(algo) {
712 		case LDNS_SHA1:
713 			return HASH_HashBuf(HASH_AlgSHA1, res, buf, len)
714 				== SECSuccess;
715 #if defined(USE_SHA2)
716 		case LDNS_SHA256:
717 			return HASH_HashBuf(HASH_AlgSHA256, res, buf, len)
718 				== SECSuccess;
719 #endif
720 #ifdef USE_ECDSA
721 		case LDNS_SHA384:
722 			return HASH_HashBuf(HASH_AlgSHA384, res, buf, len)
723 				== SECSuccess;
724 #endif
725 		case LDNS_HASH_GOST:
726 		default:
727 			verbose(VERB_QUERY, "unknown DS digest algorithm %d",
728 				algo);
729 			break;
730 	}
731 	return 0;
732 }
733 
734 int
735 dnskey_algo_id_is_supported(int id)
736 {
737 	/* uses libNSS */
738 	switch(id) {
739 	case LDNS_RSAMD5:
740 		/* RFC 6725 deprecates RSAMD5 */
741 		return 0;
742 #ifdef USE_DSA
743 	case LDNS_DSA:
744 	case LDNS_DSA_NSEC3:
745 #endif
746 	case LDNS_RSASHA1:
747 	case LDNS_RSASHA1_NSEC3:
748 #ifdef USE_SHA2
749 	case LDNS_RSASHA256:
750 #endif
751 #ifdef USE_SHA2
752 	case LDNS_RSASHA512:
753 #endif
754 		return 1;
755 #ifdef USE_ECDSA
756 	case LDNS_ECDSAP256SHA256:
757 	case LDNS_ECDSAP384SHA384:
758 		return PK11_TokenExists(CKM_ECDSA);
759 #endif
760 	case LDNS_ECC_GOST:
761 	default:
762 		return 0;
763 	}
764 }
765 
766 /* return a new public key for NSS */
767 static SECKEYPublicKey* nss_key_create(KeyType ktype)
768 {
769 	SECKEYPublicKey* key;
770 	PLArenaPool* arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
771 	if(!arena) {
772 		log_err("out of memory, PORT_NewArena failed");
773 		return NULL;
774 	}
775 	key = PORT_ArenaZNew(arena, SECKEYPublicKey);
776 	if(!key) {
777 		log_err("out of memory, PORT_ArenaZNew failed");
778 		PORT_FreeArena(arena, PR_FALSE);
779 		return NULL;
780 	}
781 	key->arena = arena;
782 	key->keyType = ktype;
783 	key->pkcs11Slot = NULL;
784 	key->pkcs11ID = CK_INVALID_HANDLE;
785 	return key;
786 }
787 
788 static SECKEYPublicKey* nss_buf2ecdsa(unsigned char* key, size_t len, int algo)
789 {
790 	SECKEYPublicKey* pk;
791 	SECItem pub = {siBuffer, NULL, 0};
792 	SECItem params = {siBuffer, NULL, 0};
793 	static unsigned char param256[] = {
794 		/* OBJECTIDENTIFIER 1.2.840.10045.3.1.7 (P-256)
795 		 * {iso(1) member-body(2) us(840) ansi-x962(10045) curves(3) prime(1) prime256v1(7)} */
796 		0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07
797 	};
798 	static unsigned char param384[] = {
799 		/* OBJECTIDENTIFIER 1.3.132.0.34 (P-384)
800 		 * {iso(1) identified-organization(3) certicom(132) curve(0) ansip384r1(34)} */
801 		0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22
802 	};
803 	unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */
804 
805 	/* check length, which uncompressed must be 2 bignums */
806 	if(algo == LDNS_ECDSAP256SHA256) {
807 		if(len != 2*256/8) return NULL;
808 		/* ECCurve_X9_62_PRIME_256V1 */
809 	} else if(algo == LDNS_ECDSAP384SHA384) {
810 		if(len != 2*384/8) return NULL;
811 		/* ECCurve_X9_62_PRIME_384R1 */
812 	} else    return NULL;
813 
814 	buf[0] = 0x04; /* POINT_FORM_UNCOMPRESSED */
815 	memmove(buf+1, key, len);
816 	pub.data = buf;
817 	pub.len = len+1;
818 	if(algo == LDNS_ECDSAP256SHA256) {
819 		params.data = param256;
820 		params.len = sizeof(param256);
821 	} else {
822 		params.data = param384;
823 		params.len = sizeof(param384);
824 	}
825 
826 	pk = nss_key_create(ecKey);
827 	if(!pk)
828 		return NULL;
829 	pk->u.ec.size = (len/2)*8;
830 	if(SECITEM_CopyItem(pk->arena, &pk->u.ec.publicValue, &pub)) {
831 		SECKEY_DestroyPublicKey(pk);
832 		return NULL;
833 	}
834 	if(SECITEM_CopyItem(pk->arena, &pk->u.ec.DEREncodedParams, &params)) {
835 		SECKEY_DestroyPublicKey(pk);
836 		return NULL;
837 	}
838 
839 	return pk;
840 }
841 
842 static SECKEYPublicKey* nss_buf2dsa(unsigned char* key, size_t len)
843 {
844 	SECKEYPublicKey* pk;
845 	uint8_t T;
846 	uint16_t length;
847 	uint16_t offset;
848 	SECItem Q = {siBuffer, NULL, 0};
849 	SECItem P = {siBuffer, NULL, 0};
850 	SECItem G = {siBuffer, NULL, 0};
851 	SECItem Y = {siBuffer, NULL, 0};
852 
853 	if(len == 0)
854 		return NULL;
855 	T = (uint8_t)key[0];
856 	length = (64 + T * 8);
857 	offset = 1;
858 
859 	if (T > 8) {
860 		return NULL;
861 	}
862 	if(len < (size_t)1 + SHA1_LENGTH + 3*length)
863 		return NULL;
864 
865 	Q.data = key+offset;
866 	Q.len = SHA1_LENGTH;
867 	offset += SHA1_LENGTH;
868 
869 	P.data = key+offset;
870 	P.len = length;
871 	offset += length;
872 
873 	G.data = key+offset;
874 	G.len = length;
875 	offset += length;
876 
877 	Y.data = key+offset;
878 	Y.len = length;
879 	offset += length;
880 
881 	pk = nss_key_create(dsaKey);
882 	if(!pk)
883 		return NULL;
884 	if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.prime, &P)) {
885 		SECKEY_DestroyPublicKey(pk);
886 		return NULL;
887 	}
888 	if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.subPrime, &Q)) {
889 		SECKEY_DestroyPublicKey(pk);
890 		return NULL;
891 	}
892 	if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.params.base, &G)) {
893 		SECKEY_DestroyPublicKey(pk);
894 		return NULL;
895 	}
896 	if(SECITEM_CopyItem(pk->arena, &pk->u.dsa.publicValue, &Y)) {
897 		SECKEY_DestroyPublicKey(pk);
898 		return NULL;
899 	}
900 	return pk;
901 }
902 
903 static SECKEYPublicKey* nss_buf2rsa(unsigned char* key, size_t len)
904 {
905 	SECKEYPublicKey* pk;
906 	uint16_t exp;
907 	uint16_t offset;
908 	uint16_t int16;
909 	SECItem modulus = {siBuffer, NULL, 0};
910 	SECItem exponent = {siBuffer, NULL, 0};
911 	if(len == 0)
912 		return NULL;
913 	if(key[0] == 0) {
914 		if(len < 3)
915 			return NULL;
916 		/* the exponent is too large so it's places further */
917 		memmove(&int16, key+1, 2);
918 		exp = ntohs(int16);
919 		offset = 3;
920 	} else {
921 		exp = key[0];
922 		offset = 1;
923 	}
924 
925 	/* key length at least one */
926 	if(len < (size_t)offset + exp + 1)
927 		return NULL;
928 
929 	exponent.data = key+offset;
930 	exponent.len = exp;
931 	offset += exp;
932 	modulus.data = key+offset;
933 	modulus.len = (len - offset);
934 
935 	pk = nss_key_create(rsaKey);
936 	if(!pk)
937 		return NULL;
938 	if(SECITEM_CopyItem(pk->arena, &pk->u.rsa.modulus, &modulus)) {
939 		SECKEY_DestroyPublicKey(pk);
940 		return NULL;
941 	}
942 	if(SECITEM_CopyItem(pk->arena, &pk->u.rsa.publicExponent, &exponent)) {
943 		SECKEY_DestroyPublicKey(pk);
944 		return NULL;
945 	}
946 	return pk;
947 }
948 
949 /**
950  * Setup key and digest for verification. Adjust sig if necessary.
951  *
952  * @param algo: key algorithm
953  * @param evp_key: EVP PKEY public key to create.
954  * @param digest_type: digest type to use
955  * @param key: key to setup for.
956  * @param keylen: length of key.
957  * @param prefix: if returned, the ASN prefix for the hashblob.
958  * @param prefixlen: length of the prefix.
959  * @return false on failure.
960  */
961 static int
962 nss_setup_key_digest(int algo, SECKEYPublicKey** pubkey, HASH_HashType* htype,
963 	unsigned char* key, size_t keylen, unsigned char** prefix,
964 	size_t* prefixlen)
965 {
966 	/* uses libNSS */
967 
968 	/* hash prefix for md5, RFC2537 */
969 	static unsigned char p_md5[] = {0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a,
970 	0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10};
971 	/* hash prefix to prepend to hash output, from RFC3110 */
972 	static unsigned char p_sha1[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B,
973 		0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04, 0x14};
974 	/* from RFC5702 */
975 	static unsigned char p_sha256[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60,
976 	0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20};
977 	static unsigned char p_sha512[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60,
978 	0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40};
979 	/* from RFC6234 */
980 	/* for future RSASHA384 ..
981 	static unsigned char p_sha384[] = {0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60,
982 	0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0x04, 0x30};
983 	*/
984 
985 	switch(algo) {
986 #ifdef USE_DSA
987 		case LDNS_DSA:
988 		case LDNS_DSA_NSEC3:
989 			*pubkey = nss_buf2dsa(key, keylen);
990 			if(!*pubkey) {
991 				log_err("verify: malloc failure in crypto");
992 				return 0;
993 			}
994 			*htype = HASH_AlgSHA1;
995 			/* no prefix for DSA verification */
996 			break;
997 #endif
998 		case LDNS_RSASHA1:
999 		case LDNS_RSASHA1_NSEC3:
1000 #ifdef USE_SHA2
1001 		case LDNS_RSASHA256:
1002 #endif
1003 #ifdef USE_SHA2
1004 		case LDNS_RSASHA512:
1005 #endif
1006 			*pubkey = nss_buf2rsa(key, keylen);
1007 			if(!*pubkey) {
1008 				log_err("verify: malloc failure in crypto");
1009 				return 0;
1010 			}
1011 			/* select SHA version */
1012 #ifdef USE_SHA2
1013 			if(algo == LDNS_RSASHA256) {
1014 				*htype = HASH_AlgSHA256;
1015 				*prefix = p_sha256;
1016 				*prefixlen = sizeof(p_sha256);
1017 			} else
1018 #endif
1019 #ifdef USE_SHA2
1020 				if(algo == LDNS_RSASHA512) {
1021 				*htype = HASH_AlgSHA512;
1022 				*prefix = p_sha512;
1023 				*prefixlen = sizeof(p_sha512);
1024 			} else
1025 #endif
1026 			{
1027 				*htype = HASH_AlgSHA1;
1028 				*prefix = p_sha1;
1029 				*prefixlen = sizeof(p_sha1);
1030 			}
1031 
1032 			break;
1033 		case LDNS_RSAMD5:
1034 			*pubkey = nss_buf2rsa(key, keylen);
1035 			if(!*pubkey) {
1036 				log_err("verify: malloc failure in crypto");
1037 				return 0;
1038 			}
1039 			*htype = HASH_AlgMD5;
1040 			*prefix = p_md5;
1041 			*prefixlen = sizeof(p_md5);
1042 
1043 			break;
1044 #ifdef USE_ECDSA
1045 		case LDNS_ECDSAP256SHA256:
1046 			*pubkey = nss_buf2ecdsa(key, keylen,
1047 				LDNS_ECDSAP256SHA256);
1048 			if(!*pubkey) {
1049 				log_err("verify: malloc failure in crypto");
1050 				return 0;
1051 			}
1052 			*htype = HASH_AlgSHA256;
1053 			/* no prefix for DSA verification */
1054 			break;
1055 		case LDNS_ECDSAP384SHA384:
1056 			*pubkey = nss_buf2ecdsa(key, keylen,
1057 				LDNS_ECDSAP384SHA384);
1058 			if(!*pubkey) {
1059 				log_err("verify: malloc failure in crypto");
1060 				return 0;
1061 			}
1062 			*htype = HASH_AlgSHA384;
1063 			/* no prefix for DSA verification */
1064 			break;
1065 #endif /* USE_ECDSA */
1066 		case LDNS_ECC_GOST:
1067 		default:
1068 			verbose(VERB_QUERY, "verify: unknown algorithm %d",
1069 				algo);
1070 			return 0;
1071 	}
1072 	return 1;
1073 }
1074 
1075 /**
1076  * Check a canonical sig+rrset and signature against a dnskey
1077  * @param buf: buffer with data to verify, the first rrsig part and the
1078  *	canonicalized rrset.
1079  * @param algo: DNSKEY algorithm.
1080  * @param sigblock: signature rdata field from RRSIG
1081  * @param sigblock_len: length of sigblock data.
1082  * @param key: public key data from DNSKEY RR.
1083  * @param keylen: length of keydata.
1084  * @param reason: bogus reason in more detail.
1085  * @return secure if verification succeeded, bogus on crypto failure,
1086  *	unchecked on format errors and alloc failures.
1087  */
1088 enum sec_status
1089 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
1090 	unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
1091 	char** reason)
1092 {
1093 	/* uses libNSS */
1094 	/* large enough for the different hashes */
1095 	unsigned char hash[HASH_LENGTH_MAX];
1096 	unsigned char hash2[HASH_LENGTH_MAX*2];
1097 	HASH_HashType htype = 0;
1098 	SECKEYPublicKey* pubkey = NULL;
1099 	SECItem secsig = {siBuffer, sigblock, sigblock_len};
1100 	SECItem sechash = {siBuffer, hash, 0};
1101 	SECStatus res;
1102 	unsigned char* prefix = NULL; /* prefix for hash, RFC3110, RFC5702 */
1103 	size_t prefixlen = 0;
1104 	int err;
1105 
1106 	if(!nss_setup_key_digest(algo, &pubkey, &htype, key, keylen,
1107 		&prefix, &prefixlen)) {
1108 		verbose(VERB_QUERY, "verify: failed to setup key");
1109 		*reason = "use of key for crypto failed";
1110 		SECKEY_DestroyPublicKey(pubkey);
1111 		return sec_status_bogus;
1112 	}
1113 
1114 #ifdef USE_DSA
1115 	/* need to convert DSA, ECDSA signatures? */
1116 	if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3)) {
1117 		if(sigblock_len == 1+2*SHA1_LENGTH) {
1118 			secsig.data ++;
1119 			secsig.len --;
1120 		} else {
1121 			SECItem* p = DSAU_DecodeDerSig(&secsig);
1122 			if(!p) {
1123 				verbose(VERB_QUERY, "verify: failed DER decode");
1124 				*reason = "signature DER decode failed";
1125 				SECKEY_DestroyPublicKey(pubkey);
1126 				return sec_status_bogus;
1127 			}
1128 			if(SECITEM_CopyItem(pubkey->arena, &secsig, p)) {
1129 				log_err("alloc failure in DER decode");
1130 				SECKEY_DestroyPublicKey(pubkey);
1131 				SECITEM_FreeItem(p, PR_TRUE);
1132 				return sec_status_unchecked;
1133 			}
1134 			SECITEM_FreeItem(p, PR_TRUE);
1135 		}
1136 	}
1137 #endif /* USE_DSA */
1138 
1139 	/* do the signature cryptography work */
1140 	/* hash the data */
1141 	sechash.len = HASH_ResultLen(htype);
1142 	if(sechash.len > sizeof(hash)) {
1143 		verbose(VERB_QUERY, "verify: hash too large for buffer");
1144 		SECKEY_DestroyPublicKey(pubkey);
1145 		return sec_status_unchecked;
1146 	}
1147 	if(HASH_HashBuf(htype, hash, (unsigned char*)sldns_buffer_begin(buf),
1148 		(unsigned int)sldns_buffer_limit(buf)) != SECSuccess) {
1149 		verbose(VERB_QUERY, "verify: HASH_HashBuf failed");
1150 		SECKEY_DestroyPublicKey(pubkey);
1151 		return sec_status_unchecked;
1152 	}
1153 	if(prefix) {
1154 		int hashlen = sechash.len;
1155 		if(prefixlen+hashlen > sizeof(hash2)) {
1156 			verbose(VERB_QUERY, "verify: hashprefix too large");
1157 			SECKEY_DestroyPublicKey(pubkey);
1158 			return sec_status_unchecked;
1159 		}
1160 		sechash.data = hash2;
1161 		sechash.len = prefixlen+hashlen;
1162 		memcpy(sechash.data, prefix, prefixlen);
1163 		memmove(sechash.data+prefixlen, hash, hashlen);
1164 	}
1165 
1166 	/* verify the signature */
1167 	res = PK11_Verify(pubkey, &secsig, &sechash, NULL /*wincx*/);
1168 	SECKEY_DestroyPublicKey(pubkey);
1169 
1170 	if(res == SECSuccess) {
1171 		return sec_status_secure;
1172 	}
1173 	err = PORT_GetError();
1174 	if(err != SEC_ERROR_BAD_SIGNATURE) {
1175 		/* failed to verify */
1176 		verbose(VERB_QUERY, "verify: PK11_Verify failed: %s",
1177 			PORT_ErrorToString(err));
1178 		/* if it is not supported, like ECC is removed, we get,
1179 		 * SEC_ERROR_NO_MODULE */
1180 		if(err == SEC_ERROR_NO_MODULE)
1181 			return sec_status_unchecked;
1182 		/* but other errors are commonly returned
1183 		 * for a bad signature from NSS.  Thus we return bogus,
1184 		 * not unchecked */
1185 		*reason = "signature crypto failed";
1186 		return sec_status_bogus;
1187 	}
1188 	verbose(VERB_QUERY, "verify: signature mismatch: %s",
1189 		PORT_ErrorToString(err));
1190 	*reason = "signature crypto failed";
1191 	return sec_status_bogus;
1192 }
1193 
1194 #elif defined(HAVE_NETTLE)
1195 
1196 #include "sha.h"
1197 #include "bignum.h"
1198 #include "macros.h"
1199 #include "rsa.h"
1200 #include "dsa.h"
1201 #ifdef HAVE_NETTLE_DSA_COMPAT_H
1202 #include "dsa-compat.h"
1203 #endif
1204 #include "asn1.h"
1205 #ifdef USE_ECDSA
1206 #include "ecdsa.h"
1207 #include "ecc-curve.h"
1208 #endif
1209 
1210 static int
1211 _digest_nettle(int algo, uint8_t* buf, size_t len,
1212 	unsigned char* res)
1213 {
1214 	switch(algo) {
1215 		case SHA1_DIGEST_SIZE:
1216 		{
1217 			struct sha1_ctx ctx;
1218 			sha1_init(&ctx);
1219 			sha1_update(&ctx, len, buf);
1220 			sha1_digest(&ctx, SHA1_DIGEST_SIZE, res);
1221 			return 1;
1222 		}
1223 		case SHA256_DIGEST_SIZE:
1224 		{
1225 			struct sha256_ctx ctx;
1226 			sha256_init(&ctx);
1227 			sha256_update(&ctx, len, buf);
1228 			sha256_digest(&ctx, SHA256_DIGEST_SIZE, res);
1229 			return 1;
1230 		}
1231 		case SHA384_DIGEST_SIZE:
1232 		{
1233 			struct sha384_ctx ctx;
1234 			sha384_init(&ctx);
1235 			sha384_update(&ctx, len, buf);
1236 			sha384_digest(&ctx, SHA384_DIGEST_SIZE, res);
1237 			return 1;
1238 		}
1239 		case SHA512_DIGEST_SIZE:
1240 		{
1241 			struct sha512_ctx ctx;
1242 			sha512_init(&ctx);
1243 			sha512_update(&ctx, len, buf);
1244 			sha512_digest(&ctx, SHA512_DIGEST_SIZE, res);
1245 			return 1;
1246 		}
1247 		default:
1248 			break;
1249 	}
1250 	return 0;
1251 }
1252 
1253 /* return size of digest if supported, or 0 otherwise */
1254 size_t
1255 nsec3_hash_algo_size_supported(int id)
1256 {
1257 	switch(id) {
1258 	case NSEC3_HASH_SHA1:
1259 		return SHA1_DIGEST_SIZE;
1260 	default:
1261 		return 0;
1262 	}
1263 }
1264 
1265 /* perform nsec3 hash. return false on failure */
1266 int
1267 secalgo_nsec3_hash(int algo, unsigned char* buf, size_t len,
1268         unsigned char* res)
1269 {
1270 	switch(algo) {
1271 	case NSEC3_HASH_SHA1:
1272 		return _digest_nettle(SHA1_DIGEST_SIZE, (uint8_t*)buf, len,
1273 			res);
1274 	default:
1275 		return 0;
1276 	}
1277 }
1278 
1279 void
1280 secalgo_hash_sha256(unsigned char* buf, size_t len, unsigned char* res)
1281 {
1282 	_digest_nettle(SHA256_DIGEST_SIZE, (uint8_t*)buf, len, res);
1283 }
1284 
1285 /**
1286  * Return size of DS digest according to its hash algorithm.
1287  * @param algo: DS digest algo.
1288  * @return size in bytes of digest, or 0 if not supported.
1289  */
1290 size_t
1291 ds_digest_size_supported(int algo)
1292 {
1293 	switch(algo) {
1294 		case LDNS_SHA1:
1295 			return SHA1_DIGEST_SIZE;
1296 #ifdef USE_SHA2
1297 		case LDNS_SHA256:
1298 			return SHA256_DIGEST_SIZE;
1299 #endif
1300 #ifdef USE_ECDSA
1301 		case LDNS_SHA384:
1302 			return SHA384_DIGEST_SIZE;
1303 #endif
1304 		/* GOST not supported */
1305 		case LDNS_HASH_GOST:
1306 		default:
1307 			break;
1308 	}
1309 	return 0;
1310 }
1311 
1312 int
1313 secalgo_ds_digest(int algo, unsigned char* buf, size_t len,
1314 	unsigned char* res)
1315 {
1316 	switch(algo) {
1317 		case LDNS_SHA1:
1318 			return _digest_nettle(SHA1_DIGEST_SIZE, buf, len, res);
1319 #if defined(USE_SHA2)
1320 		case LDNS_SHA256:
1321 			return _digest_nettle(SHA256_DIGEST_SIZE, buf, len, res);
1322 #endif
1323 #ifdef USE_ECDSA
1324 		case LDNS_SHA384:
1325 			return _digest_nettle(SHA384_DIGEST_SIZE, buf, len, res);
1326 
1327 #endif
1328 		case LDNS_HASH_GOST:
1329 		default:
1330 			verbose(VERB_QUERY, "unknown DS digest algorithm %d",
1331 				algo);
1332 			break;
1333 	}
1334 	return 0;
1335 }
1336 
1337 int
1338 dnskey_algo_id_is_supported(int id)
1339 {
1340 	/* uses libnettle */
1341 	switch(id) {
1342 #ifdef USE_DSA
1343 	case LDNS_DSA:
1344 	case LDNS_DSA_NSEC3:
1345 #endif
1346 	case LDNS_RSASHA1:
1347 	case LDNS_RSASHA1_NSEC3:
1348 #ifdef USE_SHA2
1349 	case LDNS_RSASHA256:
1350 	case LDNS_RSASHA512:
1351 #endif
1352 #ifdef USE_ECDSA
1353 	case LDNS_ECDSAP256SHA256:
1354 	case LDNS_ECDSAP384SHA384:
1355 #endif
1356 		return 1;
1357 	case LDNS_RSAMD5: /* RFC 6725 deprecates RSAMD5 */
1358 	case LDNS_ECC_GOST:
1359 	default:
1360 		return 0;
1361 	}
1362 }
1363 
1364 #ifdef USE_DSA
1365 static char *
1366 _verify_nettle_dsa(sldns_buffer* buf, unsigned char* sigblock,
1367 	unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
1368 {
1369 	uint8_t digest[SHA1_DIGEST_SIZE];
1370 	uint8_t key_t;
1371 	int res = 0;
1372 	size_t offset;
1373 	struct dsa_public_key pubkey;
1374 	struct dsa_signature signature;
1375 	unsigned int expected_len;
1376 
1377 	/* Extract DSA signature from the record */
1378 	nettle_dsa_signature_init(&signature);
1379 	/* Signature length: 41 bytes - RFC 2536 sec. 3 */
1380 	if(sigblock_len == 41) {
1381 		if(key[0] != sigblock[0])
1382 			return "invalid T value in DSA signature or pubkey";
1383 		nettle_mpz_set_str_256_u(signature.r, 20, sigblock+1);
1384 		nettle_mpz_set_str_256_u(signature.s, 20, sigblock+1+20);
1385 	} else {
1386 		/* DER encoded, decode the ASN1 notated R and S bignums */
1387 		/* SEQUENCE { r INTEGER, s INTEGER } */
1388 		struct asn1_der_iterator i, seq;
1389 		if(asn1_der_iterator_first(&i, sigblock_len,
1390 			(uint8_t*)sigblock) != ASN1_ITERATOR_CONSTRUCTED
1391 			|| i.type != ASN1_SEQUENCE)
1392 			return "malformed DER encoded DSA signature";
1393 		/* decode this element of i using the seq iterator */
1394 		if(asn1_der_decode_constructed(&i, &seq) !=
1395 			ASN1_ITERATOR_PRIMITIVE || seq.type != ASN1_INTEGER)
1396 			return "malformed DER encoded DSA signature";
1397 		if(!asn1_der_get_bignum(&seq, signature.r, 20*8))
1398 			return "malformed DER encoded DSA signature";
1399 		if(asn1_der_iterator_next(&seq) != ASN1_ITERATOR_PRIMITIVE
1400 			|| seq.type != ASN1_INTEGER)
1401 			return "malformed DER encoded DSA signature";
1402 		if(!asn1_der_get_bignum(&seq, signature.s, 20*8))
1403 			return "malformed DER encoded DSA signature";
1404 		if(asn1_der_iterator_next(&i) != ASN1_ITERATOR_END)
1405 			return "malformed DER encoded DSA signature";
1406 	}
1407 
1408 	/* Validate T values constraints - RFC 2536 sec. 2 & sec. 3 */
1409 	key_t = key[0];
1410 	if (key_t > 8) {
1411 		return "invalid T value in DSA pubkey";
1412 	}
1413 
1414 	/* Pubkey minimum length: 21 bytes - RFC 2536 sec. 2 */
1415 	if (keylen < 21) {
1416 		return "DSA pubkey too short";
1417 	}
1418 
1419 	expected_len =   1 +		/* T */
1420 		        20 +		/* Q */
1421 		       (64 + key_t*8) +	/* P */
1422 		       (64 + key_t*8) +	/* G */
1423 		       (64 + key_t*8);	/* Y */
1424 	if (keylen != expected_len ) {
1425 		return "invalid DSA pubkey length";
1426 	}
1427 
1428 	/* Extract DSA pubkey from the record */
1429 	nettle_dsa_public_key_init(&pubkey);
1430 	offset = 1;
1431 	nettle_mpz_set_str_256_u(pubkey.q, 20, key+offset);
1432 	offset += 20;
1433 	nettle_mpz_set_str_256_u(pubkey.p, (64 + key_t*8), key+offset);
1434 	offset += (64 + key_t*8);
1435 	nettle_mpz_set_str_256_u(pubkey.g, (64 + key_t*8), key+offset);
1436 	offset += (64 + key_t*8);
1437 	nettle_mpz_set_str_256_u(pubkey.y, (64 + key_t*8), key+offset);
1438 
1439 	/* Digest content of "buf" and verify its DSA signature in "sigblock"*/
1440 	res = _digest_nettle(SHA1_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1441 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1442 	res &= dsa_sha1_verify_digest(&pubkey, digest, &signature);
1443 
1444 	/* Clear and return */
1445 	nettle_dsa_signature_clear(&signature);
1446 	nettle_dsa_public_key_clear(&pubkey);
1447 	if (!res)
1448 		return "DSA signature verification failed";
1449 	else
1450 		return NULL;
1451 }
1452 #endif /* USE_DSA */
1453 
1454 static char *
1455 _verify_nettle_rsa(sldns_buffer* buf, unsigned int digest_size, char* sigblock,
1456 	unsigned int sigblock_len, uint8_t* key, unsigned int keylen)
1457 {
1458 	uint16_t exp_len = 0;
1459 	size_t exp_offset = 0, mod_offset = 0;
1460 	struct rsa_public_key pubkey;
1461 	mpz_t signature;
1462 	int res = 0;
1463 
1464 	/* RSA pubkey parsing as per RFC 3110 sec. 2 */
1465 	if( keylen <= 1) {
1466 		return "null RSA key";
1467 	}
1468 	if (key[0] != 0) {
1469 		/* 1-byte length */
1470 		exp_len = key[0];
1471 		exp_offset = 1;
1472 	} else {
1473 		/* 1-byte NUL + 2-bytes exponent length */
1474 		if (keylen < 3) {
1475 			return "incorrect RSA key length";
1476 		}
1477 		exp_len = READ_UINT16(key+1);
1478 		if (exp_len == 0)
1479 			return "null RSA exponent length";
1480 		exp_offset = 3;
1481 	}
1482 	/* Check that we are not over-running input length */
1483 	if (keylen < exp_offset + exp_len + 1) {
1484 		return "RSA key content shorter than expected";
1485 	}
1486 	mod_offset = exp_offset + exp_len;
1487 	nettle_rsa_public_key_init(&pubkey);
1488 	pubkey.size = keylen - mod_offset;
1489 	nettle_mpz_set_str_256_u(pubkey.e, exp_len, &key[exp_offset]);
1490 	nettle_mpz_set_str_256_u(pubkey.n, pubkey.size, &key[mod_offset]);
1491 
1492 	/* Digest content of "buf" and verify its RSA signature in "sigblock"*/
1493 	nettle_mpz_init_set_str_256_u(signature, sigblock_len, (uint8_t*)sigblock);
1494 	switch (digest_size) {
1495 		case SHA1_DIGEST_SIZE:
1496 		{
1497 			uint8_t digest[SHA1_DIGEST_SIZE];
1498 			res = _digest_nettle(SHA1_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1499 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1500 			res &= rsa_sha1_verify_digest(&pubkey, digest, signature);
1501 			break;
1502 		}
1503 		case SHA256_DIGEST_SIZE:
1504 		{
1505 			uint8_t digest[SHA256_DIGEST_SIZE];
1506 			res = _digest_nettle(SHA256_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1507 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1508 			res &= rsa_sha256_verify_digest(&pubkey, digest, signature);
1509 			break;
1510 		}
1511 		case SHA512_DIGEST_SIZE:
1512 		{
1513 			uint8_t digest[SHA512_DIGEST_SIZE];
1514 			res = _digest_nettle(SHA512_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1515 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1516 			res &= rsa_sha512_verify_digest(&pubkey, digest, signature);
1517 			break;
1518 		}
1519 		default:
1520 			break;
1521 	}
1522 
1523 	/* Clear and return */
1524 	nettle_rsa_public_key_clear(&pubkey);
1525 	mpz_clear(signature);
1526 	if (!res) {
1527 		return "RSA signature verification failed";
1528 	} else {
1529 		return NULL;
1530 	}
1531 }
1532 
1533 #ifdef USE_ECDSA
1534 static char *
1535 _verify_nettle_ecdsa(sldns_buffer* buf, unsigned int digest_size, unsigned char* sigblock,
1536 	unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
1537 {
1538 	int res = 0;
1539 	struct ecc_point pubkey;
1540 	struct dsa_signature signature;
1541 
1542 	/* Always matched strength, as per RFC 6605 sec. 1 */
1543 	if (sigblock_len != 2*digest_size || keylen != 2*digest_size) {
1544 		return "wrong ECDSA signature length";
1545 	}
1546 
1547 	/* Parse ECDSA signature as per RFC 6605 sec. 4 */
1548 	nettle_dsa_signature_init(&signature);
1549 	switch (digest_size) {
1550 		case SHA256_DIGEST_SIZE:
1551 		{
1552 			uint8_t digest[SHA256_DIGEST_SIZE];
1553 			mpz_t x, y;
1554 			nettle_ecc_point_init(&pubkey, &nettle_secp_256r1);
1555 			nettle_mpz_init_set_str_256_u(x, SHA256_DIGEST_SIZE, key);
1556 			nettle_mpz_init_set_str_256_u(y, SHA256_DIGEST_SIZE, key+SHA256_DIGEST_SIZE);
1557 			nettle_mpz_set_str_256_u(signature.r, SHA256_DIGEST_SIZE, sigblock);
1558 			nettle_mpz_set_str_256_u(signature.s, SHA256_DIGEST_SIZE, sigblock+SHA256_DIGEST_SIZE);
1559 			res = _digest_nettle(SHA256_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1560 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1561 			res &= nettle_ecc_point_set(&pubkey, x, y);
1562 			res &= nettle_ecdsa_verify (&pubkey, SHA256_DIGEST_SIZE, digest, &signature);
1563 			mpz_clear(x);
1564 			mpz_clear(y);
1565 			break;
1566 		}
1567 		case SHA384_DIGEST_SIZE:
1568 		{
1569 			uint8_t digest[SHA384_DIGEST_SIZE];
1570 			mpz_t x, y;
1571 			nettle_ecc_point_init(&pubkey, &nettle_secp_384r1);
1572 			nettle_mpz_init_set_str_256_u(x, SHA384_DIGEST_SIZE, key);
1573 			nettle_mpz_init_set_str_256_u(y, SHA384_DIGEST_SIZE, key+SHA384_DIGEST_SIZE);
1574 			nettle_mpz_set_str_256_u(signature.r, SHA384_DIGEST_SIZE, sigblock);
1575 			nettle_mpz_set_str_256_u(signature.s, SHA384_DIGEST_SIZE, sigblock+SHA384_DIGEST_SIZE);
1576 			res = _digest_nettle(SHA384_DIGEST_SIZE, (unsigned char*)sldns_buffer_begin(buf),
1577 						(unsigned int)sldns_buffer_limit(buf), (unsigned char*)digest);
1578 			res &= nettle_ecc_point_set(&pubkey, x, y);
1579 			res &= nettle_ecdsa_verify (&pubkey, SHA384_DIGEST_SIZE, digest, &signature);
1580 			mpz_clear(x);
1581 			mpz_clear(y);
1582 			nettle_ecc_point_clear(&pubkey);
1583 			break;
1584 		}
1585 		default:
1586 			return "unknown ECDSA algorithm";
1587 	}
1588 
1589 	/* Clear and return */
1590 	nettle_dsa_signature_clear(&signature);
1591 	if (!res)
1592 		return "ECDSA signature verification failed";
1593 	else
1594 		return NULL;
1595 }
1596 #endif
1597 
1598 /**
1599  * Check a canonical sig+rrset and signature against a dnskey
1600  * @param buf: buffer with data to verify, the first rrsig part and the
1601  *	canonicalized rrset.
1602  * @param algo: DNSKEY algorithm.
1603  * @param sigblock: signature rdata field from RRSIG
1604  * @param sigblock_len: length of sigblock data.
1605  * @param key: public key data from DNSKEY RR.
1606  * @param keylen: length of keydata.
1607  * @param reason: bogus reason in more detail.
1608  * @return secure if verification succeeded, bogus on crypto failure,
1609  *	unchecked on format errors and alloc failures.
1610  */
1611 enum sec_status
1612 verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
1613 	unsigned int sigblock_len, unsigned char* key, unsigned int keylen,
1614 	char** reason)
1615 {
1616 	unsigned int digest_size = 0;
1617 
1618 	if (sigblock_len == 0 || keylen == 0) {
1619 		*reason = "null signature";
1620 		return sec_status_bogus;
1621 	}
1622 
1623 	switch(algo) {
1624 #ifdef USE_DSA
1625 	case LDNS_DSA:
1626 	case LDNS_DSA_NSEC3:
1627 		*reason = _verify_nettle_dsa(buf, sigblock, sigblock_len, key, keylen);
1628 		if (*reason != NULL)
1629 			return sec_status_bogus;
1630 		else
1631 			return sec_status_secure;
1632 #endif /* USE_DSA */
1633 
1634 	case LDNS_RSASHA1:
1635 	case LDNS_RSASHA1_NSEC3:
1636 		digest_size = (digest_size ? digest_size : SHA1_DIGEST_SIZE);
1637 #ifdef USE_SHA2
1638 	case LDNS_RSASHA256:
1639 		digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
1640 	case LDNS_RSASHA512:
1641 		digest_size = (digest_size ? digest_size : SHA512_DIGEST_SIZE);
1642 
1643 #endif
1644 		*reason = _verify_nettle_rsa(buf, digest_size, (char*)sigblock,
1645 						sigblock_len, key, keylen);
1646 		if (*reason != NULL)
1647 			return sec_status_bogus;
1648 		else
1649 			return sec_status_secure;
1650 
1651 #ifdef USE_ECDSA
1652 	case LDNS_ECDSAP256SHA256:
1653 		digest_size = (digest_size ? digest_size : SHA256_DIGEST_SIZE);
1654 	case LDNS_ECDSAP384SHA384:
1655 		digest_size = (digest_size ? digest_size : SHA384_DIGEST_SIZE);
1656 		*reason = _verify_nettle_ecdsa(buf, digest_size, sigblock,
1657 						sigblock_len, key, keylen);
1658 		if (*reason != NULL)
1659 			return sec_status_bogus;
1660 		else
1661 			return sec_status_secure;
1662 #endif
1663 	case LDNS_RSAMD5:
1664 	case LDNS_ECC_GOST:
1665 	default:
1666 		*reason = "unable to verify signature, unknown algorithm";
1667 		return sec_status_bogus;
1668 	}
1669 }
1670 
1671 #endif /* HAVE_SSL or HAVE_NSS or HAVE_NETTLE */
1672