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 */ 193631c650SHerbert Xu 2072567258SHoria Geanta #include <crypto/null.h> 21d35d2454SHerbert Xu #include <crypto/internal/hash.h> 223631c650SHerbert Xu #include <crypto/internal/skcipher.h> 231da177e4SLinus Torvalds #include <linux/init.h> 241da177e4SLinus Torvalds #include <linux/module.h> 251da177e4SLinus Torvalds #include <linux/mm.h> 26d0856009SPatrick McHardy #include <linux/string.h> 271da177e4SLinus Torvalds 286c2bb98bSHerbert Xu static int null_compress(struct crypto_tfm *tfm, const u8 *src, 296c2bb98bSHerbert Xu unsigned int slen, u8 *dst, unsigned int *dlen) 30d0856009SPatrick McHardy { 31d0856009SPatrick McHardy if (slen > *dlen) 32d0856009SPatrick McHardy return -EINVAL; 33d0856009SPatrick McHardy memcpy(dst, src, slen); 34d0856009SPatrick McHardy *dlen = slen; 35d0856009SPatrick McHardy return 0; 36d0856009SPatrick McHardy } 371da177e4SLinus Torvalds 38d35d2454SHerbert Xu static int null_init(struct shash_desc *desc) 39d35d2454SHerbert Xu { 40d35d2454SHerbert Xu return 0; 41d35d2454SHerbert Xu } 421da177e4SLinus Torvalds 43d35d2454SHerbert Xu static int null_update(struct shash_desc *desc, const u8 *data, 446c2bb98bSHerbert Xu unsigned int len) 45d35d2454SHerbert Xu { 46d35d2454SHerbert Xu return 0; 47d35d2454SHerbert Xu } 481da177e4SLinus Torvalds 49d35d2454SHerbert Xu static int null_final(struct shash_desc *desc, u8 *out) 50d35d2454SHerbert Xu { 51d35d2454SHerbert Xu return 0; 52d35d2454SHerbert Xu } 53d35d2454SHerbert Xu 54d35d2454SHerbert Xu static int null_digest(struct shash_desc *desc, const u8 *data, 55d35d2454SHerbert Xu unsigned int len, u8 *out) 56d35d2454SHerbert Xu { 57d35d2454SHerbert Xu return 0; 58d35d2454SHerbert Xu } 59d35d2454SHerbert Xu 60d35d2454SHerbert Xu static int null_hash_setkey(struct crypto_shash *tfm, const u8 *key, 61d35d2454SHerbert Xu unsigned int keylen) 62d35d2454SHerbert Xu { return 0; } 631da177e4SLinus Torvalds 646c2bb98bSHerbert Xu static int null_setkey(struct crypto_tfm *tfm, const u8 *key, 65560c06aeSHerbert Xu unsigned int keylen) 661da177e4SLinus Torvalds { return 0; } 671da177e4SLinus Torvalds 686c2bb98bSHerbert Xu static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 69d0856009SPatrick McHardy { 70d0856009SPatrick McHardy memcpy(dst, src, NULL_BLOCK_SIZE); 71d0856009SPatrick McHardy } 721da177e4SLinus Torvalds 733631c650SHerbert Xu static int skcipher_null_crypt(struct blkcipher_desc *desc, 743631c650SHerbert Xu struct scatterlist *dst, 753631c650SHerbert Xu struct scatterlist *src, unsigned int nbytes) 763631c650SHerbert Xu { 773631c650SHerbert Xu struct blkcipher_walk walk; 783631c650SHerbert Xu int err; 793631c650SHerbert Xu 803631c650SHerbert Xu blkcipher_walk_init(&walk, dst, src, nbytes); 813631c650SHerbert Xu err = blkcipher_walk_virt(desc, &walk); 823631c650SHerbert Xu 833631c650SHerbert Xu while (walk.nbytes) { 843631c650SHerbert Xu if (walk.src.virt.addr != walk.dst.virt.addr) 853631c650SHerbert Xu memcpy(walk.dst.virt.addr, walk.src.virt.addr, 863631c650SHerbert Xu walk.nbytes); 873631c650SHerbert Xu err = blkcipher_walk_done(desc, &walk, 0); 883631c650SHerbert Xu } 893631c650SHerbert Xu 903631c650SHerbert Xu return err; 913631c650SHerbert Xu } 923631c650SHerbert Xu 93d35d2454SHerbert Xu static struct shash_alg digest_null = { 94d35d2454SHerbert Xu .digestsize = NULL_DIGEST_SIZE, 95d35d2454SHerbert Xu .setkey = null_hash_setkey, 96d35d2454SHerbert Xu .init = null_init, 97d35d2454SHerbert Xu .update = null_update, 98d35d2454SHerbert Xu .finup = null_digest, 99d35d2454SHerbert Xu .digest = null_digest, 100d35d2454SHerbert Xu .final = null_final, 101d35d2454SHerbert Xu .base = { 1021da177e4SLinus Torvalds .cra_name = "digest_null", 103d35d2454SHerbert Xu .cra_flags = CRYPTO_ALG_TYPE_SHASH, 1041da177e4SLinus Torvalds .cra_blocksize = NULL_BLOCK_SIZE, 1051da177e4SLinus Torvalds .cra_module = THIS_MODULE, 106d35d2454SHerbert Xu } 1071da177e4SLinus Torvalds }; 1081da177e4SLinus Torvalds 10970a03bffSJussi Kivilinna static struct crypto_alg null_algs[3] = { { 1101da177e4SLinus Torvalds .cra_name = "cipher_null", 1111da177e4SLinus Torvalds .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 1121da177e4SLinus Torvalds .cra_blocksize = NULL_BLOCK_SIZE, 1131da177e4SLinus Torvalds .cra_ctxsize = 0, 1141da177e4SLinus Torvalds .cra_module = THIS_MODULE, 1151da177e4SLinus Torvalds .cra_u = { .cipher = { 1161da177e4SLinus Torvalds .cia_min_keysize = NULL_KEY_SIZE, 1171da177e4SLinus Torvalds .cia_max_keysize = NULL_KEY_SIZE, 1181da177e4SLinus Torvalds .cia_setkey = null_setkey, 119d0856009SPatrick McHardy .cia_encrypt = null_crypt, 120d0856009SPatrick McHardy .cia_decrypt = null_crypt } } 12170a03bffSJussi Kivilinna }, { 1223631c650SHerbert Xu .cra_name = "ecb(cipher_null)", 1233631c650SHerbert Xu .cra_driver_name = "ecb-cipher_null", 1243631c650SHerbert Xu .cra_priority = 100, 1253631c650SHerbert Xu .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 1263631c650SHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 1273631c650SHerbert Xu .cra_type = &crypto_blkcipher_type, 1283631c650SHerbert Xu .cra_ctxsize = 0, 1293631c650SHerbert Xu .cra_module = THIS_MODULE, 1303631c650SHerbert Xu .cra_u = { .blkcipher = { 1313631c650SHerbert Xu .min_keysize = NULL_KEY_SIZE, 1323631c650SHerbert Xu .max_keysize = NULL_KEY_SIZE, 1333631c650SHerbert Xu .ivsize = NULL_IV_SIZE, 1343631c650SHerbert Xu .setkey = null_setkey, 1353631c650SHerbert Xu .encrypt = skcipher_null_crypt, 1363631c650SHerbert Xu .decrypt = skcipher_null_crypt } } 13770a03bffSJussi Kivilinna }, { 13870a03bffSJussi Kivilinna .cra_name = "compress_null", 13970a03bffSJussi Kivilinna .cra_flags = CRYPTO_ALG_TYPE_COMPRESS, 14070a03bffSJussi Kivilinna .cra_blocksize = NULL_BLOCK_SIZE, 14170a03bffSJussi Kivilinna .cra_ctxsize = 0, 14270a03bffSJussi Kivilinna .cra_module = THIS_MODULE, 14370a03bffSJussi Kivilinna .cra_u = { .compress = { 14470a03bffSJussi Kivilinna .coa_compress = null_compress, 14570a03bffSJussi Kivilinna .coa_decompress = null_compress } } 14670a03bffSJussi Kivilinna } }; 1473631c650SHerbert Xu 148*5d26a105SKees Cook MODULE_ALIAS_CRYPTO("compress_null"); 149*5d26a105SKees Cook MODULE_ALIAS_CRYPTO("digest_null"); 150*5d26a105SKees Cook MODULE_ALIAS_CRYPTO("cipher_null"); 1511da177e4SLinus Torvalds 1523af5b90bSKamalesh Babulal static int __init crypto_null_mod_init(void) 1531da177e4SLinus Torvalds { 1541da177e4SLinus Torvalds int ret = 0; 1551da177e4SLinus Torvalds 15670a03bffSJussi Kivilinna ret = crypto_register_algs(null_algs, ARRAY_SIZE(null_algs)); 1571da177e4SLinus Torvalds if (ret < 0) 1581da177e4SLinus Torvalds goto out; 1591da177e4SLinus Torvalds 160d35d2454SHerbert Xu ret = crypto_register_shash(&digest_null); 1613631c650SHerbert Xu if (ret < 0) 16270a03bffSJussi Kivilinna goto out_unregister_algs; 1631da177e4SLinus Torvalds 16470a03bffSJussi Kivilinna return 0; 1651da177e4SLinus Torvalds 16670a03bffSJussi Kivilinna out_unregister_algs: 16770a03bffSJussi Kivilinna crypto_unregister_algs(null_algs, ARRAY_SIZE(null_algs)); 1681da177e4SLinus Torvalds out: 1691da177e4SLinus Torvalds return ret; 1701da177e4SLinus Torvalds } 1711da177e4SLinus Torvalds 1723af5b90bSKamalesh Babulal static void __exit crypto_null_mod_fini(void) 1731da177e4SLinus Torvalds { 174d35d2454SHerbert Xu crypto_unregister_shash(&digest_null); 17570a03bffSJussi Kivilinna crypto_unregister_algs(null_algs, ARRAY_SIZE(null_algs)); 1761da177e4SLinus Torvalds } 1771da177e4SLinus Torvalds 1783af5b90bSKamalesh Babulal module_init(crypto_null_mod_init); 1793af5b90bSKamalesh Babulal module_exit(crypto_null_mod_fini); 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 1821da177e4SLinus Torvalds MODULE_DESCRIPTION("Null Cryptographic Algorithms"); 183