summaryrefslogtreecommitdiff
path: root/pkcs11/gkm/gkm-module.h
blob: 63a656ae728151180ef61af93f79439cd0147891 (plain)
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
 * gnome-keyring
 *
 * Copyright (C) 2008 Stefan Walter
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#ifndef __GKM_MODULE_H__
#define __GKM_MODULE_H__

#include <glib-object.h>

#include "pkcs11/pkcs11.h"

#include "gkm-factory.h"
#include "gkm-types.h"

#define GKM_TYPE_MODULE               (gkm_module_get_type ())
#define GKM_MODULE(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKM_TYPE_MODULE, GkmModule))
#define GKM_MODULE_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), GKM_TYPE_MODULE, GkmModuleClass))
#define GKM_IS_MODULE(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKM_TYPE_MODULE))
#define GKM_IS_MODULE_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), GKM_TYPE_MODULE))
#define GKM_MODULE_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), GKM_TYPE_MODULE, GkmModuleClass))

typedef struct _GkmModuleClass GkmModuleClass;
typedef struct _GkmModulePrivate GkmModulePrivate;

struct _GkmModule {
	GObject parent;
	CK_FUNCTION_LIST pkcs11_funcs;
	GkmModulePrivate *pv;
};

struct _GkmModuleClass {
	GObjectClass parent_class;

	/* virtual methods */

	void (*parse_argument) (GkmModule *self, const gchar *name, const gchar *value);

	const CK_SLOT_INFO* (*get_slot_info) (GkmModule *self);

	const CK_TOKEN_INFO* (*get_token_info) (GkmModule *self);

	CK_RV (*refresh_token) (GkmModule *self);

	void (*add_token_object) (GkmModule *self, GkmTransaction *transaction, GkmObject *object);

	void (*store_token_object) (GkmModule *self, GkmTransaction *transaction, GkmObject *object);

	void (*remove_token_object) (GkmModule *self, GkmTransaction *transaction, GkmObject *object);

	CK_RV (*login_change) (GkmModule *self, CK_SLOT_ID slot_id,
	                       CK_UTF8CHAR_PTR old_pin, CK_ULONG n_old_pin,
	                       CK_UTF8CHAR_PTR new_pin, CK_ULONG n_new_pin);

	CK_RV (*login_user) (GkmModule *self, CK_SLOT_ID slot_id,
	                     CK_UTF8CHAR_PTR pin, CK_ULONG n_pin);

	CK_RV (*logout_user) (GkmModule *self, CK_SLOT_ID slot_id);

	CK_RV (*login_so) (GkmModule *self, CK_SLOT_ID slot_id,
	                   CK_UTF8CHAR_PTR pin, CK_ULONG n_pin);

	CK_RV (*logout_so) (GkmModule *self, CK_SLOT_ID slot_id);
};

/*
 * The PKCS#11 module is created by the following code in a header file:
 *
 *     #include "gkm-module.h"
 *     GKM_DECLARE_MODULE(my_module);
 *
 * And the following code in a source file:
 *
 *     #include "gkm-module-ep.h"
 *     GKM_DEFINE_MODULE(my_module, MY_TYPE_MODULE)
 *
 */

#define GKM_DECLARE_MODULE(prefix) \
	extern const CK_FUNCTION_LIST_PTR prefix ## _function_list

#define GKM_DEFINE_MODULE(prefix, type) \
	static GkmModule* gkm_module_instantiate (CK_C_INITIALIZE_ARGS_PTR args, GMutex* mutex) \
		{ return g_object_new ((type), "initialize-args", args, "mutex", mutex, NULL); } \
	const CK_FUNCTION_LIST_PTR prefix ## _function_list = &gkm_module_function_list;

/* Our slot identifier is 1 */
#define GKM_SLOT_ID  1

GType                  gkm_module_get_type                        (void);

GkmManager*            gkm_module_get_manager                     (GkmModule *self);

gboolean               gkm_module_get_write_protected             (GkmModule *self);

CK_ULONG               gkm_module_next_handle                     (GkmModule *self);

GkmSession*            gkm_module_lookup_session                  (GkmModule *self,
                                                                   CK_SESSION_HANDLE handle);

CK_RV                  gkm_module_login_change                    (GkmModule *self,
                                                                   CK_SLOT_ID slot_id,
                                                                   CK_UTF8CHAR_PTR old_pin,
                                                                   CK_ULONG n_old_pin,
                                                                   CK_UTF8CHAR_PTR new_pin,
                                                                   CK_ULONG n_new_pin);

CK_RV                  gkm_module_login_user                      (GkmModule *self,
                                                                   CK_SLOT_ID slot_id,
                                                                   CK_UTF8CHAR_PTR pin,
                                                                   CK_ULONG n_pin);

CK_RV                  gkm_module_logout_user                     (GkmModule *self,
                                                                   CK_SLOT_ID slot_id);

CK_RV                  gkm_module_login_so                        (GkmModule *self,
                                                                   CK_SLOT_ID slot_id,
                                                                   CK_UTF8CHAR_PTR pin,
                                                                   CK_ULONG n_pin);

CK_RV                  gkm_module_logout_so                       (GkmModule *self,
                                                                   CK_SLOT_ID slot_id);

CK_RV                  gkm_module_refresh_token                   (GkmModule *self);

void                   gkm_module_add_token_object                (GkmModule *self,
                                                                   GkmTransaction *transaction,
                                                                   GkmObject *object);

void                   gkm_module_store_token_object              (GkmModule *self,
                                                                   GkmTransaction *transaction,
                                                                   GkmObject *object);

void                   gkm_module_remove_token_object             (GkmModule *self,
                                                                   GkmTransaction *transaction,
                                                                   GkmObject *object);

GkmFactory*            gkm_module_find_factory                    (GkmModule *self,
                                                                   CK_ATTRIBUTE_PTR attrs,
                                                                   CK_ULONG n_attrs);

void                   gkm_module_register_factory                (GkmModule *self,
                                                                   GkmFactory *factory);

CK_RV                  gkm_module_C_GetInfo                       (GkmModule *self,
                                                                   CK_INFO_PTR info);

CK_RV                  gkm_module_C_GetSlotList                   (GkmModule *self,
                                                                   CK_BBOOL token_present,
                                                                   CK_SLOT_ID_PTR slot_list,
                                                                   CK_ULONG_PTR count);

CK_RV                  gkm_module_C_GetSlotInfo                   (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_SLOT_INFO_PTR info);

CK_RV                  gkm_module_C_GetTokenInfo                  (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_TOKEN_INFO_PTR info);

CK_RV                  gkm_module_C_GetMechanismList              (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_MECHANISM_TYPE_PTR mech_list,
                                                                   CK_ULONG_PTR count);

CK_RV                  gkm_module_C_GetMechanismInfo              (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_MECHANISM_TYPE type,
                                                                   CK_MECHANISM_INFO_PTR info);

CK_RV                  gkm_module_C_InitToken                     (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_UTF8CHAR_PTR pin,
                                                                   CK_ULONG pin_len,
                                                                   CK_UTF8CHAR_PTR label);

CK_RV                  gkm_module_C_OpenSession                   (GkmModule *self,
                                                                   CK_SLOT_ID id,
                                                                   CK_FLAGS flags,
                                                                   CK_VOID_PTR user_data,
                                                                   CK_NOTIFY callback,
                                                                   CK_SESSION_HANDLE_PTR session);

CK_RV                  gkm_module_C_CloseSession                  (GkmModule *self,
                                                                   CK_SESSION_HANDLE session);

CK_RV                  gkm_module_C_CloseAllSessions              (GkmModule *self,
                                                                   CK_SLOT_ID id);

CK_RV                  gkm_module_C_InitPIN                       (GkmModule* self,
                                                                   CK_SESSION_HANDLE session,
                                                                   CK_UTF8CHAR_PTR pin,
                                                                   CK_ULONG pin_len);

CK_RV                  gkm_module_C_SetPIN                        (GkmModule* self,
                                                                   CK_SESSION_HANDLE session,
                                                                   CK_UTF8CHAR_PTR old_pin,
                                                                   CK_ULONG old_pin_len,
                                                                   CK_UTF8CHAR_PTR new_pin,
                                                                   CK_ULONG new_pin_len);

CK_RV                  gkm_module_C_Login                         (GkmModule *self,
                                                                   CK_SESSION_HANDLE session,
                                                                   CK_USER_TYPE user_type,
                                                                   CK_UTF8CHAR_PTR pin,
                                                                   CK_ULONG pin_len);

CK_RV                  gkm_module_C_Logout                        (GkmModule *self,
                                                                   CK_SESSION_HANDLE session);

#endif /* __GKM_MODULE_H__ */