aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/smp.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 39ca9616d2de..2566a3e43bb5 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -172,13 +172,16 @@ int smp_generate_rpa(struct crypto_blkcipher *tfm, u8 irk[16], bdaddr_t *rpa)
172 return 0; 172 return 0;
173} 173}
174 174
175static int smp_c1(struct crypto_blkcipher *tfm, u8 k[16], u8 r[16], 175static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
176 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, 176 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
177 u8 _rat, bdaddr_t *ra, u8 res[16]) 177 u8 res[16])
178{ 178{
179 struct hci_dev *hdev = smp->conn->hcon->hdev;
179 u8 p1[16], p2[16]; 180 u8 p1[16], p2[16];
180 int err; 181 int err;
181 182
183 BT_DBG("%s", hdev->name);
184
182 memset(p1, 0, 16); 185 memset(p1, 0, 16);
183 186
184 /* p1 = pres || preq || _rat || _iat */ 187 /* p1 = pres || preq || _rat || _iat */
@@ -196,7 +199,7 @@ static int smp_c1(struct crypto_blkcipher *tfm, u8 k[16], u8 r[16],
196 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1); 199 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
197 200
198 /* res = e(k, res) */ 201 /* res = e(k, res) */
199 err = smp_e(tfm, k, res); 202 err = smp_e(smp->tfm_aes, k, res);
200 if (err) { 203 if (err) {
201 BT_ERR("Encrypt data error"); 204 BT_ERR("Encrypt data error");
202 return err; 205 return err;
@@ -206,23 +209,26 @@ static int smp_c1(struct crypto_blkcipher *tfm, u8 k[16], u8 r[16],
206 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2); 209 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
207 210
208 /* res = e(k, res) */ 211 /* res = e(k, res) */
209 err = smp_e(tfm, k, res); 212 err = smp_e(smp->tfm_aes, k, res);
210 if (err) 213 if (err)
211 BT_ERR("Encrypt data error"); 214 BT_ERR("Encrypt data error");
212 215
213 return err; 216 return err;
214} 217}
215 218
216static int smp_s1(struct crypto_blkcipher *tfm, u8 k[16], u8 r1[16], 219static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
217 u8 r2[16], u8 _r[16]) 220 u8 _r[16])
218{ 221{
222 struct hci_dev *hdev = smp->conn->hcon->hdev;
219 int err; 223 int err;
220 224
225 BT_DBG("%s", hdev->name);
226
221 /* Just least significant octets from r1 and r2 are considered */ 227 /* Just least significant octets from r1 and r2 are considered */
222 memcpy(_r, r2, 8); 228 memcpy(_r, r2, 8);
223 memcpy(_r + 8, r1, 8); 229 memcpy(_r + 8, r1, 8);
224 230
225 err = smp_e(tfm, k, _r); 231 err = smp_e(smp->tfm_aes, k, _r);
226 if (err) 232 if (err)
227 BT_ERR("Encrypt data error"); 233 BT_ERR("Encrypt data error");
228 234
@@ -475,23 +481,15 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
475static u8 smp_confirm(struct smp_chan *smp) 481static u8 smp_confirm(struct smp_chan *smp)
476{ 482{
477 struct l2cap_conn *conn = smp->conn; 483 struct l2cap_conn *conn = smp->conn;
478 struct hci_dev *hdev = conn->hcon->hdev;
479 struct crypto_blkcipher *tfm = hdev->tfm_aes;
480 struct smp_cmd_pairing_confirm cp; 484 struct smp_cmd_pairing_confirm cp;
481 int ret; 485 int ret;
482 486
483 BT_DBG("conn %p", conn); 487 BT_DBG("conn %p", conn);
484 488
485 /* Prevent mutual access to hdev->tfm_aes */ 489 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
486 hci_dev_lock(hdev);
487
488 ret = smp_c1(tfm, smp->tk, smp->prnd, smp->preq, smp->prsp,
489 conn->hcon->init_addr_type, &conn->hcon->init_addr, 490 conn->hcon->init_addr_type, &conn->hcon->init_addr,
490 conn->hcon->resp_addr_type, &conn->hcon->resp_addr, 491 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
491 cp.confirm_val); 492 cp.confirm_val);
492
493 hci_dev_unlock(hdev);
494
495 if (ret) 493 if (ret)
496 return SMP_UNSPECIFIED; 494 return SMP_UNSPECIFIED;
497 495
@@ -506,25 +504,17 @@ static u8 smp_random(struct smp_chan *smp)
506{ 504{
507 struct l2cap_conn *conn = smp->conn; 505 struct l2cap_conn *conn = smp->conn;
508 struct hci_conn *hcon = conn->hcon; 506 struct hci_conn *hcon = conn->hcon;
509 struct hci_dev *hdev = hcon->hdev;
510 struct crypto_blkcipher *tfm = hdev->tfm_aes;
511 u8 confirm[16]; 507 u8 confirm[16];
512 int ret; 508 int ret;
513 509
514 if (IS_ERR_OR_NULL(tfm)) 510 if (IS_ERR_OR_NULL(smp->tfm_aes))
515 return SMP_UNSPECIFIED; 511 return SMP_UNSPECIFIED;
516 512
517 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave"); 513 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
518 514
519 /* Prevent mutual access to hdev->tfm_aes */ 515 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
520 hci_dev_lock(hdev);
521
522 ret = smp_c1(tfm, smp->tk, smp->rrnd, smp->preq, smp->prsp,
523 hcon->init_addr_type, &hcon->init_addr, 516 hcon->init_addr_type, &hcon->init_addr,
524 hcon->resp_addr_type, &hcon->resp_addr, confirm); 517 hcon->resp_addr_type, &hcon->resp_addr, confirm);
525
526 hci_dev_unlock(hdev);
527
528 if (ret) 518 if (ret)
529 return SMP_UNSPECIFIED; 519 return SMP_UNSPECIFIED;
530 520
@@ -538,7 +528,7 @@ static u8 smp_random(struct smp_chan *smp)
538 __le64 rand = 0; 528 __le64 rand = 0;
539 __le16 ediv = 0; 529 __le16 ediv = 0;
540 530
541 smp_s1(tfm, smp->tk, smp->rrnd, smp->prnd, stk); 531 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
542 532
543 memset(stk + smp->enc_key_size, 0, 533 memset(stk + smp->enc_key_size, 0,
544 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size); 534 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
@@ -556,7 +546,7 @@ static u8 smp_random(struct smp_chan *smp)
556 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd), 546 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
557 smp->prnd); 547 smp->prnd);
558 548
559 smp_s1(tfm, smp->tk, smp->prnd, smp->rrnd, stk); 549 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
560 550
561 memset(stk + smp->enc_key_size, 0, 551 memset(stk + smp->enc_key_size, 0,
562 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size); 552 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);