1use 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#[inline(always)]
14pub(super) fn initialize(ctx: &Pkcs11, init_args: CInitializeArgs) -> Result<()> {
15 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#[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#[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 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)]
54pub 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 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 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 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 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}