// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "crypto/rsa_private_key.h"

#include <keyhi.h>
#include <pk11pub.h>

#include "base/memory/scoped_ptr.h"
#include "crypto/scoped_test_nss_db.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace crypto {

class RSAPrivateKeyNSSTest : public testing::Test {
 public:
  RSAPrivateKeyNSSTest() {}
  virtual ~RSAPrivateKeyNSSTest() {}

 private:
  ScopedTestNSSDB test_nssdb_;

  DISALLOW_COPY_AND_ASSIGN(RSAPrivateKeyNSSTest);
};

TEST_F(RSAPrivateKeyNSSTest, FindFromPublicKey) {
  // Create a keypair, which will put the keys in the user's NSSDB.
  scoped_ptr<crypto::RSAPrivateKey> key_pair(RSAPrivateKey::Create(256));

  std::vector<uint8> public_key;
  ASSERT_TRUE(key_pair->ExportPublicKey(&public_key));

  scoped_ptr<crypto::RSAPrivateKey> key_pair_2(
      crypto::RSAPrivateKey::FindFromPublicKeyInfo(public_key));

  EXPECT_EQ(key_pair->key_->pkcs11ID, key_pair_2->key_->pkcs11ID);
}

TEST_F(RSAPrivateKeyNSSTest, FailedFindFromPublicKey) {
  // Create a keypair, which will put the keys in the user's NSSDB.
  scoped_ptr<crypto::RSAPrivateKey> key_pair(RSAPrivateKey::Create(256));

  std::vector<uint8> public_key;
  ASSERT_TRUE(key_pair->ExportPublicKey(&public_key));

  // Remove the keys from the DB, and make sure we can't find them again.
  if (key_pair->key_) {
    PK11_DestroyTokenObject(key_pair->key_->pkcs11Slot,
                            key_pair->key_->pkcs11ID);
  }
  if (key_pair->public_key_) {
    PK11_DestroyTokenObject(key_pair->public_key_->pkcs11Slot,
                            key_pair->public_key_->pkcs11ID);
  }

  EXPECT_EQ(NULL, crypto::RSAPrivateKey::FindFromPublicKeyInfo(public_key));
}

}  // namespace crypto
