[PATCH] Fix encryption/decryption return type for GOST28147
Dmitry Eremin-Solenikov
dbaryshkov at gmail.com
Wed Sep 18 17:18:41 CEST 2013
On Wed, Sep 18, 2013 at 6:26 PM, Jussi Kivilinna <jussi.kivilinna at iki.fi> wrote:
> * cipher/gost.h (_gcry_gost_enc_one): Change return type to
> 'unsigned int'.
> * cipher/gost28147.c (max): New macro.
> (gost_encrypt_block, gost_decrypt_block): Return burn stack depth.
> (_gcry_gost_enc_one): Return burn stack depth from gost_encrypt_block.
> --
>
> Return type for block cipher functions was lately changed from 'void' to
> 'unsigned int' to pass burn stack depth to cipher mode code. Patch fixes
> gost28147 to return stack burn value.
>
> Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
> ---
> cipher/gost.h | 2 +-
> cipher/gost28147.c | 23 +++++++++++++++++++----
> 2 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/cipher/gost.h b/cipher/gost.h
> index e1cf033..42021aa 100644
> --- a/cipher/gost.h
> +++ b/cipher/gost.h
> @@ -27,7 +27,7 @@ typedef struct {
> } GOST28147_context;
>
> /* This is a simple interface that will be used by GOST R 34.11-94 */
> -extern void _gcry_gost_enc_one (GOST28147_context *c, const byte *key,
> +extern unsigned int _gcry_gost_enc_one (GOST28147_context *c, const byte *key,
> byte *out, byte *in);
>
> #endif
> diff --git a/cipher/gost28147.c b/cipher/gost28147.c
> index 5d6d1e7..862e7d6 100644
> --- a/cipher/gost28147.c
> +++ b/cipher/gost28147.c
> @@ -35,6 +35,9 @@
> #include "cipher.h"
>
>
> +#define max(a, b) (((a) > (b)) ? (a) : (b))
> +
> +
> /* This is an s-box from RFC4357, named GostR3411-94-TestParamSet
> * For now it is the only s-box supported, as libgcrypt lacks mechanism
> * for passing parameters to cipher in a usefull way. */
> @@ -107,7 +110,7 @@ gost_val (GOST28147_context *ctx, u32 cm1, int subkey)
> return (cm1 << 11) | (cm1 >> 21);
> }
>
> -static void
> +static unsigned int
> gost_encrypt_block (void *c, byte *outbuf, const byte *inbuf)
> {
> GOST28147_context *ctx = c;
> @@ -153,16 +156,22 @@ gost_encrypt_block (void *c, byte *outbuf, const byte *inbuf)
> outbuf[1 + 4] = (n1 >> (1 * 8)) & 0xff;
> outbuf[2 + 4] = (n1 >> (2 * 8)) & 0xff;
> outbuf[3 + 4] = (n1 >> (3 * 8)) & 0xff;
> +
> + return /* burn_stack */ 4*sizeof(void*) /* func call */ +
> + 3*sizeof(void*) /* stack */ +
> + max( 4*sizeof(void*) /* gost_val call */,
> + 3*sizeof(void*) /* gost_set_subst call */ +
> + 2*sizeof(void*) /* gost_set subst stack*/ );
I think you can be pretty much sure here that 4 is less than 3 + 2, can't you?
And also it looks like you have forgot those n1 and n2 variables...
I would suggest to just select 384 or 512 and don't get into details of stack.
What do you think?
--
With best wishes
Dmitry
More information about the Gcrypt-devel
mailing list