refactor(nix-compat/narinfo): move signature into separate file
Change-Id: Ic257475e2afebf059c5317c1cc5b04ba63d5d318 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10078 Tested-by: BuildkiteCI Autosubmit: flokli <flokli@flokli.de> Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
parent
6039b97b55
commit
a5749fada5
2 changed files with 59 additions and 52 deletions
|
@ -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(':')?;
|
||||
|
||||
|
|
54
tvix/nix-compat/src/narinfo/signature.rs
Normal file
54
tvix/nix-compat/src/narinfo/signature.rs
Normal file
|
@ -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))
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue