pkcs11.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /*
  2. * Copyright (C) 2010-2012 Free Software Foundation, Inc.
  3. *
  4. * Author: Nikos Mavrogiannopoulos
  5. *
  6. * This file is part of GnuTLS.
  7. *
  8. * The GnuTLS is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public License
  10. * as published by the Free Software Foundation; either version 2.1 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>
  20. *
  21. */
  22. #ifndef __GNUTLS_PKCS11_H
  23. #define __GNUTLS_PKCS11_H
  24. #include <stdarg.h>
  25. #include <gnutls/gnutls.h>
  26. #include <gnutls/x509.h>
  27. /* *INDENT-OFF* */
  28. #ifdef __cplusplus
  29. extern "C" {
  30. #endif
  31. /* *INDENT-ON* */
  32. #define GNUTLS_PKCS11_MAX_PIN_LEN 32
  33. /**
  34. * gnutls_pkcs11_token_callback_t:
  35. * @userdata: user-controlled data from gnutls_pkcs11_set_token_function().
  36. * @label: token label.
  37. * @retry: retry counter, initially 0.
  38. *
  39. * Token callback function. The callback will be used to ask the user
  40. * to re-insert the token with given (null terminated) label. The
  41. * callback should return zero if token has been inserted by user and
  42. * a negative error code otherwise. It might be called multiple times
  43. * if the token is not detected and the retry counter will be
  44. * increased.
  45. *
  46. * Returns: %GNUTLS_E_SUCCESS (0) on success or a negative error code
  47. * on error.
  48. *
  49. * Since: 2.12.0
  50. **/
  51. typedef int (*gnutls_pkcs11_token_callback_t) (void *const
  52. userdata,
  53. const char *const
  54. label, unsigned retry);
  55. struct gnutls_pkcs11_obj_st;
  56. typedef struct gnutls_pkcs11_obj_st *gnutls_pkcs11_obj_t;
  57. #define GNUTLS_PKCS11_FLAG_MANUAL 0 /* Manual loading of libraries */
  58. #define GNUTLS_PKCS11_FLAG_AUTO 1 /* Automatically load libraries by reading /etc/gnutls/pkcs11.conf */
  59. /* pkcs11.conf format:
  60. * load = /lib/xxx-pkcs11.so
  61. * load = /lib/yyy-pkcs11.so
  62. */
  63. int gnutls_pkcs11_init(unsigned int flags,
  64. const char *deprecated_config_file);
  65. int gnutls_pkcs11_reinit(void);
  66. void gnutls_pkcs11_deinit(void);
  67. void gnutls_pkcs11_set_token_function
  68. (gnutls_pkcs11_token_callback_t fn, void *userdata);
  69. void gnutls_pkcs11_set_pin_function(gnutls_pin_callback_t fn,
  70. void *userdata);
  71. gnutls_pin_callback_t gnutls_pkcs11_get_pin_function(void
  72. **userdata);
  73. int gnutls_pkcs11_add_provider(const char *name, const char *params);
  74. int gnutls_pkcs11_obj_init(gnutls_pkcs11_obj_t * obj);
  75. void gnutls_pkcs11_obj_set_pin_function(gnutls_pkcs11_obj_t obj,
  76. gnutls_pin_callback_t fn,
  77. void *userdata);
  78. /**
  79. * gnutls_pkcs11_obj_flags:
  80. * @GNUTLS_PKCS11_OBJ_FLAG_LOGIN: Force login in the token for the operation (seek+store).
  81. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED: object marked as trusted (seek+store).
  82. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE: object marked as sensitive -unexportable (store).
  83. * @GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO: force login as a security officer in the token for the operation (seek+store).
  84. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_PRIVATE: marked as private -requires PIN to access (store).
  85. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_PRIVATE: marked as not private (store).
  86. * @GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_ANY: When retrieving an object, do not set any requirements (store).
  87. * @GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_TRUSTED: When retrieving an object, only retrieve the marked as trusted (alias to %GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED).
  88. * In gnutls_pkcs11_crt_is_known() it implies %GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_COMPARE if %GNUTLS_PKCS11_OBJ_FLAG_COMPARE_KEY is not given.
  89. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED: When writing an object, mark it as distrusted (store).
  90. * @GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_DISTRUSTED: When retrieving an object, only retrieve the marked as distrusted (seek).
  91. * @GNUTLS_PKCS11_OBJ_FLAG_COMPARE: When checking an object's presence, fully compare it before returning any result (seek).
  92. * @GNUTLS_PKCS11_OBJ_FLAG_COMPARE_KEY: When checking an object's presence, compare the key before returning any result (seek).
  93. * @GNUTLS_PKCS11_OBJ_FLAG_PRESENT_IN_TRUSTED_MODULE: The object must be present in a marked as trusted module (seek).
  94. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_CA: Mark the object as a CA (seek+store).
  95. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_KEY_WRAP: Mark the generated key pair as wrapping and unwrapping keys (store).
  96. * @GNUTLS_PKCS11_OBJ_FLAG_OVERWRITE_TRUSTMOD_EXT: When an issuer is requested, override its extensions with the ones present in the trust module (seek).
  97. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_ALWAYS_AUTH: Mark the key pair as requiring authentication (pin entry) before every operation (seek+store).
  98. * @GNUTLS_PKCS11_OBJ_FLAG_MARK_EXTRACTABLE: Mark the key pair as being extractable (store).
  99. * @GNUTLS_PKCS11_OBJ_FLAG_NEVER_EXTRACTABLE: If set, the object was never marked as extractable (store).
  100. * @GNUTLS_PKCS11_OBJ_FLAG_CRT: When searching, restrict to certificates only (seek).
  101. * @GNUTLS_PKCS11_OBJ_FLAG_PUBKEY: When searching, restrict to public key objects only (seek).
  102. * @GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY: When searching, restrict to private key objects only (seek).
  103. * @GNUTLS_PKCS11_OBJ_FLAG_NO_STORE_PUBKEY: When generating a keypair don't store the public key (store).
  104. *
  105. * Enumeration of different PKCS #11 object flags. Some flags are used
  106. * to mark objects when storing, while others are also used while seeking
  107. * or retrieving objects.
  108. */
  109. typedef enum gnutls_pkcs11_obj_flags {
  110. GNUTLS_PKCS11_OBJ_FLAG_LOGIN = (1<<0),
  111. GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED = (1<<1),
  112. GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE = (1<<2),
  113. GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO = (1<<3),
  114. GNUTLS_PKCS11_OBJ_FLAG_MARK_PRIVATE = (1<<4),
  115. GNUTLS_PKCS11_OBJ_FLAG_MARK_NOT_PRIVATE = (1<<5),
  116. GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_ANY = (1<<6),
  117. GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_TRUSTED = GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED,
  118. GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED = (1<<8),
  119. GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_DISTRUSTED = GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED,
  120. GNUTLS_PKCS11_OBJ_FLAG_COMPARE = (1<<9),
  121. GNUTLS_PKCS11_OBJ_FLAG_PRESENT_IN_TRUSTED_MODULE = (1<<10),
  122. GNUTLS_PKCS11_OBJ_FLAG_MARK_CA = (1<<11),
  123. GNUTLS_PKCS11_OBJ_FLAG_MARK_KEY_WRAP = (1<<12),
  124. GNUTLS_PKCS11_OBJ_FLAG_COMPARE_KEY = (1<<13),
  125. GNUTLS_PKCS11_OBJ_FLAG_OVERWRITE_TRUSTMOD_EXT = (1<<14),
  126. GNUTLS_PKCS11_OBJ_FLAG_MARK_ALWAYS_AUTH = (1<<15),
  127. GNUTLS_PKCS11_OBJ_FLAG_MARK_EXTRACTABLE = (1<<16),
  128. GNUTLS_PKCS11_OBJ_FLAG_NEVER_EXTRACTABLE = (1<<17),
  129. GNUTLS_PKCS11_OBJ_FLAG_CRT = (1<<18),
  130. GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY = (1<<19),
  131. GNUTLS_PKCS11_OBJ_FLAG_PUBKEY = (1<<20),
  132. GNUTLS_PKCS11_OBJ_FLAG_NO_STORE_PUBKEY = GNUTLS_PKCS11_OBJ_FLAG_PUBKEY,
  133. GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY = (1<<21),
  134. /* flags 1<<29 and later are reserved - see pkcs11_int.h */
  135. } gnutls_pkcs11_obj_flags;
  136. #define gnutls_pkcs11_obj_attr_t gnutls_pkcs11_obj_flags
  137. /**
  138. * gnutls_pkcs11_url_type_t:
  139. * @GNUTLS_PKCS11_URL_GENERIC: A generic-purpose URL.
  140. * @GNUTLS_PKCS11_URL_LIB: A URL that specifies the library used as well.
  141. * @GNUTLS_PKCS11_URL_LIB_VERSION: A URL that specifies the library and its version.
  142. *
  143. * Enumeration of different URL extraction flags.
  144. */
  145. typedef enum {
  146. GNUTLS_PKCS11_URL_GENERIC, /* URL specifies the object on token level */
  147. GNUTLS_PKCS11_URL_LIB, /* URL specifies the object on module level */
  148. GNUTLS_PKCS11_URL_LIB_VERSION /* URL specifies the object on module and version level */
  149. } gnutls_pkcs11_url_type_t;
  150. int gnutls_pkcs11_obj_import_url(gnutls_pkcs11_obj_t obj,
  151. const char *url, unsigned int flags
  152. /* GNUTLS_PKCS11_OBJ_FLAG_* */ );
  153. int gnutls_pkcs11_obj_export_url(gnutls_pkcs11_obj_t obj,
  154. gnutls_pkcs11_url_type_t detailed,
  155. char **url);
  156. void gnutls_pkcs11_obj_deinit(gnutls_pkcs11_obj_t obj);
  157. int gnutls_pkcs11_obj_export(gnutls_pkcs11_obj_t obj,
  158. void *output_data, size_t * output_data_size);
  159. int gnutls_pkcs11_obj_export2(gnutls_pkcs11_obj_t obj,
  160. gnutls_datum_t * out);
  161. int gnutls_pkcs11_obj_export3(gnutls_pkcs11_obj_t obj, gnutls_x509_crt_fmt_t fmt,
  162. gnutls_datum_t * out);
  163. int gnutls_pkcs11_get_raw_issuer(const char *url, gnutls_x509_crt_t cert,
  164. gnutls_datum_t * issuer,
  165. gnutls_x509_crt_fmt_t fmt,
  166. unsigned int flags);
  167. int gnutls_pkcs11_get_raw_issuer_by_dn (const char *url, const gnutls_datum_t *dn,
  168. gnutls_datum_t *issuer,
  169. gnutls_x509_crt_fmt_t fmt,
  170. unsigned int flags);
  171. int gnutls_pkcs11_get_raw_issuer_by_subject_key_id (const char *url,
  172. const gnutls_datum_t *dn,
  173. const gnutls_datum_t *spki,
  174. gnutls_datum_t *issuer,
  175. gnutls_x509_crt_fmt_t fmt,
  176. unsigned int flags);
  177. unsigned gnutls_pkcs11_crt_is_known(const char *url, gnutls_x509_crt_t cert,
  178. unsigned int flags);
  179. #if 0
  180. /* for documentation */
  181. int gnutls_pkcs11_copy_x509_crt(const char *token_url,
  182. gnutls_x509_crt_t crt,
  183. const char *label, unsigned int flags
  184. /* GNUTLS_PKCS11_OBJ_FLAG_* */ );
  185. int gnutls_pkcs11_copy_x509_privkey(const char *token_url,
  186. gnutls_x509_privkey_t key,
  187. const char *label,
  188. unsigned int key_usage,
  189. unsigned int flags);
  190. int
  191. gnutls_pkcs11_privkey_generate2(const char *url, gnutls_pk_algorithm_t pk,
  192. unsigned int bits, const char *label,
  193. gnutls_x509_crt_fmt_t fmt,
  194. gnutls_datum_t * pubkey,
  195. unsigned int flags);
  196. int
  197. gnutls_pkcs11_privkey_generate(const char *url, gnutls_pk_algorithm_t pk,
  198. unsigned int bits, const char *label,
  199. unsigned int flags);
  200. #endif
  201. int
  202. gnutls_pkcs11_copy_pubkey(const char *token_url,
  203. gnutls_pubkey_t crt, const char *label,
  204. const gnutls_datum_t *cid,
  205. unsigned int key_usage, unsigned int flags);
  206. #define gnutls_pkcs11_copy_x509_crt(url, crt, label, flags) \
  207. gnutls_pkcs11_copy_x509_crt2(url, crt, label, NULL, flags)
  208. int gnutls_pkcs11_copy_x509_crt2(const char *token_url,
  209. gnutls_x509_crt_t crt,
  210. const char *label,
  211. const gnutls_datum_t *id,
  212. unsigned int flags /* GNUTLS_PKCS11_OBJ_FLAG_* */);
  213. #define gnutls_pkcs11_copy_x509_privkey(url, key, label, usage, flags) \
  214. gnutls_pkcs11_copy_x509_privkey2(url, key, label, NULL, usage, flags)
  215. int gnutls_pkcs11_copy_x509_privkey2(const char *token_url,
  216. gnutls_x509_privkey_t key,
  217. const char *label,
  218. const gnutls_datum_t *cid,
  219. unsigned int key_usage
  220. /*GNUTLS_KEY_* */ ,
  221. unsigned int flags
  222. /* GNUTLS_PKCS11_OBJ_FLAG_* */
  223. );
  224. int gnutls_pkcs11_delete_url(const char *object_url, unsigned int flags
  225. /* GNUTLS_PKCS11_OBJ_FLAG_* */ );
  226. int gnutls_pkcs11_copy_secret_key(const char *token_url,
  227. gnutls_datum_t * key,
  228. const char *label, unsigned int key_usage
  229. /* GNUTLS_KEY_* */ ,
  230. unsigned int flags
  231. /* GNUTLS_PKCS11_OBJ_FLAG_* */ );
  232. /**
  233. * gnutls_pkcs11_obj_info_t:
  234. * @GNUTLS_PKCS11_OBJ_ID_HEX: The object ID in hex. Null-terminated text.
  235. * @GNUTLS_PKCS11_OBJ_LABEL: The object label. Null-terminated text.
  236. * @GNUTLS_PKCS11_OBJ_TOKEN_LABEL: The token's label. Null-terminated text.
  237. * @GNUTLS_PKCS11_OBJ_TOKEN_SERIAL: The token's serial number. Null-terminated text.
  238. * @GNUTLS_PKCS11_OBJ_TOKEN_MANUFACTURER: The token's manufacturer. Null-terminated text.
  239. * @GNUTLS_PKCS11_OBJ_TOKEN_MODEL: The token's model. Null-terminated text.
  240. * @GNUTLS_PKCS11_OBJ_ID: The object ID. Raw bytes.
  241. * @GNUTLS_PKCS11_OBJ_LIBRARY_VERSION: The library's version. Null-terminated text.
  242. * @GNUTLS_PKCS11_OBJ_LIBRARY_DESCRIPTION: The library's description. Null-terminated text.
  243. * @GNUTLS_PKCS11_OBJ_LIBRARY_MANUFACTURER: The library's manufacturer name. Null-terminated text.
  244. *
  245. * Enumeration of several object information types.
  246. */
  247. typedef enum {
  248. GNUTLS_PKCS11_OBJ_ID_HEX = 1,
  249. GNUTLS_PKCS11_OBJ_LABEL,
  250. GNUTLS_PKCS11_OBJ_TOKEN_LABEL,
  251. GNUTLS_PKCS11_OBJ_TOKEN_SERIAL,
  252. GNUTLS_PKCS11_OBJ_TOKEN_MANUFACTURER,
  253. GNUTLS_PKCS11_OBJ_TOKEN_MODEL,
  254. GNUTLS_PKCS11_OBJ_ID,
  255. /* the pkcs11 provider library info */
  256. GNUTLS_PKCS11_OBJ_LIBRARY_VERSION,
  257. GNUTLS_PKCS11_OBJ_LIBRARY_DESCRIPTION,
  258. GNUTLS_PKCS11_OBJ_LIBRARY_MANUFACTURER
  259. } gnutls_pkcs11_obj_info_t;
  260. int gnutls_pkcs11_obj_get_info(gnutls_pkcs11_obj_t obj,
  261. gnutls_pkcs11_obj_info_t itype,
  262. void *output, size_t * output_size);
  263. int gnutls_pkcs11_obj_set_info(gnutls_pkcs11_obj_t obj,
  264. gnutls_pkcs11_obj_info_t itype,
  265. const void *data, size_t data_size,
  266. unsigned flags);
  267. #define GNUTLS_PKCS11_OBJ_ATTR_CRT_ALL GNUTLS_PKCS11_OBJ_FLAG_CRT
  268. #define GNUTLS_PKCS11_OBJ_ATTR_MATCH 0 /* always match the given URL */
  269. #define GNUTLS_PKCS11_OBJ_ATTR_ALL 0 /* match everything! */
  270. #define GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED (GNUTLS_PKCS11_OBJ_FLAG_CRT|GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED)
  271. #define GNUTLS_PKCS11_OBJ_ATTR_CRT_WITH_PRIVKEY (GNUTLS_PKCS11_OBJ_FLAG_CRT|GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY)
  272. #define GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED_CA (GNUTLS_PKCS11_OBJ_FLAG_CRT|GNUTLS_PKCS11_OBJ_FLAG_MARK_CA|GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED)
  273. #define GNUTLS_PKCS11_OBJ_ATTR_PUBKEY GNUTLS_PKCS11_OBJ_FLAG_PUBKEY
  274. #define GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY
  275. /**
  276. * gnutls_pkcs11_token_info_t:
  277. * @GNUTLS_PKCS11_TOKEN_LABEL: The token's label (string)
  278. * @GNUTLS_PKCS11_TOKEN_SERIAL: The token's serial number (string)
  279. * @GNUTLS_PKCS11_TOKEN_MANUFACTURER: The token's manufacturer (string)
  280. * @GNUTLS_PKCS11_TOKEN_MODEL: The token's model (string)
  281. * @GNUTLS_PKCS11_TOKEN_MODNAME: The token's module name (string - since 3.4.3)
  282. *
  283. * Enumeration of types for retrieving token information.
  284. */
  285. typedef enum {
  286. GNUTLS_PKCS11_TOKEN_LABEL,
  287. GNUTLS_PKCS11_TOKEN_SERIAL,
  288. GNUTLS_PKCS11_TOKEN_MANUFACTURER,
  289. GNUTLS_PKCS11_TOKEN_MODEL,
  290. GNUTLS_PKCS11_TOKEN_MODNAME
  291. } gnutls_pkcs11_token_info_t;
  292. /**
  293. * gnutls_pkcs11_obj_type_t:
  294. * @GNUTLS_PKCS11_OBJ_UNKNOWN: Unknown PKCS11 object.
  295. * @GNUTLS_PKCS11_OBJ_X509_CRT: X.509 certificate.
  296. * @GNUTLS_PKCS11_OBJ_PUBKEY: Public key.
  297. * @GNUTLS_PKCS11_OBJ_PRIVKEY: Private key.
  298. * @GNUTLS_PKCS11_OBJ_SECRET_KEY: Secret key.
  299. * @GNUTLS_PKCS11_OBJ_DATA: Data object.
  300. * @GNUTLS_PKCS11_OBJ_X509_CRT_EXTENSION: X.509 certificate extension (supported by p11-kit trust module only).
  301. *
  302. * Enumeration of object types.
  303. */
  304. typedef enum {
  305. GNUTLS_PKCS11_OBJ_UNKNOWN,
  306. GNUTLS_PKCS11_OBJ_X509_CRT,
  307. GNUTLS_PKCS11_OBJ_PUBKEY,
  308. GNUTLS_PKCS11_OBJ_PRIVKEY,
  309. GNUTLS_PKCS11_OBJ_SECRET_KEY,
  310. GNUTLS_PKCS11_OBJ_DATA,
  311. GNUTLS_PKCS11_OBJ_X509_CRT_EXTENSION
  312. } gnutls_pkcs11_obj_type_t;
  313. int
  314. gnutls_pkcs11_token_init(const char *token_url,
  315. const char *so_pin, const char *label);
  316. int
  317. gnutls_pkcs11_token_get_mechanism(const char *url,
  318. unsigned int idx,
  319. unsigned long *mechanism);
  320. unsigned
  321. gnutls_pkcs11_token_check_mechanism(const char *url,
  322. unsigned long mechanism,
  323. void *ptr, unsigned psize, unsigned flags);
  324. int gnutls_pkcs11_token_set_pin(const char *token_url, const char *oldpin, const char *newpin, unsigned int flags /*gnutls_pin_flag_t */);
  325. int gnutls_pkcs11_token_get_url(unsigned int seq,
  326. gnutls_pkcs11_url_type_t detailed,
  327. char **url);
  328. int gnutls_pkcs11_token_get_info(const char *url,
  329. gnutls_pkcs11_token_info_t ttype,
  330. void *output, size_t * output_size);
  331. #define GNUTLS_PKCS11_TOKEN_HW 1
  332. #define GNUTLS_PKCS11_TOKEN_TRUSTED (1<<1) /* p11-kit trusted */
  333. int gnutls_pkcs11_token_get_flags(const char *url, unsigned int *flags);
  334. #define gnutls_pkcs11_obj_list_import_url(p_list, n_list, url, attrs, flags) gnutls_pkcs11_obj_list_import_url3(p_list, n_list, url, attrs|flags)
  335. #define gnutls_pkcs11_obj_list_import_url2(p_list, n_list, url, attrs, flags) gnutls_pkcs11_obj_list_import_url4(p_list, n_list, url, attrs|flags)
  336. int gnutls_pkcs11_obj_list_import_url3(gnutls_pkcs11_obj_t * p_list,
  337. unsigned int *const n_list,
  338. const char *url,
  339. unsigned int flags
  340. /* GNUTLS_PKCS11_OBJ_FLAG_* */
  341. );
  342. int
  343. gnutls_pkcs11_obj_list_import_url4(gnutls_pkcs11_obj_t ** p_list,
  344. unsigned int *n_list,
  345. const char *url,
  346. unsigned int flags
  347. /* GNUTLS_PKCS11_OBJ_FLAG_* */
  348. );
  349. int gnutls_x509_crt_import_pkcs11(gnutls_x509_crt_t crt,
  350. gnutls_pkcs11_obj_t pkcs11_crt);
  351. gnutls_pkcs11_obj_type_t
  352. gnutls_pkcs11_obj_get_type(gnutls_pkcs11_obj_t obj);
  353. const char *gnutls_pkcs11_type_get_name(gnutls_pkcs11_obj_type_t type);
  354. int
  355. gnutls_pkcs11_obj_get_exts(gnutls_pkcs11_obj_t obj,
  356. struct gnutls_x509_ext_st **exts, unsigned int *exts_size,
  357. unsigned int flags);
  358. int
  359. gnutls_pkcs11_obj_get_flags(gnutls_pkcs11_obj_t obj, unsigned int *oflags);
  360. char *gnutls_pkcs11_obj_flags_get_str(unsigned int flags);
  361. int gnutls_x509_crt_list_import_pkcs11(gnutls_x509_crt_t * certs,
  362. unsigned int cert_max,
  363. gnutls_pkcs11_obj_t *
  364. const objs, unsigned int flags
  365. /* must be zero */ );
  366. /* private key functions...*/
  367. int gnutls_pkcs11_privkey_init(gnutls_pkcs11_privkey_t * key);
  368. int
  369. gnutls_pkcs11_privkey_cpy(gnutls_pkcs11_privkey_t dst,
  370. gnutls_pkcs11_privkey_t src);
  371. void gnutls_pkcs11_privkey_set_pin_function(gnutls_pkcs11_privkey_t
  372. key,
  373. gnutls_pin_callback_t
  374. fn, void *userdata);
  375. void gnutls_pkcs11_privkey_deinit(gnutls_pkcs11_privkey_t key);
  376. int gnutls_pkcs11_privkey_get_pk_algorithm(gnutls_pkcs11_privkey_t
  377. key, unsigned int *bits);
  378. int gnutls_pkcs11_privkey_get_info(gnutls_pkcs11_privkey_t pkey,
  379. gnutls_pkcs11_obj_info_t itype,
  380. void *output, size_t * output_size);
  381. int gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey,
  382. const char *url, unsigned int flags);
  383. int gnutls_pkcs11_privkey_export_url(gnutls_pkcs11_privkey_t key,
  384. gnutls_pkcs11_url_type_t
  385. detailed, char **url);
  386. unsigned gnutls_pkcs11_privkey_status(gnutls_pkcs11_privkey_t key);
  387. #define gnutls_pkcs11_privkey_generate(url, pk, bits, label, flags) \
  388. gnutls_pkcs11_privkey_generate3(url, pk, bits, label, NULL, 0, NULL, 0, flags)
  389. #define gnutls_pkcs11_privkey_generate2(url, pk, bits, label, fmt, pubkey, flags) \
  390. gnutls_pkcs11_privkey_generate3(url, pk, bits, label, NULL, fmt, pubkey, 0, flags)
  391. int
  392. gnutls_pkcs11_privkey_generate3(const char *url,
  393. gnutls_pk_algorithm_t pk,
  394. unsigned int bits,
  395. const char *label,
  396. const gnutls_datum_t *cid,
  397. gnutls_x509_crt_fmt_t fmt,
  398. gnutls_datum_t * pubkey,
  399. unsigned int key_usage,
  400. unsigned int flags);
  401. int
  402. gnutls_pkcs11_privkey_export_pubkey(gnutls_pkcs11_privkey_t pkey,
  403. gnutls_x509_crt_fmt_t fmt,
  404. gnutls_datum_t * pubkey,
  405. unsigned int flags);
  406. int
  407. gnutls_pkcs11_token_get_random(const char *token_url,
  408. void *data, size_t len);
  409. int
  410. gnutls_pkcs11_copy_attached_extension(const char *token_url,
  411. gnutls_x509_crt_t crt,
  412. gnutls_datum_t *data,
  413. const char *label,
  414. unsigned int flags);
  415. #define gnutls_x509_crt_import_pkcs11_url gnutls_x509_crt_import_url
  416. /* *INDENT-OFF* */
  417. #ifdef __cplusplus
  418. }
  419. #endif
  420. /* *INDENT-ON* */
  421. #endif