Commit 71af2f6b authored by Herbert Xu's avatar Herbert Xu

Bluetooth: Use skcipher and hash

This patch replaces uses of blkcipher with skcipher and the long
obsolete hash interface with shash.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent c3917fd9
...@@ -21,9 +21,10 @@ ...@@ -21,9 +21,10 @@
*/ */
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/crypto.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <crypto/b128ops.h> #include <crypto/b128ops.h>
#include <crypto/hash.h>
#include <crypto/skcipher.h>
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
...@@ -87,8 +88,8 @@ struct smp_dev { ...@@ -87,8 +88,8 @@ struct smp_dev {
u8 min_key_size; u8 min_key_size;
u8 max_key_size; u8 max_key_size;
struct crypto_blkcipher *tfm_aes; struct crypto_skcipher *tfm_aes;
struct crypto_hash *tfm_cmac; struct crypto_shash *tfm_cmac;
}; };
struct smp_chan { struct smp_chan {
...@@ -126,8 +127,8 @@ struct smp_chan { ...@@ -126,8 +127,8 @@ struct smp_chan {
u8 dhkey[32]; u8 dhkey[32];
u8 mackey[16]; u8 mackey[16];
struct crypto_blkcipher *tfm_aes; struct crypto_skcipher *tfm_aes;
struct crypto_hash *tfm_cmac; struct crypto_shash *tfm_cmac;
}; };
/* These debug key values are defined in the SMP section of the core /* These debug key values are defined in the SMP section of the core
...@@ -165,12 +166,11 @@ static inline void swap_buf(const u8 *src, u8 *dst, size_t len) ...@@ -165,12 +166,11 @@ static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
* AES-CMAC, f4, f5, f6, g2 and h6. * AES-CMAC, f4, f5, f6, g2 and h6.
*/ */
static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m, static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
size_t len, u8 mac[16]) size_t len, u8 mac[16])
{ {
uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX]; uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
struct hash_desc desc; SHASH_DESC_ON_STACK(desc, tfm);
struct scatterlist sg;
int err; int err;
if (len > CMAC_MSG_MAX) if (len > CMAC_MSG_MAX)
...@@ -181,10 +181,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m, ...@@ -181,10 +181,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
return -EINVAL; return -EINVAL;
} }
desc.tfm = tfm; desc->tfm = tfm;
desc.flags = 0; desc->flags = 0;
crypto_hash_init(&desc);
/* Swap key and message from LSB to MSB */ /* Swap key and message from LSB to MSB */
swap_buf(k, tmp, 16); swap_buf(k, tmp, 16);
...@@ -193,23 +191,16 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m, ...@@ -193,23 +191,16 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
SMP_DBG("msg (len %zu) %*phN", len, (int) len, m); SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
SMP_DBG("key %16phN", k); SMP_DBG("key %16phN", k);
err = crypto_hash_setkey(tfm, tmp, 16); err = crypto_shash_setkey(tfm, tmp, 16);
if (err) { if (err) {
BT_ERR("cipher setkey failed: %d", err); BT_ERR("cipher setkey failed: %d", err);
return err; return err;
} }
sg_init_one(&sg, msg_msb, len); err = crypto_shash_digest(desc, msg_msb, len, mac_msb);
shash_desc_zero(desc);
err = crypto_hash_update(&desc, &sg, len);
if (err) { if (err) {
BT_ERR("Hash update error %d", err); BT_ERR("Hash computation error %d", err);
return err;
}
err = crypto_hash_final(&desc, mac_msb);
if (err) {
BT_ERR("Hash final error %d", err);
return err; return err;
} }
...@@ -220,8 +211,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m, ...@@ -220,8 +211,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
return 0; return 0;
} }
static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32], static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
const u8 x[16], u8 z, u8 res[16]) const u8 v[32], const u8 x[16], u8 z, u8 res[16])
{ {
u8 m[65]; u8 m[65];
int err; int err;
...@@ -243,7 +234,7 @@ static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32], ...@@ -243,7 +234,7 @@ static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
return err; return err;
} }
static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32], static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
const u8 n1[16], const u8 n2[16], const u8 a1[7], const u8 n1[16], const u8 n2[16], const u8 a1[7],
const u8 a2[7], u8 mackey[16], u8 ltk[16]) const u8 a2[7], u8 mackey[16], u8 ltk[16])
{ {
...@@ -296,7 +287,7 @@ static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32], ...@@ -296,7 +287,7 @@ static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32],
return 0; return 0;
} }
static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16], static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
const u8 n1[16], const u8 n2[16], const u8 r[16], const u8 n1[16], const u8 n2[16], const u8 r[16],
const u8 io_cap[3], const u8 a1[7], const u8 a2[7], const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
u8 res[16]) u8 res[16])
...@@ -324,7 +315,7 @@ static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16], ...@@ -324,7 +315,7 @@ static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
return err; return err;
} }
static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32], static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 v[32],
const u8 x[16], const u8 y[16], u32 *val) const u8 x[16], const u8 y[16], u32 *val)
{ {
u8 m[80], tmp[16]; u8 m[80], tmp[16];
...@@ -350,7 +341,7 @@ static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32], ...@@ -350,7 +341,7 @@ static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
return 0; return 0;
} }
static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16], static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
const u8 key_id[4], u8 res[16]) const u8 key_id[4], u8 res[16])
{ {
int err; int err;
...@@ -370,9 +361,9 @@ static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16], ...@@ -370,9 +361,9 @@ static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
* s1 and ah. * s1 and ah.
*/ */
static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r) static int smp_e(struct crypto_skcipher *tfm, const u8 *k, u8 *r)
{ {
struct blkcipher_desc desc; SKCIPHER_REQUEST_ON_STACK(req, tfm);
struct scatterlist sg; struct scatterlist sg;
uint8_t tmp[16], data[16]; uint8_t tmp[16], data[16];
int err; int err;
...@@ -384,13 +375,10 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r) ...@@ -384,13 +375,10 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
return -EINVAL; return -EINVAL;
} }
desc.tfm = tfm;
desc.flags = 0;
/* The most significant octet of key corresponds to k[0] */ /* The most significant octet of key corresponds to k[0] */
swap_buf(k, tmp, 16); swap_buf(k, tmp, 16);
err = crypto_blkcipher_setkey(tfm, tmp, 16); err = crypto_skcipher_setkey(tfm, tmp, 16);
if (err) { if (err) {
BT_ERR("cipher setkey failed: %d", err); BT_ERR("cipher setkey failed: %d", err);
return err; return err;
...@@ -401,7 +389,12 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r) ...@@ -401,7 +389,12 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
sg_init_one(&sg, data, 16); sg_init_one(&sg, data, 16);
err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16); skcipher_request_set_tfm(req, tfm);
skcipher_request_set_callback(req, 0, NULL, NULL);
skcipher_request_set_crypt(req, &sg, &sg, 16, NULL);
err = crypto_skcipher_encrypt(req);
skcipher_request_zero(req);
if (err) if (err)
BT_ERR("Encrypt data error %d", err); BT_ERR("Encrypt data error %d", err);
...@@ -413,7 +406,7 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r) ...@@ -413,7 +406,7 @@ static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
return err; return err;
} }
static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16], static int smp_c1(struct crypto_skcipher *tfm_aes, const u8 k[16],
const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat, const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16]) const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
{ {
...@@ -462,7 +455,7 @@ static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16], ...@@ -462,7 +455,7 @@ static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
return err; return err;
} }
static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16], static int smp_s1(struct crypto_skcipher *tfm_aes, const u8 k[16],
const u8 r1[16], const u8 r2[16], u8 _r[16]) const u8 r1[16], const u8 r2[16], u8 _r[16])
{ {
int err; int err;
...@@ -478,7 +471,7 @@ static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16], ...@@ -478,7 +471,7 @@ static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
return err; return err;
} }
static int smp_ah(struct crypto_blkcipher *tfm, const u8 irk[16], static int smp_ah(struct crypto_skcipher *tfm, const u8 irk[16],
const u8 r[3], u8 res[3]) const u8 r[3], u8 res[3])
{ {
u8 _res[16]; u8 _res[16];
...@@ -766,8 +759,8 @@ static void smp_chan_destroy(struct l2cap_conn *conn) ...@@ -766,8 +759,8 @@ static void smp_chan_destroy(struct l2cap_conn *conn)
kzfree(smp->slave_csrk); kzfree(smp->slave_csrk);
kzfree(smp->link_key); kzfree(smp->link_key);
crypto_free_blkcipher(smp->tfm_aes); crypto_free_skcipher(smp->tfm_aes);
crypto_free_hash(smp->tfm_cmac); crypto_free_shash(smp->tfm_cmac);
/* Ensure that we don't leave any debug key around if debug key /* Ensure that we don't leave any debug key around if debug key
* support hasn't been explicitly enabled. * support hasn't been explicitly enabled.
...@@ -1382,17 +1375,17 @@ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn) ...@@ -1382,17 +1375,17 @@ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
if (!smp) if (!smp)
return NULL; return NULL;
smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC); smp->tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(smp->tfm_aes)) { if (IS_ERR(smp->tfm_aes)) {
BT_ERR("Unable to create ECB crypto context"); BT_ERR("Unable to create ECB crypto context");
kzfree(smp); kzfree(smp);
return NULL; return NULL;
} }
smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC); smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
if (IS_ERR(smp->tfm_cmac)) { if (IS_ERR(smp->tfm_cmac)) {
BT_ERR("Unable to create CMAC crypto context"); BT_ERR("Unable to create CMAC crypto context");
crypto_free_blkcipher(smp->tfm_aes); crypto_free_skcipher(smp->tfm_aes);
kzfree(smp); kzfree(smp);
return NULL; return NULL;
} }
...@@ -3143,8 +3136,8 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid) ...@@ -3143,8 +3136,8 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
{ {
struct l2cap_chan *chan; struct l2cap_chan *chan;
struct smp_dev *smp; struct smp_dev *smp;
struct crypto_blkcipher *tfm_aes; struct crypto_skcipher *tfm_aes;
struct crypto_hash *tfm_cmac; struct crypto_shash *tfm_cmac;
if (cid == L2CAP_CID_SMP_BREDR) { if (cid == L2CAP_CID_SMP_BREDR) {
smp = NULL; smp = NULL;
...@@ -3155,17 +3148,17 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid) ...@@ -3155,17 +3148,17 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
if (!smp) if (!smp)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC); tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_aes)) { if (IS_ERR(tfm_aes)) {
BT_ERR("Unable to create ECB crypto context"); BT_ERR("Unable to create ECB crypto context");
kzfree(smp); kzfree(smp);
return ERR_CAST(tfm_aes); return ERR_CAST(tfm_aes);
} }
tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC); tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
if (IS_ERR(tfm_cmac)) { if (IS_ERR(tfm_cmac)) {
BT_ERR("Unable to create CMAC crypto context"); BT_ERR("Unable to create CMAC crypto context");
crypto_free_blkcipher(tfm_aes); crypto_free_skcipher(tfm_aes);
kzfree(smp); kzfree(smp);
return ERR_CAST(tfm_cmac); return ERR_CAST(tfm_cmac);
} }
...@@ -3179,8 +3172,8 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid) ...@@ -3179,8 +3172,8 @@ static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
chan = l2cap_chan_create(); chan = l2cap_chan_create();
if (!chan) { if (!chan) {
if (smp) { if (smp) {
crypto_free_blkcipher(smp->tfm_aes); crypto_free_skcipher(smp->tfm_aes);
crypto_free_hash(smp->tfm_cmac); crypto_free_shash(smp->tfm_cmac);
kzfree(smp); kzfree(smp);
} }
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -3226,10 +3219,8 @@ static void smp_del_chan(struct l2cap_chan *chan) ...@@ -3226,10 +3219,8 @@ static void smp_del_chan(struct l2cap_chan *chan)
smp = chan->data; smp = chan->data;
if (smp) { if (smp) {
chan->data = NULL; chan->data = NULL;
if (smp->tfm_aes) crypto_free_skcipher(smp->tfm_aes);
crypto_free_blkcipher(smp->tfm_aes); crypto_free_shash(smp->tfm_cmac);
if (smp->tfm_cmac)
crypto_free_hash(smp->tfm_cmac);
kzfree(smp); kzfree(smp);
} }
...@@ -3465,7 +3456,7 @@ void smp_unregister(struct hci_dev *hdev) ...@@ -3465,7 +3456,7 @@ void smp_unregister(struct hci_dev *hdev)
#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP) #if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
static int __init test_ah(struct crypto_blkcipher *tfm_aes) static int __init test_ah(struct crypto_skcipher *tfm_aes)
{ {
const u8 irk[16] = { const u8 irk[16] = {
0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34, 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
...@@ -3485,7 +3476,7 @@ static int __init test_ah(struct crypto_blkcipher *tfm_aes) ...@@ -3485,7 +3476,7 @@ static int __init test_ah(struct crypto_blkcipher *tfm_aes)
return 0; return 0;
} }
static int __init test_c1(struct crypto_blkcipher *tfm_aes) static int __init test_c1(struct crypto_skcipher *tfm_aes)
{ {
const u8 k[16] = { const u8 k[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...@@ -3515,7 +3506,7 @@ static int __init test_c1(struct crypto_blkcipher *tfm_aes) ...@@ -3515,7 +3506,7 @@ static int __init test_c1(struct crypto_blkcipher *tfm_aes)
return 0; return 0;
} }
static int __init test_s1(struct crypto_blkcipher *tfm_aes) static int __init test_s1(struct crypto_skcipher *tfm_aes)
{ {
const u8 k[16] = { const u8 k[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
...@@ -3540,7 +3531,7 @@ static int __init test_s1(struct crypto_blkcipher *tfm_aes) ...@@ -3540,7 +3531,7 @@ static int __init test_s1(struct crypto_blkcipher *tfm_aes)
return 0; return 0;
} }
static int __init test_f4(struct crypto_hash *tfm_cmac) static int __init test_f4(struct crypto_shash *tfm_cmac)
{ {
const u8 u[32] = { const u8 u[32] = {
0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc, 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
...@@ -3572,7 +3563,7 @@ static int __init test_f4(struct crypto_hash *tfm_cmac) ...@@ -3572,7 +3563,7 @@ static int __init test_f4(struct crypto_hash *tfm_cmac)
return 0; return 0;
} }
static int __init test_f5(struct crypto_hash *tfm_cmac) static int __init test_f5(struct crypto_shash *tfm_cmac)
{ {
const u8 w[32] = { const u8 w[32] = {
0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86, 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
...@@ -3609,7 +3600,7 @@ static int __init test_f5(struct crypto_hash *tfm_cmac) ...@@ -3609,7 +3600,7 @@ static int __init test_f5(struct crypto_hash *tfm_cmac)
return 0; return 0;
} }
static int __init test_f6(struct crypto_hash *tfm_cmac) static int __init test_f6(struct crypto_shash *tfm_cmac)
{ {
const u8 w[16] = { const u8 w[16] = {
0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd, 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
...@@ -3642,7 +3633,7 @@ static int __init test_f6(struct crypto_hash *tfm_cmac) ...@@ -3642,7 +3633,7 @@ static int __init test_f6(struct crypto_hash *tfm_cmac)
return 0; return 0;
} }
static int __init test_g2(struct crypto_hash *tfm_cmac) static int __init test_g2(struct crypto_shash *tfm_cmac)
{ {
const u8 u[32] = { const u8 u[32] = {
0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc, 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
...@@ -3674,7 +3665,7 @@ static int __init test_g2(struct crypto_hash *tfm_cmac) ...@@ -3674,7 +3665,7 @@ static int __init test_g2(struct crypto_hash *tfm_cmac)
return 0; return 0;
} }
static int __init test_h6(struct crypto_hash *tfm_cmac) static int __init test_h6(struct crypto_shash *tfm_cmac)
{ {
const u8 w[16] = { const u8 w[16] = {
0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34, 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
...@@ -3711,8 +3702,8 @@ static const struct file_operations test_smp_fops = { ...@@ -3711,8 +3702,8 @@ static const struct file_operations test_smp_fops = {
.llseek = default_llseek, .llseek = default_llseek,
}; };
static int __init run_selftests(struct crypto_blkcipher *tfm_aes, static int __init run_selftests(struct crypto_skcipher *tfm_aes,
struct crypto_hash *tfm_cmac) struct crypto_shash *tfm_cmac)
{ {
ktime_t calltime, delta, rettime; ktime_t calltime, delta, rettime;
unsigned long long duration; unsigned long long duration;
...@@ -3789,27 +3780,27 @@ static int __init run_selftests(struct crypto_blkcipher *tfm_aes, ...@@ -3789,27 +3780,27 @@ static int __init run_selftests(struct crypto_blkcipher *tfm_aes,
int __init bt_selftest_smp(void) int __init bt_selftest_smp(void)
{ {
struct crypto_blkcipher *tfm_aes; struct crypto_skcipher *tfm_aes;
struct crypto_hash *tfm_cmac; struct crypto_shash *tfm_cmac;
int err; int err;
tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC); tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_aes)) { if (IS_ERR(tfm_aes)) {
BT_ERR("Unable to create ECB crypto context"); BT_ERR("Unable to create ECB crypto context");
return PTR_ERR(tfm_aes); return PTR_ERR(tfm_aes);
} }
tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC); tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_cmac)) { if (IS_ERR(tfm_cmac)) {
BT_ERR("Unable to create CMAC crypto context"); BT_ERR("Unable to create CMAC crypto context");
crypto_free_blkcipher(tfm_aes); crypto_free_skcipher(tfm_aes);
return PTR_ERR(tfm_cmac); return PTR_ERR(tfm_cmac);
} }
err = run_selftests(tfm_aes, tfm_cmac); err = run_selftests(tfm_aes, tfm_cmac);
crypto_free_hash(tfm_cmac); crypto_free_shash(tfm_cmac);
crypto_free_blkcipher(tfm_aes); crypto_free_skcipher(tfm_aes);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment