1use crate::encryption::EncryptionKey;
2use crate::signature::{SigningKey, VerifyKey};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug)]
7pub struct Keypair {
8 pub encryption_public: [u8; 32],
10 pub signing_key: SigningKey,
12 pub verify_key: VerifyKey,
14}
15
16impl Keypair {
17 pub fn generate() -> Self {
19 let signing_key = SigningKey::generate();
20 let verify_key = signing_key.verify_key();
21
22 use x25519_dalek::{EphemeralSecret, PublicKey};
24 let secret = EphemeralSecret::random_from_rng(rand::rngs::OsRng);
25 let encryption_public = PublicKey::from(&secret).to_bytes();
26
27 Self {
28 encryption_public,
29 signing_key,
30 verify_key,
31 }
32 }
33
34 pub fn public_identity(&self) -> PublicIdentity {
36 PublicIdentity {
37 encryption_key: self.encryption_public,
38 verify_key: self.verify_key,
39 }
40 }
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct PublicIdentity {
46 pub encryption_key: [u8; 32],
48 pub verify_key: VerifyKey,
50}
51
52impl PublicIdentity {
53 pub fn to_bytes(&self) -> Vec<u8> {
55 bincode::serialize(self).expect("Serialization should not fail")
56 }
57
58 pub fn from_bytes(bytes: &[u8]) -> anyhow::Result<Self> {
60 bincode::deserialize(bytes).map_err(Into::into)
61 }
62}
63
64pub fn generate_keypair() -> Keypair {
66 Keypair::generate()
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn test_keypair_generation() {
75 let keypair = generate_keypair();
76 assert_eq!(keypair.encryption_public.len(), 32);
77 }
78
79 #[test]
80 fn test_public_identity_serialization() {
81 let keypair = generate_keypair();
82 let identity = keypair.public_identity();
83
84 let bytes = identity.to_bytes();
85 let decoded = PublicIdentity::from_bytes(&bytes).unwrap();
86
87 assert_eq!(identity.encryption_key, decoded.encryption_key);
88 assert_eq!(identity.verify_key.as_bytes(), decoded.verify_key.as_bytes());
89 }
90}