Source file src/crypto/tls/auth_test.go

     1  // Copyright 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package tls
     6  
     7  import (
     8  	"crypto"
     9  	"testing"
    10  )
    11  
    12  func TestSignatureSelection(t *testing.T) {
    13  	rsaCert := &Certificate{
    14  		Certificate: [][]byte{testRSACertificate},
    15  		PrivateKey:  testRSAPrivateKey,
    16  	}
    17  	pkcs1Cert := &Certificate{
    18  		Certificate:                  [][]byte{testRSACertificate},
    19  		PrivateKey:                   testRSAPrivateKey,
    20  		SupportedSignatureAlgorithms: []SignatureScheme{PKCS1WithSHA1, PKCS1WithSHA256},
    21  	}
    22  	ecdsaCert := &Certificate{
    23  		Certificate: [][]byte{testP256Certificate},
    24  		PrivateKey:  testP256PrivateKey,
    25  	}
    26  	ed25519Cert := &Certificate{
    27  		Certificate: [][]byte{testEd25519Certificate},
    28  		PrivateKey:  testEd25519PrivateKey,
    29  	}
    30  
    31  	tests := []struct {
    32  		cert        *Certificate
    33  		peerSigAlgs []SignatureScheme
    34  		tlsVersion  uint16
    35  
    36  		expectedSigAlg  SignatureScheme
    37  		expectedSigType uint8
    38  		expectedHash    crypto.Hash
    39  	}{
    40  		{rsaCert, []SignatureScheme{PKCS1WithSHA1, PKCS1WithSHA256}, VersionTLS12, PKCS1WithSHA1, signaturePKCS1v15, crypto.SHA1},
    41  		{rsaCert, []SignatureScheme{PKCS1WithSHA512, PKCS1WithSHA1}, VersionTLS12, PKCS1WithSHA512, signaturePKCS1v15, crypto.SHA512},
    42  		{rsaCert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS12, PSSWithSHA256, signatureRSAPSS, crypto.SHA256},
    43  		{pkcs1Cert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS12, PKCS1WithSHA256, signaturePKCS1v15, crypto.SHA256},
    44  		{rsaCert, []SignatureScheme{PSSWithSHA384, PKCS1WithSHA1}, VersionTLS13, PSSWithSHA384, signatureRSAPSS, crypto.SHA384},
    45  		{ecdsaCert, []SignatureScheme{ECDSAWithSHA1}, VersionTLS12, ECDSAWithSHA1, signatureECDSA, crypto.SHA1},
    46  		{ecdsaCert, []SignatureScheme{ECDSAWithP256AndSHA256}, VersionTLS12, ECDSAWithP256AndSHA256, signatureECDSA, crypto.SHA256},
    47  		{ecdsaCert, []SignatureScheme{ECDSAWithP256AndSHA256}, VersionTLS13, ECDSAWithP256AndSHA256, signatureECDSA, crypto.SHA256},
    48  		{ed25519Cert, []SignatureScheme{Ed25519}, VersionTLS12, Ed25519, signatureEd25519, directSigning},
    49  		{ed25519Cert, []SignatureScheme{Ed25519}, VersionTLS13, Ed25519, signatureEd25519, directSigning},
    50  
    51  		// TLS 1.2 without signature_algorithms extension
    52  		{rsaCert, nil, VersionTLS12, PKCS1WithSHA1, signaturePKCS1v15, crypto.SHA1},
    53  		{ecdsaCert, nil, VersionTLS12, ECDSAWithSHA1, signatureECDSA, crypto.SHA1},
    54  
    55  		// TLS 1.2 does not restrict the ECDSA curve (our ecdsaCert is P-256)
    56  		{ecdsaCert, []SignatureScheme{ECDSAWithP384AndSHA384}, VersionTLS12, ECDSAWithP384AndSHA384, signatureECDSA, crypto.SHA384},
    57  	}
    58  
    59  	for testNo, test := range tests {
    60  		sigAlg, err := selectSignatureScheme(test.tlsVersion, test.cert, test.peerSigAlgs)
    61  		if err != nil {
    62  			t.Errorf("test[%d]: unexpected selectSignatureScheme error: %v", testNo, err)
    63  		}
    64  		if test.expectedSigAlg != sigAlg {
    65  			t.Errorf("test[%d]: expected signature scheme %v, got %v", testNo, test.expectedSigAlg, sigAlg)
    66  		}
    67  		sigType, hashFunc, err := typeAndHashFromSignatureScheme(sigAlg)
    68  		if err != nil {
    69  			t.Errorf("test[%d]: unexpected typeAndHashFromSignatureScheme error: %v", testNo, err)
    70  		}
    71  		if test.expectedSigType != sigType {
    72  			t.Errorf("test[%d]: expected signature algorithm %#x, got %#x", testNo, test.expectedSigType, sigType)
    73  		}
    74  		if test.expectedHash != hashFunc {
    75  			t.Errorf("test[%d]: expected hash function %#x, got %#x", testNo, test.expectedHash, hashFunc)
    76  		}
    77  	}
    78  
    79  	brokenCert := &Certificate{
    80  		Certificate:                  [][]byte{testRSACertificate},
    81  		PrivateKey:                   testRSAPrivateKey,
    82  		SupportedSignatureAlgorithms: []SignatureScheme{Ed25519},
    83  	}
    84  
    85  	badTests := []struct {
    86  		cert        *Certificate
    87  		peerSigAlgs []SignatureScheme
    88  		tlsVersion  uint16
    89  	}{
    90  		{rsaCert, []SignatureScheme{ECDSAWithP256AndSHA256, ECDSAWithSHA1}, VersionTLS12},
    91  		{ecdsaCert, []SignatureScheme{PKCS1WithSHA256, PKCS1WithSHA1}, VersionTLS12},
    92  		{rsaCert, []SignatureScheme{0}, VersionTLS12},
    93  		{ed25519Cert, []SignatureScheme{ECDSAWithP256AndSHA256, ECDSAWithSHA1}, VersionTLS12},
    94  		{ecdsaCert, []SignatureScheme{Ed25519}, VersionTLS12},
    95  		{brokenCert, []SignatureScheme{Ed25519}, VersionTLS12},
    96  		{brokenCert, []SignatureScheme{PKCS1WithSHA256}, VersionTLS12},
    97  		// RFC 5246, Section 7.4.1.4.1, says to only consider {sha1,ecdsa} as
    98  		// default when the extension is missing, and RFC 8422 does not update
    99  		// it. Anyway, if a stack supports Ed25519 it better support sigalgs.
   100  		{ed25519Cert, nil, VersionTLS12},
   101  		// TLS 1.3 has no default signature_algorithms.
   102  		{rsaCert, nil, VersionTLS13},
   103  		{ecdsaCert, nil, VersionTLS13},
   104  		{ed25519Cert, nil, VersionTLS13},
   105  		// Wrong curve, which TLS 1.3 checks
   106  		{ecdsaCert, []SignatureScheme{ECDSAWithP384AndSHA384}, VersionTLS13},
   107  		// TLS 1.3 does not support PKCS1v1.5 or SHA-1.
   108  		{rsaCert, []SignatureScheme{PKCS1WithSHA256}, VersionTLS13},
   109  		{pkcs1Cert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS13},
   110  		{ecdsaCert, []SignatureScheme{ECDSAWithSHA1}, VersionTLS13},
   111  		// The key can be too small for the hash.
   112  		{rsaCert, []SignatureScheme{PSSWithSHA512}, VersionTLS12},
   113  	}
   114  
   115  	for testNo, test := range badTests {
   116  		sigAlg, err := selectSignatureScheme(test.tlsVersion, test.cert, test.peerSigAlgs)
   117  		if err == nil {
   118  			t.Errorf("test[%d]: unexpected success, got %v", testNo, sigAlg)
   119  		}
   120  	}
   121  }
   122  
   123  func TestLegacyTypeAndHash(t *testing.T) {
   124  	sigType, hashFunc, err := legacyTypeAndHashFromPublicKey(testRSAPrivateKey.Public())
   125  	if err != nil {
   126  		t.Errorf("RSA: unexpected error: %v", err)
   127  	}
   128  	if expectedSigType := signaturePKCS1v15; expectedSigType != sigType {
   129  		t.Errorf("RSA: expected signature type %#x, got %#x", expectedSigType, sigType)
   130  	}
   131  	if expectedHashFunc := crypto.MD5SHA1; expectedHashFunc != hashFunc {
   132  		t.Errorf("RSA: expected hash %#x, got %#x", expectedHashFunc, hashFunc)
   133  	}
   134  
   135  	sigType, hashFunc, err = legacyTypeAndHashFromPublicKey(testECDSAPrivateKey.Public())
   136  	if err != nil {
   137  		t.Errorf("ECDSA: unexpected error: %v", err)
   138  	}
   139  	if expectedSigType := signatureECDSA; expectedSigType != sigType {
   140  		t.Errorf("ECDSA: expected signature type %#x, got %#x", expectedSigType, sigType)
   141  	}
   142  	if expectedHashFunc := crypto.SHA1; expectedHashFunc != hashFunc {
   143  		t.Errorf("ECDSA: expected hash %#x, got %#x", expectedHashFunc, hashFunc)
   144  	}
   145  
   146  	// Ed25519 is not supported by TLS 1.0 and 1.1.
   147  	_, _, err = legacyTypeAndHashFromPublicKey(testEd25519PrivateKey.Public())
   148  	if err == nil {
   149  		t.Errorf("Ed25519: unexpected success")
   150  	}
   151  }
   152  
   153  // TestSupportedSignatureAlgorithms checks that all supportedSignatureAlgorithms
   154  // have valid type and hash information.
   155  func TestSupportedSignatureAlgorithms(t *testing.T) {
   156  	for _, sigAlg := range supportedSignatureAlgorithms() {
   157  		sigType, hash, err := typeAndHashFromSignatureScheme(sigAlg)
   158  		if err != nil {
   159  			t.Errorf("%v: unexpected error: %v", sigAlg, err)
   160  		}
   161  		if sigType == 0 {
   162  			t.Errorf("%v: missing signature type", sigAlg)
   163  		}
   164  		if hash == 0 && sigAlg != Ed25519 {
   165  			t.Errorf("%v: missing hash", sigAlg)
   166  		}
   167  	}
   168  }
   169  

View as plain text