//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free 
// software: you can redistribute it and/or modify it under the terms of 
// the GNU General Public License as published by the Free Software Foundation, 
// either version 3 of the License, or (at your option) any later version.

// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
// in the hope that it will be useful, but with permitted additional restrictions 
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
// distributed with this program. You should have received a copy of the 
// GNU General Public License along with permitted additional restrictions 
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection

/****************************************************************************
*  Error Constants, in case of values above 10 hexadecimal please call
*  Marx International, Inc.
****************************************************************************/

#define PARAM_ERR       0x01
#define BOX_NOT_FOUND   0x02

#define BOX_CRYPT_ERR   0x03
#define UNI_CRYPT_ERR   0x04
#define READ_RAM_ERR    0x05
#define WRITE_RAM_ERR   0x06
#define RAM_COUNT_ERR   0x07
#define BOX_READY_ERR   0x08


/****************************************************************************
*  Constants
****************************************************************************/

#define CRYPTLENG       32
#define RAM1LENG        50
#define RAM2LENG       433
#define IDEALENG        32

/****************************************************************************
*  User Functions
****************************************************************************/
extern "C" {

extern short CbN_BoxReady(unsigned short iPortNr, unsigned char *pcBoxName);

extern short CbN_ReadID1(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID2(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID3(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID4(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID5(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID6(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID7(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadID8(unsigned short iPortNr, unsigned char *pcSCodeId,
                     unsigned long *plIdReturn);

extern short CbN_ReadSER(unsigned short iPortNr, unsigned char *pcSCodeSer,
                     unsigned  long *plSerNum);

extern short CbN_ReadRAM1(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned char *pcPasswRam1,unsigned short
                      iStartAdr,unsigned short iLength, unsigned char *pcOutData);

extern short CbN_ReadRAM2(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned char *pcPasswRam2,unsigned short
                      iStartAdr,unsigned short iLength, unsigned char *pcOutData);

extern short CbN_WriteRAM1(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned char *pcPasswRam1,unsigned short
                      iStartAdr,unsigned short iLength,unsigned char *pcOutData);

extern short CbN_WriteRAM2(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned char *pcPasswRam2,unsigned short
                      iStartAdr,unsigned short iLength,unsigned char *pcOutData);

extern short CbN_IncRAM1(unsigned short iPortNr, unsigned short iIdNr, unsigned char
                      *pcSCodeId, unsigned char *pcPasswRam1, unsigned short
                      iCounterAdr, unsigned short *piNewCount);

extern short CbN_DecRAM1(unsigned short iPortNr, unsigned short iIdNr, unsigned char
                      *pcSCodeId, unsigned char *pcPasswRam1, unsigned short
                      iCounterAdr, unsigned short *piNewCount);

extern short CbN_IncRAM2(unsigned short iPortNr, unsigned short iIdNr, unsigned char
                      *pcSCodeId, unsigned char *pcPasswRam2, unsigned short
                      iCounterAdr, unsigned short *piNewCount);

extern short CbN_DecRAM2(unsigned short iPortNr, unsigned short iIdNr, unsigned char
                      *pcSCodeId, unsigned char *pcPasswRam2, unsigned short
                      iCounterAdr, unsigned short *piNewCount);


extern short CbN_Decrypt(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned short iSeed, unsigned short iLength,
                      unsigned char *pcOutData);

extern short CbN_Encrypt(unsigned short iPortNr,unsigned short iIdNr,unsigned char
                      *pcSCodeId,unsigned short iSeed,unsigned short iLength,
                      unsigned char *pcOutData);

extern short CbN_IDEA_Encrypt(unsigned short iPortNr, unsigned short iIdNr,
                           unsigned char *pcSCodeId, unsigned char *pcBuff,
                           unsigned long lLength);

extern short CbN_IDEA_Decrypt(unsigned short iPortNr, unsigned short iIdNr,
                           unsigned char *pcSCodeId, unsigned char *pcBuff,
                           unsigned long lLength);

extern short CbN_IDEA_EncryptP(unsigned short iPortNr, unsigned short iIdNr,
                           unsigned char *pcSCodeId, unsigned char *pcBuff,
                           unsigned long lLength, unsigned long lIdeaKey);

extern short CbN_IDEA_DecryptP(unsigned short iPortNr, unsigned short iIdNr,
                           unsigned char *pcSCodeId, unsigned char *pcBuff,
                           unsigned long lLength, unsigned long lIdeaKey);

extern short CbN_SetCounterRAM1(unsigned short iPortNr, unsigned short iIdNr,
                              unsigned char *pcSCodeId, unsigned char
                              *pcPassRam, unsigned short iAdrCount, unsigned short
                              iNewCount);

extern short CbN_ReadCounterRAM1(unsigned short iPortNr, unsigned short iIdNr,
                               unsigned char *pcSCodeId, unsigned char
                               *pcPassRam, unsigned short iAdrCount, unsigned short
                               *piCurrentCount);

extern short CbN_SetCounterRAM2(unsigned short iPortNr, unsigned short iIdNr,
                              unsigned char *pcSCodeId, unsigned char
                              *pcPassRam, unsigned short iAdrCount, unsigned short
                              iNewCount);

extern short CbN_ReadCounterRAM2(unsigned short iPortNr, unsigned short iIdNr,
                               unsigned char *pcSCodeId, unsigned char
                               *pcPassRam, unsigned short iAdrCount, unsigned short
                               *piCurrentCount);

}