pub fn mix_key_exchange(
private_key: &PrivateKey,
public_key: &PublicKey,
) -> Result<Vec<u8>>Expand description
Mix a PrivateKey with another client PublicKey to get a secret shared between the two parties.
§Arguments
private_key- The user’sPrivateKeyobtained throughgenerate_keypair().public_key- The peer’sPublicKey.
§Returns
Returns a shared secret in the form of a Vec<u8>, which can then be used
as an encryption key between the two parties.
§Example
use std::convert::TryFrom as _;
use devolutions_crypto::key::{PublicKey, PrivateKey, generate_keypair, mix_key_exchange, KeyVersion};
// This happens on Bob's side.
let bob_keypair = generate_keypair(KeyVersion::Latest);
let bob_serialized_pub: Vec<u8> = bob_keypair.public_key.into();
send_key_to_alice(&bob_serialized_pub);
// This happens on Alice's side.
let alice_keypair = generate_keypair(KeyVersion::Latest);
let alice_serialized_pub: Vec<u8> = alice_keypair.public_key.into();
send_key_to_bob(&alice_serialized_pub);
// Bob can now generate the shared secret.
let alice_received_serialized_pub = receive_key_from_alice();
let alice_received_pub = PublicKey::try_from(alice_received_serialized_pub.as_slice()).unwrap();
let bob_shared = mix_key_exchange(&bob_keypair.private_key, &alice_received_pub).unwrap();
// Alice can now generate the shared secret
let bob_received_serialized_pub = receive_key_from_bob();
let bob_received_pub = PublicKey::try_from(bob_received_serialized_pub.as_slice()).unwrap();
let alice_shared = mix_key_exchange(&alice_keypair.private_key, &bob_received_pub).unwrap();
// They now have a shared secret!
assert_eq!(bob_shared, alice_shared);