#ifndef CRYPTO_25519_H
#define CRYPTO_25519_H
#include <tier0/dbg.h>
#include "crypto_constants.h"
#include "keypair.h"
constexpr int k_cb25519KeySize = 32;
class CEC25519KeyBase : public CCryptoKeyBase_RawBuffer
{
public:
virtual ~CEC25519KeyBase();
virtual bool IsValid() const override;
virtual uint32 GetRawData( void *pData ) const override;
virtual void Wipe() override;
void *evp_pkey() const { return m_evp_pkey; }
protected:
virtual bool SetRawData( const void *pData, size_t cbData ) override;
inline CEC25519KeyBase( ECryptoKeyType keyType ) : CCryptoKeyBase_RawBuffer( keyType ), m_evp_pkey(nullptr) {}
void *m_evp_pkey;
};
class CEC25519PublicKeyBase : public CEC25519KeyBase
{
public:
virtual ~CEC25519PublicKeyBase();
protected:
CEC25519PublicKeyBase( ECryptoKeyType eType ) : CEC25519KeyBase( eType ) { }
};
class CEC25519PrivateKeyBase : public CEC25519KeyBase
{
public:
virtual ~CEC25519PrivateKeyBase();
virtual void Wipe() override;
bool GetPublicKey( CEC25519PublicKeyBase *pPublicKey ) const;
bool MatchesPublicKey( const CEC25519PublicKeyBase &pPublicKey ) const;
const uint8 *GetPublicKeyRawData() const { return m_publicKey; }
inline static constexpr int GetPublicKeyRawDataSize() { return k_cb25519KeySize; }
protected:
CEC25519PrivateKeyBase( ECryptoKeyType eType ) : CEC25519KeyBase( eType ) { }
uint8 m_publicKey[k_cb25519KeySize];
bool CachePublicKey();
virtual bool SetRawData( const void *pData, size_t cbData ) override;
};
class CECKeyExchangePrivateKey : public CEC25519PrivateKeyBase
{
public:
CECKeyExchangePrivateKey() : CEC25519PrivateKeyBase( k_ECryptoKeyTypeKeyExchangePrivate ) { }
virtual ~CECKeyExchangePrivateKey();
};
class CECKeyExchangePublicKey : public CEC25519PublicKeyBase
{
public:
CECKeyExchangePublicKey() : CEC25519PublicKeyBase( k_ECryptoKeyTypeKeyExchangePublic ) { }
CECKeyExchangePublicKey( const CECKeyExchangePublicKey &x ) : CEC25519PublicKeyBase( k_ECryptoKeyTypeKeyExchangePublic ) { CopyFrom( x ); }
CECKeyExchangePublicKey & operator=(const CECKeyExchangePublicKey &x) { if ( this != &x ) { CopyFrom( x ); } return *this; }
virtual ~CECKeyExchangePublicKey();
};
class CECSigningPrivateKey : public CEC25519PrivateKeyBase
{
public:
CECSigningPrivateKey() : CEC25519PrivateKeyBase( k_ECryptoKeyTypeSigningPrivate ) { }
virtual bool LoadFromAndWipeBuffer( void *pBuffer, size_t cBytes ) override;
bool GetAsPEM( char *pchPEMData, uint32 cubPEMData, uint32 *pcubPEMData ) const;
bool ParsePEM( const char *pBuffer, size_t cBytes );
void GenerateSignature( const void *pData, size_t cbData, CryptoSignature_t *pSignatureOut ) const;
};
class CECSigningPublicKey : public CEC25519PublicKeyBase
{
public:
CECSigningPublicKey() : CEC25519PublicKeyBase( k_ECryptoKeyTypeSigningPublic ) { }
CECSigningPublicKey( const CECSigningPublicKey &x ) : CEC25519PublicKeyBase( k_ECryptoKeyTypeSigningPublic ) { CopyFrom( x ); }
CECSigningPublicKey& operator=(const CECSigningPublicKey &x) { if ( this != &x ) { CopyFrom( x ); } return *this; }
virtual bool LoadFromAndWipeBuffer( void *pBuffer, size_t cBytes ) override;
bool GetAsOpenSSHAuthorizedKeys( char *pchData, uint32 cubData, uint32 *pcubData, const char *pszComment = "" ) const;
bool SetFromOpenSSHAuthorizedKeys( const char *pchData, size_t cbData );
bool VerifySignature( const void *pData, size_t cbData, const CryptoSignature_t &signature ) const;
};
#ifdef VALVE_CRYPTO_ENABLE_25519
namespace CCrypto
{
void GenerateKeyExchangeKeyPair( CECKeyExchangePublicKey *pPublicKey, CECKeyExchangePrivateKey *pPrivateKey );
bool PerformKeyExchange( const CECKeyExchangePrivateKey &localPrivateKey, const CECKeyExchangePublicKey &remotePublicKey, SHA256Digest_t *pSharedSecretOut );
void GenerateSigningKeyPair( CECSigningPublicKey *pPublicKey, CECSigningPrivateKey *pPrivateKey );
inline void GenerateSignature( const void *pData, size_t cbData, const CECSigningPrivateKey &privateKey, CryptoSignature_t *pSignatureOut ) { privateKey.GenerateSignature( pData, cbData, pSignatureOut ); }
inline bool VerifySignature( const void *pData, size_t cbData, const CECSigningPublicKey &publicKey, const CryptoSignature_t &signature ) { return publicKey.VerifySignature( pData, cbData, signature ); }
};
#endif
#endif