use base64::engine::general_purpose::STANDARD;
use base64::{DecodeError, Engine};
use std::time::SystemTime;
#[allow(dead_code)]
pub(crate) fn system_timestamp() -> u64 {
match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
Ok(n) => n.as_secs(),
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
}
}
pub(crate) fn base64_url_to_base64(encoded_string: &str) -> String {
let replaced_string = encoded_string.replace('/', "+").replace('_', "-");
if replaced_string.len() % 4 != 0 {
return replaced_string.clone() + &"=".repeat(4 - replaced_string.len() % 4);
}
replaced_string
}
pub trait StringExt {
fn as_der_bytes(&self) -> Result<Vec<u8>, DecodeError>;
}
impl StringExt for String {
fn as_der_bytes(&self) -> Result<Vec<u8>, DecodeError> {
STANDARD.decode(self)
}
}
impl StringExt for &str {
fn as_der_bytes(&self) -> Result<Vec<u8>, DecodeError> {
STANDARD.decode(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_base64_url_to_base64() {
let encoded_string = "aGVsbG8gd29ybGQh";
let result = base64_url_to_base64(encoded_string);
assert_eq!(result, "aGVsbG8gd29ybGQh");
let encoded_string_padding = "aGVsbG8gd29ybz";
let result_padding = base64_url_to_base64(encoded_string_padding);
assert_eq!(result_padding, "aGVsbG8gd29ybz==");
}
}