1/********************************************************************** 2 * gost89.h * 3 * Copyright (c) 2005-2006 Cryptocom LTD * 4 * This file is distributed under the same license as OpenSSL * 5 * * 6 * Declarations for GOST 28147-89 encryption algorithm * 7 * No OpenSSL libraries required to compile and use * 8 * this code *
| 1/********************************************************************** 2 * gost89.h * 3 * Copyright (c) 2005-2006 Cryptocom LTD * 4 * This file is distributed under the same license as OpenSSL * 5 * * 6 * Declarations for GOST 28147-89 encryption algorithm * 7 * No OpenSSL libraries required to compile and use * 8 * this code *
|
9 **********************************************************************/
| 9 **********************************************************************/
|
10#ifndef GOST89_H
| 10#ifndef GOST89_H
|
11#define GOST89_H
| 11# define GOST89_H
|
12 13/* Typedef for unsigned 32-bit integer */
| 12 13/* Typedef for unsigned 32-bit integer */
|
14#if __LONG_MAX__ > 2147483647L 15typedef unsigned int u4; 16#else 17typedef unsigned long u4; 18#endif
| 14# if __LONG_MAX__ > 2147483647L 15typedef unsigned int u4; 16# else 17typedef unsigned long u4; 18# endif
|
19/* Typedef for unsigned 8-bit integer */
| 19/* Typedef for unsigned 8-bit integer */
|
20typedef unsigned char byte;
| 20typedef unsigned char byte;
|
21 22/* Internal representation of GOST substitution blocks */ 23typedef struct {
| 21 22/* Internal representation of GOST substitution blocks */ 23typedef struct {
|
24 byte k8[16]; 25 byte k7[16]; 26 byte k6[16]; 27 byte k5[16]; 28 byte k4[16]; 29 byte k3[16]; 30 byte k2[16]; 31 byte k1[16]; 32} gost_subst_block;
| 24 byte k8[16]; 25 byte k7[16]; 26 byte k6[16]; 27 byte k5[16]; 28 byte k4[16]; 29 byte k3[16]; 30 byte k2[16]; 31 byte k1[16]; 32} gost_subst_block;
|
33
| 33
|
34
| |
35/* Cipher context includes key and preprocessed substitution block */
| 34/* Cipher context includes key and preprocessed substitution block */
|
36typedef struct { 37 u4 k[8]; 38 /* Constant s-boxes -- set up in gost_init(). */ 39 u4 k87[256],k65[256],k43[256],k21[256]; 40} gost_ctx; 41/* Note: encrypt and decrypt expect full blocks--padding blocks is 42 caller's responsibility. All bulk encryption is done in 43 ECB mode by these calls. Other modes may be added easily 44 enough. */
| 35typedef struct { 36 u4 k[8]; 37 /* Constant s-boxes -- set up in gost_init(). */ 38 u4 k87[256], k65[256], k43[256], k21[256]; 39} gost_ctx; 40/* 41 * Note: encrypt and decrypt expect full blocks--padding blocks is caller's 42 * responsibility. All bulk encryption is done in ECB mode by these calls. 43 * Other modes may be added easily enough. 44 */
|
45/* Encrypt several full blocks in ECB mode */
| 45/* Encrypt several full blocks in ECB mode */
|
46void gost_enc(gost_ctx *ctx, const byte *clear,byte *cipher, int blocks);
| 46void gost_enc(gost_ctx * ctx, const byte * clear, byte * cipher, int blocks);
|
47/* Decrypt several full blocks in ECB mode */
| 47/* Decrypt several full blocks in ECB mode */
|
48void gost_dec(gost_ctx *ctx, const byte *cipher,byte *clear, int blocks);
| 48void gost_dec(gost_ctx * ctx, const byte * cipher, byte * clear, int blocks);
|
49/* Encrypts several full blocks in CFB mode using 8byte IV */
| 49/* Encrypts several full blocks in CFB mode using 8byte IV */
|
50void gost_enc_cfb(gost_ctx *ctx,const byte *iv,const byte *clear,byte *cipher,int blocks);
| 50void gost_enc_cfb(gost_ctx * ctx, const byte * iv, const byte * clear, 51 byte * cipher, int blocks);
|
51/* Decrypts several full blocks in CFB mode using 8byte IV */
| 52/* Decrypts several full blocks in CFB mode using 8byte IV */
|
52void gost_dec_cfb(gost_ctx *ctx,const byte *iv,const byte *cipher,byte *clear,int blocks);
| 53void gost_dec_cfb(gost_ctx * ctx, const byte * iv, const byte * cipher, 54 byte * clear, int blocks);
|
53 54/* Encrypt one block */
| 55 56/* Encrypt one block */
|
55void gostcrypt(gost_ctx *c, const byte *in, byte *out);
| 57void gostcrypt(gost_ctx * c, const byte * in, byte * out);
|
56/* Decrypt one block */
| 58/* Decrypt one block */
|
57void gostdecrypt(gost_ctx *c, const byte *in,byte *out);
| 59void gostdecrypt(gost_ctx * c, const byte * in, byte * out);
|
58/* Set key into context */
| 60/* Set key into context */
|
59void gost_key(gost_ctx *ctx, const byte *key);
| 61void gost_key(gost_ctx * ctx, const byte * key);
|
60/* Get key from context */
| 62/* Get key from context */
|
61void gost_get_key(gost_ctx *ctx, byte *key);
| 63void gost_get_key(gost_ctx * ctx, byte * key);
|
62/* Set S-blocks into context */
| 64/* Set S-blocks into context */
|
63void gost_init(gost_ctx *ctx, const gost_subst_block *subst_block);
| 65void gost_init(gost_ctx * ctx, const gost_subst_block * subst_block);
|
64/* Clean up context */
| 66/* Clean up context */
|
65void gost_destroy(gost_ctx *ctx);
| 67void gost_destroy(gost_ctx * ctx);
|
66/* Intermediate function used for calculate hash */
| 68/* Intermediate function used for calculate hash */
|
67void gost_enc_with_key(gost_ctx *,byte *key,byte *inblock,byte *outblock);
| 69void gost_enc_with_key(gost_ctx *, byte * key, byte * inblock, 70 byte * outblock);
|
68/* Compute MAC of given length in bits from data */
| 71/* Compute MAC of given length in bits from data */
|
69int gost_mac(gost_ctx *ctx,int hmac_len,const unsigned char *data, 70 unsigned int data_len,unsigned char *hmac) ; 71/* Compute MAC of given length in bits from data, using non-zero 8-byte 72 * IV (non-standard, for use in CryptoPro key transport only */ 73int gost_mac_iv(gost_ctx *ctx,int hmac_len,const unsigned char *iv,const unsigned char *data, 74 unsigned int data_len,unsigned char *hmac) ;
| 72int gost_mac(gost_ctx * ctx, int hmac_len, const unsigned char *data, 73 unsigned int data_len, unsigned char *hmac); 74/* 75 * Compute MAC of given length in bits from data, using non-zero 8-byte IV 76 * (non-standard, for use in CryptoPro key transport only 77 */ 78int gost_mac_iv(gost_ctx * ctx, int hmac_len, const unsigned char *iv, 79 const unsigned char *data, unsigned int data_len, 80 unsigned char *hmac);
|
75/* Perform one step of MAC calculation like gostcrypt */
| 81/* Perform one step of MAC calculation like gostcrypt */
|
76void mac_block(gost_ctx *c,byte *buffer,const byte *block);
| 82void mac_block(gost_ctx * c, byte * buffer, const byte * block);
|
77/* Extracts MAC value from mac state buffer */
| 83/* Extracts MAC value from mac state buffer */
|
78void get_mac(byte *buffer,int nbits,byte *out);
| 84void get_mac(byte * buffer, int nbits, byte * out);
|
79/* Implements cryptopro key meshing algorithm. Expect IV to be 8-byte size*/
| 85/* Implements cryptopro key meshing algorithm. Expect IV to be 8-byte size*/
|
80void cryptopro_key_meshing(gost_ctx *ctx, unsigned char *iv);
| 86void cryptopro_key_meshing(gost_ctx * ctx, unsigned char *iv);
|
81/* Parameter sets specified in RFC 4357 */ 82extern gost_subst_block GostR3411_94_TestParamSet; 83extern gost_subst_block GostR3411_94_CryptoProParamSet; 84extern gost_subst_block Gost28147_TestParamSet; 85extern gost_subst_block Gost28147_CryptoProParamSetA; 86extern gost_subst_block Gost28147_CryptoProParamSetB; 87extern gost_subst_block Gost28147_CryptoProParamSetC; 88extern gost_subst_block Gost28147_CryptoProParamSetD;
| 87/* Parameter sets specified in RFC 4357 */ 88extern gost_subst_block GostR3411_94_TestParamSet; 89extern gost_subst_block GostR3411_94_CryptoProParamSet; 90extern gost_subst_block Gost28147_TestParamSet; 91extern gost_subst_block Gost28147_CryptoProParamSetA; 92extern gost_subst_block Gost28147_CryptoProParamSetB; 93extern gost_subst_block Gost28147_CryptoProParamSetC; 94extern gost_subst_block Gost28147_CryptoProParamSetD;
|
89extern const byte CryptoProKeyMeshingKey[]; 90typedef unsigned int word32;
| 95extern const byte CryptoProKeyMeshingKey[]; 96typedef unsigned int word32;
|
91 92#endif
| 97 98#endif
|