Source file
src/crypto/tls/auth_test.go
1
2
3
4
5 package tls
6
7 import (
8 "crypto"
9 "crypto/fips140"
10 "crypto/internal/cryptotest"
11 "crypto/mldsa"
12 "crypto/tls/internal/fips140tls"
13 "internal/testenv"
14 "strconv"
15 "testing"
16 )
17
18 func TestSignatureSelection(t *testing.T) {
19 pkcs1Cert := testRSA2048Cert
20 pkcs1Cert.SupportedSignatureAlgorithms = []SignatureScheme{PKCS1WithSHA1, PKCS1WithSHA256}
21
22 tests := []struct {
23 cert Certificate
24 peerSigAlgs []SignatureScheme
25 tlsVersion uint16
26 godebug string
27
28 expectedSigAlg SignatureScheme
29 expectedSigType uint8
30 expectedHash crypto.Hash
31 }{
32 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA1, PKCS1WithSHA256}, VersionTLS12, "", PKCS1WithSHA256, signaturePKCS1v15, crypto.SHA256},
33 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA1, PKCS1WithSHA256}, VersionTLS12, "tlssha1=1", PKCS1WithSHA1, signaturePKCS1v15, crypto.SHA1},
34 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA512, PKCS1WithSHA1}, VersionTLS12, "", PKCS1WithSHA512, signaturePKCS1v15, crypto.SHA512},
35 {testRSA2048Cert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS12, "", PSSWithSHA256, signatureRSAPSS, crypto.SHA256},
36 {pkcs1Cert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS12, "", PKCS1WithSHA256, signaturePKCS1v15, crypto.SHA256},
37 {testRSA2048Cert, []SignatureScheme{PSSWithSHA384, PKCS1WithSHA1}, VersionTLS13, "", PSSWithSHA384, signatureRSAPSS, crypto.SHA384},
38 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA1, PSSWithSHA384}, VersionTLS13, "", PSSWithSHA384, signatureRSAPSS, crypto.SHA384},
39 {testECDSAP256Cert, []SignatureScheme{ECDSAWithSHA1, ECDSAWithP256AndSHA256}, VersionTLS12, "", ECDSAWithP256AndSHA256, signatureECDSA, crypto.SHA256},
40 {testECDSAP256Cert, []SignatureScheme{ECDSAWithSHA1}, VersionTLS12, "tlssha1=1", ECDSAWithSHA1, signatureECDSA, crypto.SHA1},
41 {testECDSAP256Cert, []SignatureScheme{ECDSAWithP256AndSHA256}, VersionTLS12, "", ECDSAWithP256AndSHA256, signatureECDSA, crypto.SHA256},
42 {testECDSAP256Cert, []SignatureScheme{ECDSAWithP256AndSHA256}, VersionTLS13, "", ECDSAWithP256AndSHA256, signatureECDSA, crypto.SHA256},
43 {testEd25519Cert, []SignatureScheme{Ed25519}, VersionTLS12, "", Ed25519, signatureEd25519, directSigning},
44 {testEd25519Cert, []SignatureScheme{Ed25519}, VersionTLS13, "", Ed25519, signatureEd25519, directSigning},
45 {testMLDSA44Cert, []SignatureScheme{MLDSA44}, VersionTLS13, "", MLDSA44, signatureMLDSA, directSigning},
46 {testMLDSA65Cert, []SignatureScheme{MLDSA65}, VersionTLS13, "", MLDSA65, signatureMLDSA, directSigning},
47 {testMLDSA87Cert, []SignatureScheme{MLDSA87}, VersionTLS13, "", MLDSA87, signatureMLDSA, directSigning},
48
49
50 {testRSA2048Cert, nil, VersionTLS12, "tlssha1=1", PKCS1WithSHA1, signaturePKCS1v15, crypto.SHA1},
51 {testECDSAP256Cert, nil, VersionTLS12, "tlssha1=1", ECDSAWithSHA1, signatureECDSA, crypto.SHA1},
52
53
54 {testECDSAP256Cert, []SignatureScheme{ECDSAWithP384AndSHA384}, VersionTLS12, "", ECDSAWithP384AndSHA384, signatureECDSA, crypto.SHA384},
55 }
56
57 for testNo, test := range tests {
58 t.Run(strconv.Itoa(testNo), func(t *testing.T) {
59 if fips140tls.Required() && test.expectedHash == crypto.SHA1 {
60 t.Skip("skipping test not compatible with TLS FIPS mode")
61 }
62 switch test.expectedSigAlg {
63 case MLDSA44, MLDSA65, MLDSA87:
64 cryptotest.MustMinimumFIPS140ModuleVersion(t, "v1.26.0")
65 }
66 if test.godebug != "" {
67 testenv.SetGODEBUG(t, test.godebug)
68 } else {
69 t.Parallel()
70 }
71
72 sigAlg, err := selectSignatureScheme(test.tlsVersion, &test.cert, test.peerSigAlgs)
73 if err != nil {
74 t.Errorf("unexpected selectSignatureScheme error: %v", err)
75 }
76 if test.expectedSigAlg != sigAlg {
77 t.Errorf("expected signature scheme %v, got %v", test.expectedSigAlg, sigAlg)
78 }
79 sigType, hashFunc, err := typeAndHashFromSignatureScheme(sigAlg)
80 if err != nil {
81 t.Errorf("unexpected typeAndHashFromSignatureScheme error: %v", err)
82 }
83 if test.expectedSigType != sigType {
84 t.Errorf("expected signature algorithm %#x, got %#x", test.expectedSigType, sigType)
85 }
86 if test.expectedHash != hashFunc {
87 t.Errorf("expected hash function %#x, got %#x", test.expectedHash, hashFunc)
88 }
89 })
90 }
91
92 brokenCert := testRSA2048Cert
93 brokenCert.SupportedSignatureAlgorithms = []SignatureScheme{Ed25519}
94
95 badTests := []struct {
96 cert Certificate
97 peerSigAlgs []SignatureScheme
98 tlsVersion uint16
99 }{
100 {testRSA2048Cert, []SignatureScheme{ECDSAWithP256AndSHA256, ECDSAWithSHA1}, VersionTLS12},
101 {testECDSAP256Cert, []SignatureScheme{PKCS1WithSHA256, PKCS1WithSHA1}, VersionTLS12},
102 {testRSA2048Cert, []SignatureScheme{0}, VersionTLS12},
103 {testEd25519Cert, []SignatureScheme{ECDSAWithP256AndSHA256, ECDSAWithSHA1}, VersionTLS12},
104 {testECDSAP256Cert, []SignatureScheme{Ed25519}, VersionTLS12},
105 {brokenCert, []SignatureScheme{Ed25519}, VersionTLS12},
106 {brokenCert, []SignatureScheme{PKCS1WithSHA256}, VersionTLS12},
107
108
109
110 {testEd25519Cert, nil, VersionTLS12},
111
112 {testRSA2048Cert, nil, VersionTLS13},
113 {testECDSAP256Cert, nil, VersionTLS13},
114 {testEd25519Cert, nil, VersionTLS13},
115
116 {testECDSAP256Cert, []SignatureScheme{ECDSAWithP384AndSHA384}, VersionTLS13},
117
118 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA256}, VersionTLS13},
119 {pkcs1Cert, []SignatureScheme{PSSWithSHA256, PKCS1WithSHA256}, VersionTLS13},
120 {testECDSAP256Cert, []SignatureScheme{ECDSAWithSHA1}, VersionTLS13},
121
122 {testRSA1024Cert, []SignatureScheme{PSSWithSHA512}, VersionTLS12},
123
124 {testRSA2048Cert, []SignatureScheme{PKCS1WithSHA1}, VersionTLS12},
125 {testECDSAP256Cert, []SignatureScheme{ECDSAWithSHA1}, VersionTLS12},
126 {testRSA2048Cert, nil, VersionTLS12},
127 {testECDSAP256Cert, nil, VersionTLS12},
128
129 {testMLDSA44Cert, []SignatureScheme{MLDSA44}, VersionTLS12},
130 {testMLDSA65Cert, []SignatureScheme{MLDSA65}, VersionTLS12},
131 {testMLDSA87Cert, []SignatureScheme{MLDSA87}, VersionTLS12},
132
133 {testMLDSA44Cert, []SignatureScheme{MLDSA65}, VersionTLS13},
134 {testMLDSA65Cert, []SignatureScheme{MLDSA87}, VersionTLS13},
135 {testMLDSA87Cert, []SignatureScheme{MLDSA44}, VersionTLS13},
136
137 {testMLDSA44Cert, []SignatureScheme{Ed25519}, VersionTLS13},
138 {testRSA2048Cert, []SignatureScheme{MLDSA44}, VersionTLS13},
139 {testECDSAP256Cert, []SignatureScheme{MLDSA44}, VersionTLS13},
140 }
141
142 for testNo, test := range badTests {
143 sigAlg, err := selectSignatureScheme(test.tlsVersion, &test.cert, test.peerSigAlgs)
144 if err == nil {
145 t.Errorf("test[%d]: unexpected success, got %v", testNo, sigAlg)
146 }
147 }
148 }
149
150 func TestLegacyTypeAndHash(t *testing.T) {
151 sigType, hashFunc, err := legacyTypeAndHashFromPublicKey(testRSA2048Key.Public())
152 if err != nil {
153 t.Errorf("RSA: unexpected error: %v", err)
154 }
155 if expectedSigType := signaturePKCS1v15; expectedSigType != sigType {
156 t.Errorf("RSA: expected signature type %#x, got %#x", expectedSigType, sigType)
157 }
158 if expectedHashFunc := crypto.MD5SHA1; expectedHashFunc != hashFunc {
159 t.Errorf("RSA: expected hash %#x, got %#x", expectedHashFunc, hashFunc)
160 }
161
162 sigType, hashFunc, err = legacyTypeAndHashFromPublicKey(testECDSAP256Key.Public())
163 if err != nil {
164 t.Errorf("ECDSA: unexpected error: %v", err)
165 }
166 if expectedSigType := signatureECDSA; expectedSigType != sigType {
167 t.Errorf("ECDSA: expected signature type %#x, got %#x", expectedSigType, sigType)
168 }
169 if expectedHashFunc := crypto.SHA1; expectedHashFunc != hashFunc {
170 t.Errorf("ECDSA: expected hash %#x, got %#x", expectedHashFunc, hashFunc)
171 }
172
173
174 _, _, err = legacyTypeAndHashFromPublicKey(testEd25519Key.Public())
175 if err == nil {
176 t.Errorf("Ed25519: unexpected success")
177 }
178
179
180
181 if fips140.Version() != "v1.0.0" {
182 for _, key := range []*mldsa.PrivateKey{
183 testMLDSA44Key, testMLDSA65Key, testMLDSA87Key,
184 } {
185 if _, _, err := legacyTypeAndHashFromPublicKey(key.PublicKey()); err == nil {
186 t.Errorf("%s: unexpected success", key.PublicKey().Parameters())
187 }
188 }
189 }
190 }
191
192
193
194 func TestSupportedSignatureAlgorithms(t *testing.T) {
195 for _, sigAlg := range supportedSignatureAlgorithms(VersionTLS12, VersionTLS13) {
196 sigType, hash, err := typeAndHashFromSignatureScheme(sigAlg)
197 if err != nil {
198 t.Errorf("%v: unexpected error: %v", sigAlg, err)
199 }
200 if sigType == 0 {
201 t.Errorf("%v: missing signature type", sigAlg)
202 }
203 if hash == 0 && sigAlg != Ed25519 && sigAlg != MLDSA44 && sigAlg != MLDSA65 && sigAlg != MLDSA87 {
204 t.Errorf("%v: missing hash", sigAlg)
205 }
206 }
207 }
208
View as plain text