Skip to content

Commit 97933d0

Browse files
committed
add test for shared ecies encryption helper
1 parent 18d54f9 commit 97933d0

File tree

4 files changed

+126
-25
lines changed

4 files changed

+126
-25
lines changed

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,36 @@ All notable changes to this project will be documented in this file. The format
55
## Table of Contents
66

77
- [Unreleased](#unreleased)
8+
- [1.1.4 - 2024-09-05](#113---2024-09-05)
89
- [1.1.3 - 2024-09-04](#113---2024-09-04)
910
- [1.1.2 - 2024-09-02](#112---2024-09-02)
1011
- [1.1.1 - 2024-08-28](#111---2024-08-28)
1112
- [1.1.0 - 2024-08-19](#110---2024-08-19)
1213
- [1.0.0 - 2024-06-06](#100---2024-06-06)
1314

15+
## [1.1.4] - 2024-09-05
16+
17+
- Update ECIES implementation to align with
18+
19+
### Added
20+
- `primitives/aescbc` directory
21+
- `AESCBCEncrypt`, `AESCBCDecrypt`, `PKCS7Padd`, `PKCS7Unpad`
22+
- `compat/ecies`
23+
- `EncryptSingle`, `DecryptSingle`, `EncryptShared` and `DecryptShared` convenience functions that deal with strings, uses Electrum ECIES and typical defaults
24+
- `ElectrumEncrypt`, `ElectrumDecrypt`, `BitcoreEncrypt`, `BitcoreDecrypt`
25+
- `docs/examples`
26+
- `ecies_shared`, `ecies_single`, `ecies_electrum_binary`
27+
- Tests for different ECIES encryption implementations
28+
29+
### Removed
30+
- Previous ecies implementation
31+
- Outdated ecies example
32+
- encryption.go for vanilla AES encryption (to align with typescript library)
33+
34+
### Changed
35+
- Renamed `message` example to `encrypt_message` for clarity
36+
- Change vanilla `aes` example to use existing encrypt/decrypt functions from `aesgcm` directory
37+
1438
## [1.1.3] - 2024-09-04
1539

1640
- Add shamir key splitting

compat/ecies/ecies.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ import (
1919

2020
func EncryptSingle(message string, privateKey *ec.PrivateKey) (string, error) {
2121
messageBytes := []byte(message)
22-
23-
decryptedBytes, err := ElectrumEncrypt(messageBytes, privateKey.PubKey(), privateKey, false)
24-
if err != nil {
25-
return "", err
22+
if privateKey == nil {
23+
return "", errors.New("private key is required")
2624
}
25+
decryptedBytes, _ := ElectrumEncrypt(messageBytes, privateKey.PubKey(), privateKey, false)
2726
return base64.StdEncoding.EncodeToString(decryptedBytes), nil
2827
}
2928

@@ -41,7 +40,7 @@ func DecryptSingle(encryptedData string, privateKey *ec.PrivateKey) (string, err
4140

4241
func EncryptShared(message string, toPublicKey *ec.PublicKey, fromPrivateKey *ec.PrivateKey) (string, error) {
4342
messageBytes := []byte(message)
44-
decryptedBytes, err := ElectrumEncrypt(messageBytes, toPublicKey, nil, false)
43+
decryptedBytes, err := ElectrumEncrypt(messageBytes, toPublicKey, fromPrivateKey, false)
4544
if err != nil {
4645
return "", err
4746
}
@@ -167,11 +166,7 @@ func BitcoreEncrypt(message []byte,
167166

168167
// If fromPrivateKey is not provided, generate a random one
169168
if fromPrivateKey == nil {
170-
var err error
171-
fromPrivateKey, err = ec.NewPrivateKey()
172-
if err != nil {
173-
return nil, err
174-
}
169+
fromPrivateKey, _ = ec.NewPrivateKey()
175170
}
176171

177172
RBuf := fromPrivateKey.PubKey().ToDERBytes()

compat/ecies/ecies_test.go

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import (
1010
)
1111

1212
const msgString = "hello world"
13+
const wrongData = "wrong data"
14+
const wif = "L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu"
15+
const counterpartyWif = "L27ZSAC1xTsZrghYHqnxwAQZ12bH57piaAdoGaLizTp3JZrjkZjK"
1316

1417
func TestEncryptDecryptSingle(t *testing.T) {
15-
16-
pk, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
18+
pk, _ := ec.PrivateKeyFromWif(wif)
1719

1820
// Electrum Encrypt
1921
encryptedData, err := EncryptSingle(msgString, pk)
@@ -23,11 +25,37 @@ func TestEncryptDecryptSingle(t *testing.T) {
2325
// Electrum Decrypt
2426
decryptedData, _ := DecryptSingle(encryptedData, pk)
2527
require.Equal(t, msgString, decryptedData)
28+
29+
// Encrypt without private key
30+
_, err = EncryptSingle(msgString, nil)
31+
require.Error(t, err)
32+
33+
// Decrypt with non base64 data
34+
_, err = DecryptSingle(wrongData, pk)
35+
require.Error(t, err)
36+
37+
// Decrypt with wrong data
38+
wrongData := base64.StdEncoding.EncodeToString([]byte(wrongData))
39+
_, err = DecryptSingle(wrongData, pk)
40+
require.Error(t, err)
41+
42+
}
43+
44+
func TestEncryptDecryptShared(t *testing.T) {
45+
pk, _ := ec.PrivateKeyFromWif(wif)
46+
pk2, _ := ec.PrivateKeyFromWif(counterpartyWif)
47+
48+
encryptedString, err := EncryptShared(msgString, pk2.PubKey(), pk)
49+
require.NoError(t, err)
50+
51+
decryptedString, err := DecryptShared(encryptedString, pk2, pk.PubKey())
52+
require.NoError(t, err)
53+
require.Equal(t, msgString, decryptedString)
2654
}
2755

2856
func TestElectrumEncryptDecryptSingle(t *testing.T) {
2957

30-
pk, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
58+
pk, _ := ec.PrivateKeyFromWif(wif)
3159

3260
// Electrum Encrypt
3361
encryptedData, err := ElectrumEncrypt([]byte(msgString), pk.PubKey(), pk, false)
@@ -39,11 +67,18 @@ func TestElectrumEncryptDecryptSingle(t *testing.T) {
3967
// Electrum Decrypt
4068
decryptedData, _ := ElectrumDecrypt(encryptedData, pk, nil)
4169
require.Equal(t, []byte(msgString), decryptedData)
70+
71+
// Encrypt without private key
72+
_, err = ElectrumEncrypt([]byte(msgString), pk.PubKey(), nil, false)
73+
require.NoError(t, err)
74+
75+
// Decrypt with wrong data
76+
_, err = ElectrumDecrypt([]byte(wrongData), pk, nil)
77+
require.Error(t, err)
4278
}
4379

4480
func TestElectrumEncryptDecryptSingleNokey(t *testing.T) {
45-
46-
pk, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
81+
pk, _ := ec.PrivateKeyFromWif(wif)
4782

4883
// Electrum Encrypt
4984
encryptedData, err := ElectrumEncrypt([]byte(msgString), pk.PubKey(), pk, true)
@@ -55,7 +90,7 @@ func TestElectrumEncryptDecryptSingleNokey(t *testing.T) {
5590
}
5691

5792
func TestElectrumEncryptDecryptWithCounterparty(t *testing.T) {
58-
pk1, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
93+
pk1, _ := ec.PrivateKeyFromWif(wif)
5994
counterparty, err := ec.PublicKeyFromString("03121a7afe56fc8e25bca4bb2c94f35eb67ebe5b84df2e149d65b9423ee65b8b4b")
6095
require.NoError(t, err)
6196

@@ -71,7 +106,7 @@ func TestElectrumEncryptDecryptWithCounterparty(t *testing.T) {
71106
}
72107

73108
func TestElectrumEncryptDecryptWithCounterpartyNoKey(t *testing.T) {
74-
pk1, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
109+
pk1, _ := ec.PrivateKeyFromWif(wif)
75110
counterparty, err := ec.PublicKeyFromString("03121a7afe56fc8e25bca4bb2c94f35eb67ebe5b84df2e149d65b9423ee65b8b4b")
76111
require.NoError(t, err)
77112

@@ -90,7 +125,7 @@ func TestBitcoreEncryptDecryptSolo(t *testing.T) {
90125
expectedEncryptedData := "A7vOlf8ZLhem2ELLr+FPfxkqwEZufwkowYc5jmJ+ZqhPAAAAAAAAAAAAAAAAAAAAAB27kUY/HpNbiwhYSpEoEZZDW+wEjMmPNcAAxnc0kiuQ73FpFzf6p6afe4wwVtKAAg=="
91126
decodedExpectedEncryptedData, _ := base64.StdEncoding.DecodeString(expectedEncryptedData)
92127
log.Printf("Decoded expected encrypted data: %x\n", decodedExpectedEncryptedData)
93-
pk, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
128+
pk, _ := ec.PrivateKeyFromWif(wif)
94129

95130
// Bitcore Encrypt
96131
encryptedData, err := BitcoreEncrypt([]byte(msgString), pk.PubKey(), pk, nil)
@@ -104,8 +139,8 @@ func TestBitcoreEncryptDecryptSolo(t *testing.T) {
104139
}
105140

106141
func TestBitcoreEncryptDecryptWithCounterparty(t *testing.T) {
107-
pk1, _ := ec.PrivateKeyFromWif("L211enC224G1kV8pyyq7bjVd9SxZebnRYEzzM3i7ZHCc1c5E7dQu")
108-
counterpartyPk, err := ec.PrivateKeyFromWif("L27ZSAC1xTsZrghYHqnxwAQZ12bH57piaAdoGaLizTp3JZrjkZjK")
142+
pk1, _ := ec.PrivateKeyFromWif(wif)
143+
counterpartyPk, err := ec.PrivateKeyFromWif(counterpartyWif)
109144
require.NoError(t, err)
110145

111146
// Bitcore Encrypt

primitives/hash/hash_test.go

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12+
const testData = "I am a test"
13+
const testData2 = "this is the data I want to hash"
14+
1215
func TestHashFunctions(t *testing.T) {
1316
t.Parallel()
1417

@@ -26,7 +29,7 @@ func TestHashFunctions(t *testing.T) {
2629
},
2730
{
2831
"Test Ripemd160 String",
29-
"I am a test",
32+
testData,
3033
"09a23f506b4a37cabab8a9e49b541de582fca96b",
3134
Ripemd160,
3235
},
@@ -38,7 +41,7 @@ func TestHashFunctions(t *testing.T) {
3841
},
3942
{
4043
"Test Sha256 d String",
41-
"this is the data I want to hash",
44+
testData2,
4245
"2209ddda5914a3fbad507ff2284c4b6e559c18a669f9fc3ad3b5826a2a999d58",
4346
Sha256d,
4447
},
@@ -50,7 +53,7 @@ func TestHashFunctions(t *testing.T) {
5053
},
5154
{
5255
"Test Sha256 String",
53-
"this is the data I want to hash",
56+
testData2,
5457
"f88eec7ecabf88f9a64c4100cac1e0c0c4581100492137d1b656ea626cad63e3",
5558
Sha256,
5659
},
@@ -62,10 +65,22 @@ func TestHashFunctions(t *testing.T) {
6265
},
6366
{
6467
"Test Hash160 String",
65-
"this is the data I want to hash",
68+
testData2,
6669
"e7fb13ef86fef4203f042fbfc2703fa628301e90",
6770
Hash160,
6871
},
72+
{
73+
"Test Sha512 Empty String",
74+
"",
75+
"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
76+
Sha512,
77+
},
78+
{
79+
"Test Sha512 String",
80+
testData2,
81+
"fe917669df24482f19e9fdd305a846ab5778708d75e05bef0eb9b349c22c21c0168892058b26fe9ae0e3488f6b05b5cc6b356f4dd6093cdf9329ed800de3a165",
82+
Sha512,
83+
},
6984
}
7085

7186
for _, hashTest := range hashTests {
@@ -104,7 +119,6 @@ func TestSha256HMAC(t *testing.T) {
104119
"a28cf43130ee696a98f14a37678b56bcfcbdd9e5cf69717fecf5480f0ebdf790",
105120
Sha256HMAC,
106121
},
107-
// ... (Other test cases)
108122
}
109123

110124
for _, tc := range tests {
@@ -118,3 +132,36 @@ func TestSha256HMAC(t *testing.T) {
118132
})
119133
}
120134
}
135+
136+
func TestSha512HMAC(t *testing.T) {
137+
tests := []struct {
138+
name string
139+
keyHex string
140+
msgHex string
141+
expected string
142+
}{
143+
{
144+
"Test case 1",
145+
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
146+
"4869205468657265",
147+
"87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854",
148+
},
149+
{
150+
"Test case 2",
151+
"4a656665",
152+
"7768617420646f2079612077616e7420666f72206e6f7468696e673f",
153+
"164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737",
154+
},
155+
}
156+
157+
for _, tc := range tests {
158+
t.Run(tc.name, func(t *testing.T) {
159+
key, _ := hex.DecodeString(tc.keyHex)
160+
msg, _ := hex.DecodeString(tc.msgHex)
161+
expected, _ := hex.DecodeString(tc.expected)
162+
163+
result := Sha512HMAC(msg, key)
164+
assert.Equal(t, expected, result)
165+
})
166+
}
167+
}

0 commit comments

Comments
 (0)