MCPcopy Create free account
hub / github.com/XTLS/Go / generateServerKeyExchange

Method generateServerKeyExchange

key_agreement.go:168–255  ·  view source on GitHub ↗
(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg)

Source from the content-addressed store, hash-verified

166}
167
168func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
169 var curveID CurveID
170 for _, c := range clientHello.supportedCurves {
171 if config.supportsCurve(c) {
172 curveID = c
173 break
174 }
175 }
176
177 if curveID == 0 {
178 return nil, errors.New("tls: no supported elliptic curves offered")
179 }
180 if _, ok := curveForCurveID(curveID); curveID != X25519 && !ok {
181 return nil, errors.New("tls: CurvePreferences includes unsupported curve")
182 }
183
184 params, err := generateECDHEParameters(config.rand(), curveID)
185 if err != nil {
186 return nil, err
187 }
188 ka.params = params
189
190 // See RFC 4492, Section 5.4.
191 ecdhePublic := params.PublicKey()
192 serverECDHEParams := make([]byte, 1+2+1+len(ecdhePublic))
193 serverECDHEParams[0] = 3 // named curve
194 serverECDHEParams[1] = byte(curveID >> 8)
195 serverECDHEParams[2] = byte(curveID)
196 serverECDHEParams[3] = byte(len(ecdhePublic))
197 copy(serverECDHEParams[4:], ecdhePublic)
198
199 priv, ok := cert.PrivateKey.(crypto.Signer)
200 if !ok {
201 return nil, fmt.Errorf("tls: certificate private key of type %T does not implement crypto.Signer", cert.PrivateKey)
202 }
203
204 var signatureAlgorithm SignatureScheme
205 var sigType uint8
206 var sigHash crypto.Hash
207 if ka.version >= VersionTLS12 {
208 signatureAlgorithm, err = selectSignatureScheme(ka.version, cert, clientHello.supportedSignatureAlgorithms)
209 if err != nil {
210 return nil, err
211 }
212 sigType, sigHash, err = typeAndHashFromSignatureScheme(signatureAlgorithm)
213 if err != nil {
214 return nil, err
215 }
216 } else {
217 sigType, sigHash, err = legacyTypeAndHashFromPublicKey(priv.Public())
218 if err != nil {
219 return nil, err
220 }
221 }
222 if (sigType == signaturePKCS1v15 || sigType == signatureRSAPSS) != ka.isRSA {
223 return nil, errors.New("tls: certificate cannot be used with the selected cipher suite")
224 }
225

Callers

nothing calls this directly

Calls 10

curveForCurveIDFunction · 0.85
generateECDHEParametersFunction · 0.85
selectSignatureSchemeFunction · 0.85
hashForServerKeyExchangeFunction · 0.85
supportsCurveMethod · 0.80
randMethod · 0.80
PublicKeyMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected