Botan 3.11.0
Crypto and TLS for C&
p11.cpp
Go to the documentation of this file.
1/*
2* PKCS#11
3* (C) 2016 Daniel Neus, Sirrix AG
4* (C) 2016 Philipp Weber, Sirrix AG
5* (C) 2025 Fabian Albert, Rohde & Schwarz Cybersecurity GmbH
6*
7* Botan is released under the Simplified BSD License (see license.txt)
8*/
9
10#include <botan/p11.h>
11
12#include <botan/assert.h>
13#include <botan/p11_types.h>
14#include <botan/internal/dyn_load.h>
15
16#include <string>
17
18namespace Botan::PKCS11 {
19
20// NOLINTNEXTLINE(*-no-int-to-ptr,*-avoid-non-const-global-variables)
21ReturnValue* ThrowException = reinterpret_cast<ReturnValue*>(-1);
22
23/// @param function_result Return value of the PKCS11 module function
24/// @param return_value if (`ThrowException`) is passed the function throws an exception, otherwise if a non-NULL pointer is passed:
25/// return_value receives the return value of the PKCS#11 function and no exception is thrown.
26/// @return true if function call was successful, false otherwise
27bool LowLevel::handle_return_value(const CK_RV function_result, ReturnValue* return_value) {
28 if(return_value == ThrowException) {
29 if(static_cast<ReturnValue>(function_result) != ReturnValue::OK) {
30 // caller wants exception
31 throw PKCS11_ReturnError(static_cast<ReturnValue>(function_result));
32 }
33 } else if(return_value != nullptr) {
34 // caller wants return value
35 *return_value = static_cast<ReturnValue>(function_result);
36 }
37
38 return static_cast<ReturnValue>(function_result) == ReturnValue::OK;
39}
40
41void initialize_token(Slot& slot, std::string_view label, const secure_string& so_pin, const secure_string& pin) {
42 slot.initialize(label, so_pin);
43 set_pin(slot, so_pin, pin);
44}
45
46void change_pin(Slot& slot, const secure_string& old_pin, const secure_string& new_pin) {
47 Session session(slot, false);
48 session.login(UserType::User, old_pin);
49 session.set_pin(old_pin, new_pin);
50}
51
52void change_so_pin(Slot& slot, const secure_string& old_so_pin, const secure_string& new_so_pin) {
53 Session session(slot, false);
54 session.login(UserType::SO, old_so_pin);
55 session.set_pin(old_so_pin, new_so_pin);
56}
57
58void set_pin(Slot& slot, const secure_string& so_pin, const secure_string& pin) {
59 Session session(slot, false);
60 session.login(UserType::SO, so_pin);
61 session.init_pin(pin);
62}
63
65 m_interface_wrapper([&] {
66 BOTAN_ARG_CHECK(ptr != nullptr, "Function list pointer must not be nullptr");
69 .pFunctionList = ptr,
70 .flags = 0,
71 });
72 }()) {}
73
74LowLevel::LowLevel(InterfaceWrapper interface_wrapper) : m_interface_wrapper(interface_wrapper) {}
75
76/****************************** General purpose functions ******************************/
77
78bool LowLevel::C_Initialize(const void* init_args, ReturnValue* return_value) const {
79 return handle_return_value(m_interface_wrapper.func_2_40().C_Initialize(const_cast<void*>(init_args)), return_value);
80}
81
82bool LowLevel::C_Finalize(void* reserved, ReturnValue* return_value) const {
83 return handle_return_value(m_interface_wrapper.func_2_40().C_Finalize(reserved), return_value);
84}
85
86bool LowLevel::C_GetInfo(Info* info_ptr, ReturnValue* return_value) const {
87 return handle_return_value(m_interface_wrapper.func_2_40().C_GetInfo(info_ptr), return_value);
88}
89
91 FunctionList** function_list_ptr_ptr,
92 ReturnValue* return_value) {
93 using get_function_list = CK_RV (*)(FunctionList**);
94
95 get_function_list get_function_list_ptr = pkcs11_module.resolve<get_function_list>("C_GetFunctionList");
96
97 return handle_return_value(get_function_list_ptr(function_list_ptr_ptr), return_value);
98}
99
101 Interface* interface_list_ptr,
102 Ulong* count_ptr,
103 ReturnValue* return_value) {
104 using get_interface_list = CK_RV (*)(Interface*, Ulong*);
105 if(auto get_interface_list_ptr = pkcs11_module.try_resolve_symbol<get_interface_list>("C_GetInterfaceList");
106 get_interface_list_ptr.has_value()) {
107 return handle_return_value(get_interface_list_ptr.value()(interface_list_ptr, count_ptr), return_value);
108 }
109 // Loading the library function failed. Probably due to a cryptoki library with PKCS #11 < 3.0.
110 return handle_return_value(CKR_GENERAL_ERROR, return_value);
111}
112
114 const Utf8Char* interface_name_ptr,
115 const Version* version_ptr,
116 Interface* interface_ptr_ptr,
117 Flags flags,
118 ReturnValue* return_value) {
119 using get_interface =
120 CK_RV (*)(Utf8Char* interface_name_ptr, Version* version_ptr, Interface* interface_ptr_ptr, Flags flags);
121 if(auto get_interface_ptr = pkcs11_module.try_resolve_symbol<get_interface>("C_GetInterface");
122 get_interface_ptr.has_value()) {
123 return handle_return_value(
124 get_interface_ptr.value()(
125 const_cast<Utf8Char*>(interface_name_ptr), const_cast<Version*>(version_ptr), interface_ptr_ptr, flags),
126 return_value);
127 }
128 // Loading the library function failed. Probably due to a cryptoki library with PKCS #11 < 3.0.
129 return handle_return_value(CKR_GENERAL_ERROR, return_value);
130}
131
132/****************************** Slot and token management functions ******************************/
133
135 SlotId* slot_list_ptr,
136 Ulong* count_ptr,
137 ReturnValue* return_value) const {
138 return handle_return_value(m_interface_wrapper.func_2_40().C_GetSlotList(token_present, slot_list_ptr, count_ptr),
139 return_value);
140}
141
142bool LowLevel::C_GetSlotList(bool token_present, std::vector<SlotId>& slot_ids, ReturnValue* return_value) const {
143 slot_ids.clear();
144
145 // first get available slots
146 Ulong number_slots = 0;
147
148 const bool success = C_GetSlotList(static_cast<Bbool>(token_present), nullptr, &number_slots, return_value);
149
150 if(!success || number_slots == 0) {
151 return success;
152 }
153
154 // get actual slot ids
155 slot_ids.resize(number_slots);
156 return C_GetSlotList(static_cast<Bbool>(token_present), slot_ids.data(), &number_slots, return_value);
157}
158
159bool LowLevel::C_GetSlotInfo(SlotId slot_id, SlotInfo* info_ptr, ReturnValue* return_value) const {
160 return handle_return_value(m_interface_wrapper.func_2_40().C_GetSlotInfo(slot_id, info_ptr), return_value);
161}
162
163bool LowLevel::C_GetTokenInfo(SlotId slot_id, TokenInfo* info_ptr, ReturnValue* return_value) const {
164 return handle_return_value(m_interface_wrapper.func_2_40().C_GetTokenInfo(slot_id, info_ptr), return_value);
165}
166
167bool LowLevel::C_WaitForSlotEvent(Flags flags, SlotId* slot_ptr, void* reserved, ReturnValue* return_value) const {
168 return handle_return_value(m_interface_wrapper.func_2_40().C_WaitForSlotEvent(flags, slot_ptr, reserved),
169 return_value);
170}
171
173 MechanismType* mechanism_list_ptr,
174 Ulong* count_ptr,
175 ReturnValue* return_value) const {
176 return handle_return_value(m_interface_wrapper.func_2_40().C_GetMechanismList(
177 slot_id, reinterpret_cast<CK_MECHANISM_TYPE_PTR>(mechanism_list_ptr), count_ptr),
178 return_value);
179}
180
182 std::vector<MechanismType>& mechanisms,
183 ReturnValue* return_value) const {
184 mechanisms.clear();
185
186 // first get number of mechanisms
187 Ulong number_mechanisms = 0;
188
189 const bool success = C_GetMechanismList(slot_id, nullptr, &number_mechanisms, return_value);
190
191 if(!success || number_mechanisms == 0) {
192 return success;
193 }
194
195 // get actual mechanisms
196 mechanisms.resize(number_mechanisms);
197 return C_GetMechanismList(
198 slot_id, reinterpret_cast<MechanismType*>(mechanisms.data()), &number_mechanisms, return_value);
199}
200
202 MechanismType type,
203 MechanismInfo* info_ptr,
204 ReturnValue* return_value) const {
205 return handle_return_value(
206 m_interface_wrapper.func_2_40().C_GetMechanismInfo(slot_id, static_cast<CK_MECHANISM_TYPE>(type), info_ptr),
207 return_value);
208}
209
211 const Utf8Char* so_pin_ptr,
212 Ulong so_pin_len,
213 const Utf8Char* label_ptr,
214 ReturnValue* return_value) const {
215 return handle_return_value(
216 m_interface_wrapper.func_2_40().C_InitToken(
217 slot_id, const_cast<Utf8Char*>(so_pin_ptr), so_pin_len, const_cast<Utf8Char*>(label_ptr)),
218 return_value);
219}
220
222 const Utf8Char* pin_ptr,
223 Ulong pin_len,
224 ReturnValue* return_value) const {
225 return handle_return_value(
226 m_interface_wrapper.func_2_40().C_InitPIN(session, const_cast<Utf8Char*>(pin_ptr), pin_len), return_value);
227}
228
230 const Utf8Char* old_pin_ptr,
231 Ulong old_len,
232 const Utf8Char* new_pin_ptr,
233 Ulong new_len,
234 ReturnValue* return_value) const {
235 return handle_return_value(
236 m_interface_wrapper.func_2_40().C_SetPIN(
237 session, const_cast<Utf8Char*>(old_pin_ptr), old_len, const_cast<Utf8Char*>(new_pin_ptr), new_len),
238 return_value);
239}
240
241/****************************** Session management ******************************/
242
244 Flags flags,
245 void* application,
246 Notify notify,
247 SessionHandle* session_ptr,
248 ReturnValue* return_value) const {
249 return handle_return_value(
250 m_interface_wrapper.func_2_40().C_OpenSession(slot_id, flags, application, notify, session_ptr), return_value);
251}
252
253bool LowLevel::C_CloseSession(SessionHandle session, ReturnValue* return_value) const {
254 return handle_return_value(m_interface_wrapper.func_2_40().C_CloseSession(session), return_value);
255}
256
257bool LowLevel::C_CloseAllSessions(SlotId slot_id, ReturnValue* return_value) const {
258 return handle_return_value(m_interface_wrapper.func_2_40().C_CloseAllSessions(slot_id), return_value);
259}
260
261bool LowLevel::C_GetSessionInfo(SessionHandle session, SessionInfo* info_ptr, ReturnValue* return_value) const {
262 return handle_return_value(m_interface_wrapper.func_2_40().C_GetSessionInfo(session, info_ptr), return_value);
263}
264
266 return handle_return_value(m_interface_wrapper.func_3_0().C_SessionCancel(session, flags), return_value);
267}
268
270 Byte* operation_state_ptr,
271 Ulong* operation_state_len_ptr,
272 ReturnValue* return_value) const {
273 return handle_return_value(
274 m_interface_wrapper.func_2_40().C_GetOperationState(session, operation_state_ptr, operation_state_len_ptr),
275 return_value);
276}
277
279 const Byte* operation_state_ptr,
280 Ulong operation_state_len,
281 ObjectHandle encryption_key,
282 ObjectHandle authentication_key,
283 ReturnValue* return_value) const {
284 return handle_return_value(
285 m_interface_wrapper.func_2_40().C_SetOperationState(
286 session, const_cast<Byte*>(operation_state_ptr), operation_state_len, encryption_key, authentication_key),
287 return_value);
288}
289
291 SessionHandle session, UserType user_type, const Utf8Char* pin_ptr, Ulong pin_len, ReturnValue* return_value) const {
292 return handle_return_value(
293 m_interface_wrapper.func_2_40().C_Login(
294 session, static_cast<CK_USER_TYPE>(user_type), const_cast<Utf8Char*>(pin_ptr), pin_len),
295 return_value);
296}
297
299 UserType user_type,
300 const Utf8Char* pin_ptr,
301 Ulong pin_len,
302 const Utf8Char* username_ptr,
303 Ulong username_len,
304 ReturnValue* return_value) {
305 return handle_return_value(m_interface_wrapper.func_3_0().C_LoginUser(session,
306 static_cast<CK_USER_TYPE>(user_type),
307 const_cast<Utf8Char*>(pin_ptr),
308 pin_len,
309 const_cast<Utf8Char*>(username_ptr),
310 username_len),
311 return_value);
312}
313
314bool LowLevel::C_Logout(SessionHandle session, ReturnValue* return_value) const {
315 return handle_return_value(m_interface_wrapper.func_2_40().C_Logout(session), return_value);
316}
317
319 Ulong type,
320 Flags* flags_ptr,
321 ReturnValue* return_value) {
322 return handle_return_value(m_interface_wrapper.func_3_2().C_GetSessionValidationFlags(session, type, flags_ptr),
323 return_value);
324}
325
326/****************************** Object management functions ******************************/
327
329 Attribute* attribute_template_ptr,
330 Ulong count,
331 ObjectHandle* object_ptr,
332 ReturnValue* return_value) const {
333 return handle_return_value(
334 m_interface_wrapper.func_2_40().C_CreateObject(session, attribute_template_ptr, count, object_ptr), return_value);
335}
336
338 ObjectHandle object,
339 Attribute* attribute_template_ptr,
340 Ulong count,
341 ObjectHandle* new_object_ptr,
342 ReturnValue* return_value) const {
343 return handle_return_value(
344 m_interface_wrapper.func_2_40().C_CopyObject(session, object, attribute_template_ptr, count, new_object_ptr),
345 return_value);
346}
347
348bool LowLevel::C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue* return_value) const {
349 return handle_return_value(m_interface_wrapper.func_2_40().C_DestroyObject(session, object), return_value);
350}
351
353 ObjectHandle object,
354 Ulong* size_ptr,
355 ReturnValue* return_value) const {
356 return handle_return_value(m_interface_wrapper.func_2_40().C_GetObjectSize(session, object, size_ptr), return_value);
357}
358
360 ObjectHandle object,
361 Attribute* attribute_template_ptr,
362 Ulong count,
363 ReturnValue* return_value) const {
364 return handle_return_value(
365 m_interface_wrapper.func_2_40().C_GetAttributeValue(session, object, attribute_template_ptr, count),
366 return_value);
367}
368
370 ObjectHandle object,
371 Attribute* attribute_template_ptr,
372 Ulong count,
373 ReturnValue* return_value) const {
374 return handle_return_value(
375 m_interface_wrapper.func_2_40().C_SetAttributeValue(session, object, attribute_template_ptr, count),
376 return_value);
377}
378
380 Attribute* attribute_template_ptr,
381 Ulong count,
382 ReturnValue* return_value) const {
383 return handle_return_value(m_interface_wrapper.func_2_40().C_FindObjectsInit(session, attribute_template_ptr, count),
384 return_value);
385}
386
388 ObjectHandle* object_ptr,
389 Ulong max_object_count,
390 Ulong* object_count_ptr,
391 ReturnValue* return_value) const {
392 return handle_return_value(
393 m_interface_wrapper.func_2_40().C_FindObjects(session, object_ptr, max_object_count, object_count_ptr),
394 return_value);
395}
396
397bool LowLevel::C_FindObjectsFinal(SessionHandle session, ReturnValue* return_value) const {
398 return handle_return_value(m_interface_wrapper.func_2_40().C_FindObjectsFinal(session), return_value);
399}
400
401/****************************** Encryption functions ******************************/
402
404 const Mechanism* mechanism_ptr,
405 ObjectHandle key,
406 ReturnValue* return_value) const {
407 return handle_return_value(
408 m_interface_wrapper.func_2_40().C_EncryptInit(session, const_cast<Mechanism*>(mechanism_ptr), key), return_value);
409}
410
412 const Byte* data_ptr,
413 Ulong data_len,
414 Byte* encrypted_data_ptr,
415 Ulong* encrypted_data_len_ptr,
416 ReturnValue* return_value) const {
417 return handle_return_value(
418 m_interface_wrapper.func_2_40().C_Encrypt(
419 session, const_cast<Byte*>(data_ptr), data_len, encrypted_data_ptr, encrypted_data_len_ptr),
420 return_value);
421}
422
424 const Byte* part_ptr,
425 Ulong part_len,
426 Byte* encrypted_part_ptr,
427 Ulong* encrypted_part_len_ptr,
428 ReturnValue* return_value) const {
429 return handle_return_value(
430 m_interface_wrapper.func_2_40().C_EncryptUpdate(
431 session, const_cast<Byte*>(part_ptr), part_len, encrypted_part_ptr, encrypted_part_len_ptr),
432 return_value);
433}
434
436 Byte* last_encrypted_part_ptr,
437 Ulong* last_encrypted_part_len_ptr,
438 ReturnValue* return_value) const {
439 return handle_return_value(
440 m_interface_wrapper.func_2_40().C_EncryptFinal(session, last_encrypted_part_ptr, last_encrypted_part_len_ptr),
441 return_value);
442}
443
444/*********************** Message-based encryption functions ***********************/
445
447 const Mechanism* mechanism_ptr,
448 ObjectHandle key,
449 ReturnValue* return_value) {
450 return handle_return_value(
451 m_interface_wrapper.func_3_0().C_MessageEncryptInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
452 return_value);
453}
454
456 const void* parameter_ptr,
457 Ulong parameter_len,
458 const Byte* associated_data_ptr,
459 Ulong associated_data_len,
460 const Byte* plaintext_ptr,
461 Ulong plaintext_len,
462 Byte* ciphertext_ptr,
463 Ulong* ciphertext_len_ptr,
464 ReturnValue* return_value) {
465 return handle_return_value(m_interface_wrapper.func_3_0().C_EncryptMessage(session,
466 const_cast<void*>(parameter_ptr),
467 parameter_len,
468 const_cast<Byte*>(associated_data_ptr),
469 associated_data_len,
470 const_cast<Byte*>(plaintext_ptr),
471 plaintext_len,
472 ciphertext_ptr,
473 ciphertext_len_ptr),
474 return_value);
475}
476
478 const void* parameter_ptr,
479 Ulong parameter_len,
480 const Byte* associated_data_ptr,
481 Ulong associated_data_len,
482 ReturnValue* return_value) {
483 return handle_return_value(
484 m_interface_wrapper.func_3_0().C_EncryptMessageBegin(session,
485 const_cast<void*>(parameter_ptr),
486 parameter_len,
487 const_cast<Byte*>(associated_data_ptr),
488 associated_data_len),
489 return_value);
490}
491
493 const void* parameter_ptr,
494 Ulong parameter_len,
495 const Byte* plaintext_part_ptr,
496 Ulong plaintext_part_len,
497 Byte* ciphertext_ptr,
498 Ulong* ciphertext_part_len_ptr,
499 Flags flags,
500 ReturnValue* return_value) {
501 return handle_return_value(m_interface_wrapper.func_3_0().C_EncryptMessageNext(session,
502 const_cast<void*>(parameter_ptr),
503 parameter_len,
504 const_cast<Byte*>(plaintext_part_ptr),
505 plaintext_part_len,
506 ciphertext_ptr,
507 ciphertext_part_len_ptr,
508 flags),
509 return_value);
510}
511
513 return handle_return_value(m_interface_wrapper.func_3_0().C_MessageEncryptFinal(session), return_value);
514}
515
516/****************************** Decryption functions ******************************/
517
519 const Mechanism* mechanism_ptr,
520 ObjectHandle key,
521 ReturnValue* return_value) const {
522 return handle_return_value(
523 m_interface_wrapper.func_2_40().C_DecryptInit(session, const_cast<Mechanism*>(mechanism_ptr), key), return_value);
524}
525
527 const Byte* encrypted_data_ptr,
528 Ulong encrypted_data_len,
529 Byte* data_ptr,
530 Ulong* data_len_ptr,
531 ReturnValue* return_value) const {
532 return handle_return_value(
533 m_interface_wrapper.func_2_40().C_Decrypt(
534 session, const_cast<Byte*>(encrypted_data_ptr), encrypted_data_len, data_ptr, data_len_ptr),
535 return_value);
536}
537
539 const Byte* encrypted_part_ptr,
540 Ulong encrypted_part_len,
541 Byte* part_ptr,
542 Ulong* part_len_ptr,
543 ReturnValue* return_value) const {
544 return handle_return_value(
545 m_interface_wrapper.func_2_40().C_DecryptUpdate(
546 session, const_cast<Byte*>(encrypted_part_ptr), encrypted_part_len, part_ptr, part_len_ptr),
547 return_value);
548}
549
551 Byte* last_part_ptr,
552 Ulong* last_part_len_ptr,
553 ReturnValue* return_value) const {
554 return handle_return_value(m_interface_wrapper.func_2_40().C_DecryptFinal(session, last_part_ptr, last_part_len_ptr),
555 return_value);
556}
557
558/*********************** Message-based decryption functions ***********************/
559
561 const Mechanism* mechanism_ptr,
562 ObjectHandle key,
563 ReturnValue* return_value) {
564 return handle_return_value(
565 m_interface_wrapper.func_3_0().C_MessageDecryptInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
566 return_value);
567}
568
570 const void* parameter_ptr,
571 Ulong parameter_len,
572 const Byte* associated_data_ptr,
573 Ulong associated_data_len,
574 const Byte* ciphertext_ptr,
575 Ulong ciphertext_len,
576 Byte* plaintext_ptr,
577 Ulong* plaintext_len_ptr,
578 ReturnValue* return_value) {
579 return handle_return_value(m_interface_wrapper.func_3_0().C_DecryptMessage(session,
580 const_cast<void*>(parameter_ptr),
581 parameter_len,
582 const_cast<Byte*>(associated_data_ptr),
583 associated_data_len,
584 const_cast<Byte*>(ciphertext_ptr),
585 ciphertext_len,
586 plaintext_ptr,
587 plaintext_len_ptr),
588 return_value);
589}
590
592 const void* parameter_ptr,
593 Ulong parameter_len,
594 const Byte* associated_data_ptr,
595 Ulong associated_data_len,
596 ReturnValue* return_value) {
597 return handle_return_value(
598 m_interface_wrapper.func_3_0().C_DecryptMessageBegin(session,
599 const_cast<void*>(parameter_ptr),
600 parameter_len,
601 const_cast<Byte*>(associated_data_ptr),
602 associated_data_len),
603 return_value);
604}
605
607 const void* parameter_ptr,
608 Ulong parameter_len,
609 const Byte* ciphertext_part_ptr,
610 Ulong ciphertext_part_len,
611 Byte* plaintext_ptr,
612 Ulong* plaintext_part_len_ptr,
613 Flags flags,
614 ReturnValue* return_value) {
615 return handle_return_value(
616 m_interface_wrapper.func_3_0().C_DecryptMessageNext(session,
617 const_cast<void*>(parameter_ptr),
618 parameter_len,
619 const_cast<Byte*>(ciphertext_part_ptr),
620 ciphertext_part_len,
621 plaintext_ptr,
622 plaintext_part_len_ptr,
623 flags),
624 return_value);
625}
626
628 return handle_return_value(m_interface_wrapper.func_3_0().C_MessageDecryptFinal(session), return_value);
629}
630
631/****************************** Message digesting functions ******************************/
632
633bool LowLevel::C_DigestInit(SessionHandle session, const Mechanism* mechanism, ReturnValue* return_value) const {
634 return handle_return_value(m_interface_wrapper.func_2_40().C_DigestInit(session, const_cast<Mechanism*>(mechanism)),
635 return_value);
636}
637
639 const Byte* data_ptr,
640 Ulong data_len,
641 Byte* digest_ptr,
642 Ulong* digest_len_ptr,
643 ReturnValue* return_value) const {
644 return handle_return_value(m_interface_wrapper.func_2_40().C_Digest(
645 session, const_cast<Byte*>(data_ptr), data_len, digest_ptr, digest_len_ptr),
646 return_value);
647}
648
650 const Byte* part_ptr,
651 Ulong part_len,
652 ReturnValue* return_value) const {
653 return handle_return_value(
654 m_interface_wrapper.func_2_40().C_DigestUpdate(session, const_cast<Byte*>(part_ptr), part_len), return_value);
655}
656
657bool LowLevel::C_DigestKey(SessionHandle session, ObjectHandle key, ReturnValue* return_value) const {
658 return handle_return_value(m_interface_wrapper.func_2_40().C_DigestKey(session, key), return_value);
659}
660
662 Byte* digest_ptr,
663 Ulong* digest_len_ptr,
664 ReturnValue* return_value) const {
665 return handle_return_value(m_interface_wrapper.func_2_40().C_DigestFinal(session, digest_ptr, digest_len_ptr),
666 return_value);
667}
668
669/****************************** Signing and MACing functions ******************************/
670
672 const Mechanism* mechanism_ptr,
673 ObjectHandle key,
674 ReturnValue* return_value) const {
675 return handle_return_value(
676 m_interface_wrapper.func_2_40().C_SignInit(session, const_cast<Mechanism*>(mechanism_ptr), key), return_value);
677}
678
680 const Byte* data_ptr,
681 Ulong data_len,
682 Byte* signature_ptr,
683 Ulong* signature_len_ptr,
684 ReturnValue* return_value) const {
685 return handle_return_value(m_interface_wrapper.func_2_40().C_Sign(
686 session, const_cast<Byte*>(data_ptr), data_len, signature_ptr, signature_len_ptr),
687 return_value);
688}
689
691 const Byte* part_ptr,
692 Ulong part_len,
693 ReturnValue* return_value) const {
694 return handle_return_value(
695 m_interface_wrapper.func_2_40().C_SignUpdate(session, const_cast<Byte*>(part_ptr), part_len), return_value);
696}
697
699 Byte* signature_ptr,
700 Ulong* signature_len_ptr,
701 ReturnValue* return_value) const {
702 return handle_return_value(m_interface_wrapper.func_2_40().C_SignFinal(session, signature_ptr, signature_len_ptr),
703 return_value);
704}
705
707 const Mechanism* mechanism_ptr,
708 ObjectHandle key,
709 ReturnValue* return_value) const {
710 return handle_return_value(
711 m_interface_wrapper.func_2_40().C_SignRecoverInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
712 return_value);
713}
714
716 const Byte* data,
717 Ulong data_len,
718 Byte* signature,
719 Ulong* signature_len,
720 ReturnValue* return_value) const {
721 return handle_return_value(m_interface_wrapper.func_2_40().C_SignRecover(
722 session, const_cast<Byte*>(data), data_len, signature, signature_len),
723 return_value);
724}
725
726/******************* Message-based signing and MACing functions *******************/
727
729 const Mechanism* mechanism_ptr,
730 ObjectHandle key,
731 ReturnValue* return_value) {
732 return handle_return_value(
733 m_interface_wrapper.func_3_0().C_MessageSignInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
734 return_value);
735}
736
738 const void* parameter_ptr,
739 Ulong parameter_len,
740 const Byte* data_ptr,
741 Ulong data_len,
742 Byte* signature_ptr,
743 Ulong* signature_len_ptr,
744 ReturnValue* return_value) {
745 return handle_return_value(m_interface_wrapper.func_3_0().C_SignMessage(session,
746 const_cast<void*>(parameter_ptr),
747 parameter_len,
748 const_cast<Byte*>(data_ptr),
749 data_len,
750 signature_ptr,
751 signature_len_ptr),
752 return_value);
753}
754
756 const void* parameter_ptr,
757 Ulong parameter_len,
758 ReturnValue* return_value) {
759 return handle_return_value(
760 m_interface_wrapper.func_3_0().C_SignMessageBegin(session, const_cast<void*>(parameter_ptr), parameter_len),
761 return_value);
762}
763
765 const void* parameter_ptr,
766 Ulong parameter_len,
767 const Byte* data_ptr,
768 Ulong data_len,
769 Byte* signature_ptr,
770 Ulong* signature_len_ptr,
771 ReturnValue* return_value) {
772 return handle_return_value(m_interface_wrapper.func_3_0().C_SignMessageNext(session,
773 const_cast<void*>(parameter_ptr),
774 parameter_len,
775 const_cast<Byte*>(data_ptr),
776 data_len,
777 signature_ptr,
778 signature_len_ptr),
779 return_value);
780}
781
783 return handle_return_value(m_interface_wrapper.func_3_0().C_MessageSignFinal(session), return_value);
784}
785
786/****************************** Functions for verifying signatures and MACs ******************************/
787
789 const Mechanism* mechanism_ptr,
790 ObjectHandle key,
791 ReturnValue* return_value) const {
792 return handle_return_value(
793 m_interface_wrapper.func_2_40().C_VerifyInit(session, const_cast<Mechanism*>(mechanism_ptr), key), return_value);
794}
795
797 const Byte* data_ptr,
798 Ulong data_len,
799 const Byte* signature_ptr,
800 Ulong signature_len,
801 ReturnValue* return_value) const {
802 return handle_return_value(
803 m_interface_wrapper.func_2_40().C_Verify(
804 session, const_cast<Byte*>(data_ptr), data_len, const_cast<Byte*>(signature_ptr), signature_len),
805 return_value);
806}
807
809 const Byte* part_ptr,
810 Ulong part_len,
811 ReturnValue* return_value) const {
812 return handle_return_value(
813 m_interface_wrapper.func_2_40().C_VerifyUpdate(session, const_cast<Byte*>(part_ptr), part_len), return_value);
814}
815
817 const Byte* signature_ptr,
818 Ulong signature_len,
819 ReturnValue* return_value) const {
820 return handle_return_value(
821 m_interface_wrapper.func_2_40().C_VerifyFinal(session, const_cast<Byte*>(signature_ptr), signature_len),
822 return_value);
823}
824
826 const Mechanism* mechanism_ptr,
827 ObjectHandle key,
828 ReturnValue* return_value) const {
829 return handle_return_value(
830 m_interface_wrapper.func_2_40().C_VerifyRecoverInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
831 return_value);
832}
833
835 const Byte* signature_ptr,
836 Ulong signature_len,
837 Byte* data_ptr,
838 Ulong* data_len_ptr,
839 ReturnValue* return_value) const {
840 return handle_return_value(m_interface_wrapper.func_2_40().C_VerifyRecover(
841 session, const_cast<Byte*>(signature_ptr), signature_len, data_ptr, data_len_ptr),
842 return_value);
843}
844
846 const Mechanism* mechanism_ptr,
847 ObjectHandle key,
848 const Byte* signature_ptr,
849 Ulong signature_len,
850 ReturnValue* return_value) {
851 return handle_return_value(
852 m_interface_wrapper.func_3_2().C_VerifySignatureInit(
853 session, const_cast<Mechanism*>(mechanism_ptr), key, const_cast<Byte*>(signature_ptr), signature_len),
854 return_value);
855}
856
858 const Byte* data_ptr,
859 Ulong data_len,
860 ReturnValue* return_value) {
861 return handle_return_value(
862 m_interface_wrapper.func_3_2().C_VerifySignature(session, const_cast<Byte*>(data_ptr), data_len), return_value);
863}
864
866 const Byte* part_ptr,
867 Ulong part_len,
868 ReturnValue* return_value) {
869 return handle_return_value(
870 m_interface_wrapper.func_3_2().C_VerifySignatureUpdate(session, const_cast<Byte*>(part_ptr), part_len),
871 return_value);
872}
873
875 return handle_return_value(m_interface_wrapper.func_3_2().C_VerifySignatureFinal(session), return_value);
876}
877
878/*********** Message-based functions for verifying signatures and MACs ************/
879
881 const Mechanism* mechanism_ptr,
882 ObjectHandle key,
883 ReturnValue* return_value) {
884 return handle_return_value(
885 m_interface_wrapper.func_3_0().C_MessageVerifyInit(session, const_cast<Mechanism*>(mechanism_ptr), key),
886 return_value);
887}
888
890 const void* parameter_ptr,
891 Ulong parameter_len,
892 const Byte* data_ptr,
893 Ulong data_len,
894 const Byte* signature_ptr,
895 Ulong signature_len,
896 ReturnValue* return_value) {
897 return handle_return_value(m_interface_wrapper.func_3_0().C_VerifyMessage(session,
898 const_cast<void*>(parameter_ptr),
899 parameter_len,
900 const_cast<Byte*>(data_ptr),
901 data_len,
902 const_cast<Byte*>(signature_ptr),
903 signature_len),
904 return_value);
905}
906
908 const void* parameter_ptr,
909 Ulong parameter_len,
910 ReturnValue* return_value) {
911 return handle_return_value(
912 m_interface_wrapper.func_3_0().C_VerifyMessageBegin(session, const_cast<void*>(parameter_ptr), parameter_len),
913 return_value);
914}
915
917 const void* parameter_ptr,
918 Ulong parameter_len,
919 const Byte* data_ptr,
920 Ulong data_len,
921 const Byte* signature_ptr,
922 Ulong signature_len,
923 ReturnValue* return_value) {
924 return handle_return_value(m_interface_wrapper.func_3_0().C_VerifyMessageNext(session,
925 const_cast<void*>(parameter_ptr),
926 parameter_len,
927 const_cast<Byte*>(data_ptr),
928 data_len,
929 const_cast<Byte*>(signature_ptr),
930 signature_len),
931 return_value);
932}
933
935 return handle_return_value(m_interface_wrapper.func_3_0().C_MessageVerifyFinal(session), return_value);
936}
937
938/****************************** Dual-purpose cryptographic functions ******************************/
939
941 const Byte* part_ptr,
942 Ulong part_len,
943 Byte* encrypted_part_ptr,
944 Ulong* encrypted_part_len_ptr,
945 ReturnValue* return_value) const {
946 return handle_return_value(
947 m_interface_wrapper.func_2_40().C_DigestEncryptUpdate(
948 session, const_cast<Byte*>(part_ptr), part_len, encrypted_part_ptr, encrypted_part_len_ptr),
949 return_value);
950}
951
953 const Byte* encrypted_part_ptr,
954 Ulong encrypted_part_len,
955 Byte* part_ptr,
956 Ulong* part_len_ptr,
957 ReturnValue* return_value) const {
958 return handle_return_value(
959 m_interface_wrapper.func_2_40().C_DecryptDigestUpdate(
960 session, const_cast<Byte*>(encrypted_part_ptr), encrypted_part_len, part_ptr, part_len_ptr),
961 return_value);
962}
963
965 const Byte* part_ptr,
966 Ulong part_len,
967 Byte* encrypted_part_ptr,
968 Ulong* encrypted_part_len_ptr,
969 ReturnValue* return_value) const {
970 return handle_return_value(
971 m_interface_wrapper.func_2_40().C_SignEncryptUpdate(
972 session, const_cast<Byte*>(part_ptr), part_len, encrypted_part_ptr, encrypted_part_len_ptr),
973 return_value);
974}
975
977 const Byte* encrypted_part_ptr,
978 Ulong encrypted_part_len,
979 Byte* part_ptr,
980 Ulong* part_len_ptr,
981 ReturnValue* return_value) const {
982 return handle_return_value(
983 m_interface_wrapper.func_2_40().C_DecryptVerifyUpdate(
984 session, const_cast<Byte*>(encrypted_part_ptr), encrypted_part_len, part_ptr, part_len_ptr),
985 return_value);
986}
987
988/****************************** Key management functions ******************************/
989
991 const Mechanism* mechanism_ptr,
992 Attribute* attribute_template_ptr,
993 Ulong count,
994 ObjectHandle* key_ptr,
995 ReturnValue* return_value) const {
996 return handle_return_value(
997 m_interface_wrapper.func_2_40().C_GenerateKey(
998 session, const_cast<Mechanism*>(mechanism_ptr), attribute_template_ptr, count, key_ptr),
999 return_value);
1000}
1001
1003 const Mechanism* mechanism_ptr,
1004 Attribute* public_key_template_ptr,
1005 Ulong public_key_attribute_count,
1006 Attribute* private_key_template_ptr,
1007 Ulong private_key_attribute_count,
1008 ObjectHandle* public_key_ptr,
1009 ObjectHandle* private_key_ptr,
1010 ReturnValue* return_value) const {
1011 return handle_return_value(m_interface_wrapper.func_2_40().C_GenerateKeyPair(session,
1012 const_cast<Mechanism*>(mechanism_ptr),
1013 public_key_template_ptr,
1014 public_key_attribute_count,
1015 private_key_template_ptr,
1016 private_key_attribute_count,
1017 public_key_ptr,
1018 private_key_ptr),
1019 return_value);
1020}
1021
1023 const Mechanism* mechanism_ptr,
1024 ObjectHandle wrapping_key,
1025 ObjectHandle key,
1026 Byte* wrapped_key_ptr,
1027 Ulong* wrapped_key_len_ptr,
1028 ReturnValue* return_value) const {
1029 return handle_return_value(
1030 m_interface_wrapper.func_2_40().C_WrapKey(
1031 session, const_cast<Mechanism*>(mechanism_ptr), wrapping_key, key, wrapped_key_ptr, wrapped_key_len_ptr),
1032 return_value);
1033}
1034
1036 const Mechanism* mechanism_ptr,
1037 ObjectHandle unwrapping_key,
1038 const Byte* wrapped_key_ptr,
1039 Ulong wrapped_key_len,
1040 Attribute* attribute_template_ptr,
1041 Ulong attribute_count,
1042 ObjectHandle* key_ptr,
1043 ReturnValue* return_value) const {
1044 return handle_return_value(m_interface_wrapper.func_2_40().C_UnwrapKey(session,
1045 const_cast<Mechanism*>(mechanism_ptr),
1046 unwrapping_key,
1047 const_cast<Byte*>(wrapped_key_ptr),
1048 wrapped_key_len,
1049 attribute_template_ptr,
1050 attribute_count,
1051 key_ptr),
1052 return_value);
1053}
1054
1056 const Mechanism* mechanism_ptr,
1057 ObjectHandle base_key,
1058 Attribute* attribute_template_ptr,
1059 Ulong attribute_count,
1060 ObjectHandle* key_ptr,
1061 ReturnValue* return_value) const {
1062 return handle_return_value(
1063 m_interface_wrapper.func_2_40().C_DeriveKey(
1064 session, const_cast<Mechanism*>(mechanism_ptr), base_key, attribute_template_ptr, attribute_count, key_ptr),
1065 return_value);
1066}
1067
1069 const Mechanism* mechanism_ptr,
1070 ObjectHandle wrapping_key,
1071 ObjectHandle key,
1072 const Byte* associated_data_ptr,
1073 Ulong associated_data_len,
1074 Byte* wrapped_key_ptr,
1075 Ulong* wrapped_key_len_ptr,
1076 ReturnValue* return_value) const {
1077 return handle_return_value(
1078 m_interface_wrapper.func_3_2().C_WrapKeyAuthenticated(session,
1079 const_cast<Mechanism*>(mechanism_ptr),
1080 wrapping_key,
1081 key,
1082 const_cast<Byte*>(associated_data_ptr),
1083 associated_data_len,
1084 wrapped_key_ptr,
1085 wrapped_key_len_ptr),
1086 return_value);
1087}
1088
1090 const Mechanism* mechanism_ptr,
1091 ObjectHandle unwrapping_key,
1092 const Byte* wrapped_key_ptr,
1093 Ulong wrapped_key_len,
1094 Attribute* attribute_template_ptr,
1095 Ulong attribute_count,
1096 const Byte* associated_data_ptr,
1097 Ulong associated_data_len,
1098 ObjectHandle* key_ptr,
1099 ReturnValue* return_value) const {
1100 return handle_return_value(
1101 m_interface_wrapper.func_3_2().C_UnwrapKeyAuthenticated(session,
1102 const_cast<Mechanism*>(mechanism_ptr),
1103 unwrapping_key,
1104 const_cast<Byte*>(wrapped_key_ptr),
1105 wrapped_key_len,
1106 attribute_template_ptr,
1107 attribute_count,
1108 const_cast<Byte*>(associated_data_ptr),
1109 associated_data_len,
1110 key_ptr),
1111 return_value);
1112}
1113
1115 const Mechanism* mechanism_ptr,
1116 ObjectHandle public_key,
1117 Attribute* template_ptr,
1118 Ulong attribute_count,
1119 Byte* ciphertext_ptr,
1120 Ulong* ciphertext_len_ptr,
1121 ObjectHandle* key_ptr,
1122 ReturnValue* return_value) {
1123 return handle_return_value(m_interface_wrapper.func_3_2().C_EncapsulateKey(session,
1124 const_cast<Mechanism*>(mechanism_ptr),
1125 public_key,
1126 template_ptr,
1127 attribute_count,
1128 ciphertext_ptr,
1129 ciphertext_len_ptr,
1130 key_ptr),
1131 return_value);
1132}
1133
1135 const Mechanism* mechanism_ptr,
1136 ObjectHandle private_key,
1137 Attribute* template_ptr,
1138 Ulong attribute_count,
1139 const Byte* ciphertext_ptr,
1140 Ulong ciphertext_len,
1141 ObjectHandle* key_ptr,
1142 ReturnValue* return_value) {
1143 return handle_return_value(m_interface_wrapper.func_3_2().C_DecapsulateKey(session,
1144 const_cast<Mechanism*>(mechanism_ptr),
1145 private_key,
1146 template_ptr,
1147 attribute_count,
1148 const_cast<Byte*>(ciphertext_ptr),
1149 ciphertext_len,
1150 key_ptr),
1151 return_value);
1152}
1153
1154/****************************** Random number generation functions ******************************/
1155
1157 const Byte* seed_ptr,
1158 Ulong seed_len,
1159 ReturnValue* return_value) const {
1160 return handle_return_value(
1161 m_interface_wrapper.func_2_40().C_SeedRandom(session, const_cast<Byte*>(seed_ptr), seed_len), return_value);
1162}
1163
1165 Byte* random_data_ptr,
1166 Ulong random_len,
1167 ReturnValue* return_value) const {
1168 return handle_return_value(m_interface_wrapper.func_2_40().C_GenerateRandom(session, random_data_ptr, random_len),
1169 return_value);
1170}
1171
1172/****************************** Parallel function management functions ******************************/
1173
1174bool LowLevel::C_GetFunctionStatus(SessionHandle session, ReturnValue* return_value) const {
1175 return handle_return_value(m_interface_wrapper.func_2_40().C_GetFunctionStatus(session), return_value);
1176}
1177
1178bool LowLevel::C_CancelFunction(SessionHandle session, ReturnValue* return_value) const {
1179 return handle_return_value(m_interface_wrapper.func_2_40().C_CancelFunction(session), return_value);
1180}
1181
1182/******************* Asynchronous function management functions *******************/
1183
1185 const Utf8Char* function_name_ptr,
1186 AsyncData* result_ptr,
1187 ReturnValue* return_value) {
1188 return handle_return_value(
1189 m_interface_wrapper.func_3_2().C_AsyncComplete(session, const_cast<Utf8Char*>(function_name_ptr), result_ptr),
1190 return_value);
1191}
1192
1194 const Utf8Char* function_name_ptr,
1195 Ulong* id_ptr,
1196 ReturnValue* return_value) {
1197 return handle_return_value(
1198 m_interface_wrapper.func_3_2().C_AsyncGetID(session, const_cast<Utf8Char*>(function_name_ptr), id_ptr),
1199 return_value);
1200}
1201
1203 const Utf8Char* function_name_ptr,
1204 Ulong id,
1205 Byte* data_ptr,
1206 Ulong data_len,
1207 ReturnValue* return_value) {
1208 return handle_return_value(m_interface_wrapper.func_3_2().C_AsyncJoin(
1209 session, const_cast<Utf8Char*>(function_name_ptr), id, data_ptr, data_len),
1210 return_value);
1211}
1212
1214 return reinterpret_cast<FunctionList*>(m_interface_wrapper.raw_interface().pFunctionList);
1215}
1216
1217} // namespace Botan::PKCS11
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
std::optional< PtrT > try_resolve_symbol(const std::string &symbol) const
Definition dyn_load.h:47
PtrT resolve(const std::string &symbol) const
Definition dyn_load.h:69
Wraps a PKCS #11 Interface object.
Definition p11.h:1275
static Utf8Char * p11_interface_name_ptr()
bool C_VerifyMessage(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *data_ptr, Ulong data_len, const Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:889
bool C_CancelFunction(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1178
bool C_MessageSignFinal(SessionHandle session, ReturnValue *return_value=ThrowException)
Definition p11.cpp:782
bool C_EncryptMessageBegin(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *associated_data_ptr, Ulong associated_data_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:477
bool C_SignEncryptUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:964
bool C_GetSessionInfo(SessionHandle session, SessionInfo *info_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:261
bool C_VerifySignatureInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, const Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:845
bool C_Logout(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:314
bool C_MessageEncryptFinal(SessionHandle session, ReturnValue *return_value=ThrowException)
Definition p11.cpp:512
bool C_WrapKey(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle wrapping_key, ObjectHandle key, Byte *wrapped_key_ptr, Ulong *wrapped_key_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1022
bool C_InitPIN(SessionHandle session, const Utf8Char *pin_ptr, Ulong pin_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:221
bool C_GetOperationState(SessionHandle session, Byte *operation_state_ptr, Ulong *operation_state_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:269
bool C_DigestKey(SessionHandle session, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:657
bool C_DecryptUpdate(SessionHandle session, const Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:538
bool C_MessageDecryptFinal(SessionHandle session, ReturnValue *return_value=ThrowException)
Definition p11.cpp:627
bool C_GetTokenInfo(SlotId slot_id, TokenInfo *info_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:163
bool C_SetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:369
bool C_VerifyMessageNext(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *data_ptr, Ulong data_len, const Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:916
bool C_SignRecover(SessionHandle session, const Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:715
bool C_MessageDecryptInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException)
Definition p11.cpp:560
bool C_DecryptFinal(SessionHandle session, Byte *last_part_ptr, Ulong *last_part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:550
bool C_VerifyRecover(SessionHandle session, const Byte *signature_ptr, Ulong signature_len, Byte *data_ptr, Ulong *data_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:834
static bool C_GetFunctionList(const Dynamically_Loaded_Library &pkcs11_module, FunctionList **function_list_ptr_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:90
bool C_EncapsulateKey(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle public_key, Attribute *template_ptr, Ulong attribute_count, Byte *ciphertext_ptr, Ulong *ciphertext_len_ptr, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:1114
bool C_InitToken(SlotId slot_id, const Utf8Char *so_pin_ptr, Ulong so_pin_len, const Utf8Char *label_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:210
bool C_GetSlotInfo(SlotId slot_id, SlotInfo *info_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:159
bool C_EncryptFinal(SessionHandle session, Byte *last_encrypted_part_ptr, Ulong *last_encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:435
bool C_FindObjectsInit(SessionHandle session, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:379
bool C_VerifyUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:808
bool C_GetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:359
bool C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:348
bool C_VerifyMessageBegin(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:907
bool C_Login(SessionHandle session, UserType user_type, const Utf8Char *pin_ptr, Ulong pin_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:290
bool C_CopyObject(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *new_object_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:337
bool C_EncryptMessage(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *associated_data_ptr, Ulong associated_data_len, const Byte *plaintext_ptr, Ulong plaintext_len, Byte *ciphertext_ptr, Ulong *ciphertext_len_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:455
bool C_GenerateRandom(SessionHandle session, Byte *random_data_ptr, Ulong random_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1164
LowLevel(FunctionList *ptr)
Definition p11.cpp:64
bool C_VerifySignature(SessionHandle session, const Byte *data_ptr, Ulong data_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:857
bool C_EncryptMessageNext(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *plaintext_part_ptr, Ulong plaintext_part_len, Byte *ciphertext_ptr, Ulong *ciphertext_part_len_ptr, Flags flags, ReturnValue *return_value=ThrowException)
Definition p11.cpp:492
bool C_Sign(SessionHandle session, const Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:679
bool C_DecryptMessage(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *associated_data_ptr, Ulong associated_data_len, const Byte *ciphertext_ptr, Ulong ciphertext_len, Byte *plaintext_ptr, Ulong *plaintext_len_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:569
bool C_GetFunctionStatus(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1174
bool C_AsyncGetID(SessionHandle session, const Utf8Char *function_name_ptr, Ulong *id_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:1193
bool C_CloseSession(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:253
const InterfaceWrapper & get_interface()
Definition p11.h:3999
bool C_Initialize(const void *init_args, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:78
bool C_Encrypt(SessionHandle session, const Byte *data_ptr, Ulong data_len, Byte *encrypted_data, Ulong *encrypted_data_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:411
static bool C_GetInterfaceList(const Dynamically_Loaded_Library &pkcs11_module, Interface *interface_list_ptr, Ulong *count_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:100
bool C_LoginUser(SessionHandle session, UserType user_type, const Utf8Char *pin_ptr, Ulong pin_len, const Utf8Char *username_ptr, Ulong username_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:298
bool C_SignUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:690
bool C_DecapsulateKey(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle private_key, Attribute *template_ptr, Ulong attribute_count, const Byte *ciphertext_ptr, Ulong ciphertext_len, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:1134
bool C_GetInfo(Info *info_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:86
bool C_GetMechanismList(SlotId slot_id, MechanismType *mechanism_list_ptr, Ulong *count_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:172
bool C_WaitForSlotEvent(Flags flags, SlotId *slot_ptr, void *reserved, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:167
bool C_MessageVerifyInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException)
Definition p11.cpp:880
bool C_GetSessionValidationFlags(SessionHandle session, Ulong type, Flags *flags_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:318
bool C_OpenSession(SlotId slot_id, Flags flags, void *application, Notify notify, SessionHandle *session_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:243
bool C_FindObjectsFinal(SessionHandle session, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:397
static bool handle_return_value(CK_RV function_result, ReturnValue *return_value)
Definition p11.cpp:27
bool C_Decrypt(SessionHandle session, const Byte *encrypted_data_ptr, Ulong encrypted_data_len, Byte *data_ptr, Ulong *data_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:526
bool C_DigestInit(SessionHandle session, const Mechanism *mechanism_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:633
bool C_VerifySignatureFinal(SessionHandle session, ReturnValue *return_value=ThrowException)
Definition p11.cpp:874
bool C_AsyncComplete(SessionHandle session, const Utf8Char *function_name_ptr, AsyncData *result_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:1184
bool C_DecryptInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:518
bool C_MessageSignInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException)
Definition p11.cpp:728
bool C_SessionCancel(SessionHandle session, Flags flags, ReturnValue *return_value=ThrowException)
Definition p11.cpp:265
bool C_CloseAllSessions(SlotId slot_id, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:257
bool C_AsyncJoin(SessionHandle session, const Utf8Char *function_name_ptr, Ulong id, Byte *data_ptr, Ulong data_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:1202
bool C_SeedRandom(SessionHandle session, const Byte *seed_ptr, Ulong seed_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1156
bool C_CreateObject(SessionHandle session, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *object_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:328
static bool C_GetInterface(const Dynamically_Loaded_Library &pkcs11_module, const Utf8Char *interface_name_ptr, const Version *version_ptr, Interface *interface_ptr_ptr, Flags flags, ReturnValue *return_value=ThrowException)
Definition p11.cpp:113
bool C_Finalize(void *reserved, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:82
bool C_SignMessageNext(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:764
bool C_FindObjects(SessionHandle session, ObjectHandle *object_ptr, Ulong max_object_count, Ulong *object_count_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:387
bool C_GenerateKeyPair(SessionHandle session, const Mechanism *mechanism_ptr, Attribute *public_key_template_ptr, Ulong public_key_attribute_count, Attribute *private_key_template_ptr, Ulong private_key_attribute_count, ObjectHandle *public_key_ptr, ObjectHandle *private_key_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1002
bool C_UnwrapKeyAuthenticated(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle unwrapping_key, const Byte *wrapped_key_ptr, Ulong wrapped_key_len, Attribute *attribute_template_ptr, Ulong attribute_count, const Byte *associated_data_ptr, Ulong associated_data_len, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1089
bool C_VerifyInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:788
bool C_GetSlotList(Bbool token_present, SlotId *slot_list_ptr, Ulong *count_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:134
bool C_GetMechanismInfo(SlotId slot_id, MechanismType type, MechanismInfo *info_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:201
bool C_DigestEncryptUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:940
bool C_DecryptMessageNext(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *ciphertext_part_ptr, Ulong ciphertext_part_len, Byte *plaintext_ptr, Ulong *plaintext_part_len_ptr, Flags flags, ReturnValue *return_value=ThrowException)
Definition p11.cpp:606
bool C_SignMessage(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException)
Definition p11.cpp:737
bool C_SetPIN(SessionHandle session, const Utf8Char *old_pin_ptr, Ulong old_len, const Utf8Char *new_pin_ptr, Ulong new_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:229
bool C_VerifyFinal(SessionHandle session, const Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:816
bool C_Digest(SessionHandle session, const Byte *data_ptr, Ulong data_len, Byte *digest_ptr, Ulong *digest_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:638
bool C_MessageVerifyFinal(SessionHandle session, ReturnValue *return_value=ThrowException)
Definition p11.cpp:934
FunctionList * get_functions() const
Definition p11.cpp:1213
bool C_UnwrapKey(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle unwrapping_key, const Byte *wrapped_key_ptr, Ulong wrapped_key_len, Attribute *attribute_template_ptr, Ulong attribute_count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1035
bool C_VerifySignatureUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:865
bool C_EncryptInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:403
bool C_WrapKeyAuthenticated(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle wrapping_key, ObjectHandle key, const Byte *associated_data_ptr, Ulong associated_data_len, Byte *wrapped_key_ptr, Ulong *wrapped_key_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1068
bool C_SignFinal(SessionHandle session, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:698
bool C_SignMessageBegin(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:755
bool C_MessageEncryptInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException)
Definition p11.cpp:446
bool C_VerifyRecoverInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:825
bool C_DigestUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:649
bool C_SignInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:671
bool C_DigestFinal(SessionHandle session, Byte *digest_ptr, Ulong *digest_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:661
bool C_Verify(SessionHandle session, const Byte *data_ptr, Ulong data_len, const Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:796
bool C_GetObjectSize(SessionHandle session, ObjectHandle object, Ulong *size_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:352
bool C_SetOperationState(SessionHandle session, const Byte *operation_state_ptr, Ulong operation_state_len, ObjectHandle encryption_key, ObjectHandle authentication_key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:278
bool C_GenerateKey(SessionHandle session, const Mechanism *mechanism_ptr, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:990
bool C_EncryptUpdate(SessionHandle session, const Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:423
bool C_DecryptMessageBegin(SessionHandle session, const void *parameter_ptr, Ulong parameter_len, const Byte *associated_data_ptr, Ulong associated_data_len, ReturnValue *return_value=ThrowException)
Definition p11.cpp:591
bool C_DecryptDigestUpdate(SessionHandle session, const Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:952
bool C_SignRecoverInit(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:706
bool C_DecryptVerifyUpdate(SessionHandle session, const Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:976
bool C_DeriveKey(SessionHandle session, const Mechanism *mechanism_ptr, ObjectHandle base_key, Attribute *attribute_template_ptr, Ulong attribute_count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
Definition p11.cpp:1055
Represents a PKCS#11 session.
Definition p11_types.h:125
void set_pin(const secure_string &old_pin, const secure_string &new_pin)
Calls C_SetPIN to change the PIN using the old PIN (requires a logged in session).
void init_pin(const secure_string &new_pin)
Calls C_InitPIN to change or initialize the PIN using the SO_PIN (requires a logged in session).
void login(UserType userType, const secure_string &pin)
Represents a PKCS#11 Slot, i.e., a card reader.
Definition p11_types.h:78
void initialize(std::string_view label, const secure_string &so_pin) const
Definition p11_slot.cpp:45
CK_SLOT_ID SlotId
Definition p11.h:1202
ReturnValue * ThrowException
Definition p11.cpp:21
secure_vector< uint8_t > secure_string
Definition p11.h:45
CK_FUNCTION_LIST FunctionList
Definition p11.h:1187
CK_MECHANISM Mechanism
Definition p11.h:1206
CK_NOTIFY Notify
Definition p11.h:1209
void change_pin(Slot &slot, const secure_string &old_pin, const secure_string &new_pin)
Definition p11.cpp:46
CK_OBJECT_HANDLE ObjectHandle
Definition p11.h:1213
void change_so_pin(Slot &slot, const secure_string &old_so_pin, const secure_string &new_so_pin)
Definition p11.cpp:52
CK_ATTRIBUTE Attribute
Definition p11.h:1212
CK_VERSION Version
Definition p11.h:1200
CK_BYTE Byte
Definition p11.h:1214
CK_INFO Info
Definition p11.h:1199
CK_SLOT_INFO SlotInfo
Definition p11.h:1204
CK_INTERFACE Interface
Definition p11.h:1191
CK_FLAGS Flags
Definition p11.h:1198
CK_SESSION_INFO SessionInfo
Definition p11.h:1211
CK_TOKEN_INFO TokenInfo
Definition p11.h:1205
CK_ASYNC_DATA AsyncData
Definition p11.h:1219
CK_UTF8CHAR Utf8Char
Definition p11.h:1208
CK_ULONG Ulong
Definition p11.h:1203
CK_BBOOL Bbool
Definition p11.h:1201
void set_pin(Slot &slot, const secure_string &so_pin, const secure_string &pin)
Definition p11.cpp:58
CK_MECHANISM_INFO MechanismInfo
Definition p11.h:1207
Flags flags(Flag flags)
Definition p11.h:1227
void initialize_token(Slot &slot, std::string_view label, const secure_string &so_pin, const secure_string &pin)
Definition p11.cpp:41
CK_SESSION_HANDLE SessionHandle
Definition p11.h:1210
#define CKR_GENERAL_ERROR
Definition pkcs11.h:1092
CK_MECHANISM_TYPE * CK_MECHANISM_TYPE_PTR
Definition pkcs11.h:59
CK_ULONG CK_RV
Definition pkcs11.h:73
CK_ULONG CK_USER_TYPE
Definition pkcs11.h:81
CK_ULONG CK_MECHANISM_TYPE
Definition pkcs11.h:59