Add key management utilities to p256-m
Those will be needed in order for the driver to implement all the PSA key management entry points (currently only implements key generation). Signed-off-by: Manuel Pégourié-Gonnard <manuel.pegourie-gonnard@arm.com>
This commit is contained in:
parent
132240f01a
commit
bac6d9a703
2 changed files with 84 additions and 0 deletions
45
3rdparty/p256-m/p256-m/p256-m.c
vendored
45
3rdparty/p256-m/p256-m/p256-m.c
vendored
|
@ -1468,4 +1468,49 @@ int p256_ecdsa_verify(const uint8_t sig[64], const uint8_t pub[64],
|
|||
return P256_INVALID_SIGNATURE;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
*
|
||||
* Key management utilities
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
int p256_validate_pubkey(const uint8_t pub[64])
|
||||
{
|
||||
uint32_t x[8], y[8];
|
||||
int ret = point_from_bytes(x, y, pub);
|
||||
|
||||
return ret == 0 ? P256_SUCCESS : P256_INVALID_PUBKEY;
|
||||
}
|
||||
|
||||
int p256_validate_privkey(const uint8_t priv[32])
|
||||
{
|
||||
uint32_t s[8];
|
||||
int ret = scalar_from_bytes(s, priv);
|
||||
zeroize(s, sizeof(s));
|
||||
|
||||
return ret == 0 ? P256_SUCCESS : P256_INVALID_PRIVKEY;
|
||||
}
|
||||
|
||||
int p256_public_from_private(uint8_t pub[64], const uint8_t priv[32])
|
||||
{
|
||||
int ret;
|
||||
uint32_t s[8];
|
||||
|
||||
ret = scalar_from_bytes(s, priv);
|
||||
if (ret != 0)
|
||||
return P256_INVALID_PRIVKEY;
|
||||
|
||||
/* compute and ouput the associated public key */
|
||||
uint32_t x[8], y[8];
|
||||
scalar_mult(x, y, p256_gx, p256_gy, s);
|
||||
|
||||
/* the associated public key is not a secret, the scalar was */
|
||||
CT_UNPOISON(x, 32);
|
||||
CT_UNPOISON(y, 32);
|
||||
zeroize(s, sizeof(s));
|
||||
|
||||
point_to_bytes(pub, x, y);
|
||||
return P256_SUCCESS;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
39
3rdparty/p256-m/p256-m/p256-m.h
vendored
39
3rdparty/p256-m/p256-m/p256-m.h
vendored
|
@ -89,6 +89,45 @@ int p256_ecdsa_sign(uint8_t sig[64], const uint8_t priv[32],
|
|||
int p256_ecdsa_verify(const uint8_t sig[64], const uint8_t pub[64],
|
||||
const uint8_t *hash, size_t hlen);
|
||||
|
||||
/*
|
||||
* Public key validation
|
||||
*
|
||||
* Note: you never need to call this function, as all other function always
|
||||
* validate their input; however it's availabe if you want to validate the key
|
||||
* without performing an operation.
|
||||
*
|
||||
* [in] pub: the public key, as two big-endian integers
|
||||
*
|
||||
* return: P256_SUCCESS if the key is valid
|
||||
* P256_INVALID_PUBKEY if pub is invalid
|
||||
*/
|
||||
int p256_validate_pubkey(const uint8_t pub[64]);
|
||||
|
||||
/*
|
||||
* Private key validation
|
||||
*
|
||||
* Note: you never need to call this function, as all other function always
|
||||
* validate their input; however it's availabe if you want to validate the key
|
||||
* without performing an operation.
|
||||
*
|
||||
* [in] priv: the private key, as a big-endian integer
|
||||
*
|
||||
* return: P256_SUCCESS if the key is valid
|
||||
* P256_INVALID_PRIVKEY if priv is invalid
|
||||
*/
|
||||
int p256_validate_privkey(const uint8_t priv[32]);
|
||||
|
||||
/*
|
||||
* Compute public key from private key
|
||||
*
|
||||
* [out] pub: the associated public key, as two big-endian integers
|
||||
* [in] priv: the private key, as a big-endian integer
|
||||
*
|
||||
* return: P256_SUCCESS on success
|
||||
* P256_INVALID_PRIVKEY if priv is invalid
|
||||
*/
|
||||
int p256_public_from_private(uint8_t pub[64], const uint8_t priv[32]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue