unit diCryptoSys;
interface
{
  Delphi/FreePascal interface for CryptoSys API
  $Id: diCryptoSys.pas $
  Copyright (C) 2010-16 David Ireland, DI Management Services Pty Limited.
  All rights reserved. <www.di-mgt.com.au> <www.cryptosys.net>
  Provided as is with no warranties. Use at your own risk.
  Last updated:
    $Date: 2016-01-26 16:47 $
    $Revision: 5.1.0 $
}

  { GENERAL FUNCTIONS }
  function API_Version : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_ErrorLookup(szOutput : PAnsiChar; nMaxChars : LongInt; nErrCode : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_CompileTime(szOutput : PAnsiChar; nMaxChars : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_ModuleName(szOutput : PAnsiChar; nMaxChars : LongInt; reserved : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_PowerUpTests(nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_LicenceType(nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function API_ErrorCode : LongInt; stdcall; external 'diCryptoSys.dll';

  { AES-128 PROTOTYPES }
  function AES128_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_Init(lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function AES128_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function AES128_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES128_InitError : LongInt; stdcall; external 'diCryptoSys.dll';

  { AES-192 PROTOTYPES }
  function AES192_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_Init(lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function AES192_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function AES192_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES192_InitError : LongInt; stdcall; external 'diCryptoSys.dll';

  { AES-256 PROTOTYPES }
  function AES256_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_Init(lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function AES256_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function AES256_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AES256_InitError : LongInt; stdcall; external 'diCryptoSys.dll';

  { BLOWFISH PROTOTYPES }
  function BLF_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; keyBytes : LongInt; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; keyBytes : LongInt; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; keyBytes : LongInt; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; sHexIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_Init(lpKey : PByte; keyBytes : LongInt; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; sHexIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function BLF_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function BLF_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function BLF_InitError : LongInt; stdcall; external 'diCryptoSys.dll';

  { DES PROTOTYPES }
  function DES_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_Init(lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function DES_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function DES_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_InitError : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_CheckKey(lpKey : PByte; nKeyLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function DES_CheckKeyHex(szHexKey : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';

  { TRIPLE DES PROTOTYPES }
  function TDEA_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_BytesMode(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_Hex(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_HexMode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_B64Mode(szOutput : PAnsiChar; szInput : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_File(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_FileHex(szFileOut : AnsiString; szFileIn : AnsiString; szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_Init(lpKey : PByte; fEncrypt : LongInt; szMode : AnsiString; lpIV : PByte) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_InitHex(szKey : AnsiString; fEncrypt : LongInt; szMode : AnsiString; szIV : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_Update(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  {function TDEA_UpdateHex(hContext : LongInt; szHexData : PAnsiChar) : LongInt; stdcall; external 'diCryptoSys.dll'; }
  function TDEA_Final(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function TDEA_InitError : LongInt; stdcall; external 'diCryptoSys.dll';

  { KEY WRAP FUNCTIONS }
  function CIPHER_KeyWrap(lpOutput : PByte; nOutBytes : LongInt; lpData : PByte; nDataLen : LongInt; lpKEK : PByte; nKekLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_KeyUnwrap(lpOutput : PByte; nOutBytes : LongInt; lpData : PByte; nDataLen : LongInt; lpKEK : PByte; nKekLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { GENERIC BLOCK CIPHER FUNCTIONS }
  function CIPHER_EncryptBytesPad(lpOutput : PByte; nOutBytes : LongInt; lpInput : PByte; nInputLen : LongInt; lpKey : PByte; lpIV : PByte; szAlgModePad : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_DecryptBytesPad(lpOutput : PByte; nOutBytes : LongInt; lpInput : PByte; nInputLen : LongInt; lpKey : PByte; lpIV : PByte; szAlgModePad : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  
  { STREAM CIPHER FUNCTIONS }
  function CIPHER_StreamBytes(lpOutput : PByte; lpData : PByte; nDataLen : LongInt; lpKey : PByte; nKeyLen : LongInt; lpIV : PByte; nIvLen : LongInt; nCounter : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_StreamHex(szOutput : PAnsiChar; nOutChars : LongInt; szInputHex : AnsiString; szKeyHex : AnsiString; szIvHex : AnsiString; nCounter : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_StreamFile(szFileOut : AnsiString; szFileIn : AnsiString; lpKey : PByte; nKeyLen : LongInt; lpIV : PByte; nIvLen : LongInt; nCounter : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_StreamInit(lpKey : PByte; nKeyLen : LongInt; lpIV : PByte; nIvLen : LongInt; nCounter : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_StreamUpdate(hContext : LongInt; lpOutput : PByte; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CIPHER_StreamFinal(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { RC4-COMPATIBLE PC1 PROTOTYPES }
  { Superseded by CIPHER_Stream functions in [v5.0] }
  function PC1_Bytes(lpOutput : PByte; lpInput : PByte; nBytes : LongInt; lpKey : PByte; nKeyBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PC1_File(szFileOut : PAnsiChar; szFileIn : PAnsiChar; lpKey : PByte; nKeyBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PC1_Hex(szOutput : PAnsiChar; nMaxChars : LongInt; szInputHex : AnsiString; szKeyHex : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  
  { GCM AUTHENTICATED EN/DECRYPTION FUNCTIONS }
  { Partly superseded by AEAD functions in [v5.1] }
  function GCM_Encrypt(lpOutput : PByte; nOutLen : LongInt; lpTagOut : PByte; nTagLen : LongInt; lpData : PByte; nDataLen : LongInt; lpKey : PByte; nKeyLen : LongInt; lpIV : PByte; nIvLen : LongInt; lpAAD : PByte; nAadLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function GCM_Decrypt(lpOutput : PByte; nOutLen : LongInt; lpData : PByte; nDataLen : LongInt; lpKey : PByte; nKeyLen : LongInt; lpIV : PByte; nIvLen : LongInt; lpAAD : PByte; nAadLen : LongInt; lpTag : PByte; nTagLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function GCM_InitKey(lpKey : PByte; nKeyLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function GCM_NextEncrypt(hContext : LongInt; lpOutput : PByte; nOutLen : LongInt; lpTagOut : PByte; nTagLen : LongInt; lpData : PByte; nDataLen : LongInt; lpIV : PByte; nIvLen : LongInt; lpAAD : PByte; nAadLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function GCM_NextDecrypt(hContext : LongInt; lpOutput : PByte; nOutLen : LongInt; lpData : PByte; nDataLen : LongInt; lpIV : PByte; nIvLen : LongInt; lpAAD : PByte; nAadLen : LongInt; lpTag : PByte; nTagLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function GCM_FinishKey(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { AEAD FUNCTIONS }
  function AEAD_Encrypt(lpOutput : PByte; nOutLen : LongInt; lpTagOut : PByte; nTagLen : LongInt; lpData : PByte; nDataLen : LongInt; lpKey : PByte; nKeyLen : LongInt; lpNonce : PByte; nNonceLen : LongInt; lpAAD : PByte; nAadLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_Decrypt(lpOutput : PByte; nOutLen : LongInt; lpData : PByte; nDataLen : LongInt; lpKey : PByte; nKeyLen : LongInt; lpNonce : PByte; nNonceLen : LongInt; lpAAD : PByte; nAadLen : LongInt; lpTag : PByte; nTagLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_InitKey(lpKey : PByte; nKeyLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_SetNonce(hContext : LongInt; lpNonce : PByte; nNonceLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_AddAAD(hContext : LongInt; lpAAD : PByte; nAadLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_StartEncrypt(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_StartDecrypt(hContext : LongInt; lpTagToCheck : PByte; nTagLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_Update(hContext : LongInt; lpOutput : PByte; nOutLen : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_FinishEncrypt(hContext : LongInt; lpTagOut : PByte; nTagLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_FinishDecrypt(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function AEAD_Destroy(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { GENERIC MESSAGE DIGEST HASH FUNCTIONS }
  function HASH_Bytes(lpOutput : PByte; nOutLen : LongInt; lpMessage : PByte; nMsgLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function HASH_File(lpOutput : PByte; nOutLen : LongInt; szFileName : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function HASH_HexFromBytes(szOutput : PAnsiChar; nMaxChars : LongInt; lpMessage : PByte; nMsgLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function HASH_HexFromFile(szOutput : PAnsiChar; nMaxChars : LongInt; szFileName : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function HASH_HexFromHex(szOutput : PAnsiChar; nMaxChars : LongInt; szMsgHex : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function HASH_HexFromBits(szOutput : PAnsiChar; nMaxChars : LongInt; lpData : PByte; nDataBitLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { GENERIC MAC FUNCTIONS (HMAC and CMAC) }
  function MAC_Bytes(lpOutput : PByte; nOutLen : LongInt; lpMessage : PByte; nMsgLen : LongInt; lpKey : PByte; nKeyLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MAC_HexFromBytes(szOutput : PAnsiChar; nMaxChars : LongInt; lpMessage : PByte; nMsgLen : LongInt; lpKey : PByte; nKeyLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MAC_HexFromHex(szOutput : PAnsiChar; nMaxChars : LongInt; szMsgHex : AnsiString; szKeyHex : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { SHA-1 PROTOTYPES }
  function SHA1_StringHexHash(szDigest : PAnsiChar; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_FileHexHash(szDigest : PAnsiChar; szFileName : AnsiString; szMode : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_BytesHexHash(szDigest : PAnsiChar; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_BytesHash(digest : PByte; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_Init : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_AddString(hContext : LongInt; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_AddBytes(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_HexDigest(szDigest : PAnsiChar; hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_Reset(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_Hmac(szDigest : PAnsiChar; textBytes : PByte; textLen : LongInt; lpKeyBytes : PByte; keyLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA1_HmacHex(szDigest : PAnsiChar; sHexText : AnsiString; sHexKey : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';

  { SHA-256 PROTOTYPES }
  function SHA2_StringHexHash(szDigest : PAnsiChar; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_FileHexHash(szDigest : PAnsiChar; szFileName : AnsiString; szMode : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_BytesHexHash(szDigest : PAnsiChar; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_BytesHash(lpDigest : PByte; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_Init : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_AddString(hContext : LongInt; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_AddBytes(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_HexDigest(szDigest : PAnsiChar; hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_Reset(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_Hmac(szDigest : PAnsiChar; textBytes : PByte; textLen : LongInt; lpKeyBytes : PByte; keyLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function SHA2_HmacHex(szDigest : PAnsiChar; sHexText : AnsiString; sHexKey : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';

  { MD5 PROTOTYPES }
  function MD5_StringHexHash(szDigest : PAnsiChar; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_FileHexHash(szDigest : PAnsiChar; szFileName : AnsiString; szMode : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_BytesHexHash(szDigest : PAnsiChar; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_BytesHash(digest : PByte; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_Init : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_AddString(hContext : LongInt; szMessage : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_AddBytes(hContext : LongInt; lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_HexDigest(szDigest : PAnsiChar; hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_Reset(hContext : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_Hmac(szDigest : PAnsiChar; textBytes : PByte; textLen : LongInt; lpKeyBytes : PByte; keyLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function MD5_HmacHex(szDigest : PAnsiChar; szHexText : AnsiString; szHexKey : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';

  { RNG PROTOTYPES }
  function RNG_KeyBytes(lpOutput : PByte; nOutputLen : LongInt; lpSeed : PByte; nSeedLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_KeyHex(szOutput : PAnsiChar; nMaxChars : LongInt; nBytes : LongInt; lpSeed : PByte; nSeedLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_NonceData(lpOutput : PByte; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_NonceDataHex(szOutput : PAnsiChar; nMaxChars : LongInt; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_Test(szFileName : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_Number(nLower : LongInt; nUpper : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_BytesWithPrompt(lpOutput : PByte; nOutputLen : LongInt; szPrompt : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_HexWithPrompt(szOutput : PAnsiChar; nMaxChars : LongInt; nBytes : LongInt; szPrompt : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_Initialize(szSeedFile : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_MakeSeedFile(szSeedFile : AnsiString; szPrompt : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_UpdateSeedFile(szSeedFile : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function RNG_TestDRBGVS(szOutput : PAnsiChar; nMaxChars : LongInt; nReturnedBitsLen : LongInt; szEntropyInput : AnsiString;
    szNonce : AnsiString; szPersonalizationString : AnsiString; szAdditionalInput1 : AnsiString;
    szEntropyReseed : AnsiString; szAdditionalInputReseed : AnsiString; szAdditionalInput2 : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { ZLIB COMPRESSION PROTOTYPES }
  function ZLIB_Deflate(lpOutput : PByte; nOutputLen : LongInt; lpInput : PByte; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function ZLIB_Inflate(lpOutput : PByte; nOutputLen : LongInt; lpInput : PByte; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { PASSWORD-BASED ENCRYPTION PROTOTYPES }
  function PBE_Kdf2(lpOutput : PByte; nOutputLen : LongInt; lpPwd : PByte; nPwdLen : LongInt; lpSalt : PByte; nSaltLen : LongInt; nCount : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PBE_Kdf2Hex(szOutput : PAnsiChar; nMaxChars : LongInt; dkBytes : LongInt; szPwd : AnsiString; szSaltHex : AnsiString; nCount : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { HEX CONVERSION PROTOTYPES }
  function CNV_HexStrFromBytes(szOutput : PAnsiChar; nMaxChars : LongInt; lpInput : PByte; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CNV_BytesFromHexStr(lpOutput : PByte; nOutputLen : LongInt; szInput : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CNV_HexFilter(szOutput : PAnsiChar; szInput : AnsiString; nInStrLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { BASE64 CONVERSION PROTOTYPES }
  function CNV_B64StrFromBytes(szOutput : PAnsiChar; nMaxChars : LongInt; lpInput : PByte; nBytes : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CNV_BytesFromB64Str(lpOutput : PByte; nOutputLen : LongInt; szInput : AnsiString) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CNV_B64Filter(szOutput : PAnsiChar; szInput : AnsiString; nInStrLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { CRC-32 CHECKSUM PROTOTYPES }
  function CRC_Bytes(lpInput : PByte; nBytes : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CRC_String(szInput : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function CRC_File(szFileName : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { WIPE PROTOTYPES }
  function WIPE_Data(lpData : PByte; nDataLen : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function WIPE_File(szFileName : AnsiString; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

  { PADDING PROTOTYPES }
  function PAD_BytesBlock(lpOutput : PByte; nOutputLen : LongInt; lpInput : PByte; nBytes : LongInt; nBlkLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PAD_UnpadBytes(lpOutput : PByte; nOutputLen : LongInt; lpInput : PByte; nBytes : LongInt; nBlkLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PAD_HexBlock(szOutput : PAnsiChar; nMaxChars : LongInt; szInput : AnsiString; nBlkLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';
  function PAD_UnpadHex(szOutput : PAnsiChar; nMaxChars : LongInt; szInput : AnsiString; nBlkLen : LongInt; nOptions : LongInt) : LongInt; stdcall; external 'diCryptoSys.dll';

const
  { CONSTANTS }
  ENCRYPT = 1;
  DECRYPT = 0;
  { Maximum number of bytes in hash digest byte array }
  API_MAX_HASH_BYTES = 64;
  API_SHA1_BYTES =     20;
  API_SHA224_BYTES =   28;
  API_SHA256_BYTES =   32;
  API_SHA384_BYTES =   48;
  API_SHA512_BYTES =   64;
  API_MD5_BYTES =      16;
  API_MD2_BYTES =      16;
  API_RMD160_BYTES =   20;
  { Maximum number of hex characters in hash digest }
  API_MAX_HASH_CHARS = (2*API_MAX_HASH_BYTES);
  API_SHA1_CHARS =     (2*API_SHA1_BYTES);
  API_SHA224_CHARS =   (2*API_SHA224_BYTES);
  API_SHA256_CHARS =   (2*API_SHA256_BYTES);
  API_SHA384_CHARS =   (2*API_SHA384_BYTES);
  API_SHA512_CHARS =   (2*API_SHA512_BYTES);
  API_MD5_CHARS =      (2*API_MD5_BYTES);
  API_MD2_CHARS =      (2*API_MD2_BYTES);
  API_RMD160_CHARS =   (2*API_RMD160_BYTES);
  { Maximum lengths of MAC tags }
  API_MAX_HMAC_BYTES = 64;
  API_MAX_CMAC_BYTES = 16;
  API_MAX_GMAC_BYTES = 16;
  API_POLY1305_BYTES = 16;
  API_AEAD_TAG_MAX_BYTES = 16;
  API_MAX_HMAC_CHARS = (2*API_MAX_HMAC_BYTES);
  API_MAX_CMAC_CHARS = (2*API_MAX_CMAC_BYTES);
  API_MAX_GMAC_CHARS = (2*API_MAX_GMAC_BYTES);
  API_POLY1305_CHARS = (2*API_POLY1305_BYTES);
  { Encryption block sizes in bytes }
  API_BLK_DES_BYTES =  8;
  API_BLK_TDEA_BYTES = 8;
  API_BLK_BLF_BYTES =  8;
  API_BLK_AES_BYTES =  16;
  { Key size in bytes }
  API_KEYSIZE_TDEA_BYTES = 24;
  API_KEYSIZE_AES_MAX_BYTES = 32;
  { Required size for RNG seed file }
  API_RNG_SEED_BYTES = 64;

  { OPTIONS }
  { Options for HASH functions }
  API_HASH_SHA1 =     0;
  API_HASH_MD5 =      1;
  API_HASH_MD2 =      2;
  API_HASH_SHA256 =   3;
  API_HASH_SHA384 =   4;
  API_HASH_SHA512 =   5;
  API_HASH_SHA224 =   6;
  API_HASH_RMD160 =   7;
  API_HASH_MODE_TEXT = $10000;

  { Options for MAC functions }
  API_CMAC_TDEA =     $100;  { ) synonyms }
  API_CMAC_DESEDE =   $100;  { ) synonyms }
  API_CMAC_AES128 =   $101;
  API_CMAC_AES192 =   $102;
  API_CMAC_AES256 =   $103;

  { Options for RNG functions }
  API_RNG_STRENGTH_112 =        $00;
  API_RNG_STRENGTH_128 =        $01;

  { Block cipher (BC) algorithm options }
  API_BC_TDEA =    $10;  { ) }
  API_BC_3DES =    $10;  { ) equiv. synonyms for Triple DES }
  API_BC_DESEDE3 = $10;  { ) }
  API_BC_AES128 =  $20;
  API_BC_AES192 =  $30;
  API_BC_AES256 =  $40;

   { Block cipher mode options }
  API_MODE_ECB = $000;
  API_MODE_CBC = $100;
  API_MODE_OFB = $200;
  API_MODE_CFB = $300;
  API_MODE_CTR = $400;
  
  { Block cipher padding options }
  API_PAD_DEFAULT = $0;
  API_PAD_NOPAD = $10000;
  API_PAD_PKCS5 = $20000;
  API_PAD_1ZERO = $30000;
  
  { Cipher file options }
  API_IV_PREFIX = $1000;
  API_PAD_LEAVE = $2000;
  
  { Stream cipher (SC) algorithm options (NB no zero default) }
  API_SC_ARCFOUR = 1;
  API_SC_SALSA20 = 2;
  API_SC_CHACHA20 = 3;
  
  { AEAD algorithm options }
  API_AEAD_AES_128_GCM = 1;
  API_AEAD_AES_256_GCM = 2;
  API_AEAD_CHACHA20_POLY1305 = 29;

  { General }
  API_GEN_PLATFORM = $40;

implementation
end.