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 */
47typedef void (*ccdigest_init_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx);
48typedef void (*ccdigest_update_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx,
49 unsigned long len, const void *data);
50typedef void (*ccdigest_final_fn_t)(const struct ccdigest_info *di, ccdigest_ctx_t ctx,
51 void *digest);
52typedef void (*ccdigest_fn_t)(const struct ccdigest_info *di, unsigned long len,
53 const void *data, void *digest);
54
55/* hmac */
56typedef void (*cchmac_init_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx,
57 unsigned long key_len, const void *key);
58typedef void (*cchmac_update_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx,
59 unsigned long data_len, const void *data);
60typedef void (*cchmac_final_fn_t)(const struct ccdigest_info *di, cchmac_ctx_t ctx,
61 unsigned char *mac);
62
63typedef 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 */
68typedef 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);
71typedef int (*ccgcm_inc_iv_fn_t)(const struct ccmode_gcm *mode, ccgcm_ctx *ctx, void *iv);
72
73typedef 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 */
87typedef 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 */
94typedef int (*ccdes_key_is_weak_fn_t)(void *key, unsigned long length);
95typedef 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) */
98typedef 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 */
102typedef struct ccrng_state *(*ccrng_fn_t)(int *error);
103
104/* rsa */
105typedef 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
109typedef 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
123typedef size_t (*crypto_digest_ctx_size_fn_t)(
124 crypto_digest_alg_t alg);
125
126typedef void (*crypto_digest_init_fn_t)(
127 crypto_digest_alg_t alg,
128 void *ctx,
129 size_t ctx_size);
130
131typedef 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
138typedef 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
145typedef 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
152typedef size_t (*crypto_hmac_ctx_size_fn_t)(
153 crypto_digest_alg_t alg);
154
155typedef 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
162typedef 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
169typedef 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
176typedef 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
183typedef 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
192typedef 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
201typedef 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
284int register_crypto_functions(const crypto_functions_t funcs);
285
286__END_DECLS
287
288#endif /*_CRYPTO_REGISTER_CRYPTO_H_*/
289