65816-crypto/aes.h
Stephen Heumann e1ea84f11a Make AES-CMAC context slightly smaller.
Since AES-CMAC is based on AES-128, the state specific to AES-CMAC can overlap the latter parts of the AES context structure, which are used only by AES-192 or AES-256.
2024-06-26 21:43:49 -06:00

121 lines
4.4 KiB
C

/*
* Copyright (c) 2017,2024 Stephen Heumann
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
struct aes_context {
unsigned char data[16];
unsigned char reserved1[17];
unsigned char key[32];
unsigned char reserved2[16*13];
};
struct aes_cmac_context {
union {
struct aes_context ctx;
struct {
unsigned char padding[16+17+32+16*9];
unsigned char k1[16];
unsigned char k2[16];
};
};
};
/*
* The context structure must be in bank 0, preferably page-aligned.
* Note that a 256-byte (one page) context structure is sufficient for
* AES-128 and AES-192. The full length is needed only for AES-256.
*/
/*
* AES key expansion functions
* The appropriate one of these must be called before encrypting or decrypting.
* The key must be in the first 16/24/32 bytes of context->key before the call.
*/
void aes128_expandkey(struct aes_context *context);
void aes192_expandkey(struct aes_context *context);
void aes256_expandkey(struct aes_context *context);
/*
* AES encryption function
* This performs AES-128, AES-192, or AES-256 encryption, depending on the key.
* The unencrypted input and encrypted output are in context->data.
*/
void aes_encrypt(struct aes_context *context);
/*
* AES decryption functions
* aes_decrypt does AES-128, AES-192, or AES-256 decryption, based on the key.
* The others use a specific key size; a corresponding key must have been used.
* The encrypted input and unencrypted output are in context->data.
*/
void aes_decrypt(struct aes_context *context);
void aes128_decrypt(struct aes_context *context);
void aes192_decrypt(struct aes_context *context);
void aes256_decrypt(struct aes_context *context);
/*
* Encrypt data using AES-128, AES-192, or AES-256 in CBC mode.
* The key must have been specified via aes{128,192,256}_expandkey().
* The initialization vector (IV) must be in context->data.
* nblocks gives the number of 16-byte blocks to be processed.
*/
void aes_cbc_encrypt(struct aes_context *context,
const unsigned char *in,
unsigned char *out,
unsigned long nblocks);
/*
* Decrypt data using AES-128, AES-192, or AES-256 in CBC mode.
* The key must have been specified via aes{128,192,256}_expandkey().
* nblocks gives the number of 16-byte blocks to be processed.
*/
void aes_cbc_decrypt(struct aes_context *context,
const unsigned char *in,
unsigned char *out,
unsigned long nblocks,
const unsigned char *iv);
/*
* Process data using AES-128, AES-192, or AES-256 in CTR mode.
* This either encrypts or decrypts data, depending on whether
* in contains plaintext or ciphertext.
* The key must have been specified via aes{128,192,256}_expandkey().
* nblocks gives the number of 16-byte blocks to be processed.
* counter will be interpreted as a 128-bit big-endian integer,
* and incremented for each block processed.
*/
void aes_ctr_process(struct aes_context *context,
const unsigned char *in,
unsigned char *out,
unsigned long nblocks,
const unsigned char *counter);
/*
* Initialize a context for AES-CMAC computation with a specified key.
* This must be called before any calling aes_cmac_compute.
*/
void aes_cmac_init(struct aes_cmac_context *context,
const unsigned char key[16]);
/*
* Compute the AES-CMAC of a message as a single operation.
* The result will be in context->ctx.data.
* The context can be reused for multiple aes_cmac_compute operations.
*/
void aes_cmac_compute(struct aes_cmac_context *context,
const unsigned char *message,
unsigned long message_length);