-
Notifications
You must be signed in to change notification settings - Fork 957
F-1370 : Tighten key_len check from >= to ==
#10122
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,13 +4,22 @@ | |
| \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* (cast to const void*) 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 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. | ||
| The conventional idiom is to pass sizeof(*key) at the call site. | ||
|
Comment on lines
+13
to
+22
|
||
|
|
||
| _Example_ | ||
| \code | ||
|
|
@@ -43,16 +52,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 | ||
|
|
@@ -93,16 +105,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_ | ||
|
|
@@ -166,8 +181,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 | ||
|
|
@@ -216,8 +234,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_ | ||
|
|
@@ -266,8 +287,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 | ||
|
|
||
|
|
@@ -317,8 +341,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 | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -93,8 +93,11 @@ 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 void* | ||
| * API cannot verify the actual runtime type of the pointed-to | ||
| * object. Callers must pass a valid ecc_key* cast to void*. */ | ||
| if (key_len == sizeof(ecc_key)) { | ||
|
Comment on lines
+96
to
+100
|
||
| sig_len = wc_ecc_sig_size((ecc_key*)key); | ||
| } | ||
| else { | ||
|
|
@@ -108,8 +111,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 (key_len == sizeof(RsaKey)) { | ||
| sig_len = wc_RsaEncryptSize((RsaKey*)key); | ||
| } | ||
| else { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This text calls out a cast to
const void*forecc_key*but not forRsaKey*, even though both convert implicitly toconst void*in C/C++. Consider making this consistent (either remove the cast mention entirely, or mention it uniformly for both) to avoid implying different call requirements.