2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-02-16 15:31:54 +03:00
/*
2005-04-17 02:20:36 +04:00
* Cryptographic API .
*
* Null algorithms , aka Much Ado About Nothing .
*
* These are needed for IPsec , and may be useful in general for
* testing & debugging .
2010-02-16 15:31:54 +03:00
*
2005-04-17 02:20:36 +04:00
* The null cipher is compliant with RFC2410 .
*
* Copyright ( c ) 2002 James Morris < jmorris @ intercode . com . au >
*/
2007-12-13 17:28:59 +03:00
2014-03-14 19:46:50 +04:00
# include <crypto/null.h>
2008-11-08 03:09:56 +03:00
# include <crypto/internal/hash.h>
2007-12-13 17:28:59 +03:00
# include <crypto/internal/skcipher.h>
2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/module.h>
# include <linux/mm.h>
[PATCH] crypto: fix null encryption/compression
null_encrypt() needs to copy the data in case src and dst are disjunct,
null_compress() needs to copy the data in any case as far as I can tell. I
joined compress/decompress and encrypt/decrypt to avoid duplicating code.
Without this patch ESP null_enc packets look like this:
IP (tos 0x0, ttl 64, id 23130, offset 0, flags [DF], length: 128)
10.0.0.1 > 10.0.0.2: ESP(spi=0x0f9ca149,seq=0x4)
0x0000: 4500 0080 5a5a 4000 4032 cbef 0a00 0001 E...ZZ@.@2......
0x0010: 0a00 0002 0f9c a149 0000 0004 0000 0000 .......I........
0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 ..
IP (tos 0x0, ttl 64, id 256, offset 0, flags [DF], length: 128)
10.0.0.2 > 10.0.0.1: ESP(spi=0x0e4f7b51,seq=0x2)
0x0000: 4500 0080 0100 4000 4032 254a 0a00 0002 E.....@.@2%J....
0x0010: 0a00 0001 0e4f 7b51 0000 0002 a8a8 a8a8 .....O{Q........
0x0020: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0030: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0040: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0050: a8a8 ..
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-17 08:53:41 +04:00
# include <linux/string.h>
2005-04-17 02:20:36 +04:00
2015-05-21 10:11:09 +03:00
static DEFINE_MUTEX ( crypto_default_null_skcipher_lock ) ;
2018-09-19 05:10:51 +03:00
static struct crypto_sync_skcipher * crypto_default_null_skcipher ;
2015-05-21 10:11:09 +03:00
static int crypto_default_null_skcipher_refcnt ;
2006-05-16 16:09:29 +04:00
static int null_compress ( struct crypto_tfm * tfm , const u8 * src ,
unsigned int slen , u8 * dst , unsigned int * dlen )
[PATCH] crypto: fix null encryption/compression
null_encrypt() needs to copy the data in case src and dst are disjunct,
null_compress() needs to copy the data in any case as far as I can tell. I
joined compress/decompress and encrypt/decrypt to avoid duplicating code.
Without this patch ESP null_enc packets look like this:
IP (tos 0x0, ttl 64, id 23130, offset 0, flags [DF], length: 128)
10.0.0.1 > 10.0.0.2: ESP(spi=0x0f9ca149,seq=0x4)
0x0000: 4500 0080 5a5a 4000 4032 cbef 0a00 0001 E...ZZ@.@2......
0x0010: 0a00 0002 0f9c a149 0000 0004 0000 0000 .......I........
0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 ..
IP (tos 0x0, ttl 64, id 256, offset 0, flags [DF], length: 128)
10.0.0.2 > 10.0.0.1: ESP(spi=0x0e4f7b51,seq=0x2)
0x0000: 4500 0080 0100 4000 4032 254a 0a00 0002 E.....@.@2%J....
0x0010: 0a00 0001 0e4f 7b51 0000 0002 a8a8 a8a8 .....O{Q........
0x0020: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0030: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0040: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0050: a8a8 ..
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-17 08:53:41 +04:00
{
if ( slen > * dlen )
return - EINVAL ;
memcpy ( dst , src , slen ) ;
* dlen = slen ;
return 0 ;
}
2005-04-17 02:20:36 +04:00
2008-11-08 03:09:56 +03:00
static int null_init ( struct shash_desc * desc )
{
return 0 ;
}
2005-04-17 02:20:36 +04:00
2008-11-08 03:09:56 +03:00
static int null_update ( struct shash_desc * desc , const u8 * data ,
unsigned int len )
{
return 0 ;
}
2005-04-17 02:20:36 +04:00
2008-11-08 03:09:56 +03:00
static int null_final ( struct shash_desc * desc , u8 * out )
{
return 0 ;
}
static int null_digest ( struct shash_desc * desc , const u8 * data ,
unsigned int len , u8 * out )
{
return 0 ;
}
static int null_hash_setkey ( struct crypto_shash * tfm , const u8 * key ,
unsigned int keylen )
{ return 0 ; }
2005-04-17 02:20:36 +04:00
2019-01-04 07:16:24 +03:00
static int null_skcipher_setkey ( struct crypto_skcipher * tfm , const u8 * key ,
unsigned int keylen )
{ return 0 ; }
2006-05-16 16:09:29 +04:00
static int null_setkey ( struct crypto_tfm * tfm , const u8 * key ,
2006-08-13 08:16:39 +04:00
unsigned int keylen )
2005-04-17 02:20:36 +04:00
{ return 0 ; }
2006-05-16 16:09:29 +04:00
static void null_crypt ( struct crypto_tfm * tfm , u8 * dst , const u8 * src )
[PATCH] crypto: fix null encryption/compression
null_encrypt() needs to copy the data in case src and dst are disjunct,
null_compress() needs to copy the data in any case as far as I can tell. I
joined compress/decompress and encrypt/decrypt to avoid duplicating code.
Without this patch ESP null_enc packets look like this:
IP (tos 0x0, ttl 64, id 23130, offset 0, flags [DF], length: 128)
10.0.0.1 > 10.0.0.2: ESP(spi=0x0f9ca149,seq=0x4)
0x0000: 4500 0080 5a5a 4000 4032 cbef 0a00 0001 E...ZZ@.@2......
0x0010: 0a00 0002 0f9c a149 0000 0004 0000 0000 .......I........
0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 ..
IP (tos 0x0, ttl 64, id 256, offset 0, flags [DF], length: 128)
10.0.0.2 > 10.0.0.1: ESP(spi=0x0e4f7b51,seq=0x2)
0x0000: 4500 0080 0100 4000 4032 254a 0a00 0002 E.....@.@2%J....
0x0010: 0a00 0001 0e4f 7b51 0000 0002 a8a8 a8a8 .....O{Q........
0x0020: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0030: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0040: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0050: a8a8 ..
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-17 08:53:41 +04:00
{
memcpy ( dst , src , NULL_BLOCK_SIZE ) ;
}
2005-04-17 02:20:36 +04:00
2019-01-04 07:16:24 +03:00
static int null_skcipher_crypt ( struct skcipher_request * req )
2007-12-13 17:28:59 +03:00
{
2019-01-04 07:16:24 +03:00
struct skcipher_walk walk ;
2007-12-13 17:28:59 +03:00
int err ;
2019-01-04 07:16:24 +03:00
err = skcipher_walk_virt ( & walk , req , false ) ;
2007-12-13 17:28:59 +03:00
while ( walk . nbytes ) {
if ( walk . src . virt . addr ! = walk . dst . virt . addr )
memcpy ( walk . dst . virt . addr , walk . src . virt . addr ,
walk . nbytes ) ;
2019-01-04 07:16:24 +03:00
err = skcipher_walk_done ( & walk , 0 ) ;
2007-12-13 17:28:59 +03:00
}
return err ;
}
2008-11-08 03:09:56 +03:00
static struct shash_alg digest_null = {
. digestsize = NULL_DIGEST_SIZE ,
. setkey = null_hash_setkey ,
. init = null_init ,
. update = null_update ,
. finup = null_digest ,
. digest = null_digest ,
. final = null_final ,
. base = {
. cra_name = " digest_null " ,
2019-06-03 08:40:57 +03:00
. cra_driver_name = " digest_null-generic " ,
2008-11-08 03:09:56 +03:00
. cra_blocksize = NULL_BLOCK_SIZE ,
. cra_module = THIS_MODULE ,
}
2005-04-17 02:20:36 +04:00
} ;
2019-01-04 07:16:24 +03:00
static struct skcipher_alg skcipher_null = {
. base . cra_name = " ecb(cipher_null) " ,
. base . cra_driver_name = " ecb-cipher_null " ,
. base . cra_priority = 100 ,
. base . cra_blocksize = NULL_BLOCK_SIZE ,
. base . cra_ctxsize = 0 ,
. base . cra_module = THIS_MODULE ,
. min_keysize = NULL_KEY_SIZE ,
. max_keysize = NULL_KEY_SIZE ,
. ivsize = NULL_IV_SIZE ,
. setkey = null_skcipher_setkey ,
. encrypt = null_skcipher_crypt ,
. decrypt = null_skcipher_crypt ,
} ;
static struct crypto_alg null_algs [ ] = { {
2005-04-17 02:20:36 +04:00
. cra_name = " cipher_null " ,
2019-06-03 08:40:57 +03:00
. cra_driver_name = " cipher_null-generic " ,
2005-04-17 02:20:36 +04:00
. cra_flags = CRYPTO_ALG_TYPE_CIPHER ,
. cra_blocksize = NULL_BLOCK_SIZE ,
. cra_ctxsize = 0 ,
. cra_module = THIS_MODULE ,
. cra_u = { . cipher = {
. cia_min_keysize = NULL_KEY_SIZE ,
. cia_max_keysize = NULL_KEY_SIZE ,
. cia_setkey = null_setkey ,
[PATCH] crypto: fix null encryption/compression
null_encrypt() needs to copy the data in case src and dst are disjunct,
null_compress() needs to copy the data in any case as far as I can tell. I
joined compress/decompress and encrypt/decrypt to avoid duplicating code.
Without this patch ESP null_enc packets look like this:
IP (tos 0x0, ttl 64, id 23130, offset 0, flags [DF], length: 128)
10.0.0.1 > 10.0.0.2: ESP(spi=0x0f9ca149,seq=0x4)
0x0000: 4500 0080 5a5a 4000 4032 cbef 0a00 0001 E...ZZ@.@2......
0x0010: 0a00 0002 0f9c a149 0000 0004 0000 0000 .......I........
0x0020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0050: 0000 ..
IP (tos 0x0, ttl 64, id 256, offset 0, flags [DF], length: 128)
10.0.0.2 > 10.0.0.1: ESP(spi=0x0e4f7b51,seq=0x2)
0x0000: 4500 0080 0100 4000 4032 254a 0a00 0002 E.....@.@2%J....
0x0010: 0a00 0001 0e4f 7b51 0000 0002 a8a8 a8a8 .....O{Q........
0x0020: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0030: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0040: a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 a8a8 ................
0x0050: a8a8 ..
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-17 08:53:41 +04:00
. cia_encrypt = null_crypt ,
. cia_decrypt = null_crypt } }
2012-07-11 15:20:00 +04:00
} , {
. cra_name = " compress_null " ,
2019-06-03 08:40:57 +03:00
. cra_driver_name = " compress_null-generic " ,
2012-07-11 15:20:00 +04:00
. cra_flags = CRYPTO_ALG_TYPE_COMPRESS ,
. cra_blocksize = NULL_BLOCK_SIZE ,
. cra_ctxsize = 0 ,
. cra_module = THIS_MODULE ,
. cra_u = { . compress = {
. coa_compress = null_compress ,
. coa_decompress = null_compress } }
} } ;
2007-12-13 17:28:59 +03:00
2014-11-21 04:05:53 +03:00
MODULE_ALIAS_CRYPTO ( " compress_null " ) ;
MODULE_ALIAS_CRYPTO ( " digest_null " ) ;
MODULE_ALIAS_CRYPTO ( " cipher_null " ) ;
2005-04-17 02:20:36 +04:00
2018-09-19 05:10:51 +03:00
struct crypto_sync_skcipher * crypto_get_default_null_skcipher ( void )
2015-05-21 10:11:09 +03:00
{
2018-09-19 05:10:51 +03:00
struct crypto_sync_skcipher * tfm ;
2015-05-21 10:11:09 +03:00
mutex_lock ( & crypto_default_null_skcipher_lock ) ;
tfm = crypto_default_null_skcipher ;
if ( ! tfm ) {
2018-09-19 05:10:51 +03:00
tfm = crypto_alloc_sync_skcipher ( " ecb(cipher_null) " , 0 , 0 ) ;
2015-05-21 10:11:09 +03:00
if ( IS_ERR ( tfm ) )
goto unlock ;
crypto_default_null_skcipher = tfm ;
}
crypto_default_null_skcipher_refcnt + + ;
unlock :
mutex_unlock ( & crypto_default_null_skcipher_lock ) ;
return tfm ;
}
EXPORT_SYMBOL_GPL ( crypto_get_default_null_skcipher ) ;
void crypto_put_default_null_skcipher ( void )
{
mutex_lock ( & crypto_default_null_skcipher_lock ) ;
if ( ! - - crypto_default_null_skcipher_refcnt ) {
2018-09-19 05:10:51 +03:00
crypto_free_sync_skcipher ( crypto_default_null_skcipher ) ;
2015-05-21 10:11:09 +03:00
crypto_default_null_skcipher = NULL ;
}
mutex_unlock ( & crypto_default_null_skcipher_lock ) ;
}
EXPORT_SYMBOL_GPL ( crypto_put_default_null_skcipher ) ;
2008-04-05 17:00:57 +04:00
static int __init crypto_null_mod_init ( void )
2005-04-17 02:20:36 +04:00
{
int ret = 0 ;
2010-02-16 15:31:54 +03:00
2012-07-11 15:20:00 +04:00
ret = crypto_register_algs ( null_algs , ARRAY_SIZE ( null_algs ) ) ;
2005-04-17 02:20:36 +04:00
if ( ret < 0 )
goto out ;
2008-11-08 03:09:56 +03:00
ret = crypto_register_shash ( & digest_null ) ;
2007-12-13 17:28:59 +03:00
if ( ret < 0 )
2012-07-11 15:20:00 +04:00
goto out_unregister_algs ;
2005-04-17 02:20:36 +04:00
2019-01-04 07:16:24 +03:00
ret = crypto_register_skcipher ( & skcipher_null ) ;
if ( ret < 0 )
goto out_unregister_shash ;
2012-07-11 15:20:00 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
2019-01-04 07:16:24 +03:00
out_unregister_shash :
crypto_unregister_shash ( & digest_null ) ;
2012-07-11 15:20:00 +04:00
out_unregister_algs :
crypto_unregister_algs ( null_algs , ARRAY_SIZE ( null_algs ) ) ;
2010-02-16 15:31:54 +03:00
out :
2005-04-17 02:20:36 +04:00
return ret ;
}
2008-04-05 17:00:57 +04:00
static void __exit crypto_null_mod_fini ( void )
2005-04-17 02:20:36 +04:00
{
2012-07-11 15:20:00 +04:00
crypto_unregister_algs ( null_algs , ARRAY_SIZE ( null_algs ) ) ;
2019-01-04 07:16:24 +03:00
crypto_unregister_shash ( & digest_null ) ;
crypto_unregister_skcipher ( & skcipher_null ) ;
2005-04-17 02:20:36 +04:00
}
2019-04-12 07:57:42 +03:00
subsys_initcall ( crypto_null_mod_init ) ;
2008-04-05 17:00:57 +04:00
module_exit ( crypto_null_mod_fini ) ;
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Null Cryptographic Algorithms " ) ;