diff options
Diffstat (limited to 'tvix/nix-compat/src/narinfo')
-rw-r--r-- | tvix/nix-compat/src/narinfo/mod.rs | 57 | ||||
-rw-r--r-- | tvix/nix-compat/src/narinfo/signature.rs | 54 |
2 files changed, 59 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(':')?; diff --git a/tvix/nix-compat/src/narinfo/signature.rs b/tvix/nix-compat/src/narinfo/signature.rs new file mode 100644 index 000000000000..5a7481591ce5 --- /dev/null +++ b/tvix/nix-compat/src/narinfo/signature.rs @@ -0,0 +1,54 @@ +use std::fmt::{self, Display}; + +use data_encoding::BASE64; + +#[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)) + } +} |