]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/tls: test key type when casting
authorRoland Shoemaker <roland@golang.org>
Wed, 9 Jun 2021 18:31:27 +0000 (11:31 -0700)
committerFilippo Valsorda <filippo@golang.org>
Mon, 12 Jul 2021 20:58:00 +0000 (20:58 +0000)
When casting the certificate public key in generateClientKeyExchange,
check the type is appropriate. This prevents a panic when a server
agrees to a RSA based key exchange, but then sends an ECDSA (or
other) certificate.

Fixes #47143
Fixes CVE-2021-34558

Thanks to Imre Rad for reporting this issue.

Change-Id: Iabccacca6052769a605cccefa1216a9f7b7f6aea
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1116723
Reviewed-by: Filippo Valsorda <valsorda@google.com>
Reviewed-by: Katie Hockman <katiehockman@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/334031
Trust: Filippo Valsorda <filippo@golang.org>
Run-TryBot: Filippo Valsorda <filippo@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
src/crypto/tls/key_agreement.go

index 8cfbd734f15f22c372a439ee218f3bbb12842a42..c28a64f3a8b8c5a2eeae3f62cee7966cf7b7a4d4 100644 (file)
@@ -86,7 +86,11 @@ func (ka rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello
                return nil, nil, err
        }
 
-       encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), preMasterSecret)
+       rsaKey, ok := cert.PublicKey.(*rsa.PublicKey)
+       if !ok {
+               return nil, nil, errors.New("tls: server certificate contains incorrect key type for selected ciphersuite")
+       }
+       encrypted, err := rsa.EncryptPKCS1v15(config.rand(), rsaKey, preMasterSecret)
        if err != nil {
                return nil, nil, err
        }