passkey_types/utils/
encoding.rs

1//! Utilitie functions for encoding datatypes in a consistent way accross the `passkey` libraries
2//! with a mind on global webauthn ecosystem support.
3
4use data_encoding::{BASE64, BASE64_NOPAD, BASE64URL, BASE64URL_NOPAD, Specification};
5
6/// Convert bytes to base64 without padding
7pub fn base64(data: &[u8]) -> String {
8    BASE64_NOPAD.encode(data)
9}
10
11/// Convert bytes to base64url without padding
12pub fn base64url(data: &[u8]) -> String {
13    BASE64URL_NOPAD.encode(data)
14}
15
16/// Try parsing from base64 with or without padding
17pub(crate) fn try_from_base64(input: &str) -> Option<Vec<u8>> {
18    let padding = BASE64.specification().padding.unwrap();
19    let sane_string = input.trim_end_matches(padding);
20    BASE64_NOPAD.decode(sane_string.as_bytes()).ok()
21}
22
23/// Try parsing from base64url with or without padding
24pub fn try_from_base64url(input: &str) -> Option<Vec<u8>> {
25    let specs = BASE64URL.specification();
26    let padding = specs.padding.unwrap();
27    let specs = Specification {
28        check_trailing_bits: false,
29        padding: None,
30        ..specs
31    };
32    let encoding = specs.encoding().unwrap();
33    let sane_string = input.trim_end_matches(padding);
34    encoding.decode(sane_string.as_bytes()).ok()
35}