Re: [RFC] CryptoAPI & Compression

Herbert Xu
2005-03-26T04:46:34Z

[-- Attachment #1: Type: text/plain, Size: 1338 bytes --]

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~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

[-- Attachment #2: pcompress-1 --]
[-- Type: text/plain, Size: 2276 bytes --]

===== 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,