Re: [PATCH/proposal] dm-crypt: add digest-based iv generation mode

From: Matt Mackall
Date: Tue Feb 24 2004 - 15:45:03 EST


On Tue, Feb 24, 2004 at 08:43:59PM +0100, Christophe Saout wrote:
>
> BTW: I think there's a bug in the ipv6 code, it uses spin_lock to
> protect itself, this will cause a sleep-inside-spinlock warning. (found
> while grepping through the source for other cryptoapi users)

Yep, I sent this to James several months ago but it appears we've both
forgotten about it:

diff -urN -X dontdiff orig/crypto/api.c work/crypto/api.c
--- orig/crypto/api.c 2003-07-13 22:38:38.000000000 -0500
+++ work/crypto/api.c 2003-08-14 01:53:07.000000000 -0500
@@ -53,7 +53,8 @@

static int crypto_init_flags(struct crypto_tfm *tfm, u32 flags)
{
- tfm->crt_flags = 0;
+ tfm->crt_flags = flags & CRYPTO_TFM_API_MASK;
+ flags &= ~CRYPTO_TFM_API_MASK;

switch (crypto_tfm_alg_type(tfm)) {
case CRYPTO_ALG_TYPE_CIPHER:
diff -urN -X dontdiff orig/crypto/internal.h work/crypto/internal.h
--- orig/crypto/internal.h 2003-07-13 22:29:11.000000000 -0500
+++ work/crypto/internal.h 2003-08-14 01:53:28.000000000 -0500
@@ -37,7 +37,7 @@

static inline void crypto_yield(struct crypto_tfm *tfm)
{
- if (!in_softirq())
+ if (tfm->crt_flags & CRYPTO_TFM_API_YIELD)
cond_resched();
}

diff -urN -X dontdiff orig/include/linux/crypto.h work/include/linux/crypto.h
--- orig/include/linux/crypto.h 2003-07-13 22:32:32.000000000 -0500
+++ work/include/linux/crypto.h 2003-08-14 01:53:07.000000000 -0500
@@ -36,7 +36,8 @@
*/
#define CRYPTO_TFM_MODE_MASK 0x000000ff
#define CRYPTO_TFM_REQ_MASK 0x000fff00
-#define CRYPTO_TFM_RES_MASK 0xfff00000
+#define CRYPTO_TFM_RES_MASK 0x7ff00000
+#define CRYPTO_TFM_API_MASK 0x80000000

#define CRYPTO_TFM_MODE_ECB 0x00000001
#define CRYPTO_TFM_MODE_CBC 0x00000002
@@ -50,6 +51,9 @@
#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000
#define CRYPTO_TFM_RES_BAD_FLAGS 0x01000000

+/* Allow for rescheduling after processing each sg element */
+#define CRYPTO_TFM_API_YIELD 0x80000000
+
/*
* Miscellaneous stuff.
*/
diff -urN -X dontdiff orig/include/linux/sched.h work/include/linux/sched.h
--- orig/include/linux/sched.h 2003-08-14 01:53:04.000000000 -0500
+++ work/include/linux/sched.h 2003-08-14 01:53:07.000000000 -0500
@@ -824,6 +824,7 @@
extern void __cond_resched(void);
static inline void cond_resched(void)
{
+ might_sleep();
if (need_resched())
__cond_resched();
}

> > Something like:
> >
> > /* calculate the size of a tfm so that users can manage their own
> > copies */
> >
> > int crypto_alg_size(const char *name);
>
> crypto_tfm_size?

Sure.

> > /* copy a TFM to a user-managed buffer, possibly on stack, with proper
> > internal reference counting and any other necessary magic, size checks
> > against boneheaded buffer sizing */
> >
> > crypto_copy_tfm(char *dst, const struct crypto_tfm *src, int size);
> >
> > /* do all the necessary bookkeeping to release a user-managed TFM, use
> > char pointer to avoid alloc/free mismatch */
> >
> > crypto_copy_cleanup_tfm(char *usertfm);
>
> Yes, I thought of something like this.

Ok, I might get to this by this afternoon.

--
Matt Mackall : http://www.selenic.com : Linux development and consulting
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/