fix(eddsa): use DecodeHashAlgorithm and create decodeEdDSACurve

This commit is contained in:
Steve Moyer
2025-07-08 11:27:18 -04:00
parent 8dcaefbf3a
commit 21a78a9d2d
3 changed files with 28 additions and 10 deletions

View File

@@ -4,6 +4,7 @@ import (
"bytes"
"crypto/ed25519"
"encoding/binary"
"fmt"
"github.com/multiformats/go-multicodec"
)
@@ -26,6 +27,20 @@ const (
CurveEd448 = EdDSACurve(multicodec.Ed448Pub)
)
func decodeEdDSACurve(r *bytes.Reader) (EdDSACurve, error) {
u, err := binary.ReadUvarint(r)
if err != nil {
return 0, err
}
switch curve := EdDSACurve(u); curve {
case CurveEd25519, CurveEd448:
return curve, nil
default:
return 0, fmt.Errorf("%w: %x", ErrUnknownEdDSACurve, u)
}
}
var _ Varsig = (*EdDSAVarsig)(nil)
// EdDSAVarsig is a varsig that encodes the parameters required to describe
@@ -95,20 +110,19 @@ func (v EdDSAVarsig) Encode() []byte {
}
func decodeEd25519(r *bytes.Reader, vers Version, disc Discriminator) (Varsig, error) {
curve := uint64(disc)
curve := EdDSACurve(disc)
if vers != Version0 {
u, err := binary.ReadUvarint(r)
var err error
curve, err = decodeEdDSACurve(r)
if err != nil {
return nil, err // TODO: wrap error?
return nil, err
}
curve = u
}
hashAlg, err := binary.ReadUvarint(r)
hashAlg, err := DecodeHashAlgorithm(r)
if err != nil {
return nil, err // TODO: wrap error?
return nil, err
}
v := &EdDSAVarsig{
@@ -116,8 +130,8 @@ func decodeEd25519(r *bytes.Reader, vers Version, disc Discriminator) (Varsig, e
vers: vers,
disc: disc,
},
curve: EdDSACurve(curve),
hashAlg: HashAlgorithm(hashAlg),
curve: curve,
hashAlg: hashAlg,
}
return v.decodePayEncAndSig(r, v, ed25519.PrivateKeySize)

View File

@@ -34,6 +34,10 @@ var ErrUnsupportedPayloadEncoding = errors.New("unsupported payload encoding")
// parsing function for the decoded signing algorithm.
var ErrUnknownDiscriminator = errors.New("unknown signing algorithm")
// ErrUnknownEdDSACurve is returned when the decoded uvarint isn't either
// CurveEd25519 or CurveEd448.
var ErrUnknownEdDSACurve = errors.New("unknown Edwards curve")
// ErrUnsupportedVersion is returned when an unsupported varsig version
// field is present.
var ErrUnsupportedVersion = errors.New("unsupported version")

2
rsa.go
View File

@@ -87,7 +87,7 @@ func decodeRSA(r *bytes.Reader, vers Version, disc Discriminator) (Varsig, error
vers: vers,
disc: disc,
},
hashAlg: HashAlgorithm(hashAlg),
hashAlg: hashAlg,
sigLen: sigLen,
}