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.
92 lines
3.1 KiB
C
92 lines
3.1 KiB
C
/*H********************************************************************************/
|
|
/*!
|
|
\File cryptmont.h
|
|
|
|
\Description
|
|
This module implements the math for elliptic curve cryptography
|
|
using montgomery curves
|
|
|
|
\Copyright
|
|
Copyright (c) Electronic Arts 2018. ALL RIGHTS RESERVED.
|
|
*/
|
|
/********************************************************************************H*/
|
|
|
|
#ifndef _cryptmont_h
|
|
#define _cryptmont_h
|
|
|
|
/*!
|
|
\Moduledef CryptMont CryptMont
|
|
\Modulemember Crypt
|
|
*/
|
|
//@{
|
|
|
|
#include "DirtySDK/platform.h"
|
|
#include "DirtySDK/crypt/cryptbn.h"
|
|
#include "DirtySDK/crypt/cryptdef.h"
|
|
|
|
/*** Type Definitions **************************************************************/
|
|
|
|
typedef struct CryptMontT
|
|
{
|
|
CryptBnT Prime; //!< curve prime
|
|
CryptBnT PrimeMin2; //!< curve prime - 2 used for exponentiation
|
|
CryptBnT BasePoint; //!< curve base point (only u)
|
|
CryptBnT A24; //!< constant used for calculations
|
|
CryptBnT PrivateKey; //!< private key
|
|
|
|
//! working state
|
|
CryptBnT X_2;
|
|
CryptBnT X_3;
|
|
|
|
CryptEccPointT Result; //!< cached result and z_2/z_3 during the point state
|
|
|
|
int32_t iMemGroup; //!< memgroup id
|
|
void *pMemGroupUserdata; //!< memgroup userdata
|
|
CryptBnT *pTable; //!< table used for sliding window in exponentiation
|
|
|
|
enum
|
|
{
|
|
CRYPTMONT_COMPUTE_POINT,//!< calculate the point
|
|
CRYPTMONT_COMPUTE_EXP //!< calculate the final result
|
|
} eState; //!< current state of the calculation
|
|
|
|
int16_t iBitIndex; //!< bit index for the calculation (private key or exponent)
|
|
uint8_t bAccumulOne; //!< used to skip the first multiply
|
|
uint8_t uSwap; //!< current swap state
|
|
uint32_t uCryptUsecs; //!< total number of usecs the operation took
|
|
int32_t iCurveType; //!< what curve were we initialized with
|
|
} CryptMontT;
|
|
|
|
/*** Functions ********************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// init the curve state
|
|
DIRTYCODE_API int32_t CryptMontInit(CryptMontT *pState, int32_t iCurveType);
|
|
|
|
// for testing-purposes; set the private key
|
|
DIRTYCODE_API void CryptMontSetPrivateKey(CryptMontT *pState, const uint8_t *pKey);
|
|
|
|
// generates a public key based on the curve parameters: BasePoint * Secret
|
|
DIRTYCODE_API int32_t CryptMontPublic(CryptMontT *pState, CryptEccPointT *pResult, uint32_t *pCryptUsecs);
|
|
|
|
// generate a shared secret based on the curve parameters and other parties public key: PublicKey * Secret
|
|
DIRTYCODE_API int32_t CryptMontSecret(CryptMontT *pState, CryptEccPointT *pPublicKey, CryptEccPointT *pResult, uint32_t *pCryptUsecs);
|
|
|
|
// initialize a point on the curve from a buffer
|
|
DIRTYCODE_API int32_t CryptMontPointInitFrom(CryptEccPointT *pPoint, const uint8_t *pBuffer, int32_t iBufSize);
|
|
|
|
// output a point to a buffer
|
|
DIRTYCODE_API int32_t CryptMontPointFinal(const CryptMontT *pState, const CryptEccPointT *pPoint, uint8_t bSecret, uint8_t *pBuffer, int32_t iBufSize);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
//@}
|
|
|
|
#endif // _cryptmont_h
|
|
|