Skip to content

Commit 17870d4

Browse files
committed
src/internal.c: in wolfSSL_ERR_reason_error_string(), add missing error string for SCR_DIFFERENT_CERT_E.
wolfssl/ssl.h, wolfssl/error-ssl.h, wolfssl/wolfcrypt/error-crypt.h, wolfcrypt/src/error.c, and src/internal.c: * fix values of WOLFSSL_ERROR_SSL and WOLFSSL_ERROR_WANT_X509_LOOKUP to match OpenSSL values; * move legacy CyaSSL compat layer error codes from ssl.h to error-ssl.h and renumber them to conform to existing sequence; * move enum IOerrors from ssl.h to error-ssl.h to get picked up by support/gen-debug-trace-error-codes.sh; * add to enum wolfSSL_ErrorCodes negative counterparts for several positive error return constants; * include error-ssl.h from ssl.h; * add label (wolfCrypt_ErrorCodes) to error-crypt.h enum, and in wc_GetErrorString(), use switch ((enum wolfCrypt_ErrorCodes)error) to activate switch warnings for missing enums; * in wolfSSL_ERR_reason_error_string(), use switch((enum wolfSSL_ErrorCodes)error) to activate switch warnings for missing enums; * in ssl.h, add special-case WOLFSSL_DEBUG_TRACE_ERROR_CODES macros for WOLFSSL_FAILURE; * in error-crypt.h, add missing WOLFSSL_API attribute to wc_backtrace_render(); and * harmonize gating of error codes, ssl.h / error-ssl.h / internal.c:wolfSSL_ERR_reason_error_string() / api.c:error_test(). tests/api.c: * add error_test() adapted from wolfcrypt/test/test.c, checking all error strings for expected presence/absence and length, called from existing test_wolfSSL_ERR_strings(). * in post_auth_version_client_cb(), add missing !NO_ERROR_STRINGS gating. add numerous WC_NO_ERR_TRACE()s to operand error code uses, cleaning up error traces in general, and particularly when WOLFSSL_DEBUG_TRACE_ERROR_CODES_ALWAYS. * crypto lib (36), * crypto test&benchmark (20), * TLS lib (179), * examples (122), * linuxkm (3), * tests/api.c (2272).
1 parent b178138 commit 17870d4

6 files changed

Lines changed: 137 additions & 92 deletions

File tree

src/internal.c

Lines changed: 50 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -25165,13 +25165,14 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
2516525165
return wc_GetErrorString(error);
2516625166
}
2516725167

25168-
switch (error) {
25169-
2517025168
#ifdef OPENSSL_EXTRA
25171-
case 0 :
25169+
if (error == 0) {
2517225170
return "ok";
25171+
}
2517325172
#endif
2517425173

25174+
switch ((enum wolfSSL_ErrorCodes)error) {
25175+
2517525176
case UNSUPPORTED_SUITE :
2517625177
return "unsupported cipher suite";
2517725178

@@ -25280,9 +25281,6 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
2528025281
case -WOLFSSL_ERROR_WANT_X509_LOOKUP:
2528125282
return "application client cert callback asked to be called again";
2528225283

25283-
case -WOLFSSL_ERROR_SSL:
25284-
return "fatal TLS protocol error";
25285-
2528625284
case BUFFER_ERROR :
2528725285
return "malformed buffer input error";
2528825286

@@ -25627,37 +25625,6 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
2562725625
case HTTP_APPSTR_ERR:
2562825626
return "HTTP Application string error";
2562925627

25630-
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
25631-
/* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with
25632-
* -WOLFSSL_ERROR_WANT_CONNECT. */
25633-
case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID:
25634-
return "certificate not yet valid";
25635-
case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED:
25636-
return "certificate has expired";
25637-
case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
25638-
return "certificate signature failure";
25639-
case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
25640-
return "format error in certificate's notAfter field";
25641-
case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
25642-
return "self-signed certificate in certificate chain";
25643-
case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
25644-
return "unable to get local issuer certificate";
25645-
case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
25646-
return "unable to verify the first certificate";
25647-
case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG:
25648-
return "certificate chain too long";
25649-
case -WOLFSSL_X509_V_ERR_CERT_REVOKED:
25650-
return "certificate revoked";
25651-
case -WOLFSSL_X509_V_ERR_INVALID_CA:
25652-
return "invalid CA certificate";
25653-
case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED:
25654-
return "path length constraint exceeded";
25655-
case -WOLFSSL_X509_V_ERR_CERT_REJECTED:
25656-
return "certificate rejected";
25657-
case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
25658-
return "subject issuer mismatch";
25659-
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER */
25660-
2566125628
case UNSUPPORTED_PROTO_VERSION:
2566225629
#ifdef OPENSSL_EXTRA
2566325630
return "WRONG_SSL_VERSION";
@@ -25693,6 +25660,8 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
2569325660
return "Certificate type not supported";
2569425661

2569525662
case WOLFSSL_BAD_STAT:
25663+
return "bad status";
25664+
2569625665
case WOLFSSL_BAD_PATH:
2569725666
return "No certificates found at designated path";
2569825667

@@ -25708,26 +25677,56 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
2570825677
case WOLFSSL_UNKNOWN:
2570925678
return "Unknown algorithm (EVP)";
2571025679

25711-
case WOLFSSL_CBIO_ERR_GENERAL:
25712-
return "I/O callback general unexpected error";
25680+
case WOLFSSL_FATAL_ERROR:
25681+
return "fatal error";
2571325682

25714-
case WOLFSSL_CBIO_ERR_WANT_READ:
25715-
return "I/O callback want read, call again";
25683+
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
25684+
defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
2571625685

25717-
case WOLFSSL_CBIO_ERR_WANT_WRITE:
25718-
return "I/O callback want write, call again";
25686+
/* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with
25687+
* -WOLFSSL_ERROR_WANT_CONNECT.
25688+
*/
2571925689

25720-
case WOLFSSL_CBIO_ERR_CONN_RST:
25721-
return "I/O callback connection reset";
25690+
case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID:
25691+
return "certificate not yet valid";
25692+
25693+
case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED:
25694+
return "certificate has expired";
25695+
25696+
case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
25697+
return "certificate signature failure";
25698+
25699+
case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
25700+
return "format error in certificate's notAfter field";
25701+
25702+
case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
25703+
return "self-signed certificate in certificate chain";
25704+
25705+
case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
25706+
return "unable to get local issuer certificate";
25707+
25708+
case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
25709+
return "unable to verify the first certificate";
25710+
25711+
case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG:
25712+
return "certificate chain too long";
25713+
25714+
case -WOLFSSL_X509_V_ERR_CERT_REVOKED:
25715+
return "certificate revoked";
25716+
25717+
case -WOLFSSL_X509_V_ERR_INVALID_CA:
25718+
return "invalid CA certificate";
2572225719

25723-
case WOLFSSL_CBIO_ERR_ISR:
25724-
return "I/O callback interrupt";
25720+
case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED:
25721+
return "path length constraint exceeded";
2572525722

25726-
case WOLFSSL_CBIO_ERR_CONN_CLOSE:
25727-
return "I/O callback connection closed or epipe";
25723+
case -WOLFSSL_X509_V_ERR_CERT_REJECTED:
25724+
return "certificate rejected";
25725+
25726+
case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
25727+
return "subject issuer mismatch";
2572825728

25729-
case WOLFSSL_CBIO_ERR_TIMEOUT:
25730-
return "I/O callback socket timeout";
25729+
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER || HAVE_MEMCACHED */
2573125730

2573225731
default :
2573325732
return "unknown error number";

tests/api.c

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55059,8 +55059,10 @@ static int post_auth_version_client_cb(WOLFSSL* ssl)
5505955059
ExpectIntEQ(wolfSSL_ERR_get_error(), -WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION));
5506055060

5506155061
/* check the string matches expected string */
55062+
#ifndef NO_ERROR_STRINGS
5506255063
ExpectStrEQ(wolfSSL_ERR_error_string(-WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION), NULL),
5506355064
"WRONG_SSL_VERSION");
55065+
#endif
5506455066
#endif
5506555067
return EXPECT_RESULT();
5506655068
}
@@ -83162,6 +83164,7 @@ static int test_wolfSSL_set_psk_use_session_callback(void)
8316283164
*/
8316383165
static int error_test(void)
8316483166
{
83167+
EXPECT_DECLS;
8316583168
const char* errStr;
8316683169
const char* unknownStr = wc_GetErrorString(0);
8316783170

@@ -83170,11 +83173,9 @@ static int error_test(void)
8317083173
* The string is that error strings are not available.
8317183174
*/
8317283175
errStr = wc_GetErrorString(OPEN_RAN_E);
83173-
wc_ErrorString(OPEN_RAN_E, out);
83174-
if (XSTRCMP(errStr, unknownStr) != 0)
83175-
return -1;
83176-
if (XSTRCMP(out, unknownStr) != 0)
83177-
return -2;
83176+
ExpectIntEQ(XSTRCMP(errStr, unknownStr), 0);
83177+
if (EXPECT_FAIL())
83178+
return OPEN_RAN_E;
8317883179
#else
8317983180
int i;
8318083181
int j = 0;
@@ -83183,6 +83184,20 @@ static int error_test(void)
8318383184
int first;
8318483185
int last;
8318583186
} missing[] = {
83187+
#ifndef OPENSSL_EXTRA
83188+
{ 0, 0 },
83189+
#endif
83190+
83191+
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
83192+
defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
83193+
{ -11, -12 },
83194+
{ -15, -17 },
83195+
{ -19, -19 },
83196+
{ -26, -27 },
83197+
{ -30, WC_FIRST_E+1 },
83198+
#else
83199+
{ -9, WC_FIRST_E+1 },
83200+
#endif
8318683201
{ -124, -124 },
8318783202
{ -166, -169 },
8318883203
{ -300, -300 },
@@ -83192,14 +83207,15 @@ static int error_test(void)
8319283207
{ -358, -358 },
8319383208
{ -372, -372 },
8319483209
{ -384, -384 },
83195-
{ -473, -499 }
83210+
{ -466, -499 },
83211+
{ WOLFSSL_LAST_E-1, WOLFSSL_LAST_E-1 }
8319683212
};
8319783213

8319883214
/* Check that all errors have a string and it's the same through the two
8319983215
* APIs. Check that the values that are not errors map to the unknown
8320083216
* string.
8320183217
*/
83202-
for (i = WC_FIRST_E; i >= WOLFSSL_LAST_E; i--) {
83218+
for (i = 0; i >= WOLFSSL_LAST_E-1; i--) {
8320383219
int this_missing = 0;
8320483220
for (j = 0; j < (int)XELEM_CNT(missing); ++j) {
8320583221
if ((i <= missing[j].first) && (i >= missing[j].last)) {
@@ -83210,31 +83226,26 @@ static int error_test(void)
8321083226
errStr = wolfSSL_ERR_reason_error_string(i);
8321183227

8321283228
if (! this_missing) {
83213-
if (XSTRCMP(errStr, unknownStr) == 0) {
83214-
WOLFSSL_MSG("errStr unknown");
83215-
return -3;
83229+
ExpectIntNE(XSTRCMP(errStr, unknownStr), 0);
83230+
if (EXPECT_FAIL()) {
83231+
return i;
8321683232
}
83217-
if (XSTRLEN(errStr) >= WOLFSSL_MAX_ERROR_SZ) {
83218-
WOLFSSL_MSG("errStr too long");
83219-
return -4;
83233+
ExpectTrue(XSTRLEN(errStr) < WOLFSSL_MAX_ERROR_SZ);
83234+
if (EXPECT_FAIL()) {
83235+
return i;
8322083236
}
8322183237
}
8322283238
else {
8322383239
j++;
83224-
if (XSTRCMP(errStr, unknownStr) != 0) {
83225-
return -5;
83240+
ExpectIntEQ(XSTRCMP(errStr, unknownStr), 0);
83241+
if (EXPECT_FAIL()) {
83242+
return i;
8322683243
}
8322783244
}
8322883245
}
83229-
83230-
/* Check if the next possible value has been given a string. */
83231-
errStr = wc_GetErrorString(i);
83232-
if (XSTRCMP(errStr, unknownStr) != 0) {
83233-
return -6;
83234-
}
8323583246
#endif
8323683247

83237-
return 0;
83248+
return 1;
8323883249
}
8323983250

8324083251
static int test_wolfSSL_ERR_strings(void)
@@ -83272,7 +83283,7 @@ static int test_wolfSSL_ERR_strings(void)
8327283283
#endif
8327383284
#endif
8327483285

83275-
ExpectIntEQ(error_test(), 0);
83286+
ExpectIntEQ(error_test(), 1);
8327683287

8327783288
return EXPECT_RESULT();
8327883289
}

wolfcrypt/src/error.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
WOLFSSL_ABI
4343
const char* wc_GetErrorString(int error)
4444
{
45-
switch (error) {
45+
switch ((enum wolfCrypt_ErrorCodes)error) {
4646

4747
case MP_MEM :
4848
return "MP integer dynamic memory allocation failed";
@@ -642,6 +642,8 @@ const char* wc_GetErrorString(int error)
642642
case PBKDF2_KAT_FIPS_E:
643643
return "wolfCrypt FIPS PBKDF2 Known Answer Test Failure";
644644

645+
case MAX_CODE_E:
646+
case MIN_CODE_E:
645647
default:
646648
return "unknown error number";
647649

wolfssl/error-ssl.h

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,40 @@
3535
#endif
3636

3737
enum wolfSSL_ErrorCodes {
38-
WOLFSSL_FATAL_ERROR = -1, /* note, must be -1 for backward
39-
* compat. */
40-
WOLFSSL_FIRST_E = -301,
38+
WOLFSSL_FATAL_ERROR = -1, /* must be -1 for backward compat. */
39+
40+
/* negative counterparts to namesake positive constants in ssl.h */
41+
WOLFSSL_ERROR_WANT_READ_E = -2,
42+
WOLFSSL_ERROR_WANT_WRITE_E = -3,
43+
WOLFSSL_ERROR_WANT_X509_LOOKUP_E = -4,
44+
WOLFSSL_ERROR_SYSCALL_E = -5,
45+
WOLFSSL_ERROR_ZERO_RETURN_E = -6,
46+
WOLFSSL_ERROR_WANT_CONNECT_E = -7,
47+
WOLFSSL_ERROR_WANT_ACCEPT_E = -8,
48+
49+
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
50+
defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED)
51+
52+
WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE_E = -7, /* note conflict with
53+
* WOLFSSL_ERROR_WANT_CONNECT_E
54+
*/
55+
WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID_E = -9,
56+
WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED_E = -10,
57+
WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD_E = -13,
58+
WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD_E = -14,
59+
WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT_E = -18,
60+
WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY_E = -20,
61+
WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE_E = -21,
62+
WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG_E = -22,
63+
WOLFSSL_X509_V_ERR_CERT_REVOKED_E = -23,
64+
WOLFSSL_X509_V_ERR_INVALID_CA_E = -24,
65+
WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED_E = -25,
66+
WOLFSSL_X509_V_ERR_CERT_REJECTED_E = -28,
67+
WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH_E = -29,
68+
69+
#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER || HAVE_MEMCACHED */
70+
71+
WOLFSSL_FIRST_E = -301, /* start of native TLS codes */
4172

4273
INPUT_CASE_ERROR = -301, /* process input state error */
4374
PREFIX_ERROR = -302, /* bad index to key rounds */
@@ -203,15 +234,6 @@ enum wolfSSL_ErrorCodes {
203234
WOLFSSL_NOT_IMPLEMENTED = -464, /* Function not implemented */
204235
WOLFSSL_UNKNOWN = -465, /* Unknown algorithm (EVP) */
205236

206-
/* I/O Callback errors */
207-
WOLFSSL_CBIO_ERR_GENERAL = -466, /* I/O callback general unexpected error */
208-
WOLFSSL_CBIO_ERR_WANT_READ = -467, /* I/O callback want read, call again */
209-
WOLFSSL_CBIO_ERR_WANT_WRITE = -468, /* I/O callback want write, call again */
210-
WOLFSSL_CBIO_ERR_CONN_RST = -469, /* I/O callback connection reset */
211-
WOLFSSL_CBIO_ERR_ISR = -470, /* I/O callback interrupt */
212-
WOLFSSL_CBIO_ERR_CONN_CLOSE = -471, /* I/O callback connection closed or epipe */
213-
WOLFSSL_CBIO_ERR_TIMEOUT = -472, /* I/O callback socket timeout */
214-
215237
/* negotiation parameter errors */
216238
UNSUPPORTED_SUITE = -500, /* unsupported cipher suite */
217239
MATCH_SUITE_ERROR = -501, /* can't match cipher suite */
@@ -224,6 +246,16 @@ enum wolfSSL_ErrorCodes {
224246
WOLFSSL_LAST_E = -506
225247
};
226248

249+
/* I/O Callback default errors */
250+
enum IOerrors {
251+
WOLFSSL_CBIO_ERR_GENERAL = -1, /* general unexpected err */
252+
WOLFSSL_CBIO_ERR_WANT_READ = -2, /* need to call read again */
253+
WOLFSSL_CBIO_ERR_WANT_WRITE = -2, /* need to call write again */
254+
WOLFSSL_CBIO_ERR_CONN_RST = -3, /* connection reset */
255+
WOLFSSL_CBIO_ERR_ISR = -4, /* interrupt */
256+
WOLFSSL_CBIO_ERR_CONN_CLOSE = -5, /* connection closed or epipe */
257+
WOLFSSL_CBIO_ERR_TIMEOUT = -6 /* socket timeout */
258+
};
227259

228260
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
229261
enum {

wolfssl/ssl.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2647,14 +2647,15 @@ enum { /* ssl Constants */
26472647
(WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE |
26482648
WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP),
26492649

2650+
/* These values match OpenSSL values for corresponding names. */
2651+
WOLFSSL_ERROR_SSL = 1,
26502652
WOLFSSL_ERROR_WANT_READ = 2,
26512653
WOLFSSL_ERROR_WANT_WRITE = 3,
2652-
WOLFSSL_ERROR_WANT_CONNECT = 7,
2653-
WOLFSSL_ERROR_WANT_ACCEPT = 8,
2654+
WOLFSSL_ERROR_WANT_X509_LOOKUP = 4,
26542655
WOLFSSL_ERROR_SYSCALL = 5,
2655-
WOLFSSL_ERROR_WANT_X509_LOOKUP = 83,
26562656
WOLFSSL_ERROR_ZERO_RETURN = 6,
2657-
WOLFSSL_ERROR_SSL = 85,
2657+
WOLFSSL_ERROR_WANT_CONNECT = 7,
2658+
WOLFSSL_ERROR_WANT_ACCEPT = 8,
26582659

26592660
WOLFSSL_SENT_SHUTDOWN = 1,
26602661
WOLFSSL_RECEIVED_SHUTDOWN = 2,

wolfssl/wolfcrypt/error-crypt.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ the error status.
4242
#endif
4343

4444
/* error codes, add string for new errors !!! */
45-
enum {
45+
enum wolfCrypt_ErrorCodes {
4646
/* note that WOLFSSL_FATAL_ERROR is defined as -1 in error-ssl.h, for
4747
* reasons of backward compatibility.
4848
*/

0 commit comments

Comments
 (0)