use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
pub const X25519_KEY_SIZE: usize = 32;
pub const TEE_USER_DATA_SIZE: usize = 32;
pub type TeeUserData = [u8; TEE_USER_DATA_SIZE];
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
BorshSerialize,
BorshDeserialize,
)]
pub struct PublicKey([u8; X25519_KEY_SIZE]);
impl PublicKey {
pub fn from_bytes(bytes: [u8; X25519_KEY_SIZE]) -> Self {
Self(bytes)
}
pub fn to_bytes(self) -> [u8; X25519_KEY_SIZE] {
self.0
}
pub fn as_bytes(&self) -> &[u8; X25519_KEY_SIZE] {
&self.0
}
}
impl From<x25519_dalek::PublicKey> for PublicKey {
fn from(key: x25519_dalek::PublicKey) -> Self {
Self(key.to_bytes())
}
}
impl From<PublicKey> for x25519_dalek::PublicKey {
fn from(pk: PublicKey) -> Self {
x25519_dalek::PublicKey::from(pk.0)
}
}
impl From<&x25519_dalek::StaticSecret> for PublicKey {
fn from(private_key: &x25519_dalek::StaticSecret) -> Self {
Self(x25519_dalek::PublicKey::from(private_key).to_bytes())
}
}
impl AsRef<[u8]> for PublicKey {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl AsRef<[u8; X25519_KEY_SIZE]> for PublicKey {
fn as_ref(&self) -> &[u8; X25519_KEY_SIZE] {
&self.0
}
}
impl Default for PublicKey {
fn default() -> Self {
Self([0u8; X25519_KEY_SIZE])
}
}