[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:
Zoltan Sogor 2007-12-07 16:53:23 +08:00 committed by Herbert Xu
parent 91755a921c
commit 0b77abb3b2
5 changed files with 205 additions and 1 deletions

View file

@ -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

View file

@ -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
View 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");

View file

@ -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);

View file

@ -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
*/