mod dh_root;
mod message;
use dh_root::DhRootRatchet;
use message::MessageRatchet;
use ring::agreement::EphemeralPrivateKey;
use crate::key::{HeaderKey, MessageKey, SecretKey};
#[derive(Debug)]
pub struct Ratchetx2 {
dh_root: DhRootRatchet,
msgs: MessageRatchet,
msgr: MessageRatchet,
dh_step_s: bool,
}
impl PartialEq for Ratchetx2 {
fn eq(&self, other: &Self) -> bool {
self.dh_root == other.dh_root && self.msgs == other.msgr && self.msgr == other.msgs
}
}
impl Ratchetx2 {
pub fn alice(
secret_key: SecretKey,
public_key: &[u8],
header_key_alice: HeaderKey,
header_key_bob: HeaderKey,
) -> Self {
let mut this = Self {
dh_root: DhRootRatchet::alice(secret_key),
msgs: MessageRatchet::empty(header_key_alice),
msgr: MessageRatchet::empty(header_key_bob),
dh_step_s: true,
};
this.step_dh_root(public_key);
this
}
pub fn bob(
secret_key: SecretKey,
private_key: EphemeralPrivateKey,
header_key_alice: HeaderKey,
header_key_bob: HeaderKey,
) -> Self {
Self {
dh_root: DhRootRatchet::bob(secret_key, private_key),
msgs: MessageRatchet::empty(header_key_bob),
msgr: MessageRatchet::empty(header_key_alice),
dh_step_s: false,
}
}
pub fn public_key(&self) -> Vec<u8> {
self.dh_root.public_key()
}
pub fn header_key_s(&self) -> HeaderKey {
self.msgs.header_key
}
pub fn header_key_r(&self) -> HeaderKey {
self.msgr.header_key
}
pub fn next_header_key_r(&self) -> HeaderKey {
self.msgr.next_header_key
}
pub fn step_msgs(&mut self) -> MessageKey {
self.msgs.step()
}
pub fn step_msgr(&mut self) -> MessageKey {
self.msgr.step()
}
pub fn step_dh_root(&mut self, public_key: &[u8]) {
let (chain_key, next_header_key) = self.dh_root.step(public_key);
match self.dh_step_s {
true => {
self.msgs =
MessageRatchet::from_key(chain_key, self.msgs.next_header_key, next_header_key)
}
false => {
self.msgr =
MessageRatchet::from_key(chain_key, self.msgr.next_header_key, next_header_key)
}
}
self.dh_step_s = !self.dh_step_s;
}
}