Re: [RFC] CryptoAPI & Compression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Artem:

On Fri, Mar 25, 2005 at 04:08:20PM +0000, Artem B. Bityuckiy wrote:
> 
> I'm working on cleaning-up the JFFS3 compression stuff. JFFS3 contains a
> number of compressors which actually shouldn't be there as they are
> platform-independent and generic. So we want to move them to the generic
> part of the Linux kernel instead of storing them in fs/jffs2/. And we
> were going to use CryptoAPI to access the compressors.

Sounds good.
 
> In JFFS2 we need something more flexible. Te following is what we want:
> 
> int crypto_compress_ext(struct crypto_tfm *tfm,
>                     const u8 *src, unsigned int *slen,
>                     u8 *dst, unsigned int *dlen);

Compressing part of the input could be significantly different from
compressing all of the input depending on the algorithm.  In particular
it could be most costly to do so and/or result in worse compression.

So while I'm happy to add such an interface I think we should keep
crypto_comp_compress as well for full compression.

I've whipped up something quick and called it crypto_comp_pcompress.
How does this interface look to you?

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
===== crypto/compress.c 1.7 vs edited =====
--- 1.7/crypto/compress.c	2003-03-29 22:16:58 +11:00
+++ edited/crypto/compress.c	2005-03-26 15:33:19 +11:00
@@ -18,6 +18,17 @@
 #include <linux/string.h>
 #include "internal.h"
 
+static int crypto_pcompress(struct crypto_tfm *tfm,
+			    const u8 *src, unsigned int *slen,
+			    u8 *dst, unsigned int *dlen)
+{
+	if (!tfm->__crt_alg->cra_compress.coa_pcompress)
+		return -ENOSYS;
+	return tfm->__crt_alg->cra_compress.coa_pcompress(crypto_tfm_ctx(tfm),
+							  src, slen, dst,
+							  dlen);
+}
+
 static int crypto_compress(struct crypto_tfm *tfm,
                             const u8 *src, unsigned int slen,
                             u8 *dst, unsigned int *dlen)
@@ -50,6 +61,7 @@
 	if (ret)
 		goto out;
 
+	ops->cot_pcompress = crypto_pcompress;
 	ops->cot_compress = crypto_compress;
 	ops->cot_decompress = crypto_decompress;
 	
===== include/linux/crypto.h 1.32 vs edited =====
--- 1.32/include/linux/crypto.h	2005-01-26 16:53:19 +11:00
+++ edited/include/linux/crypto.h	2005-03-26 15:25:39 +11:00
@@ -87,6 +87,8 @@
 struct compress_alg {
 	int (*coa_init)(void *ctx);
 	void (*coa_exit)(void *ctx);
+	int (*coa_pcompress)(void *ctx, const u8 *src, unsigned int *slen,
+			     u8 *dst, unsigned int *dlen);
 	int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen,
 	                    u8 *dst, unsigned int *dlen);
 	int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen,
@@ -178,6 +180,9 @@
 };
 
 struct compress_tfm {
+	int (*cot_pcompress)(struct crypto_tfm *tfm,
+			     const u8 *src, unsigned int *slen,
+			     u8 *dst, unsigned int *dlen);
 	int (*cot_compress)(struct crypto_tfm *tfm,
 	                    const u8 *src, unsigned int slen,
 	                    u8 *dst, unsigned int *dlen);
@@ -363,6 +368,14 @@
 {
 	BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
 	memcpy(dst, tfm->crt_cipher.cit_iv, len);
+}
+
+static inline int crypto_comp_pcompress(struct crypto_tfm *tfm,
+					const u8 *src, unsigned int *slen,
+					u8 *dst, unsigned int *dlen)
+{
+	BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
+	return tfm->crt_compress.cot_pcompress(tfm, src, slen, dst, dlen);
 }
 
 static inline int crypto_comp_compress(struct crypto_tfm *tfm,

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux