Source code

Revision control

Copy as Markdown

Other Tools

/* 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 "PKCS11Module.h"
#include "PKCS11ModuleDB.h"
#include "PKCS11Slot.h"
#include "nsComponentManagerUtils.h"
#include "nsNSSCertHelper.h"
#include "nsNSSComponent.h"
using namespace mozilla::psm;
NS_IMPL_ISUPPORTS(PKCS11Module, nsIPKCS11Module)
PKCS11Module::PKCS11Module(SECMODModule* module) {
MOZ_ASSERT(module);
mModule.reset(SECMOD_ReferenceModule(module));
}
// Convert the UTF8 internal name of the module to how it should appear to the
// user. In most cases this involves simply passing back the module's name.
// However, the builtin roots module has a non-localized name internally that we
// must map to the localized version when we display it to the user.
static nsresult NormalizeModuleNameOut(const char* moduleNameIn,
nsACString& moduleNameOut) {
// Easy case: this isn't the builtin roots module.
if (nsDependentCString(moduleNameIn) != kRootModuleName) {
moduleNameOut.Assign(moduleNameIn);
return NS_OK;
}
nsAutoString localizedRootModuleName;
nsresult rv =
GetPIPNSSBundleString("RootCertModuleName", localizedRootModuleName);
if (NS_FAILED(rv)) {
return rv;
}
moduleNameOut.Assign(NS_ConvertUTF16toUTF8(localizedRootModuleName));
return NS_OK;
}
NS_IMETHODIMP
PKCS11Module::GetName(/*out*/ nsACString& name) {
return NormalizeModuleNameOut(mModule->commonName, name);
}
NS_IMETHODIMP
PKCS11Module::GetLibName(/*out*/ nsACString& libName) {
if (mModule->dllName) {
libName = mModule->dllName;
} else {
libName.SetIsVoid(true);
}
return NS_OK;
}
NS_IMETHODIMP
PKCS11Module::GetSlots(nsTArray<RefPtr<nsIPKCS11Slot>>& slots) {
nsresult rv = CheckForSmartCardChanges();
if (NS_FAILED(rv)) {
return rv;
}
slots.Clear();
// Access to mModule->slots must be protected by acquiring the secmod list
// read lock.
mozilla::AutoSECMODListReadLock lock;
for (int i = 0; i < mModule->slotCount; i++) {
if (mModule->slots[i]) {
slots.AppendElement(new PKCS11Slot(mModule->slots[i]));
}
}
return NS_OK;
}
#if defined(NIGHTLY_BUILD) && !defined(MOZ_NO_SMART_CARDS)
nsresult PKCS11Module::GetModuleInfo(ModuleInfo& moduleInfo) {
nsresult rv = CheckForSmartCardChanges();
if (NS_FAILED(rv)) {
return rv;
}
rv = GetName(moduleInfo.name());
if (NS_FAILED(rv)) {
return rv;
}
rv = GetLibName(moduleInfo.libName());
if (NS_FAILED(rv)) {
return rv;
}
moduleInfo.slots().Clear();
// Access to mModule->slots must be protected by acquiring the secmod list
// read lock.
mozilla::AutoSECMODListReadLock lock;
for (int i = 0; i < mModule->slotCount; i++) {
if (mModule->slots[i]) {
RefPtr<PKCS11Slot> slot = new PKCS11Slot(mModule->slots[i]);
SlotInfo slotInfo;
rv = slot->GetSlotInfo(slotInfo);
if (NS_FAILED(rv)) {
return rv;
}
moduleInfo.slots().AppendElement(std::move(slotInfo));
}
}
return NS_OK;
}
NS_IMPL_ISUPPORTS(RemotePKCS11Module, nsIPKCS11Module)
RemotePKCS11Module::RemotePKCS11Module(const ModuleInfo& moduleInfo)
: mModuleInfo(moduleInfo) {}
NS_IMETHODIMP
RemotePKCS11Module::GetName(/*out*/ nsACString& name) {
name.Assign(mModuleInfo.name());
return NS_OK;
}
NS_IMETHODIMP
RemotePKCS11Module::GetLibName(/*out*/ nsACString& libName) {
libName.Assign(mModuleInfo.libName());
return NS_OK;
}
NS_IMETHODIMP
RemotePKCS11Module::GetSlots(nsTArray<RefPtr<nsIPKCS11Slot>>& slots) {
slots.Clear();
for (auto& slot : mModuleInfo.slots()) {
slots.AppendElement(new RemotePKCS11Slot(slot));
}
return NS_OK;
}
#endif // NIGHTLY_BUILD && !MOZ_NO_SMART_CARDS