]> git.saurik.com Git - apple/xnu.git/blob - EXTERNAL_HEADERS/corecrypto/ccmode_impl.h
3e35f548ea00d788aadc965a970462657c967596
[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 unsigned long 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 unsigned long 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, unsigned long nblocks,
40 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 unsigned long key_len, const void *key,
52 const void *iv);
53 void (*cfb)(cccfb_ctx *ctx, unsigned long nblocks,
54 const void *in, void *out);
55 const void *custom;
56 };
57
58 /* CFB8 mode. */
59
60 cc_aligned_struct(16) cccfb8_ctx;
61
62 struct ccmode_cfb8 {
63 size_t size; /* first argument to cccfb8_ctx_decl(). */
64 unsigned long block_size;
65 void (*init)(const struct ccmode_cfb8 *cfb8, cccfb8_ctx *ctx,
66 unsigned long key_len, const void *key,
67 const void *iv);
68 void (*cfb8)(cccfb8_ctx *ctx, unsigned long nbytes,
69 const void *in, void *out);
70 const void *custom;
71 };
72
73 /* CTR mode. */
74
75 cc_aligned_struct(16) ccctr_ctx;
76
77 struct ccmode_ctr {
78 size_t size; /* first argument to ccctr_ctx_decl(). */
79 unsigned long block_size;
80 void (*init)(const struct ccmode_ctr *ctr, ccctr_ctx *ctx,
81 unsigned long key_len, const void *key,
82 const void *iv);
83 void (*ctr)(ccctr_ctx *ctx, unsigned long nblocks,
84 const void *in, void *out);
85 const void *custom;
86 };
87
88 /* OFB mode. */
89
90 cc_aligned_struct(16) ccofb_ctx;
91
92 struct ccmode_ofb {
93 size_t size; /* first argument to ccofb_ctx_decl(). */
94 unsigned long block_size;
95 void (*init)(const struct ccmode_ofb *ofb, ccofb_ctx *ctx,
96 unsigned long key_len, const void *key,
97 const void *iv);
98 void (*ofb)(ccofb_ctx *ctx, unsigned long nblocks,
99 const void *in, void *out);
100 const void *custom;
101 };
102
103 /* XTS mode. */
104
105 cc_aligned_struct(16) ccxts_ctx;
106 cc_aligned_struct(16) ccxts_tweak;
107
108 struct ccmode_xts {
109 size_t size; /* first argument to ccxts_ctx_decl(). */
110 size_t tweak_size; /* first argument to ccxts_tweak_decl(). */
111 unsigned long block_size;
112
113 /* Create a xts key from a xts mode object. The tweak_len here
114 determines how long the tweak is in bytes, for each subsequent call to
115 ccmode_xts->xts().
116 key must point to at least 'size' cc_units of free storage.
117 tweak_key must point to at least 'tweak_size' cc_units of free storage. */
118 void (*init)(const struct ccmode_xts *xts, ccxts_ctx *ctx,
119 unsigned long key_len, const void *key,
120 const void *tweak_key);
121
122 /* Set the tweak (sector number), the block within the sector zero. */
123 void (*set_tweak)(const ccxts_ctx *ctx, ccxts_tweak *tweak, const void *iv);
124
125 /* Encrypt blocks for a sector, clients must call set_tweak before calling
126 this function. Return a pointer to the tweak buffer */
127 void *(*xts)(const ccxts_ctx *ctx, ccxts_tweak *tweak, unsigned long nblocks,
128 const void *in, void *out);
129
130 const void *custom;
131 const void *custom1;
132 };
133
134 /* GCM mode. */
135
136 cc_aligned_struct(16) ccgcm_ctx;
137
138 struct ccmode_gcm {
139 size_t size; /* first argument to ccgcm_ctx_decl(). */
140 unsigned long block_size;
141 void (*init)(const struct ccmode_gcm *gcm, ccgcm_ctx *ctx,
142 unsigned long key_len, const void *key);
143 void (*set_iv)(ccgcm_ctx *ctx, size_t iv_size, const void *iv);
144 void (*gmac)(ccgcm_ctx *ctx, unsigned long nbytes, const void *in); // could just be gcm with NULL out
145 void (*gcm)(ccgcm_ctx *ctx, unsigned long nbytes, const void *in, void *out);
146 void (*finalize)(ccgcm_ctx *key, size_t tag_size, void *tag);
147 void (*reset)(ccgcm_ctx *ctx);
148 const void *custom;
149 };
150
151 /* OMAC mode. */
152
153 cc_aligned_struct(16) ccomac_ctx;
154
155 struct ccmode_omac {
156 size_t size; /* first argument to ccomac_ctx_decl(). */
157 unsigned long block_size;
158 void (*init)(const struct ccmode_omac *omac, ccomac_ctx *ctx,
159 unsigned long tweak_len, unsigned long key_len,
160 const void *key);
161 int (*omac)(ccomac_ctx *ctx, unsigned long nblocks,
162 const void *tweak, const void *in, void *out);
163 const void *custom;
164 };
165
166 #endif /* _CORECRYPTO_CCMODE_IMPL_H_ */