1 | /* |
2 | * Copyright (c) 2012 Apple Computer, Inc. All rights reserved. |
3 | * |
4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
5 | * |
6 | * This file contains Original Code and/or Modifications of Original Code |
7 | * as defined in and that are subject to the Apple Public Source License |
8 | * Version 2.0 (the 'License'). You may not use this file except in |
9 | * compliance with the License. The rights granted to you under the License |
10 | * may not be used to create, or enable the creation or redistribution of, |
11 | * unlawful or unlicensed copies of an Apple operating system, or to |
12 | * circumvent, violate, or enable the circumvention or violation of, any |
13 | * terms of an Apple operating system software license agreement. |
14 | * |
15 | * Please obtain a copy of the License at |
16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. |
17 | * |
18 | * The Original Code and all software distributed under the License are |
19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
23 | * Please see the License for the specific language governing rights and |
24 | * limitations under the License. |
25 | * |
26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
27 | */ |
28 | |
29 | #ifndef _CRYPTO_REGISTER_CRYPTO_H_ |
30 | #define _CRYPTO_REGISTER_CRYPTO_H_ |
31 | |
32 | #include <libkern/crypto/crypto.h> |
33 | #include <libkern/crypto/rand.h> |
34 | |
35 | __BEGIN_DECLS |
36 | |
37 | #include <corecrypto/ccdigest.h> |
38 | #include <corecrypto/cchmac.h> |
39 | #include <corecrypto/ccmode.h> |
40 | #include <corecrypto/ccrng.h> |
41 | #include <corecrypto/ccrsa.h> |
42 | #include <corecrypto/ccchacha20poly1305.h> |
43 | |
44 | /* Function types */ |
45 | |
46 | /* digests */ |
47 | typedef void (*ccdigest_init_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx); |
48 | typedef void (*ccdigest_update_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx, |
49 | unsigned long len, const void *data); |
50 | typedef void (*ccdigest_final_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx, |
51 | void *digest); |
52 | typedef void (*ccdigest_fn_t)(const struct ccdigest_info *di, unsigned long len, |
53 | const void *data, void *digest); |
54 | |
55 | /* hmac */ |
56 | typedef void (*cchmac_init_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx, |
57 | unsigned long key_len, const void *key); |
58 | typedef void (*cchmac_update_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx, |
59 | unsigned long data_len, const void *data); |
60 | typedef void (*cchmac_final_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx, |
61 | unsigned char *mac); |
62 | |
63 | typedef void (*cchmac_fn_t)(const struct ccdigest_info *di, unsigned long key_len, |
64 | const void *key, unsigned long data_len, const void *data, |
65 | unsigned char *mac); |
66 | |
67 | /* gcm */ |
68 | typedef int (*ccgcm_init_with_iv_fn_t)(const struct ccmode_gcm *mode, ccgcm_ctx *ctx, |
69 | size_t key_nbytes, const void *key, |
70 | const void *iv); |
71 | typedef int (*ccgcm_inc_iv_fn_t)(const struct ccmode_gcm *mode, ccgcm_ctx *ctx, void *iv); |
72 | |
73 | typedef const struct ccchacha20poly1305_fns { |
74 | const struct ccchacha20poly1305_info *(*info)(void); |
75 | int (*init)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, const uint8_t *key); |
76 | int (*reset)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx); |
77 | int (*setnonce)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, const uint8_t *nonce); |
78 | int (*incnonce)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, uint8_t *nonce); |
79 | int (*aad)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, size_t nbytes, const void *aad); |
80 | int (*encrypt)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, size_t nbytes, const void *ptext, void *ctext); |
81 | int (*finalize)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, uint8_t *tag); |
82 | int (*decrypt)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, size_t nbytes, const void *ctext, void *ptext); |
83 | int (*verify)(const struct ccchacha20poly1305_info *info, ccchacha20poly1305_ctx *ctx, const uint8_t *tag); |
84 | } *ccchacha20poly1305_fns_t; |
85 | |
86 | /* pbkdf2 */ |
87 | typedef void (*ccpbkdf2_hmac_fn_t)(const struct ccdigest_info *di, |
88 | unsigned long passwordLen, const void *password, |
89 | unsigned long saltLen, const void *salt, |
90 | unsigned long iterations, |
91 | unsigned long dkLen, void *dk); |
92 | |
93 | /* des weak key testing */ |
94 | typedef int (*ccdes_key_is_weak_fn_t)(void *key, unsigned long length); |
95 | typedef void (*ccdes_key_set_odd_parity_fn_t)(void *key, unsigned long length); |
96 | |
97 | /* CBC padding (such as PKCS7 or CTSx per NIST standard) */ |
98 | typedef size_t (*ccpad_cts3_crypt_fn_t)(const struct ccmode_cbc *cbc, cccbc_ctx *cbc_key, |
99 | cccbc_iv *iv, size_t nbytes, const void *in, void *out); |
100 | |
101 | /* rng */ |
102 | typedef struct ccrng_state *(*ccrng_fn_t)(int *error); |
103 | |
104 | /* rsa */ |
105 | typedef int (*ccrsa_make_pub_fn_t)(ccrsa_pub_ctx_t pubk, |
106 | size_t exp_nbytes, const uint8_t *exp, |
107 | size_t mod_nbytes, const uint8_t *mod); |
108 | |
109 | typedef int (*ccrsa_verify_pkcs1v15_fn_t)(ccrsa_pub_ctx_t key, const uint8_t *oid, |
110 | size_t digest_len, const uint8_t *digest, |
111 | size_t sig_len, const uint8_t *sig, |
112 | bool *valid); |
113 | |
114 | __enum_decl(crypto_digest_alg_t, unsigned int, { |
115 | CRYPTO_DIGEST_ALG_NONE, |
116 | CRYPTO_DIGEST_ALG_MD5, |
117 | CRYPTO_DIGEST_ALG_SHA1, |
118 | CRYPTO_DIGEST_ALG_SHA256, |
119 | CRYPTO_DIGEST_ALG_SHA384, |
120 | CRYPTO_DIGEST_ALG_SHA512 |
121 | }); |
122 | |
123 | typedef size_t (*crypto_digest_ctx_size_fn_t)( |
124 | crypto_digest_alg_t alg); |
125 | |
126 | typedef void (*crypto_digest_init_fn_t)( |
127 | crypto_digest_alg_t alg, |
128 | void *ctx, |
129 | size_t ctx_size); |
130 | |
131 | typedef void (*crypto_digest_update_fn_t)( |
132 | crypto_digest_alg_t alg, |
133 | void *ctx, |
134 | size_t ctx_size, |
135 | const void *data, |
136 | size_t data_size); |
137 | |
138 | typedef void (*crypto_digest_final_fn_t)( |
139 | crypto_digest_alg_t alg, |
140 | void *ctx, |
141 | size_t ctx_size, |
142 | void *digest, |
143 | size_t digest_size); |
144 | |
145 | typedef void (*crypto_digest_fn_t)( |
146 | crypto_digest_alg_t alg, |
147 | const void *data, |
148 | size_t data_size, |
149 | void *digest, |
150 | size_t digest_size); |
151 | |
152 | typedef size_t (*crypto_hmac_ctx_size_fn_t)( |
153 | crypto_digest_alg_t alg); |
154 | |
155 | typedef void (*crypto_hmac_init_fn_t)( |
156 | crypto_digest_alg_t alg, |
157 | void *ctx, |
158 | size_t ctx_size, |
159 | const void *key, |
160 | size_t key_size); |
161 | |
162 | typedef void (*crypto_hmac_update_fn_t)( |
163 | crypto_digest_alg_t alg, |
164 | void *ctx, |
165 | size_t ctx_size, |
166 | const void *data, |
167 | size_t data_size); |
168 | |
169 | typedef void (*crypto_hmac_final_generate_fn_t)( |
170 | crypto_digest_alg_t alg, |
171 | void *ctx, |
172 | size_t ctx_size, |
173 | void *tag, |
174 | size_t tag_size); |
175 | |
176 | typedef bool (*crypto_hmac_final_verify_fn_t)( |
177 | crypto_digest_alg_t alg, |
178 | void *ctx, |
179 | size_t ctx_size, |
180 | const void *tag, |
181 | size_t tag_size); |
182 | |
183 | typedef void (*crypto_hmac_generate_fn_t)( |
184 | crypto_digest_alg_t alg, |
185 | const void *key, |
186 | size_t key_size, |
187 | const void *data, |
188 | size_t data_size, |
189 | void *tag, |
190 | size_t tag_size); |
191 | |
192 | typedef bool (*crypto_hmac_verify_fn_t)( |
193 | crypto_digest_alg_t alg, |
194 | const void *key, |
195 | size_t key_size, |
196 | const void *data, |
197 | size_t data_size, |
198 | const void *tag, |
199 | size_t tag_size); |
200 | |
201 | typedef struct crypto_functions { |
202 | /* digests common functions */ |
203 | ccdigest_init_fn_t ccdigest_init_fn; |
204 | ccdigest_update_fn_t ccdigest_update_fn; |
205 | ccdigest_final_fn_t ccdigest_final_fn; |
206 | ccdigest_fn_t ccdigest_fn; |
207 | /* digest implementations */ |
208 | const struct ccdigest_info * ccmd5_di; |
209 | const struct ccdigest_info * ccsha1_di; |
210 | const struct ccdigest_info * ccsha256_di; |
211 | const struct ccdigest_info * ccsha384_di; |
212 | const struct ccdigest_info * ccsha512_di; |
213 | |
214 | /* hmac common function */ |
215 | cchmac_init_fn_t cchmac_init_fn; |
216 | cchmac_update_fn_t cchmac_update_fn; |
217 | cchmac_final_fn_t cchmac_final_fn; |
218 | cchmac_fn_t cchmac_fn; |
219 | |
220 | /* ciphers modes implementations */ |
221 | /* AES, ecb, cbc and xts */ |
222 | const struct ccmode_ecb *ccaes_ecb_encrypt; |
223 | const struct ccmode_ecb *ccaes_ecb_decrypt; |
224 | const struct ccmode_cbc *ccaes_cbc_encrypt; |
225 | const struct ccmode_cbc *ccaes_cbc_decrypt; |
226 | const struct ccmode_ctr *ccaes_ctr_crypt; |
227 | const struct ccmode_xts *ccaes_xts_encrypt; |
228 | const struct ccmode_xts *ccaes_xts_decrypt; |
229 | const struct ccmode_gcm *ccaes_gcm_encrypt; |
230 | const struct ccmode_gcm *ccaes_gcm_decrypt; |
231 | |
232 | ccgcm_init_with_iv_fn_t ccgcm_init_with_iv_fn; |
233 | ccgcm_inc_iv_fn_t ccgcm_inc_iv_fn; |
234 | |
235 | ccchacha20poly1305_fns_t ccchacha20poly1305_fns; |
236 | |
237 | /* DES, ecb and cbc */ |
238 | const struct ccmode_ecb *ccdes_ecb_encrypt; |
239 | const struct ccmode_ecb *ccdes_ecb_decrypt; |
240 | const struct ccmode_cbc *ccdes_cbc_encrypt; |
241 | const struct ccmode_cbc *ccdes_cbc_decrypt; |
242 | /* Triple DES, ecb and cbc */ |
243 | const struct ccmode_ecb *cctdes_ecb_encrypt; |
244 | const struct ccmode_ecb *cctdes_ecb_decrypt; |
245 | const struct ccmode_cbc *cctdes_cbc_encrypt; |
246 | const struct ccmode_cbc *cctdes_cbc_decrypt; |
247 | /* DES key helper functions */ |
248 | ccdes_key_is_weak_fn_t ccdes_key_is_weak_fn; |
249 | ccdes_key_set_odd_parity_fn_t ccdes_key_set_odd_parity_fn; |
250 | /* CTS3 padding+encrypt functions */ |
251 | ccpad_cts3_crypt_fn_t ccpad_cts3_encrypt_fn; |
252 | ccpad_cts3_crypt_fn_t ccpad_cts3_decrypt_fn; |
253 | |
254 | /* rng */ |
255 | ccrng_fn_t ccrng_fn; |
256 | |
257 | /* rsa */ |
258 | ccrsa_make_pub_fn_t ccrsa_make_pub_fn; |
259 | ccrsa_verify_pkcs1v15_fn_t ccrsa_verify_pkcs1v15_fn; |
260 | |
261 | // Random functions |
262 | crypto_random_generate_fn_t random_generate_fn; |
263 | crypto_random_uniform_fn_t random_uniform_fn; |
264 | crypto_random_kmem_ctx_size_fn_t random_kmem_ctx_size_fn; |
265 | crypto_random_kmem_init_fn_t random_kmem_init_fn; |
266 | |
267 | // Digest functions |
268 | crypto_digest_ctx_size_fn_t digest_ctx_size_fn; |
269 | crypto_digest_init_fn_t digest_init_fn; |
270 | crypto_digest_update_fn_t digest_update_fn; |
271 | crypto_digest_final_fn_t digest_final_fn; |
272 | crypto_digest_fn_t digest_fn; |
273 | |
274 | // HMAC functions |
275 | crypto_hmac_ctx_size_fn_t hmac_ctx_size_fn; |
276 | crypto_hmac_init_fn_t hmac_init_fn; |
277 | crypto_hmac_update_fn_t hmac_update_fn; |
278 | crypto_hmac_final_generate_fn_t hmac_final_generate_fn; |
279 | crypto_hmac_final_verify_fn_t hmac_final_verify_fn; |
280 | crypto_hmac_generate_fn_t hmac_generate_fn; |
281 | crypto_hmac_verify_fn_t hmac_verify_fn; |
282 | } *crypto_functions_t; |
283 | |
284 | int register_crypto_functions(const crypto_functions_t funcs); |
285 | |
286 | __END_DECLS |
287 | |
288 | #endif /*_CRYPTO_REGISTER_CRYPTO_H_*/ |
289 | |