forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			169 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
XPCOMUtils.defineLazyModuleGetters(this, {
 | 
						|
  ctypes: "resource://gre/modules/ctypes.jsm",
 | 
						|
  MockRegistry: "resource://testing-common/MockRegistry.jsm",
 | 
						|
  OS: "resource://gre/modules/osfile.jsm",
 | 
						|
});
 | 
						|
 | 
						|
do_get_profile();
 | 
						|
let tmpDir = FileUtils.getDir("TmpD", ["PKCS11"]);
 | 
						|
let slug = AppConstants.platform === "linux" ? "pkcs11-modules" : "PKCS11Modules";
 | 
						|
tmpDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
 | 
						|
let baseDir = OS.Path.join(tmpDir.path, slug);
 | 
						|
OS.File.makeDir(baseDir);
 | 
						|
 | 
						|
registerCleanupFunction(() => {
 | 
						|
  tmpDir.remove(true);
 | 
						|
});
 | 
						|
 | 
						|
function getPath(filename) {
 | 
						|
  return OS.Path.join(baseDir, filename);
 | 
						|
}
 | 
						|
 | 
						|
const testmodule = "../../../../../security/manager/ssl/tests/unit/pkcs11testmodule/" + ctypes.libraryName("pkcs11testmodule");
 | 
						|
 | 
						|
// This function was inspired by the native messaging test under
 | 
						|
// toolkit/components/extensions
 | 
						|
 | 
						|
async function setupManifests(modules) {
 | 
						|
  async function writeManifest(module) {
 | 
						|
    let manifest = {
 | 
						|
      name: module.name,
 | 
						|
      description: module.description,
 | 
						|
      path: module.path,
 | 
						|
      type: "pkcs11",
 | 
						|
      allowed_extensions: [module.id],
 | 
						|
    };
 | 
						|
 | 
						|
    let manifestPath = getPath(`${module.name}.json`);
 | 
						|
    await OS.File.writeAtomic(manifestPath, JSON.stringify(manifest));
 | 
						|
 | 
						|
    return manifestPath;
 | 
						|
  }
 | 
						|
 | 
						|
  switch (AppConstants.platform) {
 | 
						|
    case "macosx":
 | 
						|
    case "linux":
 | 
						|
      let dirProvider = {
 | 
						|
        getFile(property) {
 | 
						|
          if (property == "XREUserNativeManifests") {
 | 
						|
            return tmpDir.clone();
 | 
						|
          } else if (property == "XRESysNativeManifests") {
 | 
						|
            return tmpDir.clone();
 | 
						|
          }
 | 
						|
          return null;
 | 
						|
        },
 | 
						|
      };
 | 
						|
 | 
						|
      Services.dirsvc.registerProvider(dirProvider);
 | 
						|
      registerCleanupFunction(() => {
 | 
						|
        Services.dirsvc.unregisterProvider(dirProvider);
 | 
						|
      });
 | 
						|
 | 
						|
      for (let module of modules) {
 | 
						|
        await writeManifest(module);
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case "win":
 | 
						|
      const REGKEY = String.raw`Software\Mozilla\PKCS11Modules`;
 | 
						|
 | 
						|
      let registry = new MockRegistry();
 | 
						|
      registerCleanupFunction(() => {
 | 
						|
        registry.shutdown();
 | 
						|
      });
 | 
						|
 | 
						|
      for (let module of modules) {
 | 
						|
        if (!OS.Path.winIsAbsolute(module.path)) {
 | 
						|
          let cwd = await OS.File.getCurrentDirectory();
 | 
						|
          module.path = OS.Path.join(cwd, module.path);
 | 
						|
        }
 | 
						|
        let manifestPath = await writeManifest(module);
 | 
						|
        registry.setValue(Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
 | 
						|
                          `${REGKEY}\\${module.name}`, "", manifestPath);
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      ok(false, `Loading of PKCS#11 modules is not supported on ${AppConstants.platform}`);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function test_pkcs11() {
 | 
						|
  async function background() {
 | 
						|
    try {
 | 
						|
      let isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
 | 
						|
      browser.test.assertFalse(isInstalled, "PKCS#11 module is not installed before we install it");
 | 
						|
      await browser.pkcs11.installModule("testmodule", 0);
 | 
						|
      isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
 | 
						|
      browser.test.assertTrue(isInstalled, "PKCS#11 module is installed after we install it");
 | 
						|
      let slots = await browser.pkcs11.getModuleSlots("testmodule");
 | 
						|
      browser.test.assertEq("Test PKCS11 Slot", slots[0].name, "The first slot name matches the expected name");
 | 
						|
      browser.test.assertEq("Test PKCS11 Slot 二", slots[1].name, "The second slot name matches the expected name");
 | 
						|
      browser.test.assertTrue(slots[1].token, "The second slot has a token");
 | 
						|
      browser.test.assertFalse(slots[2].token, "The third slot has no token");
 | 
						|
      browser.test.assertEq("Test PKCS11 Tokeñ 2 Label", slots[1].token.name, "The token name matches the expected name");
 | 
						|
      browser.test.assertEq("Test PKCS11 Manufacturer ID", slots[1].token.manufacturer, "The token manufacturer matches the expected manufacturer");
 | 
						|
      browser.test.assertEq("0.0", slots[1].token.HWVersion, "The token hardware version matches the expected version");
 | 
						|
      browser.test.assertEq("0.0", slots[1].token.FWVersion, "The token firmware version matches the expected version");
 | 
						|
      browser.test.assertEq("", slots[1].token.serial, "The token has no serial number");
 | 
						|
      browser.test.assertFalse(slots[1].token.isLoggedIn, "The token is not logged in");
 | 
						|
      await browser.pkcs11.uninstallModule("testmodule");
 | 
						|
      isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
 | 
						|
      browser.test.assertFalse(isInstalled, "PKCS#11 module is no longer installed after we uninstall it");
 | 
						|
      await browser.pkcs11.installModule("testmodule");
 | 
						|
      isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
 | 
						|
      browser.test.assertTrue(isInstalled, "Installing the PKCS#11 module without flags parameter succeeds");
 | 
						|
      await browser.pkcs11.uninstallModule("testmodule");
 | 
						|
      await browser.test.assertRejects(
 | 
						|
        browser.pkcs11.isModuleInstalled("nonexistingmodule"),
 | 
						|
        /No such PKCS#11 module nonexistingmodule/,
 | 
						|
        "We cannot access modules if no JSON file exists");
 | 
						|
      await browser.test.assertRejects(
 | 
						|
        browser.pkcs11.isModuleInstalled("othermodule"),
 | 
						|
        /No such PKCS#11 module othermodule/,
 | 
						|
        "We cannot access modules if we're not listed in the module's manifest file's allowed_extensions key");
 | 
						|
      await browser.test.assertRejects(
 | 
						|
        browser.pkcs11.uninstallModule("internalmodule"),
 | 
						|
        /No such PKCS#11 module internalmodule/,
 | 
						|
        "We cannot uninstall the NSS Builtin Roots Module");
 | 
						|
      browser.test.notifyPass("pkcs11");
 | 
						|
    } catch (e) {
 | 
						|
      browser.test.fail(`Error: ${String(e)} :: ${e.stack}`);
 | 
						|
      browser.test.notifyFail("pkcs11 failed");
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  await setupManifests([
 | 
						|
    {
 | 
						|
      name: "testmodule",
 | 
						|
      description: "PKCS#11 Test Module",
 | 
						|
      path: testmodule,
 | 
						|
      id: "pkcs11@tests.mozilla.org",
 | 
						|
    },
 | 
						|
    {
 | 
						|
      name: "othermodule",
 | 
						|
      description: "PKCS#11 Test Module",
 | 
						|
      path: testmodule,
 | 
						|
      id: "other@tests.mozilla.org",
 | 
						|
    },
 | 
						|
    {
 | 
						|
      name: "internalmodule",
 | 
						|
      description: "Builtin Roots Module",
 | 
						|
      path: ctypes.libraryName("nssckbi"),
 | 
						|
      id: "pkcs11@tests.mozilla.org",
 | 
						|
    },
 | 
						|
  ]);
 | 
						|
 | 
						|
  let extension = ExtensionTestUtils.loadExtension({
 | 
						|
    manifest: {
 | 
						|
      permissions: ["pkcs11"],
 | 
						|
      applications: {"gecko": {id: "pkcs11@tests.mozilla.org"}},
 | 
						|
    },
 | 
						|
    background: background,
 | 
						|
  });
 | 
						|
  await extension.startup();
 | 
						|
  await extension.awaitFinish("pkcs11");
 | 
						|
  await extension.unload();
 | 
						|
});
 |