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