1 /*
2 * PKCS#11 Session
3 * (C) 2016 Daniel Neus, Sirrix AG
4 * (C) 2016 Philipp Weber, Sirrix AG
5 *
6 * Botan is released under the Simplified BSD License (see license.txt)
7 */
8
9 #include <botan/p11_types.h>
10
11 namespace Botan {
12 namespace PKCS11 {
13
Session(Slot & slot,bool read_only)14 Session::Session(Slot& slot, bool read_only)
15 : Session(slot, PKCS11::flags(Flag::SerialSession | (read_only ? Flag::None : Flag::RwSession)), nullptr, nullptr)
16 {}
17
Session(Slot & slot,Flags flags,VoidPtr callback_data,Notify notify_callback)18 Session::Session(Slot& slot, Flags flags, VoidPtr callback_data, Notify notify_callback)
19 : m_slot(slot), m_handle(0), m_logged_in(false)
20 {
21 module()->C_OpenSession(m_slot.slot_id(), flags, callback_data, notify_callback, &m_handle);
22 }
23
Session(Slot & slot,SessionHandle handle)24 Session::Session(Slot& slot, SessionHandle handle)
25 : m_slot(slot), m_handle(handle)
26 {
27 SessionInfo info = get_info();
28 if(info.state == static_cast<CK_STATE>(SessionState::RoPublicSession)
29 || info.state == static_cast<CK_STATE>(SessionState::RwPublicSession))
30 {
31 m_logged_in = false;
32 }
33 else
34 {
35 m_logged_in = true;
36 }
37 }
38
~Session()39 Session::~Session() noexcept
40 {
41 try
42 {
43 if(m_handle)
44 {
45 if(m_logged_in)
46 {
47 module()->C_Logout(m_handle, nullptr);
48 }
49 module()->C_CloseSession(m_handle, nullptr);
50 m_handle = 0;
51 }
52 }
53 catch(...)
54 {
55 // exception during noexcept destructor is ignored
56 }
57 }
58
release()59 SessionHandle Session::release()
60 {
61 SessionHandle handle = 0;
62 std::swap(handle, m_handle);
63 return handle;
64 }
65
login(UserType user_type,const secure_string & pin)66 void Session::login(UserType user_type, const secure_string& pin)
67 {
68 module()->C_Login(m_handle, user_type, pin);
69 m_logged_in = true;
70 }
71
logoff()72 void Session::logoff()
73 {
74 module()->C_Logout(m_handle);
75 m_logged_in = false;
76 }
77
get_info() const78 SessionInfo Session::get_info() const
79 {
80 SessionInfo info;
81 module()->C_GetSessionInfo(m_handle, &info);
82 return info;
83 }
84
set_pin(const secure_string & old_pin,const secure_string & new_pin) const85 void Session::set_pin(const secure_string& old_pin, const secure_string& new_pin) const
86 {
87 module()->C_SetPIN(m_handle, old_pin, new_pin);
88 }
89
init_pin(const secure_string & new_pin)90 void Session::init_pin(const secure_string& new_pin)
91 {
92 module()->C_InitPIN(m_handle, new_pin);
93 }
94
95 }
96 }
97