Home | History | Annotate | Download | only in modes
      1 /*
      2  * CDDL HEADER START
      3  *
      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.
      7  *
      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.
     12  *
     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]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_COMMON_CRYPTO_MODES_H
     27 #define	_COMMON_CRYPTO_MODES_H
     28 
     29 #ifdef	__cplusplus
     30 extern "C" {
     31 #endif
     32 
     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>
     39 #include <sys/kmem.h>
     40 #include <sys/crypto/common.h>
     41 #include <sys/crypto/impl.h>
     42 
     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
     49 
     50 /*
     51  * cc_keysched:		Pointer to key schedule.
     52  *
     53  * cc_keysched_len:	Length of the key schedule.
     54  *
     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.
     58  *
     59  * cc_remainder_len:	Number of bytes in cc_remainder.
     60  *
     61  * cc_iv:		Scratch buffer that sometimes contains the IV.
     62  *
     63  * cc_lastp:		Pointer to previous block of ciphertext.
     64  *
     65  * cc_copy_to:		Pointer to where encrypted residual data needs
     66  *			to be copied.
     67  *
     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.
     73  *
     74  *			ECB_MODE, CBC_MODE, CTR_MODE, or CCM_MODE
     75  */
     76 struct common_ctx {
     77 	void *cc_keysched;
     78 	size_t cc_keysched_len;
     79 	uint64_t cc_iv[2];
     80 	uint64_t cc_remainder[2];
     81 	size_t cc_remainder_len;
     82 	uint8_t *cc_lastp;
     83 	uint8_t *cc_copy_to;
     84 	uint32_t cc_flags;
     85 };
     86 
     87 typedef struct common_ctx common_ctx_t;
     88 
     89 typedef struct ecb_ctx {
     90 	struct common_ctx ecb_common;
     91 	uint64_t ecb_lastblock[2];
     92 } ecb_ctx_t;
     93 
     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
    102 
    103 typedef struct cbc_ctx {
    104 	struct common_ctx cbc_common;
    105 	uint64_t cbc_lastblock[2];
    106 } cbc_ctx_t;
    107 
    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
    116 
    117 /*
    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.
    120  */
    121 typedef struct ctr_ctx {
    122 	struct common_ctx ctr_common;
    123 	uint64_t ctr_lower_mask;
    124 	uint64_t ctr_upper_mask;
    125 	uint32_t ctr_tmp[4];
    126 } ctr_ctx_t;
    127 
    128 /*
    129  * ctr_cb			Counter block.
    130  */
    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
    139 
    140 /*
    141  *
    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.
    152  *
    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.
    157  *
    158  */
    159 typedef struct ccm_ctx {
    160 	struct common_ctx ccm_common;
    161 	uint32_t ccm_tmp[4];
    162 	size_t ccm_mac_len;
    163 	uint64_t ccm_mac_buf[2];
    164 	size_t ccm_data_len;
    165 	size_t ccm_processed_data_len;
    166 	size_t ccm_processed_mac_len;
    167 	uint8_t *ccm_pt_buf;
    168 	uint64_t ccm_mac_input_buf[2];
    169 	uint64_t ccm_counter_mask;
    170 } ccm_ctx_t;
    171 
    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
    180 
    181 /*
    182  * gcm_tag_len:		Length of authentication tag.
    183  *
    184  * gcm_ghash:		Stores output from the GHASH function.
    185  *
    186  * gcm_processed_data_len:
    187  *			Length of processed plaintext (encrypt) or
    188  *			length of processed ciphertext (decrypt).
    189  *
    190  * gcm_pt_buf:		Stores the decrypted plaintext returned by
    191  *			decrypt_final when the computed authentication
    192  *			tag matches the	user supplied tag.
    193  *
    194  * gcm_pt_buf_len:	Length of the plaintext buffer.
    195  *
    196  * gcm_H:		Subkey.
    197  *
    198  * gcm_J0:		Pre-counter block generated from the IV.
    199  *
    200  * gcm_len_a_len_c:	64-bit representations of the bit lengths of
    201  *			AAD and ciphertext.
    202  *
    203  * gcm_kmflag:		Current value of kmflag. Used only for allocating
    204  *			the plaintext buffer during decryption.
    205  */
    206 typedef struct gcm_ctx {
    207 	struct common_ctx gcm_common;
    208 	size_t gcm_tag_len;
    209 	size_t gcm_processed_data_len;
    210 	size_t gcm_pt_buf_len;
    211 	uint32_t gcm_tmp[4];
    212 	uint64_t gcm_ghash[2];
    213 	uint64_t gcm_H[2];
    214 	uint64_t gcm_J0[2];
    215 	uint64_t gcm_len_a_len_c[2];
    216 	uint8_t *gcm_pt_buf;
    217 	int gcm_kmflag;
    218 } gcm_ctx_t;
    219 
    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
    228 
    229 #define	AES_GMAC_IV_LEN		12
    230 #define	AES_GMAC_TAG_BITS	128
    231 
    232 typedef struct aes_ctx {
    233 	union {
    234 		ecb_ctx_t acu_ecb;
    235 		cbc_ctx_t acu_cbc;
    236 		ctr_ctx_t acu_ctr;
    237 #ifdef _KERNEL
    238 		ccm_ctx_t acu_ccm;
    239 		gcm_ctx_t acu_gcm;
    240 #endif
    241 	} acu;
    242 } aes_ctx_t;
    243 
    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
    256 
    257 typedef struct blowfish_ctx {
    258 	union {
    259 		ecb_ctx_t bcu_ecb;
    260 		cbc_ctx_t bcu_cbc;
    261 	} bcu;
    262 } blowfish_ctx_t;
    263 
    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
    270 
    271 typedef struct des_ctx {
    272 	union {
    273 		ecb_ctx_t dcu_ecb;
    274 		cbc_ctx_t dcu_cbc;
    275 	} dcu;
    276 } des_ctx_t;
    277 
    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
    284 
    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 *,
    287     uint8_t *));
    288 
    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 *));
    294 
    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 *));
    300 
    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 *));
    305 
    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 *));
    311 
    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 *));
    317 
    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 *));
    323 
    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 *));
    329 
    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 *));
    333 
    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 *));
    338 
    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 *));
    343 
    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 *));
    347 
    348 extern int ctr_mode_final(ctr_ctx_t *, crypto_data_t *,
    349     int (*encrypt_block)(const void *, const uint8_t *, uint8_t *));
    350 
    351 extern int cbc_init_ctx(cbc_ctx_t *, char *, size_t, size_t,
    352     void (*copy_block)(uint8_t *, uint64_t *));
    353 
    354 extern int ctr_init_ctx(ctr_ctx_t *, ulong_t, uint8_t *,
    355     void (*copy_block)(uint8_t *, uint8_t *));
    356 
    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 *));
    360 
    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 *));
    365 
    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 *));
    370 
    371 extern void calculate_ccm_mac(ccm_ctx_t *, uint8_t *,
    372     int (*encrypt_block)(const void *, const uint8_t *, uint8_t *));
    373 
    374 extern void gcm_mul(uint64_t *, uint64_t *, uint64_t *);
    375 
    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);
    379 
    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);
    388 
    389 #ifdef	__cplusplus
    390 }
    391 #endif
    392 
    393 #endif	/* _COMMON_CRYPTO_MODES_H */
    394