56#include "intrinsics.h"
63#define QSC_HBA_KMAC_EXTENSION
70#define QSC_HBA_HKDF_EXTENSION
72#if defined(QSC_HBA_KMAC_EXTENSION)
121QSC_CPLUSPLUS_ENABLED_START
159#define QSC_AES_BLOCK_SIZE 16U
167#define QSC_AES_IV_SIZE 16U
173#define QSC_AES128_KEY_SIZE 16U
179#define QSC_AES256_KEY_SIZE 32U
185#define QSC_GCM128_MAC_SIZE 16U
191#define QSC_GCM256_MAC_SIZE 16U
197#define QSC_GCM_MAXAAD_SIZE 65536U
203#define QSC_GCM_NONCE_SIZE 12U
211#define QSC_GCM_MAX_NONCE_SIZE 32U
217#define QSC_HBA256_MAC_SIZE 32U
223#define QSC_HBA_MAXAAD_SIZE 256U
229#define QSC_HBA_MAXINFO_SIZE 256U
237#if defined(QSC_HBA_KMAC_EXTENSION)
238# define QSC_HBA_KMAC_AUTH
270#if defined(QSC_SYSTEM_AESNI_ENABLED)
272# if defined(QSC_SYSTEM_HAS_AVX512)
273 __m512i roundkeysw[31U];
476#if defined(QSC_HBA_KMAC_EXTENSION)
836QSC_CPLUSPLUS_ENABLED_END
QSC_EXPORT_API void qsc_aes_gcm128_set_associated(qsc_aes_gcm128_state *ctx, const uint8_t *data, size_t datalen)
Supply associated additional data (AAD) to GCM-128.
Definition aes.c:2522
QSC_EXPORT_API void qsc_aes_gcm128_encrypt(qsc_aes_gcm128_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Encrypt plaintext and append an authentication tag using GCM-AES-128.
Definition aes.c:2401
QSC_EXPORT_API bool qsc_aes_gcm128_decrypt(qsc_aes_gcm128_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Decrypt ciphertext and verify the authentication tag using GCM-AES-128.
Definition aes.c:2318
QSC_EXPORT_API bool qsc_aes_hba256_transform(qsc_aes_hba256_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Transform data using the HBA-256 authenticated encryption mode.
Definition aes.c:2106
QSC_EXPORT_API bool qsc_aes_gcm256_transform(qsc_aes_gcm256_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Transform an array of bytes.
Definition aes.c:2825
QSC_EXPORT_API void qsc_aes_initialize(qsc_aes_state *ctx, const qsc_aes_keyparams *keyparams, bool encryption, qsc_aes_cipher_type ctype)
Initialize the AES ctx with the given key parameters.
Definition aes.c:1590
QSC_EXPORT_API void qsc_aes_cbc_encrypt(qsc_aes_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Encrypt plaintext using AES in Cipher Block Chaining (CBC) mode.
Definition aes.c:1657
QSC_EXPORT_API void qsc_aes_hba256_dispose(qsc_aes_hba256_state *ctx)
Dispose of an HBA-256 ctx.
Definition aes.c:2024
QSC_EXPORT_API void qsc_aes_hba256_set_associated(qsc_aes_hba256_state *ctx, const uint8_t *data, size_t datalen)
Set the associated data (AAD) for HBA-256 authenticated encryption.
Definition aes.c:2088
QSC_EXPORT_API void qsc_aes_gcm256_dispose(qsc_aes_gcm256_state *ctx)
Dispose of an GCM-256 ctx.
Definition aes.c:2665
QSC_EXPORT_API void qsc_aes_gcm256_encrypt(qsc_aes_gcm256_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Encrypt data using the GCM-AES-256 authenticated encryption mode.
Definition aes.c:2681
QSC_EXPORT_API void qsc_aes_gcm128_initialize(qsc_aes_gcm128_state *ctx, const qsc_aes_keyparams *keyparams, bool encryption)
Initialize the GCM-128 context for authenticated encryption or decryption.
Definition aes.c:2454
QSC_EXPORT_API void qsc_pkcs7_add_padding(uint8_t *input, size_t length)
Add PKCS#7 padding to a plaintext block.
Definition aes.c:1867
QSC_EXPORT_API void qsc_aes_ctrle_transform(qsc_aes_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Transform data using AES in Counter (CTR) mode with Little Endian counter incrementation.
Definition aes.c:1781
#define QSC_HBA256_MAC_SIZE
Size in bytes of the MAC code for HBA-256.
Definition aes.h:217
QSC_EXPORT_API bool qsc_aes_gcm256_decrypt(qsc_aes_gcm256_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Decrypt ciphertext and verify the authentication tag using GCM-AES-256.
Definition aes.c:2600
QSC_EXPORT_API void qsc_aes_gcm256_initialize(qsc_aes_gcm256_state *ctx, const qsc_aes_keyparams *keyparams, bool encryption)
Initialize the GCM-256 ctx for authenticated encryption or decryption.
Definition aes.c:2732
QSC_EXPORT_API void qsc_aes_gcm256_set_associated(qsc_aes_gcm256_state *ctx, const uint8_t *data, size_t datalen)
Set the associated data (AAD) for GCM-256 authenticated encryption.
Definition aes.c:2799
QSC_EXPORT_API void qsc_aes_ecb_decrypt_block(const qsc_aes_state *ctx, uint8_t *output, const uint8_t *input)
Decrypt a single 16-byte block using AES in Electronic CodeBook (ECB) mode.
Definition aes.c:1828
QSC_EXPORT_API void qsc_aes_hba256_initialize(qsc_aes_hba256_state *ctx, const qsc_aes_keyparams *keyparams, bool encrypt)
Initialize the HBA-256 ctx for authenticated encryption or decryption.
Definition aes.c:2046
QSC_EXPORT_API void qsc_aes_cbc_decrypt_block(qsc_aes_state *ctx, uint8_t *output, const uint8_t *input)
Decrypt a single 16-byte block using AES in CBC mode.
Definition aes.c:1692
qsc_aes_cipher_type
Pre-defined cipher key sizes for AES.
Definition aes.h:130
@ qsc_aes_cipher_128
Definition aes.h:131
@ qsc_aes_cipher_256
Definition aes.h:132
QSC_EXPORT_API bool qsc_aes_gcm128_transform(qsc_aes_gcm128_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Unified GCM-128 encrypt-or-decrypt transform.
Definition aes.c:2550
QSC_EXPORT_API size_t qsc_pkcs7_padding_length(const uint8_t *input)
Determine the length of PKCS#7 padding in a decrypted block.
Definition aes.c:1889
QSC_EXPORT_API void qsc_aes_gcm128_dispose(qsc_aes_gcm128_state *ctx)
Dispose of a GCM-128 context.
Definition aes.c:2385
QSC_EXPORT_API void qsc_aes_dispose(qsc_aes_state *ctx)
Erase and dispose of the AES ctx.
Definition aes.c:1852
#define QSC_AES_BLOCK_SIZE
Internal AES block size in bytes.
Definition aes.h:159
QSC_EXPORT_API void qsc_aes_ecb_encrypt_block(const qsc_aes_state *ctx, uint8_t *output, const uint8_t *input)
Encrypt a single 16-byte block using AES in Electronic CodeBook (ECB) mode.
Definition aes.c:1840
#define QSC_HBA_MAXINFO_SIZE
Maximum allowed size (in bytes) for key information tweaks in HBA.
Definition aes.h:229
QSC_EXPORT_API void qsc_aes_ctrbe_transform(qsc_aes_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Transform data using AES in Counter (CTR) mode with Big Endian counter incrementation.
Definition aes.c:1734
QSC_EXPORT_API void qsc_aes_cbc_encrypt_block(qsc_aes_state *ctx, uint8_t *output, const uint8_t *input)
Encrypt a single 16-byte block using AES in CBC mode.
Definition aes.c:1714
QSC_EXPORT_API void qsc_aes_cbc_decrypt(qsc_aes_state *ctx, uint8_t *output, size_t *outputlen, const uint8_t *input, size_t length)
Decrypt ciphertext using AES in Cipher Block Chaining (CBC) mode.
Definition aes.c:1628
qsc_aes_cipher_mode
Pre-defined AES cipher mode implementations.
Definition aes.h:143
@ qsc_aes_mode_ecb
Definition aes.h:146
@ qsc_aes_mode_cbc
Definition aes.h:144
@ qsc_aes_mode_ctr
Definition aes.h:145
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.
#define QSC_EXPORT_API
API export macro for Microsoft compilers when importing from a DLL.
Definition qsccommon.h:645
The SHA2 family of hash functions.
SHA3 family of hash functions.
State structure for AES-based Galois Counter Mode (GCM-128).
Definition aes.h:564
uint8_t J0[QSC_AES_BLOCK_SIZE]
Definition aes.h:568
uint64_t ctlen
Definition aes.h:571
qsc_aes_state cstate
Definition aes.h:565
uint8_t H[QSC_AES_BLOCK_SIZE]
Definition aes.h:567
uint64_t aadlen
Definition aes.h:570
uint8_t C[QSC_AES_BLOCK_SIZE]
Definition aes.h:566
uint8_t S[QSC_AES_BLOCK_SIZE]
Definition aes.h:569
bool encrypt
Definition aes.h:572
State structure for AES-based Galois Counter Mode (GCM-256).
Definition aes.h:729
uint8_t J0[QSC_AES_BLOCK_SIZE]
Definition aes.h:733
uint64_t ctlen
Definition aes.h:736
qsc_aes_state cstate
Definition aes.h:730
uint8_t H[QSC_AES_BLOCK_SIZE]
Definition aes.h:732
uint64_t aadlen
Definition aes.h:735
uint8_t C[QSC_AES_BLOCK_SIZE]
Definition aes.h:731
uint8_t S[QSC_AES_BLOCK_SIZE]
Definition aes.h:734
bool encrypt
Definition aes.h:737
State structure for AES-based Hash Based Authentication (HBA-256).
Definition aes.h:475
size_t custlen
Definition aes.h:485
uint64_t counter
Definition aes.h:482
qsc_aes_state cstate
Definition aes.h:481
qsc_keccak_state kstate
Definition aes.h:477
uint8_t cust[QSC_HBA_MAXINFO_SIZE]
Definition aes.h:484
uint8_t mkey[QSC_HBA256_MAC_SIZE]
Definition aes.h:483
bool encrypt
Definition aes.h:486
Structure for AES key parameters.
Definition aes.h:251
uint8_t * nonce
Definition aes.h:254
const uint8_t * key
Definition aes.h:252
size_t noncelen
Definition aes.h:255
size_t infolen
Definition aes.h:257
size_t keylen
Definition aes.h:253
const uint8_t * info
Definition aes.h:256
AES cipher ctx structure.
Definition aes.h:269
uint8_t * nonce
Definition aes.h:280
size_t roundkeylen
Definition aes.h:278
size_t rounds
Definition aes.h:279
uint32_t roundkeys[124U]
Definition aes.h:276
The HMAC(SHA2-256) state array.
Definition sha2.h:410
The Keccak state array; state array must be initialized by the caller.
Definition sha3.h:256