Skip to content

Commit

Permalink
Bluetooth: Pass only crypto context to SMP crypto functions
Browse files Browse the repository at this point in the history
In order to make unit testing possible we need to make the SMP crypto
functions only take the crypto context instead of the full SMP context
(the latter would require having hci_dev, hci_conn, l2cap_chan,
l2cap_conn, etc around). The drawback is that we no-longer get the
involved hdev in the debug logs, but this is really the only way to make
simple unit tests for the code.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
  • Loading branch information
Johan Hedberg authored and holtmann committed Oct 25, 2014
1 parent 4f639ed commit e491eaf
Showing 1 changed file with 12 additions and 18 deletions.
30 changes: 12 additions & 18 deletions net/bluetooth/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,16 +191,13 @@ int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
return 0;
}

static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
u8 res[16])
static int smp_c1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r[16],
u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat,
bdaddr_t *ra, u8 res[16])
{
struct hci_dev *hdev = smp->conn->hcon->hdev;
u8 p1[16], p2[16];
int err;

BT_DBG("%s", hdev->name);

memset(p1, 0, 16);

/* p1 = pres || preq || _rat || _iat */
Expand All @@ -218,7 +215,7 @@ static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);

/* res = e(k, res) */
err = smp_e(smp->tfm_aes, k, res);
err = smp_e(tfm_aes, k, res);
if (err) {
BT_ERR("Encrypt data error");
return err;
Expand All @@ -228,26 +225,23 @@ static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);

/* res = e(k, res) */
err = smp_e(smp->tfm_aes, k, res);
err = smp_e(tfm_aes, k, res);
if (err)
BT_ERR("Encrypt data error");

return err;
}

static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
u8 _r[16])
static int smp_s1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r1[16],
u8 r2[16], u8 _r[16])
{
struct hci_dev *hdev = smp->conn->hcon->hdev;
int err;

BT_DBG("%s", hdev->name);

/* Just least significant octets from r1 and r2 are considered */
memcpy(_r, r2, 8);
memcpy(_r + 8, r1, 8);

err = smp_e(smp->tfm_aes, k, _r);
err = smp_e(tfm_aes, k, _r);
if (err)
BT_ERR("Encrypt data error");

Expand Down Expand Up @@ -547,7 +541,7 @@ static u8 smp_confirm(struct smp_chan *smp)

BT_DBG("conn %p", conn);

ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
conn->hcon->init_addr_type, &conn->hcon->init_addr,
conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
cp.confirm_val);
Expand Down Expand Up @@ -578,7 +572,7 @@ static u8 smp_random(struct smp_chan *smp)

BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");

ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
hcon->init_addr_type, &hcon->init_addr,
hcon->resp_addr_type, &hcon->resp_addr, confirm);
if (ret)
Expand All @@ -594,7 +588,7 @@ static u8 smp_random(struct smp_chan *smp)
__le64 rand = 0;
__le16 ediv = 0;

smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);

memset(stk + smp->enc_key_size, 0,
SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Expand All @@ -613,7 +607,7 @@ static u8 smp_random(struct smp_chan *smp)
smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
smp->prnd);

smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);

memset(stk + smp->enc_key_size, 0,
SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Expand Down

0 comments on commit e491eaf

Please sign in to comment.