Skip to main content

wasi_crypto/
array_output.rs

1use 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}