aboutsummaryrefslogtreecommitdiffstats
path: root/src/pk_pad/eme1
diff options
context:
space:
mode:
Diffstat (limited to 'src/pk_pad/eme1')
-rw-r--r--src/pk_pad/eme1/eme1.cpp95
-rw-r--r--src/pk_pad/eme1/eme1.h35
-rw-r--r--src/pk_pad/eme1/modinfo.txt10
3 files changed, 140 insertions, 0 deletions
diff --git a/src/pk_pad/eme1/eme1.cpp b/src/pk_pad/eme1/eme1.cpp
new file mode 100644
index 000000000..2ca10c166
--- /dev/null
+++ b/src/pk_pad/eme1/eme1.cpp
@@ -0,0 +1,95 @@
+/*************************************************
+* EME1 Source File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#include <botan/eme1.h>
+#include <botan/lookup.h>
+#include <memory>
+
+namespace Botan {
+
+/*************************************************
+* EME1 Pad Operation *
+*************************************************/
+SecureVector<byte> EME1::pad(const byte in[], u32bit in_length,
+ u32bit key_length,
+ RandomNumberGenerator& rng) const
+ {
+ key_length /= 8;
+
+ if(in_length > key_length - 2*HASH_LENGTH - 1)
+ throw Exception("EME1: Input is too large");
+
+ SecureVector<byte> out(key_length);
+
+ out.clear();
+
+ rng.randomize(out, HASH_LENGTH);
+
+ out.copy(HASH_LENGTH, Phash, Phash.size());
+ out[out.size() - in_length - 1] = 0x01;
+ out.copy(out.size() - in_length, in, in_length);
+ mgf->mask(out, HASH_LENGTH, out + HASH_LENGTH, out.size() - HASH_LENGTH);
+ mgf->mask(out + HASH_LENGTH, out.size() - HASH_LENGTH, out, HASH_LENGTH);
+
+ return out;
+ }
+
+/*************************************************
+* EME1 Unpad Operation *
+*************************************************/
+SecureVector<byte> EME1::unpad(const byte in[], u32bit in_length,
+ u32bit key_length) const
+ {
+ key_length /= 8;
+ if(in_length > key_length)
+ throw Decoding_Error("Invalid EME1 encoding");
+
+ SecureVector<byte> tmp(key_length);
+ tmp.copy(key_length - in_length, in, in_length);
+
+ mgf->mask(tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH, tmp, HASH_LENGTH);
+ mgf->mask(tmp, HASH_LENGTH, tmp + HASH_LENGTH, tmp.size() - HASH_LENGTH);
+
+ for(u32bit j = 0; j != Phash.size(); ++j)
+ if(tmp[j+HASH_LENGTH] != Phash[j])
+ throw Decoding_Error("Invalid EME1 encoding");
+
+ for(u32bit j = HASH_LENGTH + Phash.size(); j != tmp.size(); ++j)
+ {
+ if(tmp[j] && tmp[j] != 0x01)
+ throw Decoding_Error("Invalid EME1 encoding");
+ if(tmp[j] && tmp[j] == 0x01)
+ {
+ SecureVector<byte> retval(tmp + j + 1, tmp.size() - j - 1);
+ return retval;
+ }
+ }
+ throw Decoding_Error("Invalid EME1 encoding");
+ }
+
+/*************************************************
+* Return the max input size for a given key size *
+*************************************************/
+u32bit EME1::maximum_input_size(u32bit keybits) const
+ {
+ if(keybits / 8 > 2*HASH_LENGTH + 1)
+ return ((keybits / 8) - 2*HASH_LENGTH - 1);
+ else
+ return 0;
+ }
+
+/*************************************************
+* EME1 Constructor *
+*************************************************/
+EME1::EME1(const std::string& hash_name, const std::string& mgf_name,
+ const std::string& P) :
+ HASH_LENGTH(output_length_of(hash_name))
+ {
+ mgf = get_mgf(mgf_name + "(" + hash_name + ")");
+ std::auto_ptr<HashFunction> hash(get_hash(hash_name));
+ Phash = hash->process(P);
+ }
+
+}
diff --git a/src/pk_pad/eme1/eme1.h b/src/pk_pad/eme1/eme1.h
new file mode 100644
index 000000000..2a0ac92c4
--- /dev/null
+++ b/src/pk_pad/eme1/eme1.h
@@ -0,0 +1,35 @@
+/*************************************************
+* EME1 Header File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#ifndef BOTAN_EME1_H__
+#define BOTAN_EME1_H__
+
+#include <botan/pk_util.h>
+
+namespace Botan {
+
+/*************************************************
+* EME1 *
+*************************************************/
+class BOTAN_DLL EME1 : public EME
+ {
+ public:
+ u32bit maximum_input_size(u32bit) const;
+
+ EME1(const std::string&, const std::string&, const std::string& = "");
+ ~EME1() { delete mgf; }
+ private:
+ SecureVector<byte> pad(const byte[], u32bit, u32bit,
+ RandomNumberGenerator&) const;
+ SecureVector<byte> unpad(const byte[], u32bit, u32bit) const;
+
+ const u32bit HASH_LENGTH;
+ SecureVector<byte> Phash;
+ MGF* mgf;
+ };
+
+}
+
+#endif
diff --git a/src/pk_pad/eme1/modinfo.txt b/src/pk_pad/eme1/modinfo.txt
new file mode 100644
index 000000000..5383d59b6
--- /dev/null
+++ b/src/pk_pad/eme1/modinfo.txt
@@ -0,0 +1,10 @@
+realname "EME1"
+
+define EME1
+
+load_on auto
+
+<add>
+eme1.h
+eme1.cpp
+</add>