Skip to content

Commit 7bcd060

Browse files
author
jgoertzen-sb [email protected]
committed
Add merkle trees to bind9
1 parent e90114c commit 7bcd060

34 files changed

+2904
-91
lines changed

Makefile.top

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,9 @@ LIBISCCC_CFLAGS = \
7171

7272
LIBISCCC_LIBS = \
7373
$(top_builddir)/lib/isccc/libisccc.la
74+
75+
LIBSAQ_CFLAGS = \
76+
-I$(top_srcdir)/lib/saq/include
77+
78+
LIBSAQ_LIBS = \
79+
$(top_builddir)/lib/saq/libsaq.la

bin/dnssec/dnssec-keyfromlabel.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ main(int argc, char **argv) {
403403
case DST_ALG_SPHINCSSHA256128S:
404404
case DST_ALG_XMSS:
405405
case DST_ALG_XMSSMT:
406+
case DST_ALG_MERKLE_TREE:
406407
break;
407408
default:
408409
fatal("%s is incompatible with NSEC3; "

bin/dnssec/dnssec-keygen.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ keygen(keygen_ctx_t *ctx, isc_mem_t *mctx, int argc, char **argv) {
324324
case DST_ALG_SPHINCSSHA256128S:
325325
case DST_ALG_XMSS:
326326
case DST_ALG_XMSSMT:
327+
case DST_ALG_MERKLE_TREE:
327328
break;
328329
default:
329330
fatal("algorithm %s is incompatible with NSEC3"
@@ -379,6 +380,7 @@ keygen(keygen_ctx_t *ctx, isc_mem_t *mctx, int argc, char **argv) {
379380
case DST_ALG_SPHINCSSHA256128S:
380381
case DST_ALG_XMSS:
381382
case DST_ALG_XMSSMT:
383+
case DST_ALG_MERKLE_TREE:
382384
break;
383385
default:
384386
fatal("key size not specified (-b option)");
@@ -578,6 +580,9 @@ keygen(keygen_ctx_t *ctx, isc_mem_t *mctx, int argc, char **argv) {
578580
fatal("XMSSMT failed to get bits based on param");
579581
}
580582
break;
583+
case DST_ALG_MERKLE_TREE:
584+
ctx->size = 256;
585+
break;
581586
}
582587

583588
if (ctx->nametype == NULL) {

bin/dnssec/dnssec-signzone.c

Lines changed: 77 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
718718
if (isksk(key) || !have_ksk ||
719719
(iszsk(key) && !keyset_kskonly))
720720
{
721-
if (!defer_signing || !iszsk(key) || (set->type == dns_rdatatype_dnskey && dst_key_alg(key->key) != DST_ALG_ECDSA256)) {
721+
if (!defer_signing || !iszsk(key) || (set->type == dns_rdatatype_dnskey && !dst_key_is_deferred_signing(key->key))) {
722722
signwithkey(name, set, key->key, ttl, add,
723723
"signing with dnskey", check_now);
724724
}
@@ -3363,7 +3363,7 @@ print_stats(isc_time_t *timer_start, isc_time_t *timer_finish,
33633363
}
33643364

33653365
static void
3366-
finalize_node_rrsigs(dns_dbnode_t *node, dns_name_t *name, dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t orig, uint16_t new) {
3366+
finalize_node_rrsigs(dns_dbnode_t *node, dns_name_t *name, dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t old_keytag) {
33673367
isc_result_t result;
33683368
dns_rdatasetiter_t *rdsiter = NULL;
33693369
dns_rdataset_t rdataset;
@@ -3389,22 +3389,14 @@ finalize_node_rrsigs(dns_dbnode_t *node, dns_name_t *name, dns_diff_t *add, dns_
33893389
if (rrsig_rdata.type == dns_rdatatype_rrsig) {
33903390
rrsigresult = dns_rdata_tostruct(&rrsig_rdata, &rrsig, NULL);
33913391
if (rrsigresult == ISC_R_SUCCESS) {
3392-
if (rrsig.keyid == orig) {
3392+
if (rrsig.keyid == old_keytag) {
3393+
char data[4096];
3394+
isc_buffer_t databuf;
33933395
dns_difftuple_t *addtuple = NULL;
33943396
dns_difftuple_t *deltuple = NULL;
33953397
dns_rdata_t new_rrsig_rdata = DNS_RDATA_INIT;
3396-
dns_rdata_t old_rrsig_rdata = DNS_RDATA_INIT;
3397-
3398-
dns_rdata_clone(&rrsig_rdata, &old_rrsig_rdata);
3399-
rrsig.keyid = new;
3400-
3401-
// TODO finalize sig.
3402-
unsigned char data[4096];
3403-
isc_buffer_t buffer;
3404-
3405-
isc_buffer_init(&buffer, data, sizeof(data));
3406-
dns_rdata_fromstruct(&new_rrsig_rdata, rdataset.rdclass,
3407-
dns_rdatatype_rrsig, &rrsig, &buffer);
3398+
isc_buffer_init(&databuf, data, sizeof(data));
3399+
check_result(dst_key_signature_finalize(key->key, &databuf, &rrsig_rdata, &new_rrsig_rdata), "signature finalize");
34083400
if (tryverify) {
34093401
dns_rdataset_t target_rdataset;
34103402
dns_rdataset_init(&target_rdataset);
@@ -3429,7 +3421,7 @@ finalize_node_rrsigs(dns_dbnode_t *node, dns_name_t *name, dns_diff_t *add, dns_
34293421
check_result(result, "dns_difftuple_create");
34303422
result = dns_difftuple_create(mctx,
34313423
DNS_DIFFOP_DELRESIGN, name,
3432-
rdataset.ttl, &old_rrsig_rdata, &deltuple);
3424+
rdataset.ttl, &rrsig_rdata, &deltuple);
34333425
check_result(result, "dns_difftuple_create");
34343426
dns_diff_append(add, &addtuple);
34353427
dns_diff_append(del, &deltuple);
@@ -3446,7 +3438,7 @@ finalize_node_rrsigs(dns_dbnode_t *node, dns_name_t *name, dns_diff_t *add, dns_
34463438
}
34473439

34483440
static void
3449-
finalize_rrsigs(dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t orig, uint16_t new) {
3441+
finalize_rrsigs(dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t old_keytag) {
34503442
dns_dbnode_t *node = NULL;
34513443
dns_fixedname_t fixed;
34523444
dns_name_t *name;
@@ -3459,7 +3451,7 @@ finalize_rrsigs(dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t
34593451
check_result(result, "dns_dbiterator_seek()");
34603452
result = dns_dbiterator_current(dbiter, &node, name);
34613453
check_dns_dbiterator_current(result);
3462-
finalize_node_rrsigs(node, name, add, del, key, orig, new);
3454+
finalize_node_rrsigs(node, name, add, del, key, old_keytag);
34633455
dns_db_detachnode(gdb, &node);
34643456
result = dns_dbiterator_first(dbiter);
34653457
dns_fixedname_t fname;
@@ -3472,7 +3464,7 @@ finalize_rrsigs(dns_diff_t *add, dns_diff_t *del, dns_dnsseckey_t *key, uint16_t
34723464
if (dns_name_equal(name, gorigin)) {
34733465
goto next;
34743466
}
3475-
finalize_node_rrsigs(node, name, add, del, key, orig, new);
3467+
finalize_node_rrsigs(node, name, add, del, key, old_keytag);
34763468
next:
34773469
result = dns_dbiterator_next(dbiter);
34783470
dns_db_detachnode(gdb, &node);
@@ -3513,7 +3505,7 @@ defered_finalize_signing(dns_dbnode_t *node, dns_name_t *name) {
35133505
/* Now that the all other signatures are signed, finalize defer signing
35143506
* key and sign DNSKEY set. */
35153507
if (rdataset.type != dns_rdatatype_dnskey) {
3516-
goto key_skip;
3508+
goto finalize_skip;
35173509
}
35183510

35193511
// Finalize all keys located in this set
@@ -3531,32 +3523,54 @@ defered_finalize_signing(dns_dbnode_t *node, dns_name_t *name) {
35313523
uint16_t keytag = dst_region_computeid(&key_r);
35323524
keyresult = dns_rdata_tostruct(&key_rdata, &dnskey, NULL);
35333525
if (keyresult == ISC_R_SUCCESS) {
3534-
if (dnskey.algorithm == DST_ALG_ECDSA256) {
3526+
if (dst_algorithm_is_deferred_signing(dnskey.algorithm)) {
35353527
dns_dnsseckey_t *key = NULL;
3536-
uint16_t new_keytag = keytag;
35373528
for (key = ISC_LIST_HEAD(keylist); key != NULL;
35383529
key = ISC_LIST_NEXT(key, link))
35393530
{
35403531
if (dst_key_id(key->key) == keytag &&
35413532
dst_key_alg(key->key) == dnskey.algorithm)
35423533
{
3543-
// TODO finalize key here
3544-
new_keytag = 0;
3534+
dns_difftuple_t *addtuple = NULL;
3535+
dns_difftuple_t *deltuple = NULL;
3536+
unsigned char data[4096];
3537+
isc_buffer_t buffer;
3538+
isc_region_t r;
3539+
3540+
isc_buffer_init(&buffer, data, sizeof(data));
3541+
check_result(dst_key_finalize(key->key), "dst_key_finalize");
3542+
dns_rdata_t new_dnskey_rdata = DNS_RDATA_INIT;
3543+
dns_rdata_t old_dnskey_rdata = DNS_RDATA_INIT;
3544+
3545+
dns_rdata_clone(&key_rdata, &old_dnskey_rdata);
3546+
result = dst_key_todns(key->key, &buffer);
3547+
check_result(result, "dst_key_todns");
3548+
isc_buffer_usedregion(&buffer, &r);
3549+
dns_rdata_fromregion(&new_dnskey_rdata, key_rdata.rdclass, dns_rdatatype_dnskey, &r);
3550+
3551+
result = dns_difftuple_create(mctx,
3552+
DNS_DIFFOP_ADDRESIGN, name,
3553+
rdataset.ttl, &new_dnskey_rdata, &addtuple);
3554+
check_result(result, "dns_difftuple_create");
3555+
result = dns_difftuple_create(mctx,
3556+
DNS_DIFFOP_DELRESIGN, name,
3557+
rdataset.ttl, &old_dnskey_rdata, &deltuple);
3558+
check_result(result, "dns_difftuple_create");
3559+
dns_diff_append(&add, &addtuple);
3560+
dns_diff_append(&del, &deltuple);
35453561
break;
35463562
}
35473563
}
35483564
if (key != NULL) {
3549-
finalize_rrsigs(&add, &del, key, keytag, new_keytag);
3565+
finalize_rrsigs(&add, &del, key, keytag);
35503566
}
35513567
}
35523568
dns_rdata_freestruct(&dnskey);
35533569
}
35543570
}
35553571
}
35563572

3557-
signset(&del, &add, node, name, &rdataset, true);
3558-
3559-
key_skip:
3573+
finalize_skip:
35603574
dns_rdataset_disassociate(&rdataset);
35613575
result = dns_rdatasetiter_next(rdsiter);
35623576
}
@@ -3580,6 +3594,40 @@ defered_finalize_signing(dns_dbnode_t *node, dns_name_t *name) {
35803594

35813595
dns_diff_clear(&del);
35823596
dns_diff_clear(&add);
3597+
result = dns_db_allrdatasets(gdb, node, gversion, 0, 0, &rdsiter);
3598+
check_result(result, "dns_db_allrdatasets()");
3599+
result = dns_rdatasetiter_first(rdsiter);
3600+
while (result == ISC_R_SUCCESS) {
3601+
dns_rdatasetiter_current(rdsiter, &rdataset);
3602+
3603+
/* Now that the all other signatures are signed, finalize defer signing
3604+
* key and sign DNSKEY set. */
3605+
if (rdataset.type != dns_rdatatype_dnskey) {
3606+
goto sign_skip;
3607+
}
3608+
3609+
3610+
signset(&del, &add, node, name, &rdataset, true);
3611+
3612+
sign_skip:
3613+
dns_rdataset_disassociate(&rdataset);
3614+
result = dns_rdatasetiter_next(rdsiter);
3615+
}
3616+
3617+
dns_rdatasetiter_destroy(&rdsiter);
3618+
result = dns_diff_applysilently(&del, gdb, gversion);
3619+
if (result != ISC_R_SUCCESS) {
3620+
fatal("failed to delete SIGs at node '%s': %s", namestr,
3621+
isc_result_totext(result));
3622+
}
3623+
3624+
result = dns_diff_applysilently(&add, gdb, gversion);
3625+
if (result != ISC_R_SUCCESS) {
3626+
fatal("failed to add SIGs at node '%s': %s", namestr,
3627+
isc_result_totext(result));
3628+
}
3629+
dns_diff_clear(&del);
3630+
dns_diff_clear(&add);
35833631
}
35843632

35853633
static void
@@ -4290,7 +4338,7 @@ main(int argc, char *argv[]) {
42904338
key = ISC_LIST_NEXT(key, link))
42914339
{
42924340
key->index = keycount++;
4293-
if (dst_key_alg(key->key) == DST_ALG_ECDSA256) {
4341+
if (dst_key_is_deferred_signing(key->key)) {
42944342
defer_signing = true;
42954343
}
42964344
}

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1634,6 +1634,7 @@ AC_CONFIG_FILES([bin/Makefile
16341634

16351635
AC_CONFIG_FILES([lib/Makefile
16361636
lib/isc/Makefile
1637+
lib/saq/Makefile
16371638
lib/dns/Makefile
16381639
lib/ns/Makefile
16391640
lib/isccfg/Makefile

lib/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
include $(top_srcdir)/Makefile.top
22

3-
SUBDIRS = isc dns isccc ns isccfg
3+
SUBDIRS = isc saq dns isccc ns isccfg

lib/dns/Makefile.am

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ libdns_la_SOURCES = \
195195
keymgr.c \
196196
keystore.c \
197197
keytable.c \
198+
liboqsstateful_link.c \
198199
log.c \
199200
master.c \
200201
masterdump.c \
@@ -205,7 +206,6 @@ libdns_la_SOURCES = \
205206
nsec.c \
206207
nsec3.c \
207208
nta.c \
208-
liboqsstateful_link.c \
209209
openssl_link.c \
210210
openssl_shim.c \
211211
openssl_shim.h \
@@ -243,6 +243,7 @@ libdns_la_SOURCES = \
243243
rpz.c \
244244
rrl.c \
245245
rriterator.c \
246+
saqmerklestream_link.c \
246247
sdlz.c \
247248
soa.c \
248249
ssu.c \
@@ -279,6 +280,7 @@ libdns_la_CPPFLAGS = \
279280
$(AM_CPPFLAGS) \
280281
$(LIBDNS_CFLAGS) \
281282
$(LIBISC_CFLAGS) \
283+
$(LIBSAQ_CFLAGS) \
282284
$(LIBURCU_CFLAGS) \
283285
$(LIBUV_CFLAGS) \
284286
$(OPENSSL_CFLAGS)
@@ -289,6 +291,7 @@ libdns_la_LDFLAGS = \
289291

290292
libdns_la_LIBADD = \
291293
$(LIBISC_LIBS) \
294+
$(LIBSAQ_LIBS) \
292295
$(LIBURCU_LIBS) \
293296
$(LIBUV_LIBS) \
294297
$(OPENSSL_LIBS)

lib/dns/dnssec.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,6 @@ dns_dnssec_signs(dns_rdata_t *rdata, const dns_name_t *name,
10981098
dns_rdataset_current(sigrdataset, &sigrdata);
10991099
result = dns_rdata_tostruct(&sigrdata, &sig, NULL);
11001100
RUNTIME_CHECK(result == ISC_R_SUCCESS);
1101-
11021101
if (sig.algorithm == key.algorithm && sig.keyid == keytag) {
11031102
result = dns_dnssec_verify(name, rdataset, dstkey,
11041103
ignoretime, 0, mctx,

0 commit comments

Comments
 (0)