wasi_crypto/
array_output.rs1use std::io::{Cursor, Read};
2
3use zeroize::Zeroize;
4
5use crate::error::*;
6use crate::handles::*;
7use crate::{CryptoCtx, HandleManagers};
8
9#[derive(Clone, Debug, Eq, PartialEq)]
10pub struct ArrayOutput(Cursor<Vec<u8>>);
11
12impl ArrayOutput {
13 fn len(&self) -> usize {
14 self.0.get_ref().len()
15 }
16
17 fn pull(&self, buf: &mut [u8]) -> Result<usize, CryptoError> {
18 let data = self.0.get_ref();
19 let data_len = data.len();
20 let buf_len = buf.len();
21 ensure!(buf_len >= data_len, CryptoError::Overflow);
22 buf[..data_len].copy_from_slice(data);
23 Ok(data_len)
24 }
25
26 pub fn new(data: Vec<u8>) -> Self {
27 ArrayOutput(Cursor::new(data))
28 }
29
30 pub(crate) fn register(handles: &HandleManagers, data: Vec<u8>) -> Result<Handle, CryptoError> {
31 let array_output = ArrayOutput::new(data);
32 let handle = handles.array_output.register(array_output)?;
33 Ok(handle)
34 }
35}
36
37impl Read for ArrayOutput {
38 fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> {
39 self.0.read(buf)
40 }
41}
42
43impl Drop for ArrayOutput {
44 fn drop(&mut self) {
45 self.0.get_mut().zeroize()
46 }
47}
48
49impl CryptoCtx {
50 pub fn array_output_len(&self, array_output_handle: Handle) -> Result<usize, CryptoError> {
51 let array_output = self.handles.array_output.get(array_output_handle)?;
52 Ok(array_output.len())
53 }
54
55 pub fn array_output_pull(
56 &self,
57 array_output_handle: Handle,
58 buf: &mut [u8],
59 ) -> Result<usize, CryptoError> {
60 let array_output = self.handles.array_output.get(array_output_handle)?;
61 let len = array_output.pull(buf)?;
62 self.handles.array_output.close(array_output_handle)?;
63 Ok(len)
64 }
65}