use sha2::{Sha256, Digest};
use std::sync::Mutex;
use super::dh::DH;
use crate::peer::Peer;
pub struct KeyChain {
top: Mutex<[u8; 32]>
}
impl KeyChain {
pub fn new(init: [u8; 32]) -> KeyChain {
KeyChain {
top: Mutex::new(init)
}
}
pub fn new_from_peer(peer: Peer, dh: DH) -> KeyChain {
KeyChain {
top: Mutex::new(dh.get_key_0_sha256(peer))
}
}
pub fn current(&self) -> [u8; 32] {
*self.top.lock().unwrap()
}
pub fn update(&self, block: [u8; 32]) {
let mut top = self.top.lock().unwrap();
let mut hasher = Sha256::new();
hasher.update(*top);
hasher.update(block);
*top = hasher.finalize().into();
}
}