1use crate::{
2 SensitiveBytes,
3 defs::{CiphersuiteId, ProtocolVersion},
4 group::{KeyPackageRef, extensions::Extension},
5 messages::MlsMessage,
6 tree::leaf_node::LeafNode,
7};
8
9#[derive(Debug, Clone, PartialEq, Eq, tls_codec::TlsSerialize, tls_codec::TlsSize)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize))]
11pub struct KeyPackageTBS<'a> {
12 pub version: &'a ProtocolVersion,
13 pub cipher_suite: &'a CiphersuiteId,
14 pub init_key: &'a [u8],
15 pub leaf_node: &'a LeafNode,
16 pub extensions: &'a [Extension],
17}
18
19#[derive(
20 Debug,
21 Clone,
22 PartialEq,
23 Eq,
24 zeroize::Zeroize,
25 zeroize::ZeroizeOnDrop,
26 tls_codec::TlsSerialize,
27 tls_codec::TlsDeserialize,
28 tls_codec::TlsSize,
29)]
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31pub struct KeyPackage {
32 #[zeroize(skip)]
33 pub version: ProtocolVersion,
34 #[zeroize(skip)]
35 pub cipher_suite: CiphersuiteId,
36 pub init_key: SensitiveBytes,
37 #[zeroize(skip)]
38 pub leaf_node: LeafNode,
39 #[zeroize(skip)]
40 pub extensions: Vec<Extension>,
41 pub signature: SensitiveBytes,
42}
43
44impl KeyPackage {
45 pub fn to_tbs(&self) -> KeyPackageTBS {
46 KeyPackageTBS {
47 version: &self.version,
48 cipher_suite: &self.cipher_suite,
49 init_key: &self.init_key,
50 leaf_node: &self.leaf_node,
51 extensions: &self.extensions,
52 }
53 }
54
55 pub fn into_message(self) -> MlsMessage {
56 MlsMessage {
57 version: ProtocolVersion::default(),
58 content: crate::messages::MlsMessageContent::KeyPackage(self),
59 }
60 }
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, zeroize::Zeroize, zeroize::ZeroizeOnDrop)]
64#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
65pub struct KeyPackageWithRef {
66 pub keypackage_ref: KeyPackageRef,
67 pub keypackage: KeyPackage,
68}