Beispiel #1
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;
}
Beispiel #2
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}