use tls_codec::{Deserialize, Serialize};
use super::Error;
pub trait Authenticator {
type Signature: Serialize + Deserialize;
type SigningKey;
type VerificationKey;
type Credential: Serialize + Deserialize;
type Certificate;
const CRED_LEN: usize;
const SIG_LEN: usize;
fn sign(signing_key: &Self::SigningKey, message: &[u8]) -> Result<Self::Signature, Error>;
fn validate_credential(
credential: Self::Credential,
certificate: &Self::Certificate,
) -> Result<Self::VerificationKey, Error>;
fn verify(
verification_key: &Self::VerificationKey,
signature: &Self::Signature,
message: &[u8],
) -> Result<(), Error>;
}
pub struct NoAuth {}
impl Authenticator for NoAuth {
type Signature = [u8; 0];
type SigningKey = [u8; 0];
type VerificationKey = [u8; 0];
type Credential = [u8; 0];
type Certificate = [u8; 0];
const CRED_LEN: usize = 0;
const SIG_LEN: usize = 0;
fn sign(_signing_key: &Self::SigningKey, _message: &[u8]) -> Result<Self::Signature, Error> {
Ok([0; 0])
}
fn verify(
_verification_key: &Self::VerificationKey,
_signature: &Self::Signature,
_message: &[u8],
) -> Result<(), Error> {
Ok(())
}
fn validate_credential(
_credential: Self::Credential,
_certificate: &Self::Certificate,
) -> Result<Self::VerificationKey, Error> {
Ok([0; 0])
}
}
pub struct Ed25519 {}
impl Authenticator for Ed25519 {
type Signature = [u8; 64];
type SigningKey = [u8; 32];
type VerificationKey = libcrux_ed25519::VerificationKey;
type Credential = Self::VerificationKey;
type Certificate = Self::VerificationKey;
const CRED_LEN: usize = 32;
const SIG_LEN: usize = 64;
fn sign(signing_key: &Self::SigningKey, message: &[u8]) -> Result<Self::Signature, Error> {
libcrux_ed25519::sign(message, signing_key).map_err(|_| Error::CredError)
}
fn verify(
verification_key: &Self::VerificationKey,
signature: &Self::Signature,
message: &[u8],
) -> Result<(), Error> {
libcrux_ed25519::verify(message, verification_key.as_ref(), signature)
.map_err(|_| Error::CredError)
}
fn validate_credential(
credential: Self::Credential,
cert: &Self::Certificate,
) -> Result<Self::VerificationKey, Error> {
(credential.as_ref() == cert.as_ref())
.then_some(credential)
.ok_or(Error::CredError)
}
}