Bluetooth: ecdh_helper - reveal error codes
authorTudor Ambarus <tudor.ambarus@microchip.com>
Thu, 28 Sep 2017 14:14:52 +0000 (17:14 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 6 Oct 2017 18:35:47 +0000 (20:35 +0200)
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: Tudor Ambarus <tudor.ambarus@microchip.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/ecdh_helper.c
net/bluetooth/ecdh_helper.h
net/bluetooth/smp.c

index ac2c7087921d4b8d704b2f1ac9e3d20859cce2fb..22c8daa0b45116b2f3eeb6c99c9f8e8c2e9f9c4a 100644 (file)
@@ -49,8 +49,8 @@ static inline void swap_digits(u64 *in, u64 *out, unsigned int ndigits)
                out[i] = __swab64(in[ndigits - 1 - i]);
 }
 
-bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
-                        const u8 private_key[32], u8 secret[32])
+int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
+                       const u8 private_key[32], u8 secret[32])
 {
        struct kpp_request *req;
        struct ecdh p;
@@ -58,15 +58,17 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
        struct scatterlist src, dst;
        u8 *tmp, *buf;
        unsigned int buf_len;
-       int err = -ENOMEM;
+       int err;
 
        tmp = kmalloc(64, GFP_KERNEL);
        if (!tmp)
-               return false;
+               return -ENOMEM;
 
        req = kpp_request_alloc(tfm, GFP_KERNEL);
-       if (!req)
+       if (!req) {
+               err = -ENOMEM;
                goto free_tmp;
+       }
 
        init_completion(&result.completion);
 
@@ -80,8 +82,10 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
        p.curve_id = ECC_CURVE_NIST_P256;
        buf_len = crypto_ecdh_key_len(&p);
        buf = kmalloc(buf_len, GFP_KERNEL);
-       if (!buf)
+       if (!buf) {
+               err = -ENOMEM;
                goto free_req;
+       }
 
        crypto_ecdh_encode_key(buf, buf_len, &p);
 
@@ -119,11 +123,11 @@ free_req:
        kpp_request_free(req);
 free_tmp:
        kfree(tmp);
-       return (err == 0);
+       return err;
 }
 
-bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
-                       u8 private_key[32])
+int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
+                      u8 private_key[32])
 {
        struct kpp_request *req;
        struct ecdh p;
@@ -131,17 +135,19 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
        struct scatterlist dst;
        u8 *tmp, *buf;
        unsigned int buf_len;
-       int err = -ENOMEM;
+       int err;
        const unsigned short max_tries = 16;
        unsigned short tries = 0;
 
        tmp = kmalloc(64, GFP_KERNEL);
        if (!tmp)
-               return false;
+               return -ENOMEM;
 
        req = kpp_request_alloc(tfm, GFP_KERNEL);
-       if (!req)
+       if (!req) {
+               err = -ENOMEM;
                goto free_tmp;
+       }
 
        init_completion(&result.completion);
 
@@ -202,5 +208,5 @@ free_req:
        kpp_request_free(req);
 free_tmp:
        kfree(tmp);
-       return (err == 0);
+       return err;
 }
index 5cde37d12fd9957d5c44d17376d68b4cd445ca06..50e6676aebf5b49f9a6f855a81758cc3eb034916 100644 (file)
@@ -23,7 +23,7 @@
 #include <crypto/kpp.h>
 #include <linux/types.h>
 
-bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 pub_a[64],
-                        const u8 priv_b[32], u8 secret[32]);
-bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
-                       u8 private_key[32]);
+int compute_ecdh_secret(struct crypto_kpp *tfm, const u8 pub_a[64],
+                       const u8 priv_b[32], u8 secret[32]);
+int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
+                      u8 private_key[32]);
index 31b64bc3cf1653168a43e94d03d101eacd964605..af7e6100e55ba3f00657dc60223af56ce2610580 100644 (file)
@@ -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);
 
                        /* Generate local key pair for Secure Connections */
-                       if (!generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
-                                               smp->local_sk))
-                               return -EIO;
+                       err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
+                                                smp->local_sk);
+                       if (err)
+                               return err;
 
                        /* This is unlikely, but we need to check that
                         * we didn't accidentially generate a debug key.
@@ -1919,8 +1920,8 @@ static u8 sc_send_public_key(struct smp_chan *smp)
                        get_random_bytes(smp->local_sk, 32);
 
                        /* Generate local key pair for Secure Connections */
-                       if (!generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
-                                               smp->local_sk))
+                       if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
+                                              smp->local_sk))
                                return SMP_UNSPECIFIED;
 
                        /* 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)
 static int __init test_debug_key(struct crypto_kpp *tfm_ecdh)
 {
        u8 pk[64], sk[32];
+       int err;
 
        swap_digits((u64 *)debug_sk, (u64 *)sk, 4);
 
-       if (!generate_ecdh_keys(tfm_ecdh, pk, sk))
-               return -EINVAL;
+       err = generate_ecdh_keys(tfm_ecdh, pk, sk);
+       if (err)
+               return err;
 
        if (crypto_memneq(sk, debug_sk, 32))
                return -EINVAL;