progs/perftest.c: Use from Glibc syscall numbers.
[catacomb] / symm / ocb1.h
CommitLineData
b39fadb6
MW
1/* -*-c-*-
2 *
3 * The OCB1 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 OCB1 -----------------------------------------------------*
29 *
30 * OCB was designed in 2001 by Phillip Rogaway, with Mihir Bellare and John
31 * Black, as a blockcipher-based authenticated encryption scheme which can
32 * operate on multiple message blocks in parallel and requires only a single
33 * blockcipher application per message block. It refines Charanjit Jutla's
34 * earlier IAPM, which was the first such mode to be proven secure. This
35 * version implements the `OCB.PMAC' mode described by Rogaway in 2002, which
36 * combines the original OCB with PMAC (Rogaway and Black, 2002) into a
37 * single authenticated-encryption with associated-data (AEAD) scheme.
38 *
39 * The patent situation on these efficient authenticated encryption schemes
40 * is fraught. IBM hold two patents on Jutla's pioneering work on `IACBC'
41 * and `IAPM' which can apply (a third was filed at least six years too
42 * late), and Virgil Gligor and Pompiliu Donescu hold patents on their `XECB'
43 * and `XCBC' modes; these may or may not apply to OCB. Rogaway himself
44 * holds US patents on various versions of OCB, but has issued free licences
45 * for free (`open source') software, and for all non-military use. I think
46 * Catacomb's implementation of OCB falls within the scope of the former
47 * licence.
48 *
49 * Confusingly, Rogaway's 2004 paper `Efficient Instantiations of Tweakable
50 * Blockciphers and Refinements to Modes OCB and PMAC' named the new versions
51 * of those modes `OCB1' and `PMAC1'. The 2011 paper by Krovetz and Rogaway,
52 * `The Software Performance of Authenticated-Encryption Modes' renamed the
53 * original 2001 version of OCB as `OCB1', and the 2004 version `OCB2', and
54 * introduced a new `OCB3'. I've decided to follow and extend the 2011
55 * naming, so `OCB1' refers to the 2001 OCB; the 2004 version would be
56 * `OCB2'.
57 *
58 * The OCB specification is clear about how OCB applies to arbitrary block
59 * sizes.
60 *
61 * OCB1 is a fairly well-behaved AEAD mode. It doesn't require
62 * precommentment to any lengths, and allows header data to be processed
63 * independently of any message. On the other hand, it only accepts nonces
64 * the same size as the underlying blockcipher's block size, and it buffers
65 * up to a whole block's worth of data internally, which somewhat complicates
66 * streaming.
67 */
68
69#ifndef CATACOMB_OCB1_H
70#define CATACOMB_OCB1_H
71
72#ifdef __cplusplus
73 extern "C" {
74#endif
75
76/*----- Header files ------------------------------------------------------*/
77
78#include <stddef.h>
79
80#include <mLib/bits.h>
81#include <mLib/buf.h>
82
83#ifndef CATACOMB_GAEAD_H
84# include "gaead.h"
85#endif
86
87#ifndef CATACOMB_OCB_H
88# include "ocb.h"
89#endif
90
91#ifndef CATACOMB_RSVR_H
92# include "rsvr.h"
93#endif
94
95/*----- Macros ------------------------------------------------------------*/
96
97/* --- @OCB1_DECL@ --- *
98 *
99 * Arguments: @PRE@, @pre@ = prefixes for the underlying block cipher
100 *
101 * Use: Creates declarations for OCB1 message-authentication mode.
102 */
103
104#define OCB1_STRUCTS(PRE, pre, keyty, aadty) \
105 \
106typedef struct keyty { \
107 pre##_ctx ctx; /* Underlying cipher context */ \
108 uint32 lxinv[PRE##_BLKSZ/4]; /* Final-block mask */ \
109 uint32 lmask[OCB_NCALC][PRE##_BLKSZ/4]; /* Precalculated masks */ \
110} keyty; \
111 \
112typedef struct aadty { \
113 keyty k; /* Processed key material */ \
114 uint32 o[PRE##_BLKSZ/4]; /* Current offset */ \
115 uint32 a[PRE##_BLKSZ/4]; /* Accumulator state */ \
116 octet b[PRE##_BLKSZ]; /* Input buffer */ \
117 unsigned long i; /* Block counter */ \
118 unsigned off; /* Offset into buffered data */ \
119} aadty;
120
121#define OCB1_DECL(PRE, pre) \
122 \
123OCB1_STRUCTS(PRE, pre, pre##_ocb1key, pre##_ocb1aadctx) \
124 \
125typedef struct pre##_ocb1ctx { \
126 /* This is the same as @pre_ocb1aadctx@ above, but the two are \
127 * logically distinct and shouldn't be muddled up. \
128 */ \
129 \
130 pre##_ocb1key k; /* Processed key material */ \
131 uint32 o[PRE##_BLKSZ/4]; /* Current offset */ \
132 uint32 a[PRE##_BLKSZ/4]; /* Accumulator state */ \
133 octet b[PRE##_BLKSZ]; /* Input buffer */ \
134 unsigned long i; /* Block counter */ \
135 unsigned off; /* Offset into buffered data */ \
136} pre##_ocb1ctx; \
137 \
138extern const rsvr_policy pre##_ocb1policy; \
139 \
140extern const octet pre##_ocb1noncesz[], pre##_ocb1tagsz[]; \
141 \
142/* --- @pre_ocb1setkey@ --- * \
143 * \
144 * Arguments: @pre_ocb1key *key@ = pointer to key block to fill in \
145 * @const void *k@ = pointer to key material \
146 * @size_t ksz@ = size of key material \
147 * \
148 * Returns: --- \
149 * \
150 * Use: Initializes an OCB1 key block. \
151 */ \
152 \
153extern void pre##_ocb1setkey(pre##_ocb1key */*key*/, \
154 const void */*k*/, size_t /*ksz*/); \
155 \
156/* --- @pre_ocb1aadinit@ --- * \
157 * \
158 * Arguments: @pre_ocb1aadctx *aad@ = pointer to AAD context \
159 * @const pre_ocb1key *key@ = pointer to key block \
160 * \
161 * Returns: --- \
162 * \
163 * Use: Initializes an OCB1 AAD (`additional authenticated \
164 * data') context associated with a given key. AAD \
165 * contexts can be copied and/or reused, saving time if \
166 * the AAD for number of messages has a common prefix. \
167 * \
168 * The @key@ doesn't need to be kept around, though \
169 * usually there'll at least be another copy in some OCB1 \
170 * operation context because the AAD on its own isn't much \
171 * good. \
172 */ \
173 \
174extern void pre##_ocb1aadinit(pre##_ocb1aadctx */*aad*/, \
175 const pre##_ocb1key */*key*/); \
176 \
177/* --- @pre_ocb1aadhash@ --- * \
178 * \
179 * Arguments: @pre_ocb1aadctx *aad@ = pointer to AAD context \
180 * @const void *p@ = pointer to AAD material \
181 * @size_t sz@ = length of AAD material \
182 * \
183 * Returns: --- \
184 * \
185 * Use: Feeds AAD into the context. \
186 */ \
187 \
188extern void pre##_ocb1aadhash(pre##_ocb1aadctx */*aad*/, \
189 const void */*p*/, size_t /*sz*/); \
190 \
191/* --- @pre_ocb1aadtag@ --- * \
192 * \
193 * Arguments: @const pre_ocb1aadctx *aad@ = pointer to context block \
194 * @uint32 *u@ = where to write the tag \
195 * \
196 * Returns: --- \
197 * \
198 * Use: Finishes processing AAD and produces a tag which can be \
199 * mixed with an OCB1 checksum. This function is exposed \
200 * for internal reasons and is not expected to be \
201 * generally useful. \
202 */ \
203 \
204extern void pre##_ocb1aadtag(const pre##_ocb1aadctx */*aad*/, \
205 uint32 */*t*/); \
206 \
207/* --- @pre_ocb1init@ --- * \
208 * \
209 * Arguments: @pre_ocb1ctx *ctx@ = pointer to OCB1 context \
210 * @const pre_ocb1key *key@ = pointer to key block \
211 * @const void *n@ = pointer to nonce \
212 * @size_t nsz@ = size of nonce \
213 * \
214 * Returns: Zero on success, @-1@ if the nonce length is bad. \
215 * \
216 * Use: Initialize an OCB1 operation context with a given key. \
217 * \
218 * The original key needn't be kept around any more. \
219 */ \
220 \
221extern int pre##_ocb1init(pre##_ocb1ctx */*ctx*/, \
222 const pre##_ocb1key */*k*/, \
223 const void */*n*/, size_t /*nsz*/); \
224 \
225/* --- @pre_ocb1reinit@ --- * \
226 * \
227 * Arguments: @pre_ocb1ctx *ctx@ = pointer to OCB1 context \
228 * @const void *n@ = pointer to nonce \
229 * @size_t nsz@ = size of nonce \
230 * \
231 * Returns: Zero on success, @-1@ if the nonce length is bad. \
232 * \
233 * Use: Reinitialize an OCB1 operation context, changing the \
234 * nonce. \
235 */ \
236 \
237extern int pre##_ocb1reinit(pre##_ocb1ctx */*ctx*/, \
238 const void */*n*/, size_t /*nsz*/); \
239 \
240/* --- @pre_ocb1encrypt@ --- * \
241 * \
242 * Arguments: @pre_ocb1ctx *ctx@ = pointer to OCB1 operation context \
243 * @const void *src@ = pointer to plaintext message chunk \
244 * @size_t sz@ = size of the plaintext \
245 * @buf *dst@ = a buffer to write the ciphertext to \
246 * \
247 * Returns: Zero on success; @-1@ on failure. \
248 * \
249 * Use: Encrypts a chunk of a plaintext message, writing a \
250 * chunk of ciphertext to the output buffer and updating \
251 * the operation state. \
252 * \
253 * Note that OCB1 delays output if its input is not a \
254 * whole number of blocks. This means that the output \
255 * might be smaller or larger the input by up to the block \
256 * size. \
257 */ \
258 \
259extern int pre##_ocb1encrypt(pre##_ocb1ctx */*ctx*/, \
260 const void */*src*/, size_t /*sz*/, \
261 buf */*dst*/); \
262 \
263/* --- @pre_ocb1decrypt@ --- * \
264 * \
265 * Arguments: @pre_ocb1ctx *ctx@ = pointer to OCB1 operation context \
266 * @const void *src@ = pointer to ciphertext message chunk \
267 * @size_t sz@ = size of the ciphertext \
268 * @buf *dst@ = a buffer to write the plaintext to \
269 * \
270 * Returns: Zero on success; @-1@ on failure. \
271 * \
272 * Use: Decrypts a chunk of a ciphertext message, writing a \
273 * chunk of plaintext to the output buffer and updating \
274 * the operation state. \
275 * \
276 * Note that OCB1 delays output if its input is not a \
277 * whole number of blocks. This means that the output \
278 * might be smaller or larger the input by up to the block \
279 * size. \
280 */ \
281 \
282extern int pre##_ocb1decrypt(pre##_ocb1ctx */*ctx*/, \
283 const void */*src*/, size_t /*sz*/, \
284 buf */*dst*/); \
285 \
286/* --- @pre_ocb1encryptdone@ --- * \
287 * \
288 * Arguments: @pre_ocb1ctx *ctx@ = pointer to an OCB1 context \
289 * @const pre_ocb1aadctx *aad@ = pointer to AAD context, \
290 * or null \
291 * @buf *dst@ = buffer for remaining ciphertext \
292 * @void *tag@ = where to write the tag \
293 * @size_t tsz@ = length of tag to store \
294 * \
295 * Returns: Zero on success; @-1@ on failure. \
296 * \
297 * Use: Completes an OCB1 encryption operation. The @aad@ \
298 * pointer may be null if there is no additional \
299 * authenticated data. OCB1 delays output, so this will \
300 * cause any remaining buffered plaintext to be encrypted \
301 * and written to @dst@. Anyway, the function will fail \
302 * if the output buffer is broken. \
303 */ \
304 \
305extern int pre##_ocb1encryptdone(pre##_ocb1ctx */*ctx*/, \
306 const pre##_ocb1aadctx */*aad*/, \
307 buf */*dst*/, \
308 void */*tag*/, size_t /*tsz*/); \
309 \
310/* --- @pre_ocb1decryptdone@ --- * \
311 * \
312 * Arguments: @pre_ocb1ctx *ctx@ = pointer to an OCB1 context \
313 * @const pre_ocb1aadctx *aad@ = pointer to AAD context, \
314 * or null \
315 * @buf *dst@ = buffer for remaining plaintext \
316 * @const void *tag@ = tag to verify \
317 * @size_t tsz@ = length of tag \
318 * \
319 * Returns: @+1@ for complete success; @0@ if tag verification \
320 * failed; @-1@ for other kinds of errors. \
321 * \
322 * Use: Completes an OCB1 decryption operation. The @aad@ \
323 * pointer may be null if there is no additional \
324 * authenticated data. OCB1 delays output, so this will \
325 * cause any remaining buffered ciphertext to be decrypted \
326 * and written to @dst@. Anyway, the function will fail \
327 * if the output buffer is broken. \
328 */ \
329 \
330extern int pre##_ocb1decryptdone(pre##_ocb1ctx */*ctx*/, \
331 const pre##_ocb1aadctx */*aad*/, \
332 buf */*dst*/, \
333 const void */*tag*/, size_t /*tsz*/); \
334 \
335/* --- Generic AEAD interface --- */ \
336 \
337extern const gcaead pre##_ocb1;
338
339/*----- That's all, folks -------------------------------------------------*/
340
341#ifdef __cplusplus
342 }
343#endif
344
345#endif