mirror of
https://github.com/sheumann/65816-crypto.git
synced 2024-11-24 04:31:18 +00:00
e1ea84f11a
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.
121 lines
4.4 KiB
C
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);
|
|
|