Skip to content

Commit 8e8ccfa

Browse files
committed
Add tests for the CRYPTO_VAR_LOCK variable
1 parent d9b2f9c commit 8e8ccfa

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ script:
3838
- cargo test --verbose --features="rand rand-std"
3939
- cargo test --verbose --features="rand serde"
4040
- cargo test --verbose --features="rand serde recovery endomorphism"
41+
- cargo test --verbose --lib --features=fuzztarget -- --test-threads=1 # 1 thread is required so that we can have 2 tests setting the `UNSAFE_CRYPTO_FUZZING` variable.
4142
- cargo build --verbose
4243
- cargo test --verbose
4344
- cargo build --verbose --release

src/ecdh.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ impl SharedSecret {
162162
}
163163
}
164164

165-
#[cfg(test)]
165+
#[cfg(all(test, not(feature = "fuzztarget")))]
166166
mod tests {
167167
use rand::thread_rng;
168168
use super::SharedSecret;

src/key.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ impl<'de> ::serde::Deserialize<'de> for PublicKey {
443443
}
444444
}
445445

446-
#[cfg(test)]
446+
#[cfg(all(test, not(feature = "fuzztarget")))]
447447
mod test {
448448
use Secp256k1;
449449
use from_hex;

src/lib.rs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,7 @@ fn from_hex(hex: &str, target: &mut [u8]) -> Result<usize, ()> {
707707
}
708708

709709

710-
#[cfg(test)]
710+
#[cfg(all(test, not(feature = "fuzztarget")))]
711711
mod tests {
712712
use rand::{RngCore, thread_rng};
713713
use std::str::FromStr;
@@ -1160,3 +1160,66 @@ mod benches {
11601160
});
11611161
}
11621162
}
1163+
1164+
#[cfg(all(test, feature = "fuzztarget"))]
1165+
mod test_fuzz {
1166+
use super::*;
1167+
use std::str::FromStr;
1168+
use std::panic::{self, UnwindSafe};
1169+
1170+
1171+
pub fn crashed_for_fuzz<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> bool {
1172+
if let Err(e) = panic::catch_unwind(f) {
1173+
if let Some(st) = e.downcast_ref::<&str>() {
1174+
return st.contains(ffi::UNSAFE_CRYPTO_WARNING);
1175+
}
1176+
}
1177+
false
1178+
}
1179+
1180+
#[test]
1181+
fn fuzz_not_set_var() {
1182+
unsafe {ffi::UNSAFE_CRYPTO_FUZZING = false};
1183+
assert!(crashed_for_fuzz(|| SecretKey::from_slice(&[2; 32])));
1184+
assert!(crashed_for_fuzz(|| PublicKey::from_slice(&[2; 33])));
1185+
assert!(crashed_for_fuzz(|| Signature::from_compact(&[3; 64])));
1186+
assert!(crashed_for_fuzz(|| Secp256k1::new()));
1187+
assert!(crashed_for_fuzz(|| {
1188+
let mut sec = SecretKey::from_str("01010101010101010001020304050607ffff0000ffff00006363636363636363").unwrap();
1189+
let _ = sec.add_assign(&[2u8; 32]);
1190+
}));
1191+
assert!(crashed_for_fuzz(|| {
1192+
let mut sec = SecretKey::from_str("01010101010101010001020304050607ffff0000ffff00006363636363636363").unwrap();
1193+
let _ = sec.mul_assign(&[2u8; 32]);
1194+
}));
1195+
assert!(crashed_for_fuzz(|| {
1196+
let sig: Signature = unsafe { std::mem::transmute::<_, ffi::Signature>([3u8; 64]).into() };
1197+
let _ = sig.serialize_compact();
1198+
}));
1199+
1200+
assert!(crashed_for_fuzz(|| {
1201+
let pubkey1: PublicKey = unsafe { std::mem::transmute::<_, ffi::PublicKey>([3u8; 64]).into() };
1202+
let pubkey2: PublicKey = unsafe { std::mem::transmute::<_, ffi::PublicKey>([5u8; 64]).into() };
1203+
let _ = pubkey1.combine(&pubkey2);
1204+
}));
1205+
}
1206+
1207+
#[test]
1208+
fn fuzz_set_var_not_crash() {
1209+
unsafe {ffi::UNSAFE_CRYPTO_FUZZING = true;}
1210+
let _ = SecretKey::from_slice(&[2; 32]);
1211+
let _ = PublicKey::from_slice(&[2; 33]);
1212+
let _ = Signature::from_compact(&[3; 64]);
1213+
let _ = Secp256k1::new();
1214+
let mut sec = SecretKey::from_str("01010101010101010001020304050607ffff0000ffff00006363636363636363").unwrap();
1215+
let _ = sec.add_assign(&[2u8; 32]);
1216+
let mut sec = SecretKey::from_str("01010101010101010001020304050607ffff0000ffff00006363636363636363").unwrap();
1217+
let _ = sec.mul_assign(&[2u8; 32]);
1218+
let sig: Signature = unsafe { std::mem::transmute::<_, ffi::Signature>([3u8; 64]).into() };
1219+
let _ = sig.serialize_compact();
1220+
let pubkey1: PublicKey = unsafe { std::mem::transmute::<_, ffi::PublicKey>([3u8; 64]).into() };
1221+
let pubkey2: PublicKey = unsafe { std::mem::transmute::<_, ffi::PublicKey>([5u8; 64]).into() };
1222+
let _ = pubkey1.combine(&pubkey2);
1223+
}
1224+
}
1225+

0 commit comments

Comments
 (0)