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 paste::paste;
9use std::convert::TryFrom;
10use std::fmt::Display;
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 get_library_info(ctx: &Pkcs11) -> Result<Info> {
29    let mut info = CK_INFO::default();
30    unsafe {
31        Rv::from(get_pkcs11!(ctx, C_GetInfo)(&mut info)).into_result(Function::GetInfo)?;
32        Info::try_from(info)
33    }
34}
35
36macro_rules! check_fn {
37    ($pkcs11:expr, $func_name:ident) => {{
38        let func = paste! { $pkcs11
39            .impl_
40                .get_function_list()
41                .[<C_ $func_name>]
42        };
43        func.is_some()
44    }};
45}
46
47#[allow(missing_docs)]
48#[derive(Debug, Copy, Clone)]
49/// Enumeration of all functions defined by the PKCS11 spec
50pub enum Function {
51    Initialize,
52    Finalize,
53    GetInfo,
54    GetFunctionList,
55    GetSlotList,
56    GetSlotInfo,
57    GetTokenInfo,
58    GetMechanismList,
59    GetMechanismInfo,
60    InitToken,
61    InitPIN,
62    SetPIN,
63    OpenSession,
64    CloseSession,
65    CloseAllSessions,
66    GetSessionInfo,
67    GetOperationState,
68    SetOperationState,
69    Login,
70    Logout,
71    CreateObject,
72    CopyObject,
73    DestroyObject,
74    GetObjectSize,
75    GetAttributeValue,
76    SetAttributeValue,
77    FindObjectsInit,
78    FindObjects,
79    FindObjectsFinal,
80    EncryptInit,
81    Encrypt,
82    EncryptUpdate,
83    EncryptFinal,
84    DecryptInit,
85    Decrypt,
86    DecryptUpdate,
87    DecryptFinal,
88    DigestInit,
89    Digest,
90    DigestUpdate,
91    DigestKey,
92    DigestFinal,
93    SignInit,
94    Sign,
95    SignUpdate,
96    SignFinal,
97    SignRecoverInit,
98    SignRecover,
99    VerifyInit,
100    Verify,
101    VerifyUpdate,
102    VerifyFinal,
103    VerifyRecoverInit,
104    VerifyRecover,
105    DigestEncryptUpdate,
106    DecryptDigestUpdate,
107    SignEncryptUpdate,
108    DecryptVerifyUpdate,
109    GenerateKey,
110    GenerateKeyPair,
111    WrapKey,
112    UnwrapKey,
113    DeriveKey,
114    SeedRandom,
115    GenerateRandom,
116    GetFunctionStatus,
117    CancelFunction,
118    WaitForSlotEvent,
119    /* PKCS #11 3.0 */
120    GetInterfaceList,
121    GetInterface,
122    LoginUser,
123    SessionCancel,
124    MessageEncryptInit,
125    EncryptMessage,
126    EncryptMessageBegin,
127    EncryptMessageNext,
128    MessageEncryptFinal,
129    MessageDecryptInit,
130    DecryptMessage,
131    DecryptMessageBegin,
132    DecryptMessageNext,
133    MessageDecryptFinal,
134    MessageSignInit,
135    SignMessage,
136    SignMessageBegin,
137    SignMessageNext,
138    MessageSignFinal,
139    MessageVerifyInit,
140    VerifyMessage,
141    VerifyMessageBegin,
142    VerifyMessageNext,
143    MessageVerifyFinal,
144}
145
146impl Display for Function {
147    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
148        write!(f, "Function::{:?}", self)
149    }
150}
151
152#[inline(always)]
153pub(super) fn is_fn_supported(ctx: &Pkcs11, function: Function) -> bool {
154    match function {
155        Function::Initialize => check_fn!(ctx, Initialize),
156        Function::Finalize => check_fn!(ctx, Finalize),
157        Function::GetInfo => check_fn!(ctx, GetInfo),
158        Function::GetFunctionList => check_fn!(ctx, GetFunctionList),
159        Function::GetSlotList => check_fn!(ctx, GetSlotList),
160        Function::GetSlotInfo => check_fn!(ctx, GetSlotInfo),
161        Function::GetTokenInfo => check_fn!(ctx, GetTokenInfo),
162        Function::GetMechanismList => check_fn!(ctx, GetMechanismList),
163        Function::GetMechanismInfo => check_fn!(ctx, GetMechanismInfo),
164        Function::InitToken => check_fn!(ctx, InitToken),
165        Function::InitPIN => check_fn!(ctx, InitPIN),
166        Function::SetPIN => check_fn!(ctx, SetPIN),
167        Function::OpenSession => check_fn!(ctx, OpenSession),
168        Function::CloseSession => check_fn!(ctx, CloseSession),
169        Function::CloseAllSessions => check_fn!(ctx, CloseAllSessions),
170        Function::GetSessionInfo => check_fn!(ctx, GetSessionInfo),
171        Function::GetOperationState => check_fn!(ctx, GetOperationState),
172        Function::SetOperationState => check_fn!(ctx, SetOperationState),
173        Function::Login => check_fn!(ctx, Login),
174        Function::Logout => check_fn!(ctx, Logout),
175        Function::CreateObject => check_fn!(ctx, CreateObject),
176        Function::CopyObject => check_fn!(ctx, CopyObject),
177        Function::DestroyObject => check_fn!(ctx, DestroyObject),
178        Function::GetObjectSize => check_fn!(ctx, GetObjectSize),
179        Function::GetAttributeValue => check_fn!(ctx, GetAttributeValue),
180        Function::SetAttributeValue => check_fn!(ctx, SetAttributeValue),
181        Function::FindObjectsInit => check_fn!(ctx, FindObjectsInit),
182        Function::FindObjects => check_fn!(ctx, FindObjects),
183        Function::FindObjectsFinal => check_fn!(ctx, FindObjectsFinal),
184        Function::EncryptInit => check_fn!(ctx, EncryptInit),
185        Function::Encrypt => check_fn!(ctx, Encrypt),
186        Function::EncryptUpdate => check_fn!(ctx, EncryptUpdate),
187        Function::EncryptFinal => check_fn!(ctx, EncryptFinal),
188        Function::DecryptInit => check_fn!(ctx, DecryptInit),
189        Function::Decrypt => check_fn!(ctx, Decrypt),
190        Function::DecryptUpdate => check_fn!(ctx, DecryptUpdate),
191        Function::DecryptFinal => check_fn!(ctx, DecryptFinal),
192        Function::DigestInit => check_fn!(ctx, DigestInit),
193        Function::Digest => check_fn!(ctx, Digest),
194        Function::DigestUpdate => check_fn!(ctx, DigestUpdate),
195        Function::DigestKey => check_fn!(ctx, DigestKey),
196        Function::DigestFinal => check_fn!(ctx, DigestFinal),
197        Function::SignInit => check_fn!(ctx, SignInit),
198        Function::Sign => check_fn!(ctx, Sign),
199        Function::SignUpdate => check_fn!(ctx, SignUpdate),
200        Function::SignFinal => check_fn!(ctx, SignFinal),
201        Function::SignRecoverInit => check_fn!(ctx, SignRecoverInit),
202        Function::SignRecover => check_fn!(ctx, SignRecover),
203        Function::VerifyInit => check_fn!(ctx, VerifyInit),
204        Function::Verify => check_fn!(ctx, Verify),
205        Function::VerifyUpdate => check_fn!(ctx, VerifyUpdate),
206        Function::VerifyFinal => check_fn!(ctx, VerifyFinal),
207        Function::VerifyRecoverInit => check_fn!(ctx, VerifyRecoverInit),
208        Function::VerifyRecover => check_fn!(ctx, VerifyRecover),
209        Function::DigestEncryptUpdate => check_fn!(ctx, DigestEncryptUpdate),
210        Function::DecryptDigestUpdate => check_fn!(ctx, DecryptDigestUpdate),
211        Function::SignEncryptUpdate => check_fn!(ctx, SignEncryptUpdate),
212        Function::DecryptVerifyUpdate => check_fn!(ctx, DecryptVerifyUpdate),
213        Function::GenerateKey => check_fn!(ctx, GenerateKey),
214        Function::GenerateKeyPair => check_fn!(ctx, GenerateKeyPair),
215        Function::WrapKey => check_fn!(ctx, WrapKey),
216        Function::UnwrapKey => check_fn!(ctx, UnwrapKey),
217        Function::DeriveKey => check_fn!(ctx, DeriveKey),
218        Function::SeedRandom => check_fn!(ctx, SeedRandom),
219        Function::GenerateRandom => check_fn!(ctx, GenerateRandom),
220        Function::GetFunctionStatus => check_fn!(ctx, GetFunctionStatus),
221        Function::CancelFunction => check_fn!(ctx, CancelFunction),
222        Function::WaitForSlotEvent => check_fn!(ctx, WaitForSlotEvent),
223        /* PKCS #11 3.0 */
224        Function::GetInterfaceList => check_fn!(ctx, GetInterfaceList),
225        Function::GetInterface => check_fn!(ctx, GetInterface),
226        Function::LoginUser => check_fn!(ctx, LoginUser),
227        Function::SessionCancel => check_fn!(ctx, SessionCancel),
228        Function::MessageEncryptInit => check_fn!(ctx, MessageEncryptInit),
229        Function::EncryptMessage => check_fn!(ctx, EncryptMessage),
230        Function::EncryptMessageBegin => check_fn!(ctx, EncryptMessageBegin),
231        Function::EncryptMessageNext => check_fn!(ctx, EncryptMessageNext),
232        Function::MessageEncryptFinal => check_fn!(ctx, MessageEncryptFinal),
233        Function::MessageDecryptInit => check_fn!(ctx, MessageDecryptInit),
234        Function::DecryptMessage => check_fn!(ctx, DecryptMessage),
235        Function::DecryptMessageBegin => check_fn!(ctx, DecryptMessageBegin),
236        Function::DecryptMessageNext => check_fn!(ctx, DecryptMessageNext),
237        Function::MessageDecryptFinal => check_fn!(ctx, MessageDecryptFinal),
238        Function::MessageSignInit => check_fn!(ctx, MessageSignInit),
239        Function::SignMessage => check_fn!(ctx, SignMessage),
240        Function::SignMessageBegin => check_fn!(ctx, SignMessageBegin),
241        Function::SignMessageNext => check_fn!(ctx, SignMessageNext),
242        Function::MessageSignFinal => check_fn!(ctx, MessageSignFinal),
243        Function::MessageVerifyInit => check_fn!(ctx, MessageVerifyInit),
244        Function::VerifyMessage => check_fn!(ctx, VerifyMessage),
245        Function::VerifyMessageBegin => check_fn!(ctx, VerifyMessageBegin),
246        Function::VerifyMessageNext => check_fn!(ctx, VerifyMessageNext),
247        Function::MessageVerifyFinal => check_fn!(ctx, MessageVerifyFinal),
248    }
249}