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 **********************************************************************/ 10 #ifndef GOST89_H 11 # define GOST89_H 12 13 /* Typedef for unsigned 32-bit integer */ 14 # if __LONG_MAX__ > 2147483647L 15 typedef unsigned int u4; 16 # else 17 typedef unsigned long u4; 18 # endif 19 /* Typedef for unsigned 8-bit integer */ 20 typedef unsigned char byte; 21 22 /* Internal representation of GOST substitution blocks */ 23 typedef 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; 33 34 /* Cipher context includes key and preprocessed substitution block */ 35 typedef 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 */ 46 void gost_enc(gost_ctx * ctx, const byte * clear, byte * cipher, int blocks); 47 /* Decrypt several full blocks in ECB mode */ 48 void gost_dec(gost_ctx * ctx, const byte * cipher, byte * clear, int blocks); 49 /* Encrypts several full blocks in CFB mode using 8byte IV */ 50 void gost_enc_cfb(gost_ctx * ctx, const byte * iv, const byte * clear, 51 byte * cipher, int blocks); 52 /* Decrypts several full blocks in CFB mode using 8byte IV */ 53 void gost_dec_cfb(gost_ctx * ctx, const byte * iv, const byte * cipher, 54 byte * clear, int blocks); 55 56 /* Encrypt one block */ 57 void gostcrypt(gost_ctx * c, const byte * in, byte * out); 58 /* Decrypt one block */ 59 void gostdecrypt(gost_ctx * c, const byte * in, byte * out); 60 /* Set key into context */ 61 void gost_key(gost_ctx * ctx, const byte * key); 62 /* Get key from context */ 63 void gost_get_key(gost_ctx * ctx, byte * key); 64 /* Set S-blocks into context */ 65 void gost_init(gost_ctx * ctx, const gost_subst_block * subst_block); 66 /* Clean up context */ 67 void gost_destroy(gost_ctx * ctx); 68 /* Intermediate function used for calculate hash */ 69 void gost_enc_with_key(gost_ctx *, byte * key, byte * inblock, 70 byte * outblock); 71 /* Compute MAC of given length in bits from data */ 72 int 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 */ 78 int 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); 81 /* Perform one step of MAC calculation like gostcrypt */ 82 void mac_block(gost_ctx * c, byte * buffer, const byte * block); 83 /* Extracts MAC value from mac state buffer */ 84 void get_mac(byte * buffer, int nbits, byte * out); 85 /* Implements cryptopro key meshing algorithm. Expect IV to be 8-byte size*/ 86 void cryptopro_key_meshing(gost_ctx * ctx, unsigned char *iv); 87 /* Parameter sets specified in RFC 4357 */ 88 extern gost_subst_block GostR3411_94_TestParamSet; 89 extern gost_subst_block GostR3411_94_CryptoProParamSet; 90 extern gost_subst_block Gost28147_TestParamSet; 91 extern gost_subst_block Gost28147_CryptoProParamSetA; 92 extern gost_subst_block Gost28147_CryptoProParamSetB; 93 extern gost_subst_block Gost28147_CryptoProParamSetC; 94 extern gost_subst_block Gost28147_CryptoProParamSetD; 95 extern const byte CryptoProKeyMeshingKey[]; 96 typedef unsigned int word32; 97 98 #endif 99