Skip to main content

antenna_protocol/identity/
mod.rs

1mod peer_id;
2
3use crate::{deserialize_base64_keypair, serialize_base64_keypair};
4use anyhow::Result;
5use base64::{Engine, prelude::BASE64_URL_SAFE_NO_PAD};
6use biscuit_auth::{Biscuit, KeyPair, PublicKey};
7pub use peer_id::PeerID;
8use serde::{Deserialize, Serialize};
9
10#[derive(Serialize, Deserialize)]
11pub struct Identity {
12    #[serde(
13        serialize_with = "serialize_base64_keypair",
14        deserialize_with = "deserialize_base64_keypair"
15    )]
16    keypair: KeyPair,
17}
18
19impl Default for Identity {
20    fn default() -> Self {
21        Self::new()
22    }
23}
24
25impl Identity {
26    pub fn new() -> Self {
27        Self {
28            keypair: KeyPair::new(),
29        }
30    }
31
32    pub fn pubkey(&self) -> PublicKey {
33        self.keypair.public()
34    }
35
36    pub fn peer_id(&self) -> PeerID {
37        PeerID(self.keypair.public())
38    }
39
40    pub fn create_token(&self, sdp: &str) -> Result<Vec<u8>> {
41        let sdp_b64 = BASE64_URL_SAFE_NO_PAD.encode(sdp);
42        Ok(Biscuit::builder()
43            .fact(format!("sdp(\"{sdp_b64}\")").as_str())?
44            .build(&self.keypair)?
45            .to_vec()?)
46    }
47}