diff options
author | lloyd <[email protected]> | 2010-03-02 04:01:18 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-03-02 04:01:18 +0000 |
commit | b822cc605b324bf449fb3e0a2185b83cd4a157e3 (patch) | |
tree | f59b57f65e30a0c025c0c4265e591a9f507ac0ff | |
parent | 510128ffd3789301305c7f1fe52a11b238a6a60b (diff) |
Add some simple constructors to the EC_ base key types to simplify
the various implementations
-rw-r--r-- | src/pubkey/ecc_key/ecc_key.cpp | 38 | ||||
-rw-r--r-- | src/pubkey/ecc_key/ecc_key.h | 23 | ||||
-rw-r--r-- | src/pubkey/ecdh/ecdh.cpp | 17 | ||||
-rw-r--r-- | src/pubkey/ecdh/ecdh.h | 30 | ||||
-rw-r--r-- | src/pubkey/ecdsa/ecdsa.cpp | 33 | ||||
-rw-r--r-- | src/pubkey/ecdsa/ecdsa.h | 10 | ||||
-rw-r--r-- | src/pubkey/gost_3410/gost_3410.cpp | 25 | ||||
-rw-r--r-- | src/pubkey/gost_3410/gost_3410.h | 8 |
8 files changed, 78 insertions, 106 deletions
diff --git a/src/pubkey/ecc_key/ecc_key.cpp b/src/pubkey/ecc_key/ecc_key.cpp index 8273256cf..10968fa7e 100644 --- a/src/pubkey/ecc_key/ecc_key.cpp +++ b/src/pubkey/ecc_key/ecc_key.cpp @@ -17,6 +17,24 @@ namespace Botan { +EC_PublicKey::EC_PublicKey(const EC_Domain_Params& dom_par, + const PointGFp& pub_point) : + domain_params(dom_par), public_key(pub_point), + domain_encoding(EC_DOMPAR_ENC_EXPLICIT) + { + if(domain().get_curve() != public_point().get_curve()) + throw Invalid_Argument("EC_PublicKey: curve mismatch in constructor"); + + try + { + public_key.check_invariants(); + } + catch(Illegal_Point) + { + throw Invalid_State("Public key failed invariant check"); + } + } + void EC_PublicKey::X509_load_hook() { try @@ -97,7 +115,7 @@ void EC_PublicKey::set_parameter_encoding(EC_Domain_Params_Encoding form) const BigInt& EC_PrivateKey::private_value() const { if(private_key == 0) - throw Invalid_State("cannot use EC_PrivateKey when private key is uninitialized"); + throw Invalid_State("EC_PrivateKey::private_value - uninitialized"); return private_key; } @@ -105,10 +123,20 @@ const BigInt& EC_PrivateKey::private_value() const /** * EC_PrivateKey generator **/ -void EC_PrivateKey::generate_private_key(RandomNumberGenerator& rng) +EC_PrivateKey::EC_PrivateKey(const EC_Domain_Params& dom_par, + const BigInt& priv_key) : + EC_PublicKey(dom_par, dom_par.get_base_point() * private_key), + private_key(priv_key) + { + } + +/** +* EC_PrivateKey generator +**/ +EC_PrivateKey::EC_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& dom_par) { - if(!domain().initialized()) - throw Invalid_State("Cannot generate new EC key, domain unset"); + domain_params = dom_par; private_key = BigInt::random_integer(rng, 1, domain().get_order()); public_key = domain().get_base_point() * private_key; @@ -119,7 +147,7 @@ void EC_PrivateKey::generate_private_key(RandomNumberGenerator& rng) } catch(Illegal_Point& e) { - throw Invalid_State(algo_name() + " key generation failed"); + throw Internal_Error("ECC private key generation failed"); } } diff --git a/src/pubkey/ecc_key/ecc_key.h b/src/pubkey/ecc_key/ecc_key.h index 073597bc9..653f97cab 100644 --- a/src/pubkey/ecc_key/ecc_key.h +++ b/src/pubkey/ecc_key/ecc_key.h @@ -58,7 +58,8 @@ class BOTAN_DLL EC_PublicKey : public virtual Public_Key * Get the domain parameter encoding to be used when encoding this key. * @result the encoding to use */ - EC_Domain_Params_Encoding domain_format() const { return domain_encoding; } + EC_Domain_Params_Encoding domain_format() const + { return domain_encoding; } /** * Get an x509_encoder that can be used to encode this key. @@ -74,6 +75,10 @@ class BOTAN_DLL EC_PublicKey : public virtual Public_Key X509_Decoder* x509_decoder(); EC_PublicKey() : domain_encoding(EC_DOMPAR_ENC_EXPLICIT) {} + + EC_PublicKey(const EC_Domain_Params& dom_par, + const PointGFp& pub_point); + virtual ~EC_PublicKey() {} protected: virtual void X509_load_hook(); @@ -86,9 +91,19 @@ class BOTAN_DLL EC_PublicKey : public virtual Public_Key /** * This abstract class represents general EC Private Keys */ -class BOTAN_DLL EC_PrivateKey : public virtual EC_PublicKey, public virtual Private_Key +class BOTAN_DLL EC_PrivateKey : public virtual EC_PublicKey, + public virtual Private_Key { public: + EC_PrivateKey() {} + + EC_PrivateKey(const EC_Domain_Params& domain, + const BigInt& private_key); + + EC_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& domain); + + virtual ~EC_PrivateKey() {} /** * Get an PKCS#8 encoder that can be used to encoded this key. @@ -108,13 +123,9 @@ class BOTAN_DLL EC_PrivateKey : public virtual EC_PublicKey, public virtual Priv * @result the private key value of this key object */ const BigInt& private_value() const; - - virtual ~EC_PrivateKey() {} protected: virtual void PKCS8_load_hook(bool = false); - void generate_private_key(RandomNumberGenerator&); - BigInt private_key; }; diff --git a/src/pubkey/ecdh/ecdh.cpp b/src/pubkey/ecdh/ecdh.cpp index e27676d46..7577a8569 100644 --- a/src/pubkey/ecdh/ecdh.cpp +++ b/src/pubkey/ecdh/ecdh.cpp @@ -11,23 +11,6 @@ namespace Botan { -ECDH_PublicKey::ECDH_PublicKey(const EC_Domain_Params& dom_par, - const PointGFp& pub_point) - { - domain_params = dom_par; - public_key = pub_point; - - if(domain().get_curve() != public_point().get_curve()) - throw Invalid_Argument("ECDH_PublicKey: curve mismatch in constructor"); - } - -ECDH_PrivateKey::ECDH_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& dom_pars) - { - domain_params = dom_pars; - generate_private_key(rng); - } - /** * Derive a key */ diff --git a/src/pubkey/ecdh/ecdh.h b/src/pubkey/ecdh/ecdh.h index 632083dcc..630237edf 100644 --- a/src/pubkey/ecdh/ecdh.h +++ b/src/pubkey/ecdh/ecdh.h @@ -22,12 +22,6 @@ class BOTAN_DLL ECDH_PublicKey : public virtual EC_PublicKey public: /** - * Get this keys algorithm name. - * @result this keys algorithm name - */ - std::string algo_name() const { return "ECDH"; } - - /** * Default constructor. Use this one if you want to later fill * this object with data from an encoded key. */ @@ -39,7 +33,14 @@ class BOTAN_DLL ECDH_PublicKey : public virtual EC_PublicKey * @param public_point the public point defining this key */ ECDH_PublicKey(const EC_Domain_Params& dom_par, - const PointGFp& public_point); + const PointGFp& public_point) : + EC_PublicKey(dom_par, public_point) {} + + /** + * Get this keys algorithm name. + * @result this keys algorithm name + */ + std::string algo_name() const { return "ECDH"; } /** * Get the maximum number of bits allowed to be fed to this key. @@ -60,18 +61,19 @@ class BOTAN_DLL ECDH_PrivateKey : public ECDH_PublicKey, public: /** - * Generate a new private key - * @param the domain parameters to used for this key - */ - ECDH_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& dom_pars); - - /** * Default constructor. Use this one if you want to later fill * this object with data from an encoded key. */ ECDH_PrivateKey() {} + /** + * Generate a new private key + * @param the domain parameters to used for this key + */ + ECDH_PrivateKey(RandomNumberGenerator& rng, + const EC_Domain_Params& domain) : + EC_PrivateKey(rng, domain) {} + MemoryVector<byte> public_value() const { return EC2OSP(public_point(), PointGFp::UNCOMPRESSED); } diff --git a/src/pubkey/ecdsa/ecdsa.cpp b/src/pubkey/ecdsa/ecdsa.cpp index f5ded5aa6..d245543f7 100644 --- a/src/pubkey/ecdsa/ecdsa.cpp +++ b/src/pubkey/ecdsa/ecdsa.cpp @@ -11,39 +11,6 @@ namespace Botan { -ECDSA_PublicKey::ECDSA_PublicKey(const EC_Domain_Params& dom_par, - const PointGFp& pub_point) - { - domain_encoding = EC_DOMPAR_ENC_EXPLICIT; - domain_params = dom_par; - public_key = pub_point; - } - -ECDSA_PrivateKey::ECDSA_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& dom_pars) - { - domain_params = dom_pars; - generate_private_key(rng); - } - -ECDSA_PrivateKey::ECDSA_PrivateKey(const EC_Domain_Params& dom_pars, - const BigInt& x) - { - domain_params = dom_pars; - - private_key = x; - public_key = domain().get_base_point() * x; - - try - { - public_key.check_invariants(); - } - catch(Illegal_Point& e) - { - throw Invalid_State("ECDSA key generation failed"); - } - } - bool ECDSA_PublicKey::verify(const byte msg[], u32bit msg_len, const byte sig[], u32bit sig_len) const { diff --git a/src/pubkey/ecdsa/ecdsa.h b/src/pubkey/ecdsa/ecdsa.h index 447bc3758..e7f29b600 100644 --- a/src/pubkey/ecdsa/ecdsa.h +++ b/src/pubkey/ecdsa/ecdsa.h @@ -62,7 +62,9 @@ class BOTAN_DLL ECDSA_PublicKey : public virtual EC_PublicKey, * @param public_point the public point defining this key */ ECDSA_PublicKey(const EC_Domain_Params& dom_par, - const PointGFp& public_point); // sets core + const PointGFp& public_point) : + EC_PublicKey(dom_par, public_point) {} + }; /** @@ -84,14 +86,16 @@ class BOTAN_DLL ECDSA_PrivateKey : public ECDSA_PublicKey, * @param the domain parameters to used for this key */ ECDSA_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& domain); + const EC_Domain_Params& domain) : + EC_PrivateKey(rng, domain) {} /** * Load a private key * @param domain parameters * @param x the private key */ - ECDSA_PrivateKey(const EC_Domain_Params& domain, const BigInt& x); + ECDSA_PrivateKey(const EC_Domain_Params& domain, const BigInt& x) : + EC_PrivateKey(domain, x) {} /** * Sign a message with this key. diff --git a/src/pubkey/gost_3410/gost_3410.cpp b/src/pubkey/gost_3410/gost_3410.cpp index 1c3faca7a..8dd72dfc1 100644 --- a/src/pubkey/gost_3410/gost_3410.cpp +++ b/src/pubkey/gost_3410/gost_3410.cpp @@ -16,31 +16,6 @@ namespace Botan { -GOST_3410_PrivateKey::GOST_3410_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& dom_pars) - { - domain_params = dom_pars; - generate_private_key(rng); - } - -GOST_3410_PrivateKey::GOST_3410_PrivateKey(const EC_Domain_Params& dom_pars, - const BigInt& x) - { - domain_params = dom_pars; - - private_key = x; - public_key = domain().get_base_point() * private_key; - - try - { - public_key.check_invariants(); - } - catch(Illegal_Point) - { - throw Invalid_State("GOST_3410 key generation failed"); - } - } - X509_Encoder* GOST_3410_PublicKey::x509_encoder() const { class GOST_3410_Key_Encoder : public X509_Encoder diff --git a/src/pubkey/gost_3410/gost_3410.h b/src/pubkey/gost_3410/gost_3410.h index 1d3430753..8104cbb75 100644 --- a/src/pubkey/gost_3410/gost_3410.h +++ b/src/pubkey/gost_3410/gost_3410.h @@ -63,7 +63,7 @@ class BOTAN_DLL GOST_3410_PublicKey : public virtual EC_PublicKey, * @param public_point the public point defining this key */ GOST_3410_PublicKey(const EC_Domain_Params& dom_par, - const PointGFp& public_point); // sets core + const PointGFp& public_point); /** * Get an x509_encoder that can be used to encode this key. @@ -98,14 +98,16 @@ class BOTAN_DLL GOST_3410_PrivateKey : public GOST_3410_PublicKey, * @param the domain parameters to used for this key */ GOST_3410_PrivateKey(RandomNumberGenerator& rng, - const EC_Domain_Params& domain); + const EC_Domain_Params& domain) : + EC_PrivateKey(rng, domain) {} /** * Load a private key * @param domain parameters * @param x the private key */ - GOST_3410_PrivateKey(const EC_Domain_Params& domain, const BigInt& x); + GOST_3410_PrivateKey(const EC_Domain_Params& domain, const BigInt& x) : + EC_PrivateKey(domain, x) {} /** * Sign a message with this key. |