/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include "nss.h" #include "pk11pub.h" #include "prerror.h" #include "prsystem.h" #include "secoid.h" #include "nss_scoped_ptrs.h" #include "gtest/gtest.h" #include "databuffer.h" namespace nss_test { class Pkcs11ModuleTest : public ::testing::Test { public: Pkcs11ModuleTest() {} void SetUp() override { ASSERT_EQ(SECSuccess, SECMOD_AddNewModule("Pkcs11ModuleTest", DLL_PREFIX "pkcs11testmodule." DLL_SUFFIX, 0, 0)) << PORT_ErrorToName(PORT_GetError()); } void TearDown() override { int type; ASSERT_EQ(SECSuccess, SECMOD_DeleteModule("Pkcs11ModuleTest", &type)); ASSERT_EQ(SECMOD_EXTERNAL, type); } }; TEST_F(Pkcs11ModuleTest, LoadUnload) { ScopedSECMODModule module(SECMOD_FindModule("Pkcs11ModuleTest")); EXPECT_NE(nullptr, module); } TEST_F(Pkcs11ModuleTest, ListSlots) { ScopedPK11SlotList slots( PK11_GetAllTokens(CKM_INVALID_MECHANISM, PR_FALSE, PR_FALSE, nullptr)); EXPECT_NE(nullptr, slots); PK11SlotListElement* element = PK11_GetFirstSafe(slots.get()); EXPECT_NE(nullptr, element); // These tokens are always present. const std::vector kSlotsWithToken = { "NSS Internal Cryptographic Services", "NSS User Private Key and Certificate Services", "Test PKCS11 Public Certs Slot", "Test PKCS11 Slot 二"}; std::vector foundSlots; do { std::string name = PK11_GetSlotName(element->slot); foundSlots.push_back(name); std::cerr << "loaded slot: " << name << std::endl; } while ((element = PK11_GetNextSafe(slots.get(), element, PR_FALSE)) != nullptr); std::sort(foundSlots.begin(), foundSlots.end()); EXPECT_TRUE(std::equal(kSlotsWithToken.begin(), kSlotsWithToken.end(), foundSlots.begin())); } TEST_F(Pkcs11ModuleTest, PublicCertificatesToken) { const std::string kRegularToken = "Test PKCS11 Tokeñ 2 Label"; const std::string kPublicCertificatesToken = "Test PKCS11 Public Certs Token"; ScopedPK11SlotInfo slot1(PK11_FindSlotByName(kRegularToken.c_str())); EXPECT_NE(nullptr, slot1); EXPECT_FALSE(PK11_IsFriendly(slot1.get())); ScopedPK11SlotInfo slot2( PK11_FindSlotByName(kPublicCertificatesToken.c_str())); EXPECT_NE(nullptr, slot2); EXPECT_TRUE(PK11_IsFriendly(slot2.get())); } } // namespace nss_test