Add axTLS sourcecode
[project/luci.git] / libs / nixio / axTLS / ssl / ssl.h
1 /*
2  * Copyright (c) 2007, Cameron Rich
3  * 
4  * All rights reserved.
5  * 
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * * Redistributions of source code must retain the above copyright notice, 
10  *   this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright notice, 
12  *   this list of conditions and the following disclaimer in the documentation 
13  *   and/or other materials provided with the distribution.
14  * * Neither the name of the axTLS project nor the names of its contributors 
15  *   may be used to endorse or promote products derived from this software 
16  *   without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 /**
32  * @mainpage axTLS API
33  *
34  * @image html axolotl.jpg
35  *
36  * The axTLS library has features such as:
37  * - The TLSv1 SSL client/server protocol
38  * - No requirement to use any openssl libraries.
39  * - A choice between AES block (128/256 bit) and RC4 (128 bit) stream ciphers.
40  * - RSA encryption/decryption with variable sized keys (up to 4096 bits).
41  * - Certificate chaining and peer authentication.
42  * - Session resumption, session renegotiation.
43  * - ASN.1, X.509, PKCS#8, PKCS#12 keys/certificates with DER/PEM encoding.
44  * - Highly configurable compile time options.
45  * - Portable across many platforms (written in ANSI C), and has language
46  * bindings in C, C#, VB.NET, Java, Perl and Lua.
47  * - Partial openssl API compatibility (via a wrapper).
48  * - A very small footprint (around 50-60kB for the library in 'server-only' 
49  *   mode).
50  * - No dependencies on sockets - can use serial connections for example.
51  * - A very simple API - ~ 20 functions/methods.
52  *
53  * A list of these functions/methods are described below.
54  *
55  *  @ref c_api 
56  *
57  *  @ref bigint_api 
58  *
59  *  @ref csharp_api 
60  *
61  *  @ref java_api 
62  */
63 #ifndef HEADER_SSL_H
64 #define HEADER_SSL_H
65
66 #ifdef __cplusplus
67 extern "C" {
68 #endif
69
70 #include <time.h>
71 //#include "crypto.h"
72
73 /* need to predefine before ssl_lib.h gets to it */
74 #define SSL_SESSION_ID_SIZE                     32
75
76 #include "tls1.h"
77
78 /* The optional parameters that can be given to the client/server SSL engine */
79 #define SSL_CLIENT_AUTHENTICATION               0x00010000
80 #define SSL_SERVER_VERIFY_LATER                 0x00020000
81 #define SSL_NO_DEFAULT_KEY                      0x00040000
82 #define SSL_DISPLAY_STATES                      0x00080000
83 #define SSL_DISPLAY_BYTES                       0x00100000
84 #define SSL_DISPLAY_CERTS                       0x00200000
85 #define SSL_DISPLAY_RSA                         0x00400000
86
87 /* errors that can be generated */
88 #define SSL_OK                                  0
89 #define SSL_NOT_OK                              -1
90 #define SSL_ERROR_DEAD                          -2
91 #define SSL_ERROR_CONN_LOST                     -256
92 #define SSL_ERROR_SOCK_SETUP_FAILURE            -258
93 #define SSL_ERROR_INVALID_HANDSHAKE             -260
94 #define SSL_ERROR_INVALID_PROT_MSG              -261
95 #define SSL_ERROR_INVALID_HMAC                  -262
96 #define SSL_ERROR_INVALID_VERSION               -263
97 #define SSL_ERROR_INVALID_SESSION               -265
98 #define SSL_ERROR_NO_CIPHER                     -266
99 #define SSL_ERROR_BAD_CERTIFICATE               -268
100 #define SSL_ERROR_INVALID_KEY                   -269
101 #define SSL_ERROR_FINISHED_INVALID              -271
102 #define SSL_ERROR_NO_CERT_DEFINED               -272
103 #define SSL_ERROR_NOT_SUPPORTED                 -274
104 #define SSL_X509_OFFSET                         -512
105 #define SSL_X509_ERROR(A)                       (SSL_X509_OFFSET+A)
106
107 /* these are all the alerts that are recognized */
108 #define SSL_ALERT_CLOSE_NOTIFY                  0
109 #define SSL_ALERT_UNEXPECTED_MESSAGE            10
110 #define SSL_ALERT_BAD_RECORD_MAC                20
111 #define SSL_ALERT_HANDSHAKE_FAILURE             40
112 #define SSL_ALERT_BAD_CERTIFICATE               42
113 #define SSL_ALERT_ILLEGAL_PARAMETER             47
114 #define SSL_ALERT_DECODE_ERROR                  50
115 #define SSL_ALERT_DECRYPT_ERROR                 51
116 #define SSL_ALERT_INVALID_VERSION               70
117
118 /* The ciphers that are supported */
119 #define SSL_AES128_SHA                          0x2f
120 #define SSL_AES256_SHA                          0x35
121 #define SSL_RC4_128_SHA                         0x05
122 #define SSL_RC4_128_MD5                         0x04
123
124 /* build mode ids' */
125 #define SSL_BUILD_SKELETON_MODE                 0x01
126 #define SSL_BUILD_SERVER_ONLY                   0x02
127 #define SSL_BUILD_ENABLE_VERIFICATION           0x03
128 #define SSL_BUILD_ENABLE_CLIENT                 0x04
129 #define SSL_BUILD_FULL_MODE                     0x05
130
131 /* offsets to retrieve configuration information */
132 #define SSL_BUILD_MODE                          0
133 #define SSL_MAX_CERT_CFG_OFFSET                 1
134 #define SSL_MAX_CA_CERT_CFG_OFFSET              2
135 #define SSL_HAS_PEM                             3
136
137 /* default session sizes */
138 #define SSL_DEFAULT_SVR_SESS                    5
139 #define SSL_DEFAULT_CLNT_SESS                   1
140
141 /* X.509/X.520 distinguished name types */
142 #define SSL_X509_CERT_COMMON_NAME               0
143 #define SSL_X509_CERT_ORGANIZATION              1
144 #define SSL_X509_CERT_ORGANIZATIONAL_NAME       2
145 #define SSL_X509_CA_CERT_COMMON_NAME            3
146 #define SSL_X509_CA_CERT_ORGANIZATION           4
147 #define SSL_X509_CA_CERT_ORGANIZATIONAL_NAME    5
148
149 /* SSL object loader types */
150 #define SSL_OBJ_X509_CERT                       1
151 #define SSL_OBJ_X509_CACERT                     2
152 #define SSL_OBJ_RSA_KEY                         3
153 #define SSL_OBJ_PKCS8                           4
154 #define SSL_OBJ_PKCS12                          5
155
156 /**
157  * @defgroup c_api Standard C API
158  * @brief The standard interface in C.
159  * @{
160  */
161
162 /**
163  * @brief Establish a new client/server context.
164  *
165  * This function is called before any client/server SSL connections are made. 
166  *
167  * Each new connection will use the this context's private key and 
168  * certificate chain. If a different certificate chain is required, then a 
169  * different context needs to be be used.
170  *
171  * There are two threading models supported - a single thread with one
172  * SSL_CTX can support any number of SSL connections - and multiple threads can 
173  * support one SSL_CTX object each (the default). But if a single SSL_CTX 
174  * object uses many SSL objects in individual threads, then the 
175  * CONFIG_SSL_CTX_MUTEXING option needs to be configured.
176  *
177  * @param options [in]  Any particular options. At present the options
178  * supported are:
179  * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the server
180  * authentication fails. The certificate can be authenticated later with a
181  * call to ssl_verify_cert().
182  * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication
183  * i.e. each handshake will include a "certificate request" message from the
184  * server. Only available if verification has been enabled.
185  * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences
186  * during the handshake.
187  * - SSL_DISPLAY_STATES (full mode build only): Display the state changes
188  * during the handshake.
189  * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that
190  * are passed during a handshake.
191  * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details that
192  * are passed during a handshake.
193  *
194  * @param num_sessions [in] The number of sessions to be used for session
195  * caching. If this value is 0, then there is no session caching. This option
196  * is not used in skeleton mode.
197  * @return A client/server context.
198  */
199 EXP_FUNC SSL_CTX * STDCALL ssl_ctx_new(uint32_t options, int num_sessions);
200
201 /**
202  * @brief Remove a client/server context.
203  *
204  * Frees any used resources used by this context. Each connection will be 
205  * sent a "Close Notify" alert (if possible).
206  * @param ssl_ctx [in] The client/server context.
207  */
208 EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx);
209
210 /**
211  * @brief (server only) Establish a new SSL connection to an SSL client.
212  *
213  * It is up to the application to establish the logical connection (whether it
214  * is  a socket, serial connection etc).
215  * @param ssl_ctx [in] The server context.
216  * @param client_fd [in] The client's file descriptor. 
217  * @return An SSL object reference.
218  */
219 EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd);
220
221 /**
222  * @brief (client only) Establish a new SSL connection to an SSL server.
223  *
224  * It is up to the application to establish the initial logical connection 
225  * (whether it is  a socket, serial connection etc).
226  *
227  * This is a blocking call - it will finish when the handshake is complete (or
228  * has failed).
229  * @param ssl_ctx [in] The client context.
230  * @param client_fd [in] The client's file descriptor.
231  * @param session_id [in] A 32 byte session id for session resumption. This 
232  * can be null if no session resumption is being used or required. This option
233  * is not used in skeleton mode.
234  * @param sess_id_size The size of the session id (max 32)
235  * @return An SSL object reference. Use ssl_handshake_status() to check 
236  * if a handshake succeeded.
237  */
238 EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const uint8_t *session_id, uint8_t sess_id_size);
239
240 /**
241  * @brief Free any used resources on this connection. 
242  
243  * A "Close Notify" message is sent on this connection (if possible). It is up 
244  * to the application to close the socket or file descriptor.
245  * @param ssl [in] The ssl object reference.
246  */
247 EXP_FUNC void STDCALL ssl_free(SSL *ssl);
248
249 /**
250  * @brief Read the SSL data stream.
251  * The socket must be in blocking mode.
252  * @param ssl [in] An SSL object reference.
253  * @param in_data [out] If the read was successful, a pointer to the read
254  * buffer will be here. Do NOT ever free this memory as this buffer is used in
255  * sucessive calls. If the call was unsuccessful, this value will be null.
256  * @return The number of decrypted bytes:
257  * - if > 0, then the handshaking is complete and we are returning the number 
258  *   of decrypted bytes. 
259  * - SSL_OK if the handshaking stage is successful (but not yet complete).  
260  * - < 0 if an error.
261  * @see ssl.h for the error code list.
262  * @note Use in_data before doing any successive ssl calls.
263  */
264 EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data);
265
266 /**
267  * @brief Write to the SSL data stream. 
268  * The socket must be in blocking mode.
269  * @param ssl [in] An SSL obect reference.
270  * @param out_data [in] The data to be written
271  * @param out_len [in] The number of bytes to be written.
272  * @return The number of bytes sent, or if < 0 if an error.
273  * @see ssl.h for the error code list.
274  */
275 EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len);
276
277 /**
278  * @brief Find an ssl object based on a file descriptor.
279  *
280  * Goes through the list of SSL objects maintained in a client/server context
281  * to look for a file descriptor match.
282  * @param ssl_ctx [in] The client/server context.
283  * @param client_fd [in]  The file descriptor.
284  * @return A reference to the SSL object. Returns null if the object could not 
285  * be found.
286  */
287 EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd);
288
289 /**
290  * @brief Get the session id for a handshake. 
291  * 
292  * This will be a 32 byte sequence and is available after the first
293  * handshaking messages are sent.
294  * @param ssl [in] An SSL object reference.
295  * @return The session id as a 32 byte sequence.
296  * @note A SSLv23 handshake may have only 16 valid bytes.
297  */
298 EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl);
299
300 /**
301  * @brief Get the session id size for a handshake. 
302  * 
303  * This will normally be 32 but could be 0 (no session id) or something else.
304  * @param ssl [in] An SSL object reference.
305  * @return The size of the session id.
306  */
307 EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl);
308
309 /**
310  * @brief Return the cipher id (in the SSL form).
311  * @param ssl [in] An SSL object reference.
312  * @return The cipher id. This will be one of the following:
313  * - SSL_AES128_SHA (0x2f)
314  * - SSL_AES256_SHA (0x35)
315  * - SSL_RC4_128_SHA (0x05)
316  * - SSL_RC4_128_MD5 (0x04)
317  */
318 EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl);
319
320 /**
321  * @brief Return the status of the handshake.
322  * @param ssl [in] An SSL object reference.
323  * @return SSL_OK if the handshake is complete and ok. 
324  * @see ssl.h for the error code list.
325  */
326 EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl);
327
328 /**
329  * @brief Retrieve various parameters about the axTLS engine.
330  * @param offset [in] The configuration offset. It will be one of the following:
331  * - SSL_BUILD_MODE The build mode. This will be one of the following:
332  *   - SSL_BUILD_SERVER_ONLY            (basic server mode)
333  *   - SSL_BUILD_ENABLE_VERIFICATION    (server can do client authentication)
334  *   - SSL_BUILD_ENABLE_CLIENT          (client/server capabilties)
335  *   - SSL_BUILD_FULL_MODE              (client/server with diagnostics)
336  *   - SSL_BUILD_SKELETON_MODE          (skeleton mode)
337  * - SSL_MAX_CERT_CFG_OFFSET The maximum number of certificates allowed.
338  * - SSL_MAX_CA_CERT_CFG_OFFSET The maximum number of CA certificates allowed.
339  * - SSL_HAS_PEM                        1 if supported
340  * @return The value of the requested parameter.
341  */
342 EXP_FUNC int STDCALL ssl_get_config(int offset);
343
344 /**
345  * @brief Display why the handshake failed.
346  *
347  * This call is only useful in a 'full mode' build. The output is to stdout.
348  * @param error_code [in] An error code.
349  * @see ssl.h for the error code list.
350  */
351 EXP_FUNC void STDCALL ssl_display_error(int error_code);
352
353 /**
354  * @brief Authenticate a received certificate.
355  * 
356  * This call is usually made by a client after a handshake is complete and the
357  * context is in SSL_SERVER_VERIFY_LATER mode.
358  * @param ssl [in] An SSL object reference.
359  * @return SSL_OK if the certificate is verified.
360  */
361 EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl);
362
363 /**
364  * @brief Retrieve an X.509 distinguished name component.
365  * 
366  * When a handshake is complete and a certificate has been exchanged, then the
367  * details of the remote certificate can be retrieved.
368  *
369  * This will usually be used by a client to check that the server's common 
370  * name matches the URL.
371  *
372  * A full handshake needs to occur for this call to work properly.
373  *
374  * @param ssl [in] An SSL object reference.
375  * @param component [in] one of:
376  * - SSL_X509_CERT_COMMON_NAME
377  * - SSL_X509_CERT_ORGANIZATION
378  * - SSL_X509_CERT_ORGANIZATIONAL_NAME
379  * - SSL_X509_CA_CERT_COMMON_NAME
380  * - SSL_X509_CA_CERT_ORGANIZATION
381  * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
382  * @return The appropriate string (or null if not defined)
383  * @note Verification build mode must be enabled.
384  */
385 EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component);
386
387 /**
388  * @brief Force the client to perform its handshake again.
389  *
390  * For a client this involves sending another "client hello" message.
391  * For the server is means sending a "hello request" message.
392  *
393  * This is a blocking call on the client (until the handshake completes).
394  *
395  * @param ssl [in] An SSL object reference.
396  * @return SSL_OK if renegotiation instantiation was ok
397  */
398 EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl);
399
400 /**
401  * @brief Process a file that is in binary DER or ASCII PEM format.
402  *
403  * These are temporary objects that are used to load private keys,
404  * certificates etc into memory.
405  * @param ssl_ctx [in] The client/server context.
406  * @param obj_type [in] The format of the file. Can be one of:
407  * - SSL_OBJ_X509_CERT (no password required)
408  * - SSL_OBJ_X509_CACERT (no password required)
409  * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
410  * - SSL_OBJ_PKCS8 (RC4-128 encrypted data supported)
411  * - SSL_OBJ_PKCS12 (RC4-128 encrypted data supported)
412  *
413  * PEM files are automatically detected (if supported). The object type is
414  * also detected, and so is not relevant for these types of files.
415  * @param filename [in] The location of a file in DER/PEM format.
416  * @param password [in] The password used. Can be null if not required.
417  * @return SSL_OK if all ok
418  * @note Not available in skeleton build mode.
419  */
420 EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, const char *filename, const char *password);
421
422 /**
423  * @brief Process binary data.
424  *
425  * These are temporary objects that are used to load private keys,
426  * certificates etc into memory.
427  * @param ssl_ctx [in] The client/server context.
428  * @param obj_type [in] The format of the memory data.
429  * @param data [in] The binary data to be loaded.
430  * @param len [in] The amount of data to be loaded.
431  * @param password [in] The password used. Can be null if not required.
432  * @return SSL_OK if all ok
433  * @see ssl_obj_load for more details on obj_type.
434  */
435 EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int obj_type, const uint8_t *data, int len, const char *password);
436
437 #ifdef CONFIG_SSL_GENERATE_X509_CERT
438 /**
439  * @brief Create an X.509 certificate. 
440  * 
441  * This certificate is a self-signed v1 cert with a fixed start/stop validity 
442  * times. It is signed with an internal private key in ssl_ctx.
443  *
444  * @param ssl_ctx [in] The client/server context.
445  * @param options [in] Not used yet.
446  * @param dn [in] An array of distinguished name strings. The array is defined
447  * by:
448  * - SSL_X509_CERT_COMMON_NAME (0)
449  *      - If SSL_X509_CERT_COMMON_NAME is empty or not defined, then the 
450  *        hostname will be used.
451  * - SSL_X509_CERT_ORGANIZATION (1)
452  *      - If SSL_X509_CERT_ORGANIZATION is empty or not defined, then $USERNAME 
453  *        will be used.
454  * - SSL_X509_CERT_ORGANIZATIONAL_NAME (2)
455  *      - SSL_X509_CERT_ORGANIZATIONAL_NAME is optional.
456  * @param cert_data [out] The certificate as a sequence of bytes.
457  * @return < 0 if an error, or the size of the certificate in bytes.
458  * @note cert_data must be freed when there is no more need for it.
459  */
460 EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data);
461 #endif
462
463 /**
464  * @brief Return the axTLS library version as a string.
465  */
466 EXP_FUNC const char * STDCALL ssl_version(void);
467
468 /** @} */
469
470 #ifdef __cplusplus
471 }
472 #endif
473
474 #endif