Example #1
0
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;
}
Example #2
0
// 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;
}
Example #3
0
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;
}
Example #4
0
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;
}