Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2976416 authored by Tudor Ambarus's avatar Tudor Ambarus Committed by Marcel Holtmann
Browse files

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: default avatarTudor Ambarus <tudor.ambarus@microchip.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 47eb2ac8
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ 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],
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;
@@ -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,10 +123,10 @@ bool compute_ecdh_secret(struct crypto_kpp *tfm, const u8 public_key[64],
	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],
int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
		       u8 private_key[32])
{
	struct kpp_request *req;
@@ -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 @@ bool generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
	kpp_request_free(req);
free_tmp:
	kfree(tmp);
	return (err == 0);
	return err;
}
+4 −4
Original line number Diff line number Diff line
@@ -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],
int 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],
int generate_ecdh_keys(struct crypto_kpp *tfm, u8 public_key[64],
		       u8 private_key[32]);
+10 −7
Original line number Diff line number Diff line
@@ -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,7 +1920,7 @@ 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,
			if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk,
					       smp->local_sk))
				return SMP_UNSPECIFIED;

@@ -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;