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 Hash,
25 zeroize::Zeroize,
26 zeroize::ZeroizeOnDrop,
27 tls_codec::TlsSerialize,
28 tls_codec::TlsDeserialize,
29 tls_codec::TlsSize,
30)]
31#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
32pub struct KeyPackage {
33 #[zeroize(skip)]
34 pub version: ProtocolVersion,
35 #[zeroize(skip)]
36 pub cipher_suite: CiphersuiteId,
37 pub init_key: SensitiveBytes,
38 #[zeroize(skip)]
39 pub leaf_node: LeafNode,
40 #[zeroize(skip)]
41 pub extensions: Vec<Extension>,
42 pub signature: SensitiveBytes,
43}
44
45impl KeyPackage {
46 pub fn to_tbs(&self) -> KeyPackageTBS<'_> {
47 KeyPackageTBS {
48 version: &self.version,
49 cipher_suite: &self.cipher_suite,
50 init_key: &self.init_key,
51 leaf_node: &self.leaf_node,
52 extensions: &self.extensions,
53 }
54 }
55
56 pub fn into_message(self) -> MlsMessage {
57 MlsMessage {
58 version: ProtocolVersion::default(),
59 content: crate::messages::MlsMessageContent::KeyPackage(self),
60 }
61 }
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Hash, zeroize::Zeroize, zeroize::ZeroizeOnDrop)]
65#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
66pub struct KeyPackageWithRef {
67 pub keypackage_ref: KeyPackageRef,
68 pub keypackage: KeyPackage,
69}