- documented 0x20 status.
- fixup chroot and checkconf, it is much smarter now.
- fixup DSA EVP signature decoding. Solution that Jelte found copied.
+ - and check first sig byte for the encoding type.
11 April 2008: Wouter
- random port selection out of the configged ports.
&val, (socklen_t)sizeof(val)) < 0) {
log_err("setsockopt(..., IPV6_V6ONLY"
", ...) failed: %s", strerror(errno));
+ close(s);
*inuse = 0;
return -1;
}
&on, (socklen_t)sizeof(on)) < 0) {
log_err("setsockopt(..., IPV6_USE_MIN_MTU, "
"...) failed: %s", strerror(errno));
+ close(s);
*inuse = 0;
return -1;
}
if(errno != EADDRINUSE)
#endif
log_err("can't bind socket: %s", strerror(errno));
+ close(s);
return -1;
}
if(!fd_set_nonblock(s)) {
*inuse = 0;
+ close(s);
return -1;
}
return s;
{
unsigned char* orig = *sig;
unsigned int origlen = *len;
+ int newlen;
uint8_t t;
BIGNUM *R, *S;
dsasig->r = R;
dsasig->s = S;
*sig = NULL;
- *len = i2d_DSA_SIG(dsasig, sig);
- if(*len == 0) {
+ newlen = i2d_DSA_SIG(dsasig, sig);
+ if(newlen < 0) {
free(sig);
return 0;
}
+ *len = (unsigned int)newlen;
DSA_SIG_free(dsasig);
return 1;
}
{
const EVP_MD *digest_type;
EVP_MD_CTX ctx;
- int res;
+ int res, dofree = 0;
EVP_PKEY *evp_key = EVP_PKEY_new();
if(!evp_key) {
log_err("verify: malloc failure in crypto");
EVP_PKEY_free(evp_key);
return sec_status_bogus;
}
- if(algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) {
+ /* if it is a DSA signature in XXX format, convert to DER format */
+ if((algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) &&
+ sigblock_len > 0 && sigblock[0] == 0) {
if(!setup_dsa_sig(&sigblock, &sigblock_len)) {
verbose(VERB_QUERY, "verify: failed to setup DSA sig");
- EVP_PKEY_free(evp_key);
return sec_status_bogus;
}
+ dofree = 1;
}
/* do the signature cryptography work */
EVP_MD_CTX_cleanup(&ctx);
EVP_PKEY_free(evp_key);
- if(algo == LDNS_DSA || algo == LDNS_DSA_NSEC3) {
+ if(dofree)
free(sigblock);
- }
if(res == 1) {
return sec_status_secure;
} else if(res == 0) {
return sec_status_bogus;
}
+
log_crypto_error("verify:", ERR_get_error());
return sec_status_unchecked;
}
/* verify */
sec = verify_canonrrset(buf, (int)sig[2+2],
sigblock, sigblock_len, key, keylen);
-
+
/* check if TTL is too high - reduce if so */
if(sec == sec_status_secure) {
adjust_ttl(ve, now, rrset, sig+2+4, sig+2+8, sig+2+12);