]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
B is block length, not digest length
authorMatthijs Mekking <matje@NLnetLabs.nl>
Thu, 17 Dec 2009 10:47:28 +0000 (10:47 +0000)
committerMatthijs Mekking <matje@NLnetLabs.nl>
Thu, 17 Dec 2009 10:47:28 +0000 (10:47 +0000)
Changelog
tsig.c

index 5e340794164883dfa76602a50b3b194cfcbdd6fd..bbe960697527a43ac14049befaf6abae73e8dfe1 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -6,6 +6,7 @@
          Declared ldns_pkt_all and ldns_pkt_all_noquestion so swig sees them.
        * Bugfix: parse PTR target of .tomhendrikx.nl with error not crash.
        * Bugfix: handle escaped characters in TXT rdata.
+       * Bugfix: TSIG: keys longer than B bytes are now first hashed using H
 
 1.6.3  2009-12-04
        * Bugfix: allow for unknown resource records in zonefile with rdlen=0.
diff --git a/tsig.c b/tsig.c
index 3240065a763ac3bda2839675f425895b2ab61197..564b19c8d872985b5a89a37ff69624cb7ba9385e 100644 (file)
--- a/tsig.c
+++ b/tsig.c
 #ifdef HAVE_SSL
 #include <openssl/hmac.h>
 #include <openssl/md5.h>
+
+#define LDNS_TSIG_MD5_BLOCK_LENGTH 64
+#define LDNS_TSIG_SHA1_BLOCK_LENGTH 64
+#define LDNS_TSIG_SHA256_BLOCK_LENGTH 64
+
 #endif /* HAVE_SSL */
 
+
 char *
 ldns_tsig_algorithm(ldns_tsig_credentials *tc)
 {
@@ -124,28 +130,33 @@ ldns_tsig_prepare_pkt_wire(uint8_t *wire, size_t wire_len, size_t *result_len)
 
 #ifdef HAVE_SSL
 static const EVP_MD *
-ldns_digest_function(char *name, int* len)
+ldns_digest_function(char *name, int* blocklen, int* digestlen)
 {
        /* these are the mandatory algorithms from RFC4635 */
        /* The optional algorithms are not yet implemented */
        if (strlen(name) == 12 && strncasecmp(name, "hmac-sha256.", 11) == 0) {
 #ifdef HAVE_EVP_SHA256
-               *len = SHA256_DIGEST_LENGTH;
+               *blocklen = LDNS_TSIG_SHA256_BLOCK_LENGTH;
+               *digestlen = SHA256_DIGEST_LENGTH;
                return EVP_sha256();
 #else
-               *len = 0;
+               *digestlen = 0;
+               *blocklen = 0;
                return NULL;
 #endif
        } else if (strlen(name) == 10 && strncasecmp(name, "hmac-sha1.", 9) == 0) {
-               *len = SHA_DIGEST_LENGTH;
+               *blocklen = LDNS_TSIG_SHA1_BLOCK_LENGTH;
+               *digestlen = SHA_DIGEST_LENGTH;
                return EVP_sha1();
        } else if (strlen(name) == 25 && strncasecmp(name,
                     "hmac-md5.sig-alg.reg.int.", 25) == 0) {
-               *len = MD5_DIGEST_LENGTH;
+               *blocklen = LDNS_TSIG_MD5_BLOCK_LENGTH;
+               *digestlen = MD5_DIGEST_LENGTH;
                return EVP_md5();
        }
 
-       *len = 0;
+       *blocklen = 0;
+       *digestlen = 0;
        return NULL;
 }
 #endif
@@ -162,7 +173,8 @@ ldns_tsig_mac_new(ldns_rdf **tsig_mac, uint8_t *pkt_wire, size_t pkt_wire_size,
        unsigned char *mac_bytes;
        unsigned char *key_bytes;
        int key_size;
-       int max_digest_len = MD5_DIGEST_LENGTH;
+       int block_len = LDNS_TSIG_MD5_BLOCK_LENGTH;
+       int digest_len = MD5_DIGEST_LENGTH;
        const EVP_MD *digester;
        EVP_MD_CTX ectx;
        char *algorithm_name;
@@ -206,14 +218,14 @@ ldns_tsig_mac_new(ldns_rdf **tsig_mac, uint8_t *pkt_wire, size_t pkt_wire_size,
        mac_bytes = LDNS_XMALLOC(unsigned char, md_len);
        memset(mac_bytes, 0, md_len);
 
-       digester = ldns_digest_function(algorithm_name, &max_digest_len);
+       digester = ldns_digest_function(algorithm_name, &block_len, &digest_len);
 
        if (digester) {
-               if (key_size > max_digest_len) {
+               if (key_size > block_len) {
                        EVP_DigestInit(&ectx, digester);
                        EVP_DigestUpdate(&ectx, (const void*) key_bytes, key_size);
                        EVP_DigestFinal(&ectx, key_bytes, NULL);
-                       key_size = max_digest_len;
+                       key_size = digest_len;
                }
 
                (void) HMAC(digester, key_bytes, key_size, (void *)wireformat,