@@ -88,12 +88,12 @@ struct WOLFSSH_CERTMAN {
8888 */
8989int wolfSSH_SetCertManager (WOLFSSH_CTX * ctx , WOLFSSL_CERT_MANAGER * cm )
9090{
91- if (ctx == NULL || cm == NULL ) {
91+ if (ctx == NULL || cm == NULL || ctx -> certMan == NULL ) {
9292 return WS_BAD_ARGUMENT ;
9393 }
9494
9595 /* free up existing cm if present */
96- if (ctx -> certMan != NULL && ctx -> certMan -> cm != NULL ) {
96+ if (ctx -> certMan -> cm != NULL ) {
9797 wolfSSL_CertManagerFree (ctx -> certMan -> cm );
9898 }
9999 wolfSSL_CertManager_up_ref (cm );
@@ -565,4 +565,96 @@ static int CheckProfile(DecodedCert* cert, int profile)
565565}
566566#endif /* WOLFSSH_NO_FPKI */
567567
568+
569+ #if defined(USE_WINDOWS_API )
570+ /* Parse a cert store spec string "store:subject:flags" into wide-string
571+ * components. Allocates wStoreName and wSubjectName via WMALLOC; caller
572+ * must WFREE them. dwFlags is set to the parsed flags value.
573+ * Returns WS_SUCCESS on success. */
574+ int wolfSSH_ParseCertStoreSpec (const char * spec ,
575+ wchar_t * * wStoreName , wchar_t * * wSubjectName ,
576+ DWORD * dwFlags , void * heap )
577+ {
578+ char * specCopy = NULL ;
579+ char * storeName = NULL ;
580+ char * subjectName = NULL ;
581+ char * flagsStr = NULL ;
582+ int wStoreNameLen , wSubjectNameLen ;
583+ size_t specLen ;
584+
585+ if (spec == NULL || wStoreName == NULL || wSubjectName == NULL ||
586+ dwFlags == NULL ) {
587+ return WS_BAD_ARGUMENT ;
588+ }
589+
590+ * wStoreName = NULL ;
591+ * wSubjectName = NULL ;
592+ * dwFlags = CERT_SYSTEM_STORE_CURRENT_USER ;
593+
594+ specLen = WSTRLEN (spec ) + 1 ;
595+ specCopy = (char * )WMALLOC (specLen , heap , DYNTYPE_TEMP );
596+ if (specCopy == NULL )
597+ return WS_MEMORY_E ;
598+ WSTRNCPY (specCopy , spec , specLen );
599+
600+ /* Parse "store:subject:flags" */
601+ storeName = specCopy ;
602+ subjectName = WSTRCHR (storeName , ':' );
603+ if (subjectName != NULL ) {
604+ * subjectName ++ = '\0' ;
605+ flagsStr = WSTRCHR (subjectName , ':' );
606+ if (flagsStr != NULL ) {
607+ * flagsStr ++ = '\0' ;
608+ if (WSTRCMP (flagsStr , "CURRENT_USER" ) == 0 ) {
609+ * dwFlags = CERT_SYSTEM_STORE_CURRENT_USER ;
610+ }
611+ else if (WSTRCMP (flagsStr , "LOCAL_MACHINE" ) == 0 ) {
612+ * dwFlags = CERT_SYSTEM_STORE_LOCAL_MACHINE ;
613+ }
614+ else {
615+ * dwFlags = (DWORD )atoi (flagsStr );
616+ }
617+ }
618+ }
619+
620+ if (storeName == NULL || subjectName == NULL || * storeName == '\0' ||
621+ * subjectName == '\0' ) {
622+ WFREE (specCopy , heap , DYNTYPE_TEMP );
623+ return WS_BAD_ARGUMENT ;
624+ }
625+
626+ /* Convert to wide strings */
627+ wStoreNameLen = MultiByteToWideChar (CP_UTF8 , 0 , storeName , -1 , NULL , 0 );
628+ wSubjectNameLen = MultiByteToWideChar (CP_UTF8 , 0 , subjectName , -1 ,
629+ NULL , 0 );
630+
631+ * wStoreName = (wchar_t * )WMALLOC (wStoreNameLen * sizeof (wchar_t ),
632+ heap , DYNTYPE_TEMP );
633+ * wSubjectName = (wchar_t * )WMALLOC (wSubjectNameLen * sizeof (wchar_t ),
634+ heap , DYNTYPE_TEMP );
635+
636+ if (* wStoreName == NULL || * wSubjectName == NULL ) {
637+ if (* wStoreName != NULL ) {
638+ WFREE (* wStoreName , heap , DYNTYPE_TEMP );
639+ * wStoreName = NULL ;
640+ }
641+ if (* wSubjectName != NULL ) {
642+ WFREE (* wSubjectName , heap , DYNTYPE_TEMP );
643+ * wSubjectName = NULL ;
644+ }
645+ WFREE (specCopy , heap , DYNTYPE_TEMP );
646+ return WS_MEMORY_E ;
647+ }
648+
649+ MultiByteToWideChar (CP_UTF8 , 0 , storeName , -1 ,
650+ * wStoreName , wStoreNameLen );
651+ MultiByteToWideChar (CP_UTF8 , 0 , subjectName , -1 ,
652+ * wSubjectName , wSubjectNameLen );
653+
654+ WFREE (specCopy , heap , DYNTYPE_TEMP );
655+ return WS_SUCCESS ;
656+ }
657+ #endif /* USE_WINDOWS_API */
658+
659+
568660#endif /* WOLFSSH_CERTS */
0 commit comments