1/*
2 * GCM: Galois/Counter Mode.
3 *
4 * Copyright (c) 2007 Nokia Siemens Networks - Mikko Herranen <mh1@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 */
10
11#include <crypto/gf128mul.h>
12#include <crypto/internal/aead.h>
13#include <crypto/internal/skcipher.h>
14#include <crypto/internal/hash.h>
15#include <crypto/scatterwalk.h>
16#include <crypto/hash.h>
17#include "internal.h"
18#include <linux/completion.h>
19#include <linux/err.h>
20#include <linux/init.h>
21#include <linux/kernel.h>
22#include <linux/module.h>
23#include <linux/slab.h>
24
25struct gcm_instance_ctx {
26	struct crypto_skcipher_spawn ctr;
27	struct crypto_ahash_spawn ghash;
28};
29
30struct crypto_gcm_ctx {
31	struct crypto_ablkcipher *ctr;
32	struct crypto_ahash *ghash;
33};
34
35struct crypto_rfc4106_ctx {
36	struct crypto_aead *child;
37	u8 nonce[4];
38};
39
40struct crypto_rfc4543_ctx {
41	struct crypto_aead *child;
42	u8 nonce[4];
43};
44
45struct crypto_rfc4543_req_ctx {
46	u8 auth_tag[16];
47	struct scatterlist cipher[1];
48	struct scatterlist payload[2];
49	struct scatterlist assoc[2];
50	struct aead_request subreq;
51};
52
53struct crypto_gcm_ghash_ctx {
54	unsigned int cryptlen;
55	struct scatterlist *src;
56	void (*complete)(struct aead_request *req, int err);
57};
58
59struct crypto_gcm_req_priv_ctx {
60	u8 auth_tag[16];
61	u8 iauth_tag[16];
62	struct scatterlist src[2];
63	struct scatterlist dst[2];
64	struct crypto_gcm_ghash_ctx ghash_ctx;
65	union {
66		struct ahash_request ahreq;
67		struct ablkcipher_request abreq;
68	} u;
69};
70
71struct crypto_gcm_setkey_result {
72	int err;
73	struct completion completion;
74};
75
76static void *gcm_zeroes;
77
78static inline struct crypto_gcm_req_priv_ctx *crypto_gcm_reqctx(
79	struct aead_request *req)
80{
81	unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req));
82
83	return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1);
84}
85
86static void crypto_gcm_setkey_done(struct crypto_async_request *req, int err)
87{
88	struct crypto_gcm_setkey_result *result = req->data;
89
90	if (err == -EINPROGRESS)
91		return;
92
93	result->err = err;
94	complete(&result->completion);
95}
96
97static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
98			     unsigned int keylen)
99{
100	struct crypto_gcm_ctx *ctx = crypto_aead_ctx(aead);
101	struct crypto_ahash *ghash = ctx->ghash;
102	struct crypto_ablkcipher *ctr = ctx->ctr;
103	struct {
104		be128 hash;
105		u8 iv[8];
106
107		struct crypto_gcm_setkey_result result;
108
109		struct scatterlist sg[1];
110		struct ablkcipher_request req;
111	} *data;
112	int err;
113
114	crypto_ablkcipher_clear_flags(ctr, CRYPTO_TFM_REQ_MASK);
115	crypto_ablkcipher_set_flags(ctr, crypto_aead_get_flags(aead) &
116				   CRYPTO_TFM_REQ_MASK);
117
118	err = crypto_ablkcipher_setkey(ctr, key, keylen);
119	if (err)
120		return err;
121
122	crypto_aead_set_flags(aead, crypto_ablkcipher_get_flags(ctr) &
123				       CRYPTO_TFM_RES_MASK);
124
125	data = kzalloc(sizeof(*data) + crypto_ablkcipher_reqsize(ctr),
126		       GFP_KERNEL);
127	if (!data)
128		return -ENOMEM;
129
130	init_completion(&data->result.completion);
131	sg_init_one(data->sg, &data->hash, sizeof(data->hash));
132	ablkcipher_request_set_tfm(&data->req, ctr);
133	ablkcipher_request_set_callback(&data->req, CRYPTO_TFM_REQ_MAY_SLEEP |
134						    CRYPTO_TFM_REQ_MAY_BACKLOG,
135					crypto_gcm_setkey_done,
136					&data->result);
137	ablkcipher_request_set_crypt(&data->req, data->sg, data->sg,
138				     sizeof(data->hash), data->iv);
139
140	err = crypto_ablkcipher_encrypt(&data->req);
141	if (err == -EINPROGRESS || err == -EBUSY) {
142		err = wait_for_completion_interruptible(
143			&data->result.completion);
144		if (!err)
145			err = data->result.err;
146	}
147
148	if (err)
149		goto out;
150
151	crypto_ahash_clear_flags(ghash, CRYPTO_TFM_REQ_MASK);
152	crypto_ahash_set_flags(ghash, crypto_aead_get_flags(aead) &
153			       CRYPTO_TFM_REQ_MASK);
154	err = crypto_ahash_setkey(ghash, (u8 *)&data->hash, sizeof(be128));
155	crypto_aead_set_flags(aead, crypto_ahash_get_flags(ghash) &
156			      CRYPTO_TFM_RES_MASK);
157
158out:
159	kfree(data);
160	return err;
161}
162
163static int crypto_gcm_setauthsize(struct crypto_aead *tfm,
164				  unsigned int authsize)
165{
166	switch (authsize) {
167	case 4:
168	case 8:
169	case 12:
170	case 13:
171	case 14:
172	case 15:
173	case 16:
174		break;
175	default:
176		return -EINVAL;
177	}
178
179	return 0;
180}
181
182static void crypto_gcm_init_crypt(struct ablkcipher_request *ablk_req,
183				  struct aead_request *req,
184				  unsigned int cryptlen)
185{
186	struct crypto_aead *aead = crypto_aead_reqtfm(req);
187	struct crypto_gcm_ctx *ctx = crypto_aead_ctx(aead);
188	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
189	struct scatterlist *dst;
190	__be32 counter = cpu_to_be32(1);
191
192	memset(pctx->auth_tag, 0, sizeof(pctx->auth_tag));
193	memcpy(req->iv + 12, &counter, 4);
194
195	sg_init_table(pctx->src, 2);
196	sg_set_buf(pctx->src, pctx->auth_tag, sizeof(pctx->auth_tag));
197	scatterwalk_sg_chain(pctx->src, 2, req->src);
198
199	dst = pctx->src;
200	if (req->src != req->dst) {
201		sg_init_table(pctx->dst, 2);
202		sg_set_buf(pctx->dst, pctx->auth_tag, sizeof(pctx->auth_tag));
203		scatterwalk_sg_chain(pctx->dst, 2, req->dst);
204		dst = pctx->dst;
205	}
206
207	ablkcipher_request_set_tfm(ablk_req, ctx->ctr);
208	ablkcipher_request_set_crypt(ablk_req, pctx->src, dst,
209				     cryptlen + sizeof(pctx->auth_tag),
210				     req->iv);
211}
212
213static inline unsigned int gcm_remain(unsigned int len)
214{
215	len &= 0xfU;
216	return len ? 16 - len : 0;
217}
218
219static void gcm_hash_len_done(struct crypto_async_request *areq, int err);
220static void gcm_hash_final_done(struct crypto_async_request *areq, int err);
221
222static int gcm_hash_update(struct aead_request *req,
223			   struct crypto_gcm_req_priv_ctx *pctx,
224			   crypto_completion_t complete,
225			   struct scatterlist *src,
226			   unsigned int len)
227{
228	struct ahash_request *ahreq = &pctx->u.ahreq;
229
230	ahash_request_set_callback(ahreq, aead_request_flags(req),
231				   complete, req);
232	ahash_request_set_crypt(ahreq, src, NULL, len);
233
234	return crypto_ahash_update(ahreq);
235}
236
237static int gcm_hash_remain(struct aead_request *req,
238			   struct crypto_gcm_req_priv_ctx *pctx,
239			   unsigned int remain,
240			   crypto_completion_t complete)
241{
242	struct ahash_request *ahreq = &pctx->u.ahreq;
243
244	ahash_request_set_callback(ahreq, aead_request_flags(req),
245				   complete, req);
246	sg_init_one(pctx->src, gcm_zeroes, remain);
247	ahash_request_set_crypt(ahreq, pctx->src, NULL, remain);
248
249	return crypto_ahash_update(ahreq);
250}
251
252static int gcm_hash_len(struct aead_request *req,
253			struct crypto_gcm_req_priv_ctx *pctx)
254{
255	struct ahash_request *ahreq = &pctx->u.ahreq;
256	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
257	u128 lengths;
258
259	lengths.a = cpu_to_be64(req->assoclen * 8);
260	lengths.b = cpu_to_be64(gctx->cryptlen * 8);
261	memcpy(pctx->iauth_tag, &lengths, 16);
262	sg_init_one(pctx->src, pctx->iauth_tag, 16);
263	ahash_request_set_callback(ahreq, aead_request_flags(req),
264				   gcm_hash_len_done, req);
265	ahash_request_set_crypt(ahreq, pctx->src,
266				NULL, sizeof(lengths));
267
268	return crypto_ahash_update(ahreq);
269}
270
271static int gcm_hash_final(struct aead_request *req,
272			  struct crypto_gcm_req_priv_ctx *pctx)
273{
274	struct ahash_request *ahreq = &pctx->u.ahreq;
275
276	ahash_request_set_callback(ahreq, aead_request_flags(req),
277				   gcm_hash_final_done, req);
278	ahash_request_set_crypt(ahreq, NULL, pctx->iauth_tag, 0);
279
280	return crypto_ahash_final(ahreq);
281}
282
283static void __gcm_hash_final_done(struct aead_request *req, int err)
284{
285	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
286	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
287
288	if (!err)
289		crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16);
290
291	gctx->complete(req, err);
292}
293
294static void gcm_hash_final_done(struct crypto_async_request *areq, int err)
295{
296	struct aead_request *req = areq->data;
297
298	__gcm_hash_final_done(req, err);
299}
300
301static void __gcm_hash_len_done(struct aead_request *req, int err)
302{
303	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
304
305	if (!err) {
306		err = gcm_hash_final(req, pctx);
307		if (err == -EINPROGRESS || err == -EBUSY)
308			return;
309	}
310
311	__gcm_hash_final_done(req, err);
312}
313
314static void gcm_hash_len_done(struct crypto_async_request *areq, int err)
315{
316	struct aead_request *req = areq->data;
317
318	__gcm_hash_len_done(req, err);
319}
320
321static void __gcm_hash_crypt_remain_done(struct aead_request *req, int err)
322{
323	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
324
325	if (!err) {
326		err = gcm_hash_len(req, pctx);
327		if (err == -EINPROGRESS || err == -EBUSY)
328			return;
329	}
330
331	__gcm_hash_len_done(req, err);
332}
333
334static void gcm_hash_crypt_remain_done(struct crypto_async_request *areq,
335				       int err)
336{
337	struct aead_request *req = areq->data;
338
339	__gcm_hash_crypt_remain_done(req, err);
340}
341
342static void __gcm_hash_crypt_done(struct aead_request *req, int err)
343{
344	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
345	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
346	unsigned int remain;
347
348	if (!err) {
349		remain = gcm_remain(gctx->cryptlen);
350		BUG_ON(!remain);
351		err = gcm_hash_remain(req, pctx, remain,
352				      gcm_hash_crypt_remain_done);
353		if (err == -EINPROGRESS || err == -EBUSY)
354			return;
355	}
356
357	__gcm_hash_crypt_remain_done(req, err);
358}
359
360static void gcm_hash_crypt_done(struct crypto_async_request *areq, int err)
361{
362	struct aead_request *req = areq->data;
363
364	__gcm_hash_crypt_done(req, err);
365}
366
367static void __gcm_hash_assoc_remain_done(struct aead_request *req, int err)
368{
369	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
370	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
371	crypto_completion_t complete;
372	unsigned int remain = 0;
373
374	if (!err && gctx->cryptlen) {
375		remain = gcm_remain(gctx->cryptlen);
376		complete = remain ? gcm_hash_crypt_done :
377			gcm_hash_crypt_remain_done;
378		err = gcm_hash_update(req, pctx, complete,
379				      gctx->src, gctx->cryptlen);
380		if (err == -EINPROGRESS || err == -EBUSY)
381			return;
382	}
383
384	if (remain)
385		__gcm_hash_crypt_done(req, err);
386	else
387		__gcm_hash_crypt_remain_done(req, err);
388}
389
390static void gcm_hash_assoc_remain_done(struct crypto_async_request *areq,
391				       int err)
392{
393	struct aead_request *req = areq->data;
394
395	__gcm_hash_assoc_remain_done(req, err);
396}
397
398static void __gcm_hash_assoc_done(struct aead_request *req, int err)
399{
400	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
401	unsigned int remain;
402
403	if (!err) {
404		remain = gcm_remain(req->assoclen);
405		BUG_ON(!remain);
406		err = gcm_hash_remain(req, pctx, remain,
407				      gcm_hash_assoc_remain_done);
408		if (err == -EINPROGRESS || err == -EBUSY)
409			return;
410	}
411
412	__gcm_hash_assoc_remain_done(req, err);
413}
414
415static void gcm_hash_assoc_done(struct crypto_async_request *areq, int err)
416{
417	struct aead_request *req = areq->data;
418
419	__gcm_hash_assoc_done(req, err);
420}
421
422static void __gcm_hash_init_done(struct aead_request *req, int err)
423{
424	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
425	crypto_completion_t complete;
426	unsigned int remain = 0;
427
428	if (!err && req->assoclen) {
429		remain = gcm_remain(req->assoclen);
430		complete = remain ? gcm_hash_assoc_done :
431			gcm_hash_assoc_remain_done;
432		err = gcm_hash_update(req, pctx, complete,
433				      req->assoc, req->assoclen);
434		if (err == -EINPROGRESS || err == -EBUSY)
435			return;
436	}
437
438	if (remain)
439		__gcm_hash_assoc_done(req, err);
440	else
441		__gcm_hash_assoc_remain_done(req, err);
442}
443
444static void gcm_hash_init_done(struct crypto_async_request *areq, int err)
445{
446	struct aead_request *req = areq->data;
447
448	__gcm_hash_init_done(req, err);
449}
450
451static int gcm_hash(struct aead_request *req,
452		    struct crypto_gcm_req_priv_ctx *pctx)
453{
454	struct ahash_request *ahreq = &pctx->u.ahreq;
455	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
456	struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
457	unsigned int remain;
458	crypto_completion_t complete;
459	int err;
460
461	ahash_request_set_tfm(ahreq, ctx->ghash);
462
463	ahash_request_set_callback(ahreq, aead_request_flags(req),
464				   gcm_hash_init_done, req);
465	err = crypto_ahash_init(ahreq);
466	if (err)
467		return err;
468	remain = gcm_remain(req->assoclen);
469	complete = remain ? gcm_hash_assoc_done : gcm_hash_assoc_remain_done;
470	err = gcm_hash_update(req, pctx, complete, req->assoc, req->assoclen);
471	if (err)
472		return err;
473	if (remain) {
474		err = gcm_hash_remain(req, pctx, remain,
475				      gcm_hash_assoc_remain_done);
476		if (err)
477			return err;
478	}
479	remain = gcm_remain(gctx->cryptlen);
480	complete = remain ? gcm_hash_crypt_done : gcm_hash_crypt_remain_done;
481	err = gcm_hash_update(req, pctx, complete, gctx->src, gctx->cryptlen);
482	if (err)
483		return err;
484	if (remain) {
485		err = gcm_hash_remain(req, pctx, remain,
486				      gcm_hash_crypt_remain_done);
487		if (err)
488			return err;
489	}
490	err = gcm_hash_len(req, pctx);
491	if (err)
492		return err;
493	err = gcm_hash_final(req, pctx);
494	if (err)
495		return err;
496
497	return 0;
498}
499
500static void gcm_enc_copy_hash(struct aead_request *req,
501			      struct crypto_gcm_req_priv_ctx *pctx)
502{
503	struct crypto_aead *aead = crypto_aead_reqtfm(req);
504	u8 *auth_tag = pctx->auth_tag;
505
506	scatterwalk_map_and_copy(auth_tag, req->dst, req->cryptlen,
507				 crypto_aead_authsize(aead), 1);
508}
509
510static void gcm_enc_hash_done(struct aead_request *req, int err)
511{
512	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
513
514	if (!err)
515		gcm_enc_copy_hash(req, pctx);
516
517	aead_request_complete(req, err);
518}
519
520static void gcm_encrypt_done(struct crypto_async_request *areq, int err)
521{
522	struct aead_request *req = areq->data;
523	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
524
525	if (!err) {
526		err = gcm_hash(req, pctx);
527		if (err == -EINPROGRESS || err == -EBUSY)
528			return;
529		else if (!err) {
530			crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16);
531			gcm_enc_copy_hash(req, pctx);
532		}
533	}
534
535	aead_request_complete(req, err);
536}
537
538static int crypto_gcm_encrypt(struct aead_request *req)
539{
540	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
541	struct ablkcipher_request *abreq = &pctx->u.abreq;
542	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
543	int err;
544
545	crypto_gcm_init_crypt(abreq, req, req->cryptlen);
546	ablkcipher_request_set_callback(abreq, aead_request_flags(req),
547					gcm_encrypt_done, req);
548
549	gctx->src = req->dst;
550	gctx->cryptlen = req->cryptlen;
551	gctx->complete = gcm_enc_hash_done;
552
553	err = crypto_ablkcipher_encrypt(abreq);
554	if (err)
555		return err;
556
557	err = gcm_hash(req, pctx);
558	if (err)
559		return err;
560
561	crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16);
562	gcm_enc_copy_hash(req, pctx);
563
564	return 0;
565}
566
567static int crypto_gcm_verify(struct aead_request *req,
568			     struct crypto_gcm_req_priv_ctx *pctx)
569{
570	struct crypto_aead *aead = crypto_aead_reqtfm(req);
571	u8 *auth_tag = pctx->auth_tag;
572	u8 *iauth_tag = pctx->iauth_tag;
573	unsigned int authsize = crypto_aead_authsize(aead);
574	unsigned int cryptlen = req->cryptlen - authsize;
575
576	crypto_xor(auth_tag, iauth_tag, 16);
577	scatterwalk_map_and_copy(iauth_tag, req->src, cryptlen, authsize, 0);
578	return memcmp(iauth_tag, auth_tag, authsize) ? -EBADMSG : 0;
579}
580
581static void gcm_decrypt_done(struct crypto_async_request *areq, int err)
582{
583	struct aead_request *req = areq->data;
584	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
585
586	if (!err)
587		err = crypto_gcm_verify(req, pctx);
588
589	aead_request_complete(req, err);
590}
591
592static void gcm_dec_hash_done(struct aead_request *req, int err)
593{
594	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
595	struct ablkcipher_request *abreq = &pctx->u.abreq;
596	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
597
598	if (!err) {
599		ablkcipher_request_set_callback(abreq, aead_request_flags(req),
600						gcm_decrypt_done, req);
601		crypto_gcm_init_crypt(abreq, req, gctx->cryptlen);
602		err = crypto_ablkcipher_decrypt(abreq);
603		if (err == -EINPROGRESS || err == -EBUSY)
604			return;
605		else if (!err)
606			err = crypto_gcm_verify(req, pctx);
607	}
608
609	aead_request_complete(req, err);
610}
611
612static int crypto_gcm_decrypt(struct aead_request *req)
613{
614	struct crypto_aead *aead = crypto_aead_reqtfm(req);
615	struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req);
616	struct ablkcipher_request *abreq = &pctx->u.abreq;
617	struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx;
618	unsigned int authsize = crypto_aead_authsize(aead);
619	unsigned int cryptlen = req->cryptlen;
620	int err;
621
622	if (cryptlen < authsize)
623		return -EINVAL;
624	cryptlen -= authsize;
625
626	gctx->src = req->src;
627	gctx->cryptlen = cryptlen;
628	gctx->complete = gcm_dec_hash_done;
629
630	err = gcm_hash(req, pctx);
631	if (err)
632		return err;
633
634	ablkcipher_request_set_callback(abreq, aead_request_flags(req),
635					gcm_decrypt_done, req);
636	crypto_gcm_init_crypt(abreq, req, cryptlen);
637	err = crypto_ablkcipher_decrypt(abreq);
638	if (err)
639		return err;
640
641	return crypto_gcm_verify(req, pctx);
642}
643
644static int crypto_gcm_init_tfm(struct crypto_tfm *tfm)
645{
646	struct crypto_instance *inst = (void *)tfm->__crt_alg;
647	struct gcm_instance_ctx *ictx = crypto_instance_ctx(inst);
648	struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(tfm);
649	struct crypto_ablkcipher *ctr;
650	struct crypto_ahash *ghash;
651	unsigned long align;
652	int err;
653
654	ghash = crypto_spawn_ahash(&ictx->ghash);
655	if (IS_ERR(ghash))
656		return PTR_ERR(ghash);
657
658	ctr = crypto_spawn_skcipher(&ictx->ctr);
659	err = PTR_ERR(ctr);
660	if (IS_ERR(ctr))
661		goto err_free_hash;
662
663	ctx->ctr = ctr;
664	ctx->ghash = ghash;
665
666	align = crypto_tfm_alg_alignmask(tfm);
667	align &= ~(crypto_tfm_ctx_alignment() - 1);
668	tfm->crt_aead.reqsize = align +
669		offsetof(struct crypto_gcm_req_priv_ctx, u) +
670		max(sizeof(struct ablkcipher_request) +
671		    crypto_ablkcipher_reqsize(ctr),
672		    sizeof(struct ahash_request) +
673		    crypto_ahash_reqsize(ghash));
674
675	return 0;
676
677err_free_hash:
678	crypto_free_ahash(ghash);
679	return err;
680}
681
682static void crypto_gcm_exit_tfm(struct crypto_tfm *tfm)
683{
684	struct crypto_gcm_ctx *ctx = crypto_tfm_ctx(tfm);
685
686	crypto_free_ahash(ctx->ghash);
687	crypto_free_ablkcipher(ctx->ctr);
688}
689
690static struct crypto_instance *crypto_gcm_alloc_common(struct rtattr **tb,
691						       const char *full_name,
692						       const char *ctr_name,
693						       const char *ghash_name)
694{
695	struct crypto_attr_type *algt;
696	struct crypto_instance *inst;
697	struct crypto_alg *ctr;
698	struct crypto_alg *ghash_alg;
699	struct ahash_alg *ghash_ahash_alg;
700	struct gcm_instance_ctx *ctx;
701	int err;
702
703	algt = crypto_get_attr_type(tb);
704	err = PTR_ERR(algt);
705	if (IS_ERR(algt))
706		return ERR_PTR(err);
707
708	if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask)
709		return ERR_PTR(-EINVAL);
710
711	ghash_alg = crypto_find_alg(ghash_name, &crypto_ahash_type,
712				    CRYPTO_ALG_TYPE_HASH,
713				    CRYPTO_ALG_TYPE_AHASH_MASK);
714	err = PTR_ERR(ghash_alg);
715	if (IS_ERR(ghash_alg))
716		return ERR_PTR(err);
717
718	err = -ENOMEM;
719	inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
720	if (!inst)
721		goto out_put_ghash;
722
723	ctx = crypto_instance_ctx(inst);
724	ghash_ahash_alg = container_of(ghash_alg, struct ahash_alg, halg.base);
725	err = crypto_init_ahash_spawn(&ctx->ghash, &ghash_ahash_alg->halg,
726				      inst);
727	if (err)
728		goto err_free_inst;
729
730	crypto_set_skcipher_spawn(&ctx->ctr, inst);
731	err = crypto_grab_skcipher(&ctx->ctr, ctr_name, 0,
732				   crypto_requires_sync(algt->type,
733							algt->mask));
734	if (err)
735		goto err_drop_ghash;
736
737	ctr = crypto_skcipher_spawn_alg(&ctx->ctr);
738
739	/* We only support 16-byte blocks. */
740	if (ctr->cra_ablkcipher.ivsize != 16)
741		goto out_put_ctr;
742
743	/* Not a stream cipher? */
744	err = -EINVAL;
745	if (ctr->cra_blocksize != 1)
746		goto out_put_ctr;
747
748	err = -ENAMETOOLONG;
749	if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
750		     "gcm_base(%s,%s)", ctr->cra_driver_name,
751		     ghash_alg->cra_driver_name) >=
752	    CRYPTO_MAX_ALG_NAME)
753		goto out_put_ctr;
754
755	memcpy(inst->alg.cra_name, full_name, CRYPTO_MAX_ALG_NAME);
756
757	inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD;
758	inst->alg.cra_flags |= ctr->cra_flags & CRYPTO_ALG_ASYNC;
759	inst->alg.cra_priority = ctr->cra_priority;
760	inst->alg.cra_blocksize = 1;
761	inst->alg.cra_alignmask = ctr->cra_alignmask | (__alignof__(u64) - 1);
762	inst->alg.cra_type = &crypto_aead_type;
763	inst->alg.cra_aead.ivsize = 16;
764	inst->alg.cra_aead.maxauthsize = 16;
765	inst->alg.cra_ctxsize = sizeof(struct crypto_gcm_ctx);
766	inst->alg.cra_init = crypto_gcm_init_tfm;
767	inst->alg.cra_exit = crypto_gcm_exit_tfm;
768	inst->alg.cra_aead.setkey = crypto_gcm_setkey;
769	inst->alg.cra_aead.setauthsize = crypto_gcm_setauthsize;
770	inst->alg.cra_aead.encrypt = crypto_gcm_encrypt;
771	inst->alg.cra_aead.decrypt = crypto_gcm_decrypt;
772
773out:
774	crypto_mod_put(ghash_alg);
775	return inst;
776
777out_put_ctr:
778	crypto_drop_skcipher(&ctx->ctr);
779err_drop_ghash:
780	crypto_drop_ahash(&ctx->ghash);
781err_free_inst:
782	kfree(inst);
783out_put_ghash:
784	inst = ERR_PTR(err);
785	goto out;
786}
787
788static struct crypto_instance *crypto_gcm_alloc(struct rtattr **tb)
789{
790	int err;
791	const char *cipher_name;
792	char ctr_name[CRYPTO_MAX_ALG_NAME];
793	char full_name[CRYPTO_MAX_ALG_NAME];
794
795	cipher_name = crypto_attr_alg_name(tb[1]);
796	err = PTR_ERR(cipher_name);
797	if (IS_ERR(cipher_name))
798		return ERR_PTR(err);
799
800	if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)", cipher_name) >=
801	    CRYPTO_MAX_ALG_NAME)
802		return ERR_PTR(-ENAMETOOLONG);
803
804	if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "gcm(%s)", cipher_name) >=
805	    CRYPTO_MAX_ALG_NAME)
806		return ERR_PTR(-ENAMETOOLONG);
807
808	return crypto_gcm_alloc_common(tb, full_name, ctr_name, "ghash");
809}
810
811static void crypto_gcm_free(struct crypto_instance *inst)
812{
813	struct gcm_instance_ctx *ctx = crypto_instance_ctx(inst);
814
815	crypto_drop_skcipher(&ctx->ctr);
816	crypto_drop_ahash(&ctx->ghash);
817	kfree(inst);
818}
819
820static struct crypto_template crypto_gcm_tmpl = {
821	.name = "gcm",
822	.alloc = crypto_gcm_alloc,
823	.free = crypto_gcm_free,
824	.module = THIS_MODULE,
825};
826
827static struct crypto_instance *crypto_gcm_base_alloc(struct rtattr **tb)
828{
829	int err;
830	const char *ctr_name;
831	const char *ghash_name;
832	char full_name[CRYPTO_MAX_ALG_NAME];
833
834	ctr_name = crypto_attr_alg_name(tb[1]);
835	err = PTR_ERR(ctr_name);
836	if (IS_ERR(ctr_name))
837		return ERR_PTR(err);
838
839	ghash_name = crypto_attr_alg_name(tb[2]);
840	err = PTR_ERR(ghash_name);
841	if (IS_ERR(ghash_name))
842		return ERR_PTR(err);
843
844	if (snprintf(full_name, CRYPTO_MAX_ALG_NAME, "gcm_base(%s,%s)",
845		     ctr_name, ghash_name) >= CRYPTO_MAX_ALG_NAME)
846		return ERR_PTR(-ENAMETOOLONG);
847
848	return crypto_gcm_alloc_common(tb, full_name, ctr_name, ghash_name);
849}
850
851static struct crypto_template crypto_gcm_base_tmpl = {
852	.name = "gcm_base",
853	.alloc = crypto_gcm_base_alloc,
854	.free = crypto_gcm_free,
855	.module = THIS_MODULE,
856};
857
858static int crypto_rfc4106_setkey(struct crypto_aead *parent, const u8 *key,
859				 unsigned int keylen)
860{
861	struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent);
862	struct crypto_aead *child = ctx->child;
863	int err;
864
865	if (keylen < 4)
866		return -EINVAL;
867
868	keylen -= 4;
869	memcpy(ctx->nonce, key + keylen, 4);
870
871	crypto_aead_clear_flags(child, CRYPTO_TFM_REQ_MASK);
872	crypto_aead_set_flags(child, crypto_aead_get_flags(parent) &
873				     CRYPTO_TFM_REQ_MASK);
874	err = crypto_aead_setkey(child, key, keylen);
875	crypto_aead_set_flags(parent, crypto_aead_get_flags(child) &
876				      CRYPTO_TFM_RES_MASK);
877
878	return err;
879}
880
881static int crypto_rfc4106_setauthsize(struct crypto_aead *parent,
882				      unsigned int authsize)
883{
884	struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(parent);
885
886	switch (authsize) {
887	case 8:
888	case 12:
889	case 16:
890		break;
891	default:
892		return -EINVAL;
893	}
894
895	return crypto_aead_setauthsize(ctx->child, authsize);
896}
897
898static struct aead_request *crypto_rfc4106_crypt(struct aead_request *req)
899{
900	struct aead_request *subreq = aead_request_ctx(req);
901	struct crypto_aead *aead = crypto_aead_reqtfm(req);
902	struct crypto_rfc4106_ctx *ctx = crypto_aead_ctx(aead);
903	struct crypto_aead *child = ctx->child;
904	u8 *iv = PTR_ALIGN((u8 *)(subreq + 1) + crypto_aead_reqsize(child),
905			   crypto_aead_alignmask(child) + 1);
906
907	memcpy(iv, ctx->nonce, 4);
908	memcpy(iv + 4, req->iv, 8);
909
910	aead_request_set_tfm(subreq, child);
911	aead_request_set_callback(subreq, req->base.flags, req->base.complete,
912				  req->base.data);
913	aead_request_set_crypt(subreq, req->src, req->dst, req->cryptlen, iv);
914	aead_request_set_assoc(subreq, req->assoc, req->assoclen);
915
916	return subreq;
917}
918
919static int crypto_rfc4106_encrypt(struct aead_request *req)
920{
921	req = crypto_rfc4106_crypt(req);
922
923	return crypto_aead_encrypt(req);
924}
925
926static int crypto_rfc4106_decrypt(struct aead_request *req)
927{
928	req = crypto_rfc4106_crypt(req);
929
930	return crypto_aead_decrypt(req);
931}
932
933static int crypto_rfc4106_init_tfm(struct crypto_tfm *tfm)
934{
935	struct crypto_instance *inst = (void *)tfm->__crt_alg;
936	struct crypto_aead_spawn *spawn = crypto_instance_ctx(inst);
937	struct crypto_rfc4106_ctx *ctx = crypto_tfm_ctx(tfm);
938	struct crypto_aead *aead;
939	unsigned long align;
940
941	aead = crypto_spawn_aead(spawn);
942	if (IS_ERR(aead))
943		return PTR_ERR(aead);
944
945	ctx->child = aead;
946
947	align = crypto_aead_alignmask(aead);
948	align &= ~(crypto_tfm_ctx_alignment() - 1);
949	tfm->crt_aead.reqsize = sizeof(struct aead_request) +
950				ALIGN(crypto_aead_reqsize(aead),
951				      crypto_tfm_ctx_alignment()) +
952				align + 16;
953
954	return 0;
955}
956
957static void crypto_rfc4106_exit_tfm(struct crypto_tfm *tfm)
958{
959	struct crypto_rfc4106_ctx *ctx = crypto_tfm_ctx(tfm);
960
961	crypto_free_aead(ctx->child);
962}
963
964static struct crypto_instance *crypto_rfc4106_alloc(struct rtattr **tb)
965{
966	struct crypto_attr_type *algt;
967	struct crypto_instance *inst;
968	struct crypto_aead_spawn *spawn;
969	struct crypto_alg *alg;
970	const char *ccm_name;
971	int err;
972
973	algt = crypto_get_attr_type(tb);
974	err = PTR_ERR(algt);
975	if (IS_ERR(algt))
976		return ERR_PTR(err);
977
978	if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask)
979		return ERR_PTR(-EINVAL);
980
981	ccm_name = crypto_attr_alg_name(tb[1]);
982	err = PTR_ERR(ccm_name);
983	if (IS_ERR(ccm_name))
984		return ERR_PTR(err);
985
986	inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
987	if (!inst)
988		return ERR_PTR(-ENOMEM);
989
990	spawn = crypto_instance_ctx(inst);
991	crypto_set_aead_spawn(spawn, inst);
992	err = crypto_grab_aead(spawn, ccm_name, 0,
993			       crypto_requires_sync(algt->type, algt->mask));
994	if (err)
995		goto out_free_inst;
996
997	alg = crypto_aead_spawn_alg(spawn);
998
999	err = -EINVAL;
1000
1001	/* We only support 16-byte blocks. */
1002	if (alg->cra_aead.ivsize != 16)
1003		goto out_drop_alg;
1004
1005	/* Not a stream cipher? */
1006	if (alg->cra_blocksize != 1)
1007		goto out_drop_alg;
1008
1009	err = -ENAMETOOLONG;
1010	if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME,
1011		     "rfc4106(%s)", alg->cra_name) >= CRYPTO_MAX_ALG_NAME ||
1012	    snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
1013		     "rfc4106(%s)", alg->cra_driver_name) >=
1014	    CRYPTO_MAX_ALG_NAME)
1015		goto out_drop_alg;
1016
1017	inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD;
1018	inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC;
1019	inst->alg.cra_priority = alg->cra_priority;
1020	inst->alg.cra_blocksize = 1;
1021	inst->alg.cra_alignmask = alg->cra_alignmask;
1022	inst->alg.cra_type = &crypto_nivaead_type;
1023
1024	inst->alg.cra_aead.ivsize = 8;
1025	inst->alg.cra_aead.maxauthsize = 16;
1026
1027	inst->alg.cra_ctxsize = sizeof(struct crypto_rfc4106_ctx);
1028
1029	inst->alg.cra_init = crypto_rfc4106_init_tfm;
1030	inst->alg.cra_exit = crypto_rfc4106_exit_tfm;
1031
1032	inst->alg.cra_aead.setkey = crypto_rfc4106_setkey;
1033	inst->alg.cra_aead.setauthsize = crypto_rfc4106_setauthsize;
1034	inst->alg.cra_aead.encrypt = crypto_rfc4106_encrypt;
1035	inst->alg.cra_aead.decrypt = crypto_rfc4106_decrypt;
1036
1037	inst->alg.cra_aead.geniv = "seqiv";
1038
1039out:
1040	return inst;
1041
1042out_drop_alg:
1043	crypto_drop_aead(spawn);
1044out_free_inst:
1045	kfree(inst);
1046	inst = ERR_PTR(err);
1047	goto out;
1048}
1049
1050static void crypto_rfc4106_free(struct crypto_instance *inst)
1051{
1052	crypto_drop_spawn(crypto_instance_ctx(inst));
1053	kfree(inst);
1054}
1055
1056static struct crypto_template crypto_rfc4106_tmpl = {
1057	.name = "rfc4106",
1058	.alloc = crypto_rfc4106_alloc,
1059	.free = crypto_rfc4106_free,
1060	.module = THIS_MODULE,
1061};
1062
1063static inline struct crypto_rfc4543_req_ctx *crypto_rfc4543_reqctx(
1064	struct aead_request *req)
1065{
1066	unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req));
1067
1068	return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1);
1069}
1070
1071static int crypto_rfc4543_setkey(struct crypto_aead *parent, const u8 *key,
1072				 unsigned int keylen)
1073{
1074	struct crypto_rfc4543_ctx *ctx = crypto_aead_ctx(parent);
1075	struct crypto_aead *child = ctx->child;
1076	int err;
1077
1078	if (keylen < 4)
1079		return -EINVAL;
1080
1081	keylen -= 4;
1082	memcpy(ctx->nonce, key + keylen, 4);
1083
1084	crypto_aead_clear_flags(child, CRYPTO_TFM_REQ_MASK);
1085	crypto_aead_set_flags(child, crypto_aead_get_flags(parent) &
1086				     CRYPTO_TFM_REQ_MASK);
1087	err = crypto_aead_setkey(child, key, keylen);
1088	crypto_aead_set_flags(parent, crypto_aead_get_flags(child) &
1089				      CRYPTO_TFM_RES_MASK);
1090
1091	return err;
1092}
1093
1094static int crypto_rfc4543_setauthsize(struct crypto_aead *parent,
1095				      unsigned int authsize)
1096{
1097	struct crypto_rfc4543_ctx *ctx = crypto_aead_ctx(parent);
1098
1099	if (authsize != 16)
1100		return -EINVAL;
1101
1102	return crypto_aead_setauthsize(ctx->child, authsize);
1103}
1104
1105/* this is the same as crypto_authenc_chain */
1106static void crypto_rfc4543_chain(struct scatterlist *head,
1107				 struct scatterlist *sg, int chain)
1108{
1109	if (chain) {
1110		head->length += sg->length;
1111		sg = scatterwalk_sg_next(sg);
1112	}
1113
1114	if (sg)
1115		scatterwalk_sg_chain(head, 2, sg);
1116	else
1117		sg_mark_end(head);
1118}
1119
1120static struct aead_request *crypto_rfc4543_crypt(struct aead_request *req,
1121						 int enc)
1122{
1123	struct crypto_aead *aead = crypto_aead_reqtfm(req);
1124	struct crypto_rfc4543_ctx *ctx = crypto_aead_ctx(aead);
1125	struct crypto_rfc4543_req_ctx *rctx = crypto_rfc4543_reqctx(req);
1126	struct aead_request *subreq = &rctx->subreq;
1127	struct scatterlist *dst = req->dst;
1128	struct scatterlist *cipher = rctx->cipher;
1129	struct scatterlist *payload = rctx->payload;
1130	struct scatterlist *assoc = rctx->assoc;
1131	unsigned int authsize = crypto_aead_authsize(aead);
1132	unsigned int assoclen = req->assoclen;
1133	struct page *dstp;
1134	u8 *vdst;
1135	u8 *iv = PTR_ALIGN((u8 *)(rctx + 1) + crypto_aead_reqsize(ctx->child),
1136			   crypto_aead_alignmask(ctx->child) + 1);
1137
1138	memcpy(iv, ctx->nonce, 4);
1139	memcpy(iv + 4, req->iv, 8);
1140
1141	/* construct cipher/plaintext */
1142	if (enc)
1143		memset(rctx->auth_tag, 0, authsize);
1144	else
1145		scatterwalk_map_and_copy(rctx->auth_tag, dst,
1146					 req->cryptlen - authsize,
1147					 authsize, 0);
1148
1149	sg_init_one(cipher, rctx->auth_tag, authsize);
1150
1151	/* construct the aad */
1152	dstp = sg_page(dst);
1153	vdst = PageHighMem(dstp) ? NULL : page_address(dstp) + dst->offset;
1154
1155	sg_init_table(payload, 2);
1156	sg_set_buf(payload, req->iv, 8);
1157	crypto_rfc4543_chain(payload, dst, vdst == req->iv + 8);
1158	assoclen += 8 + req->cryptlen - (enc ? 0 : authsize);
1159
1160	sg_init_table(assoc, 2);
1161	sg_set_page(assoc, sg_page(req->assoc), req->assoc->length,
1162		    req->assoc->offset);
1163	crypto_rfc4543_chain(assoc, payload, 0);
1164
1165	aead_request_set_tfm(subreq, ctx->child);
1166	aead_request_set_callback(subreq, req->base.flags, req->base.complete,
1167				  req->base.data);
1168	aead_request_set_crypt(subreq, cipher, cipher, enc ? 0 : authsize, iv);
1169	aead_request_set_assoc(subreq, assoc, assoclen);
1170
1171	return subreq;
1172}
1173
1174static int crypto_rfc4543_encrypt(struct aead_request *req)
1175{
1176	struct crypto_aead *aead = crypto_aead_reqtfm(req);
1177	struct crypto_rfc4543_req_ctx *rctx = crypto_rfc4543_reqctx(req);
1178	struct aead_request *subreq;
1179	int err;
1180
1181	subreq = crypto_rfc4543_crypt(req, 1);
1182	err = crypto_aead_encrypt(subreq);
1183	if (err)
1184		return err;
1185
1186	scatterwalk_map_and_copy(rctx->auth_tag, req->dst, req->cryptlen,
1187				 crypto_aead_authsize(aead), 1);
1188
1189	return 0;
1190}
1191
1192static int crypto_rfc4543_decrypt(struct aead_request *req)
1193{
1194	req = crypto_rfc4543_crypt(req, 0);
1195
1196	return crypto_aead_decrypt(req);
1197}
1198
1199static int crypto_rfc4543_init_tfm(struct crypto_tfm *tfm)
1200{
1201	struct crypto_instance *inst = (void *)tfm->__crt_alg;
1202	struct crypto_aead_spawn *spawn = crypto_instance_ctx(inst);
1203	struct crypto_rfc4543_ctx *ctx = crypto_tfm_ctx(tfm);
1204	struct crypto_aead *aead;
1205	unsigned long align;
1206
1207	aead = crypto_spawn_aead(spawn);
1208	if (IS_ERR(aead))
1209		return PTR_ERR(aead);
1210
1211	ctx->child = aead;
1212
1213	align = crypto_aead_alignmask(aead);
1214	align &= ~(crypto_tfm_ctx_alignment() - 1);
1215	tfm->crt_aead.reqsize = sizeof(struct crypto_rfc4543_req_ctx) +
1216				ALIGN(crypto_aead_reqsize(aead),
1217				      crypto_tfm_ctx_alignment()) +
1218				align + 16;
1219
1220	return 0;
1221}
1222
1223static void crypto_rfc4543_exit_tfm(struct crypto_tfm *tfm)
1224{
1225	struct crypto_rfc4543_ctx *ctx = crypto_tfm_ctx(tfm);
1226
1227	crypto_free_aead(ctx->child);
1228}
1229
1230static struct crypto_instance *crypto_rfc4543_alloc(struct rtattr **tb)
1231{
1232	struct crypto_attr_type *algt;
1233	struct crypto_instance *inst;
1234	struct crypto_aead_spawn *spawn;
1235	struct crypto_alg *alg;
1236	const char *ccm_name;
1237	int err;
1238
1239	algt = crypto_get_attr_type(tb);
1240	err = PTR_ERR(algt);
1241	if (IS_ERR(algt))
1242		return ERR_PTR(err);
1243
1244	if ((algt->type ^ CRYPTO_ALG_TYPE_AEAD) & algt->mask)
1245		return ERR_PTR(-EINVAL);
1246
1247	ccm_name = crypto_attr_alg_name(tb[1]);
1248	err = PTR_ERR(ccm_name);
1249	if (IS_ERR(ccm_name))
1250		return ERR_PTR(err);
1251
1252	inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
1253	if (!inst)
1254		return ERR_PTR(-ENOMEM);
1255
1256	spawn = crypto_instance_ctx(inst);
1257	crypto_set_aead_spawn(spawn, inst);
1258	err = crypto_grab_aead(spawn, ccm_name, 0,
1259			       crypto_requires_sync(algt->type, algt->mask));
1260	if (err)
1261		goto out_free_inst;
1262
1263	alg = crypto_aead_spawn_alg(spawn);
1264
1265	err = -EINVAL;
1266
1267	/* We only support 16-byte blocks. */
1268	if (alg->cra_aead.ivsize != 16)
1269		goto out_drop_alg;
1270
1271	/* Not a stream cipher? */
1272	if (alg->cra_blocksize != 1)
1273		goto out_drop_alg;
1274
1275	err = -ENAMETOOLONG;
1276	if (snprintf(inst->alg.cra_name, CRYPTO_MAX_ALG_NAME,
1277		     "rfc4543(%s)", alg->cra_name) >= CRYPTO_MAX_ALG_NAME ||
1278	    snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
1279		     "rfc4543(%s)", alg->cra_driver_name) >=
1280	    CRYPTO_MAX_ALG_NAME)
1281		goto out_drop_alg;
1282
1283	inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD;
1284	inst->alg.cra_flags |= alg->cra_flags & CRYPTO_ALG_ASYNC;
1285	inst->alg.cra_priority = alg->cra_priority;
1286	inst->alg.cra_blocksize = 1;
1287	inst->alg.cra_alignmask = alg->cra_alignmask;
1288	inst->alg.cra_type = &crypto_nivaead_type;
1289
1290	inst->alg.cra_aead.ivsize = 8;
1291	inst->alg.cra_aead.maxauthsize = 16;
1292
1293	inst->alg.cra_ctxsize = sizeof(struct crypto_rfc4543_ctx);
1294
1295	inst->alg.cra_init = crypto_rfc4543_init_tfm;
1296	inst->alg.cra_exit = crypto_rfc4543_exit_tfm;
1297
1298	inst->alg.cra_aead.setkey = crypto_rfc4543_setkey;
1299	inst->alg.cra_aead.setauthsize = crypto_rfc4543_setauthsize;
1300	inst->alg.cra_aead.encrypt = crypto_rfc4543_encrypt;
1301	inst->alg.cra_aead.decrypt = crypto_rfc4543_decrypt;
1302
1303	inst->alg.cra_aead.geniv = "seqiv";
1304
1305out:
1306	return inst;
1307
1308out_drop_alg:
1309	crypto_drop_aead(spawn);
1310out_free_inst:
1311	kfree(inst);
1312	inst = ERR_PTR(err);
1313	goto out;
1314}
1315
1316static void crypto_rfc4543_free(struct crypto_instance *inst)
1317{
1318	crypto_drop_spawn(crypto_instance_ctx(inst));
1319	kfree(inst);
1320}
1321
1322static struct crypto_template crypto_rfc4543_tmpl = {
1323	.name = "rfc4543",
1324	.alloc = crypto_rfc4543_alloc,
1325	.free = crypto_rfc4543_free,
1326	.module = THIS_MODULE,
1327};
1328
1329static int __init crypto_gcm_module_init(void)
1330{
1331	int err;
1332
1333	gcm_zeroes = kzalloc(16, GFP_KERNEL);
1334	if (!gcm_zeroes)
1335		return -ENOMEM;
1336
1337	err = crypto_register_template(&crypto_gcm_base_tmpl);
1338	if (err)
1339		goto out;
1340
1341	err = crypto_register_template(&crypto_gcm_tmpl);
1342	if (err)
1343		goto out_undo_base;
1344
1345	err = crypto_register_template(&crypto_rfc4106_tmpl);
1346	if (err)
1347		goto out_undo_gcm;
1348
1349	err = crypto_register_template(&crypto_rfc4543_tmpl);
1350	if (err)
1351		goto out_undo_rfc4106;
1352
1353	return 0;
1354
1355out_undo_rfc4106:
1356	crypto_unregister_template(&crypto_rfc4106_tmpl);
1357out_undo_gcm:
1358	crypto_unregister_template(&crypto_gcm_tmpl);
1359out_undo_base:
1360	crypto_unregister_template(&crypto_gcm_base_tmpl);
1361out:
1362	kfree(gcm_zeroes);
1363	return err;
1364}
1365
1366static void __exit crypto_gcm_module_exit(void)
1367{
1368	kfree(gcm_zeroes);
1369	crypto_unregister_template(&crypto_rfc4543_tmpl);
1370	crypto_unregister_template(&crypto_rfc4106_tmpl);
1371	crypto_unregister_template(&crypto_gcm_tmpl);
1372	crypto_unregister_template(&crypto_gcm_base_tmpl);
1373}
1374
1375module_init(crypto_gcm_module_init);
1376module_exit(crypto_gcm_module_exit);
1377
1378MODULE_LICENSE("GPL");
1379MODULE_DESCRIPTION("Galois/Counter Mode");
1380MODULE_AUTHOR("Mikko Herranen <mh1@iki.fi>");
1381MODULE_ALIAS("gcm_base");
1382MODULE_ALIAS("rfc4106");
1383MODULE_ALIAS("rfc4543");
1384