From c98ba9d03213d0c63d6874539d59f7b55fbc3fae Mon Sep 17 00:00:00 2001 From: Dmitry Belyavsky Date: Fri, 14 Aug 2015 20:50:01 +0300 Subject: Initial commit --- gost89.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 gost89.h (limited to 'gost89.h') diff --git a/gost89.h b/gost89.h new file mode 100644 index 0000000..e5b877f --- /dev/null +++ b/gost89.h @@ -0,0 +1,98 @@ +/********************************************************************** + * gost89.h * + * Copyright (c) 2005-2006 Cryptocom LTD * + * This file is distributed under the same license as OpenSSL * + * * + * Declarations for GOST 28147-89 encryption algorithm * + * No OpenSSL libraries required to compile and use * + * this code * + **********************************************************************/ +#ifndef GOST89_H +# define GOST89_H + +/* Typedef for unsigned 32-bit integer */ +# if __LONG_MAX__ > 2147483647L +typedef unsigned int u4; +# else +typedef unsigned long u4; +# endif +/* Typedef for unsigned 8-bit integer */ +typedef unsigned char byte; + +/* Internal representation of GOST substitution blocks */ +typedef struct { + byte k8[16]; + byte k7[16]; + byte k6[16]; + byte k5[16]; + byte k4[16]; + byte k3[16]; + byte k2[16]; + byte k1[16]; +} gost_subst_block; + +/* Cipher context includes key and preprocessed substitution block */ +typedef struct { + u4 k[8]; + /* Constant s-boxes -- set up in gost_init(). */ + u4 k87[256], k65[256], k43[256], k21[256]; +} gost_ctx; +/* + * Note: encrypt and decrypt expect full blocks--padding blocks is caller's + * responsibility. All bulk encryption is done in ECB mode by these calls. + * Other modes may be added easily enough. + */ +/* Encrypt several full blocks in ECB mode */ +void gost_enc(gost_ctx * ctx, const byte * clear, byte * cipher, int blocks); +/* Decrypt several full blocks in ECB mode */ +void gost_dec(gost_ctx * ctx, const byte * cipher, byte * clear, int blocks); +/* Encrypts several full blocks in CFB mode using 8byte IV */ +void gost_enc_cfb(gost_ctx * ctx, const byte * iv, const byte * clear, + byte * cipher, int blocks); +/* Decrypts several full blocks in CFB mode using 8byte IV */ +void gost_dec_cfb(gost_ctx * ctx, const byte * iv, const byte * cipher, + byte * clear, int blocks); + +/* Encrypt one block */ +void gostcrypt(gost_ctx * c, const byte * in, byte * out); +/* Decrypt one block */ +void gostdecrypt(gost_ctx * c, const byte * in, byte * out); +/* Set key into context */ +void gost_key(gost_ctx * ctx, const byte * key); +/* Get key from context */ +void gost_get_key(gost_ctx * ctx, byte * key); +/* Set S-blocks into context */ +void gost_init(gost_ctx * ctx, const gost_subst_block * subst_block); +/* Clean up context */ +void gost_destroy(gost_ctx * ctx); +/* Intermediate function used for calculate hash */ +void gost_enc_with_key(gost_ctx *, byte * key, byte * inblock, + byte * outblock); +/* Compute MAC of given length in bits from data */ +int gost_mac(gost_ctx * ctx, int hmac_len, const unsigned char *data, + unsigned int data_len, unsigned char *hmac); +/* + * Compute MAC of given length in bits from data, using non-zero 8-byte IV + * (non-standard, for use in CryptoPro key transport only + */ +int gost_mac_iv(gost_ctx * ctx, int hmac_len, const unsigned char *iv, + const unsigned char *data, unsigned int data_len, + unsigned char *hmac); +/* Perform one step of MAC calculation like gostcrypt */ +void mac_block(gost_ctx * c, byte * buffer, const byte * block); +/* Extracts MAC value from mac state buffer */ +void get_mac(byte * buffer, int nbits, byte * out); +/* Implements cryptopro key meshing algorithm. Expect IV to be 8-byte size*/ +void cryptopro_key_meshing(gost_ctx * ctx, unsigned char *iv); +/* Parameter sets specified in RFC 4357 */ +extern gost_subst_block GostR3411_94_TestParamSet; +extern gost_subst_block GostR3411_94_CryptoProParamSet; +extern gost_subst_block Gost28147_TestParamSet; +extern gost_subst_block Gost28147_CryptoProParamSetA; +extern gost_subst_block Gost28147_CryptoProParamSetB; +extern gost_subst_block Gost28147_CryptoProParamSetC; +extern gost_subst_block Gost28147_CryptoProParamSetD; +extern const byte CryptoProKeyMeshingKey[]; +typedef unsigned int word32; + +#endif -- cgit v1.1