#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)
{
#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
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;
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,