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
|
//! * hash and size of the compressed NAR
|
||||||
|
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
use data_encoding::{BASE64, HEXLOWER};
|
use data_encoding::HEXLOWER;
|
||||||
use std::{
|
use std::{
|
||||||
fmt::{self, Display},
|
fmt::{self, Display},
|
||||||
mem,
|
mem,
|
||||||
|
@ -30,6 +30,10 @@ use crate::{
|
||||||
store_path::StorePathRef,
|
store_path::StorePathRef,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mod signature;
|
||||||
|
|
||||||
|
pub use signature::{Signature, SignatureError};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct NarInfo<'a> {
|
pub struct NarInfo<'a> {
|
||||||
pub flags: Flags,
|
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> {
|
pub fn parse_ca(s: &str) -> Option<CAHash> {
|
||||||
let (tag, s) = s.split_once(':')?;
|
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