unsigned int RpcVMCAEnumCertificates( handle_t IDL_handle, CERTIFICATE_STATUS dwStatus, unsigned int dwStartIndex, unsigned int dwNumCertificates, VMCA_CERTIFICATE_ARRAY** ppCertArray) { DWORD dwError = 0; VMCA_CERTIFICATE_ARRAY* pTempCertArray = NULL; VMCA_CERTIFICATE_ARRAY* pCertArray = NULL; VMCA_LOG_DEBUG("Entering %s", __FUNCTION__); if (ppCertArray == NULL) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMCA_ERROR(dwError); } dwError = VMCACheckAccess(IDL_handle, TRUE); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCAEnumCertificates( dwStartIndex, dwNumCertificates, dwStatus, &pTempCertArray); BAIL_ON_VMCA_ERROR(dwError); dwError = RpcVMCACopyCertificateToRPC( pTempCertArray, &pCertArray); BAIL_ON_VMCA_ERROR(dwError); *ppCertArray = pCertArray; cleanup: if (pTempCertArray) { VMCAFreeCertificateArray(pTempCertArray); } VMCA_LOG_DEBUG("Exiting %s, Status = %d", __FUNCTION__, dwError); return dwError; error: if (ppCertArray) { *ppCertArray = NULL; } if (pCertArray) { VMCARpcFreeCertificateArray(pCertArray); } goto cleanup; }
// 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; }
unsigned int VMCAEnumCertificates( unsigned int dwStartIndex, unsigned int dwNumCertificates, CERTIFICATE_STATUS dwStatus, VMCA_CERTIFICATE_ARRAY** ppCertArray ) { DWORD dwError = 0; PVMCA_DB_CONTEXT pDbContext = NULL; PVMCA_CERTIFICATE_ARRAY pCertArray = NULL; PVMCA_DB_CERTIFICATE_ENTRY pDbCertEntryArray = NULL; DWORD dwDbCertEntryNums = 0; BOOLEAN bLocked = FALSE; VMCA_LOCK_MUTEX_SHARED(&gVMCAServerGlobals.svcMutex, bLocked); dwError = VMCASrvValidateCA(); BAIL_ON_VMCA_ERROR(dwError); dwError = VmcaDbCreateContext(&pDbContext); BAIL_ON_VMCA_ERROR(dwError); dwError = VMCADbEnumCerts( pDbContext, dwStartIndex, dwNumCertificates, dwStatus, &pDbCertEntryArray, &dwDbCertEntryNums); BAIL_ON_VMCA_ERROR(dwError); // convert db struct into rpc struct ... dwError = VMCACloneCertContainerFromDbCertEntryArray( pDbCertEntryArray, dwDbCertEntryNums, &pCertArray); BAIL_ON_VMCA_ERROR(dwError); *ppCertArray = pCertArray; cleanup: VMCA_LOCK_MUTEX_UNLOCK(&gVMCAServerGlobals.svcMutex, bLocked); if (pDbContext) { VmcaDbReleaseContext(pDbContext); } if (pDbCertEntryArray) { VmcaDbFreeCertEntryArray(pDbCertEntryArray, dwDbCertEntryNums); } // if 0 certificate returned, then we need to set memory to NULL to make sure no rpc free being called on grabage pointer. if (pCertArray){ if (pCertArray->dwCount == 0){ pCertArray->certificates = NULL; VMCARpcFreeCertificateArray(pCertArray); pCertArray = NULL; } } return dwError; error: *ppCertArray = NULL; if (pCertArray) { VMCARpcFreeCertificateArray(pCertArray); } goto cleanup; }