Using the Mozilla
window.crypto. For instance, to obtain a ten byte random number using the cryptographic engine, simply call:
var myrandom = window.crypto.random(10);
Services are provided to enable smart card events, generate certificate requests, import user certs, random numbers, logging out of your tokens, and signing text.
Handling Smart Card Events
In Gecko-based browsers, such as Mozilla and Firefox, websites can make themselves more SmartCard friendly by listening for SmartCard removal and insertion events. To enable your document to recieve these events, you must first tell the crypto system you are interested. You can do this by setting
true. This tells the crypto system that you are interested in listening for these events. You can then register event handlers for these events with the
Two smart card related events are generated:
- "smartcard-insert" when SmartCards are inserted, and
- "smartcard-remove" when SmartCards are removed.
Websites which use SSL clientAuth loggin can use the following code to refresh the page on token insertions and removals:
With the above example, your website will automatically reload anytime a SmartCard is inserted or removed. This allows the page to automatically login and logout based on the presence of the SmartCard.
Generating Keys and issuing User Certificates
The importUserCertificates() function loads certificates into the NSS database or SmartCard if the corresponding key is found there.
The popChallengeResponse() function returns a proof of key posession signed challenge which a CA can use to verify the client has the private key associated with it's claimed public key.
Overview of New Cert Issuing Process
- User fills out enrollment form
- User action initiates script
- Script calls key generation method (generateCRMFRequest)
- Signing and Encryption keys are generated
- Encryption Private Key is wrapped with public key of Key Recovery Authority (KRA) (passed in in the form of a certificate as part of the script, and checked against a pre-installed certificate copy in the local certificate database)
- The public keys, wrapped encryption private key, and text string from the script (possibly containing naming or enrollment info) are signed by the user
- Signed blob is returned to the script
- Script submits signed blob and any other necessary info to the CA/RA
- CA/RA verifies signature on signed blob
- CA/RA validates identity of user
- CA/RA sends wrapped encryption private key to KRA
- KRA sends escrow verification back to CA
- CA creates and signs certificates
- CA sends certificates back to the user (importUserCertificates)
The CA's enrollment page could look something like this:
On completion of the request, the CA may submit a page that looks something like this:
DOMString signText(in DOMString stringToSign, in DOMString caOption /* ... */);
Loading PKCS #11 modules
long deletemodule(in DOMString moduleName); long addmodule(in DOMString moduleName, in DOMString libraryFullPath, in long cryptoMechanismFlags, in long cipherFlags);
ModuleName Name of the module. LibraryFullPath The filename of the library prepended with its full path. CryptoMechanismFlags A bit vector indicating all cryptographic mechanisms should be turned on by default (see below). CipherFlags A bit vector indicating all SSL or S/MIME cipher functions supported by the module (see below).
Mechanism Flag Definitions
In general, most tokens should not set any of the cipher flags. Setting these flags means you want your token to supply the default implementation for these functions. Normally Mozilla uses its own internal module to supply these functions. These flags override that preference. If you choose to implement these flags, your module must supply the following additional functions for each flag:
- PKCS11_MECH_FLAG: must support CKM_RSA_PKCS and CKM_RSA_X_509 and the following functions: C_WRAPKEY, C_ENCRYPT, C_SIGN, C_DECRYPT, C_UNWRAPKEY, C_VERIFYRECOVER, C_VERIFY, C_GENERATEKEYPAIR (2048, 1024, 512) size
- PKCS11_MECH_DSA_FLAG: must support CKM_DSA and the following functions: C_SIGN, C_VERIFY, C_GENERATEKEYPAIR
- PKCS11_MECH_RC2_FLAG: must support CKM_RC2_CBC and CKM_RC2_ECB and the following functions: C_GENERATEKEY, C_ENCRYPT, C_DECRYPT, C_WRAPKEY, C_UNWRAPKEY
- PKCS11_MECH_RC4_FLAG: must support CKM_RC4_CBC and CKM_RC4_ECB and the following functions: C_GENERATEKEY, C_ENCRYPT, C_DECRYPT, C_WRAPKEY, C_UNWRAPKEY
- PKCS11_MECH_DES_FLAG: must support CKM_CPMF_CBC, CKM_DES_CBC, CKM_DES3_CBC, CKM_CPMF_ECB, CKM_DES_ECB, CKM_DES3_ECB and the following functions: C_GENERATEKEY, C_ENCRYPT, C_DECRYPT, C_WRAPKEY, C_UNWRAPKEY
- PKCS11_MECH_DH_FLAG: must support CKM_DH_PKCS_DERIVE and CKM_DH_KEY_PAIR_GEN and the following functions: C_DERIVEKEY, C_GENERATEKEYPAIR
- PKCS11_MECH_MD5_FLAG: Hashing must be able to function without authentication.
- PKCS11_MECH_SHA1_FLAG: Hashing must be able to function without authentication.
- PKCS11_MECH_MD2_FLAG: Hashing must be able to function without authentication.*
- PKCS11_RANDOM_FLAG: Use token's Random Number Generator.
- Warning: Must be able to use without authentication. Many hardware random number generators are not as secure as the Netscape internal one. Do not select this value unless you can show that your random number generator is secure. Even so, it's highly discouraged.
- PKCS11_PUB_READABLE_CERT_FLAG: This is the only flag most smart tokens should turn on. You can turn this flag on if:
- the certs on your token can be read without authentication and,
- the public key on your token can be found by ID, MODULUS, or VALUE and all your private keys have the associated public key.
- Turning this flag on will illuminate a large number of password prompts for your token when looking up certs in Communicator.
PKCS11_MECH_RSA_FLAG = 0x1<<0; PKCS11_MECH_DSA_FLAG = 0x1<<1; PKCS11_MECH_RC2_FLAG = 0x1<<2; PKCS11_MECH_RC4_FLAG = 0x1<<3; PKCS11_MECH_DES_FLAG = 0x1<<4; PKCS11_MECH_DH_FLAG = 0x1<<5; //Diffie-Hellman PKCS11_MECH_SKIPJACK_FLAG = 0x1<<6; //SKIPJACK algorithm as in Fortezza cards PKCS11_MECH_RC5_FLAG = 0x1<<7; PKCS11_MECH_SHA1_FLAG = 0x1<<8; PKCS11_MECH_MD5_FLAG = 0x1<<9; PKCS11_MECH_MD2_FLAG = 0x1<<10; PKCS11_MECH_RANDOM_FLAG = 0x1<<27; //Random number generator PKCS11_PUB_READABLE_CERT_FLAG = 0x1<<28; //Stored certs can be read off the token w/o logging in PKCS11_DISABLE_FLAG = 0x1<<30; //tell Navigator to disable this slot by default
Important for CryptoMechanismFlags
0x1<<11, 0x1<<12, ... , 0x1<<26, 0x1<<29, and 0x1<<31 are reserved for internal use in Mozilla. Therefore, these bits should always be set to 0; otherwise, Mozilla might exhibit unpredictable behavior.
Important for CipherFlags
All values are reserved for internal use in Mozilla. Therefore, this flag should always be set to 0; otherwise, Mozilla might exhibit unpredictable behavior.
Example of CryptoMechanismFlags and CipherFlags
pkcs11MechanismFlags = PKCS11_MECH_DSA_FLAG | PKCS11_MECH_SKIPJACK_FLAG | PKCS11_MECH_RANDOM_FLAG; pkcs11CipherFlags = 0;
JS_OK_ADD_MODULE = 3 // Successfully added a module JS_ERR_OTHER = -1 // Errors other than the following JS_ERR_USER_CANCEL_ACTION = -2 // User abort an action JS_ERR_INCORRECT_NUM_OF_ARGUMENTS= -3 // Calling a method w/ incorrect # of arguments JS_ERR_ADD_MODULE = -5 // Error adding a module JS_ERR_BAD_MODULE_NAME = -6 // The module name is invalid JS_ERR_ADD_MODULE_DUPLICATE =-10 // The module being installed has the same name as // one of the modules that has already been installed
DOMString random(in long numBytes); void alert(in DOMString message); void logout(); void disableRightClick();
random is not implemented in Mozilla browsers.