diff --git a/src/crypto/rsa/pss.go b/src/crypto/rsa/pss.go index b2adbedb28..814522de81 100644 --- a/src/crypto/rsa/pss.go +++ b/src/crypto/rsa/pss.go @@ -269,7 +269,7 @@ func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, saltLength := opts.saltLength() switch saltLength { case PSSSaltLengthAuto: - saltLength = priv.Size() - 2 - hash.Size() + saltLength = (priv.N.BitLen()-1+7)/8 - 2 - hash.Size() case PSSSaltLengthEqualsHash: saltLength = hash.Size() } diff --git a/src/crypto/rsa/pss_test.go b/src/crypto/rsa/pss_test.go index dfa8d8bb5a..c3a6d46849 100644 --- a/src/crypto/rsa/pss_test.go +++ b/src/crypto/rsa/pss_test.go @@ -12,7 +12,7 @@ import ( _ "crypto/md5" "crypto/rand" "crypto/sha1" - _ "crypto/sha256" + "crypto/sha256" "encoding/hex" "math/big" "os" @@ -233,6 +233,24 @@ func TestPSSSigning(t *testing.T) { } } +func TestSignWithPSSSaltLengthAuto(t *testing.T) { + key, err := GenerateKey(rand.Reader, 513) + if err != nil { + t.Fatal(err) + } + digest := sha256.Sum256([]byte("message")) + signature, err := key.Sign(rand.Reader, digest[:], &PSSOptions{ + SaltLength: PSSSaltLengthAuto, + Hash: crypto.SHA256, + }) + if err != nil { + t.Fatal(err) + } + if len(signature) == 0 { + t.Fatal("empty signature returned") + } +} + func bigFromHex(hex string) *big.Int { n, ok := new(big.Int).SetString(hex, 16) if !ok {