1use 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#[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 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)]
49pub 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 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 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}