@@ -466,51 +466,51 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx,
466466 ret = WS_BAD_ARGUMENT ;
467467 }
468468 else {
469- byte * data ;
470- word32 dataSz = 0 ;
469+ byte * data ;
470+ word32 dataSz = 0 ;
471+
472+ /* The host private key is a secret trust anchor: refuse a symlink,
473+ * an unsafe owner or path, or a group/world readable/writable
474+ * file. */
475+ data = getBufferFromFile (hostKey , & dataSz , heap ,
476+ WOLFSSHD_LOAD_SECRET );
477+ if (data == NULL ) {
478+ /* NULL means the secure gate rejected the file (bad owner,
479+ * symlink, group/world writable/readable; reason already
480+ * logged) or the read failed, so report a file error rather
481+ * than a memory error. */
482+ wolfSSH_Log (WS_LOG_ERROR ,
483+ "[SSHD] Error reading host key file." );
484+ ret = WS_BAD_FILE_E ;
471485
472- /* The host private key is a secret trust anchor: refuse a symlink,
473- * an unsafe owner or path, or a group/world readable/writable
474- * file. */
475- data = getBufferFromFile (hostKey , & dataSz , heap ,
476- WOLFSSHD_LOAD_SECRET );
477- if (data == NULL ) {
478- /* NULL means the secure gate rejected the file (bad owner,
479- * symlink, group/world writable/readable; reason already
480- * logged) or the read failed, so report a file error rather
481- * than a memory error. */
482- wolfSSH_Log (WS_LOG_ERROR ,
483- "[SSHD] Error reading host key file." );
484- ret = WS_BAD_FILE_E ;
486+ }
485487
486- }
488+ if (ret == WS_SUCCESS ) {
489+ if (wc_PemToDer (data , dataSz , PRIVATEKEY_TYPE , & der , NULL ,
490+ NULL , NULL ) != 0 ) {
491+ wolfSSH_Log (WS_LOG_DEBUG , "[SSHD] Failed to convert host "
492+ "private key from PEM. Assuming key in DER "
493+ "format." );
494+ privBuf = data ;
495+ privBufSz = dataSz ;
496+ }
497+ else {
498+ privBuf = der -> buffer ;
499+ privBufSz = der -> length ;
500+ }
487501
488- if (ret == WS_SUCCESS ) {
489- if (wc_PemToDer (data , dataSz , PRIVATEKEY_TYPE , & der , NULL ,
490- NULL , NULL ) != 0 ) {
491- wolfSSH_Log (WS_LOG_DEBUG , "[SSHD] Failed to convert host "
492- "private key from PEM. Assuming key in DER "
493- "format." );
494- privBuf = data ;
495- privBufSz = dataSz ;
496- }
497- else {
498- privBuf = der -> buffer ;
499- privBufSz = der -> length ;
500- }
502+ if (wolfSSH_CTX_UsePrivateKey_buffer (* ctx , privBuf , privBufSz ,
503+ WOLFSSH_FORMAT_ASN1 ) < 0 ) {
504+ wolfSSH_Log (WS_LOG_ERROR ,
505+ "[SSHD] Failed to use host private key." );
506+ ret = WS_BAD_ARGUMENT ;
507+ }
501508
502- if (wolfSSH_CTX_UsePrivateKey_buffer (* ctx , privBuf , privBufSz ,
503- WOLFSSH_FORMAT_ASN1 ) < 0 ) {
504- wolfSSH_Log (WS_LOG_ERROR ,
505- "[SSHD] Failed to use host private key." );
506- ret = WS_BAD_ARGUMENT ;
509+ freeBufferFromFile (data , heap );
510+ wc_FreeDer (& der );
507511 }
508-
509- freeBufferFromFile (data , heap );
510- wc_FreeDer (& der );
511512 }
512513 }
513- }
514514 }
515515
516516#if defined(WOLFSSH_OSSH_CERTS ) || defined(WOLFSSH_CERTS )
@@ -615,6 +615,16 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx,
615615 wolfSSL_CTX_free (sslCtx );
616616 }
617617 }
618+ #else
619+ /* The system/user CA-store directives are parsed unconditionally, so warn
620+ * if they were set but wolfSSL was built without WOLFSSL_SYS_CA_CERTS,
621+ * rather than silently ignoring them. */
622+ if (ret == WS_SUCCESS && (wolfSSHD_ConfigGetSystemCA (conf )
623+ || wolfSSHD_ConfigGetUserCAStore (conf ))) {
624+ wolfSSH_Log (WS_LOG_ERROR ,
625+ "[SSHD] wolfSSH_TrustedSystemCAKeys/wolfSSH_TrustedUserCaStore set "
626+ "but wolfSSL was built without WOLFSSL_SYS_CA_CERTS; ignoring." );
627+ }
618628 #endif
619629
620630 /* load in CA certs from file set */
0 commit comments