11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Cryptographic API. 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Null algorithms, aka Much Ado About Nothing. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * These are needed for IPsec, and may be useful in general for 71da177e4SLinus Torvalds * testing & debugging. 81da177e4SLinus Torvalds * 91da177e4SLinus Torvalds * The null cipher is compliant with RFC2410. 101da177e4SLinus Torvalds * 111da177e4SLinus Torvalds * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> 121da177e4SLinus Torvalds * 131da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 141da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by 151da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 161da177e4SLinus Torvalds * (at your option) any later version. 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds */ 191da177e4SLinus Torvalds #include <linux/init.h> 201da177e4SLinus Torvalds #include <linux/module.h> 211da177e4SLinus Torvalds #include <linux/mm.h> 221da177e4SLinus Torvalds #include <asm/scatterlist.h> 231da177e4SLinus Torvalds #include <linux/crypto.h> 24d0856009SPatrick McHardy #include <linux/string.h> 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds #define NULL_KEY_SIZE 0 271da177e4SLinus Torvalds #define NULL_BLOCK_SIZE 1 281da177e4SLinus Torvalds #define NULL_DIGEST_SIZE 0 291da177e4SLinus Torvalds 306c2bb98bSHerbert Xu static int null_compress(struct crypto_tfm *tfm, const u8 *src, 316c2bb98bSHerbert Xu unsigned int slen, u8 *dst, unsigned int *dlen) 32d0856009SPatrick McHardy { 33d0856009SPatrick McHardy if (slen > *dlen) 34d0856009SPatrick McHardy return -EINVAL; 35d0856009SPatrick McHardy memcpy(dst, src, slen); 36d0856009SPatrick McHardy *dlen = slen; 37d0856009SPatrick McHardy return 0; 38d0856009SPatrick McHardy } 391da177e4SLinus Torvalds 406c2bb98bSHerbert Xu static void null_init(struct crypto_tfm *tfm) 411da177e4SLinus Torvalds { } 421da177e4SLinus Torvalds 436c2bb98bSHerbert Xu static void null_update(struct crypto_tfm *tfm, const u8 *data, 446c2bb98bSHerbert Xu unsigned int len) 451da177e4SLinus Torvalds { } 461da177e4SLinus Torvalds 476c2bb98bSHerbert Xu static void null_final(struct crypto_tfm *tfm, u8 *out) 481da177e4SLinus Torvalds { } 491da177e4SLinus Torvalds 506c2bb98bSHerbert Xu static int null_setkey(struct crypto_tfm *tfm, const u8 *key, 51*560c06aeSHerbert Xu unsigned int keylen) 521da177e4SLinus Torvalds { return 0; } 531da177e4SLinus Torvalds 546c2bb98bSHerbert Xu static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 55d0856009SPatrick McHardy { 56d0856009SPatrick McHardy memcpy(dst, src, NULL_BLOCK_SIZE); 57d0856009SPatrick McHardy } 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds static struct crypto_alg compress_null = { 601da177e4SLinus Torvalds .cra_name = "compress_null", 611da177e4SLinus Torvalds .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, 621da177e4SLinus Torvalds .cra_blocksize = NULL_BLOCK_SIZE, 631da177e4SLinus Torvalds .cra_ctxsize = 0, 641da177e4SLinus Torvalds .cra_module = THIS_MODULE, 651da177e4SLinus Torvalds .cra_list = LIST_HEAD_INIT(compress_null.cra_list), 661da177e4SLinus Torvalds .cra_u = { .compress = { 671da177e4SLinus Torvalds .coa_compress = null_compress, 68d0856009SPatrick McHardy .coa_decompress = null_compress } } 691da177e4SLinus Torvalds }; 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds static struct crypto_alg digest_null = { 721da177e4SLinus Torvalds .cra_name = "digest_null", 731da177e4SLinus Torvalds .cra_flags = CRYPTO_ALG_TYPE_DIGEST, 741da177e4SLinus Torvalds .cra_blocksize = NULL_BLOCK_SIZE, 751da177e4SLinus Torvalds .cra_ctxsize = 0, 761da177e4SLinus Torvalds .cra_module = THIS_MODULE, 771da177e4SLinus Torvalds .cra_list = LIST_HEAD_INIT(digest_null.cra_list), 781da177e4SLinus Torvalds .cra_u = { .digest = { 791da177e4SLinus Torvalds .dia_digestsize = NULL_DIGEST_SIZE, 801da177e4SLinus Torvalds .dia_init = null_init, 811da177e4SLinus Torvalds .dia_update = null_update, 821da177e4SLinus Torvalds .dia_final = null_final } } 831da177e4SLinus Torvalds }; 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds static struct crypto_alg cipher_null = { 861da177e4SLinus Torvalds .cra_name = "cipher_null", 871da177e4SLinus Torvalds .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 881da177e4SLinus Torvalds .cra_blocksize = NULL_BLOCK_SIZE, 891da177e4SLinus Torvalds .cra_ctxsize = 0, 901da177e4SLinus Torvalds .cra_module = THIS_MODULE, 911da177e4SLinus Torvalds .cra_list = LIST_HEAD_INIT(cipher_null.cra_list), 921da177e4SLinus Torvalds .cra_u = { .cipher = { 931da177e4SLinus Torvalds .cia_min_keysize = NULL_KEY_SIZE, 941da177e4SLinus Torvalds .cia_max_keysize = NULL_KEY_SIZE, 951da177e4SLinus Torvalds .cia_setkey = null_setkey, 96d0856009SPatrick McHardy .cia_encrypt = null_crypt, 97d0856009SPatrick McHardy .cia_decrypt = null_crypt } } 981da177e4SLinus Torvalds }; 991da177e4SLinus Torvalds 1001da177e4SLinus Torvalds MODULE_ALIAS("compress_null"); 1011da177e4SLinus Torvalds MODULE_ALIAS("digest_null"); 1021da177e4SLinus Torvalds MODULE_ALIAS("cipher_null"); 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds static int __init init(void) 1051da177e4SLinus Torvalds { 1061da177e4SLinus Torvalds int ret = 0; 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds ret = crypto_register_alg(&cipher_null); 1091da177e4SLinus Torvalds if (ret < 0) 1101da177e4SLinus Torvalds goto out; 1111da177e4SLinus Torvalds 1121da177e4SLinus Torvalds ret = crypto_register_alg(&digest_null); 1131da177e4SLinus Torvalds if (ret < 0) { 1141da177e4SLinus Torvalds crypto_unregister_alg(&cipher_null); 1151da177e4SLinus Torvalds goto out; 1161da177e4SLinus Torvalds } 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds ret = crypto_register_alg(&compress_null); 1191da177e4SLinus Torvalds if (ret < 0) { 1201da177e4SLinus Torvalds crypto_unregister_alg(&digest_null); 1211da177e4SLinus Torvalds crypto_unregister_alg(&cipher_null); 1221da177e4SLinus Torvalds goto out; 1231da177e4SLinus Torvalds } 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds out: 1261da177e4SLinus Torvalds return ret; 1271da177e4SLinus Torvalds } 1281da177e4SLinus Torvalds 1291da177e4SLinus Torvalds static void __exit fini(void) 1301da177e4SLinus Torvalds { 1311da177e4SLinus Torvalds crypto_unregister_alg(&compress_null); 1321da177e4SLinus Torvalds crypto_unregister_alg(&digest_null); 1331da177e4SLinus Torvalds crypto_unregister_alg(&cipher_null); 1341da177e4SLinus Torvalds } 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds module_init(init); 1371da177e4SLinus Torvalds module_exit(fini); 1381da177e4SLinus Torvalds 1391da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 1401da177e4SLinus Torvalds MODULE_DESCRIPTION("Null Cryptographic Algorithms"); 141