@@ -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
33653365static 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
34483440static 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
35853633static 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 }
0 commit comments