aboutsummaryrefslogtreecommitdiffstats
path: root/src/pk/elgamal/elgamal.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-28 20:41:59 +0000
committerlloyd <[email protected]>2008-09-28 20:41:59 +0000
commit062e7a3dc98af064792967cfac44f61b0e7b0d8a (patch)
treed8902fae073fd8268424ab804ae9d26b1fd3339d /src/pk/elgamal/elgamal.cpp
parent25995ac07f9630b3e1da2c503054b9307b3fd788 (diff)
Modularize the public key algorithms, though currently a great deal of
the underlying implementation goop remains in the core library instead of being shunted off, due to various dependencies it has (most of which it shouldn't).
Diffstat (limited to 'src/pk/elgamal/elgamal.cpp')
-rw-r--r--src/pk/elgamal/elgamal.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/pk/elgamal/elgamal.cpp b/src/pk/elgamal/elgamal.cpp
new file mode 100644
index 000000000..ea0d581b0
--- /dev/null
+++ b/src/pk/elgamal/elgamal.cpp
@@ -0,0 +1,121 @@
+/*************************************************
+* ElGamal Source File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#include <botan/elgamal.h>
+#include <botan/numthry.h>
+#include <botan/keypair.h>
+#include <botan/util.h>
+
+namespace Botan {
+
+/*************************************************
+* ElGamal_PublicKey Constructor *
+*************************************************/
+ElGamal_PublicKey::ElGamal_PublicKey(const DL_Group& grp, const BigInt& y1)
+ {
+ group = grp;
+ y = y1;
+ X509_load_hook();
+ }
+
+/*************************************************
+* Algorithm Specific X.509 Initialization Code *
+*************************************************/
+void ElGamal_PublicKey::X509_load_hook()
+ {
+ core = ELG_Core(group, y);
+ }
+
+/*************************************************
+* ElGamal Encryption Function *
+*************************************************/
+SecureVector<byte>
+ElGamal_PublicKey::encrypt(const byte in[], u32bit length,
+ RandomNumberGenerator& rng) const
+ {
+ BigInt k(rng, 2 * dl_work_factor(group_p().bits()));
+ return core.encrypt(in, length, k);
+ }
+
+/*************************************************
+* Return the maximum input size in bits *
+*************************************************/
+u32bit ElGamal_PublicKey::max_input_bits() const
+ {
+ return (group_p().bits() - 1);
+ }
+
+/*************************************************
+* ElGamal_PrivateKey Constructor *
+*************************************************/
+ElGamal_PrivateKey::ElGamal_PrivateKey(RandomNumberGenerator& rng,
+ const DL_Group& grp,
+ const BigInt& x_arg)
+ {
+ group = grp;
+ x = x_arg;
+
+ if(x == 0)
+ {
+ x.randomize(rng, 2 * dl_work_factor(group_p().bits()));
+ PKCS8_load_hook(rng, true);
+ }
+ else
+ PKCS8_load_hook(rng, false);
+ }
+
+/*************************************************
+* Algorithm Specific PKCS #8 Initialization Code *
+*************************************************/
+void ElGamal_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng,
+ bool generated)
+ {
+ if(y == 0)
+ y = power_mod(group_g(), x, group_p());
+ core = ELG_Core(rng, group, y, x);
+
+ if(generated)
+ gen_check(rng);
+ else
+ load_check(rng);
+ }
+
+/*************************************************
+* ElGamal Decryption Function *
+*************************************************/
+SecureVector<byte> ElGamal_PrivateKey::decrypt(const byte in[],
+ u32bit length) const
+ {
+ return core.decrypt(in, length);
+ }
+
+/*************************************************
+* Check Private ElGamal Parameters *
+*************************************************/
+bool ElGamal_PrivateKey::check_key(RandomNumberGenerator& rng,
+ bool strong) const
+ {
+ if(!DL_Scheme_PrivateKey::check_key(rng, strong))
+ return false;
+
+ if(!strong)
+ return true;
+
+ try
+ {
+ KeyPair::check_key(rng,
+ get_pk_encryptor(*this, "EME1(SHA-1)"),
+ get_pk_decryptor(*this, "EME1(SHA-1)")
+ );
+ }
+ catch(Self_Test_Failure)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+}