1 /**********************************************************************
3 * Copyright (c) 2005-2006 Cryptocom LTD *
4 * This file is distributed under the same license as OpenSSL *
6 * Declarations for GOST 28147-89 encryption algorithm *
7 * No OpenSSL libraries required to compile and use *
9 **********************************************************************/
13 /* Typedef for unsigned 32-bit integer */
14 # if __LONG_MAX__ > 2147483647L
15 typedef unsigned int u4
;
17 typedef unsigned long u4
;
19 /* Typedef for unsigned 8-bit integer */
20 typedef unsigned char byte
;
22 /* Internal representation of GOST substitution blocks */
34 /* Cipher context includes key and preprocessed substitution block */
37 /* Constant s-boxes -- set up in gost_init(). */
38 u4 k87
[256], k65
[256], k43
[256], k21
[256];
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.
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
);
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
,
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
);
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
78 int gost_mac_iv(gost_ctx
* ctx
, int hmac_len
, const unsigned char *iv
,
79 const unsigned char *data
, unsigned int data_len
,
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
;