Refactor hex char to byte conversions.

This commit is contained in:
David Garske
2019-09-19 14:44:27 -07:00
parent fdb6c8141e
commit df10152b54
6 changed files with 47 additions and 62 deletions

View File

@ -33495,19 +33495,7 @@ void *wolfSSL_OPENSSL_malloc(size_t a)
int wolfSSL_OPENSSL_hexchar2int(unsigned char c)
{
int ret = -1;
if ('0' <= c && c <= '9') {
ret = c - '0';
}
else if ('a' <= c && c <= 'f') {
ret = c - 'a' + 0x0a;
}
else if ('A' <= c && c <= 'F') {
ret = c - 'A' + 0x0a;
}
return ret;
return (int)HexCharToByte((char)c);
}
unsigned char *wolfSSL_OPENSSL_hexstr2buf(const char *str, long *len)
@ -50959,9 +50947,6 @@ int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
/* dump hex */
if (flags & ASN1_STRFLGS_DUMP_ALL){
static const char hex_char[] = { '0', '1', '2', '3', '4', '5', '6',
'7','8', '9', 'A', 'B', 'C', 'D',
'E', 'F' };
char hex_tmp[4];
char *str_ptr, *str_end;
@ -50977,10 +50962,8 @@ int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
}
str_len++;
if (flags & ASN1_STRFLGS_DUMP_DER){
hex_tmp[0] = hex_char[(str->type & 0xf0) >> 4];
hex_tmp[1] = hex_char[(str->type & 0x0f)];
hex_tmp[2] = hex_char[(str->length & 0xf0) >> 4];
hex_tmp[3] = hex_char[(str->length & 0x0f)];
ByteToHexStr((byte)str->type, &hex_tmp[0]);
ByteToHexStr((byte)str->length, &hex_tmp[2]);
if (wolfSSL_BIO_write(out, hex_tmp, 4) != 4){
goto err_exit;
}
@ -50991,8 +50974,7 @@ int wolfSSL_ASN1_STRING_print_ex(WOLFSSL_BIO *out, WOLFSSL_ASN1_STRING *str,
str_ptr = str->data;
str_end = str->data + str->length;
while (str_ptr < str_end){
hex_tmp[0] = hex_char[*str_ptr >> 4];
hex_tmp[1] = hex_char[*str_ptr & 0xf];
ByteToHexStr((byte)*str_ptr, &hex_tmp[0]);
if (wolfSSL_BIO_write(out, hex_tmp, 2) != 2){
goto err_exit;
}

View File

@ -12171,7 +12171,7 @@ static mp_int* GetRsaInt(RsaKey* key, int idx)
int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
{
int ret = 0, i, j, outLen = 0, mpSz;
word32 seqSz = 0, verSz, rawLen, intTotalLen = 0;
word32 seqSz = 0, verSz = 0, rawLen, intTotalLen = 0;
word32 sizes[RSA_INTS];
byte seq[MAX_SEQ_SZ];
byte ver[MAX_VERSION_SZ];
@ -16500,15 +16500,6 @@ int wc_EccPrivateKeyDecode(const byte* input, word32* inOutIdx, ecc_key* key,
#ifdef WOLFSSL_CUSTOM_CURVES
static void ByteToHex(byte n, char* str)
{
const char hexChar[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
str[0] = hexChar[n >> 4];
str[1] = hexChar[n & 0xf];
}
/* returns 0 on success */
static int ASNToHexString(const byte* input, word32* inOutIdx, char** out,
word32 inSz, void* heap, int heapType)
@ -16539,7 +16530,7 @@ static int ASNToHexString(const byte* input, word32* inOutIdx, char** out,
}
for (i=0; i<len; i++)
ByteToHex(input[*inOutIdx + i], str + i*2);
ByteToHexStr(input[*inOutIdx + i], str + i*2);
str[len*2] = '\0';
*inOutIdx += len;

View File

@ -422,6 +422,35 @@ WC_STATIC WC_INLINE word32 btoi(byte b)
}
#endif
WC_STATIC WC_INLINE char HexCharToByte(char ch)
{
if (ch >= '0' && ch <= '9')
ch -= '0';
else if (ch >= 'A' && ch <= 'F')
ch -= 'A' - 10;
else if (ch >= 'a' && ch <= 'f')
ch -= 'a' - 10;
else
ch = -1; /* error case - return code must be signed */
return ch;
}
WC_STATIC WC_INLINE char ByteToHex(byte in)
{
static const char kHexChar[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
return (char)(kHexChar[in & 0xF]);
}
WC_STATIC WC_INLINE int ByteToHexStr(byte in, char* out)
{
if (out == NULL)
return -1;
out[0] = ByteToHex(in >> 4);
out[1] = ByteToHex(in & 0xf);
return 0;
}
#ifndef WOLFSSL_NO_CT_OPS
/* Constant time - mask set when a > b. */
@ -516,7 +545,6 @@ WC_STATIC WC_INLINE byte ctSetLTE(int a, int b)
}
#endif
#undef WC_STATIC
#endif /* !WOLFSSL_MISC_INCLUDED && !NO_INLINE */

View File

@ -12448,17 +12448,8 @@ static int _sp_read_radix_16(sp_int* a, const char* in)
a->dp[0] = 0;
for (i = (int)(XSTRLEN(in) - 1); i >= 0; i--) {
char ch = in[i];
if ((ch >= '0') && (ch <= '9')) {
ch -= '0';
}
else if ((ch >= 'A') && (ch <= 'F')) {
ch -= 'A' - 10;
}
else if ((ch >= 'a') && (ch <= 'f')) {
ch -= 'a' - 10;
}
else {
int ch = (int)HexCharToByte(in[i]);
if (ch < 0) {
err = MP_VAL;
break;
}
@ -12597,11 +12588,6 @@ int sp_read_radix(sp_int* a, const char* in, int radix)
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(WC_MP_TO_RADIX)
/* Hex string characters. */
static const char sp_hex_char[16] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
/* Put the big-endian, hex string encoding of a into str.
*
@ -12668,11 +12654,11 @@ int sp_tohex(sp_int* a, char* str)
#endif /* WC_DISABLE_RADIX_ZERO_PAD */
/* Most-significant word. */
for (; j >= 0; j -= 4) {
*(str++) = sp_hex_char[(a->dp[i] >> j) & 0xf];
*(str++) = ByteToHex(a->dp[i] >> j);
}
for (--i; i >= 0; i--) {
for (j = SP_WORD_SIZE - 4; j >= 0; j -= 4) {
*(str++) = sp_hex_char[(a->dp[i] >> j) & 0xf];
*(str++) = ByteToHex(a->dp[i] >> j);
}
}
*str = '\0';

View File

@ -5418,7 +5418,7 @@ static wcchar fp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
static int fp_read_radix_16(fp_int *a, const char *str)
{
int i, j, k, neg;
char ch;
int ch;
/* if the leading digit is a
* minus set the sign to negative.
@ -5433,15 +5433,10 @@ static int fp_read_radix_16(fp_int *a, const char *str)
j = 0;
k = 0;
for (i = (int)(XSTRLEN(str) - 1); i >= 0; i--) {
ch = str[i];
if (ch >= '0' && ch <= '9')
ch -= (char)'0';
else if (ch >= 'A' && ch <= 'F')
ch -= (char)'A' - 10;
else if (ch >= 'a' && ch <= 'f')
ch -= (char)'a' - 10;
else
return FP_VAL;
ch = (int)HexCharToByte(str[i]);
if (ch < 0) {
return FP_VAL;
}
k += j == DIGIT_BIT;
j &= DIGIT_BIT - 1;

View File

@ -107,6 +107,9 @@ void ato24(const byte* c, word32* u24);
void ato32(const byte* c, word32* u32);
word32 btoi(byte b);
WOLFSSL_LOCAL char HexCharToByte(char ch);
WOLFSSL_LOCAL char ByteToHex(byte in);
WOLFSSL_LOCAL int ByteToHexStr(byte in, char* out);
WOLFSSL_LOCAL byte ctMaskGT(int a, int b);
WOLFSSL_LOCAL byte ctMaskGTE(int a, int b);