(file) Return to encrypt.c CVS log (file) (dir) Up to [OMI] / omi / pal

File: [OMI] / omi / pal / encrypt.c (download)
Revision: 1.1, Mon Apr 20 17:19:55 2015 UTC (9 years ago) by krisbash
Branch: MAIN
CVS Tags: OMI_1_0_8_2, OMI_1_0_8_1, HEAD
OMI 1.0.8-1

#include "encrypt.h"

#if defined(_MSC_VER)
#include <wincrypt.h>
#endif

_Success_(return == 0)
int EncryptData(
    _In_bytecount_(inbufferLength) const void *inbuffer, 
    PAL_Uint32 inbufferLength, 
    _Out_writes_bytes_to_opt_(outbufferLength, *outbufferLengthNeeded) void *outbuffer, 
    PAL_Uint32 outbufferLength, 
    _When_(return == -2, _Out_) _When_(return == 0, _Out_)  PAL_Uint32 *outbufferLengthNeeded)
{
    PAL_Uint32 realOutBufferNeeded = inbufferLength;

    if (outbufferLengthNeeded == NULL)
        return -1;

#if defined (_MSC_VER)
    if (inbufferLength%CRYPTPROTECTMEMORY_BLOCK_SIZE)
    {
        realOutBufferNeeded += (CRYPTPROTECTMEMORY_BLOCK_SIZE-(inbufferLength%CRYPTPROTECTMEMORY_BLOCK_SIZE));
    }
#endif

    *outbufferLengthNeeded = realOutBufferNeeded;

    if (inbuffer == NULL)
        return -1;

    if (outbufferLength < realOutBufferNeeded)
        return -2;

    if (outbuffer == NULL)
        return -1;

    memcpy(outbuffer, inbuffer, inbufferLength);

#if defined(_MSC_VER)
    if (!CryptProtectMemory(outbuffer, realOutBufferNeeded, CRYPTPROTECTMEMORY_SAME_PROCESS))
    {
        //printf("error = %u\n", GetLastError());
        SecureZeroMemory(outbuffer, outbufferLength);
        return -1;
    }
#endif
    return 0;
}



_Success_(return == 0)
int DecryptData(
    _In_bytecount_(inbufferLength) const void *inbuffer, 
    PAL_Uint32 inbufferLength, 
    _Out_writes_bytes_to_opt_(outbufferLength, *outbufferLengthNeeded) void *outbuffer, 
    PAL_Uint32 outbufferLength, 
    _When_(return == -2, _Out_) _When_(return == 0, _Out_)  PAL_Uint32 *outbufferLengthNeeded)
{
    PAL_Uint32 realOutBufferNeeded = inbufferLength;

    if (outbufferLengthNeeded == NULL)
        return -1;

    *outbufferLengthNeeded = realOutBufferNeeded;

#if defined (_MSC_VER)
    if (inbufferLength%CRYPTPROTECTMEMORY_BLOCK_SIZE)
    {
        *outbufferLengthNeeded += (CRYPTPROTECTMEMORY_BLOCK_SIZE-(inbufferLength%CRYPTPROTECTMEMORY_BLOCK_SIZE));
        return -1;
    }
#endif


    if (inbuffer == NULL)
        return -1;

    if (outbufferLength < realOutBufferNeeded)
        return -2;

    if (outbuffer == NULL)
        return -1;

    memcpy(outbuffer, inbuffer, inbufferLength);

#if defined(_MSC_VER)
    if (!CryptUnprotectMemory(outbuffer, realOutBufferNeeded, CRYPTPROTECTMEMORY_SAME_PROCESS))
    {
        SecureZeroMemory(outbuffer, outbufferLength);
        return -1;
    }
#endif
    return 0;
}

ViewCVS 0.9.2