TSDuck v3.40-4034
MPEG Transport Stream Toolkit
|
Base class for all block ciphers. More...
#include <tsBlockCipher.h>
Public Member Functions | |
virtual | ~BlockCipher () |
Virtual destructor. | |
size_t | blockSize () const |
Size in bytes of the block used by the algorithm. | |
int | cipherId () const |
Get the "cipher id" value, as previously stored by the application. | |
const ByteBlock & | currentIV () const |
Get the current initialization vector. | |
const ByteBlock & | currentKey () const |
Get the current key. | |
bool | decrypt (const void *cipher, size_t cipher_length, void *plain, size_t plain_maxsize, size_t *plain_length=nullptr) |
Decrypt data. | |
size_t | decryptionCount () const |
Get the number of times the current key was used for decryption. | |
size_t | decryptionMax () const |
Get the maximum number of times a key should be used for decryption. | |
bool | encrypt (const void *plain, size_t plain_length, void *cipher, size_t cipher_maxsize, size_t *cipher_length=nullptr) |
Encrypt data. | |
size_t | encryptionCount () const |
Get the number of times the current key was used for encryption. | |
size_t | encryptionMax () const |
Get the maximum number of times a key should be used for encryption. | |
bool | hasChainingMode () const |
Check if this object is a base encryption algorithm (one block) or includes a chaining mode. | |
bool | hasKey () const |
Check if a current key is present and valid. | |
virtual bool | isValidIVSize (size_t size) const |
Check if a size in bytes is a valid initialization vector size. | |
virtual bool | isValidKeySize (size_t size) const |
Check if a size in bytes is a valid key size. | |
size_t | maxIVSize () const |
Get the maximum initialization vector sizes in bytes. | |
size_t | maxKeySize () const |
Maximum key sizes in bytes. | |
size_t | minIVSize () const |
Get the minimum initialization vector sizes in bytes. | |
size_t | minKeySize () const |
Minimum key sizes in bytes. | |
size_t | minMessageSize () const |
Get the minimum message size. | |
UString | name () const |
Algorithm name (informational only). | |
bool | residueAllowed () const |
Check if the chaining mode can process residue after the last multiple of the block size. | |
void | setAlertHandler (BlockCipherAlertInterface *handler) |
Set the handler to be notified on alert. | |
void | setCipherId (int id) |
Set some arbitrary "cipher id" value. | |
void | setDecryptionMax (size_t count) |
Set the maximum number of times a key should be used for decryption. | |
void | setEncryptionMax (size_t count) |
Set the maximum number of times a key should be used for encryption. | |
bool | setIV (const ByteBlock &iv) |
Set a new initialization vector without changing the key, or before setting the key. | |
bool | setIV (const void *iv, size_t iv_length) |
Set a new initialization vector without changing the key, or before setting the key. | |
bool | setKey (const ByteBlock &key) |
Schedule a new key. | |
bool | setKey (const ByteBlock &key, const ByteBlock &iv) |
Schedule a new key and initialization vector. | |
bool | setKey (const void *key, size_t key_length, const void *iv=nullptr, size_t iv_length=0) |
Schedule a new key and optional initialization vector. | |
Static Public Attributes | |
static constexpr size_t | UNLIMITED = std::numeric_limits<size_t>::max() |
A constant meaning "may use a key an unlimited number of times". | |
Protected Member Functions | |
BlockCipher (const BlockCipherProperties &properties) | |
Constructor for subclasses. | |
void | canProcessInPlace (bool can_do) |
Inform the superclass that the subclass can encrypt and decrypt in place (identical in/out buffers). | |
virtual bool | decryptImpl (const void *cipher, size_t cipher_length, void *plain, size_t plain_maxsize, size_t *plain_length) |
Decrypt one block of data (implementation of algorithm-specific part). | |
virtual bool | encryptImpl (const void *plain, size_t plain_length, void *cipher, size_t cipher_maxsize, size_t *cipher_length) |
Encrypt one block of data (implementation of algorithm-specific part). | |
virtual const EVP_CIPHER * | getAlgorithm () const |
Get the EVP for the cipher algorithm, when the subclass uses OpenSSL. | |
virtual void | getAlgorithm (::BCRYPT_ALG_HANDLE &algo, size_t &length, bool &ignore_iv) const |
Get the algorithm handle and subobject size, when the subclass uses Microsoft BCrypt library. | |
virtual bool | setKeyImpl () |
Schedule a new key and optional initialization vector (implementation of algorithm-specific part). | |
Protected Attributes | |
const BlockCipherProperties & | properties |
Properties for this block cipher object instance. | |
ByteBlock | work {} |
Temporary working buffer. | |
Base class for all block ciphers.
A block cipher may be a base encryption algorithm (one block) or includes a chaining mode.
|
protected |
Constructor for subclasses.
[in] | properties | Constant reference to a block of properties of this block cipher. The reference is kept all along the life of the object instance. The referenced object is typically static. |
UString ts::BlockCipher::name | ( | ) | const |
Algorithm name (informational only).
|
inline |
Size in bytes of the block used by the algorithm.
|
inline |
Minimum key sizes in bytes.
|
inline |
Maximum key sizes in bytes.
|
virtual |
Check if a size in bytes is a valid key size.
[in] | size | Suggested key size in bytes. |
|
virtual |
Check if a size in bytes is a valid initialization vector size.
[in] | size | Suggested IV size in bytes. |
|
inline |
Check if this object is a base encryption algorithm (one block) or includes a chaining mode.
|
inline |
Get the minimum initialization vector sizes in bytes.
|
inline |
Get the maximum initialization vector sizes in bytes.
|
inline |
Get the minimum message size.
Shorter data cannot be ciphered in this mode.
|
inline |
Check if the chaining mode can process residue after the last multiple of the block size.
bool ts::BlockCipher::setKey | ( | const void * | key, |
size_t | key_length, | ||
const void * | iv = nullptr , |
||
size_t | iv_length = 0 |
||
) |
Schedule a new key and optional initialization vector.
[in] | key | Address of key value. |
[in] | key_length | Key length in bytes. |
[in] | iv | Address of IV value (for chaining mode only). |
[in] | iv_length | IV length in bytes (for chaining mode only). |
|
inline |
Schedule a new key.
[in] | key | Key value. |
Schedule a new key and initialization vector.
[in] | key | Key value. |
[in] | iv | IV value (for chaining mode only). |
bool ts::BlockCipher::setIV | ( | const void * | iv, |
size_t | iv_length | ||
) |
Set a new initialization vector without changing the key, or before setting the key.
Note that if you need to set the key and IV, it is usually much more efficient to do it in one call instead of two (and not only because of te two calls).
[in] | iv | Address of IV value (for chaining mode only). |
[in] | iv_length | IV length in bytes (for chaining mode only). |
|
inline |
Set a new initialization vector without changing the key, or before setting the key.
Note that if you need to set the key and IV, it is usually much more efficient to do it in one call instead of two (and not only because of te two calls).
[in] | iv | IV value (for chaining mode only). |
|
inline |
Check if a current key is present and valid.
|
inline |
Get the current key.
|
inline |
Get the current initialization vector.
bool ts::BlockCipher::encrypt | ( | const void * | plain, |
size_t | plain_length, | ||
void * | cipher, | ||
size_t | cipher_maxsize, | ||
size_t * | cipher_length = nullptr |
||
) |
Encrypt data.
For pure block ciphers such as AES or DES, the plain text and cipher text must have the block size of the algorithm. For cipher chainings, the acceptable message sizes depend on the chaining mode.
Plain and cipher buffers may be identical (start at the same location). If they don't start at the same address, they may not overlap.
[in] | plain | Address of plain text. |
[in] | plain_length | Plain text length in bytes. |
[out] | cipher | Address of buffer for cipher text. |
[in] | cipher_maxsize | Size of cipher buffer. |
[out] | cipher_length | Returned actual size of cipher text. Ignored if zero. |
bool ts::BlockCipher::decrypt | ( | const void * | cipher, |
size_t | cipher_length, | ||
void * | plain, | ||
size_t | plain_maxsize, | ||
size_t * | plain_length = nullptr |
||
) |
Decrypt data.
For pure block ciphers such as AES or DES, the plain text and cipher text must have the block size of the algorithm. For cipher chainings, the acceptable message sizes depend on the chaining mode.
Plain and cipher buffers may be identical (start at the same location). If they don't start at the same address, they may not overlap.
[in] | cipher | Address of cipher text. |
[in] | cipher_length | Cipher text length in bytes. |
[out] | plain | Address of buffer for plain text. |
[in] | plain_maxsize | Size of plain buffer. |
[out] | plain_length | Returned actual size of plain text. Ignored if zero. |
|
inline |
Get the number of times the current key was used for encryption.
|
inline |
Get the number of times the current key was used for decryption.
|
inline |
Set the maximum number of times a key should be used for encryption.
The default initial value is UNLIMITED.
[in] | count | The maximum number of times a key should be used for encryption. |
|
inline |
Set the maximum number of times a key should be used for decryption.
The default initial value is UNLIMITED.
[in] | count | The maximum number of times a key should be used for decryption. |
|
inline |
Get the maximum number of times a key should be used for encryption.
|
inline |
Get the maximum number of times a key should be used for decryption.
|
inline |
Set the handler to be notified on alert.
Only one handler can be set at a time.
[in] | handler | Handler to set. Use a null pointer to remove the handler. |
|
inline |
Set some arbitrary "cipher id" value.
This value is chosen and set by the application and can be retrieved later. The cipher id is not interpreted by the block cipher engine, it is only stored for the application. The initial value of a cipher id is zero.
[in] | id | Application-defined cipher id to assign. |
|
inline |
Get the "cipher id" value, as previously stored by the application.
|
protectedvirtual |
Schedule a new key and optional initialization vector (implementation of algorithm-specific part).
Must be implemented by the subclass if it does not use the system-provided cryptographic library.
Reimplemented in ts::DVBCSA2.
|
protectedvirtual |
Encrypt one block of data (implementation of algorithm-specific part).
Must be implemented by the subclass if it does not use the system-provided cryptographic library.
[in] | plain | Address of plain text. |
[in] | plain_length | Plain text length in bytes. |
[out] | cipher | Address of buffer for cipher text. |
[in] | cipher_maxsize | Size of cipher buffer. |
[out] | cipher_length | Returned actual size of cipher text. Ignored if zero. |
Reimplemented in ts::DVBCSA2.
|
protectedvirtual |
Decrypt one block of data (implementation of algorithm-specific part).
Must be implemented by the subclass if it does not use the system-provided cryptographic library.
[in] | cipher | Address of cipher text. |
[in] | cipher_length | Cipher text length in bytes. |
[out] | plain | Address of buffer for plain text. |
[in] | plain_maxsize | Size of plain buffer. |
[out] | plain_length | Returned actual size of plain text. Ignored if zero. |
Reimplemented in ts::DVBCSA2.
|
inlineprotected |
Inform the superclass that the subclass can encrypt and decrypt in place (identical in/out buffers).
Typically called by a subclass in constructor.
[in] | can_do | If true, encrypt and decrypt in place is possible. |
|
protectedvirtual |
Get the algorithm handle and subobject size, when the subclass uses Microsoft BCrypt library.
[out] | algo | Handle to hash algorithm. |
[out] | length | Length in bytes of the subobject to allocate. |
[out] | ignore_iv | The IV shall not be passed to BCrypt. |
Reimplemented in ts::AES128, ts::AES256, ts::DES, and ts::TDES.
|
protectedvirtual |
Get the EVP for the cipher algorithm, when the subclass uses OpenSSL.
|
protected |
Properties for this block cipher object instance.
Accessible to subclasses, but constant.