mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-31 11:17:29 +02:00
Fix for wc_export_int
with WC_TYPE_HEX_STR
, which was not returning the correct length.
This commit is contained in:
34
tests/api.c
34
tests/api.c
@ -42068,42 +42068,54 @@ static int test_get_digit (void)
|
|||||||
/*
|
/*
|
||||||
* Testing wc_export_int
|
* Testing wc_export_int
|
||||||
*/
|
*/
|
||||||
static int test_wc_export_int (void)
|
static int test_wc_export_int(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
#if defined(WOLFSSL_PUBLIC_MP)
|
#if defined(WOLFSSL_PUBLIC_MP)
|
||||||
mp_int mp;
|
mp_int mp;
|
||||||
byte buf[256];
|
byte buf[32];
|
||||||
word32 keySz = (word32)sizeof(buf);
|
word32 keySz = (word32)sizeof(buf);
|
||||||
word32 len = (word32)sizeof(buf);
|
word32 len = (word32)sizeof(buf);
|
||||||
|
|
||||||
|
|
||||||
int encType = WC_TYPE_UNSIGNED_BIN;
|
|
||||||
|
|
||||||
printf(testingFmt, "wc_export_int()");
|
printf(testingFmt, "wc_export_int()");
|
||||||
|
|
||||||
if (mp_init(&mp) != MP_OKAY) {
|
if (mp_init(&mp) != MP_OKAY) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = wc_export_int(NULL, buf, &len, keySz, encType);
|
ret = mp_set_int(&mp, 1234);
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = wc_export_int(NULL, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN);
|
||||||
if (ret == BAD_FUNC_ARG) {
|
if (ret == BAD_FUNC_ARG) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
len = sizeof(buf)-1;
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = wc_export_int(&mp, buf, &len, keySz, encType);
|
len = sizeof(buf)-1;
|
||||||
|
ret = wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN);
|
||||||
if (ret == BUFFER_E) {
|
if (ret == BUFFER_E) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
len = sizeof(buf);
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = wc_export_int(&mp, buf, &len, keySz, WC_TYPE_HEX_STR);
|
len = sizeof(buf);
|
||||||
|
ret = wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN);
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = wc_export_int(&mp, buf, &len, keySz, encType);
|
len = 4; /* test input too small */
|
||||||
|
ret = wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR);
|
||||||
|
if (ret == BUFFER_E) {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ret == 0) {
|
||||||
|
len = sizeof(buf);
|
||||||
|
ret = wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR);
|
||||||
|
/* hex version of 1234 is 04D2 and should be 4 digits + 1 null */
|
||||||
|
if (ret == 0 && len != 5) {
|
||||||
|
ret = BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(resultFmt, ret == 0 ? passed : failed);
|
printf(resultFmt, ret == 0 ? passed : failed);
|
||||||
|
@ -210,26 +210,37 @@ int wc_export_int(mp_int* mp, byte* buf, word32* len, word32 keySz,
|
|||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (mp == NULL)
|
if (mp == NULL || buf == NULL || len == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
/* check buffer size */
|
|
||||||
if (*len < keySz) {
|
|
||||||
*len = keySz;
|
|
||||||
return BUFFER_E;
|
|
||||||
}
|
|
||||||
|
|
||||||
*len = keySz;
|
|
||||||
XMEMSET(buf, 0, *len);
|
|
||||||
|
|
||||||
if (encType == WC_TYPE_HEX_STR) {
|
if (encType == WC_TYPE_HEX_STR) {
|
||||||
|
/* for WC_TYPE_HEX_STR the keySz is not used.
|
||||||
|
* The size is computed via mp_radix_size and checked with len input */
|
||||||
#ifdef WC_MP_TO_RADIX
|
#ifdef WC_MP_TO_RADIX
|
||||||
err = mp_tohex(mp, (char*)buf);
|
int size = 0;
|
||||||
|
err = mp_radix_size(mp, MP_RADIX_HEX, &size);
|
||||||
|
if (err == MP_OKAY) {
|
||||||
|
/* make sure we can fit result */
|
||||||
|
if (*len < (word32)size) {
|
||||||
|
*len = (word32)size;
|
||||||
|
return BUFFER_E;
|
||||||
|
}
|
||||||
|
*len = (word32)size;
|
||||||
|
err = mp_tohex(mp, (char*)buf);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
err = NOT_COMPILED_IN;
|
err = NOT_COMPILED_IN;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
/* for WC_TYPE_UNSIGNED_BIN keySz is used to zero pad.
|
||||||
|
* The key size is always returned as the size */
|
||||||
|
if (*len < keySz) {
|
||||||
|
*len = keySz;
|
||||||
|
return BUFFER_E;
|
||||||
|
}
|
||||||
|
*len = keySz;
|
||||||
|
XMEMSET(buf, 0, *len);
|
||||||
err = mp_to_unsigned_bin(mp, buf + (keySz - mp_unsigned_bin_size(mp)));
|
err = mp_to_unsigned_bin(mp, buf + (keySz - mp_unsigned_bin_size(mp)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user