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 >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
*/
2007-12-13 17:28:59 +03:00
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
# define NULL_KEY_SIZE 0
# define NULL_BLOCK_SIZE 1
# define NULL_DIGEST_SIZE 0
2007-12-13 17:28:59 +03:00
# define NULL_IV_SIZE 0
2005-04-17 02:20:36 +04:00
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
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
2007-12-13 17:28:59 +03:00
static int skcipher_null_crypt ( struct blkcipher_desc * desc ,
struct scatterlist * dst ,
struct scatterlist * src , unsigned int nbytes )
{
struct blkcipher_walk walk ;
int err ;
blkcipher_walk_init ( & walk , dst , src , nbytes ) ;
err = blkcipher_walk_virt ( desc , & walk ) ;
while ( walk . nbytes ) {
if ( walk . src . virt . addr ! = walk . dst . virt . addr )
memcpy ( walk . dst . virt . addr , walk . src . virt . addr ,
walk . nbytes ) ;
err = blkcipher_walk_done ( desc , & walk , 0 ) ;
}
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 " ,
. cra_flags = CRYPTO_ALG_TYPE_SHASH ,
. cra_blocksize = NULL_BLOCK_SIZE ,
. cra_module = THIS_MODULE ,
}
2005-04-17 02:20:36 +04:00
} ;
2012-07-11 15:20:00 +04:00
static struct crypto_alg null_algs [ 3 ] = { {
2005-04-17 02:20:36 +04:00
. cra_name = " cipher_null " ,
. 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
} , {
2007-12-13 17:28:59 +03:00
. cra_name = " ecb(cipher_null) " ,
. cra_driver_name = " ecb-cipher_null " ,
. cra_priority = 100 ,
. cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER ,
. cra_blocksize = NULL_BLOCK_SIZE ,
. cra_type = & crypto_blkcipher_type ,
. cra_ctxsize = 0 ,
. cra_module = THIS_MODULE ,
. cra_u = { . blkcipher = {
. min_keysize = NULL_KEY_SIZE ,
. max_keysize = NULL_KEY_SIZE ,
. ivsize = NULL_IV_SIZE ,
. setkey = null_setkey ,
. encrypt = skcipher_null_crypt ,
. decrypt = skcipher_null_crypt } }
2012-07-11 15:20:00 +04:00
} , {
. cra_name = " compress_null " ,
. 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
2005-04-17 02:20:36 +04:00
MODULE_ALIAS ( " compress_null " ) ;
MODULE_ALIAS ( " digest_null " ) ;
MODULE_ALIAS ( " cipher_null " ) ;
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
2012-07-11 15:20:00 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
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
{
2008-11-08 03:09:56 +03:00
crypto_unregister_shash ( & digest_null ) ;
2012-07-11 15:20:00 +04:00
crypto_unregister_algs ( null_algs , ARRAY_SIZE ( null_algs ) ) ;
2005-04-17 02:20:36 +04:00
}
2008-04-05 17:00:57 +04:00
module_init ( crypto_null_mod_init ) ;
module_exit ( crypto_null_mod_fini ) ;
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " Null Cryptographic Algorithms " ) ;