1 /*
2  * The Initial Developer of the Original Code is International
3  * Business Machines Corporation. Portions created by IBM
4  * Corporation are Copyright(C) 2005 International Business
5  * Machines Corporation. All Rights Reserved.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the Common Public License as published by
9  * IBM Corporation; either version 1 of the License, or(at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * Common Public License for more details.
16  *
17  * You should have received a copy of the Common Public License
18  * along with this program; if not, a copy can be viewed at
19  * http://www.opensource.org/licenses/cpl1.0.php.
20  */
21 
22 /* (C) COPYRIGHT International Business Machines Corp. 2001, 2002, 2005 */
23 /*
24  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27 
28 #ifndef _TPMTOK_INT_H
29 #define	_TPMTOK_INT_H
30 
31 #include <stdio.h>
32 #include <pthread.h>
33 #include <string.h>
34 #include <strings.h>
35 #include <md5.h>
36 #include <sha1.h>
37 #include <limits.h>
38 #include <syslog.h>
39 #include <errno.h>
40 #include <sys/types.h>
41 #include <sys/stat.h>
42 #include <sys/param.h>
43 #include <sys/byteorder.h>
44 #include <security/cryptoki.h>
45 
46 #include <tss/platform.h>
47 #include <tss/tss_defines.h>
48 #include <tss/tss_typedef.h>
49 #include <tss/tss_structs.h>
50 #include <tss/tspi.h>
51 
52 #define	VERSION_MAJOR 2
53 #define	VERSION_MINOR 1
54 
55 #define	MAX_SESSION_COUNT	64
56 #define	MAX_PIN_LEN	256
57 #define	MIN_PIN_LEN	1
58 
59 #define	MAX_SLOT_ID	10
60 
61 #ifndef MIN
62 #define	MIN(a, b)  ((a) < (b) ? (a) : (b))
63 #endif
64 
65 #define	MODE_COPY	(1 << 0)
66 #define	MODE_CREATE	(1 << 1)
67 #define	MODE_KEYGEN	(1 << 2)
68 #define	MODE_MODIFY	(1 << 3)
69 #define	MODE_DERIVE	(1 << 4)
70 #define	MODE_UNWRAP	(1 << 5)
71 
72 // RSA block formatting types
73 //
74 #define	PKCS_BT_1	1
75 #define	PKCS_BT_2	2
76 
77 #define	OP_ENCRYPT_INIT 1
78 #define	OP_DECRYPT_INIT 2
79 #define	OP_WRAP		3
80 #define	OP_UNWRAP	4
81 #define	OP_SIGN_INIT	5
82 #define	OP_VERIFY_INIT	6
83 
84 enum {
85 	STATE_INVALID = 0,
86 	STATE_ENCR,
87 	STATE_DECR,
88 	STATE_DIGEST,
89 	STATE_SIGN,
90 	STATE_VERIFY
91 };
92 
93 #define	SHA1_BLOCK_SIZE 64
94 #define	SHA1_BLOCK_SIZE_MASK (SHA1_BLOCK_SIZE - 1)
95 
96 #define	RSA_BLOCK_SIZE 256
97 
98 #ifndef PATH_MAX
99 #define	PATH_MAX MAXPATHLEN
100 #endif
101 
102 #ifndef PACK_DATA
103 #define	PACK_DATA
104 #endif
105 
106 #define	MD5_BLOCK_SIZE  64
107 
108 #define	DSA_SIGNATURE_SIZE  40
109 
110 #define	DEFAULT_SO_PIN  "87654321"
111 
112 typedef enum {
113 	ALL = 1,
114 	PRIVATE,
115 	PUBLIC
116 } SESS_OBJ_TYPE;
117 
118 typedef struct _DL_NODE
119 {
120 	struct _DL_NODE	*next;
121 	struct _DL_NODE	*prev;
122 	void  *data;
123 } DL_NODE;
124 
125 #define	TOKEN_DATA_FILE	"token.dat"
126 #define	TOKEN_OBJ_DIR	"objects"
127 #define	TOKEN_OBJ_INDEX_FILE "obj.idx"
128 
129 #define	TPMTOK_UUID_INDEX_FILENAME "uuids.idx"
130 
131 /*
132  * Filenames used to store migration data.
133  */
134 #define	SO_MAKEY_FILENAME	"so_makey.dat"
135 #define	USER_MAKEY_FILENAME	"user_makey.dat"
136 #define	SO_KEYBLOB_FILENAME	"so_blob.dat"
137 #define	USER_KEYBLOB_FILENAME	"user_blob.dat"
138 
139 #define	__FUNCTION__ __func__
140 
141 //
142 // Both of the strings below have a length of 32 chars and must be
143 // padded with spaces, and non - null terminated.
144 //
145 #define	PKW_CRYPTOKI_VERSION_MAJOR	2
146 #define	PKW_CRYPTOKI_VERSION_MINOR	1
147 #define	PKW_CRYPTOKI_MANUFACTURER	"Sun Microsystems, Inc.	  "
148 #define	PKW_CRYPTOKI_LIBDESC	    "PKCS#11 Interface for TPM	"
149 #define	PKW_CRYPTOKI_LIB_VERSION_MAJOR  1
150 #define	PKW_CRYPTOKI_LIB_VERSION_MINOR  0
151 #define	PKW_MAX_DEVICES		 10
152 
153 #define	MAX_TOK_OBJS  2048
154 #define	NUMBER_SLOTS_MANAGED 1
155 #define	TPM_SLOTID 1
156 
157 /*
158  * CKA_HIDDEN will be used to filter return results on
159  * a C_FindObjects call. Used for objects internal to the
160  * TPM token for management
161  */
162 /* custom attributes for the TPM token */
163 #define	CKA_HIDDEN	CKA_VENDOR_DEFINED + 0x01
164 #define	CKA_IBM_OPAQUE	CKA_VENDOR_DEFINED + 0x02
165 /*
166  * CKA_ENC_AUTHDATA will be used to store the encrypted SHA-1
167  * hashes of auth data passed in for TPM keys. The authdata
168  * will be encrypted using either the public
169  * leaf key or the private leaf key
170  */
171 #define	CKA_ENC_AUTHDATA CKA_VENDOR_DEFINED + 0x03
172 
173 /* custom return codes for the TPM token */
174 #define	CKR_KEY_NOT_FOUND	CKR_VENDOR_DEFINED + 0x01
175 #define	CKR_FILE_NOT_FOUND	CKR_VENDOR_DEFINED + 0x02
176 
177 typedef struct {
178 	CK_SLOT_ID  slotID;
179 	CK_SESSION_HANDLE  sessionh;
180 } ST_SESSION_T;
181 
182 typedef ST_SESSION_T ST_SESSION_HANDLE;
183 
184 typedef struct {
185 	void *Previous;
186 	void *Next;
187 	CK_SLOT_ID   SltId;
188 	CK_SESSION_HANDLE  RealHandle;
189 } Session_Struct_t;
190 
191 typedef Session_Struct_t *SessStructP;
192 
193 typedef struct {
194 	pid_t Pid;
195 	pthread_mutex_t  ProcMutex;
196 	Session_Struct_t *SessListBeg;
197 	Session_Struct_t *SessListEnd;
198 	pthread_mutex_t  SessListMutex;
199 } API_Proc_Struct_t;
200 
201 
202 
203 
204 enum {
205 	PRF_DUMMYFUNCTION = 1,
206 	PRF_FCVFUNCTION,
207 	PRF_INITIALIZE,
208 	PRF_FINALIZE,
209 	PRF_GETINFO,
210 	PRF_GETFUNCTIONLIST,
211 	PRF_GETSLOTLIST,
212 	PRF_GETSLOTINFO,
213 	PRF_GETTOKENINFO,
214 	PRF_GETMECHLIST,
215 	PRF_GETMECHINFO,
216 	PRF_INITTOKEN,
217 	PRF_INITPIN,
218 	PRF_SETPIN,
219 	PRF_OPENSESSION,
220 	PRF_CLOSESESSION,
221 	PRF_CLOSEALLSESSIONS,
222 	PRF_GETSESSIONINFO,
223 	PRF_GETOPERATIONSTATE,
224 	PRF_SETOPERATIONSTATE,
225 	PRF_LOGIN,
226 	PRF_LOGOUT,
227 	PRF_CREATEOBJECT,
228 	PRF_COPYOBJECT,
229 	PRF_DESTROYOBJECT,
230 	PRF_GETOBJECTSIZE,
231 	PRF_GETATTRIBUTEVALUE,
232 	PRF_SETATTRIBUTEVALUE,
233 	PRF_FINDOBJECTSINIT,
234 	PRF_FINDOBJECTS,
235 	PRF_FINDOBJECTSFINAL,
236 	PRF_ENCRYPTINIT,
237 	PRF_ENCRYPT,
238 	PRF_ENCRYPTUPDATE,
239 	PRF_ENCRYPTFINAL,
240 	PRF_DECRYPTINIT,
241 	PRF_DECRYPT,
242 	PRF_DECRYPTUPDATE,
243 	PRF_DECRYPTFINAL,
244 	PRF_DIGESTINIT,
245 	PRF_DIGEST,
246 	PRF_DIGESTUPDATE,
247 	PRF_DIGESTKEY,
248 	PRF_DIGESTFINAL,
249 	PRF_SIGNINIT,
250 	PRF_SIGN,
251 	PRF_SIGNUPDATE,
252 	PRF_SIGNFINAL,
253 	PRF_SIGNRECOVERINIT,
254 	PRF_SIGNRECOVER,
255 	PRF_VERIFYINIT,
256 	PRF_VERIFY,
257 	PRF_VERIFYUPDATE,
258 	PRF_VERIFYFINAL,
259 	PRF_VERIFYRECOVERINIT,
260 	PRF_VERIFYRECOVER,
261 	PRF_GENKEY,
262 	PRF_GENKEYPAIR,
263 	PRF_WRAPKEY,
264 	PRF_UNWRAPKEY,
265 	PRF_DERIVEKEY,
266 	PRF_GENRND,
267 	PRF_LASTENTRY
268 };
269 
270 typedef struct _ENCR_DECR_CONTEXT
271 {
272 	CK_OBJECT_HANDLE  key;
273 	CK_MECHANISM mech;
274 	CK_BYTE	  *context;
275 	CK_ULONG  context_len;
276 	CK_BBOOL  multi;
277 	CK_BBOOL  active;
278 } ENCR_DECR_CONTEXT;
279 
280 typedef struct _DIGEST_CONTEXT
281 {
282 	CK_MECHANISM   mech;
283 	union {
284 		MD5_CTX *md5ctx;
285 		SHA1_CTX *sha1ctx;
286 		void *ref; /* reference ptr for the union */
287 	} context;
288 	CK_ULONG context_len;
289 	CK_BBOOL multi;
290 	CK_BBOOL active;
291 } DIGEST_CONTEXT;
292 
293 typedef struct _SIGN_VERIFY_CONTEXT
294 {
295 	CK_OBJECT_HANDLE key;
296 	CK_MECHANISM	mech;	// current sign mechanism
297 	void	 *context;  // temporary work area
298 	CK_ULONG context_len;
299 	CK_BBOOL multi;    // is this a multi - part operation?
300 	CK_BBOOL recover;  // are we in recover mode?
301 	CK_BBOOL active;
302 } SIGN_VERIFY_CONTEXT;
303 
304 typedef struct _SESSION
305 {
306 	CK_SESSION_HANDLE    handle;
307 	CK_SESSION_INFO	session_info;
308 
309 	CK_OBJECT_HANDLE    *find_list;	// array of CK_OBJECT_HANDLE
310 	CK_ULONG	find_count;    // # handles in the list
311 	CK_ULONG	find_len;	// max # of handles in the list
312 	CK_ULONG	find_idx;	// current position
313 	CK_BBOOL	find_active;
314 
315 	ENCR_DECR_CONTEXT    encr_ctx;
316 	ENCR_DECR_CONTEXT    decr_ctx;
317 	DIGEST_CONTEXT	digest_ctx;
318 	SIGN_VERIFY_CONTEXT  sign_ctx;
319 	SIGN_VERIFY_CONTEXT  verify_ctx;
320 
321 	TSS_HCONTEXT	hContext;
322 } SESSION;
323 
324 typedef struct _TEMPLATE
325 {
326 	DL_NODE  *attribute_list;
327 } TEMPLATE;
328 
329 typedef struct _OBJECT
330 {
331 	CK_OBJECT_CLASS   class;
332 	CK_BYTE	 name[8];   // for token objects
333 
334 	SESSION	 *session;   // creator; only for session objects
335 	TEMPLATE *template;
336 	CK_ULONG count_hi;  // only significant for token objects
337 	CK_ULONG count_lo;  // only significant for token objects
338 	CK_ULONG index;
339 } OBJECT;
340 
341 typedef struct _OBJECT_MAP
342 {
343 	CK_OBJECT_HANDLE	handle;
344 	CK_BBOOL is_private;
345 	CK_BBOOL is_session_obj;
346 	SESSION	 *session;
347 	OBJECT   *ptr;
348 } OBJECT_MAP;
349 
350 typedef struct _ATTRIBUTE_PARSE_LIST
351 {
352 	CK_ATTRIBUTE_TYPE type;
353 	void		*ptr;
354 	CK_ULONG	  len;
355 	CK_BBOOL	  found;
356 } ATTRIBUTE_PARSE_LIST;
357 
358 typedef struct _OP_STATE_DATA
359 {
360 	CK_STATE    session_state;
361 	CK_ULONG    active_operation;
362 	CK_ULONG    data_len;
363 } OP_STATE_DATA;
364 
365 typedef struct _TWEAK_VEC
366 {
367 	int   allow_key_mods;
368 } TWEAK_VEC;
369 
370 typedef struct _TOKEN_DATA
371 {
372 	CK_TOKEN_INFO token_info;
373 	CK_BYTE   user_pin_sha[SHA1_DIGEST_LENGTH];
374 	CK_BYTE   so_pin_sha[SHA1_DIGEST_LENGTH];
375 	CK_BYTE   next_token_object_name[8];
376 	TWEAK_VEC tweak_vector;
377 } TOKEN_DATA;
378 
379 typedef struct _RSA_DIGEST_CONTEXT {
380 	DIGEST_CONTEXT hash_context;
381 	CK_BBOOL	flag;
382 } RSA_DIGEST_CONTEXT;
383 
384 typedef struct _MECH_LIST_ELEMENT
385 {
386 	CK_MECHANISM_TYPE    mech_type;
387 	CK_MECHANISM_INFO    mech_info;
388 } MECH_LIST_ELEMENT;
389 
390 struct mech_list_item;
391 
392 struct mech_list_item {
393 	struct mech_list_item *next;
394 	MECH_LIST_ELEMENT element;
395 };
396 
397 struct mech_list_item *
398 find_mech_list_item_for_type(CK_MECHANISM_TYPE type,
399 	struct mech_list_item *head);
400 
401 typedef struct _TOK_OBJ_ENTRY
402 {
403 	CK_BBOOL  deleted;
404 	char	name[8];
405 	CK_ULONG  count_lo;
406 	CK_ULONG  count_hi;
407 } TOK_OBJ_ENTRY;
408 
409 typedef struct _LW_SHM_TYPE
410 {
411 	pthread_mutex_t	mutex;
412 	TOKEN_DATA	nv_token_data;
413 	CK_ULONG	num_priv_tok_obj;
414 	CK_ULONG	num_publ_tok_obj;
415 	CK_BBOOL	priv_loaded;
416 	CK_BBOOL	publ_loaded;
417 	CK_BBOOL	token_available;
418 	TOK_OBJ_ENTRY  publ_tok_objs[ MAX_TOK_OBJS ];
419 	TOK_OBJ_ENTRY  priv_tok_objs[ MAX_TOK_OBJS ];
420 } LW_SHM_TYPE;
421 
422 typedef unsigned int CK_ULONG_32;
423 typedef CK_ULONG_32 CK_OBJECT_CLASS_32;
424 typedef CK_ULONG_32 CK_ATTRIBUTE_TYPE_32;
425 
426 typedef struct CK_ATTRIBUTE_32 {
427 	CK_ATTRIBUTE_TYPE_32 type;
428 	CK_ULONG_32 pValue;
429 	CK_ULONG_32 ulValueLen;
430 } CK_ATTRIBUTE_32;
431 
432 char *get_tpm_keystore_path();
433 
434 struct messages {
435 	char *msg;
436 };
437 
438 struct token_specific_struct {
439 	CK_BYTE  token_debug_tag[MAXPATHLEN];
440 
441 	CK_RV  (*t_init)(char *, CK_SLOT_ID, TSS_HCONTEXT *);
442 	int  (*t_slot2local)();
443 
444 	CK_RV  (*t_rng)(TSS_HCONTEXT, CK_BYTE *, CK_ULONG);
445 	CK_RV  (*t_session)(CK_SLOT_ID);
446 	CK_RV  (*t_final)(TSS_HCONTEXT);
447 	CK_RV (*t_rsa_decrypt)(TSS_HCONTEXT, CK_BYTE *,
448 		CK_ULONG, CK_BYTE *, CK_ULONG *, OBJECT *);
449 
450 	CK_RV (*t_rsa_encrypt)(
451 		TSS_HCONTEXT,
452 		CK_BYTE *, CK_ULONG, CK_BYTE *,
453 		CK_ULONG *, OBJECT *);
454 
455 	CK_RV (*t_rsa_sign)(TSS_HCONTEXT,
456 		CK_BYTE *,
457 		CK_ULONG,
458 		CK_BYTE *,
459 		CK_ULONG *,
460 		OBJECT *);
461 
462 	CK_RV (*t_rsa_verify)(TSS_HCONTEXT,
463 		CK_BYTE *,
464 		CK_ULONG,
465 		CK_BYTE *,
466 		CK_ULONG,
467 		OBJECT *);
468 
469 	CK_RV (*t_rsa_generate_keypair)(TSS_HCONTEXT, TEMPLATE *, TEMPLATE *);
470 
471 	CK_RV (*t_sha_init)(DIGEST_CONTEXT *);
472 
473 	CK_RV (*t_sha_update)(
474 		DIGEST_CONTEXT *,
475 		CK_BYTE	*,
476 		CK_ULONG);
477 
478 	CK_RV (*t_sha_final)(
479 		DIGEST_CONTEXT *,
480 		CK_BYTE *,
481 		CK_ULONG *);
482 	CK_RV (*t_login)(TSS_HCONTEXT, CK_USER_TYPE, CK_BYTE *, CK_ULONG);
483 	CK_RV (*t_logout)(TSS_HCONTEXT);
484 	CK_RV (*t_init_pin)(TSS_HCONTEXT, CK_BYTE *, CK_ULONG);
485 	CK_RV (*t_set_pin)(ST_SESSION_HANDLE, CK_BYTE *,
486 		CK_ULONG, CK_BYTE *, CK_ULONG);
487 	CK_RV (*t_verify_so_pin)(TSS_HCONTEXT, CK_BYTE *, CK_ULONG);
488 };
489 
490 typedef  struct token_specific_struct token_spec_t;
491 
492 /*
493  * Global Variables
494  */
495 extern void copy_slot_info(CK_SLOT_ID, CK_SLOT_INFO_PTR);
496 
497 extern struct messages err_msg[];
498 
499 extern token_spec_t token_specific;
500 extern CK_BBOOL initialized;
501 extern char *card_function_names[];
502 extern char *total_function_names[];
503 
504 extern MECH_LIST_ELEMENT mech_list[];
505 extern CK_ULONG mech_list_len;
506 
507 extern pthread_mutex_t native_mutex;
508 
509 extern void *xproclock;
510 
511 extern pthread_mutex_t pkcs_mutex, obj_list_mutex,
512 	sess_list_mutex, login_mutex;
513 
514 extern DL_NODE *sess_list;
515 extern DL_NODE *sess_obj_list;
516 extern DL_NODE *publ_token_obj_list;
517 extern DL_NODE *priv_token_obj_list;
518 extern DL_NODE *object_map;
519 
520 extern CK_BYTE so_pin_md5[MD5_DIGEST_LENGTH];
521 extern CK_BYTE user_pin_md5[MD5_DIGEST_LENGTH];
522 
523 extern CK_BYTE default_user_pin_sha[SHA1_DIGEST_LENGTH];
524 extern CK_BYTE default_so_pin_sha[SHA1_DIGEST_LENGTH];
525 extern CK_BYTE default_so_pin_md5[MD5_DIGEST_LENGTH];
526 
527 extern LW_SHM_TYPE *global_shm;
528 
529 extern TOKEN_DATA *nv_token_data;
530 
531 extern CK_ULONG next_object_handle;
532 extern CK_ULONG next_session_handle;
533 
534 extern CK_STATE global_login_state;
535 
536 extern CK_BYTE	ber_AlgIdRSAEncryption[];
537 extern CK_ULONG	ber_AlgIdRSAEncryptionLen;
538 extern CK_BYTE	ber_rsaEncryption[];
539 extern CK_ULONG	ber_rsaEncryptionLen;
540 extern CK_BYTE	ber_idDSA[];
541 extern CK_ULONG	ber_idDSALen;
542 
543 extern CK_BYTE ber_md5WithRSAEncryption[];
544 extern CK_ULONG ber_md5WithRSAEncryptionLen;
545 extern CK_BYTE ber_sha1WithRSAEncryption[];
546 extern CK_ULONG ber_sha1WithRSAEncryptionLen;
547 extern CK_BYTE ber_AlgMd5[];
548 extern CK_ULONG ber_AlgMd5Len;
549 extern CK_BYTE ber_AlgSha1[];
550 extern CK_ULONG ber_AlgSha1Len;
551 
552 extern CK_C_INITIALIZE_ARGS cinit_args;
553 
554 /*
555  * Function Prototypes
556  */
557 void *attach_shared_memory();
558 void  detach_shared_memory(char *);
559 
560 int API_Initialized();
561 void Terminate_All_Process_Sessions();
562 int API_Register();
563 void API_UnRegister();
564 
565 void CreateXProcLock(void *);
566 int XProcLock(void *);
567 int XProcUnLock(void *);
568 
569 void loginit();
570 void logterm();
571 void logit(int, char *, ...);
572 void AddToSessionList(Session_Struct_t *);
573 void RemoveFromSessionList(Session_Struct_t *);
574 
575 int Valid_Session(Session_Struct_t *, ST_SESSION_T *);
576 
577 CK_BBOOL pin_expired(CK_SESSION_INFO *, CK_FLAGS);
578 CK_BBOOL pin_locked(CK_SESSION_INFO *, CK_FLAGS);
579 void set_login_flags(CK_USER_TYPE, CK_FLAGS *);
580 
581 extern void init_slot_info(TOKEN_DATA *);
582 
583 CK_RV update_migration_data(TSS_HCONTEXT,
584 	TSS_HKEY, TSS_HKEY, char *, char *, BYTE *, BYTE *);
585 CK_RV token_rng(TSS_HCONTEXT, CK_BYTE *, CK_ULONG);
586 
587 TSS_RESULT set_public_modulus(TSS_HCONTEXT, TSS_HKEY,
588     unsigned long, unsigned char *);
589 TSS_RESULT open_tss_context(TSS_HCONTEXT *);
590 CK_RV token_get_tpm_info(TSS_HCONTEXT, TOKEN_DATA *);
591 
592 CK_RV clock_set_default_attributes(TEMPLATE *);
593 CK_RV clock_check_required_attributes(TEMPLATE *, CK_ULONG);
594 CK_RV clock_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
595 
596 CK_RV counter_set_default_attributes(TEMPLATE *);
597 CK_RV counter_check_required_attributes(TEMPLATE *, CK_ULONG);
598 CK_RV counter_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
599 
600 CK_RV compute_next_token_obj_name(CK_BYTE *, CK_BYTE *);
601 
602 CK_RV save_token_object(TSS_HCONTEXT, OBJECT *);
603 CK_RV save_public_token_object(OBJECT *);
604 CK_RV save_private_token_object(TSS_HCONTEXT, OBJECT *);
605 
606 CK_RV load_public_token_objects(void);
607 CK_RV load_private_token_objects(TSS_HCONTEXT);
608 
609 CK_RV reload_token_object(TSS_HCONTEXT, OBJECT *);
610 
611 CK_RV delete_token_object(OBJECT *);
612 
613 CK_RV init_token_data(TSS_HCONTEXT, TOKEN_DATA *);
614 CK_RV load_token_data(TSS_HCONTEXT, TOKEN_DATA *);
615 CK_RV save_token_data(TOKEN_DATA *);
616 void copy_slot_info(CK_SLOT_ID, CK_SLOT_INFO_PTR);
617 
618 CK_RV compute_sha(CK_BYTE *, CK_ULONG_32, CK_BYTE *);
619 
620 CK_RV parity_is_odd(CK_BYTE);
621 
622 CK_RV build_attribute(CK_ATTRIBUTE_TYPE,
623 	CK_BYTE *, CK_ULONG, CK_ATTRIBUTE **);
624 
625 CK_RV add_pkcs_padding(CK_BYTE *, UINT32, UINT32, UINT32);
626 
627 CK_RV strip_pkcs_padding(CK_BYTE *, UINT32, UINT32 *);
628 
629 CK_RV remove_leading_zeros(CK_ATTRIBUTE *);
630 
631 CK_RV rsa_pkcs_encrypt(
632 	SESSION *,
633 	CK_BBOOL,
634 	ENCR_DECR_CONTEXT *,
635 	CK_BYTE *,
636 	CK_ULONG,
637 	CK_BYTE *,
638 	CK_ULONG *);
639 
640 CK_RV rsa_pkcs_decrypt(SESSION *,
641 	CK_BBOOL,
642 	ENCR_DECR_CONTEXT *,
643 	CK_BYTE *,
644 	CK_ULONG,
645 	CK_BYTE *,
646 	CK_ULONG *);
647 
648 CK_RV rsa_pkcs_sign(SESSION *,
649 	CK_BBOOL,
650 	SIGN_VERIFY_CONTEXT *,
651 	CK_BYTE *,
652 	CK_ULONG,
653 	CK_BYTE *,
654 	CK_ULONG *);
655 
656 CK_RV rsa_pkcs_verify(SESSION *,
657 	SIGN_VERIFY_CONTEXT *,
658 	CK_BYTE *,
659 	CK_ULONG,
660 	CK_BYTE *,
661 	CK_ULONG);
662 
663 CK_RV rsa_pkcs_verify_recover(SESSION *,
664 	CK_BBOOL,
665 	SIGN_VERIFY_CONTEXT *,
666 	CK_BYTE *,
667 	CK_ULONG,
668 	CK_BYTE *,
669 	CK_ULONG *);
670 
671 CK_RV rsa_hash_pkcs_sign(SESSION *,
672 	CK_BBOOL,
673 	SIGN_VERIFY_CONTEXT *,
674 	CK_BYTE *,
675 	CK_ULONG,
676 	CK_BYTE *,
677 	CK_ULONG *);
678 
679 CK_RV rsa_hash_pkcs_verify(SESSION *,
680 	SIGN_VERIFY_CONTEXT *,
681 	CK_BYTE *,
682 	CK_ULONG,
683 	CK_BYTE *,
684 	CK_ULONG);
685 
686 CK_RV rsa_hash_pkcs_sign_update(SESSION *,
687 	SIGN_VERIFY_CONTEXT *,
688 	CK_BYTE *,
689 	CK_ULONG);
690 
691 CK_RV rsa_hash_pkcs_verify_update(SESSION *,
692 	SIGN_VERIFY_CONTEXT *,
693 	CK_BYTE *,
694 	CK_ULONG);
695 
696 CK_RV rsa_hash_pkcs_sign_final(SESSION *,
697 	CK_BBOOL,
698 	SIGN_VERIFY_CONTEXT *,
699 	CK_BYTE *,
700 	CK_ULONG *);
701 
702 CK_RV rsa_hash_pkcs_verify_final(SESSION *,
703 	SIGN_VERIFY_CONTEXT *,
704 	CK_BYTE *,
705 	CK_ULONG);
706 
707 
708 CK_RV ckm_rsa_key_pair_gen(TSS_HCONTEXT, TEMPLATE *, TEMPLATE *);
709 
710 CK_RV sha1_hash(SESSION *, CK_BBOOL,
711 	DIGEST_CONTEXT *,
712 	CK_BYTE *, CK_ULONG,
713 	CK_BYTE *, CK_ULONG *);
714 
715 CK_RV sha1_hmac_sign(SESSION *, CK_BBOOL,
716 	SIGN_VERIFY_CONTEXT *,
717 	CK_BYTE *,
718 	CK_ULONG,
719 	CK_BYTE *,
720 	CK_ULONG *);
721 
722 CK_RV sha1_hmac_verify(SESSION *,
723 	SIGN_VERIFY_CONTEXT *,
724 	CK_BYTE *,
725 	CK_ULONG,
726 	CK_BYTE *,
727 	CK_ULONG);
728 
729 CK_RV md5_hash(SESSION *, CK_BBOOL,
730 	DIGEST_CONTEXT *,
731 	CK_BYTE *, CK_ULONG,
732 	CK_BYTE *, CK_ULONG *);
733 
734 CK_RV md5_hmac_sign(SESSION *, CK_BBOOL,
735 	SIGN_VERIFY_CONTEXT *,
736 	CK_BYTE *,
737 	CK_ULONG,
738 	CK_BYTE *,
739 	CK_ULONG *);
740 
741 CK_RV md5_hmac_verify(SESSION *,
742 	SIGN_VERIFY_CONTEXT *,
743 	CK_BYTE *,
744 	CK_ULONG,
745 	CK_BYTE *,
746 	CK_ULONG);
747 
748 DL_NODE *dlist_add_as_first(DL_NODE *, void *);
749 DL_NODE *dlist_add_as_last(DL_NODE *, void *);
750 DL_NODE *dlist_find(DL_NODE *, void *);
751 DL_NODE *dlist_get_first(DL_NODE *);
752 DL_NODE *dlist_get_last(DL_NODE *);
753 	CK_ULONG dlist_length(DL_NODE *);
754 DL_NODE *dlist_next(DL_NODE *);
755 DL_NODE *dlist_prev(DL_NODE *);
756 void dlist_purge(DL_NODE *);
757 DL_NODE *dlist_remove_node(DL_NODE *, DL_NODE *);
758 
759 CK_RV attach_shm(void);
760 CK_RV detach_shm(void);
761 
762 // encryption manager routines
763 //
764 CK_RV encr_mgr_init(SESSION *,
765 	ENCR_DECR_CONTEXT *,
766 	CK_ULONG,
767 	CK_MECHANISM *,
768 	CK_OBJECT_HANDLE);
769 
770 CK_RV encr_mgr_cleanup(ENCR_DECR_CONTEXT *);
771 
772 CK_RV encr_mgr_encrypt(SESSION *, CK_BBOOL,
773 	ENCR_DECR_CONTEXT *,
774 	CK_BYTE *, CK_ULONG,
775 	CK_BYTE *, CK_ULONG *);
776 
777 CK_RV decr_mgr_init(SESSION *,
778 	ENCR_DECR_CONTEXT *,
779 	CK_ULONG,
780 	CK_MECHANISM *,
781 	CK_OBJECT_HANDLE);
782 
783 CK_RV decr_mgr_cleanup(ENCR_DECR_CONTEXT *);
784 
785 CK_RV decr_mgr_decrypt(SESSION *, CK_BBOOL,
786 	ENCR_DECR_CONTEXT *,
787 	CK_BYTE *, CK_ULONG,
788 	CK_BYTE *, CK_ULONG *);
789 
790 CK_RV digest_mgr_cleanup(DIGEST_CONTEXT *);
791 
792 CK_RV digest_mgr_init(SESSION *,
793 	DIGEST_CONTEXT *,
794 	CK_MECHANISM *);
795 
796 CK_RV digest_mgr_digest(SESSION *, CK_BBOOL,
797 	DIGEST_CONTEXT *,
798 	CK_BYTE *, CK_ULONG,
799 	CK_BYTE *, CK_ULONG *);
800 
801 CK_RV digest_mgr_digest_update(SESSION *,
802 	DIGEST_CONTEXT *,
803 	CK_BYTE *, CK_ULONG);
804 
805 CK_RV digest_mgr_digest_key(SESSION *,
806 	DIGEST_CONTEXT *,
807 	CK_OBJECT_HANDLE);
808 
809 CK_RV digest_mgr_digest_final(SESSION *,
810 	DIGEST_CONTEXT *,
811 	CK_BYTE *, CK_ULONG *);
812 
813 CK_RV key_mgr_generate_key_pair(SESSION *,
814 	CK_MECHANISM *,
815 	CK_ATTRIBUTE *, CK_ULONG,
816 	CK_ATTRIBUTE *, CK_ULONG,
817 	CK_OBJECT_HANDLE *,
818 	CK_OBJECT_HANDLE *);
819 
820 CK_RV key_mgr_wrap_key(SESSION *,
821 	CK_BBOOL,
822 	CK_MECHANISM *,
823 	CK_OBJECT_HANDLE,
824 	CK_OBJECT_HANDLE,
825 	CK_BYTE *,
826 	CK_ULONG *);
827 
828 CK_RV key_mgr_unwrap_key(SESSION *,
829 	CK_MECHANISM *,
830 	CK_ATTRIBUTE *,
831 	CK_ULONG,
832 	CK_BYTE *,
833 	CK_ULONG,
834 	CK_OBJECT_HANDLE,
835 	CK_OBJECT_HANDLE *);
836 
837 CK_RV sign_mgr_init(SESSION *,
838 	SIGN_VERIFY_CONTEXT *,
839 	CK_MECHANISM *,
840 	CK_BBOOL,
841 	CK_OBJECT_HANDLE);
842 
843 CK_RV sign_mgr_cleanup(SIGN_VERIFY_CONTEXT *);
844 
845 CK_RV sign_mgr_sign(SESSION *,
846 	CK_BBOOL,
847 	SIGN_VERIFY_CONTEXT *,
848 	CK_BYTE *,
849 	CK_ULONG,
850 	CK_BYTE *,
851 	CK_ULONG *);
852 
853 CK_RV sign_mgr_sign_recover(SESSION *,
854 	CK_BBOOL,
855 	SIGN_VERIFY_CONTEXT *,
856 	CK_BYTE *,
857 	CK_ULONG,
858 	CK_BYTE *,
859 	CK_ULONG *);
860 
861 CK_RV sign_mgr_sign_final(SESSION *,
862 	CK_BBOOL,
863 	SIGN_VERIFY_CONTEXT *,
864 	CK_BYTE *,
865 	CK_ULONG *);
866 
867 CK_RV sign_mgr_sign_update(SESSION *,
868 	SIGN_VERIFY_CONTEXT *,
869 	CK_BYTE *,
870 	CK_ULONG);
871 
872 CK_RV verify_mgr_init(SESSION *,
873 	SIGN_VERIFY_CONTEXT *,
874 	CK_MECHANISM *,
875 	CK_BBOOL,
876 	CK_OBJECT_HANDLE);
877 
878 CK_RV verify_mgr_cleanup(SIGN_VERIFY_CONTEXT *);
879 
880 CK_RV verify_mgr_verify(SESSION *,
881 	SIGN_VERIFY_CONTEXT *,
882 	CK_BYTE *,
883 	CK_ULONG,
884 	CK_BYTE *,
885 	CK_ULONG);
886 
887 CK_RV verify_mgr_verify_recover(SESSION *,
888 	CK_BBOOL,
889 	SIGN_VERIFY_CONTEXT *,
890 	CK_BYTE *,
891 	CK_ULONG,
892 	CK_BYTE *,
893 	CK_ULONG *);
894 
895 CK_RV verify_mgr_verify_update(SESSION *,
896 	SIGN_VERIFY_CONTEXT *,
897 	CK_BYTE *,
898 	CK_ULONG);
899 
900 CK_RV verify_mgr_verify_final(SESSION *,
901 	SIGN_VERIFY_CONTEXT *,
902 	CK_BYTE *,
903 	CK_ULONG);
904 
905 
906 // session manager routines
907 //
908 CK_RV session_mgr_close_all_sessions(void);
909 CK_RV session_mgr_close_session(SESSION *);
910 SESSION *session_mgr_find(CK_SESSION_HANDLE);
911 CK_RV session_mgr_login_all(CK_USER_TYPE);
912 CK_RV session_mgr_logout_all(void);
913 CK_RV session_mgr_new(CK_ULONG, SESSION **);
914 
915 CK_BBOOL session_mgr_readonly_exists(void);
916 CK_BBOOL session_mgr_so_session_exists(void);
917 CK_BBOOL session_mgr_user_session_exists(void);
918 CK_BBOOL session_mgr_public_session_exists(void);
919 
920 CK_RV session_mgr_get_op_state(SESSION *, CK_BBOOL,
921 	CK_BYTE *, CK_ULONG *);
922 
923 CK_RV session_mgr_set_op_state(SESSION *,
924 	CK_OBJECT_HANDLE, CK_OBJECT_HANDLE, CK_BYTE *);
925 
926 CK_RV object_mgr_add(SESSION *,
927 	CK_ATTRIBUTE *, CK_ULONG, CK_OBJECT_HANDLE *);
928 
929 CK_RV object_mgr_add_to_map(SESSION *, OBJECT *, CK_OBJECT_HANDLE *);
930 
931 CK_RV object_mgr_add_to_shm(OBJECT *);
932 CK_RV object_mgr_del_from_shm(OBJECT *);
933 
934 CK_RV object_mgr_copy(SESSION *,
935 	CK_ATTRIBUTE *, CK_ULONG, CK_OBJECT_HANDLE,
936 	CK_OBJECT_HANDLE *);
937 
938 CK_RV object_mgr_create_final(SESSION *,
939 	OBJECT *, CK_OBJECT_HANDLE *);
940 
941 CK_RV object_mgr_create_skel(SESSION *,
942 	CK_ATTRIBUTE *, CK_ULONG, CK_ULONG,
943 	CK_ULONG, CK_ULONG, OBJECT **);
944 
945 CK_RV object_mgr_destroy_object(SESSION *, CK_OBJECT_HANDLE);
946 
947 CK_RV object_mgr_destroy_token_objects(TSS_HCONTEXT);
948 
949 CK_RV object_mgr_find_in_map1(TSS_HCONTEXT, CK_OBJECT_HANDLE, OBJECT **);
950 
951 CK_RV object_mgr_find_in_map2(TSS_HCONTEXT, OBJECT *, CK_OBJECT_HANDLE *);
952 
953 CK_RV object_mgr_find_init(SESSION *, CK_ATTRIBUTE *, CK_ULONG);
954 
955 CK_RV object_mgr_find_build_list(SESSION *,
956 	CK_ATTRIBUTE *,
957 	CK_ULONG,
958 	DL_NODE *,
959 	CK_BBOOL public_only);
960 
961 CK_RV object_mgr_find_final(SESSION *);
962 
963 CK_RV object_mgr_get_attribute_values(SESSION *,
964 	CK_OBJECT_HANDLE,
965 	CK_ATTRIBUTE *,
966 	CK_ULONG);
967 
968 CK_RV object_mgr_get_object_size(TSS_HCONTEXT, CK_OBJECT_HANDLE,
969 	CK_ULONG *);
970 
971 CK_BBOOL object_mgr_invalidate_handle1(CK_OBJECT_HANDLE handle);
972 
973 CK_BBOOL object_mgr_invalidate_handle2(OBJECT *);
974 
975 CK_BBOOL object_mgr_purge_session_objects(SESSION *, SESS_OBJ_TYPE);
976 
977 CK_BBOOL object_mgr_purge_token_objects(TSS_HCONTEXT);
978 
979 CK_BBOOL object_mgr_purge_private_token_objects(TSS_HCONTEXT);
980 
981 CK_RV object_mgr_remove_from_map(CK_OBJECT_HANDLE);
982 
983 CK_RV object_mgr_restore_obj(CK_BYTE *, OBJECT *);
984 
985 CK_RV object_mgr_set_attribute_values(SESSION *,
986 	CK_OBJECT_HANDLE,
987 	CK_ATTRIBUTE *,
988 	CK_ULONG);
989 
990 CK_BBOOL object_mgr_purge_map(SESSION *, SESS_OBJ_TYPE);
991 
992 CK_RV object_create(CK_ATTRIBUTE *, CK_ULONG, OBJECT **);
993 
994 CK_RV object_create_skel(CK_ATTRIBUTE *,
995 	CK_ULONG,
996 	CK_ULONG,
997 	CK_ULONG,
998 	CK_ULONG,
999 	OBJECT **);
1000 
1001 CK_RV object_copy(CK_ATTRIBUTE *,
1002 	CK_ULONG,
1003 	OBJECT *,
1004 	OBJECT **);
1005 
1006 CK_RV object_flatten(OBJECT *,
1007 	CK_BYTE **,
1008 	CK_ULONG_32 *);
1009 
1010 CK_BBOOL object_free(OBJECT *);
1011 
1012 CK_RV object_get_attribute_values(OBJECT *,
1013 	CK_ATTRIBUTE *,
1014 	CK_ULONG);
1015 
1016 CK_ULONG object_get_size(OBJECT *);
1017 
1018 CK_RV object_restore(CK_BYTE *,
1019 	OBJECT **,
1020 	CK_BBOOL replace);
1021 
1022 CK_RV object_set_attribute_values(OBJECT *,
1023 	CK_ATTRIBUTE *,
1024 	CK_ULONG);
1025 
1026 CK_BBOOL object_is_modifiable(OBJECT *);
1027 CK_BBOOL object_is_private(OBJECT *);
1028 CK_BBOOL object_is_public(OBJECT *);
1029 CK_BBOOL object_is_token_object(OBJECT *);
1030 CK_BBOOL object_is_session_object(OBJECT *);
1031 
1032 CK_BBOOL is_attribute_defined(CK_ATTRIBUTE_TYPE);
1033 
1034 CK_RV template_add_attributes(TEMPLATE *,
1035 	CK_ATTRIBUTE *, CK_ULONG);
1036 
1037 CK_RV template_add_default_attributes(TEMPLATE *,
1038 	CK_ULONG,
1039 	CK_ULONG,
1040 	CK_ULONG);
1041 
1042 CK_BBOOL template_attribute_find(TEMPLATE *,
1043 	CK_ATTRIBUTE_TYPE, CK_ATTRIBUTE **);
1044 
1045 void template_attribute_find_multiple(TEMPLATE *,
1046 	ATTRIBUTE_PARSE_LIST *,
1047 	CK_ULONG);
1048 
1049 CK_BBOOL template_check_exportability(TEMPLATE *, CK_ATTRIBUTE_TYPE type);
1050 
1051 CK_RV template_check_required_attributes(TEMPLATE *,
1052 	CK_ULONG, CK_ULONG, CK_ULONG);
1053 
1054 CK_RV template_check_required_base_attributes(TEMPLATE *,
1055 	CK_ULONG);
1056 
1057 CK_BBOOL template_compare(CK_ATTRIBUTE *,
1058 	CK_ULONG, TEMPLATE *);
1059 
1060 CK_RV template_copy(TEMPLATE *, TEMPLATE *);
1061 
1062 CK_RV template_flatten(TEMPLATE *, CK_BYTE *);
1063 
1064 CK_RV template_free(TEMPLATE *);
1065 
1066 CK_BBOOL template_get_class(TEMPLATE *, CK_ULONG *, CK_ULONG *);
1067 
1068 CK_ULONG template_get_count(TEMPLATE *);
1069 
1070 CK_ULONG template_get_size(TEMPLATE *);
1071 CK_ULONG template_get_compressed_size(TEMPLATE *);
1072 
1073 CK_RV template_set_default_common_attributes(TEMPLATE *);
1074 
1075 CK_RV template_merge(TEMPLATE *, TEMPLATE **);
1076 
1077 CK_RV template_update_attribute(TEMPLATE *, CK_ATTRIBUTE *);
1078 
1079 CK_RV template_unflatten(TEMPLATE **, CK_BYTE *, CK_ULONG);
1080 
1081 CK_RV template_validate_attribute(TEMPLATE *,
1082 	CK_ATTRIBUTE *, CK_ULONG, CK_ULONG, CK_ULONG);
1083 
1084 CK_RV template_validate_attributes(TEMPLATE *,
1085 	CK_ULONG, CK_ULONG, CK_ULONG);
1086 
1087 CK_RV template_validate_base_attribute(TEMPLATE *,
1088 	CK_ATTRIBUTE *, CK_ULONG);
1089 
1090 
1091 // DATA OBJECT ROUTINES
1092 //
1093 CK_RV data_object_check_required_attributes(TEMPLATE *, CK_ULONG);
1094 CK_RV data_object_set_default_attributes(TEMPLATE *, CK_ULONG);
1095 CK_RV data_object_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1096 
1097 // CERTIFICATE ROUTINES
1098 CK_RV cert_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1099 
1100 CK_RV cert_x509_check_required_attributes(TEMPLATE *, CK_ULONG);
1101 CK_RV cert_x509_set_default_attributes(TEMPLATE *, CK_ULONG);
1102 CK_RV cert_x509_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1103 CK_RV cert_vendor_check_required_attributes(TEMPLATE *, CK_ULONG);
1104 CK_RV cert_vendor_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1105 
1106 //
1107 // KEY ROUTINES
1108 //
1109 CK_RV key_object_check_required_attributes(TEMPLATE *, CK_ULONG);
1110 CK_RV key_object_set_default_attributes(TEMPLATE *, CK_ULONG);
1111 CK_RV key_object_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1112 
1113 CK_RV publ_key_check_required_attributes(TEMPLATE *, CK_ULONG);
1114 CK_RV publ_key_set_default_attributes(TEMPLATE *, CK_ULONG);
1115 CK_RV publ_key_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1116 
1117 CK_RV priv_key_check_required_attributes(TEMPLATE *, CK_ULONG);
1118 CK_RV priv_key_set_default_attributes(TEMPLATE *, CK_ULONG);
1119 CK_RV priv_key_unwrap(TEMPLATE *, CK_ULONG, CK_BYTE *, CK_ULONG);
1120 CK_RV priv_key_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1121 
1122 	CK_BBOOL secret_key_check_exportability(CK_ATTRIBUTE_TYPE type);
1123 CK_RV secret_key_check_required_attributes(TEMPLATE *, CK_ULONG);
1124 CK_RV secret_key_set_default_attributes(TEMPLATE *, CK_ULONG);
1125 CK_RV secret_key_unwrap(TEMPLATE *, CK_ULONG, CK_BYTE *, CK_ULONG,
1126 	CK_BBOOL fromend);
1127 CK_RV secret_key_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *,
1128 	CK_ULONG);
1129 
1130 // rsa routines
1131 //
1132 CK_RV rsa_publ_check_required_attributes(TEMPLATE *, CK_ULONG);
1133 CK_RV rsa_publ_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1134 CK_RV rsa_publ_set_default_attributes(TEMPLATE *, CK_ULONG);
1135 	CK_BBOOL rsa_priv_check_exportability(CK_ATTRIBUTE_TYPE type);
1136 CK_RV rsa_priv_check_required_attributes(TEMPLATE *, CK_ULONG);
1137 CK_RV rsa_priv_set_default_attributes(TEMPLATE *, CK_ULONG);
1138 CK_RV rsa_priv_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1139 CK_RV rsa_priv_wrap_get_data(TEMPLATE *, CK_BBOOL, CK_BYTE **, CK_ULONG *);
1140 CK_RV rsa_priv_unwrap(TEMPLATE *, CK_BYTE *, CK_ULONG);
1141 
1142 // Generic secret key routines
1143 CK_RV generic_secret_check_required_attributes(TEMPLATE *, CK_ULONG);
1144 CK_RV generic_secret_set_default_attributes(TEMPLATE *, CK_ULONG);
1145 CK_RV generic_secret_validate_attribute(TEMPLATE *, CK_ATTRIBUTE *, CK_ULONG);
1146 CK_RV generic_secret_wrap_get_data(TEMPLATE *, CK_BBOOL,
1147 	CK_BYTE **, CK_ULONG *);
1148 
1149 CK_RV generic_secret_unwrap(TEMPLATE *, CK_BYTE *, CK_ULONG, CK_BBOOL fromend);
1150 
1151 CK_RV tpm_encrypt_data(TSS_HCONTEXT,
1152 	TSS_HKEY, CK_BYTE *, CK_ULONG, CK_BYTE *, CK_ULONG *);
1153 
1154 CK_RV tpm_decrypt_data(TSS_HCONTEXT,
1155 	TSS_HKEY, CK_BYTE *, CK_ULONG, CK_BYTE *, CK_ULONG *);
1156 
1157 CK_ULONG ber_encode_INTEGER(CK_BBOOL,
1158 	CK_BYTE **, CK_ULONG *, CK_BYTE *, CK_ULONG);
1159 
1160 CK_RV ber_decode_INTEGER(CK_BYTE *,
1161 	CK_BYTE **, CK_ULONG *, CK_ULONG *);
1162 
1163 CK_RV ber_encode_OCTET_STRING(CK_BBOOL,
1164 	CK_BYTE **, CK_ULONG *, CK_BYTE *, CK_ULONG);
1165 
1166 CK_RV ber_decode_OCTET_STRING(CK_BYTE *,
1167 	CK_BYTE **, CK_ULONG *, CK_ULONG *);
1168 
1169 CK_RV ber_encode_SEQUENCE(CK_BBOOL,
1170 	CK_BYTE **, CK_ULONG *, CK_BYTE *, CK_ULONG);
1171 
1172 CK_RV ber_decode_SEQUENCE(CK_BYTE *,
1173 	CK_BYTE **, CK_ULONG *, CK_ULONG *);
1174 
1175 CK_RV ber_encode_PrivateKeyInfo(CK_BBOOL,
1176 	CK_BYTE **, CK_ULONG *, CK_BYTE *,
1177 	CK_ULONG, CK_BYTE *, CK_ULONG);
1178 
1179 CK_RV ber_decode_PrivateKeyInfo(CK_BYTE *,
1180 	CK_ULONG, CK_BYTE **, CK_ULONG *, CK_BYTE **);
1181 
1182 CK_RV ber_encode_RSAPrivateKey(CK_BBOOL,
1183 	CK_BYTE **, CK_ULONG *, CK_ATTRIBUTE *,
1184 	CK_ATTRIBUTE *, CK_ATTRIBUTE *, CK_ATTRIBUTE *,
1185 	CK_ATTRIBUTE *, CK_ATTRIBUTE *, CK_ATTRIBUTE *,
1186 	CK_ATTRIBUTE *);
1187 
1188 CK_RV ber_decode_RSAPrivateKey(CK_BYTE *,
1189 	CK_ULONG, CK_ATTRIBUTE **, CK_ATTRIBUTE **,
1190 	CK_ATTRIBUTE **, CK_ATTRIBUTE **, CK_ATTRIBUTE **,
1191 	CK_ATTRIBUTE **, CK_ATTRIBUTE **, CK_ATTRIBUTE **);
1192 
1193 
1194 CK_RV ber_encode_DSAPrivateKey(CK_BBOOL,
1195 	CK_BYTE **, CK_ULONG *, CK_ATTRIBUTE *,
1196 	CK_ATTRIBUTE *, CK_ATTRIBUTE *, CK_ATTRIBUTE *);
1197 
1198 CK_RV ber_decode_DSAPrivateKey(CK_BYTE *,
1199 	CK_ULONG, CK_ATTRIBUTE **, CK_ATTRIBUTE **,
1200 	CK_ATTRIBUTE **, CK_ATTRIBUTE **);
1201 
1202 #define	APPID	"TPM_STDLL"
1203 
1204 /* log to stdout */
1205 #define	LogMessage(dest, priority, layer, fmt, ...) \
1206 	(void) fprintf(dest, "%s %s %s:%d " fmt "\n", (char *)priority, \
1207 		(char *)layer, (char *)__FILE__,\
1208 		(int)__LINE__, __VA_ARGS__);
1209 
1210 #define	LogMessage1(dest, priority, layer, data) \
1211 	(void) fprintf(dest, "%s %s %s:%d %s\n", priority, layer, __FILE__, \
1212 	__LINE__, data);
1213 
1214 /* Debug logging */
1215 #ifdef DEBUG
1216 #define	LogDebug(fmt, ...) LogMessage(stdout, "LOG_DEBUG", APPID, \
1217 	fmt, __VA_ARGS__)
1218 
1219 #define	LogDebug1(data) LogMessage1(stdout, "LOG_DEBUG", APPID, data)
1220 
1221 /* Error logging */
1222 #define	LogError(fmt, ...) LogMessage(stderr, "LOG_ERR", APPID,\
1223 	"ERROR: " fmt, __VA_ARGS__)
1224 
1225 #define	LogError1(data) LogMessage1(stderr, "LOG_ERR", APPID,\
1226 	"ERROR: " data)
1227 
1228 /* Warn logging */
1229 #define	LogWarn(fmt, ...) LogMessage(stdout, "LOG_WARNING", APPID,\
1230 	"WARNING: " fmt, __VA_ARGS__)
1231 
1232 #define	LogWarn1(data) LogMessage1(stdout, "LOG_WARNING", APPID,\
1233 	"WARNING: " data)
1234 
1235 /* Info Logging */
1236 #define	LogInfo(fmt, ...) LogMessage(stdout, "LOG_INFO", APPID,\
1237 	fmt, __VA_ARGS__)
1238 
1239 #define	LogInfo1(data) LogMessage1(stdout, "LOG_INFO", APPID, data)
1240 
1241 #define	st_err_log(...) LogMessage(stderr, "ST MSG", APPID,\
1242 	"", __VA_ARGS__)
1243 #else
1244 #define	LogDebug(...)
1245 #define	LogDebug1(...)
1246 #define	LogBlob(...)
1247 #define	LogError(...)
1248 #define	LogError1(...)
1249 #define	LogWarn(...)
1250 #define	LogWarn1(...)
1251 #define	LogInfo(...)
1252 #define	LogInfo1(...)
1253 #define	st_err_log(...)
1254 #endif
1255 
1256 /*
1257  * CK_FUNCTION_LIST is a structure holding a Cryptoki spec
1258  * version and pointers of appropriate types to all the
1259  * Cryptoki functions
1260  */
1261 
1262 /* CK_FUNCTION_LIST is new for v2.0 */
1263 
1264 typedef CK_RV
1265 	(CK_PTR ST_C_Initialize)
1266 	(void *ppFunctionList, CK_SLOT_ID slotID, CK_CHAR_PTR pCorrelator);
1267 typedef CK_RV
1268 	(CK_PTR  ST_C_Finalize)
1269 	(CK_VOID_PTR pReserved);
1270 typedef CK_RV
1271 	(CK_PTR  ST_C_Terminate)();
1272 typedef CK_RV
1273 	(CK_PTR  ST_C_GetInfo)
1274 	(CK_INFO_PTR pInfo);
1275 typedef CK_RV
1276 	(CK_PTR  ST_C_GetFunctionList)
1277 	(CK_FUNCTION_LIST_PTR_PTR ppFunctionList);
1278 typedef CK_RV
1279 	(CK_PTR  ST_C_GetSlotList)
1280 	(CK_BBOOL tokenPresent, CK_SLOT_ID_PTR pSlotList,
1281 	CK_ULONG_PTR pusCount);
1282 typedef CK_RV
1283 	(CK_PTR  ST_C_GetSlotInfo)
1284 	(CK_SLOT_ID slotID, CK_SLOT_INFO_PTR pInfo);
1285 typedef CK_RV
1286 	(CK_PTR  ST_C_GetTokenInfo)
1287 	(CK_SLOT_ID slotID, CK_TOKEN_INFO_PTR pInfo);
1288 typedef CK_RV
1289 	(CK_PTR  ST_C_GetMechanismList)
1290 	(CK_SLOT_ID slotID, CK_MECHANISM_TYPE_PTR pMechanismList,
1291 	CK_ULONG_PTR pusCount);
1292 typedef CK_RV
1293 	(CK_PTR  ST_C_GetMechanismInfo)
1294 	(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type,
1295 	CK_MECHANISM_INFO_PTR pInfo);
1296 typedef CK_RV
1297 	(CK_PTR  ST_C_InitToken)
1298 	(CK_SLOT_ID slotID, CK_CHAR_PTR pPin, CK_ULONG usPinLen,
1299 	CK_CHAR_PTR pLabel);
1300 typedef CK_RV
1301 	(CK_PTR  ST_C_InitPIN)
1302 	(ST_SESSION_T hSession, CK_CHAR_PTR pPin,
1303 	CK_ULONG usPinLen);
1304 typedef CK_RV
1305 	(CK_PTR  ST_C_SetPIN)
1306 	(ST_SESSION_T hSession, CK_CHAR_PTR pOldPin,
1307 	CK_ULONG usOldLen, CK_CHAR_PTR pNewPin,
1308 	CK_ULONG usNewLen);
1309 
1310 typedef CK_RV
1311 	(CK_PTR  ST_C_OpenSession)
1312 	(CK_SLOT_ID slotID, CK_FLAGS flags,
1313 	CK_SESSION_HANDLE_PTR phSession);
1314 
1315 typedef CK_RV
1316 	(CK_PTR  ST_C_CloseSession)
1317 	(ST_SESSION_T hSession);
1318 typedef CK_RV
1319 	(CK_PTR  ST_C_CloseAllSessions)
1320 	(CK_SLOT_ID slotID);
1321 typedef CK_RV
1322 	(CK_PTR  ST_C_GetSessionInfo)
1323 	(ST_SESSION_T hSession, CK_SESSION_INFO_PTR pInfo);
1324 typedef CK_RV
1325 	(CK_PTR  ST_C_GetOperationState)
1326 	(ST_SESSION_T hSession, CK_BYTE_PTR pOperationState,
1327 	CK_ULONG_PTR pulOperationStateLen);
1328 typedef CK_RV
1329 	(CK_PTR  ST_C_SetOperationState)
1330 	(ST_SESSION_T hSession, CK_BYTE_PTR pOperationState,
1331 	CK_ULONG ulOperationStateLen,
1332 	CK_OBJECT_HANDLE hEncryptionKey,
1333 	CK_OBJECT_HANDLE hAuthenticationKey);
1334 typedef CK_RV
1335 	(CK_PTR  ST_C_Login)(ST_SESSION_T hSession,
1336 	CK_USER_TYPE userType, CK_CHAR_PTR pPin,
1337 	CK_ULONG usPinLen);
1338 typedef CK_RV
1339 	(CK_PTR  ST_C_Logout)(ST_SESSION_T hSession);
1340 typedef CK_RV
1341 	(CK_PTR  ST_C_CreateObject)
1342 	(ST_SESSION_T hSession, CK_ATTRIBUTE_PTR pTemplate,
1343 	CK_ULONG usCount, CK_OBJECT_HANDLE_PTR phObject);
1344 
1345 typedef CK_RV
1346 	(CK_PTR  ST_C_CopyObject)
1347 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hObject,
1348 	CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount,
1349 	CK_OBJECT_HANDLE_PTR phNewObject);
1350 typedef CK_RV
1351 	(CK_PTR  ST_C_DestroyObject)
1352 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hObject);
1353 typedef CK_RV
1354 	(CK_PTR  ST_C_GetObjectSize)
1355 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hObject,
1356 	CK_ULONG_PTR pusSize);
1357 typedef CK_RV
1358 	(CK_PTR  ST_C_GetAttributeValue)
1359 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hObject,
1360 	CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount);
1361 typedef CK_RV
1362 	(CK_PTR  ST_C_SetAttributeValue)
1363 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hObject,
1364 	CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount);
1365 typedef CK_RV
1366 	(CK_PTR  ST_C_FindObjectsInit)
1367 	(ST_SESSION_T hSession, CK_ATTRIBUTE_PTR pTemplate,
1368 	CK_ULONG usCount);
1369 typedef CK_RV
1370 	(CK_PTR  ST_C_FindObjects)
1371 	(ST_SESSION_T hSession,
1372 	CK_OBJECT_HANDLE_PTR phObject, CK_ULONG usMaxObjectCount,
1373 	CK_ULONG_PTR pusObjectCount);
1374 typedef CK_RV
1375 	(CK_PTR  ST_C_FindObjectsFinal)
1376 	(ST_SESSION_T hSession);
1377 typedef CK_RV
1378 	(CK_PTR  ST_C_EncryptInit)
1379 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1380 	CK_OBJECT_HANDLE hKey);
1381 typedef CK_RV
1382 	(CK_PTR  ST_C_Encrypt)
1383 	(ST_SESSION_T hSession, CK_BYTE_PTR pData,
1384 	CK_ULONG usDataLen, CK_BYTE_PTR pEncryptedData,
1385 	CK_ULONG_PTR pusEncryptedDataLen);
1386 typedef CK_RV
1387 	(CK_PTR  ST_C_EncryptUpdate)
1388 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1389 	CK_ULONG usPartLen, CK_BYTE_PTR pEncryptedPart,
1390 	CK_ULONG_PTR pusEncryptedPartLen);
1391 typedef CK_RV
1392 	(CK_PTR  ST_C_EncryptFinal)
1393 	(ST_SESSION_T hSession,
1394 	CK_BYTE_PTR pLastEncryptedPart,
1395 	CK_ULONG_PTR pusLastEncryptedPartLen);
1396 typedef CK_RV
1397 	(CK_PTR  ST_C_DecryptInit)
1398 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1399 	CK_OBJECT_HANDLE hKey);
1400 typedef CK_RV
1401 	(CK_PTR  ST_C_Decrypt)
1402 	(ST_SESSION_T hSession, CK_BYTE_PTR pEncryptedData,
1403 	CK_ULONG usEncryptedDataLen, CK_BYTE_PTR pData,
1404 	CK_ULONG_PTR pusDataLen);
1405 typedef CK_RV
1406 	(CK_PTR  ST_C_DecryptUpdate)
1407 	(ST_SESSION_T hSession, CK_BYTE_PTR pEncryptedPart,
1408 	CK_ULONG usEncryptedPartLen, CK_BYTE_PTR pPart,
1409 	CK_ULONG_PTR pusPartLen);
1410 typedef CK_RV
1411 	(CK_PTR  ST_C_DecryptFinal)
1412 	(ST_SESSION_T hSession, CK_BYTE_PTR pLastPart,
1413 	CK_ULONG_PTR pusLastPartLen);
1414 typedef CK_RV
1415 	(CK_PTR  ST_C_DigestInit)
1416 	(ST_SESSION_T hSession,
1417 	CK_MECHANISM_PTR pMechanism);
1418 typedef CK_RV
1419 	(CK_PTR  ST_C_Digest)
1420 	(ST_SESSION_T hSession, CK_BYTE_PTR pData,
1421 	CK_ULONG usDataLen, CK_BYTE_PTR pDigest,
1422 	CK_ULONG_PTR pusDigestLen);
1423 typedef CK_RV
1424 	(CK_PTR  ST_C_DigestUpdate)
1425 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1426 	CK_ULONG usPartLen);
1427 typedef CK_RV
1428 	(CK_PTR  ST_C_DigestKey)
1429 	(ST_SESSION_T hSession, CK_OBJECT_HANDLE hKey);
1430 typedef CK_RV
1431 	(CK_PTR  ST_C_DigestFinal)
1432 	(ST_SESSION_T hSession, CK_BYTE_PTR pDigest,
1433 	CK_ULONG_PTR pusDigestLen);
1434 typedef CK_RV
1435 	(CK_PTR  ST_C_SignInit)
1436 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1437 	CK_OBJECT_HANDLE hKey);
1438 typedef CK_RV
1439 	(CK_PTR  ST_C_Sign)
1440 	(ST_SESSION_T hSession, CK_BYTE_PTR pData,
1441 	CK_ULONG usDataLen, CK_BYTE_PTR pSignature,
1442 	CK_ULONG_PTR pusSignatureLen);
1443 typedef CK_RV
1444 	(CK_PTR  ST_C_SignUpdate)
1445 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1446 	CK_ULONG usPartLen);
1447 typedef CK_RV
1448 	(CK_PTR  ST_C_SignFinal)
1449 	(ST_SESSION_T hSession, CK_BYTE_PTR pSignature,
1450 	CK_ULONG_PTR pusSignatureLen);
1451 typedef CK_RV
1452 	(CK_PTR  ST_C_SignRecoverInit)
1453 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1454 	CK_OBJECT_HANDLE hKey);
1455 typedef CK_RV
1456 	(CK_PTR  ST_C_SignRecover)
1457 	(ST_SESSION_T hSession, CK_BYTE_PTR pData,
1458 	CK_ULONG usDataLen, CK_BYTE_PTR pSignature,
1459 	CK_ULONG_PTR pusSignatureLen);
1460 typedef CK_RV
1461 	(CK_PTR  ST_C_VerifyInit)
1462 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1463 	CK_OBJECT_HANDLE hKey);
1464 typedef CK_RV
1465 	(CK_PTR  ST_C_Verify)
1466 	(ST_SESSION_T hSession, CK_BYTE_PTR pData,
1467 	CK_ULONG usDataLen, CK_BYTE_PTR pSignature,
1468 	CK_ULONG usSignatureLen);
1469 typedef CK_RV
1470 	(CK_PTR  ST_C_VerifyUpdate)
1471 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1472 	CK_ULONG usPartLen);
1473 typedef CK_RV
1474 	(CK_PTR  ST_C_VerifyFinal)
1475 	(ST_SESSION_T hSession, CK_BYTE_PTR pSignature,
1476 	CK_ULONG usSignatureLen);
1477 typedef CK_RV
1478 	(CK_PTR  ST_C_VerifyRecoverInit)
1479 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1480 	CK_OBJECT_HANDLE hKey);
1481 typedef CK_RV
1482 	(CK_PTR  ST_C_VerifyRecover)
1483 	(ST_SESSION_T hSession, CK_BYTE_PTR pSignature,
1484 	CK_ULONG usSignatureLen, CK_BYTE_PTR pData,
1485 	CK_ULONG_PTR pusDataLen);
1486 typedef CK_RV
1487 	(CK_PTR  ST_C_DigestEncryptUpdate)
1488 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1489 	CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
1490 	CK_ULONG_PTR pulEncryptedPartLen);
1491 typedef CK_RV
1492 	(CK_PTR  ST_C_DecryptDigestUpdate)
1493 	(ST_SESSION_T hSession, CK_BYTE_PTR pEncryptedPart,
1494 	CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
1495 	CK_ULONG_PTR pulPartLen);
1496 typedef CK_RV
1497 	(CK_PTR  ST_C_SignEncryptUpdate)
1498 	(ST_SESSION_T hSession, CK_BYTE_PTR pPart,
1499 	CK_ULONG ulPartLen, CK_BYTE_PTR pEncryptedPart,
1500 	CK_ULONG_PTR pulEncryptedPartLen);
1501 typedef CK_RV
1502 	(CK_PTR  ST_C_DecryptVerifyUpdate)
1503 	(ST_SESSION_T hSession, CK_BYTE_PTR pEncryptedPart,
1504 	CK_ULONG ulEncryptedPartLen, CK_BYTE_PTR pPart,
1505 	CK_ULONG_PTR pulPartLen);
1506 typedef CK_RV
1507 	(CK_PTR  ST_C_GenerateKey)
1508 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1509 	CK_ATTRIBUTE_PTR pTemplate, CK_ULONG usCount,
1510 	CK_OBJECT_HANDLE_PTR phKey);
1511 typedef CK_RV
1512 	(CK_PTR  ST_C_GenerateKeyPair)
1513 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1514 	CK_ATTRIBUTE_PTR pPublicKeyTemplate,
1515 	CK_ULONG usPublicKeyAttributeCount,
1516 	CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
1517 	CK_ULONG usPrivateKeyAttributeCount,
1518 	CK_OBJECT_HANDLE_PTR phPrivateKey,
1519 	CK_OBJECT_HANDLE_PTR phPublicKey);
1520 typedef CK_RV
1521 	(CK_PTR  ST_C_WrapKey)
1522 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1523 	CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey,
1524 	CK_BYTE_PTR pWrappedKey, CK_ULONG_PTR pusWrappedKeyLen);
1525 typedef CK_RV
1526 	(CK_PTR  ST_C_UnwrapKey)
1527 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1528 	CK_OBJECT_HANDLE hUnwrappingKey, CK_BYTE_PTR pWrappedKey,
1529 	CK_ULONG usWrappedKeyLen, CK_ATTRIBUTE_PTR pTemplate,
1530 	CK_ULONG usAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
1531 typedef CK_RV
1532 	(CK_PTR  ST_C_DeriveKey)
1533 	(ST_SESSION_T hSession, CK_MECHANISM_PTR pMechanism,
1534 	CK_OBJECT_HANDLE hBaseKey, CK_ATTRIBUTE_PTR pTemplate,
1535 	CK_ULONG usAttributeCount, CK_OBJECT_HANDLE_PTR phKey);
1536 typedef CK_RV
1537 	(CK_PTR  ST_C_SeedRandom)
1538 	(ST_SESSION_T hSession, CK_BYTE_PTR pSeed,
1539 	CK_ULONG usSeedLen);
1540 typedef CK_RV
1541 	(CK_PTR  ST_C_GenerateRandom)
1542 	(ST_SESSION_T hSession, CK_BYTE_PTR pRandomData,
1543 	CK_ULONG usRandomLen);
1544 typedef CK_RV
1545 	(CK_PTR  ST_C_GetFunctionStatus)
1546 	(ST_SESSION_T hSession);
1547 typedef CK_RV
1548 	(CK_PTR  ST_C_CancelFunction)
1549 	(ST_SESSION_T hSession);
1550 typedef CK_RV
1551 	(CK_PTR  ST_Notify)
1552 	(ST_SESSION_T hSession, CK_NOTIFICATION event,
1553 	CK_VOID_PTR pApplication);
1554 typedef CK_RV
1555 	(CK_PTR  ST_C_WaitForSlotEvent)
1556 	(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot,
1557 	CK_VOID_PTR pReserved);
1558 
1559 
1560 
1561 struct ST_FCN_LIST {
1562 
1563 	ST_C_Initialize ST_Initialize;
1564 	ST_C_Finalize ST_Finalize;
1565 
1566 	ST_C_GetTokenInfo ST_GetTokenInfo;
1567 	ST_C_GetMechanismList ST_GetMechanismList;
1568 	ST_C_GetMechanismInfo ST_GetMechanismInfo;
1569 	ST_C_InitToken ST_InitToken;
1570 	ST_C_InitPIN ST_InitPIN;
1571 	ST_C_SetPIN ST_SetPIN;
1572 
1573 	ST_C_OpenSession ST_OpenSession;
1574 	ST_C_CloseSession ST_CloseSession;
1575 	ST_C_GetSessionInfo ST_GetSessionInfo;
1576 	ST_C_GetOperationState ST_GetOperationState;
1577 	ST_C_SetOperationState ST_SetOperationState;
1578 	ST_C_Login ST_Login;
1579 	ST_C_Logout ST_Logout;
1580 
1581 	ST_C_CreateObject ST_CreateObject;
1582 	ST_C_CopyObject ST_CopyObject;
1583 	ST_C_DestroyObject ST_DestroyObject;
1584 	ST_C_GetObjectSize ST_GetObjectSize;
1585 	ST_C_GetAttributeValue ST_GetAttributeValue;
1586 	ST_C_SetAttributeValue ST_SetAttributeValue;
1587 	ST_C_FindObjectsInit ST_FindObjectsInit;
1588 	ST_C_FindObjects ST_FindObjects;
1589 	ST_C_FindObjectsFinal ST_FindObjectsFinal;
1590 
1591 
1592 	ST_C_EncryptInit ST_EncryptInit;
1593 	ST_C_Encrypt ST_Encrypt;
1594 	ST_C_EncryptUpdate ST_EncryptUpdate;
1595 	ST_C_EncryptFinal ST_EncryptFinal;
1596 	ST_C_DecryptInit ST_DecryptInit;
1597 	ST_C_Decrypt ST_Decrypt;
1598 	ST_C_DecryptUpdate ST_DecryptUpdate;
1599 	ST_C_DecryptFinal ST_DecryptFinal;
1600 	ST_C_DigestInit ST_DigestInit;
1601 	ST_C_Digest ST_Digest;
1602 	ST_C_DigestUpdate ST_DigestUpdate;
1603 	ST_C_DigestKey ST_DigestKey;
1604 	ST_C_DigestFinal ST_DigestFinal;
1605 	ST_C_SignInit ST_SignInit;
1606 	ST_C_Sign ST_Sign;
1607 	ST_C_SignUpdate ST_SignUpdate;
1608 	ST_C_SignFinal ST_SignFinal;
1609 	ST_C_SignRecoverInit ST_SignRecoverInit;
1610 	ST_C_SignRecover ST_SignRecover;
1611 	ST_C_VerifyInit ST_VerifyInit;
1612 	ST_C_Verify ST_Verify;
1613 	ST_C_VerifyUpdate ST_VerifyUpdate;
1614 	ST_C_VerifyFinal ST_VerifyFinal;
1615 	ST_C_VerifyRecoverInit ST_VerifyRecoverInit;
1616 	ST_C_VerifyRecover ST_VerifyRecover;
1617 	ST_C_DigestEncryptUpdate ST_DigestEncryptUpdate;
1618 	ST_C_DecryptDigestUpdate ST_DecryptDigestUpdate;
1619 	ST_C_SignEncryptUpdate ST_SignEncryptUpdate;
1620 	ST_C_DecryptVerifyUpdate ST_DecryptVerifyUpdate;
1621 	ST_C_GenerateKey ST_GenerateKey;
1622 	ST_C_GenerateKeyPair ST_GenerateKeyPair;
1623 	ST_C_WrapKey ST_WrapKey;
1624 	ST_C_UnwrapKey ST_UnwrapKey;
1625 	ST_C_DeriveKey ST_DeriveKey;
1626 	ST_C_SeedRandom ST_SeedRandom;
1627 	ST_C_GenerateRandom ST_GenerateRandom;
1628 	ST_C_GetFunctionStatus ST_GetFunctionStatus;
1629 	ST_C_CancelFunction ST_CancelFunction;
1630 };
1631 
1632 typedef struct ST_FCN_LIST  STDLL_FcnList_t;
1633 
1634 #endif /* _TPMTOK_INT_H */
1635