@@ -68,6 +68,7 @@ static void merror(int rc, cchar *fmt, ...);
6868static int parseCert (mbedtls_x509_crt * cert , cchar * file , char * * errorMsg );
6969static int parseCrl (mbedtls_x509_crl * crl , cchar * path , char * * errorMsg );
7070static int parseKey (mbedtls_pk_context * key , cchar * path , char * * errorMsg );
71+ static int preloadMbed (MprSsl * ssl , int flags );
7172static ssize readMbed (MprSocket * sp , void * buf , ssize len );
7273static char * replaceHyphen (char * cipher , char from , char to );
7374PUBLIC int sniCallback (void * unused , mbedtls_ssl_context * ctx , cuchar * hostname , size_t len );
@@ -92,6 +93,7 @@ PUBLIC int mprSslInit(void *unused, MprModule *module)
9293 mbedProvider -> upgradeSocket = upgradeMbed ;
9394 mbedProvider -> closeSocket = closeMbed ;
9495 mbedProvider -> disconnectSocket = disconnectMbed ;
96+ mbedProvider -> preload = preloadMbed ;
9597 mbedProvider -> readSocket = readMbed ;
9698 mbedProvider -> writeSocket = writeMbed ;
9799 mbedProvider -> socketState = getMbedState ;
@@ -405,30 +407,37 @@ static int handshakeMbed(MprSocket *sp)
405407 mbedtls_strerror (- rc , ebuf , sizeof (ebuf ));
406408 sp -> errorMsg = sfmt ("%s: error -0x%x" , ebuf , - rc );
407409 }
408- sp -> flags |= MPR_SOCKET_EOF ;
410+ sp -> flags |= MPR_SOCKET_EOF | MPR_SOCKET_ERROR ;
409411 errno = EPROTO ;
410412 return MPR_ERR_CANT_READ ;
411413 }
412414 if ((vrc = mbedtls_ssl_get_verify_result (& mb -> ctx )) != 0 ) {
413415 if (vrc & MBEDTLS_X509_BADCERT_MISSING ) {
414416 sp -> errorMsg = sclone ("Certificate missing" );
417+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
415418
416419 } if (vrc & MBEDTLS_X509_BADCERT_EXPIRED ) {
417420 sp -> errorMsg = sclone ("Certificate expired" );
421+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
418422
419423 } else if (vrc & MBEDTLS_X509_BADCERT_REVOKED ) {
420424 sp -> errorMsg = sclone ("Certificate revoked" );
425+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
421426
422427 } else if (vrc & MBEDTLS_X509_BADCERT_CN_MISMATCH ) {
423428 sp -> errorMsg = sclone ("Certificate common name mismatch" );
429+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
424430
425431 } else if (vrc & MBEDTLS_X509_BADCERT_KEY_USAGE || vrc & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE ) {
426432 sp -> errorMsg = sclone ("Unauthorized key use in certificate" );
433+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
427434
428435 } else if (vrc & MBEDTLS_X509_BADCERT_NOT_TRUSTED ) {
429436 sp -> errorMsg = sclone ("Certificate not trusted" );
430437 if (!sp -> ssl -> verifyIssuer ) {
431438 vrc = 0 ;
439+ } else {
440+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
432441 }
433442
434443 } else if (vrc & MBEDTLS_X509_BADCERT_SKIP_VERIFY ) {
@@ -440,15 +449,18 @@ static int handshakeMbed(MprSocket *sp)
440449 } else {
441450 if (mb -> ctx .client_auth && !sp -> ssl -> certFile ) {
442451 sp -> errorMsg = sclone ("Server requires a client certificate" );
452+ sp -> flags |= MPR_SOCKET_CERT_ERROR ;
443453
444454 } else if (rc == MBEDTLS_ERR_NET_CONN_RESET ) {
445455 sp -> errorMsg = sclone ("Peer disconnected" );
456+ sp -> flags |= MPR_SOCKET_ERROR ;
446457
447458 } else {
448459 char ebuf [256 ];
449460 mbedtls_x509_crt_verify_info (ebuf , sizeof (ebuf ), "" , vrc );
450461 strim (ebuf , "\n" , 0 );
451462 sp -> errorMsg = sfmt ("Cannot handshake: %s, error -0x%x" , ebuf , - rc );
463+ sp -> flags |= MPR_SOCKET_ERROR ;
452464 }
453465 }
454466 }
@@ -505,7 +517,7 @@ static int getPeerCertInfo(MprSocket *sp)
505517 if (mprGetLogLevel () >= 6 ) {
506518 char buf [4096 ];
507519 mbedtls_x509_crt_info (buf , sizeof (buf ) - 1 , "" , peer );
508- mprLog ("info mbedtls" , 6 , "Peer certificate\n%s" , buf );
520+ mprLog ("info mbedtls" , mbedLogLevel , "Peer certificate\n%s" , buf );
509521 }
510522 }
511523 sp -> cipher = replaceHyphen (sclone (mbedtls_ssl_get_ciphersuite (ctx )), '-' , '_' );
@@ -529,6 +541,11 @@ static int getPeerCertInfo(MprSocket *sp)
529541 return 0 ;
530542}
531543
544+ static int preloadMbed (MprSsl * ssl , int flags )
545+ {
546+ mprLog ("error mpr ssl openssl" , 4 , "Preload not yet supported with MbedTLS" );
547+ return 0 ;
548+ }
532549
533550/*
534551 Return the number of bytes read. Return -1 on errors and EOF. Distinguish EOF via mprIsSocketEof.
@@ -604,7 +621,7 @@ static ssize writeMbed(MprSocket *sp, cvoid *buf, ssize len)
604621 rc = 0 ;
605622 do {
606623 rc = mbedtls_ssl_write (& mb -> ctx , (uchar * ) buf , (int ) len );
607- mprDebug ("debug mpr ssl mbedtls" , 6 , "mbedtls write: write returned %d (0x%04x), len %zd" , rc , rc , len );
624+ mprDebug ("debug mpr ssl mbedtls" , mbedLogLevel , "mbedtls write: write returned %d (0x%04x), len %zd" , rc , rc , len );
608625 if (rc <= 0 ) {
609626 if (rc == MBEDTLS_ERR_SSL_WANT_READ || rc == MBEDTLS_ERR_SSL_WANT_WRITE ) {
610627 break ;
@@ -826,11 +843,11 @@ static int *getCipherSuite(MprSsl *ssl)
826843 static int once = 0 ;
827844 if (!once ++ ) {
828845 cp = (ciphers && * ciphers ) ? result : mbedtls_ssl_list_ciphersuites ();
829- mprLog ("info mbedtls" , 6 , "\nCiphers:" );
846+ mprLog ("info mbedtls" , mbedLogLevel , "\nCiphers:" );
830847 for (; * cp ; cp ++ ) {
831848 scopy (buf , sizeof (buf ), mbedtls_ssl_get_ciphersuite_name (* cp ));
832849 replaceHyphen (buf , '-' , '_' );
833- mprLog ("info mbedtls" , 6 , "0x%04X %s" , * cp , buf );
850+ mprLog ("info mbedtls" , mbedLogLevel , "0x%04X %s" , * cp , buf );
834851 }
835852 }
836853 }
0 commit comments