Re: [PATCH]crypto: Fix complain about lack test for internal used algorithm

Youquan,Song
2009-12-19T02:05:23Z

> On Fri, Dec 11, 2009 at 08:23:21AM -0500, Youquan,Song wrote:
> > When load aesni-intel and ghash_clmulni-intel driver,kernel will complain no
> > test for some internal used algorithm.
> > The strange information as following:
> >
> > alg: No test for __aes-aesni (__driver-aes-aesni)
> > alg: No test for __ecb-aes-aesni (__driver-ecb-aes-aesni)
> > alg: No test for __cbc-aes-aesni (__driver-cbc-aes-aesni)
> > alg: No test for __ecb-aes-aesni (cryptd(__driver-ecb-aes-aesni)
> > alg: No test for __ghash (__ghash-pclmulqdqni)
> > alg: No test for __ghash (cryptd(__ghash-pclmulqdqni))
>
> I'd prefer to just add nul testmgr entries for these algorithms.

Hi Herbert,

Do you like the following modification to the patch?
If yes, I will resend the patch.

Thanks

-Youquan

---

diff --git a/crypto/algapi.c b/crypto/algapi.c
index a03ebcb..a602223 100644
--- a/crypto/algapi.c
+++ b/crypto/algapi.c
@@ -18,6 +18,7 @@
#include <linux/module.h>
#include <linux/rtnetlink.h>
#include <linux/string.h>
+#include <crypto/cryptd.h>

#include "internal.h"

@@ -243,6 +244,32 @@ err:
goto out;
}

+int crypto_is_internal(const char *driver)
+{
+ struct crypto_alg *q;
+ int found = 0;
+
+ list_for_each_entry(q, &crypto_alg_list, cra_list) {
+ if (!strcmp(q->cra_driver_name, driver)) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (found) {
+
+ if (q->cra_priority == 0)
+ return 1;
+ if (q->cra_priority == CRYPTD_PRIORITY_ADDITION &&
+ strstr(q->cra_driver_name, "cryptd"))
+ return 1;
+ }
+
+ return 0;
+
+}
+EXPORT_SYMBOL_GPL(crypto_is_internal);
+
void crypto_alg_tested(const char *name, int err)
{
struct crypto_larval *test;
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
index f8ae0d9..79785b7 100644
--- a/crypto/cryptd.c
+++ b/crypto/cryptd.c
@@ -275,7 +275,7 @@ static void *cryptd_alloc_instance(struct crypto_alg *alg, unsigned int head,

memcpy(inst->alg.cra_name, alg->cra_name, CRYPTO_MAX_ALG_NAME);

- inst->alg.cra_priority = alg->cra_priority + 50;
+ inst->alg.cra_priority = alg->cra_priority + CRYPTD_PRIORITY_ADDITION;
inst->alg.cra_blocksize = alg->cra_blocksize;
inst->alg.cra_alignmask = alg->cra_alignmask;

diff --git a/crypto/internal.h b/crypto/internal.h
index 2d22636..23b6498 100644
--- a/crypto/internal.h
+++ b/crypto/internal.h
@@ -101,6 +101,8 @@ int crypto_register_notifier(struct notifier_block *nb);
int crypto_unregister_notifier(struct notifier_block *nb);
int crypto_probing_notify(unsigned long val, void *v);

+int crypto_is_internal(const char *driver);
+
static inline void crypto_alg_put(struct crypto_alg *alg)
{
if (atomic_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index f70ce52..0de1ef4 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -1316,6 +1316,12 @@ out:
return err;
}

+static int alg_test_null(const struct alg_test_desc *desc,
+ const char *driver, u32 type, u32 mask)
+{
+ return 0;
+}
+
static int alg_test_skcipher(const struct alg_test_desc *desc,
const char *driver, u32 type, u32 mask)
{
@@ -2086,6 +2092,15 @@ static const struct alg_test_desc alg_test_descs[] = {
}
}
}, {
+ .alg = "null",
+ .test = alg_test_null,
+ .suite = {
+ .hash = {
+ .vecs = NULL,
+ .count = 0
+ }
+ }
+ }, {
.alg = "pcbc(fcrypt)",
.test = alg_test_skcipher,
.suite = {
@@ -2365,6 +2380,15 @@ int alg_test(const char *driver, const char *alg, u32 type, u32 mask)
int j;
int rc;

+ if (crypto_is_internal(driver)) {
+ i = alg_find_test("null");
+ if (i < 0)
+ goto notest;
+ rc = alg_test_descs[i].test(alg_test_descs + i, "null",
+ type, mask);
+ goto test_done;
+
+ }
if ((type & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_CIPHER) {
char nalg[CRYPTO_MAX_ALG_NAME];

diff --git a/include/crypto/cryptd.h b/include/crypto/cryptd.h
index 1c96b25..50cd473 100644
--- a/include/crypto/cryptd.h
+++ b/include/crypto/cryptd.h
@@ -9,6 +9,8 @@
#include <linux/kernel.h>
#include <crypto/hash.h>

+#define CRYPTD_PRIORITY_ADDITION 50
+
struct cryptd_ablkcipher {
struct crypto_ablkcipher base;
};