#![allow(dead_code)]
use rand::{CryptoRng, RngCore};
pub struct ScriptedRng {
bytes: Vec<u8>,
pos: usize,
}
impl ScriptedRng {
pub fn new(blocks: &[&[u8]]) -> Self {
Self {
bytes: blocks.concat(),
pos: 0,
}
}
fn take(&mut self, n: usize) -> &[u8] {
let end = self.pos + n;
assert!(
end <= self.bytes.len(),
"ScriptedRng exhausted: requested {n} bytes at offset {} of {}",
self.pos,
self.bytes.len()
);
let out = &self.bytes[self.pos..end];
self.pos = end;
out
}
}
impl RngCore for ScriptedRng {
fn next_u32(&mut self) -> u32 {
u32::from_le_bytes(self.take(4).try_into().unwrap())
}
fn next_u64(&mut self) -> u64 {
u64::from_le_bytes(self.take(8).try_into().unwrap())
}
fn fill_bytes(&mut self, dst: &mut [u8]) {
let n = dst.len();
dst.copy_from_slice(self.take(n));
}
}
impl CryptoRng for ScriptedRng {}
use hiss::noise::{Curve, P256};
use hiss::provider::{CryptoKeyProvider, EphemeralOnly, ProviderExt};
pub fn private_key(
seed: &[u8; 32],
) -> <EphemeralOnly<ScriptedRng> as CryptoKeyProvider<P256>>::PrivateKey {
let mut p = EphemeralOnly::new(ScriptedRng::new(&[seed]));
p.generate::<P256>().unwrap()
}
pub fn public_key(seed: &[u8; 32]) -> <P256 as Curve>::PublicKey {
let mut p = EphemeralOnly::new(ScriptedRng::new(&[seed]));
let sk = p.generate::<P256>().unwrap();
p.public(&sk).unwrap()
}
use std::cell::RefCell;
use std::collections::VecDeque;
use std::rc::Rc;
#[derive(Clone, Default)]
pub struct PeerStream {
written: Rc<RefCell<Vec<u8>>>,
inbound: Rc<RefCell<VecDeque<u8>>>,
}
impl PeerStream {
pub fn new() -> Self {
Self::default()
}
pub fn feed(&self, bytes: &[u8]) {
self.inbound.borrow_mut().extend(bytes.iter().copied());
}
pub fn take_written(&self) -> Vec<u8> {
std::mem::take(&mut *self.written.borrow_mut())
}
pub fn remaining(&self) -> usize {
self.inbound.borrow().len()
}
}
impl std::io::Read for PeerStream {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let mut q = self.inbound.borrow_mut();
let n = q.len().min(buf.len());
for slot in buf.iter_mut().take(n) {
*slot = q.pop_front().unwrap();
}
Ok(n)
}
}
impl std::io::Write for PeerStream {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.written.borrow_mut().extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}