You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
2.7 KiB
145 lines
2.7 KiB
|
|
#include <wincrypt.h>
|
|
#include <map>
|
|
|
|
//
|
|
// abstraction of CryptEncodeBlob/CryptDecodeBlob
|
|
//
|
|
|
|
class CEncryptedBlob
|
|
{
|
|
public:
|
|
|
|
CEncryptedBlob(
|
|
void * Buffer,
|
|
size_t Length,
|
|
LPCWSTR Description
|
|
);
|
|
|
|
CEncryptedBlob();
|
|
|
|
//
|
|
// used when unserializing
|
|
//
|
|
~CEncryptedBlob();
|
|
|
|
size_t GetLength()
|
|
{
|
|
return m_Length;
|
|
}
|
|
|
|
void
|
|
Decrypt(
|
|
void * Buffer,
|
|
size_t Length
|
|
);
|
|
|
|
void Serialize( HANDLE hFile );
|
|
void Unserialize( HANDLE hFile );
|
|
|
|
protected:
|
|
|
|
DATA_BLOB m_Blob;
|
|
size_t m_Length;
|
|
|
|
};
|
|
|
|
class CEncryptedCredentials
|
|
{
|
|
public:
|
|
|
|
CEncryptedCredentials( const BG_AUTH_CREDENTIALS & cred );
|
|
~CEncryptedCredentials();
|
|
|
|
//
|
|
// used by unserialize
|
|
//
|
|
CEncryptedCredentials()
|
|
{
|
|
m_Blob = 0;
|
|
}
|
|
|
|
BG_AUTH_CREDENTIALS * Decrypt();
|
|
|
|
void Serialize( HANDLE hFile )
|
|
{
|
|
if (m_Blob)
|
|
{
|
|
SafeWriteFile( hFile, true );
|
|
m_Blob->Serialize( hFile );
|
|
}
|
|
else
|
|
{
|
|
SafeWriteFile( hFile, false );
|
|
}
|
|
}
|
|
|
|
void Unserialize( HANDLE hFile )
|
|
{
|
|
bool b;
|
|
|
|
SafeReadFile( hFile, &b );
|
|
|
|
if (b)
|
|
{
|
|
m_Blob = new CEncryptedBlob;
|
|
m_Blob->Unserialize( hFile );
|
|
}
|
|
}
|
|
|
|
protected:
|
|
|
|
CEncryptedBlob * m_Blob;
|
|
|
|
};
|
|
|
|
|
|
//
|
|
// a set of (encrypted) credentials
|
|
//
|
|
class CCredentialsContainer
|
|
{
|
|
typedef DWORD KEY;
|
|
|
|
typedef std::map<KEY, CEncryptedCredentials *> Dictionary;
|
|
|
|
public:
|
|
|
|
typedef Dictionary::iterator Cookie;
|
|
|
|
CCredentialsContainer();
|
|
~CCredentialsContainer();
|
|
|
|
void Clear();
|
|
|
|
HRESULT Update( const BG_AUTH_CREDENTIALS * Credentials );
|
|
|
|
HRESULT Remove( BG_AUTH_TARGET Target, BG_AUTH_SCHEME Scheme );
|
|
|
|
size_t GetSizeEstimate( const BG_AUTH_CREDENTIALS * Credentials ) const;
|
|
|
|
HRESULT Find( BG_AUTH_TARGET Target, BG_AUTH_SCHEME Scheme, BG_AUTH_CREDENTIALS ** pCredentials ) const;
|
|
|
|
BG_AUTH_CREDENTIALS * FindFirst( Cookie & cookie ) const throw( ComError );
|
|
BG_AUTH_CREDENTIALS * FindNext( Cookie & cookie ) const throw( ComError );
|
|
|
|
void Serialize( HANDLE hFile );
|
|
void Unserialize( HANDLE hFile );
|
|
|
|
protected:
|
|
|
|
Dictionary m_Dictionary;
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
inline KEY MakeKey( BG_AUTH_TARGET Target, BG_AUTH_SCHEME Scheme ) const
|
|
{
|
|
return (WORD(Scheme) << 16) | WORD(Target);
|
|
}
|
|
};
|
|
|
|
HRESULT
|
|
ValidateCredentials(
|
|
BG_AUTH_CREDENTIALS * cred
|
|
);
|
|
|