xref: /xnu-11417.140.69/osfmk/corecrypto/ccmode_internal.h (revision 43a90889846e00bfb5cf1d255cdc0a701a1e05a4)
1*43a90889SApple OSS Distributions /* Copyright (c) (2010-2012,2014-2022) Apple Inc. All rights reserved.
2*43a90889SApple OSS Distributions  *
3*43a90889SApple OSS Distributions  * corecrypto is licensed under Apple Inc.’s Internal Use License Agreement (which
4*43a90889SApple OSS Distributions  * is contained in the License.txt file distributed with corecrypto) and only to
5*43a90889SApple OSS Distributions  * people who accept that license. IMPORTANT:  Any license rights granted to you by
6*43a90889SApple OSS Distributions  * Apple Inc. (if any) are limited to internal use within your organization only on
7*43a90889SApple OSS Distributions  * devices and computers you own or control, for the sole purpose of verifying the
8*43a90889SApple OSS Distributions  * security characteristics and correct functioning of the Apple Software.  You may
9*43a90889SApple OSS Distributions  * not, directly or indirectly, redistribute the Apple Software or any portions thereof.
10*43a90889SApple OSS Distributions  *
11*43a90889SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
12*43a90889SApple OSS Distributions  *
13*43a90889SApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
14*43a90889SApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
15*43a90889SApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
16*43a90889SApple OSS Distributions  * compliance with the License. The rights granted to you under the License
17*43a90889SApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
18*43a90889SApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
19*43a90889SApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
20*43a90889SApple OSS Distributions  * terms of an Apple operating system software license agreement.
21*43a90889SApple OSS Distributions  *
22*43a90889SApple OSS Distributions  * Please obtain a copy of the License at
23*43a90889SApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
24*43a90889SApple OSS Distributions  *
25*43a90889SApple OSS Distributions  * The Original Code and all software distributed under the License are
26*43a90889SApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
27*43a90889SApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
28*43a90889SApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
29*43a90889SApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
30*43a90889SApple OSS Distributions  * Please see the License for the specific language governing rights and
31*43a90889SApple OSS Distributions  * limitations under the License.
32*43a90889SApple OSS Distributions  *
33*43a90889SApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
34*43a90889SApple OSS Distributions  */
35*43a90889SApple OSS Distributions 
36*43a90889SApple OSS Distributions #ifndef _CORECRYPTO_CCMODE_INTERNAL_H_
37*43a90889SApple OSS Distributions #define _CORECRYPTO_CCMODE_INTERNAL_H_
38*43a90889SApple OSS Distributions 
39*43a90889SApple OSS Distributions #include <corecrypto/ccmode.h>
40*43a90889SApple OSS Distributions #include <corecrypto/ccmode_factory.h>
41*43a90889SApple OSS Distributions #include <corecrypto/cc_priv.h>
42*43a90889SApple OSS Distributions #include "cc_memory.h"
43*43a90889SApple OSS Distributions #include "cc_macros.h"
44*43a90889SApple OSS Distributions 
45*43a90889SApple OSS Distributions #include "ccmode_gcm_internal.h"
46*43a90889SApple OSS Distributions 
47*43a90889SApple OSS Distributions /* Macros defined in this file are only to be used
48*43a90889SApple OSS Distributions  *  within corecrypto files.
49*43a90889SApple OSS Distributions  */
50*43a90889SApple OSS Distributions 
51*43a90889SApple OSS Distributions /* For CBC, direction of underlying ecb is the same as the cbc direction */
52*43a90889SApple OSS Distributions #define CCMODE_CBC_FACTORY(_cipher_, _dir_)                                     \
53*43a90889SApple OSS Distributions static CC_READ_ONLY_LATE(struct ccmode_cbc) cbc_##_cipher_##_##_dir_;           \
54*43a90889SApple OSS Distributions                                                                                 \
55*43a90889SApple OSS Distributions const struct ccmode_cbc *cc##_cipher_##_cbc_##_dir_##_mode(void)                \
56*43a90889SApple OSS Distributions {                                                                               \
57*43a90889SApple OSS Distributions     if (!CC_CACHE_DESCRIPTORS || NULL == cbc_##_cipher_##_##_dir_.init) {        \
58*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb=cc##_cipher_##_ecb_##_dir_##_mode();       \
59*43a90889SApple OSS Distributions 	ccmode_factory_cbc_##_dir_(&cbc_##_cipher_##_##_dir_, ecb);             \
60*43a90889SApple OSS Distributions     }                                                                           \
61*43a90889SApple OSS Distributions     return &cbc_##_cipher_##_##_dir_;                                           \
62*43a90889SApple OSS Distributions }
63*43a90889SApple OSS Distributions 
64*43a90889SApple OSS Distributions /* For CTR, only one direction, underlying ecb is always encrypt */
65*43a90889SApple OSS Distributions #define CCMODE_CTR_FACTORY(_cipher_)                                            \
66*43a90889SApple OSS Distributions static struct ccmode_ctr ctr_##_cipher_;                                        \
67*43a90889SApple OSS Distributions                                                                                 \
68*43a90889SApple OSS Distributions const struct ccmode_ctr *cc##_cipher_##_ctr_crypt_mode(void)                    \
69*43a90889SApple OSS Distributions {                                                                               \
70*43a90889SApple OSS Distributions     const struct ccmode_ecb *ecb=cc##_cipher_##_ecb_encrypt_mode();             \
71*43a90889SApple OSS Distributions     ccmode_factory_ctr_crypt(&ctr_##_cipher_, ecb);                             \
72*43a90889SApple OSS Distributions     return &ctr_##_cipher_;                                                     \
73*43a90889SApple OSS Distributions }
74*43a90889SApple OSS Distributions 
75*43a90889SApple OSS Distributions /* OFB, same as CTR */
76*43a90889SApple OSS Distributions #define CCMODE_OFB_FACTORY(_cipher_)                                            \
77*43a90889SApple OSS Distributions static struct ccmode_ofb ofb_##_cipher_;                                        \
78*43a90889SApple OSS Distributions                                                                                 \
79*43a90889SApple OSS Distributions const struct ccmode_ofb *cc##_cipher_##_ofb_crypt_mode(void)                    \
80*43a90889SApple OSS Distributions {                                                                               \
81*43a90889SApple OSS Distributions     const struct ccmode_ecb *ecb=cc##_cipher_##_ecb_encrypt_mode();             \
82*43a90889SApple OSS Distributions     ccmode_factory_ofb_crypt(&ofb_##_cipher_, ecb);                             \
83*43a90889SApple OSS Distributions     return &ofb_##_cipher_;                                                     \
84*43a90889SApple OSS Distributions }
85*43a90889SApple OSS Distributions 
86*43a90889SApple OSS Distributions 
87*43a90889SApple OSS Distributions /* For CFB, the underlying ecb operation is encrypt for both directions */
88*43a90889SApple OSS Distributions #define CCMODE_CFB_FACTORY(_cipher_, _mode_, _dir_)                             \
89*43a90889SApple OSS Distributions static CC_READ_ONLY_LATE(struct ccmode_##_mode_) _mode_##_##_cipher_##_##_dir_; \
90*43a90889SApple OSS Distributions                                                                                 \
91*43a90889SApple OSS Distributions const struct ccmode_##_mode_ *cc##_cipher_##_##_mode_##_##_dir_##_mode(void)    \
92*43a90889SApple OSS Distributions {                                                                               \
93*43a90889SApple OSS Distributions     if (!CC_CACHE_DESCRIPTORS || NULL == _mode_##_##_cipher_##_##_dir_.init) {   \
94*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb=cc##_cipher_##_ecb_encrypt_mode();         \
95*43a90889SApple OSS Distributions 	ccmode_factory_##_mode_##_##_dir_(&_mode_##_##_cipher_##_##_dir_, ecb); \
96*43a90889SApple OSS Distributions     }                                                                           \
97*43a90889SApple OSS Distributions     return &_mode_##_##_cipher_##_##_dir_;                                      \
98*43a90889SApple OSS Distributions }
99*43a90889SApple OSS Distributions 
100*43a90889SApple OSS Distributions void ccmode_xts_mult_alpha(cc_unit *tweak);
101*43a90889SApple OSS Distributions 
102*43a90889SApple OSS Distributions int ccmode_cbc_init(const struct ccmode_cbc *cbc, cccbc_ctx *ctx,
103*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey);
104*43a90889SApple OSS Distributions int ccmode_cbc_decrypt(const cccbc_ctx *ctx, cccbc_iv *iv, size_t nblocks,
105*43a90889SApple OSS Distributions     const void *in, void *out);
106*43a90889SApple OSS Distributions int ccmode_cbc_encrypt(const cccbc_ctx *ctx, cccbc_iv *iv, size_t nblocks,
107*43a90889SApple OSS Distributions     const void *in, void *out);
108*43a90889SApple OSS Distributions 
109*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cbc object for decryption. */
110*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CBC_DECRYPT(ECB) { \
111*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cbc_key)) + ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
112*43a90889SApple OSS Distributions .block_size = (ECB)->block_size, \
113*43a90889SApple OSS Distributions .init = ccmode_cbc_init, \
114*43a90889SApple OSS Distributions .cbc = ccmode_cbc_decrypt, \
115*43a90889SApple OSS Distributions .custom = (ECB) \
116*43a90889SApple OSS Distributions }
117*43a90889SApple OSS Distributions 
118*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cbc object for encryption. */
119*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CBC_ENCRYPT(ECB) { \
120*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cbc_key)) + ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
121*43a90889SApple OSS Distributions .block_size = (ECB)->block_size, \
122*43a90889SApple OSS Distributions .init = ccmode_cbc_init, \
123*43a90889SApple OSS Distributions .cbc = ccmode_cbc_encrypt, \
124*43a90889SApple OSS Distributions .custom = (ECB) \
125*43a90889SApple OSS Distributions }
126*43a90889SApple OSS Distributions 
127*43a90889SApple OSS Distributions struct _ccmode_cbc_key {
128*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
129*43a90889SApple OSS Distributions 	cc_unit u[];
130*43a90889SApple OSS Distributions };
131*43a90889SApple OSS Distributions 
132*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_CBC_KEY.
133*43a90889SApple OSS Distributions  *  {
134*43a90889SApple OSS Distributions  *  const struct ccmode_ecb *ecb
135*43a90889SApple OSS Distributions  *  ccn_unit ecb_key[ecb->n]
136*43a90889SApple OSS Distributions  *  } */
137*43a90889SApple OSS Distributions #define _CCMODE_CBC_KEY(K)       ((struct _ccmode_cbc_key *)(K))
138*43a90889SApple OSS Distributions #define _CCMODE_CBC_KEY_CONST(K) ((const struct _ccmode_cbc_key *)(K))
139*43a90889SApple OSS Distributions #define CCMODE_CBC_KEY_ECB(K) (_CCMODE_CBC_KEY(K)->ecb)
140*43a90889SApple OSS Distributions #define CCMODE_CBC_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_CBC_KEY(K)->u[0])
141*43a90889SApple OSS Distributions 
142*43a90889SApple OSS Distributions CC_INLINE
143*43a90889SApple OSS Distributions const struct ccmode_ecb *
ccmode_cbc_key_ecb(const cccbc_ctx * K)144*43a90889SApple OSS Distributions ccmode_cbc_key_ecb(const cccbc_ctx *K)
145*43a90889SApple OSS Distributions {
146*43a90889SApple OSS Distributions 	return ((const struct _ccmode_cbc_key *)K)->ecb;
147*43a90889SApple OSS Distributions }
148*43a90889SApple OSS Distributions 
149*43a90889SApple OSS Distributions CC_INLINE
150*43a90889SApple OSS Distributions const ccecb_ctx *
ccmode_cbc_key_ecb_key(const cccbc_ctx * K)151*43a90889SApple OSS Distributions ccmode_cbc_key_ecb_key(const cccbc_ctx *K)
152*43a90889SApple OSS Distributions {
153*43a90889SApple OSS Distributions 	return (const ccecb_ctx *)&((const struct _ccmode_cbc_key *)K)->u[0];
154*43a90889SApple OSS Distributions }
155*43a90889SApple OSS Distributions 
156*43a90889SApple OSS Distributions int ccmode_cfb_init(const struct ccmode_cfb *cfb, cccfb_ctx *ctx,
157*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey,
158*43a90889SApple OSS Distributions     const void *iv);
159*43a90889SApple OSS Distributions int ccmode_cfb_decrypt(cccfb_ctx *ctx, size_t nbytes,
160*43a90889SApple OSS Distributions     const void *in, void *out);
161*43a90889SApple OSS Distributions int ccmode_cfb_encrypt(cccfb_ctx *ctx, size_t nbytes,
162*43a90889SApple OSS Distributions     const void *in, void *out);
163*43a90889SApple OSS Distributions 
164*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cfb object for decryption. */
165*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CFB_DECRYPT(ECB) { \
166*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cfb_key)) + 2 * ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
167*43a90889SApple OSS Distributions .block_size = 1, \
168*43a90889SApple OSS Distributions .init = ccmode_cfb_init, \
169*43a90889SApple OSS Distributions .cfb = ccmode_cfb_decrypt, \
170*43a90889SApple OSS Distributions .custom = (ECB) \
171*43a90889SApple OSS Distributions }
172*43a90889SApple OSS Distributions 
173*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cfb object for encryption. */
174*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CFB_ENCRYPT(ECB) { \
175*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cfb_key)) + 2 * ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
176*43a90889SApple OSS Distributions .block_size = 1, \
177*43a90889SApple OSS Distributions .init = ccmode_cfb_init, \
178*43a90889SApple OSS Distributions .cfb = ccmode_cfb_encrypt, \
179*43a90889SApple OSS Distributions .custom = (ECB) \
180*43a90889SApple OSS Distributions }
181*43a90889SApple OSS Distributions 
182*43a90889SApple OSS Distributions struct _ccmode_cfb_key {
183*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
184*43a90889SApple OSS Distributions 	size_t pad_len;
185*43a90889SApple OSS Distributions 	cc_unit u[];
186*43a90889SApple OSS Distributions };
187*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_CFB_KEY.
188*43a90889SApple OSS Distributions  *  {
189*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
190*43a90889SApple OSS Distributions  *   cc_size pad_len;
191*43a90889SApple OSS Distributions  *   ccn_unit pad[ecb->block_size / CCN_UNIT_SIZE];
192*43a90889SApple OSS Distributions  *   ccn_unit iv[ecb->block_size / CCN_UNIT_SIZE];
193*43a90889SApple OSS Distributions  *   ccn_unit ecb_key[ecb->n]
194*43a90889SApple OSS Distributions  *  } */
195*43a90889SApple OSS Distributions #define _CCMODE_CFB_KEY(K) ((struct _ccmode_cfb_key *)(K))
196*43a90889SApple OSS Distributions #define CCMODE_CFB_KEY_ECB(K) (_CCMODE_CFB_KEY(K)->ecb)
197*43a90889SApple OSS Distributions #define CCMODE_CFB_KEY_PAD_LEN(K) (_CCMODE_CFB_KEY(K)->pad_len)
198*43a90889SApple OSS Distributions #define CCMODE_CFB_KEY_PAD(K) (&_CCMODE_CFB_KEY(K)->u[0])
199*43a90889SApple OSS Distributions #define CCMODE_CFB_KEY_IV(K) (&_CCMODE_CFB_KEY(K)->u[ccn_nof_size(CCMODE_CFB_KEY_ECB(K)->block_size)])
200*43a90889SApple OSS Distributions #define CCMODE_CFB_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_CFB_KEY(K)->u[2 * ccn_nof_size(CCMODE_CFB_KEY_ECB(K)->block_size)])
201*43a90889SApple OSS Distributions 
202*43a90889SApple OSS Distributions int ccmode_cfb8_init(const struct ccmode_cfb8 *cfb8, cccfb8_ctx *ctx,
203*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey, const void *iv);
204*43a90889SApple OSS Distributions int ccmode_cfb8_decrypt(cccfb8_ctx *ctx, size_t nbytes,
205*43a90889SApple OSS Distributions     const void *in, void *out);
206*43a90889SApple OSS Distributions int ccmode_cfb8_encrypt(cccfb8_ctx *ctx, size_t nbytes,
207*43a90889SApple OSS Distributions     const void *in, void *out);
208*43a90889SApple OSS Distributions 
209*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cfb8 object for decryption. */
210*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CFB8_DECRYPT(ECB) { \
211*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cfb8_key)) + 2 * ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
212*43a90889SApple OSS Distributions .block_size = 1, \
213*43a90889SApple OSS Distributions .init = ccmode_cfb8_init, \
214*43a90889SApple OSS Distributions .cfb8 = ccmode_cfb8_decrypt, \
215*43a90889SApple OSS Distributions .custom = (ECB) \
216*43a90889SApple OSS Distributions }
217*43a90889SApple OSS Distributions 
218*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_cfb8 object for encryption. */
219*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CFB8_ENCRYPT(ECB) { \
220*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_cfb8_key)) + 2 * ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
221*43a90889SApple OSS Distributions .block_size = 1, \
222*43a90889SApple OSS Distributions .init = ccmode_cfb8_init, \
223*43a90889SApple OSS Distributions .cfb8 = ccmode_cfb8_encrypt, \
224*43a90889SApple OSS Distributions .custom = (ECB) \
225*43a90889SApple OSS Distributions }
226*43a90889SApple OSS Distributions 
227*43a90889SApple OSS Distributions struct _ccmode_cfb8_key {
228*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
229*43a90889SApple OSS Distributions 	cc_unit u[];
230*43a90889SApple OSS Distributions };
231*43a90889SApple OSS Distributions 
232*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_CFB8_KEY.
233*43a90889SApple OSS Distributions  *  {
234*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
235*43a90889SApple OSS Distributions  *   ccn_unit pad[ecb->block_size / CCN_UNIT_SIZE];
236*43a90889SApple OSS Distributions  *   ccn_unit iv[ecb->block_size / CCN_UNIT_SIZE];
237*43a90889SApple OSS Distributions  *   ccn_unit ecb_key[ecb->n]
238*43a90889SApple OSS Distributions  *  } */
239*43a90889SApple OSS Distributions #define _CCMODE_CFB8_KEY(K) ((struct _ccmode_cfb8_key *)(K))
240*43a90889SApple OSS Distributions #define CCMODE_CFB8_KEY_ECB(K) (_CCMODE_CFB8_KEY(K)->ecb)
241*43a90889SApple OSS Distributions #define CCMODE_CFB8_KEY_PAD(K) (&_CCMODE_CFB8_KEY(K)->u[0])
242*43a90889SApple OSS Distributions #define CCMODE_CFB8_KEY_IV(K) (&_CCMODE_CFB8_KEY(K)->u[ccn_nof_size(CCMODE_CFB8_KEY_ECB(K)->block_size)])
243*43a90889SApple OSS Distributions #define CCMODE_CFB8_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_CFB8_KEY(K)->u[2 * ccn_nof_size(CCMODE_CFB8_KEY_ECB(K)->block_size)])
244*43a90889SApple OSS Distributions 
245*43a90889SApple OSS Distributions int ccmode_ctr_init(const struct ccmode_ctr *ctr, ccctr_ctx *ctx,
246*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey, const void *iv);
247*43a90889SApple OSS Distributions int ccmode_ctr_setctr(const struct ccmode_ctr *mode, ccctr_ctx *ctx, const void *ctr);
248*43a90889SApple OSS Distributions int ccmode_ctr_crypt(ccctr_ctx *ctx, size_t nbytes,
249*43a90889SApple OSS Distributions     const void *in, void *out);
250*43a90889SApple OSS Distributions 
251*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_ctr object for decryption. */
252*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CTR_CRYPT(ECB_ENCRYPT) { \
253*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_ctr_key)) + 2 * ccn_sizeof_size((ECB_ENCRYPT)->block_size) + ccn_sizeof_size((ECB_ENCRYPT)->size), \
254*43a90889SApple OSS Distributions .block_size = 1, \
255*43a90889SApple OSS Distributions .ecb_block_size = (ECB_ENCRYPT)->block_size, \
256*43a90889SApple OSS Distributions .init = ccmode_ctr_init, \
257*43a90889SApple OSS Distributions .setctr = ccmode_ctr_setctr, \
258*43a90889SApple OSS Distributions .ctr = ccmode_ctr_crypt, \
259*43a90889SApple OSS Distributions .custom = (ECB_ENCRYPT) \
260*43a90889SApple OSS Distributions }
261*43a90889SApple OSS Distributions 
262*43a90889SApple OSS Distributions struct _ccmode_ctr_key {
263*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
264*43a90889SApple OSS Distributions 	size_t pad_offset;
265*43a90889SApple OSS Distributions 	cc_unit u[];
266*43a90889SApple OSS Distributions };
267*43a90889SApple OSS Distributions 
268*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_CTR_KEY.
269*43a90889SApple OSS Distributions  *  {
270*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
271*43a90889SApple OSS Distributions  *   cc_size pad_offset;
272*43a90889SApple OSS Distributions  *   ccn_unit pad[ecb->block_size / CCN_UNIT_SIZE];
273*43a90889SApple OSS Distributions  *   ccn_unit ctr[ecb->block_size / CCN_UNIT_SIZE];
274*43a90889SApple OSS Distributions  *   ccn_unit ecb_key[ecb->n]
275*43a90889SApple OSS Distributions  *  } */
276*43a90889SApple OSS Distributions #define _CCMODE_CTR_KEY(K) ((struct _ccmode_ctr_key *)(K))
277*43a90889SApple OSS Distributions #define CCMODE_CTR_KEY_ECB(K) (_CCMODE_CTR_KEY(K)->ecb)
278*43a90889SApple OSS Distributions #define CCMODE_CTR_KEY_PAD_OFFSET(K) (_CCMODE_CTR_KEY(K)->pad_offset)
279*43a90889SApple OSS Distributions #define CCMODE_CTR_KEY_PAD(K) (&_CCMODE_CTR_KEY(K)->u[0])
280*43a90889SApple OSS Distributions #define CCMODE_CTR_KEY_CTR(K) (&_CCMODE_CTR_KEY(K)->u[ccn_nof_size(CCMODE_CTR_KEY_ECB(K)->block_size)])
281*43a90889SApple OSS Distributions #define CCMODE_CTR_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_CTR_KEY(K)->u[2 * ccn_nof_size(CCMODE_CTR_KEY_ECB(K)->block_size)])
282*43a90889SApple OSS Distributions 
283*43a90889SApple OSS Distributions CC_INLINE int
ccctr_setctr(const struct ccmode_ctr * mode,ccctr_ctx * ctx,const void * ctr)284*43a90889SApple OSS Distributions ccctr_setctr(const struct ccmode_ctr *mode, ccctr_ctx *ctx, const void *ctr)
285*43a90889SApple OSS Distributions {
286*43a90889SApple OSS Distributions 	return mode->setctr(mode, ctx, ctr);
287*43a90889SApple OSS Distributions }
288*43a90889SApple OSS Distributions 
289*43a90889SApple OSS Distributions int ccmode_ofb_init(const struct ccmode_ofb *ofb, ccofb_ctx *ctx,
290*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey,
291*43a90889SApple OSS Distributions     const void *iv);
292*43a90889SApple OSS Distributions int ccmode_ofb_crypt(ccofb_ctx *ctx, size_t nbytes,
293*43a90889SApple OSS Distributions     const void *in, void *out);
294*43a90889SApple OSS Distributions 
295*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_ofb object. */
296*43a90889SApple OSS Distributions #define CCMODE_FACTORY_OFB_CRYPT(ECB) { \
297*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_ofb_key)) + ccn_sizeof_size((ECB)->block_size) + ccn_sizeof_size((ECB)->size), \
298*43a90889SApple OSS Distributions .block_size = 1, \
299*43a90889SApple OSS Distributions .init = ccmode_ofb_init, \
300*43a90889SApple OSS Distributions .ofb = ccmode_ofb_crypt, \
301*43a90889SApple OSS Distributions .custom = (ECB) \
302*43a90889SApple OSS Distributions }
303*43a90889SApple OSS Distributions 
304*43a90889SApple OSS Distributions struct _ccmode_ofb_key {
305*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
306*43a90889SApple OSS Distributions 	size_t pad_len;
307*43a90889SApple OSS Distributions 	cc_unit u[];
308*43a90889SApple OSS Distributions };
309*43a90889SApple OSS Distributions 
310*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_OFB_KEY.
311*43a90889SApple OSS Distributions  *  {
312*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
313*43a90889SApple OSS Distributions  *   cc_size pad_len;
314*43a90889SApple OSS Distributions  *   ccn_unit iv[ecb->block_size / CCN_UNIT_SIZE];
315*43a90889SApple OSS Distributions  *   ccn_unit ecb_key[ecb->n]
316*43a90889SApple OSS Distributions  *  } */
317*43a90889SApple OSS Distributions #define _CCMODE_OFB_KEY(K) ((struct _ccmode_ofb_key *)(K))
318*43a90889SApple OSS Distributions #define CCMODE_OFB_KEY_ECB(K) (_CCMODE_OFB_KEY(K)->ecb)
319*43a90889SApple OSS Distributions #define CCMODE_OFB_KEY_PAD_LEN(K) (_CCMODE_OFB_KEY(K)->pad_len)
320*43a90889SApple OSS Distributions #define CCMODE_OFB_KEY_IV(K) (&_CCMODE_OFB_KEY(K)->u[0])
321*43a90889SApple OSS Distributions #define CCMODE_OFB_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_OFB_KEY(K)->u[ccn_nof_size(CCMODE_OFB_KEY_ECB(K)->block_size)])
322*43a90889SApple OSS Distributions 
323*43a90889SApple OSS Distributions 
324*43a90889SApple OSS Distributions int ccmode_xts_init(const struct ccmode_xts *xts, ccxts_ctx *ctx,
325*43a90889SApple OSS Distributions     size_t key_nbytes, const void *data_key,
326*43a90889SApple OSS Distributions     const void *tweak_key);
327*43a90889SApple OSS Distributions void ccmode_xts_key_sched(const struct ccmode_xts *xts, ccxts_ctx *ctx,
328*43a90889SApple OSS Distributions     size_t key_nbytes, const void *data_key,
329*43a90889SApple OSS Distributions     const void *tweak_key);
330*43a90889SApple OSS Distributions void *ccmode_xts_crypt(const ccxts_ctx *ctx, ccxts_tweak *tweak,
331*43a90889SApple OSS Distributions     size_t nblocks, const void *in, void *out);
332*43a90889SApple OSS Distributions int ccmode_xts_set_tweak(const ccxts_ctx *ctx, ccxts_tweak *tweak,
333*43a90889SApple OSS Distributions     const void *iv);
334*43a90889SApple OSS Distributions 
335*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_xts object for decryption. */
336*43a90889SApple OSS Distributions #define CCMODE_FACTORY_XTS_DECRYPT(ECB, ECB_ENCRYPT) { \
337*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_xts_key)) + 2 * ccn_sizeof_size((ECB)->size), \
338*43a90889SApple OSS Distributions .tweak_size = ccn_sizeof_size(sizeof(struct _ccmode_xts_tweak)) + ccn_sizeof_size(ecb->block_size), \
339*43a90889SApple OSS Distributions .block_size = ecb->block_size, \
340*43a90889SApple OSS Distributions .init = ccmode_xts_init, \
341*43a90889SApple OSS Distributions .key_sched = ccmode_xts_key_sched, \
342*43a90889SApple OSS Distributions .set_tweak = ccmode_xts_set_tweak, \
343*43a90889SApple OSS Distributions .xts = ccmode_xts_crypt, \
344*43a90889SApple OSS Distributions .custom = (ECB), \
345*43a90889SApple OSS Distributions .custom1 = (ECB_ENCRYPT), \
346*43a90889SApple OSS Distributions .impl = CC_IMPL_AES_XTS_GENERIC, \
347*43a90889SApple OSS Distributions }
348*43a90889SApple OSS Distributions 
349*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_xts object for encryption. */
350*43a90889SApple OSS Distributions #define CCMODE_FACTORY_XTS_ENCRYPT(ECB, ECB_ENCRYPT) { \
351*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_xts_key)) + 2 * ccn_sizeof_size((ECB)->size), \
352*43a90889SApple OSS Distributions .tweak_size = ccn_sizeof_size(sizeof(struct _ccmode_xts_tweak)) + ccn_sizeof_size(ecb->block_size), \
353*43a90889SApple OSS Distributions .block_size = ecb->block_size, \
354*43a90889SApple OSS Distributions .init = ccmode_xts_init, \
355*43a90889SApple OSS Distributions .key_sched = ccmode_xts_key_sched, \
356*43a90889SApple OSS Distributions .set_tweak = ccmode_xts_set_tweak, \
357*43a90889SApple OSS Distributions .xts = ccmode_xts_crypt, \
358*43a90889SApple OSS Distributions .custom = (ECB), \
359*43a90889SApple OSS Distributions .custom1 = (ECB_ENCRYPT), \
360*43a90889SApple OSS Distributions .impl = CC_IMPL_AES_XTS_GENERIC, \
361*43a90889SApple OSS Distributions }
362*43a90889SApple OSS Distributions 
363*43a90889SApple OSS Distributions struct _ccmode_xts_key {
364*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
365*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb_encrypt;
366*43a90889SApple OSS Distributions 	cc_unit u[];
367*43a90889SApple OSS Distributions };
368*43a90889SApple OSS Distributions 
369*43a90889SApple OSS Distributions struct _ccmode_xts_tweak {
370*43a90889SApple OSS Distributions 	// FIPS requires that for XTS that no more that 2^20 AES blocks may be processed for any given
371*43a90889SApple OSS Distributions 	// Key, Tweak Key, and tweak combination
372*43a90889SApple OSS Distributions 	// the bytes_processed field in the context will accumuate the number of blocks processed and
373*43a90889SApple OSS Distributions 	// will fail the encrypt/decrypt if the size is violated.  This counter will be reset to 0
374*43a90889SApple OSS Distributions 	// when set_tweak is called.
375*43a90889SApple OSS Distributions 	size_t  blocks_processed;
376*43a90889SApple OSS Distributions 	cc_unit u[];
377*43a90889SApple OSS Distributions };
378*43a90889SApple OSS Distributions 
379*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_XTS_KEY.
380*43a90889SApple OSS Distributions  *  {
381*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
382*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb_encrypt
383*43a90889SApple OSS Distributions  *   ccn_unit data_key[ecb->size]
384*43a90889SApple OSS Distributions  *   ccn_unit tweak_key[ecb_encrypt->size]
385*43a90889SApple OSS Distributions  *  } */
386*43a90889SApple OSS Distributions #define _CCMODE_XTS_KEY(K) ((struct _ccmode_xts_key *)(K))
387*43a90889SApple OSS Distributions #define CCMODE_XTS_KEY_ECB(K) (_CCMODE_XTS_KEY(K)->ecb)
388*43a90889SApple OSS Distributions #define CCMODE_XTS_KEY_ECB_ENCRYPT(K) (_CCMODE_XTS_KEY(K)->ecb_encrypt)
389*43a90889SApple OSS Distributions #define CCMODE_XTS_KEY_DATA_KEY(K) ((ccecb_ctx *)&_CCMODE_XTS_KEY(K)->u[0])
390*43a90889SApple OSS Distributions #define CCMODE_XTS_KEY_TWEAK_KEY(K) ((ccecb_ctx *)&_CCMODE_XTS_KEY(K)->u[ccn_nof_size(CCMODE_XTS_KEY_ECB(K)->size)])
391*43a90889SApple OSS Distributions 
392*43a90889SApple OSS Distributions CC_INLINE
393*43a90889SApple OSS Distributions const struct ccmode_ecb *
ccmode_xts_key_ecb(const ccxts_ctx * K)394*43a90889SApple OSS Distributions ccmode_xts_key_ecb(const ccxts_ctx *K)
395*43a90889SApple OSS Distributions {
396*43a90889SApple OSS Distributions 	return ((const struct _ccmode_xts_key *)K)->ecb;
397*43a90889SApple OSS Distributions }
398*43a90889SApple OSS Distributions 
399*43a90889SApple OSS Distributions CC_INLINE
400*43a90889SApple OSS Distributions const struct ccmode_ecb *
ccmode_xts_key_ecb_encrypt(const ccxts_ctx * K)401*43a90889SApple OSS Distributions ccmode_xts_key_ecb_encrypt(const ccxts_ctx *K)
402*43a90889SApple OSS Distributions {
403*43a90889SApple OSS Distributions 	return ((const struct _ccmode_xts_key *)K)->ecb_encrypt;
404*43a90889SApple OSS Distributions }
405*43a90889SApple OSS Distributions 
406*43a90889SApple OSS Distributions CC_INLINE
407*43a90889SApple OSS Distributions const ccecb_ctx *
ccmode_xts_key_data_key(const ccxts_ctx * K)408*43a90889SApple OSS Distributions ccmode_xts_key_data_key(const ccxts_ctx *K)
409*43a90889SApple OSS Distributions {
410*43a90889SApple OSS Distributions 	return (const ccecb_ctx *)&((const struct _ccmode_xts_key *)K)->u[0];
411*43a90889SApple OSS Distributions }
412*43a90889SApple OSS Distributions 
413*43a90889SApple OSS Distributions CC_INLINE
414*43a90889SApple OSS Distributions const ccecb_ctx *
ccmode_xts_key_tweak_key(const ccxts_ctx * K)415*43a90889SApple OSS Distributions ccmode_xts_key_tweak_key(const ccxts_ctx *K)
416*43a90889SApple OSS Distributions {
417*43a90889SApple OSS Distributions 	return (const ccecb_ctx *)&((const struct _ccmode_xts_key *)K)->u[ccn_nof_size(ccmode_xts_key_ecb(K)->size)];
418*43a90889SApple OSS Distributions }
419*43a90889SApple OSS Distributions 
420*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_XTS_TWEAK.
421*43a90889SApple OSS Distributions  *  {
422*43a90889SApple OSS Distributions  *  size_t  blocks_processed;
423*43a90889SApple OSS Distributions  *  uint8_t value[16];
424*43a90889SApple OSS Distributions  *  } */
425*43a90889SApple OSS Distributions #define _CCMODE_XTS_TWEAK(T) ((struct _ccmode_xts_tweak *)(T))
426*43a90889SApple OSS Distributions #define CCMODE_XTS_TWEAK_BLOCK_PROCESSED(T)(_CCMODE_XTS_TWEAK(T)->blocks_processed)
427*43a90889SApple OSS Distributions #define CCMODE_XTS_TWEAK_VALUE(T) (_CCMODE_XTS_TWEAK(T)->u)
428*43a90889SApple OSS Distributions 
429*43a90889SApple OSS Distributions #define CCMODE_STATE_INIT 2     //first call to init
430*43a90889SApple OSS Distributions #define CCMODE_STATE_IV_START 3 //first call to set_iv
431*43a90889SApple OSS Distributions 
432*43a90889SApple OSS Distributions #define CCMODE_STATE_IV_CONT CCMODE_STATE_IV_START
433*43a90889SApple OSS Distributions 
434*43a90889SApple OSS Distributions #define CCMODE_STATE_AAD     4
435*43a90889SApple OSS Distributions #define CCMODE_STATE_TEXT    5
436*43a90889SApple OSS Distributions #define CCMODE_STATE_NONCE   6
437*43a90889SApple OSS Distributions #define CCMODE_STATE_NONCE_NOADD 7
438*43a90889SApple OSS Distributions 
439*43a90889SApple OSS Distributions #define CCMODE_CCM_STATE_IV 1
440*43a90889SApple OSS Distributions #define CCMODE_STATE_INVALID 255
441*43a90889SApple OSS Distributions 
442*43a90889SApple OSS Distributions /* CCM (only NIST approved with AES) */
443*43a90889SApple OSS Distributions int ccmode_ccm_init(const struct ccmode_ccm *ccm, ccccm_ctx *ctx,
444*43a90889SApple OSS Distributions     size_t rawkey_len, const void *rawkey);
445*43a90889SApple OSS Distributions int ccmode_ccm_set_iv(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nonce_len, const void *nonce,
446*43a90889SApple OSS Distributions     size_t mac_size, size_t auth_len, size_t data_len);
447*43a90889SApple OSS Distributions /* internal function */
448*43a90889SApple OSS Distributions void ccmode_ccm_macdata(ccccm_ctx *key, ccccm_nonce *nonce_ctx, unsigned new_block, size_t nbytes, const void *in);
449*43a90889SApple OSS Distributions /* api function - disallows only mac'd data after data to encrypt was sent */
450*43a90889SApple OSS Distributions int ccmode_ccm_cbcmac(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in);
451*43a90889SApple OSS Distributions /* internal function */
452*43a90889SApple OSS Distributions void ccmode_ccm_crypt(ccccm_ctx *key, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in, void *out);
453*43a90889SApple OSS Distributions int ccmode_ccm_decrypt(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in,
454*43a90889SApple OSS Distributions     void *out);
455*43a90889SApple OSS Distributions int ccmode_ccm_encrypt(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in,
456*43a90889SApple OSS Distributions     void *out);
457*43a90889SApple OSS Distributions int ccmode_ccm_finalize(ccccm_ctx *key, ccccm_nonce *nonce_ctx, void *mac);
458*43a90889SApple OSS Distributions int ccmode_ccm_finalize_and_verify(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, void *mac);
459*43a90889SApple OSS Distributions int ccmode_ccm_reset(ccccm_ctx *key, ccccm_nonce *nonce_ctx);
460*43a90889SApple OSS Distributions 
461*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_ccm object for decryption. */
462*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CCM_DECRYPT(ECB_ENCRYPT) { \
463*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_ccm_key)) + ccn_sizeof_size((ECB_ENCRYPT)->block_size) + ccn_sizeof_size((ECB_ENCRYPT)->size), \
464*43a90889SApple OSS Distributions .nonce_size = ccn_sizeof_size(sizeof(struct _ccmode_ccm_nonce)), \
465*43a90889SApple OSS Distributions .block_size = 1, \
466*43a90889SApple OSS Distributions .init = ccmode_ccm_init, \
467*43a90889SApple OSS Distributions .set_iv = ccmode_ccm_set_iv, \
468*43a90889SApple OSS Distributions .cbcmac = ccmode_ccm_cbcmac, \
469*43a90889SApple OSS Distributions .ccm = ccmode_ccm_decrypt, \
470*43a90889SApple OSS Distributions .finalize = ccmode_ccm_finalize, \
471*43a90889SApple OSS Distributions .reset = ccmode_ccm_reset, \
472*43a90889SApple OSS Distributions .custom = (ECB_ENCRYPT), \
473*43a90889SApple OSS Distributions .enc_mode = false, \
474*43a90889SApple OSS Distributions }
475*43a90889SApple OSS Distributions 
476*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_ccm object for encryption. */
477*43a90889SApple OSS Distributions #define CCMODE_FACTORY_CCM_ENCRYPT(ECB_ENCRYPT) { \
478*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_ccm_key)) + ccn_sizeof_size((ECB_ENCRYPT)->block_size) + ccn_sizeof_size((ECB_ENCRYPT)->size), \
479*43a90889SApple OSS Distributions .nonce_size = ccn_sizeof_size(sizeof(struct _ccmode_ccm_nonce)), \
480*43a90889SApple OSS Distributions .block_size = 1, \
481*43a90889SApple OSS Distributions .init = ccmode_ccm_init, \
482*43a90889SApple OSS Distributions .set_iv = ccmode_ccm_set_iv, \
483*43a90889SApple OSS Distributions .cbcmac = ccmode_ccm_cbcmac, \
484*43a90889SApple OSS Distributions .ccm = ccmode_ccm_encrypt, \
485*43a90889SApple OSS Distributions .finalize = ccmode_ccm_finalize, \
486*43a90889SApple OSS Distributions .reset = ccmode_ccm_reset, \
487*43a90889SApple OSS Distributions .custom = (ECB_ENCRYPT), \
488*43a90889SApple OSS Distributions .enc_mode = true, \
489*43a90889SApple OSS Distributions }
490*43a90889SApple OSS Distributions 
491*43a90889SApple OSS Distributions struct _ccmode_ccm_key {
492*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
493*43a90889SApple OSS Distributions 	cc_unit u[];
494*43a90889SApple OSS Distributions };
495*43a90889SApple OSS Distributions 
496*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_CCM_KEY. */
497*43a90889SApple OSS Distributions #define _CCMODE_CCM_KEY(K) ((struct _ccmode_ccm_key *)(K))
498*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_ECB(K) (_CCMODE_CCM_KEY(K)->ecb)
499*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_CCM_KEY(K)->u[0])
500*43a90889SApple OSS Distributions 
501*43a90889SApple OSS Distributions #define _CCMODE_CCM_NONCE(N) ((struct _ccmode_ccm_nonce *)(N))
502*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_MAC(N) (_CCMODE_CCM_NONCE(N)->MAC)
503*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_A_I(N) (_CCMODE_CCM_NONCE(N)->A_i)
504*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_B_I(N) (_CCMODE_CCM_NONCE(N)->B_i)
505*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_PAD_LEN(N) (_CCMODE_CCM_NONCE(N)->buflen)
506*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_PAD(N) (_CCMODE_CCM_NONCE(N)->buf)
507*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_MAC_LEN(N) (_CCMODE_CCM_NONCE(N)->mac_size)
508*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_NONCE_LEN(N) (_CCMODE_CCM_NONCE(N)->nonce_size)
509*43a90889SApple OSS Distributions #define CCMODE_CCM_KEY_AUTH_LEN(N) (_CCMODE_CCM_NONCE(N)->b_i_len)
510*43a90889SApple OSS Distributions 
511*43a90889SApple OSS Distributions int ccmode_omac_decrypt(ccomac_ctx *ctx, size_t nblocks,
512*43a90889SApple OSS Distributions     const void *tweak, const void *in, void *out);
513*43a90889SApple OSS Distributions int ccmode_omac_encrypt(ccomac_ctx *ctx, size_t nblocks,
514*43a90889SApple OSS Distributions     const void *tweak, const void *in, void *out);
515*43a90889SApple OSS Distributions 
516*43a90889SApple OSS Distributions /* Create a omac key from a omac mode object.  The tweak_len here
517*43a90889SApple OSS Distributions  *  determines how long the tweak is in bytes, for each subsequent call to
518*43a90889SApple OSS Distributions  *  ccmode_omac->omac().
519*43a90889SApple OSS Distributions  *  key must point to at least sizeof(CCMODE_OMAC_KEY(ecb)) bytes of free
520*43a90889SApple OSS Distributions  *  storage. */
521*43a90889SApple OSS Distributions int ccmode_omac_init(const struct ccmode_omac *omac, ccomac_ctx *ctx,
522*43a90889SApple OSS Distributions     size_t tweak_len, size_t rawkey_len,
523*43a90889SApple OSS Distributions     const void *rawkey);
524*43a90889SApple OSS Distributions 
525*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_omac object for decryption. */
526*43a90889SApple OSS Distributions #define CCMODE_FACTORY_OMAC_DECRYPT(ECB) { \
527*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_omac_key)) + 2 * ccn_sizeof_size((ECB)->size), \
528*43a90889SApple OSS Distributions .block_size = (ECB)->block_size, \
529*43a90889SApple OSS Distributions .init = ccmode_omac_init, \
530*43a90889SApple OSS Distributions .omac = ccmode_omac_decrypt, \
531*43a90889SApple OSS Distributions .custom = (ECB) \
532*43a90889SApple OSS Distributions }
533*43a90889SApple OSS Distributions 
534*43a90889SApple OSS Distributions /* Use this to statically initialize a ccmode_omac object for encryption. */
535*43a90889SApple OSS Distributions #define CCMODE_FACTORY_OMAC_ENCRYPT(ECB) { \
536*43a90889SApple OSS Distributions .size = ccn_sizeof_size(sizeof(struct _ccmode_omac_key)) + 2 * ccn_sizeof_size((ECB)->size), \
537*43a90889SApple OSS Distributions .block_size = (ECB)->block_size, \
538*43a90889SApple OSS Distributions .init = ccmode_omac_init, \
539*43a90889SApple OSS Distributions .omac = ccmode_omac_encrypt, \
540*43a90889SApple OSS Distributions .custom = (ECB) \
541*43a90889SApple OSS Distributions }
542*43a90889SApple OSS Distributions 
543*43a90889SApple OSS Distributions struct _ccmode_omac_key {
544*43a90889SApple OSS Distributions 	const struct ccmode_ecb *ecb;
545*43a90889SApple OSS Distributions 	size_t tweak_len;
546*43a90889SApple OSS Distributions 	cc_unit u[];
547*43a90889SApple OSS Distributions };
548*43a90889SApple OSS Distributions 
549*43a90889SApple OSS Distributions /* Macros for accessing a CCMODE_OMAC_KEY.
550*43a90889SApple OSS Distributions  *  {
551*43a90889SApple OSS Distributions  *   const struct ccmode_ecb *ecb
552*43a90889SApple OSS Distributions  *   cc_size tweak_size;
553*43a90889SApple OSS Distributions  *   ccn_unit ecb_key1[ecb->n]
554*43a90889SApple OSS Distributions  *   ccn_unit ecb_key2[ecb->n]
555*43a90889SApple OSS Distributions  *  } */
556*43a90889SApple OSS Distributions #define _CCMODE_OMAC_KEY(K) ((struct _ccmode_omac_key *)(K))
557*43a90889SApple OSS Distributions #define CCMODE_OMAC_KEY_ECB(K) (_CCMODE_OMAC_KEY(K)->ecb)
558*43a90889SApple OSS Distributions #define CCMODE_OMAC_KEY_TWEAK_LEN(K) (_CCMODE_OMAC_KEY(K)->tweak_len)
559*43a90889SApple OSS Distributions #define CCMODE_OMAC_KEY_ECB_KEY(K) ((ccecb_ctx *)&_CCMODE_OMAC_KEY(K)->u[0])
560*43a90889SApple OSS Distributions 
561*43a90889SApple OSS Distributions #endif /* _CORECRYPTO_CCMODE_INTERNAL_H_ */
562