#[derive(Debug, Eq, PartialEq)]
pub(crate) struct Encoding {
pub hash_scheme: &'static str,
pub public_key_scheme: &'static str,
pub secret_key_scheme: &'static str,
pub signature_scheme: &'static str,
pub delimiter: char,
pub combine: char,
pub fragment_delimiter: Option<char>,
}
pub(crate) const URI_ENCODING: &Encoding = &Encoding {
hash_scheme: "crypto:hash:",
public_key_scheme: "crypto:pub:key:",
secret_key_scheme: "crypto:sec:key:",
signature_scheme: "crypto:sig:",
delimiter: ':',
combine: '+',
fragment_delimiter: Some('#'),
};
pub(crate) const DASHERIZED_ENCODING: &Encoding = &Encoding {
hash_scheme: "crypto-hash-",
public_key_scheme: "crypto-pub-key-",
secret_key_scheme: "crypto-sec-key-",
signature_scheme: "crypto-sig-",
delimiter: '-',
combine: '_',
fragment_delimiter: None,
};
pub trait Encodable {
fn to_uri_string(&self) -> String;
fn to_dasherized_string(&self) -> String;
}
macro_rules! impl_encodable {
($scheme:ident, $name:ident, $alg:expr) => {
impl crate::encoding::Encodable for $name {
#[inline]
fn to_uri_string(&self) -> String {
use subtle_encoding::bech32::{self, Bech32};
Bech32::new(
bech32::DEFAULT_CHARSET,
$crate::encoding::URI_ENCODING.delimiter,
)
.encode(
$crate::encoding::URI_ENCODING.$scheme.to_owned() + $alg,
&self.0[..],
)
}
#[inline]
fn to_dasherized_string(&self) -> String {
use subtle_encoding::bech32::{self, Bech32};
Bech32::new(
bech32::DEFAULT_CHARSET,
$crate::encoding::DASHERIZED_ENCODING.delimiter,
)
.encode(
$crate::encoding::DASHERIZED_ENCODING.$scheme.to_owned() + $alg,
&self.0[..],
)
}
}
};
}
macro_rules! impl_encodable_hash {
($name:ident, $alg:expr) => {
impl_encodable!(hash_scheme, $name, $alg);
};
}
macro_rules! impl_encodable_public_key {
($name:ident, $alg:expr) => {
impl_encodable!(public_key_scheme, $name, $alg);
};
}
macro_rules! impl_encodable_secret_key {
($name:ident, $alg:expr) => {
impl crate::encoding::Encodable for $name {
#[inline]
fn to_uri_string(&self) -> String {
use secrecy::ExposeSecret;
use subtle_encoding::bech32::{self, Bech32};
Bech32::new(
bech32::DEFAULT_CHARSET,
$crate::encoding::URI_ENCODING.delimiter,
)
.encode(
$crate::encoding::URI_ENCODING.secret_key_scheme.to_owned() + $alg,
&self.expose_secret()[..],
)
}
#[inline]
fn to_dasherized_string(&self) -> String {
use secrecy::ExposeSecret;
use subtle_encoding::bech32::{self, Bech32};
Bech32::new(
bech32::DEFAULT_CHARSET,
$crate::encoding::DASHERIZED_ENCODING.delimiter,
)
.encode(
$crate::encoding::DASHERIZED_ENCODING
.secret_key_scheme
.to_owned()
+ $alg,
&self.expose_secret()[..],
)
}
}
};
}
macro_rules! impl_encodable_signature {
($name:ident, $alg:expr) => {
impl_encodable!(signature_scheme, $name, $alg);
};
}