aboutsummaryrefslogtreecommitdiff
path: root/gost89.h
diff options
context:
space:
mode:
authorDmitry Belyavsky <beldmit@manul.localdomain>2015-08-14 20:50:01 +0300
committerDmitry Belyavsky <beldmit@manul.localdomain>2015-08-14 20:50:01 +0300
commitc98ba9d03213d0c63d6874539d59f7b55fbc3fae (patch)
treea27387a57d4bce07cc89f18a00687e7c24fa7ea2 /gost89.h
parent6bae2877d22e1bb30b20a7b09d6e5f8399e0e98b (diff)
downloadgost-engine-c98ba9d03213d0c63d6874539d59f7b55fbc3fae.zip
gost-engine-c98ba9d03213d0c63d6874539d59f7b55fbc3fae.tar.gz
gost-engine-c98ba9d03213d0c63d6874539d59f7b55fbc3fae.tar.bz2
Initial commit
Diffstat (limited to 'gost89.h')
-rw-r--r--gost89.h98
1 files changed, 98 insertions, 0 deletions
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