Security Policy: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
mNo edit summary
 
(82 intermediate revisions by 6 users not shown)
Line 1: Line 1:
''This is a draft document.''
''This is a draft document.''


==Module Information==
[http://www.mozilla.org/projects/security/pki/nss/fips/secpolicy.pdf Security Policy]
 
* Module name: NSS cryptographic module
* Module version: 3.11.5
* Vendor name: Red Hat and Sun Microsystems
* Document version: 1.1
* Document revision date: 2006-08-11
 
==Specification of Security Policy==
The NSS cryptographic module is a general-purpose cryptographic library. Its API is based on RSA Security's [http://www.rsasecurity.com/rsalabs/node.asp?id=2133 PKCS #11] version 2.20. The following table states the various security policy rules that each product using the NSS cryptographic module will adhere to:
 
{| border="1" cellpadding="2"
|+
|-
!
Rule
!
Statement of the NSS Cryptographic Module Security Policy
|-
|-
| 1 || The NSS cryptographic module shall consist of software libraries compiled for each supported platform.
|-
| 2 || The cryptographic module shall rely on the underlying operating system to ensure the integrity of the cryptographic module loaded into memory.
|-
| 3 || The cryptographic module shall enforce a single role approach, which is a combination of the User Role and the Crypto Officer Role as defined in FIPS PUB 140-2.
|-
| 4 || A cryptographic module user shall have access to ALL the services supplied by the cryptographic module.
|-
| 5 || Cryptographic module services shall consist of public services, which require no authentication, and private services, which require authentication.
|-
| 6 || Public key certificates shall be stored in plaintext form because of their public nature and internal CA-signing integrity features.
|-
| 7 || TLS shall utilize authentication mechanisms above the cryptographic module which pass through to utilize PKCS #11 authentication mechanisms which are within the cryptographic module.
|-
| 8 || TLS master secrets (private key data) shall be extracted from the cryptographic module in encrypted form (the TLS secure session ID cache shall be considered outside the boundary of the cryptographic module).
|-
| 9 || For the FIPS PUB 140-2 mode of operation, the cryptographic module shall enforce rules specific to FIPS PUB 140-2 requirements.
|-
| 10 || The FIPS PUB 140-2 cryptographic module shall use an exception handling mechanism to ensure that critical errors are not allowed to compromise security (i.e., whenever a critical error is encountered, the cryptographic module library shall be required to be reinitialized).
|-
| 11 || Upon initialization of the FIPS PUB 140-2 cryptographic module library, the following power-up self-tests shall be performed:<br>
# RC2-ECB Encrypt/Decrypt,
# RC2-CBC Encrypt/Decrypt,
# RC4 Encrypt/Decrypt,
# DES-ECB Encrypt/Decrypt,
# DES-CBC Encrypt/Decrypt,
# triple DES-ECB Encrypt/Decrypt,
# triple DES-CBC Encrypt/Decrypt,
# AES-ECB Encrypt/Decrypt,
# AES-CBC Encrypt/Decrypt,
# MD2 Hash,
# MD5 Hash,
# SHA-1 Hash,
# SHA-256 Hash,
# SHA-384 Hash,
# SHA-512 Hash,
# HMAC Hash,
# RSA Encrypt,
# RSA Decrypt,
# RSA Signature,
# RSA Signature Verification,
# DSA Signature,
# DSA Signature Verification,
# ECDSA Signature,
# ECDSA Signature Verification, and
# PRNG.
|-
| 12 || Shutting down and restarting the FIPS PUB 140-2 cryptographic module with the <code>FC_Finalize</code> and <code>FC_Initialize</code> functions shall execute the same power-up self-tests detailed above when initializing the module library for the FIPS PUB 140-2 mode. This allows a user to execute these power-up self-tests on demand as defined in Section 4.9.1 of FIPS PUB 140-2.
|-
| 13 || The FIPS PUB 140-2 cryptographic module shall require the user to establish a password (for the user role) in order for subsequent authentications to be enforced.
|-
| 14 || All passwords shall be stored in an encrypted form in secondary storage.
|-
| 15 || Once a password has been established for the FIPS PUB 140-2 cryptographic module, it shall only allow the user to use the private security services if and only if the user successfully authenticates to the FIPS PUB 140-2 cryptographic module.
|-
| 16 || In order to verify the user's stored password, the user shall enter the password, and the verification that the password is correct shall be performed by the cryptographic module via PKCS #5 password-based encryption mechanisms.
|-
| 17 || The user's password shall act as the key material to encrypt/decrypt private key material. '''Note''': password-encrypted private keys should be considered in plaintext in FIPS mode.
|-
| 18 || Private keys, plaintext PINs, and other security relevant data items (SRDIs) shall be maintained under the control of the cryptographic module, and shall not be passed to higher level callers.
|-
| 19 || All private keys shall be stored in an encrypted form in secondary storage. '''Note''': password-encrypted private keys should be considered in plaintext in FIPS mode.
|-
| 20 || Integrity checks shall be applied to the private and public key material retrieved from the database to ensure genuine data.
|-
| 21 || Once the FIPS PUB 140-2 mode of operation has been selected, the cryptographic module user shall only use FIPS PUB 140-2 cipher suite functionality.
|-
| 22 || The FIPS PUB 140-2 cipher suite shall consist solely of
* DES/Triple-DES (FIPS PUB 46-3) or AES (FIPS PUB 197) for encryption/decryption,
* SHA-1, SHA-256, SHA-384, or SHA-512 (FIPS PUB 180-2) for hashing,
* Diffie-Hellman, EC Diffie-Hellman, or Key Wrapping using RSA keys for key establishment, and
* DSA (FIPS PUB 186-2), RSA (PKCS #1), or ECDSA (ANSI X9.62) for generic signature generation and verification functionality.
<div class=note>'''Caveats''':
* Diffie-Hellman (key agreement, key establishment methodology provides between 80 bits and 112 bits of encryption strength)
* EC Diffie-Hellman (key agreement, key establishment methodology provides between 80 bits and 256 bits of encryption strength)
* RSA (PKCS #1, key wrapping, key establishment methodology provides between 80 bits and 192 bits of encryption strength)
</div>
|-
| 23 || Once the FIPS PUB 140-2 mode of operation has been selected, DES/Triple-DES/AES shall be limited in its use to perform encryption/decryption using either CBC or ECB mode.
|-
| 24 || Once the FIPS PUB 140-2 mode of operation has been selected, SHA-1, SHA-256, SHA-386, and SHA-512 shall be the only algorithms used to perform one-way hashes of data.
|-
| 25 || Once the FIPS PUB 140-2 mode of operation has been selected, RSA shall be limited in its use to generation of PKCS #1 signatures and verification of them, and to encrypting and decrypting key material for key exchange.
|-
| 26 || Once the FIPS PUB 140-2 mode of operation has been selected, DSA and ECDSA shall be used in addition to RSA to generate signatures and to perform verification on them.
|-
| 27 || In the FIPS PUB 140-2 mode of operation, the cryptographic module shall perform a pair-wise consistency test upon each invocation of RSA, DSA, and ECDSA key pair generation as defined in section 4.9.2 of FIPS PUB 140-2.
|-
| 28 || The FIPS PUB 140-2 cryptographic module shall employ its prime number generation and primality test via the mechanisms described in Appendix 2 of FIPS PUB 186-2.
|-
| 29 || The FIPS PUB 140-2 cryptographic module shall utilize pseudorandom number generation as defined via the mechanisms described in FIPS PUB 186-2 Change Notice 1.
|-
| 30 || The FIPS PUB 140-2 cryptographic module shall seed its pseudorandom number generation via invoking a noise generator specific to the platform on which it was implemented (e.g., Macintosh, UNIX, or Windows). Pseudorandom number generator shall be seeded with noise derived from the execution environment such that the noise is not predictable.
|-
| 31 || The FIPS PUB 140-2 cryptographic module's pseudorandom number generator shall be periodically reseeded with unpredictable noise.
|-
| 32 || In the FIPS PUB 140-2 mode of operation, the cryptographic module shall perform a continuous random number generator test upon each invocation of the pseudorandom number generator as defined in section 4.9.2 of FIPS PUB 140-2.
|-
| 33 || Upon exit from the FIPS PUB 140-2 mode of operation, all security relevant data items within the cryptographic module which are stored to secondary storage shall be zeroized by having their memory contents rewritten with zeroes.
|-
| 34 || The TLS pseudorandom function (PRF) is contained within the cryptographic module, and it shall enforce if one hash is weak the PRF function would remain strong. This is accomplished by exclusive-oring the results of the two hashes in computation of security relevant data items -- specifically TLS pre-master secrets.
|-
| 35 || For operation in FIPS PUB 140-2 Security Level 2 mode, the machine shall be labeled in a tamper-evident manner. Labels are to be supplied by the vendor and placed by the user on the bottom right and left edges midway between the front and the back of the case. Before placing labels, clean the portion of the case where the labels will adhere with rubbing alcohol, and allow the case to dry. Apply the labels to the indicated locations, and allow labels to set for 24 hours.
|-
| 36 || The NSS cryptographic module consists of the following shared libraries/DLLs and the associated <code>.chk</code> files:
* Windows XP Service Pack 2
** <code>softokn3.dll</code>
** <code>softokn3.chk</code>
** <code>freebl3.dll</code>
** <code>freebl3.chk</code>
* 32-bit HP-UX B.11.11 PA-RISC
** <code>libsoftokn3.sl</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl_32int_3.sl</code>
** <code>libfreebl_32int_3.chk</code>
** <code>libfreebl_32fpu_3.sl</code>
** <code>libfreebl_32fpu_3.chk</code>
* 64-bit HP-UX B.11.11 PA-RISC
** <code>libsoftokn3.sl</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl3.sl</code>
** <code>libfreebl3.chk</code>
* Mac OS X 10.4
** <code>libsoftokn3.dylib</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl3.dylib</code>
** <code>libfreebl3.chk</code>
* 64-bit Trusted Solaris 8 SPARC
** <code>libsoftokn3.so</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl_64int_3.so</code>
** <code>libfreebl_64int_3.chk</code>
** <code>libfreebl_64fpu_3.so</code>
** <code>libfreebl_64fpu_3.chk</code>
* 32-bit Solaris SPARC
** <code>libsoftokn3.so</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl_32int_3.so</code>
** <code>libfreebl_32int_3.chk</code>
** <code>libfreebl_32int64_3.so</code>
** <code>libfreebl_32int64_3.chk</code>
** <code>libfreebl_32fpu_3.so</code>
** <code>libfreebl_32fpu_3.chk</code>
* 64-bit Solaris 10 AMD64, Red Hat Enterprise Linux 4 x86, Red Hat Enterprise Linux 4 x86_64, and other Unix/Linux platforms not mentioned above
** <code>libsoftokn3.so</code>
** <code>libsoftokn3.chk</code>
** <code>libfreebl3.so</code>
** <code>libfreebl3.chk</code>
 
The NSS cryptographic module requires the Netscape Portable Runtime (NSPR), which consists of the following shared libraries/DLLs:
* Windows XP Service Pack 2
** <code>plc4.dll</code>
** <code>plds4.dll</code>
** <code>nspr4.dll</code>
* HP-UX B.11.11 PA-RISC
** <code>libplc4.sl</code>
** <code>libplds4.sl</code>
** <code>libnspr4.sl</code>
* Mac OS X 10.4
** <code>libplc4.dylib</code>
** <code>libplds4.dylib</code>
** <code>libnspr4.dylib</code>
* 32-bit Solaris SPARC
** <code>libplc4.so</code>
** <code>libplds4.so</code>
** <code>libnspr4.so</code>
** <code>cpu/sparcv8plus/libnspr_flt4.so</code>
* 64-bit Solaris 10 AMD64, 64-bit Trusted Solaris 8 SPARC, Red Hat Enterprise Linux 4 x86, Red Hat Enterprise Linux 4 x86_64, and other Unix/Linux platforms not mentioned above
** <code>libplc4.so</code>
** <code>libplds4.so</code>
** <code>libnspr4.so</code>
 
'''Step 1:''' Install the shared libraries/DLLs and the associated <code>.chk</code> files in a directory on the shared library/DLL search path, which could be a system library directory (<code>/usr/lib</code> on Unix/Linux or <code>C:\WINDOWS\system32</code> on Windows) or a directory specified in the following environment variable:
* Windows XP Service Pack 2: <code>PATH</code>
* HP-UX B.11.11 PA-RISC: <code>SHLIB_PATH</code>
* Mac OS X 10.4: <code>DYLD_LIBRARY_PATH</code>
* AIX: <code>LIBPATH</code>
* Solaris, Linux, and other Unix/Linux platforms not mentioned above: <code>LD_LIBRARY_PATH</code>
 
'''Step 2:''' Use the <code>chmod</code> utility to set the file mode bits of the shared libraries/DLLs to '''0755''' so that all users can execute the library files, but only the files' owner can modify (i.e., write, replace, and delete) the files. For example, on most Unix and Linux platforms,
  $ chmod 0755 libsoftokn3.so libfreebl*3.so libplc4.so libplds4.so libnspr4.so
 
'''Step 3:''' Use the <code>chmod</code> utility to set the file mode bits of the associated <code>.chk</code> files to '''0644'''. For example, on most Unix and Linux platforms,
  $ chmod 0644 libsoftokn3.chk libfreebl*3.chk
 
'''Step 4:''' By default the NSS cryptographic module operates in the non-FIPS Approved mode, meaning that if an application calls the standard PKCS #11 function <code>C_GetFunctionList</code> and calls the function pointers in that list, it gets the non-FIPS Approved mode. To run the NSS cryptographic module in the FIPS Approved mode, an application must call the alternative function <code>FC_GetFunctionList</code> and call the function pointers in that list. Here is the sample code using NSPR functions (declared in the header file <code>"prlink.h"</code>) for dynamic library loading and function symbol lookup:
<pre>
#include "prlink.h"
#include "cryptoki.h"
#include <assert.h>
#include <stdio.h>
 
/*
* An extension of the CK_C_INITIALIZE_ARGS structure for the
* NSS cryptographic module. The 'LibraryParameters' field is
* used to pass instance-specific information to the library
* (like where to find its config files, etc).
*/
typedef struct CK_C_INITIALIZE_ARGS_NSS {
    CK_CREATEMUTEX CreateMutex;
    CK_DESTROYMUTEX DestroyMutex;
    CK_LOCKMUTEX LockMutex;
    CK_UNLOCKMUTEX UnlockMutex;
    CK_FLAGS flags;
    CK_CHAR_PTR *LibraryParameters;
    CK_VOID_PTR pReserved;
} CK_C_INITIALIZE_ARGS_NSS;
 
int main()
{
    char *libname;
    PRLibrary *lib;
    CK_C_GetFunctionList pC_GetFunctionList;
    CK_FUNCTION_LIST_PTR pFunctionList;
    CK_RV rv;
    CK_C_INITIALIZE_ARGS_NSS initArgs;
    PRStatus status;
 
    /* Get the platform-dependent library name of the NSS cryptographic module */
    libname = PR_GetLibraryName(NULL, "softokn3");
    assert(libname != NULL);
    lib = PR_LoadLibrary(libname);
    assert(lib != NULL);
    PR_FreeLibraryName(libname);
 
    pC_GetFunctionList = (CK_C_GetFunctionList) PR_FindFunctionSymbol(lib,
        "FC_GetFunctionList");
    assert(pC_GetFunctionList != NULL);
    rv = (*pC_GetFunctionList)(&pFunctionList);
    assert(rv == CKR_OK);
 
    /* Call FC_Foo as pFunctionList->C_Foo */
 
    initArgs.CreateMutex = NULL;
    initArgs.DestroyMutex = NULL;
    initArgs.LockMutex = NULL;
    initArgs.UnlockMutex = NULL;
    initArgs.flags = CKF_OS_LOCKING_OK;
    initArgs.LibraryParameters = (CK_CHAR_PTR *)
        "configdir='.' certPrefix='' keyPrefix='' secmod='secmod.db' flags= ";
    initArgs.pReserved = NULL;
    rv = pFunctionList->C_Initialize(&initArgs);
    assert(rv == CKR_OK);
 
    /* ... */
 
    rv = pFunctionList->C_Finalize(NULL);
    assert(rv == CKR_OK);
 
    status = PR_UnloadLibrary(lib);
    assert(status == PR_SUCCESS);
    return 0;
}
</pre>
To reiterate, the mode of operation of the NSS cryptographic module is determined by the second argument passed to the <code>PR_FindFunctionSymbol</code> function.
* For the non-FIPS Approved mode of operation, look up the standard PKCS #11 function <code>"C_GetFunctionList"</code>.
* For the FIPS Approved mode of operation, look up the alternative function <code>"FC_GetFunctionList"</code>.
|}
 
==Non-NIST-Recommended Elliptic Curves==
 
The NSS cryptographic module implements all the NIST-Recommended elliptic curves in FIPS 186-2 and the following non-NIST-Recommended curves:
* ANSI X9.62 prime curves
** prime192v2
** prime192v3
** prime239v1
** prime239v2
** prime239v3
* ANSI X9.62-1998 binary curves
** c2pnb163v1
** c2pnb163v2
** c2pnb163v3
** c2pnb176w1 (disallowed in ANSI X9.62-2005). Note: the NSS cryptographic module incorrectly named this curve c2pnb176'''v'''1.
** c2tnb191v1
** c2tnb191v2
** c2tnb191v3
** c2pnb208w1 (disallowed in ANSI X9.62-2005)
** c2tnb239v1
** c2tnb239v2
** c2tnb239v3
** c2pnb272w1 (disallowed in ANSI X9.62-2005)
** c2pnb304w1 (disallowed in ANSI X9.62-2005)
** c2tnb359v1
** c2pnb368w1 (disallowed in ANSI X9.62-2005)
** c2tnb431r1
* SEC 2 prime curves
** secp112r1
** secp112r2
** secp128r1
** secp128r2
** secp160k1
** secp160r1
** secp160r2
** secp192k1
** secp224k1
** secp256k1
* SEC 2 binary curves
** sect113r1
** sect113r2
** sect131r1
** sect131r2
** sect163r1
** sect193r1
** sect193r2
** sect239k1
 
Although FIPS 140-2 Implementation Guidance IG 1.6 allows the use of non-NIST-Recommended curves in the FIPS Approved mode of operation, we recommend that the non-NIST-Recommended curves not be used in the FIPS mode.
 
==Specification of Roles==
 
The NSS cryptographic module utilizes a single role approach -- this role, called '''NSS User''', is a combination of both the User Role and the Crypto Officer Role. An NSS User has access to all services of the module and all keys stored in the data base.
 
==Authentication Policy==
 
The NSS cryptographic module uses '''Role-Based Authentication''' to control access to the module. To perform sensitive services using the cryptographic module, an operator must explicitly request to assume the NSS User role by logging into the module, and perform an authentication procedure using information unique to that operator (individual password). Role-based authentication is used to safeguard a user's '''private key''' information. However, Discretionary Access Control (DAC) is used to safeguard all other NSS User information (e.g., the public key certificate database).
 
==Strength of Authentication Mechanism==
 
In FIPS mode, the NSS cryptographic module imposes the following requirements on the password.
* The password must be at least '''seven''' characters long.
* The password must consist of characters from '''three or more character classes'''. We define five character classes: digits (0-9), ASCII lowercase letters, ASCII uppercase letters, ASCII non-alphanumeric characters (such as space and punctuation marks), and non-ASCII characters.  If an ASCII uppercase letter is the first character of the password, the uppercase letter is not counted toward its character class.  Similarly, if a digit is the last character of the password, the digit is not counted toward its character class.
 
To estimate the probability that a random guess of the password will succeed, we assume that
* the characters of the password are '''independent''' with each other, and
* the probability of guessing an individual character of the password is < '''1/10'''.
Since the password is >= 7 characters long, the probability that a random guess of the password will succeed is < (1/10)^7 = 1/10,000,000.
 
After each failed authentication attempt in FIPS mode, the NSS cryptographic module inserts a one-second delay before returning to the caller, allowing at most 60 authentication attempts during a one-minute period. Therefore, the probability of a successful random guess of the password during a one-minute period is < 60 * 1/10,000,000 = 0.6 * (1/100,000).
 
==Specification of Maintenance Roles==
 
This section is not applicable to the NSS cryptographic module since it does not have a Maintenance Role.
 
==Multiple Concurrent Operator Roles and Services==
 
The NSS cryptographic module doesn't allow concurrent '''operators'''.
* For Security Level 1, the operating system has been restricted to a single operator mode of operation, so concurrent operators are explicitly excluded (FIPS 140-2 Sec. 4.6.1).
* On a multi-user operating system, this is enforced by making the NSS certificate and key databases readable and writable by only the owner of the files.
 
FIPS 140-2 Implementation Guidance 6.1 clarifies the use of a cryptographic module on a server.
<div class=quote>
When a crypto module is implemented in a server environment, the server application is the user of the cryptographic module. The server application makes the calls to the cryptographic module. Therefore, the server application is the single user of the cryptographic module, even when the server application is serving multiple clients.
</div>
 
<div class=note>
'''Note''': The NSS cryptographic module does allow concurrent '''processes''' with the same user identity to access the module, with the restriction that all the concurrent processes must open the NSS databases in read-only mode. Each process accessing the module needs to assume a role separately.
 
The NSS cryptographic module also allows a process to open multiple concurrent '''sessions''' (connections) with the module. When a session within a process assumes a role, all the concurrent sessions within the process assume that role (PKCS #11 v2.20, Sec. 11.4, C_Login).
</div>
 
==Specification of Services==
 
Since there is only one role, the user has access to '''ALL''' the services. Routines have been specified for each service and denoted whether or not they are '''public''', meaning that the user doesn't need to authenticate to the module to use the routine, or '''private''', meaning that the user needs to authenticate to the module to use the routine. This model allows a type of '''safety state''' by allowing a NSS user to log out (thus disallowing any access to private services) without ending the session, and then log back in to re-authenticate and access private services rendered by the cryptographic module. All public and private services are listed in the following table:
 
<table border="1">
<caption><b>Table II. Services</b></caption>
    <tr valign="top">
      <td
style="width: 170px; text-align: center; vertical-align: middle;">
      <p><font face="Palatino"><font size="2"><b>Service
Category</b></font></font></p>
      </td>
      <td style="text-align: center;">
      <p><font face="Palatino"><font size="2"><b>Role</b></font></font></p>
      </td>
      <td
style="width: 224px; text-align: center; vertical-align: middle;">
      <p style="width: 187px;"><font face="Palatino"><font
size="2"><b>Function Name</b></font></font></p>
      </td>
      <td
style="width: 369px; text-align: center; vertical-align: middle;">
      <p><font face="Palatino"><font size="2"><b>Description</b></font></font></p>
      </td>
      <td style="text-align: center; vertical-align: middle;">
      <p><font face="Palatino"><font size="2"><b>Access
to<br>
Keys and CSPs</b></font></font></p>
      </td>
    </tr>
    <tr valign="top">
      <td width="170">
      <p><font face="Palatino"><font size="2">FIPS
140-2 specific</font></font></p>
      </td>
      <td style="width: 34px;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetFunctionList</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">return
the list of FIPS 140-2 functions</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="3" width="170">
      <p><font face="Palatino"><font size="2">Installation
and Initialization</font></font></p>
      </td>
      <td rowspan="3"
style="width: 34px; vertical-align: middle;">Crypto
officer</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Initialize</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
Cryptoki. This function provides the Power Up self-test service</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_</font></font><font
face="Palatino"><font size="2">InitToken</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a token</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_</font></font><font
face="Palatino"><font size="2">InitPIN</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
the normal user's PIN</font></font></p>
      </td>
      <td>
      <p align="center">W</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="3" width="170">
      <p><font size="2"><font face="Palatino">General</font></font><br>
      <font size="2"><font face="Palatino">purpose</font></font></p>
      </td>
      <td rowspan="3"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Initialize</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
Cryptoki. This function provides the Power Up self-test service</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Finalize</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finalizes
Cryptoki</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetInfo</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
general information about Cryptoki</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="7" width="170">
      <p><font size="2"><font face="Palatino">Slot
and</font></font><br>
      <font size="2"><font face="Palatino">token</font></font><br>
      <font size="2"><font face="Palatino">management</font></font></p>
      </td>
      <td rowspan="7"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetSlotList</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
a list of slots in the system</font>-</font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetSlotInfo</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
information about a particular slot</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetTokenInfo</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
information about the token. This function provides the Show Status
service</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetMechansimList</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
a list of mechanisms supported by a token</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetMechanismInfo</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
information about a particular mechanism</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_InitToken</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a token</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SetPIN</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">modifies
the PIN of the current user</font></font></p>
      </td>
      <td>
      <p align="center">RW</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="8" width="170">
      <p><font face="Palatino"><font size="2">Session
management</font></font></p>
      </td>
      <td rowspan="8"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_OpenSession</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">opens
a connection or "session" between an application and a particular token</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_CloseSession</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">closes
a session</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_CloseAllSessions</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">closes
all sessions with a token</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetSessionInfo</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
information about the session</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetOperationState</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">saves
the state of the cryptographic operation in a session</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SetOperationState</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">restores
the state of the cryptographic operation in a session</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Login</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">logs
into a token</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Logout</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">logs
out from a token</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="9" width="170">
      <p><font size="2"><font face="Palatino">Object</font></font><br>
      <font size="2"><font face="Palatino">management</font></font><br>
      <font size="2"><font face="Palatino">(private)</font></font></p>
      </td>
      <td rowspan="9"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_CreateObject</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">creates
an object</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_CopyObject</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">creates
a copy of an object</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DestroyObject</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">destroys
an object</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetObjectSize</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
the size of an object in bytes</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetAttributeValue</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
an attribute value of an object</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SetAttributeValue</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">modifies
an attribute value of an object</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_FindObjectsInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
an object search operation</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_FindObjects</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
an object search operation</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_FindObjectsFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
an object search operation</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="8" width="170">
      <p><font size="2"><font face="Palatino">Encryption</font></font>
      <font size="2"><font face="Palatino">and</font></font><br>
      <font size="2"><font face="Palatino">decryption</font></font><br>
      <font size="2"><font face="Palatino">(private)</font></font></p>
      </td>
      <td rowspan="8" style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_EncryptInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
an encryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Encrypt</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">encrypts
single-part data</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_EncryptUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part encryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_EncryptFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
a multiple-part encryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DecryptInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a decryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Decrypt</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">decrypts
single-part encrypted data</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DecryptUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part decryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DecryptFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
a multiple-part decryption operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="5" width="170">
      <p><font size="2"><font face="Palatino">Message</font></font><br>
      <font size="2"><font face="Palatino">digesting</font></font><br>
      <font size="2"><font face="Palatino">(public)</font></font></p>
      </td>
      <td rowspan="5"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DigestInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a message-digesting operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Digest</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">digests
single-part data</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DigestUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part digesting operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DigestKey</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multi-part message-digesting operation by digesting the value of a
secret key as part of the data already digested</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DigestFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
a multiple-part digesting operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="12" width="170">
      <p><font size="2"><font face="Palatino">Signature</font></font>
      <font size="2"><font face="Palatino">and</font></font><br>
      <font size="2"><font face="Palatino">verification</font></font><br>
      <font size="2"><font face="Palatino">(private)</font></font></p>
      </td>
      <td rowspan="12"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a signature operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Sign</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">signs
single-part data</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part signature operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
a multiple-part signature operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignRecoverInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a signature operation, where the data can be recovered from the
signature</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignRecover</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">signs
single-part data, where the data can be recovered from the signature</font></font></p>
      </td>
      <td>
      <p>R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_VerifyInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a verification operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_Verify</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">verifies
a signature on single-part data</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_VerifyUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part verification operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_VerifyFinal</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">finishes
a multiple-part verification operation</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_VerifyRecoverInit</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">initializes
a verification operation where the data is recovered from the signature</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_VerifyRecover</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">verifies
a signature on single-part data, where the data is recovered from the
signature</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="4" width="170">
      <p><font size="2"><font face="Palatino">Dual-function</font></font><br>
      <font size="2"><font face="Palatino">cryptographic</font></font><br>
      <font size="2"><font face="Palatino">operations</font></font></p>
      </td>
      <td rowspan="4"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DigestEncryptUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part digesting and encryption operation </font></font>
      </p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DecryptDigestUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part decryption and digesting operation </font></font>
      </p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SignEncryptUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part signing and encryption operation </font></font>
      </p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DecryptVerifyUpdate</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">continues
a multiple-part decryption and verify operation </font></font>
      </p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="5" width="170">
      <p><font size="2"><font face="Palatino">Key</font></font><br>
      <font size="2"><font face="Palatino">management</font></font><br>
      <font size="2"><font face="Palatino">(private)</font></font></p>
      </td>
      <td rowspan="5"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GenerateKey</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">generates
a secret key</font></font></p>
      </td>
      <td>
      <p align="center">W</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GenerateKeyPair</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">generates
a public-key/private-key pair</font></font></p>
      </td>
      <td>
      <p align="center">W</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_WrapKey</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">wraps
(encrypts) a key</font></font></p>
      </td>
      <td>
      <p align="center">R</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_UnwrapKey</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">unwraps
(decrypts) a key</font></font></p>
      </td>
      <td>
      <p align="center">W</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_DeriveKey</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">derives
a key from a base key</font></font></p>
      </td>
      <td>
      <p align="center">RW</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="2" width="170">
      <p><font size="2"><font face="Palatino">Random
number</font></font><br>
      <font size="2"><font face="Palatino">generation</font></font><br>
      <font size="2"><font face="Palatino">(public)</font></font></p>
      </td>
      <td rowspan="2"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_SeedRandom</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">mixes
in additional seed material to the random number generator</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GenerateRandom</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">generates
random data. Performs continuous random number generator test.</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td rowspan="2" width="170">
      <p><font face="Palatino"><font size="2">Function
management</font></font></p>
      </td>
      <td rowspan="2"
style="width: 34px; vertical-align: middle;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_GetFunctionStatus</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">obtains
updated status of a function running in parallel with the application</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">FC_CancelFunction</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">cancels
a function running in parallel with the application</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
    <tr valign="top">
      <td width="170">
      <p><font face="Palatino"><font size="2">Callbacks</font></font></p>
      </td>
      <td style="width: 34px;">User</td>
      <td style="width: 224px;">
      <p><font face="Palatino"><font size="2">Notify</font></font></p>
      </td>
      <td width="369">
      <p><font face="Palatino"><font size="2">processes
notifications from Cryptoki</font></font></p>
      </td>
      <td>
      <p align="center">-</p>
      </td>
    </tr>
</table>
 
==Bypass Capabilities==
This section is not applicable to the NSS cryptographic module because it does not implement a bypass capability.
 
==Access Control Policy==
 
This section identifies the cryptographic keys and CSPs that the user has access to while performing a service, and the type of access the user has to the parameters.
 
=== Security-Relevant Information ===
 
The NSS cryptographic module employs the following cryptographic keys and CSPs.
* secret, private, and public cryptographic keys (both plaintext and encrypted)
* internal state of the random number generator
* authentication data (passwords)
* audited events and audit data
 
=== Service Relationships to Security-Relevant Information Matrix ===
 
TODO: Table IV. Access Rights within Services
 
<table border="1">
      <caption><b>Table IV. Access Rights within Services ('''Out of Date''')</b></caption>
 
          <tr>
      <th>Service</th>
        <th>Service Routine</th>
        <th>Security Relevant Data Item</th>
        <th>Read <br>
      Access</th>
 
        <th>Write <br>
      Access</th>
      </tr>
        <tr>
      <th rowspan="15">Key<br>Storage and <br>Retrieval</th>
 
        <td rowspan="1">FC_WrapKey()</td>
        <td>Private Key</td>
        <td>                                         
      <center>X</center>
      </td>
        <td>                                         
      <center>X</center>
      </td>
      </td>
      </tr>
        <tr>
      <td rowspan="2">FC_UnwrapKey()</td>
        <td>private key</td>
        <td>                                         
      <center>X</center>
 
      </td>
        <td>                                         
      <center>X</center>
      </td>
      </tr>
 
        <tr>
      <td>SECStatus</td>
 
        <td>                                         
      <center>X</center>
      </td>
        <td>                                         
      <center>-</center>
      </td>
      </tr>
        <tr>
      <td rowspan="3">SEC_DeletePermCertificate()</td>
 
        <td>CERTCertDBHandle</td>
        <td>                                         
      <center>X</center>
      </td>
        <td>                                         
      <center>X</center>
      </td>
      </tr>
 
        <tr>
      <td>CERTCertificate</td>
        <td>                                         
      <center>X</center>
      </td>
        <td>                                         
      <center>X</center>
      </td>
 
      </tr>
        <tr>
      <td>SECStatus</td>
        <td>                                         
      <center>X</center>
      </td>
        <td>                                         
      <center>-</center>
 
      </td>
      </tr>
        <tr>
      <td rowspan="2">SEC_TraversePermCerts()</td>
        <td>CERTCertDBHandle</td>
        <td>                                         
      <center>X</center>
      </td>
 
        <td>                                         
      <center>X</center>
      </td>
      </tr>
        <tr>
      <td>SECStatus</td>
        <td>                                         
      <center>X</center>
 
      </td>
        <td>                                         
      <center>-</center>
      </td>
      </tr>                     
</table>
 
== Means of Access ==
Prior to execution of the Client or Server products, the Security Libraries are stored on disk in compiled binary form. The NSS cryptographic module relies on Discretionary Access Controls (DAC) to protect the binary image from being tampered with.
 
== Zeroization ==
The NSS cryptographic module takes a number of explicit zeroization steps to clear the memory region previously occupied by a private key or password. In summary, private keys are always stored in encrypted form. Any key material that has been unwrapped (decrypted) for use is zeroed once the use is complete.
 
== Role-based Authentication ==
The NSS cryptographic module uses role-based authentication.  It uses a single-role mechanism referred to above as a NSS User. Authentication shall always be required upon initializing the NSS cryptographic module in the FIPS mode. If a PKCS #11 function that requires authentication is called before the NSS User is authenticated, it returns the <code>CKR_USER_NOT_LOGGED_IN</code> error code. Call the PKCS #11 function <code>FC_Login</code> to provide the required authentication.
 
== Mitigation of Other Attacks ==
The NSS cryptographic module is designed to mitigate the following
attacks.
{| border="1" cellpadding="2"
|+
|-
!
Other Attacks
!
Mitigation Mechanism
!
Specific Limitations
|-
| Timing attacks on RSA
|| '''RSA blinding'''
 
Timing attack on RSA was first demonstrated by Paul Kocher in 1996[1], who contributed the mitigation code to our module. Most recently Boneh and Brumley[2] showed that RSA blinding is an effective defense against timing attacks on RSA.
|| None.
|-
| Cache-timing attacks on the modular exponentiation operation used in RSA and DSA
|| '''Cache invariant modular exponentiation'''
 
This is a variant of a modular exponentiation implementation that Colin Percival[3] showed to defend against cache-timing attacks.
|| This mechanism requires intimate knowledge of the cache line sizes of the processor. The mechanism may be ineffective when the module is running on a processor whose cache line sizes are unknown.
|-
| Arithmetical errors in RSA signatures
|| '''Double-checking RSA signatures'''
 
Arithmetical errors in RSA signatures might leak the private key. Ferguson and Schneier[4] recommend that every RSA signature generation should verify the signature just generated.
|| None.
|-
|}
 
== Results of FIPS 140-2 Level 2 Validation of NSS Cryptographic Module 3.11.5 ==
<table width="100%" border="1" cellspacing="2" cellpadding="2">
          <tr>
            <td valign="Top" align="Center"><font size="+1"><b>FIPS 140-2<br>Section<br>
            </b></font></td>
            <td valign="Top" align="Center"><font size="+1"><b>Description<br>
            </b></font></td>
            <td valign="Top" align="Center"><font size="+1"><b>Validation<br>      Level <br>Obtained<br>
 
            </b></font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">1.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Cryptographic Modules<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">2.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Module Interfaces<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">3.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Roles, Services, and Authentication<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">4.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Finite State Machine Model<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">5.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Physical Security<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">6.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Operational Enviroment<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">7.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Cryptographic Key Management<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">8.0<br>
            </font></td>
            <td valign="Top"><font size="+1">EMI/EMC<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">9.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Self-Tests<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2</font><br>
 
            </td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">10.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Design Assurance<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
            <tr>
            <td valign="Top" align="Left"><font size="+1">11.0<br>
            </font></td>
            <td valign="Top"><font size="+1">Mitigation of other Attacks<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
          <tr>
            <td valign="Top" align="Left"><font size="+1">C<br>
            </font></td>
            <td valign="Top"><font size="+1">Cryptographic Security Policy<br>
            </font></td>
            <td valign="Top" align="Center"><font size="+1">2<br>
 
            </font></td>
          </tr>
 
</table>
 
== Platform List ==
* Level 1
** RHEL 4 x86
** Windows XP Service Pack 2
** 64-bit Solaris 10 AMD64
** HP-UX B.11.11 PA-RISC
** Mac OS X 10.4
 
* Level 2
** RHEL 4 x86_86
** 64-bit Trusted Solaris 8 SPARC
 
== References ==
[1] P. Kocher, "Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems," CRYPTO '96, Lecture Notes In Computer Science, Vol. 1109, pp. 104-113, Springer-Verlag, 1996. (http://www.cryptography.com/timingattack/)
 
[2] D. Boneh and D. Brumley, "Remote Timing Attacks are Practical," http://crypto.stanford.edu/~dabo/abstracts/ssl-timing.html.
 
[3] C. Percival, "Cache Missing for Fun and Profit," http://www.daemonology.net/papers/htt.pdf.
 
[4] N. Ferguson and B. Schneier, Practical Cryptography, Sec. 16.1.4 "Checking RSA Signatures", p. 286, Wiley Publishing, Inc., 2003.

Latest revision as of 20:55, 23 March 2007

This is a draft document.

Security Policy