4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _COMMON_CRYPTO_MODES_H
27 #define _COMMON_CRYPTO_MODES_H
33 #include <sys/strsun.h>
34 #include <sys/systm.h>
35 #include <sys/sysmacros.h>
36 #include <sys/types.h>
37 #include <sys/errno.h>
38 #include <sys/rwlock.h>
40 #include <sys/crypto/common.h>
41 #include <sys/crypto/impl.h>
43 #define ECB_MODE 0x00000002
44 #define CBC_MODE 0x00000004
45 #define CTR_MODE 0x00000008
46 #define CCM_MODE 0x00000010
47 #define GCM_MODE 0x00000020
48 #define GMAC_MODE 0x00000040
51 * cc_keysched: Pointer to key schedule.
53 * cc_keysched_len: Length of the key schedule.
55 * cc_remainder: This is for residual data, i.e. data that can't
56 * be processed because there are too few bytes.
57 * Must wait until more data arrives.
59 * cc_remainder_len: Number of bytes in cc_remainder.
61 * cc_iv: Scratch buffer that sometimes contains the IV.
63 * cc_lastp: Pointer to previous block of ciphertext.
65 * cc_copy_to: Pointer to where encrypted residual data needs
68 * cc_flags: PROVIDER_OWNS_KEY_SCHEDULE
69 * When a context is freed, it is necessary
70 * to know whether the key schedule was allocated
71 * by the caller, or internally, e.g. an init routine.
72 * If allocated by the latter, then it needs to be freed.
74 * ECB_MODE, CBC_MODE, CTR_MODE, or CCM_MODE
78 size_t cc_keysched_len
;
80 uint64_t cc_remainder
[2];
81 size_t cc_remainder_len
;
87 typedef struct common_ctx common_ctx_t
;
89 typedef struct ecb_ctx
{
90 struct common_ctx ecb_common
;
91 uint64_t ecb_lastblock
[2];
94 #define ecb_keysched ecb_common.cc_keysched
95 #define ecb_keysched_len ecb_common.cc_keysched_len
96 #define ecb_iv ecb_common.cc_iv
97 #define ecb_remainder ecb_common.cc_remainder
98 #define ecb_remainder_len ecb_common.cc_remainder_len
99 #define ecb_lastp ecb_common.cc_lastp
100 #define ecb_copy_to ecb_common.cc_copy_to
101 #define ecb_flags ecb_common.cc_flags
103 typedef struct cbc_ctx
{
104 struct common_ctx cbc_common
;
105 uint64_t cbc_lastblock
[2];
108 #define cbc_keysched cbc_common.cc_keysched
109 #define cbc_keysched_len cbc_common.cc_keysched_len
110 #define cbc_iv cbc_common.cc_iv
111 #define cbc_remainder cbc_common.cc_remainder
112 #define cbc_remainder_len cbc_common.cc_remainder_len
113 #define cbc_lastp cbc_common.cc_lastp
114 #define cbc_copy_to cbc_common.cc_copy_to
115 #define cbc_flags cbc_common.cc_flags
118 * ctr_lower_mask Bit-mask for lower 8 bytes of counter block.
119 * ctr_upper_mask Bit-mask for upper 8 bytes of counter block.
121 typedef struct ctr_ctx
{
122 struct common_ctx ctr_common
;
123 uint64_t ctr_lower_mask
;
124 uint64_t ctr_upper_mask
;
129 * ctr_cb Counter block.
131 #define ctr_keysched ctr_common.cc_keysched
132 #define ctr_keysched_len ctr_common.cc_keysched_len
133 #define ctr_cb ctr_common.cc_iv
134 #define ctr_remainder ctr_common.cc_remainder
135 #define ctr_remainder_len ctr_common.cc_remainder_len
136 #define ctr_lastp ctr_common.cc_lastp
137 #define ctr_copy_to ctr_common.cc_copy_to
138 #define ctr_flags ctr_common.cc_flags
142 * ccm_mac_len: Stores length of the MAC in CCM mode.
143 * ccm_mac_buf: Stores the intermediate value for MAC in CCM encrypt.
144 * In CCM decrypt, stores the input MAC value.
145 * ccm_data_len: Length of the plaintext for CCM mode encrypt, or
146 * length of the ciphertext for CCM mode decrypt.
147 * ccm_processed_data_len:
148 * Length of processed plaintext in CCM mode encrypt,
149 * or length of processed ciphertext for CCM mode decrypt.
150 * ccm_processed_mac_len:
151 * Length of MAC data accumulated in CCM mode decrypt.
153 * ccm_pt_buf: Only used in CCM mode decrypt. It stores the
154 * decrypted plaintext to be returned when
155 * MAC verification succeeds in decrypt_final.
156 * Memory for this should be allocated in the AES module.
159 typedef struct ccm_ctx
{
160 struct common_ctx ccm_common
;
163 uint64_t ccm_mac_buf
[2];
165 size_t ccm_processed_data_len
;
166 size_t ccm_processed_mac_len
;
168 uint64_t ccm_mac_input_buf
[2];
169 uint64_t ccm_counter_mask
;
172 #define ccm_keysched ccm_common.cc_keysched
173 #define ccm_keysched_len ccm_common.cc_keysched_len
174 #define ccm_cb ccm_common.cc_iv
175 #define ccm_remainder ccm_common.cc_remainder
176 #define ccm_remainder_len ccm_common.cc_remainder_len
177 #define ccm_lastp ccm_common.cc_lastp
178 #define ccm_copy_to ccm_common.cc_copy_to
179 #define ccm_flags ccm_common.cc_flags
182 * gcm_tag_len: Length of authentication tag.
184 * gcm_ghash: Stores output from the GHASH function.
186 * gcm_processed_data_len:
187 * Length of processed plaintext (encrypt) or
188 * length of processed ciphertext (decrypt).
190 * gcm_pt_buf: Stores the decrypted plaintext returned by
191 * decrypt_final when the computed authentication
192 * tag matches the user supplied tag.
194 * gcm_pt_buf_len: Length of the plaintext buffer.
198 * gcm_J0: Pre-counter block generated from the IV.
200 * gcm_len_a_len_c: 64-bit representations of the bit lengths of
201 * AAD and ciphertext.
203 * gcm_kmflag: Current value of kmflag. Used only for allocating
204 * the plaintext buffer during decryption.
206 typedef struct gcm_ctx
{
207 struct common_ctx gcm_common
;
209 size_t gcm_processed_data_len
;
210 size_t gcm_pt_buf_len
;
212 uint64_t gcm_ghash
[2];
215 uint64_t gcm_len_a_len_c
[2];
220 #define gcm_keysched gcm_common.cc_keysched
221 #define gcm_keysched_len gcm_common.cc_keysched_len
222 #define gcm_cb gcm_common.cc_iv
223 #define gcm_remainder gcm_common.cc_remainder
224 #define gcm_remainder_len gcm_common.cc_remainder_len
225 #define gcm_lastp gcm_common.cc_lastp
226 #define gcm_copy_to gcm_common.cc_copy_to
227 #define gcm_flags gcm_common.cc_flags
229 #define AES_GMAC_IV_LEN 12
230 #define AES_GMAC_TAG_BITS 128
232 typedef struct aes_ctx
{
244 #define ac_flags acu.acu_ecb.ecb_common.cc_flags
245 #define ac_remainder_len acu.acu_ecb.ecb_common.cc_remainder_len
246 #define ac_keysched acu.acu_ecb.ecb_common.cc_keysched
247 #define ac_keysched_len acu.acu_ecb.ecb_common.cc_keysched_len
248 #define ac_iv acu.acu_ecb.ecb_common.cc_iv
249 #define ac_lastp acu.acu_ecb.ecb_common.cc_lastp
250 #define ac_pt_buf acu.acu_ccm.ccm_pt_buf
251 #define ac_mac_len acu.acu_ccm.ccm_mac_len
252 #define ac_data_len acu.acu_ccm.ccm_data_len
253 #define ac_processed_mac_len acu.acu_ccm.ccm_processed_mac_len
254 #define ac_processed_data_len acu.acu_ccm.ccm_processed_data_len
255 #define ac_tag_len acu.acu_gcm.gcm_tag_len
257 typedef struct blowfish_ctx
{
264 #define bc_flags bcu.bcu_ecb.ecb_common.cc_flags
265 #define bc_remainder_len bcu.bcu_ecb.ecb_common.cc_remainder_len
266 #define bc_keysched bcu.bcu_ecb.ecb_common.cc_keysched
267 #define bc_keysched_len bcu.bcu_ecb.ecb_common.cc_keysched_len
268 #define bc_iv bcu.bcu_ecb.ecb_common.cc_iv
269 #define bc_lastp bcu.bcu_ecb.ecb_common.cc_lastp
271 typedef struct des_ctx
{
278 #define dc_flags dcu.dcu_ecb.ecb_common.cc_flags
279 #define dc_remainder_len dcu.dcu_ecb.ecb_common.cc_remainder_len
280 #define dc_keysched dcu.dcu_ecb.ecb_common.cc_keysched
281 #define dc_keysched_len dcu.dcu_ecb.ecb_common.cc_keysched_len
282 #define dc_iv dcu.dcu_ecb.ecb_common.cc_iv
283 #define dc_lastp dcu.dcu_ecb.ecb_common.cc_lastp
285 extern int ecb_cipher_contiguous_blocks(ecb_ctx_t
*, char *, size_t,
286 crypto_data_t
*, size_t, int (*cipher
)(const void *, const uint8_t *,
289 extern int cbc_encrypt_contiguous_blocks(cbc_ctx_t
*, char *, size_t,
290 crypto_data_t
*, size_t,
291 int (*encrypt
)(const void *, const uint8_t *, uint8_t *),
292 void (*copy_block
)(uint8_t *, uint8_t *),
293 void (*xor_block
)(uint8_t *, uint8_t *));
295 extern int cbc_decrypt_contiguous_blocks(cbc_ctx_t
*, char *, size_t,
296 crypto_data_t
*, size_t,
297 int (*decrypt
)(const void *, const uint8_t *, uint8_t *),
298 void (*copy_block
)(uint8_t *, uint8_t *),
299 void (*xor_block
)(uint8_t *, uint8_t *));
301 extern int ctr_mode_contiguous_blocks(ctr_ctx_t
*, char *, size_t,
302 crypto_data_t
*, size_t,
303 int (*cipher
)(const void *, const uint8_t *, uint8_t *),
304 void (*xor_block
)(uint8_t *, uint8_t *));
306 extern int ccm_mode_encrypt_contiguous_blocks(ccm_ctx_t
*, char *, size_t,
307 crypto_data_t
*, size_t,
308 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
309 void (*copy_block
)(uint8_t *, uint8_t *),
310 void (*xor_block
)(uint8_t *, uint8_t *));
312 extern int ccm_mode_decrypt_contiguous_blocks(ccm_ctx_t
*, char *, size_t,
313 crypto_data_t
*, size_t,
314 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
315 void (*copy_block
)(uint8_t *, uint8_t *),
316 void (*xor_block
)(uint8_t *, uint8_t *));
318 extern int gcm_mode_encrypt_contiguous_blocks(gcm_ctx_t
*, char *, size_t,
319 crypto_data_t
*, size_t,
320 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
321 void (*copy_block
)(uint8_t *, uint8_t *),
322 void (*xor_block
)(uint8_t *, uint8_t *));
324 extern int gcm_mode_decrypt_contiguous_blocks(gcm_ctx_t
*, char *, size_t,
325 crypto_data_t
*, size_t,
326 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
327 void (*copy_block
)(uint8_t *, uint8_t *),
328 void (*xor_block
)(uint8_t *, uint8_t *));
330 int ccm_encrypt_final(ccm_ctx_t
*, crypto_data_t
*, size_t,
331 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
332 void (*xor_block
)(uint8_t *, uint8_t *));
334 int gcm_encrypt_final(gcm_ctx_t
*, crypto_data_t
*, size_t,
335 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
336 void (*copy_block
)(uint8_t *, uint8_t *),
337 void (*xor_block
)(uint8_t *, uint8_t *));
339 extern int ccm_decrypt_final(ccm_ctx_t
*, crypto_data_t
*, size_t,
340 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
341 void (*copy_block
)(uint8_t *, uint8_t *),
342 void (*xor_block
)(uint8_t *, uint8_t *));
344 extern int gcm_decrypt_final(gcm_ctx_t
*, crypto_data_t
*, size_t,
345 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
346 void (*xor_block
)(uint8_t *, uint8_t *));
348 extern int ctr_mode_final(ctr_ctx_t
*, crypto_data_t
*,
349 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *));
351 extern int cbc_init_ctx(cbc_ctx_t
*, char *, size_t, size_t,
352 void (*copy_block
)(uint8_t *, uint64_t *));
354 extern int ctr_init_ctx(ctr_ctx_t
*, ulong_t
, uint8_t *,
355 void (*copy_block
)(uint8_t *, uint8_t *));
357 extern int ccm_init_ctx(ccm_ctx_t
*, char *, int, boolean_t
, size_t,
358 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
359 void (*xor_block
)(uint8_t *, uint8_t *));
361 extern int gcm_init_ctx(gcm_ctx_t
*, char *, size_t,
362 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
363 void (*copy_block
)(uint8_t *, uint8_t *),
364 void (*xor_block
)(uint8_t *, uint8_t *));
366 extern int gmac_init_ctx(gcm_ctx_t
*, char *, size_t,
367 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *),
368 void (*copy_block
)(uint8_t *, uint8_t *),
369 void (*xor_block
)(uint8_t *, uint8_t *));
371 extern void calculate_ccm_mac(ccm_ctx_t
*, uint8_t *,
372 int (*encrypt_block
)(const void *, const uint8_t *, uint8_t *));
374 extern void gcm_mul(uint64_t *, uint64_t *, uint64_t *);
376 extern void crypto_init_ptrs(crypto_data_t
*, void **, offset_t
*);
377 extern void crypto_get_ptrs(crypto_data_t
*, void **, offset_t
*,
378 uint8_t **, size_t *, uint8_t **, size_t);
380 extern void *ecb_alloc_ctx(int);
381 extern void *cbc_alloc_ctx(int);
382 extern void *ctr_alloc_ctx(int);
383 extern void *ccm_alloc_ctx(int);
384 extern void *gcm_alloc_ctx(int);
385 extern void *gmac_alloc_ctx(int);
386 extern void crypto_free_mode_ctx(void *);
387 extern void gcm_set_kmflag(gcm_ctx_t
*, int);
393 #endif /* _COMMON_CRYPTO_MODES_H */