]>
git.saurik.com Git - apple/xnu.git/blob - EXTERNAL_HEADERS/corecrypto/ccmode_impl.h
817d45070155a2ef2fb5e30b9356712dddf60822
5 * Created on 12/07/2010
7 * Copyright (c) 2012,2015 Apple Inc. All rights reserved.
11 #ifndef _CORECRYPTO_CCMODE_IMPL_H_
12 #define _CORECRYPTO_CCMODE_IMPL_H_
14 #include <corecrypto/cc.h>
17 cc_aligned_struct(16) ccecb_ctx
;
20 /* Actual symmetric algorithm implementation should provide you one of these. */
22 size_t size
; /* first argument to ccecb_ctx_decl(). */
24 void (*init
)(const struct ccmode_ecb
*ecb
, ccecb_ctx
*ctx
,
25 size_t key_len
, const void *key
);
26 void (*ecb
)(const ccecb_ctx
*ctx
, size_t nblocks
, const void *in
,
31 * @brief corecrypto symmetrical encryption and decryption modes
33 * corecrypto supports 6 stateless en(de)cryption modes and 2 stateful authenticated en(de)cryption modes
34 * stateless modes CBC, CFB, CFB8, CTR, OFB, XTS: They provide 3 interface functions that do not return errors codes
36 * 2- ccmod_xxx_decrypt()
37 * 3- ccmod_xxx_encrypt()
39 * stateful modes CCM and GCM: They provide 7 interface functions that return error codes if a function is called out of state
41 * 2- ccmod_xxx_setiv()
43 * 4- ccmod_xxx_decrypt()
44 * 5- ccmod_xxx_encrypt()
45 * 6- ccmod_xxx_finalize()
46 * 7- ccmod_xxx_reset()
48 * the correct call sequences are:
50 * calls to 1, 2 and 6 arerequired
51 * 2 and 3 can be called as mant times as needed
52 * calls to 3, 4, 5 can be skipped
60 // 1- CBC mode, stateless
61 cc_aligned_struct(16) cccbc_ctx
;
62 cc_aligned_struct(16) cccbc_iv
;
65 size_t size
; /* first argument to cccbc_ctx_decl(). */
67 void (*init
)(const struct ccmode_cbc
*cbc
, cccbc_ctx
*ctx
,
68 size_t key_len
, const void *key
);
69 /* cbc encrypt or decrypt nblocks from in to out, iv will be used and updated. */
70 void (*cbc
)(const cccbc_ctx
*ctx
, cccbc_iv
*iv
,
71 size_t nblocks
, const void *in
, void *out
);
75 // 2- CFB mode, stateless
76 cc_aligned_struct(16) cccfb_ctx
;
79 size_t size
; /* first argument to cccfb_ctx_decl(). */
81 void (*init
)(const struct ccmode_cfb
*cfb
, cccfb_ctx
*ctx
,
82 size_t key_len
, const void *key
, const void *iv
);
83 void (*cfb
)(cccfb_ctx
*ctx
, size_t nbytes
, const void *in
, void *out
);
87 // 3- CFB8 mode, stateless
88 cc_aligned_struct(16) cccfb8_ctx
;
91 size_t size
; /* first argument to cccfb8_ctx_decl(). */
93 void (*init
)(const struct ccmode_cfb8
*cfb8
, cccfb8_ctx
*ctx
,
94 size_t key_len
, const void *key
, const void *iv
);
95 void (*cfb8
)(cccfb8_ctx
*ctx
, size_t nbytes
, const void *in
, void *out
);
99 // 4- CTR mode, stateless
100 cc_aligned_struct(16) ccctr_ctx
;
103 size_t size
; /* first argument to ccctr_ctx_decl(). */
105 void (*init
)(const struct ccmode_ctr
*ctr
, ccctr_ctx
*ctx
,
106 size_t key_len
, const void *key
, const void *iv
);
107 void (*ctr
)(ccctr_ctx
*ctx
, size_t nbytes
, const void *in
, void *out
);
111 // 5- OFB mode, stateless
112 cc_aligned_struct(16) ccofb_ctx
;
115 size_t size
; /* first argument to ccofb_ctx_decl(). */
117 void (*init
)(const struct ccmode_ofb
*ofb
, ccofb_ctx
*ctx
,
118 size_t key_len
, const void *key
, const void *iv
);
119 void (*ofb
)(ccofb_ctx
*ctx
, size_t nbytes
, const void *in
, void *out
);
123 // 6- XTS mode, stateless
124 cc_aligned_struct(16) ccxts_ctx
;
125 cc_aligned_struct(16) ccxts_tweak
;
128 size_t size
; /* first argument to ccxts_ctx_decl(). */
129 size_t tweak_size
; /* first argument to ccxts_tweak_decl(). */
132 /* Create a xts key from a xts mode object. The tweak_len here
133 determines how long the tweak is in bytes, for each subsequent call to
135 key must point to at least 'size' cc_units of free storage.
136 tweak_key must point to at least 'tweak_size' cc_units of free storage. */
137 void (*init
)(const struct ccmode_xts
*xts
, ccxts_ctx
*ctx
,
138 size_t key_len
, const void *key
, const void *tweak_key
);
140 /* Set the tweak (sector number), the block within the sector zero. */
141 void (*set_tweak
)(const ccxts_ctx
*ctx
, ccxts_tweak
*tweak
, const void *iv
);
143 /* Encrypt blocks for a sector, clients must call set_tweak before calling
144 this function. Return a pointer to the tweak buffer */
145 void *(*xts
)(const ccxts_ctx
*ctx
, ccxts_tweak
*tweak
,
146 size_t nblocks
, const void *in
, void *out
);
152 //7- GCM mode, statful
153 cc_aligned_struct(16) ccgcm_ctx
;
154 #define CCMODE_GCM_DECRYPTOR 78647
155 #define CCMODE_GCM_ENCRYPTOR 4073947
158 size_t size
; /* first argument to ccgcm_ctx_decl(). */
159 int encdec
; //is it encrypt or decrypt object
161 int (*init
)(const struct ccmode_gcm
*gcm
, ccgcm_ctx
*ctx
,
162 size_t key_len
, const void *key
);
163 int (*set_iv
)(ccgcm_ctx
*ctx
, size_t iv_size
, const void *iv
);
164 int (*gmac
)(ccgcm_ctx
*ctx
, size_t nbytes
, const void *in
); // could just be gcm with NULL out
165 int (*gcm
)(ccgcm_ctx
*ctx
, size_t nbytes
, const void *in
, void *out
);
166 int (*finalize
)(ccgcm_ctx
*key
, size_t tag_size
, void *tag
);
167 int (*reset
)(ccgcm_ctx
*ctx
);
171 //8- GCM mode, statful
172 cc_aligned_struct(16) ccccm_ctx
;
173 cc_aligned_struct(16) ccccm_nonce
;
176 size_t size
; /* first argument to ccccm_ctx_decl(). */
177 size_t nonce_size
; /* first argument to ccccm_nonce_decl(). */
179 int (*init
)(const struct ccmode_ccm
*ccm
, ccccm_ctx
*ctx
,
180 size_t key_len
, const void *key
);
181 int (*set_iv
)(ccccm_ctx
*ctx
, ccccm_nonce
*nonce_ctx
, size_t nonce_len
, const void *nonce
,
182 size_t mac_size
, size_t auth_len
, size_t data_len
);
183 int (*cbcmac
)(ccccm_ctx
*ctx
, ccccm_nonce
*nonce_ctx
, size_t nbytes
, const void *in
); // could just be ccm with NULL out
184 int (*ccm
)(ccccm_ctx
*ctx
, ccccm_nonce
*nonce_ctx
, size_t nbytes
, const void *in
, void *out
);
185 int (*finalize
)(ccccm_ctx
*key
, ccccm_nonce
*nonce_ctx
, void *mac
);
186 int (*reset
)(ccccm_ctx
*key
, ccccm_nonce
*nonce_ctx
);
192 cc_aligned_struct(16) ccomac_ctx
;
195 size_t size
; /* first argument to ccomac_ctx_decl(). */
197 void (*init
)(const struct ccmode_omac
*omac
, ccomac_ctx
*ctx
,
198 size_t tweak_len
, size_t key_len
, const void *key
);
199 int (*omac
)(ccomac_ctx
*ctx
, size_t nblocks
,
200 const void *tweak
, const void *in
, void *out
);
204 #endif /* _CORECRYPTO_CCMODE_IMPL_H_ */