// db entry util unsigned int VMCACloneCertContainerFromDbCertEntryArray( PVMCA_DB_CERTIFICATE_ENTRY pDbCertEntryArray, DWORD dwDbCertEntryNums, VMCA_CERTIFICATE_ARRAY** ppCertArray ) { DWORD dwError = 0; PVMCA_CERTIFICATE_ARRAY pCertArray = NULL; dwError = VMCARpcAllocateMemory( sizeof(VMCA_CERTIFICATE_ARRAY), (PVOID*)&pCertArray); BAIL_ON_VMCA_ERROR(dwError); // get array size pCertArray->dwCount = dwDbCertEntryNums; if (pCertArray->dwCount > 0) { DWORD iEntry = 0; dwError = VMCARpcAllocateMemory( pCertArray->dwCount * sizeof(pCertArray->certificates[0]), (PVOID*)&pCertArray->certificates); BAIL_ON_VMCA_ERROR(dwError); for (; iEntry < pCertArray->dwCount; iEntry++) { PVMCA_DB_CERTIFICATE_ENTRY pDbCertEntrySrc = &pDbCertEntryArray[iEntry]; PVMCA_CERTIFICATE_CONTAINER pCertContainerDst = &pCertArray->certificates[iEntry]; // copy pCert string to container dwError = VMCAClonePkgEntryContentsFromDbPkgEntry( pDbCertEntrySrc, pCertContainerDst); BAIL_ON_VMCA_ERROR(dwError); } } *ppCertArray = pCertArray; cleanup: return dwError; error: *ppCertArray = NULL; if (pCertArray) { VMCARpcFreeCertificateArray(pCertArray); } goto cleanup; }
DWORD RpcVMCACopyCertificateToRPC( VMCA_CERTIFICATE_ARRAY* pInputCertArray, VMCA_CERTIFICATE_ARRAY** pOutputCertArray ) { DWORD dwError = 0; VMCA_CERTIFICATE_ARRAY* pCertArray = NULL; dwError = VMCARpcAllocateMemory( sizeof(VMCA_CERTIFICATE_ARRAY), (PVOID*)&pCertArray); BAIL_ON_VMCA_ERROR(dwError); pCertArray->dwCount = pInputCertArray->dwCount; if (pCertArray->dwCount > 0) { DWORD iEntry = 0; dwError = VMCARpcAllocateMemory( pCertArray->dwCount * sizeof(pCertArray->certificates[0]), (PVOID*)&pCertArray->certificates); BAIL_ON_VMCA_ERROR(dwError); for (; iEntry < pCertArray->dwCount; iEntry++) { pCertArray->certificates[iEntry].dwCount = pInputCertArray->certificates[iEntry].dwCount; dwError = VMCARpcAllocateString( (RP_PSTR)pInputCertArray->certificates[iEntry].pCert, (RP_PSTR*)&pCertArray->certificates[iEntry].pCert); BAIL_ON_VMCA_ERROR(dwError); } } *pOutputCertArray = pCertArray; cleanup: return dwError; error: if (pCertArray) { VMCARpcFreeCertificateArray(pCertArray); } goto cleanup; }
DWORD VMCARpcAllocateCertificateContainer(PSTR pCert, PVMCA_CERTIFICATE_CONTAINER *ppCertContainer) { DWORD dwError = 0; dwError = VMCARpcAllocateMemory(sizeof(VMCA_CERTIFICATE_CONTAINER) ,(PVOID*)ppCertContainer); BAIL_ON_VMCA_ERROR(dwError); memset(*ppCertContainer, 0 , sizeof(VMCA_CERTIFICATE_CONTAINER)); (*ppCertContainer)->dwCount = (unsigned long)strlen(pCert); dwError = VMCARpcAllocateMemory(strlen(pCert)+1, (PVOID*) &((*ppCertContainer)->pCert)); BAIL_ON_VMCA_ERROR(dwError); memset((*ppCertContainer)->pCert, 0 ,strlen(pCert)+1); error : if (dwError != 0) { VMCARpcFreeCertificateContainer(*ppCertContainer); } return dwError; }
DWORD VMCARpcAllocateStringW( RP_PWSTR pwszSrc, RP_PWSTR* ppwszDst ) { DWORD dwError = 0; size_t len = 0; RP_PWSTR pwszDst = NULL; if (!pwszSrc || !ppwszDst) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } dwError = LwWc16sLen(pwszSrc, &len); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory( sizeof(RP_WSTR) * (len + 1), (PVOID*)&pwszDst); BAIL_ON_VMCA_ERROR(dwError); dwError = LwWc16snCpy(pwszDst, pwszSrc, len); BAIL_ON_VMCA_ERROR(dwError); *ppwszDst = pwszDst; cleanup: return dwError; error: if (ppwszDst) { *ppwszDst = NULL; } if (pwszDst) { VMCARpcFreeMemory(pwszDst); } goto cleanup; }
DWORD VMCARpcAllocateString( PSTR pszSrc, PSTR* ppszDst ) { DWORD dwError = 0; size_t len = 0; PSTR pszDst = NULL; if (!pszSrc || !ppszDst) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } len = strlen(pszSrc); // + 1 for \'0' dwError = VMCARpcAllocateMemory( sizeof(RP_STR) * (len + 1), (PVOID*)&pszDst); BAIL_ON_VMCA_ERROR(dwError); memcpy(pszDst, pszSrc, len); *ppszDst = pszDst; cleanup: return dwError; error: if (ppszDst) { *ppszDst = NULL; } if (pszDst) { VMCARpcFreeMemory(pszDst); } goto cleanup; }
unsigned int VMCAGetCRL( unsigned char *pszClientCachedCRLID, unsigned int dwFileOffset, unsigned int dwSize, VMCA_FILE_BUFFER **ppCRLData ) { DWORD dwError = 0; PVMCA_FILE_BUFFER pCRLData = NULL; DWORD dwCount = 0; PSTR pszCRLFile = NULL; unsigned char buff[FILE_CHUNK] = { 0 }; BOOLEAN bLocked = FALSE; VMCA_LOCK_MUTEX_SHARED(&gVMCAServerGlobals.svcMutex, bLocked); dwError = VMCASrvValidateCA(); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAGetCRLNamePath(&pszCRLFile); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory( sizeof(VMCA_FILE_BUFFER), (PVOID*)&pCRLData); BAIL_ON_VMCA_ERROR(dwError); memset(pCRLData, 0, sizeof(VMCA_FILE_BUFFER)); dwError = VMCAReadDataFromFile( pszCRLFile, dwFileOffset, dwSize, (char*)&buff, &dwCount); BAIL_ON_VMCA_ERROR(dwError); if (dwCount > 0) { dwError = VMCARpcAllocateMemory(dwCount * sizeof(unsigned char), (PVOID*) &pCRLData->buffer); BAIL_ON_VMCA_ERROR(dwError); memcpy((PVOID) pCRLData->buffer, buff,(size_t) dwCount); } pCRLData->dwCount = dwCount; *ppCRLData = pCRLData; cleanup : VMCA_LOCK_MUTEX_UNLOCK(&gVMCAServerGlobals.svcMutex, bLocked); VMCA_SAFE_FREE_STRINGA(pszCRLFile); return dwError; error: if(pCRLData != NULL) { if(pCRLData->buffer != NULL) { VMCARpcFreeMemory((PVOID) pCRLData->buffer); } VMCARpcFreeMemory((PVOID)pCRLData); } if(ppCRLData) { *ppCRLData = NULL; } goto cleanup; }
unsigned int RpcVMCAGetCRL( handle_t IDL_handle, unsigned char *pszClientCachedCRLID, unsigned int dwFileOffset, unsigned int dwSize, VMCA_FILE_BUFFER **ppCRLData ) { DWORD dwError = 0; VMCA_FILE_BUFFER* pTempCRLData = NULL; VMCA_FILE_BUFFER* pCRLData = NULL; VMCA_LOG_DEBUG("Entering %s", __FUNCTION__); if(ppCRLData == NULL) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } dwError = VMCACheckAccess(IDL_handle, FALSE); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAGetCRL( dwFileOffset, dwSize, &pTempCRLData); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCARpcAllocateMemory ( sizeof(pCRLData), (PVOID*) &pCRLData ); BAIL_ON_VMCA_ERROR(dwError); pCRLData->dwCount = pTempCRLData->dwCount; if(pCRLData->dwCount > 0) { dwError = VMCARpcAllocateMemory( pCRLData->dwCount * sizeof(unsigned char), (PVOID*) &pCRLData->buffer); BAIL_ON_VMCA_ERROR(dwError); memcpy( (PVOID*) pCRLData->buffer, pTempCRLData->buffer, (size_t) pCRLData->dwCount); } *ppCRLData = pCRLData; pTempCRLData = NULL; cleanup: if ( pTempCRLData ) { VMCA_SAFE_FREE_MEMORY(pTempCRLData->buffer); VMCA_SAFE_FREE_MEMORY(pTempCRLData); } VMCA_LOG_DEBUG("Exiting %s, Status = %d", __FUNCTION__, dwError); return dwError; error: if (ppCRLData) { *ppCRLData = NULL; } if(pCRLData) { if(pCRLData->buffer) { VMCARpcFreeMemory((PVOID) pCRLData->buffer); } VMCARpcFreeMemory((PVOID)pCRLData); } goto cleanup; }