1/*
2 * Cryptographic API.
3 *
4 * Null algorithms, aka Much Ado About Nothing.
5 *
6 * These are needed for IPsec, and may be useful in general for
7 * testing & debugging.
8 *
9 * The null cipher is compliant with RFC2410.
10 *
11 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 */
19#include <linux/init.h>
20#include <linux/module.h>
21#include <linux/mm.h>
22#include <asm/scatterlist.h>
23#include <linux/crypto.h>
24#include <linux/string.h>
25
26#define NULL_KEY_SIZE		0
27#define NULL_BLOCK_SIZE		1
28#define NULL_DIGEST_SIZE	0
29
30static int null_compress(struct crypto_tfm *tfm, const u8 *src,
31			 unsigned int slen, u8 *dst, unsigned int *dlen)
32{
33	if (slen > *dlen)
34		return -EINVAL;
35	memcpy(dst, src, slen);
36	*dlen = slen;
37	return 0;
38}
39
40static void null_init(struct crypto_tfm *tfm)
41{ }
42
43static void null_update(struct crypto_tfm *tfm, const u8 *data,
44			unsigned int len)
45{ }
46
47static void null_final(struct crypto_tfm *tfm, u8 *out)
48{ }
49
50static int null_setkey(struct crypto_tfm *tfm, const u8 *key,
51		       unsigned int keylen)
52{ return 0; }
53
54static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
55{
56	memcpy(dst, src, NULL_BLOCK_SIZE);
57}
58
59static struct crypto_alg compress_null = {
60	.cra_name		=	"compress_null",
61	.cra_flags		=	CRYPTO_ALG_TYPE_COMPRESS,
62	.cra_blocksize		=	NULL_BLOCK_SIZE,
63	.cra_ctxsize		=	0,
64	.cra_module		=	THIS_MODULE,
65	.cra_list		=       LIST_HEAD_INIT(compress_null.cra_list),
66	.cra_u			=	{ .compress = {
67	.coa_compress 		=	null_compress,
68	.coa_decompress		=	null_compress } }
69};
70
71static struct crypto_alg digest_null = {
72	.cra_name		=	"digest_null",
73	.cra_flags		=	CRYPTO_ALG_TYPE_DIGEST,
74	.cra_blocksize		=	NULL_BLOCK_SIZE,
75	.cra_ctxsize		=	0,
76	.cra_module		=	THIS_MODULE,
77	.cra_list		=       LIST_HEAD_INIT(digest_null.cra_list),
78	.cra_u			=	{ .digest = {
79	.dia_digestsize		=	NULL_DIGEST_SIZE,
80	.dia_init   		=	null_init,
81	.dia_update 		=	null_update,
82	.dia_final  		=	null_final } }
83};
84
85static struct crypto_alg cipher_null = {
86	.cra_name		=	"cipher_null",
87	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
88	.cra_blocksize		=	NULL_BLOCK_SIZE,
89	.cra_ctxsize		=	0,
90	.cra_module		=	THIS_MODULE,
91	.cra_list		=	LIST_HEAD_INIT(cipher_null.cra_list),
92	.cra_u			=	{ .cipher = {
93	.cia_min_keysize	=	NULL_KEY_SIZE,
94	.cia_max_keysize	=	NULL_KEY_SIZE,
95	.cia_setkey		= 	null_setkey,
96	.cia_encrypt		=	null_crypt,
97	.cia_decrypt		=	null_crypt } }
98};
99
100MODULE_ALIAS("compress_null");
101MODULE_ALIAS("digest_null");
102MODULE_ALIAS("cipher_null");
103
104static int __init init(void)
105{
106	int ret = 0;
107
108	ret = crypto_register_alg(&cipher_null);
109	if (ret < 0)
110		goto out;
111
112	ret = crypto_register_alg(&digest_null);
113	if (ret < 0) {
114		crypto_unregister_alg(&cipher_null);
115		goto out;
116	}
117
118	ret = crypto_register_alg(&compress_null);
119	if (ret < 0) {
120		crypto_unregister_alg(&digest_null);
121		crypto_unregister_alg(&cipher_null);
122		goto out;
123	}
124
125out:
126	return ret;
127}
128
129static void __exit fini(void)
130{
131	crypto_unregister_alg(&compress_null);
132	crypto_unregister_alg(&digest_null);
133	crypto_unregister_alg(&cipher_null);
134}
135
136module_init(init);
137module_exit(fini);
138
139MODULE_LICENSE("GPL");
140MODULE_DESCRIPTION("Null Cryptographic Algorithms");
141