static void test_dnssec_nsec3_hash(void) { static const uint8_t salt[] = { 0xB0, 0x1D, 0xFA, 0xCE }; static const uint8_t next_hashed_name[] = { 0x84, 0x10, 0x26, 0x53, 0xc9, 0xfa, 0x4d, 0x85, 0x6c, 0x97, 0x82, 0xe2, 0x8f, 0xdf, 0x2d, 0x5e, 0x87, 0x69, 0xc4, 0x52 }; _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; uint8_t h[DNSSEC_HASH_SIZE_MAX]; _cleanup_free_ char *b = NULL; int k; /* The NSEC3 RR for eurid.eu on 2015-12-14. */ rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_NSEC3, "PJ8S08RR45VIQDAQGE7EN3VHKNROTBMM.eurid.eu."); assert_se(rr); rr->nsec3.algorithm = DNSSEC_DIGEST_SHA1; rr->nsec3.flags = 1; rr->nsec3.iterations = 1; rr->nsec3.salt = memdup(salt, sizeof(salt)); assert_se(rr->nsec3.salt); rr->nsec3.salt_size = sizeof(salt); rr->nsec3.next_hashed_name = memdup(next_hashed_name, sizeof(next_hashed_name)); assert_se(rr->nsec3.next_hashed_name); rr->nsec3.next_hashed_name_size = sizeof(next_hashed_name); log_info("NSEC3: %s", strna(dns_resource_record_to_string(rr))); k = dnssec_nsec3_hash(rr, "eurid.eu", &h); assert_se(k >= 0); b = base32hexmem(h, k, false); assert_se(b); assert_se(strcasecmp(b, "PJ8S08RR45VIQDAQGE7EN3VHKNROTBMM") == 0); }
/* https://tools.ietf.org/html/rfc4648#section-10 */ static void test_base32hexmem(void) { char *b32; b32 = base32hexmem("", STRLEN(""), true); assert_se(b32); assert_se(streq(b32, "")); free(b32); b32 = base32hexmem("f", STRLEN("f"), true); assert_se(b32); assert_se(streq(b32, "CO======")); free(b32); b32 = base32hexmem("fo", STRLEN("fo"), true); assert_se(b32); assert_se(streq(b32, "CPNG====")); free(b32); b32 = base32hexmem("foo", STRLEN("foo"), true); assert_se(b32); assert_se(streq(b32, "CPNMU===")); free(b32); b32 = base32hexmem("foob", STRLEN("foob"), true); assert_se(b32); assert_se(streq(b32, "CPNMUOG=")); free(b32); b32 = base32hexmem("fooba", STRLEN("fooba"), true); assert_se(b32); assert_se(streq(b32, "CPNMUOJ1")); free(b32); b32 = base32hexmem("foobar", STRLEN("foobar"), true); assert_se(b32); assert_se(streq(b32, "CPNMUOJ1E8======")); free(b32); b32 = base32hexmem("", STRLEN(""), false); assert_se(b32); assert_se(streq(b32, "")); free(b32); b32 = base32hexmem("f", STRLEN("f"), false); assert_se(b32); assert_se(streq(b32, "CO")); free(b32); b32 = base32hexmem("fo", STRLEN("fo"), false); assert_se(b32); assert_se(streq(b32, "CPNG")); free(b32); b32 = base32hexmem("foo", STRLEN("foo"), false); assert_se(b32); assert_se(streq(b32, "CPNMU")); free(b32); b32 = base32hexmem("foob", STRLEN("foob"), false); assert_se(b32); assert_se(streq(b32, "CPNMUOG")); free(b32); b32 = base32hexmem("fooba", STRLEN("fooba"), false); assert_se(b32); assert_se(streq(b32, "CPNMUOJ1")); free(b32); b32 = base32hexmem("foobar", STRLEN("foobar"), false); assert_se(b32); assert_se(streq(b32, "CPNMUOJ1E8")); free(b32); }