about summary refs log tree commit diff
path: root/tvix/nix-compat/src/narinfo/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/nix-compat/src/narinfo/mod.rs')
-rw-r--r--tvix/nix-compat/src/narinfo/mod.rs57
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(':')?;