diff options
Diffstat (limited to 'tvix/nix-compat/src/narinfo/mod.rs')
-rw-r--r-- | tvix/nix-compat/src/narinfo/mod.rs | 57 |
1 files changed, 5 insertions, 52 deletions
diff --git a/tvix/nix-compat/src/narinfo/mod.rs b/tvix/nix-compat/src/narinfo/mod.rs index 2392b89737d4..ac904099453e 100644 --- a/tvix/nix-compat/src/narinfo/mod.rs +++ b/tvix/nix-compat/src/narinfo/mod.rs @@ -18,7 +18,7 @@ //! * hash and size of the compressed NAR use bitflags::bitflags; -use data_encoding::{BASE64, HEXLOWER}; +use data_encoding::HEXLOWER; use std::{ fmt::{self, Display}, mem, @@ -30,6 +30,10 @@ use crate::{ store_path::StorePathRef, }; +mod signature; + +pub use signature::{Signature, SignatureError}; + #[derive(Debug)] pub struct NarInfo<'a> { pub flags: Flags, @@ -330,57 +334,6 @@ impl Display for NarInfo<'_> { } } -#[derive(Debug)] -pub struct Signature<'a> { - name: &'a str, - bytes: [u8; 64], -} - -impl<'a> Signature<'a> { - pub fn parse(input: &'a str) -> Result<Signature<'a>, SignatureError> { - let (name, bytes64) = input - .split_once(':') - .ok_or(SignatureError::MissingSeparator)?; - - let mut buf = [0; 66]; - let mut bytes = [0; 64]; - match BASE64.decode_mut(bytes64.as_bytes(), &mut buf) { - Ok(64) => { - bytes.copy_from_slice(&buf[..64]); - } - Ok(n) => return Err(SignatureError::InvalidSignatureLen(n)), - // keeping DecodePartial gets annoying lifetime-wise - Err(_) => return Err(SignatureError::DecodeError(input.to_string())), - } - - Ok(Signature { name, bytes }) - } - - pub fn name(&self) -> &'a str { - self.name - } - - pub fn bytes(&self) -> &[u8; 64] { - &self.bytes - } -} - -#[derive(Debug, thiserror::Error)] -pub enum SignatureError { - #[error("Missing separator")] - MissingSeparator, - #[error("Invalid signature len: {0}")] - InvalidSignatureLen(usize), - #[error("Unable to base64-decode signature: {0}")] - DecodeError(String), -} - -impl Display for Signature<'_> { - fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result { - write!(w, "{}:{}", self.name, BASE64.encode(&self.bytes)) - } -} - pub fn parse_ca(s: &str) -> Option<CAHash> { let (tag, s) = s.split_once(':')?; |