Source file src/pkg/crypto/tls/auth.go
1
2
3
4
5 package tls
6
7 import (
8 "bytes"
9 "crypto"
10 "crypto/ecdsa"
11 "crypto/ed25519"
12 "crypto/elliptic"
13 "crypto/rsa"
14 "encoding/asn1"
15 "errors"
16 "fmt"
17 "hash"
18 "io"
19 )
20
21
22
23
24
25
26
27
28 func pickSignatureAlgorithm(pubkey crypto.PublicKey, peerSigAlgs, ourSigAlgs []SignatureScheme, tlsVersion uint16) (sigAlg SignatureScheme, sigType uint8, hashFunc crypto.Hash, err error) {
29 if tlsVersion < VersionTLS12 || len(peerSigAlgs) == 0 {
30
31
32
33
34 switch pubkey.(type) {
35 case *rsa.PublicKey:
36 if tlsVersion < VersionTLS12 {
37 return 0, signaturePKCS1v15, crypto.MD5SHA1, nil
38 } else {
39 return PKCS1WithSHA1, signaturePKCS1v15, crypto.SHA1, nil
40 }
41 case *ecdsa.PublicKey:
42 return ECDSAWithSHA1, signatureECDSA, crypto.SHA1, nil
43 case ed25519.PublicKey:
44 if tlsVersion < VersionTLS12 {
45
46
47
48
49 return 0, 0, 0, fmt.Errorf("tls: Ed25519 public keys are not supported before TLS 1.2")
50 }
51 return Ed25519, signatureEd25519, directSigning, nil
52 default:
53 return 0, 0, 0, fmt.Errorf("tls: unsupported public key: %T", pubkey)
54 }
55 }
56 for _, sigAlg := range peerSigAlgs {
57 if !isSupportedSignatureAlgorithm(sigAlg, ourSigAlgs) {
58 continue
59 }
60 hashAlg, err := hashFromSignatureScheme(sigAlg)
61 if err != nil {
62 panic("tls: supported signature algorithm has an unknown hash function")
63 }
64 sigType := signatureFromSignatureScheme(sigAlg)
65 switch pubkey.(type) {
66 case *rsa.PublicKey:
67 if sigType == signaturePKCS1v15 || sigType == signatureRSAPSS {
68 return sigAlg, sigType, hashAlg, nil
69 }
70 case *ecdsa.PublicKey:
71 if sigType == signatureECDSA {
72 return sigAlg, sigType, hashAlg, nil
73 }
74 case ed25519.PublicKey:
75 if sigType == signatureEd25519 {
76 return sigAlg, sigType, hashAlg, nil
77 }
78 default:
79 return 0, 0, 0, fmt.Errorf("tls: unsupported public key: %T", pubkey)
80 }
81 }
82 return 0, 0, 0, errors.New("tls: peer doesn't support any common signature algorithms")
83 }
84
85
86
87 func verifyHandshakeSignature(sigType uint8, pubkey crypto.PublicKey, hashFunc crypto.Hash, signed, sig []byte) error {
88 switch sigType {
89 case signatureECDSA:
90 pubKey, ok := pubkey.(*ecdsa.PublicKey)
91 if !ok {
92 return errors.New("tls: ECDSA signing requires a ECDSA public key")
93 }
94 ecdsaSig := new(ecdsaSignature)
95 if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
96 return err
97 }
98 if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
99 return errors.New("tls: ECDSA signature contained zero or negative values")
100 }
101 if !ecdsa.Verify(pubKey, signed, ecdsaSig.R, ecdsaSig.S) {
102 return errors.New("tls: ECDSA verification failure")
103 }
104 case signatureEd25519:
105 pubKey, ok := pubkey.(ed25519.PublicKey)
106 if !ok {
107 return errors.New("tls: Ed25519 signing requires a Ed25519 public key")
108 }
109 if !ed25519.Verify(pubKey, signed, sig) {
110 return errors.New("tls: Ed25519 verification failure")
111 }
112 case signaturePKCS1v15:
113 pubKey, ok := pubkey.(*rsa.PublicKey)
114 if !ok {
115 return errors.New("tls: RSA signing requires a RSA public key")
116 }
117 if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, signed, sig); err != nil {
118 return err
119 }
120 case signatureRSAPSS:
121 pubKey, ok := pubkey.(*rsa.PublicKey)
122 if !ok {
123 return errors.New("tls: RSA signing requires a RSA public key")
124 }
125 signOpts := &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}
126 if err := rsa.VerifyPSS(pubKey, hashFunc, signed, sig, signOpts); err != nil {
127 return err
128 }
129 default:
130 return errors.New("tls: unknown signature algorithm")
131 }
132 return nil
133 }
134
135 const (
136 serverSignatureContext = "TLS 1.3, server CertificateVerify\x00"
137 clientSignatureContext = "TLS 1.3, client CertificateVerify\x00"
138 )
139
140 var signaturePadding = []byte{
141 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
142 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
143 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
144 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
145 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
146 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
147 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
148 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
149 }
150
151
152
153 func signedMessage(sigHash crypto.Hash, context string, transcript hash.Hash) []byte {
154 if sigHash == directSigning {
155 b := &bytes.Buffer{}
156 b.Write(signaturePadding)
157 io.WriteString(b, context)
158 b.Write(transcript.Sum(nil))
159 return b.Bytes()
160 }
161 h := sigHash.New()
162 h.Write(signaturePadding)
163 io.WriteString(h, context)
164 h.Write(transcript.Sum(nil))
165 return h.Sum(nil)
166 }
167
168
169
170
171
172
173
174 func signatureSchemesForCertificate(version uint16, cert *Certificate) []SignatureScheme {
175 priv, ok := cert.PrivateKey.(crypto.Signer)
176 if !ok {
177 return nil
178 }
179
180 switch pub := priv.Public().(type) {
181 case *ecdsa.PublicKey:
182 if version != VersionTLS13 {
183
184
185 return []SignatureScheme{
186 ECDSAWithP256AndSHA256,
187 ECDSAWithP384AndSHA384,
188 ECDSAWithP521AndSHA512,
189 ECDSAWithSHA1,
190 }
191 }
192 switch pub.Curve {
193 case elliptic.P256():
194 return []SignatureScheme{ECDSAWithP256AndSHA256}
195 case elliptic.P384():
196 return []SignatureScheme{ECDSAWithP384AndSHA384}
197 case elliptic.P521():
198 return []SignatureScheme{ECDSAWithP521AndSHA512}
199 default:
200 return nil
201 }
202 case *rsa.PublicKey:
203 if version != VersionTLS13 {
204 return []SignatureScheme{
205 PKCS1WithSHA256,
206 PKCS1WithSHA384,
207 PKCS1WithSHA512,
208 PKCS1WithSHA1,
209 }
210 }
211 return []SignatureScheme{
212 PSSWithSHA256,
213 PSSWithSHA384,
214 PSSWithSHA512,
215 }
216 case ed25519.PublicKey:
217 return []SignatureScheme{Ed25519}
218 default:
219 return nil
220 }
221 }
222
223
224
225 func unsupportedCertificateError(cert *Certificate) error {
226 switch cert.PrivateKey.(type) {
227 case rsa.PrivateKey, ecdsa.PrivateKey:
228 return fmt.Errorf("tls: unsupported certificate: private key is %T, expected *%T",
229 cert.PrivateKey, cert.PrivateKey)
230 case *ed25519.PrivateKey:
231 return fmt.Errorf("tls: unsupported certificate: private key is *ed25519.PrivateKey, expected ed25519.PrivateKey")
232 }
233
234 signer, ok := cert.PrivateKey.(crypto.Signer)
235 if !ok {
236 return fmt.Errorf("tls: certificate private key (%T) does not implement crypto.Signer",
237 cert.PrivateKey)
238 }
239
240 switch pub := signer.Public().(type) {
241 case *ecdsa.PublicKey:
242 switch pub.Curve {
243 case elliptic.P256():
244 case elliptic.P384():
245 case elliptic.P521():
246 default:
247 return fmt.Errorf("tls: unsupported certificate curve (%s)", pub.Curve.Params().Name)
248 }
249 case *rsa.PublicKey:
250 case ed25519.PublicKey:
251 default:
252 return fmt.Errorf("tls: unsupported certificate key (%T)", pub)
253 }
254
255 return fmt.Errorf("tls: internal error: unsupported key (%T)", cert.PrivateKey)
256 }
257
View as plain text