progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / symm / ocb3.h
CommitLineData
09734e51
MW
1/* -*-c-*-
2 *
3 * The OCB3 authenticated encryption mode
4 *
5 * (c) 2018 Straylight/Edgeware
6 */
7
8/*----- Licensing notice --------------------------------------------------*
9 *
10 * This file is part of Catacomb.
11 *
12 * Catacomb is free software: you can redistribute it and/or modify it
13 * under the terms of the GNU Library General Public License as published
14 * by the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * Catacomb is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Library General Public License for more details.
21 *
22 * You should have received a copy of the GNU Library General Public
23 * License along with Catacomb. If not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
25 * USA.
26 */
27
28/*----- Notes on OCB3 -----------------------------------------------------*
29 *
30 * OCB3 was designed in 2011 by Phillip Rogaway and Ted Krovetz, building ten
31 * years of earlier work by Rogaway, Bellare, and Black, and refining Jutla's
32 * pioneering work on IACBC and IAPM. OCB3 is an efficient `authenticated
33 * encryption with associated data' (AEAD) scheme which requires only one
34 * blockcipher application per message block.
35 *
36 * The patent situation on these efficient authenticated encryption schemes
37 * is fraught. IBM hold two patents on Jutla's pioneering work on `IACBC'
38 * and `IAPM' which can apply (a third was filed at least six years too
39 * late), and Virgil Gligor and Pompiliu Donescu hold patents on their `XECB'
40 * and `XCBC' modes; these may or may not apply to OCB. Rogaway himself
41 * holds US patents on various versions of OCB, but has issued free licences
42 * for free (`open source') software, and for all non-military use. I think
43 * Catacomb's implementation of OCB falls within the scope of the former
44 * licence.
45 *
46 * OCB3 has optimized for short messages with `similar' nonces, where
47 * `similar' means `all but the low bits in the last byte are equal'; exactly
48 * how many bits depends on the block length in a rather complicated manner.
49 * This implementation supports this optimization through @pre_ocb3reinit@
50 * (which compares the new nonce against the old one to see whether it can
51 * make use of the similarity), and, more directly, through @pre_ocb3step@,
52 * which (effectively) advances the nonce as a big-endian counter.
53 *
54 * OCB3 was originally defined only for 128-bit blockciphers, and extending
55 * it to other sizes is nontrivial, but this has been done by Ted Krovetz in
56 * I-D draft-krovetz-ocb-wideblock-00 (following initial prompting from, err,
57 * me).
58 *
59 * OCB3 is a fairly well-behaved AEAD mode. It doesn't require
60 * precommentment to the header or message lengths, but does require
61 * precommitment to the tag length. It permits header data to be processed
62 * independently of any message. It only accepts nonces the same size as the
63 * underlying blockcipher's block size, and it buffers up to a whole block's
64 * worth of data internally, which somewhat complicates streaming.
65 */
66
67#ifndef CATACOMB_OCB3_H
68#define CATACOMB_OCB3_H
69
70#ifdef __cplusplus
71 extern "C" {
72#endif
73
74/*----- Header files ------------------------------------------------------*/
75
76#include <stddef.h>
77
78#include <mLib/bits.h>
79#include <mLib/buf.h>
80
81#ifndef CATACOMB_GAEAD_H
82# include "gaead.h"
83#endif
84
85#ifndef CATACOMB_OCB_H
86# include "ocb.h"
87#endif
88
89/*----- Macros ------------------------------------------------------------*/
90
91/* --- @OCB3_DECL@ --- *
92 *
93 * Arguments: @PRE@, @pre@ = prefixes for the underlying block cipher
94 *
95 * Use: Creates declarations for OCB3 message-authentication mode.
96 */
97
98#define OCB3_NSZMAX(PRE) (PRE##_BLKSZ - (PRE##_BLKSZ <= 16 ? 1 : 2))
99
100#define OCB3_DECL(PRE, pre) \
101 \
102typedef struct pre##_ocb3key { \
103 pre##_ctx ctx; /* Underlying cipher context */ \
104 uint32 lstar[PRE##_BLKSZ/4]; /* Partial-block mask */ \
105 uint32 ldollar[PRE##_BLKSZ/4]; /* Checksum mask */ \
106 uint32 lmask[OCB_NCALC][PRE##_BLKSZ/4]; /* Precalculated masks */ \
107} pre##_ocb3key; \
108 \
109typedef struct pre##_ocb3aadctx { \
110 pre##_ocb3key k; /* Processed key material */ \
111 uint32 o[PRE##_BLKSZ/4]; /* Current offset */ \
112 uint32 a[PRE##_BLKSZ/4]; /* Accumulator state */ \
113 octet b[PRE##_BLKSZ]; /* Input buffer */ \
114 unsigned long i; /* Block counter */ \
115 unsigned off; /* Offset into buffered data */ \
116} pre##_ocb3aadctx; \
117 \
118typedef struct pre##_ocb3ctx { \
119 pre##_ocb3key k; /* Processed key material */ \
120 unsigned nix, tsz; /* Nonce index and tag size */ \
121 uint32 nbase[PRE##_BLKSZ/2]; /* Current base nonce */ \
122 uint32 nstretch[PRE##_BLKSZ/2]; /* Stretched nonce material */ \
123 uint32 o[PRE##_BLKSZ/4]; /* Current offset */ \
124 uint32 a[PRE##_BLKSZ/4]; /* Accumulator state */ \
125 octet b[PRE##_BLKSZ]; /* Input buffer */ \
126 unsigned long i; /* Block counter */ \
127 unsigned off; /* Offset into buffered data */ \
128} pre##_ocb3ctx; \
129 \
130extern const octet pre##_ocb3noncesz[], pre##_ocb3tagsz[]; \
131 \
132/* --- @pre_ocb3setkey@ --- * \
133 * \
134 * Arguments: @pre_ocb3key *key@ = pointer to key block to fill in \
135 * @const void *k@ = pointer to key material \
136 * @size_t ksz@ = size of key material \
137 * \
138 * Returns: --- \
139 * \
140 * Use: Initializes an OCB3 key block. \
141 */ \
142 \
143extern void pre##_ocb3setkey(pre##_ocb3key */*key*/, \
144 const void */*k*/, size_t /*ksz*/); \
145 \
146/* --- @pre_ocb3aadinit@ --- * \
147 * \
148 * Arguments: @pre_ocb3aadctx *aad@ = pointer to AAD context \
149 * @const pre_ocb3key *key@ = pointer to key block \
150 * \
151 * Returns: --- \
152 * \
153 * Use: Initializes an OCB3 AAD (`additional authenticated \
154 * data') context associated with a given key. AAD \
155 * contexts can be copied and/or reused, saving time if \
156 * the AAD for number of messages has a common prefix. \
157 * \
158 * The @key@ doesn't need to be kept around, though \
159 * usually there'll at least be another copy in some OCB3 \
160 * operation context because the AAD on its own isn't much \
161 * good. \
162 */ \
163 \
164extern void pre##_ocb3aadinit(pre##_ocb3aadctx */*aad*/, \
165 const pre##_ocb3key */*key*/); \
166 \
167/* --- @pre_ocb3aadhash@ --- * \
168 * \
169 * Arguments: @pre_ocb3aadctx *aad@ = pointer to AAD context \
170 * @const void *p@ = pointer to AAD material \
171 * @size_t sz@ = length of AAD material \
172 * \
173 * Returns: --- \
174 * \
175 * Use: Feeds AAD into the context. \
176 */ \
177 \
178extern void pre##_ocb3aadhash(pre##_ocb3aadctx */*aad*/, \
179 const void */*p*/, size_t /*sz*/); \
180 \
181/* --- @pre_ocb3init@ --- * \
182 * \
183 * Arguments: @pre_ocb3ctx *ctx@ = pointer to OCB3 context \
184 * @const pre_ocb3key *key@ = pointer to key block \
185 * @const void *n@ = pointer to nonce \
186 * @size_t nsz@ = size of nonce \
187 * @size_t tsz@ = tag length \
188 * \
189 * Returns: Zero on success, @-1@ if the nonce or tag length is \
190 * bad. \
191 * \
192 * Use: Initialize an OCB3 operation context with a given key. \
193 * \
194 * The original key needn't be kept around any more. \
195 */ \
196 \
197extern int pre##_ocb3init(pre##_ocb3ctx */*ctx*/, \
198 const pre##_ocb3key */*k*/, \
199 const void */*n*/, size_t /*nsz*/, \
200 size_t /*tsz*/); \
201 \
202/* --- @pre_ocb3reinit@ --- * \
203 * \
204 * Arguments: @pre_ocb3ctx *ctx@ = pointer to OCB3 context \
205 * @const void *n@ = pointer to nonce \
206 * @size_t nsz@ = size of nonce \
207 * @size_t tsz@ = tag length \
208 * \
209 * Returns: Zero on success, @-1@ if the nonce or tag length is \
210 * bad. \
211 * \
212 * Use: Reinitialize an OCB3 operation context, changing the \
213 * nonce and/or tag length. \
214 */ \
215 \
216extern int pre##_ocb3reinit(pre##_ocb3ctx */*ctx*/, \
217 const void */*n*/, size_t /*nsz*/, \
218 size_t /*tsz*/); \
219 \
220/* --- @pre_ocb3step@ --- * \
221 * \
222 * Arguments: @pre_ocb3ctx *ctx@ = pointer to OCB3 context \
223 * \
224 * Returns: --- \
225 * \
226 * Use: Reinitialize an OCB3 operation context, stepping to \
227 * the `next' nonce along. \
228 */ \
229 \
230extern void pre##_ocb3step(pre##_ocb3ctx */*ctx*/); \
231 \
232/* --- @pre_ocb3encrypt@ --- * \
233 * \
234 * Arguments: @pre_ocb3ctx *ctx@ = pointer to OCB3 operation context \
235 * @const void *src@ = pointer to plaintext message chunk \
236 * @size_t sz@ = size of the plaintext \
237 * @buf *dst@ = a buffer to write the ciphertext to \
238 * \
239 * Returns: Zero on success; @-1@ on failure. \
240 * \
241 * Use: Encrypts a chunk of a plaintext message, writing a \
242 * chunk of ciphertext to the output buffer and updating \
243 * the operation state. \
244 * \
245 * Note that OCB3 delays output if its input is not a \
246 * whole number of blocks. This means that the output \
247 * might be smaller or larger the input by up to the block \
248 * size. \
249 */ \
250 \
251extern int pre##_ocb3encrypt(pre##_ocb3ctx */*ctx*/, \
252 const void */*src*/, size_t /*sz*/, \
253 buf */*dst*/); \
254 \
255/* --- @pre_ocb3decrypt@ --- * \
256 * \
257 * Arguments: @pre_ocb3ctx *ctx@ = pointer to OCB3 operation context \
258 * @const void *src@ = pointer to ciphertext message chunk \
259 * @size_t sz@ = size of the ciphertext \
260 * @buf *dst@ = a buffer to write the plaintext to \
261 * \
262 * Returns: Zero on success; @-1@ on failure. \
263 * \
264 * Use: Decrypts a chunk of a ciphertext message, writing a \
265 * chunk of plaintext to the output buffer and updating \
266 * the operation state. \
267 * \
268 * Note that OCB3 delays output if its input is not a \
269 * whole number of blocks. This means that the output \
270 * might be smaller or larger the input by up to the block \
271 * size. \
272 */ \
273 \
274extern int pre##_ocb3decrypt(pre##_ocb3ctx */*ctx*/, \
275 const void */*src*/, size_t /*sz*/, \
276 buf */*dst*/); \
277 \
278/* --- @pre_ocb3encryptdone@ --- * \
279 * \
280 * Arguments: @pre_ocb3ctx *ctx@ = pointer to an OCB3 context \
281 * @const pre_ocb3aadctx *aad@ = pointer to AAD context, \
282 * or null \
283 * @buf *dst@ = buffer for remaining ciphertext \
284 * @void *tag@ = where to write the tag \
285 * @size_t tsz@ = length of tag to store \
286 * \
287 * Returns: Zero on success; @-1@ on failure. \
288 * \
289 * Use: Completes an OCB3 encryption operation. The @aad@ \
290 * pointer may be null if there is no additional \
291 * authenticated data. OCB3 delays output, so this will \
292 * cause any remaining buffered plaintext to be encrypted \
293 * and written to @dst@. Anyway, the function will fail \
294 * if the output buffer is broken. \
295 */ \
296 \
297extern int pre##_ocb3encryptdone(pre##_ocb3ctx */*ctx*/, \
298 const pre##_ocb3aadctx */*aad*/, \
299 buf */*dst*/, \
300 void */*tag*/, size_t /*tsz*/); \
301 \
302/* --- @pre_ocb3decryptdone@ --- * \
303 * \
304 * Arguments: @pre_ocb3ctx *ctx@ = pointer to an OCB3 context \
305 * @const pre_ocb3aadctx *aad@ = pointer to AAD context, \
306 * or null \
307 * @buf *dst@ = buffer for remaining plaintext \
308 * @const void *tag@ = tag to verify \
309 * @size_t tsz@ = length of tag \
310 * \
311 * Returns: @+1@ for complete success; @0@ if tag verification \
312 * failed; @-1@ for other kinds of errors. \
313 * \
314 * Use: Completes an OCB3 decryption operation. The @aad@ \
315 * pointer may be null if there is no additional \
316 * authenticated data. OCB3 delays output, so this will \
317 * cause any remaining buffered ciphertext to be decrypted \
318 * and written to @dst@. Anyway, the function will fail \
319 * if the output buffer is broken. \
320 */ \
321 \
322extern int pre##_ocb3decryptdone(pre##_ocb3ctx */*ctx*/, \
323 const pre##_ocb3aadctx */*aad*/, \
324 buf */*dst*/, \
325 const void */*tag*/, size_t /*tsz*/); \
326 \
327/* --- Generic AEAD interface --- */ \
328 \
329extern const gcaead pre##_ocb3;
330
331/*----- That's all, folks -------------------------------------------------*/
332
333#ifdef __cplusplus
334 }
335#endif
336
337#endif