diff options
author | lloyd <[email protected]> | 2010-03-04 02:07:14 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-03-04 02:07:14 +0000 |
commit | c58d02b152b11bae78985aa441560f49ef6b5d09 (patch) | |
tree | c01bbbbe6ee86f60faf238a271c28dd03326ac5c | |
parent | f109029f5f1cc33512091e228e6ee6532058c42f (diff) |
Add a new function to public key x509_subject_public_key which returns
what x509_encoder()->key_bits() used to return. This is much simpler
than using the explicit encoder objects. Remove X509_Encoder entirely.
-rw-r--r-- | checks/x509.cpp | 8 | ||||
-rw-r--r-- | src/pubkey/dl_algo/dl_algo.cpp | 25 | ||||
-rw-r--r-- | src/pubkey/dl_algo/dl_algo.h | 8 | ||||
-rw-r--r-- | src/pubkey/ecc_key/ecc_key.cpp | 28 | ||||
-rw-r--r-- | src/pubkey/ecc_key/ecc_key.h | 8 | ||||
-rw-r--r-- | src/pubkey/gost_3410/gost_3410.cpp | 35 | ||||
-rw-r--r-- | src/pubkey/gost_3410/gost_3410.h | 8 | ||||
-rw-r--r-- | src/pubkey/if_algo/if_algo.cpp | 35 | ||||
-rw-r--r-- | src/pubkey/if_algo/if_algo.h | 3 | ||||
-rw-r--r-- | src/pubkey/pk_codecs/x509_key.cpp | 8 | ||||
-rw-r--r-- | src/pubkey/pk_codecs/x509_key.h | 11 | ||||
-rw-r--r-- | src/pubkey/pk_keys.h | 5 |
12 files changed, 36 insertions, 146 deletions
diff --git a/checks/x509.cpp b/checks/x509.cpp index 0891d8b35..96d99eee2 100644 --- a/checks/x509.cpp +++ b/checks/x509.cpp @@ -40,15 +40,11 @@ namespace { u64bit key_id(const Public_Key* key) { - std::auto_ptr<X509_Encoder> encoder(key->x509_encoder()); - if(!encoder.get()) - throw Internal_Error("Public_Key:key_id: No encoder found"); - Pipe pipe(new Hash_Filter("SHA-1", 8)); pipe.start_msg(); pipe.write(key->algo_name()); - pipe.write(encoder->alg_id().parameters); - pipe.write(encoder->key_bits()); + pipe.write(key->algorithm_identifier().parameters); + pipe.write(key->x509_subject_public_key()); pipe.end_msg(); SecureVector<byte> output = pipe.read_all(); diff --git a/src/pubkey/dl_algo/dl_algo.cpp b/src/pubkey/dl_algo/dl_algo.cpp index beaf10695..b8f96bcf1 100644 --- a/src/pubkey/dl_algo/dl_algo.cpp +++ b/src/pubkey/dl_algo/dl_algo.cpp @@ -18,30 +18,9 @@ AlgorithmIdentifier DL_Scheme_PublicKey::algorithm_identifier() const group.DER_encode(group_format())); } -/* -* Return the X.509 public key encoder -*/ -X509_Encoder* DL_Scheme_PublicKey::x509_encoder() const +MemoryVector<byte> DL_Scheme_PublicKey::x509_subject_public_key() const { - class DL_Scheme_Encoder : public X509_Encoder - { - public: - AlgorithmIdentifier alg_id() const - { - return key->algorithm_identifier(); - } - - MemoryVector<byte> key_bits() const - { - return DER_Encoder().encode(key->y).get_contents(); - } - - DL_Scheme_Encoder(const DL_Scheme_PublicKey* k) : key(k) {} - private: - const DL_Scheme_PublicKey* key; - }; - - return new DL_Scheme_Encoder(this); + return DER_Encoder().encode(y).get_contents(); } /* diff --git a/src/pubkey/dl_algo/dl_algo.h b/src/pubkey/dl_algo/dl_algo.h index 1fa99a49b..63875d27b 100644 --- a/src/pubkey/dl_algo/dl_algo.h +++ b/src/pubkey/dl_algo/dl_algo.h @@ -25,6 +25,8 @@ class BOTAN_DLL DL_Scheme_PublicKey : public virtual Public_Key AlgorithmIdentifier algorithm_identifier() const; + MemoryVector<byte> x509_subject_public_key() const; + /** * Get the DL domain parameters of this key. * @return the DL domain parameters of this key @@ -61,12 +63,6 @@ class BOTAN_DLL DL_Scheme_PublicKey : public virtual Public_Key virtual DL_Group::Format group_format() const = 0; /** - * Get an X509 encoder for this key. - * @return an encoder usable to encode this key. - */ - X509_Encoder* x509_encoder() const; - - /** * Get an X509 decoder for this key. * @return an decoder usable to decode a DL key and store the * values in this instance. diff --git a/src/pubkey/ecc_key/ecc_key.cpp b/src/pubkey/ecc_key/ecc_key.cpp index 4a0b20d2f..f91f394dc 100644 --- a/src/pubkey/ecc_key/ecc_key.cpp +++ b/src/pubkey/ecc_key/ecc_key.cpp @@ -40,6 +40,11 @@ AlgorithmIdentifier EC_PublicKey::algorithm_identifier() const return AlgorithmIdentifier(get_oid(), DER_domain()); } +MemoryVector<byte> EC_PublicKey::x509_subject_public_key() const + { + return EC2OSP(public_point(), PointGFp::COMPRESSED); + } + void EC_PublicKey::X509_load_hook() { try @@ -52,29 +57,6 @@ void EC_PublicKey::X509_load_hook() } } -X509_Encoder* EC_PublicKey::x509_encoder() const - { - class EC_Key_Encoder : public X509_Encoder - { - public: - AlgorithmIdentifier alg_id() const - { - return key->algorithm_identifier(); - } - - MemoryVector<byte> key_bits() const - { - return EC2OSP(key->public_point(), PointGFp::COMPRESSED); - } - - EC_Key_Encoder(const EC_PublicKey* k): key(k) {} - private: - const EC_PublicKey* key; - }; - - return new EC_Key_Encoder(this); - } - X509_Decoder* EC_PublicKey::x509_decoder() { class EC_Key_Decoder : public X509_Decoder diff --git a/src/pubkey/ecc_key/ecc_key.h b/src/pubkey/ecc_key/ecc_key.h index 29a08fba6..226427768 100644 --- a/src/pubkey/ecc_key/ecc_key.h +++ b/src/pubkey/ecc_key/ecc_key.h @@ -42,6 +42,8 @@ class BOTAN_DLL EC_PublicKey : public virtual Public_Key AlgorithmIdentifier algorithm_identifier() const; + MemoryVector<byte> x509_subject_public_key() const; + /** * Get the domain parameters of this key. * @throw Invalid_State is thrown if the @@ -71,12 +73,6 @@ class BOTAN_DLL EC_PublicKey : public virtual Public_Key { return domain_encoding; } /** - * Get an x509_encoder that can be used to encode this key. - * @result an x509_encoder for this key - */ - X509_Encoder* x509_encoder() const; - - /** * Get an x509_decoder that can be used to decode a stored key into * this key. * @result an x509_decoder for this key diff --git a/src/pubkey/gost_3410/gost_3410.cpp b/src/pubkey/gost_3410/gost_3410.cpp index d23229d9b..d36b9e3d4 100644 --- a/src/pubkey/gost_3410/gost_3410.cpp +++ b/src/pubkey/gost_3410/gost_3410.cpp @@ -16,37 +16,18 @@ namespace Botan { -X509_Encoder* GOST_3410_PublicKey::x509_encoder() const +MemoryVector<byte> GOST_3410_PublicKey::x509_subject_public_key() const { - class GOST_3410_Key_Encoder : public X509_Encoder - { - public: - AlgorithmIdentifier alg_id() const - { - return AlgorithmIdentifier(key->get_oid(), - key->DER_domain()); - } - - MemoryVector<byte> key_bits() const - { - // Trust CryptoPro to come up with something obnoxious - const BigInt x = key->public_point().get_affine_x(); - const BigInt y = key->public_point().get_affine_y(); + // Trust CryptoPro to come up with something obnoxious + const BigInt& x = public_point().get_affine_x(); + const BigInt& y = public_point().get_affine_y(); - SecureVector<byte> bits(2*std::max(x.bytes(), y.bytes())); + MemoryVector<byte> bits(2*std::max(x.bytes(), y.bytes())); - y.binary_encode(bits + (bits.size() / 2 - y.bytes())); - x.binary_encode(bits + (bits.size() - y.bytes())); - - return DER_Encoder().encode(bits, OCTET_STRING).get_contents(); - } - - GOST_3410_Key_Encoder(const GOST_3410_PublicKey* k): key(k) {} - private: - const GOST_3410_PublicKey* key; - }; + y.binary_encode(bits + (bits.size() / 2 - y.bytes())); + x.binary_encode(bits + (bits.size() - y.bytes())); - return new GOST_3410_Key_Encoder(this); + return DER_Encoder().encode(bits, OCTET_STRING).get_contents(); } X509_Decoder* GOST_3410_PublicKey::x509_decoder() diff --git a/src/pubkey/gost_3410/gost_3410.h b/src/pubkey/gost_3410/gost_3410.h index 6daa0eaf8..c1cd0d293 100644 --- a/src/pubkey/gost_3410/gost_3410.h +++ b/src/pubkey/gost_3410/gost_3410.h @@ -28,6 +28,8 @@ class BOTAN_DLL GOST_3410_PublicKey : public virtual EC_PublicKey, */ std::string algo_name() const { return "GOST-34.10"; } + MemoryVector<byte> x509_subject_public_key() const; + /** * Get the maximum number of bits allowed to be fed to this key. * This is the bitlength of the order of the base point. @@ -67,12 +69,6 @@ class BOTAN_DLL GOST_3410_PublicKey : public virtual EC_PublicKey, EC_PublicKey(dom_par, public_point) {} /** - * Get an x509_encoder that can be used to encode this key. - * @result an x509_encoder for this key - */ - X509_Encoder* x509_encoder() const; - - /** * Get an x509_decoder that can be used to decode a stored key into * this key. * @result an x509_decoder for this key diff --git a/src/pubkey/if_algo/if_algo.cpp b/src/pubkey/if_algo/if_algo.cpp index ee34b1418..2a7b19d3b 100644 --- a/src/pubkey/if_algo/if_algo.cpp +++ b/src/pubkey/if_algo/if_algo.cpp @@ -18,35 +18,14 @@ AlgorithmIdentifier IF_Scheme_PublicKey::algorithm_identifier() const AlgorithmIdentifier::USE_NULL_PARAM); } -/* -* Return the X.509 public key encoder -*/ -X509_Encoder* IF_Scheme_PublicKey::x509_encoder() const +MemoryVector<byte> IF_Scheme_PublicKey::x509_subject_public_key() const { - class IF_Scheme_Encoder : public X509_Encoder - { - public: - AlgorithmIdentifier alg_id() const - { - return key->algorithm_identifier(); - } - - 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 DER_Encoder() + .start_cons(SEQUENCE) + .encode(n) + .encode(e) + .end_cons() + .get_contents(); } /* diff --git a/src/pubkey/if_algo/if_algo.h b/src/pubkey/if_algo/if_algo.h index 98ae070c9..17598dd52 100644 --- a/src/pubkey/if_algo/if_algo.h +++ b/src/pubkey/if_algo/if_algo.h @@ -25,6 +25,8 @@ class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key AlgorithmIdentifier algorithm_identifier() const; + MemoryVector<byte> x509_subject_public_key() const; + /** * Get n = p * q. * @return n @@ -39,7 +41,6 @@ class BOTAN_DLL IF_Scheme_PublicKey : public virtual Public_Key u32bit max_input_bits() const { return (n.bits() - 1); } - X509_Encoder* x509_encoder() const; X509_Decoder* x509_decoder(); protected: virtual void X509_load_hook(); diff --git a/src/pubkey/pk_codecs/x509_key.cpp b/src/pubkey/pk_codecs/x509_key.cpp index fcfb2b165..fdcfccf87 100644 --- a/src/pubkey/pk_codecs/x509_key.cpp +++ b/src/pubkey/pk_codecs/x509_key.cpp @@ -24,15 +24,11 @@ namespace X509 { */ void encode(const Public_Key& key, Pipe& pipe, X509_Encoding encoding) { - std::auto_ptr<X509_Encoder> encoder(key.x509_encoder()); - if(!encoder.get()) - throw Encoding_Error("X509::encode: Key does not support encoding"); - MemoryVector<byte> der = DER_Encoder() .start_cons(SEQUENCE) - .encode(encoder->alg_id()) - .encode(encoder->key_bits(), BIT_STRING) + .encode(key.algorithm_identifier()) + .encode(key.x509_subject_public_key(), BIT_STRING) .end_cons() .get_contents(); diff --git a/src/pubkey/pk_codecs/x509_key.h b/src/pubkey/pk_codecs/x509_key.h index 9404b7ecc..a8f5267d7 100644 --- a/src/pubkey/pk_codecs/x509_key.h +++ b/src/pubkey/pk_codecs/x509_key.h @@ -16,17 +16,6 @@ namespace Botan { /** -* This class represents abstract X.509 public key encoders. -*/ -class BOTAN_DLL X509_Encoder - { - public: - virtual AlgorithmIdentifier alg_id() const = 0; - virtual MemoryVector<byte> key_bits() const = 0; - virtual ~X509_Encoder() {} - }; - -/** * This class represents abstract X.509 public key decoders. */ class BOTAN_DLL X509_Decoder diff --git a/src/pubkey/pk_keys.h b/src/pubkey/pk_keys.h index 33341b513..d1a841b9a 100644 --- a/src/pubkey/pk_keys.h +++ b/src/pubkey/pk_keys.h @@ -67,10 +67,9 @@ class BOTAN_DLL Public_Key virtual AlgorithmIdentifier algorithm_identifier() const = 0; /** - * Get an X509 encoder that can be used to encode this key in X509 format. - * @return an X509 encoder for this key + * @return X.509 subject key encoding for this key object */ - virtual class X509_Encoder* x509_encoder() const = 0; + virtual MemoryVector<byte> x509_subject_public_key() const = 0; /** * Get an X509 decoder that can be used to set the values of this |