Skip to content

Commit 7d8d547

Browse files
committed
Merge #842: Add API test and fix up SecretKey API
44dae89 key/secret: encapsulate SecretKey in module that enforces invariants (Andrew Poelstra) 41bb442 key: add {from,to,as}_secret_bytes methods (Andrew Poelstra) 9b84072 move SecretKey into its own module (Andrew Poelstra) e86555a move key.rs to key/mod.rs (Andrew Poelstra) 0619163 tests: add API test (Andrew Poelstra) 4853f67 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 44dae89 Tree-SHA512: 60659532b7ac65c85ac0c7bf9b78d0f080d4b3f556a02623bcb2b737ab73d02bf493153f751b435c7be5041435900870868b4e18b321207d50aaceb96b2f56da
2 parents 6ca9f58 + 44dae89 commit 7d8d547

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)