]> git.saurik.com Git - apple/xnu.git/blob - EXTERNAL_HEADERS/corecrypto/ccmode_impl.h
ce1d1e1145728ea9fb18a569cdf8113166fd2eb7
[apple/xnu.git] / EXTERNAL_HEADERS / corecrypto / ccmode_impl.h
1 /*
2 * ccmode_impl.h
3 * corecrypto
4 *
5 * Created by James Murphy on 12/9/11.
6 * Copyright (c) 2011 Apple Inc. All rights reserved.
7 *
8 */
9
10 #ifndef _CORECRYPTO_CCMODE_IMPL_H_
11 #define _CORECRYPTO_CCMODE_IMPL_H_
12
13 #include <corecrypto/cc.h>
14
15 /* ECB mode. */
16 cc_aligned_struct(16) ccecb_ctx;
17
18
19 /* Actual symmetric algorithm implementation should provide you one of these. */
20 struct ccmode_ecb {
21 size_t size; /* first argument to ccecb_ctx_decl(). */
22 unsigned long block_size;
23 void (*init)(const struct ccmode_ecb *ecb, ccecb_ctx *ctx,
24 size_t key_len, const void *key);
25 void (*ecb)(const ccecb_ctx *ctx, unsigned long nblocks, const void *in,
26 void *out);
27 };
28
29 /* CBC mode. */
30 cc_aligned_struct(16) cccbc_ctx;
31 cc_aligned_struct(16) cccbc_iv;
32
33 struct ccmode_cbc {
34 size_t size; /* first argument to cccbc_ctx_decl(). */
35 unsigned long block_size;
36 void (*init)(const struct ccmode_cbc *cbc, cccbc_ctx *ctx,
37 size_t key_len, const void *key);
38 /* cbc encrypt or decrypt nblocks from in to out, iv will be used and updated. */
39 void (*cbc)(const cccbc_ctx *ctx, cccbc_iv *iv,
40 unsigned long nblocks, const void *in, void *out);
41 const void *custom;
42 };
43
44 /* CFB mode. */
45 cc_aligned_struct(16) cccfb_ctx;
46
47 struct ccmode_cfb {
48 size_t size; /* first argument to cccfb_ctx_decl(). */
49 unsigned long block_size;
50 void (*init)(const struct ccmode_cfb *cfb, cccfb_ctx *ctx,
51 size_t key_len, const void *key, const void *iv);
52 void (*cfb)(cccfb_ctx *ctx, size_t nbytes, const void *in, void *out);
53 const void *custom;
54 };
55
56 /* CFB8 mode. */
57
58 cc_aligned_struct(16) cccfb8_ctx;
59
60 struct ccmode_cfb8 {
61 size_t size; /* first argument to cccfb8_ctx_decl(). */
62 unsigned long block_size;
63 void (*init)(const struct ccmode_cfb8 *cfb8, cccfb8_ctx *ctx,
64 size_t key_len, const void *key, const void *iv);
65 void (*cfb8)(cccfb8_ctx *ctx, size_t nbytes, const void *in, void *out);
66 const void *custom;
67 };
68
69 /* CTR mode. */
70
71 cc_aligned_struct(16) ccctr_ctx;
72
73 struct ccmode_ctr {
74 size_t size; /* first argument to ccctr_ctx_decl(). */
75 unsigned long block_size;
76 void (*init)(const struct ccmode_ctr *ctr, ccctr_ctx *ctx,
77 size_t key_len, const void *key, const void *iv);
78 void (*ctr)(ccctr_ctx *ctx, size_t nbytes, const void *in, void *out);
79 const void *custom;
80 };
81
82 /* OFB mode. */
83
84 cc_aligned_struct(16) ccofb_ctx;
85
86 struct ccmode_ofb {
87 size_t size; /* first argument to ccofb_ctx_decl(). */
88 unsigned long block_size;
89 void (*init)(const struct ccmode_ofb *ofb, ccofb_ctx *ctx,
90 size_t key_len, const void *key, const void *iv);
91 void (*ofb)(ccofb_ctx *ctx, size_t nbytes, const void *in, void *out);
92 const void *custom;
93 };
94
95 /* XTS mode. */
96
97 cc_aligned_struct(16) ccxts_ctx;
98 cc_aligned_struct(16) ccxts_tweak;
99
100 struct ccmode_xts {
101 size_t size; /* first argument to ccxts_ctx_decl(). */
102 size_t tweak_size; /* first argument to ccxts_tweak_decl(). */
103 unsigned long block_size;
104
105 /* Create a xts key from a xts mode object. The tweak_len here
106 determines how long the tweak is in bytes, for each subsequent call to
107 ccmode_xts->xts().
108 key must point to at least 'size' cc_units of free storage.
109 tweak_key must point to at least 'tweak_size' cc_units of free storage. */
110 void (*init)(const struct ccmode_xts *xts, ccxts_ctx *ctx,
111 size_t key_len, const void *key, const void *tweak_key);
112
113 /* Set the tweak (sector number), the block within the sector zero. */
114 void (*set_tweak)(const ccxts_ctx *ctx, ccxts_tweak *tweak, const void *iv);
115
116 /* Encrypt blocks for a sector, clients must call set_tweak before calling
117 this function. Return a pointer to the tweak buffer */
118 void *(*xts)(const ccxts_ctx *ctx, ccxts_tweak *tweak,
119 unsigned long nblocks, const void *in, void *out);
120
121 const void *custom;
122 const void *custom1;
123 };
124
125 /* GCM mode. */
126
127 cc_aligned_struct(16) ccgcm_ctx;
128
129 struct ccmode_gcm {
130 size_t size; /* first argument to ccgcm_ctx_decl(). */
131 unsigned long block_size;
132 void (*init)(const struct ccmode_gcm *gcm, ccgcm_ctx *ctx,
133 size_t key_len, const void *key);
134 void (*set_iv)(ccgcm_ctx *ctx, size_t iv_size, const void *iv);
135 void (*gmac)(ccgcm_ctx *ctx, size_t nbytes, const void *in); // could just be gcm with NULL out
136 void (*gcm)(ccgcm_ctx *ctx, size_t nbytes, const void *in, void *out);
137 void (*finalize)(ccgcm_ctx *key, size_t tag_size, void *tag);
138 void (*reset)(ccgcm_ctx *ctx);
139 const void *custom;
140 };
141
142 /* GCM mode. */
143
144 cc_aligned_struct(16) ccccm_ctx;
145 cc_aligned_struct(16) ccccm_nonce;
146
147 struct ccmode_ccm {
148 size_t size; /* first argument to ccccm_ctx_decl(). */
149 size_t nonce_size; /* first argument to ccccm_nonce_decl(). */
150 unsigned long block_size;
151 void (*init)(const struct ccmode_ccm *ccm, ccccm_ctx *ctx,
152 size_t key_len, const void *key);
153 void (*set_iv)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nonce_len, const void *nonce,
154 size_t mac_size, size_t auth_len, size_t data_len);
155 void (*cbcmac)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in); // could just be ccm with NULL out
156 void (*ccm)(ccccm_ctx *ctx, ccccm_nonce *nonce_ctx, size_t nbytes, const void *in, void *out);
157 void (*finalize)(ccccm_ctx *key, ccccm_nonce *nonce_ctx, void *mac);
158 void (*reset)(ccccm_ctx *key, ccccm_nonce *nonce_ctx);
159 const void *custom;
160 };
161
162
163 /* OMAC mode. */
164
165 cc_aligned_struct(16) ccomac_ctx;
166
167 struct ccmode_omac {
168 size_t size; /* first argument to ccomac_ctx_decl(). */
169 unsigned long block_size;
170 void (*init)(const struct ccmode_omac *omac, ccomac_ctx *ctx,
171 size_t tweak_len, size_t key_len, const void *key);
172 int (*omac)(ccomac_ctx *ctx, unsigned long nblocks,
173 const void *tweak, const void *in, void *out);
174 const void *custom;
175 };
176
177 #endif /* _CORECRYPTO_CCMODE_IMPL_H_ */