at master 2.0 kB view raw
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");