diff options
author | lloyd <[email protected]> | 2008-09-28 21:16:31 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-09-28 21:16:31 +0000 |
commit | 9ebc60c266c37722e83ca7482f1516fc3e8bf6d3 (patch) | |
tree | 8328dfeaa564a552e00a5d07234e37d0e303f157 /src/pk | |
parent | 98ef58194ce6b954b44acfa218c1aa49c6234aad (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.txt | 10 | ||||
-rw-r--r-- | src/pk/dsa/modinfo.txt | 10 | ||||
-rw-r--r-- | src/pk/elgamal/modinfo.txt | 10 | ||||
-rw-r--r-- | src/pk/if_algo/if_algo.cpp | 213 | ||||
-rw-r--r-- | src/pk/if_algo/if_algo.h | 58 | ||||
-rw-r--r-- | src/pk/if_algo/modinfo.txt | 10 | ||||
-rw-r--r-- | src/pk/nr/modinfo.txt | 10 | ||||
-rw-r--r-- | src/pk/rsa/modinfo.txt | 14 | ||||
-rw-r--r-- | src/pk/rw/modinfo.txt | 14 |
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> |