Botan 2.19.5 Crypto and TLS for C&

Public Member Functions | List of all members
Botan::TLS::Session_Manager_SQLite Class Referencefinal

`#include <tls_session_manager_sqlite.h>`

Inheritance diagram for Botan::TLS::Session_Manager_SQLite:

## Public Member Functions
bool | load_from_server_info (const Server_Information &info, Session &session) override
bool | load_from_session_id (const std::vector< uint8_t > &session_id, Session &session) override
size_t | remove_all () override
void | remove_entry (const std::vector< uint8_t > &session_id) override
void | save (const Session &session_data) override
std::chrono::seconds | session_lifetime () const override
| Session_Manager_SQLite (const std::string &passphrase, RandomNumberGenerator &rng, const std::string &db_filename, size_t max_sessions=1000, std::chrono::seconds session_lifetime=std::chrono::seconds(7200))

## Detailed Description

An implementation of Session_Manager that saves values in a SQLite3 database file, with the session data encrypted using a passphrase.

Warning
  For clients, the hostnames associated with the saved sessions are stored in the database in plaintext. This may be a serious privacy risk in some situations.

Definition at line 27 of file tls_session_manager_sqlite.h.

## Constructor & Destructor Documentation

## ◆ Session_Manager_SQLite()

Botan::TLS::Session_Manager_SQLite::Session_Manager_SQLite | ( | const std::string & | passphrase,
|  | RandomNumberGenerator & | rng,
|  | const std::string & | db_filename,
|  | size_t | max_sessions = `1000`,
|  | std::chrono::seconds | session_lifetime = `std::chrono::seconds(7200)`
| ) |  |

Parameters

  passphrase | used to encrypt the session data
  rng | a random number generator
  db_filename | filename of the SQLite database file. The table names tls_sessions and tls_sessions_metadata will be used
  max_sessions | a hint on the maximum number of sessions to keep in memory at any one time. (If zero, don't cap)
  session_lifetime | sessions are expired after this many seconds have elapsed from initial handshake.

Definition at line 15 of file tls_session_manager_sqlite.cpp.

19 :
20 Session_Manager_SQL(std::make_shared<Sqlite3_Database>(db_filename),
21 passphrase,
22 rng,
23 max_sessions,
24 session_lifetime)
25 {}
Botan::TLS::Session_Manager_SQL::Session_Manager_SQL
Session_Manager_SQL(std::shared_ptr< SQL_Database > db, const std::string &passphrase, RandomNumberGenerator &rng, size_t max_sessions=1000, std::chrono::seconds session_lifetime=std::chrono::seconds(7200))
Definition: tls_session_manager_sql.cpp:20
Botan::TLS::Session_Manager_SQL::session_lifetime
std::chrono::seconds session_lifetime() const override
Definition: tls_session_manager_sql.h:64

## Member Function Documentation

## ◆ load_from_server_info()

bool Botan::TLS::Session_Manager_SQL::load_from_server_info | ( | const Server_Information & | info,
|  | Session & | session
| ) |  |
| override virtual inherited

Try to load a saved session (using info about server)

Parameters

  info | the information about the server
  session | will be set to the saved session data (if found), or not modified if not found

Returns
  true if session was modified

Implements Botan::TLS::Session_Manager.

Definition at line 130 of file tls_session_manager_sql.cpp.

132 {
133 auto stmt = m_db->new_statement("select session from tls_sessions"
134 " where hostname = ?1 and hostport = ?2"
135 " order by session_start desc");
136
137 stmt->bind(1, server.hostname());
138 stmt->bind(2, server.port());
139
140 while(stmt->step())
141 {
142 std::pair<const uint8_t*, size_t> blob = stmt->get_blob(0);
143
144 try
145 {
146 session = Session::decrypt(blob.first, blob.second, m_session_key);
147 return true;
148 }
149 catch(...)
150 {
151 }
152 }
153
154 return false;
155 }
Botan::TLS::Session::decrypt
static Session decrypt(const uint8_t ctext[], size_t ctext_size, const SymmetricKey &key)
Definition: tls_session.cpp:250

References Botan::TLS::Session::decrypt(), Botan::TLS::Server_Information::hostname(), and Botan::TLS::Server_Information::port().

## ◆ load_from_session_id()

bool Botan::TLS::Session_Manager_SQL::load_from_session_id | ( | const std::vector< uint8_t > & | session_id,
|  | Session & | session
| ) |  |
| override virtual inherited

Try to load a saved session (using session ID)

Parameters

  session_id | the session identifier we are trying to resume
  session | will be set to the saved session data (if found), or not modified if not found

Returns
  true if session was modified

Implements Botan::TLS::Session_Manager.

Definition at line 106 of file tls_session_manager_sql.cpp.

108 {
109 auto stmt = m_db->new_statement("select session from tls_sessions where session_id = ?1");
110
111 stmt->bind(1, hex_encode(session_id));
112
113 while(stmt->step())
114 {
115 std::pair<const uint8_t*, size_t> blob = stmt->get_blob(0);
116
117 try
118 {
119 session = Session::decrypt(blob.first, blob.second, m_session_key);
120 return true;
121 }
122 catch(...)
123 {
124 }
125 }
126
127 return false;
128 }
Botan::hex_encode
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition: hex.cpp:31

References Botan::TLS::Session::decrypt(), and Botan::hex_encode().

## ◆ remove_all()

size_t Botan::TLS::Session_Manager_SQL::remove_all | ( |  | ) |
| override virtual inherited

Remove all sessions from the cache, return number of sessions deleted

Implements Botan::TLS::Session_Manager.

Definition at line 166 of file tls_session_manager_sql.cpp.

167 {
168 auto stmt = m_db->new_statement("delete from tls_sessions");
169 return stmt->spin();
170 }

## ◆ remove_entry()

void Botan::TLS::Session_Manager_SQL::remove_entry | ( | const std::vector< uint8_t > & | session_id | ) |
| override virtual inherited

Remove this session id from the cache, if it exists

Implements Botan::TLS::Session_Manager.

Definition at line 157 of file tls_session_manager_sql.cpp.

158 {
159 auto stmt = m_db->new_statement("delete from tls_sessions where session_id = ?1");
160
161 stmt->bind(1, hex_encode(session_id));
162
163 stmt->spin();
164 }

References Botan::hex_encode().

## ◆ save()

void Botan::TLS::Session_Manager_SQL::save | ( | const Session & | session | ) |
| override virtual inherited

Save a session on a best effort basis; the manager may not in fact be able to save the session for whatever reason; this is not an error. Caller cannot assume that calling save followed immediately by load_from_* will result in a successful lookup.

Parameters

  session | to save

Implements Botan::TLS::Session_Manager.

Definition at line 172 of file tls_session_manager_sql.cpp.

173 {
174 if(session.server_info().hostname().empty())
175 return;
176
177 auto stmt = m_db->new_statement("insert or replace into tls_sessions"
178 " values(?1, ?2, ?3, ?4, ?5)");
179
180 stmt->bind(1, hex_encode(session.session_id()));
181 stmt->bind(2, session.start_time());
182 stmt->bind(3, session.server_info().hostname());
183 stmt->bind(4, session.server_info().port());
184 stmt->bind(5, session.encrypt(m_session_key, m_rng));
185
186 stmt->spin();
187
188 prune_session_cache();
189 }

References Botan::TLS::Session::encrypt(), Botan::hex_encode(), Botan::TLS::Server_Information::hostname(), Botan::TLS::Server_Information::port(), Botan::TLS::Session::server_info(), Botan::TLS::Session::session_id(), and Botan::TLS::Session::start_time().

## ◆ session_lifetime()

std::chrono::seconds Botan::TLS::Session_Manager_SQL::session_lifetime | ( |  | ) | const
| inline override virtual inherited

Return the allowed lifetime of a session; beyond this time, sessions are not resumed. Returns 0 if unknown/no explicit expiration policy.

Implements Botan::TLS::Session_Manager.

Definition at line 64 of file tls_session_manager_sql.h.

65 { return m_session_lifetime; }

The documentation for this class was generated from the following files:

- src/lib/tls/sessions_sqlite3/tls_session_manager_sqlite.h
- src/lib/tls/sessions_sqlite3/tls_session_manager_sqlite.cpp