Skip to content

Commit 7a9db02

Browse files
fix: ensure ecdh shared key width is 32 bytes (#295)
* fix: ensure that ECDH shared keys are 256-bits, even with leading zeros * tests: update tests to ensure keys are 32 bytes
1 parent 3777b7c commit 7a9db02

3 files changed

Lines changed: 6 additions & 2 deletions

File tree

core/src/main/java/org/bitcoinj/crypto/KeyCrypterECDH.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
2424
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
2525
import org.bouncycastle.crypto.params.KeyParameter;
26+
import org.bouncycastle.util.BigIntegers;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
2829

@@ -78,7 +79,8 @@ KeyParameter deriveKey(byte [] secretKey, byte [] publicKey) throws KeyCrypterEx
7879

7980
Secp256k1ECDHAgreement agreement = new Secp256k1ECDHAgreement();
8081
agreement.init(prvkey);
81-
byte[] password = agreement.calculateAgreement(pubKey).toByteArray();
82+
BigInteger sharedSecret = agreement.calculateAgreement(pubKey);
83+
byte[] password = BigIntegers.asUnsignedByteArray(32, sharedSecret);
8284
watch.stop();
8385

8486
log.info("Deriving key took {} for a ECDH Key Exchange", watch);

core/src/test/java/org/bitcoinj/crypto/KeyCrypterAESCBCTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void setup() {
3838
@Test
3939
public void testEncryptionAndDecryption() {
4040
//Alice is sending to Bob
41-
KeyCrypterECDH aliceKeyExchangeCrypter = new KeyCrypterECDH();
41+
KeyCrypterAESCBC aliceKeyExchangeCrypter = new KeyCrypterAESCBC();
4242
KeyParameter aliceKeyParameter = aliceKeyExchangeCrypter.deriveKey(aliceKey);
4343

4444
EncryptedData encryptedData = aliceKeyExchangeCrypter.encrypt(secret.getBytes(), aliceKeyParameter);

core/src/test/java/org/bitcoinj/crypto/KeyCrypterECDHTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ public void ecdhDecryptionTest() {
9696
KeyCrypterECDH aliceKeyExchangeCrypter = new KeyCrypterECDH();
9797

9898
KeyParameter aliceKeyParameter = aliceKeyExchangeCrypter.deriveKey(alicePrivateKey, bobKeyPair.getPubKey());
99+
assertEquals(32, aliceKeyParameter.getKeyLength());
99100

100101
assertEquals("fbd27dbb9e7f471bf3de3704a35e884e37d35c676dc2cc8c3cc574c3962376d2", Utils.HEX.encode(aliceKeyParameter.getKey()));
101102
EncryptedData encryptedAliceData = aliceKeyExchangeCrypter.encrypt(secret.getBytes(),
@@ -116,6 +117,7 @@ public void ecdhDecryptionTest() {
116117

117118
KeyCrypterECDH bobKeyExchangeCrypter = new KeyCrypterECDH();
118119
KeyParameter bobKeyParameter = bobKeyExchangeCrypter.deriveKey(bobKeyPair.getPrivKeyBytes(), alicePublicKey);
120+
assertEquals(32, bobKeyParameter.getKeyLength());
119121

120122
EncryptedData encryptedData = new EncryptedData(Arrays.copyOfRange(encryptedSecret, 0, 16),
121123
Arrays.copyOfRange(encryptedSecret, 16, encryptedSecret.length));

0 commit comments

Comments
 (0)