mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
[CRYPTO] lzo: Add LZO compression algorithm support
Add LZO compression algorithm support Signed-off-by: Zoltan Sogor <weth@inf.u-szeged.hu> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
91755a921c
commit
0b77abb3b2
@ -536,6 +536,14 @@ config CRYPTO_AUTHENC
|
||||
Authenc: Combined mode wrapper for IPsec.
|
||||
This is required for IPSec.
|
||||
|
||||
config CRYPTO_LZO
|
||||
tristate "LZO compression algorithm"
|
||||
select CRYPTO_ALGAPI
|
||||
select LZO_COMPRESS
|
||||
select LZO_DECOMPRESS
|
||||
help
|
||||
This is the LZO algorithm.
|
||||
|
||||
source "drivers/crypto/Kconfig"
|
||||
|
||||
endif # if CRYPTO
|
||||
|
@ -55,6 +55,7 @@ obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o
|
||||
obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
|
||||
obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
|
||||
obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o
|
||||
obj-$(CONFIG_CRYPTO_LZO) += lzo.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
|
||||
|
||||
|
106
crypto/lzo.c
Normal file
106
crypto/lzo.c
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* 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>
|
||||
#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);
|
||||
|
||||
ctx->lzo_comp_mem = vmalloc(LZO1X_MEM_COMPRESS);
|
||||
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);
|
||||
|
||||
vfree(ctx->lzo_comp_mem);
|
||||
}
|
||||
|
||||
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_list = LIST_HEAD_INIT(alg.cra_list),
|
||||
.cra_init = lzo_init,
|
||||
.cra_exit = lzo_exit,
|
||||
.cra_u = { .compress = {
|
||||
.coa_compress = lzo_compress,
|
||||
.coa_decompress = lzo_decompress } }
|
||||
};
|
||||
|
||||
static int __init init(void)
|
||||
{
|
||||
return crypto_register_alg(&alg);
|
||||
}
|
||||
|
||||
static void __exit fini(void)
|
||||
{
|
||||
crypto_unregister_alg(&alg);
|
||||
}
|
||||
|
||||
module_init(init);
|
||||
module_exit(fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("LZO Compression Algorithm");
|
@ -84,7 +84,7 @@ static char *check[] = {
|
||||
"cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
|
||||
"arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
|
||||
"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
|
||||
"camellia", "seed", "salsa20", NULL
|
||||
"camellia", "seed", "salsa20", "lzo", NULL
|
||||
};
|
||||
|
||||
static void hexdump(unsigned char *buf, unsigned int len)
|
||||
@ -1292,6 +1292,8 @@ static void do_test(void)
|
||||
test_comp("deflate", deflate_comp_tv_template,
|
||||
deflate_decomp_tv_template, DEFLATE_COMP_TEST_VECTORS,
|
||||
DEFLATE_DECOMP_TEST_VECTORS);
|
||||
test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
|
||||
LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
|
||||
test_hash("crc32c", crc32c_tv_template, CRC32C_TEST_VECTORS);
|
||||
test_hash("hmac(md5)", hmac_md5_tv_template,
|
||||
HMAC_MD5_TEST_VECTORS);
|
||||
@ -1550,6 +1552,11 @@ static void do_test(void)
|
||||
AES_GCM_DEC_TEST_VECTORS);
|
||||
break;
|
||||
|
||||
case 36:
|
||||
test_comp("lzo", lzo_comp_tv_template, lzo_decomp_tv_template,
|
||||
LZO_COMP_TEST_VECTORS, LZO_DECOMP_TEST_VECTORS);
|
||||
break;
|
||||
|
||||
case 100:
|
||||
test_hash("hmac(md5)", hmac_md5_tv_template,
|
||||
HMAC_MD5_TEST_VECTORS);
|
||||
|
@ -7460,6 +7460,88 @@ static struct comp_testvec deflate_decomp_tv_template[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* LZO test vectors (null-terminated strings).
|
||||
*/
|
||||
#define LZO_COMP_TEST_VECTORS 2
|
||||
#define LZO_DECOMP_TEST_VECTORS 2
|
||||
|
||||
static struct comp_testvec lzo_comp_tv_template[] = {
|
||||
{
|
||||
.inlen = 70,
|
||||
.outlen = 46,
|
||||
.input = "Join us now and share the software "
|
||||
"Join us now and share the software ",
|
||||
.output = { 0x00, 0x0d, 0x4a, 0x6f, 0x69, 0x6e, 0x20, 0x75,
|
||||
0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x6e,
|
||||
0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74,
|
||||
0x77, 0x70, 0x01, 0x01, 0x4a, 0x6f, 0x69, 0x6e,
|
||||
0x3d, 0x88, 0x00, 0x11, 0x00, 0x00 },
|
||||
}, {
|
||||
.inlen = 159,
|
||||
.outlen = 133,
|
||||
.input = "This document describes a compression method based on the LZO "
|
||||
"compression algorithm. This document defines the application of "
|
||||
"the LZO algorithm used in UBIFS.",
|
||||
.output = { 0x00, 0x2b, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64,
|
||||
0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
|
||||
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
|
||||
0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70,
|
||||
0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
|
||||
0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x62,
|
||||
0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x4c, 0x5a, 0x4f, 0x2b,
|
||||
0x8c, 0x00, 0x0d, 0x61, 0x6c, 0x67, 0x6f, 0x72,
|
||||
0x69, 0x74, 0x68, 0x6d, 0x2e, 0x20, 0x20, 0x54,
|
||||
0x68, 0x69, 0x73, 0x2a, 0x54, 0x01, 0x02, 0x66,
|
||||
0x69, 0x6e, 0x65, 0x73, 0x94, 0x06, 0x05, 0x61,
|
||||
0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x76,
|
||||
0x0a, 0x6f, 0x66, 0x88, 0x02, 0x60, 0x09, 0x27,
|
||||
0xf0, 0x00, 0x0c, 0x20, 0x75, 0x73, 0x65, 0x64,
|
||||
0x20, 0x69, 0x6e, 0x20, 0x55, 0x42, 0x49, 0x46,
|
||||
0x53, 0x2e, 0x11, 0x00, 0x00 },
|
||||
},
|
||||
};
|
||||
|
||||
static struct comp_testvec lzo_decomp_tv_template[] = {
|
||||
{
|
||||
.inlen = 133,
|
||||
.outlen = 159,
|
||||
.input = { 0x00, 0x2b, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64,
|
||||
0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20,
|
||||
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
|
||||
0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70,
|
||||
0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
|
||||
0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x62,
|
||||
0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x4c, 0x5a, 0x4f, 0x2b,
|
||||
0x8c, 0x00, 0x0d, 0x61, 0x6c, 0x67, 0x6f, 0x72,
|
||||
0x69, 0x74, 0x68, 0x6d, 0x2e, 0x20, 0x20, 0x54,
|
||||
0x68, 0x69, 0x73, 0x2a, 0x54, 0x01, 0x02, 0x66,
|
||||
0x69, 0x6e, 0x65, 0x73, 0x94, 0x06, 0x05, 0x61,
|
||||
0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x76,
|
||||
0x0a, 0x6f, 0x66, 0x88, 0x02, 0x60, 0x09, 0x27,
|
||||
0xf0, 0x00, 0x0c, 0x20, 0x75, 0x73, 0x65, 0x64,
|
||||
0x20, 0x69, 0x6e, 0x20, 0x55, 0x42, 0x49, 0x46,
|
||||
0x53, 0x2e, 0x11, 0x00, 0x00 },
|
||||
.output = "This document describes a compression method based on the LZO "
|
||||
"compression algorithm. This document defines the application of "
|
||||
"the LZO algorithm used in UBIFS.",
|
||||
}, {
|
||||
.inlen = 46,
|
||||
.outlen = 70,
|
||||
.input = { 0x00, 0x0d, 0x4a, 0x6f, 0x69, 0x6e, 0x20, 0x75,
|
||||
0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x6e,
|
||||
0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x20,
|
||||
0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74,
|
||||
0x77, 0x70, 0x01, 0x01, 0x4a, 0x6f, 0x69, 0x6e,
|
||||
0x3d, 0x88, 0x00, 0x11, 0x00, 0x00 },
|
||||
.output = "Join us now and share the software "
|
||||
"Join us now and share the software ",
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Michael MIC test vectors from IEEE 802.11i
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user