|
Botan 3.13.0
Crypto and TLS for C&
|
#include <gcm_siv.h>
Public Member Functions | |
| bool | associated_data_requires_key () const final |
| The AD is buffered as-is; it is not processed until finish. | |
| bool | authenticated () const |
| void | clear () final |
| size_t | default_nonce_length () const override |
| void | finish (secure_vector< uint8_t > &final_block, size_t offset=0) |
| template<concepts::resizable_byte_buffer T> | |
| void | finish (T &final_block, size_t offset=0) |
| GCM_SIV_Encryption (std::unique_ptr< BlockCipher > cipher) | |
| bool | has_keying_material () const final |
| size_t | ideal_granularity () const final |
| Key_Length_Specification | key_spec () const final |
| virtual size_t | maximum_associated_data_inputs () const |
| size_t | maximum_keylength () const |
| size_t | minimum_final_size () const override |
| size_t | minimum_keylength () const |
| std::string | name () const final |
| size_t | output_length (size_t input_length) const override |
| size_t | process (std::span< uint8_t > msg) |
| size_t | process (uint8_t msg[], size_t msg_len) |
| std::string | provider () const final |
| bool | requires_entire_message () const final |
| void | reset () final |
| void | set_ad (std::span< const uint8_t > ad) |
| void | set_associated_data (const uint8_t ad[], size_t ad_len) |
| void | set_associated_data (std::span< const uint8_t > ad) |
| void | set_associated_data_n (size_t idx, std::span< const uint8_t > ad) final |
| template<typename Alloc> | |
| void | set_associated_data_vec (const std::vector< uint8_t, Alloc > &ad) |
| void | set_key (const OctetString &key) |
| void | set_key (const uint8_t key[], size_t length) |
| void | set_key (std::span< const uint8_t > key) |
| void | start () |
| void | start (const uint8_t nonce[], size_t nonce_len) |
| void | start (std::span< const uint8_t > nonce) |
| size_t | tag_size () const final |
| template<concepts::resizable_byte_buffer T> | |
| void | update (T &buffer, size_t offset=0) |
| size_t | update_granularity () const final |
| bool | valid_keylength (size_t length) const |
| bool | valid_nonce_length (size_t len) const final |
Static Public Member Functions | |
| static std::unique_ptr< AEAD_Mode > | create (std::string_view algo, Cipher_Dir direction, std::string_view provider="") |
| static std::unique_ptr< AEAD_Mode > | create_or_throw (std::string_view algo, Cipher_Dir direction, std::string_view provider="") |
| static std::vector< std::string > | providers (std::string_view algo_spec) |
Protected Member Functions | |
| void | assert_key_material_set () const |
| void | assert_key_material_set (bool predicate) const |
| std::array< uint8_t, BS > | compute_tag (std::span< const uint8_t > ptext) |
| Compute the expected tag for the (unpadded) plaintext. | |
| void | ctr_xor (std::span< const uint8_t, BS > tag, uint8_t buf[], size_t len) |
| XOR the buffer with the CTR keystream, starting from the tag-derived counter. | |
| bool | in_msg () const |
| secure_vector< uint8_t > & | msg_buf () |
Static Protected Attributes | |
| static constexpr size_t | BS = 16 |
| static constexpr uint64_t | MAX_INPUT_LEN = static_cast<uint64_t>(1) << 36 |
| RFC 8452 limits both the plaintext and the AD to 2**36 bytes. | |
|
inlineexplicit |
| cipher | the 128 bit block cipher to use |
Definition at line 98 of file gcm_siv.h.
References Botan::GCM_SIV_Mode::GCM_SIV_Mode().
|
inlineprotectedinherited |
Throw Key_Not_Set unless a key has been set on this object
Definition at line 180 of file sym_algo.h.
References assert_key_material_set(), and has_keying_material().
Referenced by assert_key_material_set(), Botan::Salsa20::cipher_bytes(), Botan::Lion::decrypt_n(), Botan::Lion::encrypt_n(), Botan::GHASH::final(), Botan::Polyval::final(), Botan::Salsa20::generate_keystream(), Botan::GHASH::nonce_hash(), Botan::GHASH::reset_associated_data(), Botan::ChaCha::seek(), Botan::CTR_BE::seek(), Botan::Salsa20::seek(), Botan::GHASH::set_associated_data(), Botan::OCB_Mode::set_associated_data_n(), Botan::Salsa20::set_iv_bytes(), Botan::GHASH::update(), Botan::Polyval::update(), Botan::GHASH::update_associated_data(), and Botan::Polyval::zero_pad().
|
inlineprotectedinherited |
Throw Key_Not_Set unless the predicate holds
| predicate | if false, a Key_Not_Set exception is thrown |
Definition at line 186 of file sym_algo.h.
|
inlinefinalvirtualinherited |
The AD is buffered as-is; it is not processed until finish.
Reimplemented from Botan::AEAD_Mode.
Definition at line 40 of file gcm_siv.h.
|
inlineinherited |
Return the length in bytes of the authentication tag this algorithm generates. If the mode is not authenticated, this will return 0.
Definition at line 272 of file cipher_mode.h.
References tag_size().
|
finalvirtualinherited |
Reset the internal state. This includes not just the key, but any partial message that may have been in process.
Implements Botan::SymmetricAlgorithm.
Definition at line 52 of file gcm_siv.cpp.
References reset(), and Botan::zap().
|
protectedinherited |
Compute the expected tag for the (unpadded) plaintext.
Definition at line 169 of file gcm_siv.cpp.
References Botan::store_le(), and Botan::xor_buf().
|
staticinherited |
Create an AEAD mode
| algo | the algorithm to create |
| direction | specify if this should be an encryption or decryption AEAD |
| provider | optional specification for provider to use |
Definition at line 63 of file aead.cpp.
References Botan::SCAN_Name::algo_name(), Botan::SCAN_Name::arg(), Botan::SCAN_Name::arg_as_integer(), Botan::SCAN_Name::arg_count(), BOTAN_UNUSED, create(), Botan::BlockCipher::create(), Botan::Encryption, Botan::parse_algorithm_name(), Botan::Cipher_Mode::provider(), and Botan::split_on().
Referenced by Botan::ChaCha20Poly1305_Mode::ChaCha20Poly1305_Mode(), create(), Botan::Cipher_Mode::create(), create_or_throw(), Botan::get_aead(), and Botan::TLS::Cipher_State::is_compatible_with().
|
staticinherited |
Create an AEAD mode, or throw
| algo | the algorithm to create |
| direction | specify if this should be an encryption or decryption AEAD |
| provider | optional specification for provider to use |
Definition at line 53 of file aead.cpp.
References create(), and Botan::Cipher_Mode::provider().
Referenced by Botan::TLS::Cipher_State::advance_with_server_hello(), Botan::TLS::Connection_Cipher_State::Connection_Cipher_State(), Botan::TLS::Session::decrypt(), and Botan::TLS::Session::encrypt().
|
protectedinherited |
XOR the buffer with the CTR keystream, starting from the tag-derived counter.
Definition at line 194 of file gcm_siv.cpp.
References BS, Botan::copy_mem(), Botan::load_le(), Botan::store_le(), and Botan::xor_buf().
|
inlineoverridevirtualinherited |
Return the default nonce length for this mode
Implements Botan::Cipher_Mode.
Reimplemented in Botan::Ascon_AEAD128_Mode, Botan::CCM_Mode, and Botan::TLS::TLS_CBC_HMAC_AEAD_Mode.
Definition at line 139 of file aead.h.
|
inlineinherited |
Complete procession of a message with a final input of buffer, which is treated the same as with update(). If you have the entire message in hand, calling finish() without ever calling update() is both efficient and convenient.
When using an AEAD_Mode, if the supplied authentication tag does not validate, this will throw an instance of Invalid_Authentication_Tag.
If this occurs, all plaintext previously output via calls to update must be destroyed and not used in any way that an attacker could observe the effects of. This could be anything from echoing the plaintext back (perhaps in an error message), or by making an external RPC whose destination or contents depend on the plaintext. The only thing you can do is buffer it, and in the event of an invalid tag, erase the previously decrypted content from memory.
One simple way to assure this could never happen is to never call update, and instead always marshal the entire message into a single buffer and call finish on it when decrypting.
| final_block | in/out parameter which must be at least minimum_final_size() bytes, and will be set to any final output |
| offset | an offset into final_block to begin processing |
Definition at line 185 of file cipher_mode.h.
References finish_msg().
Referenced by botan_cipher_update(), and Botan::TLS::write_record().
|
inlineinherited |
Complete procession of a message.
Note: Using this overload with anything but a Botan::secure_vector<> is copying the bytes in the in/out buffer.
| final_block | in/out parameter which must be at least minimum_final_size() bytes, and will be set to any final output |
| offset | an offset into final_block to begin processing |
Definition at line 198 of file cipher_mode.h.
References finish_msg().
|
finalvirtualinherited |
Test whether a key has been set on this object
Implements Botan::SymmetricAlgorithm.
Definition at line 92 of file gcm_siv.cpp.
|
finalvirtualinherited |
Return an ideal granularity. This will be a multiple of the result of update_granularity but may be larger. If so it indicates that better performance may be achieved by providing buffers that are at least that size (due to SIMD execution, etc).
Implements Botan::Cipher_Mode.
Definition at line 80 of file gcm_siv.cpp.
References BS, and Botan::BlockCipher::ParallelismMult.
|
inlineprotectedinherited |
|
finalvirtualinherited |
Return the key lengths supported by this algorithm
Implements Botan::SymmetricAlgorithm.
Definition at line 88 of file gcm_siv.cpp.
|
inlinevirtualinherited |
Returns the maximum supported number of associated data inputs which can be provided to set_associated_data_n
If returns 0, then no associated data is supported.
Reimplemented in Botan::SIV_Mode.
Definition at line 99 of file aead.h.
|
inlineinherited |
Return the largest acceptable key length
Definition at line 130 of file sym_algo.h.
References key_spec().
|
inlineoverridevirtual |
Return the smallest input accepted by finish()
Implements Botan::Cipher_Mode.
Definition at line 102 of file gcm_siv.h.
|
inlineinherited |
Return the smallest acceptable key length
Definition at line 136 of file sym_algo.h.
References key_spec().
|
inlineprotectedinherited |
|
finalvirtualinherited |
Return the name of this algorithm
Implements Botan::SymmetricAlgorithm.
Definition at line 68 of file gcm_siv.cpp.
References Botan::fmt().
Referenced by GCM_SIV_Mode().
|
overridevirtual |
Returns the size of the output if this transform is used to process a message with input_length bytes. In most cases the answer is precise. If it is not possible to precise (namely for CBC decryption) instead an upper bound is returned.
Implements Botan::Cipher_Mode.
Definition at line 227 of file gcm_siv.cpp.
References Botan::add_or_throw(), and Botan::GCM_SIV_Mode::tag_size().
|
inlineinherited |
Process message blocks
Input must be a multiple of update_granularity
Processes msg in place and returns bytes written. Normally this will be either msg_len (indicating the entire message was processed) or for certain AEAD modes zero (indicating that the mode requires the entire message be processed in one pass).
| msg | the message to be processed |
Definition at line 132 of file cipher_mode.h.
References process_msg().
Referenced by botan_cipher_update(), Botan::TLS::TLS_NULL_HMAC_AEAD_Decryption::finish_msg(), and update().
|
inlineinherited |
Process message blocks in place
| msg | the message to be processed |
| msg_len | length of msg in bytes |
Definition at line 140 of file cipher_mode.h.
References process_msg().
|
finalvirtualinherited |
Return the name of the provider implementing this object
Reimplemented from Botan::Cipher_Mode.
Definition at line 72 of file gcm_siv.cpp.
|
staticinherited |
List the providers available for a given cipher mode
| algo_spec | algorithm name |
Definition at line 174 of file cipher_mode.cpp.
References create(), Botan::Encryption, and providers().
Referenced by providers().
|
inlinefinalvirtualinherited |
Certain modes require the entire message be available before any processing can occur. For such modes, input will be consumed but not returned, until finish is called, which returns the entire message.
This function returns true if this mode has this style of operation.
Reimplemented from Botan::Cipher_Mode.
Definition at line 37 of file gcm_siv.h.
|
finalvirtualinherited |
Resets just the message specific state and allows encrypting again under the existing key
Implements Botan::Cipher_Mode.
Definition at line 59 of file gcm_siv.cpp.
References Botan::secure_scrub_memory().
Referenced by clear().
|
inlineinherited |
Set associated data that is not included in the ciphertext but that should be authenticated. Must be called after set_key() and before start().
| ad | the associated data |
Definition at line 132 of file aead.h.
References set_ad(), and set_associated_data().
Referenced by set_ad().
|
inlineinherited |
Set associated data that is not included in the ciphertext but that should be authenticated. Must be called after set_key() and before start().
| ad | the associated data |
| ad_len | length of ad in bytes |
Definition at line 69 of file aead.h.
References set_associated_data().
Referenced by set_associated_data().
|
inlineinherited |
Set associated data that is not included in the ciphertext but that should be authenticated. Must be called after set_key() and before start().
Unless reset by another call, the associated data is kept between messages. Thus, if the AD does not change, calling once (after set_key()) is the optimum.
| ad | the associated data |
Definition at line 59 of file aead.h.
References set_associated_data_n().
Referenced by set_ad(), set_associated_data_vec(), and Botan::TLS::write_record().
|
finalvirtualinherited |
Set associated data that is not included in the ciphertext but that should be authenticated. Must be called after set_key() and before start().
Unless reset by another call, the associated data is kept between messages. Thus, if the AD does not change, calling once (after set_key()) is the optimum.
Some AEADs (namely SIV) support multiple AD inputs. For all other modes only nominal AD input 0 is supported; all other values of idx will cause an exception.
Derived AEADs must implement this. For AEADs where maximum_associated_data_inputs() returns 1 (the default), the idx must simply be ignored.
| idx | which associated data to set |
| ad | the associated data |
Implements Botan::AEAD_Mode.
Definition at line 102 of file gcm_siv.cpp.
References BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, and MAX_INPUT_LEN.
|
inlineinherited |
Set associated data that is not included in the ciphertext but that should be authenticated. Must be called after set_key() and before start().
| ad | the associated data |
Definition at line 119 of file aead.h.
References set_associated_data(), and set_associated_data_vec().
Referenced by set_associated_data_vec().
|
inherited |
Set the symmetric key of this object.
| key | the SymmetricKey to be set. |
Definition at line 14 of file sym_algo.cpp.
References Botan::OctetString::begin(), Botan::OctetString::length(), and set_key().
Referenced by Botan::create_aes_row_generator(), Botan::Sodium::crypto_stream_salsa20(), Botan::Sodium::crypto_stream_salsa20_xor_ic(), Botan::Sodium::crypto_stream_xsalsa20(), Botan::Sodium::crypto_stream_xsalsa20_xor_ic(), Botan::FPE::fe1_decrypt(), Botan::FPE::fe1_encrypt(), Botan::Sphincs_Hash_Functions_Sha2::PRF_msg(), Botan::Sodium::randombytes_buf_deterministic(), Botan::TLS::TLS_NULL_HMAC_AEAD_Mode::reset(), and set_key().
|
inlineinherited |
Set the symmetric key of this object.
| key | the to be set as a byte array. |
| length | in bytes of key param |
Definition at line 162 of file sym_algo.h.
References set_key().
Referenced by set_key().
|
inherited |
Set the symmetric key of this object.
| key | the contiguous byte range to be set. |
Definition at line 22 of file sym_algo.cpp.
References name(), and valid_keylength().
|
inlineinherited |
Begin processing a message.
The exact semantics of this depend on the mode. For many modes, the call will fail since a nonce must be provided.
For certain modes such as CBC this will instead cause the last ciphertext block to be used as the nonce of the new message; doing this isn't a good idea, but some (mostly older) protocols do this.
Definition at line 117 of file cipher_mode.h.
References start_msg().
|
inlineinherited |
Begin processing a message with a fresh nonce.
| nonce | the per message nonce |
| nonce_len | length of nonce |
Definition at line 105 of file cipher_mode.h.
References start_msg().
|
inlineinherited |
Begin processing a message with a fresh nonce.
| nonce | the per message nonce |
Definition at line 98 of file cipher_mode.h.
References start_msg().
Referenced by botan_cipher_start(), and Botan::TLS::write_record().
|
inlinefinalvirtualinherited |
Return the authentication tag length of this mode
Reimplemented from Botan::Cipher_Mode.
Definition at line 35 of file gcm_siv.h.
Referenced by Botan::GCM_SIV_Decryption::minimum_final_size(), Botan::GCM_SIV_Decryption::output_length(), and Botan::GCM_SIV_Encryption::output_length().
|
inlineinherited |
Process some data. Input must be in size update_granularity() uint8_t blocks. The buffer is an in/out parameter and may be resized. In particular, some modes require that all input be consumed before any output is produced; with these modes, buffer will be returned empty.
The first offset bytes of buffer will be ignored (this allows in place processing of a buffer that contains an initial plaintext header).
| buffer | in/out parameter which will possibly be resized |
| offset | an offset into blocks to begin processing |
Definition at line 155 of file cipher_mode.h.
References process().
|
finalvirtualinherited |
The :cpp:class:Cipher_Mode interface requires message processing in multiples of the block size. This returns size of required blocks to update. If the mode implementation does not require buffering it will return 1.
Implements Botan::Cipher_Mode.
Definition at line 76 of file gcm_siv.cpp.
|
inlineinherited |
Check whether a given key length is valid for this algorithm.
| length | the key length to be checked. |
Definition at line 143 of file sym_algo.h.
References key_spec().
Referenced by set_key().
|
finalvirtualinherited |
Test if a nonce length is valid for this mode
Implements Botan::Cipher_Mode.
Definition at line 84 of file gcm_siv.cpp.
|
staticconstexprprotectedinherited |
Definition at line 55 of file gcm_siv.h.
Referenced by ctr_xor(), and ideal_granularity().
|
staticconstexprprotectedinherited |
RFC 8452 limits both the plaintext and the AD to 2**36 bytes.
Definition at line 58 of file gcm_siv.h.
Referenced by set_associated_data_n().