#ifndef KEYPAIR_H
#define KEYPAIR_H
#pragma once
#include <steam/steamuniverse.h>
#include <tier0/platform.h>
#include <tier0/memdbgoff.h>
#include <string>
#include <tier0/memdbgon.h>
#include <stdint.h>
#include "minbase/minbase_securezeromemory_impl.h"
const unsigned int k_cubCryptoSignature = 64;
typedef unsigned char CryptoSignature_t[ k_cubCryptoSignature ];
enum ECryptoKeyType
{
k_ECryptoKeyTypeInvalid = 0,
k_ECryptoKeyTypeRSAPublic = 1, k_ECryptoKeyTypeRSAPrivate = 2, k_ECryptoKeyTypeSigningPublic = 3, k_ECryptoKeyTypeSigningPrivate = 4, k_ECryptoKeyTypeKeyExchangePublic = 5, k_ECryptoKeyTypeKeyExchangePrivate = 6, };
class CCryptoKeyBase
{
public:
virtual ~CCryptoKeyBase();
ECryptoKeyType GetKeyType() const { return m_eKeyType; }
virtual bool IsValid() const = 0;
virtual void Wipe() = 0;
virtual uint32 GetRawData( void *pData ) const = 0;
bool SetRawDataAndWipeInput( void *pData, size_t cbData );
bool SetRawDataWithoutWipingInput( const void *pData, size_t cbData );
bool SetFromHexEncodedString( const char *pchEncodedKey );
bool SetFromBase64EncodedString( const char *pchEncodedKey );
bool GetRawDataAsStdString( std::string *pResult ) const;
bool SetRawDataFromStdString( const std::string &s ) { return SetRawDataWithoutWipingInput( s.c_str(), s.length() ); }
virtual bool LoadFromAndWipeBuffer( void *pBuffer, size_t cBytes );
bool operator==( const CCryptoKeyBase &rhs ) const;
bool operator!=( const CCryptoKeyBase &rhs ) const { return !operator==( rhs ); }
bool BMatchesRawData( const void *pData, size_t cbData ) const;
void CopyFrom( const CCryptoKeyBase &x );
#ifdef DBGFLAG_VALIDATE
virtual void Validate( CValidator &validator, const char *pchName ) const = 0; #endif
protected:
virtual bool SetRawData( const void *pData, size_t cbData ) = 0;
CCryptoKeyBase( ECryptoKeyType keyType ) : m_eKeyType( keyType ) {}
const ECryptoKeyType m_eKeyType;
private:
CCryptoKeyBase( const CCryptoKeyBase &src ) = delete;
CCryptoKeyBase & operator=(const CCryptoKeyBase &rhs) = delete;
};
class CCryptoKeyBase_RawBuffer : public CCryptoKeyBase
{
public:
virtual ~CCryptoKeyBase_RawBuffer();
virtual bool IsValid() const override;
virtual uint32 GetRawData( void *pData ) const override;
virtual void Wipe() override;
const uint8 *GetRawDataPtr() const { return m_pData; }
uint32 GetRawDataSize() const { return m_cbData; }
bool EnsureRawDataPtrAvailable();
#ifdef DBGFLAG_VALIDATE
virtual void Validate( CValidator &validator, const char *pchName ) const; #endif
protected:
virtual bool SetRawData( const void *pData, size_t cbData ) override;
void InternalWipeRawDataBuffer();
bool InternalSetRawDataBuffer( const void *pData, size_t cbData );
inline CCryptoKeyBase_RawBuffer( ECryptoKeyType keyType ) : CCryptoKeyBase( keyType ), m_pData( nullptr ), m_cbData( 0 ) {}
uint8 *m_pData;
uint32 m_cbData;
};
class CRSAKeyBase;
class CRSAPublicKey;
class CRSAPrivateKey;
class CEC25519KeyBase;
class CEC25519PublicKeyBase;
class CEC25519PrivateKeyBase;
class CECKeyExchangePrivateKey;
class CECKeyExchangePublicKey;
class CECSigningPrivateKey;
class CECSigningPublicKey;
#endif