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

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