@@ -2,6 +2,7 @@ package message
22
33import (
44 "crypto/rand"
5+ "fmt"
56 "math/big"
67 "testing"
78
@@ -49,13 +50,85 @@ func TestSignedMessage(t *testing.T) {
4950 require .Equal (t , "message version mismatch: Expected 42423301, received 01423301" , err .Error ())
5051 })
5152
53+ t .Run ("Fails to verify a message with no verifier when required" , func (t * testing.T ) {
54+ senderPriv , _ := ec .PrivateKeyFromBytes ([]byte {15 })
55+ _ , recipientPub := ec .PrivateKeyFromBytes ([]byte {21 }) // Specific recipient
56+
57+ message := []byte {1 , 2 , 4 , 8 , 16 , 32 }
58+ signature , err := Sign (message , senderPriv , recipientPub )
59+ require .NoError (t , err )
60+
61+ verified , err := Verify (message , signature , nil ) // No recipient private key provided
62+ require .Error (t , err )
63+ require .False (t , verified )
64+ // Construct expected public key from recipientPub for the error message
65+ expectedVerifierPubHex := fmt .Sprintf ("%x" , recipientPub .Compressed ())
66+ require .Contains (t , err .Error (), "this signature can only be verified with knowledge of a specific private key. The associated public key is: " + expectedVerifierPubHex )
67+ })
68+
69+ t .Run ("Fails to verify a message with a wrong verifier" , func (t * testing.T ) {
70+ senderPriv , _ := ec .PrivateKeyFromBytes ([]byte {15 })
71+ _ , recipientPub := ec .PrivateKeyFromBytes ([]byte {21 })
72+ wrongRecipientPriv , _ := ec .PrivateKeyFromBytes ([]byte {22 })
73+
74+ message := []byte {1 , 2 , 4 , 8 , 16 , 32 }
75+ signature , err := Sign (message , senderPriv , recipientPub )
76+ require .NoError (t , err )
77+
78+ verified , err := Verify (message , signature , wrongRecipientPriv )
79+ require .Error (t , err )
80+ require .False (t , verified )
81+ expectedRecipientPubHex := fmt .Sprintf ("%x" , recipientPub .Compressed ())
82+ actualRecipientPubHex := fmt .Sprintf ("%x" , wrongRecipientPriv .PubKey ().Compressed ())
83+ require .Equal (t , fmt .Sprintf ("the recipient public key is %s but the signature requires the recipient to have public key %s" , actualRecipientPubHex , expectedRecipientPubHex ), err .Error ())
84+ })
85+
86+ }
87+
88+ func TestTamperedMessage_AnyoneCanVerify (t * testing.T ) {
89+ senderPriv , _ := ec .PrivateKeyFromBytes ([]byte {15 })
90+
91+ messageA := []byte {1 , 2 , 4 , 8 , 16 , 32 }
92+ signatureFromA , err := Sign (messageA , senderPriv , nil ) // nil for "anyone can verify"
93+ require .NoError (t , err )
94+
95+ // Create a tampered message (messageB)
96+ messageB := make ([]byte , len (messageA ))
97+ copy (messageB , messageA )
98+ messageB [len (messageB )- 1 ] = 64 // Modify the last byte
99+
100+ // Attempt to verify signatureFromA against messageB
101+ // This verification should fail if the system is working correctly.
102+ verified , err := Verify (messageB , signatureFromA , nil ) // nil recipient
103+ require .NoError (t , err , "Verification process itself should not error for a tampered message if signature format is valid" )
104+ require .False (t , verified , "Verification should fail for a tampered message" )
105+ }
106+
107+ func TestTamperedMessage_SpecificRecipient (t * testing.T ) {
108+ senderPriv , _ := ec .PrivateKeyFromBytes ([]byte {15 })
109+ recipientPriv , recipientPub := ec .PrivateKeyFromBytes ([]byte {21 })
110+
111+ messageA := []byte {1 , 2 , 4 , 8 , 16 , 32 }
112+ signatureFromA , err := Sign (messageA , senderPriv , recipientPub )
113+ require .NoError (t , err )
114+
115+ // Create a tampered message (messageB)
116+ messageB := make ([]byte , len (messageA ))
117+ copy (messageB , messageA )
118+ messageB [len (messageB )- 1 ] = 64 // Modify the last byte
119+
120+ // Attempt to verify signatureFromA against messageB
121+ // This verification should fail if the system is working correctly.
122+ verified , err := Verify (messageB , signatureFromA , recipientPriv )
123+ require .NoError (t , err , "Verification process itself should not error for a tampered message if signature format is valid" )
124+ require .False (t , verified , "Verification should fail for a tampered message with a specific recipient" )
52125}
53126
54127func TestEdgeCases (t * testing.T ) {
55128 signingPriv , _ := ec .PrivateKeyFromBytes ([]byte {15 })
56129
57130 message := make ([]byte , 32 )
58- for i := 0 ; i < 10000 ; i ++ {
131+ for range 10000 {
59132 _ , _ = rand .Read (message )
60133 signature , err := signingPriv .Sign (message )
61134 require .NoError (t , err )
@@ -71,6 +144,5 @@ func TestEdgeCases(t *testing.T) {
71144
72145 require .Equal (t , signatureSerialized , signatureDER )
73146 require .Equal (t , len (signatureSerialized ), len (signatureDER ))
74- t .Logf ("Signature serialized: %d %x - %d %x\n " , len (signatureDER ), signatureDER , len (signatureSerialized ), signatureSerialized )
75147 }
76148}
0 commit comments