diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 1a1bcfa34..f5bda06ab 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -1081,6 +1081,48 @@ size_t wc_strlcat(char *dst, const char *src, size_t dstSize) } #endif /* USE_WOLF_STRLCAT */ +#ifdef USE_WOLF_STRCASECMP +int wc_strcasecmp(const char *s1, const char *s2) +{ + char c1, c2; + for (; + ; + ++s1, ++s2) + { + c1 = *s1; + if ((c1 >= 'a') && (c1 <= 'z')) + c1 -= ('a' - 'A'); + c2 = *s2; + if ((c2 >= 'a') && (c2 <= 'z')) + c2 -= ('a' - 'A'); + if ((c1 != c2) || (c1 == 0)) + break; + } + return (c1 - c2); +} +#endif /* USE_WOLF_STRCASECMP */ + +#ifdef USE_WOLF_STRNCASECMP +int wc_strncasecmp(const char *s1, const char *s2, size_t n) +{ + char c1, c2; + for (c1 = 0, c2 = 0; + n > 0; + --n, ++s1, ++s2) + { + c1 = *s1; + if ((c1 >= 'a') && (c1 <= 'z')) + c1 -= ('a' - 'A'); + c2 = *s2; + if ((c2 >= 'a') && (c2 <= 'z')) + c2 -= ('a' - 'A'); + if ((c1 != c2) || (c1 == 0)) + break; + } + return (c1 - c2); +} +#endif /* USE_WOLF_STRNCASECMP */ + #if !defined(SINGLE_THREADED) && !defined(HAVE_C___ATOMIC) void wolfSSL_RefInit(wolfSSL_Ref* ref, int* err) { diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index 4fdc88a82..28ab2cbc5 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -640,7 +640,7 @@ typedef struct w64wrapper { defined(WOLFSSL_TIRTOS) || defined(WOLF_C99)) #define USE_WOLF_STRTOK #endif - #if !defined(USE_WOLF_STRSEP) && (defined(WOLF_C99)) + #if !defined(USE_WOLF_STRSEP) && (defined(WOLF_C89) || defined(WOLF_C99)) #define USE_WOLF_STRSEP #endif #if !defined(XSTRLCPY) && !defined(USE_WOLF_STRLCPY) @@ -684,10 +684,9 @@ typedef struct w64wrapper { #define XSTRCASECMP(s1,s2) strcasecmp((s1),(s2)) #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \ defined(WOLFSSL_ZEPHYR) - /* XC32 version < 1.0 does not support strcasecmp, so use - * case sensitive one. - */ - #define XSTRCASECMP(s1,s2) strcmp((s1),(s2)) + /* XC32 version < 1.0 does not support strcasecmp. */ + #define USE_WOLF_STRCASECMP + #define XSTRCASECMP(s1,s2) wc_strcasecmp(s1,s2) #elif defined(USE_WINDOWS_API) || defined(FREERTOS_TCP_WINSIM) #define XSTRCASECMP(s1,s2) _stricmp((s1),(s2)) #else @@ -697,8 +696,10 @@ typedef struct w64wrapper { #endif #if defined(WOLFSSL_DEOS) #define XSTRCASECMP(s1,s2) stricmp((s1),(s2)) - #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE) - #define XSTRCASECMP(s1,s2) strcmp((s1),(s2)) + #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE) \ + || defined(WOLF_C89) + #define USE_WOLF_STRCASECMP + #define XSTRCASECMP(s1,s2) wc_strcasecmp(s1, s2) #elif defined(WOLF_C89) #define XSTRCASECMP(s1,s2) strcmp((s1),(s2)) #else @@ -713,10 +714,9 @@ typedef struct w64wrapper { #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n)) #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \ defined(WOLFSSL_ZEPHYR) - /* XC32 version < 1.0 does not support strncasecmp, so use case - * sensitive one. - */ - #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n)) + /* XC32 version < 1.0 does not support strncasecmp. */ + #define USE_WOLF_STRNCASECMP + #define XSTRNCASECMP(s1,s2) wc_strncasecmp(s1,s2) #elif defined(USE_WINDOWS_API) || defined(FREERTOS_TCP_WINSIM) #define XSTRNCASECMP(s1,s2,n) _strnicmp((s1),(s2),(n)) #else @@ -726,8 +726,10 @@ typedef struct w64wrapper { #endif #if defined(WOLFSSL_DEOS) #define XSTRNCASECMP(s1,s2,n) strnicmp((s1),(s2),(n)) - #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE) - #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n)) + #elif defined(WOLFSSL_CMSIS_RTOSv2) || defined(WOLFSSL_AZSPHERE) \ + || defined(WOLF_C89) + #define USE_WOLF_STRNCASECMP + #define XSTRNCASECMP(s1,s2,n) wc_strncasecmp(s1, s2 ,n) #elif defined(WOLF_C89) #define XSTRNCASECMP(s1,s2,n) strncmp((s1),(s2),(n)) #else @@ -855,6 +857,12 @@ typedef struct w64wrapper { WOLFSSL_API size_t wc_strlcat(char *dst, const char *src, size_t dstSize); #define XSTRLCAT(s1,s2,n) wc_strlcat((s1),(s2),(n)) #endif + #ifdef USE_WOLF_STRCASECMP + WOLFSSL_API int wc_strcasecmp(const char *s1, const char *s2); + #endif + #ifdef USE_WOLF_STRNCASECMP + WOLFSSL_API int wc_strncasecmp(const char *s1, const char *s2, size_t n); + #endif #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) #ifndef XGETENV