Skip to content

Commit 9eee936

Browse files
authored
Move to ZeroizeOnDrop (#54)
* Move from `Zeroize` to `ZeroizeOnDrop` * Pin pre-release dependencies
1 parent b59b359 commit 9eee936

File tree

3 files changed

+26
-42
lines changed

3 files changed

+26
-42
lines changed

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ std = ["alloc"]
2727

2828
[dependencies]
2929
curve25519-dalek = { version = "3", default-features = false, optional = true }
30-
derive-where = { version = "1.0.0-rc.1", features = ["zeroize"] }
30+
derive-where = { version = "=1.0.0-rc.2", features = ["zeroize-on-drop"] }
3131
digest = "0.10"
3232
displaydoc = { version = "0.2", default-features = false }
33-
elliptic-curve = { version = "0.12.0-pre.1", features = [
33+
elliptic-curve = { version = "=0.12.0-pre.1", features = [
3434
"hash2curve",
3535
"sec1",
3636
"voprf",
@@ -42,13 +42,13 @@ serde_ = { version = "1", package = "serde", default-features = false, features
4242
], optional = true }
4343
sha2 = { version = "0.10", default-features = false, optional = true }
4444
subtle = { version = "2.3", default-features = false }
45-
zeroize = { version = "1", default-features = false }
45+
zeroize = { version = "1.5", default-features = false }
4646

4747
[dev-dependencies]
4848
generic-array = { version = "0.14", features = ["more_lengths"] }
4949
hex = "0.4"
5050
json = "0.12"
51-
p256 = { version = "0.11.0-pre.0", default-features = false, features = [
51+
p256 = { version = "=0.11.0-pre.0", default-features = false, features = [
5252
"hash2curve",
5353
"voprf",
5454
] }

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@
476476
//!
477477
//! [curve25519-dalek]: (https://doc.dalek.rs/curve25519_dalek/index.html#backends-and-features)
478478
479-
#![deny(unsafe_code)]
479+
#![cfg_attr(not(test), deny(unsafe_code))]
480480
#![no_std]
481481
#![warn(
482482
clippy::cargo,

src/voprf.rs

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use alloc::vec::Vec;
1212
use core::iter::{self, Map, Repeat, Zip};
1313

14-
use derive_where::DeriveWhere;
14+
use derive_where::derive_where;
1515
use digest::core_api::BlockSizeUser;
1616
use digest::{Digest, Output, OutputSizeUser};
1717
use generic_array::sequence::Concat;
@@ -64,8 +64,7 @@ impl Mode {
6464

6565
/// A client which engages with a [NonVerifiableServer] in base mode, meaning
6666
/// that the OPRF outputs are not verifiable.
67-
#[derive(DeriveWhere)]
68-
#[derive_where(Clone, Zeroize(drop))]
67+
#[derive_where(Clone, ZeroizeOnDrop)]
6968
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar)]
7069
#[cfg_attr(
7170
feature = "serde",
@@ -83,8 +82,7 @@ where
8382

8483
/// A client which engages with a [VerifiableServer] in verifiable mode, meaning
8584
/// that the OPRF outputs can be checked against a server public key.
86-
#[derive(DeriveWhere)]
87-
#[derive_where(Clone, Zeroize(drop))]
85+
#[derive_where(Clone, ZeroizeOnDrop)]
8886
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
8987
#[cfg_attr(
9088
feature = "serde",
@@ -104,8 +102,7 @@ where
104102

105103
/// A server which engages with a [NonVerifiableClient] in base mode, meaning
106104
/// that the OPRF outputs are not verifiable.
107-
#[derive(DeriveWhere)]
108-
#[derive_where(Clone, Zeroize(drop))]
105+
#[derive_where(Clone, ZeroizeOnDrop)]
109106
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar)]
110107
#[cfg_attr(
111108
feature = "serde",
@@ -123,8 +120,7 @@ where
123120

124121
/// A server which engages with a [VerifiableClient] in verifiable mode, meaning
125122
/// that the OPRF outputs can be checked against a server public key.
126-
#[derive(DeriveWhere)]
127-
#[derive_where(Clone, Zeroize(drop))]
123+
#[derive_where(Clone, ZeroizeOnDrop)]
128124
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
129125
#[cfg_attr(
130126
feature = "serde",
@@ -144,8 +140,7 @@ where
144140

145141
/// A proof produced by a [VerifiableServer] that the OPRF output matches
146142
/// against a server public key.
147-
#[derive(DeriveWhere)]
148-
#[derive_where(Clone, Zeroize(drop))]
143+
#[derive_where(Clone, ZeroizeOnDrop)]
149144
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar)]
150145
#[cfg_attr(
151146
feature = "serde",
@@ -165,8 +160,7 @@ where
165160

166161
/// The first client message sent from a client (either verifiable or not) to a
167162
/// server (either verifiable or not).
168-
#[derive(DeriveWhere)]
169-
#[derive_where(Clone, Zeroize(drop))]
163+
#[derive_where(Clone, ZeroizeOnDrop)]
170164
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Elem)]
171165
#[cfg_attr(
172166
feature = "serde",
@@ -183,8 +177,7 @@ where
183177

184178
/// The server's response to the [BlindedElement] message from a client (either
185179
/// verifiable or not) to a server (either verifiable or not).
186-
#[derive(DeriveWhere)]
187-
#[derive_where(Clone, Zeroize(drop))]
180+
#[derive_where(Clone, ZeroizeOnDrop)]
188181
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Elem)]
189182
#[cfg_attr(
190183
feature = "serde",
@@ -768,7 +761,6 @@ where
768761
/////////////////////////
769762

770763
/// Contains the fields that are returned by a non-verifiable client blind
771-
#[derive(DeriveWhere)]
772764
#[derive_where(Debug; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
773765
pub struct NonVerifiableClientBlindResult<CS: CipherSuite>
774766
where
@@ -782,7 +774,6 @@ where
782774
}
783775

784776
/// Contains the fields that are returned by a verifiable client blind
785-
#[derive(DeriveWhere)]
786777
#[derive_where(Debug; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
787778
pub struct VerifiableClientBlindResult<CS: CipherSuite>
788779
where
@@ -804,7 +795,6 @@ pub type VerifiableClientBatchFinalizeResult<'a, C, I, II, IC, IM> = FinalizeAft
804795
>;
805796

806797
/// Contains the fields that are returned by a verifiable server evaluate
807-
#[derive(DeriveWhere)]
808798
#[derive_where(Debug; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
809799
pub struct VerifiableServerEvaluateResult<CS: CipherSuite>
810800
where
@@ -819,8 +809,7 @@ where
819809

820810
/// Contains prepared [`EvaluationElement`]s by a verifiable server batch
821811
/// evaluate preparation.
822-
#[derive(DeriveWhere)]
823-
#[derive_where(Clone, Zeroize(drop))]
812+
#[derive_where(Clone, ZeroizeOnDrop)]
824813
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Elem)]
825814
#[cfg_attr(
826815
feature = "serde",
@@ -833,8 +822,7 @@ where
833822
IsLess<U256> + IsLessOrEqual<<CS::Hash as BlockSizeUser>::BlockSize>;
834823

835824
/// Contains the prepared `t` by a verifiable server batch evaluate preparation.
836-
#[derive(DeriveWhere)]
837-
#[derive_where(Clone, Zeroize(drop))]
825+
#[derive_where(Clone, ZeroizeOnDrop)]
838826
#[derive_where(Debug, Eq, Hash, Ord, PartialEq, PartialOrd; <CS::Group as Group>::Scalar)]
839827
#[cfg_attr(
840828
feature = "serde",
@@ -863,7 +851,6 @@ pub type VerifiableServerBatchEvaluatePreparedEvaluationElements<CS, I> = Map<
863851

864852
/// Contains the fields that are returned by a verifiable server batch evaluate
865853
/// preparation.
866-
#[derive(DeriveWhere)]
867854
#[derive_where(Debug; I, <CS::Group as Group>::Scalar)]
868855
pub struct VerifiableServerBatchEvaluatePrepareResult<
869856
'a,
@@ -889,7 +876,6 @@ pub type VerifiableServerBatchEvaluateFinishedMessages<'a, CS, I> = Map<
889876

890877
/// Contains the fields that are returned by a verifiable server batch evaluate
891878
/// finish.
892-
#[derive(DeriveWhere)]
893879
#[derive_where(Debug; <&'a I as core::iter::IntoIterator>::IntoIter, <CS::Group as Group>::Scalar)]
894880
pub struct VerifiableServerBatchEvaluateFinishResult<'a, CS: 'a + CipherSuite, I>
895881
where
@@ -904,7 +890,6 @@ where
904890
}
905891

906892
/// Contains the fields that are returned by a verifiable server batch evaluate
907-
#[derive(DeriveWhere)]
908893
#[derive_where(Debug; <CS::Group as Group>::Scalar, <CS::Group as Group>::Elem)]
909894
#[cfg(feature = "alloc")]
910895
pub struct VerifiableServerBatchEvaluateResult<CS: CipherSuite>
@@ -1319,13 +1304,13 @@ where
13191304
#[cfg(test)]
13201305
mod tests {
13211306
use core::ops::Add;
1307+
use core::ptr;
13221308

13231309
use ::alloc::vec;
13241310
use ::alloc::vec::Vec;
13251311
use generic_array::typenum::Sum;
13261312
use generic_array::ArrayLength;
13271313
use rand::rngs::OsRng;
1328-
use zeroize::Zeroize;
13291314

13301315
use super::*;
13311316
use crate::Group;
@@ -1579,11 +1564,11 @@ mod tests {
15791564
let client_blind_result = NonVerifiableClient::<CS>::blind(input, &mut rng).unwrap();
15801565

15811566
let mut state = client_blind_result.state;
1582-
Zeroize::zeroize(&mut state);
1567+
unsafe { ptr::drop_in_place(&mut state) };
15831568
assert!(state.serialize().iter().all(|&x| x == 0));
15841569

15851570
let mut message = client_blind_result.message;
1586-
Zeroize::zeroize(&mut message);
1571+
unsafe { ptr::drop_in_place(&mut message) };
15871572
assert!(message.serialize().iter().all(|&x| x == 0));
15881573
}
15891574

@@ -1599,11 +1584,11 @@ mod tests {
15991584
let client_blind_result = VerifiableClient::<CS>::blind(input, &mut rng).unwrap();
16001585

16011586
let mut state = client_blind_result.state;
1602-
Zeroize::zeroize(&mut state);
1587+
unsafe { ptr::drop_in_place(&mut state) };
16031588
assert!(state.serialize().iter().all(|&x| x == 0));
16041589

16051590
let mut message = client_blind_result.message;
1606-
Zeroize::zeroize(&mut message);
1591+
unsafe { ptr::drop_in_place(&mut message) };
16071592
assert!(message.serialize().iter().all(|&x| x == 0));
16081593
}
16091594

@@ -1617,16 +1602,15 @@ mod tests {
16171602
let mut rng = OsRng;
16181603
let client_blind_result = NonVerifiableClient::<CS>::blind(input, &mut rng).unwrap();
16191604
let server = NonVerifiableServer::<CS>::new(&mut rng);
1620-
let message = server
1605+
let mut message = server
16211606
.evaluate(&client_blind_result.message, Some(info))
16221607
.unwrap();
16231608

16241609
let mut state = server;
1625-
Zeroize::zeroize(&mut state);
1610+
unsafe { ptr::drop_in_place(&mut state) };
16261611
assert!(state.serialize().iter().all(|&x| x == 0));
16271612

1628-
let mut message = message;
1629-
Zeroize::zeroize(&mut message);
1613+
unsafe { ptr::drop_in_place(&mut message) };
16301614
assert!(message.serialize().iter().all(|&x| x == 0));
16311615
}
16321616

@@ -1649,15 +1633,15 @@ mod tests {
16491633
.unwrap();
16501634

16511635
let mut state = server;
1652-
Zeroize::zeroize(&mut state);
1636+
unsafe { ptr::drop_in_place(&mut state) };
16531637
assert!(state.serialize().iter().all(|&x| x == 0));
16541638

16551639
let mut message = server_result.message;
1656-
Zeroize::zeroize(&mut message);
1640+
unsafe { ptr::drop_in_place(&mut message) };
16571641
assert!(message.serialize().iter().all(|&x| x == 0));
16581642

16591643
let mut proof = server_result.proof;
1660-
Zeroize::zeroize(&mut proof);
1644+
unsafe { ptr::drop_in_place(&mut proof) };
16611645
assert!(proof.serialize().iter().all(|&x| x == 0));
16621646
}
16631647

0 commit comments

Comments
 (0)