Skip to main content

tower_defense/crypto/
mod.rs

1use ed25519_dalek::{self as ed25519, Signer as _, SigningKey, Verifier as _};
2use serde::{Deserialize, Serialize};
3
4use crate::error::Error;
5
6pub mod peer_id;
7pub use peer_id::PeerId;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(transparent)]
11pub struct Keypair(ed25519::SigningKey);
12
13impl Keypair {
14    #[must_use]
15    pub fn from_secret_bytes(bytes: &[u8; 32]) -> Self {
16        Self(SigningKey::from_bytes(bytes))
17    }
18
19    #[must_use]
20    pub fn sign(&self, data: &[u8]) -> Signature {
21        self.0.sign(data).into()
22    }
23
24    #[must_use]
25    pub fn public(&self) -> PublicKey {
26        self.0.verifying_key().into()
27    }
28}
29
30impl From<ed25519::SigningKey> for Keypair {
31    fn from(key: ed25519::SigningKey) -> Self {
32        Self(key)
33    }
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[serde(transparent)]
38pub struct PublicKey(ed25519::VerifyingKey);
39
40impl PublicKey {
41    /// Verify signature.
42    ///
43    /// # Errors
44    ///
45    /// This function will return an error if the verification fails.
46    pub fn verify(&self, data: &[u8], signature: &Signature) -> Result<(), Error> {
47        self.0.verify(data, &signature.0).map_err(Into::into)
48    }
49}
50
51impl From<ed25519::VerifyingKey> for PublicKey {
52    fn from(key: ed25519::VerifyingKey) -> Self {
53        Self(key)
54    }
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(transparent)]
59pub struct Signature(ed25519::Signature);
60
61impl From<ed25519::Signature> for Signature {
62    fn from(signature: ed25519::Signature) -> Self {
63        Self(signature)
64    }
65}