ssh: add support for unpadded RSA signatures
The original SSH RFC 4253 explicitly disallows padding. This applies to ssh-rsa signatures. The updated SSH RFC 8332 which defines the SHA2 RSA signature variants explicitly calls out the existence of signers who produce short signatures and specifies that verifiers may allow this behavior. In practice, PuTTY 0.81 and prior versions, as well as SSH.NET prior to 2024.1.0 always generated short signatures. Furthermore, PuTTY is embedded in other software like WinSCP and FileZilla, which are updated on their own schedules as well. This leads to occasional unexplained login errors, when using RSA keys. OpenSSH server allows these short signatures for all RSA algorithms. Fixes golang/go#68286 Change-Id: Ia60ece21bf9c111c490fac0c066443ed5ff7dd29 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/598534 Reviewed-by: Nicola Murino <nicola.murino@gmail.com> Reviewed-by: Roland Shoemaker <roland@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Auto-Submit: Nicola Murino <nicola.murino@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
committed by
Gopher Robot
parent
bb80217080
commit
3375612bf4
@@ -154,6 +154,44 @@ func TestKeySignWithAlgorithmVerify(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestKeySignWithShortSignature(t *testing.T) {
|
||||
signer := testSigners["rsa"].(AlgorithmSigner)
|
||||
pub := signer.PublicKey()
|
||||
// Note: data obtained by empirically trying until a result
|
||||
// starting with 0 appeared
|
||||
tests := []struct {
|
||||
algorithm string
|
||||
data []byte
|
||||
}{
|
||||
{
|
||||
algorithm: KeyAlgoRSA,
|
||||
data: []byte("sign me92"),
|
||||
},
|
||||
{
|
||||
algorithm: KeyAlgoRSASHA256,
|
||||
data: []byte("sign me294"),
|
||||
},
|
||||
{
|
||||
algorithm: KeyAlgoRSASHA512,
|
||||
data: []byte("sign me60"),
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
sig, err := signer.SignWithAlgorithm(rand.Reader, tt.data, tt.algorithm)
|
||||
if err != nil {
|
||||
t.Fatalf("Sign(%T): %v", signer, err)
|
||||
}
|
||||
if sig.Blob[0] != 0 {
|
||||
t.Errorf("%s: Expected signature with a leading 0", tt.algorithm)
|
||||
}
|
||||
sig.Blob = sig.Blob[1:]
|
||||
if err := pub.Verify(tt.data, sig); err != nil {
|
||||
t.Errorf("publicKey.Verify(%s): %v", tt.algorithm, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseRSAPrivateKey(t *testing.T) {
|
||||
key := testPrivateKeys["rsa"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user