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

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.  * Internal data structures and functions used by pkcs11.c
  35.  */
  36. #ifndef _PKCS11I_H_
  37. #define _PKCS11I_H_ 1
  38. #include "prlock.h"
  39. #include "seccomon.h"
  40. #include "secoidt.h"
  41. #include "keytlow.h"
  42. #include "pkcs11t.h"
  43. #define PKCS11_USE_THREADS
  44. #define NO_ARENA
  45. #define MAX_OBJS_ATTRS 45
  46. #define ATTR_SPACE 50  /* hold up to a SSL premaster secret */
  47. #ifdef PKCS11_USE_THREADS
  48. #define PK11_USE_THREADS(x) x
  49. #else
  50. #define PK11_USE_THREADS(x) 
  51. #endif
  52. /* define typedefs, double as forward declarations as well */
  53. typedef struct PK11AttributeStr PK11Attribute;
  54. typedef struct PK11ObjectListStr PK11ObjectList;
  55. typedef struct PK11ObjectListElementStr PK11ObjectListElement;
  56. typedef struct PK11ObjectStr PK11Object;
  57. typedef struct PK11SessionStr PK11Session;
  58. typedef struct PK11SlotStr PK11Slot;
  59. typedef struct PK11SessionContextStr PK11SessionContext;
  60. typedef struct PK11SearchResultsStr PK11SearchResults;
  61. typedef struct PK11HashVerifyInfoStr PK11HashVerifyInfo;
  62. typedef struct PK11HashSignInfoStr PK11HashSignInfo;
  63. typedef struct PK11SSLMACInfoStr PK11SSLMACInfo;
  64. /* define function pointer typdefs for pointer tables */
  65. typedef void (*PK11Destroy)(void *, PRBool);
  66. typedef void (*PK11Begin)(void *);
  67. typedef SECStatus (*PK11Cipher)(void *,void *,unsigned int *,unsigned int,
  68. void *, unsigned int);
  69. typedef SECStatus (*PK11Verify)(void *,void *,unsigned int,void *,unsigned int);
  70. typedef void (*PK11Hash)(void *,void *,unsigned int);
  71. typedef void (*PK11End)(void *,void *,unsigned int *,unsigned int);
  72. typedef void (*PK11Free)(void *);
  73. /*
  74.  * these are data base storage hashes, not cryptographic hashes.. The define
  75.  * the effective size of the various object hash tables
  76.  */
  77. #define ATTRIBUTE_HASH_SIZE 32
  78. #define SESSION_OBJECT_HASH_SIZE 32
  79. #define TOKEN_OBJECT_HASH_SIZE 1024
  80. #define SESSION_HASH_SIZE 512
  81. #define MAX_KEY_LEN 256
  82. #define MAX_OBJECT_LIST_SIZE 800
  83. /* Value to tell if an attribute is modifiable or not.
  84.  *    NEVER: attribute is only set on creation.
  85.  *    ONCOPY: attribute is set on creation and can only be changed on copy.
  86.  *    SENSITIVE: attribute can only be changed to TRUE.
  87.  *    ALWAYS: attribute can always be changed.
  88.  */
  89. typedef enum {
  90. PK11_NEVER = 0,
  91. PK11_ONCOPY = 1,
  92. PK11_SENSITIVE = 2,
  93. PK11_ALWAYS = 3
  94. } PK11ModifyType;
  95. /*
  96.  * Free Status Enum... tell us more information when we think we're
  97.  * deleting an object.
  98.  */
  99. typedef enum {
  100. PK11_DestroyFailure,
  101. PK11_Destroyed,
  102. PK11_Busy
  103. } PK11FreeStatus;
  104. /*
  105.  * attribute values of an object.
  106.  */
  107. struct PK11AttributeStr {
  108.     PK11Attribute   *next;
  109.     PK11Attribute   *prev;
  110. #ifdef REF_COUNT_ATTRIBUTE
  111.     int  refCount;
  112.     PRLock  *refLock;
  113. #endif
  114.     /*must be called handle to make pk11queue_find work */
  115.     CK_ATTRIBUTE_TYPE handle;
  116.     CK_ATTRIBUTE  attrib;
  117. #ifdef NO_ARENA
  118.     unsigned char space[ATTR_SPACE];
  119. #endif
  120. };
  121. /*
  122.  * doubly link list of objects
  123.  */
  124. struct PK11ObjectListStr {
  125.     PK11ObjectList *next;
  126.     PK11ObjectList *prev;
  127.     PK11Object    *parent;
  128. };
  129. /*
  130.  * PKCS 11 crypto object structure
  131.  */
  132. struct PK11ObjectStr {
  133.     PK11Object *next;
  134.     PK11Object *prev;
  135.     PK11ObjectList sessionList;
  136.     CK_OBJECT_HANDLE handle;
  137. #ifdef NO_ARENA
  138.     int nextAttr;
  139. #else
  140.     PLArenaPool *arena;
  141. #endif
  142.     int refCount;
  143.     PRLock  *refLock;
  144.     PRLock *attributeLock;
  145.     PK11Session    *session;
  146.     PK11Slot     *slot;
  147.     CK_OBJECT_CLASS  objclass;
  148.     void  *objectInfo;
  149.     PK11Free  infoFree;
  150.     char *label;
  151.     PRBool inDB;
  152.     PRBool wasDerived;
  153.     PK11Attribute  *head[ATTRIBUTE_HASH_SIZE];
  154. #ifdef NO_ARENA
  155.     PK11Attribute attrList[MAX_OBJS_ATTRS];
  156. #endif
  157. };
  158. /*
  159.  * struct to deal with a temparary list of objects
  160.  */
  161. struct PK11ObjectListElementStr {
  162.     PK11ObjectListElement *next;
  163.     PK11Object  *object;
  164. };
  165. /*
  166.  * Area to hold Search results
  167.  */
  168. struct PK11SearchResultsStr {
  169.     CK_OBJECT_HANDLE *handles;
  170.     int size;
  171.     int index;
  172. };
  173. /* 
  174.  * the universal crypto/hash/sign/verify context structure
  175.  */
  176. typedef enum {
  177.     PK11_ENCRYPT,
  178.     PK11_DECRYPT,
  179.     PK11_HASH,
  180.     PK11_SIGN,
  181.     PK11_SIGN_RECOVER,
  182.     PK11_VERIFY,
  183.     PK11_VERIFY_RECOVER
  184. } PK11ContextType;
  185. #define PK11_MAX_BLOCK_SIZE 16
  186. /* currently SHA1 is the biggest hash length */
  187. #define PK11_MAX_MAC_LENGTH 20
  188. #define PK11_INVALID_MAC_SIZE 0xffffffff
  189. struct PK11SessionContextStr {
  190.     PK11ContextType type;
  191.     PRBool multi;  /* is multipart */
  192.     PRBool doPad;  /* use PKCS padding for block ciphers */
  193.     unsigned int blockSize;  /* blocksize for padding */
  194.     unsigned int padDataLength;  /* length of the valid data in padbuf */
  195.     unsigned char padBuf[PK11_MAX_BLOCK_SIZE];
  196.     unsigned char macBuf[PK11_MAX_BLOCK_SIZE];
  197.     CK_ULONG macSize; /* size of a general block cipher mac*/
  198.     void *cipherInfo;
  199.     void *hashInfo;
  200.     unsigned int cipherInfoLen;
  201.     CK_MECHANISM_TYPE currentMech;
  202.     PK11Cipher update;
  203.     PK11Hash hashUpdate;
  204.     PK11End end;
  205.     PK11Destroy destroy;
  206.     PK11Destroy hashdestroy;
  207.     PK11Verify verify;
  208.     unsigned int maxLen;
  209. };
  210. /*
  211.  * Sessions (have objects)
  212.  */
  213. struct PK11SessionStr {
  214.     PK11Session        *next;
  215.     PK11Session        *prev;
  216.     CK_SESSION_HANDLE handle;
  217.     int refCount;
  218.     PRLock  *refLock;
  219.     PRLock *objectLock;
  220.     int objectIDCount;
  221.     CK_SESSION_INFO info;
  222.     CK_NOTIFY notify;
  223.     CK_VOID_PTR appData;
  224.     PK11Slot *slot;
  225.     PK11SearchResults *search;
  226.     PK11SessionContext *enc_context;
  227.     PK11SessionContext *hash_context;
  228.     PK11SessionContext *sign_context;
  229.     PK11ObjectList *objects[1];
  230. };
  231. /*
  232.  * slots (have sessions and objects)
  233.  */
  234. struct PK11SlotStr {
  235.     CK_SLOT_ID slotID;
  236.     PRLock *sessionLock;
  237.     PRLock *objectLock;
  238.     SECItem *password;
  239.     PRBool hasTokens;
  240.     PRBool isLoggedIn;
  241.     PRBool ssoLoggedIn;
  242.     PRBool needLogin;
  243.     PRBool DB_loaded;
  244.     int sessionIDCount;
  245.     int sessionCount;
  246.     int rwSessionCount;
  247.     int tokenIDCount;
  248.     PK11Object *tokObjects[TOKEN_OBJECT_HASH_SIZE];
  249.     PK11Session *head[SESSION_HASH_SIZE];
  250. };
  251. /*
  252.  * special joint operations Contexts
  253.  */
  254. struct PK11HashVerifyInfoStr {
  255.     SECOidTag    hashOid;
  256.     SECKEYLowPublicKey *key;
  257. };
  258. struct PK11HashSignInfoStr {
  259.     SECOidTag    hashOid;
  260.     SECKEYLowPrivateKey *key;
  261. };
  262. /* context for the Final SSLMAC message */
  263. struct PK11SSLMACInfoStr {
  264.     void  *hashContext;
  265.     PK11Begin begin;
  266.     PK11Hash update;
  267.     PK11End end;
  268.     CK_ULONG macSize;
  269.     int padSize;
  270.     unsigned char key[MAX_KEY_LEN];
  271.     unsigned int keySize;
  272. };
  273. /*
  274.  * session handle modifiers
  275.  */
  276. #define PK11_PRIVATE_KEY_FLAG 0x80000000L
  277. #define PK11_FIPS_FLAG 0x40000000L
  278. /*
  279.  * object handle modifiers
  280.  */
  281. #define PK11_TOKEN_MASK 0x80000000L
  282. #define PK11_TOKEN_MAGIC 0x80000000L
  283. #define PK11_TOKEN_TYPE_MASK 0x70000000L
  284. #define PK11_TOKEN_TYPE_CERT 0x00000000L
  285. #define PK11_TOKEN_TYPE_PRIV 0x10000000L
  286. #define PK11_TOKEN_TYPE_PUB 0x20000000L
  287. /* how big a password/pin we can deal with */
  288. #define PK11_MAX_PIN 255
  289. /* slot ID's */
  290. #define NETSCAPE_SLOT_ID 1
  291. #define PRIVATE_KEY_SLOT_ID 2
  292. #define FIPS_SLOT_ID 3
  293. /* slot helper macros */
  294. #define pk11_SlotFromSession(sp) ((sp)->slot)
  295. #define pk11_isToken(id) (((id) & PK11_TOKEN_MASK) == PK11_TOKEN_MAGIC)
  296. /* queueing helper macros */
  297. #define pk11_hash(value,size) ((value) & (size-1))/*size must be a power of 2*/
  298. #define pk11queue_add(element,id,head,hash_size) 
  299. { int tmp = pk11_hash(id,hash_size); 
  300. (element)->next = (head)[tmp]; 
  301. (element)->prev = NULL; 
  302. if ((head)[tmp]) (head)[tmp]->prev = (element); 
  303. (head)[tmp] = (element); }
  304. #define pk11queue_find(element,id,head,hash_size) 
  305. for( (element) = (head)[pk11_hash(id,hash_size)]; (element) != NULL; 
  306.  (element) = (element)->next) { 
  307.     if ((element)->handle == (id)) { break; } }
  308. #define pk11queue_is_queued(element,id,head,hash_size) 
  309. ( ((element)->next) || ((element)->prev) || 
  310.  ((head)[pk11_hash(id,hash_size)] == (element)) )
  311. #define pk11queue_delete(element,id,head,hash_size) 
  312. if ((element)->next) (element)->next->prev = (element)->prev; 
  313. if ((element)->prev) (element)->prev->next = (element)->next; 
  314.    else (head)[pk11_hash(id,hash_size)] = ((element)->next); 
  315. (element)->next = NULL; 
  316. (element)->prev = NULL; 
  317. /* expand an attribute & secitem structures out */
  318. #define pk11_attr_expand(ap) (ap)->type,(ap)->pValue,(ap)->ulValueLen
  319. #define pk11_item_expand(ip) (ip)->data,(ip)->len
  320. SEC_BEGIN_PROTOS
  321. /* shared functions between PKCS11.c and PK11FIPS.c */
  322. extern CK_RV PK11_LowInitialize(CK_VOID_PTR pReserved);
  323. extern CK_RV PK11_SlotInit(CK_SLOT_ID slotID, PRBool needLogin);
  324. /* internal utility functions used by pkcs11.c */
  325. extern PK11Attribute *pk11_FindAttribute(PK11Object *object,
  326.  CK_ATTRIBUTE_TYPE type);
  327. extern void pk11_FreeAttribute(PK11Attribute *attribute);
  328. extern CK_RV pk11_AddAttributeType(PK11Object *object, CK_ATTRIBUTE_TYPE type,
  329.    void *valPtr,
  330.   CK_ULONG length);
  331. extern CK_RV pk11_Attribute2SecItem(PLArenaPool *arena, SECItem *item,
  332.     PK11Object *object, CK_ATTRIBUTE_TYPE type);
  333. extern PRBool pk11_hasAttribute(PK11Object *object, CK_ATTRIBUTE_TYPE type);
  334. extern PRBool pk11_isTrue(PK11Object *object, CK_ATTRIBUTE_TYPE type);
  335. extern void pk11_DeleteAttributeType(PK11Object *object,
  336.      CK_ATTRIBUTE_TYPE type);
  337. extern CK_RV pk11_Attribute2SecItem(PLArenaPool *arena, SECItem *item,
  338.     PK11Object *object, CK_ATTRIBUTE_TYPE type);
  339. extern CK_RV pk11_Attribute2SSecItem(PLArenaPool *arena, SECItem *item,
  340.      PK11Object *object,
  341.      CK_ATTRIBUTE_TYPE type);
  342. extern PK11ModifyType pk11_modifyType(CK_ATTRIBUTE_TYPE type,
  343.       CK_OBJECT_CLASS inClass);
  344. extern PRBool pk11_isSensitive(CK_ATTRIBUTE_TYPE type, CK_OBJECT_CLASS inClass);
  345. extern char *pk11_getString(PK11Object *object, CK_ATTRIBUTE_TYPE type);
  346. extern void pk11_nullAttribute(PK11Object *object,CK_ATTRIBUTE_TYPE type);
  347. extern CK_RV pk11_forceAttribute(PK11Object *object, CK_ATTRIBUTE_TYPE type,
  348.  void *value, unsigned int len);
  349. extern CK_RV pk11_defaultAttribute(PK11Object *object, CK_ATTRIBUTE_TYPE type,
  350.    void *value, unsigned int len);
  351. extern PK11Object *pk11_NewObject(PK11Slot *slot);
  352. extern CK_RV pk11_CopyObject(PK11Object *destObject, PK11Object *srcObject);
  353. extern PK11FreeStatus pk11_FreeObject(PK11Object *object);
  354. extern void pk11_DeleteObject(PK11Session *session, PK11Object *object);
  355. extern void pk11_ReferenceObject(PK11Object *object);
  356. extern PK11Object *pk11_ObjectFromHandle(CK_OBJECT_HANDLE handle,
  357.  PK11Session *session);
  358. extern void pk11_AddSlotObject(PK11Slot *slot, PK11Object *object);
  359. extern void pk11_AddObject(PK11Session *session, PK11Object *object);
  360. extern CK_RV pk11_searchObjectList(PK11ObjectListElement **objectList,
  361.    PK11Object **head, PRLock *lock,
  362.    CK_ATTRIBUTE_PTR inTemplate, int count,
  363.    PRBool isLoggedIn);
  364. extern PK11ObjectListElement *pk11_FreeObjectListElement(
  365.      PK11ObjectListElement *objectList);
  366. extern void pk11_FreeObjectList(PK11ObjectListElement *objectList);
  367. extern void pk11_FreeSearch(PK11SearchResults *search);
  368. extern CK_RV pk11_handleObject(PK11Object *object, PK11Session *session);
  369. extern PK11Slot *pk11_SlotFromID(CK_SLOT_ID slotID);
  370. extern PK11Slot *pk11_SlotFromSessionHandle(CK_SESSION_HANDLE handle);
  371. extern PK11Session *pk11_SessionFromHandle(CK_SESSION_HANDLE handle);
  372. extern void pk11_FreeSession(PK11Session *session);
  373. extern PK11Session *pk11_NewSession(CK_SLOT_ID slotID, CK_NOTIFY notify,
  374.     CK_VOID_PTR pApplication, CK_FLAGS flags);
  375. extern void pk11_update_state(PK11Slot *slot,PK11Session *session);
  376. extern void pk11_update_all_states(PK11Slot *slot);
  377. extern void pk11_FreeContext(PK11SessionContext *context);
  378. extern SECKEYLowPublicKey *pk11_GetPubKey(PK11Object *object,
  379.   CK_KEY_TYPE key_type);
  380. extern SECKEYLowPrivateKey *pk11_GetPrivKey(PK11Object *object,
  381.     CK_KEY_TYPE key_type);
  382. extern void pk11_FormatDESKey(unsigned char *key, int length);
  383. extern PRBool pk11_CheckDESKey(unsigned char *key);
  384. extern PRBool pk11_IsWeakKey(unsigned char *key,CK_KEY_TYPE key_type);
  385. SEC_END_PROTOS
  386. #endif /* _PKCS11I_H_ */