From: Wouter Wijngaards Date: Wed, 8 Aug 2007 13:59:57 +0000 (+0000) Subject: sigcrypt keyset processing X-Git-Tag: release-0.5~140 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8f58908f45d69178f8a30125d8ebcedf3c6f6761;p=thirdparty%2Funbound.git sigcrypt keyset processing git-svn-id: file:///svn/unbound/trunk@501 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index e85f072ad..e843be86d 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,6 +1,8 @@ 8 August 2007: Wouter - ldns _raw routines created (in ldns trunk). - sigcrypt DS digest routines + - val_utils uses sigcrypt to perform signature cryptography. + - sigcrypt keyset processing 7 August 2007: Wouter - security status type. diff --git a/validator/val_sigcrypt.c b/validator/val_sigcrypt.c index 3eb20ed5a..0808d1dd7 100644 --- a/validator/val_sigcrypt.c +++ b/validator/val_sigcrypt.c @@ -51,6 +51,60 @@ #error "Need SSL library to do digital signature cryptography" #endif +/** return number of rrs in an rrset */ +static size_t +rrset_get_count(struct ub_packed_rrset_key* rrset) +{ + struct packed_rrset_data* d = (struct packed_rrset_data*) + rrset->entry.data; + if(!d) return 0; + return d->count; +} + +/** + * Get RR signature count + */ +static size_t +rrset_get_sigcount(struct ub_packed_rrset_key* k) +{ + struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data; + return d->rrsig_count; +} + +/** + * Get signature keytag value + * @param k: rrset (with signatures) + * @param sig_idx: signature index. + * @return keytag or 0 if malformed rrsig. + */ +static uint16_t +rrset_get_sig_keytag(struct ub_packed_rrset_key* k, size_t sig_idx) +{ + uint16_t t; + struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data; + log_assert(sig_idx < d->rrsig_count); + if(d->rr_len[d->count + sig_idx] < 2+18) + return 0; + memmove(&t, d->rr_data[d->count + sig_idx]+2+16, 2); + return t; +} + +/** + * Get signature signing algorithm value + * @param k: rrset (with signatures) + * @param sig_idx: signature index. + * @return algo or 0 if malformed rrsig. + */ +static int +rrset_get_sig_algo(struct ub_packed_rrset_key* k, size_t sig_idx) +{ + struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data; + log_assert(sig_idx < d->rrsig_count); + if(d->rr_len[d->count + sig_idx] < 2+3) + return 0; + return (int)d->rr_data[d->count + sig_idx][2+2]; +} + /** get rdata pointer and size */ static void rrset_get_rdata(struct ub_packed_rrset_key* k, size_t idx, uint8_t** rdata, @@ -286,3 +340,97 @@ int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset, dnskey_idx)); } +enum sec_status +dnskeyset_verify_rrset(struct module_env* env, struct val_env* ve, + struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey) +{ + enum sec_status sec; + size_t i, num; + num = rrset_get_sigcount(rrset); + if(num == 0) { + verbose(VERB_ALGO, "rrset failed to verify due to a lack of " + "signatures"); + return sec_status_bogus; + } + for(i=0; irk.dname, + ntohs(rrset->rk.type), ntohs(rrset->rk.rrset_class)); + sec = dnskeyset_verify_rrset(env, ve, rrset, keys); + verbose(VERB_ALGO, "verify result: %s", sec_status_to_string(sec)); - return sec_status_bogus; + /* TODO: update rrset security status */ + + return sec; } /** verify that a DS RR hashes to a key and that key signs the set */ @@ -230,9 +237,8 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve, /* Otherwise, we have a match! Make sure that the DNSKEY * verifies *with this key* */ - /* - sec = verify_rrset_key(env, ve, dnskey_rrset, dnskey_rrset, i); - */ + sec = dnskey_verify_rrset(env, ve, dnskey_rrset, + dnskey_rrset, i); if(sec == sec_status_secure) { return sec; }