cbc/ctr: expose iv/ctr reset

This commit is contained in:
Michael Scire 2019-04-03 10:03:46 -07:00 committed by fincs
parent 3eb6dd45a6
commit 82ae0f0c9e
4 changed files with 51 additions and 27 deletions

View File

@ -32,15 +32,18 @@ typedef struct {
/// 128-bit CBC API.
void aes128CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor);
void aes128CbcContextResetIv(Aes128CbcContext *ctx, const void *iv);
size_t aes128CbcEncrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size);
size_t aes128CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_t size);
/// 192-bit CBC API.
void aes192CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor);
void aes192CbcContextResetIv(Aes192CbcContext *ctx, const void *iv);
size_t aes192CbcEncrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size);
size_t aes192CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_t size);
/// 256-bit CBC API.
void aes256CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor);
void aes256CbcContextResetIv(Aes256CbcContext *ctx, const void *iv);
size_t aes256CbcEncrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size);
size_t aes256CbcDecrypt(Aes256CbcContext *ctx, void *dst, const void *src, size_t size);

View File

@ -32,12 +32,15 @@ typedef struct {
/// 128-bit CTR API.
void aes128CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr);
void aes128CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr);
void aes128CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t size);
/// 192-bit CTR API.
void aes192CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr);
void aes192CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr);
void aes192CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t size);
/// 256-bit CTR API.
void aes256CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr);
void aes256CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr);
void aes256CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size);

View File

@ -84,11 +84,14 @@ do { \
void aes128CbcContextCreate(Aes128CbcContext *out, const void *key, const void *iv, bool is_encryptor) {
/* Initialize inner context. */
aes128ContextCreate(&out->aes_ctx, key, is_encryptor);
aes128CbcContextResetIv(out, iv);
}
void aes128CbcContextResetIv(Aes128CbcContext *ctx, const void *iv) {
/* Set IV, nothing is buffered. */
memcpy(out->iv, iv, sizeof(out->iv));
memset(out->buffer, 0, sizeof(out->buffer));
out->num_buffered = 0;
memcpy(ctx->iv, iv, sizeof(ctx->iv));
memset(ctx->buffer, 0, sizeof(ctx->buffer));
ctx->num_buffered = 0;
}
static inline void _aes128CbcEncryptBlocks(Aes128CbcContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {
@ -282,11 +285,14 @@ size_t aes128CbcDecrypt(Aes128CbcContext *ctx, void *dst, const void *src, size_
void aes192CbcContextCreate(Aes192CbcContext *out, const void *key, const void *iv, bool is_encryptor) {
/* Initialize inner context. */
aes192ContextCreate(&out->aes_ctx, key, is_encryptor);
aes192CbcContextResetIv(out, iv);
}
void aes192CbcContextResetIv(Aes192CbcContext *ctx, const void *iv) {
/* Set IV, nothing is buffered. */
memcpy(out->iv, iv, sizeof(out->iv));
memset(out->buffer, 0, sizeof(out->buffer));
out->num_buffered = 0;
memcpy(ctx->iv, iv, sizeof(ctx->iv));
memset(ctx->buffer, 0, sizeof(ctx->buffer));
ctx->num_buffered = 0;
}
static inline void _aes192CbcEncryptBlocks(Aes192CbcContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {
@ -496,11 +502,14 @@ size_t aes192CbcDecrypt(Aes192CbcContext *ctx, void *dst, const void *src, size_
void aes256CbcContextCreate(Aes256CbcContext *out, const void *key, const void *iv, bool is_encryptor) {
/* Initialize inner context. */
aes256ContextCreate(&out->aes_ctx, key, is_encryptor);
aes256CbcContextResetIv(out, iv);
}
void aes256CbcContextResetIv(Aes256CbcContext *ctx, const void *iv) {
/* Set IV, nothing is buffered. */
memcpy(out->iv, iv, sizeof(out->iv));
memset(out->buffer, 0, sizeof(out->buffer));
out->num_buffered = 0;
memcpy(ctx->iv, iv, sizeof(ctx->iv));
memset(ctx->buffer, 0, sizeof(ctx->buffer));
ctx->num_buffered = 0;
}
static inline void _aes256CbcEncryptBlocks(Aes256CbcContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {

View File

@ -112,11 +112,14 @@ static inline uint8x16_t _incrementCtr(const uint8x16_t ctr) {
void aes128CtrContextCreate(Aes128CtrContext *out, const void *key, const void *ctr) {
/* Initialize inner context. */
aes128ContextCreate(&out->aes_ctx, key, true);
aes128CtrContextResetCtr(out, ctr);
}
/* Set IV, nothing is buffered. */
memcpy(out->ctr, ctr, sizeof(out->ctr));
memset(out->enc_ctr_buffer, 0, sizeof(out->enc_ctr_buffer));
out->buffer_offset = 0;
void aes128CtrContextResetCtr(Aes128CtrContext *ctx, const void *ctr) {
/* Set CTR, nothing is buffered. */
memcpy(ctx->ctr, ctr, sizeof(ctx->ctr));
memset(ctx->enc_ctr_buffer, 0, sizeof(ctx->enc_ctr_buffer));
ctx->buffer_offset = 0;
}
static inline void _aes128CtrCryptBlocks(Aes128CtrContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {
@ -278,11 +281,14 @@ void aes128CtrCrypt(Aes128CtrContext *ctx, void *dst, const void *src, size_t si
void aes192CtrContextCreate(Aes192CtrContext *out, const void *key, const void *ctr) {
/* Initialize inner context. */
aes192ContextCreate(&out->aes_ctx, key, true);
aes192CtrContextResetCtr(out, ctr);
}
/* Set IV, nothing is buffered. */
memcpy(out->ctr, ctr, sizeof(out->ctr));
memset(out->enc_ctr_buffer, 0, sizeof(out->enc_ctr_buffer));
out->buffer_offset = 0;
void aes192CtrContextResetCtr(Aes192CtrContext *ctx, const void *ctr) {
/* Set CTR, nothing is buffered. */
memcpy(ctx->ctr, ctr, sizeof(ctx->ctr));
memset(ctx->enc_ctr_buffer, 0, sizeof(ctx->enc_ctr_buffer));
ctx->buffer_offset = 0;
}
static inline void _aes192CtrCryptBlocks(Aes192CtrContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {
@ -451,6 +457,19 @@ void aes192CtrCrypt(Aes192CtrContext *ctx, void *dst, const void *src, size_t si
CRYPT_FUNC_BODY(_aes192CtrCryptBlocks);
}
void aes256CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr) {
/* Initialize inner context. */
aes256ContextCreate(&out->aes_ctx, key, true);
aes256CtrContextResetCtr(out, ctr);
}
void aes256CtrContextResetCtr(Aes256CtrContext *ctx, const void *ctr) {
/* Set CTR, nothing is buffered. */
memcpy(ctx->ctr, ctr, sizeof(ctx->ctr));
memset(ctx->enc_ctr_buffer, 0, sizeof(ctx->enc_ctr_buffer));
ctx->buffer_offset = 0;
}
static inline void _aes256CtrCryptBlocks(Aes256CtrContext *ctx, u8 *dst_u8, const u8 *src_u8, size_t num_blocks) {
/* Preload all round keys + iv into neon registers. */
DECLARE_ROUND_KEY_VAR(0);
@ -624,16 +643,6 @@ static inline void _aes256CtrCryptBlocks(Aes256CtrContext *ctx, u8 *dst_u8, cons
vst1q_u8(ctx->ctr, ctr0);
}
void aes256CtrContextCreate(Aes256CtrContext *out, const void *key, const void *ctr) {
/* Initialize inner context. */
aes256ContextCreate(&out->aes_ctx, key, true);
/* Set IV, nothing is buffered. */
memcpy(out->ctr, ctr, sizeof(out->ctr));
memset(out->enc_ctr_buffer, 0, sizeof(out->enc_ctr_buffer));
out->buffer_offset = 0;
}
void aes256CtrCrypt(Aes256CtrContext *ctx, void *dst, const void *src, size_t size) {
CRYPT_FUNC_BODY(_aes256CtrCryptBlocks);
}