use crate::error::CryptoError;
use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
use std::fmt;
mod ed25519;
mod keypair;
mod public_key;
mod signature_identifier;
pub use ed25519::{
ED25519_ID, ED25519_PUBLIC_KEY_LENGTH, ED25519_SECRET_KEY_LENGTH,
ED25519_SIGNATURE_LENGTH, Ed25519Signer,
};
pub use keypair::{KeyPair, KeyPairAlgorithm};
pub use public_key::PublicKey;
pub use signature_identifier::SignatureIdentifier;
pub trait DSA {
fn algorithm_id(&self) -> u8;
fn signature_length(&self) -> usize;
fn sign(&self, message: &[u8]) -> Result<SignatureIdentifier, CryptoError>;
fn algorithm(&self) -> DSAlgorithm;
fn public_key_bytes(&self) -> Vec<u8>;
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Serialize,
Deserialize,
BorshSerialize,
BorshDeserialize,
)]
pub enum DSAlgorithm {
Ed25519,
}
impl DSAlgorithm {
pub const fn identifier(&self) -> u8 {
match self {
Self::Ed25519 => ED25519_ID,
}
}
pub const fn signature_length(&self) -> usize {
match self {
Self::Ed25519 => ED25519_SIGNATURE_LENGTH,
}
}
pub const fn public_key_length(&self) -> usize {
match self {
Self::Ed25519 => ED25519_PUBLIC_KEY_LENGTH,
}
}
pub fn from_identifier(id: u8) -> Result<Self, CryptoError> {
match id {
ED25519_ID => Ok(Self::Ed25519),
_ => Err(CryptoError::UnknownAlgorithm(format!("{}", id as char))),
}
}
}
impl fmt::Display for DSAlgorithm {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Ed25519 => write!(f, "Ed25519"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_size_constants() {
use ed25519_dalek::{
PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH,
};
assert_eq!(ED25519_PUBLIC_KEY_LENGTH, PUBLIC_KEY_LENGTH);
assert_eq!(ED25519_SECRET_KEY_LENGTH, SECRET_KEY_LENGTH);
assert_eq!(ED25519_SIGNATURE_LENGTH, SIGNATURE_LENGTH);
}
}