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