From 1ea0400c464c7efa24b2eddbba4a1f72dd3405b6 Mon Sep 17 00:00:00 2001 From: shadow3x3x3 Date: Wed, 23 Jul 2025 10:29:52 +0800 Subject: [PATCH] Fix panic when using ed25519 with a key that is not 64 bytes long --- crypto.go | 3 +++ crypto_test.go | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/crypto.go b/crypto.go index 8b3cf02..6a6e6bf 100644 --- a/crypto.go +++ b/crypto.go @@ -190,6 +190,9 @@ func (s Signer) sign(buff []byte) ([]byte, error) { return ecdsaSignRaw(rand.Reader, &key, hashed[:]) case "ed25519": key := s.key.(ed25519.PrivateKey) + if len(key) != ed25519.PrivateKeySize { + return nil, fmt.Errorf("key must be %d bytes long", ed25519.PrivateKeySize) + } return ed25519.Sign(key, buff), nil default: return nil, fmt.Errorf("sign: unknown algorithm \"%s\"", s.alg) diff --git a/crypto_test.go b/crypto_test.go index 98492c9..cb15049 100644 --- a/crypto_test.go +++ b/crypto_test.go @@ -1,6 +1,7 @@ package httpsign import ( + "crypto/ed25519" "crypto/rand" "crypto/rsa" "github.com/lestrrat-go/jwx/v2/jwa" @@ -100,6 +101,18 @@ func TestSigner_sign(t *testing.T) { want: nil, wantErr: true, }, + { + name: "ed25519 key not 64 bytes", + fields: fields{ + key: ed25519.PrivateKey(strings.Repeat("a", 63)), + alg: "ed25519", + }, + args: args{ + buff: []byte("abc"), + }, + want: nil, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {