aboutsummaryrefslogtreecommitdiffstats
path: root/src/pk
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-09-28 21:16:31 +0000
committerlloyd <[email protected]>2008-09-28 21:16:31 +0000
commit9ebc60c266c37722e83ca7482f1516fc3e8bf6d3 (patch)
tree8328dfeaa564a552e00a5d07234e37d0e303f157 /src/pk
parent98ef58194ce6b954b44acfa218c1aa49c6234aad (diff)
Modularize IF family PK algorithms (integer factorization; RSA and RW base
class). Add many missing modinfo.txts that I had not checked in. Oops.
Diffstat (limited to 'src/pk')
-rw-r--r--src/pk/dh/modinfo.txt10
-rw-r--r--src/pk/dsa/modinfo.txt10
-rw-r--r--src/pk/elgamal/modinfo.txt10
-rw-r--r--src/pk/if_algo/if_algo.cpp213
-rw-r--r--src/pk/if_algo/if_algo.h58
-rw-r--r--src/pk/if_algo/modinfo.txt10
-rw-r--r--src/pk/nr/modinfo.txt10
-rw-r--r--src/pk/rsa/modinfo.txt14
-rw-r--r--src/pk/rw/modinfo.txt14
9 files changed, 349 insertions, 0 deletions
diff --git a/src/pk/dh/modinfo.txt b/src/pk/dh/modinfo.txt
new file mode 100644
index 000000000..e3bbe3f32
--- /dev/null
+++ b/src/pk/dh/modinfo.txt
@@ -0,0 +1,10 @@
+realname "DH"
+
+define DH
+
+load_on auto
+
+<add>
+dh.cpp
+dh.h
+</add>
diff --git a/src/pk/dsa/modinfo.txt b/src/pk/dsa/modinfo.txt
new file mode 100644
index 000000000..77bb48396
--- /dev/null
+++ b/src/pk/dsa/modinfo.txt
@@ -0,0 +1,10 @@
+realname "DSA"
+
+define DSA
+
+load_on auto
+
+<add>
+dsa.cpp
+dsa.h
+</add>
diff --git a/src/pk/elgamal/modinfo.txt b/src/pk/elgamal/modinfo.txt
new file mode 100644
index 000000000..df38d48d6
--- /dev/null
+++ b/src/pk/elgamal/modinfo.txt
@@ -0,0 +1,10 @@
+realname "ElGamal"
+
+define ELGAMAL
+
+load_on auto
+
+<add>
+elgamal.cpp
+elgamal.h
+</add>
diff --git a/src/pk/if_algo/if_algo.cpp b/src/pk/if_algo/if_algo.cpp
new file mode 100644
index 000000000..929f488fd
--- /dev/null
+++ b/src/pk/if_algo/if_algo.cpp
@@ -0,0 +1,213 @@
+/*************************************************
+* IF Scheme Source File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#include <botan/if_algo.h>
+#include <botan/numthry.h>
+#include <botan/der_enc.h>
+#include <botan/ber_dec.h>
+
+namespace Botan {
+
+/*************************************************
+* Return the X.509 public key encoder *
+*************************************************/
+X509_Encoder* IF_Scheme_PublicKey::x509_encoder() const
+ {
+ class IF_Scheme_Encoder : public X509_Encoder
+ {
+ public:
+ AlgorithmIdentifier alg_id() const
+ {
+ return AlgorithmIdentifier(key->get_oid(),
+ AlgorithmIdentifier::USE_NULL_PARAM);
+ }
+
+ MemoryVector<byte> key_bits() const
+ {
+ return DER_Encoder()
+ .start_cons(SEQUENCE)
+ .encode(key->n)
+ .encode(key->e)
+ .end_cons()
+ .get_contents();
+ }
+
+ IF_Scheme_Encoder(const IF_Scheme_PublicKey* k) : key(k) {}
+ private:
+ const IF_Scheme_PublicKey* key;
+ };
+
+ return new IF_Scheme_Encoder(this);
+ }
+
+/*************************************************
+* Return the X.509 public key decoder *
+*************************************************/
+X509_Decoder* IF_Scheme_PublicKey::x509_decoder()
+ {
+ class IF_Scheme_Decoder : public X509_Decoder
+ {
+ public:
+ void alg_id(const AlgorithmIdentifier&) {}
+
+ void key_bits(const MemoryRegion<byte>& bits)
+ {
+ BER_Decoder(bits)
+ .start_cons(SEQUENCE)
+ .decode(key->n)
+ .decode(key->e)
+ .verify_end()
+ .end_cons();
+
+ key->X509_load_hook();
+ }
+
+ IF_Scheme_Decoder(IF_Scheme_PublicKey* k) : key(k) {}
+ private:
+ IF_Scheme_PublicKey* key;
+ };
+
+ return new IF_Scheme_Decoder(this);
+ }
+
+/*************************************************
+* Return the PKCS #8 public key encoder *
+*************************************************/
+PKCS8_Encoder* IF_Scheme_PrivateKey::pkcs8_encoder() const
+ {
+ class IF_Scheme_Encoder : public PKCS8_Encoder
+ {
+ public:
+ AlgorithmIdentifier alg_id() const
+ {
+ return AlgorithmIdentifier(key->get_oid(),
+ AlgorithmIdentifier::USE_NULL_PARAM);
+ }
+
+ MemoryVector<byte> key_bits() const
+ {
+ return DER_Encoder()
+ .start_cons(SEQUENCE)
+ .encode(static_cast<u32bit>(0))
+ .encode(key->n)
+ .encode(key->e)
+ .encode(key->d)
+ .encode(key->p)
+ .encode(key->q)
+ .encode(key->d1)
+ .encode(key->d2)
+ .encode(key->c)
+ .end_cons()
+ .get_contents();
+ }
+
+ IF_Scheme_Encoder(const IF_Scheme_PrivateKey* k) : key(k) {}
+ private:
+ const IF_Scheme_PrivateKey* key;
+ };
+
+ return new IF_Scheme_Encoder(this);
+ }
+
+/*************************************************
+* Return the PKCS #8 public key decoder *
+*************************************************/
+PKCS8_Decoder* IF_Scheme_PrivateKey::pkcs8_decoder(RandomNumberGenerator& rng)
+ {
+ class IF_Scheme_Decoder : public PKCS8_Decoder
+ {
+ public:
+ void alg_id(const AlgorithmIdentifier&) {}
+
+ void key_bits(const MemoryRegion<byte>& bits)
+ {
+ u32bit version;
+
+ BER_Decoder(bits)
+ .start_cons(SEQUENCE)
+ .decode(version)
+ .decode(key->n)
+ .decode(key->e)
+ .decode(key->d)
+ .decode(key->p)
+ .decode(key->q)
+ .decode(key->d1)
+ .decode(key->d2)
+ .decode(key->c)
+ .end_cons();
+
+ if(version != 0)
+ throw Decoding_Error("Unknown PKCS #1 key format version");
+
+ key->PKCS8_load_hook(rng);
+ }
+
+ IF_Scheme_Decoder(IF_Scheme_PrivateKey* k, RandomNumberGenerator& r) :
+ key(k), rng(r) {}
+ private:
+ IF_Scheme_PrivateKey* key;
+ RandomNumberGenerator& rng;
+ };
+
+ return new IF_Scheme_Decoder(this, rng);
+ }
+
+/*************************************************
+* Algorithm Specific X.509 Initialization Code *
+*************************************************/
+void IF_Scheme_PublicKey::X509_load_hook()
+ {
+ core = IF_Core(e, n);
+ }
+
+/*************************************************
+* Algorithm Specific PKCS #8 Initialization Code *
+*************************************************/
+void IF_Scheme_PrivateKey::PKCS8_load_hook(RandomNumberGenerator& rng,
+ bool generated)
+ {
+ if(n == 0) n = p * q;
+ if(d1 == 0) d1 = d % (p - 1);
+ if(d2 == 0) d2 = d % (q - 1);
+ if(c == 0) c = inverse_mod(q, p);
+
+ core = IF_Core(rng, e, n, d, p, q, d1, d2, c);
+
+ if(generated)
+ gen_check(rng);
+ else
+ load_check(rng);
+ }
+
+/*************************************************
+* Check IF Scheme Public Parameters *
+*************************************************/
+bool IF_Scheme_PublicKey::check_key(RandomNumberGenerator&, bool) const
+ {
+ if(n < 35 || n.is_even() || e < 2)
+ return false;
+ return true;
+ }
+
+/*************************************************
+* Check IF Scheme Private Parameters *
+*************************************************/
+bool IF_Scheme_PrivateKey::check_key(RandomNumberGenerator& rng,
+ bool strong) const
+ {
+ if(n < 35 || n.is_even() || e < 2 || d < 2 || p < 3 || q < 3 || p*q != n)
+ return false;
+
+ if(!strong)
+ return true;
+
+ if(d1 != d % (p - 1) || d2 != d % (q - 1) || c != inverse_mod(q, p))
+ return false;
+ if(!check_prime(p, rng) || !check_prime(q, rng))
+ return false;
+ return true;
+ }
+
+}
diff --git a/src/pk/if_algo/if_algo.h b/src/pk/if_algo/if_algo.h
new file mode 100644
index 000000000..c5da4073e
--- /dev/null
+++ b/src/pk/if_algo/if_algo.h
@@ -0,0 +1,58 @@
+/*************************************************
+* IF Scheme Header File *
+* (C) 1999-2007 Jack Lloyd *
+*************************************************/
+
+#ifndef BOTAN_IF_ALGO_H__
+#define BOTAN_IF_ALGO_H__
+
+#include <botan/x509_key.h>
+#include <botan/pkcs8.h>
+#include <botan/pk_core.h>
+
+namespace Botan {
+
+/*************************************************
+* IF Public Key *
+*************************************************/
+class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key
+ {
+ public:
+ bool check_key(RandomNumberGenerator& rng, bool) const;
+
+ const BigInt& get_n() const { return n; }
+ const BigInt& get_e() const { return e; }
+
+ u32bit max_input_bits() const { return (n.bits() - 1); }
+
+ X509_Encoder* x509_encoder() const;
+ X509_Decoder* x509_decoder();
+ protected:
+ virtual void X509_load_hook();
+ BigInt n, e;
+ IF_Core core;
+ };
+
+/*************************************************
+* IF Private Key *
+*************************************************/
+class BOTAN_DLL IF_Scheme_PrivateKey : public virtual IF_Scheme_PublicKey,
+ public virtual Private_Key
+ {
+ public:
+ bool check_key(RandomNumberGenerator& rng, bool) const;
+
+ const BigInt& get_p() const { return p; }
+ const BigInt& get_q() const { return q; }
+ const BigInt& get_d() const { return d; }
+
+ PKCS8_Encoder* pkcs8_encoder() const;
+ PKCS8_Decoder* pkcs8_decoder(RandomNumberGenerator&);
+ protected:
+ virtual void PKCS8_load_hook(RandomNumberGenerator&, bool = false);
+ BigInt d, p, q, d1, d2, c;
+ };
+
+}
+
+#endif
diff --git a/src/pk/if_algo/modinfo.txt b/src/pk/if_algo/modinfo.txt
new file mode 100644
index 000000000..f4ddd565f
--- /dev/null
+++ b/src/pk/if_algo/modinfo.txt
@@ -0,0 +1,10 @@
+realname "Integer Factorization Algorithms"
+
+define IF_PUBLIC_KEY_FAMILY
+
+load_on auto
+
+<add>
+if_algo.cpp
+if_algo.h
+</add>
diff --git a/src/pk/nr/modinfo.txt b/src/pk/nr/modinfo.txt
new file mode 100644
index 000000000..4cb1b1bf5
--- /dev/null
+++ b/src/pk/nr/modinfo.txt
@@ -0,0 +1,10 @@
+realname "Nyberg-Rueppel"
+
+define NR
+
+load_on auto
+
+<add>
+nr.cpp
+nr.h
+</add>
diff --git a/src/pk/rsa/modinfo.txt b/src/pk/rsa/modinfo.txt
new file mode 100644
index 000000000..8125d7efb
--- /dev/null
+++ b/src/pk/rsa/modinfo.txt
@@ -0,0 +1,14 @@
+realname "RSA"
+
+define RSA
+
+load_on auto
+
+<add>
+rsa.cpp
+rsa.h
+</add>
+
+<requires>
+if_algo
+</requires>
diff --git a/src/pk/rw/modinfo.txt b/src/pk/rw/modinfo.txt
new file mode 100644
index 000000000..dee83c95d
--- /dev/null
+++ b/src/pk/rw/modinfo.txt
@@ -0,0 +1,14 @@
+realname "Rabin-Williams"
+
+define RW
+
+load_on auto
+
+<add>
+rw.cpp
+rw.h
+</add>
+
+<requires>
+if_algo
+</requires>