1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _PKCS11_SLOT_H
#define _PKCS11_SLOT_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#include "pkcs11Session.h"
#define MECHLIST_SIZE 32
/*
* Used to pass arguments to child threads for C_WaitForSlotEvent.
*/
typedef struct wfse_args {
CK_FLAGS flags;
CK_VOID_PTR pReserved;
CK_SLOT_ID slotid;
} wfse_args_t;
typedef struct pkcs11_slot {
CK_SLOT_ID sl_id; /* real slotID from provider */
struct pkcs11_session *sl_sess_list; /* all open sessions */
pthread_mutex_t sl_mutex; /* protects: sl_sess_list, */
/* sl_tid, sl_wfse_state, */
/* and sl_wfse_args */
CK_FUNCTION_LIST_PTR sl_func_list; /* function entry points */
boolean_t sl_enabledpol; /* TRUE if policy for enabled */
CK_MECHANISM_TYPE_PTR sl_pol_mechs; /* policy restricted */
uint_t sl_pol_count; /* policy restricted */
boolean_t sl_norandom; /* TRUE if random is disabled */
void *sl_dldesc; /* from dlopen */
uint_t sl_prov_id; /* set by order read in */
uchar_t sl_wfse_state; /* Used by C_WaitForSlotEvent */
boolean_t sl_no_wfse; /* WaitForSlotEvent not impl */
pthread_t sl_tid; /* Used to track child thread */
wfse_args_t *sl_wfse_args; /* Used for WaitForSlotEvent */
} pkcs11_slot_t;
/*
* State definitions used for C_WaitForSlotEvent, stored in sl_wfse_state
* for each slot. These states are mutually exclusive, ie only one should
* be set at a time.
*/
#define WFSE_CLEAR 0x0
#define WFSE_EVENT 0x1
#define WFSE_ACTIVE 0x2
/*
* Dynamically allocated array of slots, indexed by the slotID assigned
* by the framework. st_first will be initialized to 1. Only if there
* is more than one other slot present, triggering the existence of the
* metaslot, with st_first be set to 0. st_last will be set to the
* last slotID assigned, also used for looping through the slottable.
*/
typedef struct pkcs11_slottable {
pkcs11_slot_t **st_slots;
pthread_mutex_t st_mutex; /* Protects all data in the slottable */
/* except for st_start_cond. */
CK_SLOT_ID st_first; /* First used slot ID, used for loops */
CK_SLOT_ID st_last; /* Last slot ID allocated */
ulong_t st_cur_size; /* current memory allocated */
pthread_cond_t st_wait_cond; /* Used for C_WaitForSlotEvent */
CK_SLOT_ID st_event_slot; /* Slot with event */
boolean_t st_wfse_active; /* A thread is actively running WFSE */
boolean_t st_blocking; /* Blocking for C_WaitForSlotEvent */
boolean_t st_list_signaled; /* Listener has been signaled */
uint_t st_thr_count; /* Used for C_WaitForSlotEvent */
pthread_t st_tid;
pthread_mutex_t st_start_mutex; /* wait for listener to start */
pthread_cond_t st_start_cond; /* signal when listener has started */
} pkcs11_slottable_t;
/*
* This macro is used to quickly derefence from a framework slot ID,
* provided by an application, to the function pointers for the correct
* underlying provider.
*/
#define FUNCLIST(slotID) (slottable->st_slots[(slotID)]->sl_func_list)
/*
* This macro is used to quickly get the slot ID associated with this
* slot ID, that is used by the underlying provider.
*/
#define TRUEID(slotID) (slottable->st_slots[(slotID)]->sl_id)
extern pkcs11_slottable_t *slottable;
extern CK_RV pkcs11_slottable_initialize();
extern CK_RV pkcs11_slottable_increase(ulong_t increase);
extern CK_RV pkcs11_slot_allocate(CK_SLOT_ID *slot);
extern CK_RV pkcs11_slottable_delete();
extern CK_RV pkcs11_is_valid_slot(CK_SLOT_ID slot_id);
extern CK_RV pkcs11_validate_and_convert_slotid(CK_SLOT_ID slot_id,
CK_SLOT_ID *real_slot_id);
#ifdef __cplusplus
}
#endif
#endif /* _PKCS11_SLOT_H */
|