keygen_handler_nss.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Copyright (c) 2011 The Chromium Authors. All rights reserved.
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Use of this source code is governed by a BSD-style license that can be
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// found in the LICENSE file.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "net/base/keygen_handler.h"
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "base/logging.h"
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "crypto/nss_crypto_module_delegate.h"
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "crypto/nss_util.h"
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "crypto/nss_util_internal.h"
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "crypto/scoped_nss_types.h"
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#include "net/third_party/mozilla_security_manager/nsKeygenHandler.h"
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// PSM = Mozilla's Personal Security Manager.
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennisnamespace psm = mozilla_security_manager;
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennisnamespace net {
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennisstd::string KeygenHandler::GenKeyAndSignChallenge() {
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  // Ensure NSS is initialized.
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  crypto::EnsureNSSInit();
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  crypto::ScopedPK11Slot slot;
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  if (crypto_module_delegate_)
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    slot = crypto_module_delegate_->RequestSlot().Pass();
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  else
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    slot.reset(crypto::GetPrivateNSSKeySlot());
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  if (!slot.get()) {
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    LOG(ERROR) << "Couldn't get private key slot from NSS!";
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return std::string();
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  }
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  // Authenticate to the token.
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  if (SECSuccess !=
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      PK11_Authenticate(
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          slot.get(),
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          PR_TRUE,
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          crypto_module_delegate_ ? crypto_module_delegate_->wincx() : NULL)) {
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    LOG(ERROR) << "Couldn't authenticate to private key slot!";
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return std::string();
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  }
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
43  return psm::GenKeyAndSignChallenge(key_size_in_bits_, challenge_, url_,
44                                     slot.get(), stores_key_);
45}
46
47void KeygenHandler::set_crypto_module_delegate(
48      scoped_ptr<crypto::NSSCryptoModuleDelegate> delegate) {
49  crypto_module_delegate_ = delegate.Pass();
50}
51
52}  // namespace net
53