@pulse-compute/crypto 1.0.0-beta.4 → 1.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +89 -8
  2. package/as/digest-text.as.ts +34 -0
  3. package/as/pulse-hmac-as.ts +7 -1
  4. package/conformance/digest-text.json +38 -0
  5. package/conformance/hs256.json +85 -0
  6. package/dist/contracts.d.ts +34 -12
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js +9 -3
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/digest.d.ts +14 -0
  11. package/dist/digest.d.ts.map +1 -0
  12. package/dist/digest.js +17 -0
  13. package/dist/digest.js.map +1 -0
  14. package/dist/index.d.ts +6 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +20 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/internal/rsa.d.ts +58 -0
  19. package/dist/internal/rsa.d.ts.map +1 -0
  20. package/dist/internal/rsa.js +185 -0
  21. package/dist/internal/rsa.js.map +1 -0
  22. package/dist/internal/verification.d.ts +3 -3
  23. package/dist/internal/verification.d.ts.map +1 -1
  24. package/dist/internal/verification.js +2 -2
  25. package/dist/internal/verification.js.map +1 -1
  26. package/guests/es256-rustcrypto/README.md +43 -0
  27. package/guests/es256-rustcrypto/build.cjs +297 -0
  28. package/guests/es256-rustcrypto/prebuilt/es256-verifier.unoptimized.wasm +0 -0
  29. package/guests/es256-rustcrypto/prebuilt/es256-verifier.wasm +0 -0
  30. package/guests/es256-rustcrypto/probe/.cargo/config.toml +18 -0
  31. package/guests/es256-rustcrypto/probe/Cargo.lock +238 -0
  32. package/guests/es256-rustcrypto/probe/Cargo.toml +26 -0
  33. package/guests/es256-rustcrypto/probe/README.md +35 -0
  34. package/guests/es256-rustcrypto/probe/rust-toolchain.toml +5 -0
  35. package/guests/es256-rustcrypto/probe/src/lib.rs +108 -0
  36. package/guests/es256-rustcrypto/pulse.guest-unit.json +119 -0
  37. package/guests/es256-rustcrypto/source/.cargo/config.toml +18 -0
  38. package/guests/es256-rustcrypto/source/Cargo.lock +265 -0
  39. package/guests/es256-rustcrypto/source/Cargo.toml +23 -0
  40. package/guests/es256-rustcrypto/source/README.md +26 -0
  41. package/guests/es256-rustcrypto/source/bearssl/LICENSE.txt +21 -0
  42. package/guests/es256-rustcrypto/source/bearssl/UPSTREAM.json +49 -0
  43. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl.h +170 -0
  44. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_aead.h +1059 -0
  45. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_block.h +2618 -0
  46. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ec.h +883 -0
  47. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hash.h +1346 -0
  48. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hmac.h +241 -0
  49. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_kdf.h +185 -0
  50. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_pem.h +294 -0
  51. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_prf.h +150 -0
  52. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rand.h +397 -0
  53. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rsa.h +1366 -0
  54. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ssl.h +4296 -0
  55. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_x509.h +1397 -0
  56. package/guests/es256-rustcrypto/source/bearssl/src/codec/ccopy.c +44 -0
  57. package/guests/es256-rustcrypto/source/bearssl/src/codec/dec32be.c +38 -0
  58. package/guests/es256-rustcrypto/source/bearssl/src/codec/enc32be.c +38 -0
  59. package/guests/es256-rustcrypto/source/bearssl/src/config.h +229 -0
  60. package/guests/es256-rustcrypto/source/bearssl/src/inner.h +2532 -0
  61. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_add.c +46 -0
  62. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_bitlen.c +44 -0
  63. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decmod.c +124 -0
  64. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decode.c +57 -0
  65. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decred.c +103 -0
  66. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_encode.c +79 -0
  67. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_fmont.c +60 -0
  68. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_iszero.c +39 -0
  69. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_moddiv.c +488 -0
  70. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow.c +65 -0
  71. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow2.c +160 -0
  72. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_montmul.c +93 -0
  73. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_mulacc.c +61 -0
  74. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_muladd.c +157 -0
  75. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_ninv31.c +39 -0
  76. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_reduce.c +66 -0
  77. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_rshift.c +47 -0
  78. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_sub.c +46 -0
  79. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_tmont.c +36 -0
  80. package/guests/es256-rustcrypto/source/bearssl/src/int/i32_div32.c +56 -0
  81. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  82. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  83. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  84. package/guests/es256-rustcrypto/source/build.rs +38 -0
  85. package/guests/es256-rustcrypto/source/freestanding/string.h +8 -0
  86. package/guests/es256-rustcrypto/source/rs256.c +103 -0
  87. package/guests/es256-rustcrypto/source/rust-toolchain.toml +5 -0
  88. package/guests/es256-rustcrypto/source/src/lib.rs +308 -0
  89. package/package.json +22 -4
  90. package/pulse.package.json +64 -0
  91. package/pulsewasm.compiler.cjs +89 -0
  92. package/pulsewasm.manifest.cjs +15 -0
  93. package/pulsewasm.native.cjs +79 -7
  94. package/src/provider.cjs +141 -2
  95. package/src/provider.d.cts +6 -0
@@ -0,0 +1,4296 @@
1
+ /*
2
+ * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
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 <stddef.h>
29
+ #include <stdint.h>
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
+ br_ssl_engine_set_versions(br_ssl_engine_context *cc,
1251
+ unsigned version_min, unsigned version_max)
1252
+ {
1253
+ cc->version_min = version_min;
1254
+ cc->version_max = version_max;
1255
+ }
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
+ br_ssl_engine_set_x509(br_ssl_engine_context *cc, const br_x509_class **x509ctx)
1289
+ {
1290
+ cc->x509ctx = x509ctx;
1291
+ }
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 = 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
+ br_ssl_engine_get_server_name(const br_ssl_engine_context *cc)
1885
+ {
1886
+ 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
+ br_ssl_engine_get_version(const br_ssl_engine_context *cc)
1901
+ {
1902
+ 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
+ br_ssl_engine_get_session_parameters(const br_ssl_engine_context *cc,
1922
+ br_ssl_session_parameters *pp)
1923
+ {
1924
+ memcpy(pp, &cc->session, sizeof *pp);
1925
+ }
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
+ br_ssl_engine_set_session_parameters(br_ssl_engine_context *cc,
1939
+ const br_ssl_session_parameters *pp)
1940
+ {
1941
+ memcpy(&cc->session, pp, sizeof *pp);
1942
+ }
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
+ br_ssl_engine_get_ecdhe_curve(br_ssl_engine_context *cc)
1959
+ {
1960
+ 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
+ br_ssl_engine_last_error(const br_ssl_engine_context *cc)
2033
+ {
2034
+ 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, hen 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
+ br_ssl_client_forget_session(br_ssl_client_context *cc)
2858
+ {
2859
+ cc->eng.session.session_id_len = 0;
2860
+ }
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
+ br_ssl_server_get_client_suites(const br_ssl_server_context *cc, size_t *num)
3702
+ {
3703
+ *num = cc->client_suites_num;
3704
+ 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