Skip to content

Commit 181349b

Browse files
committed
fix signed message
1 parent 8098190 commit 181349b

File tree

2 files changed

+81
-6
lines changed

2 files changed

+81
-6
lines changed

message/signed.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package message
33
import (
44
"bytes"
55
"crypto/rand"
6+
"crypto/sha256"
67
"encoding/base64"
78
"fmt"
89

@@ -37,7 +38,8 @@ func Sign(message []byte, signer *ec.PrivateKey, verifier *ec.PublicKey) ([]byte
3738
if err != nil {
3839
return nil, err
3940
}
40-
signature, err := signingPriv.Sign(message)
41+
hashedMessage := sha256.Sum256(message)
42+
signature, err := signingPriv.Sign(hashedMessage[:])
4143
if err != nil {
4244
return nil, err
4345
}
@@ -80,11 +82,11 @@ func Verify(message []byte, sig []byte, recipient *ec.PrivateKey) (bool, error)
8082
counter += 32
8183
verifierDER := append([]byte{verifierFirst}, verifierRest...)
8284
if recipient == nil {
83-
return false, nil
85+
return false, fmt.Errorf("this signature can only be verified with knowledge of a specific private key. The associated public key is: %x", verifierDER)
8486
}
8587
recipientDER := recipient.PubKey().Compressed()
8688
if !bytes.Equal(verifierDER, recipientDER) {
87-
errorStr := "the recipient public key is %x but the signature requres the recipient to have public key %x"
89+
errorStr := "the recipient public key is %x but the signature requires the recipient to have public key %x"
8890
err = fmt.Errorf(errorStr, recipientDER, verifierDER)
8991
return false, err
9092
}
@@ -102,7 +104,8 @@ func Verify(message []byte, sig []byte, recipient *ec.PrivateKey) (bool, error)
102104
if err != nil {
103105
return false, err
104106
}
105-
verified := signature.Verify(message, signingKey)
107+
hashedMessage := sha256.Sum256(message)
108+
verified := signature.Verify(hashedMessage[:], signingKey)
106109
return verified, nil
107110

108111
}

message/signed_test.go

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package message
22

33
import (
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

54127
func 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

Comments
 (0)