Skip to content

Commit 3068785

Browse files
committed
V6.4.0
- Update dependencies. - Improved security: Private key operations now use blinded ecmult for safer public key generation. - All signing methods now use constant-time operations with blinded ecmult to securely generate signatures.
1 parent a1e5177 commit 3068785

11 files changed

Lines changed: 45 additions & 32 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## 6.4.0
2+
3+
- Update dependencies.
4+
- Improved security: Private key operations now use blinded ecmult for safer public key generation.
5+
- All signing methods now use constant-time operations with blinded ecmult to securely generate signatures.
6+
7+
8+
19
## 6.3.0
210

311
- Update dependencies.

example/lib/musig/methods.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ import 'package:example/services_examples/electrum/electrum_ssl_service.dart';
33

44
Future<ElectrumProvider> getProvider(
55
{String url = "testnet4-electrumx.wakiyamap.dev:51002"}) async {
6-
final service = await ElectrumSSLService.connect(
7-
"testnet4-electrumx.wakiyamap.dev:51002");
6+
// final service = await ElectrumSSLService.connect(
7+
// "testnet4-electrumx.wakiyamap.dev:51002");
8+
9+
final service =
10+
await ElectrumSSLService.connect("testnet.aranguren.org:51002");
811
return ElectrumProvider(service);
912
}
1013

example/pubspec.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ packages:
1515
path: ".."
1616
relative: true
1717
source: path
18-
version: "6.2.0"
18+
version: "6.3.0"
1919
blockchain_utils:
2020
dependency: "direct main"
2121
description:
2222
name: blockchain_utils
23-
sha256: "104f5212ade36b01a67511b074feed2ece513876d45c8daace277818cdc16873"
23+
sha256: fbddd2a7f1849d2244a35bf996b6fb00bf6bd557f0e13aed65ba0c16ad133cb7
2424
url: "https://pub.dev"
2525
source: hosted
26-
version: "4.4.0"
26+
version: "5.0.0"
2727
boolean_selector:
2828
dependency: transitive
2929
description:

example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ dependencies:
3939
path: ../
4040
# blockchain_utils:
4141
# path: ../../blockchain_utils
42-
blockchain_utils: ^4.4.0
42+
blockchain_utils: ^5.0.0
4343
http: ^1.2.0
4444

4545
dev_dependencies:

lib/src/bitcoin/address/legacy_address.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class P2pkAddress extends LegacyAddress {
154154
P2pkAddress._(this.publicKey) : super._();
155155
factory P2pkAddress({required String publicKey}) {
156156
final toBytes = BytesUtils.fromHexString(publicKey);
157-
if (!Secp256k1PublicKeyEcdsa.isValidBytes(toBytes)) {
157+
if (!Secp256k1PublicKey.isValidBytes(toBytes)) {
158158
throw const DartBitcoinPluginException('Invalid Public key.');
159159
}
160160
return P2pkAddress._(StringUtils.strip0x(publicKey.toLowerCase()));

lib/src/crypto/keypair/ec_private.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class ECPrivate {
101101
List<int> extraEntropy = const [],
102102
}) {
103103
final btcSigner = BitcoinKeySigner.fromKeyBytes(toBytes());
104-
final signature = btcSigner.signMessage(
104+
final signature = btcSigner.signMessageConst(
105105
message: message,
106106
messagePrefix: messagePrefix,
107107
extraEntropy: extraEntropy);
@@ -122,7 +122,7 @@ class ECPrivate {
122122
{String messagePrefix = BitcoinSignerUtils.signMessagePrefix,
123123
List<int> extraEntropy = const []}) {
124124
final btcSigner = BitcoinKeySigner.fromKeyBytes(toBytes());
125-
final signature = btcSigner.signMessage(
125+
final signature = btcSigner.signMessageConst(
126126
message: message,
127127
messagePrefix: messagePrefix,
128128
extraEntropy: extraEntropy);
@@ -138,7 +138,7 @@ class ECPrivate {
138138
List<int> extraEntropy = const []}) {
139139
final btcSigner = BitcoinKeySigner.fromKeyBytes(toBytes());
140140
List<int> signature =
141-
btcSigner.signECDSADer(txDigest, extraEntropy: extraEntropy);
141+
btcSigner.signECDSADerConst(txDigest, extraEntropy: extraEntropy);
142142
if (sighash != null) {
143143
signature = <int>[...signature, sighash];
144144
}
@@ -157,7 +157,8 @@ class ECPrivate {
157157
{int sighash = BitcoinOpCodeConst.sighashDefault,
158158
List<int> extraEntropy = const []}) {
159159
final btcSigner = BitcoinKeySigner.fromKeyBytes(toBytes());
160-
var signature = btcSigner.signSchnorr(txDigest, extraEntropy: extraEntropy);
160+
var signature =
161+
btcSigner.signSchnorrConst(txDigest, extraEntropy: extraEntropy);
161162
if (sighash != BitcoinOpCodeConst.sighashDefault) {
162163
signature = <int>[...signature, sighash];
163164
}
@@ -193,7 +194,7 @@ class ECPrivate {
193194
"Use either tapTweakHash or (treeScript/merkleRoot), not both.");
194195
}
195196
final btcSigner = BitcoinKeySigner.fromKeyBytes(toBytes());
196-
List<int> signature = btcSigner.signBip340(
197+
List<int> signature = btcSigner.signBip340Const(
197198
digest: txDigest,
198199
aux: aux,
199200
tapTweakHash: tweak

lib/src/crypto/keypair/ec_public.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ import 'package:blockchain_utils/blockchain_utils.dart';
99
typedef PublicKeyType = PubKeyModes;
1010

1111
class ECPublic {
12-
final Secp256k1PublicKeyEcdsa publicKey;
12+
final Secp256k1PublicKey publicKey;
1313
const ECPublic._(this.publicKey);
1414

1515
factory ECPublic.fromBip32(Bip32PublicKey publicKey) {
1616
if (publicKey.curveType != EllipticCurveTypes.secp256k1) {
1717
throw const DartBitcoinPluginException(
1818
'invalid public key curve for bitcoin');
1919
}
20-
return ECPublic._(publicKey.pubKey as Secp256k1PublicKeyEcdsa);
20+
return ECPublic._(publicKey.pubKey as Secp256k1PublicKey);
2121
}
2222
ProjectiveECCPoint get point => publicKey.point.cast();
2323

2424
/// Constructs an ECPublic key from a byte representation.
2525
factory ECPublic.fromBytes(List<int> public) {
26-
final publicKey = Secp256k1PublicKeyEcdsa.fromBytes(public);
26+
final publicKey = Secp256k1PublicKey.fromBytes(public);
2727
return ECPublic._(publicKey);
2828
}
2929

lib/src/psbt/psbt_builder/types/internal_types.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,13 +335,14 @@ class PsbtGeneratedTransactionDigest {
335335

336336
bool verifyEcdsaSignature(PsbtInputPartialSig sig) {
337337
try {
338+
/// handle bch schnorr signature
338339
if (CryptoSignatureUtils.isValidSchnorrSignature(sig.signature)) {
339340
return sig.publicKey
340341
.verifySchnorrSignature(digest: digest, signature: sig.signature);
341342
}
342-
343-
return sig.publicKey
343+
final verify = sig.publicKey
344344
.verifyDerSignature(digest: digest, signature: sig.signature);
345+
return verify;
345346
} catch (_) {
346347
return false;
347348
}

lib/src/psbt/types/types/inputs.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,7 @@ class PsbtInputBip32DerivationPath extends PsbtInputData {
651651
required List<int> publicKey,
652652
}) {
653653
if (fingerprint.length == Bip32KeyDataConst.fingerprintByteLen &&
654-
Secp256k1PublicKeyEcdsa.isValidBytes(publicKey)) {
654+
Secp256k1PublicKey.isValidBytes(publicKey)) {
655655
return PsbtInputBip32DerivationPath._(
656656
fingerprint: fingerprint,
657657
indexes: indexes,
@@ -694,7 +694,7 @@ class PsbtInputBip32DerivationPath extends PsbtInputData {
694694
offset, offset + Bip32KeyDataConst.keyIndexByteLen));
695695
});
696696
if (fingerPrint.length == Bip32KeyDataConst.fingerprintByteLen &&
697-
Secp256k1PublicKeyEcdsa.isValidBytes(keypair.key.extraData ?? [])) {
697+
Secp256k1PublicKey.isValidBytes(keypair.key.extraData ?? [])) {
698698
return PsbtInputBip32DerivationPath._(
699699
fingerprint: fingerPrint,
700700
indexes: bip32Indexes,
@@ -1943,9 +1943,9 @@ class PsbtInputMuSig2PublicNonce extends PsbtInputData {
19431943
: keypair.key.extraData!
19441944
.sublist(EcdsaKeysConst.pubKeyCompressedByteLen * 2);
19451945
if (publicKey.length == EcdsaKeysConst.pubKeyCompressedByteLen &&
1946-
Secp256k1PublicKeyEcdsa.isValidBytes(publicKey) &&
1946+
Secp256k1PublicKey.isValidBytes(publicKey) &&
19471947
plainPublicKey.length == EcdsaKeysConst.pubKeyCompressedByteLen &&
1948-
Secp256k1PublicKeyEcdsa.isValidBytes(plainPublicKey) &&
1948+
Secp256k1PublicKey.isValidBytes(plainPublicKey) &&
19491949
(hash == null || hash.length == QuickCrypto.sha256DigestSize) &&
19501950
keypair.value.data.length ==
19511951
EcdsaKeysConst.pubKeyCompressedByteLen * 2) {
@@ -2042,9 +2042,9 @@ class PsbtInputMuSig2ParticipantPartialSignature
20422042
? null
20432043
: keypair.key.extraData!.sublist(66);
20442044
if (publicKey.length == EcdsaKeysConst.pubKeyCompressedByteLen &&
2045-
Secp256k1PublicKeyEcdsa.isValidBytes(publicKey) &&
2045+
Secp256k1PublicKey.isValidBytes(publicKey) &&
20462046
plainPublicKey.length == EcdsaKeysConst.pubKeyCompressedByteLen &&
2047-
Secp256k1PublicKeyEcdsa.isValidBytes(plainPublicKey) &&
2047+
Secp256k1PublicKey.isValidBytes(plainPublicKey) &&
20482048
(hash == null || hash.length == QuickCrypto.sha256DigestSize) &&
20492049
keypair.value.data.length == QuickCrypto.sha256DigestSize) {
20502050
return PsbtInputMuSig2ParticipantPartialSignature._(

lib/src/psbt/types/types/outputs.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ class PsbtOutputBip32DerivationPath extends PsbtOutputData {
326326
required List<Bip32KeyIndex> indexes,
327327
required List<int> publicKey}) {
328328
if (fingerprint.length == Bip32KeyDataConst.fingerprintByteLen &&
329-
Secp256k1PublicKeyEcdsa.isValidBytes(publicKey)) {
329+
Secp256k1PublicKey.isValidBytes(publicKey)) {
330330
return PsbtOutputBip32DerivationPath._(
331331
fingerprint: fingerprint,
332332
indexes: indexes,
@@ -348,7 +348,7 @@ class PsbtOutputBip32DerivationPath extends PsbtOutputData {
348348
"Invalid PSBT bip32 derivation path type flag");
349349
}
350350
if (keypair.key.extraData == null ||
351-
!Secp256k1PublicKeyEcdsa.isValidBytes(keypair.key.extraData!)) {
351+
!Secp256k1PublicKey.isValidBytes(keypair.key.extraData!)) {
352352
throw DartBitcoinPluginException(
353353
"Invalid PSBT bip32 derivation public key.");
354354
}
@@ -370,7 +370,7 @@ class PsbtOutputBip32DerivationPath extends PsbtOutputData {
370370
offset, offset + Bip32KeyDataConst.keyIndexByteLen));
371371
});
372372
if (fingerPrint.length == Bip32KeyDataConst.fingerprintByteLen &&
373-
Secp256k1PublicKeyEcdsa.isValidBytes(keypair.key.extraData!)) {
373+
Secp256k1PublicKey.isValidBytes(keypair.key.extraData!)) {
374374
return PsbtOutputBip32DerivationPath._(
375375
fingerprint: fingerPrint,
376376
indexes: bip32Indexes,
@@ -748,8 +748,8 @@ class PsbtOutputMuSig2ParticipantPublicKeys extends PsbtOutputData {
748748
super(type: PsbtOutputTypes.muSig2ParticipantPublicKeys);
749749
factory PsbtOutputMuSig2ParticipantPublicKeys(
750750
{required List<int> aggregatePubKey, required List<List<int>> pubKeys}) {
751-
if (Secp256k1PublicKeyEcdsa.isValidBytes(aggregatePubKey) &&
752-
pubKeys.every(Secp256k1PublicKeyEcdsa.isValidBytes)) {
751+
if (Secp256k1PublicKey.isValidBytes(aggregatePubKey) &&
752+
pubKeys.every(Secp256k1PublicKey.isValidBytes)) {
753753
return PsbtOutputMuSig2ParticipantPublicKeys._(
754754
aggregatePubKey: aggregatePubKey,
755755
pubKeys: pubKeys,
@@ -781,8 +781,8 @@ class PsbtOutputMuSig2ParticipantPublicKeys extends PsbtOutputData {
781781
offset, offset + EcdsaKeysConst.pubKeyCompressedByteLen);
782782
pubKeys.add(key);
783783
}
784-
if (Secp256k1PublicKeyEcdsa.isValidBytes(keypair.key.extraData!) &&
785-
pubKeys.every(Secp256k1PublicKeyEcdsa.isValidBytes)) {
784+
if (Secp256k1PublicKey.isValidBytes(keypair.key.extraData!) &&
785+
pubKeys.every(Secp256k1PublicKey.isValidBytes)) {
786786
return PsbtOutputMuSig2ParticipantPublicKeys._(
787787
aggregatePubKey: keypair.key.extraData!,
788788
pubKeys: pubKeys,

0 commit comments

Comments
 (0)