1use crate::{Error, Result, Scheme, util::*};
2use derive_more::Display;
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use std::{
5 fmt::{self, Debug, Formatter},
6 ops::Deref,
7};
8
9macro_rules! serde_impl {
10 ($name:ident, $err:expr) => {
11 impl Serialize for $name {
12 fn serialize<S>(&self, s: S) -> std::result::Result<S::Ok, S::Error>
13 where
14 S: Serializer,
15 {
16 serdect::slice::serialize_hex_lower_or_bin(&self.0, s)
17 }
18 }
19
20 impl<'de> Deserialize<'de> for $name {
21 fn deserialize<D>(d: D) -> std::result::Result<Self, D::Error>
22 where
23 D: Deserializer<'de>,
24 {
25 let bytes = serdect::slice::deserialize_hex_or_bin_vec(d)?;
26 Self::from_slice(&bytes).map_err(|_| serde::de::Error::custom($err))
27 }
28 }
29 };
30}
31
32#[derive(Clone, Display, Eq, PartialEq)]
34#[display("{}", hex::encode(self.0.as_ref()))]
35#[repr(transparent)]
36pub struct PublicKey(oqs::kem::PublicKey);
37
38impl AsRef<[u8]> for PublicKey {
39 fn as_ref(&self) -> &[u8] {
40 self.0.as_ref()
41 }
42}
43
44impl Deref for PublicKey {
45 type Target = oqs::kem::PublicKey;
46
47 fn deref(&self) -> &Self::Target {
48 &self.0
49 }
50}
51
52impl Debug for PublicKey {
53 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
54 debug_key(&self.0, scheme_from_public_key_length, f)
55 }
56}
57
58impl From<oqs::kem::PublicKey> for PublicKey {
59 fn from(pk: oqs::kem::PublicKey) -> Self {
60 PublicKey(pk)
61 }
62}
63
64serde_impl!(PublicKey, "invalid public key");
65
66impl PublicKey {
67 pub fn from_slice(bytes: &[u8]) -> Result<Self> {
69 let kem: oqs::kem::Kem = scheme_from_public_key_length(bytes.len())?.into();
70 kem.public_key_from_bytes(bytes)
71 .map(|p| Self(p.to_owned()))
72 .ok_or(Error::InvalidEncapsulationKey(bytes.len()))
73 }
74}
75
76#[derive(Clone, Display, Eq, PartialEq)]
78#[display("{}", hex::encode(self.0.as_ref()))]
79#[repr(transparent)]
80pub struct SecretKey(oqs::kem::SecretKey);
81
82impl AsRef<[u8]> for SecretKey {
83 fn as_ref(&self) -> &[u8] {
84 self.0.as_ref()
85 }
86}
87
88impl Deref for SecretKey {
89 type Target = oqs::kem::SecretKey;
90
91 fn deref(&self) -> &Self::Target {
92 &self.0
93 }
94}
95
96impl Debug for SecretKey {
97 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
98 debug_key(&self.0, scheme_from_secret_key_length, f)
99 }
100}
101
102impl From<oqs::kem::SecretKey> for SecretKey {
103 fn from(pk: oqs::kem::SecretKey) -> Self {
104 SecretKey(pk)
105 }
106}
107
108serde_impl!(SecretKey, "invalid secret key");
109
110impl SecretKey {
111 pub fn from_slice(bytes: &[u8]) -> Result<Self> {
113 let kem: oqs::kem::Kem = scheme_from_public_key_length(bytes.len())?.into();
114 kem.secret_key_from_bytes(bytes)
115 .map(|p| Self(p.to_owned()))
116 .ok_or(Error::InvalidDecapsulationKey)
117 }
118}
119
120fn debug_key<B: AsRef<[u8]>, S: FnOnce(usize) -> Result<Scheme>>(
121 b: B,
122 s: S,
123 f: &mut Formatter,
124) -> fmt::Result {
125 let bytes = b.as_ref();
126 let scheme = s(bytes.len()).map_err(|_| fmt::Error)?;
127 write!(f, "{} {{ {} }}", scheme, hex::encode(bytes))
128}