]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Add AES-CFB8 Support
authorSimo Sorce <simo@redhat.com>
Wed, 24 Oct 2018 16:14:51 +0000 (12:14 -0400)
committerSimo Sorce <simo@redhat.com>
Wed, 24 Oct 2018 20:50:46 +0000 (16:50 -0400)
Signed-off-by: Simo Sorce <simo@redhat.com>
lib/includes/gnutls/gnutls.h.in
lib/nettle/cipher.c

index a5439cce56448299a1105c868dbc8074b1aadc3b..786dcdf055ba920f59254ede18f632b26ebebe55 100644 (file)
@@ -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
         */
index 24ecf8ded380c8ea28f92f4c3e1f63cda7c1ef89..0f6c737d6fc8fb04b119765358542e8ddd0d4fc9 100644 (file)
@@ -43,6 +43,7 @@
 #include <nettle/gcm.h>
 #include <nettle/ccm.h>
 #include <nettle/chacha-poly1305.h>
+#include <nettle/cfb.h>
 #include <fips.h>
 
 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)