fipstokn.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:29k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * This file implements PKCS 11 on top of our existing security modules
  35.  *
  36.  * For more information about PKCS 11 See PKCS 11 Token Inteface Standard.
  37.  *   This implementation has two slots:
  38.  * slot 1 is our generic crypto support. It does not require login
  39.  *   (unless you've enabled FIPS). It supports Public Key ops, and all they
  40.  *   bulk ciphers and hashes. It can also support Private Key ops for imported
  41.  *   Private keys. It does not have any token storage.
  42.  * slot 2 is our private key support. It requires a login before use. It
  43.  *   can store Private Keys and Certs as token objects. Currently only private
  44.  *   keys and their associated Certificates are saved on the token.
  45.  *
  46.  *   In this implementation, session objects are only visible to the session
  47.  *   that created or generated them.
  48.  */
  49. #include "seccomon.h"
  50. #include "softoken.h"
  51. #include "key.h"
  52. #include "pkcs11.h"
  53. #include "pkcs11i.h"
  54. /* The next two strings must be exactly 64 characters long, with the
  55.    first 32 characters meaningful  */
  56. static char *slotDescription     = 
  57. "Netscape Internal FIPS-140-1 Cryptographic Services             ";
  58. static char *privSlotDescription = 
  59. "Netscape FIPS-140-1 User Private Key Services                   ";
  60. /*
  61.  * Configuration utils
  62.  */
  63. void
  64. PK11_ConfigureFIPS(char *slotdes, char *pslotdes) 
  65. {
  66.     if (slotdes && (PORT_Strlen(slotdes) == 65)) {
  67. slotDescription = slotdes;
  68.     }
  69.     if (pslotdes && (PORT_Strlen(pslotdes) == 65)) {
  70. privSlotDescription = pslotdes;
  71.     }
  72.     return;
  73. }
  74. /*
  75.  * ******************** Password Utilities *******************************
  76.  */
  77. static PRBool isLoggedIn = PR_FALSE;
  78. static PRBool fatalError = PR_FALSE;
  79. /* Fips required checks before any useful crypto graphic services */
  80. static CK_RV pk11_fipsCheck(void) {
  81.     if (isLoggedIn != PR_TRUE) 
  82. return CKR_USER_NOT_LOGGED_IN;
  83.     if (fatalError) 
  84. return CKR_DEVICE_ERROR;
  85.     return CKR_OK;
  86. }
  87. #define PK11_FIPSCHECK() 
  88.     CK_RV rv; 
  89.     if ((rv = pk11_fipsCheck()) != CKR_OK) return rv;
  90. #define PK11_FIPSFATALCHECK() 
  91.     if (fatalError) return CKR_DEVICE_ERROR;
  92. /* grab an attribute out of a raw template */
  93. void *
  94. fc_getAttribute(CK_ATTRIBUTE_PTR pTemplate, 
  95. CK_ULONG ulCount, CK_ATTRIBUTE_TYPE type)
  96. {
  97.     int i;
  98.     for (i=0; i < (int) ulCount; i++) {
  99. if (pTemplate[i].type == type) {
  100.     return pTemplate[i].pValue;
  101. }
  102.     }
  103.     return NULL;
  104. }
  105. #define __PASTE(x,y) x##y
  106. /* ------------- forward declare all the NSC_ functions ------------- */
  107. #undef CK_NEED_ARG_LIST
  108. #undef CK_PKCS11_FUNCTION_INFO
  109. #define CK_PKCS11_FUNCTION_INFO(name) CK_RV __PASTE(NS,name)
  110. #define CK_NEED_ARG_LIST 1
  111. #include "pkcs11f.h"
  112. /* ------------- forward declare all the FIPS functions ------------- */
  113. #undef CK_NEED_ARG_LIST
  114. #undef CK_PKCS11_FUNCTION_INFO
  115. #define CK_PKCS11_FUNCTION_INFO(name) CK_RV __PASTE(F,name)
  116. #define CK_NEED_ARG_LIST 1
  117. #include "pkcs11f.h"
  118. /* ------------- build the CK_CRYPTO_TABLE ------------------------- */
  119. static CK_FUNCTION_LIST pk11_fipsTable = {
  120.     { 1, 10 },
  121. #undef CK_NEED_ARG_LIST
  122. #undef CK_PKCS11_FUNCTION_INFO
  123. #define CK_PKCS11_FUNCTION_INFO(name) __PASTE(F,name),
  124. #include "pkcs11f.h"
  125. };
  126. #undef CK_NEED_ARG_LIST
  127. #undef CK_PKCS11_FUNCTION_INFO
  128. #undef __PASTE
  129. /**********************************************************************
  130.  *
  131.  *     Start of PKCS 11 functions 
  132.  *
  133.  **********************************************************************/
  134. /* return the function list */
  135. CK_RV FC_GetFunctionList(CK_FUNCTION_LIST_PTR *pFunctionList) {
  136.     *pFunctionList = &pk11_fipsTable;
  137.     return CKR_OK;
  138. }
  139. /* FC_Initialize initializes the PKCS #11 library. */
  140. CK_RV FC_Initialize(CK_VOID_PTR pReserved) {
  141.     CK_RV rv;
  142.     static PRBool init= PR_FALSE;
  143.     rv = PK11_LowInitialize(pReserved);
  144.     if (rv == CKR_OK && !init) {
  145. init = PR_TRUE;
  146. rv = PK11_SlotInit(FIPS_SLOT_ID,PR_TRUE);
  147. /* fall through to check below */
  148.     }
  149.     /* not an 'else' rv can be set by either PK11_LowInit or PK11_SlotInit*/
  150.     if (rv != CKR_OK) {
  151. fatalError = PR_TRUE;
  152. return rv;
  153.     }
  154.     fatalError = PR_FALSE; /* any error has been reset */
  155.     rv = pk11_fipsPowerUpSelfTest();
  156.     if (rv != CKR_OK) {
  157. fatalError = PR_TRUE;
  158. return rv;
  159.     }
  160.     return CKR_OK;
  161. }
  162. /*FC_Finalize indicates that an application is done with the PKCS #11 library.*/
  163. CK_RV FC_Finalize (CK_VOID_PTR pReserved) {
  164.    /* this should free up FIPS Slot */
  165.    return NSC_Finalize (pReserved);
  166. }
  167. /* FC_GetInfo returns general information about PKCS #11. */
  168. CK_RV  FC_GetInfo(CK_INFO_PTR pInfo) {
  169.     return NSC_GetInfo(pInfo);
  170. }
  171. /* FC_GetSlotList obtains a list of slots in the system. */
  172. CK_RV FC_GetSlotList(CK_BBOOL tokenPresent,
  173.   CK_SLOT_ID_PTR pSlotList, CK_ULONG_PTR pulCount) {
  174.     *pulCount = 1;
  175.     if (pSlotList != NULL) {
  176. pSlotList[0] = FIPS_SLOT_ID;
  177.     }
  178.     return CKR_OK;
  179. }
  180. /* FC_GetSlotInfo obtains information about a particular slot in the system. */
  181. CK_RV FC_GetSlotInfo(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo) {
  182.     CK_RV crv;
  183.     if (slotID != FIPS_SLOT_ID) return CKR_SLOT_ID_INVALID;
  184.     /* Use NETSCAPE_SLOT_ID as a basis so that we get Library version number,
  185.      * not key_DB version number */
  186.     crv = NSC_GetSlotInfo(NETSCAPE_SLOT_ID,pInfo);
  187.     if (crv != CKR_OK) {
  188. return crv;
  189.     }
  190.     PORT_Memcpy(pInfo->slotDescription,slotDescription,64);
  191.     return CKR_OK;
  192. }
  193. /*FC_GetTokenInfo obtains information about a particular token in the system.*/
  194.  CK_RV FC_GetTokenInfo(CK_SLOT_ID slotID,CK_TOKEN_INFO_PTR pInfo) {
  195.     CK_RV crv;
  196.     if (slotID != FIPS_SLOT_ID) return CKR_SLOT_ID_INVALID;
  197.     /* use PRIVATE_KEY_SLOT_ID so we get the correct 
  198. Authentication information */
  199.     crv = NSC_GetTokenInfo(PRIVATE_KEY_SLOT_ID,pInfo);
  200.     pInfo->flags |= CKF_RNG | CKF_LOGIN_REQUIRED;
  201.     /* yes virginia, FIPS can do random number generation:) */
  202.     return crv;
  203. }
  204. /*FC_GetMechanismList obtains a list of mechanism types supported by a token.*/
  205.  CK_RV FC_GetMechanismList(CK_SLOT_ID slotID,
  206. CK_MECHANISM_TYPE_PTR pMechanismList, CK_ULONG_PTR pusCount) {
  207.     PK11_FIPSFATALCHECK();
  208.     if (slotID != FIPS_SLOT_ID) return CKR_SLOT_ID_INVALID;
  209.     /* FIPS Slot supports all functions */
  210.     return NSC_GetMechanismList(NETSCAPE_SLOT_ID,pMechanismList,pusCount);
  211. }
  212. /* FC_GetMechanismInfo obtains information about a particular mechanism 
  213.  * possibly supported by a token. */
  214.  CK_RV FC_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
  215.      CK_MECHANISM_INFO_PTR pInfo) {
  216.     PK11_FIPSFATALCHECK();
  217.     if (slotID != FIPS_SLOT_ID) return CKR_SLOT_ID_INVALID;
  218.     /* FIPS Slot supports all functions */
  219.     return NSC_GetMechanismInfo(NETSCAPE_SLOT_ID,type,pInfo);
  220. }
  221. /* FC_InitToken initializes a token. */
  222.  CK_RV FC_InitToken(CK_SLOT_ID slotID,CK_CHAR_PTR pPin,
  223.   CK_ULONG usPinLen,CK_CHAR_PTR pLabel) {
  224.     return CKR_HOST_MEMORY; /*is this the right function for not implemented*/
  225. }
  226. /* FC_InitPIN initializes the normal user's PIN. */
  227.  CK_RV FC_InitPIN(CK_SESSION_HANDLE hSession,
  228.      CK_CHAR_PTR pPin, CK_ULONG ulPinLen) {
  229.     return NSC_InitPIN(hSession,pPin,ulPinLen);
  230. }
  231. /* FC_SetPIN modifies the PIN of user that is currently logged in. */
  232. /* NOTE: This is only valid for the PRIVATE_KEY_SLOT */
  233.  CK_RV FC_SetPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pOldPin,
  234.     CK_ULONG usOldLen, CK_CHAR_PTR pNewPin, CK_ULONG usNewLen) {
  235.     CK_RV rv;
  236.     if ((rv = pk11_fipsCheck()) != CKR_OK) return rv;
  237.     return NSC_SetPIN(hSession,pOldPin,usOldLen,pNewPin,usNewLen);
  238. }
  239. /* FC_OpenSession opens a session between an application and a token. */
  240.  CK_RV FC_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags,
  241.    CK_VOID_PTR pApplication,CK_NOTIFY Notify,CK_SESSION_HANDLE_PTR phSession) {
  242.     PK11_FIPSFATALCHECK();
  243.     return NSC_OpenSession(slotID,flags,pApplication,Notify,phSession);
  244. }
  245. /* FC_CloseSession closes a session between an application and a token. */
  246.  CK_RV FC_CloseSession(CK_SESSION_HANDLE hSession) {
  247.     return NSC_CloseSession(hSession);
  248. }
  249. /* FC_CloseAllSessions closes all sessions with a token. */
  250.  CK_RV FC_CloseAllSessions (CK_SLOT_ID slotID) {
  251.     return NSC_CloseAllSessions (slotID);
  252. }
  253. /* FC_GetSessionInfo obtains information about the session. */
  254.  CK_RV FC_GetSessionInfo(CK_SESSION_HANDLE hSession,
  255. CK_SESSION_INFO_PTR pInfo) {
  256.     CK_RV rv;
  257.     PK11_FIPSFATALCHECK();
  258.     rv = NSC_GetSessionInfo(hSession,pInfo);
  259.     if (rv == CKR_OK) {
  260. if ((isLoggedIn) && (pInfo->state == CKS_RO_PUBLIC_SESSION)) {
  261. pInfo->state = CKS_RO_USER_FUNCTIONS;
  262. }
  263. if ((isLoggedIn) && (pInfo->state == CKS_RW_PUBLIC_SESSION)) {
  264. pInfo->state = CKS_RW_USER_FUNCTIONS;
  265. }
  266.     }
  267.     return rv;
  268. }
  269. /* FC_Login logs a user into a token. */
  270.  CK_RV FC_Login(CK_SESSION_HANDLE hSession, CK_USER_TYPE userType,
  271.     CK_CHAR_PTR pPin, CK_ULONG usPinLen) {
  272.     CK_RV rv;
  273.     PK11_FIPSFATALCHECK();
  274.     rv = NSC_Login(hSession,userType,pPin,usPinLen);
  275.     if (rv == CKR_OK)
  276. isLoggedIn = PR_TRUE;
  277.     else if (rv == CKR_USER_ALREADY_LOGGED_IN)
  278.     {
  279. isLoggedIn = PR_TRUE;
  280. /* Provide FIPS PUB 140-1 power-up self-tests on demand. */
  281. rv = pk11_fipsPowerUpSelfTest();
  282. if (rv == CKR_OK)
  283. return CKR_USER_ALREADY_LOGGED_IN;
  284. else
  285. fatalError = PR_TRUE;
  286.     }
  287.     return rv;
  288. }
  289. /* FC_Logout logs a user out from a token. */
  290.  CK_RV FC_Logout(CK_SESSION_HANDLE hSession) {
  291.     PK11_FIPSCHECK();
  292.  
  293.     rv = NSC_Logout(hSession);
  294.     isLoggedIn = PR_FALSE;
  295.     return rv;
  296. }
  297. /* FC_CreateObject creates a new object. */
  298.  CK_RV FC_CreateObject(CK_SESSION_HANDLE hSession,
  299. CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 
  300. CK_OBJECT_HANDLE_PTR phObject) {
  301.     CK_OBJECT_CLASS * classptr;
  302.     PK11_FIPSCHECK();
  303.     classptr = (CK_OBJECT_CLASS *)fc_getAttribute(pTemplate,ulCount,CKA_CLASS);
  304.     if (classptr == NULL) return CKR_TEMPLATE_INCOMPLETE;
  305.     /* FIPS can't create keys from raw key material */
  306.     if ((*classptr == CKO_SECRET_KEY) || (*classptr == CKO_PRIVATE_KEY)) {
  307. return CKR_ATTRIBUTE_VALUE_INVALID;
  308.     }
  309.     return NSC_CreateObject(hSession,pTemplate,ulCount,phObject);
  310. }
  311. /* FC_CopyObject copies an object, creating a new object for the copy. */
  312.  CK_RV FC_CopyObject(CK_SESSION_HANDLE hSession,
  313.        CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount,
  314. CK_OBJECT_HANDLE_PTR phNewObject) {
  315.     PK11_FIPSCHECK();
  316.     return NSC_CopyObject(hSession,hObject,pTemplate,usCount,phNewObject);
  317. }
  318. /* FC_DestroyObject destroys an object. */
  319.  CK_RV FC_DestroyObject(CK_SESSION_HANDLE hSession,
  320.   CK_OBJECT_HANDLE hObject) {
  321.     PK11_FIPSCHECK();
  322.     return NSC_DestroyObject(hSession,hObject);
  323. }
  324. /* FC_GetObjectSize gets the size of an object in bytes. */
  325.  CK_RV FC_GetObjectSize(CK_SESSION_HANDLE hSession,
  326.      CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pusSize) {
  327.     PK11_FIPSCHECK();
  328.     return NSC_GetObjectSize(hSession, hObject, pusSize);
  329. }
  330. /* FC_GetAttributeValue obtains the value of one or more object attributes. */
  331.  CK_RV FC_GetAttributeValue(CK_SESSION_HANDLE hSession,
  332.  CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount) {
  333.     PK11_FIPSCHECK();
  334.     return NSC_GetAttributeValue(hSession,hObject,pTemplate,usCount);
  335. }
  336. /* FC_SetAttributeValue modifies the value of one or more object attributes */
  337.  CK_RV FC_SetAttributeValue (CK_SESSION_HANDLE hSession,
  338.  CK_OBJECT_HANDLE hObject,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount) {
  339.     PK11_FIPSCHECK();
  340.     return NSC_SetAttributeValue(hSession,hObject,pTemplate,usCount);
  341. }
  342. /* FC_FindObjectsInit initializes a search for token and session objects 
  343.  * that match a template. */
  344.  CK_RV FC_FindObjectsInit(CK_SESSION_HANDLE hSession,
  345.      CK_ATTRIBUTE_PTR pTemplate,CK_ULONG usCount) {
  346.     PK11_FIPSCHECK();
  347.     return NSC_FindObjectsInit(hSession,pTemplate,usCount);
  348. }
  349. /* FC_FindObjects continues a search for token and session objects 
  350.  * that match a template, obtaining additional object handles. */
  351.  CK_RV FC_FindObjects(CK_SESSION_HANDLE hSession,
  352.     CK_OBJECT_HANDLE_PTR phObject,CK_ULONG usMaxObjectCount,
  353.      CK_ULONG_PTR pusObjectCount) {
  354.     PK11_FIPSCHECK();
  355.     return NSC_FindObjects(hSession,phObject,usMaxObjectCount,
  356.      pusObjectCount);
  357. }
  358. /*
  359.  ************** Crypto Functions:     Encrypt ************************
  360.  */
  361. /* FC_EncryptInit initializes an encryption operation. */
  362.  CK_RV FC_EncryptInit(CK_SESSION_HANDLE hSession,
  363.  CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) {
  364.     PK11_FIPSCHECK();
  365.     return NSC_EncryptInit(hSession,pMechanism,hKey);
  366. }
  367. /* FC_Encrypt encrypts single-part data. */
  368.  CK_RV FC_Encrypt (CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
  369.      CK_ULONG usDataLen, CK_BYTE_PTR pEncryptedData,
  370.  CK_ULONG_PTR pusEncryptedDataLen) {
  371.     PK11_FIPSCHECK();
  372.     return NSC_Encrypt(hSession,pData,usDataLen,pEncryptedData,
  373. pusEncryptedDataLen);
  374. }
  375. /* FC_EncryptUpdate continues a multiple-part encryption operation. */
  376.  CK_RV FC_EncryptUpdate(CK_SESSION_HANDLE hSession,
  377.     CK_BYTE_PTR pPart, CK_ULONG usPartLen, CK_BYTE_PTR pEncryptedPart,
  378. CK_ULONG_PTR pusEncryptedPartLen) {
  379.     PK11_FIPSCHECK();
  380.     return NSC_EncryptUpdate(hSession,pPart,usPartLen,pEncryptedPart,
  381. pusEncryptedPartLen);
  382. }
  383. /* FC_EncryptFinal finishes a multiple-part encryption operation. */
  384.  CK_RV FC_EncryptFinal(CK_SESSION_HANDLE hSession,
  385.     CK_BYTE_PTR pLastEncryptedPart, CK_ULONG_PTR pusLastEncryptedPartLen) {
  386.     PK11_FIPSCHECK();
  387.     return NSC_EncryptFinal(hSession,pLastEncryptedPart,
  388. pusLastEncryptedPartLen);
  389. }
  390. /*
  391.  ************** Crypto Functions:     Decrypt ************************
  392.  */
  393. /* FC_DecryptInit initializes a decryption operation. */
  394.  CK_RV FC_DecryptInit( CK_SESSION_HANDLE hSession,
  395.  CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) {
  396.     PK11_FIPSCHECK();
  397.     return NSC_DecryptInit(hSession,pMechanism,hKey);
  398. }
  399. /* FC_Decrypt decrypts encrypted data in a single part. */
  400.  CK_RV FC_Decrypt(CK_SESSION_HANDLE hSession,
  401.     CK_BYTE_PTR pEncryptedData,CK_ULONG usEncryptedDataLen,CK_BYTE_PTR pData,
  402.      CK_ULONG_PTR pusDataLen) {
  403.     PK11_FIPSCHECK();
  404.     return NSC_Decrypt(hSession,pEncryptedData,usEncryptedDataLen,pData,
  405.      pusDataLen);
  406. }
  407. /* FC_DecryptUpdate continues a multiple-part decryption operation. */
  408.  CK_RV FC_DecryptUpdate(CK_SESSION_HANDLE hSession,
  409.     CK_BYTE_PTR pEncryptedPart, CK_ULONG usEncryptedPartLen,
  410.      CK_BYTE_PTR pPart, CK_ULONG_PTR pusPartLen) {
  411.     PK11_FIPSCHECK();
  412.     return NSC_DecryptUpdate(hSession,pEncryptedPart,usEncryptedPartLen,
  413.      pPart,pusPartLen);
  414. }
  415. /* FC_DecryptFinal finishes a multiple-part decryption operation. */
  416.  CK_RV FC_DecryptFinal(CK_SESSION_HANDLE hSession,
  417.     CK_BYTE_PTR pLastPart, CK_ULONG_PTR pusLastPartLen) {
  418.     PK11_FIPSCHECK();
  419.     return NSC_DecryptFinal(hSession,pLastPart,pusLastPartLen);
  420. }
  421. /*
  422.  ************** Crypto Functions:     Digest (HASH)  ************************
  423.  */
  424. /* FC_DigestInit initializes a message-digesting operation. */
  425.  CK_RV FC_DigestInit(CK_SESSION_HANDLE hSession,
  426.      CK_MECHANISM_PTR pMechanism) {
  427.     PK11_FIPSFATALCHECK();
  428.     return NSC_DigestInit(hSession, pMechanism);
  429. }
  430. /* FC_Digest digests data in a single part. */
  431.  CK_RV FC_Digest(CK_SESSION_HANDLE hSession,
  432.     CK_BYTE_PTR pData, CK_ULONG usDataLen, CK_BYTE_PTR pDigest,
  433.      CK_ULONG_PTR pusDigestLen) {
  434.     PK11_FIPSFATALCHECK();
  435.     return NSC_Digest(hSession,pData,usDataLen,pDigest,pusDigestLen);
  436. }
  437. /* FC_DigestUpdate continues a multiple-part message-digesting operation. */
  438.  CK_RV FC_DigestUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,
  439.     CK_ULONG usPartLen) {
  440.     PK11_FIPSFATALCHECK();
  441.     return NSC_DigestUpdate(hSession,pPart,usPartLen);
  442. }
  443. /* FC_DigestFinal finishes a multiple-part message-digesting operation. */
  444.  CK_RV FC_DigestFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pDigest,
  445.      CK_ULONG_PTR pusDigestLen) {
  446.     PK11_FIPSFATALCHECK();
  447.     return NSC_DigestFinal(hSession,pDigest,pusDigestLen);
  448. }
  449. /*
  450.  ************** Crypto Functions:     Sign  ************************
  451.  */
  452. /* FC_SignInit initializes a signature (private key encryption) operation,
  453.  * where the signature is (will be) an appendix to the data, 
  454.  * and plaintext cannot be recovered from the signature */
  455.  CK_RV FC_SignInit(CK_SESSION_HANDLE hSession,
  456.  CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hKey) {
  457.     PK11_FIPSCHECK();
  458.     return NSC_SignInit(hSession,pMechanism,hKey);
  459. }
  460. /* FC_Sign signs (encrypts with private key) data in a single part,
  461.  * where the signature is (will be) an appendix to the data, 
  462.  * and plaintext cannot be recovered from the signature */
  463.  CK_RV FC_Sign(CK_SESSION_HANDLE hSession,
  464.     CK_BYTE_PTR pData,CK_ULONG usDataLen,CK_BYTE_PTR pSignature,
  465.      CK_ULONG_PTR pusSignatureLen) {
  466.     PK11_FIPSCHECK();
  467.     return NSC_Sign(hSession,pData,usDataLen,pSignature,pusSignatureLen);
  468. }
  469. /* FC_SignUpdate continues a multiple-part signature operation,
  470.  * where the signature is (will be) an appendix to the data, 
  471.  * and plaintext cannot be recovered from the signature */
  472.  CK_RV FC_SignUpdate(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pPart,
  473.      CK_ULONG usPartLen) {
  474.     PK11_FIPSCHECK();
  475.     return NSC_SignUpdate(hSession,pPart,usPartLen);
  476. }
  477. /* FC_SignFinal finishes a multiple-part signature operation, 
  478.  * returning the signature. */
  479.  CK_RV FC_SignFinal(CK_SESSION_HANDLE hSession,CK_BYTE_PTR pSignature,
  480.     CK_ULONG_PTR pusSignatureLen) {
  481.     PK11_FIPSCHECK();
  482.     return NSC_SignFinal(hSession,pSignature,pusSignatureLen);
  483. }
  484. /*
  485.  ************** Crypto Functions:     Sign Recover  ************************
  486.  */
  487. /* FC_SignRecoverInit initializes a signature operation,
  488.  * where the (digest) data can be recovered from the signature. 
  489.  * E.g. encryption with the user's private key */
  490.  CK_RV FC_SignRecoverInit(CK_SESSION_HANDLE hSession,
  491.  CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey) {
  492.     PK11_FIPSCHECK();
  493.     return NSC_SignRecoverInit(hSession,pMechanism,hKey);
  494. }
  495. /* FC_SignRecover signs data in a single operation
  496.  * where the (digest) data can be recovered from the signature. 
  497.  * E.g. encryption with the user's private key */
  498.  CK_RV FC_SignRecover(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
  499.   CK_ULONG usDataLen, CK_BYTE_PTR pSignature, CK_ULONG_PTR pusSignatureLen) {
  500.     PK11_FIPSCHECK();
  501.     return NSC_SignRecover(hSession,pData,usDataLen,pSignature,pusSignatureLen);
  502. }
  503. /*
  504.  ************** Crypto Functions:     verify  ************************
  505.  */
  506. /* FC_VerifyInit initializes a verification operation, 
  507.  * where the signature is an appendix to the data, 
  508.  * and plaintext cannot be recovered from the signature (e.g. DSA) */
  509.  CK_RV FC_VerifyInit(CK_SESSION_HANDLE hSession,
  510.    CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey) {
  511.     PK11_FIPSCHECK();
  512.     return NSC_VerifyInit(hSession,pMechanism,hKey);
  513. }
  514. /* FC_Verify verifies a signature in a single-part operation, 
  515.  * where the signature is an appendix to the data, 
  516.  * and plaintext cannot be recovered from the signature */
  517.  CK_RV FC_Verify(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
  518.     CK_ULONG usDataLen, CK_BYTE_PTR pSignature, CK_ULONG usSignatureLen) {
  519.     /* make sure we're legal */
  520.     PK11_FIPSCHECK();
  521.     return NSC_Verify(hSession,pData,usDataLen,pSignature,usSignatureLen);
  522. }
  523. /* FC_VerifyUpdate continues a multiple-part verification operation, 
  524.  * where the signature is an appendix to the data, 
  525.  * and plaintext cannot be recovered from the signature */
  526.  CK_RV FC_VerifyUpdate( CK_SESSION_HANDLE hSession, CK_BYTE_PTR pPart,
  527. CK_ULONG usPartLen) {
  528.     PK11_FIPSCHECK();
  529.     return NSC_VerifyUpdate(hSession,pPart,usPartLen);
  530. }
  531. /* FC_VerifyFinal finishes a multiple-part verification operation, 
  532.  * checking the signature. */
  533.  CK_RV FC_VerifyFinal(CK_SESSION_HANDLE hSession,
  534. CK_BYTE_PTR pSignature,CK_ULONG usSignatureLen) {
  535.     PK11_FIPSCHECK();
  536.     return NSC_VerifyFinal(hSession,pSignature,usSignatureLen);
  537. }
  538. /*
  539.  ************** Crypto Functions:     Verify  Recover ************************
  540.  */
  541. /* FC_VerifyRecoverInit initializes a signature verification operation, 
  542.  * where the data is recovered from the signature. 
  543.  * E.g. Decryption with the user's public key */
  544.  CK_RV FC_VerifyRecoverInit(CK_SESSION_HANDLE hSession,
  545. CK_MECHANISM_PTR pMechanism,CK_OBJECT_HANDLE hKey) {
  546.     PK11_FIPSCHECK();
  547.     return NSC_VerifyRecoverInit(hSession,pMechanism,hKey);
  548. }
  549. /* FC_VerifyRecover verifies a signature in a single-part operation, 
  550.  * where the data is recovered from the signature. 
  551.  * E.g. Decryption with the user's public key */
  552.  CK_RV FC_VerifyRecover(CK_SESSION_HANDLE hSession,
  553.  CK_BYTE_PTR pSignature,CK_ULONG usSignatureLen,
  554.      CK_BYTE_PTR pData,CK_ULONG_PTR pusDataLen) {
  555.     PK11_FIPSCHECK();
  556.     return NSC_VerifyRecover(hSession,pSignature,usSignatureLen,pData,
  557. pusDataLen);
  558. }
  559. /*
  560.  **************************** Key Functions:  ************************
  561.  */
  562. /* FC_GenerateKey generates a secret key, creating a new key object. */
  563.  CK_RV FC_GenerateKey(CK_SESSION_HANDLE hSession,
  564.     CK_MECHANISM_PTR pMechanism,CK_ATTRIBUTE_PTR pTemplate,CK_ULONG ulCount,
  565.      CK_OBJECT_HANDLE_PTR phKey) {
  566.     CK_BBOOL *boolptr;
  567.     PK11_FIPSCHECK();
  568.     /* all secret keys must be sensitive, if the upper level code tries to say
  569.      * otherwise, reject it. */
  570.     boolptr = (CK_BBOOL *) fc_getAttribute(pTemplate, ulCount, CKA_SENSITIVE);
  571.     if (boolptr != NULL) {
  572. if (!(*boolptr)) {
  573.     return CKR_ATTRIBUTE_VALUE_INVALID;
  574. }
  575.     }
  576.     return NSC_GenerateKey(hSession,pMechanism,pTemplate,ulCount,phKey);
  577. }
  578. /* FC_GenerateKeyPair generates a public-key/private-key pair, 
  579.  * creating new key objects. */
  580.  CK_RV FC_GenerateKeyPair (CK_SESSION_HANDLE hSession,
  581.     CK_MECHANISM_PTR pMechanism, CK_ATTRIBUTE_PTR pPublicKeyTemplate,
  582.     CK_ULONG usPublicKeyAttributeCount, CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
  583.     CK_ULONG usPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR phPublicKey,
  584. CK_OBJECT_HANDLE_PTR phPrivateKey) {
  585.     CK_BBOOL *boolptr;
  586.     PK11_FIPSCHECK();
  587.     /* all private keys must be sensitive, if the upper level code tries to say
  588.      * otherwise, reject it. */
  589.     boolptr = (CK_BBOOL *) fc_getAttribute(pPrivateKeyTemplate, 
  590. usPrivateKeyAttributeCount, CKA_SENSITIVE);
  591.     if (boolptr != NULL) {
  592. if (!(*boolptr)) {
  593.     return CKR_ATTRIBUTE_VALUE_INVALID;
  594. }
  595.     }
  596.     return NSC_GenerateKeyPair (hSession,pMechanism,pPublicKeyTemplate,
  597.      usPublicKeyAttributeCount,pPrivateKeyTemplate,
  598. usPrivateKeyAttributeCount,phPublicKey,phPrivateKey);
  599. }
  600. /* FC_WrapKey wraps (i.e., encrypts) a key. */
  601.  CK_RV FC_WrapKey(CK_SESSION_HANDLE hSession,
  602.     CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hWrappingKey,
  603.     CK_OBJECT_HANDLE hKey, CK_BYTE_PTR pWrappedKey,
  604.  CK_ULONG_PTR pusWrappedKeyLen) {
  605.     PK11_FIPSCHECK();
  606.     return NSC_WrapKey(hSession,pMechanism,hWrappingKey,hKey,pWrappedKey,
  607. pusWrappedKeyLen);
  608. }
  609. /* FC_UnwrapKey unwraps (decrypts) a wrapped key, creating a new key object. */
  610.  CK_RV FC_UnwrapKey(CK_SESSION_HANDLE hSession,
  611.     CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hUnwrappingKey,
  612.     CK_BYTE_PTR pWrappedKey, CK_ULONG usWrappedKeyLen,
  613.     CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usAttributeCount,
  614.  CK_OBJECT_HANDLE_PTR phKey) {
  615.     CK_BBOOL *boolptr;
  616.     PK11_FIPSCHECK();
  617.     /* all secret keys must be sensitive, if the upper level code tries to say
  618.      * otherwise, reject it. */
  619.     boolptr = (CK_BBOOL *) fc_getAttribute(pTemplate, 
  620. usAttributeCount, CKA_SENSITIVE);
  621.     if (boolptr != NULL) {
  622. if (!(*boolptr)) {
  623.     return CKR_ATTRIBUTE_VALUE_INVALID;
  624. }
  625.     }
  626.     return NSC_UnwrapKey(hSession,pMechanism,hUnwrappingKey,pWrappedKey,
  627. usWrappedKeyLen,pTemplate,usAttributeCount,phKey);
  628. }
  629. /* FC_DeriveKey derives a key from a base key, creating a new key object. */
  630.  CK_RV FC_DeriveKey( CK_SESSION_HANDLE hSession,
  631.  CK_MECHANISM_PTR pMechanism, CK_OBJECT_HANDLE hBaseKey,
  632.  CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usAttributeCount, 
  633. CK_OBJECT_HANDLE_PTR phKey) {
  634.     CK_BBOOL *boolptr;
  635.     PK11_FIPSCHECK();
  636.     /* all secret keys must be sensitive, if the upper level code tries to say
  637.      * otherwise, reject it. */
  638.     boolptr = (CK_BBOOL *) fc_getAttribute(pTemplate, 
  639. usAttributeCount, CKA_SENSITIVE);
  640.     if (boolptr != NULL) {
  641. if (!(*boolptr)) {
  642.     return CKR_ATTRIBUTE_VALUE_INVALID;
  643. }
  644.     }
  645.     return NSC_DeriveKey(hSession,pMechanism,hBaseKey,pTemplate,
  646. usAttributeCount, phKey);
  647. }
  648. /*
  649.  **************************** Radom Functions:  ************************
  650.  */
  651. /* FC_SeedRandom mixes additional seed material into the token's random number 
  652.  * generator. */
  653.  CK_RV FC_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSeed,
  654.     CK_ULONG usSeedLen) {
  655.     CK_RV crv;
  656.     PK11_FIPSFATALCHECK();
  657.     crv = NSC_SeedRandom(hSession,pSeed,usSeedLen);
  658.     if (crv != CKR_OK) {
  659. fatalError = PR_TRUE;
  660.     }
  661.     return crv;
  662. }
  663. /* FC_GenerateRandom generates random data. */
  664.  CK_RV FC_GenerateRandom(CK_SESSION_HANDLE hSession,
  665.     CK_BYTE_PTR pRandomData, CK_ULONG usRandomLen) {
  666.     CK_RV crv;
  667.     PK11_FIPSFATALCHECK();
  668.     crv = NSC_GenerateRandom(hSession,pRandomData,usRandomLen);
  669.     if (crv != CKR_OK) {
  670. fatalError = PR_TRUE;
  671.     }
  672.     return crv;
  673. }
  674. /* FC_GetFunctionStatus obtains an updated status of a function running 
  675.  * in parallel with an application. */
  676.  CK_RV FC_GetFunctionStatus(CK_SESSION_HANDLE hSession) {
  677.     PK11_FIPSCHECK();
  678.     return NSC_GetFunctionStatus(hSession);
  679. }
  680. /* FC_CancelFunction cancels a function running in parallel */
  681.  CK_RV FC_CancelFunction(CK_SESSION_HANDLE hSession) {
  682.     PK11_FIPSCHECK();
  683.     return NSC_CancelFunction(hSession);
  684. }
  685. /*
  686.  ****************************  Version 1.1 Functions:  ************************
  687.  */
  688. /* FC_GetOperationState saves the state of the cryptographic 
  689.  *operation in a session. */
  690. CK_RV FC_GetOperationState(CK_SESSION_HANDLE hSession, 
  691. CK_BYTE_PTR  pOperationState, CK_ULONG_PTR pulOperationStateLen) {
  692.     PK11_FIPSFATALCHECK();
  693.     return NSC_GetOperationState(hSession,pOperationState,pulOperationStateLen);
  694. }
  695. /* FC_SetOperationState restores the state of the cryptographic operation 
  696.  * in a session. */
  697. CK_RV FC_SetOperationState(CK_SESSION_HANDLE hSession, 
  698. CK_BYTE_PTR  pOperationState, CK_ULONG  ulOperationStateLen,
  699.         CK_OBJECT_HANDLE hEncryptionKey, CK_OBJECT_HANDLE hAuthenticationKey) {
  700.     PK11_FIPSFATALCHECK();
  701.     return NSC_SetOperationState(hSession,pOperationState,ulOperationStateLen,
  702.          hEncryptionKey,hAuthenticationKey);
  703. }
  704. /* FC_FindObjectsFinal finishes a search for token and session objects. */
  705. CK_RV FC_FindObjectsFinal(CK_SESSION_HANDLE hSession) {
  706.     PK11_FIPSCHECK();
  707.     return NSC_FindObjectsFinal(hSession);
  708. }
  709. /* Dual-function cryptographic operations */
  710. /* FC_DigestEncryptUpdate continues a multiple-part digesting and encryption 
  711.  * operation. */
  712. CK_RV FC_DigestEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR  pPart,
  713.     CK_ULONG  ulPartLen, CK_BYTE_PTR  pEncryptedPart,
  714.  CK_ULONG_PTR pulEncryptedPartLen) {
  715.     PK11_FIPSCHECK();
  716.     return NSC_DigestEncryptUpdate(hSession,pPart,ulPartLen,pEncryptedPart,
  717.  pulEncryptedPartLen);
  718. }
  719. /* FC_DecryptDigestUpdate continues a multiple-part decryption and digesting 
  720.  * operation. */
  721. CK_RV FC_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,
  722.      CK_BYTE_PTR  pEncryptedPart, CK_ULONG  ulEncryptedPartLen,
  723.      CK_BYTE_PTR  pPart, CK_ULONG_PTR pulPartLen) {
  724.     PK11_FIPSCHECK();
  725.     return NSC_DecryptDigestUpdate(hSession, pEncryptedPart,ulEncryptedPartLen,
  726.      pPart,pulPartLen);
  727. }
  728. /* FC_SignEncryptUpdate continues a multiple-part signing and encryption 
  729.  * operation. */
  730. CK_RV FC_SignEncryptUpdate(CK_SESSION_HANDLE hSession, CK_BYTE_PTR  pPart,
  731.  CK_ULONG  ulPartLen, CK_BYTE_PTR  pEncryptedPart,
  732.  CK_ULONG_PTR pulEncryptedPartLen) {
  733.     PK11_FIPSCHECK();
  734.     return NSC_SignEncryptUpdate(hSession,pPart,ulPartLen,pEncryptedPart,
  735.  pulEncryptedPartLen);
  736. }
  737. /* FC_DecryptVerifyUpdate continues a multiple-part decryption and verify 
  738.  * operation. */
  739. CK_RV FC_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession, 
  740. CK_BYTE_PTR  pEncryptedData, CK_ULONG  ulEncryptedDataLen, 
  741. CK_BYTE_PTR  pData, CK_ULONG_PTR pulDataLen) {
  742.     PK11_FIPSCHECK();
  743.     return NSC_DecryptVerifyUpdate(hSession,pEncryptedData,ulEncryptedDataLen, 
  744. pData,pulDataLen);
  745. }
  746. /* FC_DigestKey continues a multi-part message-digesting operation,
  747.  * by digesting the value of a secret key as part of the data already digested.
  748.  */
  749. CK_RV FC_DigestKey(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hKey) {
  750.     PK11_FIPSCHECK();
  751.     return NSC_DigestKey(hSession,hKey);
  752. }
  753. CK_RV FC_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot,
  754.  CK_VOID_PTR pReserved)
  755. {
  756.     return NSC_WaitForSlotEvent(flags, pSlot, pReserved);
  757. }