@@ -726,8 +726,6 @@ func TestPeerCertificateExchange(t *testing.T) {
726726
727727// TestPeerMultiDeviceAuthentication tests Alice talking to Bob across two devices
728728func TestPeerMultiDeviceAuthentication (t * testing.T ) {
729- t .Skip ("Skipping multi-device test until transport issues are resolved" )
730-
731729 // Create wallets and transports
732730 alicePk , err := ec .NewPrivateKey ()
733731 require .NoError (t , err )
@@ -779,21 +777,37 @@ func TestPeerMultiDeviceAuthentication(t *testing.T) {
779777 return & wallet.DecryptResult {Plaintext : []byte ("decrypted" )}, nil
780778 }
781779
780+ // Create Bob's key and wallets (separate instances for each connection)
782781 bobPk , err := ec .NewPrivateKey ()
783782 require .NoError (t , err )
784- bobWallet := wallet .NewMockWallet (t )
785- bobWallet .MockGetPublicKey = func (ctx context.Context , args wallet.GetPublicKeyArgs , originator string ) (* wallet.GetPublicKeyResult , error ) {
783+
784+ // Bob wallet for first device connection
785+ bobWallet1 := wallet .NewMockWallet (t )
786+ bobWallet1 .MockGetPublicKey = func (ctx context.Context , args wallet.GetPublicKeyArgs , originator string ) (* wallet.GetPublicKeyResult , error ) {
787+ return & wallet.GetPublicKeyResult {PublicKey : bobPk .PubKey ()}, nil
788+ }
789+
790+ // Bob wallet for second device connection
791+ bobWallet2 := wallet .NewMockWallet (t )
792+ bobWallet2 .MockGetPublicKey = func (ctx context.Context , args wallet.GetPublicKeyArgs , originator string ) (* wallet.GetPublicKeyResult , error ) {
786793 return & wallet.GetPublicKeyResult {PublicKey : bobPk .PubKey ()}, nil
787794 }
788795
789796 // Setup Bob's crypto operations
790797 dummyBobSig , err := bobPk .Sign ([]byte ("test" ))
791798 require .NoError (t , err )
792799
793- bobWallet .MockCreateSignature = func (ctx context.Context , args wallet.CreateSignatureArgs , originator string ) (* wallet.CreateSignatureResult , error ) {
800+ bobWallet1 .MockCreateSignature = func (ctx context.Context , args wallet.CreateSignatureArgs , originator string ) (* wallet.CreateSignatureResult , error ) {
794801 return & wallet.CreateSignatureResult {Signature : * dummyBobSig }, nil
795802 }
796- bobWallet .MockVerifySignature = func (ctx context.Context , args wallet.VerifySignatureArgs , originator string ) (* wallet.VerifySignatureResult , error ) {
803+ bobWallet1 .MockVerifySignature = func (ctx context.Context , args wallet.VerifySignatureArgs , originator string ) (* wallet.VerifySignatureResult , error ) {
804+ return & wallet.VerifySignatureResult {Valid : true }, nil
805+ }
806+
807+ bobWallet2 .MockCreateSignature = func (ctx context.Context , args wallet.CreateSignatureArgs , originator string ) (* wallet.CreateSignatureResult , error ) {
808+ return & wallet.CreateSignatureResult {Signature : * dummyBobSig }, nil
809+ }
810+ bobWallet2 .MockVerifySignature = func (ctx context.Context , args wallet.VerifySignatureArgs , originator string ) (* wallet.VerifySignatureResult , error ) {
797811 return & wallet.VerifySignatureResult {Valid : true }, nil
798812 }
799813
@@ -802,19 +816,29 @@ func TestPeerMultiDeviceAuthentication(t *testing.T) {
802816 hmacBytes2 [i ] = byte (i )
803817 }
804818
805- bobWallet .MockCreateHmac = func (ctx context.Context , args wallet.CreateHmacArgs , originator string ) (* wallet.CreateHmacResult , error ) {
819+ bobWallet1 .MockCreateHmac = func (ctx context.Context , args wallet.CreateHmacArgs , originator string ) (* wallet.CreateHmacResult , error ) {
806820 return & wallet.CreateHmacResult {Hmac : hmacBytes2 }, nil
807821 }
808- bobWallet .MockDecrypt = func (ctx context.Context , args wallet.DecryptArgs , originator string ) (* wallet.DecryptResult , error ) {
822+ bobWallet1 .MockDecrypt = func (ctx context.Context , args wallet.DecryptArgs , originator string ) (* wallet.DecryptResult , error ) {
823+ return & wallet.DecryptResult {Plaintext : []byte ("decrypted" )}, nil
824+ }
825+
826+ bobWallet2 .MockCreateHmac = func (ctx context.Context , args wallet.CreateHmacArgs , originator string ) (* wallet.CreateHmacResult , error ) {
827+ return & wallet.CreateHmacResult {Hmac : hmacBytes2 }, nil
828+ }
829+ bobWallet2 .MockDecrypt = func (ctx context.Context , args wallet.DecryptArgs , originator string ) (* wallet.DecryptResult , error ) {
809830 return & wallet.DecryptResult {Plaintext : []byte ("decrypted" )}, nil
810831 }
811832
833+ // Create separate transport pairs for each connection
812834 aliceTransport1 := NewMockTransport ()
813835 aliceTransport2 := NewMockTransport ()
814- bobTransport := NewMockTransport ()
836+ bobTransport1 := NewMockTransport ()
837+ bobTransport2 := NewMockTransport ()
815838
816- // Connect transports
817- PairTransports (aliceTransport1 , bobTransport )
839+ // Connect transports: Alice device 1 <-> Bob instance 1, Alice device 2 <-> Bob instance 2
840+ PairTransports (aliceTransport1 , bobTransport1 )
841+ PairTransports (aliceTransport2 , bobTransport2 )
818842
819843 // Create peers
820844 aliceFirstDevice := NewPeer (& PeerOptions {
@@ -827,15 +851,21 @@ func TestPeerMultiDeviceAuthentication(t *testing.T) {
827851 Transport : aliceTransport2 ,
828852 })
829853
830- bob := NewPeer (& PeerOptions {
831- Wallet : bobWallet ,
832- Transport : bobTransport ,
854+ bob1 := NewPeer (& PeerOptions {
855+ Wallet : bobWallet1 ,
856+ Transport : bobTransport1 ,
857+ })
858+
859+ bob2 := NewPeer (& PeerOptions {
860+ Wallet : bobWallet2 ,
861+ Transport : bobTransport2 ,
833862 })
834863
835864 // Setup message tracking
836865 aliceDevice1Received := make (chan bool , 2 ) // May receive multiple messages
837866 aliceDevice2Received := make (chan bool , 1 )
838- bobReceived := make (chan bool , 3 ) // Will receive multiple messages
867+ bob1Received := make (chan bool , 3 ) // Will receive multiple messages
868+ bob2Received := make (chan bool , 3 ) // Will receive multiple messages
839869 ctx := t .Context ()
840870
841871 aliceFirstDevice .ListenForGeneralMessages (func (senderPublicKey * ec.PublicKey , payload []byte ) error {
@@ -848,27 +878,37 @@ func TestPeerMultiDeviceAuthentication(t *testing.T) {
848878 return nil
849879 })
850880
851- bob .ListenForGeneralMessages (func (senderPublicKey * ec.PublicKey , payload []byte ) error {
852- bobReceived <- true
881+ bob1 .ListenForGeneralMessages (func (senderPublicKey * ec.PublicKey , payload []byte ) error {
882+ bob1Received <- true
883+ // Bob will respond to all messages
884+ go func () {
885+ err := bob1 .ToPeer (ctx , []byte ("Hello Alice from Bob1!" ), senderPublicKey , 5000 )
886+ require .NoError (t , err )
887+ }()
888+ return nil
889+ })
890+
891+ bob2 .ListenForGeneralMessages (func (senderPublicKey * ec.PublicKey , payload []byte ) error {
892+ bob2Received <- true
853893 // Bob will respond to all messages
854894 go func () {
855- err := bob .ToPeer (ctx , []byte ("Hello Alice!" ), senderPublicKey , 5000 )
895+ err := bob2 .ToPeer (ctx , []byte ("Hello Alice from Bob2 !" ), senderPublicKey , 5000 )
856896 require .NoError (t , err )
857897 }()
858898 return nil
859899 })
860900
861901 // Alice's first device sends a message to Bob
862- bobPubKey , _ := bobWallet .GetPublicKey (ctx , wallet.GetPublicKeyArgs {IdentityKey : true }, "" )
902+ bobPubKey , _ := bobWallet1 .GetPublicKey (ctx , wallet.GetPublicKeyArgs {IdentityKey : true }, "" )
863903 err = aliceFirstDevice .ToPeer (ctx , []byte ("Hello Bob from first device!" ), bobPubKey .PublicKey , 5000 )
864904 require .NoError (t , err )
865905
866- // Wait for Bob to receive and respond
906+ // Wait for Bob1 to receive and respond
867907 select {
868- case <- bobReceived :
908+ case <- bob1Received :
869909 // Bob received message
870910 case <- time .After (2 * time .Second ):
871- require .Fail (t , "Timed out waiting for Bob to receive message from Alice's first device" )
911+ require .Fail (t , "Timed out waiting for Bob1 to receive message from Alice's first device" )
872912 }
873913
874914 // Wait for Alice's first device to get response
@@ -879,19 +919,17 @@ func TestPeerMultiDeviceAuthentication(t *testing.T) {
879919 require .Fail (t , "Timed out waiting for Alice's first device to receive response" )
880920 }
881921
882- // Now connect Alice's second device to Bob
883- PairTransports (aliceTransport2 , bobTransport )
884-
885- // Alice's second device sends a message to Bob
886- err = aliceOtherDevice .ToPeer (ctx , []byte ("Hello Bob from other device!" ), bobPubKey .PublicKey , 5000 )
922+ // Alice's second device sends a message to Bob (different Bob instance)
923+ bobPubKey2 , _ := bobWallet2 .GetPublicKey (ctx , wallet.GetPublicKeyArgs {IdentityKey : true }, "" )
924+ err = aliceOtherDevice .ToPeer (ctx , []byte ("Hello Bob from other device!" ), bobPubKey2 .PublicKey , 5000 )
887925 require .NoError (t , err )
888926
889- // Wait for Bob to receive and respond
927+ // Wait for Bob2 to receive and respond
890928 select {
891- case <- bobReceived :
929+ case <- bob2Received :
892930 // Bob received message
893931 case <- time .After (2 * time .Second ):
894- require .Fail (t , "Timed out waiting for Bob to receive message from Alice's second device" )
932+ require .Fail (t , "Timed out waiting for Bob2 to receive message from Alice's second device" )
895933 }
896934
897935 // Wait for Alice's second device to get response
@@ -1217,11 +1255,9 @@ func TestPartialCertificateAcceptance(t *testing.T) {
12171255// TestLibraryCardVerification tests the scenario where Alice asks for
12181256// Bob's library card number before lending him a book.
12191257func TestLibraryCardVerification (t * testing.T ) {
1220- // Skip test temporarily until we fix the certificate signature verification issue
1221- t .Skip ("Temporarily skipping until we fix signature verification issue" )
1222-
12231258 // Create a mock function to intercept certificate requests
12241259 certType := "libraryCard"
1260+ certTypeBase64 := base64 .StdEncoding .EncodeToString ([]byte (certType ))
12251261
12261262 // Create test wallets with recognizable identities
12271263 aliceKey , err := ec .NewPrivateKey ()
@@ -1252,13 +1288,16 @@ func TestLibraryCardVerification(t *testing.T) {
12521288 return & wallet.VerifySignatureResult {Valid : true }, nil
12531289 }
12541290
1255- // Bob has a library card - first create raw
1291+ // Bob has a library card - create with proper base64 encoding
12561292 bobCertRaw := wallet.Certificate {
1257- Type : certType ,
1258- SerialNumber : "lib-123456" ,
1259- Subject : bobKey .PubKey (),
1260- Certifier : aliceKey .PubKey (),
1261- Fields : map [string ]string {"name" : "Bob" , "cardNumber" : "123456" },
1293+ Type : certTypeBase64 , // Use base64-encoded type
1294+ SerialNumber : base64 .StdEncoding .EncodeToString ([]byte ("lib-123456" )), // Base64-encode serial number
1295+ Subject : bobKey .PubKey (),
1296+ Certifier : aliceKey .PubKey (),
1297+ Fields : map [string ]string {
1298+ "name" : base64 .StdEncoding .EncodeToString ([]byte ("Bob" )), // Base64-encode field values
1299+ "cardNumber" : base64 .StdEncoding .EncodeToString ([]byte ("123456" )), // Base64-encode field values
1300+ },
12621301 RevocationOutpoint : "abcd1234:1" ,
12631302 }
12641303
@@ -1324,20 +1363,22 @@ func TestLibraryCardVerification(t *testing.T) {
13241363 return & wallet.CreateHmacResult {Hmac : hmacBytes }, nil
13251364 }
13261365
1327- // Create mocked transports
1328- aliceTransport := NewMockTransport ( )
1329- bobTransport := NewMockTransport ( )
1330- PairTransports (aliceTransport , bobTransport )
1366+ // Create mocked transports with debugging
1367+ aliceTransport := NewLoggingMockTransport ( "ALICE" , log . New ( os . Stdout , "[ALICE] " , log . LstdFlags ) )
1368+ bobTransport := NewLoggingMockTransport ( "BOB" , log . New ( os . Stdout , "[BOB] " , log . LstdFlags ) )
1369+ PairTransports (aliceTransport . MockTransport , bobTransport . MockTransport )
13311370
1332- // Create peers
1371+ // Create peers with debugging
13331372 alice := NewPeer (& PeerOptions {
13341373 Wallet : aliceWallet ,
13351374 Transport : aliceTransport ,
1375+ Logger : log .New (os .Stdout , "[ALICE PEER] " , log .LstdFlags ),
13361376 })
13371377
13381378 bob := NewPeer (& PeerOptions {
13391379 Wallet : bobWallet ,
13401380 Transport : bobTransport ,
1381+ Logger : log .New (os .Stdout , "[BOB PEER] " , log .LstdFlags ),
13411382 })
13421383
13431384 // Setup certificate tracking
@@ -1353,7 +1394,7 @@ func TestLibraryCardVerification(t *testing.T) {
13531394 return nil
13541395 })
13551396
1356- // Bob listens for certificate requests
1397+ // Bob listens for certificate requests with debugging
13571398 bob .ListenForCertificatesRequested (func (senderPublicKey * ec.PublicKey , req utils.RequestedCertificateSet ) error {
13581399 t .Logf ("Bob received certificate request from %s with %d types" ,
13591400 senderPublicKey .ToDERHex (), len (req .CertificateTypes ))
@@ -1379,10 +1420,11 @@ func TestLibraryCardVerification(t *testing.T) {
13791420 })
13801421
13811422 // Setup certificate requirements - Alice requires Bob's library card number
1423+ // Use the base64-encoded certificate type in the request
13821424 alice .CertificatesToRequest = & utils.RequestedCertificateSet {
13831425 Certifiers : []string {"any" },
13841426 CertificateTypes : utils.RequestedCertificateTypeIDAndFieldList {
1385- certType : []string {"cardNumber" },
1427+ certTypeBase64 : []string {"cardNumber" }, // Use base64-encoded type
13861428 },
13871429 }
13881430
@@ -1391,44 +1433,60 @@ func TestLibraryCardVerification(t *testing.T) {
13911433 // Alice sends an initial message to Bob to trigger the certificate exchange
13921434 bobPubKey , _ := bobWallet .GetPublicKey (ctx , wallet.GetPublicKeyArgs {IdentityKey : true }, "" )
13931435
1394- go func () {
1395- err := alice .ToPeer (ctx , []byte ("Can I see your library card?" ), bobPubKey .PublicKey , 5000 )
1396- require .NoError (t , err )
1436+ // First establish a session between Alice and Bob
1437+ t .Logf ("Alice sending initial message to Bob to establish session" )
1438+ err = alice .ToPeer (ctx , []byte ("Can I see your library card?" ), bobPubKey .PublicKey , 5000 )
1439+ require .NoError (t , err )
13971440
1398- // Add a small delay before explicitly requesting certificates
1399- time .Sleep (500 * time .Millisecond )
1441+ // Wait for session to be established
1442+ time .Sleep (1 * time .Second )
14001443
1401- // Alice explicitly requests Bob's certificate
1402- err = alice .RequestCertificates (ctx , bobPubKey .PublicKey , utils.RequestedCertificateSet {
1403- Certifiers : []string {"any" },
1404- CertificateTypes : utils.RequestedCertificateTypeIDAndFieldList {
1405- certType : []string {"cardNumber" },
1406- },
1407- }, 5000 )
1408- if err != nil {
1409- t .Logf ("Error when Alice requested Bob's library card: %v" , err )
1410- } else {
1411- t .Logf ("Alice explicitly requested Bob's library card" )
1412- }
1413- }()
1444+ // Now Alice explicitly requests Bob's certificate
1445+ t .Logf ("Alice explicitly requesting Bob's library card certificate" )
1446+ err = alice .RequestCertificates (ctx , bobPubKey .PublicKey , utils.RequestedCertificateSet {
1447+ Certifiers : []string {"any" },
1448+ CertificateTypes : utils.RequestedCertificateTypeIDAndFieldList {
1449+ certTypeBase64 : []string {"cardNumber" }, // Use base64-encoded type
1450+ },
1451+ }, 5000 )
1452+ require .NoError (t , err , "Alice should be able to request Bob's certificate" )
14141453
14151454 // Wait for certificate exchange
14161455 select {
14171456 case <- aliceCertReceived :
1457+ t .Logf ("SUCCESS: Alice received Bob's certificate" )
14181458 // Alice received Bob's certificate, now she'll verify the card number and lend him the book
14191459 go func () {
14201460 err := alice .ToPeer (ctx , []byte ("Here's your book" ), bobPubKey .PublicKey , 5000 )
14211461 require .NoError (t , err )
14221462 }()
1423- case <- time .After (5 * time .Second ):
1463+ case <- time .After (10 * time .Second ):
1464+ // Debug session state
1465+ t .Logf ("=== DEBUG SESSION INFO ===" )
1466+ alicePubKey , _ := aliceWallet .GetPublicKey (ctx , wallet.GetPublicKeyArgs {IdentityKey : true }, "" )
1467+
1468+ if bobSession , err := bob .sessionManager .GetSession (alicePubKey .PublicKey .ToDERHex ()); err == nil && bobSession != nil {
1469+ t .Logf ("Bob's session for Alice - Authenticated: %v, Session Nonce: %s, Peer Nonce: %s" ,
1470+ bobSession .IsAuthenticated , bobSession .SessionNonce , bobSession .PeerNonce )
1471+ } else {
1472+ t .Logf ("Bob has no session for Alice" )
1473+ }
1474+
1475+ if aliceSession , err := alice .sessionManager .GetSession (bobPubKey .PublicKey .ToDERHex ()); err == nil && aliceSession != nil {
1476+ t .Logf ("Alice's session for Bob - Authenticated: %v, Session Nonce: %s, Peer Nonce: %s" ,
1477+ aliceSession .IsAuthenticated , aliceSession .SessionNonce , aliceSession .PeerNonce )
1478+ } else {
1479+ t .Logf ("Alice has no session for Bob" )
1480+ }
1481+
14241482 require .Fail (t , "Timed out waiting for Alice to receive Bob's library card" )
14251483 return
14261484 }
14271485
14281486 // Wait for Bob to receive the book
14291487 select {
14301488 case <- bobMessageReceived :
1431- // Success! Bob got his book
1489+ t . Logf ( "SUCCESS: Bob received the book from Alice" )
14321490 case <- time .After (5 * time .Second ):
14331491 require .Fail (t , "Timed out waiting for Bob to receive a message from Alice" )
14341492 }
@@ -1477,9 +1535,6 @@ func TestPeerSessionManagement(t *testing.T) {
14771535
14781536// TestPeerErrorHandling tests error handling in various scenarios
14791537func TestPeerErrorHandling (t * testing.T ) {
1480- // Skip for now and add a more targeted test
1481- t .Skip ("Skip error handling tests until we have proper mock implementations" )
1482-
14831538 alice , _ , aliceWallet , bobWallet := CreatePeerPair (t )
14841539
14851540 // Use all variables to avoid linter errors
0 commit comments