@@ -388,20 +388,25 @@ func (c *commImpl) authenticateRemotePeer(stream stream) (common.PKIidType, erro
388
388
ctx := stream .Context ()
389
389
remoteAddress := extractRemoteAddress (stream )
390
390
remoteCertHash := extractCertificateHashFromContext (ctx )
391
- var sig []byte
392
391
var err error
392
+ var cMsg * proto.GossipMessage
393
+ var signer proto.Signer
393
394
394
395
// If TLS is detected, sign the hash of our cert to bind our TLS cert
395
396
// to the gRPC session
396
397
if remoteCertHash != nil && c .selfCertHash != nil {
397
- sig , err = c .idMapper .Sign (c .selfCertHash )
398
- if err != nil {
399
- c .logger .Error ("Failed signing self certificate hash:" , err )
400
- return nil , err
398
+ signer = func (msg []byte ) ([]byte , error ) {
399
+ return c .idMapper .Sign (msg )
400
+ }
401
+ } else { // If we don't use TLS, we have no unique text to sign,
402
+ // so don't sign anything
403
+ signer = func (msg []byte ) ([]byte , error ) {
404
+ return msg , nil
401
405
}
402
406
}
403
407
404
- cMsg := createConnectionMsg (c .PKIID , sig , c .peerIdentity )
408
+ cMsg = createConnectionMsg (c .PKIID , c .selfCertHash , c .peerIdentity , signer )
409
+
405
410
c .logger .Debug ("Sending" , cMsg , "to" , remoteAddress )
406
411
stream .Send (cMsg )
407
412
m := readWithTimeout (stream , defConnTimeout )
@@ -433,7 +438,14 @@ func (c *commImpl) authenticateRemotePeer(stream stream) (common.PKIidType, erro
433
438
434
439
// if TLS is detected, verify remote peer
435
440
if remoteCertHash != nil && c .selfCertHash != nil {
436
- err = c .idMapper .Verify (receivedMsg .PkiID , receivedMsg .Sig , remoteCertHash )
441
+ if ! bytes .Equal (remoteCertHash , receivedMsg .Hash ) {
442
+ return nil , fmt .Errorf ("Expected %v in remote hash, but got %v" , remoteCertHash , receivedMsg .Hash )
443
+ }
444
+ verifier := func (peerIdentity []byte , signature , message []byte ) error {
445
+ pkiID := c .idMapper .GetPKIidOfCert (api .PeerIdentityType (peerIdentity ))
446
+ return c .idMapper .Verify (pkiID , signature , message )
447
+ }
448
+ err = m .Verify (receivedMsg .Cert , verifier )
437
449
if err != nil {
438
450
c .logger .Error ("Failed verifying signature from" , remoteAddress , ":" , err )
439
451
return nil , err
@@ -516,18 +528,20 @@ func readWithTimeout(stream interface{}, timeout time.Duration) *proto.GossipMes
516
528
}
517
529
}
518
530
519
- func createConnectionMsg (pkiID common.PKIidType , sig []byte , cert api.PeerIdentityType ) * proto.GossipMessage {
520
- return & proto.GossipMessage {
531
+ func createConnectionMsg (pkiID common.PKIidType , hash []byte , cert api.PeerIdentityType , signer proto. Signer ) * proto.GossipMessage {
532
+ m := & proto.GossipMessage {
521
533
Tag : proto .GossipMessage_EMPTY ,
522
534
Nonce : 0 ,
523
535
Content : & proto.GossipMessage_Conn {
524
536
Conn : & proto.ConnEstablish {
537
+ Hash : hash ,
525
538
Cert : cert ,
526
539
PkiID : pkiID ,
527
- Sig : sig ,
528
540
},
529
541
},
530
542
}
543
+ m .Sign (signer )
544
+ return m
531
545
}
532
546
533
547
type stream interface {
0 commit comments