antenna_protocol/identity/
mod.rs1mod 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}