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")]
125pub(self) fn stream_mode_checked(
126 h: &Header,
127) -> Result<(u32, (u64, Option<u64>)), crate::error::Error> {
128 let (segment_size, size_hint) = match h {
129 Header {
130 mode:
131 Mode::Streaming {
132 segment_size,
133 size_hint,
134 },
135 ..
136 } => (segment_size, size_hint),
137 _ => return Err(crate::error::Error::ModeNotSupported(h.mode)),
138 };
139
140 if *segment_size > MAX_SYMMETRIC_CHUNK_SIZE {
141 return Err(crate::error::Error::ConstraintViolation);
142 }
143
144 Ok((*segment_size, *size_hint))
145}