Skip to content

Commit e41bc99

Browse files
committed
fix(tls): TLS12 sig and digest
1 parent 68960d5 commit e41bc99

File tree

4 files changed

+55
-25
lines changed

4 files changed

+55
-25
lines changed

tls/cipher_suites.go

+12-11
Original file line numberDiff line numberDiff line change
@@ -555,31 +555,32 @@ func tls10MAC(h hash.Hash, out, seq, header, data, extra []byte) []byte {
555555
}
556556

557557
func rsaKA(version uint16) keyAgreement {
558-
return rsaKeyAgreement{}
559-
}
560-
561-
/* TODO
562-
func rsaEphemeralKA(version uint16) keyAgreement {
563-
return &rsaKeyAgreement{
564-
version: version,
565-
ephemeral: true,
558+
return rsaKeyAgreement{
566559
auth: &signedKeyAgreement{
567560
sigType: signatureRSA,
568561
version: version,
569-
},
570-
}
562+
}}
571563
}
572-
*/
573564

574565
func ecdheECDSAKA(version uint16) keyAgreement {
575566
return &ecdheKeyAgreement{
567+
auth: &signedKeyAgreement{
568+
sigType: signatureECDSA,
569+
version: version,
570+
},
571+
576572
isRSA: false,
577573
version: version,
578574
}
579575
}
580576

581577
func ecdheRSAKA(version uint16) keyAgreement {
582578
return &ecdheKeyAgreement{
579+
auth: &signedKeyAgreement{
580+
sigType: signatureRSA,
581+
version: version,
582+
},
583+
583584
isRSA: true,
584585
version: version,
585586
}

tls/key_agreement.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clie
205205
// rsaKeyAgreement implements the standard TLS key agreement where the client
206206
// encrypts the pre-master secret to the server's public key.
207207
type rsaKeyAgreement struct {
208+
auth keyAgreementAuthentication
208209
verifyError error
209210
}
210211

@@ -381,6 +382,8 @@ func pickTLS12HashForSignature(sigType uint8, clientList, serverList []SigAndHas
381382
// pre-master secret is then calculated using ECDH. The signature may
382383
// be ECDSA, Ed25519 or RSA.
383384
type ecdheKeyAgreement struct {
385+
auth keyAgreementAuthentication
386+
384387
version uint16
385388
isRSA bool
386389
params ecdheParameters
@@ -570,7 +573,21 @@ func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHell
570573
sig = sig[2:]
571574

572575
signed := hashForServerKeyExchange(sigType, sigHash, ka.version, clientHello.random, serverHello.random, serverECDHEParams)
573-
if ka.verifyError = verifyHandshakeSignature(sigType, cert.PublicKey, sigHash, signed, sig); ka.verifyError != nil {
576+
ka.verifyError = verifyHandshakeSignature(sigType, cert.PublicKey, sigHash, signed, sig)
577+
578+
// For logging purposes
579+
skx.digest = signed
580+
switch auth := ka.auth.(type) {
581+
case *signedKeyAgreement:
582+
auth.raw = sig
583+
auth.valid = ka.verifyError == nil
584+
auth.sh.Signature = sigType
585+
auth.sh.Hash = uint8(sigHash)
586+
default:
587+
break
588+
}
589+
590+
if ka.verifyError != nil {
574591
return errors.New("tls: invalid signature by the server certificate: " + ka.verifyError.Error())
575592
}
576593
return nil

tls/tls_handshake.go

+11-13
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ func (c *Certificates) addParsed(certs []*x509.Certificate, validation *x509.Val
434434
func (m *serverKeyExchangeMsg) MakeLog(ka keyAgreement) *ServerKeyExchange {
435435
skx := new(ServerKeyExchange)
436436
skx.Raw = make([]byte, len(m.key))
437-
//var auth keyAgreementAuthentication
437+
var auth keyAgreementAuthentication
438438
var errAuth error
439439
copy(skx.Raw, m.key)
440440
skx.Digest = append(make([]byte, 0), m.digest...)
@@ -443,31 +443,29 @@ func (m *serverKeyExchangeMsg) MakeLog(ka keyAgreement) *ServerKeyExchange {
443443
switch ka := ka.(type) {
444444
case *rsaKeyAgreement:
445445
skx.RSAParams = ka.RSAParams()
446-
//auth = ka.auth
446+
auth = ka.auth
447447
errAuth = ka.verifyError
448448

449449
case *dheKeyAgreement:
450450
skx.DHParams = ka.DHParams()
451-
//auth = ka.auth
451+
auth = ka.auth
452452
errAuth = ka.verifyError
453453

454454
case *ecdheKeyAgreement:
455455
skx.ECDHParams = ka.ECDHParams()
456-
//auth = ka.auth
456+
auth = ka.auth
457457
errAuth = ka.verifyError
458458
default:
459459
break
460460
}
461461

462-
/*
463-
// Write out signature
464-
switch auth := auth.(type) {
465-
case *signedKeyAgreement:
466-
skx.Signature = auth.Signature()
467-
default:
468-
break
469-
}
470-
*/
462+
// Write out signature
463+
switch auth := auth.(type) {
464+
case *signedKeyAgreement:
465+
skx.Signature = auth.Signature()
466+
default:
467+
break
468+
}
471469

472470
// Write the signature validation error
473471
if errAuth != nil {

tls/tls_ka.go

+14
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,20 @@ func signatureTypeToName(sigType uint8) string {
7474
return "unknown." + strconv.Itoa(int(sigType))
7575
}
7676

77+
func (ka *signedKeyAgreement) Signature() *DigitalSignature {
78+
out := DigitalSignature{
79+
Raw: ka.raw,
80+
Type: signatureTypeToName(ka.sigType),
81+
Valid: ka.valid,
82+
Version: TLSVersion(ka.version),
83+
}
84+
if ka.version >= VersionTLS12 {
85+
out.SigHashExtension = new(SignatureAndHash)
86+
*out.SigHashExtension = SignatureAndHash(ka.sh)
87+
}
88+
return &out
89+
}
90+
7791
func (ka *rsaKeyAgreement) RSAParams() *jsonKeys.RSAPublicKey {
7892
out := new(jsonKeys.RSAPublicKey)
7993
//out.PublicKey = ka.publicKey

0 commit comments

Comments
 (0)