⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sadvapi.cpp

📁 windows的加密api源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    if( fRet ) {
        *phHash = (HCRYPTHASH) pVNewHash;
        return TRUE;
    }

    if (pVNewHash)
        LocalFree(pVNewHash);

    __try {
        *phHash = 0;
    } __except( EXCEPTION_EXECUTE_HANDLER ) {
        ; // gulp
    }

    return FALSE;

}

/*
 -  CryptHashData
 -
 *  Purpose:
 *                Compute the cryptograghic hash on a stream of data
 *
 *
 *  Parameters:
 *               IN  hHash     -  Handle to hash object
 *               IN  pbData    -  Pointer to data to be hashed
 *               IN  dwDataLen -  Length of the data to be hashed
 *               IN  dwFlags   -  Flags values
 *
 *
 *  Returns:
 */
BOOL
WINAPI SCryptHashData(IN HCRYPTHASH hHash,
                     IN CONST BYTE *pbData,
                     IN DWORD dwDataLen,
                     IN DWORD dwFlags)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;


    __try {
        pVTable = pVHash->pVTable;

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPHashData(
                        pVTable->hProv,
                        pVHash->hHash,
                        pbData,
                        dwDataLen,
                        dwFlags
                        );

    } __except( EXCEPTION_EXECUTE_HANDLER ) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}

/*
 -  CryptHashSessionKey
 -
 *  Purpose:
 *                Compute the cryptograghic hash on a key object
 *
 *
 *  Parameters:
 *               IN  hHash     -  Handle to hash object
 *               IN  hKey      -  Handle to a key object
 *               IN  dwFlags   -  Flags values
 *
 *  Returns:
 *               CRYPT_FAILED
 *               CRYPT_SUCCEED
 */
BOOL
WINAPI SCryptHashSessionKey(IN HCRYPTHASH hHash,
                           IN HCRYPTKEY hKey,
                           IN DWORD dwFlags)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    PVKeyStruc      pVKey = (PVKeyStruc) hKey;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;


    __try {
        pVTable = pVHash->pVTable;

        if (pVKey->pVTable != pVTable)
        {
            SetLastError(ERROR_INVALID_PARAMETER);
            return FALSE;
        }

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPHashSessionKey(
                        pVTable->hProv,
                        pVHash->hHash,
                        pVKey->hKey,
                        dwFlags
                        );
    } __except( EXCEPTION_EXECUTE_HANDLER ) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}


/*
 -  CryptDestoyHash
 -
 *  Purpose:
 *                Destory the hash object
 *
 *
 *  Parameters:
 *               IN  hHash     -  Handle to hash object
 *
 *  Returns:
 */
BOOL
WINAPI SCryptDestroyHash(IN HCRYPTHASH hHash)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;


    __try {
        pVTable = pVHash->pVTable;

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPDestroyHash(pVTable->hProv, pVHash->hHash);
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    LocalFree(pVHash);

    return fRet;
}


/*
 -      CryptSignHashW
 -
 *      Purpose:
 *                Create a digital signature from a hash
 *
 *
 *      Parameters:
 *               IN  hHash        -  Handle to hash object
 *               IN  dwKeySpec    -  Key pair that is used to sign with
 *                                   algorithm to be used
 *               IN  sDescription -  Description of data to be signed
 *               IN  dwFlags      -  Flags values
 *               OUT pbSignture   -  Pointer to signature data
 *               OUT pdwSigLen    -  Pointer to the len of the signature data
 *
 *      Returns:
 */
BOOL
WINAPI SCryptSignHashW(IN  HCRYPTHASH hHash,
              IN  DWORD dwKeySpec,
              IN  LPCWSTR sDescription,
              IN  DWORD dwFlags,
              OUT BYTE *pbSignature,
              OUT DWORD *pdwSigLen)
{
    SetLastError(ERROR_NOT_SUPPORTED);
    return FALSE;
}

BOOL
WINAPI SCryptSignHashA(IN  HCRYPTHASH hHash,
              IN  DWORD dwKeySpec,
              IN  LPCSTR sDescription,
              IN  DWORD dwFlags,
              OUT BYTE *pbSignature,
              OUT DWORD *pdwSigLen)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;

    __try {
        pVTable = pVHash->pVTable;

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPSignHash(
                        pVTable->hProv,
                        pVHash->hHash,
                        dwKeySpec,
                        NULL,
                        dwFlags,
                        pbSignature,
                        pdwSigLen
                        );
    } __except( EXCEPTION_EXECUTE_HANDLER ) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}

/*
 -      CryptVerifySignatureW
 -
 *      Purpose:
 *                Used to verify a signature against a hash object
 *
 *
 *      Parameters:
 *               IN  hHash        -  Handle to hash object
 *               IN  pbSignture   -  Pointer to signature data
 *               IN  dwSigLen     -  Length of the signature data
 *               IN  hPubKey      -  Handle to the public key for verifying
 *                                   the signature
 *               IN  sDescription -  String describing the signed data
 *               IN  dwFlags      -  Flags values
 *
 *      Returns:
 */
BOOL
WINAPI SCryptVerifySignatureW(IN HCRYPTHASH hHash,
                 IN CONST BYTE *pbSignature,
                 IN DWORD dwSigLen,
                 IN HCRYPTKEY hPubKey,
                 IN LPCWSTR sDescription,
                 IN DWORD dwFlags)
{
    SetLastError(ERROR_NOT_SUPPORTED);
    return FALSE;
}

BOOL
WINAPI SCryptVerifySignatureA(IN HCRYPTHASH hHash,
                 IN CONST BYTE *pbSignature,
                 IN DWORD dwSigLen,
                 IN HCRYPTKEY hPubKey,
                 IN LPCSTR sDescription,
                 IN DWORD dwFlags)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    PVKeyStruc      pVPubKey = (PVKeyStruc) hPubKey;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;


    __try {
        pVTable = pVHash->pVTable;

        if (pVPubKey && pVPubKey->pVTable != pVTable)
        {
            SetLastError(ERROR_INVALID_PARAMETER);
            return FALSE;
        }

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPVerifySignature(
                            pVTable->hProv,
                            pVHash->hHash,
                            pbSignature,
                            dwSigLen,
                            (pVPubKey == NULL ? 0 : pVPubKey->hKey),
                            NULL,
                            dwFlags
                            );
    } __except( EXCEPTION_EXECUTE_HANDLER ) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}

/*
 -      CryptSetProvParam
 -
 *      Purpose:
 *                Allows applications to customize various aspects of the
 *                operations of a provider
 *
 *      Parameters:
 *               IN      hProv   -  Handle to a provider
 *               IN      dwParam -  Parameter number
 *               IN      pbData  -  Pointer to data
 *               IN      dwFlags -  Flags values
 *
 *      Returns:
 */
BOOL
WINAPI SCryptSetProvParam(IN HCRYPTPROV hProv,
             IN DWORD dwParam,
             IN BYTE *pbData,
             IN DWORD dwFlags)
{
    PVTableStruc    pVTable = (PVTableStruc) hProv;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;

    __try {
        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPSetProvParam(pVTable->hProv, dwParam, pbData, dwFlags);
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}


/*
 -      CryptGetProvParam
 -
 *      Purpose:
 *                Allows applications to get various aspects of the
 *                operations of a provider
 *
 *      Parameters:
 *               IN      hProv      -  Handle to a proivder
 *               IN      dwParam    -  Parameter number
 *               IN      pbData     -  Pointer to data
 *               IN      pdwDataLen -  Length of parameter data
 *               IN      dwFlags    -  Flags values
 *
 *      Returns:
 */
BOOL
WINAPI SCryptGetProvParam(IN HCRYPTPROV hProv,
             IN DWORD dwParam,
             IN BYTE *pbData,
             IN DWORD *pdwDataLen,
             IN DWORD dwFlags)
{
    PVTableStruc    pVTable = (PVTableStruc) hProv;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;

    __try {
        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPGetProvParam(
                        pVTable->hProv,
                        dwParam,
                        pbData,
                        pdwDataLen,
                        dwFlags
                        );
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}


/*
 -      CryptSetHashParam
 -
 *      Purpose:
 *                Allows applications to customize various aspects of the
 *                operations of a hash
 *
 *      Parameters:
 *               IN      hHash   -  Handle to a hash
 *               IN      dwParam -  Parameter number
 *               IN      pbData  -  Pointer to data
 *               IN      dwFlags -  Flags values
 *
 *      Returns:
 */
BOOL
WINAPI SCryptSetHashParam(IN HCRYPTHASH hHash,
             IN DWORD dwParam,
             IN BYTE *pbData,
             IN DWORD dwFlags)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;


    __try {

        pVTable = pVHash->pVTable;

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPSetHashParam(
                        pVTable->hProv,
                        pVHash->hHash,
                        dwParam,
                        pbData,
                        dwFlags
                        );
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}


/*
 -      CryptGetHashParam
 -
 *      Purpose:
 *                Allows applications to get various aspects of the
 *                operations of a hash
 *
 *      Parameters:
 *               IN      hHash      -  Handle to a hash
 *               IN      dwParam    -  Parameter number
 *               IN      pbData     -  Pointer to data
 *               IN      pdwDataLen -  Length of parameter data
 *               IN      dwFlags    -  Flags values
 *
 *      Returns:
 */
BOOL
WINAPI SCryptGetHashParam(IN HCRYPTKEY hHash,
             IN DWORD dwParam,
             IN BYTE *pbData,
             IN DWORD *pdwDataLen,
             IN DWORD dwFlags)
{
    PVHashStruc     pVHash = (PVHashStruc) hHash;
    PVTableStruc    pVTable;
    BOOL            fCritSec = FALSE;
    BOOL            fRet = FALSE;

    __try {
        pVTable = pVHash->pVTable;

        EnterProviderCritSec(pVTable);
        fCritSec = TRUE;

        fRet = CPGetHashParam(
                        pVTable->hProv,
                        pVHash->hHash,
                        dwParam,
                        pbData,
                        pdwDataLen,
                        dwFlags
                        );
    } __except(EXCEPTION_EXECUTE_HANDLER) {
        fRet = FALSE;
        ASSERT( fRet );
    }

    if( fCritSec ) {
        LeaveProviderCritSec(pVTable);
    }

    return fRet;
}

void __inline EnterProviderCritSec(IN PVTableStruc pVTable)
{
    InterlockedIncrement(&pVTable->Inuse);
}


LONG __inline LeaveProviderCritSec(IN PVTableStruc pVTable)
{
    __try {
        return InterlockedDecrement(&pVTable->Inuse);
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        return -1;
    }
}

PVKeyStruc BuildVKey(IN PVTableStruc pVTable)
{
    PVKeyStruc      pVKey;

    pVKey = (PVKeyStruc)LocalAlloc(LMEM_ZEROINIT, sizeof(VKeyStruc));
    if( pVKey == NULL )
        return NULL;

    pVKey->pVTable = pVTable;

    return pVKey;
}

PVHashStruc BuildVHash(IN PVTableStruc pVTable)
{
    PVHashStruc     pVHash;

    pVHash = (PVHashStruc)LocalAlloc(LMEM_ZEROINIT, sizeof(VHashStruc));
    if( pVHash == NULL )
        return NULL;

    pVHash->pVTable = pVTable;

    return pVHash;
}

⌨️ 快捷键说明

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