use crate::{asymmetric, ecdsa, ed25519};
use serde::{Deserialize, Serialize};
use signatory::{ecdsa::curve::WeierstrassCurveKind, generic_array::GenericArray};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct PublicKey {
pub algorithm: asymmetric::Algorithm,
pub bytes: Vec<u8>,
}
#[allow(clippy::len_without_is_empty)]
impl PublicKey {
pub fn into_vec(self) -> Vec<u8> {
self.into()
}
pub fn len(&self) -> usize {
self.bytes.len()
}
pub fn as_slice(&self) -> &[u8] {
self.as_ref()
}
pub fn ecdsa<C>(&self) -> Option<ecdsa::PublicKey<C>>
where
C: ecdsa::curve::WeierstrassCurve,
{
match self.algorithm {
asymmetric::Algorithm::EC_P256 => {
if C::CURVE_KIND == WeierstrassCurveKind::NistP256 {
Some(ecdsa::PublicKey::from_untagged_point(
GenericArray::from_slice(&self.bytes),
))
} else {
None
}
}
asymmetric::Algorithm::EC_P384 => {
if C::CURVE_KIND == WeierstrassCurveKind::NistP384 {
Some(ecdsa::PublicKey::from_untagged_point(
GenericArray::from_slice(&self.bytes),
))
} else {
None
}
}
asymmetric::Algorithm::EC_K256 => {
if C::CURVE_KIND == WeierstrassCurveKind::Secp256k1 {
Some(ecdsa::PublicKey::from_untagged_point(
GenericArray::from_slice(&self.bytes),
))
} else {
None
}
}
_ => None,
}
}
pub fn ed25519(&self) -> Option<ed25519::PublicKey> {
if self.algorithm == asymmetric::Algorithm::Ed25519 {
ed25519::PublicKey::from_bytes(&self.bytes)
} else {
None
}
}
}
impl AsRef<[u8]> for PublicKey {
fn as_ref(&self) -> &[u8] {
self.bytes.as_ref()
}
}
impl Into<Vec<u8>> for PublicKey {
fn into(self) -> Vec<u8> {
self.bytes
}
}