use crate::TinkError;
use std::convert::TryFrom;
use tink_proto::OutputPrefixType;
pub const NON_RAW_PREFIX_SIZE: usize = 5;
pub const LEGACY_PREFIX_SIZE: usize = NON_RAW_PREFIX_SIZE;
pub const LEGACY_START_BYTE: u8 = 0;
pub const TINK_PREFIX_SIZE: usize = NON_RAW_PREFIX_SIZE;
pub const TINK_START_BYTE: u8 = 1;
pub const RAW_PREFIX_SIZE: usize = 0;
pub const RAW_PREFIX: Vec<u8> = Vec::new();
pub fn output_prefix(key: &tink_proto::keyset::Key) -> Result<Vec<u8>, TinkError> {
match OutputPrefixType::try_from(key.output_prefix_type) {
Ok(OutputPrefixType::Legacy) | Ok(OutputPrefixType::Crunchy) => Ok(create_output_prefix(
LEGACY_PREFIX_SIZE,
LEGACY_START_BYTE,
key.key_id,
)),
Ok(OutputPrefixType::Tink) => Ok(create_output_prefix(
TINK_PREFIX_SIZE,
TINK_START_BYTE,
key.key_id,
)),
Ok(OutputPrefixType::Raw) => Ok(RAW_PREFIX),
Ok(OutputPrefixType::UnknownPrefix) | Err(_) => {
Err("cryptofmt: unknown output prefix type".into())
}
}
}
fn create_output_prefix(size: usize, start_byte: u8, key_id: crate::KeyId) -> Vec<u8> {
let mut prefix = Vec::with_capacity(size);
prefix.push(start_byte);
prefix.extend_from_slice(&key_id.to_be_bytes());
prefix
}