]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
SHA256 support.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 30 Sep 2008 13:06:07 +0000 (13:06 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 30 Sep 2008 13:06:07 +0000 (13:06 +0000)
git-svn-id: file:///svn/unbound/trunk@1275 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
testcode/unitverify.c
testdata/Kexample.com.+008+01443.ds [new file with mode: 0644]
testdata/Kexample.com.+008+01443.key [new file with mode: 0644]
testdata/Kexample.com.+008+01443.private [new file with mode: 0644]
testdata/Kexample.com.+009+54034.ds [new file with mode: 0644]
testdata/Kexample.com.+009+54034.key [new file with mode: 0644]
testdata/Kexample.com.+009+54034.private [new file with mode: 0644]
testdata/test_signatures.10 [new file with mode: 0644]
testdata/test_signatures.9 [new file with mode: 0644]
validator/val_sigcrypt.c

index f49afa40c4151067f329ea50f231b3f69ee3bf4a..fe13d27345a4b8e8fcd7d893a4fdce0fe9185068 100644 (file)
@@ -1,6 +1,8 @@
 30 September 2008: Wouter
        - fixup SHA256 DS downgrade, no longer possible to downgrade to SHA1.
        - tests for sha256 support and downgrade resistance.
+       - RSASHA256 and RSASHA512 support (using the draft in dnsext),
+         using the drafted protocol numbers.
 
 29 September 2008: Wouter
        - EDNS lameness detection, if EDNS packets are dropped this is
index 43ec4a1c6e10f4829662fc3ee3c6c5b88be9c19c..915a01844b71d9fdaf6e0e3d6efe2a094081e980 100644 (file)
@@ -140,6 +140,9 @@ should_be_bogus(struct ub_packed_rrset_key* rrset)
                entry.data;
        if(d->rrsig_count == 0)
                return 1;
+       /* name 'bogus' as first label signals bogus */
+       if(rrset->rk.dname_len > 6 && memcmp(rrset->rk.dname+1, "bogus", 5)==0)
+               return 1;
        return 0;
 }
 
@@ -468,6 +471,13 @@ verify_test()
        verifytest_file("testdata/test_signatures.6", "20080416005004");
        verifytest_file("testdata/test_signatures.7", "20070829144150");
        verifytest_file("testdata/test_signatures.8", "20070829144150");
+#ifdef SHA256_DIGEST_LENGTH
+       verifytest_file("testdata/test_signatures.9", "20070829144150");
+       verifytest_file("testdata/test_signatures.11", "20070829144150");
+#endif
+#ifdef SHA512_DIGEST_LENGTH
+       verifytest_file("testdata/test_signatures.10", "20070829144150");
+#endif
        dstest_file("testdata/test_ds_sig.1");
        nsectest();
        nsec3_hash_test("testdata/test_nsec3_hash.1");
diff --git a/testdata/Kexample.com.+008+01443.ds b/testdata/Kexample.com.+008+01443.ds
new file mode 100644 (file)
index 0000000..3e031f9
--- /dev/null
@@ -0,0 +1 @@
+example.com.   3600    IN      DS      1443 8 1 54f8ccd08089fd8b7c1b51d487eadf1c527dece4 ; xihaz-mufit-bybem-nezam-ryzuc-rugyt-gucyv-pulec-sygyl-tiriv-goxox
diff --git a/testdata/Kexample.com.+008+01443.key b/testdata/Kexample.com.+008+01443.key
new file mode 100644 (file)
index 0000000..61b39f4
--- /dev/null
@@ -0,0 +1 @@
+example.com.   3600    IN      DNSKEY  256 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1443 (zsk), size = 1024b}
diff --git a/testdata/Kexample.com.+008+01443.private b/testdata/Kexample.com.+008+01443.private
new file mode 100644 (file)
index 0000000..4d70dd3
--- /dev/null
@@ -0,0 +1,10 @@
+Private-key-format: v1.2
+Algorithm: 8 (RSASHA256)
+Modulus: t31aqPMTY/KfPbU4bl2hJ/2EXMyvl2HPPbBpne9Nr7SjmvsCNMCqYDXIf8Hf5oAyKFSbm5xlJ9Wqjv6Q5pETzIWP1qK86YDWfX4kt68mr+jK9DKPFA3ZBvz0vJo1RPmgpkiIv67LKE1bcoNHdJJtD8YHBA0MdVxmL4kNHdELSvs=
+PublicExponent: AQAB
+PrivateExponent: azCanqnpgPDCX90Wyzp9I4xxH3kfdrLXyzTcbjvWyTcggC/0WPbYUP36U8/hSZlIM9FBWgVh/oROb9x8r4S+6DT5k3tdhI303AL6bC8x1PBCzHjXBmYa9JvPKx/7a1hpSVOw9iJJh0Y4IclrfA8Ssdqxkj5QdNvR1CqDYTvIH/E=
+Prime1: 4yIEKoY9ew1mX7+MUA8T1sGp64VzTiFpnn/8eomwdYVEsX6Sg563qLEn6IuORxrqCz8Ae3qfgVkT0J96ArURsw==
+Prime2: zs9dU2j2jlToxIXtKu+YeO7QCKd1gVP6beI9IxjMYm21opsVvJ/xMlHu9aocGuCgvfmFyu/ShhsF/IPlFkvtmQ==
+Exponent1: EAy8TKD1wTc+L6/iY1ndZgSDVFA2yKOVygxzM9l87aEALKasBb72bWYvUsBhymZ9eVP3XcJZeRNpUgmi3oQa/w==
+Exponent2: nukr9wmyWo/YBBo8sT9F07b9V4kFe4jB52luPOezNPbEGNw+CaCEv3vBuDcsPWLZYOC488Tv6WgeY3gdsdJKEQ==
+Coefficient: Fr7ARq2yRTv8+1ZAAwv2gbDa92RZxdZzj9hpC+/64kjCxq5//2haIhU/wtgDbBlr99Uk90cXf6F8AeaqCYgjLQ==
diff --git a/testdata/Kexample.com.+009+54034.ds b/testdata/Kexample.com.+009+54034.ds
new file mode 100644 (file)
index 0000000..3d88960
--- /dev/null
@@ -0,0 +1 @@
+example.com.   3600    IN      DS      54034 9 1 59793aa41c0bfb8d71c686761370d29af7a9ae9b ; xikel-nyvap-gelyb-ryvom-teses-kecul-kegel-begon-potap-nuron-roxex
diff --git a/testdata/Kexample.com.+009+54034.key b/testdata/Kexample.com.+009+54034.key
new file mode 100644 (file)
index 0000000..88bed34
--- /dev/null
@@ -0,0 +1 @@
+example.com.   3600    IN      DNSKEY  256 3 9 AwEAAeHRRbGrk8zEVeSLNlELTGcvJLEiv+OJp1HWhq+kitN3p+IjLT2YmV2p43ReRiPSBDjzsf/8VPKCsGaDeli0/cq3u0s54ft8KB9lYbMDKg0LQkDdjVY2Ah5l7FRZGDn+AnmxWlZ3mp8ZREs2NCtQW5GOiKzZtJfftUZ9f8PXemIV ;{id = 54034 (zsk), size = 1024b}
diff --git a/testdata/Kexample.com.+009+54034.private b/testdata/Kexample.com.+009+54034.private
new file mode 100644 (file)
index 0000000..415dbfa
--- /dev/null
@@ -0,0 +1,10 @@
+Private-key-format: v1.2
+Algorithm: 9 (RSASHA512)
+Modulus: 4dFFsauTzMRV5Is2UQtMZy8ksSK/44mnUdaGr6SK03en4iMtPZiZXanjdF5GI9IEOPOx//xU8oKwZoN6WLT9yre7Sznh+3woH2VhswMqDQtCQN2NVjYCHmXsVFkYOf4CebFaVneanxlESzY0K1BbkY6IrNm0l9+1Rn1/w9d6YhU=
+PublicExponent: AQAB
+PrivateExponent: ODgdncoVldkbeTafYzXo45d9DwyTsVZH7bv29CuG1HbpuQcA8GDZbdQp6IK/+5MBshwZqJ1tmKKowBzjjMoilKnEZcn8ca9/L9Vr0Mgv5L7UDHkcAYa3rTmvXEowCJ7lrZYxiV/VFa5lMdRhuJPwffV2r8PxcRdNOIT7cNROMlE=
+Prime1: 9MoMzIuhQzBpVxKKoxVVpWaDoFS5iTiSuHay5jS9gu8uffPap6utGuyz24pWcPkEd1wrOdgMoGbzZq+RI/Azyw==
+Prime2: 7CjLOWY8aYfR2WhaVSZmdPieuClR4m26WZowZJL7tolGnwxdyo9mbCC8K3l9rBfGC93pM2R3h2GoWJY94G3Fnw==
+Exponent1: WvzfVQhxoK/V9++EaKn9c8VvF6FmdYL5xmcYiEkCSDDvbxG9LKW7ak6ha/E3wDZPWq5/wrhzuQuLXZfUsy8NkQ==
+Exponent2: bHXT2BnXNxR00We2zRKkzaX9p1D61YZVpp9FCHvk9RGZCKTyUnyHqrNiGIlkqWwFvh994eeLafb1DTJ7Wp6vuw==
+Coefficient: as42vfVFq5hx39EOBiOS1m+2CYzLLIPI7vh8xAi1lOJiTEzmujGVZ9VYETFenAp/S1ZfDznZU47hoWqtImxJ3g==
diff --git a/testdata/test_signatures.10 b/testdata/test_signatures.10
new file mode 100644 (file)
index 0000000..42d9ef1
--- /dev/null
@@ -0,0 +1,24 @@
+; Signature test file
+
+; first entry is a DNSKEY answer, with the DNSKEY rrset used for verification. 
+; later entries are verified with it.
+
+; Test RSASHA512 signatures.
+
+; RSA key from ldns tool
+ENTRY_BEGIN
+SECTION QUESTION
+sub.example.com.       IN DNSKEY
+SECTION ANSWER
+example.com.   3600    IN      DNSKEY  256 3 9 AwEAAeHRRbGrk8zEVeSLNlELTGcvJLEiv+OJp1HWhq+kitN3p+IjLT2YmV2p43ReRiPSBDjzsf/8VPKCsGaDeli0/cq3u0s54ft8KB9lYbMDKg0LQkDdjVY2Ah5l7FRZGDn+AnmxWlZ3mp8ZREs2NCtQW5GOiKzZtJfftUZ9f8PXemIV ;{id = 54034 (zsk), size = 1024b}
+ENTRY_END
+
+; entry to test
+ENTRY_BEGIN
+SECTION QUESTION
+www.example.com.    IN      A 
+SECTION ANSWER
+www.example.com.       3600    IN      A       192.0.2.66
+www.example.com.       3600    IN      RRSIG   A 9 3 3600 20070926134150 20070829134150 54034 example.com. FASMRTKfNKrj4o5gEkwfIjlqw2o03ZaoT95TcEdhBW80iyhi3cN3FESX7cquyqQ3AoA3i7OU5bqFVeLoQq9zeE8G2qHklpSPjrEFPHB/HKPtweb5rk4+yZqo9b0G375We12sZWHY5/gpaL2zVgX5A3j2H78rlfM7EMVnOEOIc0Y= ;{id = 54034}
+ENTRY_END
+
diff --git a/testdata/test_signatures.9 b/testdata/test_signatures.9
new file mode 100644 (file)
index 0000000..0c44ffa
--- /dev/null
@@ -0,0 +1,23 @@
+; Signature test file
+
+; first entry is a DNSKEY answer, with the DNSKEY rrset used for verification. 
+; later entries are verified with it.
+
+; Test RSASHA256 signatures.
+
+; RSA key from ldns tool
+ENTRY_BEGIN
+SECTION QUESTION
+sub.example.com.       IN DNSKEY
+SECTION ANSWER
+example.com.   3600    IN      DNSKEY  256 3 8 AwEAAbd9WqjzE2Pynz21OG5doSf9hFzMr5dhzz2waZ3vTa+0o5r7AjTAqmA1yH/B3+aAMihUm5ucZSfVqo7+kOaRE8yFj9aivOmA1n1+JLevJq/oyvQyjxQN2Qb89LyaNUT5oKZIiL+uyyhNW3KDR3SSbQ/GBwQNDHVcZi+JDR3RC0r7 ;{id = 1443 (zsk), size = 1024b}
+ENTRY_END
+
+; entry to test
+ENTRY_BEGIN
+SECTION QUESTION
+www.example.com.    IN      A 
+SECTION ANSWER
+www.example.com.       3600    IN      A       192.0.2.66
+www.example.com.       3600    IN      RRSIG   A 8 3 3600 20070926134150 20070829134150 1443 example.com. sX+BZ6Qdq0Td/THR1HgOnWh9URNP03KMEgjpnRGbS74NqlmlqLU3HcimOT/lUD7xsZTeOIWw5kAcQePxU3UrjS5gsIttIXAfrHFmOtTsyb0O4w0/RpR0QYxRl1hk4zQRPzHeEkgxNTe+y9V9gYe7iv9OddXsfwEnmqQiXk+tdsU= ;{id = 1443}
+ENTRY_END
index f24a79d7e76195c7224b898023369d756ed9d67a..88385501278e08c3ab7d5bf604f08b82e65e0ae3 100644 (file)
@@ -370,6 +370,12 @@ dnskey_algo_id_is_supported(int id)
        case LDNS_RSASHA1:
        case LDNS_RSASHA1_NSEC3:
        case LDNS_RSAMD5:
+#ifdef SHA256_DIGEST_LENGTH
+       case LDNS_RSASHA256:
+#endif
+#ifdef SHA512_DIGEST_LENGTH
+       case LDNS_RSASHA512:
+#endif
                return 1;
        default:
                return 0;
@@ -400,26 +406,65 @@ int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
                dnskey_idx));
 }
 
+/**
+ * Fillup needed algorithm array for DNSKEY set
+ * @param dnskey: the key
+ * @param num: number of DNSKEY RRs.
+ * @param needs: array per algorithm.
+ * @return the number of algorithms that need valid signatures
+ */
+static size_t
+dnskeyset_needs(struct ub_packed_rrset_key* dnskey, size_t num,
+       uint8_t needs[])
+{
+       uint8_t algo;
+       size_t i, total = 0;
+
+       memset(needs, 0, sizeof(uint8_t)*256);
+       for(i=0; i<num; i++) {
+               algo = (uint8_t)dnskey_get_algo(dnskey, i);
+               if(needs[algo] == 0) {
+                       needs[algo] = 1;
+                       total++;
+               }
+       }
+       return total;
+}
+
 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;
+       size_t i, num, numneeds;
        rbtree_t* sortree = NULL;
+       /* make sure that for all DNSKEY algorithms there are valid sigs */
+       uint8_t needs[256]; /* 1 if need sig for that algorithm */
+
        num = rrset_get_sigcount(rrset);
        if(num == 0) {
                verbose(VERB_QUERY, "rrset failed to verify due to a lack of "
                        "signatures");
                return sec_status_bogus;
        }
+
+       numneeds = dnskeyset_needs(dnskey, num, needs);
        for(i=0; i<num; i++) {
                sec = dnskeyset_verify_rrset_sig(env, ve, *env->now, rrset, 
                        dnskey, i, &sortree);
-               if(sec == sec_status_secure)
-                       return sec;
+               /* see which algorithm has been fixed up */
+               if(sec == sec_status_secure) {
+                       uint8_t a = (uint8_t)dnskey_get_algo(dnskey, i);
+                       if(needs[a] == 1) {
+                               needs[a] = 0;
+                               numneeds --;
+                               if(numneeds == 0) /* done! */
+                                       return sec;
+                       }
+               }
        }
-       verbose(VERB_ALGO, "rrset failed to verify: all signatures are bogus");
+       verbose(VERB_ALGO, "rrset failed to verify: no valid signatures for "
+               "%d algorithms", (int)numneeds);
        return sec_status_bogus;
 }
 
@@ -1256,18 +1301,36 @@ setup_key_digest(int algo, EVP_PKEY* evp_key, const EVP_MD** digest_type,
                        break;
                case LDNS_RSASHA1:
                case LDNS_RSASHA1_NSEC3:
+#ifdef SHA256_DIGEST_LENGTH
+               case LDNS_RSASHA256:
+#endif
+#ifdef SHA512_DIGEST_LENGTH
+               case LDNS_RSASHA512:
+#endif
                        rsa = ldns_key_buf2rsa_raw(key, keylen);
                        if(!rsa) {
                                verbose(VERB_QUERY, "verify: "
-                                       "ldns_key_buf2rsa_raw SHA1 failed");
+                                       "ldns_key_buf2rsa_raw SHA failed");
                                return 0;
                        }
                        if(EVP_PKEY_assign_RSA(evp_key, rsa) == 0) {
                                verbose(VERB_QUERY, "verify: "
-                                       "EVP_PKEY_assign_RSA SHA1 failed");
+                                       "EVP_PKEY_assign_RSA SHA failed");
                                return 0;
                        }
-                       *digest_type = EVP_sha1();
+
+                       /* select SHA version */
+#ifdef SHA256_DIGEST_LENGTH
+                       if(algo == LDNS_RSASHA256)
+                               *digest_type = EVP_sha256();
+                       else
+#endif
+#ifdef SHA512_DIGEST_LENGTH
+                               if(algo == LDNS_RSASHA512)
+                               *digest_type = EVP_sha512();
+                       else
+#endif
+                               *digest_type = EVP_sha1();
 
                        break;
                case LDNS_RSAMD5: