updated for new output
[gnutls.git] / doc / cha-tokens.texi
blobe6d3fe4c62c53adeff05b50f19598281de5a7ab7
1 @node Hardware security modules and abstract key types
2 @chapter Hardware security modules and abstract key types
4 In several cases storing the long term cryptographic keys in a hard disk or
5 even in memory poses a significant risk. Once the system they are stored
6 is compromised the keys must be replaced as the secrecy of future sessions
7 is no longer guarranteed. Moreover, past sessions that were not protected by a
8 perfect forward secrecy offering ciphersuite are also to be assumed compromised.
10 If such threats need to be addressed, then it may be wise storing the keys in a security
11 module such as a smart card, an HSM or the TPM chip. Those modules ensure the
12 protection of the cryptographic keys by only allowing operations on them and
13 preventing their extraction.
15 @menu
16 * Abstract key types::
17 * Smart cards and HSMs::
18 * Trusted Platform Module::
19 @end menu
21 @node Abstract key types
22 @section Abstract key types
23 @cindex abstract types
25 Since there are many forms of a public or private keys supported by @acronym{GnuTLS} such as
26 @acronym{X.509}, @acronym{OpenPGP}, @acronym{PKCS} #11 or TPM it is desirable to allow common operations
27 on them. For these reasons the abstract @code{gnutls_privkey_t} and @code{gnutls_pubkey_t} were
28 introduced in @code{gnutls/abstract.h} header. Those types are initialized using a specific type of 
29 key and then can be used to perform operations in an abstract way. For example in order
30 to sign an X.509 certificate with a key that resides in a token the following steps must be
31 used.
33 @example
34 #inlude <gnutls/abstract.h>
36 void sign_cert( gnutls_x509_crt_t to_be_signed)
38 gnutls_x509_crt_t ca_cert;
39 gnutls_privkey_t abs_key;
41   /* initialize the abstract key */
42   gnutls_privkey_init(&abs_key);
44   /* keys stored in tokens are identified by URLs */
45   gnutls_privkey_import_url(abs_key, key_url);
47   gnutls_x509_crt_init(&ca_cert);
48   gnutls_x509_crt_import_pkcs11_url(&ca_cert, cert_url);
50   /* sign the certificate to be signed */
51   gnutls_x509_crt_privkey_sign(to_be_signed, ca_cert, abs_key, 
52                                GNUTLS_DIG_SHA256, 0);
54 @end example
56 @menu
57 * Abstract public keys::
58 * Abstract private keys::
59 * Operations::
60 @end menu
62 @node Abstract public keys
63 @subsection Public keys
64 An abstract @code{gnutls_pubkey_t} can be initialized
65 using the functions below. It can be imported through
66 an existing structure like @code{gnutls_x509_crt_t},
67 or through an ASN.1 encoding of the X.509 @code{SubjectPublicKeyInfo}
68 sequence.
70 @showfuncC{gnutls_pubkey_import_x509,gnutls_pubkey_import_openpgp,gnutls_pubkey_import_pkcs11}
72 @showfuncD{gnutls_pubkey_import_url,gnutls_pubkey_import_privkey,gnutls_pubkey_import,gnutls_pubkey_export}
74 @showfuncdesc{gnutls_pubkey_export2}
76 Other helper functions that allow directly importing from raw X.509 or
77 OpenPGP structures are shown below. 
79 @showfuncB{gnutls_pubkey_import_x509_raw,gnutls_pubkey_import_openpgp_raw}
81 An important function is @funcref{gnutls_pubkey_import_url} which will import
82 public keys from URLs that identify objects stored in tokens (see @ref{Smart cards and HSMs} and @ref{Trusted Platform Module}).
83 A function to check for a supported by GnuTLS URL is @funcref{gnutls_url_is_supported}.
85 @showfuncdesc{gnutls_url_is_supported}
87 Additional functions are available that will return
88 information over a public key, as well as a function that given a public
89 key fingerprint would provide a memorable sketch.
91 @showfuncD{gnutls_pubkey_get_pk_algorithm,gnutls_pubkey_get_preferred_hash_algorithm,gnutls_pubkey_get_key_id,gnutls_random_art}
93 To export the key-specific parameters, or obtain a unique key ID the following functions are provided.
95 @showfuncD{gnutls_pubkey_get_pk_rsa_raw,gnutls_pubkey_get_pk_dsa_raw,gnutls_pubkey_get_pk_ecc_raw,gnutls_pubkey_get_pk_ecc_x962}
97 @node Abstract private keys
98 @subsection Private keys
99 An abstract @code{gnutls_privkey_t} can be initialized
100 using the functions below. It can be imported through
101 an existing structure like @code{gnutls_x509_privkey_t},
102 but unlike public keys it cannot be exported. That is
103 to allow abstraction over keys stored in hardware that 
104 makes available only operations.
106 @showfuncC{gnutls_privkey_import_x509,gnutls_privkey_import_openpgp,gnutls_privkey_import_pkcs11}
108 Other helper functions that allow directly importing from raw X.509 or
109 OpenPGP structures are shown below. Again, as with public keys, private keys 
110 can be imported from a hardware module using URLs.
112 @showfuncB{gnutls_privkey_import_x509_raw,gnutls_privkey_import_openpgp_raw}
114 @showfuncdesc{gnutls_privkey_import_url}
116 @showfuncB{gnutls_privkey_get_pk_algorithm,gnutls_privkey_get_type}
118 In order to support cryptographic operations using 
119 an external API, the following function is provided.
120 This allows for a simple extensibility API without
121 resorting to @acronym{PKCS} #11.
123 @showfuncdesc{gnutls_privkey_import_ext2}
125 @node Operations
126 @subsection Operations
127 The abstract key types can be used to access signing and
128 signature verification operations with the underlying keys.
130 @showfuncdesc{gnutls_pubkey_verify_data2}
131 @showfuncdesc{gnutls_pubkey_verify_hash2}
132 @showfuncdesc{gnutls_pubkey_encrypt_data}
134 @showfuncdesc{gnutls_privkey_sign_data}
135 @showfuncdesc{gnutls_privkey_sign_hash}
136 @showfuncdesc{gnutls_privkey_decrypt_data}
138 Signing existing structures, such as certificates, CRLs,
139 or certificate requests, as well as associating public
140 keys with structures is also possible using the 
141 key abstractions.
143 @showfuncdesc{gnutls_x509_crq_set_pubkey}
144 @showfuncdesc{gnutls_x509_crt_set_pubkey}
145 @showfuncC{gnutls_x509_crt_privkey_sign,gnutls_x509_crl_privkey_sign,gnutls_x509_crq_privkey_sign}
147 @node Smart cards and HSMs
148 @section Smart cards and HSMs
149 @cindex PKCS #11 tokens
150 @cindex hardware tokens
151 @cindex hardware security modules
152 @cindex smart cards
154 In this section we present the smart-card and hardware security module (HSM) support 
155 in @acronym{GnuTLS} using @acronym{PKCS} #11 @xcite{PKCS11}. Hardware security
156 modules and smart cards provide a way to store private keys and perform
157 operations on them without exposing them. This decouples cryptographic
158 keys from the applications that use them and provide an additional 
159 security layer against cryptographic key extraction.
160 Since this can also be achieved in software components such as in Gnome keyring,
161 we will use the term security module to describe any cryptographic key 
162 separation subsystem.
164 @acronym{PKCS} #11 is plugin API allowing applications to access cryptographic
165 operations on a security module, as well as to objects residing on it. PKCS
166 #11 modules exist for hardware tokens such as smart cards@footnote{@url{http://www.opensc-project.org}},
167 cryptographic tokens, as well as for software modules like @acronym{Gnome Keyring}. 
168 The objects residing on a security module may be certificates, public keys, 
169 private keys or secret keys. Of those certificates and public/private key 
170 pairs can be used with @acronym{GnuTLS}. PKCS #11's main advantage is that 
171 it allows operations on private key objects such as decryption
172 and signing without exposing the key. In GnuTLS the PKCS #11 functionality is
173 available in @code{gnutls/pkcs11.h}.
175 Moreover @acronym{PKCS} #11 can be (ab)used to allow all applications in the same operating system to access
176 shared cryptographic keys and certificates in a uniform way, as in @ref{fig:pkcs11-vision}.
177 That way applications could load their trusted certificate list, as well as user
178 certificates from a common PKCS #11 module. Such a provider exists in the @acronym{Gnome} 
179 system, being the @acronym{Gnome Keyring}.
181 @float Figure,fig:pkcs11-vision
182 @image{pkcs11-vision,9cm}
183 @caption{PKCS #11 module usage.}
184 @end float
186 @menu
187 * PKCS11 Initialization::
188 * Accessing objects that require a PIN::
189 * Reading objects::
190 * Writing objects::
191 * Using a PKCS11 token with TLS::
192 * p11tool Invocation::             Invoking p11tool
193 @end menu
195 @node PKCS11 Initialization
196 @subsection Initialization
197 To allow all the  @acronym{GnuTLS} applications to access @acronym{PKCS} #11 tokens
198 you can use a configuration per module, stored in @code{/etc/pkcs11/modules/}. 
199 These are the configuration files of @acronym{p11-kit}@footnote{@url{http://p11-glue.freedesktop.org/}}.
200 For example a file that will load the @acronym{OpenSC} module, could be named
201 @code{/etc/pkcs11/modules/opensc} and contain the following:
203 @example
204 module: /usr/lib/opensc-pkcs11.so
205 @end example
207 If you use this file, then there is no need for other initialization in
208 @acronym{GnuTLS}, except for the PIN and token functions (see next section).  
209 However, you may manually initialize the PKCS #11 subsystem if the default
210 settings are not desirable.
212 @showfuncdesc{gnutls_pkcs11_init}
214 Note that PKCS #11 modules must be reinitialized on the child processes
215 after a @funcintref{fork}. @acronym{GnuTLS} provides @funcref{gnutls_pkcs11_reinit}
216 to be called for this purpose.
218 @showfuncdesc{gnutls_pkcs11_reinit}
220 @node Accessing objects that require a PIN
221 @subsection Accessing objects that require a PIN
223 Objects stored in token such as a private keys are typically protected
224 from access by a PIN or password. This PIN may be required to either read
225 the object (if allowed) or to perform operations with it. To allow obtaining
226 the PIN when accessing a protected object, as well as probe
227 the user to insert the token the following functions allow to set a callback.
229 @showfuncD{gnutls_pkcs11_set_token_function,gnutls_pkcs11_set_pin_function,gnutls_pkcs11_add_provider,gnutls_pkcs11_get_pin_function}
231 The callback is of type @funcintref{gnutls_pin_callback_t} and will have as
232 input the provided userdata, the PIN attempt number, a URL describing the
233 token, a label describing the object and flags. The PIN must be at most 
234 of @code{pin_max} size and must be copied to pin variable. The function must
235 return 0 on success or a negative error code otherwise.
237 @verbatim
238 typedef int (*gnutls_pin_callback_t) (void *userdata, int attempt,
239                                       const char *token_url,
240                                       const char *token_label,
241                                       unsigned int flags,
242                                       char *pin, size_t pin_max);
243 @end verbatim
245 The flags are of @code{gnutls_pin_flag_t} type and are explained below.
247 @showenumdesc{gnutls_pin_flag_t,The @code{gnutls_pin_@-flag_t} enumeration.}
249 Note that due to limitations of @acronym{PKCS} #11 there are issues when multiple libraries 
250 are sharing a module. To avoid this problem GnuTLS uses @acronym{p11-kit}
251 that provides a middleware to control access to resources over the
252 multiple users.
254 To avoid conflicts with multiple registered callbacks for PIN functions,
255 @funcref{gnutls_pkcs11_get_pin_function} may be used to check for any previously
256 set functions. In addition context specific PIN functions are allowed, e.g., by
257 using functions below.
259 @showfuncE{gnutls_certificate_set_pin_function,gnutls_pubkey_set_pin_function,gnutls_privkey_set_pin_function,gnutls_pkcs11_obj_set_pin_function,gnutls_x509_crt_set_pin_function}
261 @node Reading objects
262 @subsection Reading objects
264 All @acronym{PKCS} #11 objects are referenced by @acronym{GnuTLS} functions by
265 URLs as described in @xcite{PKCS11URI}. 
266 This allows for a consistent naming of objects across systems and applications
267 in the same system. For example a public
268 key on a smart card may be referenced as:
270 @example
271 pkcs11:token=Nikos;serial=307521161601031;model=PKCS%2315; \
272 manufacturer=EnterSafe;object=test1;objecttype=public;\
273 id=32f153f3e37990b08624141077ca5dec2d15faed
274 @end example
276 while the smart card itself can be referenced as:
277 @example
278 pkcs11:token=Nikos;serial=307521161601031;model=PKCS%2315;manufacturer=EnterSafe
279 @end example
281 Objects stored in a @acronym{PKCS} #11 token can be extracted
282 if they are not marked as sensitive. Usually only private keys are marked as
283 sensitive and cannot be extracted, while certificates and other data can
284 be retrieved. The functions that can be used to access objects
285 are shown below.
287 @showfuncB{gnutls_pkcs11_obj_import_url,gnutls_pkcs11_obj_export_url}
289 @showfuncdesc{gnutls_pkcs11_obj_get_info}
291 @showfuncC{gnutls_x509_crt_import_pkcs11,gnutls_x509_crt_import_pkcs11_url,gnutls_x509_crt_list_import_pkcs11}
293 Properties of the physical token can also be accessed and altered with @acronym{GnuTLS}.
294 For example data in a token can be erased (initialized), PIN can be altered, etc.
296 @showfuncE{gnutls_pkcs11_token_init,gnutls_pkcs11_token_get_url,gnutls_pkcs11_token_get_info,gnutls_pkcs11_token_get_flags,gnutls_pkcs11_token_set_pin}
298 The following examples demonstrate the usage of the API. The first example
299 will list all available PKCS #11 tokens in a system and the latter will
300 list all certificates in a token that have a corresponding private key.
302 @example
303 int i;
304 char* url;
306 gnutls_global_init();
308 for (i=0;;i++) 
309   @{
310     ret = gnutls_pkcs11_token_get_url(i, &url);
311     if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
312       break;
314     if (ret < 0)
315       exit(1);
316                 
317     fprintf(stdout, "Token[%d]: URL: %s\n", i, url);
318     gnutls_free(url);
319   @}
320 gnutls_global_deinit();
321 @end example
323 @verbatiminclude examples/ex-pkcs11-list.c
325 @node Writing objects
326 @subsection Writing objects
328 With @acronym{GnuTLS} you can copy existing private keys and certificates
329 to a token. Note that when copying private keys it is recommended to mark
330 them as sensitive using the @code{GNUTLS_@-PKCS11_OBJ_@-FLAG_@-MARK_@-SENSITIVE}
331 to prevent its extraction. An object can be marked as private using the flag 
332 @code{GNUTLS_@-PKCS11_OBJ_@-FLAG_@-MARK_@-PRIVATE}, to require PIN to be
333 entered before accessing the object (for operations or otherwise).
335 @showfuncdesc{gnutls_pkcs11_copy_x509_privkey}
337 @showfuncdesc{gnutls_pkcs11_copy_x509_crt}
338 @showfuncdesc{gnutls_pkcs11_delete_url}
341 @node Using a PKCS11 token with TLS
342 @subsection Using a @acronym{PKCS} #11 token with TLS
344 It is possible to use a @acronym{PKCS} #11 token to a TLS
345 session, as shown in @ref{ex:pkcs11-client}. In addition
346 the following functions can be used to load PKCS #11 key and
347 certificates by specifying a PKCS #11 URL instead of a filename.
349 @showfuncB{gnutls_certificate_set_x509_trust_file,gnutls_certificate_set_x509_key_file}
350 @showfuncdesc{gnutls_certificate_set_x509_system_trust}
352 @include invoke-p11tool.texi
354 @node Trusted Platform Module
355 @section Trusted Platform Module (TPM)
356 @cindex trusted platform module
357 @cindex TPM
359 In this section we present the Trusted Platform Module (TPM) support 
360 in @acronym{GnuTLS}. There was a big hype when the TPM chip was introduced into 
361 computers. Briefly it is a co-processor in your PC that allows it to perform 
362 calculations independently of the main processor. This has good and bad 
363 side-effects. In this section we focus on the good ones, which are the fact that 
364 you can use it to perform cryptographic operations the similarly to a
365 @acronym{PKCS} #11 smart card. 
366 It allows for storing and using RSA keys but with slight differences
367 from a @acronym{PKCS} #11 module that require different handling. 
368 The basic operations supported, and used by GnuTLS, are key generation and signing. 
370 In GnuTLS the TPM functionality is available in @code{gnutls/tpm.h}.
372 @menu
373 * Keys in TPM::
374 * Key generation::
375 * Using keys::
376 * tpmtool Invocation::            Invoking tpmtool
377 @end menu
379 @node Keys in TPM
380 @subsection Keys in TPM
382 The RSA keys in the TPM module may either be stored in a flash memory
383 within TPM or stored in a file in disk. In the former case the key can
384 provide operations as with @acronym{PKCS} #11 and is identified by
385 a URL. The URL is of the following form.
386 @verbatim
387 tpmkey:uuid=42309df8-d101-11e1-a89a-97bb33c23ad1;storage=user
388 @end verbatim
390 It consists from a unique identifier of the key as well as the part of the
391 flash memory the key is stored at. The two options for the storage field are
392 `user' and `system'. The user keys are typically only available to the generating
393 user and the system keys to all users. The stored in TPM keys are called
394 registered keys.
396 The keys that are stored in the disk are exported from the TPM but in an
397 encrypted form. To access them two passwords are required. The first is the TPM
398 Storage Root Key (SRK), and the other is a key-specific password. Also those keys are
399 identified by a URL of the form:
400 @verbatim
401 tpmkey:file=/path/to/file
402 @end verbatim
404 When objects require a PIN to be accessed the same callbacks as with PKCS #11
405 objects are expected (see @ref{Accessing objects that require a PIN}).
407 @node Key generation
408 @subsection Key generation
410 All keys used by the TPM must be generated by the TPM. This can be
411 done using @funcref{gnutls_tpm_privkey_generate}.
413 @showfuncdesc{gnutls_tpm_privkey_generate}
415 @showfuncC{gnutls_tpm_get_registered,gnutls_tpm_key_list_deinit,gnutls_tpm_key_list_get_url}
417 @showfuncdesc{gnutls_tpm_privkey_delete}
419 @node Using keys
420 @subsection Using keys
422 @subsubheading Importing keys
424 The TPM keys can be used directly by the abstract key types and do not require
425 any special structures. Moreover functions like @funcref{gnutls_certificate_set_x509_key_file}
426 can access TPM URLs.
428 @showfuncB{gnutls_privkey_import_tpm_raw,gnutls_pubkey_import_tpm_raw}
430 @showfuncdesc{gnutls_privkey_import_tpm_url}
431 @showfuncdesc{gnutls_pubkey_import_tpm_url}
433 @subsubheading Listing and deleting keys
435 The registered keys (that are stored in the TPM) can be listed using one of
436 the following functions. Those keys are unfortunately only identified by
437 their UUID and have no label or other human friendly identifier.
438 Keys can be deleted from permament storage using @funcref{gnutls_tpm_privkey_delete}.
440 @showfuncC{gnutls_tpm_get_registered,gnutls_tpm_key_list_deinit,gnutls_tpm_key_list_get_url}
442 @showfuncdesc{gnutls_tpm_privkey_delete}
445 @include invoke-tpmtool.texi