driverinterfacecypher.c

来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C语言 代码 · 共 528 行 · 第 1/2 页

C
528
字号
// =========================================================================
// EncryptNotDecrypt - Set to TRUE to encrypt, FALSE to decrypt
BOOL _driver_CypherEncryptDecryptData(
    BOOL EncryptNotDecrypt,
    WCHAR* CypherDriverFilename,
    GUID CypherGUID,
    unsigned int KeySize, // In *bits*
    FREEOTFEBYTE* Key,
    unsigned int IVSize, // In *bits*
    FREEOTFEBYTE* IV,
    unsigned int BufferSize, // In bytes
    FREEOTFEBYTE* BufferIn,
    FREEOTFEBYTE* BufferOut
)
{
    BOOL retval = FALSE;
    MODULE_DETAILS_CYPHER DLLDetails;
    DIOC_CYPHER_DATA_IN* DIOCIn;
    unsigned int DIOCInSize;    
    FREEOTFEBYTE* ptrKey;
    FREEOTFEBYTE* ptrIV;
    FREEOTFEBYTE* ptrData;

    DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("_driver_CypherEncryptDecryptData\n")));

    if (driver_CypherLoadDLL(CypherDriverFilename, &DLLDetails))
        {
        DIOCInSize = sizeof(*DIOCIn) - 
                     sizeof(DIOCIn->Key) - 
                     sizeof(DIOCIn->IV) - 
                     sizeof(DIOCIn->Data) +
                     (KeySize / 8) +
                     (IVSize / 8) + 
                     BufferSize;

        DIOCIn = malloc(DIOCInSize);
        if (DIOCIn == NULL) 
            {
            DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Unable to malloc DIOC in buffer\n")));
            }
        else
            {
            DIOCIn->CypherGUID = CypherGUID;
            DIOCIn->KeyLength = KeySize;
            DIOCIn->IVLength = IVSize;
            DIOCIn->DataLength = BufferSize;

            ptrKey  = DIOCIn->Key;
            ptrIV   = ptrKey + (KeySize / 8);
            ptrData = ptrIV + (IVSize / 8);

            memcpy(ptrKey, Key, (KeySize / 8));
            memcpy(ptrIV, IV, (IVSize / 8));
            memcpy(ptrData, BufferIn, BufferSize);
                
            if (EncryptNotDecrypt)
                {
                retval = (DLLDetails.FnEncrypt(
                                               DIOCInSize,
                                               DIOCIn,
                                               BufferSize,
                                               (DIOC_CYPHER_DATA_OUT*)BufferOut
                                              ) == ERROR_SUCCESS);
                }
            else
                {
                retval = (DLLDetails.FnDecrypt(
                                               DIOCInSize,
                                               DIOCIn,
                                               BufferSize,
                                               (DIOC_CYPHER_DATA_OUT*)BufferOut
                                              ) == ERROR_SUCCESS);
                }

            SecZeroAndFreeMemory(DIOCIn, DIOCInSize);
            }

        driver_CypherUnloadDLL(&DLLDetails);
        }

    DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("_driver_CypherEncryptDecryptData\n")));
    return retval;
}


// =========================================================================
BOOL driver_CypherEncryptData(
    WCHAR* CypherDriverFilename,
    GUID CypherGUID,
    unsigned int keySize, // In *bits*
    FREEOTFEBYTE* Key,
    unsigned int IVSize, // In *bits*
    FREEOTFEBYTE* IV,
    unsigned int blockSize, // In bytes
    FREEOTFEBYTE* plaintextBuffer,
    FREEOTFEBYTE* encryptedBuffer
)
{
    return _driver_CypherEncryptDecryptData(
                               TRUE,
                               CypherDriverFilename,
                               CypherGUID,
                               keySize, // In *bits*
                               Key,
                               IVSize, // In *bits*
                               IV,
                               blockSize, // In bytes
                               plaintextBuffer,
                               encryptedBuffer
                              );
}


// =========================================================================
BOOL driver_CypherDecryptData(
    WCHAR* CypherDriverFilename,
    GUID CypherGUID,
    unsigned int keySize, // In *bits*
    FREEOTFEBYTE* Key,
    unsigned int IVSize, // In *bits*
    FREEOTFEBYTE* IV,
    unsigned int blockSize, // In bytes
    FREEOTFEBYTE* encryptedBuffer,
    FREEOTFEBYTE* plaintextBuffer
)
{
    return _driver_CypherEncryptDecryptData(
                               FALSE,
                               CypherDriverFilename,
                               CypherGUID,
                               keySize, // In *bits*
                               Key,
                               IVSize, // In *bits*
                               IV,
                               blockSize, // In bytes
                               encryptedBuffer,
                               plaintextBuffer
                              );
}


// =========================================================================
void driver_CypherPrettyprintAlgTitle(
    CYPHER* cypherInfo, 
    WCHAR* buffer,
    int bufferSize  // In bytes
)
{
    WCHAR strMode[10];  // Enough to hold any cypher mode as a string
    WCHAR tmpStrBuf[1024];  // 1024 relativly arbitary; must be big enough to
                            // store a full prettyprinted hash/cypher title

    // Convert straight ASCII title to UNICODE
    memset(tmpStrBuf, 0, sizeof(tmpStrBuf));
    mbstowcs(
             tmpStrBuf, 
             cypherInfo->Title, 
             strlen(cypherInfo->Title)
            ); 

    // Conver cypher mode to UNICODE string representation
    memset(strMode, 0, sizeof(strMode));
    driver_CypherPrettyprintAlgMode(
                                    cypherInfo->Mode,
                                    strMode
                                   );

    // Prettyprint to buffer
    _snwprintf(
              buffer,
              (bufferSize / sizeof(buffer[0])),
              STR_FORMAT_FULL_CYPHER_TITLE,
              tmpStrBuf,
              strMode,
              cypherInfo->KeySize,
              cypherInfo->BlockSize
             );

    SecZeroMemory(tmpStrBuf, sizeof(tmpStrBuf));
}


// =========================================================================
// !! IMPORTANT !!
// Buffer **MUST** be large enough to store mode as UNICODE string!
// (Obvious, but...)
void driver_CypherPrettyprintAlgMode(
    CYPHER_MODE mode,
    WCHAR* buffer
)
{
    switch (mode)
        {
        case CYPHER_MODE_NONE:
            {
            wcscpy(buffer, TEXT("None"));
            break;
            }

        case CYPHER_MODE_ECB:
            {
            wcscpy(buffer, TEXT("ECB"));
            break;
            }

        case CYPHER_MODE_CBC:
            {
            wcscpy(buffer, TEXT("CBC"));
            break;
            }

        default:
            {
            wcscpy(buffer, STR_UNKNOWN);
            break;
            }
        }

}


// =========================================================================
BOOL
driver_CypherGetImplDetails(
    WCHAR* CypherFilename, 
    GUID* CypherImpl, 
    CYPHER* ImplDetails
)
{
    BOOL retval = FALSE;
    CYPHER_DRIVER_INFO cypherInfo;
    unsigned int i;

    DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("driver_CypherGetImplDetails\n")));

    if (driver_CypherGetDriverDetails(
                                    CypherFilename,
                                    &cypherInfo
                                   ))
        {
        for (i = 0; i < cypherInfo.CypherCount; i++)
            {
            if (IsEqualGUID(
                            CypherImpl,
                            &(cypherInfo.CypherDetails[i].CypherGUID)
                           ))
                {
                *ImplDetails = cypherInfo.CypherDetails[i];
                retval = TRUE;
                break;
                }
            }

        driver_CypherFreeDriverDetails(&cypherInfo);
        }

    DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("driver_CypherGetImplDetails\n")));
    return retval;
}


// =========================================================================
// =========================================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?