mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
DirtySDK (EA's Dirty Sockets library) will be used for the LiveAPI implementation, and depends on: EABase, EAThread.
103 lines
4.3 KiB
C
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
|
|
|