From a9b47a42f5a8a2d3e324075bf7bee52f403c6a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Tue, 18 Mar 2014 21:42:00 +0100 Subject: [PATCH] Define and use nettle_cipher_func, for block ciphers. --- ChangeLog | 13 +++++++ aes128-meta.c | 4 +-- aes192-meta.c | 4 +-- aes256-meta.c | 4 +-- arctwo-meta.c | 8 ++--- camellia128-meta.c | 4 +-- camellia192-meta.c | 4 +-- camellia256-meta.c | 4 +-- cast128-meta.c | 4 +-- cbc.c | 4 +-- cbc.h | 12 +++---- ctr.c | 2 +- ctr.h | 6 ++-- des-compat.c | 8 ++--- eax.c | 16 ++++----- eax.h | 24 ++++++------- examples/nettle-benchmark.c | 4 +-- examples/nettle-openssl.c | 38 ++++++++++---------- gcm-aes.c | 2 +- gcm.c | 10 +++--- gcm.h | 19 +++++----- nettle-internal.c | 70 +++++++++++++++++-------------------- nettle-internal.h | 11 +++--- nettle-meta.h | 4 +-- nettle-types.h | 10 +++--- serpent-meta.c | 4 +-- testsuite/aes-test.c | 4 +-- twofish-meta.c | 4 +-- 28 files changed, 155 insertions(+), 146 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac76f040..28d2a750 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2014-03-18 Niels Möller <nisse@lysator.liu.se> + + * nettle-types.h (nettle_cipher_func): New typedef, similar to + nettle_crypt_func, but with a const context, intended for block + ciphers. + * nettle-meta.h (struct nettle_cipher): Use the nettle_cipher_func + type. + * Many other files affected: aes*-meta.c, camellia*-meta.c, + cast128-meta.c, serpent-meta.c, twofish-meta.c, cbc.[ch], + ctr.[ch], ctr.[ch], des-compat.c, eax.[ch], gcm*.[ch], + nettle-internal.*, testsuite/aes-test.c, + examples/nettle-benchmark.c, examples/nettle-openssl.c. + 2014-03-16 Niels Möller <nisse@lysator.liu.se> * chacha-set-key.c: Include string.h. diff --git a/aes128-meta.c b/aes128-meta.c index 4c72d735..3565babc 100644 --- a/aes128-meta.c +++ b/aes128-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_aes128 = AES_BLOCK_SIZE, AES128_KEY_SIZE, (nettle_set_key_func *) aes128_set_encrypt_key, (nettle_set_key_func *) aes128_set_decrypt_key, - (nettle_crypt_func *) aes128_encrypt, - (nettle_crypt_func *) aes128_decrypt + (nettle_cipher_func *) aes128_encrypt, + (nettle_cipher_func *) aes128_decrypt }; diff --git a/aes192-meta.c b/aes192-meta.c index 80719249..a900eb86 100644 --- a/aes192-meta.c +++ b/aes192-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_aes192 = AES_BLOCK_SIZE, AES192_KEY_SIZE, (nettle_set_key_func *) aes192_set_encrypt_key, (nettle_set_key_func *) aes192_set_decrypt_key, - (nettle_crypt_func *) aes192_encrypt, - (nettle_crypt_func *) aes192_decrypt + (nettle_cipher_func *) aes192_encrypt, + (nettle_cipher_func *) aes192_decrypt }; diff --git a/aes256-meta.c b/aes256-meta.c index 7f1e2e1e..7e38a0d2 100644 --- a/aes256-meta.c +++ b/aes256-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_aes256 = AES_BLOCK_SIZE, AES256_KEY_SIZE, (nettle_set_key_func *) aes256_set_encrypt_key, (nettle_set_key_func *) aes256_set_decrypt_key, - (nettle_crypt_func *) aes256_encrypt, - (nettle_crypt_func *) aes256_decrypt + (nettle_cipher_func *) aes256_encrypt, + (nettle_cipher_func *) aes256_decrypt }; diff --git a/arctwo-meta.c b/arctwo-meta.c index b234a0b6..fec8c0c6 100644 --- a/arctwo-meta.c +++ b/arctwo-meta.c @@ -34,8 +34,8 @@ ARCTWO_BLOCK_SIZE, bits/8, \ (nettle_set_key_func *) arctwo ## bits ## _set_key, \ (nettle_set_key_func *) arctwo ## bits ## _set_key, \ - (nettle_crypt_func *) arctwo_encrypt, \ - (nettle_crypt_func *) arctwo_decrypt, \ + (nettle_cipher_func *) arctwo_encrypt, \ + (nettle_cipher_func *) arctwo_decrypt, \ } const struct nettle_cipher nettle_arctwo40 = ARCTWO(40); @@ -51,6 +51,6 @@ const struct nettle_cipher nettle_arctwo_gutmann128 = ARCTWO_BLOCK_SIZE, 16, (nettle_set_key_func *) arctwo128_set_key_gutmann, (nettle_set_key_func *) arctwo128_set_key_gutmann, - (nettle_crypt_func *) arctwo_encrypt, - (nettle_crypt_func *) arctwo_decrypt, + (nettle_cipher_func *) arctwo_encrypt, + (nettle_cipher_func *) arctwo_decrypt, }; diff --git a/camellia128-meta.c b/camellia128-meta.c index 97748b08..ae9c2cb4 100644 --- a/camellia128-meta.c +++ b/camellia128-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_camellia128 = CAMELLIA_BLOCK_SIZE, CAMELLIA128_KEY_SIZE, (nettle_set_key_func *) camellia128_set_encrypt_key, (nettle_set_key_func *) camellia128_set_decrypt_key, - (nettle_crypt_func *) camellia128_crypt, - (nettle_crypt_func *) camellia128_crypt + (nettle_cipher_func *) camellia128_crypt, + (nettle_cipher_func *) camellia128_crypt }; diff --git a/camellia192-meta.c b/camellia192-meta.c index 62d9b194..d54caa77 100644 --- a/camellia192-meta.c +++ b/camellia192-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_camellia192 = CAMELLIA_BLOCK_SIZE, CAMELLIA192_KEY_SIZE, (nettle_set_key_func *) camellia192_set_encrypt_key, (nettle_set_key_func *) camellia192_set_decrypt_key, - (nettle_crypt_func *) camellia256_crypt, - (nettle_crypt_func *) camellia256_crypt + (nettle_cipher_func *) camellia256_crypt, + (nettle_cipher_func *) camellia256_crypt }; diff --git a/camellia256-meta.c b/camellia256-meta.c index 86d6278b..0413ded0 100644 --- a/camellia256-meta.c +++ b/camellia256-meta.c @@ -35,6 +35,6 @@ const struct nettle_cipher nettle_camellia256 = CAMELLIA_BLOCK_SIZE, CAMELLIA256_KEY_SIZE, (nettle_set_key_func *) camellia256_set_encrypt_key, (nettle_set_key_func *) camellia256_set_decrypt_key, - (nettle_crypt_func *) camellia256_crypt, - (nettle_crypt_func *) camellia256_crypt + (nettle_cipher_func *) camellia256_crypt, + (nettle_cipher_func *) camellia256_crypt }; diff --git a/cast128-meta.c b/cast128-meta.c index e103d7b3..783b1f4e 100644 --- a/cast128-meta.c +++ b/cast128-meta.c @@ -33,6 +33,6 @@ const struct nettle_cipher nettle_cast128 = CAST128_BLOCK_SIZE, CAST128_KEY_SIZE, (nettle_set_key_func *) cast128_set_key, (nettle_set_key_func *) cast128_set_key, - (nettle_crypt_func *) cast128_encrypt, - (nettle_crypt_func *) cast128_decrypt + (nettle_cipher_func *) cast128_encrypt, + (nettle_cipher_func *) cast128_decrypt }; diff --git a/cbc.c b/cbc.c index 16edd4dd..3804635d 100644 --- a/cbc.c +++ b/cbc.c @@ -37,7 +37,7 @@ #include "nettle-internal.h" void -cbc_encrypt(void *ctx, nettle_crypt_func *f, +cbc_encrypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *iv, size_t length, uint8_t *dst, const uint8_t *src) @@ -56,7 +56,7 @@ cbc_encrypt(void *ctx, nettle_crypt_func *f, #define CBC_BUFFER_LIMIT 512 void -cbc_decrypt(void *ctx, nettle_crypt_func *f, +cbc_decrypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *iv, size_t length, uint8_t *dst, const uint8_t *src) diff --git a/cbc.h b/cbc.h index eb01239c..0c52188b 100644 --- a/cbc.h +++ b/cbc.h @@ -37,13 +37,13 @@ extern "C" { #define cbc_decrypt nettle_cbc_decrypt void -cbc_encrypt(void *ctx, nettle_crypt_func *f, +cbc_encrypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *iv, size_t length, uint8_t *dst, const uint8_t *src); void -cbc_decrypt(void *ctx, nettle_crypt_func *f, +cbc_decrypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *iv, size_t length, uint8_t *dst, const uint8_t *src); @@ -58,16 +58,16 @@ memcpy((ctx)->iv, (data), sizeof((ctx)->iv)) #define CBC_ENCRYPT(self, f, length, dst, src) \ (0 ? ((f)(&(self)->ctx, 0, (void *)0, (void *)0)) \ : cbc_encrypt((void *) &(self)->ctx, \ - (nettle_crypt_func *) (f), \ + (nettle_cipher_func *) (f), \ sizeof((self)->iv), (self)->iv, \ - (length), (dst), (src))) + (length), (dst), (src))) #define CBC_DECRYPT(self, f, length, dst, src) \ (0 ? ((f)(&(self)->ctx, 0, (void *)0, (void *)0)) \ : cbc_decrypt((void *) &(self)->ctx, \ - (nettle_crypt_func *) (f), \ + (nettle_cipher_func *) (f), \ sizeof((self)->iv), (self)->iv, \ - (length), (dst), (src))) + (length), (dst), (src))) #ifdef __cplusplus } diff --git a/ctr.c b/ctr.c index 80a072b4..38d54a3f 100644 --- a/ctr.c +++ b/ctr.c @@ -40,7 +40,7 @@ #define NBLOCKS 4 void -ctr_crypt(void *ctx, nettle_crypt_func *f, +ctr_crypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *ctr, size_t length, uint8_t *dst, const uint8_t *src) diff --git a/ctr.h b/ctr.h index 14d520d3..5746060b 100644 --- a/ctr.h +++ b/ctr.h @@ -37,7 +37,7 @@ extern "C" { #define ctr_crypt nettle_ctr_crypt void -ctr_crypt(void *ctx, nettle_crypt_func *f, +ctr_crypt(const void *ctx, nettle_cipher_func *f, size_t block_size, uint8_t *ctr, size_t length, uint8_t *dst, const uint8_t *src); @@ -51,9 +51,9 @@ memcpy((ctx)->ctr, (data), sizeof((ctx)->ctr)) #define CTR_CRYPT(self, f, length, dst, src) \ (0 ? ((f)(&(self)->ctx, 0, NULL, NULL)) \ : ctr_crypt((void *) &(self)->ctx, \ - (nettle_crypt_func *) (f), \ + (nettle_cipher_func *) (f), \ sizeof((self)->ctr), (self)->ctr, \ - (length), (dst), (src))) + (length), (dst), (src))) #ifdef __cplusplus } diff --git a/des-compat.c b/des-compat.c index a74386a5..c3048b99 100644 --- a/des-compat.c +++ b/des-compat.c @@ -113,13 +113,13 @@ des_ncbc_encrypt(const_des_cblock *src, des_cblock *dst, long length, switch (enc) { case DES_ENCRYPT: - nettle_cbc_encrypt(ctx, (nettle_crypt_func *) des_encrypt, + nettle_cbc_encrypt(ctx, (nettle_cipher_func *) des_encrypt, DES_BLOCK_SIZE, *iv, length, *dst, *src); break; case DES_DECRYPT: nettle_cbc_decrypt(ctx, - (nettle_crypt_func *) des_decrypt, + (nettle_cipher_func *) des_decrypt, DES_BLOCK_SIZE, *iv, length, *dst, *src); break; @@ -166,12 +166,12 @@ des_ede3_cbc_encrypt(const_des_cblock *src, des_cblock *dst, long length, switch (enc) { case DES_ENCRYPT: - nettle_cbc_encrypt(&keys, (nettle_crypt_func *) des_compat_des3_encrypt, + nettle_cbc_encrypt(&keys, (nettle_cipher_func *) des_compat_des3_encrypt, DES_BLOCK_SIZE, *iv, length, *dst, *src); break; case DES_DECRYPT: - nettle_cbc_decrypt(&keys, (nettle_crypt_func *) des_compat_des3_decrypt, + nettle_cbc_decrypt(&keys, (nettle_cipher_func *) des_compat_des3_decrypt, DES_BLOCK_SIZE, *iv, length, *dst, *src); break; diff --git a/eax.c b/eax.c index 970ebbd3..dce7dd91 100644 --- a/eax.c +++ b/eax.c @@ -56,7 +56,7 @@ block16_xor (union nettle_block16 *dst, const union nettle_block16 *src) static void omac_update (union nettle_block16 *state, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, const uint8_t *data) { for (; length >= EAX_BLOCK_SIZE; @@ -79,7 +79,7 @@ omac_update (union nettle_block16 *state, const struct eax_key *key, static void omac_final (union nettle_block16 *state, const struct eax_key *key, - void *cipher, nettle_crypt_func *f) + const void *cipher, nettle_cipher_func *f) { block16_xor (state, &key->pad_block); f (cipher, EAX_BLOCK_SIZE, state->b, state->b); @@ -100,7 +100,7 @@ gf2_double (uint8_t *r, const uint8_t *a) } void -eax_set_key (struct eax_key *key, void *cipher, nettle_crypt_func *f) +eax_set_key (struct eax_key *key, const void *cipher, nettle_cipher_func *f) { static const union nettle_block16 zero_block; f (cipher, EAX_BLOCK_SIZE, key->pad_block.b, zero_block.b); @@ -111,7 +111,7 @@ eax_set_key (struct eax_key *key, void *cipher, nettle_crypt_func *f) void eax_set_nonce (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t nonce_length, const uint8_t *nonce) { omac_init (&eax->omac_nonce, 0); @@ -125,7 +125,7 @@ eax_set_nonce (struct eax_ctx *eax, const struct eax_key *key, void eax_update (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t data_length, const uint8_t *data) { omac_update (&eax->omac_data, key, cipher, f, data_length, data); @@ -133,7 +133,7 @@ eax_update (struct eax_ctx *eax, const struct eax_key *key, void eax_encrypt (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src) { ctr_crypt (cipher, f, EAX_BLOCK_SIZE, eax->ctr.b, length, dst, src); @@ -142,7 +142,7 @@ eax_encrypt (struct eax_ctx *eax, const struct eax_key *key, void eax_decrypt (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src) { omac_update (&eax->omac_message, key, cipher, f, length, src); @@ -151,7 +151,7 @@ eax_decrypt (struct eax_ctx *eax, const struct eax_key *key, void eax_digest (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *digest) { assert (length > 0); diff --git a/eax.h b/eax.h index 4509f889..0c019796 100644 --- a/eax.h +++ b/eax.h @@ -71,31 +71,31 @@ struct eax_ctx }; void -eax_set_key (struct eax_key *key, void *cipher, nettle_crypt_func *f); +eax_set_key (struct eax_key *key, const void *cipher, nettle_cipher_func *f); void eax_set_nonce (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t nonce_length, const uint8_t *nonce); void eax_update (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t data_length, const uint8_t *data); void eax_encrypt (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src); void eax_decrypt (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src); void eax_digest (struct eax_ctx *eax, const struct eax_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *digest); /* Put the cipher last, to get cipher-independent offsets for the EAX @@ -107,37 +107,37 @@ eax_digest (struct eax_ctx *eax, const struct eax_key *key, do { \ (set_key)(&(ctx)->cipher, (data)); \ if (0) (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0); \ - eax_set_key (&(ctx)->key, &(ctx)->cipher, (nettle_crypt_func *) encrypt); \ + eax_set_key (&(ctx)->key, &(ctx)->cipher, (nettle_cipher_func *) encrypt); \ } while (0) #define EAX_SET_NONCE(ctx, encrypt, length, nonce) \ (0 ? (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0) \ : eax_set_nonce (&(ctx)->eax, &(ctx)->key, \ - &(ctx)->cipher, (nettle_crypt_func *) (encrypt), \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ (length), (nonce))) #define EAX_UPDATE(ctx, encrypt, length, data) \ (0 ? (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0) \ : eax_update (&(ctx)->eax, &(ctx)->key, \ - &(ctx)->cipher, (nettle_crypt_func *) (encrypt), \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ (length), (data))) #define EAX_ENCRYPT(ctx, encrypt, length, dst, src) \ (0 ? (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0) \ : eax_encrypt (&(ctx)->eax, &(ctx)->key, \ - &(ctx)->cipher, (nettle_crypt_func *) (encrypt), \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ (length), (dst), (src))) #define EAX_DECRYPT(ctx, encrypt, length, dst, src) \ (0 ? (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0) \ : eax_decrypt (&(ctx)->eax, &(ctx)->key, \ - &(ctx)->cipher, (nettle_crypt_func *) (encrypt), \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ (length), (dst), (src))) #define EAX_DIGEST(ctx, encrypt, length, digest) \ (0 ? (encrypt) (&(ctx)->cipher, 0, (void *) 0, (void *) 0) \ : eax_digest (&(ctx)->eax, &(ctx)->key, \ - &(ctx)->cipher, (nettle_crypt_func *) (encrypt), \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ (length), (digest))) struct eax_aes128_ctx EAX_CTX(struct aes128_ctx); diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c index 8a15891a..60ca4f2b 100644 --- a/examples/nettle-benchmark.c +++ b/examples/nettle-benchmark.c @@ -186,7 +186,7 @@ bench_hash(void *arg) struct bench_cipher_info { void *ctx; - nettle_crypt_func *crypt; + nettle_cipher_func *crypt; uint8_t *data; }; @@ -200,7 +200,7 @@ bench_cipher(void *arg) struct bench_cbc_info { void *ctx; - nettle_crypt_func *crypt; + nettle_cipher_func *crypt; uint8_t *data; diff --git a/examples/nettle-openssl.c b/examples/nettle-openssl.c index a2678363..c1653933 100644 --- a/examples/nettle-openssl.c +++ b/examples/nettle-openssl.c @@ -89,9 +89,9 @@ openssl_aes256_set_decrypt_key(void *ctx, const uint8_t *key) AES_set_decrypt_key(key, 256, ctx); } -static nettle_crypt_func openssl_aes_encrypt; +static nettle_cipher_func openssl_aes_encrypt; static void -openssl_aes_encrypt(void *ctx, size_t length, +openssl_aes_encrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % AES_BLOCK_SIZE)); @@ -104,9 +104,9 @@ openssl_aes_encrypt(void *ctx, size_t length, } } -static nettle_crypt_func openssl_aes_decrypt; +static nettle_cipher_func openssl_aes_decrypt; static void -openssl_aes_decrypt(void *ctx, size_t length, +openssl_aes_decrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % AES_BLOCK_SIZE)); @@ -157,9 +157,9 @@ openssl_bf128_set_key(void *ctx, const uint8_t *key) BF_set_key(ctx, 16, key); } -static nettle_crypt_func openssl_bf_encrypt; +static nettle_cipher_func openssl_bf_encrypt; static void -openssl_bf_encrypt(void *ctx, size_t length, +openssl_bf_encrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % BF_BLOCK)); @@ -172,9 +172,9 @@ openssl_bf_encrypt(void *ctx, size_t length, } } -static nettle_crypt_func openssl_bf_decrypt; +static nettle_cipher_func openssl_bf_decrypt; static void -openssl_bf_decrypt(void *ctx, size_t length, +openssl_bf_decrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % BF_BLOCK)); @@ -210,30 +210,32 @@ openssl_des_set_key(void *ctx, const uint8_t *key) #define DES_BLOCK_SIZE 8 -static nettle_crypt_func openssl_des_encrypt; +static nettle_cipher_func openssl_des_encrypt; static void -openssl_des_encrypt(void *ctx, size_t length, +openssl_des_encrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % DES_BLOCK_SIZE)); while (length) { - DES_ecb_encrypt((void *) src, (void *) dst, ctx, DES_ENCRYPT); + DES_ecb_encrypt((void *) src, (void *) dst, + (void *) ctx, DES_ENCRYPT); length -= DES_BLOCK_SIZE; dst += DES_BLOCK_SIZE; src += DES_BLOCK_SIZE; } } -static nettle_crypt_func openssl_des_decrypt; +static nettle_cipher_func openssl_des_decrypt; static void -openssl_des_decrypt(void *ctx, size_t length, +openssl_des_decrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % DES_BLOCK_SIZE)); while (length) { - DES_ecb_encrypt((void *) src, (void *) dst, ctx, DES_DECRYPT); + DES_ecb_encrypt((void *) src, (void *) dst, + (void *) ctx, DES_DECRYPT); length -= DES_BLOCK_SIZE; dst += DES_BLOCK_SIZE; src += DES_BLOCK_SIZE; @@ -257,9 +259,9 @@ openssl_cast128_set_key(void *ctx, const uint8_t *key) CAST_set_key(ctx, 16, key); } -static nettle_crypt_func openssl_cast_encrypt; +static nettle_cipher_func openssl_cast_encrypt; static void -openssl_cast_encrypt(void *ctx, size_t length, +openssl_cast_encrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % CAST_BLOCK)); @@ -272,9 +274,9 @@ openssl_cast_encrypt(void *ctx, size_t length, } } -static nettle_crypt_func openssl_cast_decrypt; +static nettle_cipher_func openssl_cast_decrypt; static void -openssl_cast_decrypt(void *ctx, size_t length, +openssl_cast_decrypt(const void *ctx, size_t length, uint8_t *dst, const uint8_t *src) { assert (!(length % CAST_BLOCK)); diff --git a/gcm-aes.c b/gcm-aes.c index 37213c3c..c35bc68b 100644 --- a/gcm-aes.c +++ b/gcm-aes.c @@ -34,7 +34,7 @@ gcm_aes_set_key(struct gcm_aes_ctx *ctx, size_t length, const uint8_t *key) { aes_set_encrypt_key (&ctx->cipher, length, key); gcm_set_key (&ctx->key, &ctx->cipher, - (nettle_crypt_func *) aes_encrypt); + (nettle_cipher_func *) aes_encrypt); } void diff --git a/gcm.c b/gcm.c index d942deb6..2f699517 100644 --- a/gcm.c +++ b/gcm.c @@ -328,7 +328,7 @@ gcm_gf_mul (union nettle_block16 *x, const union nettle_block16 *table) */ void gcm_set_key(struct gcm_key *key, - void *cipher, nettle_crypt_func *f) + const void *cipher, nettle_cipher_func *f) { /* Middle element if GCM_TABLE_BITS > 0, otherwise the first element */ @@ -427,7 +427,7 @@ gcm_update(struct gcm_ctx *ctx, const struct gcm_key *key, } static void -gcm_crypt(struct gcm_ctx *ctx, void *cipher, nettle_crypt_func *f, +gcm_crypt(struct gcm_ctx *ctx, const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src) { uint8_t buffer[GCM_BLOCK_SIZE]; @@ -465,7 +465,7 @@ gcm_crypt(struct gcm_ctx *ctx, void *cipher, nettle_crypt_func *f, void gcm_encrypt (struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src) { assert(ctx->data_size % GCM_BLOCK_SIZE == 0); @@ -478,7 +478,7 @@ gcm_encrypt (struct gcm_ctx *ctx, const struct gcm_key *key, void gcm_decrypt(struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src) { assert(ctx->data_size % GCM_BLOCK_SIZE == 0); @@ -491,7 +491,7 @@ gcm_decrypt(struct gcm_ctx *ctx, const struct gcm_key *key, void gcm_digest(struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *digest) { uint8_t buffer[GCM_BLOCK_SIZE]; diff --git a/gcm.h b/gcm.h index 5cc4276b..8ccfb352 100644 --- a/gcm.h +++ b/gcm.h @@ -111,12 +111,9 @@ struct gcm_ctx { uint64_t data_size; }; -/* FIXME: Should use const for the cipher context. Then needs const for - nettle_crypt_func, which also rules out using that abstraction for - arcfour. */ void gcm_set_key(struct gcm_key *key, - void *cipher, nettle_crypt_func *f); + const void *cipher, nettle_cipher_func *f); void gcm_set_iv(struct gcm_ctx *ctx, const struct gcm_key *key, @@ -128,17 +125,17 @@ gcm_update(struct gcm_ctx *ctx, const struct gcm_key *key, void gcm_encrypt(struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src); void gcm_decrypt(struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *dst, const uint8_t *src); void gcm_digest(struct gcm_ctx *ctx, const struct gcm_key *key, - void *cipher, nettle_crypt_func *f, + const void *cipher, nettle_cipher_func *f, size_t length, uint8_t *digest); /* Convenience macrology (not sure how useful it is) */ @@ -152,7 +149,7 @@ gcm_digest(struct gcm_ctx *ctx, const struct gcm_key *key, (set_key)(&(ctx)->cipher, (key)); \ if (0) (encrypt)(&(ctx)->cipher, 0, (void *)0, (void *)0); \ gcm_set_key(&(ctx)->key, &(ctx)->cipher, \ - (nettle_crypt_func *) (encrypt)); \ + (nettle_cipher_func *) (encrypt)); \ } while (0) #define GCM_SET_IV(ctx, length, data) \ @@ -164,19 +161,19 @@ gcm_digest(struct gcm_ctx *ctx, const struct gcm_key *key, #define GCM_ENCRYPT(ctx, encrypt, length, dst, src) \ (0 ? (encrypt)(&(ctx)->cipher, 0, (void *)0, (void *)0) \ : gcm_encrypt(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ - (nettle_crypt_func *) (encrypt), \ + (nettle_cipher_func *) (encrypt), \ (length), (dst), (src))) #define GCM_DECRYPT(ctx, encrypt, length, dst, src) \ (0 ? (encrypt)(&(ctx)->cipher, 0, (void *)0, (void *)0) \ : gcm_decrypt(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ - (nettle_crypt_func *) (encrypt), \ + (nettle_cipher_func *) (encrypt), \ (length), (dst), (src))) #define GCM_DIGEST(ctx, encrypt, length, digest) \ (0 ? (encrypt)(&(ctx)->cipher, 0, (void *)0, (void *)0) \ : gcm_digest(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ - (nettle_crypt_func *) (encrypt), \ + (nettle_cipher_func *) (encrypt), \ (length), (digest))) struct gcm_aes128_ctx GCM_CTX(struct aes128_ctx); diff --git a/nettle-internal.c b/nettle-internal.c index 96e06f42..639a66ad 100644 --- a/nettle-internal.c +++ b/nettle-internal.c @@ -45,8 +45,8 @@ nettle_des = { DES_BLOCK_SIZE, DES_KEY_SIZE, (nettle_set_key_func *) des_set_key, (nettle_set_key_func *) des_set_key, - (nettle_crypt_func *) des_encrypt, - (nettle_crypt_func *) des_decrypt + (nettle_cipher_func *) des_encrypt, + (nettle_cipher_func *) des_decrypt }; const struct nettle_cipher @@ -55,8 +55,8 @@ nettle_des3 = { DES3_BLOCK_SIZE, DES3_KEY_SIZE, (nettle_set_key_func *) des3_set_key, (nettle_set_key_func *) des3_set_key, - (nettle_crypt_func *) des3_encrypt, - (nettle_crypt_func *) des3_decrypt + (nettle_cipher_func *) des3_encrypt, + (nettle_cipher_func *) des3_decrypt }; /* NOTE: This is not as nice as one might think, as we pretend @@ -67,54 +67,50 @@ nettle_blowfish128 = BLOWFISH_BLOCK_SIZE, BLOWFISH128_KEY_SIZE, (nettle_set_key_func *) blowfish128_set_key, (nettle_set_key_func *) blowfish128_set_key, - (nettle_crypt_func *) blowfish_encrypt, - (nettle_crypt_func *) blowfish_decrypt + (nettle_cipher_func *) blowfish_encrypt, + (nettle_cipher_func *) blowfish_decrypt }; -/* Sets a fix zero iv. For benchmarking only. */ -static void -chacha_set_key_hack(void *ctx, const uint8_t *key) -{ - static const uint8_t nonce[CHACHA_NONCE_SIZE]; - chacha_set_key (ctx, key); - chacha_set_nonce (ctx, nonce); -} -/* Claim zero block size, to classify as a stream cipher. */ -const struct nettle_cipher +const struct nettle_aead nettle_chacha = { "chacha", sizeof(struct chacha_ctx), - 0, CHACHA_KEY_SIZE, - chacha_set_key_hack, chacha_set_key_hack, + CHACHA_BLOCK_SIZE, CHACHA_KEY_SIZE, + CHACHA_NONCE_SIZE, 0, + (nettle_set_key_func *) chacha_set_key, + (nettle_set_key_func *) chacha_set_key, + (nettle_set_key_func *) chacha_set_nonce, + NULL, + (nettle_crypt_func *) chacha_crypt, (nettle_crypt_func *) chacha_crypt, - (nettle_crypt_func *) chacha_crypt + NULL, }; -/* Sets a fix zero iv. For benchmarking only. */ -static void -salsa20_set_key_hack(void *ctx, const uint8_t *key) -{ - static const uint8_t iv[SALSA20_IV_SIZE]; - salsa20_256_set_key (ctx, key); - salsa20_set_iv (ctx, iv); -} - -/* Claim zero block size, to classify as a stream cipher. */ -const struct nettle_cipher +const struct nettle_aead nettle_salsa20 = { "salsa20", sizeof(struct salsa20_ctx), - 0, SALSA20_256_KEY_SIZE, - salsa20_set_key_hack, salsa20_set_key_hack, + SALSA20_BLOCK_SIZE, SALSA20_256_KEY_SIZE, + SALSA20_NONCE_SIZE, 0, + (nettle_set_key_func *) salsa20_256_set_key, + (nettle_set_key_func *) salsa20_256_set_key, + (nettle_set_key_func *) salsa20_set_nonce, + NULL, (nettle_crypt_func *) salsa20_crypt, - (nettle_crypt_func *) salsa20_crypt + (nettle_crypt_func *) salsa20_crypt, + NULL, }; -const struct nettle_cipher +const struct nettle_aead nettle_salsa20r12 = { "salsa20r12", sizeof(struct salsa20_ctx), - 0, SALSA20_256_KEY_SIZE, - salsa20_set_key_hack, salsa20_set_key_hack, + SALSA20_BLOCK_SIZE, SALSA20_256_KEY_SIZE, + SALSA20_NONCE_SIZE, 0, + (nettle_set_key_func*) salsa20_256_set_key, + (nettle_set_key_func*) salsa20_256_set_key, + (nettle_set_key_func*) salsa20_set_nonce, + NULL, + (nettle_crypt_func *) salsa20r12_crypt, (nettle_crypt_func *) salsa20r12_crypt, - (nettle_crypt_func *) salsa20r12_crypt + NULL, }; diff --git a/nettle-internal.h b/nettle-internal.h index d91a81f9..18173681 100644 --- a/nettle-internal.h +++ b/nettle-internal.h @@ -58,21 +58,20 @@ extern const struct nettle_cipher nettle_des3; extern const struct nettle_cipher nettle_blowfish128; -/* For benchmarking only, sets no iv and lies about the block size. */ -extern const struct nettle_cipher nettle_chacha; -extern const struct nettle_cipher nettle_salsa20; -extern const struct nettle_cipher nettle_salsa20r12; - extern const struct nettle_cipher nettle_unified_aes128; extern const struct nettle_cipher nettle_unified_aes192; extern const struct nettle_cipher nettle_unified_aes256; +/* Stream ciphers treated as aead algorithms with no authentication. */ +extern const struct nettle_aead nettle_chacha; +extern const struct nettle_aead nettle_salsa20; +extern const struct nettle_aead nettle_salsa20r12; + /* Glue to openssl, for comparative benchmarking. Code in * examples/nettle-openssl.c. */ extern const struct nettle_cipher nettle_openssl_aes128; extern const struct nettle_cipher nettle_openssl_aes192; extern const struct nettle_cipher nettle_openssl_aes256; -extern const struct nettle_cipher nettle_openssl_arcfour128; extern const struct nettle_cipher nettle_openssl_blowfish128; extern const struct nettle_cipher nettle_openssl_des; extern const struct nettle_cipher nettle_openssl_cast128; diff --git a/nettle-meta.h b/nettle-meta.h index f7b8675f..15a5b22c 100644 --- a/nettle-meta.h +++ b/nettle-meta.h @@ -48,8 +48,8 @@ struct nettle_cipher nettle_set_key_func *set_encrypt_key; nettle_set_key_func *set_decrypt_key; - nettle_crypt_func *encrypt; - nettle_crypt_func *decrypt; + nettle_cipher_func *encrypt; + nettle_cipher_func *decrypt; }; /* null-terminated list of ciphers implemented by this version of nettle */ diff --git a/nettle-types.h b/nettle-types.h index fe3c5246..6ab815f8 100644 --- a/nettle-types.h +++ b/nettle-types.h @@ -54,12 +54,14 @@ typedef void *nettle_realloc_func(void *ctx, void *p, size_t length); /* Ciphers */ typedef void nettle_set_key_func(void *ctx, const uint8_t *key); -/* Uses a void * for cipher contexts. +/* For block ciphers, const context. */ +typedef void nettle_cipher_func(const void *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); - For block ciphers it would make sense with a const void * for the - context, but we use the same typedef for stream ciphers where the - internal state changes during the encryption. */ +/* Uses a void * for cipher contexts. Used for crypt operations where + the internal state changes during the encryption. */ typedef void nettle_crypt_func(void *ctx, size_t length, uint8_t *dst, const uint8_t *src); diff --git a/serpent-meta.c b/serpent-meta.c index 20504f72..14a61dcd 100644 --- a/serpent-meta.c +++ b/serpent-meta.c @@ -35,8 +35,8 @@ SERPENT ## bits ##_KEY_SIZE, \ (nettle_set_key_func *) serpent ## bits ## _set_key, \ (nettle_set_key_func *) serpent ## bits ## _set_key, \ - (nettle_crypt_func *) serpent_encrypt, \ - (nettle_crypt_func *) serpent_decrypt \ + (nettle_cipher_func *) serpent_encrypt, \ + (nettle_cipher_func *) serpent_decrypt \ } const struct nettle_cipher nettle_serpent128 diff --git a/testsuite/aes-test.c b/testsuite/aes-test.c index 9f80319b..57e1eff4 100644 --- a/testsuite/aes-test.c +++ b/testsuite/aes-test.c @@ -91,8 +91,8 @@ unified_aes256_set_decrypt_key (void *ctx, const uint8_t *key) AES_BLOCK_SIZE, AES ## bits ## _KEY_SIZE, \ unified_aes ## bits ##_set_encrypt_key, \ unified_aes ## bits ##_set_decrypt_key, \ - (nettle_crypt_func *) aes_encrypt, \ - (nettle_crypt_func *) aes_decrypt, \ + (nettle_cipher_func *) aes_encrypt, \ + (nettle_cipher_func *) aes_decrypt, \ } const struct nettle_cipher nettle_unified_aes128 = UNIFIED_AES(128); diff --git a/twofish-meta.c b/twofish-meta.c index 31e4d020..2675ba52 100644 --- a/twofish-meta.c +++ b/twofish-meta.c @@ -35,8 +35,8 @@ TWOFISH ## bits ## _KEY_SIZE, \ (nettle_set_key_func *) twofish ## bits ## _set_key, \ (nettle_set_key_func *) twofish ## bits ## _set_key, \ - (nettle_crypt_func *) twofish_encrypt, \ - (nettle_crypt_func *) twofish_decrypt \ + (nettle_cipher_func *) twofish_encrypt, \ + (nettle_cipher_func *) twofish_decrypt \ } const struct nettle_cipher nettle_twofish128 -- GitLab