a56087e1305c5323b2472b44e62feab03b8a3e7e
[openssl.git] / doc / man3 / SSL_extension_supported.pod
1 =pod
2
3 =head1 NAME
4
5 SSL_extension_supported,
6 SSL_CTX_add_client_custom_ext, SSL_CTX_add_server_custom_ext
7 - custom TLS extension handling
8
9 =head1 SYNOPSIS
10
11  #include <openssl/ssl.h>
12
13  int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned int ext_type,
14                                    custom_ext_add_cb add_cb,
15                                    custom_ext_free_cb free_cb, void *add_arg,
16                                    custom_ext_parse_cb parse_cb,
17                                    void *parse_arg);
18
19  int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned int ext_type,
20                                    custom_ext_add_cb add_cb,
21                                    custom_ext_free_cb free_cb, void *add_arg,
22                                    custom_ext_parse_cb parse_cb,
23                                    void *parse_arg);
24
25  int SSL_extension_supported(unsigned int ext_type);
26
27  typedef int (*custom_ext_add_cb)(SSL *s, unsigned int ext_type,
28                                   const unsigned char **out,
29                                   size_t *outlen, int *al,
30                                   void *add_arg);
31
32  typedef void (*custom_ext_free_cb)(SSL *s, unsigned int ext_type,
33                                     const unsigned char *out,
34                                     void *add_arg);
35
36  typedef int (*custom_ext_parse_cb)(SSL *s, unsigned int ext_type,
37                                     const unsigned char *in,
38                                     size_t inlen, int *al,
39                                     void *parse_arg);
40
41
42 =head1 DESCRIPTION
43
44 SSL_CTX_add_client_custom_ext() adds a custom extension for a TLS client
45 with extension type B<ext_type> and callbacks B<add_cb>, B<free_cb> and
46 B<parse_cb>.
47
48 SSL_CTX_add_server_custom_ext() adds a custom extension for a TLS server
49 with extension type B<ext_type> and callbacks B<add_cb>, B<free_cb> and
50 B<parse_cb>.
51
52 In both cases the extension type must not be handled by OpenSSL internally
53 or an error occurs.
54
55 SSL_extension_supported() returns 1 if the extension B<ext_type> is handled
56 internally by OpenSSL and 0 otherwise.
57
58 =head1 EXTENSION CALLBACKS
59
60 The callback B<add_cb> is called to send custom extension data to be
61 included in ClientHello for TLS clients or ServerHello for servers. The
62 B<ext_type> parameter is set to the extension type which will be added and
63 B<add_arg> to the value set when the extension handler was added.
64
65 If the application wishes to include the extension B<ext_type> it should
66 set B<*out> to the extension data, set B<*outlen> to the length of the
67 extension data and return 1.
68
69 If the B<add_cb> does not wish to include the extension it must return 0.
70
71 If B<add_cb> returns -1 a fatal handshake error occurs using the TLS
72 alert value specified in B<*al>.
73
74 For clients (but not servers) if B<add_cb> is set to NULL a zero length
75 extension is added for B<ext_type>.
76
77 For clients every registered B<add_cb> is always called to see if the
78 application wishes to add an extension to ClientHello.
79
80 For servers every registered B<add_cb> is called once if and only if the
81 corresponding extension was received in ClientHello to see if the application
82 wishes to add the extension to ServerHello. That is, if no corresponding extension
83 was received in ClientHello then B<add_cb> will not be called.
84
85 If an extension is added (that is B<add_cb> returns 1) B<free_cb> is called
86 (if it is set) with the value of B<out> set by the add callback. It can be
87 used to free up any dynamic extension data set by B<add_cb>. Since B<out> is
88 constant (to permit use of constant data in B<add_cb>) applications may need to
89 cast away const to free the data.
90
91 The callback B<parse_cb> receives data for TLS extensions. For TLS clients
92 the extension data will come from ServerHello and for TLS servers it will
93 come from ClientHello.
94
95 The extension data consists of B<inlen> bytes in the buffer B<in> for the
96 extension B<extension_type>.
97
98 If the B<parse_cb> considers the extension data acceptable it must return
99 1. If it returns 0 or a negative value a fatal handshake error occurs
100 using the TLS alert value specified in B<*al>.
101
102 The buffer B<in> is a temporary internal buffer which will not be valid after
103 the callback returns.
104
105 =head1 NOTES
106
107 The B<add_arg> and B<parse_arg> parameters can be set to arbitrary values
108 which will be passed to the corresponding callbacks. They can, for example,
109 be used to store the extension data received in a convenient structure or
110 pass the extension data to be added or freed when adding extensions.
111
112 The B<ext_type> parameter corresponds to the B<extension_type> field of
113 RFC5246 et al. It is B<not> a NID.
114
115 If the same custom extension type is received multiple times a fatal
116 B<decode_error> alert is sent and the handshake aborts. If a custom extension
117 is received in ServerHello which was not sent in ClientHello a fatal
118 B<unsupported_extension> alert is sent and the handshake is aborted. The
119 ServerHello B<add_cb> callback is only called if the corresponding extension
120 was received in ClientHello. This is compliant with the TLS specifications.
121 This behaviour ensures that each callback is called at most once and that
122 an application can never send unsolicited extensions.
123
124 =head1 RETURN VALUES
125
126 SSL_CTX_add_client_custom_ext() and SSL_CTX_add_server_custom_ext() return 1 for
127 success and 0 for failure. A failure can occur if an attempt is made to
128 add the same B<ext_type> more than once, if an attempt is made to use an
129 extension type handled internally by OpenSSL or if an internal error occurs
130 (for example a memory allocation failure).
131
132 SSL_extension_supported() returns 1 if the extension B<ext_type> is handled
133 internally by OpenSSL and 0 otherwise.
134
135 =head1 COPYRIGHT
136
137 Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
138
139 Licensed under the OpenSSL license (the "License").  You may not use
140 this file except in compliance with the License.  You can obtain a copy
141 in the file LICENSE in the source distribution or at
142 L<https://www.openssl.org/source/license.html>.
143
144 =cut