2007-12-07 11:53:23 +03:00
/*
* Cryptographic API .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . , 51
* Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/crypto.h>
# include <linux/vmalloc.h>
2014-05-27 21:28:55 +04:00
# include <linux/mm.h>
2007-12-07 11:53:23 +03:00
# include <linux/lzo.h>
struct lzo_ctx {
void * lzo_comp_mem ;
} ;
static int lzo_init ( struct crypto_tfm * tfm )
{
struct lzo_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2014-05-27 21:28:55 +04:00
ctx - > lzo_comp_mem = kmalloc ( LZO1X_MEM_COMPRESS ,
GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT ) ;
if ( ! ctx - > lzo_comp_mem )
ctx - > lzo_comp_mem = vmalloc ( LZO1X_MEM_COMPRESS ) ;
2007-12-07 11:53:23 +03:00
if ( ! ctx - > lzo_comp_mem )
return - ENOMEM ;
return 0 ;
}
static void lzo_exit ( struct crypto_tfm * tfm )
{
struct lzo_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2014-06-24 12:23:45 +04:00
kvfree ( ctx - > lzo_comp_mem ) ;
2007-12-07 11:53:23 +03:00
}
static int lzo_compress ( struct crypto_tfm * tfm , const u8 * src ,
unsigned int slen , u8 * dst , unsigned int * dlen )
{
struct lzo_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
size_t tmp_len = * dlen ; /* size_t(ulong) <-> uint on 64 bit */
int err ;
err = lzo1x_1_compress ( src , slen , dst , & tmp_len , ctx - > lzo_comp_mem ) ;
if ( err ! = LZO_E_OK )
return - EINVAL ;
* dlen = tmp_len ;
return 0 ;
}
static int lzo_decompress ( struct crypto_tfm * tfm , const u8 * src ,
unsigned int slen , u8 * dst , unsigned int * dlen )
{
int err ;
size_t tmp_len = * dlen ; /* size_t(ulong) <-> uint on 64 bit */
err = lzo1x_decompress_safe ( src , slen , dst , & tmp_len ) ;
if ( err ! = LZO_E_OK )
return - EINVAL ;
* dlen = tmp_len ;
return 0 ;
}
static struct crypto_alg alg = {
. cra_name = " lzo " ,
. cra_flags = CRYPTO_ALG_TYPE_COMPRESS ,
. cra_ctxsize = sizeof ( struct lzo_ctx ) ,
. cra_module = THIS_MODULE ,
. cra_init = lzo_init ,
. cra_exit = lzo_exit ,
. cra_u = { . compress = {
. coa_compress = lzo_compress ,
. coa_decompress = lzo_decompress } }
} ;
2008-04-05 17:00:57 +04:00
static int __init lzo_mod_init ( void )
2007-12-07 11:53:23 +03:00
{
return crypto_register_alg ( & alg ) ;
}
2008-04-05 17:00:57 +04:00
static void __exit lzo_mod_fini ( void )
2007-12-07 11:53:23 +03:00
{
crypto_unregister_alg ( & alg ) ;
}
2008-04-05 17:00:57 +04:00
module_init ( lzo_mod_init ) ;
module_exit ( lzo_mod_fini ) ;
2007-12-07 11:53:23 +03:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " LZO Compression Algorithm " ) ;