cryptoki/context/
general_purpose.rs

1// Copyright 2021 Contributors to the Parsec project.
2// SPDX-License-Identifier: Apache-2.0
3//! General-purpose functions
4
5use crate::context::{CInitializeArgs, Info, Pkcs11};
6use crate::error::{Result, Rv};
7use cryptoki_sys::{CK_C_INITIALIZE_ARGS, CK_INFO};
8use std::convert::TryFrom;
9use std::fmt::Display;
10use std::ptr;
11
12// See public docs on stub in parent mod.rs
13#[inline(always)]
14pub(super) fn initialize(ctx: &Pkcs11, init_args: CInitializeArgs) -> Result<()> {
15    // if no args are specified, library expects NULL
16    let mut init_args = CK_C_INITIALIZE_ARGS::from(init_args);
17    let init_args_ptr = &mut init_args;
18    unsafe {
19        Rv::from(get_pkcs11!(ctx, C_Initialize)(
20            init_args_ptr as *mut CK_C_INITIALIZE_ARGS as *mut std::ffi::c_void,
21        ))
22        .into_result(Function::Initialize)
23    }
24}
25
26// See public docs on stub in parent mod.rs
27#[inline(always)]
28pub(super) fn finalize(ctx: Pkcs11) -> Result<()> {
29    unsafe {
30        Rv::from(get_pkcs11!(ctx, C_Finalize)(ptr::null_mut())).into_result(Function::Finalize)
31    }
32}
33
34// See public docs on stub in parent mod.rs
35#[inline(always)]
36pub(super) fn get_library_info(ctx: &Pkcs11) -> Result<Info> {
37    let mut info = CK_INFO::default();
38    unsafe {
39        Rv::from(get_pkcs11!(ctx, C_GetInfo)(&mut info)).into_result(Function::GetInfo)?;
40        Info::try_from(info)
41    }
42}
43
44macro_rules! check_fn {
45    ($pkcs11:expr, $c_func_name:ident) => {{
46        // '.$c_func_name' might be unaligned, so copy it out.
47        let func = $pkcs11.impl_.get_function_list().$c_func_name;
48        func.is_some()
49    }};
50}
51
52#[allow(missing_docs)]
53#[derive(Debug, Copy, Clone)]
54/// Enumeration of all functions defined by the PKCS11 spec
55pub enum Function {
56    Initialize,
57    Finalize,
58    GetInfo,
59    GetFunctionList,
60    GetSlotList,
61    GetSlotInfo,
62    GetTokenInfo,
63    GetMechanismList,
64    GetMechanismInfo,
65    InitToken,
66    InitPIN,
67    SetPIN,
68    OpenSession,
69    CloseSession,
70    CloseAllSessions,
71    GetSessionInfo,
72    GetOperationState,
73    SetOperationState,
74    Login,
75    Logout,
76    CreateObject,
77    CopyObject,
78    DestroyObject,
79    GetObjectSize,
80    GetAttributeValue,
81    SetAttributeValue,
82    FindObjectsInit,
83    FindObjects,
84    FindObjectsFinal,
85    EncryptInit,
86    Encrypt,
87    EncryptUpdate,
88    EncryptFinal,
89    DecryptInit,
90    Decrypt,
91    DecryptUpdate,
92    DecryptFinal,
93    DigestInit,
94    Digest,
95    DigestUpdate,
96    DigestKey,
97    DigestFinal,
98    SignInit,
99    Sign,
100    SignUpdate,
101    SignFinal,
102    SignRecoverInit,
103    SignRecover,
104    VerifyInit,
105    Verify,
106    VerifyUpdate,
107    VerifyFinal,
108    VerifyRecoverInit,
109    VerifyRecover,
110    DigestEncryptUpdate,
111    DecryptDigestUpdate,
112    SignEncryptUpdate,
113    DecryptVerifyUpdate,
114    GenerateKey,
115    GenerateKeyPair,
116    WrapKey,
117    UnwrapKey,
118    DeriveKey,
119    SeedRandom,
120    GenerateRandom,
121    GetFunctionStatus,
122    CancelFunction,
123    WaitForSlotEvent,
124    /* PKCS #11 3.0 */
125    GetInterfaceList,
126    GetInterface,
127    LoginUser,
128    SessionCancel,
129    MessageEncryptInit,
130    EncryptMessage,
131    EncryptMessageBegin,
132    EncryptMessageNext,
133    MessageEncryptFinal,
134    MessageDecryptInit,
135    DecryptMessage,
136    DecryptMessageBegin,
137    DecryptMessageNext,
138    MessageDecryptFinal,
139    MessageSignInit,
140    SignMessage,
141    SignMessageBegin,
142    SignMessageNext,
143    MessageSignFinal,
144    MessageVerifyInit,
145    VerifyMessage,
146    VerifyMessageBegin,
147    VerifyMessageNext,
148    MessageVerifyFinal,
149    /* PKCS #11 3.2 */
150    EncapsulateKey,
151    DecapsulateKey,
152    VerifySignatureInit,
153    VerifySignature,
154    VerifySignatureUpdate,
155    VerifySignatureFinal,
156    GetSessionValidationFlags,
157    AsyncComplete,
158    AsyncGetID,
159    AsyncJoin,
160    WrapKeyAuthenticated,
161    UnwrapKeyAuthenticated,
162}
163
164impl Display for Function {
165    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
166        write!(f, "Function::{self:?}")
167    }
168}
169
170#[inline(always)]
171pub(super) fn is_fn_supported(ctx: &Pkcs11, function: Function) -> bool {
172    match function {
173        Function::Initialize => check_fn!(ctx, C_Initialize),
174        Function::Finalize => check_fn!(ctx, C_Finalize),
175        Function::GetInfo => check_fn!(ctx, C_GetInfo),
176        Function::GetFunctionList => check_fn!(ctx, C_GetFunctionList),
177        Function::GetSlotList => check_fn!(ctx, C_GetSlotList),
178        Function::GetSlotInfo => check_fn!(ctx, C_GetSlotInfo),
179        Function::GetTokenInfo => check_fn!(ctx, C_GetTokenInfo),
180        Function::GetMechanismList => check_fn!(ctx, C_GetMechanismList),
181        Function::GetMechanismInfo => check_fn!(ctx, C_GetMechanismInfo),
182        Function::InitToken => check_fn!(ctx, C_InitToken),
183        Function::InitPIN => check_fn!(ctx, C_InitPIN),
184        Function::SetPIN => check_fn!(ctx, C_SetPIN),
185        Function::OpenSession => check_fn!(ctx, C_OpenSession),
186        Function::CloseSession => check_fn!(ctx, C_CloseSession),
187        Function::CloseAllSessions => check_fn!(ctx, C_CloseAllSessions),
188        Function::GetSessionInfo => check_fn!(ctx, C_GetSessionInfo),
189        Function::GetOperationState => check_fn!(ctx, C_GetOperationState),
190        Function::SetOperationState => check_fn!(ctx, C_SetOperationState),
191        Function::Login => check_fn!(ctx, C_Login),
192        Function::Logout => check_fn!(ctx, C_Logout),
193        Function::CreateObject => check_fn!(ctx, C_CreateObject),
194        Function::CopyObject => check_fn!(ctx, C_CopyObject),
195        Function::DestroyObject => check_fn!(ctx, C_DestroyObject),
196        Function::GetObjectSize => check_fn!(ctx, C_GetObjectSize),
197        Function::GetAttributeValue => check_fn!(ctx, C_GetAttributeValue),
198        Function::SetAttributeValue => check_fn!(ctx, C_SetAttributeValue),
199        Function::FindObjectsInit => check_fn!(ctx, C_FindObjectsInit),
200        Function::FindObjects => check_fn!(ctx, C_FindObjects),
201        Function::FindObjectsFinal => check_fn!(ctx, C_FindObjectsFinal),
202        Function::EncryptInit => check_fn!(ctx, C_EncryptInit),
203        Function::Encrypt => check_fn!(ctx, C_Encrypt),
204        Function::EncryptUpdate => check_fn!(ctx, C_EncryptUpdate),
205        Function::EncryptFinal => check_fn!(ctx, C_EncryptFinal),
206        Function::DecryptInit => check_fn!(ctx, C_DecryptInit),
207        Function::Decrypt => check_fn!(ctx, C_Decrypt),
208        Function::DecryptUpdate => check_fn!(ctx, C_DecryptUpdate),
209        Function::DecryptFinal => check_fn!(ctx, C_DecryptFinal),
210        Function::DigestInit => check_fn!(ctx, C_DigestInit),
211        Function::Digest => check_fn!(ctx, C_Digest),
212        Function::DigestUpdate => check_fn!(ctx, C_DigestUpdate),
213        Function::DigestKey => check_fn!(ctx, C_DigestKey),
214        Function::DigestFinal => check_fn!(ctx, C_DigestFinal),
215        Function::SignInit => check_fn!(ctx, C_SignInit),
216        Function::Sign => check_fn!(ctx, C_Sign),
217        Function::SignUpdate => check_fn!(ctx, C_SignUpdate),
218        Function::SignFinal => check_fn!(ctx, C_SignFinal),
219        Function::SignRecoverInit => check_fn!(ctx, C_SignRecoverInit),
220        Function::SignRecover => check_fn!(ctx, C_SignRecover),
221        Function::VerifyInit => check_fn!(ctx, C_VerifyInit),
222        Function::Verify => check_fn!(ctx, C_Verify),
223        Function::VerifyUpdate => check_fn!(ctx, C_VerifyUpdate),
224        Function::VerifyFinal => check_fn!(ctx, C_VerifyFinal),
225        Function::VerifyRecoverInit => check_fn!(ctx, C_VerifyRecoverInit),
226        Function::VerifyRecover => check_fn!(ctx, C_VerifyRecover),
227        Function::DigestEncryptUpdate => check_fn!(ctx, C_DigestEncryptUpdate),
228        Function::DecryptDigestUpdate => check_fn!(ctx, C_DecryptDigestUpdate),
229        Function::SignEncryptUpdate => check_fn!(ctx, C_SignEncryptUpdate),
230        Function::DecryptVerifyUpdate => check_fn!(ctx, C_DecryptVerifyUpdate),
231        Function::GenerateKey => check_fn!(ctx, C_GenerateKey),
232        Function::GenerateKeyPair => check_fn!(ctx, C_GenerateKeyPair),
233        Function::WrapKey => check_fn!(ctx, C_WrapKey),
234        Function::UnwrapKey => check_fn!(ctx, C_UnwrapKey),
235        Function::DeriveKey => check_fn!(ctx, C_DeriveKey),
236        Function::SeedRandom => check_fn!(ctx, C_SeedRandom),
237        Function::GenerateRandom => check_fn!(ctx, C_GenerateRandom),
238        Function::GetFunctionStatus => check_fn!(ctx, C_GetFunctionStatus),
239        Function::CancelFunction => check_fn!(ctx, C_CancelFunction),
240        Function::WaitForSlotEvent => check_fn!(ctx, C_WaitForSlotEvent),
241        /* PKCS #11 3.0 */
242        Function::GetInterfaceList => check_fn!(ctx, C_GetInterfaceList),
243        Function::GetInterface => check_fn!(ctx, C_GetInterface),
244        Function::LoginUser => check_fn!(ctx, C_LoginUser),
245        Function::SessionCancel => check_fn!(ctx, C_SessionCancel),
246        Function::MessageEncryptInit => check_fn!(ctx, C_MessageEncryptInit),
247        Function::EncryptMessage => check_fn!(ctx, C_EncryptMessage),
248        Function::EncryptMessageBegin => check_fn!(ctx, C_EncryptMessageBegin),
249        Function::EncryptMessageNext => check_fn!(ctx, C_EncryptMessageNext),
250        Function::MessageEncryptFinal => check_fn!(ctx, C_MessageEncryptFinal),
251        Function::MessageDecryptInit => check_fn!(ctx, C_MessageDecryptInit),
252        Function::DecryptMessage => check_fn!(ctx, C_DecryptMessage),
253        Function::DecryptMessageBegin => check_fn!(ctx, C_DecryptMessageBegin),
254        Function::DecryptMessageNext => check_fn!(ctx, C_DecryptMessageNext),
255        Function::MessageDecryptFinal => check_fn!(ctx, C_MessageDecryptFinal),
256        Function::MessageSignInit => check_fn!(ctx, C_MessageSignInit),
257        Function::SignMessage => check_fn!(ctx, C_SignMessage),
258        Function::SignMessageBegin => check_fn!(ctx, C_SignMessageBegin),
259        Function::SignMessageNext => check_fn!(ctx, C_SignMessageNext),
260        Function::MessageSignFinal => check_fn!(ctx, C_MessageSignFinal),
261        Function::MessageVerifyInit => check_fn!(ctx, C_MessageVerifyInit),
262        Function::VerifyMessage => check_fn!(ctx, C_VerifyMessage),
263        Function::VerifyMessageBegin => check_fn!(ctx, C_VerifyMessageBegin),
264        Function::VerifyMessageNext => check_fn!(ctx, C_VerifyMessageNext),
265        Function::MessageVerifyFinal => check_fn!(ctx, C_MessageVerifyFinal),
266        /* PKCS #11 3.2 */
267        Function::EncapsulateKey => check_fn!(ctx, C_EncapsulateKey),
268        Function::DecapsulateKey => check_fn!(ctx, C_DecapsulateKey),
269        Function::VerifySignatureInit => check_fn!(ctx, C_VerifySignatureInit),
270        Function::VerifySignature => check_fn!(ctx, C_VerifySignature),
271        Function::VerifySignatureUpdate => check_fn!(ctx, C_VerifySignatureUpdate),
272        Function::VerifySignatureFinal => check_fn!(ctx, C_VerifySignatureFinal),
273        Function::GetSessionValidationFlags => check_fn!(ctx, C_GetSessionValidationFlags),
274        Function::AsyncComplete => check_fn!(ctx, C_AsyncComplete),
275        Function::AsyncGetID => check_fn!(ctx, C_AsyncGetID),
276        Function::AsyncJoin => check_fn!(ctx, C_AsyncJoin),
277        Function::WrapKeyAuthenticated => check_fn!(ctx, C_WrapKeyAuthenticated),
278        Function::UnwrapKeyAuthenticated => check_fn!(ctx, C_UnwrapKeyAuthenticated),
279    }
280}