ssh: fix RSA certificate and public key authentication with older clients
After adding support for rsa-sha2-256/512 on the server side some edge cases started to arise with old clients: 1) public key authentication with gpg-agent < 2.2.6 fails because we receive ssh-rsa as signature format and rsa-sha2-256 or rsa-sha2-512 as algorithm. This is a bug in gpg-agent fixed in this commit: https://github.com/gpg/gnupg/commit/80b775bdbb852aa4a80292c9357e5b1876110c00 2) certificate authentication fails with OpenSSH 7.2-7.7 because we receive ssh-rsa-cert-v01@openssh.com as algorithm and rsa-sha2-256 or rsa-sha2-512 as signature format. This patch is based on CL 412854 and has been tested with every version of OpenSSH from 7.1 to 7.9 and OpenSSH 9.3. Fixes golang/go#53391 Change-Id: Id71f596f73d84efb5c76d6d5388432cccad3e3b1 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/506835 Auto-Submit: Filippo Valsorda <filippo@golang.org> Reviewed-by: Filippo Valsorda <filippo@golang.org> Run-TryBot: Filippo Valsorda <filippo@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Roland Shoemaker <roland@golang.org>
This commit is contained in:
committed by
Gopher Robot
parent
23b1b90df2
commit
64e0e99383
@@ -955,3 +955,124 @@ func TestAuthMethodGSSAPIWithMIC(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCompatibleAlgoAndSignatures(t *testing.T) {
|
||||
type testcase struct {
|
||||
algo string
|
||||
sigFormat string
|
||||
compatible bool
|
||||
}
|
||||
testcases := []*testcase{
|
||||
{
|
||||
KeyAlgoRSA,
|
||||
KeyAlgoRSA,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSA,
|
||||
KeyAlgoRSASHA256,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSA,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSASHA256,
|
||||
KeyAlgoRSA,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSASHA512,
|
||||
KeyAlgoRSA,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSASHA512,
|
||||
KeyAlgoRSASHA256,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSASHA256,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoRSASHA512,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSAv01,
|
||||
KeyAlgoRSA,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSAv01,
|
||||
KeyAlgoRSASHA256,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSAv01,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSASHA256v01,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSASHA512v01,
|
||||
KeyAlgoRSASHA512,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSASHA512v01,
|
||||
KeyAlgoRSASHA256,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSASHA256v01,
|
||||
CertAlgoRSAv01,
|
||||
true,
|
||||
},
|
||||
{
|
||||
CertAlgoRSAv01,
|
||||
CertAlgoRSASHA512v01,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoECDSA256,
|
||||
KeyAlgoRSA,
|
||||
false,
|
||||
},
|
||||
{
|
||||
KeyAlgoECDSA256,
|
||||
KeyAlgoECDSA521,
|
||||
false,
|
||||
},
|
||||
{
|
||||
KeyAlgoECDSA256,
|
||||
KeyAlgoECDSA256,
|
||||
true,
|
||||
},
|
||||
{
|
||||
KeyAlgoECDSA256,
|
||||
KeyAlgoED25519,
|
||||
false,
|
||||
},
|
||||
{
|
||||
KeyAlgoED25519,
|
||||
KeyAlgoED25519,
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, c := range testcases {
|
||||
if isAlgoCompatible(c.algo, c.sigFormat) != c.compatible {
|
||||
t.Errorf("algorithm %q, signature format %q, expected compatible to be %t", c.algo, c.sigFormat, c.compatible)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user