2012-07-19 18:42:41 +04:00
/*
2015-05-07 20:49:15 +03:00
* Cryptographic API for the 842 software compression algorithm .
2012-07-19 18:42:41 +04:00
*
* 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 .
*
* 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 .
*
2015-05-07 20:49:15 +03:00
* Copyright ( C ) IBM Corporation , 2011 - 2015
2012-07-19 18:42:41 +04:00
*
2015-05-07 20:49:15 +03:00
* Original Authors : Robert Jennings < rcj @ linux . vnet . ibm . com >
* Seth Jennings < sjenning @ linux . vnet . ibm . com >
2012-07-19 18:42:41 +04:00
*
2015-05-07 20:49:15 +03:00
* Rewrite : Dan Streetman < ddstreet @ ieee . org >
*
* This is the software implementation of compression and decompression using
* the 842 format . This uses the software 842 library at lib / 842 / which is
* only a reference implementation , and is very , very slow as compared to other
* software compressors . You probably do not want to use this software
* compression . If you have access to the PowerPC 842 compression hardware , you
* want to use the 842 hardware compression interface , which is at :
* drivers / crypto / nx / nx - 842 - crypto . c
2012-07-19 18:42:41 +04:00
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/crypto.h>
2015-05-07 20:49:15 +03:00
# include <linux/sw842.h>
2016-10-21 15:19:52 +03:00
# include <crypto/internal/scompress.h>
2012-07-19 18:42:41 +04:00
2015-05-07 20:49:15 +03:00
struct crypto842_ctx {
2016-10-21 15:19:52 +03:00
void * wmem ; /* working memory for compress */
2012-07-19 18:42:41 +04:00
} ;
2016-10-21 15:19:52 +03:00
static void * crypto842_alloc_ctx ( struct crypto_scomp * tfm )
{
void * ctx ;
ctx = kmalloc ( SW842_MEM_COMPRESS , GFP_KERNEL ) ;
if ( ! ctx )
return ERR_PTR ( - ENOMEM ) ;
return ctx ;
}
static int crypto842_init ( struct crypto_tfm * tfm )
{
struct crypto842_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
ctx - > wmem = crypto842_alloc_ctx ( NULL ) ;
if ( IS_ERR ( ctx - > wmem ) )
return - ENOMEM ;
return 0 ;
}
static void crypto842_free_ctx ( struct crypto_scomp * tfm , void * ctx )
{
kfree ( ctx ) ;
}
static void crypto842_exit ( struct crypto_tfm * tfm )
{
struct crypto842_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
crypto842_free_ctx ( NULL , ctx - > wmem ) ;
}
2015-05-07 20:49:15 +03:00
static int crypto842_compress ( struct crypto_tfm * tfm ,
const u8 * src , unsigned int slen ,
u8 * dst , unsigned int * dlen )
2012-07-19 18:42:41 +04:00
{
2015-05-07 20:49:15 +03:00
struct crypto842_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2012-07-19 18:42:41 +04:00
2015-05-07 20:49:15 +03:00
return sw842_compress ( src , slen , dst , dlen , ctx - > wmem ) ;
2012-07-19 18:42:41 +04:00
}
2016-10-21 15:19:52 +03:00
static int crypto842_scompress ( struct crypto_scomp * tfm ,
const u8 * src , unsigned int slen ,
u8 * dst , unsigned int * dlen , void * ctx )
{
return sw842_compress ( src , slen , dst , dlen , ctx ) ;
}
2015-05-07 20:49:15 +03:00
static int crypto842_decompress ( struct crypto_tfm * tfm ,
const u8 * src , unsigned int slen ,
u8 * dst , unsigned int * dlen )
2012-07-19 18:42:41 +04:00
{
2015-05-07 20:49:15 +03:00
return sw842_decompress ( src , slen , dst , dlen ) ;
2012-07-19 18:42:41 +04:00
}
2016-10-21 15:19:52 +03:00
static int crypto842_sdecompress ( struct crypto_scomp * tfm ,
const u8 * src , unsigned int slen ,
u8 * dst , unsigned int * dlen , void * ctx )
{
return sw842_decompress ( src , slen , dst , dlen ) ;
}
2012-07-19 18:42:41 +04:00
static struct crypto_alg alg = {
. cra_name = " 842 " ,
2015-05-07 20:49:15 +03:00
. cra_driver_name = " 842-generic " ,
. cra_priority = 100 ,
2012-07-19 18:42:41 +04:00
. cra_flags = CRYPTO_ALG_TYPE_COMPRESS ,
2015-05-07 20:49:15 +03:00
. cra_ctxsize = sizeof ( struct crypto842_ctx ) ,
2012-07-19 18:42:41 +04:00
. cra_module = THIS_MODULE ,
2016-10-21 15:19:52 +03:00
. cra_init = crypto842_init ,
. cra_exit = crypto842_exit ,
2012-07-19 18:42:41 +04:00
. cra_u = { . compress = {
2015-05-07 20:49:15 +03:00
. coa_compress = crypto842_compress ,
. coa_decompress = crypto842_decompress } }
2012-07-19 18:42:41 +04:00
} ;
2016-10-21 15:19:52 +03:00
static struct scomp_alg scomp = {
. alloc_ctx = crypto842_alloc_ctx ,
. free_ctx = crypto842_free_ctx ,
. compress = crypto842_scompress ,
. decompress = crypto842_sdecompress ,
. base = {
. cra_name = " 842 " ,
. cra_driver_name = " 842-scomp " ,
. cra_priority = 100 ,
. cra_module = THIS_MODULE ,
}
} ;
2015-05-07 20:49:15 +03:00
static int __init crypto842_mod_init ( void )
2012-07-19 18:42:41 +04:00
{
2016-10-21 15:19:52 +03:00
int ret ;
ret = crypto_register_alg ( & alg ) ;
if ( ret )
return ret ;
ret = crypto_register_scomp ( & scomp ) ;
if ( ret ) {
crypto_unregister_alg ( & alg ) ;
return ret ;
}
return ret ;
2012-07-19 18:42:41 +04:00
}
2015-05-07 20:49:15 +03:00
module_init ( crypto842_mod_init ) ;
2012-07-19 18:42:41 +04:00
2015-05-07 20:49:15 +03:00
static void __exit crypto842_mod_exit ( void )
2012-07-19 18:42:41 +04:00
{
crypto_unregister_alg ( & alg ) ;
2016-10-21 15:19:52 +03:00
crypto_unregister_scomp ( & scomp ) ;
2012-07-19 18:42:41 +04:00
}
2015-05-07 20:49:15 +03:00
module_exit ( crypto842_mod_exit ) ;
2012-07-19 18:42:41 +04:00
MODULE_LICENSE ( " GPL " ) ;
2015-05-07 20:49:15 +03:00
MODULE_DESCRIPTION ( " 842 Software Compression Algorithm " ) ;
2014-11-21 04:05:53 +03:00
MODULE_ALIAS_CRYPTO ( " 842 " ) ;
2015-05-07 20:49:15 +03:00
MODULE_ALIAS_CRYPTO ( " 842-generic " ) ;
MODULE_AUTHOR ( " Dan Streetman <ddstreet@ieee.org> " ) ;