mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 14:04:27 -04:00
crypto: atmel-ecc - clean up and improve ECDH comments
Improve the kerneldoc for struct atmel_ecdh_ctx by removing the stale "unsupported curves" wording, since the device only supports a single curve (P-256), and move the set_secret() constraint to the description. In atmel_ecdh_set_secret(), clarify that the device generates the private key, and drop the redundant "only supports NIST P256" comment. In atmel_ecdh_done() and atmel_ecdh_generate_public_key(), clarify the truncation comments. Also note that a P-256 public key consists of two 32-byte coordinates in atmel_ecdh_compute_shared_secret(), and remove the unnecessary fall-through comment and other redundant comments. Signed-off-by: Thorsten Blum <thorsten.blum@linux.dev> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
committed by
Herbert Xu
parent
4c7a4a3404
commit
3e84fb698a
@@ -27,15 +27,14 @@ static struct atmel_ecc_driver_data driver_data;
|
||||
|
||||
/**
|
||||
* struct atmel_ecdh_ctx - transformation context
|
||||
* @client : pointer to i2c client device
|
||||
* @fallback : used for unsupported curves or when user wants to use its own
|
||||
* private key.
|
||||
* @public_key : generated when calling set_secret(). It's the responsibility
|
||||
* of the user to not call set_secret() while
|
||||
* generate_public_key() or compute_shared_secret() are in flight.
|
||||
* @curve_id : elliptic curve id
|
||||
* @do_fallback: true when the device doesn't support the curve or when the user
|
||||
* wants to use its own private key.
|
||||
* @client: I2C client device
|
||||
* @fallback: ECDH fallback used for caller-provided private keys
|
||||
* @public_key: cached public key for the device-generated private key
|
||||
* @curve_id: elliptic curve id
|
||||
* @do_fallback: true when ECDH operations should use @fallback
|
||||
*
|
||||
* The caller must not invoke set_secret() while generate_public_key()
|
||||
* or compute_shared_secret() are in flight.
|
||||
*/
|
||||
struct atmel_ecdh_ctx {
|
||||
struct i2c_client *client;
|
||||
@@ -55,7 +54,7 @@ static void atmel_ecdh_done(struct atmel_i2c_work_data *work_data, void *areq,
|
||||
if (status)
|
||||
goto free_work_data;
|
||||
|
||||
/* might want less than we've got */
|
||||
/* copy only as much as requested, capped at 32 bytes */
|
||||
n_sz = min(ATMEL_ECC_NIST_P256_N_SIZE, req->dst_len);
|
||||
|
||||
/* copy the shared secret */
|
||||
@@ -64,15 +63,15 @@ static void atmel_ecdh_done(struct atmel_i2c_work_data *work_data, void *areq,
|
||||
if (copied != n_sz)
|
||||
status = -EINVAL;
|
||||
|
||||
/* fall through */
|
||||
free_work_data:
|
||||
kfree_sensitive(work_data);
|
||||
kpp_request_complete(req, status);
|
||||
}
|
||||
|
||||
/*
|
||||
* A random private key is generated and stored in the device. The device
|
||||
* returns the pair public key.
|
||||
* If no private key is provided, generate one in the device and cache
|
||||
* the corresponding public key. The generated private key never leaves
|
||||
* the device.
|
||||
*/
|
||||
static int atmel_ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
unsigned int len)
|
||||
@@ -83,9 +82,7 @@ static int atmel_ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
struct ecdh params;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
/* free the old public key, if any */
|
||||
kfree(ctx->public_key);
|
||||
/* make sure you don't free the old public key twice */
|
||||
ctx->public_key = NULL;
|
||||
|
||||
if (crypto_ecdh_decode_key(buf, len, ¶ms) < 0) {
|
||||
@@ -94,7 +91,6 @@ static int atmel_ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
}
|
||||
|
||||
if (params.key_size) {
|
||||
/* fallback to ecdh software implementation */
|
||||
ctx->do_fallback = true;
|
||||
return crypto_kpp_set_secret(ctx->fallback, buf, len);
|
||||
}
|
||||
@@ -103,11 +99,6 @@ static int atmel_ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
if (!cmd)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* The device only supports NIST P256 ECC keys. The public key size will
|
||||
* always be the same. Use a macro for the key size to avoid unnecessary
|
||||
* computations.
|
||||
*/
|
||||
public_key = kmalloc(ATMEL_ECC_PUBKEY_SIZE, GFP_KERNEL);
|
||||
if (!public_key)
|
||||
goto free_cmd;
|
||||
@@ -120,7 +111,6 @@ static int atmel_ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
if (ret)
|
||||
goto free_public_key;
|
||||
|
||||
/* save the public key */
|
||||
memcpy(public_key, &cmd->data[RSP_DATA_IDX], ATMEL_ECC_PUBKEY_SIZE);
|
||||
ctx->public_key = public_key;
|
||||
|
||||
@@ -149,7 +139,7 @@ static int atmel_ecdh_generate_public_key(struct kpp_request *req)
|
||||
if (!ctx->public_key)
|
||||
return -EINVAL;
|
||||
|
||||
/* might want less than we've got */
|
||||
/* copy only as much as requested, capped at 64 bytes */
|
||||
nbytes = min(ATMEL_ECC_PUBKEY_SIZE, req->dst_len);
|
||||
|
||||
/* public key was saved at private key generation */
|
||||
@@ -175,7 +165,7 @@ static int atmel_ecdh_compute_shared_secret(struct kpp_request *req)
|
||||
return crypto_kpp_compute_shared_secret(req);
|
||||
}
|
||||
|
||||
/* must have exactly two points to be on the curve */
|
||||
/* A P-256 public key must contain two 32-byte coordinates */
|
||||
if (req->src_len != ATMEL_ECC_PUBKEY_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user