windows-nt/Source/XPSP1/NT/ds/security/passport/atlmfc/atlcrypt.inl
2020-09-26 16:20:57 +08:00

1056 lines
22 KiB
C++

// This is a part of the Active Template Library.
// Copyright (C) 1996-2001 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.
#ifndef __ATLCRYPT_INL__
#define __ATLCRYPT_INL__
#pragma once
#ifndef __ATLCRYPT_H__
#error atlcrypt.inl requires atlcrypt.h to be included first
#endif
//REVIEW : All LPSTRs should probably be LPTSTRs in places where they are being cast to BYTE*s anyway.
namespace ATL
{
inline CCryptProv::CCryptProv( const CCryptProv& prov ) throw()
{
m_hProv = prov.m_hProv;
if (m_hProv)
AddRef();
}
inline CCryptProv::CCryptProv( HCRYPTPROV hProv, BOOL bTakeOwnership ) throw()
{
m_hProv = hProv;
if (m_hProv && !bTakeOwnership)
AddRef();
}
inline CCryptProv::~CCryptProv() throw()
{
Release();
}
inline CCryptProv& CCryptProv::operator=( const CCryptProv& prov ) throw()
{
Release();
m_hProv = prov.m_hProv;
if( m_hProv != NULL )
{
AddRef();
}
return( *this );
}
inline HRESULT CCryptProv::AddRef() throw()
{
ATLASSERT( m_hProv != NULL );
if (!CryptContextAddRef( m_hProv, NULL, 0))
{
return AtlHresultFromLastError();
}
return S_OK;
}
inline void CCryptProv::Attach( HCRYPTPROV hProv, BOOL bTakeOwnership ) throw()
{
ATLASSERT( m_hProv == NULL );
m_hProv = hProv;
if (m_hProv && !bTakeOwnership)
AddRef();
}
inline HCRYPTPROV CCryptProv::Detach() throw()
{
HCRYPTPROV hProv;
hProv = m_hProv;
m_hProv = NULL;
return( hProv );
}
inline CCryptProv::CCryptProv() throw() :
m_hProv( NULL )
{
}
inline HRESULT CCryptProv::Release() throw()
{
if( m_hProv != NULL )
{
if (!CryptReleaseContext( m_hProv, 0 ))
{
return AtlHresultFromLastError();
}
m_hProv = NULL;
}
return S_OK;
}
inline HRESULT CCryptProv::Initialize(
DWORD dwProviderType,
LPCTSTR szContainer,
LPCTSTR szProvider,
DWORD dwFlags) throw()
{
ATLASSERT(m_hProv == NULL);
if (!CryptAcquireContext(&m_hProv, szContainer, szProvider, dwProviderType, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::InitVerifyContext(
DWORD dwProviderType,
LPCTSTR szProvider,
DWORD dwFlags) throw()
{
ATLASSERT(m_hProv == NULL);
if (!CryptAcquireContext(&m_hProv, NULL, szProvider, dwProviderType, CRYPT_VERIFYCONTEXT | dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::InitCreateKeySet(
DWORD dwProviderType,
LPCTSTR szContainer,
LPCTSTR szProvider,
DWORD dwFlags) throw()
{
ATLASSERT(m_hProv == NULL);
if (!CryptAcquireContext(&m_hProv, szContainer, szProvider, dwProviderType, CRYPT_NEWKEYSET | dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::DeleteKeySet(
DWORD dwProviderType,
LPCTSTR szContainer,
LPCTSTR szProvider,
DWORD dwFlags) throw()
{
HCRYPTPROV hProv = NULL;
if (!CryptAcquireContext(&hProv, szContainer, szProvider, dwProviderType, CRYPT_DELETEKEYSET | dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::Uninitialize() throw()
{
ATLASSERT(m_hProv != NULL);
if (!CryptReleaseContext(m_hProv, 0))
{
return AtlHresultFromLastError();
}
else
{
m_hProv = NULL;
return S_OK;
}
}
inline HRESULT CCryptProv::GetParam(DWORD dwParam, BYTE * pbData, DWORD * pdwDataLen, DWORD dwFlags) throw()
{
ATLASSERT(m_hProv != NULL);
if (!CryptGetProvParam(m_hProv, dwParam, pbData, pdwDataLen, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::SetParam( DWORD dwParam, BYTE* pbData, DWORD dwFlags) throw()
{
ATLASSERT(m_hProv != NULL);
if (!CryptSetProvParam(m_hProv, dwParam, pbData, dwFlags ))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptProv::GetName(LPSTR szBuf, DWORD * pdwLength) throw()
{
return GetParam(PP_NAME, (BYTE *)szBuf, pdwLength);
}
inline HRESULT CCryptProv::GetContainer(LPSTR szBuf, DWORD * pdwLength) throw()
{
return GetParam(PP_CONTAINER, (BYTE *)szBuf, pdwLength);
}
inline HRESULT CCryptProv::GetImpType(DWORD * pdwImpType) throw()
{
DWORD dwLength = sizeof(DWORD);
return GetParam(PP_IMPTYPE, (BYTE *)pdwImpType, &dwLength);
}
inline HRESULT CCryptProv::GetVersion(DWORD * pdwVersion) throw()
{
DWORD dwLength = sizeof(DWORD);
return GetParam(PP_VERSION, (BYTE *)pdwVersion, &dwLength);
}
inline HRESULT CCryptProv::GetProvType(DWORD * pdwType) throw()
{
DWORD dwLength = sizeof(DWORD);
return GetParam(PP_PROVTYPE, (BYTE * )pdwType, &dwLength);
}
inline HRESULT CCryptProv::GetSecurityDesc(SECURITY_INFORMATION * pSecInfo) throw()
{
DWORD dwSize = sizeof(SECURITY_INFORMATION);
return GetParam(PP_KEYSET_SEC_DESCR, (BYTE *)pSecInfo, &dwSize);
}
inline HRESULT CCryptProv::SetSecurityDesc(SECURITY_INFORMATION SecInfo) throw()
{
return SetParam(PP_KEYSET_SEC_DESCR, (BYTE *)&SecInfo);
}
inline HRESULT CCryptProv::GenRandom(ULONG nLength, BYTE* pbBuffer ) throw()
{
ATLASSERT(m_hProv != NULL);
if (!CryptGenRandom( m_hProv, nLength, pbBuffer ))
{
return AtlHresultFromLastError();
}
return S_OK;
}
inline CCryptHash::CCryptHash() throw() :
m_hHash( NULL )
{
}
inline CCryptHash::CCryptHash( const CCryptHash& hash ) throw()
{
m_hHash = hash.Duplicate();
}
inline CCryptHash::CCryptHash( HCRYPTHASH hHash, BOOL bTakeOwnership ) throw()
{
if (bTakeOwnership)
m_hHash = hHash;
else
{
m_hHash = NULL;
BOOL bRet = ::CryptDuplicateHash( hHash, NULL, 0, &m_hHash );
if (!bRet)
m_hHash = NULL;
}
}
inline CCryptHash::~CCryptHash() throw()
{
Destroy();
}
inline void CCryptHash::Attach( HCRYPTHASH hHash, BOOL bTakeOwnership ) throw()
{
ATLASSERT( m_hHash == NULL );
if (bTakeOwnership)
m_hHash = hHash;
else
{
m_hHash = NULL;
BOOL bRet = ::CryptDuplicateHash( hHash, NULL, 0, &m_hHash );
if (!bRet)
m_hHash = NULL;
}
}
inline void CCryptHash::Destroy() throw()
{
if( m_hHash != NULL )
{
BOOL bSuccess;
bSuccess = ::CryptDestroyHash( m_hHash );
ATLASSERT( bSuccess );
m_hHash = NULL;
}
}
inline HCRYPTHASH CCryptHash::Detach() throw()
{
HCRYPTHASH hHash;
hHash = m_hHash;
m_hHash = NULL;
return hHash;
}
inline HCRYPTHASH CCryptHash::Duplicate() const throw()
{
BOOL bSuccess;
HCRYPTHASH hHash;
ATLASSERT( m_hHash != NULL );
hHash = NULL;
bSuccess = ::CryptDuplicateHash( m_hHash, NULL, 0, &hHash );
if( !bSuccess )
{
return NULL;
}
return hHash;
}
inline HRESULT CCryptHash::Uninitialize() throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptDestroyHash(m_hHash))
{
return AtlHresultFromLastError();
}
else
{
m_hHash = NULL;
return S_OK;
}
}
inline HRESULT CCryptHash::Detach(HCRYPTHASH * phHash) throw()
{
ATLASSERT(phHash);
if (!phHash)
return E_INVALIDARG;
*phHash = m_hHash;
m_hHash = NULL;
return S_OK;
}
inline HRESULT CCryptHash::AddData(const BYTE * pbData, DWORD dwDataLen, DWORD dwFlags) throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptHashData(m_hHash, pbData, dwDataLen, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptHash::AddString(LPCTSTR szData, DWORD dwFlags) throw()
{
return AddData((BYTE *)szData, (DWORD)_tcslen(szData) * sizeof(TCHAR), dwFlags);
}
inline HRESULT CCryptHash::GetParam(DWORD dwParam, BYTE * pbData, DWORD * pdwDataLen, DWORD dwFlags) throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptGetHashParam(m_hHash, dwParam, pbData, pdwDataLen, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptHash::SetParam(DWORD dwParam, BYTE * pbData, DWORD dwFlags) throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptSetHashParam(m_hHash, dwParam, pbData, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptHash::GetAlgId(ALG_ID * pAlgId) throw()
{
DWORD dwSize = sizeof(ALG_ID);
return GetParam(HP_ALGID, (BYTE *)pAlgId, &dwSize);
}
inline HRESULT CCryptHash::GetSize(DWORD * pdwSize) throw()
{
DWORD dwLength = sizeof(DWORD);
return GetParam(HP_HASHSIZE, (BYTE *)pdwSize, &dwLength);
}
inline HRESULT CCryptHash::GetValue(BYTE * pBuf, DWORD * pdwSize) throw()
{
return GetParam(HP_HASHVAL, pBuf, pdwSize);
}
inline HRESULT CCryptHash::SetValue(BYTE * pBuf) throw()
{
return SetParam(HP_HASHVAL, pBuf);
}
inline HRESULT CCryptHash::Sign(
BYTE * pbSignature,
DWORD * pdwSigLen,
DWORD dwFlags,
DWORD dwKeySpec) throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptSignHash(m_hHash, dwKeySpec, NULL, dwFlags, pbSignature, pdwSigLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptHash::VerifySignature(
const BYTE * pbSignature,
DWORD dwSigLen,
CCryptKey &PubKey,
DWORD dwFlags) throw()
{
ATLASSERT(m_hHash != NULL);
if (!CryptVerifySignature(m_hHash, pbSignature, dwSigLen, PubKey.GetHandle(), NULL, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
__declspec(selectany) CCryptHash CCryptHash::EmptyHash = CCryptHash();
__declspec(selectany) CCryptKey CCryptKey::EmptyKey = CCryptKey();
inline CCryptKey::CCryptKey() throw() :
m_hKey( NULL )
{
}
inline CCryptKey::CCryptKey( const CCryptKey& key ) throw()
{
m_hKey = key.Duplicate();
}
inline CCryptKey::CCryptKey( HCRYPTKEY hKey, BOOL bTakeOwnership ) throw()
{
if (bTakeOwnership)
m_hKey = hKey;
else
{
BOOL bSuccess = ::CryptDuplicateKey( hKey, NULL, 0, &m_hKey );
if( !bSuccess )
m_hKey = NULL;
}
}
inline CCryptKey::~CCryptKey() throw()
{
Destroy();
}
inline void CCryptKey::Attach( HCRYPTKEY hKey, BOOL bTakeOwnership ) throw()
{
ATLASSERT( m_hKey == NULL );
if (bTakeOwnership)
m_hKey = hKey;
else
{
BOOL bSuccess = ::CryptDuplicateKey( hKey, NULL, 0, &m_hKey );
if( !bSuccess )
m_hKey = NULL;
}
}
inline void CCryptKey::Destroy() throw()
{
if( m_hKey != NULL )
{
BOOL bSuccess;
bSuccess = ::CryptDestroyKey( m_hKey );
ATLASSERT( bSuccess );
m_hKey = NULL;
}
}
inline HCRYPTKEY CCryptKey::Detach() throw()
{
HCRYPTKEY hKey;
hKey = m_hKey;
m_hKey = NULL;
return( hKey );
}
inline HCRYPTKEY CCryptKey::Duplicate() const throw()
{
BOOL bSuccess;
ATLASSERT( m_hKey != NULL );
HCRYPTKEY hKey = NULL;
bSuccess = ::CryptDuplicateKey( m_hKey, NULL, 0, &hKey );
if( !bSuccess )
return NULL;
return hKey;
}
inline HRESULT CCryptKey::Uninitialize() throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptDestroyKey(m_hKey))
{
return AtlHresultFromLastError();
}
else
{
m_hKey = NULL;
return S_OK;
}
}
inline HRESULT CCryptKey::Encrypt(
BOOL final,
BYTE * pbData,
DWORD * pdwDataLen,
DWORD dwBufLen,
CCryptHash &Hash) throw()
{
ATLASSERT(m_hKey != NULL);
if (!::CryptEncrypt(m_hKey, Hash.GetHandle(), final, 0, pbData, pdwDataLen, dwBufLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::Decrypt(BOOL final, BYTE * pbData, DWORD * pdwDataLen, CCryptHash &Hash) throw()
{
ATLASSERT(m_hKey != NULL);
if (!::CryptDecrypt(m_hKey, Hash.GetHandle(), final, 0, pbData, pdwDataLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::Encrypt(
const BYTE * pbPlainText,
DWORD dwPlainTextLen,
BYTE * pbCipherText,
DWORD * pdwCipherTextLen,
CCryptHash &Hash) throw()
{
ATLASSERT(m_hKey != NULL);
if (*pdwCipherTextLen < dwPlainTextLen)
return ERROR_MORE_DATA;
memcpy(pbCipherText, pbPlainText, dwPlainTextLen);
DWORD dwSize = dwPlainTextLen;
if (!::CryptEncrypt(m_hKey, Hash.GetHandle(), TRUE, 0, pbCipherText, &dwSize, *pdwCipherTextLen))
{
return AtlHresultFromLastError();
}
*pdwCipherTextLen = dwSize;
return S_OK;
}
inline HRESULT CCryptKey::Decrypt(
const BYTE * pbCipherText,
DWORD dwCipherTextLen,
BYTE * pbPlainText,
DWORD * pdwPlainTextLen,
CCryptHash &Hash) throw()
{
ATLASSERT(m_hKey != NULL);
if (*pdwPlainTextLen < dwCipherTextLen)
return ERROR_MORE_DATA;
memcpy(pbPlainText, pbCipherText, dwCipherTextLen);
DWORD dwSize = dwCipherTextLen;
if (!::CryptDecrypt(m_hKey, Hash.GetHandle(), TRUE, 0, pbPlainText, &dwSize))
{
return AtlHresultFromLastError();
}
*pdwPlainTextLen = dwSize;
return S_OK;
}
inline HRESULT CCryptKey::EncryptString(
LPCTSTR szPlainText,
BYTE * pbCipherText,
DWORD * pdwCipherTextLen,
CCryptHash &Hash) throw()
{
DWORD dwSize = ((DWORD)_tcslen(szPlainText) + 1) * sizeof(TCHAR);
return Encrypt((BYTE *)szPlainText, dwSize, pbCipherText, pdwCipherTextLen, Hash);
}
inline HRESULT CCryptKey::ExportSimpleBlob(
CCryptKey &ExpKey,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen) throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptExportKey(m_hKey, ExpKey.GetHandle(), SIMPLEBLOB, dwFlags, pbData, pdwDataLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::ExportPublicKeyBlob(
CCryptKey &ExpKey,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen) throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptExportKey(m_hKey, ExpKey.GetHandle(), PUBLICKEYBLOB, dwFlags, pbData, pdwDataLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::ExportPrivateKeyBlob(
CCryptKey &ExpKey,
DWORD dwFlags,
BYTE * pbData,
DWORD * pdwDataLen) throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptExportKey(m_hKey, ExpKey.GetHandle(), PRIVATEKEYBLOB, dwFlags, pbData, pdwDataLen))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::GetParam(DWORD dwParam, BYTE * pbData, DWORD * pdwDataLen, DWORD dwFlags) throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptGetKeyParam(m_hKey, dwParam, pbData, pdwDataLen, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::SetParam(DWORD dwParam, BYTE * pbData, DWORD dwFlags) throw()
{
ATLASSERT(m_hKey != NULL);
if (!CryptSetKeyParam(m_hKey, dwParam, pbData, dwFlags))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKey::GetAlgId(ALG_ID * pAlgId) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_ALGID, (BYTE *)pAlgId, &dwSize);
}
inline HRESULT CCryptKey::SetAlgId(ALG_ID AlgId, DWORD dwFlags) throw()
{
return SetParam(KP_ALGID, (BYTE *)&AlgId, dwFlags);
}
inline HRESULT CCryptKey::GetBlockLength(DWORD * pdwBlockLen) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_BLOCKLEN, (BYTE *)pdwBlockLen, &dwSize);
}
inline HRESULT CCryptKey::GetKeyLength(DWORD * pdwKeyLen) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_KEYLEN, (BYTE *)pdwKeyLen, &dwSize);
}
inline HRESULT CCryptKey::GetSalt(BYTE * pbSalt, DWORD * pdwLength) throw()
{
return GetParam(KP_SALT, pbSalt, pdwLength);
}
inline HRESULT CCryptKey::SetSalt(BYTE * pbSalt) throw()
{
return SetParam(KP_SALT, pbSalt);
}
inline HRESULT CCryptKey::SetSaltEx(_CRYPTOAPI_BLOB * pBlobSalt) throw()
{
return SetParam(KP_SALT_EX, (BYTE *)pBlobSalt);
}
inline HRESULT CCryptKey::GetPermissions(DWORD * pdwPerms) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_PERMISSIONS, (BYTE *)pdwPerms, &dwSize);
}
inline HRESULT CCryptKey::SetPermissions(DWORD dwPerms) throw()
{
return SetParam(KP_PERMISSIONS, (BYTE *)&dwPerms);
}
inline HRESULT CCryptKey::GetP(BYTE * pbP, DWORD * pdwLength) throw()
{
return GetParam(KP_P, (BYTE *)pbP, pdwLength);
}
inline HRESULT CCryptKey::SetP(_CRYPTOAPI_BLOB * pBlobP) throw()
{
return SetParam(KP_P, (BYTE *)pBlobP);
}
inline HRESULT CCryptKey::SetP(BYTE * pbP, DWORD dwLength) throw()
{
_CRYPTOAPI_BLOB blob = { dwLength, pbP };
return SetParam(KP_P, (BYTE *)&blob);
}
inline HRESULT CCryptKey::GetQ(BYTE * pbQ, DWORD * pdwLength) throw()
{
return GetParam(KP_Q, (BYTE *)pbQ, pdwLength);
}
inline HRESULT CCryptKey::SetQ(_CRYPTOAPI_BLOB * pBlobQ) throw()
{
return SetParam(KP_Q, (BYTE *)pBlobQ);
}
inline HRESULT CCryptKey::SetQ(BYTE * pbQ, DWORD dwLength) throw()
{
_CRYPTOAPI_BLOB blob = { dwLength, pbQ };
return SetParam(KP_Q, (BYTE *)&blob);
}
inline HRESULT CCryptKey::GetG(BYTE * pbG, DWORD * pdwLength) throw()
{
return GetParam(KP_G, (BYTE *)pbG, pdwLength);
}
inline HRESULT CCryptKey::SetG(_CRYPTOAPI_BLOB * pBlobG) throw()
{
return SetParam(KP_G, (BYTE *)pBlobG);
}
inline HRESULT CCryptKey::SetG(BYTE * pbG, DWORD dwLength) throw()
{
_CRYPTOAPI_BLOB blob = { dwLength, pbG };
return SetParam(KP_G, (BYTE *)&blob);
}
inline HRESULT CCryptKey::SetX() throw()
{
return SetParam(KP_X, NULL);
}
inline HRESULT CCryptKey::GetEffKeyLen(DWORD * pdwEffKeyLen) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_EFFECTIVE_KEYLEN, (BYTE *)pdwEffKeyLen, &dwSize);
}
inline HRESULT CCryptKey::SetEffKeyLen(DWORD dwEffKeyLen) throw()
{
return SetParam(KP_EFFECTIVE_KEYLEN, (BYTE *)&dwEffKeyLen);
}
inline HRESULT CCryptKey::GetPadding(DWORD * pdwPadding) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_PADDING, (BYTE *)pdwPadding, &dwSize);
}
inline HRESULT CCryptKey::SetPadding(DWORD dwPadding) throw()
{
return SetParam(KP_PADDING, (BYTE *)&dwPadding);
}
inline HRESULT CCryptKey::GetIV(BYTE * pbIV, DWORD * pdwLength) throw()
{
return GetParam(KP_IV, pbIV, pdwLength);
}
inline HRESULT CCryptKey::SetIV(BYTE * pbIV) throw()
{
return SetParam(KP_IV, pbIV);
}
inline HRESULT CCryptKey::GetMode(DWORD * pdwMode) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_MODE, (BYTE *)pdwMode, &dwSize);
}
inline HRESULT CCryptKey::SetMode(DWORD dwMode) throw()
{
return SetParam(KP_MODE, (BYTE *)&dwMode);
}
inline HRESULT CCryptKey::GetModeBits(DWORD * pdwModeBits) throw()
{
DWORD dwSize = sizeof(DWORD);
return GetParam(KP_MODE_BITS, (BYTE *)pdwModeBits, &dwSize);
}
inline HRESULT CCryptKey::SetModeBits(DWORD dwModeBits) throw()
{
return SetParam(KP_MODE_BITS, (BYTE *)&dwModeBits);
}
inline HRESULT CCryptDerivedKey::Initialize(
CCryptProv &Prov,
CCryptHash &Hash,
ALG_ID algid,
DWORD dwFlags) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptDeriveKey(Prov.GetHandle(), algid, Hash.GetHandle(), dwFlags, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptRandomKey::Initialize(CCryptProv &Prov, ALG_ID algid, DWORD dwFlags) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptGenKey(Prov.GetHandle(), algid, dwFlags, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptUserExKey::Initialize(CCryptProv &Prov) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptGetUserKey(Prov.GetHandle(), AT_KEYEXCHANGE, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptUserExKey::Create(CCryptProv &Prov) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptGenKey(Prov.GetHandle(), AT_KEYEXCHANGE, 0, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptUserSigKey::Initialize(CCryptProv &Prov) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptGetUserKey(Prov.GetHandle(), AT_SIGNATURE, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptUserSigKey::Create(CCryptProv &Prov) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptGenKey(Prov.GetHandle(), AT_SIGNATURE, 0, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptImportKey::Initialize(
CCryptProv &Prov,
BYTE * pbData,
DWORD dwDataLen,
CCryptKey &PubKey,
DWORD dwFlags) throw()
{
ATLASSERT(m_hKey == NULL);
if (!CryptImportKey(Prov.GetHandle(), pbData, dwDataLen, PubKey.GetHandle(), dwFlags, &m_hKey))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptKeyedHash::Initialize(
CCryptProv &Prov,
ALG_ID Algid,
CCryptKey &Key,
DWORD dwFlags) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), Algid, Key.GetHandle(), dwFlags, &m_hHash))
{
return AtlHresultFromLastError();
}
else return S_OK;
}
inline HRESULT CCryptMD5Hash::Initialize(CCryptProv &Prov, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_MD5, 0, 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptMD4Hash::Initialize(CCryptProv &Prov, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_MD4, 0, 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptMD2Hash::Initialize(CCryptProv &Prov, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_MD2, 0, 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptSHAHash::Initialize(CCryptProv &Prov, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_SHA, 0, 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptHMACHash::Initialize(CCryptProv &Prov, CCryptKey &Key, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_HMAC, Key.GetHandle(), 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptMACHash::Initialize(CCryptProv &Prov, CCryptKey &Key, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_MAC, Key.GetHandle(), 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
inline HRESULT CCryptSSL3SHAMD4Hash::Initialize(CCryptProv &Prov, CCryptKey &Key, LPCTSTR szText) throw()
{
ATLASSERT(m_hHash == NULL);
if (!CryptCreateHash(Prov.GetHandle(), CALG_SSL3_SHAMD5, Key.GetHandle(), 0, &m_hHash))
{
return AtlHresultFromLastError();
}
if (szText!=NULL)
return AddString(szText);
else return S_OK;
}
}; // namespace ATL
#endif //__ATLCRYPT_INL__