1 module bindbc.gnutls.pkcs11;
2 
3 import bindbc.gnutls.config;
4 import bindbc.gnutls.gnutls;
5 import bindbc.gnutls.x509;
6 import bindbc.gnutls.x509_ext;
7 import core.stdc.config;
8 import core.sys.posix.sys.types;
9 
10 enum GNUTLS_PKCS11_MAX_PIN_LEN = 32;
11 
12 struct gnutls_pkcs11_obj_st;
13 alias gnutls_pkcs11_obj_t = gnutls_pkcs11_obj_st*;
14 
15 enum GNUTLS_PKCS11_FLAG_MANUAL = 0;
16 enum GNUTLS_PKCS11_FLAG_AUTO = 1;
17 enum GNUTLS_PKCS11_FLAG_AUTO_TRUSTED = 1 << 1;
18 
19 enum gnutls_pkcs11_obj_flags
20 {
21     GNUTLS_PKCS11_OBJ_FLAG_LOGIN = 1 << 0,
22     GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED = 1 << 1,
23     GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE = 1 << 2,
24     GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO = 1 << 3,
25     GNUTLS_PKCS11_OBJ_FLAG_MARK_PRIVATE = 1 << 4,
26     GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_PRIVATE = 1 << 5,
27     GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_ANY = 1 << 6,
28     GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_TRUSTED = GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED,
29     GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED = 1 << 8,
30     GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_DISTRUSTED = GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED,
31     GNUTLS_PKCS11_OBJ_FLAG_COMPARE = 1 << 9,
32     GNUTLS_PKCS11_OBJ_FLAG_PRESENT_IN_TRUSTED_MODULE = 1 << 10,
33     GNUTLS_PKCS11_OBJ_FLAG_MARK_CA = 1 << 11,
34     GNUTLS_PKCS11_OBJ_FLAG_MARK_KEY_WRAP = 1 << 12,
35     GNUTLS_PKCS11_OBJ_FLAG_COMPARE_KEY = 1 << 13,
36     GNUTLS_PKCS11_OBJ_FLAG_OVERWRITE_TRUSTMOD_EXT = 1 << 14,
37     GNUTLS_PKCS11_OBJ_FLAG_MARK_ALWAYS_AUTH = 1 << 15,
38     GNUTLS_PKCS11_OBJ_FLAG_MARK_EXTRACTABLE = 1 << 16,
39     GNUTLS_PKCS11_OBJ_FLAG_NEVER_EXTRACTABLE = 1 << 17,
40     GNUTLS_PKCS11_OBJ_FLAG_CRT = 1 << 18,
41     GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY = 1 << 19,
42     GNUTLS_PKCS11_OBJ_FLAG_PUBKEY = 1 << 20,
43     GNUTLS_PKCS11_OBJ_FLAG_NO_STORE_PUBKEY = GNUTLS_PKCS11_OBJ_FLAG_PUBKEY,
44     GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY = 1 << 21,
45     GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_SENSITIVE = 1 << 22 /// Available from GnuTLS 3.6.3
46 }
47 
48 alias gnutls_pkcs11_obj_attr_t = gnutls_pkcs11_obj_flags;
49 
50 enum gnutls_pkcs11_url_type_t
51 {
52     GNUTLS_PKCS11_URL_GENERIC = 0,
53     GNUTLS_PKCS11_URL_LIB = 1,
54     GNUTLS_PKCS11_URL_LIB_VERSION = 2
55 }
56 
57 enum gnutls_pkcs11_obj_info_t
58 {
59     GNUTLS_PKCS11_OBJ_ID_HEX = 1,
60     GNUTLS_PKCS11_OBJ_LABEL = 2,
61     GNUTLS_PKCS11_OBJ_TOKEN_LABEL = 3,
62     GNUTLS_PKCS11_OBJ_TOKEN_SERIAL = 4,
63     GNUTLS_PKCS11_OBJ_TOKEN_MANUFACTURER = 5,
64     GNUTLS_PKCS11_OBJ_TOKEN_MODEL = 6,
65     GNUTLS_PKCS11_OBJ_ID = 7,
66 
67     GNUTLS_PKCS11_OBJ_LIBRARY_VERSION = 8,
68     GNUTLS_PKCS11_OBJ_LIBRARY_DESCRIPTION = 9,
69     GNUTLS_PKCS11_OBJ_LIBRARY_MANUFACTURER = 10
70 }
71 
72 enum GNUTLS_PKCS11_OBJ_ATTR_CRT_ALL = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_CRT;
73 enum GNUTLS_PKCS11_OBJ_ATTR_MATCH = 0;
74 enum GNUTLS_PKCS11_OBJ_ATTR_ALL = 0;
75 enum GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_CRT | gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED;
76 enum GNUTLS_PKCS11_OBJ_ATTR_CRT_WITH_PRIVKEY = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_CRT | gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY;
77 enum GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED_CA = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_CRT | gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_MARK_CA | gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED;
78 enum GNUTLS_PKCS11_OBJ_ATTR_PUBKEY = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_PUBKEY;
79 enum GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY = gnutls_pkcs11_obj_flags.GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY;
80 
81 enum gnutls_pkcs11_token_info_t
82 {
83     GNUTLS_PKCS11_TOKEN_LABEL = 0,
84     GNUTLS_PKCS11_TOKEN_SERIAL = 1,
85     GNUTLS_PKCS11_TOKEN_MANUFACTURER = 2,
86     GNUTLS_PKCS11_TOKEN_MODEL = 3,
87     GNUTLS_PKCS11_TOKEN_MODNAME = 4
88 }
89 
90 enum gnutls_pkcs11_obj_type_t
91 {
92     GNUTLS_PKCS11_OBJ_UNKNOWN = 0,
93     GNUTLS_PKCS11_OBJ_X509_CRT = 1,
94     GNUTLS_PKCS11_OBJ_PUBKEY = 2,
95     GNUTLS_PKCS11_OBJ_PRIVKEY = 3,
96     GNUTLS_PKCS11_OBJ_SECRET_KEY = 4,
97     GNUTLS_PKCS11_OBJ_DATA = 5,
98     GNUTLS_PKCS11_OBJ_X509_CRT_EXTENSION = 6
99 }
100 
101 enum GNUTLS_PKCS11_TOKEN_HW = 1;
102 enum GNUTLS_PKCS11_TOKEN_TRUSTED = 1 << 1;
103 enum GNUTLS_PKCS11_TOKEN_RNG = 1 << 2;
104 enum GNUTLS_PKCS11_TOKEN_LOGIN_REQUIRED = 1 << 3;
105 enum GNUTLS_PKCS11_TOKEN_PROTECTED_AUTHENTICATION_PATH = 1 << 4;
106 enum GNUTLS_PKCS11_TOKEN_INITIALIZED = 1 << 5;
107 enum GNUTLS_PKCS11_TOKEN_USER_PIN_COUNT_LOW = 1 << 6;
108 enum GNUTLS_PKCS11_TOKEN_USER_PIN_FINAL_TRY = 1 << 7;
109 enum GNUTLS_PKCS11_TOKEN_USER_PIN_LOCKED = 1 << 8;
110 enum GNUTLS_PKCS11_TOKEN_SO_PIN_COUNT_LOW = 1 << 9;
111 enum GNUTLS_PKCS11_TOKEN_SO_PIN_FINAL_TRY = 1 << 10;
112 enum GNUTLS_PKCS11_TOKEN_SO_PIN_LOCKED = 1 << 11;
113 enum GNUTLS_PKCS11_TOKEN_USER_PIN_INITIALIZED = 1 << 12;
114 enum GNUTLS_PKCS11_TOKEN_ERROR_STATE = 1 << 13;
115 
116 extern(C) nothrow @nogc
117 {
118     alias gnutls_pkcs11_token_callback_t = int function (void* userdata, const char* label, uint retry);
119 }
120 
121 extern (D) nothrow @nogc
122 {
123     int gnutls_pkcs11_copy_x509_crt(const(char)* url, gnutls_x509_crt_t crt, const(char)* label, uint flags)
124     {
125         return gnutls_pkcs11_copy_x509_crt2(url, crt, label, null, flags);
126     }
127 
128     int gnutls_pkcs11_copy_x509_privkey(const(char)* url, gnutls_x509_privkey_t key, const(char)* label, uint usage, uint flags)
129     {
130         return gnutls_pkcs11_copy_x509_privkey2(url, key, label, null, usage, flags);
131     }
132 
133     int gnutls_pkcs11_privkey_generate(const(char)* url, gnutls_pk_algorithm_t pk, uint bits, const(char)* label, uint flags)
134     {
135         return gnutls_pkcs11_privkey_generate3(url, pk, bits, label, null, gnutls_x509_crt_fmt_t.GNUTLS_X509_FMT_DER, null, 0, flags);
136     }
137 
138     int gnutls_pkcs11_privkey_generate2(const(char)* url, gnutls_pk_algorithm_t pk, uint bits, const(char)* label, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* pubkey, uint flags)
139     {
140         return gnutls_pkcs11_privkey_generate3(url, pk, bits, label, null, fmt, pubkey, 0, flags);
141     }
142 }
143 
144 alias gnutls_x509_crt_import_pkcs11_url = gnutls_x509_crt_import_url;
145 
146 version (BindGnuTLS_Static)
147 {
148     extern (System) @nogc nothrow @system:
149 
150     int gnutls_pkcs11_init (uint flags, const(char)* deprecated_config_file);
151     int gnutls_pkcs11_reinit ();
152     void gnutls_pkcs11_deinit ();
153     void gnutls_pkcs11_set_token_function (gnutls_pkcs11_token_callback_t fn, void* userdata);
154     void gnutls_pkcs11_set_pin_function (gnutls_pin_callback_t fn, void* userdata);
155     gnutls_pin_callback_t gnutls_pkcs11_get_pin_function (void** userdata);
156     int gnutls_pkcs11_add_provider (const(char)* name, const(char)* params);
157     int gnutls_pkcs11_obj_init (gnutls_pkcs11_obj_t* obj);
158     void gnutls_pkcs11_obj_set_pin_function (gnutls_pkcs11_obj_t obj, gnutls_pin_callback_t fn, void* userdata);
159     int gnutls_pkcs11_obj_import_url (gnutls_pkcs11_obj_t obj, const(char)* url, uint flags);
160     int gnutls_pkcs11_obj_export_url (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_url_type_t detailed, char** url);
161     void gnutls_pkcs11_obj_deinit (gnutls_pkcs11_obj_t obj);
162     int gnutls_pkcs11_obj_export (gnutls_pkcs11_obj_t obj, void* output_data, size_t* output_data_size);
163     int gnutls_pkcs11_obj_export2 (gnutls_pkcs11_obj_t obj, gnutls_datum_t* out_);
164     int gnutls_pkcs11_obj_export3 (gnutls_pkcs11_obj_t obj, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* out_);
165     int gnutls_pkcs11_get_raw_issuer (const(char)* url, gnutls_x509_crt_t cert, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
166     int gnutls_pkcs11_get_raw_issuer_by_dn (const(char)* url, const(gnutls_datum_t)* dn, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
167     int gnutls_pkcs11_get_raw_issuer_by_subject_key_id (const(char)* url, const(gnutls_datum_t)* dn, const(gnutls_datum_t)* spki, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
168     uint gnutls_pkcs11_crt_is_known (const(char)* url, gnutls_x509_crt_t cert, uint flags);
169     int gnutls_pkcs11_copy_pubkey (const(char)* token_url, gnutls_pubkey_t crt, const(char)* label, const(gnutls_datum_t)* cid, uint key_usage, uint flags);
170     int gnutls_pkcs11_copy_x509_crt2 (const(char)* token_url, gnutls_x509_crt_t crt, const(char)* label, const(gnutls_datum_t)* id, uint flags);
171     int gnutls_pkcs11_copy_x509_privkey2 (const(char)* token_url, gnutls_x509_privkey_t key, const(char)* label, const(gnutls_datum_t)* cid, uint key_usage, uint flags);
172     int gnutls_pkcs11_delete_url (const(char)* object_url, uint flags);
173     int gnutls_pkcs11_copy_secret_key (const(char)* token_url, gnutls_datum_t* key, const(char)* label, uint key_usage, uint flags);
174 
175     static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
176         int gnutls_pkcs11_obj_get_ptr (gnutls_pkcs11_obj_t obj, void** ptr, void** session, void** ohandle, c_ulong* slot_id, uint flags);
177 
178     int gnutls_pkcs11_obj_get_info (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_obj_info_t itype, void* output, size_t* output_size);
179     int gnutls_pkcs11_obj_set_info (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_obj_info_t itype, const(void)* data, size_t data_size, uint flags);
180     int gnutls_pkcs11_token_init (const(char)* token_url, const(char)* so_pin, const(char)* label);
181 
182     static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
183         int gnutls_pkcs11_token_get_ptr (const(char)* url, void** ptr, c_ulong* slot_id, uint flags);
184 
185     int gnutls_pkcs11_token_get_mechanism (const(char)* url, uint idx, c_ulong* mechanism);
186     uint gnutls_pkcs11_token_check_mechanism (const(char)* url, c_ulong mechanism, void* ptr, uint psize, uint flags);
187     int gnutls_pkcs11_token_set_pin (const(char)* token_url, const(char)* oldpin, const(char)* newpin, uint flags);
188     int gnutls_pkcs11_token_get_url (uint seq, gnutls_pkcs11_url_type_t detailed, char** url);
189     int gnutls_pkcs11_token_get_info (const(char)* url, gnutls_pkcs11_token_info_t ttype, void* output, size_t* output_size);
190     int gnutls_pkcs11_token_get_flags (const(char)* url, uint* flags);
191     int gnutls_pkcs11_obj_list_import_url3 (gnutls_pkcs11_obj_t* p_list, uint* n_list, const(char)* url, uint flags);
192     int gnutls_pkcs11_obj_list_import_url4 (gnutls_pkcs11_obj_t** p_list, uint* n_list, const(char)* url, uint flags);
193     int gnutls_x509_crt_import_pkcs11 (gnutls_x509_crt_t crt, gnutls_pkcs11_obj_t pkcs11_crt);
194     gnutls_pkcs11_obj_type_t gnutls_pkcs11_obj_get_type (gnutls_pkcs11_obj_t obj);
195     const(char)* gnutls_pkcs11_type_get_name (gnutls_pkcs11_obj_type_t type);
196     int gnutls_pkcs11_obj_get_exts (gnutls_pkcs11_obj_t obj, gnutls_x509_ext_st** exts, uint* exts_size, uint flags);
197     int gnutls_pkcs11_obj_get_flags (gnutls_pkcs11_obj_t obj, uint* oflags);
198     char* gnutls_pkcs11_obj_flags_get_str (uint flags);
199     int gnutls_x509_crt_list_import_pkcs11 (gnutls_x509_crt_t* certs, uint cert_max, gnutls_pkcs11_obj_t* objs, uint flags);
200     int gnutls_pkcs11_privkey_init (gnutls_pkcs11_privkey_t* key);
201     int gnutls_pkcs11_privkey_cpy (gnutls_pkcs11_privkey_t dst, gnutls_pkcs11_privkey_t src);
202     void gnutls_pkcs11_privkey_set_pin_function (gnutls_pkcs11_privkey_t key, gnutls_pin_callback_t fn, void* userdata);
203     void gnutls_pkcs11_privkey_deinit (gnutls_pkcs11_privkey_t key);
204     int gnutls_pkcs11_privkey_get_pk_algorithm (gnutls_pkcs11_privkey_t key, uint* bits);
205     int gnutls_pkcs11_privkey_get_info (gnutls_pkcs11_privkey_t pkey, gnutls_pkcs11_obj_info_t itype, void* output, size_t* output_size);
206     int gnutls_pkcs11_privkey_import_url (gnutls_pkcs11_privkey_t pkey, const(char)* url, uint flags);
207     int gnutls_pkcs11_privkey_export_url (gnutls_pkcs11_privkey_t key, gnutls_pkcs11_url_type_t detailed, char** url);
208     uint gnutls_pkcs11_privkey_status (gnutls_pkcs11_privkey_t key);
209     int gnutls_pkcs11_privkey_generate3 (const(char)* url, gnutls_pk_algorithm_t pk, uint bits, const(char)* label, const(gnutls_datum_t)* cid, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* pubkey, uint key_usage, uint flags);
210     int gnutls_pkcs11_privkey_export_pubkey (gnutls_pkcs11_privkey_t pkey, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* pubkey, uint flags);
211     int gnutls_pkcs11_token_get_random (const(char)* token_url, void* data, size_t len);
212     int gnutls_pkcs11_copy_attached_extension (const(char)* token_url, gnutls_x509_crt_t crt, gnutls_datum_t* data, const(char)* label, uint flags);
213 }
214 else
215 {
216     extern (System) @nogc nothrow @system
217     {
218         alias pgnutls_pkcs11_init = int function (uint flags, const(char)* deprecated_config_file);
219         alias pgnutls_pkcs11_reinit = int function ();
220         alias pgnutls_pkcs11_deinit = void function ();
221         alias pgnutls_pkcs11_set_token_function = void function (gnutls_pkcs11_token_callback_t fn, void* userdata);
222         alias pgnutls_pkcs11_set_pin_function = void function (gnutls_pin_callback_t fn, void* userdata);
223         alias pgnutls_pkcs11_get_pin_function = gnutls_pin_callback_t function (void** userdata);
224         alias pgnutls_pkcs11_add_provider = int function (const(char)* name, const(char)* params);
225         alias pgnutls_pkcs11_obj_init = int function (gnutls_pkcs11_obj_t* obj);
226         alias pgnutls_pkcs11_obj_set_pin_function = void function (gnutls_pkcs11_obj_t obj, gnutls_pin_callback_t fn, void* userdata);
227         alias pgnutls_pkcs11_obj_import_url = int function (gnutls_pkcs11_obj_t obj, const(char)* url, uint flags);
228         alias pgnutls_pkcs11_obj_export_url = int function (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_url_type_t detailed, char** url);
229         alias pgnutls_pkcs11_obj_deinit = void function (gnutls_pkcs11_obj_t obj);
230         alias pgnutls_pkcs11_obj_export = int function (gnutls_pkcs11_obj_t obj, void* output_data, size_t* output_data_size);
231         alias pgnutls_pkcs11_obj_export2 = int function (gnutls_pkcs11_obj_t obj, gnutls_datum_t* out_);
232         alias pgnutls_pkcs11_obj_export3 = int function (gnutls_pkcs11_obj_t obj, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* out_);
233         alias pgnutls_pkcs11_get_raw_issuer = int function (const(char)* url, gnutls_x509_crt_t cert, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
234         alias pgnutls_pkcs11_get_raw_issuer_by_dn = int function (const(char)* url, const(gnutls_datum_t)* dn, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
235         alias pgnutls_pkcs11_get_raw_issuer_by_subject_key_id = int function (const(char)* url, const(gnutls_datum_t)* dn, const(gnutls_datum_t)* spki, gnutls_datum_t* issuer, gnutls_x509_crt_fmt_t fmt, uint flags);
236         alias pgnutls_pkcs11_crt_is_known = uint function (const(char)* url, gnutls_x509_crt_t cert, uint flags);
237         alias pgnutls_pkcs11_copy_pubkey = int function (const(char)* token_url, gnutls_pubkey_t crt, const(char)* label, const(gnutls_datum_t)* cid, uint key_usage, uint flags);
238         alias pgnutls_pkcs11_copy_x509_crt2 = int function (const(char)* token_url, gnutls_x509_crt_t crt, const(char)* label, const(gnutls_datum_t)* id, uint flags);
239         alias pgnutls_pkcs11_copy_x509_privkey2 = int function (const(char)* token_url, gnutls_x509_privkey_t key, const(char)* label, const(gnutls_datum_t)* cid, uint key_usage, uint flags);
240         alias pgnutls_pkcs11_delete_url = int function (const(char)* object_url, uint flags);
241         alias pgnutls_pkcs11_copy_secret_key = int function (const(char)* token_url, gnutls_datum_t* key, const(char)* label, uint key_usage, uint flags);
242 
243         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
244             alias pgnutls_pkcs11_obj_get_ptr = int function (gnutls_pkcs11_obj_t obj, void** ptr, void** session, void** ohandle, c_ulong* slot_id, uint flags);
245 
246         alias pgnutls_pkcs11_obj_get_info = int function (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_obj_info_t itype, void* output, size_t* output_size);
247         alias pgnutls_pkcs11_obj_set_info = int function (gnutls_pkcs11_obj_t obj, gnutls_pkcs11_obj_info_t itype, const(void)* data, size_t data_size, uint flags);
248         alias pgnutls_pkcs11_token_init = int function (const(char)* token_url, const(char)* so_pin, const(char)* label);
249 
250         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
251             alias pgnutls_pkcs11_token_get_ptr = int function (const(char)* url, void** ptr, c_ulong* slot_id, uint flags);
252 
253         alias pgnutls_pkcs11_token_get_mechanism = int function (const(char)* url, uint idx, c_ulong* mechanism);
254         alias pgnutls_pkcs11_token_check_mechanism = uint function (const(char)* url, c_ulong mechanism, void* ptr, uint psize, uint flags);
255         alias pgnutls_pkcs11_token_set_pin = int function (const(char)* token_url, const(char)* oldpin, const(char)* newpin, uint flags);
256         alias pgnutls_pkcs11_token_get_url = int function (uint seq, gnutls_pkcs11_url_type_t detailed, char** url);
257         alias pgnutls_pkcs11_token_get_info = int function (const(char)* url, gnutls_pkcs11_token_info_t ttype, void* output, size_t* output_size);
258         alias pgnutls_pkcs11_token_get_flags = int function (const(char)* url, uint* flags);
259         alias pgnutls_pkcs11_obj_list_import_url3 = int function (gnutls_pkcs11_obj_t* p_list, uint* n_list, const(char)* url, uint flags);
260         alias pgnutls_pkcs11_obj_list_import_url4 = int function (gnutls_pkcs11_obj_t** p_list, uint* n_list, const(char)* url, uint flags);
261         alias pgnutls_x509_crt_import_pkcs11 = int function (gnutls_x509_crt_t crt, gnutls_pkcs11_obj_t pkcs11_crt);
262         alias pgnutls_pkcs11_obj_get_type = gnutls_pkcs11_obj_type_t function (gnutls_pkcs11_obj_t obj);
263         alias pgnutls_pkcs11_type_get_name = const(char)* function (gnutls_pkcs11_obj_type_t type);
264         alias pgnutls_pkcs11_obj_get_exts = int function (gnutls_pkcs11_obj_t obj, gnutls_x509_ext_st** exts, uint* exts_size, uint flags);
265         alias pgnutls_pkcs11_obj_get_flags = int function (gnutls_pkcs11_obj_t obj, uint* oflags);
266         alias pgnutls_pkcs11_obj_flags_get_str = char* function (uint flags);
267         alias pgnutls_x509_crt_list_import_pkcs11 = int function (gnutls_x509_crt_t* certs, uint cert_max, gnutls_pkcs11_obj_t* objs, uint flags);
268         alias pgnutls_pkcs11_privkey_init = int function (gnutls_pkcs11_privkey_t* key);
269         alias pgnutls_pkcs11_privkey_cpy = int function (gnutls_pkcs11_privkey_t dst, gnutls_pkcs11_privkey_t src);
270         alias pgnutls_pkcs11_privkey_set_pin_function = void function (gnutls_pkcs11_privkey_t key, gnutls_pin_callback_t fn, void* userdata);
271         alias pgnutls_pkcs11_privkey_deinit = void function (gnutls_pkcs11_privkey_t key);
272         alias pgnutls_pkcs11_privkey_get_pk_algorithm = int function (gnutls_pkcs11_privkey_t key, uint* bits);
273         alias pgnutls_pkcs11_privkey_get_info = int function (gnutls_pkcs11_privkey_t pkey, gnutls_pkcs11_obj_info_t itype, void* output, size_t* output_size);
274         alias pgnutls_pkcs11_privkey_import_url = int function (gnutls_pkcs11_privkey_t pkey, const(char)* url, uint flags);
275         alias pgnutls_pkcs11_privkey_export_url = int function (gnutls_pkcs11_privkey_t key, gnutls_pkcs11_url_type_t detailed, char** url);
276         alias pgnutls_pkcs11_privkey_status = uint function (gnutls_pkcs11_privkey_t key);
277         alias pgnutls_pkcs11_privkey_generate3 = int function (const(char)* url, gnutls_pk_algorithm_t pk, uint bits, const(char)* label, const(gnutls_datum_t)* cid, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* pubkey, uint key_usage, uint flags);
278         alias pgnutls_pkcs11_privkey_export_pubkey = int function (gnutls_pkcs11_privkey_t pkey, gnutls_x509_crt_fmt_t fmt, gnutls_datum_t* pubkey, uint flags);
279         alias pgnutls_pkcs11_token_get_random = int function (const(char)* token_url, void* data, size_t len);
280         alias pgnutls_pkcs11_copy_attached_extension = int function (const(char)* token_url, gnutls_x509_crt_t crt, gnutls_datum_t* data, const(char)* label, uint flags);
281     }
282 
283     __gshared
284     {
285         pgnutls_pkcs11_init gnutls_pkcs11_init;
286         pgnutls_pkcs11_reinit gnutls_pkcs11_reinit;
287         pgnutls_pkcs11_deinit gnutls_pkcs11_deinit;
288         pgnutls_pkcs11_set_token_function gnutls_pkcs11_set_token_function;
289         pgnutls_pkcs11_set_pin_function gnutls_pkcs11_set_pin_function;
290         pgnutls_pkcs11_get_pin_function gnutls_pkcs11_get_pin_function;
291         pgnutls_pkcs11_add_provider gnutls_pkcs11_add_provider;
292         pgnutls_pkcs11_obj_init gnutls_pkcs11_obj_init;
293         pgnutls_pkcs11_obj_set_pin_function gnutls_pkcs11_obj_set_pin_function;
294         pgnutls_pkcs11_obj_import_url gnutls_pkcs11_obj_import_url;
295         pgnutls_pkcs11_obj_export_url gnutls_pkcs11_obj_export_url;
296         pgnutls_pkcs11_obj_deinit gnutls_pkcs11_obj_deinit;
297         pgnutls_pkcs11_obj_export gnutls_pkcs11_obj_export;
298         pgnutls_pkcs11_obj_export2 gnutls_pkcs11_obj_export2;
299         pgnutls_pkcs11_obj_export3 gnutls_pkcs11_obj_export3;
300         pgnutls_pkcs11_get_raw_issuer gnutls_pkcs11_get_raw_issuer;
301         pgnutls_pkcs11_get_raw_issuer_by_dn gnutls_pkcs11_get_raw_issuer_by_dn;
302         pgnutls_pkcs11_get_raw_issuer_by_subject_key_id gnutls_pkcs11_get_raw_issuer_by_subject_key_id;
303         pgnutls_pkcs11_crt_is_known gnutls_pkcs11_crt_is_known;
304         pgnutls_pkcs11_copy_pubkey gnutls_pkcs11_copy_pubkey;
305         pgnutls_pkcs11_copy_x509_crt2 gnutls_pkcs11_copy_x509_crt2;
306         pgnutls_pkcs11_copy_x509_privkey2 gnutls_pkcs11_copy_x509_privkey2;
307         pgnutls_pkcs11_delete_url gnutls_pkcs11_delete_url;
308         pgnutls_pkcs11_copy_secret_key gnutls_pkcs11_copy_secret_key;
309 
310         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
311             pgnutls_pkcs11_obj_get_ptr gnutls_pkcs11_obj_get_ptr;
312 
313         pgnutls_pkcs11_obj_get_info gnutls_pkcs11_obj_get_info;
314         pgnutls_pkcs11_obj_set_info gnutls_pkcs11_obj_set_info;
315         pgnutls_pkcs11_token_init gnutls_pkcs11_token_init;
316 
317         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
318             pgnutls_pkcs11_token_get_ptr gnutls_pkcs11_token_get_ptr;
319 
320         pgnutls_pkcs11_token_get_mechanism gnutls_pkcs11_token_get_mechanism;
321         pgnutls_pkcs11_token_check_mechanism gnutls_pkcs11_token_check_mechanism;
322         pgnutls_pkcs11_token_set_pin gnutls_pkcs11_token_set_pin;
323         pgnutls_pkcs11_token_get_url gnutls_pkcs11_token_get_url;
324         pgnutls_pkcs11_token_get_info gnutls_pkcs11_token_get_info;
325         pgnutls_pkcs11_token_get_flags gnutls_pkcs11_token_get_flags;
326         pgnutls_pkcs11_obj_list_import_url3 gnutls_pkcs11_obj_list_import_url3;
327         pgnutls_pkcs11_obj_list_import_url4 gnutls_pkcs11_obj_list_import_url4;
328         pgnutls_x509_crt_import_pkcs11 gnutls_x509_crt_import_pkcs11;
329         pgnutls_pkcs11_obj_get_type gnutls_pkcs11_obj_get_type;
330         pgnutls_pkcs11_type_get_name gnutls_pkcs11_type_get_name;
331         pgnutls_pkcs11_obj_get_exts gnutls_pkcs11_obj_get_exts;
332         pgnutls_pkcs11_obj_get_flags gnutls_pkcs11_obj_get_flags;
333         pgnutls_pkcs11_obj_flags_get_str gnutls_pkcs11_obj_flags_get_str;
334         pgnutls_x509_crt_list_import_pkcs11 gnutls_x509_crt_list_import_pkcs11;
335         pgnutls_pkcs11_privkey_init gnutls_pkcs11_privkey_init;
336         pgnutls_pkcs11_privkey_cpy gnutls_pkcs11_privkey_cpy;
337         pgnutls_pkcs11_privkey_set_pin_function gnutls_pkcs11_privkey_set_pin_function;
338         pgnutls_pkcs11_privkey_deinit gnutls_pkcs11_privkey_deinit;
339         pgnutls_pkcs11_privkey_get_pk_algorithm gnutls_pkcs11_privkey_get_pk_algorithm;
340         pgnutls_pkcs11_privkey_get_info gnutls_pkcs11_privkey_get_info;
341         pgnutls_pkcs11_privkey_import_url gnutls_pkcs11_privkey_import_url;
342         pgnutls_pkcs11_privkey_export_url gnutls_pkcs11_privkey_export_url;
343         pgnutls_pkcs11_privkey_status gnutls_pkcs11_privkey_status;
344         pgnutls_pkcs11_privkey_generate3 gnutls_pkcs11_privkey_generate3;
345         pgnutls_pkcs11_privkey_export_pubkey gnutls_pkcs11_privkey_export_pubkey;
346         pgnutls_pkcs11_token_get_random gnutls_pkcs11_token_get_random;
347         pgnutls_pkcs11_copy_attached_extension gnutls_pkcs11_copy_attached_extension;
348     }
349 
350     import bindbc.loader : SharedLib, bindSymbol_stdcall;
351     void bindPkcs11(SharedLib lib)
352     {
353         lib.bindSymbol_stdcall(gnutls_pkcs11_init, "gnutls_pkcs11_init");
354         lib.bindSymbol_stdcall(gnutls_pkcs11_reinit, "gnutls_pkcs11_reinit");
355         lib.bindSymbol_stdcall(gnutls_pkcs11_deinit, "gnutls_pkcs11_deinit");
356         lib.bindSymbol_stdcall(gnutls_pkcs11_set_token_function, "gnutls_pkcs11_set_token_function");
357         lib.bindSymbol_stdcall(gnutls_pkcs11_set_pin_function, "gnutls_pkcs11_set_pin_function");
358         lib.bindSymbol_stdcall(gnutls_pkcs11_get_pin_function, "gnutls_pkcs11_get_pin_function");
359         lib.bindSymbol_stdcall(gnutls_pkcs11_add_provider, "gnutls_pkcs11_add_provider");
360         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_init, "gnutls_pkcs11_obj_init");
361         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_set_pin_function, "gnutls_pkcs11_obj_set_pin_function");
362         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_import_url, "gnutls_pkcs11_obj_import_url");
363         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_export_url, "gnutls_pkcs11_obj_export_url");
364         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_deinit, "gnutls_pkcs11_obj_deinit");
365         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_export, "gnutls_pkcs11_obj_export");
366         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_export2, "gnutls_pkcs11_obj_export2");
367         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_export3, "gnutls_pkcs11_obj_export3");
368         lib.bindSymbol_stdcall(gnutls_pkcs11_get_raw_issuer, "gnutls_pkcs11_get_raw_issuer");
369         lib.bindSymbol_stdcall(gnutls_pkcs11_get_raw_issuer_by_dn, "gnutls_pkcs11_get_raw_issuer_by_dn");
370         lib.bindSymbol_stdcall(gnutls_pkcs11_get_raw_issuer_by_subject_key_id, "gnutls_pkcs11_get_raw_issuer_by_subject_key_id");
371         lib.bindSymbol_stdcall(gnutls_pkcs11_crt_is_known, "gnutls_pkcs11_crt_is_known");
372         lib.bindSymbol_stdcall(gnutls_pkcs11_copy_pubkey, "gnutls_pkcs11_copy_pubkey");
373         lib.bindSymbol_stdcall(gnutls_pkcs11_copy_x509_crt2, "gnutls_pkcs11_copy_x509_crt2");
374         lib.bindSymbol_stdcall(gnutls_pkcs11_copy_x509_privkey2, "gnutls_pkcs11_copy_x509_privkey2");
375         lib.bindSymbol_stdcall(gnutls_pkcs11_delete_url, "gnutls_pkcs11_delete_url");
376         lib.bindSymbol_stdcall(gnutls_pkcs11_copy_secret_key, "gnutls_pkcs11_copy_secret_key");
377 
378         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
379             lib.bindSymbol_stdcall(gnutls_pkcs11_obj_get_ptr, "gnutls_pkcs11_obj_get_ptr");
380 
381         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_get_info, "gnutls_pkcs11_obj_get_info");
382         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_set_info, "gnutls_pkcs11_obj_set_info");
383         lib.bindSymbol_stdcall(gnutls_pkcs11_token_init, "gnutls_pkcs11_token_init");
384 
385         static if (gnuTLSSupport >= GnuTLSSupport.gnutls_3_6_3)
386             lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_ptr, "gnutls_pkcs11_token_get_ptr");
387 
388         lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_mechanism, "gnutls_pkcs11_token_get_mechanism");
389         lib.bindSymbol_stdcall(gnutls_pkcs11_token_check_mechanism, "gnutls_pkcs11_token_check_mechanism");
390         lib.bindSymbol_stdcall(gnutls_pkcs11_token_set_pin, "gnutls_pkcs11_token_set_pin");
391         lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_url, "gnutls_pkcs11_token_get_url");
392         lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_info, "gnutls_pkcs11_token_get_info");
393         lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_flags, "gnutls_pkcs11_token_get_flags");
394         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_list_import_url3, "gnutls_pkcs11_obj_list_import_url3");
395         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_list_import_url4, "gnutls_pkcs11_obj_list_import_url4");
396         lib.bindSymbol_stdcall(gnutls_x509_crt_import_pkcs11, "gnutls_x509_crt_import_pkcs11");
397         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_get_type, "gnutls_pkcs11_obj_get_type");
398         lib.bindSymbol_stdcall(gnutls_pkcs11_type_get_name, "gnutls_pkcs11_type_get_name");
399         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_get_exts, "gnutls_pkcs11_obj_get_exts");
400         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_get_flags, "gnutls_pkcs11_obj_get_flags");
401         lib.bindSymbol_stdcall(gnutls_pkcs11_obj_flags_get_str, "gnutls_pkcs11_obj_flags_get_str");
402         lib.bindSymbol_stdcall(gnutls_x509_crt_list_import_pkcs11, "gnutls_x509_crt_list_import_pkcs11");
403         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_init, "gnutls_pkcs11_privkey_init");
404         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_cpy, "gnutls_pkcs11_privkey_cpy");
405         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_set_pin_function, "gnutls_pkcs11_privkey_set_pin_function");
406         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_deinit, "gnutls_pkcs11_privkey_deinit");
407         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_get_pk_algorithm, "gnutls_pkcs11_privkey_get_pk_algorithm");
408         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_get_info, "gnutls_pkcs11_privkey_get_info");
409         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_import_url, "gnutls_pkcs11_privkey_import_url");
410         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_export_url, "gnutls_pkcs11_privkey_export_url");
411         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_status, "gnutls_pkcs11_privkey_status");
412         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_generate3, "gnutls_pkcs11_privkey_generate3");
413         lib.bindSymbol_stdcall(gnutls_pkcs11_privkey_export_pubkey, "gnutls_pkcs11_privkey_export_pubkey");
414         lib.bindSymbol_stdcall(gnutls_pkcs11_token_get_random, "gnutls_pkcs11_token_get_random");
415         lib.bindSymbol_stdcall(gnutls_pkcs11_copy_attached_extension, "gnutls_pkcs11_copy_attached_extension");
416     }
417 }