crypto: prepare to allow multiple digest driver
This will allow to have hw driver or asm optimised driver. Use a priority level to determine which one to use at runtime. The generic one will be 0. Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
e10cc0b333
commit
ab5b2c35e1
|
@ -76,5 +76,5 @@ CONFIG_LED=y
|
|||
CONFIG_LED_GPIO=y
|
||||
CONFIG_LED_TRIGGERS=y
|
||||
CONFIG_FS_CRAMFS=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -59,5 +59,5 @@ CONFIG_DISK=y
|
|||
CONFIG_DISK_AHCI=y
|
||||
CONFIG_GPIO_PL061=y
|
||||
CONFIG_FS_TFTP=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -104,4 +104,4 @@ CONFIG_FS_UBIFS_COMPRESSION_ZLIB=y
|
|||
CONFIG_BZLIB=y
|
||||
CONFIG_BMP=y
|
||||
CONFIG_PNG=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -45,5 +45,5 @@ CONFIG_USB_HOST=y
|
|||
CONFIG_USB_EHCI=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_CLOCKSOURCE_DUMMY=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -55,4 +55,4 @@ CONFIG_MTD_NAND_NOMADIK=y
|
|||
CONFIG_UBI=y
|
||||
CONFIG_FS_CRAMFS=y
|
||||
CONFIG_MD5=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -173,6 +173,6 @@ CONFIG_CRC32=y
|
|||
CONFIG_CRC16=y
|
||||
CONFIG_DIGEST=y
|
||||
CONFIG_MD5=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA224=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA224_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -64,5 +64,5 @@ CONFIG_FS_EXT4=y
|
|||
CONFIG_FS_FAT=y
|
||||
CONFIG_FS_FAT_WRITE=y
|
||||
CONFIG_FS_FAT_LFN=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -95,5 +95,5 @@ CONFIG_FS_EXT4=y
|
|||
CONFIG_FS_TFTP=y
|
||||
CONFIG_FS_NFS=y
|
||||
CONFIG_PNG=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -81,5 +81,5 @@ CONFIG_FS_CRAMFS=y
|
|||
CONFIG_FS_EXT4=y
|
||||
CONFIG_FS_TFTP=y
|
||||
CONFIG_FS_NFS=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -58,5 +58,5 @@ CONFIG_DRIVER_CFI=y
|
|||
# CONFIG_DRIVER_CFI_BANK_WIDTH_1 is not set
|
||||
# CONFIG_DRIVER_CFI_BANK_WIDTH_2 is not set
|
||||
CONFIG_FS_TFTP=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -57,5 +57,5 @@ CONFIG_DRIVER_CFI=y
|
|||
# CONFIG_DRIVER_CFI_BANK_WIDTH_1 is not set
|
||||
# CONFIG_DRIVER_CFI_BANK_WIDTH_2 is not set
|
||||
CONFIG_FS_TFTP=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -45,5 +45,5 @@ CONFIG_DRIVER_SERIAL_NS16550=y
|
|||
CONFIG_LED=y
|
||||
CONFIG_LED_GPIO=y
|
||||
CONFIG_LED_GPIO_OF=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -114,4 +114,4 @@ CONFIG_FS_UBIFS_COMPRESSION_ZLIB=y
|
|||
CONFIG_BZLIB=y
|
||||
CONFIG_BMP=y
|
||||
CONFIG_PNG=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -37,6 +37,6 @@ CONFIG_OFDEVICE=y
|
|||
# CONFIG_SPI is not set
|
||||
CONFIG_CLOCKSOURCE_DUMMY=y
|
||||
CONFIG_CLOCKSOURCE_DUMMY_RATE=3500
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA224=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA224_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -46,6 +46,6 @@ CONFIG_LED_TRIGGERS=y
|
|||
CONFIG_GPIO_JZ4740=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_JZ4740=y
|
||||
CONFIG_SHA1=y
|
||||
CONFIG_SHA224=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA1_GENERIC=y
|
||||
CONFIG_DIGEST_SHA224_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -30,5 +30,5 @@ CONFIG_MTD=y
|
|||
# CONFIG_MTD_OOB_DEVICE is not set
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MD5=y
|
||||
CONFIG_SHA224=y
|
||||
CONFIG_SHA256=y
|
||||
CONFIG_DIGEST_SHA224_GENERIC=y
|
||||
CONFIG_DIGEST_SHA256_GENERIC=y
|
||||
|
|
|
@ -13,25 +13,53 @@ menuconfig DIGEST
|
|||
if DIGEST
|
||||
|
||||
config MD5
|
||||
bool "MD5"
|
||||
bool
|
||||
|
||||
config SHA1
|
||||
bool "SHA1"
|
||||
bool
|
||||
|
||||
config SHA224
|
||||
bool "SHA224"
|
||||
bool
|
||||
|
||||
config SHA256
|
||||
bool "SHA256"
|
||||
bool
|
||||
|
||||
config SHA384
|
||||
bool "SHA384"
|
||||
bool
|
||||
|
||||
config SHA512
|
||||
bool "SHA512"
|
||||
bool
|
||||
|
||||
config DIGEST_HMAC
|
||||
bool
|
||||
|
||||
config DIGEST_MD5_GENERIC
|
||||
bool "MD5"
|
||||
select MD5
|
||||
|
||||
config DIGEST_SHA1_GENERIC
|
||||
bool "SHA1"
|
||||
select SHA1
|
||||
|
||||
config DIGEST_SHA224_GENERIC
|
||||
bool "SHA224"
|
||||
select SHA224
|
||||
|
||||
config DIGEST_SHA256_GENERIC
|
||||
bool "SHA256"
|
||||
select SHA256
|
||||
|
||||
config DIGEST_SHA384_GENERIC
|
||||
bool "SHA384"
|
||||
select SHA384
|
||||
|
||||
config DIGEST_SHA512_GENERIC
|
||||
bool "SHA512"
|
||||
select SHA512
|
||||
|
||||
config DIGEST_HMAC_GENERIC
|
||||
bool "HMAC"
|
||||
select DIGEST_HMAC
|
||||
|
||||
endif
|
||||
|
||||
|
|
|
@ -2,12 +2,12 @@ obj-$(CONFIG_CRC32) += crc32.o
|
|||
obj-$(CONFIG_CRC16) += crc16.o
|
||||
obj-$(CONFIG_CRC7) += crc7.o
|
||||
obj-$(CONFIG_DIGEST) += digest.o
|
||||
obj-$(CONFIG_DIGEST_HMAC) += hmac.o
|
||||
obj-$(CONFIG_MD5) += md5.o
|
||||
obj-$(CONFIG_SHA1) += sha1.o
|
||||
obj-$(CONFIG_SHA224) += sha2.o
|
||||
obj-$(CONFIG_SHA256) += sha2.o
|
||||
obj-$(CONFIG_SHA384) += sha4.o
|
||||
obj-$(CONFIG_SHA512) += sha4.o
|
||||
obj-$(CONFIG_DIGEST_HMAC_GENERIC) += hmac.o
|
||||
obj-$(CONFIG_DIGEST_MD5_GENERIC) += md5.o
|
||||
obj-$(CONFIG_DIGEST_SHA1_GENERIC) += sha1.o
|
||||
obj-$(CONFIG_DIGEST_SHA224_GENERIC) += sha2.o
|
||||
obj-$(CONFIG_DIGEST_SHA256_GENERIC) += sha2.o
|
||||
obj-$(CONFIG_DIGEST_SHA384_GENERIC) += sha4.o
|
||||
obj-$(CONFIG_DIGEST_SHA512_GENERIC) += sha4.o
|
||||
|
||||
obj-$(CONFIG_CRYPTO_PBKDF2) += pbkdf2.o
|
||||
|
|
|
@ -25,8 +25,7 @@
|
|||
#include <errno.h>
|
||||
#include <module.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
static LIST_HEAD(digests);
|
||||
|
||||
|
@ -78,7 +77,7 @@ int digest_generic_digest(struct digest *d, const void *data,
|
|||
|
||||
int digest_algo_register(struct digest_algo *d)
|
||||
{
|
||||
if (!d || !d->name || !d->update || !d->final || !d->verify)
|
||||
if (!d || !d->base.name || !d->update || !d->final || !d->verify)
|
||||
return -EINVAL;
|
||||
|
||||
if (!d->init)
|
||||
|
@ -90,9 +89,6 @@ int digest_algo_register(struct digest_algo *d)
|
|||
if (!d->free)
|
||||
d->free = dummy_free;
|
||||
|
||||
if (digest_algo_get_by_name(d->name))
|
||||
return -EEXIST;
|
||||
|
||||
list_add_tail(&d->list, &digests);
|
||||
|
||||
return 0;
|
||||
|
@ -110,25 +106,36 @@ EXPORT_SYMBOL(digest_algo_unregister);
|
|||
|
||||
static struct digest_algo *digest_algo_get_by_name(const char *name)
|
||||
{
|
||||
struct digest_algo *d;
|
||||
struct digest_algo *d = NULL;
|
||||
struct digest_algo *tmp;
|
||||
int priority = -1;
|
||||
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
list_for_each_entry(d, &digests, list) {
|
||||
if(strcmp(d->name, name) == 0)
|
||||
return d;
|
||||
list_for_each_entry(tmp, &digests, list) {
|
||||
if (strcmp(tmp->base.name, name) != 0)
|
||||
continue;
|
||||
|
||||
if (tmp->base.priority <= priority)
|
||||
continue;
|
||||
|
||||
d = tmp;
|
||||
priority = tmp->base.priority;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return d;
|
||||
}
|
||||
|
||||
void digest_algo_prints(const char *prefix)
|
||||
{
|
||||
struct digest_algo* d;
|
||||
|
||||
printf("%s%-15s\t%-20s\t%-15s\n", prefix, "name", "driver", "priority");
|
||||
printf("%s--------------------------------------------------\n", prefix);
|
||||
list_for_each_entry(d, &digests, list) {
|
||||
printf("%s%s\n", prefix, d->name);
|
||||
printf("%s%-15s\t%-20s\t%d\n", prefix, d->base.name,
|
||||
d->base.driver_name, d->base.priority);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,7 @@
|
|||
#include <common.h>
|
||||
#include <digest.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
struct digest_hmac {
|
||||
char *name;
|
||||
|
@ -145,7 +144,10 @@ err:
|
|||
}
|
||||
|
||||
struct digest_algo hmac_algo = {
|
||||
.flags = DIGEST_ALGO_NEED_KEY,
|
||||
.base = {
|
||||
.priority = 0,
|
||||
.flags = DIGEST_ALGO_NEED_KEY,
|
||||
},
|
||||
.alloc = digest_hmac_alloc,
|
||||
.init = digest_hmac_init,
|
||||
.update = digest_hmac_update,
|
||||
|
@ -160,16 +162,20 @@ struct digest_algo hmac_algo = {
|
|||
int digest_hmac_register(struct digest_algo *algo, unsigned int pad_length)
|
||||
{
|
||||
struct digest_hmac *dh;
|
||||
char *name;
|
||||
|
||||
if (!algo || !pad_length)
|
||||
return -EINVAL;
|
||||
|
||||
name = algo->base.name;
|
||||
dh = xzalloc(sizeof(*dh));
|
||||
dh->name = xstrdup(algo->name);
|
||||
dh->name = xstrdup(name);
|
||||
dh->pad_length = pad_length;
|
||||
dh->algo = hmac_algo;
|
||||
dh->algo.length = algo->length;
|
||||
dh->algo.name = asprintf("hmac(%s)", algo->name);
|
||||
dh->algo.base.name = asprintf("hmac(%s)", name);
|
||||
dh->algo.base.driver_name = asprintf("hmac(%s)-generic", name);
|
||||
dh->algo.base.priority = algo->base.priority;
|
||||
|
||||
return digest_algo_register(&dh->algo);
|
||||
}
|
||||
|
|
|
@ -28,8 +28,7 @@
|
|||
#include <common.h>
|
||||
#include <digest.h>
|
||||
#include <init.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
struct MD5Context {
|
||||
__u32 buf[4];
|
||||
|
@ -290,7 +289,11 @@ static int digest_md5_final(struct digest *d, unsigned char *md)
|
|||
}
|
||||
|
||||
static struct digest_algo md5 = {
|
||||
.name = "md5",
|
||||
.base = {
|
||||
.name = "md5",
|
||||
.driver_name = "md5-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
.init = digest_md5_init,
|
||||
.update = digest_md5_update,
|
||||
.final = digest_md5_final,
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <linux/string.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
#define SHA1_SUM_POS -0x20
|
||||
#define SHA1_SUM_LEN 20
|
||||
|
@ -311,7 +311,12 @@ static int digest_sha1_final(struct digest *d, unsigned char *md)
|
|||
}
|
||||
|
||||
static struct digest_algo m = {
|
||||
.name = "sha1",
|
||||
.base = {
|
||||
.name = "sha1",
|
||||
.driver_name = "sha1-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
|
||||
.init = digest_sha1_init,
|
||||
.update = digest_sha1_update,
|
||||
.final = digest_sha1_final,
|
||||
|
|
|
@ -20,8 +20,7 @@
|
|||
#include <init.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
#define SHA224_SUM_LEN 28
|
||||
#define SHA256_SUM_LEN 32
|
||||
|
@ -300,7 +299,12 @@ static int digest_sha224_init(struct digest *d)
|
|||
}
|
||||
|
||||
static struct digest_algo m224 = {
|
||||
.name = "sha224",
|
||||
.base = {
|
||||
.name = "sha224",
|
||||
.driver_name = "sha224-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
|
||||
.init = digest_sha224_init,
|
||||
.update = digest_sha2_update,
|
||||
.final = digest_sha2_final,
|
||||
|
@ -332,7 +336,12 @@ static int digest_sha256_init(struct digest *d)
|
|||
}
|
||||
|
||||
static struct digest_algo m256 = {
|
||||
.name = "sha256",
|
||||
.base = {
|
||||
.name = "sha256",
|
||||
.driver_name = "sha256-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
|
||||
.init = digest_sha256_init,
|
||||
.update = digest_sha2_update,
|
||||
.final = digest_sha2_final,
|
||||
|
|
|
@ -28,8 +28,7 @@
|
|||
#include <init.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include <crypto/internal.h>
|
||||
|
||||
#define SHA384_SUM_LEN 48
|
||||
#define SHA512_SUM_LEN 64
|
||||
|
@ -305,7 +304,12 @@ static int digest_sha384_init(struct digest *d)
|
|||
}
|
||||
|
||||
static struct digest_algo m384 = {
|
||||
.name = "sha384",
|
||||
.base = {
|
||||
.name = "sha384",
|
||||
.driver_name = "sha384-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
|
||||
.init = digest_sha384_init,
|
||||
.update = digest_sha4_update,
|
||||
.final = digest_sha4_final,
|
||||
|
@ -338,7 +342,12 @@ static int digest_sha512_init(struct digest *d)
|
|||
}
|
||||
|
||||
static struct digest_algo m512 = {
|
||||
.name = "sha512",
|
||||
.base = {
|
||||
.name = "sha512",
|
||||
.driver_name = "sha512-generic",
|
||||
.priority = 0,
|
||||
},
|
||||
|
||||
.init = digest_sha512_init,
|
||||
.update = digest_sha4_update,
|
||||
.final = digest_sha4_final,
|
||||
|
|
|
@ -23,10 +23,16 @@
|
|||
|
||||
struct digest;
|
||||
|
||||
struct digest_algo {
|
||||
struct crypto_alg {
|
||||
char *name;
|
||||
char *driver_name;
|
||||
int priority;
|
||||
#define DIGEST_ALGO_NEED_KEY (1 << 0)
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
struct digest_algo {
|
||||
struct crypto_alg base;
|
||||
|
||||
int (*alloc)(struct digest *d);
|
||||
void (*free)(struct digest *d);
|
||||
|
@ -113,12 +119,12 @@ static inline int digest_set_key(struct digest *d, const unsigned char *key,
|
|||
|
||||
static inline int digest_is_flags(struct digest *d, unsigned int flags)
|
||||
{
|
||||
return d->algo->flags & flags;
|
||||
return d->algo->base.flags & flags;
|
||||
}
|
||||
|
||||
static inline const char *digest_name(struct digest *d)
|
||||
{
|
||||
return d->algo->name;
|
||||
return d->algo->base.name;
|
||||
}
|
||||
|
||||
#endif /* __SH_ST_DEVICES_H__ */
|
||||
|
|
Loading…
Reference in New Issue