diff options
author | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-07 12:13:02 +0000 |
---|---|---|
committer | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-07 12:13:02 +0000 |
commit | d6166ca658f5011183ff2402d4d675e673e4e315 (patch) | |
tree | 95da8295f96e97dca1d8ce8b94d0133b50a7aee1 /net/base/keygen_handler_openssl.cc | |
parent | 7250b1fe06495cfde83f6650e87324b1a675a4b2 (diff) | |
download | chromium_src-d6166ca658f5011183ff2402d4d675e673e4e315.zip chromium_src-d6166ca658f5011183ff2402d4d675e673e4e315.tar.gz chromium_src-d6166ca658f5011183ff2402d4d675e673e4e315.tar.bz2 |
Implements keygen handler for openssl, but without private key persistence
BUG=64917
TEST=net_unittest Keygen*
Review URL: http://codereview.chromium.org/5541002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68470 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/keygen_handler_openssl.cc')
-rw-r--r-- | net/base/keygen_handler_openssl.cc | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/net/base/keygen_handler_openssl.cc b/net/base/keygen_handler_openssl.cc index ecbd683..b04f098 100644 --- a/net/base/keygen_handler_openssl.cc +++ b/net/base/keygen_handler_openssl.cc @@ -4,14 +4,40 @@ #include "net/base/keygen_handler.h" +#include <openssl/ssl.h> + +#include "base/crypto/rsa_private_key.h" #include "base/logging.h" +#include "base/openssl_util.h" +#include "base/scoped_ptr.h" namespace net { std::string KeygenHandler::GenKeyAndSignChallenge() { - // TODO(bulach): implement me. - NOTIMPLEMENTED(); - return ""; + scoped_ptr<base::RSAPrivateKey> key( + base::RSAPrivateKey::Create(key_size_in_bits_)); + EVP_PKEY* pkey = key->key(); + + if (stores_key_) { + // TODO(joth): Add an abstraction for persisting OpenSSL private keys. + // See http://crbug.com/64917 + NOTIMPLEMENTED(); + } + + base::ScopedOpenSSL<NETSCAPE_SPKI, NETSCAPE_SPKI_free> spki( + NETSCAPE_SPKI_new()); + ASN1_STRING_set(spki.get()->spkac->challenge, + challenge_.data(), challenge_.size()); + NETSCAPE_SPKI_set_pubkey(spki.get(), pkey); + // Using MD5 as this is what is required in HTML5, even though the SPKI + // structure does allow the use of a SHA-1 signature. + NETSCAPE_SPKI_sign(spki.get(), pkey, EVP_md5()); + char* spkistr = NETSCAPE_SPKI_b64_encode(spki.get()); + + std::string result(spkistr); + OPENSSL_free(spkistr); + + return result; } } // namespace net |