pub struct Protocol<SK, ESK, SIG, S, KDF, CIPHER>where
SK: SecretKey,
ESK: SecretKey,
SIG: Signature,
S: ProtocolStorage<SK, SK::PK, SIG>,
KDF: Kdf,
CIPHER: Aead,{
pub storage: S,
/* private fields */
}
Expand description
X3DH Protocol.
Fields§
§storage: S
Protocol
key storage.
Implementations§
source§impl<SK, ESK, SIG, S, KDF, CIPHER> Protocol<SK, ESK, SIG, S, KDF, CIPHER>where
SK: SecretKey + DiffieHellman<PK = <SK as SecretKey>::PK> + From<ESK>,
<SK as SecretKey>::PK: ToVec + Verify<SIG = SIG>,
ESK: SecretKey + Generate,
SIG: Signature,
S: ProtocolStorage<SK, <SK as SecretKey>::PK, SIG>,
KDF: Kdf,
<SK as DiffieHellman>::SSK: ToVec,
CIPHER: Aead,
XxxDhError: From<<<SK as SecretKey>::PK as Verify>::E> + From<<CIPHER as Aead>::E> + From<<KDF as Kdf>::E>,
impl<SK, ESK, SIG, S, KDF, CIPHER> Protocol<SK, ESK, SIG, S, KDF, CIPHER>where SK: SecretKey + DiffieHellman<PK = <SK as SecretKey>::PK> + From<ESK>, <SK as SecretKey>::PK: ToVec + Verify<SIG = SIG>, ESK: SecretKey + Generate, SIG: Signature, S: ProtocolStorage<SK, <SK as SecretKey>::PK, SIG>, KDF: Kdf, <SK as DiffieHellman>::SSK: ToVec, CIPHER: Aead, XxxDhError: From<<<SK as SecretKey>::PK as Verify>::E> + From<<CIPHER as Aead>::E> + From<<KDF as Kdf>::E>,
sourcepub fn new(
identity_keypair: KeyPair<SK>,
prekey_keypair: KeyPair<SK>,
prekey_signature: SIG,
onetime_keypairs: Option<Vec<KeyPair<SK>>>
) -> Self
pub fn new( identity_keypair: KeyPair<SK>, prekey_keypair: KeyPair<SK>, prekey_signature: SIG, onetime_keypairs: Option<Vec<KeyPair<SK>>> ) -> Self
Examples found in repository?
examples/basic.rs (lines 20-27)
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
fn main() {
// Instantiate Alice protocol.
let alice_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_signature = alice_identity.sign(&alice_prekey.to_public().to_vec());
let mut alice_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(alice_identity, alice_prekey, alice_signature, None);
// Instantiate Bob protocol.
let onetime_keypair = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_signature = bob_identity.sign(&bob_prekey.to_public().to_vec());
let mut bob_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(
bob_identity,
bob_prekey,
bob_signature,
Some(vec![onetime_keypair]),
);
// Derive shared secret for Alice and prepare message for Bob.
let bob_identity = bob_protocol.storage.get_identity_key_pair().to_public();
let bob_prekey = bob_protocol.storage.get_prekey_pair().to_public();
let bob_signature = bob_protocol
.storage
.get_signature(&bob_prekey)
.unwrap()
.unwrap();
let onetime_key = bob_protocol.storage.provide_ontime_key().unwrap().unwrap();
let (alice_identity, alice_ephemeral_key, bob_onetime_key, alice_sk, nonce, ciphertext) =
alice_protocol
.prepare_init_msg(&bob_identity, &bob_prekey, bob_signature, onetime_key)
.unwrap();
// Derive shared secret for Bob using Alice credentials.
let bob_sk = bob_protocol
.derive_shared_secret(
&alice_identity,
&alice_ephemeral_key,
&bob_onetime_key,
&nonce,
&ciphertext,
)
.unwrap();
println!("Alice shared secret: {:?}", alice_sk);
println!("Bob shared secret: {:?}", bob_sk);
}
sourcepub fn prepare_init_msg(
&mut self,
receiver_identity: &<SK as SecretKey>::PK,
receiver_prekey: &<SK as SecretKey>::PK,
receiver_prekey_signature: &SIG,
receiver_onetime_key: &<SK as SecretKey>::PK
) -> XxxDhResult<(<SK as SecretKey>::PK, <SK as SecretKey>::PK, <SK as SecretKey>::PK, Vec<u8>, Vec<u8>, Vec<u8>)>
pub fn prepare_init_msg( &mut self, receiver_identity: &<SK as SecretKey>::PK, receiver_prekey: &<SK as SecretKey>::PK, receiver_prekey_signature: &SIG, receiver_onetime_key: &<SK as SecretKey>::PK ) -> XxxDhResult<(<SK as SecretKey>::PK, <SK as SecretKey>::PK, <SK as SecretKey>::PK, Vec<u8>, Vec<u8>, Vec<u8>)>
Derive secret key and create initial message using receiver’s keys.
Examples found in repository?
examples/basic.rs (line 63)
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
fn main() {
// Instantiate Alice protocol.
let alice_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_signature = alice_identity.sign(&alice_prekey.to_public().to_vec());
let mut alice_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(alice_identity, alice_prekey, alice_signature, None);
// Instantiate Bob protocol.
let onetime_keypair = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_signature = bob_identity.sign(&bob_prekey.to_public().to_vec());
let mut bob_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(
bob_identity,
bob_prekey,
bob_signature,
Some(vec![onetime_keypair]),
);
// Derive shared secret for Alice and prepare message for Bob.
let bob_identity = bob_protocol.storage.get_identity_key_pair().to_public();
let bob_prekey = bob_protocol.storage.get_prekey_pair().to_public();
let bob_signature = bob_protocol
.storage
.get_signature(&bob_prekey)
.unwrap()
.unwrap();
let onetime_key = bob_protocol.storage.provide_ontime_key().unwrap().unwrap();
let (alice_identity, alice_ephemeral_key, bob_onetime_key, alice_sk, nonce, ciphertext) =
alice_protocol
.prepare_init_msg(&bob_identity, &bob_prekey, bob_signature, onetime_key)
.unwrap();
// Derive shared secret for Bob using Alice credentials.
let bob_sk = bob_protocol
.derive_shared_secret(
&alice_identity,
&alice_ephemeral_key,
&bob_onetime_key,
&nonce,
&ciphertext,
)
.unwrap();
println!("Alice shared secret: {:?}", alice_sk);
println!("Bob shared secret: {:?}", bob_sk);
}
Derive secret key from sender’s message.
Examples found in repository?
examples/basic.rs (lines 69-75)
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
fn main() {
// Instantiate Alice protocol.
let alice_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let alice_signature = alice_identity.sign(&alice_prekey.to_public().to_vec());
let mut alice_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(alice_identity, alice_prekey, alice_signature, None);
// Instantiate Bob protocol.
let onetime_keypair = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_identity = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_prekey = x25519_ristretto::KeyPair::generate_with(OsRng);
let bob_signature = bob_identity.sign(&bob_prekey.to_public().to_vec());
let mut bob_protocol = Protocol::<
x25519_ristretto::SecretKey,
x25519_ristretto::EphemeralSecretKey,
x25519_ristretto::Signature,
inmem::Storage<_, _>,
sha256::Kdf,
aead::aes_gcm::Aes256Gcm,
>::new(
bob_identity,
bob_prekey,
bob_signature,
Some(vec![onetime_keypair]),
);
// Derive shared secret for Alice and prepare message for Bob.
let bob_identity = bob_protocol.storage.get_identity_key_pair().to_public();
let bob_prekey = bob_protocol.storage.get_prekey_pair().to_public();
let bob_signature = bob_protocol
.storage
.get_signature(&bob_prekey)
.unwrap()
.unwrap();
let onetime_key = bob_protocol.storage.provide_ontime_key().unwrap().unwrap();
let (alice_identity, alice_ephemeral_key, bob_onetime_key, alice_sk, nonce, ciphertext) =
alice_protocol
.prepare_init_msg(&bob_identity, &bob_prekey, bob_signature, onetime_key)
.unwrap();
// Derive shared secret for Bob using Alice credentials.
let bob_sk = bob_protocol
.derive_shared_secret(
&alice_identity,
&alice_ephemeral_key,
&bob_onetime_key,
&nonce,
&ciphertext,
)
.unwrap();
println!("Alice shared secret: {:?}", alice_sk);
println!("Bob shared secret: {:?}", bob_sk);
}
Auto Trait Implementations§
impl<SK, ESK, SIG, S, KDF, CIPHER> RefUnwindSafe for Protocol<SK, ESK, SIG, S, KDF, CIPHER>where CIPHER: RefUnwindSafe, ESK: RefUnwindSafe, KDF: RefUnwindSafe, S: RefUnwindSafe, SIG: RefUnwindSafe, SK: RefUnwindSafe,
impl<SK, ESK, SIG, S, KDF, CIPHER> Send for Protocol<SK, ESK, SIG, S, KDF, CIPHER>where CIPHER: Send, ESK: Send, KDF: Send, S: Send, SIG: Send, SK: Send,
impl<SK, ESK, SIG, S, KDF, CIPHER> Sync for Protocol<SK, ESK, SIG, S, KDF, CIPHER>where CIPHER: Sync, ESK: Sync, KDF: Sync, S: Sync, SIG: Sync, SK: Sync,
impl<SK, ESK, SIG, S, KDF, CIPHER> Unpin for Protocol<SK, ESK, SIG, S, KDF, CIPHER>where CIPHER: Unpin, ESK: Unpin, KDF: Unpin, S: Unpin, SIG: Unpin, SK: Unpin,
impl<SK, ESK, SIG, S, KDF, CIPHER> UnwindSafe for Protocol<SK, ESK, SIG, S, KDF, CIPHER>where CIPHER: UnwindSafe, ESK: UnwindSafe, KDF: UnwindSafe, S: UnwindSafe, SIG: UnwindSafe, SK: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more