openmohaa/code/gamespy/ghttp/ghttpEncryption.h

138 lines
6.2 KiB
C
Raw Permalink Normal View History

2023-02-04 21:00:01 +01:00
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#ifndef __GHTTPENCRYPTION_H__
#define __GHTTPENCRYPTION_H__
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//#include "ghttpCommon.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Encryption method
typedef enum
{
GHIEncryptionMethod_None,
GHIEncryptionMethod_Encrypt, // encrypt raw data written to buffer
GHIEncryptionMethod_Decrypt // decrypt raw data written to buffer
} GHIEncryptionMethod;
// Encryption results
typedef enum
{
GHIEncryptionResult_None,
GHIEncryptionResult_Success, // successfully encrypted/decrypted
GHIEncryptionResult_BufferTooSmall, // buffer was too small to hold converted data
GHIEncryptionResult_Error // some other kind of error
} GHIEncryptionResult;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
struct GHIEncryptor; // forward declare for callbacks
struct GHIConnection;
// Called to init the encryption engine
typedef GHIEncryptionResult (*GHTTPEncryptorInitFunc) (struct GHIConnection * theConnection,
struct GHIEncryptor * theEncryptor);
// Called to connect the socket (some engines do this internally)
typedef GHIEncryptionResult (*GHTTPEncryptorConnectFunc)(struct GHIConnection * theConnection,
struct GHIEncryptor * theEncryptor);
// Called to start the handshake process engine
typedef GHIEncryptionResult (*GHTTPEncryptorStartFunc)(struct GHIConnection * theConnection,
struct GHIEncryptor * theEncryptor);
// Called to destroy the encryption engine
typedef GHIEncryptionResult (*GHTTPEncryptorCleanupFunc)(struct GHIConnection * theConnection,
struct GHIEncryptor * theEncryptor);
// Called when data needs to be encrypted
// - entire plain text buffer will be encrypted
typedef GHIEncryptionResult (*GHTTPEncryptorEncryptFunc)(struct GHIConnection * theConnection,
struct GHIEncryptor * theEncryptor,
const char * thePlainTextBuffer,
int thePlainTextLength, // [in]
char * theEncryptedBuffer,
int * theEncryptedLength); // [in/out]
// Called when data needs to be decrypted
// - encrypted data may be left in the buffer
// - decrypted buffer is appended to, not overwritten
typedef GHIEncryptionResult (*GHTTPEncryptorDecryptFunc)(struct GHIConnection * theConnection,
struct GHIEncryptor* theEncryptor,
const char * theEncryptedBuffer,
int * theEncryptedLength, // [in/out]
char * theDecryptedBuffer,
int * theDecryptedLength);// [in/out]
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
typedef struct GHIEncryptor
{
void* mInterface; // only SSL is currently supported
GHTTPEncryptionEngine mEngine;
GHTTPBool mInitialized;
GHTTPBool mSessionStarted; // handshake started?
GHTTPBool mSessionEstablished; // handshake completed?
// (As coded, these two are exclusive!)
// pattern 1 = manually encrypt the buffer, then send using normal socket functions
// pattern 2 = send plain text through the encryption engine, it will send
GHTTPBool mEncryptOnBuffer; // engine encrypts when writing to a buffer? (pattern 1)
GHTTPBool mEncryptOnSend; // engine encrypts when sending over socket? (pattern 2)
// If GHTTPTrue, the SSL library handles sending/receiving handshake messages
GHTTPBool mLibSendsHandshakeMessages;
// Functions for engine use
GHTTPEncryptorInitFunc mInitFunc;
GHTTPEncryptorCleanupFunc mCleanupFunc;
GHTTPEncryptorStartFunc mStartFunc; // start the handshake process
GHTTPEncryptorEncryptFunc mEncryptFunc;
GHTTPEncryptorDecryptFunc mDecryptFunc;
} GHIEncryptor;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// ssl encryption
GHIEncryptionResult ghiEncryptorSslInitFunc(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor);
GHIEncryptionResult ghiEncryptorSslCleanupFunc(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor);
GHIEncryptionResult ghiEncryptorSslStartFunc(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor);
GHIEncryptionResult ghiEncryptorSslEncryptFunc(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor,
const char * thePlainTextBuffer,
int thePlainTextLength,
char * theEncryptedBuffer,
int * theEncryptedLength);
GHIEncryptionResult ghiEncryptorSslDecryptFunc(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor,
const char * theEncryptedBuffer,
int * theEncryptedLength,
char * theDecryptedBuffer,
int * theDecryptedLength);
GHIEncryptionResult ghiEncryptorSslEncryptSend(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor,
const char * thePlainTextBuffer,
int thePlainTextLength,
int * theBytesSent);
GHIEncryptionResult ghiEncryptorSslDecryptRecv(struct GHIConnection * connection,
struct GHIEncryptor * theEncryptor,
char * theDecryptedBuffer,
int * theDecryptedLength);
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#endif // __GHTTPENCRYPTION_H__