DWORD VMCARESTSetResponsePayload( PVMREST_HANDLE pRESTHandle, PREST_RESPONSE* ppResponse, PSTR pszRespPayload ) { DWORD dwError = 0; DWORD bytesWritten = 0; PSTR pszPyldLen = NULL; size_t pyldLen = 0; size_t sentLen = 0; pyldLen = VMCAStringLenA(VMCA_SAFE_STRING(pszRespPayload)); dwError = VMCAAllocateStringPrintfA(&pszPyldLen, "%ld", pyldLen); BAIL_ON_VMREST_ERROR(dwError); dwError = VmRESTSetDataLength( ppResponse, pyldLen > VMCARESTMAXPAYLOADLENGTH ? NULL : pszPyldLen); BAIL_ON_VMREST_ERROR(dwError); do { size_t chunkLen = pyldLen > VMCARESTMAXPAYLOADLENGTH ? VMCARESTMAXPAYLOADLENGTH : pyldLen; dwError = VmRESTSetData( pRESTHandle, ppResponse, VMCA_SAFE_STRING(pszRespPayload) + sentLen, chunkLen, &bytesWritten); sentLen += bytesWritten; pyldLen -= bytesWritten; } while (dwError == REST_ENGINE_MORE_IO_REQUIRED); BAIL_ON_VMREST_ERROR(dwError); cleanup: VMCA_SAFE_FREE_MEMORY(pszPyldLen); return dwError; error: goto cleanup; }
static DWORD InitializeDatabase( VOID ) { DWORD dwError = 0 ; PSTR pszCertDBPath = NULL; dwError = VMCACreateDataDirectory(); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAGetCertsDBPath(&pszCertDBPath); BAIL_ON_VMCA_ERROR(dwError); VMCA_LOG_INFO( "Initializing database: [%s]", VMCA_SAFE_STRING(pszCertDBPath)); dwError = VmcaDbInitialize(pszCertDBPath); BAIL_ON_VMCA_ERROR(dwError); error: VMCA_SAFE_FREE_STRINGA(pszCertDBPath); return dwError; }
static DWORD _VMCAGetSSLCert( VMCA_LIB_HANDLE plibHandle, PSTR* ppszCert, PSTR* ppszKey ) { DWORD dwError = 0; PSTR pszCert = NULL; PSTR pszKey = NULL; PVECS_STORE pVECSStore = NULL; PVECS_CERT_ENTRY_A pCertEntry = NULL; if (plibHandle == NULL || ppszCert == NULL || ppszKey == NULL) { dwError = VMCA_ARGUMENT_ERROR; goto cleanup; } fpVecsOpenCertStoreA fpOpenStore = NULL; fpVecsGetEntryByAliasA fpGetEntry = NULL; fpVecsGetKeyByAliasA fpGetKey = NULL; fpVecsCloseCertStore fpCloseStore = NULL; fpVecsFreeCertEntryA fpFreeEntry = NULL; if ( (fpOpenStore = (fpVecsOpenCertStoreA) VMCAGetLibSym(plibHandle, FN_VECS_OPEN_CERT_STORE_A) ) == NULL || (fpGetEntry = (fpVecsGetEntryByAliasA) VMCAGetLibSym(plibHandle, FN_VECS_GET_ENTRY_BY_ALIAS_A) ) == NULL || (fpGetKey = (fpVecsGetKeyByAliasA) VMCAGetLibSym(plibHandle, FN_VECS_GET_KEY_BY_ALIAS_A) ) == NULL || (fpCloseStore = (fpVecsCloseCertStore) VMCAGetLibSym(plibHandle, FN_VECS_CLOSE_CERT_STORE) ) == NULL || (fpFreeEntry = (fpVecsFreeCertEntryA) VMCAGetLibSym(plibHandle, FN_VECS_FREE_ENTRY_A) ) == NULL ) { #ifdef _WIN32 VMCA_LOG_ERROR("VECS sym lookup failed, %d", WSAGetLastError()); #else VMCA_LOG_ERROR("VECS sym lookup failed, %s", VMCA_SAFE_STRING(dlerror())); #endif dwError = VMCA_UNKNOW_ERROR; } BAIL_ON_VMCA_ERROR(dwError); dwError = (*fpOpenStore)( "localhost", MACHINE_CERT_STORE_NAME, NULL, &pVECSStore ); BAIL_ON_VECS_ERROR(dwError); dwError = (*fpGetEntry)( pVECSStore, MACHINE_CERT_ALIAS, ENTRY_INFO_LEVEL_2, &pCertEntry ); BAIL_ON_VECS_ERROR(dwError); dwError = (*fpGetKey)( pVECSStore, MACHINE_CERT_ALIAS, NULL, &pszKey ); BAIL_ON_VECS_ERROR(dwError); dwError = VMCAAllocateStringA( pCertEntry->pszCertificate, &pszCert ); BAIL_ON_VECS_ERROR(dwError); *ppszCert = pszCert; *ppszKey = pszKey; cleanup: if ( fpFreeEntry && pCertEntry ) { (*fpFreeEntry)(pCertEntry); } if ( fpCloseStore && pVECSStore ) { (*fpCloseStore)(pVECSStore); } return dwError; error: *ppszCert = NULL; *ppszKey = NULL; VMCA_SAFE_FREE_MEMORY(pszCert); VMCA_SAFE_FREE_MEMORY(pszKey); VMCA_LOG_ERROR("%s failed, error (%u)", __FUNCTION__, dwError); goto cleanup; vecs_error: goto cleanup; }