use crate::ArcIdentity;
use ic_agent::identity::{BasicIdentity, Identity};
use serde::{Deserialize, Serialize};
use std::{fmt, sync::Arc};
const ED25519_KEY_LABEL: &str = "Ed25519";
#[derive(Clone, Debug)]
pub struct KeyWithRaw {
pub(crate) key: [u8; 32],
pub(crate) identity: ArcIdentity,
}
impl KeyWithRaw {
pub fn new(raw_key: [u8; 32]) -> Self {
KeyWithRaw {
key: raw_key,
identity: ArcIdentity::Ed25519(Arc::new(BasicIdentity::from_raw_key(&raw_key))),
}
}
pub fn raw_key(&self) -> &[u8; 32] {
&self.key
}
}
#[derive(Clone, Debug)]
pub enum Key {
WithRaw(KeyWithRaw),
Identity(ArcIdentity),
}
impl Key {
pub fn as_arc_identity(&self) -> Arc<dyn Identity> {
match self {
Key::WithRaw(key) => key.identity.as_arc_identity(),
Key::Identity(identity) => identity.as_arc_identity(),
}
}
pub fn public_key(&self) -> Option<Vec<u8>> {
match self {
Key::WithRaw(key) => key.identity.public_key(),
Key::Identity(identity) => identity.public_key(),
}
}
}
impl From<Key> for ArcIdentity {
fn from(key: Key) -> Self {
match key {
Key::WithRaw(key) => key.identity,
Key::Identity(identity) => identity,
}
}
}
impl From<&Key> for ArcIdentity {
fn from(key: &Key) -> Self {
match key {
Key::WithRaw(key) => key.identity.clone(),
Key::Identity(identity) => identity.clone(),
}
}
}
impl From<ArcIdentity> for Key {
fn from(identity: ArcIdentity) -> Self {
Key::Identity(identity)
}
}
impl From<&ArcIdentity> for Key {
fn from(identity: &ArcIdentity) -> Self {
Key::Identity(identity.clone())
}
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, Default)]
pub enum BaseKeyType {
#[default]
Ed25519,
}
impl fmt::Display for BaseKeyType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BaseKeyType::Ed25519 => write!(f, "{}", ED25519_KEY_LABEL),
}
}
}