From 940143cccea91fdc41f9a052ee2b64ecbd3a5dac Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 24 Oct 2018 12:14:51 -0400 Subject: Add AES-CFB8 Support Signed-off-by: Simo Sorce --- lib/includes/gnutls/gnutls.h.in | 6 +++++ lib/nettle/cipher.c | 58 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/lib/includes/gnutls/gnutls.h.in b/lib/includes/gnutls/gnutls.h.in index a5439cce56..786dcdf055 100644 --- a/lib/includes/gnutls/gnutls.h.in +++ b/lib/includes/gnutls/gnutls.h.in @@ -97,6 +97,9 @@ extern "C" { * @GNUTLS_CIPHER_AES_128_CBC: AES in CBC mode with 128-bit keys. * @GNUTLS_CIPHER_AES_192_CBC: AES in CBC mode with 192-bit keys. * @GNUTLS_CIPHER_AES_256_CBC: AES in CBC mode with 256-bit keys. + * @GNUTLS_CIPHER_AES_128_CFB8: AES in CFB8 mode with 128-bit keys. + * @GNUTLS_CIPHER_AES_192_CFB8: AES in CFB8 mode with 192-bit keys. + * @GNUTLS_CIPHER_AES_256_CFB8: AES in CFB8 mode with 256-bit keys. * @GNUTLS_CIPHER_ARCFOUR_40: ARCFOUR stream cipher with 40-bit keys. * @GNUTLS_CIPHER_CAMELLIA_128_CBC: Camellia in CBC mode with 128-bit keys. * @GNUTLS_CIPHER_CAMELLIA_192_CBC: Camellia in CBC mode with 192-bit keys. @@ -161,6 +164,9 @@ typedef enum gnutls_cipher_algorithm { GNUTLS_CIPHER_GOST28147_CPB_CFB = 26, GNUTLS_CIPHER_GOST28147_CPC_CFB = 27, GNUTLS_CIPHER_GOST28147_CPD_CFB = 28, + GNUTLS_CIPHER_AES_128_CFB8 = 29, + GNUTLS_CIPHER_AES_192_CFB8 = 30, + GNUTLS_CIPHER_AES_256_CFB8 = 31, /* used only for PGP internals. Ignored in TLS/SSL */ diff --git a/lib/nettle/cipher.c b/lib/nettle/cipher.c index 24ecf8ded3..0f6c737d6f 100644 --- a/lib/nettle/cipher.c +++ b/lib/nettle/cipher.c @@ -43,6 +43,7 @@ #include #include #include +#include #include struct nettle_cipher_ctx; @@ -258,6 +259,24 @@ static void _des3_set_key(struct des3_ctx *ctx, const uint8_t *key) des3_set_key(ctx, key); } +static void +_cfb8_encrypt(struct nettle_cipher_ctx *ctx, size_t length, uint8_t * dst, + const uint8_t * src) +{ + cfb8_encrypt(ctx->ctx_ptr, ctx->cipher->encrypt_block, + ctx->iv_size, ctx->iv, + length, dst, src); +} + +static void +_cfb8_decrypt(struct nettle_cipher_ctx *ctx, size_t length, uint8_t * dst, + const uint8_t * src) +{ + cfb8_decrypt(ctx->ctx_ptr, ctx->cipher->encrypt_block, + ctx->iv_size, ctx->iv, + length, dst, src); +} + static const struct nettle_cipher_st builtin_ciphers[] = { { .algo = GNUTLS_CIPHER_AES_128_GCM, .block_size = AES_BLOCK_SIZE, @@ -616,6 +635,45 @@ static const struct nettle_cipher_st builtin_ciphers[] = { .set_decrypt_key = _gost28147_set_key_cpd, }, #endif + { .algo = GNUTLS_CIPHER_AES_128_CFB8, + .block_size = AES_BLOCK_SIZE, + .key_size = AES128_KEY_SIZE, + .encrypt_block = (nettle_cipher_func*)aes128_encrypt, + .decrypt_block = (nettle_cipher_func*)aes128_encrypt, + + .ctx_size = sizeof(struct CFB8_CTX(struct aes128_ctx, AES_BLOCK_SIZE)), + .encrypt = _cfb8_encrypt, + .decrypt = _cfb8_decrypt, + .set_encrypt_key = (nettle_set_key_func*)aes128_set_encrypt_key, + .set_decrypt_key = (nettle_set_key_func*)aes128_set_encrypt_key, + .max_iv_size = AES_BLOCK_SIZE, + }, + { .algo = GNUTLS_CIPHER_AES_192_CFB8, + .block_size = AES_BLOCK_SIZE, + .key_size = AES192_KEY_SIZE, + .encrypt_block = (nettle_cipher_func*)aes192_encrypt, + .decrypt_block = (nettle_cipher_func*)aes192_encrypt, + + .ctx_size = sizeof(struct CFB8_CTX(struct aes192_ctx, AES_BLOCK_SIZE)), + .encrypt = _cfb8_encrypt, + .decrypt = _cfb8_decrypt, + .set_encrypt_key = (nettle_set_key_func*)aes192_set_encrypt_key, + .set_decrypt_key = (nettle_set_key_func*)aes192_set_encrypt_key, + .max_iv_size = AES_BLOCK_SIZE, + }, + { .algo = GNUTLS_CIPHER_AES_256_CFB8, + .block_size = AES_BLOCK_SIZE, + .key_size = AES256_KEY_SIZE, + .encrypt_block = (nettle_cipher_func*)aes256_encrypt, + .decrypt_block = (nettle_cipher_func*)aes256_encrypt, + + .ctx_size = sizeof(struct CFB8_CTX(struct aes256_ctx, AES_BLOCK_SIZE)), + .encrypt = _cfb8_encrypt, + .decrypt = _cfb8_decrypt, + .set_encrypt_key = (nettle_set_key_func*)aes256_set_encrypt_key, + .set_decrypt_key = (nettle_set_key_func*)aes256_set_encrypt_key, + .max_iv_size = AES_BLOCK_SIZE, + }, }; static int wrap_nettle_cipher_exists(gnutls_cipher_algorithm_t algo) -- cgit v1.2.1