File Coverage

include/bearssl_ssl.h
Criterion Covered Total %
statement 2 27 7.4
branch n/a
condition n/a
subroutine n/a
pod n/a
total 2 27 7.4


line stmt bran cond sub pod time code
1             /*
2             * Copyright (c) 2016 Thomas Pornin
3             *
4             * Permission is hereby granted, free of charge, to any person obtaining
5             * a copy of this software and associated documentation files (the
6             * "Software"), to deal in the Software without restriction, including
7             * without limitation the rights to use, copy, modify, merge, publish,
8             * distribute, sublicense, and/or sell copies of the Software, and to
9             * permit persons to whom the Software is furnished to do so, subject to
10             * the following conditions:
11             *
12             * The above copyright notice and this permission notice shall be
13             * included in all copies or substantial portions of the Software.
14             *
15             * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16             * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17             * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18             * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19             * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20             * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21             * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22             * SOFTWARE.
23             */
24              
25             #ifndef BR_BEARSSL_SSL_H__
26             #define BR_BEARSSL_SSL_H__
27              
28             #include
29             #include
30              
31             #include "bearssl_block.h"
32             #include "bearssl_hash.h"
33             #include "bearssl_hmac.h"
34             #include "bearssl_prf.h"
35             #include "bearssl_rand.h"
36             #include "bearssl_x509.h"
37              
38             #ifdef __cplusplus
39             extern "C" {
40             #endif
41              
42             /** \file bearssl_ssl.h
43             *
44             * # SSL
45             *
46             * For an overview of the SSL/TLS API, see [the BearSSL Web
47             * site](https://www.bearssl.org/api1.html).
48             *
49             * The `BR_TLS_*` constants correspond to the standard cipher suites and
50             * their values in the [IANA
51             * registry](http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4).
52             *
53             * The `BR_ALERT_*` constants are for standard TLS alert messages. When
54             * a fatal alert message is sent of received, then the SSL engine context
55             * status is set to the sum of that alert value (an integer in the 0..255
56             * range) and a fixed offset (`BR_ERR_SEND_FATAL_ALERT` for a sent alert,
57             * `BR_ERR_RECV_FATAL_ALERT` for a received alert).
58             */
59              
60             /** \brief Optimal input buffer size. */
61             #define BR_SSL_BUFSIZE_INPUT (16384 + 325)
62              
63             /** \brief Optimal output buffer size. */
64             #define BR_SSL_BUFSIZE_OUTPUT (16384 + 85)
65              
66             /** \brief Optimal buffer size for monodirectional engine
67             (shared input/output buffer). */
68             #define BR_SSL_BUFSIZE_MONO BR_SSL_BUFSIZE_INPUT
69              
70             /** \brief Optimal buffer size for bidirectional engine
71             (single buffer split into two separate input/output buffers). */
72             #define BR_SSL_BUFSIZE_BIDI (BR_SSL_BUFSIZE_INPUT + BR_SSL_BUFSIZE_OUTPUT)
73              
74             /*
75             * Constants for known SSL/TLS protocol versions (SSL 3.0, TLS 1.0, TLS 1.1
76             * and TLS 1.2). Note that though there is a constant for SSL 3.0, that
77             * protocol version is not actually supported.
78             */
79              
80             /** \brief Protocol version: SSL 3.0 (unsupported). */
81             #define BR_SSL30 0x0300
82             /** \brief Protocol version: TLS 1.0. */
83             #define BR_TLS10 0x0301
84             /** \brief Protocol version: TLS 1.1. */
85             #define BR_TLS11 0x0302
86             /** \brief Protocol version: TLS 1.2. */
87             #define BR_TLS12 0x0303
88              
89             /*
90             * Error constants. They are used to report the reason why a context has
91             * been marked as failed.
92             *
93             * Implementation note: SSL-level error codes should be in the 1..31
94             * range. The 32..63 range is for certificate decoding and validation
95             * errors. Received fatal alerts imply an error code in the 256..511 range.
96             */
97              
98             /** \brief SSL status: no error so far (0). */
99             #define BR_ERR_OK 0
100              
101             /** \brief SSL status: caller-provided parameter is incorrect. */
102             #define BR_ERR_BAD_PARAM 1
103              
104             /** \brief SSL status: operation requested by the caller cannot be applied
105             with the current context state (e.g. reading data while outgoing data
106             is waiting to be sent). */
107             #define BR_ERR_BAD_STATE 2
108              
109             /** \brief SSL status: incoming protocol or record version is unsupported. */
110             #define BR_ERR_UNSUPPORTED_VERSION 3
111              
112             /** \brief SSL status: incoming record version does not match the expected
113             version. */
114             #define BR_ERR_BAD_VERSION 4
115              
116             /** \brief SSL status: incoming record length is invalid. */
117             #define BR_ERR_BAD_LENGTH 5
118              
119             /** \brief SSL status: incoming record is too large to be processed, or
120             buffer is too small for the handshake message to send. */
121             #define BR_ERR_TOO_LARGE 6
122              
123             /** \brief SSL status: decryption found an invalid padding, or the record
124             MAC is not correct. */
125             #define BR_ERR_BAD_MAC 7
126              
127             /** \brief SSL status: no initial entropy was provided, and none can be
128             obtained from the OS. */
129             #define BR_ERR_NO_RANDOM 8
130              
131             /** \brief SSL status: incoming record type is unknown. */
132             #define BR_ERR_UNKNOWN_TYPE 9
133              
134             /** \brief SSL status: incoming record or message has wrong type with
135             regards to the current engine state. */
136             #define BR_ERR_UNEXPECTED 10
137              
138             /** \brief SSL status: ChangeCipherSpec message from the peer has invalid
139             contents. */
140             #define BR_ERR_BAD_CCS 12
141              
142             /** \brief SSL status: alert message from the peer has invalid contents
143             (odd length). */
144             #define BR_ERR_BAD_ALERT 13
145              
146             /** \brief SSL status: incoming handshake message decoding failed. */
147             #define BR_ERR_BAD_HANDSHAKE 14
148              
149             /** \brief SSL status: ServerHello contains a session ID which is larger
150             than 32 bytes. */
151             #define BR_ERR_OVERSIZED_ID 15
152              
153             /** \brief SSL status: server wants to use a cipher suite that we did
154             not claim to support. This is also reported if we tried to advertise
155             a cipher suite that we do not support. */
156             #define BR_ERR_BAD_CIPHER_SUITE 16
157              
158             /** \brief SSL status: server wants to use a compression that we did not
159             claim to support. */
160             #define BR_ERR_BAD_COMPRESSION 17
161              
162             /** \brief SSL status: server's max fragment length does not match
163             client's. */
164             #define BR_ERR_BAD_FRAGLEN 18
165              
166             /** \brief SSL status: secure renegotiation failed. */
167             #define BR_ERR_BAD_SECRENEG 19
168              
169             /** \brief SSL status: server sent an extension type that we did not
170             announce, or used the same extension type several times in a single
171             ServerHello. */
172             #define BR_ERR_EXTRA_EXTENSION 20
173              
174             /** \brief SSL status: invalid Server Name Indication contents (when
175             used by the server, this extension shall be empty). */
176             #define BR_ERR_BAD_SNI 21
177              
178             /** \brief SSL status: invalid ServerHelloDone from the server (length
179             is not 0). */
180             #define BR_ERR_BAD_HELLO_DONE 22
181              
182             /** \brief SSL status: internal limit exceeded (e.g. server's public key
183             is too large). */
184             #define BR_ERR_LIMIT_EXCEEDED 23
185              
186             /** \brief SSL status: Finished message from peer does not match the
187             expected value. */
188             #define BR_ERR_BAD_FINISHED 24
189              
190             /** \brief SSL status: session resumption attempt with distinct version
191             or cipher suite. */
192             #define BR_ERR_RESUME_MISMATCH 25
193              
194             /** \brief SSL status: unsupported or invalid algorithm (ECDHE curve,
195             signature algorithm, hash function). */
196             #define BR_ERR_INVALID_ALGORITHM 26
197              
198             /** \brief SSL status: invalid signature (on ServerKeyExchange from
199             server, or in CertificateVerify from client). */
200             #define BR_ERR_BAD_SIGNATURE 27
201              
202             /** \brief SSL status: peer's public key does not have the proper type
203             or is not allowed for requested operation. */
204             #define BR_ERR_WRONG_KEY_USAGE 28
205              
206             /** \brief SSL status: client did not send a certificate upon request,
207             or the client certificate could not be validated. */
208             #define BR_ERR_NO_CLIENT_AUTH 29
209              
210             /** \brief SSL status: I/O error or premature close on underlying
211             transport stream. This error code is set only by the simplified
212             I/O API ("br_sslio_*"). */
213             #define BR_ERR_IO 31
214              
215             /** \brief SSL status: base value for a received fatal alert.
216              
217             When a fatal alert is received from the peer, the alert value
218             is added to this constant. */
219             #define BR_ERR_RECV_FATAL_ALERT 256
220              
221             /** \brief SSL status: base value for a sent fatal alert.
222              
223             When a fatal alert is sent to the peer, the alert value is added
224             to this constant. */
225             #define BR_ERR_SEND_FATAL_ALERT 512
226              
227             /* ===================================================================== */
228              
229             /**
230             * \brief Decryption engine for SSL.
231             *
232             * When processing incoming records, the SSL engine will use a decryption
233             * engine that uses a specific context structure, and has a set of
234             * methods (a vtable) that follows this template.
235             *
236             * The decryption engine is responsible for applying decryption, verifying
237             * MAC, and keeping track of the record sequence number.
238             */
239             typedef struct br_sslrec_in_class_ br_sslrec_in_class;
240             struct br_sslrec_in_class_ {
241             /**
242             * \brief Context size (in bytes).
243             */
244             size_t context_size;
245              
246             /**
247             * \brief Test validity of the incoming record length.
248             *
249             * This function returns 1 if the announced length for an
250             * incoming record is valid, 0 otherwise,
251             *
252             * \param ctx decryption engine context.
253             * \param record_len incoming record length.
254             * \return 1 of a valid length, 0 otherwise.
255             */
256             int (*check_length)(const br_sslrec_in_class *const *ctx,
257             size_t record_len);
258              
259             /**
260             * \brief Decrypt the incoming record.
261             *
262             * This function may assume that the record length is valid
263             * (it has been previously tested with `check_length()`).
264             * Decryption is done in place; `*len` is updated with the
265             * cleartext length, and the address of the first plaintext
266             * byte is returned. If the record is correct but empty, then
267             * `*len` is set to 0 and a non-`NULL` pointer is returned.
268             *
269             * On decryption/MAC error, `NULL` is returned.
270             *
271             * \param ctx decryption engine context.
272             * \param record_type record type (23 for application data, etc).
273             * \param version record version.
274             * \param payload address of encrypted payload.
275             * \param len pointer to payload length (updated).
276             * \return pointer to plaintext, or `NULL` on error.
277             */
278             unsigned char *(*decrypt)(const br_sslrec_in_class **ctx,
279             int record_type, unsigned version,
280             void *payload, size_t *len);
281             };
282              
283             /**
284             * \brief Encryption engine for SSL.
285             *
286             * When building outgoing records, the SSL engine will use an encryption
287             * engine that uses a specific context structure, and has a set of
288             * methods (a vtable) that follows this template.
289             *
290             * The encryption engine is responsible for applying encryption and MAC,
291             * and keeping track of the record sequence number.
292             */
293             typedef struct br_sslrec_out_class_ br_sslrec_out_class;
294             struct br_sslrec_out_class_ {
295             /**
296             * \brief Context size (in bytes).
297             */
298             size_t context_size;
299              
300             /**
301             * \brief Compute maximum plaintext sizes and offsets.
302             *
303             * When this function is called, the `*start` and `*end`
304             * values contain offsets designating the free area in the
305             * outgoing buffer for plaintext data; that free area is
306             * preceded by a 5-byte space which will receive the record
307             * header.
308             *
309             * The `max_plaintext()` function is responsible for adjusting
310             * both `*start` and `*end` to make room for any record-specific
311             * header, MAC, padding, and possible split.
312             *
313             * \param ctx encryption engine context.
314             * \param start pointer to start of plaintext offset (updated).
315             * \param end pointer to start of plaintext offset (updated).
316             */
317             void (*max_plaintext)(const br_sslrec_out_class *const *ctx,
318             size_t *start, size_t *end);
319              
320             /**
321             * \brief Perform record encryption.
322             *
323             * This function encrypts the record. The plaintext address and
324             * length are provided. Returned value is the start of the
325             * encrypted record (or sequence of records, if a split was
326             * performed), _including_ the 5-byte header, and `*len` is
327             * adjusted to the total size of the record(s), there again
328             * including the header(s).
329             *
330             * \param ctx decryption engine context.
331             * \param record_type record type (23 for application data, etc).
332             * \param version record version.
333             * \param plaintext address of plaintext.
334             * \param len pointer to plaintext length (updated).
335             * \return pointer to start of built record.
336             */
337             unsigned char *(*encrypt)(const br_sslrec_out_class **ctx,
338             int record_type, unsigned version,
339             void *plaintext, size_t *len);
340             };
341              
342             /**
343             * \brief Context for a no-encryption engine.
344             *
345             * The no-encryption engine processes outgoing records during the initial
346             * handshake, before encryption is applied.
347             */
348             typedef struct {
349             /** \brief No-encryption engine vtable. */
350             const br_sslrec_out_class *vtable;
351             } br_sslrec_out_clear_context;
352              
353             /** \brief Static, constant vtable for the no-encryption engine. */
354             extern const br_sslrec_out_class br_sslrec_out_clear_vtable;
355              
356             /* ===================================================================== */
357              
358             /**
359             * \brief Record decryption engine class, for CBC mode.
360             *
361             * This class type extends the decryption engine class with an
362             * initialisation method that receives the parameters needed
363             * for CBC processing: block cipher implementation, block cipher key,
364             * HMAC parameters (hash function, key, MAC length), and IV. If the
365             * IV is `NULL`, then a per-record IV will be used (TLS 1.1+).
366             */
367             typedef struct br_sslrec_in_cbc_class_ br_sslrec_in_cbc_class;
368             struct br_sslrec_in_cbc_class_ {
369             /**
370             * \brief Superclass, as first vtable field.
371             */
372             br_sslrec_in_class inner;
373              
374             /**
375             * \brief Engine initialisation method.
376             *
377             * This method sets the vtable field in the context.
378             *
379             * \param ctx context to initialise.
380             * \param bc_impl block cipher implementation (CBC decryption).
381             * \param bc_key block cipher key.
382             * \param bc_key_len block cipher key length (in bytes).
383             * \param dig_impl hash function for HMAC.
384             * \param mac_key HMAC key.
385             * \param mac_key_len HMAC key length (in bytes).
386             * \param mac_out_len HMAC output length (in bytes).
387             * \param iv initial IV (or `NULL`).
388             */
389             void (*init)(const br_sslrec_in_cbc_class **ctx,
390             const br_block_cbcdec_class *bc_impl,
391             const void *bc_key, size_t bc_key_len,
392             const br_hash_class *dig_impl,
393             const void *mac_key, size_t mac_key_len, size_t mac_out_len,
394             const void *iv);
395             };
396              
397             /**
398             * \brief Record encryption engine class, for CBC mode.
399             *
400             * This class type extends the encryption engine class with an
401             * initialisation method that receives the parameters needed
402             * for CBC processing: block cipher implementation, block cipher key,
403             * HMAC parameters (hash function, key, MAC length), and IV. If the
404             * IV is `NULL`, then a per-record IV will be used (TLS 1.1+).
405             */
406             typedef struct br_sslrec_out_cbc_class_ br_sslrec_out_cbc_class;
407             struct br_sslrec_out_cbc_class_ {
408             /**
409             * \brief Superclass, as first vtable field.
410             */
411             br_sslrec_out_class inner;
412              
413             /**
414             * \brief Engine initialisation method.
415             *
416             * This method sets the vtable field in the context.
417             *
418             * \param ctx context to initialise.
419             * \param bc_impl block cipher implementation (CBC encryption).
420             * \param bc_key block cipher key.
421             * \param bc_key_len block cipher key length (in bytes).
422             * \param dig_impl hash function for HMAC.
423             * \param mac_key HMAC key.
424             * \param mac_key_len HMAC key length (in bytes).
425             * \param mac_out_len HMAC output length (in bytes).
426             * \param iv initial IV (or `NULL`).
427             */
428             void (*init)(const br_sslrec_out_cbc_class **ctx,
429             const br_block_cbcenc_class *bc_impl,
430             const void *bc_key, size_t bc_key_len,
431             const br_hash_class *dig_impl,
432             const void *mac_key, size_t mac_key_len, size_t mac_out_len,
433             const void *iv);
434             };
435              
436             /**
437             * \brief Context structure for decrypting incoming records with
438             * CBC + HMAC.
439             *
440             * The first field points to the vtable. The other fields are opaque
441             * and shall not be accessed directly.
442             */
443             typedef struct {
444             /** \brief Pointer to vtable. */
445             const br_sslrec_in_cbc_class *vtable;
446             #ifndef BR_DOXYGEN_IGNORE
447             uint64_t seq;
448             union {
449             const br_block_cbcdec_class *vtable;
450             br_aes_gen_cbcdec_keys aes;
451             br_des_gen_cbcdec_keys des;
452             } bc;
453             br_hmac_key_context mac;
454             size_t mac_len;
455             unsigned char iv[16];
456             int explicit_IV;
457             #endif
458             } br_sslrec_in_cbc_context;
459              
460             /**
461             * \brief Static, constant vtable for record decryption with CBC.
462             */
463             extern const br_sslrec_in_cbc_class br_sslrec_in_cbc_vtable;
464              
465             /**
466             * \brief Context structure for encrypting outgoing records with
467             * CBC + HMAC.
468             *
469             * The first field points to the vtable. The other fields are opaque
470             * and shall not be accessed directly.
471             */
472             typedef struct {
473             /** \brief Pointer to vtable. */
474             const br_sslrec_out_cbc_class *vtable;
475             #ifndef BR_DOXYGEN_IGNORE
476             uint64_t seq;
477             union {
478             const br_block_cbcenc_class *vtable;
479             br_aes_gen_cbcenc_keys aes;
480             br_des_gen_cbcenc_keys des;
481             } bc;
482             br_hmac_key_context mac;
483             size_t mac_len;
484             unsigned char iv[16];
485             int explicit_IV;
486             #endif
487             } br_sslrec_out_cbc_context;
488              
489             /**
490             * \brief Static, constant vtable for record encryption with CBC.
491             */
492             extern const br_sslrec_out_cbc_class br_sslrec_out_cbc_vtable;
493              
494             /* ===================================================================== */
495              
496             /**
497             * \brief Record decryption engine class, for GCM mode.
498             *
499             * This class type extends the decryption engine class with an
500             * initialisation method that receives the parameters needed
501             * for GCM processing: block cipher implementation, block cipher key,
502             * GHASH implementation, and 4-byte IV.
503             */
504             typedef struct br_sslrec_in_gcm_class_ br_sslrec_in_gcm_class;
505             struct br_sslrec_in_gcm_class_ {
506             /**
507             * \brief Superclass, as first vtable field.
508             */
509             br_sslrec_in_class inner;
510              
511             /**
512             * \brief Engine initialisation method.
513             *
514             * This method sets the vtable field in the context.
515             *
516             * \param ctx context to initialise.
517             * \param bc_impl block cipher implementation (CTR).
518             * \param key block cipher key.
519             * \param key_len block cipher key length (in bytes).
520             * \param gh_impl GHASH implementation.
521             * \param iv static IV (4 bytes).
522             */
523             void (*init)(const br_sslrec_in_gcm_class **ctx,
524             const br_block_ctr_class *bc_impl,
525             const void *key, size_t key_len,
526             br_ghash gh_impl,
527             const void *iv);
528             };
529              
530             /**
531             * \brief Record encryption engine class, for GCM mode.
532             *
533             * This class type extends the encryption engine class with an
534             * initialisation method that receives the parameters needed
535             * for GCM processing: block cipher implementation, block cipher key,
536             * GHASH implementation, and 4-byte IV.
537             */
538             typedef struct br_sslrec_out_gcm_class_ br_sslrec_out_gcm_class;
539             struct br_sslrec_out_gcm_class_ {
540             /**
541             * \brief Superclass, as first vtable field.
542             */
543             br_sslrec_out_class inner;
544              
545             /**
546             * \brief Engine initialisation method.
547             *
548             * This method sets the vtable field in the context.
549             *
550             * \param ctx context to initialise.
551             * \param bc_impl block cipher implementation (CTR).
552             * \param key block cipher key.
553             * \param key_len block cipher key length (in bytes).
554             * \param gh_impl GHASH implementation.
555             * \param iv static IV (4 bytes).
556             */
557             void (*init)(const br_sslrec_out_gcm_class **ctx,
558             const br_block_ctr_class *bc_impl,
559             const void *key, size_t key_len,
560             br_ghash gh_impl,
561             const void *iv);
562             };
563              
564             /**
565             * \brief Context structure for processing records with GCM.
566             *
567             * The same context structure is used for encrypting and decrypting.
568             *
569             * The first field points to the vtable. The other fields are opaque
570             * and shall not be accessed directly.
571             */
572             typedef struct {
573             /** \brief Pointer to vtable. */
574             union {
575             const void *gen;
576             const br_sslrec_in_gcm_class *in;
577             const br_sslrec_out_gcm_class *out;
578             } vtable;
579             #ifndef BR_DOXYGEN_IGNORE
580             uint64_t seq;
581             union {
582             const br_block_ctr_class *vtable;
583             br_aes_gen_ctr_keys aes;
584             } bc;
585             br_ghash gh;
586             unsigned char iv[4];
587             unsigned char h[16];
588             #endif
589             } br_sslrec_gcm_context;
590              
591             /**
592             * \brief Static, constant vtable for record decryption with GCM.
593             */
594             extern const br_sslrec_in_gcm_class br_sslrec_in_gcm_vtable;
595              
596             /**
597             * \brief Static, constant vtable for record encryption with GCM.
598             */
599             extern const br_sslrec_out_gcm_class br_sslrec_out_gcm_vtable;
600              
601             /* ===================================================================== */
602              
603             /**
604             * \brief Record decryption engine class, for ChaCha20+Poly1305.
605             *
606             * This class type extends the decryption engine class with an
607             * initialisation method that receives the parameters needed
608             * for ChaCha20+Poly1305 processing: ChaCha20 implementation,
609             * Poly1305 implementation, key, and 12-byte IV.
610             */
611             typedef struct br_sslrec_in_chapol_class_ br_sslrec_in_chapol_class;
612             struct br_sslrec_in_chapol_class_ {
613             /**
614             * \brief Superclass, as first vtable field.
615             */
616             br_sslrec_in_class inner;
617              
618             /**
619             * \brief Engine initialisation method.
620             *
621             * This method sets the vtable field in the context.
622             *
623             * \param ctx context to initialise.
624             * \param ichacha ChaCha20 implementation.
625             * \param ipoly Poly1305 implementation.
626             * \param key secret key (32 bytes).
627             * \param iv static IV (12 bytes).
628             */
629             void (*init)(const br_sslrec_in_chapol_class **ctx,
630             br_chacha20_run ichacha,
631             br_poly1305_run ipoly,
632             const void *key, const void *iv);
633             };
634              
635             /**
636             * \brief Record encryption engine class, for ChaCha20+Poly1305.
637             *
638             * This class type extends the encryption engine class with an
639             * initialisation method that receives the parameters needed
640             * for ChaCha20+Poly1305 processing: ChaCha20 implementation,
641             * Poly1305 implementation, key, and 12-byte IV.
642             */
643             typedef struct br_sslrec_out_chapol_class_ br_sslrec_out_chapol_class;
644             struct br_sslrec_out_chapol_class_ {
645             /**
646             * \brief Superclass, as first vtable field.
647             */
648             br_sslrec_out_class inner;
649              
650             /**
651             * \brief Engine initialisation method.
652             *
653             * This method sets the vtable field in the context.
654             *
655             * \param ctx context to initialise.
656             * \param ichacha ChaCha20 implementation.
657             * \param ipoly Poly1305 implementation.
658             * \param key secret key (32 bytes).
659             * \param iv static IV (12 bytes).
660             */
661             void (*init)(const br_sslrec_out_chapol_class **ctx,
662             br_chacha20_run ichacha,
663             br_poly1305_run ipoly,
664             const void *key, const void *iv);
665             };
666              
667             /**
668             * \brief Context structure for processing records with ChaCha20+Poly1305.
669             *
670             * The same context structure is used for encrypting and decrypting.
671             *
672             * The first field points to the vtable. The other fields are opaque
673             * and shall not be accessed directly.
674             */
675             typedef struct {
676             /** \brief Pointer to vtable. */
677             union {
678             const void *gen;
679             const br_sslrec_in_chapol_class *in;
680             const br_sslrec_out_chapol_class *out;
681             } vtable;
682             #ifndef BR_DOXYGEN_IGNORE
683             uint64_t seq;
684             unsigned char key[32];
685             unsigned char iv[12];
686             br_chacha20_run ichacha;
687             br_poly1305_run ipoly;
688             #endif
689             } br_sslrec_chapol_context;
690              
691             /**
692             * \brief Static, constant vtable for record decryption with ChaCha20+Poly1305.
693             */
694             extern const br_sslrec_in_chapol_class br_sslrec_in_chapol_vtable;
695              
696             /**
697             * \brief Static, constant vtable for record encryption with ChaCha20+Poly1305.
698             */
699             extern const br_sslrec_out_chapol_class br_sslrec_out_chapol_vtable;
700              
701             /* ===================================================================== */
702              
703             /**
704             * \brief Record decryption engine class, for CCM mode.
705             *
706             * This class type extends the decryption engine class with an
707             * initialisation method that receives the parameters needed
708             * for CCM processing: block cipher implementation, block cipher key,
709             * and 4-byte IV.
710             */
711             typedef struct br_sslrec_in_ccm_class_ br_sslrec_in_ccm_class;
712             struct br_sslrec_in_ccm_class_ {
713             /**
714             * \brief Superclass, as first vtable field.
715             */
716             br_sslrec_in_class inner;
717              
718             /**
719             * \brief Engine initialisation method.
720             *
721             * This method sets the vtable field in the context.
722             *
723             * \param ctx context to initialise.
724             * \param bc_impl block cipher implementation (CTR+CBC).
725             * \param key block cipher key.
726             * \param key_len block cipher key length (in bytes).
727             * \param iv static IV (4 bytes).
728             * \param tag_len tag length (in bytes)
729             */
730             void (*init)(const br_sslrec_in_ccm_class **ctx,
731             const br_block_ctrcbc_class *bc_impl,
732             const void *key, size_t key_len,
733             const void *iv, size_t tag_len);
734             };
735              
736             /**
737             * \brief Record encryption engine class, for CCM mode.
738             *
739             * This class type extends the encryption engine class with an
740             * initialisation method that receives the parameters needed
741             * for CCM processing: block cipher implementation, block cipher key,
742             * and 4-byte IV.
743             */
744             typedef struct br_sslrec_out_ccm_class_ br_sslrec_out_ccm_class;
745             struct br_sslrec_out_ccm_class_ {
746             /**
747             * \brief Superclass, as first vtable field.
748             */
749             br_sslrec_out_class inner;
750              
751             /**
752             * \brief Engine initialisation method.
753             *
754             * This method sets the vtable field in the context.
755             *
756             * \param ctx context to initialise.
757             * \param bc_impl block cipher implementation (CTR+CBC).
758             * \param key block cipher key.
759             * \param key_len block cipher key length (in bytes).
760             * \param iv static IV (4 bytes).
761             * \param tag_len tag length (in bytes)
762             */
763             void (*init)(const br_sslrec_out_ccm_class **ctx,
764             const br_block_ctrcbc_class *bc_impl,
765             const void *key, size_t key_len,
766             const void *iv, size_t tag_len);
767             };
768              
769             /**
770             * \brief Context structure for processing records with CCM.
771             *
772             * The same context structure is used for encrypting and decrypting.
773             *
774             * The first field points to the vtable. The other fields are opaque
775             * and shall not be accessed directly.
776             */
777             typedef struct {
778             /** \brief Pointer to vtable. */
779             union {
780             const void *gen;
781             const br_sslrec_in_ccm_class *in;
782             const br_sslrec_out_ccm_class *out;
783             } vtable;
784             #ifndef BR_DOXYGEN_IGNORE
785             uint64_t seq;
786             union {
787             const br_block_ctrcbc_class *vtable;
788             br_aes_gen_ctrcbc_keys aes;
789             } bc;
790             unsigned char iv[4];
791             size_t tag_len;
792             #endif
793             } br_sslrec_ccm_context;
794              
795             /**
796             * \brief Static, constant vtable for record decryption with CCM.
797             */
798             extern const br_sslrec_in_ccm_class br_sslrec_in_ccm_vtable;
799              
800             /**
801             * \brief Static, constant vtable for record encryption with CCM.
802             */
803             extern const br_sslrec_out_ccm_class br_sslrec_out_ccm_vtable;
804              
805             /* ===================================================================== */
806              
807             /**
808             * \brief Type for session parameters, to be saved for session resumption.
809             */
810             typedef struct {
811             /** \brief Session ID buffer. */
812             unsigned char session_id[32];
813             /** \brief Session ID length (in bytes, at most 32). */
814             unsigned char session_id_len;
815             /** \brief Protocol version. */
816             uint16_t version;
817             /** \brief Cipher suite. */
818             uint16_t cipher_suite;
819             /** \brief Master secret. */
820             unsigned char master_secret[48];
821             } br_ssl_session_parameters;
822              
823             #ifndef BR_DOXYGEN_IGNORE
824             /*
825             * Maximum number of cipher suites supported by a client or server.
826             */
827             #define BR_MAX_CIPHER_SUITES 48
828             #endif
829              
830             /**
831             * \brief Context structure for SSL engine.
832             *
833             * This strucuture is common to the client and server; both the client
834             * context (`br_ssl_client_context`) and the server context
835             * (`br_ssl_server_context`) include a `br_ssl_engine_context` as their
836             * first field.
837             *
838             * The engine context manages records, including alerts, closures, and
839             * transitions to new encryption/MAC algorithms. Processing of handshake
840             * records is delegated to externally provided code. This structure
841             * should not be used directly.
842             *
843             * Structure contents are opaque and shall not be accessed directly.
844             */
845             typedef struct {
846             #ifndef BR_DOXYGEN_IGNORE
847             /*
848             * The error code. When non-zero, then the state is "failed" and
849             * no I/O may occur until reset.
850             */
851             int err;
852              
853             /*
854             * Configured I/O buffers. They are either disjoint, or identical.
855             */
856             unsigned char *ibuf, *obuf;
857             size_t ibuf_len, obuf_len;
858              
859             /*
860             * Maximum fragment length applies to outgoing records; incoming
861             * records can be processed as long as they fit in the input
862             * buffer. It is guaranteed that incoming records at least as big
863             * as max_frag_len can be processed.
864             */
865             uint16_t max_frag_len;
866             unsigned char log_max_frag_len;
867             unsigned char peer_log_max_frag_len;
868              
869             /*
870             * Buffering management registers.
871             */
872             size_t ixa, ixb, ixc;
873             size_t oxa, oxb, oxc;
874             unsigned char iomode;
875             unsigned char incrypt;
876              
877             /*
878             * Shutdown flag: when set to non-zero, incoming record bytes
879             * will not be accepted anymore. This is used after a close_notify
880             * has been received: afterwards, the engine no longer claims that
881             * it could receive bytes from the transport medium.
882             */
883             unsigned char shutdown_recv;
884              
885             /*
886             * 'record_type_in' is set to the incoming record type when the
887             * record header has been received.
888             * 'record_type_out' is used to make the next outgoing record
889             * header when it is ready to go.
890             */
891             unsigned char record_type_in, record_type_out;
892              
893             /*
894             * When a record is received, its version is extracted:
895             * -- if 'version_in' is 0, then it is set to the received version;
896             * -- otherwise, if the received version is not identical to
897             * the 'version_in' contents, then a failure is reported.
898             *
899             * This implements the SSL requirement that all records shall
900             * use the negotiated protocol version, once decided (in the
901             * ServerHello). It is up to the handshake handler to adjust this
902             * field when necessary.
903             */
904             uint16_t version_in;
905              
906             /*
907             * 'version_out' is used when the next outgoing record is ready
908             * to go.
909             */
910             uint16_t version_out;
911              
912             /*
913             * Record handler contexts.
914             */
915             union {
916             const br_sslrec_in_class *vtable;
917             br_sslrec_in_cbc_context cbc;
918             br_sslrec_gcm_context gcm;
919             br_sslrec_chapol_context chapol;
920             br_sslrec_ccm_context ccm;
921             } in;
922             union {
923             const br_sslrec_out_class *vtable;
924             br_sslrec_out_clear_context clear;
925             br_sslrec_out_cbc_context cbc;
926             br_sslrec_gcm_context gcm;
927             br_sslrec_chapol_context chapol;
928             br_sslrec_ccm_context ccm;
929             } out;
930              
931             /*
932             * The "application data" flag. Value:
933             * 0 handshake is in process, no application data acceptable
934             * 1 application data can be sent and received
935             * 2 closing, no application data can be sent, but some
936             * can still be received (and discarded)
937             */
938             unsigned char application_data;
939              
940             /*
941             * Context RNG.
942             *
943             * rng_init_done is initially 0. It is set to 1 when the
944             * basic structure of the RNG is set, and 2 when some
945             * entropy has been pushed in. The value 2 marks the RNG
946             * as "properly seeded".
947             *
948             * rng_os_rand_done is initially 0. It is set to 1 when
949             * some seeding from the OS or hardware has been attempted.
950             */
951             br_hmac_drbg_context rng;
952             int rng_init_done;
953             int rng_os_rand_done;
954              
955             /*
956             * Supported minimum and maximum versions, and cipher suites.
957             */
958             uint16_t version_min;
959             uint16_t version_max;
960             uint16_t suites_buf[BR_MAX_CIPHER_SUITES];
961             unsigned char suites_num;
962              
963             /*
964             * For clients, the server name to send as a SNI extension. For
965             * servers, the name received in the SNI extension (if any).
966             */
967             char server_name[256];
968              
969             /*
970             * "Security parameters". These are filled by the handshake
971             * handler, and used when switching encryption state.
972             */
973             unsigned char client_random[32];
974             unsigned char server_random[32];
975             br_ssl_session_parameters session;
976              
977             /*
978             * ECDHE elements: curve and point from the peer. The server also
979             * uses that buffer for the point to send to the client.
980             */
981             unsigned char ecdhe_curve;
982             unsigned char ecdhe_point[133];
983             unsigned char ecdhe_point_len;
984              
985             /*
986             * Secure renegotiation (RFC 5746): 'reneg' can be:
987             * 0 first handshake (server support is not known)
988             * 1 peer does not support secure renegotiation
989             * 2 peer supports secure renegotiation
990             *
991             * The saved_finished buffer contains the client and the
992             * server "Finished" values from the last handshake, in
993             * that order (12 bytes each).
994             */
995             unsigned char reneg;
996             unsigned char saved_finished[24];
997              
998             /*
999             * Behavioural flags.
1000             */
1001             uint32_t flags;
1002              
1003             /*
1004             * Context variables for the handshake processor. The 'pad' must
1005             * be large enough to accommodate an RSA-encrypted pre-master
1006             * secret, or an RSA signature; since we want to support up to
1007             * RSA-4096, this means at least 512 bytes. (Other pad usages
1008             * require its length to be at least 256.)
1009             */
1010             struct {
1011             uint32_t *dp;
1012             uint32_t *rp;
1013             const unsigned char *ip;
1014             } cpu;
1015             uint32_t dp_stack[32];
1016             uint32_t rp_stack[32];
1017             unsigned char pad[512];
1018             unsigned char *hbuf_in, *hbuf_out, *saved_hbuf_out;
1019             size_t hlen_in, hlen_out;
1020             void (*hsrun)(void *ctx);
1021              
1022             /*
1023             * The 'action' value communicates OOB information between the
1024             * engine and the handshake processor.
1025             *
1026             * From the engine:
1027             * 0 invocation triggered by I/O
1028             * 1 invocation triggered by explicit close
1029             * 2 invocation triggered by explicit renegotiation
1030             */
1031             unsigned char action;
1032              
1033             /*
1034             * State for alert messages. Value is either 0, or the value of
1035             * the alert level byte (level is either 1 for warning, or 2 for
1036             * fatal; we convert all other values to 'fatal').
1037             */
1038             unsigned char alert;
1039              
1040             /*
1041             * Closure flags. This flag is set when a close_notify has been
1042             * received from the peer.
1043             */
1044             unsigned char close_received;
1045              
1046             /*
1047             * Multi-hasher for the handshake messages. The handshake handler
1048             * is responsible for resetting it when appropriate.
1049             */
1050             br_multihash_context mhash;
1051              
1052             /*
1053             * Pointer to the X.509 engine. The engine is supposed to be
1054             * already initialized. It is used to validate the peer's
1055             * certificate.
1056             */
1057             const br_x509_class **x509ctx;
1058              
1059             /*
1060             * Certificate chain to send. This is used by both client and
1061             * server, when they send their respective Certificate messages.
1062             * If chain_len is 0, then chain may be NULL.
1063             */
1064             const br_x509_certificate *chain;
1065             size_t chain_len;
1066             const unsigned char *cert_cur;
1067             size_t cert_len;
1068              
1069             /*
1070             * List of supported protocol names (ALPN extension). If unset,
1071             * (number of names is 0), then:
1072             * - the client sends no ALPN extension;
1073             * - the server ignores any incoming ALPN extension.
1074             *
1075             * Otherwise:
1076             * - the client sends an ALPN extension with all the names;
1077             * - the server selects the first protocol in its list that
1078             * the client also supports, or fails (fatal alert 120)
1079             * if the client sends an ALPN extension and there is no
1080             * match.
1081             *
1082             * The 'selected_protocol' field contains 1+n if the matching
1083             * name has index n in the list (the value is 0 if no match was
1084             * performed, e.g. the peer did not send an ALPN extension).
1085             */
1086             const char **protocol_names;
1087             uint16_t protocol_names_num;
1088             uint16_t selected_protocol;
1089              
1090             /*
1091             * Pointers to implementations; left to NULL for unsupported
1092             * functions. For the raw hash functions, implementations are
1093             * referenced from the multihasher (mhash field).
1094             */
1095             br_tls_prf_impl prf10;
1096             br_tls_prf_impl prf_sha256;
1097             br_tls_prf_impl prf_sha384;
1098             const br_block_cbcenc_class *iaes_cbcenc;
1099             const br_block_cbcdec_class *iaes_cbcdec;
1100             const br_block_ctr_class *iaes_ctr;
1101             const br_block_ctrcbc_class *iaes_ctrcbc;
1102             const br_block_cbcenc_class *ides_cbcenc;
1103             const br_block_cbcdec_class *ides_cbcdec;
1104             br_ghash ighash;
1105             br_chacha20_run ichacha;
1106             br_poly1305_run ipoly;
1107             const br_sslrec_in_cbc_class *icbc_in;
1108             const br_sslrec_out_cbc_class *icbc_out;
1109             const br_sslrec_in_gcm_class *igcm_in;
1110             const br_sslrec_out_gcm_class *igcm_out;
1111             const br_sslrec_in_chapol_class *ichapol_in;
1112             const br_sslrec_out_chapol_class *ichapol_out;
1113             const br_sslrec_in_ccm_class *iccm_in;
1114             const br_sslrec_out_ccm_class *iccm_out;
1115             const br_ec_impl *iec;
1116             br_rsa_pkcs1_vrfy irsavrfy;
1117             br_ecdsa_vrfy iecdsa;
1118             #endif
1119             } br_ssl_engine_context;
1120              
1121             /**
1122             * \brief Get currently defined engine behavioural flags.
1123             *
1124             * \param cc SSL engine context.
1125             * \return the flags.
1126             */
1127             static inline uint32_t
1128             br_ssl_engine_get_flags(br_ssl_engine_context *cc)
1129             {
1130             return cc->flags;
1131             }
1132              
1133             /**
1134             * \brief Set all engine behavioural flags.
1135             *
1136             * \param cc SSL engine context.
1137             * \param flags new value for all flags.
1138             */
1139             static inline void
1140             br_ssl_engine_set_all_flags(br_ssl_engine_context *cc, uint32_t flags)
1141             {
1142             cc->flags = flags;
1143             }
1144              
1145             /**
1146             * \brief Set some engine behavioural flags.
1147             *
1148             * The flags set in the `flags` parameter are set in the context; other
1149             * flags are untouched.
1150             *
1151             * \param cc SSL engine context.
1152             * \param flags additional set flags.
1153             */
1154             static inline void
1155             br_ssl_engine_add_flags(br_ssl_engine_context *cc, uint32_t flags)
1156             {
1157             cc->flags |= flags;
1158             }
1159              
1160             /**
1161             * \brief Clear some engine behavioural flags.
1162             *
1163             * The flags set in the `flags` parameter are cleared from the context; other
1164             * flags are untouched.
1165             *
1166             * \param cc SSL engine context.
1167             * \param flags flags to remove.
1168             */
1169             static inline void
1170             br_ssl_engine_remove_flags(br_ssl_engine_context *cc, uint32_t flags)
1171             {
1172             cc->flags &= ~flags;
1173             }
1174              
1175             /**
1176             * \brief Behavioural flag: enforce server preferences.
1177             *
1178             * If this flag is set, then the server will enforce its own cipher suite
1179             * preference order; otherwise, it follows the client preferences.
1180             */
1181             #define BR_OPT_ENFORCE_SERVER_PREFERENCES ((uint32_t)1 << 0)
1182              
1183             /**
1184             * \brief Behavioural flag: disable renegotiation.
1185             *
1186             * If this flag is set, then renegotiations are rejected unconditionally:
1187             * they won't be honoured if asked for programmatically, and requests from
1188             * the peer are rejected.
1189             */
1190             #define BR_OPT_NO_RENEGOTIATION ((uint32_t)1 << 1)
1191              
1192             /**
1193             * \brief Behavioural flag: tolerate lack of client authentication.
1194             *
1195             * If this flag is set in a server and the server requests a client
1196             * certificate, but the authentication fails (the client does not send
1197             * a certificate, or the client's certificate chain cannot be validated),
1198             * then the connection keeps on. Without this flag, a failed client
1199             * authentication terminates the connection.
1200             *
1201             * Notes:
1202             *
1203             * - If the client's certificate can be validated and its public key is
1204             * supported, then a wrong signature value terminates the connection
1205             * regardless of that flag.
1206             *
1207             * - If using full-static ECDH, then a failure to validate the client's
1208             * certificate prevents the handshake from succeeding.
1209             */
1210             #define BR_OPT_TOLERATE_NO_CLIENT_AUTH ((uint32_t)1 << 2)
1211              
1212             /**
1213             * \brief Behavioural flag: fail on application protocol mismatch.
1214             *
1215             * The ALPN extension ([RFC 7301](https://tools.ietf.org/html/rfc7301))
1216             * allows the client to send a list of application protocol names, and
1217             * the server to select one. A mismatch is one of the following occurrences:
1218             *
1219             * - On the client: the client sends a list of names, the server
1220             * responds with a protocol name which is _not_ part of the list of
1221             * names sent by the client.
1222             *
1223             * - On the server: the client sends a list of names, and the server
1224             * is also configured with a list of names, but there is no common
1225             * protocol name between the two lists.
1226             *
1227             * Normal behaviour in case of mismatch is to report no matching name
1228             * (`br_ssl_engine_get_selected_protocol()` returns `NULL`) and carry on.
1229             * If the flag is set, then a mismatch implies a protocol failure (if
1230             * the mismatch is detected by the server, it will send a fatal alert).
1231             *
1232             * Note: even with this flag, `br_ssl_engine_get_selected_protocol()`
1233             * may still return `NULL` if the client or the server does not send an
1234             * ALPN extension at all.
1235             */
1236             #define BR_OPT_FAIL_ON_ALPN_MISMATCH ((uint32_t)1 << 3)
1237              
1238             /**
1239             * \brief Set the minimum and maximum supported protocol versions.
1240             *
1241             * The two provided versions MUST be supported by the implementation
1242             * (i.e. TLS 1.0, 1.1 and 1.2), and `version_max` MUST NOT be lower
1243             * than `version_min`.
1244             *
1245             * \param cc SSL engine context.
1246             * \param version_min minimum supported TLS version.
1247             * \param version_max maximum supported TLS version.
1248             */
1249             static inline void
1250 0           br_ssl_engine_set_versions(br_ssl_engine_context *cc,
1251             unsigned version_min, unsigned version_max)
1252             {
1253 0           cc->version_min = (uint16_t)version_min;
1254 0           cc->version_max = (uint16_t)version_max;
1255 0           }
1256              
1257             /**
1258             * \brief Set the list of cipher suites advertised by this context.
1259             *
1260             * The provided array is copied into the context. It is the caller
1261             * responsibility to ensure that all provided suites will be supported
1262             * by the context. The engine context has enough room to receive _all_
1263             * suites supported by the implementation. The provided array MUST NOT
1264             * contain duplicates.
1265             *
1266             * If the engine is for a client, the "signaling" pseudo-cipher suite
1267             * `TLS_FALLBACK_SCSV` can be added at the end of the list, if the
1268             * calling application is performing a voluntary downgrade (voluntary
1269             * downgrades are not recommended, but if such a downgrade is done, then
1270             * adding the fallback pseudo-suite is a good idea).
1271             *
1272             * \param cc SSL engine context.
1273             * \param suites cipher suites.
1274             * \param suites_num number of cipher suites.
1275             */
1276             void br_ssl_engine_set_suites(br_ssl_engine_context *cc,
1277             const uint16_t *suites, size_t suites_num);
1278              
1279             /**
1280             * \brief Set the X.509 engine.
1281             *
1282             * The caller shall ensure that the X.509 engine is properly initialised.
1283             *
1284             * \param cc SSL engine context.
1285             * \param x509ctx X.509 certificate validation context.
1286             */
1287             static inline void
1288 0           br_ssl_engine_set_x509(br_ssl_engine_context *cc, const br_x509_class **x509ctx)
1289             {
1290 0           cc->x509ctx = x509ctx;
1291 0           }
1292              
1293             /**
1294             * \brief Set the supported protocol names.
1295             *
1296             * Protocol names are part of the ALPN extension ([RFC
1297             * 7301](https://tools.ietf.org/html/rfc7301)). Each protocol name is a
1298             * character string, containing no more than 255 characters (256 with the
1299             * terminating zero). When names are set, then:
1300             *
1301             * - The client will send an ALPN extension, containing the names. If
1302             * the server responds with an ALPN extension, the client will verify
1303             * that the response contains one of its name, and report that name
1304             * through `br_ssl_engine_get_selected_protocol()`.
1305             *
1306             * - The server will parse incoming ALPN extension (from clients), and
1307             * try to find a common protocol; if none is found, the connection
1308             * is aborted with a fatal alert. On match, a response ALPN extension
1309             * is sent, and name is reported through
1310             * `br_ssl_engine_get_selected_protocol()`.
1311             *
1312             * The provided array is linked in, and must remain valid while the
1313             * connection is live.
1314             *
1315             * Names MUST NOT be empty. Names MUST NOT be longer than 255 characters
1316             * (excluding the terminating 0).
1317             *
1318             * \param ctx SSL engine context.
1319             * \param names list of protocol names (zero-terminated).
1320             * \param num number of protocol names (MUST be 1 or more).
1321             */
1322             static inline void
1323             br_ssl_engine_set_protocol_names(br_ssl_engine_context *ctx,
1324             const char **names, size_t num)
1325             {
1326             ctx->protocol_names = names;
1327             ctx->protocol_names_num = (uint16_t)num;
1328             }
1329              
1330             /**
1331             * \brief Get the selected protocol.
1332             *
1333             * If this context was initialised with a non-empty list of protocol
1334             * names, and both client and server sent ALPN extensions during the
1335             * handshake, and a common name was found, then that name is returned.
1336             * Otherwise, `NULL` is returned.
1337             *
1338             * The returned pointer is one of the pointers provided to the context
1339             * with `br_ssl_engine_set_protocol_names()`.
1340             *
1341             * \return the selected protocol, or `NULL`.
1342             */
1343             static inline const char *
1344             br_ssl_engine_get_selected_protocol(br_ssl_engine_context *ctx)
1345             {
1346             unsigned k;
1347              
1348             k = ctx->selected_protocol;
1349             return (k == 0 || k == 0xFFFF) ? NULL : ctx->protocol_names[k - 1];
1350             }
1351              
1352             /**
1353             * \brief Set a hash function implementation (by ID).
1354             *
1355             * Hash functions set with this call will be used for SSL/TLS specific
1356             * usages, not X.509 certificate validation. Only "standard" hash functions
1357             * may be set (MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512). If `impl`
1358             * is `NULL`, then the hash function support is removed, not added.
1359             *
1360             * \param ctx SSL engine context.
1361             * \param id hash function identifier.
1362             * \param impl hash function implementation (or `NULL`).
1363             */
1364             static inline void
1365             br_ssl_engine_set_hash(br_ssl_engine_context *ctx,
1366             int id, const br_hash_class *impl)
1367             {
1368             br_multihash_setimpl(&ctx->mhash, id, impl);
1369             }
1370              
1371             /**
1372             * \brief Get a hash function implementation (by ID).
1373             *
1374             * This function retrieves a hash function implementation which was
1375             * set with `br_ssl_engine_set_hash()`.
1376             *
1377             * \param ctx SSL engine context.
1378             * \param id hash function identifier.
1379             * \return the hash function implementation (or `NULL`).
1380             */
1381             static inline const br_hash_class *
1382             br_ssl_engine_get_hash(br_ssl_engine_context *ctx, int id)
1383             {
1384             return br_multihash_getimpl(&ctx->mhash, id);
1385             }
1386              
1387             /**
1388             * \brief Set the PRF implementation (for TLS 1.0 and 1.1).
1389             *
1390             * This function sets (or removes, if `impl` is `NULL`) the implementation
1391             * for the PRF used in TLS 1.0 and 1.1.
1392             *
1393             * \param cc SSL engine context.
1394             * \param impl PRF implementation (or `NULL`).
1395             */
1396             static inline void
1397             br_ssl_engine_set_prf10(br_ssl_engine_context *cc, br_tls_prf_impl impl)
1398             {
1399             cc->prf10 = impl;
1400             }
1401              
1402             /**
1403             * \brief Set the PRF implementation with SHA-256 (for TLS 1.2).
1404             *
1405             * This function sets (or removes, if `impl` is `NULL`) the implementation
1406             * for the SHA-256 variant of the PRF used in TLS 1.2.
1407             *
1408             * \param cc SSL engine context.
1409             * \param impl PRF implementation (or `NULL`).
1410             */
1411             static inline void
1412             br_ssl_engine_set_prf_sha256(br_ssl_engine_context *cc, br_tls_prf_impl impl)
1413             {
1414             cc->prf_sha256 = impl;
1415             }
1416              
1417             /**
1418             * \brief Set the PRF implementation with SHA-384 (for TLS 1.2).
1419             *
1420             * This function sets (or removes, if `impl` is `NULL`) the implementation
1421             * for the SHA-384 variant of the PRF used in TLS 1.2.
1422             *
1423             * \param cc SSL engine context.
1424             * \param impl PRF implementation (or `NULL`).
1425             */
1426             static inline void
1427             br_ssl_engine_set_prf_sha384(br_ssl_engine_context *cc, br_tls_prf_impl impl)
1428             {
1429             cc->prf_sha384 = impl;
1430             }
1431              
1432             /**
1433             * \brief Set the AES/CBC implementations.
1434             *
1435             * \param cc SSL engine context.
1436             * \param impl_enc AES/CBC encryption implementation (or `NULL`).
1437             * \param impl_dec AES/CBC decryption implementation (or `NULL`).
1438             */
1439             static inline void
1440             br_ssl_engine_set_aes_cbc(br_ssl_engine_context *cc,
1441             const br_block_cbcenc_class *impl_enc,
1442             const br_block_cbcdec_class *impl_dec)
1443             {
1444             cc->iaes_cbcenc = impl_enc;
1445             cc->iaes_cbcdec = impl_dec;
1446             }
1447              
1448             /**
1449             * \brief Set the "default" AES/CBC implementations.
1450             *
1451             * This function configures in the engine the AES implementations that
1452             * should provide best runtime performance on the local system, while
1453             * still being safe (in particular, constant-time). It also sets the
1454             * handlers for CBC records.
1455             *
1456             * \param cc SSL engine context.
1457             */
1458             void br_ssl_engine_set_default_aes_cbc(br_ssl_engine_context *cc);
1459              
1460             /**
1461             * \brief Set the AES/CTR implementation.
1462             *
1463             * \param cc SSL engine context.
1464             * \param impl AES/CTR encryption/decryption implementation (or `NULL`).
1465             */
1466             static inline void
1467             br_ssl_engine_set_aes_ctr(br_ssl_engine_context *cc,
1468             const br_block_ctr_class *impl)
1469             {
1470             cc->iaes_ctr = impl;
1471             }
1472              
1473             /**
1474             * \brief Set the "default" implementations for AES/GCM (AES/CTR + GHASH).
1475             *
1476             * This function configures in the engine the AES/CTR and GHASH
1477             * implementation that should provide best runtime performance on the local
1478             * system, while still being safe (in particular, constant-time). It also
1479             * sets the handlers for GCM records.
1480             *
1481             * \param cc SSL engine context.
1482             */
1483             void br_ssl_engine_set_default_aes_gcm(br_ssl_engine_context *cc);
1484              
1485             /**
1486             * \brief Set the DES/CBC implementations.
1487             *
1488             * \param cc SSL engine context.
1489             * \param impl_enc DES/CBC encryption implementation (or `NULL`).
1490             * \param impl_dec DES/CBC decryption implementation (or `NULL`).
1491             */
1492             static inline void
1493             br_ssl_engine_set_des_cbc(br_ssl_engine_context *cc,
1494             const br_block_cbcenc_class *impl_enc,
1495             const br_block_cbcdec_class *impl_dec)
1496             {
1497             cc->ides_cbcenc = impl_enc;
1498             cc->ides_cbcdec = impl_dec;
1499             }
1500              
1501             /**
1502             * \brief Set the "default" DES/CBC implementations.
1503             *
1504             * This function configures in the engine the DES implementations that
1505             * should provide best runtime performance on the local system, while
1506             * still being safe (in particular, constant-time). It also sets the
1507             * handlers for CBC records.
1508             *
1509             * \param cc SSL engine context.
1510             */
1511             void br_ssl_engine_set_default_des_cbc(br_ssl_engine_context *cc);
1512              
1513             /**
1514             * \brief Set the GHASH implementation (used in GCM mode).
1515             *
1516             * \param cc SSL engine context.
1517             * \param impl GHASH implementation (or `NULL`).
1518             */
1519             static inline void
1520             br_ssl_engine_set_ghash(br_ssl_engine_context *cc, br_ghash impl)
1521             {
1522             cc->ighash = impl;
1523             }
1524              
1525             /**
1526             * \brief Set the ChaCha20 implementation.
1527             *
1528             * \param cc SSL engine context.
1529             * \param ichacha ChaCha20 implementation (or `NULL`).
1530             */
1531             static inline void
1532             br_ssl_engine_set_chacha20(br_ssl_engine_context *cc,
1533             br_chacha20_run ichacha)
1534             {
1535             cc->ichacha = ichacha;
1536             }
1537              
1538             /**
1539             * \brief Set the Poly1305 implementation.
1540             *
1541             * \param cc SSL engine context.
1542             * \param ipoly Poly1305 implementation (or `NULL`).
1543             */
1544             static inline void
1545             br_ssl_engine_set_poly1305(br_ssl_engine_context *cc,
1546             br_poly1305_run ipoly)
1547             {
1548             cc->ipoly = ipoly;
1549             }
1550              
1551             /**
1552             * \brief Set the "default" ChaCha20 and Poly1305 implementations.
1553             *
1554             * This function configures in the engine the ChaCha20 and Poly1305
1555             * implementations that should provide best runtime performance on the
1556             * local system, while still being safe (in particular, constant-time).
1557             * It also sets the handlers for ChaCha20+Poly1305 records.
1558             *
1559             * \param cc SSL engine context.
1560             */
1561             void br_ssl_engine_set_default_chapol(br_ssl_engine_context *cc);
1562              
1563             /**
1564             * \brief Set the AES/CTR+CBC implementation.
1565             *
1566             * \param cc SSL engine context.
1567             * \param impl AES/CTR+CBC encryption/decryption implementation (or `NULL`).
1568             */
1569             static inline void
1570             br_ssl_engine_set_aes_ctrcbc(br_ssl_engine_context *cc,
1571             const br_block_ctrcbc_class *impl)
1572             {
1573             cc->iaes_ctrcbc = impl;
1574             }
1575              
1576             /**
1577             * \brief Set the "default" implementations for AES/CCM.
1578             *
1579             * This function configures in the engine the AES/CTR+CBC
1580             * implementation that should provide best runtime performance on the local
1581             * system, while still being safe (in particular, constant-time). It also
1582             * sets the handlers for CCM records.
1583             *
1584             * \param cc SSL engine context.
1585             */
1586             void br_ssl_engine_set_default_aes_ccm(br_ssl_engine_context *cc);
1587              
1588             /**
1589             * \brief Set the record encryption and decryption engines for CBC + HMAC.
1590             *
1591             * \param cc SSL engine context.
1592             * \param impl_in record CBC decryption implementation (or `NULL`).
1593             * \param impl_out record CBC encryption implementation (or `NULL`).
1594             */
1595             static inline void
1596             br_ssl_engine_set_cbc(br_ssl_engine_context *cc,
1597             const br_sslrec_in_cbc_class *impl_in,
1598             const br_sslrec_out_cbc_class *impl_out)
1599             {
1600             cc->icbc_in = impl_in;
1601             cc->icbc_out = impl_out;
1602             }
1603              
1604             /**
1605             * \brief Set the record encryption and decryption engines for GCM.
1606             *
1607             * \param cc SSL engine context.
1608             * \param impl_in record GCM decryption implementation (or `NULL`).
1609             * \param impl_out record GCM encryption implementation (or `NULL`).
1610             */
1611             static inline void
1612             br_ssl_engine_set_gcm(br_ssl_engine_context *cc,
1613             const br_sslrec_in_gcm_class *impl_in,
1614             const br_sslrec_out_gcm_class *impl_out)
1615             {
1616             cc->igcm_in = impl_in;
1617             cc->igcm_out = impl_out;
1618             }
1619              
1620             /**
1621             * \brief Set the record encryption and decryption engines for CCM.
1622             *
1623             * \param cc SSL engine context.
1624             * \param impl_in record CCM decryption implementation (or `NULL`).
1625             * \param impl_out record CCM encryption implementation (or `NULL`).
1626             */
1627             static inline void
1628             br_ssl_engine_set_ccm(br_ssl_engine_context *cc,
1629             const br_sslrec_in_ccm_class *impl_in,
1630             const br_sslrec_out_ccm_class *impl_out)
1631             {
1632             cc->iccm_in = impl_in;
1633             cc->iccm_out = impl_out;
1634             }
1635              
1636             /**
1637             * \brief Set the record encryption and decryption engines for
1638             * ChaCha20+Poly1305.
1639             *
1640             * \param cc SSL engine context.
1641             * \param impl_in record ChaCha20 decryption implementation (or `NULL`).
1642             * \param impl_out record ChaCha20 encryption implementation (or `NULL`).
1643             */
1644             static inline void
1645             br_ssl_engine_set_chapol(br_ssl_engine_context *cc,
1646             const br_sslrec_in_chapol_class *impl_in,
1647             const br_sslrec_out_chapol_class *impl_out)
1648             {
1649             cc->ichapol_in = impl_in;
1650             cc->ichapol_out = impl_out;
1651             }
1652              
1653             /**
1654             * \brief Set the EC implementation.
1655             *
1656             * The elliptic curve implementation will be used for ECDH and ECDHE
1657             * cipher suites, and for ECDSA support.
1658             *
1659             * \param cc SSL engine context.
1660             * \param iec EC implementation (or `NULL`).
1661             */
1662             static inline void
1663             br_ssl_engine_set_ec(br_ssl_engine_context *cc, const br_ec_impl *iec)
1664             {
1665             cc->iec = iec;
1666             }
1667              
1668             /**
1669             * \brief Set the "default" EC implementation.
1670             *
1671             * This function sets the elliptic curve implementation for ECDH and
1672             * ECDHE cipher suites, and for ECDSA support. It selects the fastest
1673             * implementation on the current system.
1674             *
1675             * \param cc SSL engine context.
1676             */
1677             void br_ssl_engine_set_default_ec(br_ssl_engine_context *cc);
1678              
1679             /**
1680             * \brief Get the EC implementation configured in the provided engine.
1681             *
1682             * \param cc SSL engine context.
1683             * \return the EC implementation.
1684             */
1685             static inline const br_ec_impl *
1686             br_ssl_engine_get_ec(br_ssl_engine_context *cc)
1687             {
1688             return cc->iec;
1689             }
1690              
1691             /**
1692             * \brief Set the RSA signature verification implementation.
1693             *
1694             * On the client, this is used to verify the server's signature on its
1695             * ServerKeyExchange message (for ECDHE_RSA cipher suites). On the server,
1696             * this is used to verify the client's CertificateVerify message (if a
1697             * client certificate is requested, and that certificate contains a RSA key).
1698             *
1699             * \param cc SSL engine context.
1700             * \param irsavrfy RSA signature verification implementation.
1701             */
1702             static inline void
1703             br_ssl_engine_set_rsavrfy(br_ssl_engine_context *cc, br_rsa_pkcs1_vrfy irsavrfy)
1704             {
1705             cc->irsavrfy = irsavrfy;
1706             }
1707              
1708             /**
1709             * \brief Set the "default" RSA implementation (signature verification).
1710             *
1711             * This function sets the RSA implementation (signature verification)
1712             * to the fastest implementation available on the current platform.
1713             *
1714             * \param cc SSL engine context.
1715             */
1716             void br_ssl_engine_set_default_rsavrfy(br_ssl_engine_context *cc);
1717              
1718             /**
1719             * \brief Get the RSA implementation (signature verification) configured
1720             * in the provided engine.
1721             *
1722             * \param cc SSL engine context.
1723             * \return the RSA signature verification implementation.
1724             */
1725             static inline br_rsa_pkcs1_vrfy
1726             br_ssl_engine_get_rsavrfy(br_ssl_engine_context *cc)
1727             {
1728             return cc->irsavrfy;
1729             }
1730              
1731             /*
1732             * \brief Set the ECDSA implementation (signature verification).
1733             *
1734             * On the client, this is used to verify the server's signature on its
1735             * ServerKeyExchange message (for ECDHE_ECDSA cipher suites). On the server,
1736             * this is used to verify the client's CertificateVerify message (if a
1737             * client certificate is requested, that certificate contains an EC key,
1738             * and full-static ECDH is not used).
1739             *
1740             * The ECDSA implementation will use the EC core implementation configured
1741             * in the engine context.
1742             *
1743             * \param cc client context.
1744             * \param iecdsa ECDSA verification implementation.
1745             */
1746             static inline void
1747             br_ssl_engine_set_ecdsa(br_ssl_engine_context *cc, br_ecdsa_vrfy iecdsa)
1748             {
1749             cc->iecdsa = iecdsa;
1750             }
1751              
1752             /**
1753             * \brief Set the "default" ECDSA implementation (signature verification).
1754             *
1755             * This function sets the ECDSA implementation (signature verification)
1756             * to the fastest implementation available on the current platform. This
1757             * call also sets the elliptic curve implementation itself, there again
1758             * to the fastest EC implementation available.
1759             *
1760             * \param cc SSL engine context.
1761             */
1762             void br_ssl_engine_set_default_ecdsa(br_ssl_engine_context *cc);
1763              
1764             /**
1765             * \brief Get the ECDSA implementation (signature verification) configured
1766             * in the provided engine.
1767             *
1768             * \param cc SSL engine context.
1769             * \return the ECDSA signature verification implementation.
1770             */
1771             static inline br_ecdsa_vrfy
1772             br_ssl_engine_get_ecdsa(br_ssl_engine_context *cc)
1773             {
1774             return cc->iecdsa;
1775             }
1776              
1777             /**
1778             * \brief Set the I/O buffer for the SSL engine.
1779             *
1780             * Once this call has been made, `br_ssl_client_reset()` or
1781             * `br_ssl_server_reset()` MUST be called before using the context.
1782             *
1783             * The provided buffer will be used as long as the engine context is
1784             * used. The caller is responsible for keeping it available.
1785             *
1786             * If `bidi` is 0, then the engine will operate in half-duplex mode
1787             * (it won't be able to send data while there is unprocessed incoming
1788             * data in the buffer, and it won't be able to receive data while there
1789             * is unsent data in the buffer). The optimal buffer size in half-duplex
1790             * mode is `BR_SSL_BUFSIZE_MONO`; if the buffer is larger, then extra
1791             * bytes are ignored. If the buffer is smaller, then this limits the
1792             * capacity of the engine to support all allowed record sizes.
1793             *
1794             * If `bidi` is 1, then the engine will split the buffer into two
1795             * parts, for separate handling of outgoing and incoming data. This
1796             * enables full-duplex processing, but requires more RAM. The optimal
1797             * buffer size in full-duplex mode is `BR_SSL_BUFSIZE_BIDI`; if the
1798             * buffer is larger, then extra bytes are ignored. If the buffer is
1799             * smaller, then the split will favour the incoming part, so that
1800             * interoperability is maximised.
1801             *
1802             * \param cc SSL engine context
1803             * \param iobuf I/O buffer.
1804             * \param iobuf_len I/O buffer length (in bytes).
1805             * \param bidi non-zero for full-duplex mode.
1806             */
1807             void br_ssl_engine_set_buffer(br_ssl_engine_context *cc,
1808             void *iobuf, size_t iobuf_len, int bidi);
1809              
1810             /**
1811             * \brief Set the I/O buffers for the SSL engine.
1812             *
1813             * Once this call has been made, `br_ssl_client_reset()` or
1814             * `br_ssl_server_reset()` MUST be called before using the context.
1815             *
1816             * This function is similar to `br_ssl_engine_set_buffer()`, except
1817             * that it enforces full-duplex mode, and the two I/O buffers are
1818             * provided as separate chunks.
1819             *
1820             * The macros `BR_SSL_BUFSIZE_INPUT` and `BR_SSL_BUFSIZE_OUTPUT`
1821             * evaluate to the optimal (maximum) sizes for the input and output
1822             * buffer, respectively.
1823             *
1824             * \param cc SSL engine context
1825             * \param ibuf input buffer.
1826             * \param ibuf_len input buffer length (in bytes).
1827             * \param obuf output buffer.
1828             * \param obuf_len output buffer length (in bytes).
1829             */
1830             void br_ssl_engine_set_buffers_bidi(br_ssl_engine_context *cc,
1831             void *ibuf, size_t ibuf_len, void *obuf, size_t obuf_len);
1832              
1833             /**
1834             * \brief Inject some "initial entropy" in the context.
1835             *
1836             * This entropy will be added to what can be obtained from the
1837             * underlying operating system, if that OS is supported.
1838             *
1839             * This function may be called several times; all injected entropy chunks
1840             * are cumulatively mixed.
1841             *
1842             * If entropy gathering from the OS is supported and compiled in, then this
1843             * step is optional. Otherwise, it is mandatory to inject randomness, and
1844             * the caller MUST take care to push (as one or several successive calls)
1845             * enough entropy to achieve cryptographic resistance (at least 80 bits,
1846             * preferably 128 or more). The engine will report an error if no entropy
1847             * was provided and none can be obtained from the OS.
1848             *
1849             * Take care that this function cannot assess the cryptographic quality of
1850             * the provided bytes.
1851             *
1852             * In all generality, "entropy" must here be considered to mean "that
1853             * which the attacker cannot predict". If your OS/architecture does not
1854             * have a suitable source of randomness, then you can make do with the
1855             * combination of a large enough secret value (possibly a copy of an
1856             * asymmetric private key that you also store on the system) AND a
1857             * non-repeating value (e.g. current time, provided that the local clock
1858             * cannot be reset or altered by the attacker).
1859             *
1860             * \param cc SSL engine context.
1861             * \param data extra entropy to inject.
1862             * \param len length of the extra data (in bytes).
1863             */
1864             void br_ssl_engine_inject_entropy(br_ssl_engine_context *cc,
1865             const void *data, size_t len);
1866              
1867             /**
1868             * \brief Get the "server name" in this engine.
1869             *
1870             * For clients, this is the name provided with `br_ssl_client_reset()`;
1871             * for servers, this is the name received from the client as part of the
1872             * ClientHello message. If there is no such name (e.g. the client did
1873             * not send an SNI extension) then the returned string is empty
1874             * (returned pointer points to a byte of value 0).
1875             *
1876             * The returned pointer refers to a buffer inside the context, which may
1877             * be overwritten as part of normal SSL activity (even within the same
1878             * connection, if a renegotiation occurs).
1879             *
1880             * \param cc SSL engine context.
1881             * \return the server name (possibly empty).
1882             */
1883             static inline const char *
1884 0           br_ssl_engine_get_server_name(const br_ssl_engine_context *cc)
1885             {
1886 0           return cc->server_name;
1887             }
1888              
1889             /**
1890             * \brief Get the protocol version.
1891             *
1892             * This function returns the protocol version that is used by the
1893             * engine. That value is set after sending (for a server) or receiving
1894             * (for a client) the ServerHello message.
1895             *
1896             * \param cc SSL engine context.
1897             * \return the protocol version.
1898             */
1899             static inline unsigned
1900 0           br_ssl_engine_get_version(const br_ssl_engine_context *cc)
1901             {
1902 0           return cc->session.version;
1903             }
1904              
1905             /**
1906             * \brief Get a copy of the session parameters.
1907             *
1908             * The session parameters are filled during the handshake, so this
1909             * function shall not be called before completion of the handshake.
1910             * The initial handshake is completed when the context first allows
1911             * application data to be injected.
1912             *
1913             * This function copies the current session parameters into the provided
1914             * structure. Beware that the session parameters include the master
1915             * secret, which is sensitive data, to handle with great care.
1916             *
1917             * \param cc SSL engine context.
1918             * \param pp destination structure for the session parameters.
1919             */
1920             static inline void
1921 0           br_ssl_engine_get_session_parameters(const br_ssl_engine_context *cc,
1922             br_ssl_session_parameters *pp)
1923             {
1924 0           memcpy(pp, &cc->session, sizeof *pp);
1925 0           }
1926              
1927             /**
1928             * \brief Set the session parameters to the provided values.
1929             *
1930             * This function is meant to be used in the client, before doing a new
1931             * handshake; a session resumption will be attempted with these
1932             * parameters. In the server, this function has no effect.
1933             *
1934             * \param cc SSL engine context.
1935             * \param pp source structure for the session parameters.
1936             */
1937             static inline void
1938 0           br_ssl_engine_set_session_parameters(br_ssl_engine_context *cc,
1939             const br_ssl_session_parameters *pp)
1940             {
1941 0           memcpy(&cc->session, pp, sizeof *pp);
1942 0           }
1943              
1944             /**
1945             * \brief Get identifier for the curve used for key exchange.
1946             *
1947             * If the cipher suite uses ECDHE, then this function returns the
1948             * identifier for the curve used for transient parameters. This is
1949             * defined during the course of the handshake, when the ServerKeyExchange
1950             * is sent (on the server) or received (on the client). If the
1951             * cipher suite does not use ECDHE (e.g. static ECDH, or RSA key
1952             * exchange), then this value is indeterminate.
1953             *
1954             * @param cc SSL engine context.
1955             * @return the ECDHE curve identifier.
1956             */
1957             static inline int
1958 0           br_ssl_engine_get_ecdhe_curve(br_ssl_engine_context *cc)
1959             {
1960 0           return cc->ecdhe_curve;
1961             }
1962              
1963             /**
1964             * \brief Get the current engine state.
1965             *
1966             * An SSL engine (client or server) has, at any time, a state which is
1967             * the combination of zero, one or more of these flags:
1968             *
1969             * - `BR_SSL_CLOSED`
1970             *
1971             * Engine is finished, no more I/O (until next reset).
1972             *
1973             * - `BR_SSL_SENDREC`
1974             *
1975             * Engine has some bytes to send to the peer.
1976             *
1977             * - `BR_SSL_RECVREC`
1978             *
1979             * Engine expects some bytes from the peer.
1980             *
1981             * - `BR_SSL_SENDAPP`
1982             *
1983             * Engine may receive application data to send (or flush).
1984             *
1985             * - `BR_SSL_RECVAPP`
1986             *
1987             * Engine has obtained some application data from the peer,
1988             * that should be read by the caller.
1989             *
1990             * If no flag at all is set (state value is 0), then the engine is not
1991             * fully initialised yet.
1992             *
1993             * The `BR_SSL_CLOSED` flag is exclusive; when it is set, no other flag
1994             * is set. To distinguish between a normal closure and an error, use
1995             * `br_ssl_engine_last_error()`.
1996             *
1997             * Generally speaking, `BR_SSL_SENDREC` and `BR_SSL_SENDAPP` are mutually
1998             * exclusive: the input buffer, at any point, either accumulates
1999             * plaintext data, or contains an assembled record that is being sent.
2000             * Similarly, `BR_SSL_RECVREC` and `BR_SSL_RECVAPP` are mutually exclusive.
2001             * This may change in a future library version.
2002             *
2003             * \param cc SSL engine context.
2004             * \return the current engine state.
2005             */
2006             unsigned br_ssl_engine_current_state(const br_ssl_engine_context *cc);
2007              
2008             /** \brief SSL engine state: closed or failed. */
2009             #define BR_SSL_CLOSED 0x0001
2010             /** \brief SSL engine state: record data is ready to be sent to the peer. */
2011             #define BR_SSL_SENDREC 0x0002
2012             /** \brief SSL engine state: engine may receive records from the peer. */
2013             #define BR_SSL_RECVREC 0x0004
2014             /** \brief SSL engine state: engine may accept application data to send. */
2015             #define BR_SSL_SENDAPP 0x0008
2016             /** \brief SSL engine state: engine has received application data. */
2017             #define BR_SSL_RECVAPP 0x0010
2018              
2019             /**
2020             * \brief Get the engine error indicator.
2021             *
2022             * The error indicator is `BR_ERR_OK` (0) if no error was encountered
2023             * since the last call to `br_ssl_client_reset()` or
2024             * `br_ssl_server_reset()`. Other status values are "sticky": they
2025             * remain set, and prevent all I/O activity, until cleared. Only the
2026             * reset calls clear the error indicator.
2027             *
2028             * \param cc SSL engine context.
2029             * \return 0, or a non-zero error code.
2030             */
2031             static inline int
2032 3           br_ssl_engine_last_error(const br_ssl_engine_context *cc)
2033             {
2034 3           return cc->err;
2035             }
2036              
2037             /*
2038             * There are four I/O operations, each identified by a symbolic name:
2039             *
2040             * sendapp inject application data in the engine
2041             * recvapp retrieving application data from the engine
2042             * sendrec sending records on the transport medium
2043             * recvrec receiving records from the transport medium
2044             *
2045             * Terminology works thus: in a layered model where the SSL engine sits
2046             * between the application and the network, "send" designates operations
2047             * where bytes flow from application to network, and "recv" for the
2048             * reverse operation. Application data (the plaintext that is to be
2049             * conveyed through SSL) is "app", while encrypted records are "rec".
2050             * Note that from the SSL engine point of view, "sendapp" and "recvrec"
2051             * designate bytes that enter the engine ("inject" operation), while
2052             * "recvapp" and "sendrec" designate bytes that exit the engine
2053             * ("extract" operation).
2054             *
2055             * For the operation 'xxx', two functions are defined:
2056             *
2057             * br_ssl_engine_xxx_buf
2058             * Returns a pointer and length to the buffer to use for that
2059             * operation. '*len' is set to the number of bytes that may be read
2060             * from the buffer (extract operation) or written to the buffer
2061             * (inject operation). If no byte may be exchanged for that operation
2062             * at that point, then '*len' is set to zero, and NULL is returned.
2063             * The engine state is unmodified by this call.
2064             *
2065             * br_ssl_engine_xxx_ack
2066             * Informs the engine that 'len' bytes have been read from the buffer
2067             * (extract operation) or written to the buffer (inject operation).
2068             * The 'len' value MUST NOT be zero. The 'len' value MUST NOT exceed
2069             * that which was obtained from a preceding br_ssl_engine_xxx_buf()
2070             * call.
2071             */
2072              
2073             /**
2074             * \brief Get buffer for application data to send.
2075             *
2076             * If the engine is ready to accept application data to send to the
2077             * peer, then this call returns a pointer to the buffer where such
2078             * data shall be written, and its length is written in `*len`.
2079             * Otherwise, `*len` is set to 0 and `NULL` is returned.
2080             *
2081             * \param cc SSL engine context.
2082             * \param len receives the application data output buffer length, or 0.
2083             * \return the application data output buffer, or `NULL`.
2084             */
2085             unsigned char *br_ssl_engine_sendapp_buf(
2086             const br_ssl_engine_context *cc, size_t *len);
2087              
2088             /**
2089             * \brief Inform the engine of some new application data.
2090             *
2091             * After writing `len` bytes in the buffer returned by
2092             * `br_ssl_engine_sendapp_buf()`, the application shall call this
2093             * function to trigger any relevant processing. The `len` parameter
2094             * MUST NOT be 0, and MUST NOT exceed the value obtained in the
2095             * `br_ssl_engine_sendapp_buf()` call.
2096             *
2097             * \param cc SSL engine context.
2098             * \param len number of bytes pushed (not zero).
2099             */
2100             void br_ssl_engine_sendapp_ack(br_ssl_engine_context *cc, size_t len);
2101              
2102             /**
2103             * \brief Get buffer for received application data.
2104             *
2105             * If the engine has received application data from the peer, then this
2106             * call returns a pointer to the buffer from where such data shall be
2107             * read, and its length is written in `*len`. Otherwise, `*len` is set
2108             * to 0 and `NULL` is returned.
2109             *
2110             * \param cc SSL engine context.
2111             * \param len receives the application data input buffer length, or 0.
2112             * \return the application data input buffer, or `NULL`.
2113             */
2114             unsigned char *br_ssl_engine_recvapp_buf(
2115             const br_ssl_engine_context *cc, size_t *len);
2116              
2117             /**
2118             * \brief Acknowledge some received application data.
2119             *
2120             * After reading `len` bytes from the buffer returned by
2121             * `br_ssl_engine_recvapp_buf()`, the application shall call this
2122             * function to trigger any relevant processing. The `len` parameter
2123             * MUST NOT be 0, and MUST NOT exceed the value obtained in the
2124             * `br_ssl_engine_recvapp_buf()` call.
2125             *
2126             * \param cc SSL engine context.
2127             * \param len number of bytes read (not zero).
2128             */
2129             void br_ssl_engine_recvapp_ack(br_ssl_engine_context *cc, size_t len);
2130              
2131             /**
2132             * \brief Get buffer for record data to send.
2133             *
2134             * If the engine has prepared some records to send to the peer, then this
2135             * call returns a pointer to the buffer from where such data shall be
2136             * read, and its length is written in `*len`. Otherwise, `*len` is set
2137             * to 0 and `NULL` is returned.
2138             *
2139             * \param cc SSL engine context.
2140             * \param len receives the record data output buffer length, or 0.
2141             * \return the record data output buffer, or `NULL`.
2142             */
2143             unsigned char *br_ssl_engine_sendrec_buf(
2144             const br_ssl_engine_context *cc, size_t *len);
2145              
2146             /**
2147             * \brief Acknowledge some sent record data.
2148             *
2149             * After reading `len` bytes from the buffer returned by
2150             * `br_ssl_engine_sendrec_buf()`, the application shall call this
2151             * function to trigger any relevant processing. The `len` parameter
2152             * MUST NOT be 0, and MUST NOT exceed the value obtained in the
2153             * `br_ssl_engine_sendrec_buf()` call.
2154             *
2155             * \param cc SSL engine context.
2156             * \param len number of bytes read (not zero).
2157             */
2158             void br_ssl_engine_sendrec_ack(br_ssl_engine_context *cc, size_t len);
2159              
2160             /**
2161             * \brief Get buffer for incoming records.
2162             *
2163             * If the engine is ready to accept records from the peer, then this
2164             * call returns a pointer to the buffer where such data shall be
2165             * written, and its length is written in `*len`. Otherwise, `*len` is
2166             * set to 0 and `NULL` is returned.
2167             *
2168             * \param cc SSL engine context.
2169             * \param len receives the record data input buffer length, or 0.
2170             * \return the record data input buffer, or `NULL`.
2171             */
2172             unsigned char *br_ssl_engine_recvrec_buf(
2173             const br_ssl_engine_context *cc, size_t *len);
2174              
2175             /**
2176             * \brief Inform the engine of some new record data.
2177             *
2178             * After writing `len` bytes in the buffer returned by
2179             * `br_ssl_engine_recvrec_buf()`, the application shall call this
2180             * function to trigger any relevant processing. The `len` parameter
2181             * MUST NOT be 0, and MUST NOT exceed the value obtained in the
2182             * `br_ssl_engine_recvrec_buf()` call.
2183             *
2184             * \param cc SSL engine context.
2185             * \param len number of bytes pushed (not zero).
2186             */
2187             void br_ssl_engine_recvrec_ack(br_ssl_engine_context *cc, size_t len);
2188              
2189             /**
2190             * \brief Flush buffered application data.
2191             *
2192             * If some application data has been buffered in the engine, then wrap
2193             * it into a record and mark it for sending. If no application data has
2194             * been buffered but the engine would be ready to accept some, AND the
2195             * `force` parameter is non-zero, then an empty record is assembled and
2196             * marked for sending. In all other cases, this function does nothing.
2197             *
2198             * Empty records are technically legal, but not all existing SSL/TLS
2199             * implementations support them. Empty records can be useful as a
2200             * transparent "keep-alive" mechanism to maintain some low-level
2201             * network activity.
2202             *
2203             * \param cc SSL engine context.
2204             * \param force non-zero to force sending an empty record.
2205             */
2206             void br_ssl_engine_flush(br_ssl_engine_context *cc, int force);
2207              
2208             /**
2209             * \brief Initiate a closure.
2210             *
2211             * If, at that point, the context is open and in ready state, then a
2212             * `close_notify` alert is assembled and marked for sending; this
2213             * triggers the closure protocol. Otherwise, no such alert is assembled.
2214             *
2215             * \param cc SSL engine context.
2216             */
2217             void br_ssl_engine_close(br_ssl_engine_context *cc);
2218              
2219             /**
2220             * \brief Initiate a renegotiation.
2221             *
2222             * If the engine is failed or closed, or if the peer is known not to
2223             * support secure renegotiation (RFC 5746), or if renegotiations have
2224             * been disabled with the `BR_OPT_NO_RENEGOTIATION` flag, or if there
2225             * is buffered incoming application data, then this function returns 0
2226             * and nothing else happens.
2227             *
2228             * Otherwise, this function returns 1, and a renegotiation attempt is
2229             * triggered (if a handshake is already ongoing at that point, then
2230             * no new handshake is triggered).
2231             *
2232             * \param cc SSL engine context.
2233             * \return 1 on success, 0 on error.
2234             */
2235             int br_ssl_engine_renegotiate(br_ssl_engine_context *cc);
2236              
2237             /**
2238             * \brief Export key material from a connected SSL engine (RFC 5705).
2239             *
2240             * This calls compute a secret key of arbitrary length from the master
2241             * secret of a connected SSL engine. If the provided context is not
2242             * currently in "application data" state (initial handshake is not
2243             * finished, another handshake is ongoing, or the connection failed or
2244             * was closed), then this function returns 0. Otherwise, a secret key of
2245             * length `len` bytes is computed and written in the buffer pointed to
2246             * by `dst`, and 1 is returned.
2247             *
2248             * The computed key follows the specification described in RFC 5705.
2249             * That RFC includes two key computations, with and without a "context
2250             * value". If `context` is `NULL`, then the variant without context is
2251             * used; otherwise, the `context_len` bytes located at the address
2252             * pointed to by `context` are used in the computation. Note that it
2253             * is possible to have a "with context" key with a context length of
2254             * zero bytes, by setting `context` to a non-`NULL` value but
2255             * `context_len` to 0.
2256             *
2257             * When context bytes are used, the context length MUST NOT exceed
2258             * 65535 bytes.
2259             *
2260             * \param cc SSL engine context.
2261             * \param dst destination buffer for exported key.
2262             * \param len exported key length (in bytes).
2263             * \param label disambiguation label.
2264             * \param context context value (or `NULL`).
2265             * \param context_len context length (in bytes).
2266             * \return 1 on success, 0 on error.
2267             */
2268             int br_ssl_key_export(br_ssl_engine_context *cc,
2269             void *dst, size_t len, const char *label,
2270             const void *context, size_t context_len);
2271              
2272             /*
2273             * Pre-declaration for the SSL client context.
2274             */
2275             typedef struct br_ssl_client_context_ br_ssl_client_context;
2276              
2277             /**
2278             * \brief Type for the client certificate, if requested by the server.
2279             */
2280             typedef struct {
2281             /**
2282             * \brief Authentication type.
2283             *
2284             * This is either `BR_AUTH_RSA` (RSA signature), `BR_AUTH_ECDSA`
2285             * (ECDSA signature), or `BR_AUTH_ECDH` (static ECDH key exchange).
2286             */
2287             int auth_type;
2288              
2289             /**
2290             * \brief Hash function for computing the CertificateVerify.
2291             *
2292             * This is the symbolic identifier for the hash function that
2293             * will be used to produce the hash of handshake messages, to
2294             * be signed into the CertificateVerify. For full static ECDH
2295             * (client and server certificates are both EC in the same
2296             * curve, and static ECDH is used), this value is set to -1.
2297             *
2298             * Take care that with TLS 1.0 and 1.1, that value MUST match
2299             * the protocol requirements: value must be 0 (MD5+SHA-1) for
2300             * a RSA signature, or 2 (SHA-1) for an ECDSA signature. Only
2301             * TLS 1.2 allows for other hash functions.
2302             */
2303             int hash_id;
2304              
2305             /**
2306             * \brief Certificate chain to send to the server.
2307             *
2308             * This is an array of `br_x509_certificate` objects, each
2309             * normally containing a DER-encoded certificate. The client
2310             * code does not try to decode these elements. If there is no
2311             * chain to send to the server, then this pointer shall be
2312             * set to `NULL`.
2313             */
2314             const br_x509_certificate *chain;
2315              
2316             /**
2317             * \brief Certificate chain length (number of certificates).
2318             *
2319             * If there is no chain to send to the server, then this value
2320             * shall be set to 0.
2321             */
2322             size_t chain_len;
2323              
2324             } br_ssl_client_certificate;
2325              
2326             /*
2327             * Note: the constants below for signatures match the TLS constants.
2328             */
2329              
2330             /** \brief Client authentication type: static ECDH. */
2331             #define BR_AUTH_ECDH 0
2332             /** \brief Client authentication type: RSA signature. */
2333             #define BR_AUTH_RSA 1
2334             /** \brief Client authentication type: ECDSA signature. */
2335             #define BR_AUTH_ECDSA 3
2336              
2337             /**
2338             * \brief Class type for a certificate handler (client side).
2339             *
2340             * A certificate handler selects a client certificate chain to send to
2341             * the server, upon explicit request from that server. It receives
2342             * the list of trust anchor DN from the server, and supported types
2343             * of certificates and signatures, and returns the chain to use. It
2344             * is also invoked to perform the corresponding private key operation
2345             * (a signature, or an ECDH computation).
2346             *
2347             * The SSL client engine will first push the trust anchor DN with
2348             * `start_name_list()`, `start_name()`, `append_name()`, `end_name()`
2349             * and `end_name_list()`. Then it will call `choose()`, to select the
2350             * actual chain (and signature/hash algorithms). Finally, it will call
2351             * either `do_sign()` or `do_keyx()`, depending on the algorithm choices.
2352             */
2353             typedef struct br_ssl_client_certificate_class_ br_ssl_client_certificate_class;
2354             struct br_ssl_client_certificate_class_ {
2355             /**
2356             * \brief Context size (in bytes).
2357             */
2358             size_t context_size;
2359              
2360             /**
2361             * \brief Begin reception of a list of trust anchor names. This
2362             * is called while parsing the incoming CertificateRequest.
2363             *
2364             * \param pctx certificate handler context.
2365             */
2366             void (*start_name_list)(const br_ssl_client_certificate_class **pctx);
2367              
2368             /**
2369             * \brief Begin reception of a new trust anchor name.
2370             *
2371             * The total encoded name length is provided; it is less than
2372             * 65535 bytes.
2373             *
2374             * \param pctx certificate handler context.
2375             * \param len encoded name length (in bytes).
2376             */
2377             void (*start_name)(const br_ssl_client_certificate_class **pctx,
2378             size_t len);
2379              
2380             /**
2381             * \brief Receive some more bytes for the current trust anchor name.
2382             *
2383             * The provided reference (`data`) points to a transient buffer
2384             * they may be reused as soon as this function returns. The chunk
2385             * length (`len`) is never zero.
2386             *
2387             * \param pctx certificate handler context.
2388             * \param data anchor name chunk.
2389             * \param len anchor name chunk length (in bytes).
2390             */
2391             void (*append_name)(const br_ssl_client_certificate_class **pctx,
2392             const unsigned char *data, size_t len);
2393              
2394             /**
2395             * \brief End current trust anchor name.
2396             *
2397             * This function is called when all the encoded anchor name data
2398             * has been provided.
2399             *
2400             * \param pctx certificate handler context.
2401             */
2402             void (*end_name)(const br_ssl_client_certificate_class **pctx);
2403              
2404             /**
2405             * \brief End list of trust anchor names.
2406             *
2407             * This function is called when all the anchor names in the
2408             * CertificateRequest message have been obtained.
2409             *
2410             * \param pctx certificate handler context.
2411             */
2412             void (*end_name_list)(const br_ssl_client_certificate_class **pctx);
2413              
2414             /**
2415             * \brief Select client certificate and algorithms.
2416             *
2417             * This callback function shall fill the provided `choices`
2418             * structure with the selected algorithms and certificate chain.
2419             * The `hash_id`, `chain` and `chain_len` fields must be set. If
2420             * the client cannot or does not wish to send a certificate,
2421             * then it shall set `chain` to `NULL` and `chain_len` to 0.
2422             *
2423             * The `auth_types` parameter describes the authentication types,
2424             * signature algorithms and hash functions that are supported by
2425             * both the client context and the server, and compatible with
2426             * the current protocol version. This is a bit field with the
2427             * following contents:
2428             *
2429             * - If RSA signatures with hash function x are supported, then
2430             * bit x is set.
2431             *
2432             * - If ECDSA signatures with hash function x are supported,
2433             * then bit 8+x is set.
2434             *
2435             * - If static ECDH is supported, with a RSA-signed certificate,
2436             * then bit 16 is set.
2437             *
2438             * - If static ECDH is supported, with an ECDSA-signed certificate,
2439             * then bit 17 is set.
2440             *
2441             * Notes:
2442             *
2443             * - When using TLS 1.0 or 1.1, the hash function for RSA
2444             * signatures is always the special MD5+SHA-1 (id 0), and the
2445             * hash function for ECDSA signatures is always SHA-1 (id 2).
2446             *
2447             * - When using TLS 1.2, the list of hash functions is trimmed
2448             * down to include only hash functions that the client context
2449             * can support. The actual server list can be obtained with
2450             * `br_ssl_client_get_server_hashes()`; that list may be used
2451             * to select the certificate chain to send to the server.
2452             *
2453             * \param pctx certificate handler context.
2454             * \param cc SSL client context.
2455             * \param auth_types supported authentication types and algorithms.
2456             * \param choices destination structure for the policy choices.
2457             */
2458             void (*choose)(const br_ssl_client_certificate_class **pctx,
2459             const br_ssl_client_context *cc, uint32_t auth_types,
2460             br_ssl_client_certificate *choices);
2461              
2462             /**
2463             * \brief Perform key exchange (client part).
2464             *
2465             * This callback is invoked in case of a full static ECDH key
2466             * exchange:
2467             *
2468             * - the cipher suite uses `ECDH_RSA` or `ECDH_ECDSA`;
2469             *
2470             * - the server requests a client certificate;
2471             *
2472             * - the client has, and sends, a client certificate that
2473             * uses an EC key in the same curve as the server's key,
2474             * and chooses static ECDH (the `hash_id` field in the choice
2475             * structure was set to -1).
2476             *
2477             * In that situation, this callback is invoked to compute the
2478             * client-side ECDH: the provided `data` (of length `*len` bytes)
2479             * is the server's public key point (as decoded from its
2480             * certificate), and the client shall multiply that point with
2481             * its own private key, and write back the X coordinate of the
2482             * resulting point in the same buffer, starting at offset 0.
2483             * The `*len` value shall be modified to designate the actual
2484             * length of the X coordinate.
2485             *
2486             * The callback must uphold the following:
2487             *
2488             * - If the input array does not have the proper length for
2489             * an encoded curve point, then an error (0) shall be reported.
2490             *
2491             * - If the input array has the proper length, then processing
2492             * MUST be constant-time, even if the data is not a valid
2493             * encoded point.
2494             *
2495             * - This callback MUST check that the input point is valid.
2496             *
2497             * Returned value is 1 on success, 0 on error.
2498             *
2499             * \param pctx certificate handler context.
2500             * \param data server public key point.
2501             * \param len public key point length / X coordinate length.
2502             * \return 1 on success, 0 on error.
2503             */
2504             uint32_t (*do_keyx)(const br_ssl_client_certificate_class **pctx,
2505             unsigned char *data, size_t *len);
2506              
2507             /**
2508             * \brief Perform a signature (client authentication).
2509             *
2510             * This callback is invoked when a client certificate was sent,
2511             * and static ECDH is not used. It shall compute a signature,
2512             * using the client's private key, over the provided hash value
2513             * (which is the hash of all previous handshake messages).
2514             *
2515             * On input, the hash value to sign is in `data`, of size
2516             * `hv_len`; the involved hash function is identified by
2517             * `hash_id`. The signature shall be computed and written
2518             * back into `data`; the total size of that buffer is `len`
2519             * bytes.
2520             *
2521             * This callback shall verify that the signature length does not
2522             * exceed `len` bytes, and abstain from writing the signature if
2523             * it does not fit.
2524             *
2525             * For RSA signatures, the `hash_id` may be 0, in which case
2526             * this is the special header-less signature specified in TLS 1.0
2527             * and 1.1, with a 36-byte hash value. Otherwise, normal PKCS#1
2528             * v1.5 signatures shall be computed.
2529             *
2530             * For ECDSA signatures, the signature value shall use the ASN.1
2531             * based encoding.
2532             *
2533             * Returned value is the signature length (in bytes), or 0 on error.
2534             *
2535             * \param pctx certificate handler context.
2536             * \param hash_id hash function identifier.
2537             * \param hv_len hash value length (in bytes).
2538             * \param data input/output buffer (hash value, then signature).
2539             * \param len total buffer length (in bytes).
2540             * \return signature length (in bytes) on success, or 0 on error.
2541             */
2542             size_t (*do_sign)(const br_ssl_client_certificate_class **pctx,
2543             int hash_id, size_t hv_len, unsigned char *data, size_t len);
2544             };
2545              
2546             /**
2547             * \brief A single-chain RSA client certificate handler.
2548             *
2549             * This handler uses a single certificate chain, with a RSA
2550             * signature. The list of trust anchor DN is ignored.
2551             *
2552             * Apart from the first field (vtable pointer), its contents are
2553             * opaque and shall not be accessed directly.
2554             */
2555             typedef struct {
2556             /** \brief Pointer to vtable. */
2557             const br_ssl_client_certificate_class *vtable;
2558             #ifndef BR_DOXYGEN_IGNORE
2559             const br_x509_certificate *chain;
2560             size_t chain_len;
2561             const br_rsa_private_key *sk;
2562             br_rsa_pkcs1_sign irsasign;
2563             #endif
2564             } br_ssl_client_certificate_rsa_context;
2565              
2566             /**
2567             * \brief A single-chain EC client certificate handler.
2568             *
2569             * This handler uses a single certificate chain, with a RSA
2570             * signature. The list of trust anchor DN is ignored.
2571             *
2572             * This handler may support both static ECDH, and ECDSA signatures
2573             * (either usage may be selectively disabled).
2574             *
2575             * Apart from the first field (vtable pointer), its contents are
2576             * opaque and shall not be accessed directly.
2577             */
2578             typedef struct {
2579             /** \brief Pointer to vtable. */
2580             const br_ssl_client_certificate_class *vtable;
2581             #ifndef BR_DOXYGEN_IGNORE
2582             const br_x509_certificate *chain;
2583             size_t chain_len;
2584             const br_ec_private_key *sk;
2585             unsigned allowed_usages;
2586             unsigned issuer_key_type;
2587             const br_multihash_context *mhash;
2588             const br_ec_impl *iec;
2589             br_ecdsa_sign iecdsa;
2590             #endif
2591             } br_ssl_client_certificate_ec_context;
2592              
2593             /**
2594             * \brief Context structure for a SSL client.
2595             *
2596             * The first field (called `eng`) is the SSL engine; all functions that
2597             * work on a `br_ssl_engine_context` structure shall take as parameter
2598             * a pointer to that field. The other structure fields are opaque and
2599             * must not be accessed directly.
2600             */
2601             struct br_ssl_client_context_ {
2602             /**
2603             * \brief The encapsulated engine context.
2604             */
2605             br_ssl_engine_context eng;
2606              
2607             #ifndef BR_DOXYGEN_IGNORE
2608             /*
2609             * Minimum ClientHello length; padding with an extension (RFC
2610             * 7685) is added if necessary to match at least that length.
2611             * Such padding is nominally unnecessary, but it has been used
2612             * to work around some server implementation bugs.
2613             */
2614             uint16_t min_clienthello_len;
2615              
2616             /*
2617             * Bit field for algoithms (hash + signature) supported by the
2618             * server when requesting a client certificate.
2619             */
2620             uint32_t hashes;
2621              
2622             /*
2623             * Server's public key curve.
2624             */
2625             int server_curve;
2626              
2627             /*
2628             * Context for certificate handler.
2629             */
2630             const br_ssl_client_certificate_class **client_auth_vtable;
2631              
2632             /*
2633             * Client authentication type.
2634             */
2635             unsigned char auth_type;
2636              
2637             /*
2638             * Hash function to use for the client signature. This is 0xFF
2639             * if static ECDH is used.
2640             */
2641             unsigned char hash_id;
2642              
2643             /*
2644             * For the core certificate handlers, thus avoiding (in most
2645             * cases) the need for an externally provided policy context.
2646             */
2647             union {
2648             const br_ssl_client_certificate_class *vtable;
2649             br_ssl_client_certificate_rsa_context single_rsa;
2650             br_ssl_client_certificate_ec_context single_ec;
2651             } client_auth;
2652              
2653             /*
2654             * Implementations.
2655             */
2656             br_rsa_public irsapub;
2657             #endif
2658             };
2659              
2660             /**
2661             * \brief Get the hash functions and signature algorithms supported by
2662             * the server.
2663             *
2664             * This value is a bit field:
2665             *
2666             * - If RSA (PKCS#1 v1.5) is supported with hash function of ID `x`,
2667             * then bit `x` is set (hash function ID is 0 for the special MD5+SHA-1,
2668             * or 2 to 6 for the SHA family).
2669             *
2670             * - If ECDSA is supported with hash function of ID `x`, then bit `8+x`
2671             * is set.
2672             *
2673             * - Newer algorithms are symbolic 16-bit identifiers that do not
2674             * represent signature algorithm and hash function separately. If
2675             * the TLS-level identifier is `0x0800+x` for a `x` in the 0..15
2676             * range, then bit `16+x` is set.
2677             *
2678             * "New algorithms" are currently defined only in draft documents, so
2679             * this support is subject to possible change. Right now (early 2017),
2680             * this maps ed25519 (EdDSA on Curve25519) to bit 23, and ed448 (EdDSA
2681             * on Curve448) to bit 24. If the identifiers on the wire change in
2682             * future document, then the decoding mechanism in BearSSL will be
2683             * amended to keep mapping ed25519 and ed448 on bits 23 and 24,
2684             * respectively. Mapping of other new algorithms (e.g. RSA/PSS) is not
2685             * guaranteed yet.
2686             *
2687             * \param cc client context.
2688             * \return the server-supported hash functions and signature algorithms.
2689             */
2690             static inline uint32_t
2691             br_ssl_client_get_server_hashes(const br_ssl_client_context *cc)
2692             {
2693             return cc->hashes;
2694             }
2695              
2696             /**
2697             * \brief Get the server key curve.
2698             *
2699             * This function returns the ID for the curve used by the server's public
2700             * key. This is set when the server's certificate chain is processed;
2701             * this value is 0 if the server's key is not an EC key.
2702             *
2703             * \return the server's public key curve ID, or 0.
2704             */
2705             static inline int
2706             br_ssl_client_get_server_curve(const br_ssl_client_context *cc)
2707             {
2708             return cc->server_curve;
2709             }
2710              
2711             /*
2712             * Each br_ssl_client_init_xxx() function sets the list of supported
2713             * cipher suites and used implementations, as specified by the profile
2714             * name 'xxx'. Defined profile names are:
2715             *
2716             * full all supported versions and suites; constant-time implementations
2717             * TODO: add other profiles
2718             */
2719              
2720             /**
2721             * \brief SSL client profile: full.
2722             *
2723             * This function initialises the provided SSL client context with
2724             * all supported algorithms and cipher suites. It also initialises
2725             * a companion X.509 validation engine with all supported algorithms,
2726             * and the provided trust anchors; the X.509 engine will be used by
2727             * the client context to validate the server's certificate.
2728             *
2729             * \param cc client context to initialise.
2730             * \param xc X.509 validation context to initialise.
2731             * \param trust_anchors trust anchors to use.
2732             * \param trust_anchors_num number of trust anchors.
2733             */
2734             void br_ssl_client_init_full(br_ssl_client_context *cc,
2735             br_x509_minimal_context *xc,
2736             const br_x509_trust_anchor *trust_anchors, size_t trust_anchors_num);
2737              
2738             /**
2739             * \brief Clear the complete contents of a SSL client context.
2740             *
2741             * Everything is cleared, including the reference to the configured buffer,
2742             * implementations, cipher suites and state. This is a preparatory step
2743             * to assembling a custom profile.
2744             *
2745             * \param cc client context to clear.
2746             */
2747             void br_ssl_client_zero(br_ssl_client_context *cc);
2748              
2749             /**
2750             * \brief Set an externally provided client certificate handler context.
2751             *
2752             * The handler's methods are invoked when the server requests a client
2753             * certificate.
2754             *
2755             * \param cc client context.
2756             * \param pctx certificate handler context (pointer to its vtable field).
2757             */
2758             static inline void
2759             br_ssl_client_set_client_certificate(br_ssl_client_context *cc,
2760             const br_ssl_client_certificate_class **pctx)
2761             {
2762             cc->client_auth_vtable = pctx;
2763             }
2764              
2765             /**
2766             * \brief Set the RSA public-key operations implementation.
2767             *
2768             * This will be used to encrypt the pre-master secret with the server's
2769             * RSA public key (RSA-encryption cipher suites only).
2770             *
2771             * \param cc client context.
2772             * \param irsapub RSA public-key encryption implementation.
2773             */
2774             static inline void
2775             br_ssl_client_set_rsapub(br_ssl_client_context *cc, br_rsa_public irsapub)
2776             {
2777             cc->irsapub = irsapub;
2778             }
2779              
2780             /**
2781             * \brief Set the "default" RSA implementation for public-key operations.
2782             *
2783             * This sets the RSA implementation in the client context (for encrypting
2784             * the pre-master secret, in `TLS_RSA_*` cipher suites) to the fastest
2785             * available on the current platform.
2786             *
2787             * \param cc client context.
2788             */
2789             void br_ssl_client_set_default_rsapub(br_ssl_client_context *cc);
2790              
2791             /**
2792             * \brief Set the minimum ClientHello length (RFC 7685 padding).
2793             *
2794             * If this value is set and the ClientHello would be shorter, then
2795             * the Pad ClientHello extension will be added with enough padding bytes
2796             * to reach the target size. Because of the extension header, the resulting
2797             * size will sometimes be slightly more than `len` bytes if the target
2798             * size cannot be exactly met.
2799             *
2800             * The target length relates to the _contents_ of the ClientHello, not
2801             * counting its 4-byte header. For instance, if `len` is set to 512,
2802             * then the padding will bring the ClientHello size to 516 bytes with its
2803             * header, and 521 bytes when counting the 5-byte record header.
2804             *
2805             * \param cc client context.
2806             * \param len minimum ClientHello length (in bytes).
2807             */
2808             static inline void
2809             br_ssl_client_set_min_clienthello_len(br_ssl_client_context *cc, uint16_t len)
2810             {
2811             cc->min_clienthello_len = len;
2812             }
2813              
2814             /**
2815             * \brief Prepare or reset a client context for a new connection.
2816             *
2817             * The `server_name` parameter is used to fill the SNI extension; the
2818             * X.509 "minimal" engine will also match that name against the server
2819             * names included in the server's certificate. If the parameter is
2820             * `NULL` then no SNI extension will be sent, and the X.509 "minimal"
2821             * engine (if used for server certificate validation) will not check
2822             * presence of any specific name in the received certificate.
2823             *
2824             * Therefore, setting the `server_name` to `NULL` shall be reserved
2825             * to cases where alternate or additional methods are used to ascertain
2826             * that the right server public key is used (e.g. a "known key" model).
2827             *
2828             * If `resume_session` is non-zero and the context was previously used
2829             * then the session parameters may be reused (depending on whether the
2830             * server previously sent a non-empty session ID, and accepts the session
2831             * resumption). The session parameters for session resumption can also
2832             * be set explicitly with `br_ssl_engine_set_session_parameters()`.
2833             *
2834             * On failure, the context is marked as failed, and this function
2835             * returns 0. A possible failure condition is when no initial entropy
2836             * was injected, and none could be obtained from the OS (either OS
2837             * randomness gathering is not supported, or it failed).
2838             *
2839             * \param cc client context.
2840             * \param server_name target server name, or `NULL`.
2841             * \param resume_session non-zero to try session resumption.
2842             * \return 0 on failure, 1 on success.
2843             */
2844             int br_ssl_client_reset(br_ssl_client_context *cc,
2845             const char *server_name, int resume_session);
2846              
2847             /**
2848             * \brief Forget any session in the context.
2849             *
2850             * This means that the next handshake that uses this context will
2851             * necessarily be a full handshake (this applies both to new connections
2852             * and to renegotiations).
2853             *
2854             * \param cc client context.
2855             */
2856             static inline void
2857 0           br_ssl_client_forget_session(br_ssl_client_context *cc)
2858             {
2859 0           cc->eng.session.session_id_len = 0;
2860 0           }
2861              
2862             /**
2863             * \brief Set client certificate chain and key (single RSA case).
2864             *
2865             * This function sets a client certificate chain, that the client will
2866             * send to the server whenever a client certificate is requested. This
2867             * certificate uses an RSA public key; the corresponding private key is
2868             * invoked for authentication. Trust anchor names sent by the server are
2869             * ignored.
2870             *
2871             * The provided chain and private key are linked in the client context;
2872             * they must remain valid as long as they may be used, i.e. normally
2873             * for the duration of the connection, since they might be invoked
2874             * again upon renegotiations.
2875             *
2876             * \param cc SSL client context.
2877             * \param chain client certificate chain (SSL order: EE comes first).
2878             * \param chain_len client chain length (number of certificates).
2879             * \param sk client private key.
2880             * \param irsasign RSA signature implementation (PKCS#1 v1.5).
2881             */
2882             void br_ssl_client_set_single_rsa(br_ssl_client_context *cc,
2883             const br_x509_certificate *chain, size_t chain_len,
2884             const br_rsa_private_key *sk, br_rsa_pkcs1_sign irsasign);
2885              
2886             /*
2887             * \brief Set the client certificate chain and key (single EC case).
2888             *
2889             * This function sets a client certificate chain, that the client will
2890             * send to the server whenever a client certificate is requested. This
2891             * certificate uses an EC public key; the corresponding private key is
2892             * invoked for authentication. Trust anchor names sent by the server are
2893             * ignored.
2894             *
2895             * The provided chain and private key are linked in the client context;
2896             * they must remain valid as long as they may be used, i.e. normally
2897             * for the duration of the connection, since they might be invoked
2898             * again upon renegotiations.
2899             *
2900             * The `allowed_usages` is a combination of usages, namely
2901             * `BR_KEYTYPE_KEYX` and/or `BR_KEYTYPE_SIGN`. The `BR_KEYTYPE_KEYX`
2902             * value allows full static ECDH, while the `BR_KEYTYPE_SIGN` value
2903             * allows ECDSA signatures. If ECDSA signatures are used, then an ECDSA
2904             * signature implementation must be provided; otherwise, the `iecdsa`
2905             * parameter may be 0.
2906             *
2907             * The `cert_issuer_key_type` value is either `BR_KEYTYPE_RSA` or
2908             * `BR_KEYTYPE_EC`; it is the type of the public key used the the CA
2909             * that issued (signed) the client certificate. That value is used with
2910             * full static ECDH: support of the certificate by the server depends
2911             * on how the certificate was signed. (Note: when using TLS 1.2, this
2912             * parameter is ignored; but its value matters for TLS 1.0 and 1.1.)
2913             *
2914             * \param cc server context.
2915             * \param chain server certificate chain to send.
2916             * \param chain_len chain length (number of certificates).
2917             * \param sk server private key (EC).
2918             * \param allowed_usages allowed private key usages.
2919             * \param cert_issuer_key_type issuing CA's key type.
2920             * \param iec EC core implementation.
2921             * \param iecdsa ECDSA signature implementation ("asn1" format).
2922             */
2923             void br_ssl_client_set_single_ec(br_ssl_client_context *cc,
2924             const br_x509_certificate *chain, size_t chain_len,
2925             const br_ec_private_key *sk, unsigned allowed_usages,
2926             unsigned cert_issuer_key_type,
2927             const br_ec_impl *iec, br_ecdsa_sign iecdsa);
2928              
2929             /**
2930             * \brief Type for a "translated cipher suite", as an array of two
2931             * 16-bit integers.
2932             *
2933             * The first element is the cipher suite identifier (as used on the wire).
2934             * The second element is the concatenation of four 4-bit elements which
2935             * characterise the cipher suite contents. In most to least significant
2936             * order, these 4-bit elements are:
2937             *
2938             * - Bits 12 to 15: key exchange + server key type
2939             *
2940             * | val | symbolic constant | suite type | details |
2941             * | :-- | :----------------------- | :---------- | :----------------------------------------------- |
2942             * | 0 | `BR_SSLKEYX_RSA` | RSA | RSA key exchange, key is RSA (encryption) |
2943             * | 1 | `BR_SSLKEYX_ECDHE_RSA` | ECDHE_RSA | ECDHE key exchange, key is RSA (signature) |
2944             * | 2 | `BR_SSLKEYX_ECDHE_ECDSA` | ECDHE_ECDSA | ECDHE key exchange, key is EC (signature) |
2945             * | 3 | `BR_SSLKEYX_ECDH_RSA` | ECDH_RSA | Key is EC (key exchange), cert signed with RSA |
2946             * | 4 | `BR_SSLKEYX_ECDH_ECDSA` | ECDH_ECDSA | Key is EC (key exchange), cert signed with ECDSA |
2947             *
2948             * - Bits 8 to 11: symmetric encryption algorithm
2949             *
2950             * | val | symbolic constant | symmetric encryption | key strength (bits) |
2951             * | :-- | :--------------------- | :------------------- | :------------------ |
2952             * | 0 | `BR_SSLENC_3DES_CBC` | 3DES/CBC | 168 |
2953             * | 1 | `BR_SSLENC_AES128_CBC` | AES-128/CBC | 128 |
2954             * | 2 | `BR_SSLENC_AES256_CBC` | AES-256/CBC | 256 |
2955             * | 3 | `BR_SSLENC_AES128_GCM` | AES-128/GCM | 128 |
2956             * | 4 | `BR_SSLENC_AES256_GCM` | AES-256/GCM | 256 |
2957             * | 5 | `BR_SSLENC_CHACHA20` | ChaCha20/Poly1305 | 256 |
2958             *
2959             * - Bits 4 to 7: MAC algorithm
2960             *
2961             * | val | symbolic constant | MAC type | details |
2962             * | :-- | :----------------- | :----------- | :------------------------------------ |
2963             * | 0 | `BR_SSLMAC_AEAD` | AEAD | No dedicated MAC (encryption is AEAD) |
2964             * | 2 | `BR_SSLMAC_SHA1` | HMAC/SHA-1 | Value matches `br_sha1_ID` |
2965             * | 4 | `BR_SSLMAC_SHA256` | HMAC/SHA-256 | Value matches `br_sha256_ID` |
2966             * | 5 | `BR_SSLMAC_SHA384` | HMAC/SHA-384 | Value matches `br_sha384_ID` |
2967             *
2968             * - Bits 0 to 3: hash function for PRF when used with TLS-1.2
2969             *
2970             * | val | symbolic constant | hash function | details |
2971             * | :-- | :----------------- | :------------ | :----------------------------------- |
2972             * | 4 | `BR_SSLPRF_SHA256` | SHA-256 | Value matches `br_sha256_ID` |
2973             * | 5 | `BR_SSLPRF_SHA384` | SHA-384 | Value matches `br_sha384_ID` |
2974             *
2975             * For instance, cipher suite `TLS_RSA_WITH_AES_128_GCM_SHA256` has
2976             * standard identifier 0x009C, and is translated to 0x0304, for, in
2977             * that order: RSA key exchange (0), AES-128/GCM (3), AEAD integrity (0),
2978             * SHA-256 in the TLS PRF (4).
2979             */
2980             typedef uint16_t br_suite_translated[2];
2981              
2982             #ifndef BR_DOXYGEN_IGNORE
2983             /*
2984             * Constants are already documented in the br_suite_translated type.
2985             */
2986              
2987             #define BR_SSLKEYX_RSA 0
2988             #define BR_SSLKEYX_ECDHE_RSA 1
2989             #define BR_SSLKEYX_ECDHE_ECDSA 2
2990             #define BR_SSLKEYX_ECDH_RSA 3
2991             #define BR_SSLKEYX_ECDH_ECDSA 4
2992              
2993             #define BR_SSLENC_3DES_CBC 0
2994             #define BR_SSLENC_AES128_CBC 1
2995             #define BR_SSLENC_AES256_CBC 2
2996             #define BR_SSLENC_AES128_GCM 3
2997             #define BR_SSLENC_AES256_GCM 4
2998             #define BR_SSLENC_CHACHA20 5
2999              
3000             #define BR_SSLMAC_AEAD 0
3001             #define BR_SSLMAC_SHA1 br_sha1_ID
3002             #define BR_SSLMAC_SHA256 br_sha256_ID
3003             #define BR_SSLMAC_SHA384 br_sha384_ID
3004              
3005             #define BR_SSLPRF_SHA256 br_sha256_ID
3006             #define BR_SSLPRF_SHA384 br_sha384_ID
3007              
3008             #endif
3009              
3010             /*
3011             * Pre-declaration for the SSL server context.
3012             */
3013             typedef struct br_ssl_server_context_ br_ssl_server_context;
3014              
3015             /**
3016             * \brief Type for the server policy choices, taken after analysis of
3017             * the client message (ClientHello).
3018             */
3019             typedef struct {
3020             /**
3021             * \brief Cipher suite to use with that client.
3022             */
3023             uint16_t cipher_suite;
3024              
3025             /**
3026             * \brief Hash function or algorithm for signing the ServerKeyExchange.
3027             *
3028             * This parameter is ignored for `TLS_RSA_*` and `TLS_ECDH_*`
3029             * cipher suites; it is used only for `TLS_ECDHE_*` suites, in
3030             * which the server _signs_ the ephemeral EC Diffie-Hellman
3031             * parameters sent to the client.
3032             *
3033             * This identifier must be one of the following values:
3034             *
3035             * - `0xFF00 + id`, where `id` is a hash function identifier
3036             * (0 for MD5+SHA-1, or 2 to 6 for one of the SHA functions);
3037             *
3038             * - a full 16-bit identifier, lower than `0xFF00`.
3039             *
3040             * If the first option is used, then the SSL engine will
3041             * compute the hash of the data that is to be signed, with the
3042             * designated hash function. The `do_sign()` method will be
3043             * invoked with that hash value provided in the the `data`
3044             * buffer.
3045             *
3046             * If the second option is used, then the SSL engine will NOT
3047             * compute a hash on the data; instead, it will provide the
3048             * to-be-signed data itself in `data`, i.e. the concatenation of
3049             * the client random, server random, and encoded ECDH
3050             * parameters. Furthermore, with TLS-1.2 and later, the 16-bit
3051             * identifier will be used "as is" in the protocol, in the
3052             * SignatureAndHashAlgorithm; for instance, `0x0401` stands for
3053             * RSA PKCS#1 v1.5 signature (the `01`) with SHA-256 as hash
3054             * function (the `04`).
3055             *
3056             * Take care that with TLS 1.0 and 1.1, the hash function is
3057             * constrainted by the protocol: RSA signature must use
3058             * MD5+SHA-1 (so use `0xFF00`), while ECDSA must use SHA-1
3059             * (`0xFF02`). Since TLS 1.0 and 1.1 don't include a
3060             * SignatureAndHashAlgorithm field in their ServerKeyExchange
3061             * messages, any value below `0xFF00` will be usable to send the
3062             * raw ServerKeyExchange data to the `do_sign()` callback, but
3063             * that callback must still follow the protocol requirements
3064             * when generating the signature.
3065             */
3066             unsigned algo_id;
3067              
3068             /**
3069             * \brief Certificate chain to send to the client.
3070             *
3071             * This is an array of `br_x509_certificate` objects, each
3072             * normally containing a DER-encoded certificate. The server
3073             * code does not try to decode these elements.
3074             */
3075             const br_x509_certificate *chain;
3076              
3077             /**
3078             * \brief Certificate chain length (number of certificates).
3079             */
3080             size_t chain_len;
3081              
3082             } br_ssl_server_choices;
3083              
3084             /**
3085             * \brief Class type for a policy handler (server side).
3086             *
3087             * A policy handler selects the policy parameters for a connection
3088             * (cipher suite and other algorithms, and certificate chain to send to
3089             * the client); it also performs the server-side computations involving
3090             * its permanent private key.
3091             *
3092             * The SSL server engine will invoke first `choose()`, once the
3093             * ClientHello message has been received, then either `do_keyx()`
3094             * `do_sign()`, depending on the cipher suite.
3095             */
3096             typedef struct br_ssl_server_policy_class_ br_ssl_server_policy_class;
3097             struct br_ssl_server_policy_class_ {
3098             /**
3099             * \brief Context size (in bytes).
3100             */
3101             size_t context_size;
3102              
3103             /**
3104             * \brief Select algorithms and certificates for this connection.
3105             *
3106             * This callback function shall fill the provided `choices`
3107             * structure with the policy choices for this connection. This
3108             * entails selecting the cipher suite, hash function for signing
3109             * the ServerKeyExchange (applicable only to ECDHE cipher suites),
3110             * and certificate chain to send.
3111             *
3112             * The callback receives a pointer to the server context that
3113             * contains the relevant data. In particular, the functions
3114             * `br_ssl_server_get_client_suites()`,
3115             * `br_ssl_server_get_client_hashes()` and
3116             * `br_ssl_server_get_client_curves()` can be used to obtain
3117             * the cipher suites, hash functions and elliptic curves
3118             * supported by both the client and server, respectively. The
3119             * `br_ssl_engine_get_version()` and `br_ssl_engine_get_server_name()`
3120             * functions yield the protocol version and requested server name
3121             * (SNI), respectively.
3122             *
3123             * This function may modify its context structure (`pctx`) in
3124             * arbitrary ways to keep track of its own choices.
3125             *
3126             * This function shall return 1 if appropriate policy choices
3127             * could be made, or 0 if this connection cannot be pursued.
3128             *
3129             * \param pctx policy context.
3130             * \param cc SSL server context.
3131             * \param choices destination structure for the policy choices.
3132             * \return 1 on success, 0 on error.
3133             */
3134             int (*choose)(const br_ssl_server_policy_class **pctx,
3135             const br_ssl_server_context *cc,
3136             br_ssl_server_choices *choices);
3137              
3138             /**
3139             * \brief Perform key exchange (server part).
3140             *
3141             * This callback is invoked to perform the server-side cryptographic
3142             * operation for a key exchange that is not ECDHE. This callback
3143             * uses the private key.
3144             *
3145             * **For RSA key exchange**, the provided `data` (of length `*len`
3146             * bytes) shall be decrypted with the server's private key, and
3147             * the 48-byte premaster secret copied back to the first 48 bytes
3148             * of `data`.
3149             *
3150             * - The caller makes sure that `*len` is at least 59 bytes.
3151             *
3152             * - This callback MUST check that the provided length matches
3153             * that of the key modulus; it shall report an error otherwise.
3154             *
3155             * - If the length matches that of the RSA key modulus, then
3156             * processing MUST be constant-time, even if decryption fails,
3157             * or the padding is incorrect, or the plaintext message length
3158             * is not exactly 48 bytes.
3159             *
3160             * - This callback needs not check the two first bytes of the
3161             * obtained pre-master secret (the caller will do that).
3162             *
3163             * - If an error is reported (0), then what the callback put
3164             * in the first 48 bytes of `data` is unimportant (the caller
3165             * will use random bytes instead).
3166             *
3167             * **For ECDH key exchange**, the provided `data` (of length `*len`
3168             * bytes) is the elliptic curve point from the client. The
3169             * callback shall multiply it with its private key, and store
3170             * the resulting X coordinate in `data`, starting at offset 0,
3171             * and set `*len` to the length of the X coordinate.
3172             *
3173             * - If the input array does not have the proper length for
3174             * an encoded curve point, then an error (0) shall be reported.
3175             *
3176             * - If the input array has the proper length, then processing
3177             * MUST be constant-time, even if the data is not a valid
3178             * encoded point.
3179             *
3180             * - This callback MUST check that the input point is valid.
3181             *
3182             * Returned value is 1 on success, 0 on error.
3183             *
3184             * \param pctx policy context.
3185             * \param data key exchange data from the client.
3186             * \param len key exchange data length (in bytes).
3187             * \return 1 on success, 0 on error.
3188             */
3189             uint32_t (*do_keyx)(const br_ssl_server_policy_class **pctx,
3190             unsigned char *data, size_t *len);
3191              
3192             /**
3193             * \brief Perform a signature (for a ServerKeyExchange message).
3194             *
3195             * This callback function is invoked for ECDHE cipher suites. On
3196             * input, the hash value or message to sign is in `data`, of
3197             * size `hv_len`; the involved hash function or algorithm is
3198             * identified by `algo_id`. The signature shall be computed and
3199             * written back into `data`; the total size of that buffer is
3200             * `len` bytes.
3201             *
3202             * This callback shall verify that the signature length does not
3203             * exceed `len` bytes, and abstain from writing the signature if
3204             * it does not fit.
3205             *
3206             * The `algo_id` value matches that which was written in the
3207             * `choices` structures by the `choose()` callback. This will be
3208             * one of the following:
3209             *
3210             * - `0xFF00 + id` for a hash function identifier `id`. In
3211             * that case, the `data` buffer contains a hash value
3212             * already computed over the data that is to be signed,
3213             * of length `hv_len`. The `id` may be 0 to designate the
3214             * special MD5+SHA-1 concatenation (old-style RSA signing).
3215             *
3216             * - Another value, lower than `0xFF00`. The `data` buffer
3217             * then contains the raw, non-hashed data to be signed
3218             * (concatenation of the client and server randoms and
3219             * ECDH parameters). The callback is responsible to apply
3220             * any relevant hashing as part of the signing process.
3221             *
3222             * Returned value is the signature length (in bytes), or 0 on error.
3223             *
3224             * \param pctx policy context.
3225             * \param algo_id hash function / algorithm identifier.
3226             * \param data input/output buffer (message/hash, then signature).
3227             * \param hv_len hash value or message length (in bytes).
3228             * \param len total buffer length (in bytes).
3229             * \return signature length (in bytes) on success, or 0 on error.
3230             */
3231             size_t (*do_sign)(const br_ssl_server_policy_class **pctx,
3232             unsigned algo_id,
3233             unsigned char *data, size_t hv_len, size_t len);
3234             };
3235              
3236             /**
3237             * \brief A single-chain RSA policy handler.
3238             *
3239             * This policy context uses a single certificate chain, and a RSA
3240             * private key. The context can be restricted to only signatures or
3241             * only key exchange.
3242             *
3243             * Apart from the first field (vtable pointer), its contents are
3244             * opaque and shall not be accessed directly.
3245             */
3246             typedef struct {
3247             /** \brief Pointer to vtable. */
3248             const br_ssl_server_policy_class *vtable;
3249             #ifndef BR_DOXYGEN_IGNORE
3250             const br_x509_certificate *chain;
3251             size_t chain_len;
3252             const br_rsa_private_key *sk;
3253             unsigned allowed_usages;
3254             br_rsa_private irsacore;
3255             br_rsa_pkcs1_sign irsasign;
3256             #endif
3257             } br_ssl_server_policy_rsa_context;
3258              
3259             /**
3260             * \brief A single-chain EC policy handler.
3261             *
3262             * This policy context uses a single certificate chain, and an EC
3263             * private key. The context can be restricted to only signatures or
3264             * only key exchange.
3265             *
3266             * Due to how TLS is defined, this context must be made aware whether
3267             * the server certificate was itself signed with RSA or ECDSA. The code
3268             * does not try to decode the certificate to obtain that information.
3269             *
3270             * Apart from the first field (vtable pointer), its contents are
3271             * opaque and shall not be accessed directly.
3272             */
3273             typedef struct {
3274             /** \brief Pointer to vtable. */
3275             const br_ssl_server_policy_class *vtable;
3276             #ifndef BR_DOXYGEN_IGNORE
3277             const br_x509_certificate *chain;
3278             size_t chain_len;
3279             const br_ec_private_key *sk;
3280             unsigned allowed_usages;
3281             unsigned cert_issuer_key_type;
3282             const br_multihash_context *mhash;
3283             const br_ec_impl *iec;
3284             br_ecdsa_sign iecdsa;
3285             #endif
3286             } br_ssl_server_policy_ec_context;
3287              
3288             /**
3289             * \brief Class type for a session parameter cache.
3290             *
3291             * Session parameters are saved in the cache with `save()`, and
3292             * retrieved with `load()`. The cache implementation can apply any
3293             * storage and eviction strategy that it sees fit. The SSL server
3294             * context that performs the request is provided, so that its
3295             * functionalities may be used by the implementation (e.g. hash
3296             * functions or random number generation).
3297             */
3298             typedef struct br_ssl_session_cache_class_ br_ssl_session_cache_class;
3299             struct br_ssl_session_cache_class_ {
3300             /**
3301             * \brief Context size (in bytes).
3302             */
3303             size_t context_size;
3304              
3305             /**
3306             * \brief Record a session.
3307             *
3308             * This callback should record the provided session parameters.
3309             * The `params` structure is transient, so its contents shall
3310             * be copied into the cache. The session ID has been randomly
3311             * generated and always has length exactly 32 bytes.
3312             *
3313             * \param ctx session cache context.
3314             * \param server_ctx SSL server context.
3315             * \param params session parameters to save.
3316             */
3317             void (*save)(const br_ssl_session_cache_class **ctx,
3318             br_ssl_server_context *server_ctx,
3319             const br_ssl_session_parameters *params);
3320              
3321             /**
3322             * \brief Lookup a session in the cache.
3323             *
3324             * The session ID to lookup is in `params` and always has length
3325             * exactly 32 bytes. If the session parameters are found in the
3326             * cache, then the parameters shall be copied into the `params`
3327             * structure. Returned value is 1 on successful lookup, 0
3328             * otherwise.
3329             *
3330             * \param ctx session cache context.
3331             * \param server_ctx SSL server context.
3332             * \param params destination for session parameters.
3333             * \return 1 if found, 0 otherwise.
3334             */
3335             int (*load)(const br_ssl_session_cache_class **ctx,
3336             br_ssl_server_context *server_ctx,
3337             br_ssl_session_parameters *params);
3338             };
3339              
3340             /**
3341             * \brief Context for a basic cache system.
3342             *
3343             * The system stores session parameters in a buffer provided at
3344             * initialisation time. Each entry uses exactly 100 bytes, and
3345             * buffer sizes up to 4294967295 bytes are supported.
3346             *
3347             * Entries are evicted with a LRU (Least Recently Used) policy. A
3348             * search tree is maintained to keep lookups fast even with large
3349             * caches.
3350             *
3351             * Apart from the first field (vtable pointer), the structure
3352             * contents are opaque and shall not be accessed directly.
3353             */
3354             typedef struct {
3355             /** \brief Pointer to vtable. */
3356             const br_ssl_session_cache_class *vtable;
3357             #ifndef BR_DOXYGEN_IGNORE
3358             unsigned char *store;
3359             size_t store_len, store_ptr;
3360             unsigned char index_key[32];
3361             const br_hash_class *hash;
3362             int init_done;
3363             uint32_t head, tail, root;
3364             #endif
3365             } br_ssl_session_cache_lru;
3366              
3367             /**
3368             * \brief Initialise a LRU session cache with the provided storage space.
3369             *
3370             * The provided storage space must remain valid as long as the cache
3371             * is used. Arbitrary lengths are supported, up to 4294967295 bytes;
3372             * each entry uses up exactly 100 bytes.
3373             *
3374             * \param cc session cache context.
3375             * \param store storage space for cached entries.
3376             * \param store_len storage space length (in bytes).
3377             */
3378             void br_ssl_session_cache_lru_init(br_ssl_session_cache_lru *cc,
3379             unsigned char *store, size_t store_len);
3380              
3381             /**
3382             * \brief Forget an entry in an LRU session cache.
3383             *
3384             * The session cache context must have been initialised. The entry
3385             * with the provided session ID (of exactly 32 bytes) is looked for
3386             * in the cache; if located, it is disabled.
3387             *
3388             * \param cc session cache context.
3389             * \param id session ID to forget.
3390             */
3391             void br_ssl_session_cache_lru_forget(
3392             br_ssl_session_cache_lru *cc, const unsigned char *id);
3393              
3394             /**
3395             * \brief Context structure for a SSL server.
3396             *
3397             * The first field (called `eng`) is the SSL engine; all functions that
3398             * work on a `br_ssl_engine_context` structure shall take as parameter
3399             * a pointer to that field. The other structure fields are opaque and
3400             * must not be accessed directly.
3401             */
3402             struct br_ssl_server_context_ {
3403             /**
3404             * \brief The encapsulated engine context.
3405             */
3406             br_ssl_engine_context eng;
3407              
3408             #ifndef BR_DOXYGEN_IGNORE
3409             /*
3410             * Maximum version from the client.
3411             */
3412             uint16_t client_max_version;
3413              
3414             /*
3415             * Session cache.
3416             */
3417             const br_ssl_session_cache_class **cache_vtable;
3418              
3419             /*
3420             * Translated cipher suites supported by the client. The list
3421             * is trimmed to include only the cipher suites that the
3422             * server also supports; they are in the same order as in the
3423             * client message.
3424             */
3425             br_suite_translated client_suites[BR_MAX_CIPHER_SUITES];
3426             unsigned char client_suites_num;
3427              
3428             /*
3429             * Hash functions supported by the client, with ECDSA and RSA
3430             * (bit mask). For hash function with id 'x', set bit index is
3431             * x for RSA, x+8 for ECDSA. For newer algorithms, with ID
3432             * 0x08**, bit 16+k is set for algorithm 0x0800+k.
3433             */
3434             uint32_t hashes;
3435              
3436             /*
3437             * Curves supported by the client (bit mask, for named curves).
3438             */
3439             uint32_t curves;
3440              
3441             /*
3442             * Context for chain handler.
3443             */
3444             const br_ssl_server_policy_class **policy_vtable;
3445             uint16_t sign_hash_id;
3446              
3447             /*
3448             * For the core handlers, thus avoiding (in most cases) the
3449             * need for an externally provided policy context.
3450             */
3451             union {
3452             const br_ssl_server_policy_class *vtable;
3453             br_ssl_server_policy_rsa_context single_rsa;
3454             br_ssl_server_policy_ec_context single_ec;
3455             } chain_handler;
3456              
3457             /*
3458             * Buffer for the ECDHE private key.
3459             */
3460             unsigned char ecdhe_key[70];
3461             size_t ecdhe_key_len;
3462              
3463             /*
3464             * Trust anchor names for client authentication. "ta_names" and
3465             * "tas" cannot be both non-NULL.
3466             */
3467             const br_x500_name *ta_names;
3468             const br_x509_trust_anchor *tas;
3469             size_t num_tas;
3470             size_t cur_dn_index;
3471             const unsigned char *cur_dn;
3472             size_t cur_dn_len;
3473              
3474             /*
3475             * Buffer for the hash value computed over all handshake messages
3476             * prior to CertificateVerify, and identifier for the hash function.
3477             */
3478             unsigned char hash_CV[64];
3479             size_t hash_CV_len;
3480             int hash_CV_id;
3481              
3482             /*
3483             * Server-specific implementations.
3484             * (none for now)
3485             */
3486             #endif
3487             };
3488              
3489             /*
3490             * Each br_ssl_server_init_xxx() function sets the list of supported
3491             * cipher suites and used implementations, as specified by the profile
3492             * name 'xxx'. Defined profile names are:
3493             *
3494             * full_rsa all supported algorithm, server key type is RSA
3495             * full_ec all supported algorithm, server key type is EC
3496             * TODO: add other profiles
3497             *
3498             * Naming scheme for "minimal" profiles: min123
3499             *
3500             * -- character 1: key exchange
3501             * r = RSA
3502             * e = ECDHE_RSA
3503             * f = ECDHE_ECDSA
3504             * u = ECDH_RSA
3505             * v = ECDH_ECDSA
3506             * -- character 2: version / PRF
3507             * 0 = TLS 1.0 / 1.1 with MD5+SHA-1
3508             * 2 = TLS 1.2 with SHA-256
3509             * 3 = TLS 1.2 with SHA-384
3510             * -- character 3: encryption
3511             * a = AES/CBC
3512             * d = 3DES/CBC
3513             * g = AES/GCM
3514             * c = ChaCha20+Poly1305
3515             */
3516              
3517             /**
3518             * \brief SSL server profile: full_rsa.
3519             *
3520             * This function initialises the provided SSL server context with
3521             * all supported algorithms and cipher suites that rely on a RSA
3522             * key pair.
3523             *
3524             * \param cc server context to initialise.
3525             * \param chain server certificate chain.
3526             * \param chain_len certificate chain length (number of certificate).
3527             * \param sk RSA private key.
3528             */
3529             void br_ssl_server_init_full_rsa(br_ssl_server_context *cc,
3530             const br_x509_certificate *chain, size_t chain_len,
3531             const br_rsa_private_key *sk);
3532              
3533             /**
3534             * \brief SSL server profile: full_ec.
3535             *
3536             * This function initialises the provided SSL server context with
3537             * all supported algorithms and cipher suites that rely on an EC
3538             * key pair.
3539             *
3540             * The key type of the CA that issued the server's certificate must
3541             * be provided, since it matters for ECDH cipher suites (ECDH_RSA
3542             * suites require a RSA-powered CA). The key type is either
3543             * `BR_KEYTYPE_RSA` or `BR_KEYTYPE_EC`.
3544             *
3545             * \param cc server context to initialise.
3546             * \param chain server certificate chain.
3547             * \param chain_len chain length (number of certificates).
3548             * \param cert_issuer_key_type certificate issuer's key type.
3549             * \param sk EC private key.
3550             */
3551             void br_ssl_server_init_full_ec(br_ssl_server_context *cc,
3552             const br_x509_certificate *chain, size_t chain_len,
3553             unsigned cert_issuer_key_type, const br_ec_private_key *sk);
3554              
3555             /**
3556             * \brief SSL server profile: minr2g.
3557             *
3558             * This profile uses only TLS_RSA_WITH_AES_128_GCM_SHA256. Server key is
3559             * RSA, and RSA key exchange is used (not forward secure, but uses little
3560             * CPU in the client).
3561             *
3562             * \param cc server context to initialise.
3563             * \param chain server certificate chain.
3564             * \param chain_len certificate chain length (number of certificate).
3565             * \param sk RSA private key.
3566             */
3567             void br_ssl_server_init_minr2g(br_ssl_server_context *cc,
3568             const br_x509_certificate *chain, size_t chain_len,
3569             const br_rsa_private_key *sk);
3570              
3571             /**
3572             * \brief SSL server profile: mine2g.
3573             *
3574             * This profile uses only TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. Server key
3575             * is RSA, and ECDHE key exchange is used. This suite provides forward
3576             * security, with a higher CPU expense on the client, and a somewhat
3577             * larger code footprint (compared to "minr2g").
3578             *
3579             * \param cc server context to initialise.
3580             * \param chain server certificate chain.
3581             * \param chain_len certificate chain length (number of certificate).
3582             * \param sk RSA private key.
3583             */
3584             void br_ssl_server_init_mine2g(br_ssl_server_context *cc,
3585             const br_x509_certificate *chain, size_t chain_len,
3586             const br_rsa_private_key *sk);
3587              
3588             /**
3589             * \brief SSL server profile: minf2g.
3590             *
3591             * This profile uses only TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
3592             * Server key is EC, and ECDHE key exchange is used. This suite provides
3593             * forward security, with a higher CPU expense on the client and server
3594             * (by a factor of about 3 to 4), and a somewhat larger code footprint
3595             * (compared to "minu2g" and "minv2g").
3596             *
3597             * \param cc server context to initialise.
3598             * \param chain server certificate chain.
3599             * \param chain_len certificate chain length (number of certificate).
3600             * \param sk EC private key.
3601             */
3602             void br_ssl_server_init_minf2g(br_ssl_server_context *cc,
3603             const br_x509_certificate *chain, size_t chain_len,
3604             const br_ec_private_key *sk);
3605              
3606             /**
3607             * \brief SSL server profile: minu2g.
3608             *
3609             * This profile uses only TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256.
3610             * Server key is EC, and ECDH key exchange is used; the issuing CA used
3611             * a RSA key.
3612             *
3613             * The "minu2g" and "minv2g" profiles do not provide forward secrecy,
3614             * but are the lightest on the server (for CPU usage), and are rather
3615             * inexpensive on the client as well.
3616             *
3617             * \param cc server context to initialise.
3618             * \param chain server certificate chain.
3619             * \param chain_len certificate chain length (number of certificate).
3620             * \param sk EC private key.
3621             */
3622             void br_ssl_server_init_minu2g(br_ssl_server_context *cc,
3623             const br_x509_certificate *chain, size_t chain_len,
3624             const br_ec_private_key *sk);
3625              
3626             /**
3627             * \brief SSL server profile: minv2g.
3628             *
3629             * This profile uses only TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256.
3630             * Server key is EC, and ECDH key exchange is used; the issuing CA used
3631             * an EC key.
3632             *
3633             * The "minu2g" and "minv2g" profiles do not provide forward secrecy,
3634             * but are the lightest on the server (for CPU usage), and are rather
3635             * inexpensive on the client as well.
3636             *
3637             * \param cc server context to initialise.
3638             * \param chain server certificate chain.
3639             * \param chain_len certificate chain length (number of certificate).
3640             * \param sk EC private key.
3641             */
3642             void br_ssl_server_init_minv2g(br_ssl_server_context *cc,
3643             const br_x509_certificate *chain, size_t chain_len,
3644             const br_ec_private_key *sk);
3645              
3646             /**
3647             * \brief SSL server profile: mine2c.
3648             *
3649             * This profile uses only TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256.
3650             * Server key is RSA, and ECDHE key exchange is used. This suite
3651             * provides forward security.
3652             *
3653             * \param cc server context to initialise.
3654             * \param chain server certificate chain.
3655             * \param chain_len certificate chain length (number of certificate).
3656             * \param sk RSA private key.
3657             */
3658             void br_ssl_server_init_mine2c(br_ssl_server_context *cc,
3659             const br_x509_certificate *chain, size_t chain_len,
3660             const br_rsa_private_key *sk);
3661              
3662             /**
3663             * \brief SSL server profile: minf2c.
3664             *
3665             * This profile uses only TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256.
3666             * Server key is EC, and ECDHE key exchange is used. This suite provides
3667             * forward security.
3668             *
3669             * \param cc server context to initialise.
3670             * \param chain server certificate chain.
3671             * \param chain_len certificate chain length (number of certificate).
3672             * \param sk EC private key.
3673             */
3674             void br_ssl_server_init_minf2c(br_ssl_server_context *cc,
3675             const br_x509_certificate *chain, size_t chain_len,
3676             const br_ec_private_key *sk);
3677              
3678             /**
3679             * \brief Get the supported client suites.
3680             *
3681             * This function shall be called only after the ClientHello has been
3682             * processed, typically from the policy engine. The returned array
3683             * contains the cipher suites that are supported by both the client
3684             * and the server; these suites are in client preference order, unless
3685             * the `BR_OPT_ENFORCE_SERVER_PREFERENCES` flag was set, in which case
3686             * they are in server preference order.
3687             *
3688             * The suites are _translated_, which means that each suite is given
3689             * as two 16-bit integers: the standard suite identifier, and its
3690             * translated version, broken down into its individual components,
3691             * as explained with the `br_suite_translated` type.
3692             *
3693             * The returned array is allocated in the context and will be rewritten
3694             * by each handshake.
3695             *
3696             * \param cc server context.
3697             * \param num receives the array size (number of suites).
3698             * \return the translated common cipher suites, in preference order.
3699             */
3700             static inline const br_suite_translated *
3701 0           br_ssl_server_get_client_suites(const br_ssl_server_context *cc, size_t *num)
3702             {
3703 0           *num = cc->client_suites_num;
3704 0           return cc->client_suites;
3705             }
3706              
3707             /**
3708             * \brief Get the hash functions and signature algorithms supported by
3709             * the client.
3710             *
3711             * This value is a bit field:
3712             *
3713             * - If RSA (PKCS#1 v1.5) is supported with hash function of ID `x`,
3714             * then bit `x` is set (hash function ID is 0 for the special MD5+SHA-1,
3715             * or 2 to 6 for the SHA family).
3716             *
3717             * - If ECDSA is supported with hash function of ID `x`, then bit `8+x`
3718             * is set.
3719             *
3720             * - Newer algorithms are symbolic 16-bit identifiers that do not
3721             * represent signature algorithm and hash function separately. If
3722             * the TLS-level identifier is `0x0800+x` for a `x` in the 0..15
3723             * range, then bit `16+x` is set.
3724             *
3725             * "New algorithms" are currently defined only in draft documents, so
3726             * this support is subject to possible change. Right now (early 2017),
3727             * this maps ed25519 (EdDSA on Curve25519) to bit 23, and ed448 (EdDSA
3728             * on Curve448) to bit 24. If the identifiers on the wire change in
3729             * future document, then the decoding mechanism in BearSSL will be
3730             * amended to keep mapping ed25519 and ed448 on bits 23 and 24,
3731             * respectively. Mapping of other new algorithms (e.g. RSA/PSS) is not
3732             * guaranteed yet.
3733             *
3734             * \param cc server context.
3735             * \return the client-supported hash functions and signature algorithms.
3736             */
3737             static inline uint32_t
3738             br_ssl_server_get_client_hashes(const br_ssl_server_context *cc)
3739             {
3740             return cc->hashes;
3741             }
3742              
3743             /**
3744             * \brief Get the elliptic curves supported by the client.
3745             *
3746             * This is a bit field (bit x is set if curve of ID x is supported).
3747             *
3748             * \param cc server context.
3749             * \return the client-supported elliptic curves.
3750             */
3751             static inline uint32_t
3752             br_ssl_server_get_client_curves(const br_ssl_server_context *cc)
3753             {
3754             return cc->curves;
3755             }
3756              
3757             /**
3758             * \brief Clear the complete contents of a SSL server context.
3759             *
3760             * Everything is cleared, including the reference to the configured buffer,
3761             * implementations, cipher suites and state. This is a preparatory step
3762             * to assembling a custom profile.
3763             *
3764             * \param cc server context to clear.
3765             */
3766             void br_ssl_server_zero(br_ssl_server_context *cc);
3767              
3768             /**
3769             * \brief Set an externally provided policy context.
3770             *
3771             * The policy context's methods are invoked to decide the cipher suite
3772             * and certificate chain, and to perform operations involving the server's
3773             * private key.
3774             *
3775             * \param cc server context.
3776             * \param pctx policy context (pointer to its vtable field).
3777             */
3778             static inline void
3779             br_ssl_server_set_policy(br_ssl_server_context *cc,
3780             const br_ssl_server_policy_class **pctx)
3781             {
3782             cc->policy_vtable = pctx;
3783             }
3784              
3785             /**
3786             * \brief Set the server certificate chain and key (single RSA case).
3787             *
3788             * This function uses a policy context included in the server context.
3789             * It configures use of a single server certificate chain with a RSA
3790             * private key. The `allowed_usages` is a combination of usages, namely
3791             * `BR_KEYTYPE_KEYX` and/or `BR_KEYTYPE_SIGN`; this enables or disables
3792             * the corresponding cipher suites (i.e. `TLS_RSA_*` use the RSA key for
3793             * key exchange, while `TLS_ECDHE_RSA_*` use the RSA key for signatures).
3794             *
3795             * \param cc server context.
3796             * \param chain server certificate chain to send to the client.
3797             * \param chain_len chain length (number of certificates).
3798             * \param sk server private key (RSA).
3799             * \param allowed_usages allowed private key usages.
3800             * \param irsacore RSA core implementation.
3801             * \param irsasign RSA signature implementation (PKCS#1 v1.5).
3802             */
3803             void br_ssl_server_set_single_rsa(br_ssl_server_context *cc,
3804             const br_x509_certificate *chain, size_t chain_len,
3805             const br_rsa_private_key *sk, unsigned allowed_usages,
3806             br_rsa_private irsacore, br_rsa_pkcs1_sign irsasign);
3807              
3808             /**
3809             * \brief Set the server certificate chain and key (single EC case).
3810             *
3811             * This function uses a policy context included in the server context.
3812             * It configures use of a single server certificate chain with an EC
3813             * private key. The `allowed_usages` is a combination of usages, namely
3814             * `BR_KEYTYPE_KEYX` and/or `BR_KEYTYPE_SIGN`; this enables or disables
3815             * the corresponding cipher suites (i.e. `TLS_ECDH_*` use the EC key for
3816             * key exchange, while `TLS_ECDHE_ECDSA_*` use the EC key for signatures).
3817             *
3818             * In order to support `TLS_ECDH_*` cipher suites (non-ephemeral ECDH),
3819             * the algorithm type of the key used by the issuing CA to sign the
3820             * server's certificate must be provided, as `cert_issuer_key_type`
3821             * parameter (this value is either `BR_KEYTYPE_RSA` or `BR_KEYTYPE_EC`).
3822             *
3823             * \param cc server context.
3824             * \param chain server certificate chain to send.
3825             * \param chain_len chain length (number of certificates).
3826             * \param sk server private key (EC).
3827             * \param allowed_usages allowed private key usages.
3828             * \param cert_issuer_key_type issuing CA's key type.
3829             * \param iec EC core implementation.
3830             * \param iecdsa ECDSA signature implementation ("asn1" format).
3831             */
3832             void br_ssl_server_set_single_ec(br_ssl_server_context *cc,
3833             const br_x509_certificate *chain, size_t chain_len,
3834             const br_ec_private_key *sk, unsigned allowed_usages,
3835             unsigned cert_issuer_key_type,
3836             const br_ec_impl *iec, br_ecdsa_sign iecdsa);
3837              
3838             /**
3839             * \brief Activate client certificate authentication.
3840             *
3841             * The trust anchor encoded X.500 names (DN) to send to the client are
3842             * provided. A client certificate will be requested and validated through
3843             * the X.509 validator configured in the SSL engine. If `num` is 0, then
3844             * client certificate authentication is disabled.
3845             *
3846             * If the client does not send a certificate, or on validation failure,
3847             * the handshake aborts. Unauthenticated clients can be tolerated by
3848             * setting the `BR_OPT_TOLERATE_NO_CLIENT_AUTH` flag.
3849             *
3850             * The provided array is linked in, not copied, so that pointer must
3851             * remain valid as long as anchor names may be used.
3852             *
3853             * \param cc server context.
3854             * \param ta_names encoded trust anchor names.
3855             * \param num number of encoded trust anchor names.
3856             */
3857             static inline void
3858             br_ssl_server_set_trust_anchor_names(br_ssl_server_context *cc,
3859             const br_x500_name *ta_names, size_t num)
3860             {
3861             cc->ta_names = ta_names;
3862             cc->tas = NULL;
3863             cc->num_tas = num;
3864             }
3865              
3866             /**
3867             * \brief Activate client certificate authentication.
3868             *
3869             * This is a variant for `br_ssl_server_set_trust_anchor_names()`: the
3870             * trust anchor names are provided not as an array of stand-alone names
3871             * (`br_x500_name` structures), but as an array of trust anchors
3872             * (`br_x509_trust_anchor` structures). The server engine itself will
3873             * only use the `dn` field of each trust anchor. This is meant to allow
3874             * defining a single array of trust anchors, to be used here and in the
3875             * X.509 validation engine itself.
3876             *
3877             * The provided array is linked in, not copied, so that pointer must
3878             * remain valid as long as anchor names may be used.
3879             *
3880             * \param cc server context.
3881             * \param tas trust anchors (only names are used).
3882             * \param num number of trust anchors.
3883             */
3884             static inline void
3885             br_ssl_server_set_trust_anchor_names_alt(br_ssl_server_context *cc,
3886             const br_x509_trust_anchor *tas, size_t num)
3887             {
3888             cc->ta_names = NULL;
3889             cc->tas = tas;
3890             cc->num_tas = num;
3891             }
3892              
3893             /**
3894             * \brief Configure the cache for session parameters.
3895             *
3896             * The cache context is provided as a pointer to its first field (vtable
3897             * pointer).
3898             *
3899             * \param cc server context.
3900             * \param vtable session cache context.
3901             */
3902             static inline void
3903             br_ssl_server_set_cache(br_ssl_server_context *cc,
3904             const br_ssl_session_cache_class **vtable)
3905             {
3906             cc->cache_vtable = vtable;
3907             }
3908              
3909             /**
3910             * \brief Prepare or reset a server context for handling an incoming client.
3911             *
3912             * \param cc server context.
3913             * \return 1 on success, 0 on error.
3914             */
3915             int br_ssl_server_reset(br_ssl_server_context *cc);
3916              
3917             /* ===================================================================== */
3918              
3919             /*
3920             * Context for the simplified I/O context. The transport medium is accessed
3921             * through the low_read() and low_write() callback functions, each with
3922             * its own opaque context pointer.
3923             *
3924             * low_read() read some bytes, at most 'len' bytes, into data[]. The
3925             * returned value is the number of read bytes, or -1 on error.
3926             * The 'len' parameter is guaranteed never to exceed 20000,
3927             * so the length always fits in an 'int' on all platforms.
3928             *
3929             * low_write() write up to 'len' bytes, to be read from data[]. The
3930             * returned value is the number of written bytes, or -1 on
3931             * error. The 'len' parameter is guaranteed never to exceed
3932             * 20000, so the length always fits in an 'int' on all
3933             * parameters.
3934             *
3935             * A socket closure (if the transport medium is a socket) should be reported
3936             * as an error (-1). The callbacks shall endeavour to block until at least
3937             * one byte can be read or written; a callback returning 0 at times is
3938             * acceptable, but this normally leads to the callback being immediately
3939             * called again, so the callback should at least always try to block for
3940             * some time if no I/O can take place.
3941             *
3942             * The SSL engine naturally applies some buffering, so the callbacks need
3943             * not apply buffers of their own.
3944             */
3945             /**
3946             * \brief Context structure for the simplified SSL I/O wrapper.
3947             *
3948             * This structure is initialised with `br_sslio_init()`. Its contents
3949             * are opaque and shall not be accessed directly.
3950             */
3951             typedef struct {
3952             #ifndef BR_DOXYGEN_IGNORE
3953             br_ssl_engine_context *engine;
3954             int (*low_read)(void *read_context,
3955             unsigned char *data, size_t len);
3956             void *read_context;
3957             int (*low_write)(void *write_context,
3958             const unsigned char *data, size_t len);
3959             void *write_context;
3960             #endif
3961             } br_sslio_context;
3962              
3963             /**
3964             * \brief Initialise a simplified I/O wrapper context.
3965             *
3966             * The simplified I/O wrapper offers a simpler read/write API for a SSL
3967             * engine (client or server), using the provided callback functions for
3968             * reading data from, or writing data to, the transport medium.
3969             *
3970             * The callback functions have the following semantics:
3971             *
3972             * - Each callback receives an opaque context value (of type `void *`)
3973             * that the callback may use arbitrarily (or possibly ignore).
3974             *
3975             * - `low_read()` reads at least one byte, at most `len` bytes, from
3976             * the transport medium. Read bytes shall be written in `data`.
3977             *
3978             * - `low_write()` writes at least one byte, at most `len` bytes, unto
3979             * the transport medium. The bytes to write are read from `data`.
3980             *
3981             * - The `len` parameter is never zero, and is always lower than 20000.
3982             *
3983             * - The number of processed bytes (read or written) is returned. Since
3984             * that number is less than 20000, it always fits on an `int`.
3985             *
3986             * - On error, the callbacks return -1. Reaching end-of-stream is an
3987             * error. Errors are permanent: the SSL connection is terminated.
3988             *
3989             * - Callbacks SHOULD NOT return 0. This is tolerated, as long as
3990             * callbacks endeavour to block for some non-negligible amount of
3991             * time until at least one byte can be sent or received (if a
3992             * callback returns 0, then the wrapper invokes it again
3993             * immediately).
3994             *
3995             * - Callbacks MAY return as soon as at least one byte is processed;
3996             * they MAY also insist on reading or writing _all_ requested bytes.
3997             * Since SSL is a self-terminated protocol (each record has a length
3998             * header), this does not change semantics.
3999             *
4000             * - Callbacks need not apply any buffering (for performance) since SSL
4001             * itself uses buffers.
4002             *
4003             * \param ctx wrapper context to initialise.
4004             * \param engine SSL engine to wrap.
4005             * \param low_read callback for reading data from the transport.
4006             * \param read_context context pointer for `low_read()`.
4007             * \param low_write callback for writing data on the transport.
4008             * \param write_context context pointer for `low_write()`.
4009             */
4010             void br_sslio_init(br_sslio_context *ctx,
4011             br_ssl_engine_context *engine,
4012             int (*low_read)(void *read_context,
4013             unsigned char *data, size_t len),
4014             void *read_context,
4015             int (*low_write)(void *write_context,
4016             const unsigned char *data, size_t len),
4017             void *write_context);
4018              
4019             /**
4020             * \brief Read some application data from a SSL connection.
4021             *
4022             * If `len` is zero, then this function returns 0 immediately. In
4023             * all other cases, it never returns 0.
4024             *
4025             * This call returns only when at least one byte has been obtained.
4026             * Returned value is the number of bytes read, or -1 on error. The
4027             * number of bytes always fits on an 'int' (data from a single SSL/TLS
4028             * record is returned).
4029             *
4030             * On error or SSL closure, this function returns -1. The caller should
4031             * inspect the error status on the SSL engine to distinguish between
4032             * normal closure and error.
4033             *
4034             * \param cc SSL wrapper context.
4035             * \param dst destination buffer for application data.
4036             * \param len maximum number of bytes to obtain.
4037             * \return number of bytes obtained, or -1 on error.
4038             */
4039             int br_sslio_read(br_sslio_context *cc, void *dst, size_t len);
4040              
4041             /**
4042             * \brief Read application data from a SSL connection.
4043             *
4044             * This calls returns only when _all_ requested `len` bytes are read,
4045             * or an error is reached. Returned value is 0 on success, -1 on error.
4046             * A normal (verified) SSL closure before that many bytes are obtained
4047             * is reported as an error by this function.
4048             *
4049             * \param cc SSL wrapper context.
4050             * \param dst destination buffer for application data.
4051             * \param len number of bytes to obtain.
4052             * \return 0 on success, or -1 on error.
4053             */
4054             int br_sslio_read_all(br_sslio_context *cc, void *dst, size_t len);
4055              
4056             /**
4057             * \brief Write some application data unto a SSL connection.
4058             *
4059             * If `len` is zero, then this function returns 0 immediately. In
4060             * all other cases, it never returns 0.
4061             *
4062             * This call returns only when at least one byte has been written.
4063             * Returned value is the number of bytes written, or -1 on error. The
4064             * number of bytes always fits on an 'int' (less than 20000).
4065             *
4066             * On error or SSL closure, this function returns -1. The caller should
4067             * inspect the error status on the SSL engine to distinguish between
4068             * normal closure and error.
4069             *
4070             * **Important:** SSL is buffered; a "written" byte is a byte that was
4071             * injected into the wrapped SSL engine, but this does not necessarily mean
4072             * that it has been scheduled for sending. Use `br_sslio_flush()` to
4073             * ensure that all pending data has been sent to the transport medium.
4074             *
4075             * \param cc SSL wrapper context.
4076             * \param src source buffer for application data.
4077             * \param len maximum number of bytes to write.
4078             * \return number of bytes written, or -1 on error.
4079             */
4080             int br_sslio_write(br_sslio_context *cc, const void *src, size_t len);
4081              
4082             /**
4083             * \brief Write application data unto a SSL connection.
4084             *
4085             * This calls returns only when _all_ requested `len` bytes have been
4086             * written, or an error is reached. Returned value is 0 on success, -1
4087             * on error. A normal (verified) SSL closure before that many bytes are
4088             * written is reported as an error by this function.
4089             *
4090             * **Important:** SSL is buffered; a "written" byte is a byte that was
4091             * injected into the wrapped SSL engine, but this does not necessarily mean
4092             * that it has been scheduled for sending. Use `br_sslio_flush()` to
4093             * ensure that all pending data has been sent to the transport medium.
4094             *
4095             * \param cc SSL wrapper context.
4096             * \param src source buffer for application data.
4097             * \param len number of bytes to write.
4098             * \return 0 on success, or -1 on error.
4099             */
4100             int br_sslio_write_all(br_sslio_context *cc, const void *src, size_t len);
4101              
4102             /**
4103             * \brief Flush pending data.
4104             *
4105             * This call makes sure that any buffered application data in the
4106             * provided context (including the wrapped SSL engine) has been sent
4107             * to the transport medium (i.e. accepted by the `low_write()` callback
4108             * method). If there is no such pending data, then this function does
4109             * nothing (and returns a success, i.e. 0).
4110             *
4111             * If the underlying transport medium has its own buffers, then it is
4112             * up to the caller to ensure the corresponding flushing.
4113             *
4114             * Returned value is 0 on success, -1 on error.
4115             *
4116             * \param cc SSL wrapper context.
4117             * \return 0 on success, or -1 on error.
4118             */
4119             int br_sslio_flush(br_sslio_context *cc);
4120              
4121             /**
4122             * \brief Close the SSL connection.
4123             *
4124             * This call runs the SSL closure protocol (sending a `close_notify`,
4125             * receiving the response `close_notify`). When it returns, the SSL
4126             * connection is finished. It is still up to the caller to manage the
4127             * possible transport-level termination, if applicable (alternatively,
4128             * the underlying transport stream may be reused for non-SSL messages).
4129             *
4130             * Returned value is 0 on success, -1 on error. A failure by the peer
4131             * to process the complete closure protocol (i.e. sending back the
4132             * `close_notify`) is an error.
4133             *
4134             * \param cc SSL wrapper context.
4135             * \return 0 on success, or -1 on error.
4136             */
4137             int br_sslio_close(br_sslio_context *cc);
4138              
4139             /* ===================================================================== */
4140              
4141             /*
4142             * Symbolic constants for cipher suites.
4143             */
4144              
4145             /* From RFC 5246 */
4146             #define BR_TLS_NULL_WITH_NULL_NULL 0x0000
4147             #define BR_TLS_RSA_WITH_NULL_MD5 0x0001
4148             #define BR_TLS_RSA_WITH_NULL_SHA 0x0002
4149             #define BR_TLS_RSA_WITH_NULL_SHA256 0x003B
4150             #define BR_TLS_RSA_WITH_RC4_128_MD5 0x0004
4151             #define BR_TLS_RSA_WITH_RC4_128_SHA 0x0005
4152             #define BR_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x000A
4153             #define BR_TLS_RSA_WITH_AES_128_CBC_SHA 0x002F
4154             #define BR_TLS_RSA_WITH_AES_256_CBC_SHA 0x0035
4155             #define BR_TLS_RSA_WITH_AES_128_CBC_SHA256 0x003C
4156             #define BR_TLS_RSA_WITH_AES_256_CBC_SHA256 0x003D
4157             #define BR_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA 0x000D
4158             #define BR_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA 0x0010
4159             #define BR_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 0x0013
4160             #define BR_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x0016
4161             #define BR_TLS_DH_DSS_WITH_AES_128_CBC_SHA 0x0030
4162             #define BR_TLS_DH_RSA_WITH_AES_128_CBC_SHA 0x0031
4163             #define BR_TLS_DHE_DSS_WITH_AES_128_CBC_SHA 0x0032
4164             #define BR_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x0033
4165             #define BR_TLS_DH_DSS_WITH_AES_256_CBC_SHA 0x0036
4166             #define BR_TLS_DH_RSA_WITH_AES_256_CBC_SHA 0x0037
4167             #define BR_TLS_DHE_DSS_WITH_AES_256_CBC_SHA 0x0038
4168             #define BR_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x0039
4169             #define BR_TLS_DH_DSS_WITH_AES_128_CBC_SHA256 0x003E
4170             #define BR_TLS_DH_RSA_WITH_AES_128_CBC_SHA256 0x003F
4171             #define BR_TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 0x0040
4172             #define BR_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x0067
4173             #define BR_TLS_DH_DSS_WITH_AES_256_CBC_SHA256 0x0068
4174             #define BR_TLS_DH_RSA_WITH_AES_256_CBC_SHA256 0x0069
4175             #define BR_TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 0x006A
4176             #define BR_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x006B
4177             #define BR_TLS_DH_anon_WITH_RC4_128_MD5 0x0018
4178             #define BR_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA 0x001B
4179             #define BR_TLS_DH_anon_WITH_AES_128_CBC_SHA 0x0034
4180             #define BR_TLS_DH_anon_WITH_AES_256_CBC_SHA 0x003A
4181             #define BR_TLS_DH_anon_WITH_AES_128_CBC_SHA256 0x006C
4182             #define BR_TLS_DH_anon_WITH_AES_256_CBC_SHA256 0x006D
4183              
4184             /* From RFC 4492 */
4185             #define BR_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001
4186             #define BR_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002
4187             #define BR_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003
4188             #define BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004
4189             #define BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005
4190             #define BR_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006
4191             #define BR_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007
4192             #define BR_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008
4193             #define BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009
4194             #define BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A
4195             #define BR_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B
4196             #define BR_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C
4197             #define BR_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D
4198             #define BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E
4199             #define BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F
4200             #define BR_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010
4201             #define BR_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011
4202             #define BR_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012
4203             #define BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013
4204             #define BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014
4205             #define BR_TLS_ECDH_anon_WITH_NULL_SHA 0xC015
4206             #define BR_TLS_ECDH_anon_WITH_RC4_128_SHA 0xC016
4207             #define BR_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA 0xC017
4208             #define BR_TLS_ECDH_anon_WITH_AES_128_CBC_SHA 0xC018
4209             #define BR_TLS_ECDH_anon_WITH_AES_256_CBC_SHA 0xC019
4210              
4211             /* From RFC 5288 */
4212             #define BR_TLS_RSA_WITH_AES_128_GCM_SHA256 0x009C
4213             #define BR_TLS_RSA_WITH_AES_256_GCM_SHA384 0x009D
4214             #define BR_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x009E
4215             #define BR_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x009F
4216             #define BR_TLS_DH_RSA_WITH_AES_128_GCM_SHA256 0x00A0
4217             #define BR_TLS_DH_RSA_WITH_AES_256_GCM_SHA384 0x00A1
4218             #define BR_TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 0x00A2
4219             #define BR_TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 0x00A3
4220             #define BR_TLS_DH_DSS_WITH_AES_128_GCM_SHA256 0x00A4
4221             #define BR_TLS_DH_DSS_WITH_AES_256_GCM_SHA384 0x00A5
4222             #define BR_TLS_DH_anon_WITH_AES_128_GCM_SHA256 0x00A6
4223             #define BR_TLS_DH_anon_WITH_AES_256_GCM_SHA384 0x00A7
4224              
4225             /* From RFC 5289 */
4226             #define BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023
4227             #define BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024
4228             #define BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025
4229             #define BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026
4230             #define BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027
4231             #define BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028
4232             #define BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029
4233             #define BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A
4234             #define BR_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B
4235             #define BR_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C
4236             #define BR_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D
4237             #define BR_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E
4238             #define BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
4239             #define BR_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030
4240             #define BR_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031
4241             #define BR_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032
4242              
4243             /* From RFC 6655 and 7251 */
4244             #define BR_TLS_RSA_WITH_AES_128_CCM 0xC09C
4245             #define BR_TLS_RSA_WITH_AES_256_CCM 0xC09D
4246             #define BR_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0
4247             #define BR_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1
4248             #define BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC
4249             #define BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD
4250             #define BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE
4251             #define BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF
4252              
4253             /* From RFC 7905 */
4254             #define BR_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8
4255             #define BR_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA9
4256             #define BR_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCAA
4257             #define BR_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAB
4258             #define BR_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAC
4259             #define BR_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAD
4260             #define BR_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAE
4261              
4262             /* From RFC 7507 */
4263             #define BR_TLS_FALLBACK_SCSV 0x5600
4264              
4265             /*
4266             * Symbolic constants for alerts.
4267             */
4268             #define BR_ALERT_CLOSE_NOTIFY 0
4269             #define BR_ALERT_UNEXPECTED_MESSAGE 10
4270             #define BR_ALERT_BAD_RECORD_MAC 20
4271             #define BR_ALERT_RECORD_OVERFLOW 22
4272             #define BR_ALERT_DECOMPRESSION_FAILURE 30
4273             #define BR_ALERT_HANDSHAKE_FAILURE 40
4274             #define BR_ALERT_BAD_CERTIFICATE 42
4275             #define BR_ALERT_UNSUPPORTED_CERTIFICATE 43
4276             #define BR_ALERT_CERTIFICATE_REVOKED 44
4277             #define BR_ALERT_CERTIFICATE_EXPIRED 45
4278             #define BR_ALERT_CERTIFICATE_UNKNOWN 46
4279             #define BR_ALERT_ILLEGAL_PARAMETER 47
4280             #define BR_ALERT_UNKNOWN_CA 48
4281             #define BR_ALERT_ACCESS_DENIED 49
4282             #define BR_ALERT_DECODE_ERROR 50
4283             #define BR_ALERT_DECRYPT_ERROR 51
4284             #define BR_ALERT_PROTOCOL_VERSION 70
4285             #define BR_ALERT_INSUFFICIENT_SECURITY 71
4286             #define BR_ALERT_INTERNAL_ERROR 80
4287             #define BR_ALERT_USER_CANCELED 90
4288             #define BR_ALERT_NO_RENEGOTIATION 100
4289             #define BR_ALERT_UNSUPPORTED_EXTENSION 110
4290             #define BR_ALERT_NO_APPLICATION_PROTOCOL 120
4291              
4292             #ifdef __cplusplus
4293             }
4294             #endif
4295              
4296             #endif