Commit 0b77abb3 authored by Zoltan Sogor's avatar Zoltan Sogor Committed by Herbert Xu
Browse files

[CRYPTO] lzo: Add LZO compression algorithm support



Add LZO compression algorithm support

Signed-off-by: default avatarZoltan Sogor <weth@inf.u-szeged.hu>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 91755a92
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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

crypto/lzo.c

0 → 100644
+106 −0
Original line number Diff line number Diff line
/*
 * 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");
+8 −1
Original line number Diff line number Diff line
@@ -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);
+82 −0
Original line number Diff line number Diff line
@@ -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
 */