Require Kyber keys/ciphertexts throughout all XDH APIs

This commit is contained in:
Jordan Rose
2025-06-13 16:06:07 -07:00
committed by GitHub
parent 3157a9be55
commit 2879220e93
26 changed files with 287 additions and 891 deletions

View File

@@ -100,13 +100,11 @@ pub async fn create_pre_key_bundle<R: Rng + CryptoRng>(
signed_pre_key_id.into(),
signed_pre_key_pair.public_key,
signed_pre_key_signature.to_vec(),
*store.get_identity_key_pair().await?.identity_key(),
)?;
let pre_key_bundle = pre_key_bundle.with_kyber_pre_key(
kyber_pre_key_id.into(),
kyber_pre_key_pair.public_key.clone(),
kyber_pre_key_signature.to_vec(),
);
*store.get_identity_key_pair().await?.identity_key(),
)?;
store
.save_pre_key(
@@ -143,44 +141,6 @@ pub async fn create_pre_key_bundle<R: Rng + CryptoRng>(
Ok(pre_key_bundle)
}
pub fn initialize_sessions_v3() -> Result<(SessionRecord, SessionRecord), SignalProtocolError> {
let mut csprng = OsRng.unwrap_err();
let alice_identity = IdentityKeyPair::generate(&mut csprng);
let bob_identity = IdentityKeyPair::generate(&mut csprng);
let alice_base_key = KeyPair::generate(&mut csprng);
let bob_base_key = KeyPair::generate(&mut csprng);
let bob_ephemeral_key = bob_base_key;
let alice_params = AliceSignalProtocolParameters::new(
alice_identity,
alice_base_key,
*bob_identity.identity_key(),
bob_base_key.public_key,
bob_ephemeral_key.public_key,
UsePQRatchet::No,
);
let alice_session = initialize_alice_session_record(&alice_params, &mut csprng)?;
let bob_params = BobSignalProtocolParameters::new(
bob_identity,
bob_base_key,
None,
bob_ephemeral_key,
None,
*alice_identity.identity_key(),
alice_base_key.public_key,
None,
UsePQRatchet::No,
);
let bob_session = initialize_bob_session_record(&bob_params)?;
Ok((alice_session, bob_session))
}
pub fn initialize_sessions_v4() -> Result<(SessionRecord, SessionRecord), SignalProtocolError> {
let mut csprng = OsRng.unwrap_err();
let alice_identity = IdentityKeyPair::generate(&mut csprng);
@@ -199,9 +159,9 @@ pub fn initialize_sessions_v4() -> Result<(SessionRecord, SessionRecord), Signal
*bob_identity.identity_key(),
bob_base_key.public_key,
bob_ephemeral_key.public_key,
bob_kyber_key.public_key.clone(),
UsePQRatchet::No,
)
.with_their_kyber_pre_key(&bob_kyber_key.public_key);
);
let alice_session = initialize_alice_session_record(&alice_params, &mut csprng)?;
let kyber_ciphertext = {
@@ -217,10 +177,10 @@ pub fn initialize_sessions_v4() -> Result<(SessionRecord, SessionRecord), Signal
bob_base_key,
None,
bob_ephemeral_key,
Some(bob_kyber_key),
bob_kyber_key,
*alice_identity.identity_key(),
alice_base_key.public_key,
Some(&kyber_ciphertext),
&kyber_ciphertext,
UsePQRatchet::No,
);
@@ -393,14 +353,19 @@ impl TestStoreBuilder {
.expect("has signed pre key")
})
.expect("contains at least one signed pre key");
let maybe_kyber_pre_key_record = self.store.all_kyber_pre_key_ids().max().map(|id| {
self.store
.get_kyber_pre_key(*id)
.now_or_never()
.expect("sync")
.expect("has kyber pre key")
});
let mut bundle = PreKeyBundle::new(
let kyber_pre_key_record = self
.store
.all_kyber_pre_key_ids()
.max()
.map(|id| {
self.store
.get_kyber_pre_key(*id)
.now_or_never()
.expect("sync")
.expect("has kyber pre key")
})
.expect("contains at least one kyber key");
PreKeyBundle::new(
registration_id,
device_id,
maybe_pre_key_record.map(|rec| {
@@ -412,17 +377,12 @@ impl TestStoreBuilder {
signed_pre_key_record.id().expect("has id"),
signed_pre_key_record.public_key().expect("has public key"),
signed_pre_key_record.signature().expect("has signature"),
kyber_pre_key_record.id().expect("has id"),
kyber_pre_key_record.public_key().expect("has public key"),
kyber_pre_key_record.signature().expect("has signature"),
*identity_key,
)
.expect("can make pre key bundle from store");
if let Some(rec) = maybe_kyber_pre_key_record {
bundle = bundle.with_kyber_pre_key(
rec.id().expect("has id"),
rec.public_key().expect("has public key"),
rec.signature().expect("has signature"),
);
}
bundle
.expect("can make pre key bundle from store")
}
fn sign(&mut self, message: &[u8]) -> Box<[u8]> {