RSAPSS#
RSASSA-PSS as defined in RFC 8017.
Available Implementations#
#include "Hacl_RSAPSS.h"
API Reference#
Example
// We want to sign and verify a message.
// Keys
uint8_t* e;
uint32_t eBits;
uint8_t* d;
uint32_t dBits;
uint8_t* mod;
uint32_t modBits;
// Note: This is not in HACL*.
// You need to bring your own keys.
generate_rsapss_key(&e, &eBits, &d, &dBits, &mod, &modBits);
uint64_t* skey =
Hacl_RSAPSS_new_rsapss_load_skey(modBits, eBits, dBits, mod, e, d);
if (skey == NULL) {
//Error
}
uint64_t* pkey = Hacl_RSAPSS_new_rsapss_load_pkey(modBits, eBits, mod, e);
if (pkey == NULL) {
//Error
}
// Message
const char* msg = "Hello, World!";
size_t msgLen = strlen(msg);
// Salt
uint32_t saltLen =
Hacl_Hash_Definitions_hash_len(Spec_Hash_Definitions_SHA2_256);
uint8_t* salt = (uint8_t*)malloc(saltLen);
generate_random(salt, saltLen);
// Signature
uint32_t sgntLen = modBits / 8;
uint8_t* sgnt = (uint8_t*)malloc(sgntLen);
// Sign
bool res_sign = Hacl_RSAPSS_rsapss_sign(Spec_Hash_Definitions_SHA2_256,
modBits,
eBits,
dBits,
skey,
saltLen,
salt,
msgLen,
(uint8_t*)msg,
sgnt);
if (!res_sign) {
// Error
}
bool res_verify = Hacl_RSAPSS_rsapss_verify(Spec_Hash_Definitions_SHA2_256,
modBits,
eBits,
pkey,
saltLen,
sgntLen,
sgnt,
msgLen,
(uint8_t*)msg);
if (!res_verify) {
// Error
}
free(sgnt);
free(salt);
free(pkey);
free(skey);
free(mod);
free(d);
free(e);
-
uint64_t *Hacl_RSAPSS_new_rsapss_load_skey(uint32_t modBits, uint32_t eBits, uint32_t dBits, uint8_t *nb, uint8_t *eb, uint8_t *db)#
Load a secret key from key parts.
- Parameters:
modBits – Count of bits in modulus (
n
).eBits – Count of bits in
e
value.dBits – Count of bits in
d
value.nb – Pointer to
ceil(modBits / 8)
bytes where the modulus (n
), in big-endian byte order, is read from.eb – Pointer to
ceil(modBits / 8)
bytes where thee
value, in big-endian byte order, is read from.db – Pointer to
ceil(modBits / 8)
bytes where thed
value, in big-endian byte order, is read from.
- Returns:
Returns an allocated secret key upon success, otherwise,
NULL
if key part arguments are invalid or memory allocation fails. Note: caller must take care tofree()
the created key.
-
uint64_t *Hacl_RSAPSS_new_rsapss_load_pkey(uint32_t modBits, uint32_t eBits, uint8_t *nb, uint8_t *eb)#
Load a public key from key parts.
- Parameters:
modBits – Count of bits in modulus (
n
).eBits – Count of bits in
e
value.nb – Pointer to
ceil(modBits / 8)
bytes where the modulus (n
), in big-endian byte order, is read from.eb – Pointer to
ceil(modBits / 8)
bytes where thee
value, in big-endian byte order, is read from.
- Returns:
Returns an allocated public key upon success, otherwise,
NULL
if key part arguments are invalid or memory allocation fails. Note: caller must take care tofree()
the created key.
-
bool Hacl_RSAPSS_rsapss_sign(Spec_Hash_Definitions_hash_alg a, uint32_t modBits, uint32_t eBits, uint32_t dBits, uint64_t *skey, uint32_t saltLen, uint8_t *salt, uint32_t msgLen, uint8_t *msg, uint8_t *sgnt)#
Sign a message
msg
and write the signature tosgnt
.- Parameters:
a – Hash algorithm to use. Allowed values for
a
are …Spec_Hash_Definitions_SHA2_256,
Spec_Hash_Definitions_SHA2_384, and
Spec_Hash_Definitions_SHA2_512.
modBits – Count of bits in the modulus (
n
).eBits – Count of bits in
e
value.dBits – Count of bits in
d
value.skey – Pointer to secret key created by
Hacl_RSAPSS_new_rsapss_load_skey
.saltLen – Length of salt.
salt – Pointer to
saltLen
bytes where the salt is read from.msgLen – Length of message.
msg – Pointer to
msgLen
bytes where the message is read from.sgnt – Pointer to
ceil(modBits / 8)
bytes where the signature is written to.
- Returns:
Returns true if and only if signing was successful.
-
bool Hacl_RSAPSS_rsapss_verify(Spec_Hash_Definitions_hash_alg a, uint32_t modBits, uint32_t eBits, uint64_t *pkey, uint32_t saltLen, uint32_t sgntLen, uint8_t *sgnt, uint32_t msgLen, uint8_t *msg)#
Verify the signature
sgnt
of a messagemsg
.- Parameters:
a – Hash algorithm to use. Allowed values for
a
are …Spec_Hash_Definitions_SHA2_256,
Spec_Hash_Definitions_SHA2_384, and
Spec_Hash_Definitions_SHA2_512.
modBits – Count of bits in the modulus (
n
).eBits – Count of bits in
e
value.pkey – Pointer to public key created by
Hacl_RSAPSS_new_rsapss_load_pkey
.saltLen – Length of salt.
sgntLen – Length of signature.
sgnt – Pointer to
sgntLen
bytes where the signature is read from.msgLen – Length of message.
msg – Pointer to
msgLen
bytes where the message is read from.
- Returns:
Returns true if and only if the signature is valid.
-
bool Hacl_RSAPSS_rsapss_skey_sign(Spec_Hash_Definitions_hash_alg a, uint32_t modBits, uint32_t eBits, uint32_t dBits, uint8_t *nb, uint8_t *eb, uint8_t *db, uint32_t saltLen, uint8_t *salt, uint32_t msgLen, uint8_t *msg, uint8_t *sgnt)#
Sign a message
msg
and write the signature tosgnt
.- Parameters:
a – Hash algorithm to use. Allowed values for
a
are …Spec_Hash_Definitions_SHA2_256,
Spec_Hash_Definitions_SHA2_384, and
Spec_Hash_Definitions_SHA2_512.
modBits – Count of bits in the modulus (
n
).eBits – Count of bits in
e
value.dBits – Count of bits in
d
value.nb – Pointer to
ceil(modBits / 8)
bytes where the modulus (n
), in big-endian byte order, is read from.eb – Pointer to
ceil(modBits / 8)
bytes where thee
value, in big-endian byte order, is read from.db – Pointer to
ceil(modBits / 8)
bytes where thed
value, in big-endian byte order, is read from.saltLen – Length of salt.
salt – Pointer to
saltLen
bytes where the salt is read from.msgLen – Length of message.
msg – Pointer to
msgLen
bytes where the message is read from.sgnt – Pointer to
ceil(modBits / 8)
bytes where the signature is written to.
- Returns:
Returns true if and only if signing was successful.
-
bool Hacl_RSAPSS_rsapss_pkey_verify(Spec_Hash_Definitions_hash_alg a, uint32_t modBits, uint32_t eBits, uint8_t *nb, uint8_t *eb, uint32_t saltLen, uint32_t sgntLen, uint8_t *sgnt, uint32_t msgLen, uint8_t *msg)#
Verify the signature
sgnt
of a messagemsg
.- Parameters:
a – Hash algorithm to use. Allowed values for
a
are …Spec_Hash_Definitions_SHA2_256,
Spec_Hash_Definitions_SHA2_384, and
Spec_Hash_Definitions_SHA2_512.
modBits – Count of bits in the modulus (
n
).eBits – Count of bits in
e
value.nb – Pointer to
ceil(modBits / 8)
bytes where the modulus (n
), in big-endian byte order, is read from.eb – Pointer to
ceil(modBits / 8)
bytes where thee
value, in big-endian byte order, is read from.saltLen – Length of salt.
sgntLen – Length of signature.
sgnt – Pointer to
sgntLen
bytes where the signature is read from.msgLen – Length of message.
msg – Pointer to
msgLen
bytes where the message is read from.
- Returns:
Returns true if and only if the signature is valid.