xref: /linux/crypto/lzo-rle.c (revision 0898782247ae533d1f4e47a06bc5d4870931b284)
12b27bdccSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
245ec975eSDave Rodgman /*
345ec975eSDave Rodgman  * Cryptographic API.
445ec975eSDave Rodgman  */
545ec975eSDave Rodgman 
645ec975eSDave Rodgman #include <linux/init.h>
745ec975eSDave Rodgman #include <linux/module.h>
845ec975eSDave Rodgman #include <linux/crypto.h>
945ec975eSDave Rodgman #include <linux/vmalloc.h>
1045ec975eSDave Rodgman #include <linux/mm.h>
1145ec975eSDave Rodgman #include <linux/lzo.h>
1245ec975eSDave Rodgman #include <crypto/internal/scompress.h>
1345ec975eSDave Rodgman 
1445ec975eSDave Rodgman struct lzorle_ctx {
1545ec975eSDave Rodgman 	void *lzorle_comp_mem;
1645ec975eSDave Rodgman };
1745ec975eSDave Rodgman 
lzorle_alloc_ctx(struct crypto_scomp * tfm)1845ec975eSDave Rodgman static void *lzorle_alloc_ctx(struct crypto_scomp *tfm)
1945ec975eSDave Rodgman {
2045ec975eSDave Rodgman 	void *ctx;
2145ec975eSDave Rodgman 
2245ec975eSDave Rodgman 	ctx = kvmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
2345ec975eSDave Rodgman 	if (!ctx)
2445ec975eSDave Rodgman 		return ERR_PTR(-ENOMEM);
2545ec975eSDave Rodgman 
2645ec975eSDave Rodgman 	return ctx;
2745ec975eSDave Rodgman }
2845ec975eSDave Rodgman 
lzorle_init(struct crypto_tfm * tfm)2945ec975eSDave Rodgman static int lzorle_init(struct crypto_tfm *tfm)
3045ec975eSDave Rodgman {
3145ec975eSDave Rodgman 	struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
3245ec975eSDave Rodgman 
3345ec975eSDave Rodgman 	ctx->lzorle_comp_mem = lzorle_alloc_ctx(NULL);
3445ec975eSDave Rodgman 	if (IS_ERR(ctx->lzorle_comp_mem))
3545ec975eSDave Rodgman 		return -ENOMEM;
3645ec975eSDave Rodgman 
3745ec975eSDave Rodgman 	return 0;
3845ec975eSDave Rodgman }
3945ec975eSDave Rodgman 
lzorle_free_ctx(struct crypto_scomp * tfm,void * ctx)4045ec975eSDave Rodgman static void lzorle_free_ctx(struct crypto_scomp *tfm, void *ctx)
4145ec975eSDave Rodgman {
4245ec975eSDave Rodgman 	kvfree(ctx);
4345ec975eSDave Rodgman }
4445ec975eSDave Rodgman 
lzorle_exit(struct crypto_tfm * tfm)4545ec975eSDave Rodgman static void lzorle_exit(struct crypto_tfm *tfm)
4645ec975eSDave Rodgman {
4745ec975eSDave Rodgman 	struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
4845ec975eSDave Rodgman 
4945ec975eSDave Rodgman 	lzorle_free_ctx(NULL, ctx->lzorle_comp_mem);
5045ec975eSDave Rodgman }
5145ec975eSDave Rodgman 
__lzorle_compress(const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen,void * ctx)5245ec975eSDave Rodgman static int __lzorle_compress(const u8 *src, unsigned int slen,
5345ec975eSDave Rodgman 			  u8 *dst, unsigned int *dlen, void *ctx)
5445ec975eSDave Rodgman {
5545ec975eSDave Rodgman 	size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
5645ec975eSDave Rodgman 	int err;
5745ec975eSDave Rodgman 
5845ec975eSDave Rodgman 	err = lzorle1x_1_compress(src, slen, dst, &tmp_len, ctx);
5945ec975eSDave Rodgman 
6045ec975eSDave Rodgman 	if (err != LZO_E_OK)
6145ec975eSDave Rodgman 		return -EINVAL;
6245ec975eSDave Rodgman 
6345ec975eSDave Rodgman 	*dlen = tmp_len;
6445ec975eSDave Rodgman 	return 0;
6545ec975eSDave Rodgman }
6645ec975eSDave Rodgman 
lzorle_compress(struct crypto_tfm * tfm,const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen)6745ec975eSDave Rodgman static int lzorle_compress(struct crypto_tfm *tfm, const u8 *src,
6845ec975eSDave Rodgman 			unsigned int slen, u8 *dst, unsigned int *dlen)
6945ec975eSDave Rodgman {
7045ec975eSDave Rodgman 	struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
7145ec975eSDave Rodgman 
7245ec975eSDave Rodgman 	return __lzorle_compress(src, slen, dst, dlen, ctx->lzorle_comp_mem);
7345ec975eSDave Rodgman }
7445ec975eSDave Rodgman 
lzorle_scompress(struct crypto_scomp * tfm,const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen,void * ctx)7545ec975eSDave Rodgman static int lzorle_scompress(struct crypto_scomp *tfm, const u8 *src,
7645ec975eSDave Rodgman 			 unsigned int slen, u8 *dst, unsigned int *dlen,
7745ec975eSDave Rodgman 			 void *ctx)
7845ec975eSDave Rodgman {
7945ec975eSDave Rodgman 	return __lzorle_compress(src, slen, dst, dlen, ctx);
8045ec975eSDave Rodgman }
8145ec975eSDave Rodgman 
__lzorle_decompress(const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen)8245ec975eSDave Rodgman static int __lzorle_decompress(const u8 *src, unsigned int slen,
8345ec975eSDave Rodgman 			    u8 *dst, unsigned int *dlen)
8445ec975eSDave Rodgman {
8545ec975eSDave Rodgman 	int err;
8645ec975eSDave Rodgman 	size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
8745ec975eSDave Rodgman 
8845ec975eSDave Rodgman 	err = lzo1x_decompress_safe(src, slen, dst, &tmp_len);
8945ec975eSDave Rodgman 
9045ec975eSDave Rodgman 	if (err != LZO_E_OK)
9145ec975eSDave Rodgman 		return -EINVAL;
9245ec975eSDave Rodgman 
9345ec975eSDave Rodgman 	*dlen = tmp_len;
9445ec975eSDave Rodgman 	return 0;
9545ec975eSDave Rodgman }
9645ec975eSDave Rodgman 
lzorle_decompress(struct crypto_tfm * tfm,const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen)9745ec975eSDave Rodgman static int lzorle_decompress(struct crypto_tfm *tfm, const u8 *src,
9845ec975eSDave Rodgman 			  unsigned int slen, u8 *dst, unsigned int *dlen)
9945ec975eSDave Rodgman {
10045ec975eSDave Rodgman 	return __lzorle_decompress(src, slen, dst, dlen);
10145ec975eSDave Rodgman }
10245ec975eSDave Rodgman 
lzorle_sdecompress(struct crypto_scomp * tfm,const u8 * src,unsigned int slen,u8 * dst,unsigned int * dlen,void * ctx)10345ec975eSDave Rodgman static int lzorle_sdecompress(struct crypto_scomp *tfm, const u8 *src,
10445ec975eSDave Rodgman 			   unsigned int slen, u8 *dst, unsigned int *dlen,
10545ec975eSDave Rodgman 			   void *ctx)
10645ec975eSDave Rodgman {
10745ec975eSDave Rodgman 	return __lzorle_decompress(src, slen, dst, dlen);
10845ec975eSDave Rodgman }
10945ec975eSDave Rodgman 
11045ec975eSDave Rodgman static struct crypto_alg alg = {
11145ec975eSDave Rodgman 	.cra_name		= "lzo-rle",
112*d6ebf528SEric Biggers 	.cra_driver_name	= "lzo-rle-generic",
11345ec975eSDave Rodgman 	.cra_flags		= CRYPTO_ALG_TYPE_COMPRESS,
11445ec975eSDave Rodgman 	.cra_ctxsize		= sizeof(struct lzorle_ctx),
11545ec975eSDave Rodgman 	.cra_module		= THIS_MODULE,
11645ec975eSDave Rodgman 	.cra_init		= lzorle_init,
11745ec975eSDave Rodgman 	.cra_exit		= lzorle_exit,
11845ec975eSDave Rodgman 	.cra_u			= { .compress = {
11945ec975eSDave Rodgman 	.coa_compress		= lzorle_compress,
12045ec975eSDave Rodgman 	.coa_decompress		= lzorle_decompress } }
12145ec975eSDave Rodgman };
12245ec975eSDave Rodgman 
12345ec975eSDave Rodgman static struct scomp_alg scomp = {
12445ec975eSDave Rodgman 	.alloc_ctx		= lzorle_alloc_ctx,
12545ec975eSDave Rodgman 	.free_ctx		= lzorle_free_ctx,
12645ec975eSDave Rodgman 	.compress		= lzorle_scompress,
12745ec975eSDave Rodgman 	.decompress		= lzorle_sdecompress,
12845ec975eSDave Rodgman 	.base			= {
12945ec975eSDave Rodgman 		.cra_name	= "lzo-rle",
13045ec975eSDave Rodgman 		.cra_driver_name = "lzo-rle-scomp",
13145ec975eSDave Rodgman 		.cra_module	 = THIS_MODULE,
13245ec975eSDave Rodgman 	}
13345ec975eSDave Rodgman };
13445ec975eSDave Rodgman 
lzorle_mod_init(void)13545ec975eSDave Rodgman static int __init lzorle_mod_init(void)
13645ec975eSDave Rodgman {
13745ec975eSDave Rodgman 	int ret;
13845ec975eSDave Rodgman 
13945ec975eSDave Rodgman 	ret = crypto_register_alg(&alg);
14045ec975eSDave Rodgman 	if (ret)
14145ec975eSDave Rodgman 		return ret;
14245ec975eSDave Rodgman 
14345ec975eSDave Rodgman 	ret = crypto_register_scomp(&scomp);
14445ec975eSDave Rodgman 	if (ret) {
14545ec975eSDave Rodgman 		crypto_unregister_alg(&alg);
14645ec975eSDave Rodgman 		return ret;
14745ec975eSDave Rodgman 	}
14845ec975eSDave Rodgman 
14945ec975eSDave Rodgman 	return ret;
15045ec975eSDave Rodgman }
15145ec975eSDave Rodgman 
lzorle_mod_fini(void)15245ec975eSDave Rodgman static void __exit lzorle_mod_fini(void)
15345ec975eSDave Rodgman {
15445ec975eSDave Rodgman 	crypto_unregister_alg(&alg);
15545ec975eSDave Rodgman 	crypto_unregister_scomp(&scomp);
15645ec975eSDave Rodgman }
15745ec975eSDave Rodgman 
158c4741b23SEric Biggers subsys_initcall(lzorle_mod_init);
15945ec975eSDave Rodgman module_exit(lzorle_mod_fini);
16045ec975eSDave Rodgman 
16145ec975eSDave Rodgman MODULE_LICENSE("GPL");
16245ec975eSDave Rodgman MODULE_DESCRIPTION("LZO-RLE Compression Algorithm");
16345ec975eSDave Rodgman MODULE_ALIAS_CRYPTO("lzo-rle");
164