pub mod antiklepto;
pub mod api;
pub mod error;
pub mod interpreter;
pub mod noise;
pub mod policy;
pub mod proto;
pub mod sign;
pub mod u2f;
pub use interpreter::{
BitBoxCommand, BitBoxDeviceInfo, BitBoxInterpreter, BitBoxResponse, BitBoxTransmit,
};
use std::fmt;
use zeroize::{Zeroize, ZeroizeOnDrop};
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
pub struct SetupEntropy([u8; 32]);
impl SetupEntropy {
pub fn new(entropy: [u8; 32]) -> Self {
Self(entropy)
}
pub(crate) fn as_bytes(&self) -> &[u8; 32] {
&self.0
}
}
impl fmt::Debug for SetupEntropy {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("SetupEntropy([REDACTED])")
}
}
#[derive(Clone, Debug)]
pub enum SetupMode {
NewWallet {
entropy: SetupEntropy,
},
RestoreFromMnemonic,
}
#[derive(Clone, Debug)]
pub enum ManagementContext {
Setup {
mode: SetupMode,
timestamp: u32,
timezone_offset: i32,
},
Restore {
timestamp: u32,
timezone_offset: i32,
},
}
pub const BITBOX02_VID: u16 = 0x03eb;
pub const BITBOX02_PID: u16 = 0x2403;
pub const BITBOX02_HID_USAGE_PAGE: u16 = 0xffff;
pub const BITBOX02_PRODUCT_STRINGS: &[&str] = &[
"BitBox02",
"BitBox02BTC",
"BitBox02 Nova Multi",
"BitBox02 Nova BTC-only",
];
pub const OP_UNLOCK: u8 = b'u';
pub const OP_I_CAN_HAS_HANDSHAEK: u8 = b'h';
pub const OP_HER_COMEZ_TEH_HANDSHAEK: u8 = b'H';
pub const OP_I_CAN_HAS_PAIRIN_VERIFICASHUN: u8 = b'v';
pub const OP_NOISE_MSG: u8 = b'n';
pub const RESPONSE_SUCCESS: u8 = 0x00;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn setup_entropy_debug_is_redacted() {
let entropy = SetupEntropy::new([42; 32]);
let debug = format!("{entropy:?}");
assert_eq!(debug, "SetupEntropy([REDACTED])");
assert!(!debug.contains("42"));
}
}