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

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. #ifndef NSSCKMDT_H
  34. #define NSSCKMDT_H
  35. #ifdef DEBUG
  36. static const char NSSCKMDT_CVS_ID[] = "@(#) $RCSfile: nssckmdt.h,v $ $Revision: 1.1 $ $Date: 2000/03/31 19:43:30 $ $Name: NSS_3_1_1_RTM $";
  37. #endif /* DEBUG */
  38. /*
  39.  * nssckmdt.h
  40.  *
  41.  * This file specifies the basic types that must be implemented by
  42.  * any Module using the NSS Cryptoki Framework.
  43.  */
  44. #ifndef NSSBASET_H
  45. #include "nssbaset.h"
  46. #endif /* NSSBASET_H */
  47. #ifndef NSSCKT_H
  48. #include "nssckt.h"
  49. #endif /* NSSCKT_H */
  50. #ifndef NSSCKFWT_H
  51. #include "nssckfwt.h"
  52. #endif /* NSSCKFWT_H */
  53. typedef struct NSSCKMDInstanceStr NSSCKMDInstance;
  54. typedef struct NSSCKMDSlotStr NSSCKMDSlot;
  55. typedef struct NSSCKMDTokenStr NSSCKMDToken;
  56. typedef struct NSSCKMDSessionStr NSSCKMDSession;
  57. typedef struct NSSCKMDFindObjectsStr NSSCKMDFindObjects;
  58. typedef struct NSSCKMDMechanismStr NSSCKMDMechanism;
  59. typedef struct NSSCKMDObjectStr NSSCKMDObject;
  60. /*
  61.  * NSSCKMDInstance
  62.  *
  63.  * This is the basic handle for an instance of a PKCS#11 Module.
  64.  * It is returned by the Module's CreateInstance routine, and
  65.  * may be obtained from the corresponding NSSCKFWInstance object.
  66.  * It contains a pointer for use by the Module, to store any
  67.  * instance-related data, and it contains the EPV for a set of
  68.  * routines which the Module may implement for use by the Framework.
  69.  * Some of these routines are optional; others are mandatory.
  70.  */
  71. struct NSSCKMDInstanceStr {
  72.   /*
  73.    * The Module may use this pointer for its own purposes.
  74.    */
  75.   void *etc;
  76.   /*
  77.    * This routine is called by the Framework to initialize
  78.    * the Module.  This routine is optional; if unimplemented,
  79.    * it won't be called.  If this routine returns an error,
  80.    * then the initialization will fail.
  81.    */
  82.   CK_RV (PR_CALLBACK *Initialize)(
  83.     NSSCKMDInstance *mdInstance,                                    
  84.     NSSCKFWInstance *fwInstance,
  85.     NSSUTF8 *configurationData
  86.   );
  87.   /*
  88.    * This routine is called when the Framework is finalizing
  89.    * the PKCS#11 Module.  It is the last thing called before
  90.    * the NSSCKFWInstance's NSSArena is destroyed.  This routine
  91.    * is optional; if unimplemented, it merely won't be called.
  92.    */
  93.   void (PR_CALLBACK *Finalize)(
  94.     NSSCKMDInstance *mdInstance,                                    
  95.     NSSCKFWInstance *fwInstance
  96.   );
  97.   /*
  98.    * This routine gets the number of slots.  This value must
  99.    * never change, once the instance is initialized.  This 
  100.    * routine must be implemented.  It may return zero on error.
  101.    */
  102.   CK_ULONG (PR_CALLBACK *GetNSlots)(
  103.     NSSCKMDInstance *mdInstance,                                    
  104.     NSSCKFWInstance *fwInstance,
  105.     CK_RV *pError
  106.   );
  107.   /*
  108.    * This routine returns the version of the Cryptoki standard
  109.    * to which this Module conforms.  This routine is optional;
  110.    * if unimplemented, the Framework uses the version to which
  111.    * ~it~ was implemented.
  112.    */
  113.   CK_VERSION (PR_CALLBACK *GetCryptokiVersion)(
  114.     NSSCKMDInstance *mdInstance,                                    
  115.     NSSCKFWInstance *fwInstance
  116.   );
  117.   /*
  118.    * This routine returns a pointer to a UTF8-encoded string
  119.    * containing the manufacturer ID for this Module.  Only
  120.    * the characters completely encoded in the first thirty-
  121.    * two bytes are significant.  This routine is optional.
  122.    * The string returned is never freed; if dynamically generated,
  123.    * the space for it should be allocated from the NSSArena
  124.    * that may be obtained from the NSSCKFWInstance.  This
  125.    * routine may return NULL upon error; however if *pError
  126.    * is CKR_OK, the NULL will be considered the valid response.
  127.    */
  128.   NSSUTF8 *(PR_CALLBACK *GetManufacturerID)(
  129.     NSSCKMDInstance *mdInstance,                                    
  130.     NSSCKFWInstance *fwInstance,
  131.     CK_RV *pError
  132.   );
  133.   /*
  134.    * This routine returns a pointer to a UTF8-encoded string
  135.    * containing a description of this Module library.  Only
  136.    * the characters completely encoded in the first thirty-
  137.    * two bytes are significant.  This routine is optional.
  138.    * The string returned is never freed; if dynamically generated,
  139.    * the space for it should be allocated from the NSSArena
  140.    * that may be obtained from the NSSCKFWInstance.  This
  141.    * routine may return NULL upon error; however if *pError
  142.    * is CKR_OK, the NULL will be considered the valid response.
  143.    */
  144.   NSSUTF8 *(PR_CALLBACK *GetLibraryDescription)(
  145.     NSSCKMDInstance *mdInstance,                                    
  146.     NSSCKFWInstance *fwInstance,
  147.     CK_RV *pError
  148.   );
  149.   /*
  150.    * This routine returns the version of this Module library.
  151.    * This routine is optional; if unimplemented, the Framework
  152.    * will assume a Module library version of 0.1.
  153.    */
  154.   CK_VERSION (PR_CALLBACK *GetLibraryVersion)(
  155.     NSSCKMDInstance *mdInstance,                                    
  156.     NSSCKFWInstance *fwInstance
  157.   );
  158.   /*
  159.    * This routine returns CK_TRUE if the Module wishes to
  160.    * handle session objects.  This routine is optional.
  161.    * If this routine is NULL, or if it exists but returns
  162.    * CK_FALSE, the Framework will assume responsibility
  163.    * for managing session objects.
  164.    */
  165.   CK_BBOOL (PR_CALLBACK *ModuleHandlesSessionObjects)(
  166.     NSSCKMDInstance *mdInstance,                                    
  167.     NSSCKFWInstance *fwInstance
  168.   );
  169.   /*
  170.    * This routine stuffs pointers to NSSCKMDSlot objects into
  171.    * the specified array; one for each slot supported by this
  172.    * instance.  The Framework will determine the size needed
  173.    * for the array by calling GetNSlots.  This routine is
  174.    * required.
  175.    */
  176.   CK_RV (PR_CALLBACK *GetSlots)(
  177.     NSSCKMDInstance *mdInstance,                                    
  178.     NSSCKFWInstance *fwInstance,
  179.     NSSCKMDSlot *slots[]
  180.   );
  181.   /*
  182.    * This call returns a pointer to the slot in which an event
  183.    * has occurred.  If the block argument is CK_TRUE, the call 
  184.    * should block until a slot event occurs; if CK_FALSE, it 
  185.    * should check to see if an event has occurred, occurred, 
  186.    * but return NULL (and set *pError to CK_NO_EVENT) if one 
  187.    * hasn't.  This routine is optional; if unimplemented, the
  188.    * Framework will assume that no event has happened.  This
  189.    * routine may return NULL upon error.
  190.    */
  191.   NSSCKMDSlot *(PR_CALLBACK *WaitForSlotEvent)(
  192.     NSSCKMDInstance *mdInstance,                                    
  193.     NSSCKFWInstance *fwInstance,
  194.     CK_BBOOL block,
  195.     CK_RV *pError
  196.   );
  197.   /*
  198.    * This object may be extended in future versions of the
  199.    * NSS Cryptoki Framework.  To allow for some flexibility
  200.    * in the area of binary compatibility, this field should
  201.    * be NULL.
  202.    */
  203.   void *null;
  204. };
  205. /*
  206.  * NSSCKMDSlot
  207.  *
  208.  * This is the basic handle for a PKCS#11 Module Slot.  It is
  209.  * created by the NSSCKMDInstance->GetSlots call, and may be
  210.  * obtained from the Framework's corresponding NSSCKFWSlot
  211.  * object.  It contains a pointer for use by the Module, to
  212.  * store any slot-related data, and it contains the EPV for
  213.  * a set of routines which the Module may implement for use
  214.  * by the Framework.  Some of these routines are optional.
  215.  */
  216. struct NSSCKMDSlotStr {
  217.   /*
  218.    * The Module may use this pointer for its own purposes.
  219.    */
  220.   void *etc;
  221.   /*
  222.    * This routine is called during the Framework initialization
  223.    * step, after the Framework Instance has obtained the list
  224.    * of slots (by calling NSSCKMDInstance->GetSlots).  Any slot-
  225.    * specific initialization can be done here.  This routine is
  226.    * optional; if unimplemented, it won't be called.  Note that
  227.    * if this routine returns an error, the entire Framework
  228.    * initialization for this Module will fail.
  229.    */
  230.   CK_RV (PR_CALLBACK *Initialize)(
  231.     NSSCKMDSlot *mdSlot,
  232.     NSSCKFWSlot *fwSlot,
  233.     NSSCKMDInstance *mdInstance,                                    
  234.     NSSCKFWInstance *fwInstance
  235.   );
  236.   /*
  237.    * This routine is called when the Framework is finalizing
  238.    * the PKCS#11 Module.  This call (for each of the slots)
  239.    * is the last thing called before NSSCKMDInstance->Finalize.
  240.    * This routine is optional; if unimplemented, it merely 
  241.    * won't be called.  Note: In the rare circumstance that
  242.    * the Framework initialization cannot complete (due to,
  243.    * for example, memory limitations), this can be called with
  244.    * a NULL value for fwSlot.
  245.    */
  246.   void (PR_CALLBACK *Destroy)(
  247.     NSSCKMDSlot *mdSlot,
  248.     NSSCKFWSlot *fwSlot,
  249.     NSSCKMDInstance *mdInstance,                                    
  250.     NSSCKFWInstance *fwInstance
  251.   );
  252.   /*
  253.    * This routine returns a pointer to a UTF8-encoded string
  254.    * containing a description of this slot.  Only the characters
  255.    * completely encoded in the first sixty-four bytes are
  256.    * significant.  This routine is optional.  The string 
  257.    * returned is never freed; if dynamically generated,
  258.    * the space for it should be allocated from the NSSArena
  259.    * that may be obtained from the NSSCKFWInstance.  This
  260.    * routine may return NULL upon error; however if *pError
  261.    * is CKR_OK, the NULL will be considered the valid response.
  262.    */
  263.   NSSUTF8 *(PR_CALLBACK *GetSlotDescription)(
  264.     NSSCKMDSlot *mdSlot,
  265.     NSSCKFWSlot *fwSlot,
  266.     NSSCKMDInstance *mdInstance,                                    
  267.     NSSCKFWInstance *fwInstance,
  268.     CK_RV *pError
  269.   );
  270.   /*
  271.    * This routine returns a pointer to a UTF8-encoded string
  272.    * containing a description of the manufacturer of this slot.
  273.    * Only the characters completely encoded in the first thirty-
  274.    * two bytes are significant.  This routine is optional.  
  275.    * The string  returned is never freed; if dynamically generated,
  276.    * the space for it should be allocated from the NSSArena
  277.    * that may be obtained from the NSSCKFWInstance.  This
  278.    * routine may return NULL upon error; however if *pError
  279.    * is CKR_OK, the NULL will be considered the valid response.
  280.    */
  281.   NSSUTF8 *(PR_CALLBACK *GetManufacturerID)(
  282.     NSSCKMDSlot *mdSlot,
  283.     NSSCKFWSlot *fwSlot,
  284.     NSSCKMDInstance *mdInstance,                                    
  285.     NSSCKFWInstance *fwInstance,
  286.     CK_RV *pError
  287.   );
  288.   /*
  289.    * This routine returns CK_TRUE if a token is present in this
  290.    * slot.  This routine is optional; if unimplemented, CK_TRUE
  291.    * is assumed.
  292.    */
  293.   CK_BBOOL (PR_CALLBACK *GetTokenPresent)(
  294.     NSSCKMDSlot *mdSlot,
  295.     NSSCKFWSlot *fwSlot,
  296.     NSSCKMDInstance *mdInstance,                                    
  297.     NSSCKFWInstance *fwInstance
  298.   );
  299.   /*
  300.    * This routine returns CK_TRUE if the slot supports removable
  301.    * tokens.  This routine is optional; if unimplemented, CK_FALSE
  302.    * is assumed.
  303.    */
  304.   CK_BBOOL (PR_CALLBACK *GetRemovableDevice)(
  305.     NSSCKMDSlot *mdSlot,
  306.     NSSCKFWSlot *fwSlot,
  307.     NSSCKMDInstance *mdInstance,                                    
  308.     NSSCKFWInstance *fwInstance
  309.   );
  310.   /*
  311.    * This routine returns CK_TRUE if this slot is a hardware
  312.    * device, or CK_FALSE if this slot is a software device.  This
  313.    * routine is optional; if unimplemented, CK_FALSE is assumed.
  314.    */
  315.   CK_BBOOL (PR_CALLBACK *GetHardwareSlot)(
  316.     NSSCKMDSlot *mdSlot,
  317.     NSSCKFWSlot *fwSlot,
  318.     NSSCKMDInstance *mdInstance,                                    
  319.     NSSCKFWInstance *fwInstance
  320.   );
  321.   /*
  322.    * This routine returns the version of this slot's hardware.
  323.    * This routine is optional; if unimplemented, the Framework
  324.    * will assume a hardware version of 0.1.
  325.    */
  326.   CK_VERSION (PR_CALLBACK *GetHardwareVersion)(
  327.     NSSCKMDSlot *mdSlot,
  328.     NSSCKFWSlot *fwSlot,
  329.     NSSCKMDInstance *mdInstance,                                    
  330.     NSSCKFWInstance *fwInstance
  331.   );
  332.   /*
  333.    * This routine returns the version of this slot's firmware.
  334.    * This routine is optional; if unimplemented, the Framework
  335.    * will assume a hardware version of 0.1.
  336.    */
  337.   CK_VERSION (PR_CALLBACK *GetFirmwareVersion)(
  338.     NSSCKMDSlot *mdSlot,
  339.     NSSCKFWSlot *fwSlot,
  340.     NSSCKMDInstance *mdInstance,                                    
  341.     NSSCKFWInstance *fwInstance
  342.   );
  343.   /*
  344.    * This routine should return a pointer to an NSSCKMDToken
  345.    * object corresponding to the token in the specified slot.
  346.    * The NSSCKFWToken object passed in has an NSSArena
  347.    * available which is dedicated for this token.  This routine
  348.    * must be implemented.  This routine may return NULL upon
  349.    * error.
  350.    */
  351.   NSSCKMDToken *(PR_CALLBACK *GetToken)(
  352.     NSSCKMDSlot *mdSlot,
  353.     NSSCKFWSlot *fwSlot,
  354.     NSSCKMDInstance *mdInstance,                                    
  355.     NSSCKFWInstance *fwInstance,
  356.     CK_RV *pError
  357.   );
  358.   /*
  359.    * This object may be extended in future versions of the
  360.    * NSS Cryptoki Framework.  To allow for some flexibility
  361.    * in the area of binary compatibility, this field should
  362.    * be NULL.
  363.    */
  364.   void *null;
  365. };
  366. /*
  367.  * NSSCKMDToken
  368.  *
  369.  * This is the basic handle for a PKCS#11 Token.  It is created by
  370.  * the NSSCKMDSlot->GetToken call, and may be obtained from the
  371.  * Framework's corresponding NSSCKFWToken object.  It contains a
  372.  * pointer for use by the Module, to store any token-related
  373.  * data, and it contains the EPV for a set of routines which the
  374.  * Module may implement for use by the Framework.  Some of these
  375.  * routines are optional.
  376.  */
  377. struct NSSCKMDTokenStr {
  378.   /*
  379.    * The Module may use this pointer for its own purposes.
  380.    */
  381.   void *etc;
  382.   /*
  383.    * This routine is used to prepare a Module token object for
  384.    * use.  It is called after the NSSCKMDToken object is obtained
  385.    * from NSSCKMDSlot->GetToken.  It is named "Setup" here because
  386.    * Cryptoki already defines "InitToken" to do the process of
  387.    * wiping out any existing state on a token and preparing it for
  388.    * a new use.  This routine is optional; if unimplemented, it
  389.    * merely won't be called.
  390.    */
  391.   CK_RV (PR_CALLBACK *Setup)(
  392.     NSSCKMDToken *mdToken,
  393.     NSSCKFWToken *fwToken,
  394.     NSSCKMDInstance *mdInstance,
  395.     NSSCKFWInstance *fwInstance
  396.   );
  397.   /*
  398.    * This routine is called by the Framework whenever it notices
  399.    * that the token object is invalid.  (Typically this is when a 
  400.    * routine indicates an error such as CKR_DEVICE_REMOVED).  This
  401.    * call is the last thing called before the NSSArena in the
  402.    * corresponding NSSCKFWToken is destroyed.  This routine is
  403.    * optional; if unimplemented, it merely won't be called.
  404.    */
  405.   void (PR_CALLBACK *Invalidate)(
  406.     NSSCKMDToken *mdToken,
  407.     NSSCKFWToken *fwToken,
  408.     NSSCKMDInstance *mdInstance,
  409.     NSSCKFWInstance *fwInstance
  410.   );
  411.   /*
  412.    * This routine initialises the token in the specified slot.
  413.    * This routine is optional; if unimplemented, the Framework
  414.    * will fail this operation with an error of CKR_DEVICE_ERROR.
  415.    */
  416.   CK_RV (PR_CALLBACK *InitToken)(
  417.     NSSCKMDToken *mdToken,
  418.     NSSCKFWToken *fwToken,
  419.     NSSCKMDInstance *mdInstance,
  420.     NSSCKFWInstance *fwInstance,
  421.     NSSItem *pin,
  422.     NSSUTF8 *label
  423.   );
  424.   /*
  425.    * This routine returns a pointer to a UTF8-encoded string
  426.    * containing this token's label.  Only the characters
  427.    * completely encoded in the first thirty-two bytes are
  428.    * significant.  This routine is optional.  The string 
  429.    * returned is never freed; if dynamically generated,
  430.    * the space for it should be allocated from the NSSArena
  431.    * that may be obtained from the NSSCKFWInstance.  This
  432.    * routine may return NULL upon error; however if *pError
  433.    * is CKR_OK, the NULL will be considered the valid response.
  434.    */
  435.   NSSUTF8 *(PR_CALLBACK *GetLabel)(
  436.     NSSCKMDToken *mdToken,
  437.     NSSCKFWToken *fwToken,
  438.     NSSCKMDInstance *mdInstance,
  439.     NSSCKFWInstance *fwInstance,
  440.     CK_RV *pError
  441.   );
  442.   /*
  443.    * This routine returns a pointer to a UTF8-encoded string
  444.    * containing this token's manufacturer ID.  Only the characters
  445.    * completely encoded in the first thirty-two bytes are
  446.    * significant.  This routine is optional.  The string 
  447.    * returned is never freed; if dynamically generated,
  448.    * the space for it should be allocated from the NSSArena
  449.    * that may be obtained from the NSSCKFWInstance.  This
  450.    * routine may return NULL upon error; however if *pError
  451.    * is CKR_OK, the NULL will be considered the valid response.
  452.    */
  453.   NSSUTF8 *(PR_CALLBACK *GetManufacturerID)(
  454.     NSSCKMDToken *mdToken,
  455.     NSSCKFWToken *fwToken,
  456.     NSSCKMDInstance *mdInstance,
  457.     NSSCKFWInstance *fwInstance,
  458.     CK_RV *pError
  459.   );
  460.   /*
  461.    * This routine returns a pointer to a UTF8-encoded string
  462.    * containing this token's model name.  Only the characters
  463.    * completely encoded in the first thirty-two bytes are
  464.    * significant.  This routine is optional.  The string 
  465.    * returned is never freed; if dynamically generated,
  466.    * the space for it should be allocated from the NSSArena
  467.    * that may be obtained from the NSSCKFWInstance.  This
  468.    * routine may return NULL upon error; however if *pError
  469.    * is CKR_OK, the NULL will be considered the valid response.
  470.    */
  471.   NSSUTF8 *(PR_CALLBACK *GetModel)(
  472.     NSSCKMDToken *mdToken,
  473.     NSSCKFWToken *fwToken,
  474.     NSSCKMDInstance *mdInstance,
  475.     NSSCKFWInstance *fwInstance,
  476.     CK_RV *pError
  477.   );
  478.   /*
  479.    * This routine returns a pointer to a UTF8-encoded string
  480.    * containing this token's serial number.  Only the characters
  481.    * completely encoded in the first thirty-two bytes are
  482.    * significant.  This routine is optional.  The string 
  483.    * returned is never freed; if dynamically generated,
  484.    * the space for it should be allocated from the NSSArena
  485.    * that may be obtained from the NSSCKFWInstance.  This
  486.    * routine may return NULL upon error; however if *pError
  487.    * is CKR_OK, the NULL will be considered the valid response.
  488.    */
  489.   NSSUTF8 *(PR_CALLBACK *GetSerialNumber)(
  490.     NSSCKMDToken *mdToken,
  491.     NSSCKFWToken *fwToken,
  492.     NSSCKMDInstance *mdInstance,
  493.     NSSCKFWInstance *fwInstance,
  494.     CK_RV *pError
  495.   );
  496.   /*
  497.    * This routine returns CK_TRUE if the token has its own
  498.    * random number generator.  This routine is optional; if
  499.    * unimplemented, CK_FALSE is assumed.
  500.    */
  501.   CK_BBOOL (PR_CALLBACK *GetHasRNG)(
  502.     NSSCKMDToken *mdToken,
  503.     NSSCKFWToken *fwToken,
  504.     NSSCKMDInstance *mdInstance,
  505.     NSSCKFWInstance *fwInstance
  506.   );
  507.   /*
  508.    * This routine returns CK_TRUE if this token is write-protected.
  509.    * This routine is optional; if unimplemented, CK_FALSE is
  510.    * assumed.
  511.    */
  512.   CK_BBOOL (PR_CALLBACK *GetIsWriteProtected)(
  513.     NSSCKMDToken *mdToken,
  514.     NSSCKFWToken *fwToken,
  515.     NSSCKMDInstance *mdInstance,
  516.     NSSCKFWInstance *fwInstance
  517.   );
  518.   /*
  519.    * This routine returns CK_TRUE if this token requires a login.
  520.    * This routine is optional; if unimplemented, CK_FALSE is
  521.    * assumed.
  522.    */
  523.   CK_BBOOL (PR_CALLBACK *GetLoginRequired)(
  524.     NSSCKMDToken *mdToken,
  525.     NSSCKFWToken *fwToken,
  526.     NSSCKMDInstance *mdInstance,
  527.     NSSCKFWInstance *fwInstance
  528.   );
  529.   /*
  530.    * This routine returns CK_TRUE if the normal user's PIN on this
  531.    * token has been initialised.  This routine is optional; if
  532.    * unimplemented, CK_FALSE is assumed.
  533.    */
  534.   CK_BBOOL (PR_CALLBACK *GetUserPinInitialized)(
  535.     NSSCKMDToken *mdToken,
  536.     NSSCKFWToken *fwToken,
  537.     NSSCKMDInstance *mdInstance,
  538.     NSSCKFWInstance *fwInstance
  539.   );
  540.   /*
  541.    * This routine returns CK_TRUE if a successful save of a
  542.    * session's cryptographic operations state ~always~ contains
  543.    * all keys needed to restore the state of the session.  This
  544.    * routine is optional; if unimplemented, CK_FALSE is assumed.
  545.    */
  546.   CK_BBOOL (PR_CALLBACK *GetRestoreKeyNotNeeded)(
  547.     NSSCKMDToken *mdToken,
  548.     NSSCKFWToken *fwToken,
  549.     NSSCKMDInstance *mdInstance,
  550.     NSSCKFWInstance *fwInstance
  551.   );
  552.   /*
  553.    * This routine returns CK_TRUE if the token has its own
  554.    * hardware clock.  This routine is optional; if unimplemented,
  555.    * CK_FALSE is assumed.
  556.    */
  557.   CK_BBOOL (PR_CALLBACK *GetHasClockOnToken)(
  558.     NSSCKMDToken *mdToken,
  559.     NSSCKFWToken *fwToken,
  560.     NSSCKMDInstance *mdInstance,
  561.     NSSCKFWInstance *fwInstance
  562.   );
  563.   /*
  564.    * This routine returns CK_TRUE if the token has a protected
  565.    * authentication path.  This routine is optional; if
  566.    * unimplemented, CK_FALSE is assumed.
  567.    */
  568.   CK_BBOOL (PR_CALLBACK *GetHasProtectedAuthenticationPath)(
  569.     NSSCKMDToken *mdToken,
  570.     NSSCKFWToken *fwToken,
  571.     NSSCKMDInstance *mdInstance,
  572.     NSSCKFWInstance *fwInstance
  573.   );
  574.   /*
  575.    * This routine returns CK_TRUE if the token supports dual
  576.    * cryptographic operations within a single session.  This
  577.    * routine is optional; if unimplemented, CK_FALSE is assumed.
  578.    */
  579.   CK_BBOOL (PR_CALLBACK *GetSupportsDualCryptoOperations)(
  580.     NSSCKMDToken *mdToken,
  581.     NSSCKFWToken *fwToken,
  582.     NSSCKMDInstance *mdInstance,
  583.     NSSCKFWInstance *fwInstance
  584.   );
  585.   /*
  586.    * XXX fgmr-- should we have a call to return all the flags
  587.    * at once, for folks who already know about Cryptoki?
  588.    */
  589.   /*
  590.    * This routine returns the maximum number of sessions that
  591.    * may be opened on this token.  This routine is optional;
  592.    * if unimplemented, the special value CK_UNAVAILABLE_INFORMATION
  593.    * is assumed.  XXX fgmr-- or CK_EFFECTIVELY_INFINITE?
  594.    */
  595.   CK_ULONG (PR_CALLBACK *GetMaxSessionCount)(
  596.     NSSCKMDToken *mdToken,
  597.     NSSCKFWToken *fwToken,
  598.     NSSCKMDInstance *mdInstance,
  599.     NSSCKFWInstance *fwInstance
  600.   );
  601.   /*
  602.    * This routine returns the maximum number of read/write
  603.    * sesisons that may be opened on this token.  This routine
  604.    * is optional; if unimplemented, the special value
  605.    * CK_UNAVAILABLE_INFORMATION is assumed.  XXX fgmr-- or 
  606.    * CK_EFFECTIVELY_INFINITE?
  607.    */
  608.   CK_ULONG (PR_CALLBACK *GetMaxRwSessionCount)(
  609.     NSSCKMDToken *mdToken,
  610.     NSSCKFWToken *fwToken,
  611.     NSSCKMDInstance *mdInstance,
  612.     NSSCKFWInstance *fwInstance
  613.   );
  614.   /*
  615.    * This routine returns the maximum PIN code length that is
  616.    * supported on this token.  This routine is optional;
  617.    * if unimplemented, the special value CK_UNAVAILABLE_INFORMATION
  618.    * is assumed.
  619.    */
  620.   CK_ULONG (PR_CALLBACK *GetMaxPinLen)(
  621.     NSSCKMDToken *mdToken,
  622.     NSSCKFWToken *fwToken,
  623.     NSSCKMDInstance *mdInstance,
  624.     NSSCKFWInstance *fwInstance
  625.   );
  626.   /*
  627.    * This routine returns the minimum PIN code length that is
  628.    * supported on this token.  This routine is optional; if
  629.    * unimplemented, the special value CK_UNAVAILABLE_INFORMATION
  630.    *  is assumed.  XXX fgmr-- or 0?
  631.    */
  632.   CK_ULONG (PR_CALLBACK *GetMinPinLen)(
  633.     NSSCKMDToken *mdToken,
  634.     NSSCKFWToken *fwToken,
  635.     NSSCKMDInstance *mdInstance,
  636.     NSSCKFWInstance *fwInstance
  637.   );
  638.   /*
  639.    * This routine returns the total amount of memory on the token
  640.    * in which public objects may be stored.  This routine is
  641.    * optional; if unimplemented, the special value
  642.    * CK_UNAVAILABLE_INFORMATION is assumed.
  643.    */
  644.   CK_ULONG (PR_CALLBACK *GetTotalPublicMemory)(
  645.     NSSCKMDToken *mdToken,
  646.     NSSCKFWToken *fwToken,
  647.     NSSCKMDInstance *mdInstance,
  648.     NSSCKFWInstance *fwInstance
  649.   );
  650.   /*
  651.    * This routine returns the amount of unused memory on the
  652.    * token in which public objects may be stored.  This routine
  653.    * is optional; if unimplemented, the special value
  654.    * CK_UNAVAILABLE_INFORMATION is assumed.
  655.    */
  656.   CK_ULONG (PR_CALLBACK *GetFreePublicMemory)(
  657.     NSSCKMDToken *mdToken,
  658.     NSSCKFWToken *fwToken,
  659.     NSSCKMDInstance *mdInstance,
  660.     NSSCKFWInstance *fwInstance
  661.   );
  662.   /*
  663.    * This routine returns the total amount of memory on the token
  664.    * in which private objects may be stored.  This routine is
  665.    * optional; if unimplemented, the special value
  666.    * CK_UNAVAILABLE_INFORMATION is assumed.
  667.    */
  668.   CK_ULONG (PR_CALLBACK *GetTotalPrivateMemory)(
  669.     NSSCKMDToken *mdToken,
  670.     NSSCKFWToken *fwToken,
  671.     NSSCKMDInstance *mdInstance,
  672.     NSSCKFWInstance *fwInstance
  673.   );
  674.   /*
  675.    * This routine returns the amount of unused memory on the
  676.    * token in which private objects may be stored.  This routine
  677.    * is optional; if unimplemented, the special value
  678.    * CK_UNAVAILABLE_INFORMATION is assumed.
  679.    */
  680.   CK_ULONG (PR_CALLBACK *GetFreePrivateMemory)(
  681.     NSSCKMDToken *mdToken,
  682.     NSSCKFWToken *fwToken,
  683.     NSSCKMDInstance *mdInstance,
  684.     NSSCKFWInstance *fwInstance
  685.   );
  686.   /*
  687.    * This routine returns the version number of this token's
  688.    * hardware.  This routine is optional; if unimplemented,
  689.    * the value 0.1 is assumed.
  690.    */
  691.   CK_VERSION (PR_CALLBACK *GetHardwareVersion)(
  692.     NSSCKMDToken *mdToken,
  693.     NSSCKFWToken *fwToken,
  694.     NSSCKMDInstance *mdInstance,
  695.     NSSCKFWInstance *fwInstance
  696.   );
  697.   /*
  698.    * This routine returns the version number of this token's
  699.    * firmware.  This routine is optional; if unimplemented,
  700.    * the value 0.1 is assumed.
  701.    */
  702.   CK_VERSION (PR_CALLBACK *GetFirmwareVersion)(
  703.     NSSCKMDToken *mdToken,
  704.     NSSCKFWToken *fwToken,
  705.     NSSCKMDInstance *mdInstance,
  706.     NSSCKFWInstance *fwInstance
  707.   );
  708.   /*
  709.    * This routine stuffs the current UTC time, as obtained from
  710.    * the token, into the sixteen-byte buffer in the form
  711.    * YYYYMMDDhhmmss00.  This routine need only be implemented
  712.    * by token which indicate that they have a real-time clock.
  713.    * XXX fgmr-- think about time formats.
  714.    */
  715.   CK_RV (PR_CALLBACK *GetUTCTime)(
  716.     NSSCKMDToken *mdToken,
  717.     NSSCKFWToken *fwToken,
  718.     NSSCKMDInstance *mdInstance,
  719.     NSSCKFWInstance *fwInstance,
  720.     CK_CHAR utcTime[16]
  721.   );
  722.   /*
  723.    * This routine creates a session on the token, and returns
  724.    * the corresponding NSSCKMDSession object.  The value of
  725.    * rw will be CK_TRUE if the session is to be a read/write 
  726.    * session, or CK_FALSE otherwise.  An NSSArena dedicated to
  727.    * the new session is available from the specified NSSCKFWSession.
  728.    * This routine may return NULL upon error.
  729.    */
  730.   NSSCKMDSession *(PR_CALLBACK *OpenSession)(
  731.     NSSCKMDToken *mdToken,
  732.     NSSCKFWToken *fwToken,
  733.     NSSCKMDInstance *mdInstance,
  734.     NSSCKFWInstance *fwInstance,
  735.     NSSCKFWSession *fwSession,
  736.     CK_BBOOL rw,
  737.     CK_RV *pError
  738.   );
  739.   /*
  740.    * This routine returns the number of PKCS#11 Mechanisms
  741.    * supported by this token.  This routine is optional; if
  742.    * unimplemented, zero is assumed.
  743.    */
  744.   CK_ULONG (PR_CALLBACK *GetMechanismCount)(
  745.     NSSCKMDToken *mdToken,
  746.     NSSCKFWToken *fwToken,
  747.     NSSCKMDInstance *mdInstance,
  748.     NSSCKFWInstance *fwInstance
  749.   );
  750.   /*
  751.    * This routine stuffs into the specified array the types
  752.    * of the mechanisms supported by this token.  The Framework
  753.    * determines the size of the array by calling GetMechanismCount.
  754.    */
  755.   CK_RV (PR_CALLBACK *GetMechanismTypes)(
  756.     NSSCKMDToken *mdToken,
  757.     NSSCKFWToken *fwToken,
  758.     NSSCKMDInstance *mdInstance,
  759.     NSSCKFWInstance *fwInstance,
  760.     CK_MECHANISM_TYPE types[]
  761.   );
  762.   /*
  763.    * This routine returns a pointer to a Module mechanism
  764.    * object corresponding to a specified type.  This routine
  765.    * need only exist for tokens implementing at least one
  766.    * mechanism.
  767.    */
  768.   NSSCKMDMechanism *(PR_CALLBACK *GetMechanism)(
  769.     NSSCKMDToken *mdToken,
  770.     NSSCKFWToken *fwToken,
  771.     NSSCKMDInstance *mdInstance,
  772.     NSSCKFWInstance *fwInstance,
  773.     NSSCKFWMechanism *fwMechanism,
  774.     CK_MECHANISM_TYPE which
  775.   );
  776.   /*
  777.    * This object may be extended in future versions of the
  778.    * NSS Cryptoki Framework.  To allow for some flexibility
  779.    * in the area of binary compatibility, this field should
  780.    * be NULL.
  781.    */
  782.   void *null;
  783. };
  784. /*
  785.  * NSSCKMDSession
  786.  *
  787.  * This is the basic handle for a session on a PKCS#11 Token.  It
  788.  * is created by NSSCKMDToken->OpenSession, and may be obtained
  789.  * from the Framework's corresponding NSSCKFWSession object.  It
  790.  * contains a pointer for use by the Module, to store any session-
  791.  * realted data, and it contains the EPV for a set of routines
  792.  * which the Module may implement for use by the Framework.  Some
  793.  * of these routines are optional.
  794.  */
  795. struct NSSCKMDSessionStr {
  796.   /*
  797.    * The Module may use this pointer for its own purposes.
  798.    */
  799.   void *etc;
  800.   /*
  801.    * This routine is called by the Framework when a session is
  802.    * closed.  This call is the last thing called before the
  803.    * NSSArena in the correspoinding NSSCKFWSession is destroyed.
  804.    * This routine is optional; if unimplemented, it merely won't
  805.    * be called.
  806.    */
  807.   void (PR_CALLBACK *Close)(
  808.     NSSCKMDSession *mdSession,
  809.     NSSCKFWSession *fwSession,
  810.     NSSCKMDToken *mdToken,
  811.     NSSCKFWToken *fwToken,
  812.     NSSCKMDInstance *mdInstance,
  813.     NSSCKFWInstance *fwInstance
  814.   );
  815.   /*
  816.    * This routine is used to get any device-specific error.
  817.    * This routine is optional.
  818.    */
  819.   CK_ULONG (PR_CALLBACK *GetDeviceError)(
  820.     NSSCKMDSession *mdSession,
  821.     NSSCKFWSession *fwSession,
  822.     NSSCKMDToken *mdToken,
  823.     NSSCKFWToken *fwToken,
  824.     NSSCKMDInstance *mdInstance,
  825.     NSSCKFWInstance *fwInstance
  826.   );
  827.   /*
  828.    * This routine is used to log in a user to the token.  This
  829.    * routine is optional, since the Framework's NSSCKFWSession
  830.    * object keeps track of the login state.
  831.    */
  832.   CK_RV (PR_CALLBACK *Login)(
  833.     NSSCKMDSession *mdSession,
  834.     NSSCKFWSession *fwSession,
  835.     NSSCKMDToken *mdToken,
  836.     NSSCKFWToken *fwToken,
  837.     NSSCKMDInstance *mdInstance,
  838.     NSSCKFWInstance *fwInstance,
  839.     CK_USER_TYPE userType,
  840.     NSSItem *pin,
  841.     CK_STATE oldState,
  842.     CK_STATE newState
  843.   );
  844.   /*
  845.    * This routine is used to log out a user from the token.  This
  846.    * routine is optional, since the Framework's NSSCKFWSession
  847.    * object keeps track of the login state.
  848.    */
  849.   CK_RV (PR_CALLBACK *Logout)(
  850.     NSSCKMDSession *mdSession,
  851.     NSSCKFWSession *fwSession,
  852.     NSSCKMDToken *mdToken,
  853.     NSSCKFWToken *fwToken,
  854.     NSSCKMDInstance *mdInstance,
  855.     NSSCKFWInstance *fwInstance,
  856.     CK_STATE oldState,
  857.     CK_STATE newState
  858.   );
  859.   /*
  860.    * This routine is used to initialize the normal user's PIN or
  861.    * password.  This will only be called in the "read/write
  862.    * security officer functions" state.  If this token has a
  863.    * protected authentication path, then the pin argument will
  864.    * be NULL.  This routine is optional; if unimplemented, the
  865.    * Framework will return the error CKR_TOKEN_WRITE_PROTECTED.
  866.    */
  867.   CK_RV (PR_CALLBACK *InitPIN)(
  868.     NSSCKMDSession *mdSession,
  869.     NSSCKFWSession *fwSession,
  870.     NSSCKMDToken *mdToken,
  871.     NSSCKFWToken *fwToken,
  872.     NSSCKMDInstance *mdInstance,
  873.     NSSCKFWInstance *fwInstance,
  874.     NSSItem *pin
  875.   );
  876.   /*
  877.    * This routine is used to modify a user's PIN or password.  This
  878.    * routine will only be called in the "read/write security officer
  879.    * functions" or "read/write user functions" state.  If this token
  880.    * has a protected authentication path, then the pin arguments
  881.    * will be NULL.  This routine is optional; if unimplemented, the
  882.    * Framework will return the error CKR_TOKEN_WRITE_PROTECTED.
  883.    */
  884.   CK_RV (PR_CALLBACK *SetPIN)(
  885.     NSSCKMDSession *mdSession,
  886.     NSSCKFWSession *fwSession,
  887.     NSSCKMDToken *mdToken,
  888.     NSSCKFWToken *fwToken,
  889.     NSSCKMDInstance *mdInstance,
  890.     NSSCKFWInstance *fwInstance,
  891.     NSSItem *oldPin,
  892.     NSSItem *newPin
  893.   );
  894.   /*
  895.    * This routine is used to find out how much space would be required
  896.    * to save the current operational state.  This routine is optional;
  897.    * if unimplemented, the Framework will reject any attempts to save
  898.    * the operational state with the error CKR_STATE_UNSAVEABLE.  This
  899.    * routine may return zero on error.
  900.    */
  901.   CK_ULONG (PR_CALLBACK *GetOperationStateLen)(
  902.     NSSCKMDSession *mdSession,
  903.     NSSCKFWSession *fwSession,
  904.     NSSCKMDToken *mdToken,
  905.     NSSCKFWToken *fwToken,
  906.     NSSCKMDInstance *mdInstance,
  907.     NSSCKFWInstance *fwInstance,
  908.     CK_RV *pError
  909.   );
  910.   /*
  911.    * This routine is used to store the current operational state.  This
  912.    * routine is only required if GetOperationStateLen is implemented 
  913.    * and can return a nonzero value.  The buffer in the specified item
  914.    * will be pre-allocated, and the length will specify the amount of
  915.    * space available (which may be more than GetOperationStateLen
  916.    * asked for, but which will not be smaller).
  917.    */
  918.   CK_RV (PR_CALLBACK *GetOperationState)(
  919.     NSSCKMDSession *mdSession,
  920.     NSSCKFWSession *fwSession,
  921.     NSSCKMDToken *mdToken,
  922.     NSSCKFWToken *fwToken,
  923.     NSSCKMDInstance *mdInstance,
  924.     NSSCKFWInstance *fwInstance,
  925.     NSSItem *buffer
  926.   );
  927.   /*
  928.    * This routine is used to restore an operational state previously
  929.    * obtained with GetOperationState.  The Framework will take pains
  930.    * to be sure that the state is (or was at one point) valid; if the
  931.    * Module notices that the state is invalid, it should return an
  932.    * error, but it is not required to be paranoid about the issue.
  933.    * [XXX fgmr-- should (can?) the framework verify the keys match up?]
  934.    * This routine is required only if GetOperationState is implemented.
  935.    */
  936.   CK_RV (PR_CALLBACK *SetOperationState)(
  937.     NSSCKMDSession *mdSession,
  938.     NSSCKFWSession *fwSession,
  939.     NSSCKMDToken *mdToken,
  940.     NSSCKFWToken *fwToken,
  941.     NSSCKMDInstance *mdInstance,
  942.     NSSCKFWInstance *fwInstance,
  943.     NSSItem *state,
  944.     NSSCKMDObject *mdEncryptionKey,
  945.     NSSCKFWObject *fwEncryptionKey,
  946.     NSSCKMDObject *mdAuthenticationKey,
  947.     NSSCKFWObject *fwAuthenticationKey
  948.   );
  949.   /*
  950.    * This routine is used to create an object.  The specified template
  951.    * will only specify a session object if the Module has indicated 
  952.    * that it wishes to handle its own session objects.  This routine
  953.    * is optional; if unimplemented, the Framework will reject the
  954.    * operation with the error CKR_TOKEN_WRITE_PROTECTED.  Space for
  955.    * token objects should come from the NSSArena available from the
  956.    * NSSCKFWToken object; space for session objects (if supported)
  957.    * should come from the NSSArena available from the NSSCKFWSession
  958.    * object.  The appropriate NSSArena pointer will, as a convenience,
  959.    * be passed as the handyArenaPointer argument.  This routine may
  960.    * return NULL upon error.
  961.    */
  962.   NSSCKMDObject *(PR_CALLBACK *CreateObject)(
  963.     NSSCKMDSession *mdSession,
  964.     NSSCKFWSession *fwSession,
  965.     NSSCKMDToken *mdToken,
  966.     NSSCKFWToken *fwToken,
  967.     NSSCKMDInstance *mdInstance,
  968.     NSSCKFWInstance *fwInstance,
  969.     NSSArena *handyArenaPointer,
  970.     CK_ATTRIBUTE_PTR pTemplate,
  971.     CK_ULONG ulAttributeCount,
  972.     CK_RV *pError
  973.   );
  974.   /*
  975.    * This routine is used to make a copy of an object.  It is entirely
  976.    * optional; if unimplemented, the Framework will try to use
  977.    * CreateObject instead.  If the Module has indicated that it does
  978.    * not wish to handle session objects, then this routine will only
  979.    * be called to copy a token object to another token object.
  980.    * Otherwise, either the original object or the new may be of
  981.    * either the token or session variety.  As with CreateObject, the
  982.    * handyArenaPointer will point to the appropriate arena for the
  983.    * new object.  This routine may return NULL upon error.
  984.    */
  985.   NSSCKMDObject *(PR_CALLBACK *CopyObject)(
  986.     NSSCKMDSession *mdSession,
  987.     NSSCKFWSession *fwSession,
  988.     NSSCKMDToken *mdToken,
  989.     NSSCKFWToken *fwToken,
  990.     NSSCKMDInstance *mdInstance,
  991.     NSSCKFWInstance *fwInstance,
  992.     NSSCKMDObject *mdOldObject,
  993.     NSSCKFWObject *fwOldObject,
  994.     NSSArena *handyArenaPointer,
  995.     CK_ATTRIBUTE_PTR pTemplate,
  996.     CK_ULONG ulAttributeCount,
  997.     CK_RV *pError
  998.   );
  999.   /*
  1000.    * This routine is used to begin an object search.  This routine may
  1001.    * be unimplemented only if the Module does not handle session 
  1002.    * objects, and if none of its tokens have token objects.  The
  1003.    * NSSCKFWFindObjects pointer has an NSSArena that may be used for
  1004.    * storage for the life of this "find" operation.  This routine may
  1005.    * return NULL upon error.  If the Module can determine immediately
  1006.    * that the search will not find any matching objects, it may return
  1007.    * NULL, and specify CKR_OK as the error.
  1008.    */
  1009.   NSSCKMDFindObjects *(PR_CALLBACK *FindObjectsInit)(
  1010.     NSSCKMDSession *mdSession,
  1011.     NSSCKFWSession *fwSession,
  1012.     NSSCKMDToken *mdToken,
  1013.     NSSCKFWToken *fwToken,
  1014.     NSSCKMDInstance *mdInstance,
  1015.     NSSCKFWInstance *fwInstance,
  1016.     CK_ATTRIBUTE_PTR pTemplate,
  1017.     CK_ULONG ulAttributeCount,
  1018.     CK_RV *pError
  1019.   );
  1020.   /*
  1021.    * This routine seeds the random-number generator.  It is
  1022.    * optional, even if GetRandom is implemented.  If unimplemented,
  1023.    * the Framework will issue the error CKR_RANDOM_SEED_NOT_SUPPORTED.
  1024.    */
  1025.   CK_RV (PR_CALLBACK *SeedRandom)(
  1026.     NSSCKMDSession *mdSession,
  1027.     NSSCKFWSession *fwSession,
  1028.     NSSCKMDToken *mdToken,
  1029.     NSSCKFWToken *fwToken,
  1030.     NSSCKMDInstance *mdInstance,
  1031.     NSSCKFWInstance *fwInstance,
  1032.     NSSItem *seed
  1033.   );
  1034.   /*
  1035.    * This routine gets random data.  It is optional.  If unimplemented,
  1036.    * the Framework will issue the error CKR_RANDOM_NO_RNG.
  1037.    */
  1038.   CK_RV (PR_CALLBACK *GetRandom)(
  1039.     NSSCKMDSession *mdSession,
  1040.     NSSCKFWSession *fwSession,
  1041.     NSSCKMDToken *mdToken,
  1042.     NSSCKFWToken *fwToken,
  1043.     NSSCKMDInstance *mdInstance,
  1044.     NSSCKFWInstance *fwInstance,
  1045.     NSSItem *buffer
  1046.   );
  1047.   /*
  1048.    * This object may be extended in future versions of the
  1049.    * NSS Cryptoki Framework.  To allow for some flexibility
  1050.    * in the area of binary compatibility, this field should
  1051.    * be NULL.
  1052.    */
  1053.   void *null;
  1054. };
  1055. /*
  1056.  * NSSCKMDFindObjects
  1057.  *
  1058.  * This is the basic handle for an object search.  It is
  1059.  * created by NSSCKMDSession->FindObjectsInit, and may be
  1060.  * obtained from the Framework's corresponding object.
  1061.  * It contains a pointer for use by the Module, to store
  1062.  * any search-related data, and it contains the EPV for a
  1063.  * set of routines which the Module may implement for use
  1064.  * by the Framework.  Some of these routines are optional.
  1065.  */
  1066. struct NSSCKMDFindObjectsStr {
  1067.   /*
  1068.    * The Module may use this pointer for its own purposes.
  1069.    */
  1070.   void *etc;
  1071.   /*
  1072.    * This routine is called by the Framework to finish a
  1073.    * search operation.  Note that the Framework may finish
  1074.    * a search before it has completed.  This routine is
  1075.    * optional; if unimplemented, it merely won't be called.
  1076.    */
  1077.   void (PR_CALLBACK *Final)(
  1078.     NSSCKMDFindObjects *mdFindObjects,
  1079.     NSSCKFWFindObjects *fwFindObjects,
  1080.     NSSCKMDSession *mdSession,
  1081.     NSSCKFWSession *fwSession,
  1082.     NSSCKMDToken *mdToken,
  1083.     NSSCKFWToken *fwToken,
  1084.     NSSCKMDInstance *mdInstance,
  1085.     NSSCKFWInstance *fwInstance
  1086.   );
  1087.   /*
  1088.    * This routine is used to obtain another pointer to an
  1089.    * object matching the search criteria.  This routine is
  1090.    * required.  If no (more) objects match the search, it
  1091.    * should return NULL and set the error to CKR_OK.
  1092.    */
  1093.   NSSCKMDObject *(PR_CALLBACK *Next)(
  1094.     NSSCKMDFindObjects *mdFindObjects,
  1095.     NSSCKFWFindObjects *fwFindObjects,
  1096.     NSSCKMDSession *mdSession,
  1097.     NSSCKFWSession *fwSession,
  1098.     NSSCKMDToken *mdToken,
  1099.     NSSCKFWToken *fwToken,
  1100.     NSSCKMDInstance *mdInstance,
  1101.     NSSCKFWInstance *fwInstance,
  1102.     NSSArena *arena,
  1103.     CK_RV *pError
  1104.   );
  1105.   /*
  1106.    * This object may be extended in future versions of the
  1107.    * NSS Cryptoki Framework.  To allow for some flexibility
  1108.    * in the area of binary compatibility, this field should
  1109.    * be NULL.
  1110.    */
  1111.   void *null;
  1112. };
  1113. /*
  1114.  * NSSCKMDMechanism
  1115.  *
  1116.  */
  1117. struct NSSCKMDMechanismStr {
  1118.   /*
  1119.    * The Module may use this pointer for its own purposes.
  1120.    */
  1121.   void *etc;
  1122.   /*
  1123.    * This routine returns the minimum key size allowed for
  1124.    * this mechanism.  This routine is optional; if unimplemented,
  1125.    * zero will be assumed.  This routine may return zero on
  1126.    * error; if the error is CKR_OK, zero will be accepted as
  1127.    * a valid response.
  1128.    */
  1129.   CK_ULONG (PR_CALLBACK *GetMinKeySize)(
  1130.     NSSCKMDMechanism *mdMechanism,
  1131.     NSSCKFWMechanism *fwMechanism,
  1132.     NSSCKMDToken *mdToken,
  1133.     NSSCKFWToken *fwToken,
  1134.     NSSCKMDInstance *mdInstance,
  1135.     NSSCKFWInstance *fwInstance,
  1136.     CK_RV *pError
  1137.   );
  1138.   /*
  1139.    * This routine returns the maximum key size allowed for
  1140.    * this mechanism.  This routine is optional; if unimplemented,
  1141.    * zero will be assumed.  This routine may return zero on
  1142.    * error; if the error is CKR_OK, zero will be accepted as
  1143.    * a valid response.
  1144.    */
  1145.   CK_ULONG (PR_CALLBACK *GetMaxKeySize)(
  1146.     NSSCKMDMechanism *mdMechanism,
  1147.     NSSCKFWMechanism *fwMechanism,
  1148.     NSSCKMDToken *mdToken,
  1149.     NSSCKFWToken *fwToken,
  1150.     NSSCKMDInstance *mdInstance,
  1151.     NSSCKFWInstance *fwInstance,
  1152.     CK_RV *pError
  1153.   );
  1154.   /*
  1155.    * This routine is called to determine if the mechanism is
  1156.    * implemented in hardware or software.  It returns CK_TRUE
  1157.    * if it is done in hardware.
  1158.    */
  1159.   CK_BBOOL (PR_CALLBACK *GetInHardware)(
  1160.     NSSCKMDMechanism *mdMechanism,
  1161.     NSSCKFWMechanism *fwMechanism,
  1162.     NSSCKMDToken *mdToken,
  1163.     NSSCKFWToken *fwToken,
  1164.     NSSCKMDInstance *mdInstance,
  1165.     NSSCKFWInstance *fwInstance,
  1166.     CK_RV *pError
  1167.   );
  1168.   /*
  1169.    * The crypto routines themselves.  Most crypto operations may
  1170.    * be performed in two ways, streaming and single-part.  The
  1171.    * streaming operations involve the use of (typically) three
  1172.    * calls-- an Init method to set up the operation, an Update
  1173.    * method to feed data to the operation, and a Final method to
  1174.    * obtain the final result.  Single-part operations involve
  1175.    * one method, to perform the crypto operation all at once.
  1176.    * The NSS Cryptoki Framework can implement the single-part
  1177.    * operations in terms of the streaming operations on behalf
  1178.    * of the Module.  There are a few variances.
  1179.    * 
  1180.    * For simplicity, the routines are listed in summary here:
  1181.    *
  1182.    *  EncryptInit, EncryptUpdate, EncryptFinal; Encrypt
  1183.    *  DecryptInit, DecryptUpdate, DecryptFinal; Decrypt
  1184.    *  DigestInit, DigestUpdate, DigestKey, DigestFinal; Digest
  1185.    *  SignInit, SignUpdate, SignFinal; Sign
  1186.    *  SignRecoverInit; SignRecover
  1187.    *  VerifyInit, VerifyUpdate, VerifyFinal; Verify
  1188.    *  VerifyRecoverInit; VerifyRecover
  1189.    * 
  1190.    * Also, there are some combined-operation calls:
  1191.    * 
  1192.    *  DigestEncryptUpdate
  1193.    *  DecryptDigestUpdate
  1194.    *  SignEncryptUpdate
  1195.    *  DecryptVerifyUpdate
  1196.    *
  1197.    * The key-management routines are
  1198.    *
  1199.    *  GenerateKey
  1200.    *  GenerateKeyPair
  1201.    *  WrapKey
  1202.    *  UnwrapKey
  1203.    *  DeriveKey
  1204.    *
  1205.    * All of these routines based directly on the Cryptoki API; 
  1206.    * see PKCS#11 for further information.
  1207.    */
  1208.   /*
  1209.    */
  1210.   CK_RV (PR_CALLBACK *EncryptInit)(
  1211.     NSSCKMDMechanism *mdMechanism,
  1212.     NSSCKFWMechanism *fwMechanism,
  1213.     NSSCKMDSession *mdSession,
  1214.     NSSCKFWSession *fwSession,
  1215.     NSSCKMDToken *mdToken,
  1216.     NSSCKFWToken *fwToken,
  1217.     NSSCKMDInstance *mdInstance,
  1218.     NSSCKFWInstance *fwInstance,
  1219.     NSSCKMDObject *mdKey,
  1220.     NSSCKFWObject *fwKey
  1221.   );
  1222.   /*
  1223.    */
  1224.   CK_RV (PR_CALLBACK *EncryptUpdate)(
  1225.     NSSCKMDMechanism *mdMechanism,
  1226.     NSSCKFWMechanism *fwMechanism,
  1227.     NSSCKMDSession *mdSession,
  1228.     NSSCKFWSession *fwSession,
  1229.     NSSCKMDToken *mdToken,
  1230.     NSSCKFWToken *fwToken,
  1231.     NSSCKMDInstance *mdInstance,
  1232.     NSSCKFWInstance *fwInstance,
  1233.     NSSItem *data, 
  1234.     NSSItem *buffer
  1235.   );
  1236.   /*
  1237.    */
  1238.   CK_RV (PR_CALLBACK *EncryptFinal)(
  1239.     NSSCKMDMechanism *mdMechanism,
  1240.     NSSCKFWMechanism *fwMechanism,
  1241.     NSSCKMDSession *mdSession,
  1242.     NSSCKFWSession *fwSession,
  1243.     NSSCKMDToken *mdToken,
  1244.     NSSCKFWToken *fwToken,
  1245.     NSSCKMDInstance *mdInstance,
  1246.     NSSCKFWInstance *fwInstance,
  1247.     NSSItem *buffer
  1248.   );
  1249.   /*
  1250.    */
  1251.   CK_RV (PR_CALLBACK *Encrypt)(
  1252.     NSSCKMDMechanism *mdMechanism,
  1253.     NSSCKFWMechanism *fwMechanism,
  1254.     NSSCKMDSession *mdSession,
  1255.     NSSCKFWSession *fwSession,
  1256.     NSSCKMDToken *mdToken,
  1257.     NSSCKFWToken *fwToken,
  1258.     NSSCKMDInstance *mdInstance,
  1259.     NSSCKFWInstance *fwInstance,
  1260.     NSSCKMDObject *mdKey,
  1261.     NSSCKFWObject *fwKey,
  1262.     NSSItem *data, 
  1263.     NSSItem *buffer
  1264.   );
  1265.   /*
  1266.    */
  1267.   CK_RV (PR_CALLBACK *DecryptInit)(
  1268.     NSSCKMDMechanism *mdMechanism,
  1269.     NSSCKFWMechanism *fwMechanism,
  1270.     NSSCKMDSession *mdSession,
  1271.     NSSCKFWSession *fwSession,
  1272.     NSSCKMDToken *mdToken,
  1273.     NSSCKFWToken *fwToken,
  1274.     NSSCKMDInstance *mdInstance,
  1275.     NSSCKFWInstance *fwInstance,
  1276.     NSSCKMDObject *mdKey,
  1277.     NSSCKFWObject *fwKey
  1278.   );
  1279.   /*
  1280.    */
  1281.   CK_RV (PR_CALLBACK *DecryptUpdate)(
  1282.     NSSCKMDMechanism *mdMechanism,
  1283.     NSSCKFWMechanism *fwMechanism,
  1284.     NSSCKMDSession *mdSession,
  1285.     NSSCKFWSession *fwSession,
  1286.     NSSCKMDToken *mdToken,
  1287.     NSSCKFWToken *fwToken,
  1288.     NSSCKMDInstance *mdInstance,
  1289.     NSSCKFWInstance *fwInstance,
  1290.     NSSItem *data, 
  1291.     NSSItem *buffer
  1292.   );
  1293.   /*
  1294.    */
  1295.   CK_RV (PR_CALLBACK *DecryptFinal)(
  1296.     NSSCKMDMechanism *mdMechanism,
  1297.     NSSCKFWMechanism *fwMechanism,
  1298.     NSSCKMDSession *mdSession,
  1299.     NSSCKFWSession *fwSession,
  1300.     NSSCKMDToken *mdToken,
  1301.     NSSCKFWToken *fwToken,
  1302.     NSSCKMDInstance *mdInstance,
  1303.     NSSCKFWInstance *fwInstance,
  1304.     NSSItem *buffer
  1305.   );
  1306.   /*
  1307.    */
  1308.   CK_RV (PR_CALLBACK *Decrypt)(
  1309.     NSSCKMDMechanism *mdMechanism,
  1310.     NSSCKFWMechanism *fwMechanism,
  1311.     NSSCKMDSession *mdSession,
  1312.     NSSCKFWSession *fwSession,
  1313.     NSSCKMDToken *mdToken,
  1314.     NSSCKFWToken *fwToken,
  1315.     NSSCKMDInstance *mdInstance,
  1316.     NSSCKFWInstance *fwInstance,
  1317.     NSSCKMDObject *mdKey,
  1318.     NSSCKFWObject *fwKey,
  1319.     NSSItem *data, 
  1320.     NSSItem *buffer
  1321.   );
  1322.   /*
  1323.    */
  1324.   CK_RV (PR_CALLBACK *DigestInit)(
  1325.     NSSCKMDMechanism *mdMechanism,
  1326.     NSSCKFWMechanism *fwMechanism,
  1327.     NSSCKMDSession *mdSession,
  1328.     NSSCKFWSession *fwSession,
  1329.     NSSCKMDToken *mdToken,
  1330.     NSSCKFWToken *fwToken,
  1331.     NSSCKMDInstance *mdInstance,
  1332.     NSSCKFWInstance *fwInstance
  1333.   );
  1334.   /*
  1335.    */
  1336.   CK_RV (PR_CALLBACK *DigestUpdate)(
  1337.     NSSCKMDMechanism *mdMechanism,
  1338.     NSSCKFWMechanism *fwMechanism,
  1339.     NSSCKMDSession *mdSession,
  1340.     NSSCKFWSession *fwSession,
  1341.     NSSCKMDToken *mdToken,
  1342.     NSSCKFWToken *fwToken,
  1343.     NSSCKMDInstance *mdInstance,
  1344.     NSSCKFWInstance *fwInstance,
  1345.     NSSItem *data
  1346.   );
  1347.   /*
  1348.    */
  1349.   CK_RV (PR_CALLBACK *DigestKey)(
  1350.     NSSCKMDMechanism *mdMechanism,
  1351.     NSSCKFWMechanism *fwMechanism,
  1352.     NSSCKMDSession *mdSession,
  1353.     NSSCKFWSession *fwSession,
  1354.     NSSCKMDToken *mdToken,
  1355.     NSSCKFWToken *fwToken,
  1356.     NSSCKMDInstance *mdInstance,
  1357.     NSSCKFWInstance *fwInstance,
  1358.     NSSCKMDObject *mdKey,
  1359.     NSSCKFWObject *fwKey
  1360.   );
  1361.   /*
  1362.    */
  1363.   CK_RV (PR_CALLBACK *DigestFinal)(
  1364.     NSSCKMDMechanism *mdMechanism,
  1365.     NSSCKFWMechanism *fwMechanism,
  1366.     NSSCKMDSession *mdSession,
  1367.     NSSCKFWSession *fwSession,
  1368.     NSSCKMDToken *mdToken,
  1369.     NSSCKFWToken *fwToken,
  1370.     NSSCKMDInstance *mdInstance,
  1371.     NSSCKFWInstance *fwInstance,
  1372.     NSSItem *buffer
  1373.   );
  1374.   /*
  1375.    */
  1376.   CK_RV (PR_CALLBACK *Digest)(
  1377.     NSSCKMDMechanism *mdMechanism,
  1378.     NSSCKFWMechanism *fwMechanism,
  1379.     NSSCKMDSession *mdSession,
  1380.     NSSCKFWSession *fwSession,
  1381.     NSSCKMDToken *mdToken,
  1382.     NSSCKFWToken *fwToken,
  1383.     NSSCKMDInstance *mdInstance,
  1384.     NSSCKFWInstance *fwInstance,
  1385.     NSSItem *data, 
  1386.     NSSItem *buffer
  1387.   );
  1388.   /*
  1389.    */
  1390.   CK_RV (PR_CALLBACK *SignInit)(
  1391.     NSSCKMDMechanism *mdMechanism,
  1392.     NSSCKFWMechanism *fwMechanism,
  1393.     NSSCKMDSession *mdSession,
  1394.     NSSCKFWSession *fwSession,
  1395.     NSSCKMDToken *mdToken,
  1396.     NSSCKFWToken *fwToken,
  1397.     NSSCKMDInstance *mdInstance,
  1398.     NSSCKFWInstance *fwInstance,
  1399.     NSSCKMDObject *mdKey,
  1400.     NSSCKFWObject *fwKey
  1401.   );
  1402.   /*
  1403.    */
  1404.   CK_RV (PR_CALLBACK *SignUpdate)(
  1405.     NSSCKMDMechanism *mdMechanism,
  1406.     NSSCKFWMechanism *fwMechanism,
  1407.     NSSCKMDSession *mdSession,
  1408.     NSSCKFWSession *fwSession,
  1409.     NSSCKMDToken *mdToken,
  1410.     NSSCKFWToken *fwToken,
  1411.     NSSCKMDInstance *mdInstance,
  1412.     NSSCKFWInstance *fwInstance,
  1413.     NSSItem *data,
  1414.     NSSItem *buffer
  1415.   );
  1416.   /*
  1417.    */
  1418.   CK_RV (PR_CALLBACK *SignFinal)(
  1419.     NSSCKMDMechanism *mdMechanism,
  1420.     NSSCKFWMechanism *fwMechanism,
  1421.     NSSCKMDSession *mdSession,
  1422.     NSSCKFWSession *fwSession,
  1423.     NSSCKMDToken *mdToken,
  1424.     NSSCKFWToken *fwToken,
  1425.     NSSCKMDInstance *mdInstance,
  1426.     NSSCKFWInstance *fwInstance,
  1427.     NSSItem *buffer
  1428.   );
  1429.   /*
  1430.    */
  1431.   CK_RV (PR_CALLBACK *Sign)(
  1432.     NSSCKMDMechanism *mdMechanism,
  1433.     NSSCKFWMechanism *fwMechanism,
  1434.     NSSCKMDSession *mdSession,
  1435.     NSSCKFWSession *fwSession,
  1436.     NSSCKMDToken *mdToken,
  1437.     NSSCKFWToken *fwToken,
  1438.     NSSCKMDInstance *mdInstance,
  1439.     NSSCKFWInstance *fwInstance,
  1440.     NSSCKMDObject *mdKey,
  1441.     NSSCKFWObject *fwKey,
  1442.     NSSItem *data,
  1443.     NSSItem *buffer
  1444.   );
  1445.   /*
  1446.    */
  1447.   CK_RV (PR_CALLBACK *VerifyInit)(
  1448.     NSSCKMDMechanism *mdMechanism,
  1449.     NSSCKFWMechanism *fwMechanism,
  1450.     NSSCKMDSession *mdSession,
  1451.     NSSCKFWSession *fwSession,
  1452.     NSSCKMDToken *mdToken,
  1453.     NSSCKFWToken *fwToken,
  1454.     NSSCKMDInstance *mdInstance,
  1455.     NSSCKFWInstance *fwInstance,
  1456.     NSSCKFWObject *key
  1457.   );
  1458.   /*
  1459.    */
  1460.   CK_RV (PR_CALLBACK *VerifyUpdate)(
  1461.     NSSCKMDMechanism *mdMechanism,
  1462.     NSSCKFWMechanism *fwMechanism,
  1463.     NSSCKMDSession *mdSession,
  1464.     NSSCKFWSession *fwSession,
  1465.     NSSCKMDToken *mdToken,
  1466.     NSSCKFWToken *fwToken,
  1467.     NSSCKMDInstance *mdInstance,
  1468.     NSSCKFWInstance *fwInstance,
  1469.     NSSItem *data
  1470.   );
  1471.   /*
  1472.    */
  1473.   CK_RV (PR_CALLBACK *VerifyFinish)(
  1474.     NSSCKMDMechanism *mdMechanism,
  1475.     NSSCKFWMechanism *fwMechanism,
  1476.     NSSCKMDSession *mdSession,
  1477.     NSSCKFWSession *fwSession,
  1478.     NSSCKMDToken *mdToken,
  1479.     NSSCKFWToken *fwToken,
  1480.     NSSCKMDInstance *mdInstance,
  1481.     NSSCKFWInstance *fwInstance,
  1482.     NSSItem *buffer
  1483.   );
  1484.   /*
  1485.    */
  1486.   CK_RV (PR_CALLBACK *Verify)(
  1487.     NSSCKMDMechanism *mdMechanism,
  1488.     NSSCKFWMechanism *fwMechanism,
  1489.     NSSCKMDSession *mdSession,
  1490.     NSSCKFWSession *fwSession,
  1491.     NSSCKMDToken *mdToken,
  1492.     NSSCKFWToken *fwToken,
  1493.     NSSCKMDInstance *mdInstance,
  1494.     NSSCKFWInstance *fwInstance,
  1495.     NSSCKFWObject *key,
  1496.     NSSItem *data,
  1497.     NSSItem *buffer
  1498.   );
  1499.   /*
  1500.    */
  1501.   CK_RV (PR_CALLBACK *SignRecover)(
  1502.     NSSCKMDMechanism *mdMechanism,
  1503.     NSSCKFWMechanism *fwMechanism,
  1504.     NSSCKMDSession *mdSession,
  1505.     NSSCKFWSession *fwSession,
  1506.     NSSCKMDToken *mdToken,
  1507.     NSSCKFWToken *fwToken,
  1508.     NSSCKMDInstance *mdInstance,
  1509.     NSSCKFWInstance *fwInstance,
  1510.     NSSCKMDObject *mdKey,
  1511.     NSSCKFWObject *fwKey,
  1512.     NSSItem *data,
  1513.     NSSItem *buffer
  1514.   );
  1515.   /*
  1516.    */
  1517.   CK_RV (PR_CALLBACK *VerifyRecover)(
  1518.     NSSCKMDMechanism *mdMechanism,
  1519.     NSSCKFWMechanism *fwMechanism,
  1520.     NSSCKMDSession *mdSession,
  1521.     NSSCKFWSession *fwSession,
  1522.     NSSCKMDToken *mdToken,
  1523.     NSSCKFWToken *fwToken,
  1524.     NSSCKMDInstance *mdInstance,
  1525.     NSSCKFWInstance *fwInstance,
  1526.     NSSCKMDObject *mdKey,
  1527.     NSSCKFWObject *fwKey,
  1528.     NSSItem *data,
  1529.     NSSItem *buffer
  1530.   );
  1531.   /*
  1532.    */
  1533.   CK_RV (PR_CALLBACK *DigestEncryptUpdate)(
  1534.     NSSCKMDMechanism *mdMechanism,
  1535.     NSSCKFWMechanism *fwMechanism,
  1536.     NSSCKMDSession *mdSession,
  1537.     NSSCKFWSession *fwSession,
  1538.     NSSCKMDToken *mdToken,
  1539.     NSSCKFWToken *fwToken,
  1540.     NSSCKMDInstance *mdInstance,
  1541.     NSSCKFWInstance *fwInstance,
  1542.     NSSItem *data,
  1543.     NSSItem *buffer
  1544.   );
  1545.   /*
  1546.    */
  1547.   CK_RV (PR_CALLBACK *DecryptDigestUpdate)(
  1548.     NSSCKMDMechanism *mdMechanism,
  1549.     NSSCKFWMechanism *fwMechanism,
  1550.     NSSCKMDSession *mdSession,
  1551.     NSSCKFWSession *fwSession,
  1552.     NSSCKMDToken *mdToken,
  1553.     NSSCKFWToken *fwToken,
  1554.     NSSCKMDInstance *mdInstance,
  1555.     NSSCKFWInstance *fwInstance,
  1556.     NSSItem *data,
  1557.     NSSItem *buffer
  1558.   );
  1559.   /*
  1560.    */
  1561.   CK_RV (PR_CALLBACK *SignEncryptUpdate)(
  1562.     NSSCKMDMechanism *mdMechanism,
  1563.     NSSCKFWMechanism *fwMechanism,
  1564.     NSSCKMDSession *mdSession,
  1565.     NSSCKFWSession *fwSession,
  1566.     NSSCKMDToken *mdToken,
  1567.     NSSCKFWToken *fwToken,
  1568.     NSSCKMDInstance *mdInstance,
  1569.     NSSCKFWInstance *fwInstance,
  1570.     NSSItem *data,
  1571.     NSSItem *buffer
  1572.   );
  1573.   /*
  1574.    */
  1575.   CK_RV (PR_CALLBACK *DecryptVerifyUpdate)(
  1576.     NSSCKMDMechanism *mdMechanism,
  1577.     NSSCKFWMechanism *fwMechanism,
  1578.     NSSCKMDSession *mdSession,
  1579.     NSSCKFWSession *fwSession,
  1580.     NSSCKMDToken *mdToken,
  1581.     NSSCKFWToken *fwToken,
  1582.     NSSCKMDInstance *mdInstance,
  1583.     NSSCKFWInstance *fwInstance,
  1584.     NSSItem *data,
  1585.     NSSItem *buffer
  1586.   );
  1587.   /*
  1588.    * Key management operations.
  1589.    */
  1590.   /*
  1591.    * This routine generates a key.  This routine may return NULL
  1592.    * upon error.
  1593.    */
  1594.   NSSCKMDObject *(PR_CALLBACK *GenerateKey)(
  1595.     NSSCKMDMechanism *mdMechanism,
  1596.     NSSCKFWMechanism *fwMechanism,
  1597.     NSSCKMDSession *mdSession,
  1598.     NSSCKFWSession *fwSession,
  1599.     NSSCKMDToken *mdToken,
  1600.     NSSCKFWToken *fwToken,
  1601.     NSSCKMDInstance *mdInstance,
  1602.     NSSCKFWInstance *fwInstance,
  1603.     CK_ATTRIBUTE_PTR pTemplate,
  1604.     CK_ULONG ulAttributeCount,
  1605.     CK_RV *pError
  1606.   );
  1607.   /*
  1608.    * This routine generates a key pair.
  1609.    */
  1610.   CK_RV (PR_CALLBACK *GenerateKeyPair)(
  1611.     NSSCKMDMechanism *mdMechanism,
  1612.     NSSCKFWMechanism *fwMechanism,
  1613.     NSSCKMDSession *mdSession,
  1614.     NSSCKFWSession *fwSession,
  1615.     NSSCKMDToken *mdToken,
  1616.     NSSCKFWToken *fwToken,
  1617.     NSSCKMDInstance *mdInstance,
  1618.     NSSCKFWInstance *fwInstance,
  1619.     CK_ATTRIBUTE_PTR pPublicKeyTemplate,
  1620.     CK_ULONG ulPublicKeyAttributeCount,
  1621.     CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
  1622.     CK_ULONG ulPrivateKeyAttributeCount,
  1623.     NSSCKMDObject **pPublicKey,
  1624.     NSSCKMDObject **pPrivateKey
  1625.   );
  1626.   /*
  1627.    * This routine wraps a key.
  1628.    */
  1629.   CK_RV (PR_CALLBACK *WrapKey)(
  1630.     NSSCKMDMechanism *mdMechanism,
  1631.     NSSCKFWMechanism *fwMechanism,
  1632.     NSSCKMDSession *mdSession,
  1633.     NSSCKFWSession *fwSession,
  1634.     NSSCKMDToken *mdToken,
  1635.     NSSCKFWToken *fwToken,
  1636.     NSSCKMDInstance *mdInstance,
  1637.     NSSCKFWInstance *fwInstance,
  1638.     NSSCKMDObject *mdWrappingKey,
  1639.     NSSCKFWObject *fwWrappingKey,
  1640.     NSSCKMDObject *mdWrappedKey,
  1641.     NSSCKFWObject *fwWrappedKey,
  1642.     NSSItem *buffer
  1643.   );
  1644.   /*
  1645.    * This routine unwraps a key.  This routine may return NULL
  1646.    * upon error.
  1647.    */
  1648.   NSSCKMDObject *(PR_CALLBACK *UnwrapKey)(
  1649.     NSSCKMDMechanism *mdMechanism,
  1650.     NSSCKFWMechanism *fwMechanism,
  1651.     NSSCKMDSession *mdSession,
  1652.     NSSCKFWSession *fwSession,
  1653.     NSSCKMDToken *mdToken,
  1654.     NSSCKFWToken *fwToken,
  1655.     NSSCKMDInstance *mdInstance,
  1656.     NSSCKFWInstance *fwInstance,
  1657.     NSSCKMDObject *mdWrappingKey,
  1658.     NSSCKFWObject *fwWrappingKey,
  1659.     NSSItem *wrappedKey,
  1660.     CK_ATTRIBUTE_PTR pTemplate,
  1661.     CK_ULONG ulAttributeCount,
  1662.     CK_RV *pError
  1663.   );    
  1664.     
  1665.   /*
  1666.    * This routine derives a key.  This routine may return NULL
  1667.    * upon error.
  1668.    */
  1669.   NSSCKMDObject *(PR_CALLBACK *DeriveKey)(
  1670.     NSSCKMDMechanism *mdMechanism,
  1671.     NSSCKFWMechanism *fwMechanism,
  1672.     NSSCKMDSession *mdSession,
  1673.     NSSCKFWSession *fwSession,
  1674.     NSSCKMDToken *mdToken,
  1675.     NSSCKFWToken *fwToken,
  1676.     NSSCKMDInstance *mdInstance,
  1677.     NSSCKFWInstance *fwInstance,
  1678.     NSSCKMDObject *mdBaseKey,
  1679.     NSSCKFWObject *fwBaseKey,
  1680.     CK_ATTRIBUTE_PTR pTemplate,
  1681.     CK_ULONG ulAttributeCount,
  1682.     CK_RV *pError
  1683.   );    
  1684.   /*
  1685.    * This object may be extended in future versions of the
  1686.    * NSS Cryptoki Framework.  To allow for some flexibility
  1687.    * in the area of binary compatibility, this field should
  1688.    * be NULL.
  1689.    */
  1690.   void *null;
  1691. };
  1692. /*
  1693.  * NSSCKMDObject
  1694.  *
  1695.  * This is the basic handle for any object used by a PKCS#11 Module.
  1696.  * Modules must implement it if they support their own objects, and
  1697.  * the Framework supports it for Modules that do not handle session
  1698.  * objects.  This type contains a pointer for use by the implementor,
  1699.  * to store any object-specific data, and it contains an EPV for a
  1700.  * set of routines used to access the object.
  1701.  */
  1702. struct NSSCKMDObjectStr {
  1703.   /*
  1704.    * The implementation my use this pointer for its own purposes.
  1705.    */
  1706.   void *etc;
  1707.   /*
  1708.    * This routine is called by the Framework when it is letting
  1709.    * go of an object handle.  It can be used by the Module to
  1710.    * free any resources tied up by an object "in use."  It is
  1711.    * optional.
  1712.    */
  1713.   void (PR_CALLBACK *Finalize)(
  1714.     NSSCKMDObject *mdObject,
  1715.     NSSCKFWObject *fwObject,
  1716.     NSSCKMDSession *mdSession,
  1717.     NSSCKFWSession *fwSession,
  1718.     NSSCKMDToken *mdToken,
  1719.     NSSCKFWToken *fwToken,
  1720.     NSSCKMDInstance *mdInstance,
  1721.     NSSCKFWInstance *fwInstance
  1722.   );
  1723.   /*
  1724.    * This routine is used to completely destroy an object.
  1725.    * It is optional.  The parameter fwObject might be NULL
  1726.    * if the framework runs out of memory at the wrong moment.
  1727.    */
  1728.   CK_RV (PR_CALLBACK *Destroy)(
  1729.     NSSCKMDObject *mdObject,
  1730.     NSSCKFWObject *fwObject,
  1731.     NSSCKMDSession *mdSession,
  1732.     NSSCKFWSession *fwSession,
  1733.     NSSCKMDToken *mdToken,
  1734.     NSSCKFWToken *fwToken,
  1735.     NSSCKMDInstance *mdInstance,
  1736.     NSSCKFWInstance *fwInstance
  1737.   );
  1738.   /*
  1739.    * This helper routine is used by the Framework, and is especially
  1740.    * useful when it is managing session objects on behalf of the
  1741.    * Module.  This routine is optional; if unimplemented, the
  1742.    * Framework will actually look up the CKA_TOKEN attribute.  In the
  1743.    * event of an error, just make something up-- the Framework will
  1744.    * find out soon enough anyway.
  1745.    */
  1746.   CK_BBOOL (PR_CALLBACK *IsTokenObject)(
  1747.     NSSCKMDObject *mdObject,
  1748.     NSSCKFWObject *fwObject,
  1749.     NSSCKMDSession *mdSession,
  1750.     NSSCKFWSession *fwSession,
  1751.     NSSCKMDToken *mdToken,
  1752.     NSSCKFWToken *fwToken,
  1753.     NSSCKMDInstance *mdInstance,
  1754.     NSSCKFWInstance *fwInstance
  1755.   );
  1756.   /*
  1757.    * This routine returns the number of attributes of which this
  1758.    * object consists.  It is mandatory.  It can return zero on
  1759.    * error.
  1760.    */
  1761.   CK_ULONG (PR_CALLBACK *GetAttributeCount)(
  1762.     NSSCKMDObject *mdObject,
  1763.     NSSCKFWObject *fwObject,
  1764.     NSSCKMDSession *mdSession,
  1765.     NSSCKFWSession *fwSession,
  1766.     NSSCKMDToken *mdToken,
  1767.     NSSCKFWToken *fwToken,
  1768.     NSSCKMDInstance *mdInstance,
  1769.     NSSCKFWInstance *fwInstance,
  1770.     CK_RV *pError
  1771.   );
  1772.   /*
  1773.    * This routine stuffs the attribute types into the provided array.
  1774.    * The array size (as obtained from GetAttributeCount) is passed in
  1775.    * as a check; return CKR_BUFFER_TOO_SMALL if the count is wrong
  1776.    * (either too big or too small).
  1777.    */
  1778.   CK_RV (PR_CALLBACK *GetAttributeTypes)(
  1779.     NSSCKMDObject *mdObject,
  1780.     NSSCKFWObject *fwObject,
  1781.     NSSCKMDSession *mdSession,
  1782.     NSSCKFWSession *fwSession,
  1783.     NSSCKMDToken *mdToken,
  1784.     NSSCKFWToken *fwToken,
  1785.     NSSCKMDInstance *mdInstance,
  1786.     NSSCKFWInstance *fwInstance,
  1787.     CK_ATTRIBUTE_TYPE_PTR typeArray,
  1788.     CK_ULONG ulCount
  1789.   );
  1790.   /*
  1791.    * This routine returns the size (in bytes) of the specified
  1792.    * attribute.  It can return zero on error.
  1793.    */
  1794.   CK_ULONG (PR_CALLBACK *GetAttributeSize)(
  1795.     NSSCKMDObject *mdObject,
  1796.     NSSCKFWObject *fwObject,
  1797.     NSSCKMDSession *mdSession,
  1798.     NSSCKFWSession *fwSession,
  1799.     NSSCKMDToken *mdToken,
  1800.     NSSCKFWToken *fwToken,
  1801.     NSSCKMDInstance *mdInstance,
  1802.     NSSCKFWInstance *fwInstance,
  1803.     CK_ATTRIBUTE_TYPE attribute,
  1804.     CK_RV *pError
  1805.   );
  1806.   /*
  1807.    * This routine returns the specified attribute.  It can return
  1808.    * NULL upon error.  The pointer in the item will not be freed;
  1809.    * any host memory required should come from the object's arena
  1810.    * (which is likely the Framework's token or session arena).
  1811.    * It may return NULL on error.
  1812.    */
  1813.   NSSItem *(PR_CALLBACK *GetAttribute)(
  1814.     NSSCKMDObject *mdObject,
  1815.     NSSCKFWObject *fwObject,
  1816.     NSSCKMDSession *mdSession,
  1817.     NSSCKFWSession *fwSession,
  1818.     NSSCKMDToken *mdToken,
  1819.     NSSCKFWToken *fwToken,
  1820.     NSSCKMDInstance *mdInstance,
  1821.     NSSCKFWInstance *fwInstance,
  1822.     CK_ATTRIBUTE_TYPE attribute,
  1823.     CK_RV *pError
  1824.   );
  1825.   /*
  1826.    * This routine changes the specified attribute.  If unimplemented,
  1827.    * the object will be considered read-only.
  1828.    */
  1829.   CK_RV (PR_CALLBACK *SetAttribute)(
  1830.     NSSCKMDObject *mdObject,
  1831.     NSSCKFWObject *fwObject,
  1832.     NSSCKMDSession *mdSession,
  1833.     NSSCKFWSession *fwSession,
  1834.     NSSCKMDToken *mdToken,
  1835.     NSSCKFWToken *fwToken,
  1836.     NSSCKMDInstance *mdInstance,
  1837.     NSSCKFWInstance *fwInstance,
  1838.     CK_ATTRIBUTE_TYPE attribute,
  1839.     NSSItem *value
  1840.   );
  1841.   /*
  1842.    * This routine returns the storage requirements of this object,
  1843.    * in bytes.  Cryptoki doesn't strictly define the definition,
  1844.    * but it should relate to the values returned by the "Get Memory"
  1845.    * routines of the NSSCKMDToken.  This routine is optional; if
  1846.    * unimplemented, the Framework will consider this information
  1847.    * sensitive.  This routine may return zero on error.  If the
  1848.    * specified error is CKR_OK, zero will be accepted as a valid
  1849.    * response.
  1850.    */
  1851.   CK_ULONG (PR_CALLBACK *GetObjectSize)(
  1852.     NSSCKMDObject *mdObject,
  1853.     NSSCKFWObject *fwObject,
  1854.     NSSCKMDSession *mdSession,
  1855.     NSSCKFWSession *fwSession,
  1856.     NSSCKMDToken *mdToken,
  1857.     NSSCKFWToken *fwToken,
  1858.     NSSCKMDInstance *mdInstance,
  1859.     NSSCKFWInstance *fwInstance,
  1860.     CK_RV *pError
  1861.   );
  1862.   /*
  1863.    * This object may be extended in future versions of the
  1864.    * NSS Cryptoki Framework.  To allow for some flexibility
  1865.    * in the area of binary compatibility, this field should
  1866.    * be NULL.
  1867.    */
  1868.   void *null;
  1869. };
  1870. #endif /* NSSCKMDT_H */