1mod header;
8
9pub use header::{Algorithm, Header, Mode, RecipientHeader};
10
11#[cfg(feature = "rust")]
12pub mod rust;
13
14#[cfg(feature = "web")]
15pub mod web;
16
17use crate::artifacts::VerifyingKey;
18use crate::identity::Policy;
19use crate::util::*;
20use crate::{artifacts::SigningKeyExt, consts::*};
21use header::SignatureExt;
22use ibs::gg::Verifier;
23use serde::{Deserialize, Serialize};
24
25#[derive(Debug)]
27pub struct Sealer<'r, R, C> {
28 header: Header,
30
31 rng: &'r mut R,
33
34 config: C,
36
37 pub_sign_key: SigningKeyExt,
40
41 priv_sign_key: Option<SigningKeyExt>,
44}
45
46impl<'r, R, C> Sealer<'r, R, C> {
47 pub fn with_priv_signing_key(mut self, priv_sign_key: SigningKeyExt) -> Self {
51 self.priv_sign_key = Some(priv_sign_key);
52 self
53 }
54}
55
56#[derive(Debug)]
66pub struct Unsealer<R, C: UnsealerConfig> {
67 pub version: u16,
69
70 pub header: Header,
72
73 pub pub_id: Policy,
75
76 r: R,
78
79 config: C,
81
82 verifier: Verifier,
84
85 vk: VerifyingKey,
87}
88
89#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
91pub struct VerificationResult {
92 pub public: Policy,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub private: Option<Policy>,
98}
99
100#[doc(hidden)]
104pub trait SealerConfig: sealed::SealerConfig {}
105
106#[doc(hidden)]
110pub trait UnsealerConfig: sealed::UnsealerConfig {}
111
112pub(crate) mod sealed {
113 pub trait UnsealerConfig {}
114 pub trait SealerConfig {}
115}
116
117#[cfg(any(feature = "stream", target_arch = "wasm32"))]
118impl From<futures::io::Error> for crate::error::Error {
119 fn from(e: futures::io::Error) -> Self {
120 Self::FuturesIO(e)
121 }
122}
123
124#[cfg(feature = "stream")]
125fn stream_mode_checked(h: &Header) -> Result<(u32, (u64, Option<u64>)), crate::error::Error> {
126 let (segment_size, size_hint) = match h {
127 Header {
128 mode:
129 Mode::Streaming {
130 segment_size,
131 size_hint,
132 },
133 ..
134 } => (segment_size, size_hint),
135 _ => return Err(crate::error::Error::ModeNotSupported(h.mode)),
136 };
137
138 if *segment_size > MAX_SYMMETRIC_CHUNK_SIZE {
139 return Err(crate::error::Error::ConstraintViolation);
140 }
141
142 Ok((*segment_size, *size_hint))
143}