/* Load CRL path files of type, SSL_SUCCESS on ok */ int LoadCRL(WOLFSSL_CRL* crl, const char* path, int type, int monitor) { struct dirent* entry; DIR* dir; int ret = SSL_SUCCESS; #ifdef WOLFSSL_SMALL_STACK char* name; #else char name[MAX_FILENAME_SZ]; #endif WOLFSSL_ENTER("LoadCRL"); if (crl == NULL) return BAD_FUNC_ARG; dir = opendir(path); if (dir == NULL) { WOLFSSL_MSG("opendir path crl load failed"); return BAD_PATH_ERROR; } #ifdef WOLFSSL_SMALL_STACK name = (char*)XMALLOC(MAX_FILENAME_SZ, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (name == NULL) return MEMORY_E; #endif while ( (entry = readdir(dir)) != NULL) { struct stat s; XMEMSET(name, 0, MAX_FILENAME_SZ); XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 2); XSTRNCAT(name, "/", 1); XSTRNCAT(name, entry->d_name, MAX_FILENAME_SZ/2); if (stat(name, &s) != 0) { WOLFSSL_MSG("stat on name failed"); continue; } if (s.st_mode & S_IFREG) { if (type == SSL_FILETYPE_PEM) { if (XSTRSTR(entry->d_name, ".pem") == NULL) { WOLFSSL_MSG("not .pem file, skipping"); continue; } } else { if (XSTRSTR(entry->d_name, ".der") == NULL && XSTRSTR(entry->d_name, ".crl") == NULL) { WOLFSSL_MSG("not .der or .crl file, skipping"); continue; } } if (ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl) != SSL_SUCCESS) { WOLFSSL_MSG("CRL file load failed, continuing"); } } } #ifdef WOLFSSL_SMALL_STACK XFREE(name, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif if (monitor & WOLFSSL_CRL_MONITOR) { word32 pathLen; char* pathBuf; WOLFSSL_MSG("monitor path requested"); pathLen = (word32)XSTRLEN(path); pathBuf = (char*)XMALLOC(pathLen+1, crl->heap,DYNAMIC_TYPE_CRL_MONITOR); if (pathBuf) { XSTRNCPY(pathBuf, path, pathLen); pathBuf[pathLen] = '\0'; /* Null Terminate */ if (type == SSL_FILETYPE_PEM) { crl->monitors[0].path = pathBuf; crl->monitors[0].type = SSL_FILETYPE_PEM; } else { crl->monitors[1].path = pathBuf; crl->monitors[1].type = SSL_FILETYPE_ASN1; } if (monitor & WOLFSSL_CRL_START_MON) { WOLFSSL_MSG("start monitoring requested"); ret = StartMonitorCRL(crl); } } else { ret = MEMORY_E; } } closedir(dir); return ret; }
/* Load CRL path files of type, SSL_SUCCESS on ok */ int LoadCRL(CYASSL_CRL* crl, const char* path, int type, int monitor) { struct dirent* entry; DIR* dir; int ret = SSL_SUCCESS; CYASSL_ENTER("LoadCRL"); if (crl == NULL) return BAD_FUNC_ARG; dir = opendir(path); if (dir == NULL) { CYASSL_MSG("opendir path crl load failed"); return BAD_PATH_ERROR; } while ( (entry = readdir(dir)) != NULL) { char name[MAX_FILENAME_SZ]; struct stat s; XMEMSET(name, 0, sizeof(name)); XSTRNCPY(name, path, MAX_FILENAME_SZ/2 - 2); XSTRNCAT(name, "/", 1); XSTRNCAT(name, entry->d_name, MAX_FILENAME_SZ/2); if (stat(name, &s) != 0) { CYASSL_MSG("stat on name failed"); continue; } if (s.st_mode & S_IFREG) { if (type == SSL_FILETYPE_PEM) { if (strstr(entry->d_name, ".pem") == NULL) { CYASSL_MSG("not .pem file, skipping"); continue; } } else { if (strstr(entry->d_name, ".der") == NULL && strstr(entry->d_name, ".crl") == NULL) { CYASSL_MSG("not .der or .crl file, skipping"); continue; } } if (ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl) != SSL_SUCCESS) { CYASSL_MSG("CRL file load failed, continuing"); } } } if (monitor & CYASSL_CRL_MONITOR) { CYASSL_MSG("monitor path requested"); if (type == SSL_FILETYPE_PEM) { crl->monitors[0].path = strdup(path); crl->monitors[0].type = SSL_FILETYPE_PEM; if (crl->monitors[0].path == NULL) ret = MEMORY_E; } else { crl->monitors[1].path = strdup(path); crl->monitors[1].type = SSL_FILETYPE_ASN1; if (crl->monitors[1].path == NULL) ret = MEMORY_E; } if (monitor & CYASSL_CRL_START_MON) { CYASSL_MSG("start monitoring requested"); ret = StartMonitorCRL(crl); } } closedir(dir); return ret; }