Skip to content

Commit 3346454

Browse files
authored
Add migration guide to changelog (#393)
1 parent a1624a9 commit 3346454

File tree

3 files changed

+136
-2
lines changed

3 files changed

+136
-2
lines changed

CHANGELOG.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,39 @@
1010
* Modified the dummy registration file to only contain the public key
1111
instead of the keypair
1212
* **Breaking: existing `ServerSetup`s need to be updated**
13+
```rust
14+
// Given `old` is a `ServerSetup` from `opaque-ke` v3.
15+
let old_serialized = old.serialize();
16+
17+
type OldSeedLen = <<<OldCipherSuite as opaque_ke_3::CipherSuite>::OprfCs as voprf::CipherSuite>::Hash as OutputSizeUser>::OutputSize;
18+
type OldSkLen = <<OldCipherSuite as opaque_ke_3::CipherSuite>::KeGroup as opaque_ke_3::key_exchange::group::KeGroup>::SkLen;
19+
20+
let (old_serialied_rest, old_fake_keypair_serialized): (
21+
GenericArray<u8, Sum<OldSeedLen, OldSkLen>>,
22+
_,
23+
) = old_serialized.split();
24+
25+
let old_fake_keypair =
26+
KeyPair::<<OldCipherSuite as opaque_ke_3::CipherSuite>::KeGroup>::from_private_key_slice(
27+
&old_fake_keypair_serialized,
28+
)
29+
.unwrap();
30+
let old_fake_pk_serialized = old_fake_keypair.public().serialize();
31+
32+
let new_serialized = old_serialied_rest.concat(old_fake_pk_serialized);
33+
// Given `NewCipherSuite` is a `CipherSuite` implementation equivalent to `OldCipherSuite`.
34+
ServerSetup::<NewCipherSuite>::deserialize(&new_serialized).unwrap()
35+
```
1336
* Added remote OPRF seed support
1437
* Replace remote private key trait with a state machine, facilitating async support.
1538
* Serde de/serialization formats have been simplified
16-
* **Breaking: existing `RegistrationUpload`s may need to be updated**
39+
* **Breaking: existing `ServerRegistration`s may need to be updated**
40+
```rust
41+
// Given `old` is a `ServerRegistration` from `opaque-ke` v3.
42+
let old_serialized = old.serialize();
43+
// Given `NewCipherSuite` is a `CipherSuite` implementation equivalent to the old cipher suite.
44+
ServerRegistration::<NewCipherSuite>::deserialize(&old_serialized).unwrap()
45+
```
1746

1847

1948
## 3.0.0 (October 10, 2024)

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ name = "opaque-ke"
1010
readme = "README.md"
1111
repository = "https://github.com/facebook/opaque-ke"
1212
rust-version = "1.85"
13-
version = "3.0.0"
13+
version = "4.0.0-pre.0"
1414

1515
[features]
1616
argon2 = ["dep:argon2"]
@@ -73,6 +73,7 @@ criterion = "0.5"
7373
cryptoki = "0.9"
7474
elliptic-curve = { version = "0.13", features = ["alloc", "pkcs8"] }
7575
hex = "0.4"
76+
opaque-ke-3 = { package = "opaque-ke", version = "=3.0.0" }
7677
p256 = { version = "0.13", default-features = false, features = [
7778
"ecdsa",
7879
"hash2curve",

tests/migration.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
use digest::OutputSizeUser;
2+
use generic_array::GenericArray;
3+
use generic_array::sequence::{Concat, Split};
4+
use generic_array::typenum::Sum;
5+
use opaque_ke::ksf::Identity;
6+
use opaque_ke::{CipherSuite, ClientLogin, ServerLogin, ServerRegistration, ServerSetup, TripleDh};
7+
use opaque_ke_3::key_exchange::group::KeGroup as v3KeGroup;
8+
use opaque_ke_3::key_exchange::tripledh::TripleDh as v3TripleDh;
9+
use opaque_ke_3::keypair::KeyPair;
10+
use opaque_ke_3::ksf::Identity as v3Identity;
11+
use opaque_ke_3::{
12+
CipherSuite as v3CipherSuite, ClientRegistration as v3ClientRegistration,
13+
ServerRegistration as v3ServerRegistration, ServerSetup as v3ServerSetup,
14+
};
15+
use p256::NistP256;
16+
use rand::rngs::OsRng;
17+
use sha2::Sha256;
18+
19+
const PASSWORD: &[u8] = b"test password";
20+
const CLIENT_IDENTIFIER: &[u8] = b"test client identifier";
21+
22+
struct OldCipherSuite;
23+
24+
impl v3CipherSuite for OldCipherSuite {
25+
type OprfCs = NistP256;
26+
type KeGroup = NistP256;
27+
type KeyExchange = v3TripleDh;
28+
type Ksf = v3Identity;
29+
}
30+
31+
struct NewCipherSuite;
32+
33+
impl CipherSuite for NewCipherSuite {
34+
type OprfCs = NistP256;
35+
type KeyExchange = TripleDh<NistP256, Sha256>;
36+
type Ksf = Identity;
37+
}
38+
39+
#[test]
40+
fn registration_upload() {
41+
// V3 registration.
42+
let result = v3ClientRegistration::<OldCipherSuite>::start(&mut OsRng, PASSWORD).unwrap();
43+
let client = result.state;
44+
45+
let old_server_setup = v3ServerSetup::<OldCipherSuite>::new(&mut OsRng);
46+
let response =
47+
v3ServerRegistration::start(&old_server_setup, result.message, CLIENT_IDENTIFIER)
48+
.unwrap()
49+
.message;
50+
51+
let upload = client
52+
.finish(&mut OsRng, PASSWORD, response, Default::default())
53+
.unwrap()
54+
.message;
55+
56+
let old_registration = v3ServerRegistration::finish(upload);
57+
58+
// `ServerSetup` migration.
59+
let server_setup = {
60+
let old_serialized = old_server_setup.serialize();
61+
62+
type OldSeedLen = <<<OldCipherSuite as v3CipherSuite>::OprfCs as voprf::CipherSuite>::Hash as OutputSizeUser>::OutputSize;
63+
type OldSkLen = <<OldCipherSuite as v3CipherSuite>::KeGroup as v3KeGroup>::SkLen;
64+
let (old_serialied_rest, old_fake_keypair_serialized): (
65+
GenericArray<u8, Sum<OldSeedLen, OldSkLen>>,
66+
_,
67+
) = old_serialized.split();
68+
let old_fake_keypair =
69+
KeyPair::<<OldCipherSuite as v3CipherSuite>::KeGroup>::from_private_key_slice(
70+
&old_fake_keypair_serialized,
71+
)
72+
.unwrap();
73+
let old_fake_pk_serialized = old_fake_keypair.public().serialize();
74+
75+
let new_serialized = old_serialied_rest.concat(old_fake_pk_serialized);
76+
ServerSetup::<NewCipherSuite>::deserialize(&new_serialized).unwrap()
77+
};
78+
79+
// `ServerRegistration` migration.
80+
let old_registration_serialized = old_registration.serialize();
81+
let registration =
82+
ServerRegistration::<NewCipherSuite>::deserialize(&old_registration_serialized).unwrap();
83+
84+
// Check if new `ServerRegistration` still works.
85+
let result = ClientLogin::<NewCipherSuite>::start(&mut OsRng, PASSWORD).unwrap();
86+
let client = result.state;
87+
88+
let result = ServerLogin::start(
89+
&mut OsRng,
90+
&server_setup,
91+
Some(registration),
92+
result.message,
93+
CLIENT_IDENTIFIER,
94+
Default::default(),
95+
)
96+
.unwrap();
97+
let server = result.state;
98+
99+
let result = client
100+
.finish(&mut OsRng, PASSWORD, result.message, Default::default())
101+
.unwrap();
102+
103+
server.finish(result.message, Default::default()).unwrap();
104+
}

0 commit comments

Comments
 (0)