wallet_gen/ed25519/
keys.rs1use super::prelude::*;
17use ed25519::crypto::{derive_pubkey, bn_to_vec32, sc_reduce32};
18use openssl::bn::BigNumContextRef;
19use std::ops::Deref;
20
21#[derive(Debug, Clone)]
23#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
24pub struct PrivateKey([u8; 32]);
25
26impl PrivateKey {
27 pub fn from_bytes(mut bytes: [u8; 32], ctx: &mut BigNumContextRef) -> Result<Self> {
30 let bn = sc_reduce32(&mut bytes, ctx)?;
31 let vec = bn_to_vec32(&bn);
32
33 {
34 let dest = &mut bytes[..];
35 dest.copy_from_slice(vec.as_slice());
36 }
37
38 Ok(PrivateKey(bytes))
39 }
40
41 #[inline]
43 pub fn into_bytes(self) -> [u8; 32] { self.0 }
44
45 #[inline]
47 pub fn to_bytes(&self) -> [u8; 32] { self.0 }
48
49 #[inline]
51 pub fn as_bytes(&self) -> &[u8; 32] { &self.0 }
52}
53
54impl Deref for PrivateKey {
55 type Target = [u8; 32];
56
57 #[inline]
58 fn deref(&self) -> &Self::Target { &self.0 }
59}
60
61impl AsRef<[u8]> for PrivateKey {
62 #[inline]
63 fn as_ref(&self) -> &[u8] { &self.0[..] }
64}
65
66#[derive(Debug, Clone)]
68#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69pub struct PublicKey([u8; 32]);
70
71impl PublicKey {
72 pub fn from_private(priv_key: &PrivateKey, ctx: &mut BigNumContextRef) -> Result<Self> {
74 let mut bytes = priv_key.to_bytes();
75 derive_pubkey(&mut bytes, ctx)?;
76 Ok(PublicKey(bytes))
77 }
78
79 #[inline]
81 pub fn into_bytes(self) -> [u8; 32] { self.0 }
82
83 #[inline]
85 pub fn to_bytes(&self) -> [u8; 32] { self.0 }
86
87 #[inline]
89 pub fn as_bytes(&self) -> &[u8; 32] { &self.0 }
90}
91
92impl Deref for PublicKey {
93 type Target = [u8; 32];
94
95 #[inline]
96 fn deref(&self) -> &Self::Target { &self.0 }
97}
98
99impl AsRef<[u8]> for PublicKey {
100 #[inline]
101 fn as_ref(&self) -> &[u8] { &self.0[..] }
102}
103
104#[derive(Debug, Clone)]
106#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
107pub struct Keypair {
108 pub public: PublicKey,
110
111 pub private: PrivateKey,
113}