xref: /xnu-10002.61.3/libkern/crypto/corecrypto_aes.c (revision 0f4c859e951fba394238ab619495c4e1d54d0f34) !
1*0f4c859eSApple OSS Distributions /*
2*0f4c859eSApple OSS Distributions  * Copyright (c) 2012 Apple Computer, Inc. All rights reserved.
3*0f4c859eSApple OSS Distributions  *
4*0f4c859eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*0f4c859eSApple OSS Distributions  *
6*0f4c859eSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*0f4c859eSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*0f4c859eSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*0f4c859eSApple OSS Distributions  * compliance with the License. The rights granted to you under the License
10*0f4c859eSApple OSS Distributions  * may not be used to create, or enable the creation or redistribution of,
11*0f4c859eSApple OSS Distributions  * unlawful or unlicensed copies of an Apple operating system, or to
12*0f4c859eSApple OSS Distributions  * circumvent, violate, or enable the circumvention or violation of, any
13*0f4c859eSApple OSS Distributions  * terms of an Apple operating system software license agreement.
14*0f4c859eSApple OSS Distributions  *
15*0f4c859eSApple OSS Distributions  * Please obtain a copy of the License at
16*0f4c859eSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*0f4c859eSApple OSS Distributions  *
18*0f4c859eSApple OSS Distributions  * The Original Code and all software distributed under the License are
19*0f4c859eSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*0f4c859eSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*0f4c859eSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*0f4c859eSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*0f4c859eSApple OSS Distributions  * Please see the License for the specific language governing rights and
24*0f4c859eSApple OSS Distributions  * limitations under the License.
25*0f4c859eSApple OSS Distributions  *
26*0f4c859eSApple OSS Distributions  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*0f4c859eSApple OSS Distributions  */
28*0f4c859eSApple OSS Distributions 
29*0f4c859eSApple OSS Distributions #include <libkern/crypto/crypto_internal.h>
30*0f4c859eSApple OSS Distributions #include <libkern/crypto/aes.h>
31*0f4c859eSApple OSS Distributions #include <corecrypto/ccmode.h>
32*0f4c859eSApple OSS Distributions #include <corecrypto/ccaes.h>
33*0f4c859eSApple OSS Distributions #include <kern/debug.h>
34*0f4c859eSApple OSS Distributions 
35*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_key(const unsigned char * key,int key_len,aes_encrypt_ctx cx[1])36*0f4c859eSApple OSS Distributions aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])
37*0f4c859eSApple OSS Distributions {
38*0f4c859eSApple OSS Distributions 	const struct ccmode_cbc *cbc = g_crypto_funcs->ccaes_cbc_encrypt;
39*0f4c859eSApple OSS Distributions 
40*0f4c859eSApple OSS Distributions 	/* Make sure the context size for the mode fits in the one we have */
41*0f4c859eSApple OSS Distributions 	if (cbc->size > sizeof(aes_encrypt_ctx)) {
42*0f4c859eSApple OSS Distributions 		panic("%s: inconsistent size for AES encrypt context", __FUNCTION__);
43*0f4c859eSApple OSS Distributions 	}
44*0f4c859eSApple OSS Distributions 
45*0f4c859eSApple OSS Distributions 	return cccbc_init(cbc, cx[0].ctx, key_len, key);
46*0f4c859eSApple OSS Distributions }
47*0f4c859eSApple OSS Distributions 
48*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_cbc(const unsigned char * in_blk,const unsigned char * in_iv,unsigned int num_blk,unsigned char * out_blk,aes_encrypt_ctx cx[1])49*0f4c859eSApple OSS Distributions aes_encrypt_cbc(const unsigned char *in_blk, const unsigned char *in_iv, unsigned int num_blk,
50*0f4c859eSApple OSS Distributions     unsigned char *out_blk, aes_encrypt_ctx cx[1])
51*0f4c859eSApple OSS Distributions {
52*0f4c859eSApple OSS Distributions 	const struct ccmode_cbc *cbc = g_crypto_funcs->ccaes_cbc_encrypt;
53*0f4c859eSApple OSS Distributions 	cccbc_iv_decl(cbc->block_size, ctx_iv);
54*0f4c859eSApple OSS Distributions 
55*0f4c859eSApple OSS Distributions 	int rc = cccbc_set_iv(cbc, ctx_iv, in_iv);
56*0f4c859eSApple OSS Distributions 	if (rc) {
57*0f4c859eSApple OSS Distributions 		return rc;
58*0f4c859eSApple OSS Distributions 	}
59*0f4c859eSApple OSS Distributions 
60*0f4c859eSApple OSS Distributions 	return cccbc_update(cbc, cx[0].ctx, ctx_iv, num_blk, in_blk, out_blk); //Actually cbc encrypt.
61*0f4c859eSApple OSS Distributions }
62*0f4c859eSApple OSS Distributions 
63*0f4c859eSApple OSS Distributions #if defined (__i386__) || defined (__x86_64__) || defined (__arm64__)
64*0f4c859eSApple OSS Distributions /* This does one block of ECB, using the CBC implementation - this allow to use the same context for both CBC and ECB */
65*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt(const unsigned char * in_blk,unsigned char * out_blk,aes_encrypt_ctx cx[1])66*0f4c859eSApple OSS Distributions aes_encrypt(const unsigned char *in_blk, unsigned char *out_blk, aes_encrypt_ctx cx[1])
67*0f4c859eSApple OSS Distributions {
68*0f4c859eSApple OSS Distributions 	return aes_encrypt_cbc(in_blk, NULL, 1, out_blk, cx);
69*0f4c859eSApple OSS Distributions }
70*0f4c859eSApple OSS Distributions #endif
71*0f4c859eSApple OSS Distributions 
72*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_key(const unsigned char * key,int key_len,aes_decrypt_ctx cx[1])73*0f4c859eSApple OSS Distributions aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])
74*0f4c859eSApple OSS Distributions {
75*0f4c859eSApple OSS Distributions 	const struct ccmode_cbc *cbc = g_crypto_funcs->ccaes_cbc_decrypt;
76*0f4c859eSApple OSS Distributions 
77*0f4c859eSApple OSS Distributions 	/* Make sure the context size for the mode fits in the one we have */
78*0f4c859eSApple OSS Distributions 	if (cbc->size > sizeof(aes_decrypt_ctx)) {
79*0f4c859eSApple OSS Distributions 		panic("%s: inconsistent size for AES decrypt context", __FUNCTION__);
80*0f4c859eSApple OSS Distributions 	}
81*0f4c859eSApple OSS Distributions 
82*0f4c859eSApple OSS Distributions 	return cccbc_init(cbc, cx[0].ctx, key_len, key);
83*0f4c859eSApple OSS Distributions }
84*0f4c859eSApple OSS Distributions 
85*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_cbc(const unsigned char * in_blk,const unsigned char * in_iv,unsigned int num_blk,unsigned char * out_blk,aes_decrypt_ctx cx[1])86*0f4c859eSApple OSS Distributions aes_decrypt_cbc(const unsigned char *in_blk, const unsigned char *in_iv, unsigned int num_blk,
87*0f4c859eSApple OSS Distributions     unsigned char *out_blk, aes_decrypt_ctx cx[1])
88*0f4c859eSApple OSS Distributions {
89*0f4c859eSApple OSS Distributions 	const struct ccmode_cbc *cbc = g_crypto_funcs->ccaes_cbc_decrypt;
90*0f4c859eSApple OSS Distributions 	cccbc_iv_decl(cbc->block_size, ctx_iv);
91*0f4c859eSApple OSS Distributions 
92*0f4c859eSApple OSS Distributions 	int rc = cccbc_set_iv(cbc, ctx_iv, in_iv);
93*0f4c859eSApple OSS Distributions 	if (rc) {
94*0f4c859eSApple OSS Distributions 		return rc;
95*0f4c859eSApple OSS Distributions 	}
96*0f4c859eSApple OSS Distributions 
97*0f4c859eSApple OSS Distributions 	return cccbc_update(cbc, cx[0].ctx, ctx_iv, num_blk, in_blk, out_blk); //Actually cbc decrypt.
98*0f4c859eSApple OSS Distributions }
99*0f4c859eSApple OSS Distributions 
100*0f4c859eSApple OSS Distributions #if defined (__i386__) || defined (__x86_64__) || defined (__arm64__)
101*0f4c859eSApple OSS Distributions /* This does one block of ECB, using the CBC implementation - this allow to use the same context for both CBC and ECB */
102*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt(const unsigned char * in_blk,unsigned char * out_blk,aes_decrypt_ctx cx[1])103*0f4c859eSApple OSS Distributions aes_decrypt(const unsigned char *in_blk, unsigned char *out_blk, aes_decrypt_ctx cx[1])
104*0f4c859eSApple OSS Distributions {
105*0f4c859eSApple OSS Distributions 	return aes_decrypt_cbc(in_blk, NULL, 1, out_blk, cx);
106*0f4c859eSApple OSS Distributions }
107*0f4c859eSApple OSS Distributions #endif
108*0f4c859eSApple OSS Distributions 
109*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_key128(const unsigned char * key,aes_encrypt_ctx cx[1])110*0f4c859eSApple OSS Distributions aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])
111*0f4c859eSApple OSS Distributions {
112*0f4c859eSApple OSS Distributions 	return aes_encrypt_key(key, 16, cx);
113*0f4c859eSApple OSS Distributions }
114*0f4c859eSApple OSS Distributions 
115*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_key128(const unsigned char * key,aes_decrypt_ctx cx[1])116*0f4c859eSApple OSS Distributions aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])
117*0f4c859eSApple OSS Distributions {
118*0f4c859eSApple OSS Distributions 	return aes_decrypt_key(key, 16, cx);
119*0f4c859eSApple OSS Distributions }
120*0f4c859eSApple OSS Distributions 
121*0f4c859eSApple OSS Distributions 
122*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_key256(const unsigned char * key,aes_encrypt_ctx cx[1])123*0f4c859eSApple OSS Distributions aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])
124*0f4c859eSApple OSS Distributions {
125*0f4c859eSApple OSS Distributions 	return aes_encrypt_key(key, 32, cx);
126*0f4c859eSApple OSS Distributions }
127*0f4c859eSApple OSS Distributions 
128*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_key256(const unsigned char * key,aes_decrypt_ctx cx[1])129*0f4c859eSApple OSS Distributions aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])
130*0f4c859eSApple OSS Distributions {
131*0f4c859eSApple OSS Distributions 	return aes_decrypt_key(key, 32, cx);
132*0f4c859eSApple OSS Distributions }
133*0f4c859eSApple OSS Distributions 
134*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_key_gcm(const unsigned char * key,int key_len,ccgcm_ctx * ctx)135*0f4c859eSApple OSS Distributions aes_encrypt_key_gcm(const unsigned char *key, int key_len, ccgcm_ctx *ctx)
136*0f4c859eSApple OSS Distributions {
137*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
138*0f4c859eSApple OSS Distributions 	if (!gcm) {
139*0f4c859eSApple OSS Distributions 		return aes_error;
140*0f4c859eSApple OSS Distributions 	}
141*0f4c859eSApple OSS Distributions 
142*0f4c859eSApple OSS Distributions 	return ccgcm_init(gcm, ctx, key_len, key);
143*0f4c859eSApple OSS Distributions }
144*0f4c859eSApple OSS Distributions 
145*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_key_with_iv_gcm(const unsigned char * key,int key_len,const unsigned char * in_iv,ccgcm_ctx * ctx)146*0f4c859eSApple OSS Distributions aes_encrypt_key_with_iv_gcm(const unsigned char *key, int key_len, const unsigned char *in_iv, ccgcm_ctx *ctx)
147*0f4c859eSApple OSS Distributions {
148*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
149*0f4c859eSApple OSS Distributions 	if (!gcm) {
150*0f4c859eSApple OSS Distributions 		return aes_error;
151*0f4c859eSApple OSS Distributions 	}
152*0f4c859eSApple OSS Distributions 
153*0f4c859eSApple OSS Distributions 	return g_crypto_funcs->ccgcm_init_with_iv_fn(gcm, ctx, key_len, key, in_iv);
154*0f4c859eSApple OSS Distributions }
155*0f4c859eSApple OSS Distributions 
156*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_set_iv_gcm(const unsigned char * in_iv,unsigned int len,ccgcm_ctx * ctx)157*0f4c859eSApple OSS Distributions aes_encrypt_set_iv_gcm(const unsigned char *in_iv, unsigned int len, ccgcm_ctx *ctx)
158*0f4c859eSApple OSS Distributions {
159*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
160*0f4c859eSApple OSS Distributions 	if (!gcm) {
161*0f4c859eSApple OSS Distributions 		return aes_error;
162*0f4c859eSApple OSS Distributions 	}
163*0f4c859eSApple OSS Distributions 
164*0f4c859eSApple OSS Distributions 	return ccgcm_set_iv(gcm, ctx, len, in_iv);
165*0f4c859eSApple OSS Distributions }
166*0f4c859eSApple OSS Distributions 
167*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_reset_gcm(ccgcm_ctx * ctx)168*0f4c859eSApple OSS Distributions aes_encrypt_reset_gcm(ccgcm_ctx *ctx)
169*0f4c859eSApple OSS Distributions {
170*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
171*0f4c859eSApple OSS Distributions 	if (!gcm) {
172*0f4c859eSApple OSS Distributions 		return aes_error;
173*0f4c859eSApple OSS Distributions 	}
174*0f4c859eSApple OSS Distributions 
175*0f4c859eSApple OSS Distributions 	return ccgcm_reset(gcm, ctx);
176*0f4c859eSApple OSS Distributions }
177*0f4c859eSApple OSS Distributions 
178*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_inc_iv_gcm(unsigned char * out_iv,ccgcm_ctx * ctx)179*0f4c859eSApple OSS Distributions aes_encrypt_inc_iv_gcm(unsigned char *out_iv, ccgcm_ctx *ctx)
180*0f4c859eSApple OSS Distributions {
181*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
182*0f4c859eSApple OSS Distributions 	if (!gcm) {
183*0f4c859eSApple OSS Distributions 		return aes_error;
184*0f4c859eSApple OSS Distributions 	}
185*0f4c859eSApple OSS Distributions 
186*0f4c859eSApple OSS Distributions 	return g_crypto_funcs->ccgcm_inc_iv_fn(gcm, ctx, out_iv);
187*0f4c859eSApple OSS Distributions }
188*0f4c859eSApple OSS Distributions 
189*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_aad_gcm(const unsigned char * aad,unsigned int aad_bytes,ccgcm_ctx * ctx)190*0f4c859eSApple OSS Distributions aes_encrypt_aad_gcm(const unsigned char *aad, unsigned int aad_bytes, ccgcm_ctx *ctx)
191*0f4c859eSApple OSS Distributions {
192*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
193*0f4c859eSApple OSS Distributions 	if (!gcm) {
194*0f4c859eSApple OSS Distributions 		return aes_error;
195*0f4c859eSApple OSS Distributions 	}
196*0f4c859eSApple OSS Distributions 
197*0f4c859eSApple OSS Distributions 	return ccgcm_aad(gcm, ctx, aad_bytes, aad);
198*0f4c859eSApple OSS Distributions }
199*0f4c859eSApple OSS Distributions 
200*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_gcm(const unsigned char * in_blk,unsigned int num_bytes,unsigned char * out_blk,ccgcm_ctx * ctx)201*0f4c859eSApple OSS Distributions aes_encrypt_gcm(const unsigned char *in_blk, unsigned int num_bytes,
202*0f4c859eSApple OSS Distributions     unsigned char *out_blk, ccgcm_ctx *ctx)
203*0f4c859eSApple OSS Distributions {
204*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
205*0f4c859eSApple OSS Distributions 	if (!gcm) {
206*0f4c859eSApple OSS Distributions 		return aes_error;
207*0f4c859eSApple OSS Distributions 	}
208*0f4c859eSApple OSS Distributions 
209*0f4c859eSApple OSS Distributions 	return ccgcm_update(gcm, ctx, num_bytes, in_blk, out_blk);      //Actually gcm encrypt.
210*0f4c859eSApple OSS Distributions }
211*0f4c859eSApple OSS Distributions 
212*0f4c859eSApple OSS Distributions aes_rval
aes_encrypt_finalize_gcm(unsigned char * tag,size_t tag_bytes,ccgcm_ctx * ctx)213*0f4c859eSApple OSS Distributions aes_encrypt_finalize_gcm(unsigned char *tag, size_t tag_bytes, ccgcm_ctx *ctx)
214*0f4c859eSApple OSS Distributions {
215*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
216*0f4c859eSApple OSS Distributions 	if (!gcm) {
217*0f4c859eSApple OSS Distributions 		return aes_error;
218*0f4c859eSApple OSS Distributions 	}
219*0f4c859eSApple OSS Distributions 
220*0f4c859eSApple OSS Distributions 	int rc = ccgcm_finalize(gcm, ctx, tag_bytes, tag);
221*0f4c859eSApple OSS Distributions 	if (rc) {
222*0f4c859eSApple OSS Distributions 		return rc;
223*0f4c859eSApple OSS Distributions 	}
224*0f4c859eSApple OSS Distributions 
225*0f4c859eSApple OSS Distributions 	return ccgcm_reset(gcm, ctx);
226*0f4c859eSApple OSS Distributions }
227*0f4c859eSApple OSS Distributions 
228*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_key_gcm(const unsigned char * key,int key_len,ccgcm_ctx * ctx)229*0f4c859eSApple OSS Distributions aes_decrypt_key_gcm(const unsigned char *key, int key_len, ccgcm_ctx *ctx)
230*0f4c859eSApple OSS Distributions {
231*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
232*0f4c859eSApple OSS Distributions 	if (!gcm) {
233*0f4c859eSApple OSS Distributions 		return aes_error;
234*0f4c859eSApple OSS Distributions 	}
235*0f4c859eSApple OSS Distributions 
236*0f4c859eSApple OSS Distributions 	return ccgcm_init(gcm, ctx, key_len, key);
237*0f4c859eSApple OSS Distributions }
238*0f4c859eSApple OSS Distributions 
239*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_key_with_iv_gcm(const unsigned char * key,int key_len,const unsigned char * in_iv,ccgcm_ctx * ctx)240*0f4c859eSApple OSS Distributions aes_decrypt_key_with_iv_gcm(const unsigned char *key, int key_len, const unsigned char *in_iv, ccgcm_ctx *ctx)
241*0f4c859eSApple OSS Distributions {
242*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
243*0f4c859eSApple OSS Distributions 	if (!gcm) {
244*0f4c859eSApple OSS Distributions 		return aes_error;
245*0f4c859eSApple OSS Distributions 	}
246*0f4c859eSApple OSS Distributions 
247*0f4c859eSApple OSS Distributions 	return g_crypto_funcs->ccgcm_init_with_iv_fn(gcm, ctx, key_len, key, in_iv);
248*0f4c859eSApple OSS Distributions }
249*0f4c859eSApple OSS Distributions 
250*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_set_iv_gcm(const unsigned char * in_iv,size_t len,ccgcm_ctx * ctx)251*0f4c859eSApple OSS Distributions aes_decrypt_set_iv_gcm(const unsigned char *in_iv, size_t len, ccgcm_ctx *ctx)
252*0f4c859eSApple OSS Distributions {
253*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
254*0f4c859eSApple OSS Distributions 	if (!gcm) {
255*0f4c859eSApple OSS Distributions 		return aes_error;
256*0f4c859eSApple OSS Distributions 	}
257*0f4c859eSApple OSS Distributions 
258*0f4c859eSApple OSS Distributions 	int rc = ccgcm_reset(gcm, ctx);
259*0f4c859eSApple OSS Distributions 	if (rc) {
260*0f4c859eSApple OSS Distributions 		return rc;
261*0f4c859eSApple OSS Distributions 	}
262*0f4c859eSApple OSS Distributions 
263*0f4c859eSApple OSS Distributions 	return ccgcm_set_iv(gcm, ctx, len, in_iv);
264*0f4c859eSApple OSS Distributions }
265*0f4c859eSApple OSS Distributions 
266*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_reset_gcm(ccgcm_ctx * ctx)267*0f4c859eSApple OSS Distributions aes_decrypt_reset_gcm(ccgcm_ctx *ctx)
268*0f4c859eSApple OSS Distributions {
269*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
270*0f4c859eSApple OSS Distributions 	if (!gcm) {
271*0f4c859eSApple OSS Distributions 		return aes_error;
272*0f4c859eSApple OSS Distributions 	}
273*0f4c859eSApple OSS Distributions 
274*0f4c859eSApple OSS Distributions 	return ccgcm_reset(gcm, ctx);
275*0f4c859eSApple OSS Distributions }
276*0f4c859eSApple OSS Distributions 
277*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_inc_iv_gcm(unsigned char * out_iv,ccgcm_ctx * ctx)278*0f4c859eSApple OSS Distributions aes_decrypt_inc_iv_gcm(unsigned char *out_iv, ccgcm_ctx *ctx)
279*0f4c859eSApple OSS Distributions {
280*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
281*0f4c859eSApple OSS Distributions 	if (!gcm) {
282*0f4c859eSApple OSS Distributions 		return aes_error;
283*0f4c859eSApple OSS Distributions 	}
284*0f4c859eSApple OSS Distributions 
285*0f4c859eSApple OSS Distributions 	return g_crypto_funcs->ccgcm_inc_iv_fn(gcm, ctx, out_iv);
286*0f4c859eSApple OSS Distributions }
287*0f4c859eSApple OSS Distributions 
288*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_aad_gcm(const unsigned char * aad,unsigned int aad_bytes,ccgcm_ctx * ctx)289*0f4c859eSApple OSS Distributions aes_decrypt_aad_gcm(const unsigned char *aad, unsigned int aad_bytes, ccgcm_ctx *ctx)
290*0f4c859eSApple OSS Distributions {
291*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
292*0f4c859eSApple OSS Distributions 	if (!gcm) {
293*0f4c859eSApple OSS Distributions 		return aes_error;
294*0f4c859eSApple OSS Distributions 	}
295*0f4c859eSApple OSS Distributions 
296*0f4c859eSApple OSS Distributions 	return ccgcm_aad(gcm, ctx, aad_bytes, aad);
297*0f4c859eSApple OSS Distributions }
298*0f4c859eSApple OSS Distributions 
299*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_gcm(const unsigned char * in_blk,unsigned int num_bytes,unsigned char * out_blk,ccgcm_ctx * ctx)300*0f4c859eSApple OSS Distributions aes_decrypt_gcm(const unsigned char *in_blk, unsigned int num_bytes,
301*0f4c859eSApple OSS Distributions     unsigned char *out_blk, ccgcm_ctx *ctx)
302*0f4c859eSApple OSS Distributions {
303*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
304*0f4c859eSApple OSS Distributions 	if (!gcm) {
305*0f4c859eSApple OSS Distributions 		return aes_error;
306*0f4c859eSApple OSS Distributions 	}
307*0f4c859eSApple OSS Distributions 
308*0f4c859eSApple OSS Distributions 	return ccgcm_update(gcm, ctx, num_bytes, in_blk, out_blk);      //Actually gcm decrypt.
309*0f4c859eSApple OSS Distributions }
310*0f4c859eSApple OSS Distributions 
311*0f4c859eSApple OSS Distributions aes_rval
aes_decrypt_finalize_gcm(unsigned char * tag,size_t tag_bytes,ccgcm_ctx * ctx)312*0f4c859eSApple OSS Distributions aes_decrypt_finalize_gcm(unsigned char *tag, size_t tag_bytes, ccgcm_ctx *ctx)
313*0f4c859eSApple OSS Distributions {
314*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
315*0f4c859eSApple OSS Distributions 	if (!gcm) {
316*0f4c859eSApple OSS Distributions 		return aes_error;
317*0f4c859eSApple OSS Distributions 	}
318*0f4c859eSApple OSS Distributions 
319*0f4c859eSApple OSS Distributions 	int rc = ccgcm_finalize(gcm, ctx, tag_bytes, tag);
320*0f4c859eSApple OSS Distributions 	if (rc) {
321*0f4c859eSApple OSS Distributions 		return rc;
322*0f4c859eSApple OSS Distributions 	}
323*0f4c859eSApple OSS Distributions 
324*0f4c859eSApple OSS Distributions 	return ccgcm_reset(gcm, ctx);
325*0f4c859eSApple OSS Distributions }
326*0f4c859eSApple OSS Distributions 
327*0f4c859eSApple OSS Distributions size_t
aes_encrypt_get_ctx_size_gcm(void)328*0f4c859eSApple OSS Distributions aes_encrypt_get_ctx_size_gcm(void)
329*0f4c859eSApple OSS Distributions {
330*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_encrypt;
331*0f4c859eSApple OSS Distributions 	if (!gcm) {
332*0f4c859eSApple OSS Distributions 		return 0;
333*0f4c859eSApple OSS Distributions 	}
334*0f4c859eSApple OSS Distributions 	return cc_ctx_sizeof(ccgcm_ctx, gcm->size);
335*0f4c859eSApple OSS Distributions }
336*0f4c859eSApple OSS Distributions 
337*0f4c859eSApple OSS Distributions size_t
aes_decrypt_get_ctx_size_gcm(void)338*0f4c859eSApple OSS Distributions aes_decrypt_get_ctx_size_gcm(void)
339*0f4c859eSApple OSS Distributions {
340*0f4c859eSApple OSS Distributions 	const struct ccmode_gcm *gcm = g_crypto_funcs->ccaes_gcm_decrypt;
341*0f4c859eSApple OSS Distributions 	if (!gcm) {
342*0f4c859eSApple OSS Distributions 		return 0;
343*0f4c859eSApple OSS Distributions 	}
344*0f4c859eSApple OSS Distributions 	return cc_ctx_sizeof(ccgcm_ctx, gcm->size);
345*0f4c859eSApple OSS Distributions }
346