Skip to content

Commit 7346c4b

Browse files
authored
Merge pull request #72 from cryspen/wysiwys/hpke-rs-libcrux
Add `XWingDraft06` KEM support to `hpke-rs`, and replace evercrypt provider with new libcrux provider
2 parents 2460bab + 7688297 commit 7346c4b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+809
-544
lines changed

.gitignore

100755100644
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Cargo.lock
33
**/*.rs.bk
44
.vscode/
5-
evercrypt_provider/target
5+
libcrux_provider/target
66
no-std-support-check/target
77
rust_crypto_provider/target
88
traits/target/

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [0.2.1] - Unreleased
99

10+
- [#72](https://github.com/cryspen/hpke-rs/pull/72):
11+
- add support for X-Wing KEM
12+
- upgrade rand dependency from 0.8 -> 0.9
13+
- replace Evercrypt provider with Libcrux provider
1014
- [#66](https://github.com/franziskuskiefer/hpke-rs/pull/66): add support for secp256k1 curve. This adds `DhKemK256 = 0x0016` to the `KemAlgorithms`
1115

1216
## [0.2.0] - 2023-12-01

Cargo.toml

100755100644
Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,48 @@
11
[package]
22
name = "hpke-rs"
3-
version = "0.2.1-pre.1"
3+
version = "0.2.1-alpha.1"
44
authors = ["Franziskus Kiefer <[email protected]>"]
55
edition = "2021"
66
license = "MPL-2.0"
77
documentation = "https://docs.rs/hpke-rs"
88
description = "HPKE Implementation"
99
readme = "Readme.md"
10-
repository = "https://github.com/franziskuskiefer/hpke-rs"
10+
repository = "https://github.com/cryspen/hpke-rs"
1111
exclude = ["/tests"]
1212

1313
[dependencies]
1414
log = "0.4"
1515
serde = { version = "1.0", features = ["derive"], optional = true }
1616
tls_codec = { version = "0.4.1-pre.1", features = ["derive"], optional = true }
1717
zeroize = { version = "1.5", features = ["zeroize_derive"] }
18-
hpke-rs-crypto = { version = "0.2.0", path = "./traits" }
18+
hpke-rs-crypto = { version = "0.3.0-alpha.1", path = "./traits", default-features = false }
19+
rand_core = { version = "0.9", default-features = false}
20+
libcrux-sha3 = { version = "0.0.2" }
1921

2022
[features]
2123
default = []
22-
std = []
24+
std = ["rand_core/std", "hpke-rs-crypto/std"]
2325
serialization = ["serde", "tls_codec", "tls_codec/serde", "std"]
2426
hazmat = []
2527
hpke-test = ["std"]
26-
hpke-test-prng = [] # ⚠️ Enable testing PRNG - DO NOT USE
28+
hpke-test-prng = [] # ⚠️ Enable testing PRNG - DO NOT USE
2729

2830
[dev-dependencies]
29-
hpke-rs-crypto = { version = "0.2.0", path = "./traits", features = ["std"] }
31+
hpke-rs-crypto = { version = "0.3.0-alpha.1", path = "./traits", features = [
32+
"std",
33+
] }
3034
serde_json = "1.0"
3135
serde = { version = "1.0", features = ["derive"] }
3236
lazy_static = "1.4"
3337
rayon = "1.5"
3438
hpke-rs = { path = ".", features = ["hpke-test", "hazmat"] }
35-
hpke-rs-rust-crypto = { version = "0.2.0", path = "./rust_crypto_provider", features = [
39+
hpke-rs-rust-crypto = { version = "0.3.0-alpha.1", path = "./rust_crypto_provider", features = [
40+
"deterministic-prng",
41+
] }
42+
hpke-rs-libcrux = { version = "0.2.0-alpha.1", path = "./libcrux_provider", features = [
3643
"deterministic-prng",
3744
] }
38-
# hpke-rs-evercrypt = { version = "0.1.3-pre.1", path = "./evercrypt_provider", features = ["deterministic-prng"] }
39-
rand = { version = "0.8" }
45+
rand = { version = "0.9" }
4046
pretty_env_logger = "0.5"
4147
criterion = { version = "0.5", features = ["html_reports"] }
4248

Readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Instead it expects an implementation of the [HpkeCrypto] trait.
5050
[crate-link]: https://crates.io/crates/hpke-rs
5151
[docs-badge]: https://img.shields.io/badge/docs-rs-blue.svg?style=for-the-badge
5252
[docs-link]: https://docs.rs/hpke-rs
53-
[evercrypt]: https://github.com/franziskuskiefer/evercrypt-rust
53+
[libcrux]: https://github.com/cryspen/libcrux
5454
[hpke (RFC 9180)]: https://www.rfc-editor.org/rfc/rfc9180.html
5555
[hpkecrypto]: https://docs.rs/hpke-rs-crypto
5656
[rustc-image]: https://img.shields.io/badge/rustc-1.56+-blue.svg?style=for-the-badge

benches/bench.rs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ use hpke_rs_crypto::{
44
types::{AeadAlgorithm, KdfAlgorithm, KemAlgorithm},
55
HpkeCrypto, RngCore,
66
};
7-
// use hpke_rs_evercrypt::*;
7+
use hpke_rs_libcrux::HpkeLibcrux;
88
use hpke_rs_rust_crypto::*;
9-
use rand::rngs::OsRng;
109

1110
const MODES: [Mode; 4] = [
1211
HpkeMode::Base,
@@ -81,13 +80,13 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
8180
(None, None)
8281
};
8382

84-
let mut group = c.benchmark_group(format!("{}", label));
83+
let mut group = c.benchmark_group(label.to_string());
8584
group.bench_function("Setup Sender", |b| {
8685
b.iter(|| {
8786
let mut hpke =
8887
Hpke::<Crypto>::new(hpke_mode, kem_mode, kdf_mode, aead_mode);
8988
hpke.setup_sender(
90-
&pk_rm,
89+
pk_rm,
9190
&info,
9291
psk.as_ref().map(Vec::as_ref),
9392
psk_id.as_ref().map(Vec::as_ref),
@@ -102,7 +101,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
102101
Hpke::<Crypto>::new(hpke_mode, kem_mode, kdf_mode, aead_mode);
103102
hpke.setup_receiver(
104103
enc,
105-
&sk_rm,
104+
sk_rm,
106105
&info,
107106
psk.as_ref().map(Vec::as_ref),
108107
psk_id.as_ref().map(Vec::as_ref),
@@ -112,24 +111,24 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
112111
})
113112
});
114113

115-
group.bench_function(&format!("Seal {}({})", AEAD_PAYLOAD, AEAD_AAD), |b| {
114+
group.bench_function(format!("Seal {}({})", AEAD_PAYLOAD, AEAD_AAD), |b| {
116115
b.iter_batched(
117116
|| {
118117
let mut hpke =
119118
Hpke::<Crypto>::new(hpke_mode, kem_mode, kdf_mode, aead_mode);
120119
let (_enc, context) = hpke
121120
.setup_sender(
122-
&pk_rm,
121+
pk_rm,
123122
&info,
124123
psk.as_ref().map(Vec::as_ref),
125124
psk_id.as_ref().map(Vec::as_ref),
126125
sk_sm.as_ref(),
127126
)
128127
.unwrap();
129128
let mut aad = vec![0u8; AEAD_AAD];
130-
OsRng.fill_bytes(&mut aad);
129+
rand::rng().fill_bytes(&mut aad);
131130
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
132-
OsRng.fill_bytes(&mut ptxt);
131+
rand::rng().fill_bytes(&mut ptxt);
133132
(context, aad, ptxt)
134133
},
135134
|(mut context, aad, ptxt)| {
@@ -138,30 +137,30 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
138137
BatchSize::SmallInput,
139138
)
140139
});
141-
group.bench_function(&format!("Open {}({})", AEAD_PAYLOAD, AEAD_AAD), |b| {
140+
group.bench_function(format!("Open {}({})", AEAD_PAYLOAD, AEAD_AAD), |b| {
142141
b.iter_batched(
143142
|| {
144143
let mut hpke =
145144
Hpke::<Crypto>::new(hpke_mode, kem_mode, kdf_mode, aead_mode);
146145
let (enc, mut sender_context) = hpke
147146
.setup_sender(
148-
&pk_rm,
147+
pk_rm,
149148
&info,
150149
psk.as_ref().map(Vec::as_ref),
151150
psk_id.as_ref().map(Vec::as_ref),
152151
sk_sm.as_ref(),
153152
)
154153
.unwrap();
155154
let mut aad = vec![0u8; AEAD_AAD];
156-
OsRng.fill_bytes(&mut aad);
155+
rand::rng().fill_bytes(&mut aad);
157156
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
158-
OsRng.fill_bytes(&mut ptxt);
157+
rand::rng().fill_bytes(&mut ptxt);
159158
let ctxt = sender_context.seal(&aad, &ptxt).unwrap();
160159

161160
let context = hpke
162161
.setup_receiver(
163162
&enc,
164-
&sk_rm,
163+
sk_rm,
165164
&info,
166165
psk.as_ref().map(Vec::as_ref),
167166
psk_id.as_ref().map(Vec::as_ref),
@@ -178,23 +177,23 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
178177
});
179178

180179
group.bench_function(
181-
&format!("Single-Shot Seal {}({})", AEAD_PAYLOAD, AEAD_AAD),
180+
format!("Single-Shot Seal {}({})", AEAD_PAYLOAD, AEAD_AAD),
182181
|b| {
183182
b.iter_batched(
184183
|| {
185184
let hpke = Hpke::<Crypto>::new(
186185
hpke_mode, kem_mode, kdf_mode, aead_mode,
187186
);
188187
let mut aad = vec![0u8; AEAD_AAD];
189-
OsRng.fill_bytes(&mut aad);
188+
rand::rng().fill_bytes(&mut aad);
190189
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
191-
OsRng.fill_bytes(&mut ptxt);
190+
rand::rng().fill_bytes(&mut ptxt);
192191
(hpke, aad, ptxt)
193192
},
194193
|(mut hpke, aad, ptxt)| {
195194
let _ctxt = hpke
196195
.seal(
197-
&pk_rm,
196+
pk_rm,
198197
&info,
199198
&aad,
200199
&ptxt,
@@ -209,7 +208,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
209208
},
210209
);
211210
group.bench_function(
212-
&format!("Single-Shot Open {}({})", AEAD_PAYLOAD, AEAD_AAD),
211+
format!("Single-Shot Open {}({})", AEAD_PAYLOAD, AEAD_AAD),
213212
|b| {
214213
b.iter_batched(
215214
|| {
@@ -218,17 +217,17 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
218217
);
219218
let (enc, mut sender_context) = hpke
220219
.setup_sender(
221-
&pk_rm,
220+
pk_rm,
222221
&info,
223222
psk.as_ref().map(Vec::as_ref),
224223
psk_id.as_ref().map(Vec::as_ref),
225224
sk_sm.as_ref(),
226225
)
227226
.unwrap();
228227
let mut aad = vec![0u8; AEAD_AAD];
229-
OsRng.fill_bytes(&mut aad);
228+
rand::rng().fill_bytes(&mut aad);
230229
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
231-
OsRng.fill_bytes(&mut ptxt);
230+
rand::rng().fill_bytes(&mut ptxt);
232231
let ctxt = sender_context.seal(&aad, &ptxt).unwrap();
233232

234233
(hpke, aad, ctxt, enc)
@@ -237,7 +236,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
237236
let _ctxt_out = hpke
238237
.open(
239238
&enc,
240-
&sk_rm,
239+
sk_rm,
241240
&info,
242241
&aad,
243242
&ctxt,
@@ -259,7 +258,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>(c: &mut Criterion) {
259258

260259
criterion_group!(
261260
benches,
262-
// benchmark::<HpkeEvercrypt>,
261+
benchmark::<HpkeLibcrux>,
263262
benchmark::<HpkeRustCrypto>,
264263
);
265264
criterion_main!(benches);

benches/manual_benches.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ use hpke_rs_crypto::{
55
types::{AeadAlgorithm, KdfAlgorithm, KemAlgorithm},
66
HpkeCrypto, RngCore,
77
};
8-
// use hpke_rs_evercrypt::*;
8+
use hpke_rs_libcrux::HpkeLibcrux;
99
use hpke_rs_rust_crypto::*;
10-
use rand::rngs::OsRng;
1110

1211
fn duration(d: Duration) -> f64 {
1312
((d.as_secs() as f64) + (d.subsec_nanos() as f64 * 1e-9)) * 1000000f64
@@ -103,7 +102,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
103102
Hpke::<Crypto>::new(hpke_mode, kem_mode, kdf_mode, aead_mode);
104103
let _sender = hpke
105104
.setup_sender(
106-
&pk_rm,
105+
pk_rm,
107106
&info,
108107
psk.as_ref().map(Vec::as_ref),
109108
psk_id.as_ref().map(Vec::as_ref),
@@ -121,7 +120,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
121120
let _receiver = hpke
122121
.setup_receiver(
123122
enc,
124-
&sk_rm,
123+
sk_rm,
125124
&info,
126125
psk.as_ref().map(Vec::as_ref),
127126
psk_id.as_ref().map(Vec::as_ref),
@@ -135,17 +134,17 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
135134

136135
let (enc, mut context) = hpke
137136
.setup_sender(
138-
&pk_rm,
137+
pk_rm,
139138
&info,
140139
psk.as_ref().map(Vec::as_ref),
141140
psk_id.as_ref().map(Vec::as_ref),
142141
sk_sm.as_ref(),
143142
)
144143
.unwrap();
145144
let mut aad = vec![0u8; AEAD_AAD];
146-
OsRng.fill_bytes(&mut aad);
145+
rand::rng().fill_bytes(&mut aad);
147146
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
148-
OsRng.fill_bytes(&mut ptxt);
147+
rand::rng().fill_bytes(&mut ptxt);
149148

150149
let mut ctxts = Vec::with_capacity((AEAD_PAYLOAD + 16) * ITERATIONS);
151150
let start = Instant::now();
@@ -165,7 +164,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
165164
let mut context = hpke
166165
.setup_receiver(
167166
&enc,
168-
&sk_rm,
167+
sk_rm,
169168
&info,
170169
psk.as_ref().map(Vec::as_ref),
171170
psk_id.as_ref().map(Vec::as_ref),
@@ -190,17 +189,17 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
190189
assert_eq!(ptxts[0], ptxt);
191190

192191
let mut aad = vec![0u8; AEAD_AAD];
193-
OsRng.fill_bytes(&mut aad);
192+
rand::rng().fill_bytes(&mut aad);
194193
let mut ptxt = vec![0u8; AEAD_PAYLOAD];
195-
OsRng.fill_bytes(&mut ptxt);
194+
rand::rng().fill_bytes(&mut ptxt);
196195

197196
let mut enc = Vec::<u8>::new();
198197
let mut ctxt = Vec::<u8>::new();
199198
let start = Instant::now();
200199
for _ in 0..ITERATIONS {
201200
let (new_enc, new_ctxt) = hpke
202201
.seal(
203-
&pk_rm,
202+
pk_rm,
204203
&info,
205204
&aad,
206205
&ptxt,
@@ -227,7 +226,7 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
227226
ptxt_out = hpke
228227
.open(
229228
&enc,
230-
&sk_rm,
229+
sk_rm,
231230
&info,
232231
&aad,
233232
&ctxt,
@@ -253,6 +252,6 @@ fn benchmark<Crypto: HpkeCrypto + 'static>() {
253252
}
254253

255254
fn main() {
256-
// benchmark::<HpkeEvercrypt>();
255+
benchmark::<HpkeLibcrux>();
257256
benchmark::<HpkeRustCrypto>();
258257
}

evercrypt_provider/Cargo.toml

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)