Merge pull request #152 from libtom/pr/wchar-troubles-max-FFFF

better handling wchar_t when __WCHAR_MAX__ is 0xFFFF (2 bytes only)
This commit is contained in:
karel-m 2017-02-28 20:27:03 +01:00 committed by GitHub
commit 2edc0aeb66
3 changed files with 25 additions and 6 deletions

View File

@ -619,6 +619,7 @@ int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,
int der_decode_utf8_string(const unsigned char *in, unsigned long inlen,
wchar_t *out, unsigned long *outlen);
unsigned long der_utf8_charsize(const wchar_t c);
int der_utf8_valid_char(const wchar_t c);
int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen);

View File

@ -37,9 +37,7 @@ int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,
/* get the size */
for (x = len = 0; x < inlen; x++) {
if (in[x] < 0 || in[x] > 0x1FFFF) {
return CRYPT_INVALID_ARG;
}
if (!der_utf8_valid_char(in[x])) return CRYPT_INVALID_ARG;
len += der_utf8_charsize(in[x]);
}

View File

@ -27,11 +27,33 @@ unsigned long der_utf8_charsize(const wchar_t c)
return 1;
} else if (c <= 0x7FF) {
return 2;
#if __WCHAR_MAX__ == 0xFFFF
} else {
return 3;
}
#else
} else if (c <= 0xFFFF) {
return 3;
} else {
return 4;
}
#endif
}
/**
Test whether the given code point is valid character
@param c The UTF-8 character to test
@return 1 - valid, 0 - invalid
*/
int der_utf8_valid_char(const wchar_t c)
{
#if !defined(__WCHAR_MAX__) || __WCHAR_MAX__ > 0xFFFF
if (in[x] > 0x10FFFF) return 0;
#endif
#if !defined(__WCHAR_MAX__) || __WCHAR_MAX__ != 0xFFFF && __WCHAR_MAX__ != 0xFFFFFFFF
if (in[x] < 0) return 0;
#endif
return 1;
}
/**
@ -50,9 +72,7 @@ int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned lo
len = 0;
for (x = 0; x < noctets; x++) {
if (in[x] < 0 || in[x] > 0x10FFFF) {
return CRYPT_INVALID_ARG;
}
if (!der_utf8_valid_char(in[x])) return CRYPT_INVALID_ARG;
len += der_utf8_charsize(in[x]);
}