2021-09-14 Niels Möller <nisse@lysator.liu.se>
+ * cbc.h (cbc_aes128_encrypt, cbc_aes192_encrypt)
+ (cbc_aes256_encrypt): Change interface, take cipher context
+ pointer and iv as separate arguments. Update C and x86_64
+ implementations and corresponding glue code.
+
* testsuite/testutils.c (test_aead): Test encrypt/decrypt with
message split into pieces.
/* For fat builds */
#if HAVE_NATIVE_cbc_aes128_encrypt
void
-_nettle_cbc_aes128_encrypt_c(struct cbc_aes128_ctx *ctx,
+_nettle_cbc_aes128_encrypt_c(const struct aes128_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst,
const uint8_t *src);
# define nettle_cbc_aes128_encrypt _nettle_cbc_aes128_encrypt_c
#endif
void
-cbc_aes128_encrypt(struct cbc_aes128_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src)
+cbc_aes128_encrypt(const struct aes128_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src)
{
- CBC_ENCRYPT(ctx, aes128_encrypt, length, dst, src);
+ cbc_encrypt(ctx, (nettle_cipher_func *) aes128_encrypt,
+ AES_BLOCK_SIZE, iv, length, dst, src);
}
/* For fat builds */
#if HAVE_NATIVE_cbc_aes192_encrypt
void
-_nettle_cbc_aes192_encrypt_c(struct cbc_aes192_ctx *ctx,
+_nettle_cbc_aes192_encrypt_c(const struct aes192_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst,
const uint8_t *src);
# define nettle_cbc_aes192_encrypt _nettle_cbc_aes192_encrypt_c
#endif
void
-cbc_aes192_encrypt(struct cbc_aes192_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src)
+cbc_aes192_encrypt(const struct aes192_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src)
{
- CBC_ENCRYPT(ctx, aes192_encrypt, length, dst, src);
+ cbc_encrypt(ctx, (nettle_cipher_func *) aes192_encrypt,
+ AES_BLOCK_SIZE, iv, length, dst, src);
}
/* For fat builds */
#if HAVE_NATIVE_cbc_aes256_encrypt
void
-_nettle_cbc_aes256_encrypt_c(struct cbc_aes256_ctx *ctx,
+_nettle_cbc_aes256_encrypt_c(const struct aes256_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst,
const uint8_t *src);
# define nettle_cbc_aes256_encrypt _nettle_cbc_aes256_encrypt_c
#endif
void
-cbc_aes256_encrypt(struct cbc_aes256_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src)
+cbc_aes256_encrypt(const struct aes256_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src)
{
- CBC_ENCRYPT(ctx, aes256_encrypt, length, dst, src);
+ cbc_encrypt(ctx, (nettle_cipher_func *) aes256_encrypt,
+ AES_BLOCK_SIZE, iv, length, dst, src);
}
sizeof((self)->iv), (self)->iv, \
(length), (dst), (src)))
-struct cbc_aes128_ctx CBC_CTX(struct aes128_ctx, AES_BLOCK_SIZE);
void
-cbc_aes128_encrypt(struct cbc_aes128_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src);
+cbc_aes128_encrypt(const struct aes128_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src);
-struct cbc_aes192_ctx CBC_CTX(struct aes192_ctx, AES_BLOCK_SIZE);
void
-cbc_aes192_encrypt(struct cbc_aes192_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src);
+cbc_aes192_encrypt(const struct aes192_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src);
-struct cbc_aes256_ctx CBC_CTX(struct aes256_ctx, AES_BLOCK_SIZE);
void
-cbc_aes256_encrypt(struct cbc_aes256_ctx *ctx, size_t length, uint8_t *dst, const uint8_t *src);
+cbc_aes256_encrypt(const struct aes256_ctx *ctx, uint8_t *iv,
+ size_t length, uint8_t *dst, const uint8_t *src);
#ifdef __cplusplus
}
typedef void aes256_crypt_func (const struct aes256_ctx *ctx, size_t length, uint8_t *dst,
const uint8_t *src);
-struct cbc_aes128_ctx;
-typedef void cbc_aes128_encrypt_func (struct cbc_aes128_ctx *ctx,
+typedef void cbc_aes128_encrypt_func (const struct aes128_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src);
-struct cbc_aes192_ctx;
-typedef void cbc_aes192_encrypt_func (struct cbc_aes192_ctx *ctx,
+typedef void cbc_aes192_encrypt_func (const struct aes192_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src);
-struct cbc_aes256_ctx;
-typedef void cbc_aes256_encrypt_func (struct cbc_aes256_ctx *ctx,
+typedef void cbc_aes256_encrypt_func (const struct aes256_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src);
(ctx, length, dst, src))
DEFINE_FAT_FUNC(nettle_cbc_aes128_encrypt, void,
- (struct cbc_aes128_ctx *ctx,
+ (const struct aes128_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src),
- (ctx, length, dst, src))
+ (ctx, iv, length, dst, src))
DEFINE_FAT_FUNC(nettle_cbc_aes192_encrypt, void,
- (struct cbc_aes192_ctx *ctx,
+ (const struct aes192_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src),
- (ctx, length, dst, src))
+ (ctx, iv, length, dst, src))
DEFINE_FAT_FUNC(nettle_cbc_aes256_encrypt, void,
- (struct cbc_aes256_ctx *ctx,
+ (const struct aes256_ctx *ctx, uint8_t *iv,
size_t length, uint8_t *dst, const uint8_t *src),
- (ctx, length, dst, src))
+ (ctx, iv, length, dst, src))
DEFINE_FAT_FUNC(nettle_memxor, void *,
(void *dst, const void *src, size_t n),
NULL,
};
+struct cbc_aes128_ctx CBC_CTX(struct aes128_ctx, AES_BLOCK_SIZE);
static void
cbc_aes128_set_encrypt_key(struct cbc_aes128_ctx *ctx, const uint8_t *key)
{
{
CBC_SET_IV(ctx, iv);
}
+static void
+cbc_aes128_encrypt_wrapper(struct cbc_aes128_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ cbc_aes128_encrypt(&ctx->ctx, ctx->iv, length, dst, src);
+}
+
const struct nettle_aead
nettle_cbc_aes128 = {
"cbc_aes128", sizeof(struct cbc_aes128_ctx),
NULL,
(nettle_set_key_func*) cbc_aes128_set_iv,
NULL,
- (nettle_crypt_func *) cbc_aes128_encrypt,
+ (nettle_crypt_func *) cbc_aes128_encrypt_wrapper,
NULL,
NULL,
};
+struct cbc_aes192_ctx CBC_CTX(struct aes192_ctx, AES_BLOCK_SIZE);
static void
cbc_aes192_set_encrypt_key(struct cbc_aes192_ctx *ctx, const uint8_t *key)
{
{
CBC_SET_IV(ctx, iv);
}
+static void
+cbc_aes192_encrypt_wrapper(struct cbc_aes192_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ cbc_aes192_encrypt(&ctx->ctx, ctx->iv, length, dst, src);
+}
const struct nettle_aead
nettle_cbc_aes192 = {
"cbc_aes192", sizeof(struct cbc_aes192_ctx),
NULL,
(nettle_set_key_func*) cbc_aes192_set_iv,
NULL,
- (nettle_crypt_func *) cbc_aes192_encrypt,
+ (nettle_crypt_func *) cbc_aes192_encrypt_wrapper,
NULL,
NULL,
};
+struct cbc_aes256_ctx CBC_CTX(struct aes256_ctx, AES_BLOCK_SIZE);
static void
cbc_aes256_set_encrypt_key(struct cbc_aes256_ctx *ctx, const uint8_t *key)
{
{
CBC_SET_IV(ctx, iv);
}
+static void
+cbc_aes256_encrypt_wrapper(struct cbc_aes256_ctx *ctx,
+ size_t length, uint8_t *dst,
+ const uint8_t *src)
+{
+ cbc_aes256_encrypt(&ctx->ctx, ctx->iv, length, dst, src);
+}
const struct nettle_aead
nettle_cbc_aes256 = {
"cbc_aes256", sizeof(struct cbc_aes256_ctx),
NULL,
(nettle_set_key_func*) cbc_aes256_set_iv,
NULL,
- (nettle_crypt_func *) cbc_aes256_encrypt,
+ (nettle_crypt_func *) cbc_aes256_encrypt_wrapper,
NULL,
NULL,
};
C Input argument
define(`CTX', `%rdi')
-define(`LENGTH',`%rsi')
-define(`DST', `%rdx')
-define(`SRC', `%rcx')
+define(`IV', `%rsi')
+define(`LENGTH',`%rdx')
+define(`DST', `%rcx')
+define(`SRC', `%r8')
define(`KEY0', `%xmm0')
define(`KEY1', `%xmm1')
.text
ALIGN(16)
PROLOGUE(nettle_cbc_aes128_encrypt)
- W64_ENTRY(4, 13)
+ W64_ENTRY(5, 13)
shr $4, LENGTH
test LENGTH, LENGTH
jz .Lend
movups 128(CTX), KEY8
movups 144(CTX), KEY9
movups 160(CTX), KEY10
- movups 176(CTX), X C Load IV
+ movups (IV), X
.Lblock_loop:
movups (SRC), BLOCK C Cleartext block
dec LENGTH
jnz .Lblock_loop
- C Save IV
- movups X, 176(CTX)
+ movups X, (IV)
.Lend:
- W64_EXIT(4, 13)
+ W64_EXIT(5, 13)
ret
EPILOGUE(nettle_cbc_aes128_encrypt)
C Input argument
define(`CTX', `%rdi')
-define(`LENGTH',`%rsi')
-define(`DST', `%rdx')
-define(`SRC', `%rcx')
+define(`IV', `%rsi')
+define(`LENGTH',`%rdx')
+define(`DST', `%rcx')
+define(`SRC', `%r8')
define(`KEY0', `%xmm0')
define(`KEY1', `%xmm1')
.text
ALIGN(16)
PROLOGUE(nettle_cbc_aes192_encrypt)
- W64_ENTRY(4, 15)
+ W64_ENTRY(5, 15)
shr $4, LENGTH
test LENGTH, LENGTH
jz .Lend
movups 160(CTX), KEY10
movups 176(CTX), KEY11
movups 192(CTX), KEY12
- movups 208(CTX), X C Load IV
+ movups (IV), X
.Lblock_loop:
movups (SRC), BLOCK C Cleartext block
dec LENGTH
jnz .Lblock_loop
- C Save IV
- movups X, 208(CTX)
+ movups X, (IV)
.Lend:
- W64_EXIT(4, 15)
+ W64_EXIT(5, 15)
ret
EPILOGUE(nettle_cbc_aes192_encrypt)
C Input argument
define(`CTX', `%rdi')
-define(`LENGTH',`%rsi')
-define(`DST', `%rdx')
-define(`SRC', `%rcx')
+define(`IV', `%rsi')
+define(`LENGTH',`%rdx')
+define(`DST', `%rcx')
+define(`SRC', `%r8')
define(`KEY0_7', `%xmm0')
define(`KEY1', `%xmm1')
.text
ALIGN(16)
PROLOGUE(nettle_cbc_aes256_encrypt)
- W64_ENTRY(4, 16)
+ W64_ENTRY(5, 16)
shr $4, LENGTH
test LENGTH, LENGTH
jz .Lend
movups 192(CTX), KEY12
movups 208(CTX), KEY13
movups 224(CTX), KEY14
- movups 240(CTX), X C Load IV
+ movups (IV), X
.Lblock_loop:
movups (SRC), BLOCK C Cleartext block
dec LENGTH
jnz .Lblock_loop
- C Save IV
- movups X, 240(CTX)
+ movups X, (IV)
.Lend:
- W64_EXIT(4, 16)
+ W64_EXIT(5, 16)
ret
EPILOGUE(nettle_cbc_aes256_encrypt)