10 #include <botan/p11_session.h>
26 bool handle_return_value(
const CK_RV function_result,
ReturnValue* return_value)
28 if(return_value == ThrowException)
36 else if(return_value !=
nullptr)
39 *return_value =
static_cast< ReturnValue >(function_result);
56 session.
set_pin(old_pin, new_pin);
63 session.
set_pin(old_so_pin, new_so_pin);
76 if(m_func_list_ptr ==
nullptr)
87 return handle_return_value(m_func_list_ptr->C_Initialize(init_args), return_value);
93 return handle_return_value(m_func_list_ptr->C_Finalize(reserved), return_value);
99 return handle_return_value(m_func_list_ptr->C_GetInfo(info_ptr), return_value);
107 get_function_list get_function_list_ptr = pkcs11_module.
resolve<get_function_list>(
"C_GetFunctionList");
109 return handle_return_value(get_function_list_ptr(function_list_ptr_ptr), return_value);
119 return handle_return_value(m_func_list_ptr->C_GetSlotList(token_present, slot_list_ptr, count_ptr), return_value);
123 std::vector<SlotId>& slot_ids,
129 Ulong number_slots = 0;
131 bool success =
C_GetSlotList(token_present,
nullptr, &number_slots, return_value);
133 if(!success || !number_slots)
139 slot_ids.resize(number_slots);
140 return C_GetSlotList(token_present, slot_ids.data(), &number_slots, return_value);
147 return handle_return_value(m_func_list_ptr->C_GetSlotInfo(slot_id, info_ptr), return_value);
154 return handle_return_value(m_func_list_ptr->C_GetTokenInfo(slot_id, info_ptr), return_value);
162 return handle_return_value(m_func_list_ptr->C_WaitForSlotEvent(flags, slot_ptr, reserved), return_value);
170 return handle_return_value(m_func_list_ptr->C_GetMechanismList(slot_id,
171 reinterpret_cast< CK_MECHANISM_TYPE_PTR >(mechanism_list_ptr), count_ptr), return_value);
175 std::vector<MechanismType>& mechanisms,
181 Ulong number_mechanisms = 0;
183 bool success =
C_GetMechanismList(slot_id,
nullptr, &number_mechanisms, return_value);
185 if(!success || !number_mechanisms)
191 mechanisms.resize(number_mechanisms);
192 return C_GetMechanismList(slot_id, reinterpret_cast< MechanismType* >(mechanisms.data()), &number_mechanisms,
201 return handle_return_value(m_func_list_ptr->C_GetMechanismInfo(slot_id, static_cast< CK_MECHANISM_TYPE >(type),
202 info_ptr), return_value);
211 return handle_return_value(m_func_list_ptr->C_InitToken(slot_id, so_pin_ptr, so_pin_len, label_ptr), return_value);
219 return handle_return_value(m_func_list_ptr->C_InitPIN(session,
pin_ptr, pin_len), return_value);
229 return handle_return_value(m_func_list_ptr->C_SetPIN(session, old_pin_ptr, old_len, new_pin_ptr, new_len),
242 return handle_return_value(m_func_list_ptr->C_OpenSession(slot_id, flags, application, notify, session_ptr),
249 return handle_return_value(m_func_list_ptr->C_CloseSession(session), return_value);
255 return handle_return_value(m_func_list_ptr->C_CloseAllSessions(slot_id), return_value);
262 return handle_return_value(m_func_list_ptr->C_GetSessionInfo(session, info_ptr), return_value);
266 Byte* operation_state_ptr,
267 Ulong* operation_state_len_ptr,
270 return handle_return_value(m_func_list_ptr->C_GetOperationState(session, operation_state_ptr, operation_state_len_ptr),
275 Byte* operation_state_ptr,
276 Ulong operation_state_len,
281 return handle_return_value(m_func_list_ptr->C_SetOperationState(session, operation_state_ptr, operation_state_len,
282 encryption_key, authentication_key), return_value);
291 return handle_return_value(m_func_list_ptr->C_Login(session, static_cast< CK_USER_TYPE >(user_type),
pin_ptr, pin_len),
298 return handle_return_value(m_func_list_ptr->C_Logout(session), return_value);
309 return handle_return_value(m_func_list_ptr->C_CreateObject(session, attribute_template_ptr, count, object_ptr),
320 return handle_return_value(m_func_list_ptr->C_CopyObject(session,
object, attribute_template_ptr, count,
321 new_object_ptr), return_value);
328 return handle_return_value(m_func_list_ptr->C_DestroyObject(session,
object), return_value);
336 return handle_return_value(m_func_list_ptr->C_GetObjectSize(session,
object, size_ptr), return_value);
345 return handle_return_value(m_func_list_ptr->C_GetAttributeValue(session,
object, attribute_template_ptr, count),
355 return handle_return_value(m_func_list_ptr->C_SetAttributeValue(session,
object, attribute_template_ptr, count),
364 return handle_return_value(m_func_list_ptr->C_FindObjectsInit(session, attribute_template_ptr, count), return_value);
369 Ulong max_object_count,
370 Ulong* object_count_ptr,
373 return handle_return_value(m_func_list_ptr->C_FindObjects(session, object_ptr, max_object_count, object_count_ptr),
380 return handle_return_value(m_func_list_ptr->C_FindObjectsFinal(session), return_value);
390 return handle_return_value(m_func_list_ptr->C_EncryptInit(session, mechanism_ptr, key), return_value);
396 Byte* encrypted_data_ptr,
397 Ulong* encrypted_data_len_ptr,
400 return handle_return_value(m_func_list_ptr->C_Encrypt(session, data_ptr, data_len, encrypted_data_ptr,
401 encrypted_data_len_ptr), return_value);
407 Byte* encrypted_part_ptr,
408 Ulong* encrypted_part_len_ptr,
411 return handle_return_value(m_func_list_ptr->C_EncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr,
412 encrypted_part_len_ptr), return_value);
416 Byte* last_encrypted_part_ptr,
417 Ulong* last_encrypted_part_len_ptr,
420 return handle_return_value(m_func_list_ptr->C_EncryptFinal(session, last_encrypted_part_ptr,
421 last_encrypted_part_len_ptr), return_value);
431 return handle_return_value(m_func_list_ptr->C_DecryptInit(session, mechanism_ptr, key), return_value);
435 Byte* encrypted_data_ptr,
436 Ulong encrypted_data_len,
441 return handle_return_value(m_func_list_ptr->C_Decrypt(session, encrypted_data_ptr, encrypted_data_len, data_ptr,
442 data_len_ptr), return_value);
446 Byte* encrypted_part_ptr,
447 Ulong encrypted_part_len,
452 return handle_return_value(m_func_list_ptr->C_DecryptUpdate(session, encrypted_part_ptr, encrypted_part_len, part_ptr,
453 part_len_ptr), return_value);
458 Ulong* last_part_len_ptr,
461 return handle_return_value(m_func_list_ptr->C_DecryptFinal(session, last_part_ptr, last_part_len_ptr), return_value);
470 return handle_return_value(m_func_list_ptr->C_DigestInit(session, mechanism), return_value);
477 Ulong* digest_len_ptr,
480 return handle_return_value(m_func_list_ptr->C_Digest(session, data_ptr, data_len, digest_ptr, digest_len_ptr),
489 return handle_return_value(m_func_list_ptr->C_DigestUpdate(session, part_ptr, part_len), return_value);
496 return handle_return_value(m_func_list_ptr->C_DigestKey(session, key), return_value);
501 Ulong* digest_len_ptr,
504 return handle_return_value(m_func_list_ptr->C_DigestFinal(session, digest_ptr, digest_len_ptr), return_value);
514 return handle_return_value(m_func_list_ptr->C_SignInit(session, mechanism_ptr, key), return_value);
521 Ulong* signature_len_ptr,
524 return handle_return_value(m_func_list_ptr->C_Sign(session, data_ptr, data_len, signature_ptr, signature_len_ptr),
533 return handle_return_value(m_func_list_ptr->C_SignUpdate(session, part_ptr, part_len), return_value);
538 Ulong* signature_len_ptr,
541 return handle_return_value(m_func_list_ptr->C_SignFinal(session, signature_ptr, signature_len_ptr), return_value);
549 return handle_return_value(m_func_list_ptr->C_SignRecoverInit(session, mechanism_ptr, key), return_value);
556 Ulong* signature_len,
559 return handle_return_value(m_func_list_ptr->C_SignRecover(session, data, data_len, signature, signature_len),
570 return handle_return_value(m_func_list_ptr->C_VerifyInit(session, mechanism_ptr, key), return_value);
580 return handle_return_value(m_func_list_ptr->C_Verify(session, data_ptr, data_len, signature_ptr, signature_len),
589 return handle_return_value(m_func_list_ptr->C_VerifyUpdate(session, part_ptr, part_len), return_value);
597 return handle_return_value(m_func_list_ptr->C_VerifyFinal(session, signature_ptr, signature_len), return_value);
605 return handle_return_value(m_func_list_ptr->C_VerifyRecoverInit(session, mechanism_ptr, key), return_value);
615 return handle_return_value(m_func_list_ptr->C_VerifyRecover(session, signature_ptr, signature_len, data_ptr,
616 data_len_ptr), return_value);
624 Byte* encrypted_part_ptr,
625 Ulong* encrypted_part_len_ptr,
628 return handle_return_value(m_func_list_ptr->C_DigestEncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr,
629 encrypted_part_len_ptr), return_value);
633 Byte* encrypted_part_ptr,
634 Ulong encrypted_part_len,
639 return handle_return_value(m_func_list_ptr->C_DecryptDigestUpdate(session, encrypted_part_ptr, encrypted_part_len,
640 part_ptr, part_len_ptr), return_value);
646 Byte* encrypted_part_ptr,
647 Ulong* encrypted_part_len_ptr,
650 return handle_return_value(m_func_list_ptr->C_SignEncryptUpdate(session, part_ptr, part_len, encrypted_part_ptr,
651 encrypted_part_len_ptr), return_value);
655 Byte* encrypted_part_ptr,
656 Ulong encrypted_part_len,
661 return handle_return_value(m_func_list_ptr->C_DecryptVerifyUpdate(session, encrypted_part_ptr, encrypted_part_len,
662 part_ptr, part_len_ptr), return_value);
674 return handle_return_value(m_func_list_ptr->C_GenerateKey(session, mechanism_ptr, attribute_template_ptr, count,
675 key_ptr), return_value);
681 Ulong public_key_attribute_count,
683 Ulong private_key_attribute_count,
688 return handle_return_value(m_func_list_ptr->C_GenerateKeyPair(session, mechanism_ptr, public_key_template_ptr,
689 public_key_attribute_count, private_key_template_ptr,
690 private_key_attribute_count, public_key_ptr, private_key_ptr), return_value);
697 Byte* wrapped_key_ptr,
698 Ulong* wrapped_key_len_ptr,
701 return handle_return_value(m_func_list_ptr->C_WrapKey(session, mechanism_ptr, wrapping_key, key, wrapped_key_ptr,
702 wrapped_key_len_ptr), return_value);
708 Byte* wrapped_key_ptr,
709 Ulong wrapped_key_len,
711 Ulong attribute_count,
715 return handle_return_value(m_func_list_ptr->C_UnwrapKey(session, mechanism_ptr, unwrapping_key, wrapped_key_ptr,
716 wrapped_key_len, attribute_template_ptr,
717 attribute_count, key_ptr), return_value);
724 Ulong attribute_count,
728 return handle_return_value(m_func_list_ptr->C_DeriveKey(session, mechanism_ptr, base_key, attribute_template_ptr,
729 attribute_count, key_ptr), return_value);
739 return handle_return_value(m_func_list_ptr->C_SeedRandom(session, seed_ptr, seed_len), return_value);
743 Byte* random_data_ptr,
747 return handle_return_value(m_func_list_ptr->C_GenerateRandom(session, random_data_ptr, random_len), return_value);
755 return handle_return_value(m_func_list_ptr->C_GetFunctionStatus(session), return_value);
761 return handle_return_value(m_func_list_ptr->C_CancelFunction(session), return_value);
void initialize(const std::string &label, const secure_string &so_pin) const
bool C_GetMechanismList(SlotId slot_id, MechanismType *mechanism_list_ptr, Ulong *count_ptr, ReturnValue *return_value=ThrowException) const
ReturnValue * ThrowException
bool C_EncryptUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
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) ...
bool C_DecryptVerifyUpdate(SessionHandle session, Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_GetTokenInfo(SlotId slot_id, TokenInfo *info_ptr, ReturnValue *return_value=ThrowException) const
bool C_WrapKey(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle wrapping_key, ObjectHandle key, Byte *wrapped_key_ptr, Ulong *wrapped_key_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_DeriveKey(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle base_key, Attribute *attribute_template_ptr, Ulong attribute_count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
bool C_GenerateKeyPair(SessionHandle session, 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
bool C_VerifyRecover(SessionHandle session, Byte *signature_ptr, Ulong signature_len, Byte *data_ptr, Ulong *data_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_UnwrapKey(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle unwrapping_key, Byte *wrapped_key_ptr, Ulong wrapped_key_len, Attribute *attribute_template_ptr, Ulong attribute_count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
bool C_DecryptFinal(SessionHandle session, Byte *last_part_ptr, Ulong *last_part_len_ptr, ReturnValue *return_value=ThrowException) const
T resolve(const std::string &symbol)
bool C_DigestFinal(SessionHandle session, Byte *digest_ptr, Ulong *digest_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_GetSlotList(Bbool token_present, SlotId *slot_list_ptr, Ulong *count_ptr, ReturnValue *return_value=ThrowException) const
void change_so_pin(Slot &slot, const secure_string &old_so_pin, const secure_string &new_so_pin)
bool C_SetPIN(SessionHandle session, Utf8Char *old_pin_ptr, Ulong old_len, Utf8Char *new_pin_ptr, Ulong new_len, ReturnValue *return_value=ThrowException) const
bool C_GenerateKey(SessionHandle session, Mechanism *mechanism_ptr, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *key_ptr, ReturnValue *return_value=ThrowException) const
bool C_InitPIN(SessionHandle session, Utf8Char *pin_ptr, Ulong pin_len, ReturnValue *return_value=ThrowException) const
bool C_Sign(SessionHandle session, Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
void login(UserType userType, const secure_string &pin)
bool C_SetOperationState(SessionHandle session, Byte *operation_state_ptr, Ulong operation_state_len, ObjectHandle encryption_key, ObjectHandle authentication_key, ReturnValue *return_value=ThrowException) const
bool C_GetObjectSize(SessionHandle session, ObjectHandle object, Ulong *size_ptr, ReturnValue *return_value=ThrowException) const
void set_pin(Slot &slot, const secure_string &so_pin, const secure_string &pin)
bool C_EncryptInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_GetSlotInfo(SlotId slot_id, SlotInfo *info_ptr, ReturnValue *return_value=ThrowException) const
bool C_FindObjectsFinal(SessionHandle session, ReturnValue *return_value=ThrowException) const
bool C_DigestInit(SessionHandle session, Mechanism *mechanism_ptr, ReturnValue *return_value=ThrowException) const
void set_pin(const secure_string &old_pin, const secure_string &new_pin) const
Calls C_SetPIN to change the PIN using the old PIN (requires a logged in session) ...
bool C_SignEncryptUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_CancelFunction(SessionHandle session, ReturnValue *return_value=ThrowException) const
bool C_SignRecover(SessionHandle session, Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_GenerateRandom(SessionHandle session, Byte *random_data_ptr, Ulong random_len, ReturnValue *return_value=ThrowException) const
bool C_SignRecoverInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
CK_FUNCTION_LIST_PTR FunctionListPtr
bool C_VerifyUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const
CK_SESSION_HANDLE SessionHandle
bool C_VerifyFinal(SessionHandle session, Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException) const
LowLevel(FunctionListPtr ptr)
bool C_CloseSession(SessionHandle session, ReturnValue *return_value=ThrowException) const
bool C_WaitForSlotEvent(Flags flags, SlotId *slot_ptr, VoidPtr reserved, ReturnValue *return_value=ThrowException) const
bool C_GetOperationState(SessionHandle session, Byte *operation_state_ptr, Ulong *operation_state_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_VerifyRecoverInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_CreateObject(SessionHandle session, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *object_ptr, ReturnValue *return_value=ThrowException) const
bool C_DigestUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const
bool C_Logout(SessionHandle session, ReturnValue *return_value=ThrowException) const
bool C_VerifyInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_Finalize(VoidPtr reserved, ReturnValue *return_value=ThrowException) const
bool C_GetFunctionStatus(SessionHandle session, ReturnValue *return_value=ThrowException) const
bool C_DecryptUpdate(SessionHandle session, Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_Login(SessionHandle session, UserType user_type, Utf8Char *pin_ptr, Ulong pin_len, ReturnValue *return_value=ThrowException) const
bool C_FindObjectsInit(SessionHandle session, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
static bool C_GetFunctionList(Dynamically_Loaded_Library &pkcs11_module, FunctionListPtr *function_list_ptr_ptr, ReturnValue *return_value=ThrowException)
void initialize_token(Slot &slot, const std::string &label, const secure_string &so_pin, const secure_string &pin)
CK_OBJECT_HANDLE ObjectHandle
bool C_Encrypt(SessionHandle session, Byte *data_ptr, Ulong data_len, Byte *encrypted_data, Ulong *encrypted_data_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_FindObjects(SessionHandle session, ObjectHandle *object_ptr, Ulong max_object_count, Ulong *object_count_ptr, ReturnValue *return_value=ThrowException) const
void change_pin(Slot &slot, const secure_string &old_pin, const secure_string &new_pin)
bool C_GetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
bool C_DestroyObject(SessionHandle session, ObjectHandle object, ReturnValue *return_value=ThrowException) const
bool C_SetAttributeValue(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ReturnValue *return_value=ThrowException) const
bool C_DigestKey(SessionHandle session, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_DecryptInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_Digest(SessionHandle session, Byte *data_ptr, Ulong data_len, Byte *digest_ptr, Ulong *digest_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_SeedRandom(SessionHandle session, Byte *seed_ptr, Ulong seed_len, ReturnValue *return_value=ThrowException) const
bool C_Initialize(VoidPtr init_args, ReturnValue *return_value=ThrowException) const
bool C_DecryptDigestUpdate(SessionHandle session, Byte *encrypted_part_ptr, Ulong encrypted_part_len, Byte *part_ptr, Ulong *part_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_Decrypt(SessionHandle session, Byte *encrypted_data_ptr, Ulong encrypted_data_len, Byte *data_ptr, Ulong *data_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_InitToken(SlotId slot_id, Utf8Char *so_pin_ptr, Ulong so_pin_len, Utf8Char *label_ptr, ReturnValue *return_value=ThrowException) const
bool C_SignFinal(SessionHandle session, Byte *signature_ptr, Ulong *signature_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_DigestEncryptUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, Byte *encrypted_part_ptr, Ulong *encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
secure_vector< uint8_t > secure_string
bool C_GetInfo(Info *info_ptr, ReturnValue *return_value=ThrowException) const
bool C_OpenSession(SlotId slot_id, Flags flags, VoidPtr application, Notify notify, SessionHandle *session_ptr, ReturnValue *return_value=ThrowException) const
bool C_SignInit(SessionHandle session, Mechanism *mechanism_ptr, ObjectHandle key, ReturnValue *return_value=ThrowException) const
bool C_GetMechanismInfo(SlotId slot_id, MechanismType type, MechanismInfo *info_ptr, ReturnValue *return_value=ThrowException) const
bool C_CopyObject(SessionHandle session, ObjectHandle object, Attribute *attribute_template_ptr, Ulong count, ObjectHandle *new_object_ptr, ReturnValue *return_value=ThrowException) const
Represents a PKCS#11 session.
bool C_GetSessionInfo(SessionHandle session, SessionInfo *info_ptr, ReturnValue *return_value=ThrowException) const
bool C_CloseAllSessions(SlotId slot_id, ReturnValue *return_value=ThrowException) const
Represents a PKCS#11 Slot, i.e., a card reader.
bool C_EncryptFinal(SessionHandle session, Byte *last_encrypted_part_ptr, Ulong *last_encrypted_part_len_ptr, ReturnValue *return_value=ThrowException) const
bool C_Verify(SessionHandle session, Byte *data_ptr, Ulong data_len, Byte *signature_ptr, Ulong signature_len, ReturnValue *return_value=ThrowException) const
bool C_SignUpdate(SessionHandle session, Byte *part_ptr, Ulong part_len, ReturnValue *return_value=ThrowException) const