aboutsummaryrefslogtreecommitdiff
path: root/plugin/dnssec/dnssec.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/dnssec/dnssec.go')
-rw-r--r--plugin/dnssec/dnssec.go46
1 files changed, 31 insertions, 15 deletions
diff --git a/plugin/dnssec/dnssec.go b/plugin/dnssec/dnssec.go
index 68b9eb52d..6f943ec88 100644
--- a/plugin/dnssec/dnssec.go
+++ b/plugin/dnssec/dnssec.go
@@ -18,19 +18,21 @@ import (
type Dnssec struct {
Next plugin.Handler
- zones []string
- keys []*DNSKEY
- inflight *singleflight.Group
- cache *cache.Cache
+ zones []string
+ keys []*DNSKEY
+ splitkeys bool
+ inflight *singleflight.Group
+ cache *cache.Cache
}
// New returns a new Dnssec.
-func New(zones []string, keys []*DNSKEY, next plugin.Handler, c *cache.Cache) Dnssec {
+func New(zones []string, keys []*DNSKEY, splitkeys bool, next plugin.Handler, c *cache.Cache) Dnssec {
return Dnssec{Next: next,
- zones: zones,
- keys: keys,
- cache: c,
- inflight: new(singleflight.Group),
+ zones: zones,
+ keys: keys,
+ splitkeys: splitkeys,
+ cache: c,
+ inflight: new(singleflight.Group),
}
}
@@ -97,15 +99,29 @@ func (d Dnssec) sign(rrs []dns.RR, signerName string, ttl, incep, expir uint32,
}
sigs, err := d.inflight.Do(k, func() (interface{}, error) {
- sigs := make([]dns.RR, len(d.keys))
- var e error
- for i, k := range d.keys {
+ var sigs []dns.RR
+ for _, k := range d.keys {
+ if d.splitkeys {
+ if len(rrs) > 0 && rrs[0].Header().Rrtype == dns.TypeDNSKEY {
+ // We are signing a DNSKEY RRSet. With split keys, we need to use a KSK here.
+ if !k.isKSK() {
+ continue
+ }
+ } else {
+ // For non-DNSKEY RRSets, we want to use a ZSK.
+ if !k.isZSK() {
+ continue
+ }
+ }
+ }
sig := k.newRRSIG(signerName, ttl, incep, expir)
- e = sig.Sign(k.s, rrs)
- sigs[i] = sig
+ if e := sig.Sign(k.s, rrs); e != nil {
+ return sigs, e
+ }
+ sigs = append(sigs, sig)
}
d.set(k, sigs)
- return sigs, e
+ return sigs, nil
})
return sigs.([]dns.RR), err
}