paket/libpaket/src/locker/regtoken.rs
2024-08-16 19:54:49 +02:00

48 lines
1.4 KiB
Rust

use base64::{engine::general_purpose, Engine as _};
use hmac::{Mac, SimpleHmac};
use sha2::Sha256;
use crate::{LibraryResult, LibraryError};
pub struct RegToken {
token: Vec<u8>,
}
impl RegToken {
pub fn parse_from_qrcode_uri(uri: &str) -> LibraryResult<RegToken> {
if uri.len() <= 23 {
return Err(LibraryError::DecodeError("RegTokenUri too short".to_string()));
}
if !uri.starts_with("urn:dhl.de:regtoken:v1:") {
return Err(LibraryError::DecodeError("RegTokenUri has invalid magic".to_string()));
}
let token = &uri[23..];
let token = general_purpose::STANDARD.decode(token);
let Ok(mut token) = token else {
return Err(LibraryError::DecodeError("RegTokenUri not decodeable (base64)".to_string()));
};
if token.len() > 64 {
return Err(LibraryError::DecodeError("RegToken longer than expected".to_string()));
}
if token.len() < 32 {
token.extend(vec![0; 32 - token.len()].iter())
}
Ok(RegToken { token })
}
pub fn customer_password(&self) -> String {
general_purpose::STANDARD.encode(&self.token[32..])
}
pub fn hmac(&self) -> SimpleHmac<Sha256> {
let mac = SimpleHmac::<Sha256>::new_from_slice(&self.token[0..32])
.expect("HMAC can take key of any size");
mac
}
}