2009-01-15 08:28:48

by Huang, Ying

[permalink] [raw]
Subject: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

cryptd_alloc_ablkcipher() will allocate a cryptd-ed ablkcipher for
specified algorithm name. The new allocated one is guaranteed to be
cryptd-ed ablkcipher, so the blkcipher underlying can be gotten via
cryptd_ablkcipher_child().

Signed-off-by: Huang Ying <[email protected]>

---
crypto/cryptd.c | 30 ++++++++++++++++++++++++++++++
include/crypto/algapi.h | 16 ++++++++++++++++
2 files changed, 46 insertions(+)

--- a/crypto/cryptd.c
+++ b/crypto/cryptd.c
@@ -537,6 +537,36 @@ static struct crypto_template cryptd_tmp
.module = THIS_MODULE,
};

+struct cryptd_ablkcipher *cryptd_alloc_ablkcipher(const char *alg_name,
+ u32 type, u32 mask)
+{
+ char cryptd_alg_name[CRYPTO_MAX_ALG_NAME];
+ struct crypto_ablkcipher *tfm;
+
+ if (snprintf(cryptd_alg_name, CRYPTO_MAX_ALG_NAME,
+ "cryptd(%s)", alg_name) >= CRYPTO_MAX_ALG_NAME)
+ return ERR_PTR(-EINVAL);
+ tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask);
+ BUG_ON(crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module !=
+ THIS_MODULE);
+
+ return __cryptd_ablkcipher_cast(tfm);
+}
+EXPORT_SYMBOL_GPL(cryptd_alloc_ablkcipher);
+
+struct crypto_blkcipher *cryptd_ablkcipher_child(struct cryptd_ablkcipher *tfm)
+{
+ struct cryptd_blkcipher_ctx *ctx = crypto_ablkcipher_ctx(&tfm->base);
+ return ctx->child;
+}
+EXPORT_SYMBOL_GPL(cryptd_ablkcipher_child);
+
+void cryptd_free_ablkcipher(struct cryptd_ablkcipher *tfm)
+{
+ crypto_free_ablkcipher(&tfm->base);
+}
+EXPORT_SYMBOL_GPL(cryptd_free_ablkcipher);
+
static inline int cryptd_create_thread(struct cryptd_state *state,
int (*fn)(void *data), const char *name)
{
--- a/include/crypto/algapi.h
+++ b/include/crypto/algapi.h
@@ -94,6 +94,10 @@ struct blkcipher_walk {
unsigned int blocksize;
};

+struct cryptd_ablkcipher {
+ struct crypto_ablkcipher base;
+};
+
extern const struct crypto_type crypto_ablkcipher_type;
extern const struct crypto_type crypto_aead_type;
extern const struct crypto_type crypto_blkcipher_type;
@@ -145,6 +149,18 @@ int blkcipher_walk_virt_block(struct blk
struct blkcipher_walk *walk,
unsigned int blocksize);

+static inline struct cryptd_ablkcipher *__cryptd_ablkcipher_cast(
+ struct crypto_ablkcipher *tfm)
+{
+ return (struct cryptd_ablkcipher *)tfm;
+}
+
+/* alg_name should be algorithm to be cryptd-ed */
+struct cryptd_ablkcipher *cryptd_alloc_ablkcipher(const char *alg_name,
+ u32 type, u32 mask);
+struct crypto_blkcipher *cryptd_ablkcipher_child(struct cryptd_ablkcipher *tfm);
+void cryptd_free_ablkcipher(struct cryptd_ablkcipher *tfm);
+
static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm)
{
unsigned long addr = (unsigned long)crypto_tfm_ctx(tfm);


Attachments:
signature.asc (197.00 B)
This is a digitally signed message part

2009-01-15 08:47:56

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

On Thu, Jan 15, 2009 at 04:28:33PM +0800, Huang Ying wrote:
>
> + tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask);
> + BUG_ON(crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module !=
> + THIS_MODULE);

You need to check whether tfm is an error before dereferencing it.
Also it's probably better to free the tfm and return an error rather
than invoking BUG.

> --- a/include/crypto/algapi.h
> +++ b/include/crypto/algapi.h

Please create a new file for this, e.g., include/crypto/cryptd.h.

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

2009-01-15 09:21:47

by Huang, Ying

[permalink] [raw]
Subject: Re: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

On Thu, 2009-01-15 at 16:47 +0800, Herbert Xu wrote:
> On Thu, Jan 15, 2009 at 04:28:33PM +0800, Huang Ying wrote:
> >
> > + tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask);
> > + BUG_ON(crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module !=
> > + THIS_MODULE);
>
> You need to check whether tfm is an error before dereferencing it.
> Also it's probably better to free the tfm and return an error rather
> than invoking BUG.

Why do we need this check? Someone else may register cryptd template?
Which error number should be return? -EINVAL?

> > --- a/include/crypto/algapi.h
> > +++ b/include/crypto/algapi.h
>
> Please create a new file for this, e.g., include/crypto/cryptd.h.

OK. I will do that.

Best Regards,
Huang Ying


Attachments:
signature.asc (197.00 B)
This is a digitally signed message part

2009-01-15 09:23:19

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

On Thu, Jan 15, 2009 at 05:21:47PM +0800, Huang Ying wrote:
> On Thu, 2009-01-15 at 16:47 +0800, Herbert Xu wrote:
> > On Thu, Jan 15, 2009 at 04:28:33PM +0800, Huang Ying wrote:
> > >
> > > + tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask);
> > > + BUG_ON(crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module !=
> > > + THIS_MODULE);
> >
> > You need to check whether tfm is an error before dereferencing it.
> > Also it's probably better to free the tfm and return an error rather
> > than invoking BUG.
>
> Why do we need this check? Someone else may register cryptd template?
> Which error number should be return? -EINVAL?

-ENOMEM for example.

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

2009-01-15 09:31:10

by Huang, Ying

[permalink] [raw]
Subject: Re: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

On Thu, 2009-01-15 at 17:23 +0800, Herbert Xu wrote:
> On Thu, Jan 15, 2009 at 05:21:47PM +0800, Huang Ying wrote:
> > On Thu, 2009-01-15 at 16:47 +0800, Herbert Xu wrote:
> > > On Thu, Jan 15, 2009 at 04:28:33PM +0800, Huang Ying wrote:
> > > >
> > > > + tfm = crypto_alloc_ablkcipher(cryptd_alg_name, type, mask);
> > > > + BUG_ON(crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module !=
> > > > + THIS_MODULE);
> > >
> > > You need to check whether tfm is an error before dereferencing it.
> > > Also it's probably better to free the tfm and return an error rather
> > > than invoking BUG.
> >
> > Why do we need this check? Someone else may register cryptd template?
> > Which error number should be return? -EINVAL?
>
> -ENOMEM for example.

You mean something as follow:

if (crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module != THIS_MODULE)
return ERR_PTR(-ENOMEM);

I think -ENOMEM is not appropriate for this check.

Sorry for ask you same question twice. Why do we need this check? Some
other module may register cryptd template?

Best Regards,
Huang Ying


Attachments:
signature.asc (197.00 B)
This is a digitally signed message part

2009-01-15 09:49:26

by Herbert Xu

[permalink] [raw]
Subject: Re: [PATCH crypto -v4 1/2] AES-NI: Add support to access underlying blkcipher under cryptd ablkcipher

On Thu, Jan 15, 2009 at 05:30:51PM +0800, Huang Ying wrote:
>
> > > Why do we need this check? Someone else may register cryptd template?
> > > Which error number should be return? -EINVAL?
> >
> > -ENOMEM for example.
>
> You mean something as follow:
>
> if (crypto_ablkcipher_tfm(tfm)->__crt_alg->cra_module != THIS_MODULE)
> return ERR_PTR(-ENOMEM);

No I meant that crypto_alloc_ablkcipher can return -ENOMEM.

If the check fails you should return -EINVAL.

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