From 688f5b22598f3de53497b30b086e50a62f0d2788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Wed, 25 Feb 2004 22:59:01 +0100 Subject: [PATCH] * des-compat.c: Use const for all unchanged arguments. (des_key_sched): Use a copy of the key if we need to fix the parity. Rev: src/nettle/des-compat.c:1.12 Rev: src/nettle/des-compat.h:1.10 --- des-compat.c | 58 ++++++++++++++++++++++++++++++---------------------- des-compat.h | 42 ++++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/des-compat.c b/des-compat.c index c3c23fe6..b5e3d52e 100644 --- a/des-compat.c +++ b/des-compat.c @@ -36,9 +36,9 @@ #include "macros.h" #include "memxor.h" -struct des_compat_des3 { struct des_ctx *keys[3]; }; +struct des_compat_des3 { const struct des_ctx *keys[3]; }; -typedef void (*cbc_crypt_func)(void *, uint32_t, uint8_t *, const uint8_t *); +typedef void (*cbc_crypt_func)(const void *, uint32_t, uint8_t *, const uint8_t *); static void des_compat_des3_encrypt(struct des_compat_des3 *ctx, @@ -59,9 +59,9 @@ des_compat_des3_decrypt(struct des_compat_des3 *ctx, } void -des_ecb3_encrypt(des_cblock *src, des_cblock *dst, - des_key_schedule k1, des_key_schedule k2, - des_key_schedule k3, int enc) +des_ecb3_encrypt(const des_cblock *src, des_cblock *dst, + const des_key_schedule k1, const des_key_schedule k2, + const des_key_schedule k3, int enc) { struct des_compat_des3 keys; keys.keys[0] = k1; @@ -73,15 +73,15 @@ des_ecb3_encrypt(des_cblock *src, des_cblock *dst, } uint32_t -des_cbc_cksum(des_cblock *src, des_cblock *dst, - long length, des_key_schedule ctx, - des_cblock *iv) +des_cbc_cksum(const des_cblock *src, des_cblock *dst, + long length, const des_key_schedule ctx, + const des_cblock *iv) { /* FIXME: I'm not entirely sure how this function is supposed to * work, in particular what it should return, and if iv can be * modified. */ uint8_t block[DES_BLOCK_SIZE]; - uint8_t *p; + const uint8_t *p; memcpy(block, *iv, DES_BLOCK_SIZE); @@ -98,8 +98,8 @@ des_cbc_cksum(des_cblock *src, des_cblock *dst, } void -des_ncbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule ctx, des_cblock *iv, +des_ncbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule ctx, des_cblock *iv, int enc) { switch (enc) @@ -121,8 +121,8 @@ des_ncbc_encrypt(des_cblock *src, des_cblock *dst, long length, } void -des_cbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule ctx, des_cblock *civ, +des_cbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule ctx, const des_cblock *civ, int enc) { des_cblock iv; @@ -134,8 +134,8 @@ des_cbc_encrypt(des_cblock *src, des_cblock *dst, long length, void -des_ecb_encrypt(des_cblock *src, des_cblock *dst, - des_key_schedule ctx, +des_ecb_encrypt(const des_cblock *src, des_cblock *dst, + const des_key_schedule ctx, int enc) { ((enc == DES_ENCRYPT) ? nettle_des_encrypt : nettle_des_decrypt) @@ -143,10 +143,10 @@ des_ecb_encrypt(des_cblock *src, des_cblock *dst, } void -des_ede3_cbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule k1, - des_key_schedule k2, - des_key_schedule k3, +des_ede3_cbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule k1, + const des_key_schedule k2, + const des_key_schedule k3, des_cblock *iv, int enc) { @@ -192,13 +192,21 @@ des_set_odd_parity(des_cblock *key) int des_check_key = 0; int -des_key_sched(des_cblock *key, des_key_schedule ctx) +des_key_sched(const des_cblock *key, des_key_schedule ctx) { - if (!des_check_key) - /* Fix the parity */ - des_set_odd_parity(key); + des_cblock nkey; + const uint8_t *pkey; - if (nettle_des_set_key(ctx, *key)) + if (des_check_key) + pkey = *key; + else + { + /* Fix the parity */ + nettle_des_fix_parity(DES_KEY_SIZE, nkey, *key); + pkey = nkey; + } + + if (nettle_des_set_key(ctx, pkey)) return 0; else switch(ctx->status) { @@ -222,7 +230,7 @@ des_key_sched(des_cblock *key, des_key_schedule ctx) } int -des_is_weak_key(des_cblock *key) +des_is_weak_key(const des_cblock *key) { struct des_ctx ctx; diff --git a/des-compat.h b/des-compat.h index baff1774..79092170 100644 --- a/des-compat.h +++ b/des-compat.h @@ -76,37 +76,47 @@ typedef uint8_t des_cblock[DES_BLOCK_SIZE]; extern int des_check_key; /* Prototypes */ + +/* Typing is a little confusing. Since both des_cblock and + des_key_schedule are typedef:ed arrays, it automatically decay to + a pointers. + + But the functions are declared taking pointers to des_cblock, i.e. + pointers to arrays. And on the other hand, they take plain + des_key_schedule arguments, which is equivalent to pointers to + struct des_ctx. */ void -des_ecb3_encrypt(des_cblock *src, des_cblock *dst, - des_key_schedule k1, des_key_schedule k2, - des_key_schedule k3, int enc); +des_ecb3_encrypt(const des_cblock *src, des_cblock *dst, + const des_key_schedule k1, const des_key_schedule k2, + const des_key_schedule k3, int enc); /* des_cbc_cksum in libdes returns a 32 bit integer, representing the * latter half of the output block, using little endian byte order. */ uint32_t -des_cbc_cksum(des_cblock *src, des_cblock *dst, - long length, des_key_schedule ctx, - des_cblock *iv); +des_cbc_cksum(const des_cblock *src, des_cblock *dst, + long length, const des_key_schedule ctx, + const des_cblock *iv); /* NOTE: Doesn't update iv. */ void -des_cbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule ctx, des_cblock *iv, +des_cbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule ctx, const des_cblock *iv, int enc); /* Similar, but updates iv. */ void -des_ncbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule ctx, des_cblock *iv, +des_ncbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule ctx, des_cblock *iv, int enc); void -des_ecb_encrypt(des_cblock *src, des_cblock *dst, - des_key_schedule ctx, int enc); +des_ecb_encrypt(const des_cblock *src, des_cblock *dst, + const des_key_schedule ctx, int enc); void -des_ede3_cbc_encrypt(des_cblock *src, des_cblock *dst, long length, - des_key_schedule k1,des_key_schedule k2, des_key_schedule k3, +des_ede3_cbc_encrypt(const des_cblock *src, des_cblock *dst, long length, + const des_key_schedule k1, const des_key_schedule k2, + const des_key_schedule k3, des_cblock *iv, int enc); @@ -114,9 +124,9 @@ int des_set_odd_parity(des_cblock *key); int -des_key_sched(des_cblock *key, des_key_schedule ctx); +des_key_sched(const des_cblock *key, des_key_schedule ctx); int -des_is_weak_key(des_cblock *key); +des_is_weak_key(const des_cblock *key); #endif /* NETTLE_DES_COMPAT_H_INCLUDED */ -- GitLab