cryptoki/session/
message_decryption.rs

1// Copyright 2025 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3//! Encrypting data
4
5use crate::context::Function;
6use crate::error::{Result, Rv};
7use crate::mechanism::{Mechanism, MessageParam};
8use crate::object::ObjectHandle;
9use crate::session::Session;
10use cryptoki_sys::*;
11use std::convert::TryInto;
12
13impl Session {
14    /// Prepare a session for one or more Message-based decryption using the same mechanism and key
15    pub fn message_decrypt_init(&self, mechanism: &Mechanism, key: ObjectHandle) -> Result<()> {
16        let mut mechanism: CK_MECHANISM = mechanism.into();
17
18        unsafe {
19            Rv::from(get_pkcs11!(self.client(), C_MessageDecryptInit)(
20                self.handle(),
21                &mut mechanism as CK_MECHANISM_PTR,
22                key.handle(),
23            ))
24            .into_result(Function::MessageDecryptInit)?;
25        }
26
27        Ok(())
28    }
29
30    /// Decrypts a message in single part
31    pub fn decrypt_message(
32        &self,
33        param: &MessageParam,
34        aad: &[u8],
35        encrypted_data: &[u8],
36    ) -> Result<Vec<u8>> {
37        let mut data_len = 0;
38        // Get the output buffer length
39        unsafe {
40            Rv::from(get_pkcs11!(self.client(), C_DecryptMessage)(
41                self.handle(),
42                param.as_ptr(),
43                param.len(),
44                aad.as_ptr() as *mut u8,
45                aad.len().try_into()?,
46                encrypted_data.as_ptr() as *mut u8,
47                encrypted_data.len().try_into()?,
48                std::ptr::null_mut(),
49                &mut data_len,
50            ))
51            .into_result(Function::DecryptMessage)?;
52        }
53
54        let mut data = vec![0; data_len.try_into()?];
55
56        unsafe {
57            Rv::from(get_pkcs11!(self.client(), C_DecryptMessage)(
58                self.handle(),
59                param.as_ptr(),
60                param.len(),
61                aad.as_ptr() as *mut u8,
62                aad.len().try_into()?,
63                encrypted_data.as_ptr() as *mut u8,
64                encrypted_data.len().try_into()?,
65                data.as_mut_ptr(),
66                &mut data_len,
67            ))
68            .into_result(Function::DecryptMessage)?;
69        }
70
71        data.resize(data_len.try_into()?, 0);
72
73        Ok(data)
74    }
75
76    /// Begin multi-part message decryption operation
77    pub fn decrypt_message_begin(&self, param: MessageParam, aad: &[u8]) -> Result<()> {
78        unsafe {
79            Rv::from(get_pkcs11!(self.client(), C_DecryptMessageBegin)(
80                self.handle(),
81                param.as_ptr(),
82                param.len(),
83                aad.as_ptr() as *mut u8,
84                aad.len().try_into()?,
85            ))
86            .into_result(Function::DecryptMessageBegin)
87        }
88    }
89
90    /// Continue mutli-part message decryption operation
91    pub fn decrypt_message_next(
92        &self,
93        param: MessageParam,
94        encrypted_data: &[u8],
95        end: bool,
96    ) -> Result<Vec<u8>> {
97        let mut data_len = 0;
98        // Get the output buffer length
99        unsafe {
100            Rv::from(get_pkcs11!(self.client(), C_DecryptMessageNext)(
101                self.handle(),
102                param.as_ptr(),
103                param.len(),
104                encrypted_data.as_ptr() as *mut u8,
105                encrypted_data.len().try_into()?,
106                std::ptr::null_mut(),
107                &mut data_len,
108                if end { CKF_END_OF_MESSAGE } else { 0 },
109            ))
110            .into_result(Function::DecryptMessageNext)?;
111        }
112        let mut data = vec![0; data_len.try_into()?];
113        unsafe {
114            Rv::from(get_pkcs11!(self.client(), C_DecryptMessageNext)(
115                self.handle(),
116                param.as_ptr(),
117                param.len(),
118                encrypted_data.as_ptr() as *mut u8,
119                encrypted_data.len().try_into()?,
120                data.as_mut_ptr(),
121                &mut data_len,
122                if end { CKF_END_OF_MESSAGE } else { 0 },
123            ))
124            .into_result(Function::DecryptMessageNext)?;
125        }
126        data.resize(data_len.try_into()?, 0);
127
128        Ok(data)
129    }
130
131    /// Finishes Message-based decryption process
132    pub fn message_decrypt_final(&self) -> Result<()> {
133        unsafe {
134            Rv::from(get_pkcs11!(self.client(), C_MessageDecryptFinal)(
135                self.handle(),
136            ))
137            .into_result(Function::MessageDecryptFinal)?;
138        }
139
140        Ok(())
141    }
142}