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