Botan 3.6.1
Crypto and TLS for C&
|
#include <psk_db.h>
Public Member Functions | |
Encrypted_PSK_Database (const secure_vector< uint8_t > &master_key) | |
secure_vector< uint8_t > | get (std::string_view name) const override |
std::string | get_str (std::string_view name) const |
bool | is_encrypted () const override |
std::set< std::string > | list_names () const override |
void | remove (std::string_view name) override |
void | set (std::string_view name, const uint8_t psk[], size_t psk_len) override |
void | set_str (std::string_view name, std::string_view psk) |
void | set_vec (std::string_view name, std::span< const uint8_t > psk) |
~Encrypted_PSK_Database () override | |
Protected Member Functions | |
virtual void | kv_del (std::string_view index)=0 |
virtual std::string | kv_get (std::string_view index) const =0 |
virtual std::set< std::string > | kv_get_all () const =0 |
virtual void | kv_set (std::string_view index, std::string_view value)=0 |
A mixin for an encrypted PSK database.
Both names and values are encrypted using NIST key wrapping (see NIST SP800-38F) with AES-256. First the master key is used with HMAC(SHA-256) to derive two 256-bit keys, one for encrypting all names and the other to key an instance of HMAC(SHA-256). Values are each encrypted under an individual key created by hashing the encrypted name with HMAC. This associates the encrypted key with the name, and prevents an attacker with write access to the data store from taking an encrypted key associated with one entity and copying it to another entity.
Names and PSKs are both padded to the next multiple of 8 bytes, providing some obfuscation of the length.
Subclasses must implement the virtual calls to handle storing and getting raw (base64 encoded) values.
Botan::Encrypted_PSK_Database::Encrypted_PSK_Database | ( | const secure_vector< uint8_t > & | master_key | ) |
Initializes or opens a PSK database. The master_key
is used to secure the contents. It may be of any length. If encrypting PSKs under a passphrase, use a suitable key derivation scheme (such as Argon2id) to derive the secret key. If the master key is lost, all PSKs stored are unrecoverable.
One artifact of the names being encrypted is that is is possible to use multiple different master keys with the same underlying storage. Each master key will be responsible for a subset of the keys. An attacker who knows one of the keys will be able to tell there are other values encrypted under another key, but will not be able to tell how many other master keys are in use.
master_key | specifies the master key used to encrypt all keys and value. It can be of any length, but should be at least 256 bits. |
Subkeys for the cryptographic algorithms used are derived from this master key. No key stretching is performed; if encrypting a PSK database using a password, it is recommended to use Argon2id to derive the database master key.
Definition at line 27 of file psk_db.cpp.
References Botan::BlockCipher::create_or_throw(), and Botan::MessageAuthenticationCode::create_or_throw().
|
overridedefault |
|
overridevirtual |
name
or otherwise throw an exception. Implements Botan::PSK_Database.
Definition at line 63 of file psk_db.cpp.
References Botan::base64_decode(), Botan::base64_encode(), Botan::cast_char_ptr_to_uint8(), kv_get(), name, Botan::nist_key_unwrap_padded(), and Botan::nist_key_wrap_padded().
|
inherited |
Get a PSK in the form of a string (eg if the PSK is a password)
Definition at line 18 of file psk_db.cpp.
References Botan::cast_uint8_ptr_to_char(), and Botan::PSK_Database::get().
|
inlineoverridevirtual |
Implements Botan::PSK_Database.
Definition at line 128 of file psk_db.h.
|
protectedpure virtual |
Remove an index
Referenced by remove().
|
protectedpure virtual |
|
protectedpure virtual |
Return all indexes in the table (ie values for which kv_get
will return a non-empty string)
Referenced by list_names().
|
protectedpure virtual |
Save a encrypted (name/value) pair to the database. Both will be base64 encoded strings.
Referenced by set().
|
overridevirtual |
Implements Botan::PSK_Database.
Definition at line 38 of file psk_db.cpp.
References Botan::base64_decode(), Botan::cast_uint8_ptr_to_char(), kv_get_all(), and Botan::nist_key_unwrap_padded().
|
overridevirtual |
Remove the PSK with the given name
from the database
Implements Botan::PSK_Database.
Definition at line 56 of file psk_db.cpp.
References Botan::base64_encode(), Botan::cast_char_ptr_to_uint8(), kv_del(), name, and Botan::nist_key_wrap_padded().
|
overridevirtual |
Set a value that can later be accessed with get(). If name already exists in the database, the old value will be overwritten.
Implements Botan::PSK_Database.
Definition at line 81 of file psk_db.cpp.
References Botan::base64_encode(), Botan::cast_char_ptr_to_uint8(), kv_set(), name, and Botan::nist_key_wrap_padded().
|
inherited |
Like set() but accepts the PSK as a string (eg for a password).
Definition at line 23 of file psk_db.cpp.
References Botan::cast_char_ptr_to_uint8(), and Botan::PSK_Database::set().
|
inlineinherited |