1use scale::{Decode, Encode, MaxEncodedLen};
4use scale_info::TypeInfo;
5
6use crate::{
7 crypto::{
8 verify::{verify_message, Verifiable},
9 CryptoProvider, Signature,
10 },
11 primitives::{BoundedVec, WorkerPubkey},
12 Address, ContentType,
13};
14
15#[derive(Debug, Clone, Encode, Decode, TypeInfo, MaxEncodedLen, PartialEq, Eq)]
17pub struct SessionUpdate {
18 pub session: [u8; 32],
20 pub nonce: [u8; 32],
22 pub recipient: BoundedVec<u8, 32>,
24}
25
26impl SessionUpdate {
27 pub fn calc_session_id<Crypto: CryptoProvider>(
32 nonce: [u8; 32],
33 metrics_nonce: &[u8],
34 ) -> [u8; 32] {
35 Crypto::blake2b_256(&[&nonce, metrics_nonce].concat())
36 }
37
38 pub fn new<Crypto: CryptoProvider>(
40 nonce: [u8; 32],
41 metrics_nonce: &[u8],
42 recipient: Address,
43 ) -> Self {
44 let session = Self::calc_session_id::<Crypto>(nonce, metrics_nonce);
45 Self {
46 session,
47 nonce,
48 recipient: recipient.to_vec().into(),
49 }
50 }
51}
52
53#[derive(Debug, Clone, Encode, Decode, TypeInfo, PartialEq, Eq)]
55pub struct SignedSessionUpdate {
56 pub update: SessionUpdate,
58 pub signature: Signature,
60 pub public_key: WorkerPubkey,
62}
63
64impl Verifiable for SignedSessionUpdate {
65 fn verify<Crypto: CryptoProvider>(&self) -> bool {
66 let message = self.update.encode();
67 verify_message::<Crypto>(
68 ContentType::SessionUpdate,
69 &message,
70 &self.signature,
71 &self.public_key,
72 )
73 }
74}