1use borsh::{BorshDeserialize, BorshSerialize};
7use serde::{Deserialize, Serialize};
8
9pub const X25519_KEY_SIZE: usize = 32;
11
12pub const TEE_USER_DATA_SIZE: usize = 32;
14
15pub type TeeUserData = [u8; TEE_USER_DATA_SIZE];
17
18#[derive(
23 Clone,
24 Copy,
25 Debug,
26 PartialEq,
27 Eq,
28 Hash,
29 Serialize,
30 Deserialize,
31 BorshSerialize,
32 BorshDeserialize,
33)]
34pub struct PublicKey([u8; X25519_KEY_SIZE]);
35
36impl PublicKey {
37 pub fn from_bytes(bytes: [u8; X25519_KEY_SIZE]) -> Self {
39 Self(bytes)
40 }
41
42 pub fn to_bytes(self) -> [u8; X25519_KEY_SIZE] {
44 self.0
45 }
46
47 pub fn as_bytes(&self) -> &[u8; X25519_KEY_SIZE] {
49 &self.0
50 }
51}
52
53impl From<x25519_dalek::PublicKey> for PublicKey {
54 fn from(key: x25519_dalek::PublicKey) -> Self {
55 Self(key.to_bytes())
56 }
57}
58
59impl From<PublicKey> for x25519_dalek::PublicKey {
60 fn from(pk: PublicKey) -> Self {
61 x25519_dalek::PublicKey::from(pk.0)
62 }
63}
64
65impl From<&x25519_dalek::StaticSecret> for PublicKey {
66 fn from(private_key: &x25519_dalek::StaticSecret) -> Self {
67 Self(x25519_dalek::PublicKey::from(private_key).to_bytes())
68 }
69}
70
71impl AsRef<[u8]> for PublicKey {
72 fn as_ref(&self) -> &[u8] {
73 &self.0
74 }
75}
76
77impl AsRef<[u8; X25519_KEY_SIZE]> for PublicKey {
78 fn as_ref(&self) -> &[u8; X25519_KEY_SIZE] {
79 &self.0
80 }
81}
82
83impl Default for PublicKey {
84 fn default() -> Self {
85 Self([0u8; X25519_KEY_SIZE])
86 }
87}