@@ -31,6 +31,8 @@ type SignOption struct {
3131 DoEMethod DenialOfExistenceMethod
3232 NSEC3Salt string
3333 NSEC3Iterate uint16
34+
35+ ZONEMDEnabled bool
3436}
3537
3638func (o * SignOption ) GetBeforSign () time.Duration {
@@ -112,6 +114,32 @@ func (d *DNSKEY) IsZSK() bool {
112114 return d .rr .Flags == 256
113115}
114116
117+ func Sign (z ZoneInterface , opt SignOption , dnskeys []* DNSKEY , generator Generator ) error {
118+ if err := AddDNSKEY (z , dnskeys , uint32 (0 ), generator ); err != nil {
119+ return fmt .Errorf ("failed to add DNSKEY: %w" , err )
120+ }
121+ if opt .ZONEMDEnabled {
122+ if err := AddZONEMDPlaceholder (z , nil , generator ); err != nil {
123+ return fmt .Errorf ("failed to add ZONEMD: %w" , err )
124+ }
125+ }
126+ if err := CreateDoE (z , opt , generator ); err != nil {
127+ return fmt .Errorf ("failed to add NSEC or NSEC3: %w" , err )
128+ }
129+ if err := SignZone (z , opt , dnskeys , generator ); err != nil {
130+ return fmt .Errorf ("failed to sign zone: %w" , err )
131+ }
132+ if opt .ZONEMDEnabled {
133+ if err := UpdateZONEMDDigest (z , generator ); err != nil {
134+ return fmt .Errorf ("failed to update ZONEMD digest: %w" , err )
135+ }
136+ if err := SignNode (z .GetRootNode (), opt , dnskeys , generator , true , true ); err != nil {
137+ return fmt .Errorf ("failed to sign zone apex: %w" , err )
138+ }
139+ }
140+ return nil
141+ }
142+
115143func AddDNSKEY (z ZoneInterface , dnskeys []* DNSKEY , ttl uint32 , generator Generator ) error {
116144 if len (dnskeys ) == 0 {
117145 return fmt .Errorf ("empty DNSKEYs" )
@@ -145,25 +173,31 @@ func SignZone(z ZoneInterface, opt SignOption, dnskeys []*DNSKEY, generator Gene
145173 auth := a .(bool )
146174 if z .GetName () != nni .GetName () {
147175 if nsRRset := nni .GetRRSet (dns .TypeNS ); nsRRset != nil {
148- return false , signNode (nni , opt , dnskeys , generator , nni == z .GetRootNode (), true )
176+ return false , SignNode (nni , opt , dnskeys , generator , nni == z .GetRootNode (), true )
149177 }
150178 }
151- return auth , signNode (nni , opt , dnskeys , generator , nni == z .GetRootNode (), auth )
179+ return auth , SignNode (nni , opt , dnskeys , generator , nni == z .GetRootNode (), auth )
152180 }, true )
153181}
154182
155- func signNode (nni NameNodeInterface , opt SignOption , dnskeys []* DNSKEY , generator Generator , apex , auth bool ) error {
183+ func SignNode (nni NameNodeInterface , opt SignOption , dnskeys []* DNSKEY , generator Generator , apex , auth bool ) error {
184+ if generator == nil {
185+ generator = & DefaultGenerator {}
186+ }
156187 if ! auth {
157188 return nil
158189 }
159- rrsig , err := GetRRSetOrCreate (nni , dns . TypeRRSIG , 0 , generator )
190+ rrsig , err := generator . NewRRSet (nni . GetName () , 0 , nni . GetClass (), dns . TypeRRSIG )
160191 if err != nil {
161192 return err
162193 }
163194 err = nni .IterateNameRRSet (func (ri RRSetInterface ) error {
164195 if ri .GetRRtype () == dns .TypeNS && ! apex {
165196 return nil
166197 }
198+ if ri .GetRRtype () == dns .TypeRRSIG {
199+ return nil
200+ }
167201 rrsigRRs , err := SignRRSet (ri , opt , dnskeys )
168202 if err != nil {
169203 return err
0 commit comments