Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Cryptographic API.
4 *
5 * Copyright (c) 2013 Chanho Min <chanho.min@lge.com>
6 */
7#include <crypto/internal/scompress.h>
8#include <linux/init.h>
9#include <linux/module.h>
10#include <linux/vmalloc.h>
11#include <linux/lz4.h>
12
13static void *lz4hc_alloc_ctx(void)
14{
15 void *ctx;
16
17 ctx = vmalloc(LZ4HC_MEM_COMPRESS);
18 if (!ctx)
19 return ERR_PTR(-ENOMEM);
20
21 return ctx;
22}
23
24static void lz4hc_free_ctx(void *ctx)
25{
26 vfree(ctx);
27}
28
29static int __lz4hc_compress_crypto(const u8 *src, unsigned int slen,
30 u8 *dst, unsigned int *dlen, void *ctx)
31{
32 int out_len = LZ4_compress_HC(src, dst, slen,
33 *dlen, LZ4HC_DEFAULT_CLEVEL, ctx);
34
35 if (!out_len)
36 return -EINVAL;
37
38 *dlen = out_len;
39 return 0;
40}
41
42static int lz4hc_scompress(struct crypto_scomp *tfm, const u8 *src,
43 unsigned int slen, u8 *dst, unsigned int *dlen,
44 void *ctx)
45{
46 return __lz4hc_compress_crypto(src, slen, dst, dlen, ctx);
47}
48
49static int __lz4hc_decompress_crypto(const u8 *src, unsigned int slen,
50 u8 *dst, unsigned int *dlen, void *ctx)
51{
52 int out_len = LZ4_decompress_safe(src, dst, slen, *dlen);
53
54 if (out_len < 0)
55 return -EINVAL;
56
57 *dlen = out_len;
58 return 0;
59}
60
61static int lz4hc_sdecompress(struct crypto_scomp *tfm, const u8 *src,
62 unsigned int slen, u8 *dst, unsigned int *dlen,
63 void *ctx)
64{
65 return __lz4hc_decompress_crypto(src, slen, dst, dlen, NULL);
66}
67
68static struct scomp_alg scomp = {
69 .streams = {
70 .alloc_ctx = lz4hc_alloc_ctx,
71 .free_ctx = lz4hc_free_ctx,
72 },
73 .compress = lz4hc_scompress,
74 .decompress = lz4hc_sdecompress,
75 .base = {
76 .cra_name = "lz4hc",
77 .cra_driver_name = "lz4hc-scomp",
78 .cra_module = THIS_MODULE,
79 }
80};
81
82static int __init lz4hc_mod_init(void)
83{
84 return crypto_register_scomp(&scomp);
85}
86
87static void __exit lz4hc_mod_fini(void)
88{
89 crypto_unregister_scomp(&scomp);
90}
91
92module_init(lz4hc_mod_init);
93module_exit(lz4hc_mod_fini);
94
95MODULE_LICENSE("GPL");
96MODULE_DESCRIPTION("LZ4HC Compression Algorithm");
97MODULE_ALIAS_CRYPTO("lz4hc");