diff --git a/nx/include/switch/crypto/aes_cbc.h b/nx/include/switch/crypto/aes_cbc.h index 0a5d9df1..2a2a7432 100644 --- a/nx/include/switch/crypto/aes_cbc.h +++ b/nx/include/switch/crypto/aes_cbc.h @@ -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); diff --git a/nx/include/switch/crypto/aes_ctr.h b/nx/include/switch/crypto/aes_ctr.h index 9c462bbb..9432140e 100644 --- a/nx/include/switch/crypto/aes_ctr.h +++ b/nx/include/switch/crypto/aes_ctr.h @@ -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); diff --git a/nx/source/crypto/aes_cbc.c b/nx/source/crypto/aes_cbc.c index 544c716e..00d13f4f 100644 --- a/nx/source/crypto/aes_cbc.c +++ b/nx/source/crypto/aes_cbc.c @@ -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) { diff --git a/nx/source/crypto/aes_ctr.c b/nx/source/crypto/aes_ctr.c index 82569218..0b20b968 100644 --- a/nx/source/crypto/aes_ctr.c +++ b/nx/source/crypto/aes_ctr.c @@ -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); }