@@ -165,25 +165,29 @@ type ecdheKeyAgreement struct {
165165 // and returned in generateClientKeyExchange.
166166 ckx * clientKeyExchangeMsg
167167 preMasterSecret []byte
168+
169+ // curveID and signatureAlgorithm are set by processServerKeyExchange and
170+ // generateServerKeyExchange.
171+ curveID CurveID
172+ signatureAlgorithm SignatureScheme
168173}
169174
170175func (ka * ecdheKeyAgreement ) generateServerKeyExchange (config * Config , cert * Certificate , clientHello * clientHelloMsg , hello * serverHelloMsg ) (* serverKeyExchangeMsg , error ) {
171- var curveID CurveID
172176 for _ , c := range clientHello .supportedCurves {
173177 if config .supportsCurve (ka .version , c ) {
174- curveID = c
178+ ka . curveID = c
175179 break
176180 }
177181 }
178182
179- if curveID == 0 {
183+ if ka . curveID == 0 {
180184 return nil , errors .New ("tls: no supported elliptic curves offered" )
181185 }
182- if _ , ok := curveForCurveID (curveID ); ! ok {
186+ if _ , ok := curveForCurveID (ka . curveID ); ! ok {
183187 return nil , errors .New ("tls: CurvePreferences includes unsupported curve" )
184188 }
185189
186- key , err := generateECDHEKey (config .rand (), curveID )
190+ key , err := generateECDHEKey (config .rand (), ka . curveID )
187191 if err != nil {
188192 return nil , err
189193 }
@@ -193,8 +197,8 @@ func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Cer
193197 ecdhePublic := key .PublicKey ().Bytes ()
194198 serverECDHEParams := make ([]byte , 1 + 2 + 1 + len (ecdhePublic ))
195199 serverECDHEParams [0 ] = 3 // named curve
196- serverECDHEParams [1 ] = byte (curveID >> 8 )
197- serverECDHEParams [2 ] = byte (curveID )
200+ serverECDHEParams [1 ] = byte (ka . curveID >> 8 )
201+ serverECDHEParams [2 ] = byte (ka . curveID )
198202 serverECDHEParams [3 ] = byte (len (ecdhePublic ))
199203 copy (serverECDHEParams [4 :], ecdhePublic )
200204
@@ -203,15 +207,14 @@ func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Cer
203207 return nil , fmt .Errorf ("tls: certificate private key of type %T does not implement crypto.Signer" , cert .PrivateKey )
204208 }
205209
206- var signatureAlgorithm SignatureScheme
207210 var sigType uint8
208211 var sigHash crypto.Hash
209212 if ka .version >= VersionTLS12 {
210- signatureAlgorithm , err = selectSignatureScheme (ka .version , cert , clientHello .supportedSignatureAlgorithms )
213+ ka . signatureAlgorithm , err = selectSignatureScheme (ka .version , cert , clientHello .supportedSignatureAlgorithms )
211214 if err != nil {
212215 return nil , err
213216 }
214- sigType , sigHash , err = typeAndHashFromSignatureScheme (signatureAlgorithm )
217+ sigType , sigHash , err = typeAndHashFromSignatureScheme (ka . signatureAlgorithm )
215218 if err != nil {
216219 return nil , err
217220 }
@@ -245,8 +248,8 @@ func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Cer
245248 copy (skx .key , serverECDHEParams )
246249 k := skx .key [len (serverECDHEParams ):]
247250 if ka .version >= VersionTLS12 {
248- k [0 ] = byte (signatureAlgorithm >> 8 )
249- k [1 ] = byte (signatureAlgorithm )
251+ k [0 ] = byte (ka . signatureAlgorithm >> 8 )
252+ k [1 ] = byte (ka . signatureAlgorithm )
250253 k = k [2 :]
251254 }
252255 k [0 ] = byte (len (sig ) >> 8 )
@@ -280,7 +283,7 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell
280283 if skx .key [0 ] != 3 { // named curve
281284 return errors .New ("tls: server selected unsupported curve" )
282285 }
283- curveID : = CurveID (skx .key [1 ])<< 8 | CurveID (skx .key [2 ])
286+ ka . curveID = CurveID (skx .key [1 ])<< 8 | CurveID (skx .key [2 ])
284287
285288 publicLen := int (skx .key [3 ])
286289 if publicLen + 4 > len (skx .key ) {
@@ -294,15 +297,15 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell
294297 return errServerKeyExchange
295298 }
296299
297- if ! slices .Contains (clientHello .supportedCurves , curveID ) {
300+ if ! slices .Contains (clientHello .supportedCurves , ka . curveID ) {
298301 return errors .New ("tls: server selected unoffered curve" )
299302 }
300303
301- if _ , ok := curveForCurveID (curveID ); ! ok {
304+ if _ , ok := curveForCurveID (ka . curveID ); ! ok {
302305 return errors .New ("tls: server selected unsupported curve" )
303306 }
304307
305- key , err := generateECDHEKey (config .rand (), curveID )
308+ key , err := generateECDHEKey (config .rand (), ka . curveID )
306309 if err != nil {
307310 return err
308311 }
@@ -326,16 +329,16 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell
326329 var sigType uint8
327330 var sigHash crypto.Hash
328331 if ka .version >= VersionTLS12 {
329- signatureAlgorithm : = SignatureScheme (sig [0 ])<< 8 | SignatureScheme (sig [1 ])
332+ ka . signatureAlgorithm = SignatureScheme (sig [0 ])<< 8 | SignatureScheme (sig [1 ])
330333 sig = sig [2 :]
331334 if len (sig ) < 2 {
332335 return errServerKeyExchange
333336 }
334337
335- if ! isSupportedSignatureAlgorithm (signatureAlgorithm , clientHello .supportedSignatureAlgorithms ) {
338+ if ! isSupportedSignatureAlgorithm (ka . signatureAlgorithm , clientHello .supportedSignatureAlgorithms ) {
336339 return errors .New ("tls: certificate used with invalid signature algorithm" )
337340 }
338- sigType , sigHash , err = typeAndHashFromSignatureScheme (signatureAlgorithm )
341+ sigType , sigHash , err = typeAndHashFromSignatureScheme (ka . signatureAlgorithm )
339342 if err != nil {
340343 return err
341344 }
0 commit comments