summaryrefslogtreecommitdiffstats
path: root/net/base/keygen_handler_openssl.cc
diff options
context:
space:
mode:
authorjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-07 12:13:02 +0000
committerjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-07 12:13:02 +0000
commitd6166ca658f5011183ff2402d4d675e673e4e315 (patch)
tree95da8295f96e97dca1d8ce8b94d0133b50a7aee1 /net/base/keygen_handler_openssl.cc
parent7250b1fe06495cfde83f6650e87324b1a675a4b2 (diff)
downloadchromium_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.cc32
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