@@ -189,7 +189,7 @@ static void CleanupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx)
189189}
190190
191191#ifndef NO_FILESYSTEM
192- static void freeBufferFromFile (byte * buf , void * heap )
192+ static void FreeBufferFromFile (byte * buf , void * heap )
193193{
194194 if (buf != NULL )
195195 WFREE (buf , heap , DYNTYPE_SSHD );
@@ -198,7 +198,7 @@ static void freeBufferFromFile(byte* buf, void* heap)
198198
199199
200200/* set bufSz to size wanted if too small and buf is null */
201- static byte * getBufferFromFile (const char * fileName , word32 * bufSz , void * heap )
201+ static byte * GetBufferFromFile (const char * fileName , word32 * bufSz , void * heap )
202202{
203203 FILE * file ;
204204 byte * buf = NULL ;
@@ -282,7 +282,7 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx)
282282 byte * data ;
283283 word32 dataSz = 0 ;
284284
285- data = getBufferFromFile (hostKey , & dataSz , heap );
285+ data = GetBufferFromFile (hostKey , & dataSz , heap );
286286 if (data == NULL ) {
287287 wolfSSH_Log (WS_LOG_ERROR ,
288288 "[SSHD] Error reading host key file." );
@@ -311,22 +311,22 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx)
311311 ret = WS_BAD_ARGUMENT ;
312312 }
313313
314- freeBufferFromFile (data , heap );
314+ FreeBufferFromFile (data , heap );
315315 wc_FreeDer (& der );
316316 }
317317 }
318318 }
319-
320319#if defined(WOLFSSH_OSSH_CERTS ) || defined(WOLFSSH_CERTS )
321320 if (ret == WS_SUCCESS ) {
322- /* TODO: Create a helper function that uses a file instead. */
323321 char * hostCert = wolfSSHD_ConfigGetHostCertFile (conf );
324322
325323 if (hostCert != NULL ) {
326324 byte * data ;
327325 word32 dataSz = 0 ;
328326
329- data = getBufferFromFile (hostCert , & dataSz , heap );
327+ wolfSSH_Log (WS_LOG_INFO , "[SSHD] Using host cert file %s" ,
328+ hostCert );
329+ data = GetBufferFromFile (hostCert , & dataSz , heap );
330330 if (data == NULL ) {
331331 wolfSSH_Log (WS_LOG_ERROR ,
332332 "[SSHD] Error reading host key file." );
@@ -335,44 +335,48 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx)
335335 }
336336
337337 if (ret == WS_SUCCESS ) {
338- #ifdef WOLFSSH_OPENSSH_CERTS
339- if (wolfSSH_CTX_UseOsshCert_buffer (* ctx , data , dataSz ) < 0 ) {
340- wolfSSH_Log (WS_LOG_ERROR ,
341- "[SSHD] Failed to use host certificate." );
342- ret = WS_BAD_ARGUMENT ;
343- }
344- #endif
338+ #ifdef WOLFSSH_OSSH_CERTS
339+ ret = wolfSSH_CTX_UseOsshCert_buffer (* ctx , data , dataSz );
340+ /*
341+ * If wolfSSH_CTX_UseOsshCert_buffer failed, the cert might be
342+ * X.509. Try with wolfSSH_CTX_UseCert_buffer.
343+ */
344+ if (ret != WS_SUCCESS )
345+ #endif /* WOLFSSH_OSSH_CERTS */
346+ {
345347 #ifdef WOLFSSH_CERTS
346- if ( ret == WS_SUCCESS || ret == WS_BAD_ARGUMENT ) {
348+ /* Try PEM first. */
347349 ret = wolfSSH_CTX_UseCert_buffer (* ctx , data , dataSz ,
348350 WOLFSSH_FORMAT_PEM );
349351 if (ret != WS_SUCCESS ) {
352+ /* Try DER (ASN.1) if it wasn't PEM. */
350353 ret = wolfSSH_CTX_UseCert_buffer (* ctx , data , dataSz ,
351354 WOLFSSH_FORMAT_ASN1 );
352355 }
353- if (ret != WS_SUCCESS ) {
354- wolfSSH_Log (WS_LOG_ERROR ,
355- "[SSHD] Failed to load in host certificate." );
356- }
356+ #endif /* WOLFSSH_CERTS */
357+ }
358+ if (ret != WS_SUCCESS ) {
359+ wolfSSH_Log (WS_LOG_ERROR , "[SSHD] Failed to load in host "
360+ "certificate %s." , hostCert );
357361 }
358- #endif
359362
360- freeBufferFromFile (data , heap );
363+ FreeBufferFromFile (data , heap );
361364 }
362365 }
363366 }
364367#endif /* WOLFSSH_OSSH_CERTS || WOLFSSH_CERTS */
365368
366- #ifdef WOLFSSH_CERTS
369+ #if defined( WOLFSSH_CERTS ) || defined( WOLFSSH_OSSH_CERTS )
367370 if (ret == WS_SUCCESS ) {
368371 char * caCert = wolfSSHD_ConfigGetUserCAKeysFile (conf );
372+
369373 if (caCert != NULL ) {
370374 byte * data ;
371375 word32 dataSz = 0 ;
372376
373-
374- wolfSSH_Log ( WS_LOG_INFO , "[SSHD] Using CA keys file %s" , caCert );
375- data = getBufferFromFile (caCert , & dataSz , heap );
377+ wolfSSH_Log ( WS_LOG_INFO , "[SSHD] Using user CA keys file %s" ,
378+ caCert );
379+ data = GetBufferFromFile (caCert , & dataSz , heap );
376380 if (data == NULL ) {
377381 wolfSSH_Log (WS_LOG_ERROR ,
378382 "[SSHD] Error reading CA cert file." );
@@ -381,25 +385,32 @@ static int SetupCTX(WOLFSSHD_CONFIG* conf, WOLFSSH_CTX** ctx)
381385 }
382386
383387 if (ret == WS_SUCCESS ) {
384- ret = wolfSSH_CTX_AddRootCert_buffer (* ctx , data , dataSz ,
385- WOLFSSH_FORMAT_PEM );
386- if (ret != WS_SUCCESS ) {
388+ #ifdef WOLFSSH_OSSH_CERTS
389+ ret = wolfSSH_CTX_AddOsshCAKey (* ctx , data , dataSz );
390+ /*
391+ * If wolfSSH_CTX_AddOsshCAKey failed, try
392+ * wolfSSH_CTX_AddRootCert_buffer.
393+ */
394+ if (ret != WS_SUCCESS )
395+ #endif /* WOLFSSH_OSSH_CERTS */
396+ {
397+ #ifdef WOLFSSH_CERTS
398+ /* Try PEM first. */
387399 ret = wolfSSH_CTX_AddRootCert_buffer (* ctx , data , dataSz ,
388- WOLFSSH_FORMAT_ASN1 );
400+ WOLFSSH_FORMAT_PEM );
401+ if (ret != WS_SUCCESS ) {
402+ /* Try DER (ASN.1) if it wasn't PEM. */
403+ ret = wolfSSH_CTX_AddRootCert_buffer (* ctx , data , dataSz ,
404+ WOLFSSH_FORMAT_ASN1 );
405+ }
406+ #endif /* WOLFSSH_CERTS */
389407 }
390408 if (ret != WS_SUCCESS ) {
391- #ifdef WOLFSSH_OPENSSH_CERTS
392- wolfSSH_Log (WS_LOG_INFO ,
393- "[SSHD] Continuing on in case CA is openssh "
394- "style." );
395- ret = WS_SUCCESS ;
396- #else
397- wolfSSH_Log (WS_LOG_ERROR ,
398- "[SSHD] Failed to load in CA certificate." );
399- #endif
409+ wolfSSH_Log (WS_LOG_ERROR , "[SSHD] Failed to load in user CA"
410+ " keys file %s." , caCert );
400411 }
401412
402- freeBufferFromFile (data , heap );
413+ FreeBufferFromFile (data , heap );
403414 }
404415 }
405416 }
0 commit comments