| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/ownership/mock_owner_key_util.h" |
| |
| #include <pk11pub.h> |
| |
| #include "base/check.h" |
| #include "base/files/file_path.h" |
| #include "crypto/nss_key_util.h" |
| #include "crypto/nss_util.h" |
| #include "crypto/rsa_private_key.h" |
| |
| namespace ownership { |
| |
| static const uint16_t kKeySizeInBits = 2048; |
| |
| MockOwnerKeyUtil::MockOwnerKeyUtil() = default; |
| |
| MockOwnerKeyUtil::~MockOwnerKeyUtil() = default; |
| |
| scoped_refptr<PublicKey> MockOwnerKeyUtil::ImportPublicKey() { |
| return public_key_.empty() ? nullptr |
| : base::MakeRefCounted<ownership::PublicKey>( |
| /*is_persisted=*/true, /*data=*/public_key_); |
| } |
| |
| crypto::ScopedSECKEYPrivateKey MockOwnerKeyUtil::GenerateKeyPair( |
| PK11SlotInfo* slot) { |
| if (generate_key_fail_times_ > 0) { |
| --generate_key_fail_times_; |
| return nullptr; |
| } |
| |
| PK11RSAGenParams param; |
| param.keySizeInBits = kKeySizeInBits; |
| param.pe = 65537L; |
| SECKEYPublicKey* public_key_ptr = nullptr; |
| |
| crypto::ScopedSECKEYPrivateKey key(PK11_GenerateKeyPair( |
| slot, CKM_RSA_PKCS_KEY_PAIR_GEN, ¶m, &public_key_ptr, |
| PR_TRUE /* permanent */, PR_TRUE /* sensitive */, nullptr)); |
| crypto::ScopedSECKEYPublicKey public_key(public_key_ptr); |
| return key; |
| } |
| |
| crypto::ScopedSECKEYPrivateKey MockOwnerKeyUtil::FindPrivateKeyInSlot( |
| const std::vector<uint8_t>& key, |
| PK11SlotInfo* slot) { |
| if (!private_key_ || !slot) { |
| return nullptr; |
| } |
| |
| if (private_key_slot_id_.has_value() && |
| (private_key_slot_id_.value() != PK11_GetSlotID(slot))) { |
| return nullptr; |
| } |
| |
| return crypto::ScopedSECKEYPrivateKey( |
| SECKEY_CopyPrivateKey(private_key_.get())); |
| } |
| |
| bool MockOwnerKeyUtil::IsPublicKeyPresent() { |
| return !public_key_.empty(); |
| } |
| |
| void MockOwnerKeyUtil::Clear() { |
| public_key_.clear(); |
| private_key_.reset(); |
| } |
| |
| void MockOwnerKeyUtil::SetPublicKey(const std::vector<uint8_t>& key) { |
| public_key_ = key; |
| } |
| |
| void MockOwnerKeyUtil::SetPublicKeyFromPrivateKey( |
| const crypto::RSAPrivateKey& key) { |
| CHECK(key.ExportPublicKey(&public_key_)); |
| } |
| |
| void MockOwnerKeyUtil::ImportPrivateKeyAndSetPublicKey( |
| std::unique_ptr<crypto::RSAPrivateKey> key) { |
| crypto::EnsureNSSInit(); |
| |
| crypto::ScopedPK11Slot slot(PK11_GetInternalSlot()); |
| CHECK(slot); |
| ImportPrivateKeyAndSetPublicKeyImpl(std::move(key), slot.get()); |
| } |
| |
| void MockOwnerKeyUtil::ImportPrivateKeyAndSetPublicKeyImpl( |
| std::unique_ptr<crypto::RSAPrivateKey> key, |
| PK11SlotInfo* slot) { |
| CHECK(slot); |
| crypto::EnsureNSSInit(); |
| |
| CHECK(key->ExportPublicKey(&public_key_)); |
| |
| std::vector<uint8_t> key_exported; |
| CHECK(key->ExportPrivateKey(&key_exported)); |
| |
| private_key_ = crypto::ImportNSSKeyFromPrivateKeyInfo( |
| slot, key_exported, false /* not permanent */); |
| CHECK(private_key_); |
| } |
| |
| void MockOwnerKeyUtil::ImportPrivateKeyInSlotAndSetPublicKey( |
| std::unique_ptr<crypto::RSAPrivateKey> key, |
| PK11SlotInfo* slot) { |
| private_key_slot_id_ = PK11_GetSlotID(slot); |
| ImportPrivateKeyAndSetPublicKeyImpl(std::move(key), slot); |
| } |
| |
| void MockOwnerKeyUtil::SimulateGenerateKeyFailure(int fail_times) { |
| generate_key_fail_times_ = fail_times; |
| } |
| |
| } // namespace ownership |