corrected verification examples
[gnutls.git] / doc / cha-gtls-app.texi
blobb6ad475dbee60e31344d5dcb2b8e2d2509d66d5e
1 @node How to use GnuTLS in applications
2 @chapter How to use @acronym{GnuTLS} in applications
4 @menu
5 * Introduction to the library::
6 * Preparation::
7 * Session initialization::
8 * Associating the credentials::
9 * Setting up the transport layer::
10 * TLS handshake::
11 * Data transfer and termination::
12 * Handling alerts::
13 * Priority Strings::
14 * Advanced topics::
15 * Using the cryptographic library::
16 * Selecting cryptographic key sizes::
17 @end menu
19 @node Introduction to the library
20 @section Introduction
22 This chapter tries to explain the basic functionality of the current GnuTLS
23 library. Note that there may be additional functionality not discussed here
24 but included in the library. Checking the header files in @file{/usr/include/gnutls/}
25 and the manpages is recommended.
27 @menu
28 * General idea::
29 * Error handling::
30 * Common types::
31 * Debugging and auditing::
32 * Thread safety::
33 * Callback functions::
34 @end menu
36 @node General idea
37 @subsection General idea
39 A brief description of how @acronym{GnuTLS} sessions operate is shown
40 at @ref{fig:gnutls-design}. This section will become more clear when it
41 is completely read.
42 As shown in the figure, there is a read-only global state that is
43 initialized once by the global initialization function.  This global
44 structure, among others, contains the memory allocation functions
45 used, structures needed for the @acronym{ASN.1} parser and depending
46 on the system's CPU, pointers to hardware accelerated encryption functions.  This
47 structure is never modified by any @acronym{GnuTLS} function, except
48 for the deinitialization function which frees all allocated memory
49 and must be called after the program has permanently
50 finished using @acronym{GnuTLS}.
52 @float Figure,fig:gnutls-design
53 @image{gnutls-internals,12cm}
54 @caption{High level design of GnuTLS.}
55 @end float
57 The credentials structures are used by the authentication methods, such
58 as certificate authentication. They store certificates, privates keys,
59 and other information that is needed to prove the identity to the peer,
60 and/or verify the indentity of the peer. The information stored in
61 the credentials structures is initialized once and then can be 
62 shared by many @acronym{TLS} sessions.
64 A @acronym{GnuTLS} session contains all the required information
65 to handle one secure connection. The session communicates with the
66 peers using the provided functions of the transport layer.
67 Every session has a unique session ID shared with the peer.
69 Since TLS sessions can be resumed, servers need a
70 database back-end to hold the session's parameters.  Every
71 @acronym{GnuTLS} session after a successful handshake calls the
72 appropriate back-end function (see @ref{resume})
73 to store the newly negotiated session. The session
74 database is examined by the server just after having received the
75 client hello@footnote{The first message in a @acronym{TLS} handshake},
76 and if the session ID sent by the client, matches a stored session,
77 the stored session will be retrieved, and the new session will be a
78 resumed one, and will share the same session ID with the previous one.
80 @node Error handling
81 @subsection Error handling
83 In @acronym{GnuTLS} most functions return an integer type as a result.
84 In almost all cases a zero or a positive number means success, and a
85 negative number indicates failure, or a situation that some action has
86 to be taken. Thus negative error codes may be fatal or not.
88 Fatal errors terminate the connection immediately and further sends
89 and receives will be disallowed.  Such an example is
90 @code{GNUTLS_@-E_@-DECRYPTION_@-FAILED}. Non-fatal errors may warn about
91 something, i.e., a warning alert was received, or indicate the some
92 action has to be taken. This is the case with the error code
93 @code{GNUTLS_@-E_@-REHANDSHAKE} returned by @funcref{gnutls_record_recv}.
94 This error code indicates that the server requests a re-handshake. The
95 client may ignore this request, or may reply with an alert.  You can
96 test if an error code is a fatal one by using the
97 @funcref{gnutls_error_is_fatal}.
98 All errors can be converted to a descriptive string using @funcref{gnutls_strerror}.
100 If any non fatal errors, that require an action, are to be returned by
101 a function, these error codes will be documented in the function's
102 reference. For example the error codes @code{GNUTLS_@-E_@-WARNING_@-ALERT_@-RECEIVED} and @code{GNUTLS_@-E_@-FATAL_@-ALERT_@-RECEIVED}
103 that may returned when receiving data, should be handled by notifying the
104 user of the alert (as explained in @ref{Handling alerts}).
105 See @ref{Error codes}, for a description of the available error codes.
107 @node Common types
108 @subsection Common types
110 Several functions in @acronym{GnuTLS} use @code{gnutls_datum_t} which is
111 convenient way to combine a pointer to data and data's size. Its definition is
112 shown below.
113 @verbatim
114   typedef struct
115   {
116     unsigned char *data;
117     unsigned int size;
118   } gnutls_datum_t;
119 @end verbatim
121 Other functions that require data for scattered read use a structure similar
122 to @code{struct iovec} typically used by @funcintref{readv}. It is shown
123 below.
124 @verbatim
125   typedef struct
126   {
127     void *iov_base;             /* Starting address */
128     size_t iov_len;             /* Number of bytes to transfer */
129   } giovec_t;
130 @end verbatim
133 @node Debugging and auditing
134 @subsection Debugging and auditing
136 In many cases things may not go as expected and further information,
137 to assist debugging, from @acronym{GnuTLS} is desired. 
138 Those are the cases where the @funcref{gnutls_global_set_log_level} and
139 @funcref{gnutls_global_set_log_function} are to be used. Those will print
140 verbose information on the @acronym{GnuTLS} functions internal flow.
142 @showfuncB{gnutls_global_set_log_level,gnutls_global_set_log_function}
144 When debugging is not required, important issues, such as detected
145 attacks on the protocol still need to be logged. This is provided
146 by the logging function set by
147 @funcref{gnutls_global_set_audit_log_function}. The provided function
148 will receive an message and the corresponding
149 TLS session. The session information might be used to derive IP addresses
150 or other information about the peer involved.
152 @showfuncdesc{gnutls_global_set_audit_log_function}
154 @node Thread safety
155 @subsection Thread safety
156 @cindex thread safety
158 The @acronym{GnuTLS} library is thread safe by design, meaning that
159 objects of the library such as TLS sessions, can be safely divided across
160 threads as long as a single thread accesses a single object. This is
161 sufficient to support a server which handles several sessions per thread.
162 If, however, an object needs to be shared across threads then access must be 
163 protected with a mutex. Read-only access to objects, for example the
164 credentials holding structures, is also thread-safe. 
166 The random generator of the cryptographic back-end, is not thread safe and requires
167 mutex locks which are setup by @acronym{GnuTLS}.
168 Applications can either call @funcref{gnutls_global_init} which will initialize the default
169 operating system provided locks (i.e. @code{pthreads} on GNU/Linux and
170 @code{CriticalSection} on Windows), or manually specify the locking system using
171 the function @funcref{gnutls_global_set_mutex} before calling @funcref{gnutls_global_init}. 
172 Setting mutexes manually is recommended
173 only for applications that have full control of the underlying libraries. If this
174 is not the case, the use of the operating system defaults is recommended. An example of 
175 non-native thread usage is shown below.
177 @example
178 #include <gnutls/gnutls.h>
180 int main()
182    /* When the system mutexes are not to be used 
183     * gnutls_global_set_mutex() must be called explicitly
184     */
185    gnutls_global_set_mutex (mutex_init, mutex_deinit, 
186                             mutex_lock, mutex_unlock);
187    gnutls_global_init();
189 @end example
191 @showfuncdesc{gnutls_global_set_mutex}
193 @node Callback functions
194 @subsection Callback functions
195 @cindex callback functions
197 There are several cases where @acronym{GnuTLS} may need out of
198 band input from your program. This is now implemented using some
199 callback functions, which your program is expected to register.
201 An example of this type of functions are the push and pull callbacks
202 which are used to specify the functions that will retrieve and send
203 data to the transport layer.
205 @showfuncB{gnutls_transport_set_push_function,gnutls_transport_set_pull_function}
207 Other callback functions may require more complicated input and data
208 to be allocated. Such an example is 
209 @funcref{gnutls_srp_set_server_credentials_function}.
210 All callbacks should allocate and free memory using 
211 @funcintref{gnutls_malloc} and @funcintref{gnutls_free}.
214 @node Preparation
215 @section Preparation
217 To use @acronym{GnuTLS}, you have to perform some changes to your
218 sources and your build system. The necessary changes are explained in
219 the following subsections.
221 @menu
222 * Headers::
223 * Initialization::
224 * Version check::
225 * Building the source::
226 @end menu
228 @node Headers
229 @subsection Headers
231 All the data types and functions of the @acronym{GnuTLS} library are
232 defined in the header file @file{gnutls/gnutls.h}.  This must be
233 included in all programs that make use of the @acronym{GnuTLS}
234 library.
236 @node Initialization
237 @subsection Initialization
239 GnuTLS must be initialized before it can be used.  The library is
240 initialized by calling @funcref{gnutls_global_init}.  The resources
241 allocated by the initialization process can be released if the
242 application no longer has a need to call GnuTLS functions, this is
243 done by calling @funcref{gnutls_global_deinit}.
245 In order to take advantage of the internationalization features in
246 GnuTLS, such as translated error messages, the application must set
247 the current locale using @code{setlocale} before initializing GnuTLS.
249 @node Version check
250 @subsection Version check
252 It is often desirable to check that the version of `gnutls' used is
253 indeed one which fits all requirements.  Even with binary
254 compatibility new features may have been introduced but due to problem
255 with the dynamic linker an old version is actually used.  So you may
256 want to check that the version is okay right after program start-up.
257 See the function @funcref{gnutls_check_version}.
259 @node Building the source
260 @subsection Building the source
262 If you want to compile a source file including the
263 @file{gnutls/gnutls.h} header file, you must make sure that the
264 compiler can find it in the directory hierarchy.  This is accomplished
265 by adding the path to the directory in which the header file is
266 located to the compilers include file search path (via the @option{-I}
267 option).
269 However, the path to the include file is determined at the time the
270 source is configured.  To solve this problem, the library uses the
271 external package @command{pkg-config} that knows the path to the
272 include file and other configuration options.  The options that need
273 to be added to the compiler invocation at compile time are output by
274 the @option{--cflags} option to @command{pkg-config gnutls}.  The
275 following example shows how it can be used at the command line:
277 @example
278 gcc -c foo.c `pkg-config gnutls --cflags`
279 @end example
281 Adding the output of @samp{pkg-config gnutls --cflags} to the
282 compilers command line will ensure that the compiler can find the
283 @file{gnutls/gnutls.h} header file.
285 A similar problem occurs when linking the program with the library.
286 Again, the compiler has to find the library files.  For this to work,
287 the path to the library files has to be added to the library search
288 path (via the @option{-L} option).  For this, the option
289 @option{--libs} to @command{pkg-config gnutls} can be used.  For
290 convenience, this option also outputs all other options that are
291 required to link the program with the library (for instance, the
292 @samp{-ltasn1} option).  The example shows how to link @file{foo.o}
293 with the library to a program @command{foo}.
295 @example
296 gcc -o foo foo.o `pkg-config gnutls --libs`
297 @end example
299 Of course you can also combine both examples to a single command by
300 specifying both options to @command{pkg-config}:
302 @example
303 gcc -o foo foo.c `pkg-config gnutls --cflags --libs`
304 @end example
306 When a program uses the GNU autoconf system, then the following
307 line or similar can be used to detect the presence of GnuTLS.
309 @example
310 PKG_CHECK_MODULES([LIBGNUTLS], [gnutls >= 3.0.0])
312 AC_SUBST([LIBGNUTLS_CFLAGS])
313 AC_SUBST([LIBGNUTLS_LIBS])
314 @end example
316 @node Session initialization
317 @section Session initialization
319 In the previous sections we have discussed the global initialization
320 required for GnuTLS as well as the initialization required for each
321 authentication method's credentials (see @ref{Authentication}).
322 In this section we elaborate on the TLS or DTLS session initiation.
323 Each session is initialized using @funcref{gnutls_init} which among
324 others is used to specify the type of the connection (server or client), 
325 and the underlying protocol type, i.e., datagram (UDP) or reliable (TCP).
327 @showfuncdesc{gnutls_init}
329 After the session initialization details on the allowed ciphersuites
330 and protocol versions should be set using the priority functions
331 such as @funcref{gnutls_priority_set_direct}. We elaborate on them
332 in @ref{Priority Strings}.
333 The credentials used for the key exchange method, such as certificates 
334 or usernames and passwords should also be associated with the session
335 current session using @funcref{gnutls_credentials_set}. 
337 @showfuncdesc{gnutls_credentials_set}
339 @node Associating the credentials
340 @section Associating the credentials
342 @menu
343 * Certificate credentials::
344 * SRP credentials::
345 * PSK credentials::
346 * Anonymous credentials::
347 @end menu
349 Each authentication method is associated with a key exchange method, and a credentials type. 
350 The contents of the credentials is method-dependent, e.g. certificates
351 for certificate authentication and should be initialized and associated
352 with a session (see @funcref{gnutls_credentials_set}).  A mapping of the key exchange methods
353 with the credential types is shown in @ref{tab:key-exchange-cred}.
355 @float Table,tab:key-exchange-cred
356 @multitable @columnfractions .25 .25 .2 .2
358 @headitem Authentication method @tab Key exchange @tab Client credentials @tab Server credentials
360 @item Certificate
361 @tab @code{KX_RSA},
362 @code{KX_DHE_RSA},
363 @code{KX_DHE_DSS},
364 @code{KX_ECDHE_RSA},
365 @code{KX_ECDHE_ECDSA},
366 @code{KX_RSA_EXPORT}
367 @tab @code{CRD_CERTIFICATE}
368 @tab @code{CRD_CERTIFICATE}
370 @item Password and certificate
371 @tab @code{KX_SRP_RSA}, @code{KX_SRP_DSS}
372 @tab @code{CRD_SRP}
373 @tab @code{CRD_CERTIFICATE}, @code{CRD_SRP}
375 @item Password
376 @tab @code{KX_SRP}
377 @tab @code{CRD_SRP}
378 @tab @code{CRD_SRP}
380 @item Anonymous
381 @tab @code{KX_ANON_DH},
382 @code{KX_ANON_ECDH}
383 @tab @code{CRD_ANON}
384 @tab @code{CRD_ANON}
386 @item Pre-shared key
387 @tab @code{KX_PSK},
388 @code{KX_DHE_PSK}, @code{KX_ECDHE_PSK}
389 @tab @code{CRD_PSK}
390 @tab @code{CRD_PSK}
392 @end multitable
393 @caption{Key exchange algorithms and the corresponding credential types.}
394 @end float
396 @node Certificate credentials
397 @subsection Certificates
398 @subsubheading Server certificate authentication
400 When using certificates the server is required to have at least one
401 certificate and private key pair. Clients may not hold such
402 a pair, but a server could require it. In this section we discuss
403 general issues applying to both client and server certificates. The next
404 section will elaborate on issues arising from client authentication only.
406 @showfuncB{gnutls_certificate_allocate_credentials,gnutls_certificate_free_credentials}
408 After the credentials structures are initialized, the certificate 
409 and key pair must be loaded. This occurs before any @acronym{TLS} 
410 session is initialized, and the same structures are reused for multiple sessions.
411 Depending on the certificate type different loading functions
412 are available, as shown below.
413 For @acronym{X.509} certificates, the functions will
414 accept and use a certificate chain that leads to a trusted
415 authority. The certificate chain must be ordered in such way that every
416 certificate certifies the one before it. The trusted authority's
417 certificate need not to be included since the peer should possess it
418 already.
420 @showfuncC{gnutls_certificate_set_x509_key_mem,gnutls_certificate_set_x509_key,gnutls_certificate_set_x509_key_file}
422 @showfuncC{gnutls_certificate_set_openpgp_key_mem,gnutls_certificate_set_openpgp_key,gnutls_certificate_set_openpgp_key_file}
424 Note however, that since functions like @funcref{gnutls_certificate_set_x509_key_file}
425 may accept URLs that specify objects stored in token, another important 
426 function is @funcref{gnutls_certificate_set_pin_function}. That
427 allows setting a callback function to retrieve a PIN if the input keys are
428 protected by PIN by the token.
430 @showfuncdesc{gnutls_certificate_set_pin_function}
432 If the imported keys and certificates need to be accessed before any TLS session
433 is established, it is convenient to use @funcref{gnutls_certificate_set_key}
434 in combination with @funcref{gnutls_pcert_import_x509_raw} and @funcref{gnutls_privkey_import_x509_raw}.
436 @showfuncdesc{gnutls_certificate_set_key}
438 If multiple certificates are used with the functions above each
439 client's request will be served with the certificate that matches the
440 requested name (see @ref{Server name indication}).
442 As an alternative to loading from files or buffers, a callback may be used for the 
443 server or the client to specify the certificate and the key at the handshake time.
444 In that case a certificate should be selected according the peer's signature
445 algorithm preferences. To get those preferences use
446 @funcref{gnutls_sign_algorithm_get_requested}. Both functions are shown below.
448 @showfuncC{gnutls_certificate_set_retrieve_function,gnutls_certificate_set_retrieve_function2,gnutls_sign_algorithm_get_requested}
450 The functions above do not handle the requested server name automatically.
451 A server would need to check the name requested by the client
452 using @funcref{gnutls_server_name_get}, and serve the appropriate
453 certificate. Note that some of these functions require the @code{gnutls_pcert_st} structure to be
454 filled in. Helper functions to make the required structures are listed below.
456 @verbatim
457 typedef struct gnutls_pcert_st
459   gnutls_pubkey_t pubkey;
460   gnutls_datum_t cert;
461   gnutls_certificate_type_t type;
462 } gnutls_pcert_st;
463 @end verbatim
465 @showfuncE{gnutls_pcert_import_x509,gnutls_pcert_import_openpgp,gnutls_pcert_import_x509_raw,gnutls_pcert_import_openpgp_raw,gnutls_pcert_deinit}
467 In a handshake, the negotiated cipher suite depends on the
468 certificate's parameters, so some key exchange methods might not be
469 available with all certificates. @acronym{GnuTLS} will disable
470 ciphersuites that are not compatible with the key, or the enabled
471 authentication methods.  For example keys marked as sign-only, will
472 not be able to access the plain RSA ciphersuites, that require
473 decryption. It is not recommended to use RSA keys for both
474 signing and encryption. If possible use a different key for the
475 @code{DHE-RSA} which uses signing and @code{RSA} that requires decryption.
476 All the key exchange methods shown in @ref{tab:key-exchange} are
477 available in certificate authentication.
480 @subsubheading Client certificate authentication
482 If a certificate is to be requested from the client during the handshake, the server
483 will send a certificate request message. This behavior is controlled @funcref{gnutls_certificate_server_set_request}.
484 The request contains a list of the acceptable by the server certificate signers. This list
485 is constructed using the trusted certificate authorities of the server.
486 In cases where the server supports a large number of certificate authorities
487 it makes sense not to advertise all of the names to save bandwidth. That can
488 be controlled using the function @funcref{gnutls_certificate_send_x509_rdn_sequence}. 
489 This however will have the side-effect of not restricting the client to certificates
490 signed by server's acceptable signers.
492 @showfuncdesc{gnutls_certificate_server_set_request}
494 @showfuncdesc{gnutls_certificate_send_x509_rdn_sequence}
497 @subsubheading Client or server certificate verification
499 Certificate verification is possible by loading the trusted
500 authorities into the credentials structure by using
501 the following functions, applicable to X.509 and OpenPGP certificates.
503 @showfuncC{gnutls_certificate_set_x509_system_trust,gnutls_certificate_set_x509_trust_file,gnutls_certificate_set_openpgp_keyring_file}
505 The peer's certificate is not automatically verified and one 
506 must call @funcref{gnutls_certificate_verify_peers3}
507 after a successful handshake to verify the certificate's signature and the owner 
508 of the certificate. The verification status returned can be printed using
509 @funcref{gnutls_certificate_verification_status_print}.
511 Alternatively the verification can occur during the handshake
512 by using @funcref{gnutls_certificate_set_verify_function}.
514 The functions above provide a brief verification output. If a
515 detailed output is required one should call @funcref{gnutls_certificate_get_peers}
516 to obtain the raw certificate of the peer and verify it using the
517 functions discussed in @ref{X.509 certificates}.
519 @showfuncdesc{gnutls_certificate_verify_peers3}
521 @showfuncdesc{gnutls_certificate_set_verify_function}
524 @node SRP credentials
525 @subsection SRP
527 The initialization functions in SRP credentials differ between
528 client and server.
529 Clients supporting @acronym{SRP} should set the username and password
530 prior to connection, to the credentials structure.
531 Alternatively @funcref{gnutls_srp_set_client_credentials_function}
532 may be used instead, to specify a callback function that should return the
533 SRP username and password.
534 The callback is called once during the @acronym{TLS} handshake.
536 @showfuncE{gnutls_srp_allocate_server_credentials,gnutls_srp_allocate_client_credentials,gnutls_srp_free_server_credentials,gnutls_srp_free_client_credentials,gnutls_srp_set_client_credentials}
538 @showfuncdesc{gnutls_srp_set_client_credentials_function}
540 In server side the default behavior of @acronym{GnuTLS} is to read
541 the usernames and @acronym{SRP} verifiers from password files. These
542 password file format is compatible the with the @emph{Stanford srp libraries}
543 format.  If a different password file format is to be used, then 
544 @funcref{gnutls_srp_set_server_credentials_function} should be called,
545 to set an appropriate callback. 
547 @showfuncdesc{gnutls_srp_set_server_credentials_file}
549 @showfuncdesc{gnutls_srp_set_server_credentials_function}
552 @node PSK credentials
553 @subsection PSK
554 The initialization functions in PSK credentials differ between
555 client and server.
557 @showfuncD{gnutls_psk_allocate_server_credentials,gnutls_psk_allocate_client_credentials,gnutls_psk_free_server_credentials,gnutls_psk_free_client_credentials}
559 Clients supporting @acronym{PSK} should supply the username and key
560 before a TLS session is established.  Alternatively 
561 @funcref{gnutls_psk_set_client_credentials_function} can be used to
562 specify a callback function. This has the
563 advantage that the callback will be called only if @acronym{PSK} has
564 been negotiated.
566 @showfuncA{gnutls_psk_set_client_credentials}
568 @showfuncdesc{gnutls_psk_set_client_credentials_function}
570 In server side the default behavior of @acronym{GnuTLS} is to read
571 the usernames and @acronym{PSK} keys from a password file. The
572 password file should contain usernames and keys in hexadecimal
573 format. The name of the password file can be stored to the credentials
574 structure by calling @funcref{gnutls_psk_set_server_credentials_file}.  If
575 a different password file format is to be used, then
576 a callback should be set instead by @funcref{gnutls_psk_set_server_credentials_function}.
578 The server can help the client chose a suitable username and password,
579 by sending a hint. Note that there is no common profile for the PSK hint and applications
580 are discouraged to use it.
581 A server, may specify the hint by calling
582 @funcref{gnutls_psk_set_server_credentials_hint}.  The client can retrieve
583 the hint, for example in the callback function, using
584 @funcref{gnutls_psk_client_get_hint}.
586 @showfuncdesc{gnutls_psk_set_server_credentials_file}
588 @showfuncC{gnutls_psk_set_server_credentials_function,gnutls_psk_set_server_credentials_hint,gnutls_psk_client_get_hint}
590 @node Anonymous credentials
591 @subsection Anonymous
592 The key exchange methods for anonymous authentication
593 might require Diffie-Hellman parameters to be generated by the server and
594 associated with an anonymous credentials structure. Check
595 @ref{Parameter generation} for more information.
596 The initialization functions for the credentials are shown below.
598 @showfuncD{gnutls_anon_allocate_server_credentials,gnutls_anon_allocate_client_credentials,gnutls_anon_free_server_credentials,gnutls_anon_free_client_credentials}
602 @node Setting up the transport layer
603 @section Setting up the transport layer
605 The next step is to setup the underlying transport layer details. The
606 Berkeley sockets are implicitly used by GnuTLS, thus a
607 call to @funcref{gnutls_transport_set_ptr2} would be sufficient to
608 specify the socket descriptor.
610 @showfuncdesc{gnutls_transport_set_ptr2}
612 @showfuncA{gnutls_transport_set_ptr}
614 If however another transport layer than TCP is selected, then
615 the following functions have to be specified.
617 @showfuncdesc{gnutls_transport_set_push_function}
618 @showfuncdesc{gnutls_transport_set_vec_push_function}
619 @showfuncdesc{gnutls_transport_set_pull_function}
621 The functions above accept a callback function which
622 should return the number of bytes written, or -1 on
623 error and should set @code{errno} appropriately.
624 In some environments, setting @code{errno} is unreliable. For example
625 Windows have several errno variables in different CRTs, or in other
626 systems it may be a non thread-local variable.  If this is a concern to
627 you, call @funcref{gnutls_transport_set_errno} with the intended errno
628 value instead of setting @code{errno} directly.
630 @showfuncdesc{gnutls_transport_set_errno}
632 @acronym{GnuTLS} currently only interprets the EINTR, EAGAIN and EMSGSIZE errno
633 values and returns the corresponding @acronym{GnuTLS} error codes:
634 @itemize
635 @item @code{GNUTLS_E_INTERRUPTED} 
636 @item @code{GNUTLS_E_AGAIN}
637 @item @code{GNUTLS_E_LARGE_PACKET}
638 @end itemize
639 The EINTR and EAGAIN values are returned by interrupted system calls, 
640 or when non blocking IO is used.  All @acronym{GnuTLS} functions can be 
641 resumed (called again), if any of the above error codes is returned. The
642 EMSGSIZE value is returned when attempting to send a large datagram.
644 In the case of DTLS it is also desirable to override the generic 
645 transport functions with functions that emulate the operation
646 of @code{recvfrom} and @code{sendto}. In addition
647 @acronym{DTLS} requires timers during the receive of a handshake
648 message, set using the @funcref{gnutls_transport_set_pull_timeout_function} 
649 function. To check the retransmission timers the function
650 @funcref{gnutls_dtls_get_timeout} is provided, which returns the time
651 remaining until the next retransmission, or better the time until 
652 @funcref{gnutls_handshake} should be called again.
654 @showfuncdesc{gnutls_transport_set_pull_timeout_function}
655 @showfuncdesc{gnutls_dtls_get_timeout}
657 @menu
658 * Asynchronous operation::
659 * DTLS sessions::
660 @end menu
662 @node Asynchronous operation
663 @subsection Asynchronous operation
664 @acronym{GnuTLS} can be used with asynchronous socket or event-driven programming.
665 The approach is similar to using Berkeley sockets under such an environment.
666 The blocking, due to network interaction, calls such as
667 @funcref{gnutls_handshake}, @funcref{gnutls_record_recv},
668 can be set to non-blocking by setting the underlying sockets to non-blocking.
669 If other push and pull functions are setup, then they should behave the same
670 way as @funcintref{recv} and @funcintref{send} when used in a non-blocking
671 way, i.e., set errno to @code{EAGAIN}. Since, during a TLS protocol session 
672 @acronym{GnuTLS} does not block except for network interaction, the non blocking
673 @code{EAGAIN} errno will be propagated and @acronym{GnuTLS} functions 
674 will return the @code{GNUTLS_E_AGAIN} error code. Such calls can be resumed the 
675 same way as a system call would. 
676 The only exception is @funcref{gnutls_record_send},
677 which if interrupted subsequent calls need not to include the data to be
678 sent (can be called with NULL argument).
680 The @funcintref{select} system call can also be used in combination with the
681 @acronym{GnuTLS} functions. @funcintref{select} allows monitoring of sockets
682 and notifies on them being ready for reading or writing data. Note however
683 that this system call cannot notify on data present in @acronym{GnuTLS}
684 read buffers, it is only applicable to the kernel sockets API. Thus if
685 you are using it for reading from a @acronym{GnuTLS} session, make sure
686 that any cached data are read completely. That can be achieved by checking there 
687 are no data waiting to be read (using @funcref{gnutls_record_check_pending}), 
688 either before the @funcintref{select} system call, or after a call to
689 @funcref{gnutls_record_recv}. @acronym{GnuTLS} does not keep a write buffer,
690 thus when writing no additional actions are required.
692 Although in the TLS protocol implementation each call to receive or send
693 function implies to restoring the same function that was interrupted, in
694 the DTLS protocol this requirement isn't true.
695 There are cases where a retransmission is required, which are indicated by
696 a received message and thus @funcref{gnutls_record_get_direction} must be called 
697 to decide which direction to check prior to restoring a function call.
698 @showfuncdesc{gnutls_record_get_direction}
700 Moreover, to prevent blocking from DTLS' retransmission timers to block a
701 handshake, the @funcref{gnutls_init} function should be called with the
702 @code{GNUTLS_NONBLOCK} flag set (see @ref{Session initialization}).
705 @node DTLS sessions
706 @subsection DTLS sessions
708 Because datagram TLS can operate over connections where the peer
709 of a server cannot be reliably verified, functionality is available to prevent
710 denial of service attacks. @acronym{GnuTLS} requires a server
711 to generate a secret key that is used to sign a cookie@footnote{A key of 128 bits or 16 bytes should be sufficient for this purpose.}. 
712 That cookie is sent to the client using @funcref{gnutls_dtls_cookie_send}, and 
713 the client must reply using the correct cookie. The server side
714 should verify the initial message sent by client using @funcref{gnutls_dtls_cookie_verify}.
715 If successful the session should be initialized and associated with
716 the cookie using @funcref{gnutls_dtls_prestate_set}, before proceeding to
717 the handshake.
719 @showfuncD{gnutls_key_generate,gnutls_dtls_cookie_send,gnutls_dtls_cookie_verify,gnutls_dtls_prestate_set}
721 Note that the above apply to server side only and they are not mandatory to be
722 used. Not using them, however, allows denial of service attacks.
723 The client side cookie handling is part of @funcref{gnutls_handshake}. 
725 Datagrams are typically restricted by a maximum transfer unit (MTU). For that
726 both client and server side should set the correct maximum transfer unit for
727 the layer underneath @acronym{GnuTLS}. This will allow proper fragmentation
728 of DTLS messages and prevent messages from being silently discarded by the
729 transport layer. The ``correct'' maximum transfer unit can be obtained through
730 a path MTU discovery mechanism @xcite{RFC4821}.
732 @showfuncC{gnutls_dtls_set_mtu,gnutls_dtls_get_mtu,gnutls_dtls_get_data_mtu}
735 @node TLS handshake
736 @section TLS handshake
737 Once a session has been initialized and a network
738 connection has been set up, TLS and DTLS protocols
739 perform a handshake. The handshake is the actual key
740 exchange.
742 @showfuncdesc{gnutls_handshake}
744 @showfuncdesc{gnutls_handshake_set_timeout}
746 The handshake process doesn't ensure the verification
747 of the peer's identity. When certificates are in use,
748 this can be done, either after the handshake is complete, or during 
749 the handshake if @funcref{gnutls_certificate_set_verify_function}
750 has been used. In both cases the @funcref{gnutls_certificate_verify_peers2} function can be
751 used to verify the peer's certificate (see @ref{Certificate authentication}
752 for more information).
754 @showfuncA{gnutls_certificate_verify_peers2}
756 @node Data transfer and termination
757 @section Data transfer and termination
758 Once the handshake is complete and peer's identity
759 has been verified data can be exchanged. The available
760 functions resemble the POSIX @code{recv} and @code{send}
761 functions. It is suggested to use @funcref{gnutls_error_is_fatal}
762 to check whether the error codes returned by these functions are
763 fatal for the protocol or can be ignored.
765 @showfuncdesc{gnutls_record_send}
767 @showfuncdesc{gnutls_record_recv}
769 @showfuncdesc{gnutls_error_is_fatal}
771 Although, in the TLS protocol the receive function can be called
772 at any time, when DTLS is used the GnuTLS receive functions must be
773 called once a message is available for reading, even if no data are
774 expected. This is because in DTLS various (internal) actions
775 may be required due to retransmission timers. Moreover,
776 an extended receive function is shown below, which allows the extraction
777 of the message's sequence number. Due to the unreliable nature of the
778 protocol, this field allows distinguishing out-of-order messages.
780 @showfuncdesc{gnutls_record_recv_seq}
782 The @funcref{gnutls_record_check_pending} helper function is available to 
783 allow checking whether data are available to be read in a @acronym{GnuTLS} session 
784 buffers. Note that this function complements but does not replace @funcintref{select},
785 i.e., @funcref{gnutls_record_check_pending} reports no data to be read, @funcintref{select}
786 should be called to check for data in the network buffers.
788 @showfuncdesc{gnutls_record_check_pending}
789 @showfuncA{gnutls_record_get_direction}
791 Once a TLS or DTLS session is no longer needed, it is
792 recommended to use @funcref{gnutls_bye} to terminate the
793 session. That way the peer is notified securely about the
794 intention of termination, which allows distinguishing it
795 from a malicious connection termination.
796 A session can be deinitialized with the @funcref{gnutls_deinit} function.
798 @showfuncdesc{gnutls_bye}
799 @showfuncdesc{gnutls_deinit}
801 @node Handling alerts
802 @section Handling alerts
803 During a TLS connection alert messages may be exchanged by the
804 two peers. Those messages may be fatal, meaning the connection
805 must be terminated afterwards, or warning when something needs
806 to be reported to the peer, but without interrupting the session.
807 The error codes @code{GNUTLS_E_@-WARNING_@-ALERT_@-RECEIVED}
808 or @code{GNUTLS_E_@-FATAL_@-ALERT_@-RECEIVED} signal those alerts
809 when received, and may be returned by all GnuTLS functions that receive 
810 data from the peer, being @funcref{gnutls_handshake} and @funcref{gnutls_record_recv}.
812 If those error codes are received the alert and its level should be logged
813 or reported to the peer using the functions below.
815 @showfuncdesc{gnutls_alert_get}
816 @showfuncdesc{gnutls_alert_get_name}
818 The peer may also be warned or notified of a fatal issue
819 by using one of the functions below. All the available alerts
820 are listed in @ref{The Alert Protocol}.
822 @showfuncdesc{gnutls_alert_send}
823 @showfuncdesc{gnutls_error_to_alert}
826 @node Priority Strings
827 @section Priority strings
828 @cindex Priority strings
830 In order to specify cipher suite preferences on a TLS session
831 there are priority functions that accept a string
832 specifying the enabled for the handshake algorithms.
833 That string may contain a single initial keyword such as
834 in @ref{tab:prio-keywords} and may be followed by
835 additional algorithm or special keywords.
837 @showfuncB{gnutls_priority_set_direct,gnutls_priority_set}
839 @float Table,tab:prio-keywords
840 @multitable @columnfractions .20 .70
841 @headitem Keyword @tab Description
842 @item PERFORMANCE @tab
843 All the known to be secure ciphersuites are enabled,
844 limited to 128 bit ciphers and sorted by terms of speed
845 performance. The message authenticity security level is of 64 bits or more.
847 @item NORMAL @tab
848 Means all the known to be secure ciphersuites. The ciphers are sorted by security
849 margin, although the 256-bit ciphers are included as a fallback only.
850 The message authenticity security level is of 64 bits or more.
852 @item SECURE128 @tab
853 Means all known to be secure ciphersuites that offer a 
854 security level 128-bit or more and a message authenticity
855 security level of 80 bits or more.
857 @item SECURE192 @tab
858 Means all the known to be secure ciphersuites that offer a 
859 security level 192-bit or more and a message authenticity
860 security level of 128 bits or more.
862 @item SECURE256 @tab
863 Currently alias for SECURE192.
865 @item SUITEB128 @tab
866 Means all the NSA Suite B cryptography (RFC5430) ciphersuites
867 with an 128 bit security level.
869 @item SUITEB192 @tab
870 Means all the NSA Suite B cryptography (RFC5430) ciphersuites
871 with an 192 bit security level.
873 @item EXPORT @tab
874 Means all ciphersuites are enabled, including the
875 low-security 40 bit ciphers.
877 @item NONE @tab
878 Means nothing is enabled.  This disables even protocols and
879 compression methods. It should be followed by the
880 algorithms to be enabled.
882 @end multitable
883 @caption{Supported initial keywords.}
884 @end float
886 Unless the initial keyword is "NONE" the defaults (in preference
887 order) are for TLS protocols TLS 1.2, TLS1.1, TLS1.0, SSL3.0; for
888 compression NULL; for certificate types X.509.
889 In key exchange algorithms when in NORMAL or SECURE levels the
890 perfect forward secrecy algorithms take precedence of the other
891 protocols.  In all cases all the supported key exchange algorithms
892 are enabled@footnote{Except for the RSA-EXPORT which is only enabled in
893 EXPORT level.}.
895 Note that the SECURE levels distinguish between overall security level and
896 message authenticity security level. That is because the message
897 authenticity security level requires the adversary to break
898 the algorithms at real-time during the protocol run, whilst 
899 the overall security level refers to off-line adversaries 
900 (e.g. adversaries breaking the ciphertext years after it was captured).
902 The NONE keyword, if used, must followed by keywords specifying 
903 the algorithms and protocols to be enabled. The other initial keywords 
904 do not require, but may be followed by such keywords. All level keywords
905 can be combined, and for example a level of "SECURE256:+SECURE128" is
906 allowed.
908 The order with which every algorithm or protocol
909 is specified is significant. Algorithms specified before others
910 will take precedence. The supported algorithms and protocols
911 are shown in @ref{tab:prio-algorithms}. 
912 To avoid collisions in order to specify a compression algorithm in
913 the priority string you have to prefix it with "COMP-", protocol versions
914 with "VERS-", signature algorithms with "SIGN-" and certificate types with "CTYPE-". 
915 All other algorithms don't need a prefix. Each specified keyword can
916 be prefixed with any of the following characters.
918 @table @asis
919 @item '!' or '-' 
920 appended with an algorithm will remove this algorithm.
921 @item "+" 
922 appended with an algorithm will add this algorithm.
923 @end table
925 @float Table,tab:prio-algorithms
926 @multitable @columnfractions .20 .70
927 @headitem Type @tab Keywords
928 @item Ciphers @tab
929 AES-128-CBC, AES-256-CBC, AES-128-GCM, CAMELLIA-128-CBC,
930 CAMELLIA-256-CBC, ARCFOUR-128, 3DES-CBC ARCFOUR-40. Catch all
931 name is CIPHER-ALL which will add all the algorithms from NORMAL
932 priority.
934 @item Key exchange @tab
935 RSA, DHE-RSA, DHE-DSS, SRP, SRP-RSA, SRP-DSS,
936 PSK, DHE-PSK, ECDHE-RSA, ANON-ECDH, ANON-DH, RSA-EXPORT. The
937 Catch all name is KX-ALL which will add all the algorithms from NORMAL
938 priority.
940 @item MAC @tab
941 MD5, SHA1, SHA256, AEAD (used with
942 GCM ciphers only). All algorithms from NORMAL priority can be accessed with MAC-ALL.
944 @item Compression algorithms @tab
945 COMP-NULL, COMP-DEFLATE. Catch all is COMP-ALL.
947 @item TLS versions @tab
948 VERS-SSL3.0, VERS-TLS1.0, VERS-TLS1.1,
949 VERS-TLS1.2, VERS-DTLS1.0. Catch all is VERS-TLS-ALL.
951 @item Signature algorithms @tab
952 SIGN-RSA-SHA1, SIGN-RSA-SHA224, 
953 SIGN-RSA-SHA256, SIGN-RSA-SHA384, SIGN-RSA-SHA512, SIGN-DSA-SHA1, 
954 SIGN-DSA-SHA224, SIGN-DSA-SHA256, SIGN-RSA-MD5. Catch all
955 is SIGN-ALL. This is only valid for TLS 1.2 and later.
957 @item Elliptic curves @tab
958 CURVE-SECP192R1, CURVE-SECP224R1, CURVE-SECP256R1, CURVE-SECP384R1, CURVE-SECP521R1. Catch all is CURVE-ALL.
960 @end multitable
961 @caption{The supported algorithm keywords in priority strings.}
962 @end float
964 Note that the DHE key exchange methods are generally
965 slower@footnote{It depends on the group used.  Primes with
966 lesser bits are always faster, but also easier to break.  See @ref{Selecting cryptographic key sizes}
967 for the acceptable security levels.} than their elliptic curves counterpart
968 (ECDHE). Moreover the plain Diffie-Hellman key exchange
969 requires parameters to be generated and associated with a credentials
970 structure by the server (see @ref{Parameter generation}). 
972 The available special keywords are shown in @ref{tab:prio-special1}
973 and @ref{tab:prio-special2}. 
975 @float Table,tab:prio-special1
976 @multitable @columnfractions .45 .45
977 @headitem Keyword @tab Description
979 @item %COMPAT @tab
980 will enable compatibility mode. It might mean that violations
981 of the protocols are allowed as long as maximum compatibility with
982 problematic clients and servers is achieved. More specifically this
983 string would disable TLS record random padding and tolerate packets
984 over the maximum allowed TLS record.
986 @item %NO_EXTENSIONS @tab
987 will prevent the sending of any TLS extensions in client side. Note
988 that TLS 1.2 requires extensions to be used, as well as safe
989 renegotiation thus this option must be used with care.
991 @item %SERVER_PRECEDENCE @tab
992 The ciphersuite will be selected according to server priorities
993 and not the client's.
995 @item %SSL3_RECORD_VERSION @tab
996 will use SSL3.0 record version in client hello.
997 This is the default.
999 @item %LATEST_RECORD_VERSION @tab
1000 will use the latest TLS version record version in client hello.
1002 @end multitable
1003 @caption{Special priority string keywords.}
1004 @end float
1006 @float Table,tab:prio-special2
1007 @multitable @columnfractions .45 .45
1008 @headitem Keyword @tab Description
1010 @item %STATELESS_COMPRESSION @tab
1011 will disable keeping state across records when compressing. This may
1012 help to mitigate attacks when compression is used but an attacker
1013 is in control of input data. This has to be used only when the
1014 data that are possibly controlled by an attacker are placed in
1015 separate records.
1017 @item %DISABLE_SAFE_RENEGOTIATION @tab
1018 will completely disable safe renegotiation
1019 completely.  Do not use unless you know what you are doing.
1021 @item %UNSAFE_RENEGOTIATION @tab
1022 will allow handshakes and re-handshakes
1023 without the safe renegotiation extension.  Note that for clients
1024 this mode is insecure (you may be under attack), and for servers it
1025 will allow insecure clients to connect (which could be fooled by an
1026 attacker).  Do not use unless you know what you are doing and want
1027 maximum compatibility.
1029 @item %PARTIAL_RENEGOTIATION @tab
1030 will allow initial handshakes to proceed,
1031 but not re-handshakes.  This leaves the client vulnerable to attack,
1032 and servers will be compatible with non-upgraded clients for
1033 initial handshakes.  This is currently the default for clients and
1034 servers, for compatibility reasons.
1036 @item %SAFE_RENEGOTIATION @tab
1037 will enforce safe renegotiation.  Clients and
1038 servers will refuse to talk to an insecure peer.  Currently this
1039 causes interoperability problems, but is required for full protection.
1041 @item %VERIFY_ALLOW_SIGN_RSA_MD5 @tab
1042 will allow RSA-MD5 signatures in certificate chains.
1044 @item %VERIFY_DISABLE_CRL_CHECKS @tab
1045 will disable CRL or OCSP checks in the verification of the certificate chain.
1047 @item %VERIFY_ALLOW_X509_V1_CA_CRT @tab
1048 will allow V1 CAs in chains.
1050 @end multitable
1051 @caption{More priority string keywords.}
1052 @end float
1054 Finally the ciphersuites enabled by any priority string can be
1055 listed using the @code{gnutls-cli} application (see @ref{gnutls-cli Invocation}), 
1056 or by using the priority functions as in @ref{Listing the ciphersuites in a priority string}.
1058 Example priority strings are:
1059 @example
1060 The default priority without the HMAC-MD5:
1061     "NORMAL:-MD5"
1063 Specifying RSA with AES-128-CBC:
1064     "NONE:+VERS-TLS-ALL:+MAC-ALL:+RSA:+AES-128-CBC:+SIGN-ALL:+COMP-NULL"
1066 Specifying the defaults except ARCFOUR-128:
1067     "NORMAL:-ARCFOUR-128"
1069 Enabling the 128-bit secure ciphers, while disabling SSL 3.0 and enabling compression:
1070     "SECURE128:-VERS-SSL3.0:+COMP-DEFLATE"
1072 Enabling the 128-bit and 192-bit secure ciphers, while disabling all TLS versions 
1073 except TLS 1.2:
1074     "SECURE128:+SECURE192:-VERS-TLS-ALL:+VERS-TLS1.2"
1075 @end example
1077 @node Advanced topics
1078 @section Advanced topics
1080 @menu
1081 * Session resumption::
1082 * Certificate verification::
1083 * Parameter generation::
1084 * Keying Material Exporters::
1085 * Channel Bindings::
1086 * Interoperability::
1087 * Compatibility with the OpenSSL library::
1088 @end menu
1090 @node Session resumption
1091 @subsection Session resumption
1092 @cindex resuming sessions
1093 @cindex session resumption
1095 @subsubheading Client side
1097 To reduce time and roundtrips spent in a handshake the client can   
1098 request session resumption from a server that previously shared
1099 a session with. For that the client has to retrieve and store
1100 the session parameters. Before establishing a new session to the same 
1101 server the parameters must be re-associated with the GnuTLS session
1102 using @funcref{gnutls_session_set_data}.
1104 @showfuncC{gnutls_session_get_data2,gnutls_session_get_id2,gnutls_session_set_data}
1106 Keep in mind that sessions will be expired after some time, depending
1107 on the server, and a server may choose not to resume a session
1108 even when requested to.  The expiration is to prevent temporal session keys
1109 from becoming long-term keys. Also note that as a client you must enable, 
1110 using the priority functions, at least the algorithms used in the last session.
1112 @showfuncdesc{gnutls_session_is_resumed}
1114 @subsubheading Server side
1116 In order to support resumption a server can store
1117 the session security parameters in a local database or by using session
1118 tickets (see @ref{Session tickets}) to delegate storage to the client. Because
1119 session tickets might not be supported by all clients, servers
1120 could combine the two methods.
1122 A storing server needs to specify callback functions to store, retrieve and delete session data. These can be
1123 registered with the functions below. The stored sessions in the database can be checked using @funcref{gnutls_db_check_entry}
1124 for expiration.
1126 @showfuncD{gnutls_db_set_retrieve_function,gnutls_db_set_store_function,gnutls_db_set_ptr,gnutls_db_set_remove_function}
1127 @showfuncA{gnutls_db_check_entry}
1129 A server utilizing tickets should generate ticket encryption
1130 and authentication keys using @funcref{gnutls_session_ticket_key_generate}.
1131 Those keys should be associated with the GnuTLS session using
1132 @funcref{gnutls_session_ticket_enable_server}.
1134 @showfuncdesc{gnutls_session_ticket_enable_server}
1135 @showfuncdesc{gnutls_session_ticket_key_generate}
1136 @showfuncdesc{gnutls_session_resumption_requested}
1138 A server enabling both session tickets and a storage for session data
1139 would use session tickets when clients support it and the storage otherwise.
1141 @node Certificate verification
1142 @subsection Certificate verification
1143 @cindex DANE
1144 @cindex DNSSEC
1145 @cindex SSH-style authentication
1146 @cindex Trust on first use
1147 @cindex Key pinning
1148 @tindex gnutls_certificate_verify_flags
1150 In this section the functionality for additional certificate verification methods is listed. 
1151 These methods are intended to be used in addition to normal PKI verification, in order to reduce 
1152 the risk of a compromised CA being undetected.
1154 @subsubsection Trust on first use
1156 The GnuTLS library includes functionlity to use an SSH-like trust on first use authentication.
1157 The available functions to store and verify public keys are listed below.
1159 @showfuncdesc{gnutls_verify_stored_pubkey}
1160 @showfuncdesc{gnutls_store_pubkey}
1162 In addition to the above the @funcref{gnutls_store_commitment} can be 
1163 used to implement a key-pinning architecture as in @xcite{KEYPIN}. 
1164 This provides a way for web server to commit on a public key that is
1165 not yet active.
1167 @showfuncdesc{gnutls_store_commitment}
1169 The storage and verification functions may be used with the default
1170 text file based back-end, or another back-end may be specified. That
1171 should contain storage and retrieval functions and specified as below.
1173 @showfuncE{gnutls_tdb_init,gnutls_tdb_deinit,gnutls_tdb_set_verify_func,gnutls_tdb_set_store_func,gnutls_tdb_set_store_commitment_func}
1175 @subsubsection DANE verification
1176 Since the DANE library is not included in GnuTLS it requires programs
1177 to be linked against it. This can be achieved with the following commands.
1179 @example
1180 gcc -o foo foo.c `pkg-config gnutls-dane --cflags --libs`
1181 @end example
1183 When a program uses the GNU autoconf system, then the following
1184 line or similar can be used to detect the presence of the library.
1186 @example
1187 PKG_CHECK_MODULES([LIBDANE], [gnutls-dane >= 3.0.0])
1189 AC_SUBST([LIBDANE_CFLAGS])
1190 AC_SUBST([LIBDANE_LIBS])
1191 @end example
1193 The high level functionality provided by the DANE library is shown below.
1195 @showfuncdesc{dane_verify_crt}
1197 @showfuncB{dane_verify_session_crt,dane_strerror}
1199 Note that the @code{dane_state_t} structure that is accepted by both
1200 verification functions is optional. It is required when many queries
1201 are performed to facilitate caching.
1202 The following flags are returned by the verify functions to
1203 indicate the status of the verification.
1205 @showenumdesc{dane_verify_status_t,The DANE verification status flags.}
1207 In order to generate a DANE TLSA entry to use in a DNS server 
1208 you may use danetool (see @ref{danetool Invocation}).
1212 @node Parameter generation
1213 @subsection Parameter generation
1214 @cindex parameter generation
1215 @cindex generating parameters
1217 Several TLS ciphersuites require additional parameters that
1218 need to be generated or provided by the application. The
1219 Diffie-Hellman based ciphersuites (ANON-DH or DHE), require
1220 the group parameters to be provided. Those can either be
1221 be generated on the fly using @funcref{gnutls_dh_params_generate2}
1222 or imported from pregenerated data using @funcref{gnutls_dh_params_import_pkcs3}.
1223 The parameters can be used in a @acronym{TLS} session by calling
1224 @funcref{gnutls_certificate_set_dh_params} or
1225 @funcref{gnutls_anon_set_server_dh_params} for anonymous sessions.
1227 @showfuncD{gnutls_dh_params_generate2,gnutls_dh_params_import_pkcs3,gnutls_certificate_set_dh_params,gnutls_anon_set_server_dh_params}
1229 Due to the time-consuming calculations required for the generation
1230 of Diffie-Hellman parameters we suggest against performing generation
1231 of them within an application. The @code{certtool} tool can be used to 
1232 generate or export known safe values that can be stored in code
1233 or in a configuration file to provide the ability to replace. We also
1234 recommend the usage of @funcref{gnutls_sec_param_to_pk_bits} 
1235 (see @ref{Selecting cryptographic key sizes}) to determine
1236 the bit size of the generated parameters.
1238 Note that the information stored in the generated PKCS #3 structure
1239 changed with GnuTLS 3.0.9. Since that version the @code{privateValueLength}
1240 member of the structure is set, allowing the server utilizing the
1241 parameters to use keys of the size of the security parameter. This
1242 provides better performance in key exchange.
1244 The ciphersuites that involve the RSA-EXPORT key exchange require
1245 additional parameters. Those ciphersuites are rarely used today
1246 because they are by design insecure, thus if you have no requirement
1247 for them, the rest of this section can be skipped. The RSA-EXPORT key exchange
1248 requires 512-bit RSA keys to be generated. It is recommended those
1249 parameters to be refreshed (regenerated) in short intervals. The
1250 following functions can be used for these parameters.
1252 @showfuncD{gnutls_rsa_params_generate2,gnutls_certificate_set_rsa_export_params,gnutls_rsa_params_import_pkcs1,gnutls_rsa_params_export_pkcs1}
1254 To allow renewal of the parameters within an application without
1255 accessing the credentials, which are a shared structure,
1256 an alternative interface is available using a callback function.  
1258 @showfuncdesc{gnutls_certificate_set_params_function}
1261 @node Keying Material Exporters
1262 @subsection Keying material exporters
1263 @cindex keying material exporters
1264 @cindex exporting keying material
1266 The TLS PRF can be used by other protocols to derive keys based on
1267 the TLS master secret.  The API to use is @funcref{gnutls_prf}.  The 
1268 function needs to be provided with the label in the parameter 
1269 @code{label}, and the extra data to mix in the
1270 @code{extra} parameter.  Depending on whether you want to mix in the
1271 client or server random data first, you can set the
1272 @code{server_random_first} parameter.
1274 For example, after establishing a TLS session using
1275 @funcref{gnutls_handshake}, you can invoke the TLS PRF with this call:
1277 @example
1278 #define MYLABEL "EXPORTER-FOO"
1279 #define MYCONTEXT "some context data"
1280 char out[32];
1281 rc = gnutls_prf (session, strlen (MYLABEL), MYLABEL, 0,
1282                  strlen (MYCONTEXT), MYCONTEXT, 32, out);
1283 @end example
1285 If you don't want to mix in the client/server random, there is a 
1286 low-level TLS PRF interface called @funcref{gnutls_prf_raw}.
1288 @node Channel Bindings
1289 @subsection Channel bindings
1290 @cindex channel bindings
1292 In user authentication protocols (e.g., EAP or SASL mechanisms) it is
1293 useful to have a unique string that identifies the secure channel that
1294 is used, to bind together the user authentication with the secure
1295 channel.  This can protect against man-in-the-middle attacks in some
1296 situations.  That unique string is called a ``channel binding''.  For
1297 background and discussion see @xcite{RFC5056}.
1299 In @acronym{GnuTLS} you can extract a channel binding using the
1300 @funcref{gnutls_session_channel_binding} function.  Currently only the
1301 type @code{GNUTLS_CB_TLS_UNIQUE} is supported, which corresponds to
1302 the @code{tls-unique} channel binding for TLS defined in
1303 @xcite{RFC5929}.
1305 The following example describes how to print the channel binding data.
1306 Note that it must be run after a successful TLS handshake.
1308 @example
1310   gnutls_datum_t cb;
1311   int rc;
1313   rc = gnutls_session_channel_binding (session,
1314                                        GNUTLS_CB_TLS_UNIQUE,
1315                                        &cb);
1316   if (rc)
1317     fprintf (stderr, "Channel binding error: %s\n",
1318              gnutls_strerror (rc));
1319   else
1320     @{
1321       size_t i;
1322       printf ("- Channel binding 'tls-unique': ");
1323       for (i = 0; i < cb.size; i++)
1324         printf ("%02x", cb.data[i]);
1325       printf ("\n");
1326     @}
1328 @end example
1330 @node Interoperability
1331 @subsection Interoperability
1333 The @acronym{TLS} protocols support many ciphersuites, extensions and version
1334 numbers. As a result, few implementations are 
1335 not able to properly interoperate once faced with extensions or version protocols
1336 they do not support and understand. The @acronym{TLS} protocol allows for a
1337 graceful downgrade to the commonly supported options, but practice shows 
1338 it is not always implemented correctly. 
1340 Because there is no way to achieve maximum interoperability with broken peers
1341 without sacrificing security, @acronym{GnuTLS} ignores such peers by default. 
1342 This might not be acceptable in cases where maximum compatibility
1343 is required. Thus we allow enabling compatibility with broken peers using
1344 priority strings (see @ref{Priority Strings}). A conservative priority
1345 string that would disable certain @acronym{TLS} protocol
1346 options that are known to cause compatibility problems, is shown below. 
1347 @verbatim
1348 NORMAL:%COMPAT
1349 @end verbatim
1351 For broken peers that do not tolerate TLS version numbers over TLS 1.0
1352 another priority string is:
1353 @verbatim
1354 NORMAL:-VERS-TLS-ALL:+VERS-TLS1.0:+VERS-SSL3.0:%COMPAT
1355 @end verbatim
1356 This priority string will in addition to above, only enable SSL 3.0 and 
1357 TLS 1.0 as protocols. Note however that
1358 there are known attacks against those protocol versions, especially over
1359 the CBC-mode ciphersuites. To mitigate them another priority string
1360 that only allows the stream cipher ARCFOUR is below.
1361 @verbatim
1362 NORMAL:-VERS-TLS-ALL:+VERS-TLS1.0:+VERS-SSL3.0:-CIPHER-ALL:+ARCFOUR-128:%COMPAT
1363 @end verbatim
1367 @node Compatibility with the OpenSSL library
1368 @subsection Compatibility with the OpenSSL library
1369 @cindex OpenSSL
1371 To ease @acronym{GnuTLS}' integration with existing applications, a
1372 compatibility layer with the OpenSSL library is included
1373 in the @code{gnutls-openssl} library. This compatibility layer is not
1374 complete and it is not intended to completely re-implement the OpenSSL
1375 API with @acronym{GnuTLS}.  It only provides limited source-level
1376 compatibility. 
1378 The prototypes for the compatibility functions are in the
1379 @file{gnutls/openssl.h} header file. The limitations 
1380 imposed by the compatibility layer include:
1382 @itemize
1384 @item Error handling is not thread safe.
1386 @end itemize
1388 @node Using the cryptographic library
1389 @section Using the cryptographic library
1391 @acronym{GnuTLS} is not a low-level cryptographic library, i.e., 
1392 it does not provide access to basic cryptographic primitives. However
1393 it abstracts the internal cryptographic back-end (see @ref{Cryptographic Backend}),
1394 providing symmetric crypto, hash and HMAC algorithms, as well access
1395 to the random number generation.
1397 @menu
1398 * Symmetric cryptography::
1399 * Hash and HMAC functions::
1400 * Random number generation::
1401 @end menu
1403 @node Symmetric cryptography
1404 @subsection Symmetric cryptography
1405 @cindex symmetric cryptography
1407 The available functions to access symmetric crypto algorithms operations
1408 are shown below. The supported algorithms are the algorithms required by the TLS protocol.
1409 They are listed in @ref{tab:ciphers}.
1411 @showfuncE{gnutls_cipher_init,gnutls_cipher_encrypt2,gnutls_cipher_decrypt2,gnutls_cipher_set_iv,gnutls_cipher_deinit}
1413 In order to support authenticated encryption with associated data (AEAD) algorithms the following
1414 functions are provided to set the associated data and retrieve the authentication tag.
1416 @showfuncB{gnutls_cipher_add_auth,gnutls_cipher_tag}
1418 @node Hash and HMAC functions
1419 @subsection Hash and HMAC functions
1420 @cindex hash functions
1421 @cindex HMAC functions
1423 The available operations to access hash functions and hash-MAC (HMAC) algorithms
1424 are shown below. HMAC algorithms provided keyed hash functionality. They supported HMAC algorithms are listed in @ref{tab:macs}.
1426 @showfuncF{gnutls_hmac_init,gnutls_hmac,gnutls_hmac_output,gnutls_hmac_deinit,gnutls_hmac_get_len,gnutls_hmac_fast}
1428 The available functions to access hash functions are shown below. The supported hash functions
1429 are the same as the HMAC algorithms.
1431 @showfuncF{gnutls_hash_init,gnutls_hash,gnutls_hash_output,gnutls_hash_deinit,gnutls_hash_get_len,gnutls_hash_fast}
1433 @node Random number generation
1434 @subsection Random number generation
1435 @cindex random numbers
1437 Access to the random number generator is provided using the @funcref{gnutls_rnd}
1438 function. It allows obtaining random data of various levels.
1440 @showenumdesc{gnutls_rnd_level_t,The random number levels.}
1441 @showfuncdesc{gnutls_rnd}
1443 @node Selecting cryptographic key sizes
1444 @section Selecting cryptographic key sizes
1445 @cindex key sizes
1447 Because many algorithms are involved in TLS, it is not easy to set
1448 a consistent security level.  For this reason in @ref{tab:key-sizes} we
1449 present some correspondence between key sizes of symmetric algorithms
1450 and public key algorithms based on @xcite{ECRYPT}. 
1451 Those can be used to generate certificates with
1452 appropriate key sizes as well as select parameters for Diffie-Hellman and SRP
1453 authentication.
1455 @float Table,tab:key-sizes
1456 @multitable @columnfractions .10 .12 .10 .20 .32
1458 @headitem Security bits @tab RSA, DH and SRP parameter size @tab ECC key size @tab Security parameter @tab Description
1460 @item <72
1461 @tab <1008
1462 @tab <160
1463 @tab @code{INSECURE}
1464 @tab Considered to be insecure
1466 @item 72
1467 @tab 1008
1468 @tab 160
1469 @tab @code{WEAK}
1470 @tab Short term protection against small organizations
1472 @item 80
1473 @tab 1248
1474 @tab 160
1475 @tab @code{LOW}
1476 @tab Very short term protection against agencies
1478 @item 96
1479 @tab 1776
1480 @tab 192
1481 @tab @code{LEGACY}
1482 @tab Legacy standard level
1484 @item 112
1485 @tab 2432
1486 @tab 224
1487 @tab @code{NORMAL}
1488 @tab Medium-term protection
1490 @item 128
1491 @tab 3248
1492 @tab 256
1493 @tab @code{HIGH}
1494 @tab Long term protection
1496 @item 256
1497 @tab 15424
1498 @tab 512
1499 @tab @code{ULTRA}
1500 @tab Foreseeable future
1502 @end multitable
1503 @caption{Key sizes and security parameters.}
1504 @end float
1506 The first column  provides a security parameter in a number of bits. This
1507 gives an indication of the number of combinations to be tried by an adversary
1508 to brute force a key. For example to test all possible keys in a 112 bit security parameter
1509 @math{2^{112}} combinations have to be tried. For today's technology this is infeasible.
1510 The next two columns correlate the security
1511 parameter with actual bit sizes of parameters for DH, RSA, SRP and ECC algorithms.
1512 A mapping to @code{gnutls_sec_param_t} value is given for each security parameter, on
1513 the next column, and finally a brief description of the level.
1515 @c @showenumdesc{gnutls_sec_param_t,The @code{gnutls_sec_@-param_t} enumeration.}
1517 Note, however, that the values suggested here are nothing more than an
1518 educated guess that is valid today. There are no guarantees that an
1519 algorithm will remain unbreakable or that these values will remain
1520 constant in time. There could be scientific breakthroughs that cannot
1521 be predicted or total failure of the current public key systems by
1522 quantum computers. On the other hand though the cryptosystems used in
1523 TLS are selected in a conservative way and such catastrophic
1524 breakthroughs or failures are believed to be unlikely.
1525 The NIST publication SP 800-57 @xcite{NISTSP80057} contains a similar
1526 table.
1528 When using @acronym{GnuTLS} and a decision on bit sizes for a public
1529 key algorithm is required, use of the following functions is  
1530 recommended:
1532 @showfuncdesc{gnutls_sec_param_to_pk_bits}
1534 @showfuncdesc{gnutls_pk_bits_to_sec_param}
1536 Those functions will convert a human understandable security parameter
1537 of @code{gnutls_sec_param_t} type, to a number of bits suitable for a public 
1538 key algorithm.
1540 The following functions will set the minimum acceptable group size for Diffie-Hellman
1541 and SRP authentication. 
1542 @showfuncB{gnutls_dh_set_prime_bits,gnutls_srp_set_prime_bits}