use super::crypto::SignatureScheme;
pub const TICKET_BYTE_LEN: usize = 65;
const SCHEME_TO_BYTE: [SignatureScheme; 4] = [
SignatureScheme::Ed25519,
SignatureScheme::Sr25519,
SignatureScheme::Ecdsa,
SignatureScheme::Eth,
];
pub fn scheme_to_byte(scheme: SignatureScheme) -> u8 {
match scheme {
SignatureScheme::Ed25519 => 0,
SignatureScheme::Sr25519 => 1,
SignatureScheme::Ecdsa => 2,
SignatureScheme::Eth => 3,
}
}
pub fn byte_to_scheme(byte: u8) -> Option<SignatureScheme> {
SCHEME_TO_BYTE.get(byte as usize).copied()
}
pub fn pack_ticket(scheme: SignatureScheme, hash: &[u8; 32], secret: &[u8; 32]) -> [u8; TICKET_BYTE_LEN] {
let mut bytes = [0u8; TICKET_BYTE_LEN];
bytes[0] = scheme_to_byte(scheme);
bytes[1..33].copy_from_slice(hash);
bytes[33..65].copy_from_slice(secret);
bytes
}
pub fn unpack_scheme(bytes: &[u8; TICKET_BYTE_LEN]) -> Option<SignatureScheme> {
byte_to_scheme(bytes[0])
}
pub fn unpack_hash(bytes: &[u8; TICKET_BYTE_LEN]) -> [u8; 32] {
let mut h = [0u8; 32];
h.copy_from_slice(&bytes[1..33]);
h
}
pub fn unpack_secret(bytes: &[u8; TICKET_BYTE_LEN]) -> [u8; 32] {
let mut s = [0u8; 32];
s.copy_from_slice(&bytes[33..65]);
s
}