Skip to content

Commit 83dd352

Browse files
Merge rust-bitcoin/rust-secp256k1#842: Add API test and fix up SecretKey API
44dae89894f8e40069f717f5746206cb83703e06 key/secret: encapsulate SecretKey in module that enforces invariants (Andrew Poelstra) 41bb44294cb883740d938b16f0874424e095c018 key: add {from,to,as}_secret_bytes methods (Andrew Poelstra) 9b84072757d3916969d7c8ed6ba08e3e749044cc move SecretKey into its own module (Andrew Poelstra) e86555ad3e2991cfa72a0fb7725b50b3a6c9f352 move key.rs to key/mod.rs (Andrew Poelstra) 0619163ea2df49f70e0d30e36186af8a2506ec18 tests: add API test (Andrew Poelstra) 4853f671312782e871baad9ae745278f0cc78cd6 test: remove deprecated StepRng (Andrew Poelstra) Pull request description: Now that we unconditionally have a global context object we can basically redo the whole API of this crate to avoid requiring these objects (although for the next release we should continue to support the old API, to make the transition easier). We know a lot more about Rust and API design than we did when we put together the old one, so we can do this in a consistent and principled way. This isn't a huge crate. We should be able to do the "main" data structures (`SecretKey', `PublicKey`, `ecdsa::Signature`, `schnorr:Signature`, `Message`) in a week or so, then cut a new release which enables context-free keygen, verification and signing. ACKs for top commit: tcharding: ACK 44dae89894f8e40069f717f5746206cb83703e06 Tree-SHA512: 60659532b7ac65c85ac0c7bf9b78d0f080d4b3f556a02623bcb2b737ab73d02bf493153f751b435c7be5041435900870868b4e18b321207d50aaceb96b2f56da
2 parents 2eb2be9 + 9294038 commit 83dd352

File tree

15 files changed

+523
-424
lines changed

15 files changed

+523
-424
lines changed

Cargo-minimal.lock

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,15 @@ dependencies = [
183183
"getrandom",
184184
]
185185

186+
[[package]]
187+
name = "rand_xoshiro"
188+
version = "0.7.0"
189+
source = "registry+https://github.com/rust-lang/crates.io-index"
190+
checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41"
191+
dependencies = [
192+
"rand_core",
193+
]
194+
186195
[[package]]
187196
name = "rustversion"
188197
version = "1.0.20"
@@ -204,7 +213,7 @@ dependencies = [
204213
"getrandom",
205214
"hex_lit",
206215
"rand",
207-
"rand_core",
216+
"rand_xoshiro",
208217
"secp256k1-sys",
209218
"serde",
210219
"serde_cbor",

Cargo-recent.lock

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,15 @@ dependencies = [
174174
"getrandom",
175175
]
176176

177+
[[package]]
178+
name = "rand_xoshiro"
179+
version = "0.7.0"
180+
source = "registry+https://github.com/rust-lang/crates.io-index"
181+
checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41"
182+
dependencies = [
183+
"rand_core",
184+
]
185+
177186
[[package]]
178187
name = "rustversion"
179188
version = "1.0.20"
@@ -195,7 +204,7 @@ dependencies = [
195204
"getrandom",
196205
"hex_lit",
197206
"rand",
198-
"rand_core",
207+
"rand_xoshiro",
199208
"secp256k1-sys",
200209
"serde",
201210
"serde_cbor",

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ rand = { version = "0.9", default-features = false, optional = true }
4242
serde = { version = "1.0.103", default-features = false, optional = true }
4343

4444
[dev-dependencies]
45-
rand_core = "0.9"
45+
rand_xoshiro = { version = "0.7.0", default-features = false }
4646
serde_cbor = "0.10.0"
4747
serde_test = "1.0.19"
4848
bincode = "1.3.3"

examples/sign_verify.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ fn sign<C: Signing>(
3636
seckey: [u8; 32],
3737
) -> Result<ecdsa::Signature, Error> {
3838
let msg = Message::from_digest(msg_digest);
39-
let seckey = SecretKey::from_byte_array(seckey)?;
39+
let seckey = SecretKey::from_secret_bytes(seckey)?;
4040
Ok(secp.sign_ecdsa(msg, &seckey))
4141
}
4242

examples/sign_verify_recovery.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn sign_recovery(
1515
seckey: [u8; 32],
1616
) -> Result<ecdsa::RecoverableSignature, Error> {
1717
let msg = Message::from_digest(msg_digest);
18-
let seckey = SecretKey::from_byte_array(seckey)?;
18+
let seckey = SecretKey::from_secret_bytes(seckey)?;
1919
Ok(ecdsa::RecoverableSignature::sign_ecdsa_recoverable(msg, &seckey))
2020
}
2121

src/ecdsa/recovery.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ impl RecoverableSignature {
170170
let mut ret = ffi::RecoverableSignature::new();
171171
// xor the secret key and message together to get a rerandomization seed
172172
// for timing analysis defense-in-depth
173-
let mut rerandomize = sk.secret_bytes();
173+
let mut rerandomize = sk.to_secret_bytes();
174174
for (rera, byte) in rerandomize.iter_mut().zip(msg[..].iter()) {
175175
*rera ^= *byte;
176176
}
@@ -272,7 +272,7 @@ mod tests {
272272
#[cfg(not(secp256k1_fuzz))] // fixed sig vectors can't work with fuzz-sigs
273273
#[rustfmt::skip]
274274
fn sign() {
275-
let sk = SecretKey::from_byte_array(ONE).unwrap();
275+
let sk = SecretKey::from_secret_bytes(ONE).unwrap();
276276
let msg = Message::from_digest(ONE);
277277
let sig = RecoverableSignature::sign_ecdsa_recoverable(msg, &sk);
278278

@@ -292,7 +292,7 @@ mod tests {
292292
#[cfg(not(secp256k1_fuzz))] // fixed sig vectors can't work with fuzz-sigs
293293
#[rustfmt::skip]
294294
fn sign_with_noncedata() {
295-
let sk = SecretKey::from_byte_array(ONE).unwrap();
295+
let sk = SecretKey::from_secret_bytes(ONE).unwrap();
296296
let noncedata = [42u8; 32];
297297
let msg = Message::from_digest(ONE);
298298

src/ellswift.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl ElligatorSwift {
111111
/// # #[cfg(feature = "alloc")] {
112112
/// use secp256k1::{ellswift::ElligatorSwift, PublicKey, Secp256k1, SecretKey};
113113
/// let secp = Secp256k1::new();
114-
/// let sk = SecretKey::from_slice(&[1; 32]).unwrap();
114+
/// let sk = SecretKey::from_secret_bytes([1; 32]).unwrap();
115115
/// let es = ElligatorSwift::from_seckey(&secp, sk, None);
116116
/// # }
117117
/// ```
@@ -140,7 +140,7 @@ impl ElligatorSwift {
140140
/// # #[cfg(feature = "alloc")] {
141141
/// use secp256k1::{ellswift::ElligatorSwift, PublicKey, Secp256k1, SecretKey};
142142
/// let secp = Secp256k1::new();
143-
/// let sk = SecretKey::from_slice(&[1; 32]).unwrap();
143+
/// let sk = SecretKey::from_secret_bytes([1; 32]).unwrap();
144144
/// let pk = PublicKey::from_secret_key(&secp, &sk);
145145
/// let es = ElligatorSwift::from_pubkey(pk);
146146
/// # }
@@ -377,7 +377,7 @@ mod tests {
377377
// Test that we can round trip an ElligatorSwift encoding
378378
let secp = crate::Secp256k1::new();
379379
let public_key =
380-
PublicKey::from_secret_key(&secp, &SecretKey::from_byte_array([1u8; 32]).unwrap());
380+
PublicKey::from_secret_key(&secp, &SecretKey::from_secret_bytes([1u8; 32]).unwrap());
381381

382382
let ell = ElligatorSwift::from_pubkey(public_key);
383383
let pk = PublicKey::from_ellswift(ell);
@@ -391,10 +391,10 @@ mod tests {
391391
let rand32 = [1u8; 32];
392392
let priv32 = [1u8; 32];
393393
let ell =
394-
ElligatorSwift::from_seckey(&secp, SecretKey::from_byte_array(rand32).unwrap(), None);
394+
ElligatorSwift::from_seckey(&secp, SecretKey::from_secret_bytes(rand32).unwrap(), None);
395395
let pk = PublicKey::from_ellswift(ell);
396396
let expected =
397-
PublicKey::from_secret_key(&secp, &SecretKey::from_byte_array(priv32).unwrap());
397+
PublicKey::from_secret_key(&secp, &SecretKey::from_secret_bytes(priv32).unwrap());
398398

399399
assert_eq!(pk, expected);
400400
}
@@ -407,13 +407,13 @@ mod tests {
407407
let priv32 = [2u8; 32];
408408
let ell = ElligatorSwift::from_seckey(
409409
&secp,
410-
SecretKey::from_byte_array(rand32).unwrap(),
410+
SecretKey::from_secret_bytes(rand32).unwrap(),
411411
Some(rand32),
412412
);
413413
let pk = ElligatorSwift::shared_secret_with_hasher(
414414
ell,
415415
ell,
416-
SecretKey::from_byte_array(priv32).unwrap(),
416+
SecretKey::from_secret_bytes(priv32).unwrap(),
417417
Party::Initiator,
418418
|_, _, _| ElligatorSwiftSharedSecret([0xff; 32]),
419419
);
@@ -627,7 +627,7 @@ mod tests {
627627
ElligatorSwift::from_array(ellswift_theirs),
628628
)
629629
};
630-
let sec_key = SecretKey::from_byte_array(my_secret).unwrap();
630+
let sec_key = SecretKey::from_secret_bytes(my_secret).unwrap();
631631
let initiator = if initiator == 0 { Party::Responder } else { Party::Initiator };
632632

633633
let shared = ElligatorSwift::shared_secret(el_a, el_b, sec_key, initiator);

0 commit comments

Comments
 (0)