aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/block/gost_28147/gost_28147.h
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-01-10 03:41:59 +0000
committerlloyd <[email protected]>2014-01-10 03:41:59 +0000
commit6894dca64c04936d07048c0e8cbf7e25858548c3 (patch)
tree5d572bfde9fe667dab14e3f04b5285a85d8acd95 /src/lib/block/gost_28147/gost_28147.h
parent9efa3be92442afb3d0b69890a36c7f122df18eda (diff)
Move lib into src
Diffstat (limited to 'src/lib/block/gost_28147/gost_28147.h')
-rw-r--r--src/lib/block/gost_28147/gost_28147.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/lib/block/gost_28147/gost_28147.h b/src/lib/block/gost_28147/gost_28147.h
new file mode 100644
index 000000000..34b99197e
--- /dev/null
+++ b/src/lib/block/gost_28147/gost_28147.h
@@ -0,0 +1,84 @@
+/*
+* GOST 28147-89
+* (C) 1999-2009 Jack Lloyd
+*
+* Distributed under the terms of the Botan license
+*/
+
+#ifndef BOTAN_GOST_28147_89_H__
+#define BOTAN_GOST_28147_89_H__
+
+#include <botan/block_cipher.h>
+
+namespace Botan {
+
+/**
+* The GOST 28147-89 block cipher uses a set of 4 bit Sboxes, however
+* the standard does not actually define these Sboxes; they are
+* considered a local configuration issue. Several different sets are
+* used.
+*/
+class BOTAN_DLL GOST_28147_89_Params
+ {
+ public:
+ /**
+ * @param row the row
+ * @param col the column
+ * @return sbox entry at this row/column
+ */
+ byte sbox_entry(size_t row, size_t col) const;
+
+ /**
+ * @return name of this parameter set
+ */
+ std::string param_name() const { return name; }
+
+ /**
+ * Default GOST parameters are the ones given in GOST R 34.11 for
+ * testing purposes; these sboxes are also used by Crypto++, and,
+ * at least according to Wikipedia, the Central Bank of Russian
+ * Federation
+ * @param name of the parameter set
+ */
+ GOST_28147_89_Params(const std::string& name = "R3411_94_TestParam");
+ private:
+ const byte* sboxes;
+ std::string name;
+ };
+
+/**
+* GOST 28147-89
+*/
+class BOTAN_DLL GOST_28147_89 : public Block_Cipher_Fixed_Params<8, 32>
+ {
+ public:
+ void encrypt_n(const byte in[], byte out[], size_t blocks) const;
+ void decrypt_n(const byte in[], byte out[], size_t blocks) const;
+
+ void clear();
+
+ std::string name() const;
+ BlockCipher* clone() const { return new GOST_28147_89(SBOX); }
+
+ /**
+ * @param params the sbox parameters to use
+ */
+ GOST_28147_89(const GOST_28147_89_Params& params);
+ private:
+ GOST_28147_89(const std::vector<u32bit>& other_SBOX) :
+ SBOX(other_SBOX), EK(8) {}
+
+ void key_schedule(const byte[], size_t);
+
+ /*
+ * The sbox is not secret, this is just a larger expansion of it
+ * which we generate at runtime for faster execution
+ */
+ std::vector<u32bit> SBOX;
+
+ secure_vector<u32bit> EK;
+ };
+
+}
+
+#endif