提交 a2976416 编写于 作者: T Tudor Ambarus 提交者: Marcel Holtmann

Bluetooth: ecdh_helper - reveal error codes

ecdh_helper functions were hiding the error codes and chose to return
the return value of an relational operator, "==". Remove the unnecessary
query and reveal the error codes.

While updating the return values, code in a way that compilers will
warn in case of uninitialized err.
Signed-off-by: NTudor Ambarus <tudor.ambarus@microchip.com>
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
上级 47eb2ac8
...@@ -49,8 +49,8 @@ static inline void swap_digits(u64 *in, u64 *out, unsigned int ndigits) ...@@ -49,8 +49,8 @@ static inline void swap_digits(u64 *in, u64 *out, unsigned int ndigits)
out[i] = __swab64(in[ndigits - 1 - i]); out[i] = __swab64(in[ndigits - 1 - i]);
} }
bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64], int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
const u8 private_key[32], u8 secret[32]) const u8 private_key[32], u8 secret[32])
{ {
struct kpp_request *req; struct kpp_request *req;
struct ecdh p; struct ecdh p;
...@@ -58,15 +58,17 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64], ...@@ -58,15 +58,17 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
struct scatterlist src, dst; struct scatterlist src, dst;
u8 *tmp, *buf; u8 *tmp, *buf;
unsigned int buf_len; unsigned int buf_len;
int err = -ENOMEM; int err;
tmp = kmalloc(64, GFP_KERNEL); tmp = kmalloc(64, GFP_KERNEL);
if (!tmp) if (!tmp)
return false; return -ENOMEM;
req = kpp_request_alloc(tfm, GFP_KERNEL); req = kpp_request_alloc(tfm, GFP_KERNEL);
if (!req) if (!req) {
err = -ENOMEM;
goto free_tmp; goto free_tmp;
}
init_completion(&result.completion); init_completion(&result.completion);
...@@ -80,8 +82,10 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64], ...@@ -80,8 +82,10 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
p.curve_id = ECC_CURVE_NIST_P256; p.curve_id = ECC_CURVE_NIST_P256;
buf_len = crypto_ecdh_key_len(&p); buf_len = crypto_ecdh_key_len(&p);
buf = kmalloc(buf_len, GFP_KERNEL); buf = kmalloc(buf_len, GFP_KERNEL);
if (!buf) if (!buf) {
err = -ENOMEM;
goto free_req; goto free_req;
}
crypto_ecdh_encode_key(buf, buf_len, &p); crypto_ecdh_encode_key(buf, buf_len, &p);
...@@ -119,11 +123,11 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64], ...@@ -119,11 +123,11 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
kpp_request_free(req); kpp_request_free(req);
free_tmp: free_tmp:
kfree(tmp); kfree(tmp);
return (err == 0); return err;
} }
bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64], int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
u8 private_key[32]) u8 private_key[32])
{ {
struct kpp_request *req; struct kpp_request *req;
struct ecdh p; struct ecdh p;
...@@ -131,17 +135,19 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64], ...@@ -131,17 +135,19 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
struct scatterlist dst; struct scatterlist dst;
u8 *tmp, *buf; u8 *tmp, *buf;
unsigned int buf_len; unsigned int buf_len;
int err = -ENOMEM; int err;
const unsigned short max_tries = 16; const unsigned short max_tries = 16;
unsigned short tries = 0; unsigned short tries = 0;
tmp = kmalloc(64, GFP_KERNEL); tmp = kmalloc(64, GFP_KERNEL);
if (!tmp) if (!tmp)
return false; return -ENOMEM;
req = kpp_request_alloc(tfm, GFP_KERNEL); req = kpp_request_alloc(tfm, GFP_KERNEL);
if (!req) if (!req) {
err = -ENOMEM;
goto free_tmp; goto free_tmp;
}
init_completion(&result.completion); init_completion(&result.completion);
...@@ -202,5 +208,5 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64], ...@@ -202,5 +208,5 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
kpp_request_free(req); kpp_request_free(req);
free_tmp: free_tmp:
kfree(tmp); kfree(tmp);
return (err == 0); return err;
} }
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <crypto/kpp.h> #include <crypto/kpp.h>
#include <linux/types.h> #include <linux/types.h>
bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 pub_a[64], int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 pub_a[64],
const u8 priv_b[32], u8 secret[32]); const u8 priv_b[32], u8 secret[32]);
bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64], int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
u8 private_key[32]); u8 private_key[32]);
...@@ -577,9 +577,10 @@ int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16]) ...@@ -577,9 +577,10 @@ int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
get_random_bytes(smp->local_sk, 32); get_random_bytes(smp->local_sk, 32);
/* Generate local key pair for Secure Connections */ /* Generate local key pair for Secure Connections */
if (!generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk, err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
smp->local_sk)) smp->local_sk);
return -EIO; if (err)
return err;
/* This is unlikely, but we need to check that /* This is unlikely, but we need to check that
* we didn't accidentially generate a debug key. * we didn't accidentially generate a debug key.
...@@ -1919,8 +1920,8 @@ static u8 sc_send_public_key(struct smp_chan *smp) ...@@ -1919,8 +1920,8 @@ static u8 sc_send_public_key(struct smp_chan *smp)
get_random_bytes(smp->local_sk, 32); get_random_bytes(smp->local_sk, 32);
/* Generate local key pair for Secure Connections */ /* Generate local key pair for Secure Connections */
if (!generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk, if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
smp->local_sk)) smp->local_sk))
return SMP_UNSPECIFIED; return SMP_UNSPECIFIED;
/* This is unlikely, but we need to check that /* This is unlikely, but we need to check that
...@@ -3532,11 +3533,13 @@ static inline void swap_digits(u64 *in, u64 *out, unsigned int ndigits) ...@@ -3532,11 +3533,13 @@ static inline void swap_digits(u64 *in, u64 *out, unsigned int ndigits)
static int __init test_debug_key(struct crypto_kpp *tfm_ecdh) static int __init test_debug_key(struct crypto_kpp *tfm_ecdh)
{ {
u8 pk[64], sk[32]; u8 pk[64], sk[32];
int err;
swap_digits((u64 *)debug_sk, (u64 *)sk, 4); swap_digits((u64 *)debug_sk, (u64 *)sk, 4);
if (!generate_ecdh_keys(tfm_ecdh, pk, sk)) err = generate_ecdh_keys(tfm_ecdh, pk, sk);
return -EINVAL; if (err)
return err;
if (crypto_memneq(sk, debug_sk, 32)) if (crypto_memneq(sk, debug_sk, 32))
return -EINVAL; return -EINVAL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册