|
|
@@ -16,6 +16,18 @@ import (
|
|
|
"tailscale.com/types/tkatype"
|
|
|
)
|
|
|
|
|
|
+// Strict settings for the CBOR decoder.
|
|
|
+var cborDecOpts = cbor.DecOptions{
|
|
|
+ DupMapKey: cbor.DupMapKeyEnforcedAPF,
|
|
|
+ IndefLength: cbor.IndefLengthForbidden,
|
|
|
+ TagsMd: cbor.TagsForbidden,
|
|
|
+
|
|
|
+ // Arbitrarily-chosen maximums.
|
|
|
+ MaxNestedLevels: 8,
|
|
|
+ MaxArrayElements: 4096,
|
|
|
+ MaxMapPairs: 1024,
|
|
|
+}
|
|
|
+
|
|
|
// Authority is a Tailnet Key Authority. This type is the main coupling
|
|
|
// point to the rest of the tailscale client.
|
|
|
//
|
|
|
@@ -596,8 +608,8 @@ func (a *Authority) Inform(updates []AUM) error {
|
|
|
// correctly by a trusted key.
|
|
|
func (a *Authority) VerifySignature(nodeKeySignature tkatype.MarshaledSignature) error {
|
|
|
var decoded NodeKeySignature
|
|
|
- if err := cbor.Unmarshal(nodeKeySignature, &decoded); err != nil {
|
|
|
- return fmt.Errorf("unmarshal: %v", err)
|
|
|
+ if err := decoded.Unserialize(nodeKeySignature); err != nil {
|
|
|
+ return fmt.Errorf("unserialize: %v", err)
|
|
|
}
|
|
|
key, err := a.state.GetKey(decoded.KeyID)
|
|
|
if err != nil {
|
|
|
@@ -606,3 +618,10 @@ func (a *Authority) VerifySignature(nodeKeySignature tkatype.MarshaledSignature)
|
|
|
|
|
|
return decoded.verifySignature(key)
|
|
|
}
|
|
|
+
|
|
|
+// KeyTrusted returns true if the given keyID is trusted by the tailnet
|
|
|
+// key authority.
|
|
|
+func (a *Authority) KeyTrusted(keyID tkatype.KeyID) bool {
|
|
|
+ _, err := a.state.GetKey(keyID)
|
|
|
+ return err == nil
|
|
|
+}
|