mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-25 19:15:34 +00:00
tka: guard against key-length panics when verifying signatures
In late 2022 a subtle but crucial part of documentation was added to ed25519.Verify: It
will panic if len(publicKey) is not [PublicKeySize].
02ed0e5e67
This change catches that error so it won't lead to a panic.
Signed-off-by: Tom DNetto <tom@tailscale.com>
Updates https://github.com/tailscale/corp/issues/8568
This commit is contained in:
parent
486ab427b4
commit
bec9815f02
@ -145,6 +145,9 @@ func signatureVerify(s *tkatype.Signature, aumDigest tkatype.AUMSigHash, key Key
|
|||||||
// so we should use the public contained in the state machine.
|
// so we should use the public contained in the state machine.
|
||||||
switch key.Kind {
|
switch key.Kind {
|
||||||
case Key25519:
|
case Key25519:
|
||||||
|
if len(key.Public) != ed25519.PublicKeySize {
|
||||||
|
return fmt.Errorf("ed25519 key has wrong length: %d", len(key.Public))
|
||||||
|
}
|
||||||
if ed25519consensus.Verify(ed25519.PublicKey(key.Public), aumDigest[:], s.Signature) {
|
if ed25519consensus.Verify(ed25519.PublicKey(key.Public), aumDigest[:], s.Signature) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -225,6 +225,9 @@ func (s *NodeKeySignature) verifySignature(nodeKey key.NodePublic, verificationK
|
|||||||
if !ok {
|
if !ok {
|
||||||
return errors.New("missing rotation key")
|
return errors.New("missing rotation key")
|
||||||
}
|
}
|
||||||
|
if len(verifyPub) != ed25519.PublicKeySize {
|
||||||
|
return fmt.Errorf("bad rotation key length: %d", len(verifyPub))
|
||||||
|
}
|
||||||
if !ed25519.Verify(ed25519.PublicKey(verifyPub[:]), sigHash[:], s.Signature) {
|
if !ed25519.Verify(ed25519.PublicKey(verifyPub[:]), sigHash[:], s.Signature) {
|
||||||
return errors.New("invalid signature")
|
return errors.New("invalid signature")
|
||||||
}
|
}
|
||||||
@ -249,6 +252,9 @@ func (s *NodeKeySignature) verifySignature(nodeKey key.NodePublic, verificationK
|
|||||||
}
|
}
|
||||||
switch verificationKey.Kind {
|
switch verificationKey.Kind {
|
||||||
case Key25519:
|
case Key25519:
|
||||||
|
if len(verificationKey.Public) != ed25519.PublicKeySize {
|
||||||
|
return fmt.Errorf("ed25519 key has wrong length: %d", len(verificationKey.Public))
|
||||||
|
}
|
||||||
if ed25519consensus.Verify(ed25519.PublicKey(verificationKey.Public), sigHash[:], s.Signature) {
|
if ed25519consensus.Verify(ed25519.PublicKey(verificationKey.Public), sigHash[:], s.Signature) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user