@@ -22,17 +22,19 @@ var (
2222)
2323
2424type SignOption struct {
25- BeforeSign * time.Duration
26- Expiry * time.Duration
27- Inception * uint32
28- Expiration * uint32
29- // TODO: AddCDS bool
30- // TODO: AddCDNSKEY bool
25+ BeforeSign * time.Duration
26+ Expiry * time.Duration
27+ Inception * uint32
28+ Expiration * uint32
3129 DoEMethod DenialOfExistenceMethod
3230 NSEC3Salt string
3331 NSEC3Iterate uint16
3432
35- ZONEMDEnabled bool
33+ DNSKEYTTL * uint32
34+
35+ ZONEMDEnabled * bool
36+ CDSEnabled * bool
37+ CDNSKEYEnabled * bool
3638}
3739
3840func (o * SignOption ) GetBeforSign () time.Duration {
@@ -63,6 +65,13 @@ func (o *SignOption) GetExpiration() uint32 {
6365 return * o .Expiration
6466}
6567
68+ func (o * SignOption ) GetDNSKEYTTL () uint32 {
69+ if o .DNSKEYTTL == nil {
70+ return uint32 (3600 )
71+ }
72+ return * o .DNSKEYTTL
73+ }
74+
6675func (o * SignOption ) GetNSEC3Salt () string {
6776 return o .NSEC3Salt
6877}
@@ -71,6 +80,26 @@ func (o *SignOption) GetNSEC3Iterate() uint16 {
7180 return o .NSEC3Iterate
7281}
7382
83+ func (o * SignOption ) GetZONEMDEnabled () bool {
84+ if o .ZONEMDEnabled == nil {
85+ return true
86+ }
87+ return * o .ZONEMDEnabled
88+ }
89+
90+ func (o * SignOption ) GetCDSEnabled () bool {
91+ if o .CDSEnabled == nil {
92+ return true
93+ }
94+ return * o .CDSEnabled
95+ }
96+ func (o * SignOption ) GetCDNSKEYEnabled () bool {
97+ if o .CDSEnabled == nil {
98+ return true
99+ }
100+ return * o .CDSEnabled
101+ }
102+
74103type DNSKEY struct {
75104 rr * dns.DNSKEY
76105 signer crypto.Signer
@@ -115,10 +144,10 @@ func (d *DNSKEY) IsZSK() bool {
115144}
116145
117146func Sign (z ZoneInterface , opt SignOption , dnskeys []* DNSKEY , generator Generator ) error {
118- if err := AddDNSKEY (z , dnskeys , uint32 ( 0 ) , generator ); err != nil {
147+ if err := AddDNSKEY (z , opt , dnskeys , generator ); err != nil {
119148 return fmt .Errorf ("failed to add DNSKEY: %w" , err )
120149 }
121- if opt .ZONEMDEnabled {
150+ if opt .GetZONEMDEnabled () {
122151 if err := AddZONEMDPlaceholder (z , nil , generator ); err != nil {
123152 return fmt .Errorf ("failed to add ZONEMD: %w" , err )
124153 }
@@ -129,7 +158,7 @@ func Sign(z ZoneInterface, opt SignOption, dnskeys []*DNSKEY, generator Generato
129158 if err := SignZone (z , opt , dnskeys , generator ); err != nil {
130159 return fmt .Errorf ("failed to sign zone: %w" , err )
131160 }
132- if opt .ZONEMDEnabled {
161+ if opt .GetZONEMDEnabled () {
133162 if err := UpdateZONEMDDigest (z , generator ); err != nil {
134163 return fmt .Errorf ("failed to update ZONEMD digest: %w" , err )
135164 }
@@ -140,27 +169,52 @@ func Sign(z ZoneInterface, opt SignOption, dnskeys []*DNSKEY, generator Generato
140169 return nil
141170}
142171
143- func AddDNSKEY (z ZoneInterface , dnskeys []* DNSKEY , ttl uint32 , generator Generator ) error {
172+ func AddDNSKEY (z ZoneInterface , opt SignOption , dnskeys []* DNSKEY , generator Generator ) error {
144173 if len (dnskeys ) == 0 {
145174 return fmt .Errorf ("empty DNSKEYs" )
146175 }
147- if ttl == 0 {
148- ttl = 3600
149- }
150- rrset , err := GetRRSetOrCreate (z .GetRootNode (), dns .TypeDNSKEY , ttl , generator )
176+ rrset , err := GetRRSetOrCreate (z .GetRootNode (), dns .TypeDNSKEY , opt .GetDNSKEYTTL (), generator )
151177 if err != nil {
152178 return fmt .Errorf ("failed to create DNSKEY rrset: %w" , err )
153179 }
180+ cdsRRSet , err := GetRRSetOrCreate (z .GetRootNode (), dns .TypeCDS , opt .GetDNSKEYTTL (), generator )
181+ if err != nil {
182+ return fmt .Errorf ("failed to create CDS rrset: %w" , err )
183+ }
184+ cdnskeyRRset , err := GetRRSetOrCreate (z .GetRootNode (), dns .TypeCDNSKEY , opt .GetDNSKEYTTL (), generator )
185+ if err != nil {
186+ return fmt .Errorf ("failed to create CDNSKEY rrset: %w" , err )
187+ }
154188 for _ , dnskey := range dnskeys {
155189 rr := dnskey .GetRR ()
156190 rr .Hdr .Ttl = rrset .GetTTL ()
157191 if err := rrset .AddRR (rr ); err != nil {
158- return fmt .Errorf ("failed to add DNSKEY RR: %w" , err )
192+ return fmt .Errorf ("failed to add DNSKEY RR to rrset: %w" , err )
193+ }
194+ if opt .GetCDSEnabled () && dnskey .IsKSK () {
195+ if err := cdsRRSet .AddRR (rr .ToDS (dns .SHA256 ).ToCDS ()); err != nil {
196+ return fmt .Errorf ("failed to add CDS RR to rrset: %w" , err )
197+ }
198+ }
199+ if opt .GetCDNSKEYEnabled () && dnskey .IsKSK () {
200+ if err := cdnskeyRRset .AddRR (rr .ToCDNSKEY ()); err != nil {
201+ return fmt .Errorf ("failed to add CDNSKEY RR to rrset: %w" , err )
202+ }
159203 }
160204 }
161205 if err := z .GetRootNode ().SetRRSet (rrset ); err != nil {
162206 return fmt .Errorf ("failed to set DNSKEY rrset: %w" , err )
163207 }
208+ if opt .GetCDSEnabled () {
209+ if err := z .GetRootNode ().SetRRSet (cdsRRSet ); err != nil {
210+ return fmt .Errorf ("failed to set CDS rrset: %w" , err )
211+ }
212+ }
213+ if opt .GetCDNSKEYEnabled () {
214+ if err := z .GetRootNode ().SetRRSet (cdnskeyRRset ); err != nil {
215+ return fmt .Errorf ("failed to set CDNSKEY rrset: %w" , err )
216+ }
217+ }
164218 return nil
165219}
166220
0 commit comments