Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 48 additions & 19 deletions doc/dox_comments/header_files/signature.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,24 @@
\brief This function returns the maximum size of the resulting signature.

\return Returns SIG_TYPE_E if sig_type is not supported. Returns
BAD_FUNC_ARG if sig_type was invalid. A positive return value indicates
BAD_FUNC_ARG if sig_type was invalid or key_len does not exactly match
the size of the expected key structure. A positive return value indicates
the maximum size of a signature.

\param sig_type A signature type enum value such as
WC_SIGNATURE_TYPE_ECC or WC_SIGNATURE_TYPE_RSA.
\param key Pointer to a key structure such as ecc_key or RsaKey.
\param key_len Size of the key structure.
\param key Pointer to the key structure corresponding to sig_type:
pass an ecc_key* for WC_SIGNATURE_TYPE_ECC, or a RsaKey* for
WC_SIGNATURE_TYPE_RSA / WC_SIGNATURE_TYPE_RSA_W_ENC.
The caller is responsible for ensuring the pointer refers to the correct
type; this function cannot verify the actual runtime type of the object.
\param key_len If key is non-NULL, key_len must be exactly sizeof(ecc_key)
or sizeof(RsaKey) matching the sig_type. Passing any other value
causes the function to return BAD_FUNC_ARG without dereferencing key.
Always pass the size of the concrete key type at the call site: if you
have a typed pointer (e.g., ecc_key* k), use sizeof(*k); otherwise use
sizeof(ecc_key) or sizeof(RsaKey) directly. Do not use sizeof(*key)
on the const void* parameter itself, as dereferencing void is invalid.

_Example_
\code
Expand Down Expand Up @@ -43,16 +54,19 @@ int wc_SignatureGetSize(enum wc_SignatureType sig_type,
\return BAD_FUNC_ARG -173, bad function argument provided
\return BUFFER_E -132, output buffer too small or input too large.

\param hash_type A hash type from the enum wc_HashType such as
WC_HASH_TYPE_SHA256.
\param hash_type A hash type from the "enum wc_HashType" such as
"WC_HASH_TYPE_SHA256".
\param sig_type A signature type enum value such as
WC_SIGNATURE_TYPE_ECC or WC_SIGNATURE_TYPE_RSA.
\param data Pointer to buffer containing the data to hash.
\param data_len Length of the data buffer.
\param sig Pointer to buffer to output signature.
\param sig_len Length of the signature output buffer.
\param key Pointer to a key structure such as ecc_key or RsaKey.
\param key_len Size of the key structure.
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().

_Example_
\code
Expand Down Expand Up @@ -93,16 +107,19 @@ int wc_SignatureVerify(
\return BAD_FUNC_ARG -173, bad function argument provided
\return BUFFER_E -132, output buffer too small or input too large.

\param hash_type A hash type from the enum wc_HashType
such as WC_HASH_TYPE_SHA256.
\param hash_type A hash type from the "enum wc_HashType"
such as "WC_HASH_TYPE_SHA256".
\param sig_type A signature type enum value such as
WC_SIGNATURE_TYPE_ECC or WC_SIGNATURE_TYPE_RSA.
\param data Pointer to buffer containing the data to hash.
\param data_len Length of the data buffer.
\param sig Pointer to buffer to output signature.
\param sig_len Length of the signature output buffer.
\param key Pointer to a key structure such as ecc_key or RsaKey.
\param key_len Size of the key structure.
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().
\param rng Pointer to an initialized RNG structure.

_Example_
Expand Down Expand Up @@ -166,8 +183,11 @@ int wc_SignatureGenerate(
\param hash_len Length of the hash buffer
\param sig Pointer to buffer containing the signature
\param sig_len Length of the signature buffer
\param key Pointer to a key structure such as ecc_key or RsaKey
\param key_len Size of the key structure
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().

_Example_
\code
Expand Down Expand Up @@ -216,8 +236,11 @@ int wc_SignatureVerifyHash(enum wc_HashType hash_type,
\param hash_len Length of the hash buffer
\param sig Pointer to buffer to output signature
\param sig_len Pointer to length of signature output buffer
\param key Pointer to a key structure such as ecc_key or RsaKey
\param key_len Size of the key structure
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().
\param rng Pointer to an initialized RNG structure

_Example_
Expand Down Expand Up @@ -266,8 +289,11 @@ int wc_SignatureGenerateHash(enum wc_HashType hash_type,
\param hash_len Length of the hash buffer
\param sig Pointer to buffer to output signature
\param sig_len Pointer to length of signature output buffer
\param key Pointer to a key structure such as ecc_key or RsaKey
\param key_len Size of the key structure
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().
\param rng Pointer to an initialized RNG structure
\param verify If non-zero, verify the signature after generation

Expand Down Expand Up @@ -317,8 +343,11 @@ int wc_SignatureGenerateHash_ex(enum wc_HashType hash_type,
\param data_len Length of the data buffer
\param sig Pointer to buffer to output signature
\param sig_len Pointer to length of signature output buffer
\param key Pointer to a key structure such as ecc_key or RsaKey
\param key_len Size of the key structure
\param key Pointer to the key structure corresponding to sig_type.
See wc_SignatureGetSize() for the type-safety constraints that apply
to this parameter.
\param key_len Must be exactly sizeof(ecc_key) or
sizeof(RsaKey) matching sig_type. See wc_SignatureGetSize().
\param rng Pointer to an initialized RNG structure
\param verify If non-zero, verify the signature after generation

Expand Down
14 changes: 14 additions & 0 deletions tests/api/test_signature.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ int test_wc_SignatureGetSize_ecc(void)
sig_type = WC_SIGNATURE_TYPE_ECC;
ExpectIntEQ(wc_SignatureGetSize(sig_type, NULL, key_len), 0);
key_len = (word32)0;
ExpectIntEQ(wc_SignatureGetSize(sig_type, &ecc, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
/* key_len must be exactly sizeof(ecc_key): one less or one more is invalid */
key_len = (word32)(sizeof(ecc_key) - 1);
ExpectIntEQ(wc_SignatureGetSize(sig_type, &ecc, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
key_len = (word32)(sizeof(ecc_key) + 1);
ExpectIntEQ(wc_SignatureGetSize(sig_type, &ecc, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));

Expand Down Expand Up @@ -138,6 +145,13 @@ int test_wc_SignatureGetSize_rsa(void)
ExpectIntEQ(wc_SignatureGetSize(sig_type, NULL, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
key_len = (word32)0;
ExpectIntEQ(wc_SignatureGetSize(sig_type, &rsa_key, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
/* key_len must be exactly sizeof(RsaKey): one less or one more is invalid */
key_len = (word32)(sizeof(RsaKey) - 1);
ExpectIntEQ(wc_SignatureGetSize(sig_type, &rsa_key, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
key_len = (word32)(sizeof(RsaKey) + 1);
ExpectIntEQ(wc_SignatureGetSize(sig_type, &rsa_key, key_len),
WC_NO_ERR_TRACE(BAD_FUNC_ARG));

Expand Down
2 changes: 1 addition & 1 deletion tests/api/test_signature.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ int test_wc_SignatureGetSize_rsa(void);

#define TEST_SIGNATURE_DECLS \
TEST_DECL_GROUP("signature", test_wc_SignatureGetSize_ecc), \
TEST_DECL_GROUP("signature", test_wc_SignatureGetSize_ecc)
TEST_DECL_GROUP("signature", test_wc_SignatureGetSize_rsa)

#endif /* WOLFCRYPT_TEST_SIGNATURE_H */
14 changes: 10 additions & 4 deletions wolfcrypt/src/signature.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,12 @@ int wc_SignatureGetSize(enum wc_SignatureType sig_type,
switch(sig_type) {
case WC_SIGNATURE_TYPE_ECC:
#ifdef HAVE_ECC
/* Sanity check that void* key is at least ecc_key in size */
if (key_len >= sizeof(ecc_key)) {
/* Verify that key_len matches exactly sizeof(ecc_key).
* This is a necessary but not sufficient type check:
* the const void* API cannot verify the actual runtime
* type of the pointed-to object.
* Callers must pass a valid ecc_key* cast to const void*. */
if ((size_t)key_len == sizeof(ecc_key)) {
#if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && FIPS_VERSION3_LT(5,0,0))
sig_len = wc_ecc_sig_size((ecc_key*)(wc_ptr_t)key);
#else
Expand All @@ -112,8 +116,10 @@ int wc_SignatureGetSize(enum wc_SignatureType sig_type,
case WC_SIGNATURE_TYPE_RSA_W_ENC:
case WC_SIGNATURE_TYPE_RSA:
#ifndef NO_RSA
/* Sanity check that void* key is at least RsaKey in size */
if (key_len >= sizeof(RsaKey)) {
/* Verify that key_len matches exactly sizeof(RsaKey).
* Same caveat as the ECC case above: size equality is necessary
* but not sufficient; the caller must pass a valid RsaKey*. */
if ((size_t)key_len == sizeof(RsaKey)) {
#if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && FIPS_VERSION3_LT(5,0,0))
sig_len = wc_RsaEncryptSize((RsaKey*)(wc_ptr_t)key);
#else
Expand Down
Loading