@pulse-compute/crypto 1.0.0-beta.5 → 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 (84) hide show
  1. package/README.md +56 -4
  2. package/dist/contracts.d.ts +34 -12
  3. package/dist/contracts.d.ts.map +1 -1
  4. package/dist/contracts.js +9 -3
  5. package/dist/contracts.js.map +1 -1
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +17 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal/rsa.d.ts +58 -0
  11. package/dist/internal/rsa.d.ts.map +1 -0
  12. package/dist/internal/rsa.js +185 -0
  13. package/dist/internal/rsa.js.map +1 -0
  14. package/dist/internal/verification.d.ts +3 -3
  15. package/dist/internal/verification.d.ts.map +1 -1
  16. package/dist/internal/verification.js +2 -2
  17. package/dist/internal/verification.js.map +1 -1
  18. package/guests/es256-rustcrypto/README.md +43 -0
  19. package/guests/es256-rustcrypto/build.cjs +297 -0
  20. package/guests/es256-rustcrypto/prebuilt/es256-verifier.unoptimized.wasm +0 -0
  21. package/guests/es256-rustcrypto/prebuilt/es256-verifier.wasm +0 -0
  22. package/guests/es256-rustcrypto/probe/.cargo/config.toml +18 -0
  23. package/guests/es256-rustcrypto/probe/Cargo.lock +238 -0
  24. package/guests/es256-rustcrypto/probe/Cargo.toml +26 -0
  25. package/guests/es256-rustcrypto/probe/README.md +35 -0
  26. package/guests/es256-rustcrypto/probe/rust-toolchain.toml +5 -0
  27. package/guests/es256-rustcrypto/probe/src/lib.rs +108 -0
  28. package/guests/es256-rustcrypto/pulse.guest-unit.json +119 -0
  29. package/guests/es256-rustcrypto/source/.cargo/config.toml +18 -0
  30. package/guests/es256-rustcrypto/source/Cargo.lock +265 -0
  31. package/guests/es256-rustcrypto/source/Cargo.toml +23 -0
  32. package/guests/es256-rustcrypto/source/README.md +26 -0
  33. package/guests/es256-rustcrypto/source/bearssl/LICENSE.txt +21 -0
  34. package/guests/es256-rustcrypto/source/bearssl/UPSTREAM.json +49 -0
  35. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl.h +170 -0
  36. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_aead.h +1059 -0
  37. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_block.h +2618 -0
  38. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ec.h +883 -0
  39. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hash.h +1346 -0
  40. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_hmac.h +241 -0
  41. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_kdf.h +185 -0
  42. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_pem.h +294 -0
  43. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_prf.h +150 -0
  44. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rand.h +397 -0
  45. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_rsa.h +1366 -0
  46. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_ssl.h +4296 -0
  47. package/guests/es256-rustcrypto/source/bearssl/inc/bearssl_x509.h +1397 -0
  48. package/guests/es256-rustcrypto/source/bearssl/src/codec/ccopy.c +44 -0
  49. package/guests/es256-rustcrypto/source/bearssl/src/codec/dec32be.c +38 -0
  50. package/guests/es256-rustcrypto/source/bearssl/src/codec/enc32be.c +38 -0
  51. package/guests/es256-rustcrypto/source/bearssl/src/config.h +229 -0
  52. package/guests/es256-rustcrypto/source/bearssl/src/inner.h +2532 -0
  53. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_add.c +46 -0
  54. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_bitlen.c +44 -0
  55. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decmod.c +124 -0
  56. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decode.c +57 -0
  57. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_decred.c +103 -0
  58. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_encode.c +79 -0
  59. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_fmont.c +60 -0
  60. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_iszero.c +39 -0
  61. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_moddiv.c +488 -0
  62. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow.c +65 -0
  63. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_modpow2.c +160 -0
  64. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_montmul.c +93 -0
  65. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_mulacc.c +61 -0
  66. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_muladd.c +157 -0
  67. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_ninv31.c +39 -0
  68. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_reduce.c +66 -0
  69. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_rshift.c +47 -0
  70. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_sub.c +46 -0
  71. package/guests/es256-rustcrypto/source/bearssl/src/int/i31_tmont.c +36 -0
  72. package/guests/es256-rustcrypto/source/bearssl/src/int/i32_div32.c +56 -0
  73. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  74. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  75. package/guests/es256-rustcrypto/source/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  76. package/guests/es256-rustcrypto/source/build.rs +38 -0
  77. package/guests/es256-rustcrypto/source/freestanding/string.h +8 -0
  78. package/guests/es256-rustcrypto/source/rs256.c +103 -0
  79. package/guests/es256-rustcrypto/source/rust-toolchain.toml +5 -0
  80. package/guests/es256-rustcrypto/source/src/lib.rs +308 -0
  81. package/package.json +6 -4
  82. package/pulsewasm.native.cjs +66 -0
  83. package/src/provider.cjs +71 -1
  84. package/src/provider.d.cts +6 -0
@@ -0,0 +1,1346 @@
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_HASH_H__
26
+ #define BR_BEARSSL_HASH_H__
27
+
28
+ #include <stddef.h>
29
+ #include <stdint.h>
30
+ #include <string.h>
31
+
32
+ #ifdef __cplusplus
33
+ extern "C" {
34
+ #endif
35
+
36
+ /** \file bearssl_hash.h
37
+ *
38
+ * # Hash Functions
39
+ *
40
+ * This file documents the API for hash functions.
41
+ *
42
+ *
43
+ * ## Procedural API
44
+ *
45
+ * For each implemented hash function, of name "`xxx`", the following
46
+ * elements are defined:
47
+ *
48
+ * - `br_xxx_vtable`
49
+ *
50
+ * An externally defined instance of `br_hash_class`.
51
+ *
52
+ * - `br_xxx_SIZE`
53
+ *
54
+ * A macro that evaluates to the output size (in bytes) of the
55
+ * hash function.
56
+ *
57
+ * - `br_xxx_ID`
58
+ *
59
+ * A macro that evaluates to a symbolic identifier for the hash
60
+ * function. Such identifiers are used with HMAC and signature
61
+ * algorithm implementations.
62
+ *
63
+ * NOTE: for the "standard" hash functions defined in [the TLS
64
+ * standard](https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1),
65
+ * the symbolic identifiers match the constants used in TLS, i.e.
66
+ * 1 to 6 for MD5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512,
67
+ * respectively.
68
+ *
69
+ * - `br_xxx_context`
70
+ *
71
+ * Context for an ongoing computation. It is allocated by the
72
+ * caller, and a pointer to it is passed to all functions. A
73
+ * context contains no interior pointer, so it can be moved around
74
+ * and cloned (with a simple `memcpy()` or equivalent) in order to
75
+ * capture the function state at some point. Computations that use
76
+ * distinct context structures are independent of each other. The
77
+ * first field of `br_xxx_context` is always a pointer to the
78
+ * `br_xxx_vtable` structure; `br_xxx_init()` sets that pointer.
79
+ *
80
+ * - `br_xxx_init(br_xxx_context *ctx)`
81
+ *
82
+ * Initialise the provided context. Previous contents of the structure
83
+ * are ignored. This calls resets the context to the start of a new
84
+ * hash computation; it also sets the first field of the context
85
+ * structure (called `vtable`) to a pointer to the statically
86
+ * allocated constant `br_xxx_vtable` structure.
87
+ *
88
+ * - `br_xxx_update(br_xxx_context *ctx, const void *data, size_t len)`
89
+ *
90
+ * Add some more bytes to the hash computation represented by the
91
+ * provided context.
92
+ *
93
+ * - `br_xxx_out(const br_xxx_context *ctx, void *out)`
94
+ *
95
+ * Complete the hash computation and write the result in the provided
96
+ * buffer. The output buffer MUST be large enough to accommodate the
97
+ * result. The context is NOT modified by this operation, so this
98
+ * function can be used to get a "partial hash" while still keeping
99
+ * the possibility of adding more bytes to the input.
100
+ *
101
+ * - `br_xxx_state(const br_xxx_context *ctx, void *out)`
102
+ *
103
+ * Get a copy of the "current state" for the computation so far. For
104
+ * MD functions (MD5, SHA-1, SHA-2 family), this is the running state
105
+ * resulting from the processing of the last complete input block.
106
+ * Returned value is the current input length (in bytes).
107
+ *
108
+ * - `br_xxx_set_state(br_xxx_context *ctx, const void *stb, uint64_t count)`
109
+ *
110
+ * Set the internal state to the provided values. The 'stb' and
111
+ * 'count' values shall match that which was obtained from
112
+ * `br_xxx_state()`. This restores the hash state only if the state
113
+ * values were at an appropriate block boundary. This does NOT set
114
+ * the `vtable` pointer in the context.
115
+ *
116
+ * Context structures can be discarded without any explicit deallocation.
117
+ * Hash function implementations are purely software and don't reserve
118
+ * any resources outside of the context structure itself.
119
+ *
120
+ *
121
+ * ## Object-Oriented API
122
+ *
123
+ * For each hash function that follows the procedural API described
124
+ * above, an object-oriented API is also provided. In that API, function
125
+ * pointers from the vtable (`br_xxx_vtable`) are used. The vtable
126
+ * incarnates object-oriented programming. An introduction on the OOP
127
+ * concept used here can be read on the BearSSL Web site:<br />
128
+ * &nbsp;&nbsp;&nbsp;[https://www.bearssl.org/oop.html](https://www.bearssl.org/oop.html)
129
+ *
130
+ * The vtable offers functions called `init()`, `update()`, `out()`,
131
+ * `set()` and `set_state()`, which are in fact the functions from
132
+ * the procedural API. That vtable also contains two informative fields:
133
+ *
134
+ * - `context_size`
135
+ *
136
+ * The size of the context structure (`br_xxx_context`), in bytes.
137
+ * This can be used by generic implementations to perform dynamic
138
+ * context allocation.
139
+ *
140
+ * - `desc`
141
+ *
142
+ * A "descriptor" field that encodes some information on the hash
143
+ * function: symbolic identifier, output size, state size,
144
+ * internal block size, details on the padding.
145
+ *
146
+ * Users of this object-oriented API (in particular generic HMAC
147
+ * implementations) may make the following assumptions:
148
+ *
149
+ * - Hash output size is no more than 64 bytes.
150
+ * - Hash internal state size is no more than 64 bytes.
151
+ * - Internal block size is a power of two, no less than 16 and no more
152
+ * than 256.
153
+ *
154
+ *
155
+ * ## Implemented Hash Functions
156
+ *
157
+ * Implemented hash functions are:
158
+ *
159
+ * | Function | Name | Output length | State length |
160
+ * | :-------- | :------ | :-----------: | :----------: |
161
+ * | MD5 | md5 | 16 | 16 |
162
+ * | SHA-1 | sha1 | 20 | 20 |
163
+ * | SHA-224 | sha224 | 28 | 32 |
164
+ * | SHA-256 | sha256 | 32 | 32 |
165
+ * | SHA-384 | sha384 | 48 | 64 |
166
+ * | SHA-512 | sha512 | 64 | 64 |
167
+ * | MD5+SHA-1 | md5sha1 | 36 | 36 |
168
+ *
169
+ * (MD5+SHA-1 is the concatenation of MD5 and SHA-1 computed over the
170
+ * same input; in the implementation, the internal data buffer is
171
+ * shared, thus making it more memory-efficient than separate MD5 and
172
+ * SHA-1. It can be useful in implementing SSL 3.0, TLS 1.0 and TLS
173
+ * 1.1.)
174
+ *
175
+ *
176
+ * ## Multi-Hasher
177
+ *
178
+ * An aggregate hasher is provided, that can compute several standard
179
+ * hash functions in parallel. It uses `br_multihash_context` and a
180
+ * procedural API. It is configured with the implementations (the vtables)
181
+ * that it should use; it will then compute all these hash functions in
182
+ * parallel, on the same input. It is meant to be used in cases when the
183
+ * hash of an object will be used, but the exact hash function is not
184
+ * known yet (typically, streamed processing on X.509 certificates).
185
+ *
186
+ * Only the standard hash functions (MD5, SHA-1, SHA-224, SHA-256, SHA-384
187
+ * and SHA-512) are supported by the multi-hasher.
188
+ *
189
+ *
190
+ * ## GHASH
191
+ *
192
+ * GHASH is not a generic hash function; it is a _universal_ hash function,
193
+ * which, as the name does not say, means that it CANNOT be used in most
194
+ * places where a hash function is needed. GHASH is used within the GCM
195
+ * encryption mode, to provide the checked integrity functionality.
196
+ *
197
+ * A GHASH implementation is basically a function that uses the type defined
198
+ * in this file under the name `br_ghash`:
199
+ *
200
+ * typedef void (*br_ghash)(void *y, const void *h, const void *data, size_t len);
201
+ *
202
+ * The `y` pointer refers to a 16-byte value which is used as input, and
203
+ * receives the output of the GHASH invocation. `h` is a 16-byte secret
204
+ * value (that serves as key). `data` and `len` define the input data.
205
+ *
206
+ * Three GHASH implementations are provided, all constant-time, based on
207
+ * the use of integer multiplications with appropriate masking to cancel
208
+ * carry propagation.
209
+ */
210
+
211
+ /**
212
+ * \brief Class type for hash function implementations.
213
+ *
214
+ * A `br_hash_class` instance references the methods implementing a hash
215
+ * function. Constant instances of this structure are defined for each
216
+ * implemented hash function. Such instances are also called "vtables".
217
+ *
218
+ * Vtables are used to support object-oriented programming, as
219
+ * described on [the BearSSL Web site](https://www.bearssl.org/oop.html).
220
+ */
221
+ typedef struct br_hash_class_ br_hash_class;
222
+ struct br_hash_class_ {
223
+ /**
224
+ * \brief Size (in bytes) of the context structure appropriate for
225
+ * computing this hash function.
226
+ */
227
+ size_t context_size;
228
+
229
+ /**
230
+ * \brief Descriptor word that contains information about the hash
231
+ * function.
232
+ *
233
+ * For each word `xxx` described below, use `BR_HASHDESC_xxx_OFF`
234
+ * and `BR_HASHDESC_xxx_MASK` to access the specific value, as
235
+ * follows:
236
+ *
237
+ * (hf->desc >> BR_HASHDESC_xxx_OFF) & BR_HASHDESC_xxx_MASK
238
+ *
239
+ * The defined elements are:
240
+ *
241
+ * - `ID`: the symbolic identifier for the function, as defined
242
+ * in [TLS](https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1)
243
+ * (MD5 = 1, SHA-1 = 2,...).
244
+ *
245
+ * - `OUT`: hash output size, in bytes.
246
+ *
247
+ * - `STATE`: internal running state size, in bytes.
248
+ *
249
+ * - `LBLEN`: base-2 logarithm for the internal block size, as
250
+ * defined for HMAC processing (this is 6 for MD5, SHA-1, SHA-224
251
+ * and SHA-256, since these functions use 64-byte blocks; for
252
+ * SHA-384 and SHA-512, this is 7, corresponding to their
253
+ * 128-byte blocks).
254
+ *
255
+ * The descriptor may contain a few other flags.
256
+ */
257
+ uint32_t desc;
258
+
259
+ /**
260
+ * \brief Initialisation method.
261
+ *
262
+ * This method takes as parameter a pointer to a context area,
263
+ * that it initialises. The first field of the context is set
264
+ * to this vtable; other elements are initialised for a new hash
265
+ * computation.
266
+ *
267
+ * \param ctx pointer to (the first field of) the context.
268
+ */
269
+ void (*init)(const br_hash_class **ctx);
270
+
271
+ /**
272
+ * \brief Data injection method.
273
+ *
274
+ * The `len` bytes starting at address `data` are injected into
275
+ * the running hash computation incarnated by the specified
276
+ * context. The context is updated accordingly. It is allowed
277
+ * to have `len == 0`, in which case `data` is ignored (and could
278
+ * be `NULL`), and nothing happens.
279
+ * on the input data.
280
+ *
281
+ * \param ctx pointer to (the first field of) the context.
282
+ * \param data pointer to the first data byte to inject.
283
+ * \param len number of bytes to inject.
284
+ */
285
+ void (*update)(const br_hash_class **ctx, const void *data, size_t len);
286
+
287
+ /**
288
+ * \brief Produce hash output.
289
+ *
290
+ * The hash output corresponding to all data bytes injected in the
291
+ * context since the last `init()` call is computed, and written
292
+ * in the buffer pointed to by `dst`. The hash output size depends
293
+ * on the implemented hash function (e.g. 16 bytes for MD5).
294
+ * The context is _not_ modified by this call, so further bytes
295
+ * may be afterwards injected to continue the current computation.
296
+ *
297
+ * \param ctx pointer to (the first field of) the context.
298
+ * \param dst destination buffer for the hash output.
299
+ */
300
+ void (*out)(const br_hash_class *const *ctx, void *dst);
301
+
302
+ /**
303
+ * \brief Get running state.
304
+ *
305
+ * This method saves the current running state into the `dst`
306
+ * buffer. What constitutes the "running state" depends on the
307
+ * hash function; for Merkle-Damgård hash functions (like
308
+ * MD5 or SHA-1), this is the output obtained after processing
309
+ * each block. The number of bytes injected so far is returned.
310
+ * The context is not modified by this call.
311
+ *
312
+ * \param ctx pointer to (the first field of) the context.
313
+ * \param dst destination buffer for the state.
314
+ * \return the injected total byte length.
315
+ */
316
+ uint64_t (*state)(const br_hash_class *const *ctx, void *dst);
317
+
318
+ /**
319
+ * \brief Set running state.
320
+ *
321
+ * This methods replaces the running state for the function.
322
+ *
323
+ * \param ctx pointer to (the first field of) the context.
324
+ * \param stb source buffer for the state.
325
+ * \param count injected total byte length.
326
+ */
327
+ void (*set_state)(const br_hash_class **ctx,
328
+ const void *stb, uint64_t count);
329
+ };
330
+
331
+ #ifndef BR_DOXYGEN_IGNORE
332
+ #define BR_HASHDESC_ID(id) ((uint32_t)(id) << BR_HASHDESC_ID_OFF)
333
+ #define BR_HASHDESC_ID_OFF 0
334
+ #define BR_HASHDESC_ID_MASK 0xFF
335
+
336
+ #define BR_HASHDESC_OUT(size) ((uint32_t)(size) << BR_HASHDESC_OUT_OFF)
337
+ #define BR_HASHDESC_OUT_OFF 8
338
+ #define BR_HASHDESC_OUT_MASK 0x7F
339
+
340
+ #define BR_HASHDESC_STATE(size) ((uint32_t)(size) << BR_HASHDESC_STATE_OFF)
341
+ #define BR_HASHDESC_STATE_OFF 15
342
+ #define BR_HASHDESC_STATE_MASK 0xFF
343
+
344
+ #define BR_HASHDESC_LBLEN(ls) ((uint32_t)(ls) << BR_HASHDESC_LBLEN_OFF)
345
+ #define BR_HASHDESC_LBLEN_OFF 23
346
+ #define BR_HASHDESC_LBLEN_MASK 0x0F
347
+
348
+ #define BR_HASHDESC_MD_PADDING ((uint32_t)1 << 28)
349
+ #define BR_HASHDESC_MD_PADDING_128 ((uint32_t)1 << 29)
350
+ #define BR_HASHDESC_MD_PADDING_BE ((uint32_t)1 << 30)
351
+ #endif
352
+
353
+ /*
354
+ * Specific hash functions.
355
+ *
356
+ * Rules for contexts:
357
+ * -- No interior pointer.
358
+ * -- No pointer to external dynamically allocated resources.
359
+ * -- First field is called 'vtable' and is a pointer to a
360
+ * const-qualified br_hash_class instance (pointer is set by init()).
361
+ * -- SHA-224 and SHA-256 contexts are identical.
362
+ * -- SHA-384 and SHA-512 contexts are identical.
363
+ *
364
+ * Thus, contexts can be moved and cloned to capture the hash function
365
+ * current state; and there is no need for any explicit "release" function.
366
+ */
367
+
368
+ /**
369
+ * \brief Symbolic identifier for MD5.
370
+ */
371
+ #define br_md5_ID 1
372
+
373
+ /**
374
+ * \brief MD5 output size (in bytes).
375
+ */
376
+ #define br_md5_SIZE 16
377
+
378
+ /**
379
+ * \brief Constant vtable for MD5.
380
+ */
381
+ extern const br_hash_class br_md5_vtable;
382
+
383
+ /**
384
+ * \brief MD5 context.
385
+ *
386
+ * First field is a pointer to the vtable; it is set by the initialisation
387
+ * function. Other fields are not supposed to be accessed by user code.
388
+ */
389
+ typedef struct {
390
+ /**
391
+ * \brief Pointer to vtable for this context.
392
+ */
393
+ const br_hash_class *vtable;
394
+ #ifndef BR_DOXYGEN_IGNORE
395
+ unsigned char buf[64];
396
+ uint64_t count;
397
+ uint32_t val[4];
398
+ #endif
399
+ } br_md5_context;
400
+
401
+ /**
402
+ * \brief MD5 context initialisation.
403
+ *
404
+ * This function initialises or resets a context for a new MD5
405
+ * computation. It also sets the vtable pointer.
406
+ *
407
+ * \param ctx pointer to the context structure.
408
+ */
409
+ void br_md5_init(br_md5_context *ctx);
410
+
411
+ /**
412
+ * \brief Inject some data bytes in a running MD5 computation.
413
+ *
414
+ * The provided context is updated with some data bytes. If the number
415
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
416
+ * and may be `NULL`, and this function does nothing.
417
+ *
418
+ * \param ctx pointer to the context structure.
419
+ * \param data pointer to the injected data.
420
+ * \param len injected data length (in bytes).
421
+ */
422
+ void br_md5_update(br_md5_context *ctx, const void *data, size_t len);
423
+
424
+ /**
425
+ * \brief Compute MD5 output.
426
+ *
427
+ * The MD5 output for the concatenation of all bytes injected in the
428
+ * provided context since the last initialisation or reset call, is
429
+ * computed and written in the buffer pointed to by `out`. The context
430
+ * itself is not modified, so extra bytes may be injected afterwards
431
+ * to continue that computation.
432
+ *
433
+ * \param ctx pointer to the context structure.
434
+ * \param out destination buffer for the hash output.
435
+ */
436
+ void br_md5_out(const br_md5_context *ctx, void *out);
437
+
438
+ /**
439
+ * \brief Save MD5 running state.
440
+ *
441
+ * The running state for MD5 (output of the last internal block
442
+ * processing) is written in the buffer pointed to by `out`. The
443
+ * number of bytes injected since the last initialisation or reset
444
+ * call is returned. The context is not modified.
445
+ *
446
+ * \param ctx pointer to the context structure.
447
+ * \param out destination buffer for the running state.
448
+ * \return the injected total byte length.
449
+ */
450
+ uint64_t br_md5_state(const br_md5_context *ctx, void *out);
451
+
452
+ /**
453
+ * \brief Restore MD5 running state.
454
+ *
455
+ * The running state for MD5 is set to the provided values.
456
+ *
457
+ * \param ctx pointer to the context structure.
458
+ * \param stb source buffer for the running state.
459
+ * \param count the injected total byte length.
460
+ */
461
+ void br_md5_set_state(br_md5_context *ctx, const void *stb, uint64_t count);
462
+
463
+ /**
464
+ * \brief Symbolic identifier for SHA-1.
465
+ */
466
+ #define br_sha1_ID 2
467
+
468
+ /**
469
+ * \brief SHA-1 output size (in bytes).
470
+ */
471
+ #define br_sha1_SIZE 20
472
+
473
+ /**
474
+ * \brief Constant vtable for SHA-1.
475
+ */
476
+ extern const br_hash_class br_sha1_vtable;
477
+
478
+ /**
479
+ * \brief SHA-1 context.
480
+ *
481
+ * First field is a pointer to the vtable; it is set by the initialisation
482
+ * function. Other fields are not supposed to be accessed by user code.
483
+ */
484
+ typedef struct {
485
+ /**
486
+ * \brief Pointer to vtable for this context.
487
+ */
488
+ const br_hash_class *vtable;
489
+ #ifndef BR_DOXYGEN_IGNORE
490
+ unsigned char buf[64];
491
+ uint64_t count;
492
+ uint32_t val[5];
493
+ #endif
494
+ } br_sha1_context;
495
+
496
+ /**
497
+ * \brief SHA-1 context initialisation.
498
+ *
499
+ * This function initialises or resets a context for a new SHA-1
500
+ * computation. It also sets the vtable pointer.
501
+ *
502
+ * \param ctx pointer to the context structure.
503
+ */
504
+ void br_sha1_init(br_sha1_context *ctx);
505
+
506
+ /**
507
+ * \brief Inject some data bytes in a running SHA-1 computation.
508
+ *
509
+ * The provided context is updated with some data bytes. If the number
510
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
511
+ * and may be `NULL`, and this function does nothing.
512
+ *
513
+ * \param ctx pointer to the context structure.
514
+ * \param data pointer to the injected data.
515
+ * \param len injected data length (in bytes).
516
+ */
517
+ void br_sha1_update(br_sha1_context *ctx, const void *data, size_t len);
518
+
519
+ /**
520
+ * \brief Compute SHA-1 output.
521
+ *
522
+ * The SHA-1 output for the concatenation of all bytes injected in the
523
+ * provided context since the last initialisation or reset call, is
524
+ * computed and written in the buffer pointed to by `out`. The context
525
+ * itself is not modified, so extra bytes may be injected afterwards
526
+ * to continue that computation.
527
+ *
528
+ * \param ctx pointer to the context structure.
529
+ * \param out destination buffer for the hash output.
530
+ */
531
+ void br_sha1_out(const br_sha1_context *ctx, void *out);
532
+
533
+ /**
534
+ * \brief Save SHA-1 running state.
535
+ *
536
+ * The running state for SHA-1 (output of the last internal block
537
+ * processing) is written in the buffer pointed to by `out`. The
538
+ * number of bytes injected since the last initialisation or reset
539
+ * call is returned. The context is not modified.
540
+ *
541
+ * \param ctx pointer to the context structure.
542
+ * \param out destination buffer for the running state.
543
+ * \return the injected total byte length.
544
+ */
545
+ uint64_t br_sha1_state(const br_sha1_context *ctx, void *out);
546
+
547
+ /**
548
+ * \brief Restore SHA-1 running state.
549
+ *
550
+ * The running state for SHA-1 is set to the provided values.
551
+ *
552
+ * \param ctx pointer to the context structure.
553
+ * \param stb source buffer for the running state.
554
+ * \param count the injected total byte length.
555
+ */
556
+ void br_sha1_set_state(br_sha1_context *ctx, const void *stb, uint64_t count);
557
+
558
+ /**
559
+ * \brief Symbolic identifier for SHA-224.
560
+ */
561
+ #define br_sha224_ID 3
562
+
563
+ /**
564
+ * \brief SHA-224 output size (in bytes).
565
+ */
566
+ #define br_sha224_SIZE 28
567
+
568
+ /**
569
+ * \brief Constant vtable for SHA-224.
570
+ */
571
+ extern const br_hash_class br_sha224_vtable;
572
+
573
+ /**
574
+ * \brief SHA-224 context.
575
+ *
576
+ * First field is a pointer to the vtable; it is set by the initialisation
577
+ * function. Other fields are not supposed to be accessed by user code.
578
+ */
579
+ typedef struct {
580
+ /**
581
+ * \brief Pointer to vtable for this context.
582
+ */
583
+ const br_hash_class *vtable;
584
+ #ifndef BR_DOXYGEN_IGNORE
585
+ unsigned char buf[64];
586
+ uint64_t count;
587
+ uint32_t val[8];
588
+ #endif
589
+ } br_sha224_context;
590
+
591
+ /**
592
+ * \brief SHA-224 context initialisation.
593
+ *
594
+ * This function initialises or resets a context for a new SHA-224
595
+ * computation. It also sets the vtable pointer.
596
+ *
597
+ * \param ctx pointer to the context structure.
598
+ */
599
+ void br_sha224_init(br_sha224_context *ctx);
600
+
601
+ /**
602
+ * \brief Inject some data bytes in a running SHA-224 computation.
603
+ *
604
+ * The provided context is updated with some data bytes. If the number
605
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
606
+ * and may be `NULL`, and this function does nothing.
607
+ *
608
+ * \param ctx pointer to the context structure.
609
+ * \param data pointer to the injected data.
610
+ * \param len injected data length (in bytes).
611
+ */
612
+ void br_sha224_update(br_sha224_context *ctx, const void *data, size_t len);
613
+
614
+ /**
615
+ * \brief Compute SHA-224 output.
616
+ *
617
+ * The SHA-224 output for the concatenation of all bytes injected in the
618
+ * provided context since the last initialisation or reset call, is
619
+ * computed and written in the buffer pointed to by `out`. The context
620
+ * itself is not modified, so extra bytes may be injected afterwards
621
+ * to continue that computation.
622
+ *
623
+ * \param ctx pointer to the context structure.
624
+ * \param out destination buffer for the hash output.
625
+ */
626
+ void br_sha224_out(const br_sha224_context *ctx, void *out);
627
+
628
+ /**
629
+ * \brief Save SHA-224 running state.
630
+ *
631
+ * The running state for SHA-224 (output of the last internal block
632
+ * processing) is written in the buffer pointed to by `out`. The
633
+ * number of bytes injected since the last initialisation or reset
634
+ * call is returned. The context is not modified.
635
+ *
636
+ * \param ctx pointer to the context structure.
637
+ * \param out destination buffer for the running state.
638
+ * \return the injected total byte length.
639
+ */
640
+ uint64_t br_sha224_state(const br_sha224_context *ctx, void *out);
641
+
642
+ /**
643
+ * \brief Restore SHA-224 running state.
644
+ *
645
+ * The running state for SHA-224 is set to the provided values.
646
+ *
647
+ * \param ctx pointer to the context structure.
648
+ * \param stb source buffer for the running state.
649
+ * \param count the injected total byte length.
650
+ */
651
+ void br_sha224_set_state(br_sha224_context *ctx,
652
+ const void *stb, uint64_t count);
653
+
654
+ /**
655
+ * \brief Symbolic identifier for SHA-256.
656
+ */
657
+ #define br_sha256_ID 4
658
+
659
+ /**
660
+ * \brief SHA-256 output size (in bytes).
661
+ */
662
+ #define br_sha256_SIZE 32
663
+
664
+ /**
665
+ * \brief Constant vtable for SHA-256.
666
+ */
667
+ extern const br_hash_class br_sha256_vtable;
668
+
669
+ #ifdef BR_DOXYGEN_IGNORE
670
+ /**
671
+ * \brief SHA-256 context.
672
+ *
673
+ * First field is a pointer to the vtable; it is set by the initialisation
674
+ * function. Other fields are not supposed to be accessed by user code.
675
+ */
676
+ typedef struct {
677
+ /**
678
+ * \brief Pointer to vtable for this context.
679
+ */
680
+ const br_hash_class *vtable;
681
+ } br_sha256_context;
682
+ #else
683
+ typedef br_sha224_context br_sha256_context;
684
+ #endif
685
+
686
+ /**
687
+ * \brief SHA-256 context initialisation.
688
+ *
689
+ * This function initialises or resets a context for a new SHA-256
690
+ * computation. It also sets the vtable pointer.
691
+ *
692
+ * \param ctx pointer to the context structure.
693
+ */
694
+ void br_sha256_init(br_sha256_context *ctx);
695
+
696
+ #ifdef BR_DOXYGEN_IGNORE
697
+ /**
698
+ * \brief Inject some data bytes in a running SHA-256 computation.
699
+ *
700
+ * The provided context is updated with some data bytes. If the number
701
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
702
+ * and may be `NULL`, and this function does nothing.
703
+ *
704
+ * \param ctx pointer to the context structure.
705
+ * \param data pointer to the injected data.
706
+ * \param len injected data length (in bytes).
707
+ */
708
+ void br_sha256_update(br_sha256_context *ctx, const void *data, size_t len);
709
+ #else
710
+ #define br_sha256_update br_sha224_update
711
+ #endif
712
+
713
+ /**
714
+ * \brief Compute SHA-256 output.
715
+ *
716
+ * The SHA-256 output for the concatenation of all bytes injected in the
717
+ * provided context since the last initialisation or reset call, is
718
+ * computed and written in the buffer pointed to by `out`. The context
719
+ * itself is not modified, so extra bytes may be injected afterwards
720
+ * to continue that computation.
721
+ *
722
+ * \param ctx pointer to the context structure.
723
+ * \param out destination buffer for the hash output.
724
+ */
725
+ void br_sha256_out(const br_sha256_context *ctx, void *out);
726
+
727
+ #if BR_DOXYGEN_IGNORE
728
+ /**
729
+ * \brief Save SHA-256 running state.
730
+ *
731
+ * The running state for SHA-256 (output of the last internal block
732
+ * processing) is written in the buffer pointed to by `out`. The
733
+ * number of bytes injected since the last initialisation or reset
734
+ * call is returned. The context is not modified.
735
+ *
736
+ * \param ctx pointer to the context structure.
737
+ * \param out destination buffer for the running state.
738
+ * \return the injected total byte length.
739
+ */
740
+ uint64_t br_sha256_state(const br_sha256_context *ctx, void *out);
741
+ #else
742
+ #define br_sha256_state br_sha224_state
743
+ #endif
744
+
745
+ #if BR_DOXYGEN_IGNORE
746
+ /**
747
+ * \brief Restore SHA-256 running state.
748
+ *
749
+ * The running state for SHA-256 is set to the provided values.
750
+ *
751
+ * \param ctx pointer to the context structure.
752
+ * \param stb source buffer for the running state.
753
+ * \param count the injected total byte length.
754
+ */
755
+ void br_sha256_set_state(br_sha256_context *ctx,
756
+ const void *stb, uint64_t count);
757
+ #else
758
+ #define br_sha256_set_state br_sha224_set_state
759
+ #endif
760
+
761
+ /**
762
+ * \brief Symbolic identifier for SHA-384.
763
+ */
764
+ #define br_sha384_ID 5
765
+
766
+ /**
767
+ * \brief SHA-384 output size (in bytes).
768
+ */
769
+ #define br_sha384_SIZE 48
770
+
771
+ /**
772
+ * \brief Constant vtable for SHA-384.
773
+ */
774
+ extern const br_hash_class br_sha384_vtable;
775
+
776
+ /**
777
+ * \brief SHA-384 context.
778
+ *
779
+ * First field is a pointer to the vtable; it is set by the initialisation
780
+ * function. Other fields are not supposed to be accessed by user code.
781
+ */
782
+ typedef struct {
783
+ /**
784
+ * \brief Pointer to vtable for this context.
785
+ */
786
+ const br_hash_class *vtable;
787
+ #ifndef BR_DOXYGEN_IGNORE
788
+ unsigned char buf[128];
789
+ uint64_t count;
790
+ uint64_t val[8];
791
+ #endif
792
+ } br_sha384_context;
793
+
794
+ /**
795
+ * \brief SHA-384 context initialisation.
796
+ *
797
+ * This function initialises or resets a context for a new SHA-384
798
+ * computation. It also sets the vtable pointer.
799
+ *
800
+ * \param ctx pointer to the context structure.
801
+ */
802
+ void br_sha384_init(br_sha384_context *ctx);
803
+
804
+ /**
805
+ * \brief Inject some data bytes in a running SHA-384 computation.
806
+ *
807
+ * The provided context is updated with some data bytes. If the number
808
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
809
+ * and may be `NULL`, and this function does nothing.
810
+ *
811
+ * \param ctx pointer to the context structure.
812
+ * \param data pointer to the injected data.
813
+ * \param len injected data length (in bytes).
814
+ */
815
+ void br_sha384_update(br_sha384_context *ctx, const void *data, size_t len);
816
+
817
+ /**
818
+ * \brief Compute SHA-384 output.
819
+ *
820
+ * The SHA-384 output for the concatenation of all bytes injected in the
821
+ * provided context since the last initialisation or reset call, is
822
+ * computed and written in the buffer pointed to by `out`. The context
823
+ * itself is not modified, so extra bytes may be injected afterwards
824
+ * to continue that computation.
825
+ *
826
+ * \param ctx pointer to the context structure.
827
+ * \param out destination buffer for the hash output.
828
+ */
829
+ void br_sha384_out(const br_sha384_context *ctx, void *out);
830
+
831
+ /**
832
+ * \brief Save SHA-384 running state.
833
+ *
834
+ * The running state for SHA-384 (output of the last internal block
835
+ * processing) is written in the buffer pointed to by `out`. The
836
+ * number of bytes injected since the last initialisation or reset
837
+ * call is returned. The context is not modified.
838
+ *
839
+ * \param ctx pointer to the context structure.
840
+ * \param out destination buffer for the running state.
841
+ * \return the injected total byte length.
842
+ */
843
+ uint64_t br_sha384_state(const br_sha384_context *ctx, void *out);
844
+
845
+ /**
846
+ * \brief Restore SHA-384 running state.
847
+ *
848
+ * The running state for SHA-384 is set to the provided values.
849
+ *
850
+ * \param ctx pointer to the context structure.
851
+ * \param stb source buffer for the running state.
852
+ * \param count the injected total byte length.
853
+ */
854
+ void br_sha384_set_state(br_sha384_context *ctx,
855
+ const void *stb, uint64_t count);
856
+
857
+ /**
858
+ * \brief Symbolic identifier for SHA-512.
859
+ */
860
+ #define br_sha512_ID 6
861
+
862
+ /**
863
+ * \brief SHA-512 output size (in bytes).
864
+ */
865
+ #define br_sha512_SIZE 64
866
+
867
+ /**
868
+ * \brief Constant vtable for SHA-512.
869
+ */
870
+ extern const br_hash_class br_sha512_vtable;
871
+
872
+ #ifdef BR_DOXYGEN_IGNORE
873
+ /**
874
+ * \brief SHA-512 context.
875
+ *
876
+ * First field is a pointer to the vtable; it is set by the initialisation
877
+ * function. Other fields are not supposed to be accessed by user code.
878
+ */
879
+ typedef struct {
880
+ /**
881
+ * \brief Pointer to vtable for this context.
882
+ */
883
+ const br_hash_class *vtable;
884
+ } br_sha512_context;
885
+ #else
886
+ typedef br_sha384_context br_sha512_context;
887
+ #endif
888
+
889
+ /**
890
+ * \brief SHA-512 context initialisation.
891
+ *
892
+ * This function initialises or resets a context for a new SHA-512
893
+ * computation. It also sets the vtable pointer.
894
+ *
895
+ * \param ctx pointer to the context structure.
896
+ */
897
+ void br_sha512_init(br_sha512_context *ctx);
898
+
899
+ #ifdef BR_DOXYGEN_IGNORE
900
+ /**
901
+ * \brief Inject some data bytes in a running SHA-512 computation.
902
+ *
903
+ * The provided context is updated with some data bytes. If the number
904
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
905
+ * and may be `NULL`, and this function does nothing.
906
+ *
907
+ * \param ctx pointer to the context structure.
908
+ * \param data pointer to the injected data.
909
+ * \param len injected data length (in bytes).
910
+ */
911
+ void br_sha512_update(br_sha512_context *ctx, const void *data, size_t len);
912
+ #else
913
+ #define br_sha512_update br_sha384_update
914
+ #endif
915
+
916
+ /**
917
+ * \brief Compute SHA-512 output.
918
+ *
919
+ * The SHA-512 output for the concatenation of all bytes injected in the
920
+ * provided context since the last initialisation or reset call, is
921
+ * computed and written in the buffer pointed to by `out`. The context
922
+ * itself is not modified, so extra bytes may be injected afterwards
923
+ * to continue that computation.
924
+ *
925
+ * \param ctx pointer to the context structure.
926
+ * \param out destination buffer for the hash output.
927
+ */
928
+ void br_sha512_out(const br_sha512_context *ctx, void *out);
929
+
930
+ #ifdef BR_DOXYGEN_IGNORE
931
+ /**
932
+ * \brief Save SHA-512 running state.
933
+ *
934
+ * The running state for SHA-512 (output of the last internal block
935
+ * processing) is written in the buffer pointed to by `out`. The
936
+ * number of bytes injected since the last initialisation or reset
937
+ * call is returned. The context is not modified.
938
+ *
939
+ * \param ctx pointer to the context structure.
940
+ * \param out destination buffer for the running state.
941
+ * \return the injected total byte length.
942
+ */
943
+ uint64_t br_sha512_state(const br_sha512_context *ctx, void *out);
944
+ #else
945
+ #define br_sha512_state br_sha384_state
946
+ #endif
947
+
948
+ #ifdef BR_DOXYGEN_IGNORE
949
+ /**
950
+ * \brief Restore SHA-512 running state.
951
+ *
952
+ * The running state for SHA-512 is set to the provided values.
953
+ *
954
+ * \param ctx pointer to the context structure.
955
+ * \param stb source buffer for the running state.
956
+ * \param count the injected total byte length.
957
+ */
958
+ void br_sha512_set_state(br_sha512_context *ctx,
959
+ const void *stb, uint64_t count);
960
+ #else
961
+ #define br_sha512_set_state br_sha384_set_state
962
+ #endif
963
+
964
+ /*
965
+ * "md5sha1" is a special hash function that computes both MD5 and SHA-1
966
+ * on the same input, and produces a 36-byte output (MD5 and SHA-1
967
+ * concatenation, in that order). State size is also 36 bytes.
968
+ */
969
+
970
+ /**
971
+ * \brief Symbolic identifier for MD5+SHA-1.
972
+ *
973
+ * MD5+SHA-1 is the concatenation of MD5 and SHA-1, computed over the
974
+ * same input. It is not one of the functions identified in TLS, so
975
+ * we give it a symbolic identifier of value 0.
976
+ */
977
+ #define br_md5sha1_ID 0
978
+
979
+ /**
980
+ * \brief MD5+SHA-1 output size (in bytes).
981
+ */
982
+ #define br_md5sha1_SIZE 36
983
+
984
+ /**
985
+ * \brief Constant vtable for MD5+SHA-1.
986
+ */
987
+ extern const br_hash_class br_md5sha1_vtable;
988
+
989
+ /**
990
+ * \brief MD5+SHA-1 context.
991
+ *
992
+ * First field is a pointer to the vtable; it is set by the initialisation
993
+ * function. Other fields are not supposed to be accessed by user code.
994
+ */
995
+ typedef struct {
996
+ /**
997
+ * \brief Pointer to vtable for this context.
998
+ */
999
+ const br_hash_class *vtable;
1000
+ #ifndef BR_DOXYGEN_IGNORE
1001
+ unsigned char buf[64];
1002
+ uint64_t count;
1003
+ uint32_t val_md5[4];
1004
+ uint32_t val_sha1[5];
1005
+ #endif
1006
+ } br_md5sha1_context;
1007
+
1008
+ /**
1009
+ * \brief MD5+SHA-1 context initialisation.
1010
+ *
1011
+ * This function initialises or resets a context for a new SHA-512
1012
+ * computation. It also sets the vtable pointer.
1013
+ *
1014
+ * \param ctx pointer to the context structure.
1015
+ */
1016
+ void br_md5sha1_init(br_md5sha1_context *ctx);
1017
+
1018
+ /**
1019
+ * \brief Inject some data bytes in a running MD5+SHA-1 computation.
1020
+ *
1021
+ * The provided context is updated with some data bytes. If the number
1022
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
1023
+ * and may be `NULL`, and this function does nothing.
1024
+ *
1025
+ * \param ctx pointer to the context structure.
1026
+ * \param data pointer to the injected data.
1027
+ * \param len injected data length (in bytes).
1028
+ */
1029
+ void br_md5sha1_update(br_md5sha1_context *ctx, const void *data, size_t len);
1030
+
1031
+ /**
1032
+ * \brief Compute MD5+SHA-1 output.
1033
+ *
1034
+ * The MD5+SHA-1 output for the concatenation of all bytes injected in the
1035
+ * provided context since the last initialisation or reset call, is
1036
+ * computed and written in the buffer pointed to by `out`. The context
1037
+ * itself is not modified, so extra bytes may be injected afterwards
1038
+ * to continue that computation.
1039
+ *
1040
+ * \param ctx pointer to the context structure.
1041
+ * \param out destination buffer for the hash output.
1042
+ */
1043
+ void br_md5sha1_out(const br_md5sha1_context *ctx, void *out);
1044
+
1045
+ /**
1046
+ * \brief Save MD5+SHA-1 running state.
1047
+ *
1048
+ * The running state for MD5+SHA-1 (output of the last internal block
1049
+ * processing) is written in the buffer pointed to by `out`. The
1050
+ * number of bytes injected since the last initialisation or reset
1051
+ * call is returned. The context is not modified.
1052
+ *
1053
+ * \param ctx pointer to the context structure.
1054
+ * \param out destination buffer for the running state.
1055
+ * \return the injected total byte length.
1056
+ */
1057
+ uint64_t br_md5sha1_state(const br_md5sha1_context *ctx, void *out);
1058
+
1059
+ /**
1060
+ * \brief Restore MD5+SHA-1 running state.
1061
+ *
1062
+ * The running state for MD5+SHA-1 is set to the provided values.
1063
+ *
1064
+ * \param ctx pointer to the context structure.
1065
+ * \param stb source buffer for the running state.
1066
+ * \param count the injected total byte length.
1067
+ */
1068
+ void br_md5sha1_set_state(br_md5sha1_context *ctx,
1069
+ const void *stb, uint64_t count);
1070
+
1071
+ /**
1072
+ * \brief Aggregate context for configurable hash function support.
1073
+ *
1074
+ * The `br_hash_compat_context` type is a type which is large enough to
1075
+ * serve as context for all standard hash functions defined above.
1076
+ */
1077
+ typedef union {
1078
+ const br_hash_class *vtable;
1079
+ br_md5_context md5;
1080
+ br_sha1_context sha1;
1081
+ br_sha224_context sha224;
1082
+ br_sha256_context sha256;
1083
+ br_sha384_context sha384;
1084
+ br_sha512_context sha512;
1085
+ br_md5sha1_context md5sha1;
1086
+ } br_hash_compat_context;
1087
+
1088
+ /*
1089
+ * The multi-hasher is a construct that handles hashing of the same input
1090
+ * data with several hash functions, with a single shared input buffer.
1091
+ * It can handle MD5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512
1092
+ * simultaneously, though which functions are activated depends on
1093
+ * the set implementation pointers.
1094
+ */
1095
+
1096
+ /**
1097
+ * \brief Multi-hasher context structure.
1098
+ *
1099
+ * The multi-hasher runs up to six hash functions in the standard TLS list
1100
+ * (MD5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512) in parallel, over
1101
+ * the same input.
1102
+ *
1103
+ * The multi-hasher does _not_ follow the OOP structure with a vtable.
1104
+ * Instead, it is configured with the vtables of the hash functions it
1105
+ * should run. Structure fields are not supposed to be accessed directly.
1106
+ */
1107
+ typedef struct {
1108
+ #ifndef BR_DOXYGEN_IGNORE
1109
+ unsigned char buf[128];
1110
+ uint64_t count;
1111
+ uint32_t val_32[25];
1112
+ uint64_t val_64[16];
1113
+ const br_hash_class *impl[6];
1114
+ #endif
1115
+ } br_multihash_context;
1116
+
1117
+ /**
1118
+ * \brief Clear a multi-hasher context.
1119
+ *
1120
+ * This should always be called once on a given context, _before_ setting
1121
+ * the implementation pointers.
1122
+ *
1123
+ * \param ctx the multi-hasher context.
1124
+ */
1125
+ void br_multihash_zero(br_multihash_context *ctx);
1126
+
1127
+ /**
1128
+ * \brief Set a hash function implementation.
1129
+ *
1130
+ * Implementations shall be set _after_ clearing the context (with
1131
+ * `br_multihash_zero()`) but _before_ initialising the computation
1132
+ * (with `br_multihash_init()`). The hash function implementation
1133
+ * MUST be one of the standard hash functions (MD5, SHA-1, SHA-224,
1134
+ * SHA-256, SHA-384 or SHA-512); it may also be `NULL` to remove
1135
+ * an implementation from the multi-hasher.
1136
+ *
1137
+ * \param ctx the multi-hasher context.
1138
+ * \param id the hash function symbolic identifier.
1139
+ * \param impl the hash function vtable, or `NULL`.
1140
+ */
1141
+ static inline void
1142
+ br_multihash_setimpl(br_multihash_context *ctx,
1143
+ int id, const br_hash_class *impl)
1144
+ {
1145
+ /*
1146
+ * This code relies on hash functions ID being values 1 to 6,
1147
+ * in the MD5 to SHA-512 order.
1148
+ */
1149
+ ctx->impl[id - 1] = impl;
1150
+ }
1151
+
1152
+ /**
1153
+ * \brief Get a hash function implementation.
1154
+ *
1155
+ * This function returns the currently configured vtable for a given
1156
+ * hash function (by symbolic ID). If no such function was configured in
1157
+ * the provided multi-hasher context, then this function returns `NULL`.
1158
+ *
1159
+ * \param ctx the multi-hasher context.
1160
+ * \param id the hash function symbolic identifier.
1161
+ * \return the hash function vtable, or `NULL`.
1162
+ */
1163
+ static inline const br_hash_class *
1164
+ br_multihash_getimpl(const br_multihash_context *ctx, int id)
1165
+ {
1166
+ return ctx->impl[id - 1];
1167
+ }
1168
+
1169
+ /**
1170
+ * \brief Reset a multi-hasher context.
1171
+ *
1172
+ * This function prepares the context for a new hashing computation,
1173
+ * for all implementations configured at that point.
1174
+ *
1175
+ * \param ctx the multi-hasher context.
1176
+ */
1177
+ void br_multihash_init(br_multihash_context *ctx);
1178
+
1179
+ /**
1180
+ * \brief Inject some data bytes in a running multi-hashing computation.
1181
+ *
1182
+ * The provided context is updated with some data bytes. If the number
1183
+ * of bytes (`len`) is zero, then the data pointer (`data`) is ignored
1184
+ * and may be `NULL`, and this function does nothing.
1185
+ *
1186
+ * \param ctx pointer to the context structure.
1187
+ * \param data pointer to the injected data.
1188
+ * \param len injected data length (in bytes).
1189
+ */
1190
+ void br_multihash_update(br_multihash_context *ctx,
1191
+ const void *data, size_t len);
1192
+
1193
+ /**
1194
+ * \brief Compute a hash output from a multi-hasher.
1195
+ *
1196
+ * The hash output for the concatenation of all bytes injected in the
1197
+ * provided context since the last initialisation or reset call, is
1198
+ * computed and written in the buffer pointed to by `dst`. The hash
1199
+ * function to use is identified by `id` and must be one of the standard
1200
+ * hash functions. If that hash function was indeed configured in the
1201
+ * multi-hasher context, the corresponding hash value is written in
1202
+ * `dst` and its length (in bytes) is returned. If the hash function
1203
+ * was _not_ configured, then nothing is written in `dst` and 0 is
1204
+ * returned.
1205
+ *
1206
+ * The context itself is not modified, so extra bytes may be injected
1207
+ * afterwards to continue the hash computations.
1208
+ *
1209
+ * \param ctx pointer to the context structure.
1210
+ * \param id the hash function symbolic identifier.
1211
+ * \param dst destination buffer for the hash output.
1212
+ * \return the hash output length (in bytes), or 0.
1213
+ */
1214
+ size_t br_multihash_out(const br_multihash_context *ctx, int id, void *dst);
1215
+
1216
+ /**
1217
+ * \brief Type for a GHASH implementation.
1218
+ *
1219
+ * GHASH is a sort of keyed hash meant to be used to implement GCM in
1220
+ * combination with a block cipher (with 16-byte blocks).
1221
+ *
1222
+ * The `y` array has length 16 bytes and is used for input and output; in
1223
+ * a complete GHASH run, it starts with an all-zero value. `h` is a 16-byte
1224
+ * value that serves as key (it is derived from the encryption key in GCM,
1225
+ * using the block cipher). The data length (`len`) is expressed in bytes.
1226
+ * The `y` array is updated.
1227
+ *
1228
+ * If the data length is not a multiple of 16, then the data is implicitly
1229
+ * padded with zeros up to the next multiple of 16. Thus, when using GHASH
1230
+ * in GCM, this method may be called twice, for the associated data and
1231
+ * for the ciphertext, respectively; the zero-padding implements exactly
1232
+ * the GCM rules.
1233
+ *
1234
+ * \param y the array to update.
1235
+ * \param h the GHASH key.
1236
+ * \param data the input data (may be `NULL` if `len` is zero).
1237
+ * \param len the input data length (in bytes).
1238
+ */
1239
+ typedef void (*br_ghash)(void *y, const void *h, const void *data, size_t len);
1240
+
1241
+ /**
1242
+ * \brief GHASH implementation using multiplications (mixed 32-bit).
1243
+ *
1244
+ * This implementation uses multiplications of 32-bit values, with a
1245
+ * 64-bit result. It is constant-time (if multiplications are
1246
+ * constant-time).
1247
+ *
1248
+ * \param y the array to update.
1249
+ * \param h the GHASH key.
1250
+ * \param data the input data (may be `NULL` if `len` is zero).
1251
+ * \param len the input data length (in bytes).
1252
+ */
1253
+ void br_ghash_ctmul(void *y, const void *h, const void *data, size_t len);
1254
+
1255
+ /**
1256
+ * \brief GHASH implementation using multiplications (strict 32-bit).
1257
+ *
1258
+ * This implementation uses multiplications of 32-bit values, with a
1259
+ * 32-bit result. It is usually somewhat slower than `br_ghash_ctmul()`,
1260
+ * but it is expected to be faster on architectures for which the
1261
+ * 32-bit multiplication opcode does not yield the upper 32 bits of the
1262
+ * product. It is constant-time (if multiplications are constant-time).
1263
+ *
1264
+ * \param y the array to update.
1265
+ * \param h the GHASH key.
1266
+ * \param data the input data (may be `NULL` if `len` is zero).
1267
+ * \param len the input data length (in bytes).
1268
+ */
1269
+ void br_ghash_ctmul32(void *y, const void *h, const void *data, size_t len);
1270
+
1271
+ /**
1272
+ * \brief GHASH implementation using multiplications (64-bit).
1273
+ *
1274
+ * This implementation uses multiplications of 64-bit values, with a
1275
+ * 64-bit result. It is constant-time (if multiplications are
1276
+ * constant-time). It is substantially faster than `br_ghash_ctmul()`
1277
+ * and `br_ghash_ctmul32()` on most 64-bit architectures.
1278
+ *
1279
+ * \param y the array to update.
1280
+ * \param h the GHASH key.
1281
+ * \param data the input data (may be `NULL` if `len` is zero).
1282
+ * \param len the input data length (in bytes).
1283
+ */
1284
+ void br_ghash_ctmul64(void *y, const void *h, const void *data, size_t len);
1285
+
1286
+ /**
1287
+ * \brief GHASH implementation using the `pclmulqdq` opcode (part of the
1288
+ * AES-NI instructions).
1289
+ *
1290
+ * This implementation is available only on x86 platforms where the
1291
+ * compiler supports the relevant intrinsic functions. Even if the
1292
+ * compiler supports these functions, the local CPU might not support
1293
+ * the `pclmulqdq` opcode, meaning that a call will fail with an
1294
+ * illegal instruction exception. To safely obtain a pointer to this
1295
+ * function when supported (or 0 otherwise), use `br_ghash_pclmul_get()`.
1296
+ *
1297
+ * \param y the array to update.
1298
+ * \param h the GHASH key.
1299
+ * \param data the input data (may be `NULL` if `len` is zero).
1300
+ * \param len the input data length (in bytes).
1301
+ */
1302
+ void br_ghash_pclmul(void *y, const void *h, const void *data, size_t len);
1303
+
1304
+ /**
1305
+ * \brief Obtain the `pclmul` GHASH implementation, if available.
1306
+ *
1307
+ * If the `pclmul` implementation was compiled in the library (depending
1308
+ * on the compiler abilities) _and_ the local CPU appears to support the
1309
+ * opcode, then this function will return a pointer to the
1310
+ * `br_ghash_pclmul()` function. Otherwise, it will return `0`.
1311
+ *
1312
+ * \return the `pclmul` GHASH implementation, or `0`.
1313
+ */
1314
+ br_ghash br_ghash_pclmul_get(void);
1315
+
1316
+ /**
1317
+ * \brief GHASH implementation using the POWER8 opcodes.
1318
+ *
1319
+ * This implementation is available only on POWER8 platforms (and later).
1320
+ * To safely obtain a pointer to this function when supported (or 0
1321
+ * otherwise), use `br_ghash_pwr8_get()`.
1322
+ *
1323
+ * \param y the array to update.
1324
+ * \param h the GHASH key.
1325
+ * \param data the input data (may be `NULL` if `len` is zero).
1326
+ * \param len the input data length (in bytes).
1327
+ */
1328
+ void br_ghash_pwr8(void *y, const void *h, const void *data, size_t len);
1329
+
1330
+ /**
1331
+ * \brief Obtain the `pwr8` GHASH implementation, if available.
1332
+ *
1333
+ * If the `pwr8` implementation was compiled in the library (depending
1334
+ * on the compiler abilities) _and_ the local CPU appears to support the
1335
+ * opcode, then this function will return a pointer to the
1336
+ * `br_ghash_pwr8()` function. Otherwise, it will return `0`.
1337
+ *
1338
+ * \return the `pwr8` GHASH implementation, or `0`.
1339
+ */
1340
+ br_ghash br_ghash_pwr8_get(void);
1341
+
1342
+ #ifdef __cplusplus
1343
+ }
1344
+ #endif
1345
+
1346
+ #endif