Kawe Mazidjatari b3a68ed095 Add EABase, EAThread and DirtySDK to R5sdk
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
2024-04-05 18:29:03 +02:00

103 lines
4.3 KiB
C

/*H*************************************************************************************/
/*!
\File cryptarc4.h
\Description
This module is a from-scratch ARC4 implementation designed to avoid
any intellectual property complications. The ARC4 stream cipher is
known to produce output that is compatible with the RC4 stream cipher.
\Notes
This algorithm from this cypher was taken from the web site: ciphersaber.gurus.com
It is based on the RC4 compatible algorithm that was published in the 2nd ed of
the book Applied Cryptography by Bruce Schneier. This is a private-key stream
cipher which means that some other secure way of exchanging cipher keys prior
to algorithm use is required. Its strength is directly related to the key exchange
algorithm strengh. In operation, each individual stream message must use a unique
key. This is handled by appending on 10 byte random value onto the private key.
This 10-byte data can be sent by public means to the receptor (or included at the
start of a file or whatever). When the private key is combined with this public
key, it essentially puts the cypher into a random starting state (it is like
using a message digest routine to generate a random hash for password comparison).
The code below was written from scratch using only a textual algorithm description.
\Copyright
Copyright (c) Electronic Arts 2000-2002
\Version 1.0 02/25/2000 (gschaefer) First Version
\Version 1.1 11/06/2002 (jbrookes) Removed Create()/Destroy() to eliminate mem alloc dependencies.
*/
/*************************************************************************************H*/
#ifndef _cryptarc4_h
#define _cryptarc4_h
/*!
\Moduledef CryptArc4 CryptArc4
\Modulemember Crypt
*/
//@{
/*** Include files *********************************************************************/
#include "DirtySDK/platform.h"
/*** Defines ***************************************************************************/
/*** Macros ****************************************************************************/
/*** Type Definitions ******************************************************************/
typedef struct CryptArc4T CryptArc4T;
//! all fields are PRIVATE
struct CryptArc4T
{
uint8_t state[256];
uint8_t walk;
uint8_t swap;
};
/*** Variables *************************************************************************/
/*** Functions *************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
// create state for ARC4 encryption/decryption module.
DIRTYCODE_API void CryptArc4Init(CryptArc4T *pState, const unsigned char *pKeyBuf, int32_t iKeyLen, int32_t iIter);
// apply the cipher to the data. calling twice undoes the uncryption
DIRTYCODE_API void CryptArc4Apply(CryptArc4T *pState, unsigned char *pBuffer, int32_t iLength);
// advance the cipher state by iLength bytes
DIRTYCODE_API void CryptArc4Advance(CryptArc4T *pState, int32_t iLength);
// encrypt an asciiz string, with a 7-bit asciiz string result
DIRTYCODE_API void CryptArc4StringEncrypt(char *pDst, int32_t iLen, const char *pSrc, const uint8_t *pKey, int32_t iKey, int32_t iIter);
// decrypt an asciiz string, from a 7-bit asciiz encrypted string
DIRTYCODE_API void CryptArc4StringDecrypt(char *pDst, int32_t iLen, const char *pSrc, const uint8_t *pKey, int32_t iKey, int32_t iIter);
#if DIRTYCODE_DEBUG
// encryption/decryption helper intended for use with static strings that need to be encrypted in the binary
#define CryptArc4StringEncryptStatic(_pStr, _iStrSize, _pKey, _iKeySize, _pStrSrc) CryptArc4StringEncryptStaticCode(_pStr, _iStrSize, _pKey, _iKeySize, _pStrSrc)
#else
// release version of string encrypt; does not pass source (plaintext) string
#define CryptArc4StringEncryptStatic(_pStr, _iStrSize, _pKey, _iKeySize, _pStrSrc) CryptArc4StringEncryptStaticCode(_pStr, _iStrSize, _pKey, _iKeySize, NULL)
#endif
// encryption/decryption helper intended for use with static strings that need to be encrypted in the binary (do not call directly; use CryptArc4StringEncryptStatic() wrapper)
DIRTYCODE_API int32_t CryptArc4StringEncryptStaticCode(char *pStr, int32_t iStrSize, const uint8_t *pKey, int32_t iKeySize, const char *pStrSrc);
#ifdef __cplusplus
}
#endif
//@}
#endif // _cryptarc4_h