Return to Unit Reference
Description
Ultibo Crypto interface unit
To be documented
Constants
[Expand]
Cipher algorithms CRYPTO_CIPHER_ALG_*
CRYPTO_CIPHER_ALG_NONE = 0;
|
|
CRYPTO_CIPHER_ALG_AES = 1;
|
|
CRYPTO_CIPHER_ALG_DES = 2;
|
|
CRYPTO_CIPHER_ALG_3DES = 3;
|
|
CRYPTO_CIPHER_ALG_RC4 = 4;
|
|
[Expand]
Cipher modes CRYPTO_CIPHER_MODE_*
CRYPTO_CIPHER_MODE_ECB = 0;
|
Electronic Codebook
|
CRYPTO_CIPHER_MODE_CBC = 1;
|
Cipher Block Chaining
|
CRYPTO_CIPHER_MODE_CFB = 2;
|
Cipher Feedback
|
CRYPTO_CIPHER_MODE_OFB = 3;
|
Output Feedback
|
CRYPTO_CIPHER_MODE_CTR = 4;
|
Counter
|
CRYPTO_CIPHER_MODE_CCM = 5;
|
Counter with CBC-MAC
|
CRYPTO_CIPHER_MODE_GCM = 5;
|
Galois/Counter Mode
|
[Expand]
Hash algorithms CRYPTO_HASH_ALG_*
CRYPTO_HASH_ALG_NONE = 0;
|
|
CRYPTO_HASH_ALG_MD5 = 1;
|
|
CRYPTO_HASH_ALG_SHA1 = 2;
|
|
CRYPTO_HASH_ALG_SHA256 = 3;
|
|
CRYPTO_HASH_ALG_HMAC_MD5 = 4;
|
|
CRYPTO_HASH_ALG_HMAC_SHA1 = 5;
|
|
CRYPTO_HASH_ALG_HMAC_SHA256 = 6;
|
|
CRYPTO_HASH_ALG_SHA384 = 7;
|
|
CRYPTO_HASH_ALG_SHA512 = 8;
|
|
CRYPTO_HASH_ALG_HMAC_SHA384 = 9;
|
|
CRYPTO_HASH_ALG_HMAC_SHA512 = 10;
|
|
[Expand]
AES block size AES_BLOCK_*
AES_BLOCK_SIZE = 16;
|
128 bit blocks
|
[Expand]
AES key size AES_KEY_*
AES_KEY_SIZE128 = 16;
|
128 bit keys
|
AES_KEY_SIZE192 = 24;
|
192 bit keys
|
AES_KEY_SIZE256 = 32;
|
256 bit keys
|
[Expand]
DES block size DES_BLOCK_*
DES_BLOCK_SIZE = 8;
|
64 bit blocks
|
[Expand]
DES key size DES_KEY_*
DES_KEY_SIZE = 8;
|
64 bit keys
|
[Expand]
DES key type DES_KEYTYPE_*
DES_KEYTYPE_ENCRYPT = 0;
|
|
DES_KEYTYPE_DECRYPT = 1;
|
|
|
DES_BYTEBIT:array[0..7] of LongWord = (
|
$80, $40, $20, $10, $08, $04, $02, $01);
|
|
[Expand]
3DES block size DES3_BLOCK_*
DES3_BLOCK_SIZE = 8;
|
64 bit blocks
|
[Expand]
3DES key size DES3_KEY_*
DES3_KEY_SIZE = 24;
|
192 bit (3 x 64 bit) keys
|
[Expand]
SHA1 constants SHA1_*
SHA1_K20 = $5A827999;
|
|
SHA1_K40 = $6ED9EBA1;
|
|
SHA1_K60 = $8F1BBCDC;
|
|
SHA1_K80 = $CA62C1D6;
|
|
[Expand]
RSA constants RSA_*
RSA_MODULUS_BYTES_MAX = 512;
|
4096 bit maximum
|
[Expand]
Base64 constants BASE64_*
Base64EncodeTable:String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
Type definitions
MD5 digest
[Expand]
PMD5Digest = ^TMD5Digest;
TMD5Digest = array[0..15] of Byte;
MD5 block
[Expand]
PMD5Block = ^TMD5Block;
TMD5Block = record
Data:Pointer;
|
|
Size:LongWord;
|
|
Next:PMD5Block;
|
|
MD5 context
[Expand]
PMD5Context = ^TMD5Context;
TMD5Context = record
Data:array[0..63] of Byte;
|
|
Buffer:array[0..3] of LongWord;
|
|
Count:QWord;
|
|
MD5 byte buffer
[Expand]
PMD5ByteBuffer = ^TMD5ByteBuffer;
TMD5ByteBuffer = array[0..63] of Byte;
MD5 long buffer
[Expand]
PMD5LongBuffer = ^TMD5LongBuffer;
TMD5LongBuffer = array[0..15] of LongWord;
AES key
[Expand]
PAESKey = ^TAESKey;
TAESKey = record
Rounds:LongWord;
|
|
EncryptKey:array[0..59] of LongWord;
|
|
DecryptKey:array[0..59] of LongWord;
|
|
AES context
[Expand]
PAESContext = ^TAESContext;
TAESContext = record
AESKey:TAESKey;
|
|
CBC:array[0..AES_BLOCK_SIZE - 1] of Byte;
|
|
DES key
[Expand]
PDESKey = ^TDESKey;
TDESKey = array[0..31] of LongWord;
DES context
[Expand]
PDESContext = ^TDESContext;
TDESContext = record
EncryptKey:TDESKey;
|
|
DecryptKey:TDESKey;
|
|
CBC:array[0..DES_BLOCK_SIZE - 1] of Byte;
|
|
3DES key
[Expand]
PDES3Key = ^TDES3Key;
TDES3Key = record
EncryptKey:array[0..2] of TDESKey;
|
|
DecryptKey:array[0..2] of TDESKey;
|
|
3DES context
[Expand]
PDES3Context = ^TDES3Context;
TDES3Context = record
DES3Key:TDES3Key;
|
|
CBC:array[0..DES3_BLOCK_SIZE - 1] of Byte;
|
|
RC4 state
[Expand]
PRC4State = ^TRC4State;
TRC4State = array[0..255] of Byte;
RC4 context
[Expand]
PRC4Context = ^TRC4Context;
TRC4Context = record
Key:array[0..31] of Byte;
|
|
KeySize:LongWord;
|
|
Start:LongWord;
|
|
SHA1 digest
[Expand]
PSHA1Digest = ^TSHA1Digest;
TSHA1Digest = array[0..19] of Byte;
SHA1 block
[Expand]
PSHA1Block = ^TSHA1Block;
TSHA1Block = record
Data:Pointer;
|
|
Size:LongWord;
|
|
Next:PSHA1Block;
|
|
SHA1 context
[Expand]
PSHA1Context = ^TSHA1Context;
TSHA1Context = record
Data:array[0..63] of Byte;
|
|
State:array[0..4] of LongWord;
|
|
Count:QWord;
|
|
SHA1 byte buffer
[Expand]
PSHA1ByteBuffer = ^TSHA1ByteBuffer;
TSHA1ByteBuffer = array[0..63] of Byte;
SHA1 long buffer
[Expand]
PSHA1LongBuffer = ^TSHA1LongBuffer;
TSHA1LongBuffer = array[0..15] of LongWord;
SHA256 digest
[Expand]
PSHA256Digest = ^TSHA256Digest;
TSHA256Digest = array[0..31] of Byte;
SHA256 block
[Expand]
PSHA256Block = ^TSHA256Block;
TSHA256Block = record
Data:Pointer;
|
|
Size:LongWord;
|
|
Next:PSHA256Block;
|
|
SHA256 context
[Expand]
PSHA256Context = ^TSHA256Context;
TSHA256Context = record
Data:array[0..63] of Byte;
|
|
State:array[0..7] of LongWord;
|
|
Count:QWord;
|
|
SHA256 byte buffer
[Expand]
PSHA256ByteBuffer = ^TSHA256ByteBuffer;
TSHA256ByteBuffer = array[0..63] of Byte;
SHA256 long buffer
[Expand]
PSHA256LongBuffer = ^TSHA256LongBuffer;
TSHA256LongBuffer = array[0..15] of LongWord;
SHA256 algorithm
[Expand]
PSHA256_W = ^TSHA256_W;
TSHA256_W = array[0..63] of LongWord;
Note: This is the W array for the SHA256 algorithm
|
|
|
Hash context
[Expand]
PHashContext = ^THashContext;
THashContext = record
Algorithm:LongWord;
|
|
Key:array[0..63] of Byte;
|
|
KeySize:LongWord;
|
|
case Integer of
|
|
0:(MD5:TMD5Context);
|
|
1:(SHA1:TSHA1Context);
|
|
2:(SHA256:TSHA256Context);
|
|
Cipher context
[Expand]
PCipherContext = ^TCipherContext;
TCipherContext = record
Algorithm:LongWord;
|
|
case Integer of
|
|
0:(RC4:TRC4Context);
|
|
1:(DES:TDESContext);
|
|
2:(DES3:TDES3Context);
|
|
3:(AES:TAESContext);
|
|
Public variables
Crypto specific variables
CryptoInitialized:Boolean;
|
|
MIME64 variables
MIME64DecodingTable:String;
|
|
Function declarations
Initialization functions
[Expand]
procedure CryptoInit;
Description: To be documented
Crypto functions
[Expand]
function HashCreate(Algorithm:LongWord; Key:Pointer; KeySize:LongWord):PHashContext;
Description: Initialize a hash context based on an algorithm and an optional key
[Expand]
function HashDestroy(Context:PHashContext):Boolean;
Description: Free a hash context allocated by HashCreate
[Expand]
function HashUpdate(Context:PHashContext; Data:Pointer; Size:LongWord):Boolean;
Description: Add a block of data to a hash context
[Expand]
function HashFinish(Context:PHashContext; Digest:Pointer; Size:LongWord):Boolean;
Description: Finalize a hash context and return the digest (Hash) value
[Expand]
function CipherCreate(Algorithm:LongWord; Vector,Key:Pointer; KeySize:LongWord):PCipherContext;
Description: Initialize a cipher context based on an algorithm and a key
Note
|
For block ciphers also include an initialization vector for CBC mode
|
[Expand]
function CipherDestroy(Context:PCipherContext):Boolean;
Description: Free a cipher context allocated by CipherCreate
[Expand]
function CipherEncrypt(Context:PCipherContext; Plain,Crypt:Pointer; Size:LongWord):Boolean;
Description: Encrypt a block of data using an existing cipher context
[Expand]
function CipherDecrypt(Context:PCipherContext; Crypt,Plain:Pointer; Size:LongWord):Boolean;
Description: Decrypt a block of data using an existing cipher context
MD5 functions
[Expand]
function MD5DigestData(Data:PMD5Block; Digest:PMD5Digest):Boolean;
Description: Generate a 128 bit MD5 digest (Hash) from the supplied data
Data
|
A linked list which can contain multiple independent blocks to be included in the hash. The data block itself does not form part of the hash.
|
[Expand]
function MD5DigestString(const Value:String; Digest:PMD5Digest):Boolean;
Description: Generate a 128 bit MD5 digest (Hash) from the supplied string value
[Expand]
function HMACMD5DigestData(const Key:String; Data:PMD5Block; Digest:PMD5Digest):Boolean;
Description: Generate an MD5 HMAC (Hashed Message Authentication Code) using the Key and Data
Key
|
If Key is more than 64 bytes it will be hashed to Key = MD5(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The MD5 HMAC algorithm is: MD5(Key xor oPad, MD5(Key xor iPad, Data)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
[Expand]
function HMACMD5DigestString(const Key,Value:String; Digest:PMD5Digest):Boolean;
Description: Generate an MD5 HMAC (Hashed Message Authentication Code) using the Key and Value
Key
|
If Key is more than 64 bytes it will be hashed to Key = MD5(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The MD5 HMAC algorithm is: MD5(Key xor oPad, MD5(Key xor iPad, Value)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
AES functions
[Expand]
function AESEncryptData(Key:Pointer; KeySize:LongWord; Vector,Plain,Crypt:Pointer; Size:LongWord):Boolean;
Description: To be documented
[Expand]
function AESDecryptData(Key:Pointer; KeySize:LongWord; Vector,Crypt,Plain:Pointer; Size:LongWord):Boolean;
Description: To be documented
DES functions
[Expand]
function DESEncryptData(Key:Pointer; KeySize:LongWord; Vector,Plain,Crypt:Pointer; Size:LongWord):Boolean;
Description: To be documented
[Expand]
function DESDecryptData(Key:Pointer; KeySize:LongWord; Vector,Crypt,Plain:Pointer; Size:LongWord):Boolean;
Description: To be documented
3DES functions
[Expand]
function DES3EncryptData(Key:Pointer; KeySize:LongWord; Vector,Plain,Crypt:Pointer; Size:LongWord):Boolean;
Description: To be documented
[Expand]
function DES3DecryptData(Key:Pointer; KeySize:LongWord; Vector,Crypt,Plain:Pointer; Size:LongWord):Boolean;
Description: To be documented
RC4 functions
[Expand]
function RC4EncryptData(Key:Pointer; KeySize:LongWord; Plain,Crypt:Pointer; Size,Start:LongWord):Boolean;
Description: Encrypt the supplied data with a key using the RC4 cipher algorithm
Start
|
Specify how many bytes of the RC4 cipher stream to skip to allow for previous blocks of data or to comply with RFC4345 requirements to discard the first 1536 bytes of the RC4 cipher stream
|
[Expand]
function RC4DecryptData(Key:Pointer; KeySize:LongWord; Crypt,Plain:Pointer; Size,Start:LongWord):Boolean; inline;
Description: Decrypt the supplied data with a key using the RC4 cipher algorithm
SHA1 functions
[Expand]
function SHA1DigestData(Data:PSHA1Block; Digest:PSHA1Digest):Boolean;
Description: Generate a 160 bit SHA1 digest (Hash) from the supplied data
Data
|
A linked list which can contain multiple independent blocks to be included in the hash. The data block itself does not form part of the hash.
|
[Expand]
function SHA1DigestString(const Value:String; Digest:PSHA1Digest):Boolean;
Description: Generate a 160 bit SHA1 digest (Hash) from the supplied string value
[Expand]
function HMACSHA1DigestData(const Key:String; Data:PSHA1Block; Digest:PSHA1Digest):Boolean;
Description: Generate a SHA1 HMAC (Hashed Message Authentication Code) using the Key and Data
Key
|
If Key is more than 64 bytes it will be hashed to Key = SHA1(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The SHA1 HMAC algorithm is: SHA1(Key xor oPad, SHA1(Key xor iPad, Data)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
[Expand]
function HMACSHA1DigestString(const Key,Value:String; Digest:PSHA1Digest):Boolean;
Description: Generate a SHA1 HMAC (Hashed Message Authentication Code) using the Key and Value
Key
|
If Key is more than 64 bytes it will be hashed to Key = SHA1(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The SHA1 HMAC algorithm is: SHA1(Key xor oPad, SHA1(Key xor iPad, Value)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
SHA256 functions
[Expand]
function SHA256DigestData(Data:PSHA256Block; Digest:PSHA256Digest):Boolean;
Description: Generate a 256 bit SHA256 digest (Hash) from the supplied data
Data
|
A linked list which can contain multiple independent blocks to be included in the hash. The data block itself does not form part of the hash.
|
[Expand]
function SHA256DigestString(const Value:String; Digest:PSHA256Digest):Boolean;
Description: Generate a 256 bit SHA256 digest (Hash) from the supplied string value
[Expand]
function HMACSHA256DigestData(const Key:String; Data:PSHA256Block; Digest:PSHA256Digest):Boolean;
Description: Generate a SHA256 HMAC (Hashed Message Authentication Code) using the Key and Data
Key
|
If Key is more than 64 bytes it will be hashed to Key = SHA256(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The SHA256 HMAC algorithm is: SHA256(Key xor oPad, SHA256(Key xor iPad, Data)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
[Expand]
function HMACSHA256DigestString(const Key,Value:String; Digest:PSHA256Digest):Boolean;
Description: Generate a SHA256 HMAC (Hashed Message Authentication Code) using the Key and Value
Key
|
If Key is more than 64 bytes it will be hashed to Key = SHA256(Key) instead. If Key is less than 64 bytes it will be padded with zeros.
|
Note
|
The SHA256 HMAC algorithm is: SHA256(Key xor oPad, SHA256(Key xor iPad, Value)). Where iPad is the byte $36 repeated 64 times, oPad is the byte $5c repeated 64 times.
|
CRC functions
[Expand]
function CRC16CCITT(CRC:Word; Data:PByte; Size:LongWord):Word;
Description: To be documented
MIME64 functions
[Expand]
function MIME64EncodeString(const AValue:String):String;
Description: To be documented
[Expand]
function MIME64DecodeString(const AValue:String):String;
Description: To be documented
Crypto helper functions
[Expand]
procedure BytesToLE(Buffer:PByte; Count:LongWord);
Description: Change the byte order of count longwords in the supplied buffer to little endian
[Expand]
procedure BytesToBE(Buffer:PByte; Count:LongWord);
Description: Change the byte order of count longwords in the supplied buffer to big endian
[Expand]
function LongWordToBE(Buffer:PByte):LongWord; inline;
Description: To be documented
[Expand]
procedure BEToLongWord(Value:LongWord; Buffer:PByte); inline;
Description: To be documented
MD5 helper functions
[Expand]
procedure MD5Init(var Context:TMD5Context);
Description: Initialize an MD5 context with constants
[Expand]
procedure MD5Update(var Context:TMD5Context; Data:Pointer; Size:LongWord);
Description: Add more bytes to the data buffer, add to the hash in 64 byte chunks
[Expand]
procedure MD5Final(var Context:TMD5Context; var Digest:TMD5Digest);
Description: Finalize the MD5 context by padding to a 64 Byte boundary, adding QWord count of bits processed and copying the hash to the digest
[Expand]
procedure MD5Transform(var Context:TMD5Context; Buffer:Pointer);
Description: The core MD5 algorithm, adds an additional 64 Bytes (16 LongWords) to the hash
[Expand]
function MD5DigestToString(Digest:PMD5Digest):String;
Description: To be documented
AES helper functions
[Expand]
function AESTE0(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE1(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE2(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE3(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTD0(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTD1(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTD2(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTD3(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE4_0(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE4_1(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE4_2(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESTE4_3(I:Byte):LongWord; inline;
Description: To be documented
[Expand]
function AESByte(X,N:LongWord):Byte; inline;
Description: To be documented
[Expand]
function AESKeySetup(Key:Pointer; KeySize:LongWord; AESKey:PAESKey):Boolean;
Description: To be documented
[Expand]
procedure AESEncryptBlock(Plain,Crypt:Pointer; AESKey:PAESKey);
Description: To be documented
[Expand]
procedure AESDecryptBlock(Crypt,Plain:Pointer; AESKey:PAESKey);
Description: To be documented
DES helper functions
[Expand]
procedure DESKey(Key:PByte; KeyType:LongWord; CryptKey:PDESKey);
Description: To be documented
[Expand]
procedure DESCook(Raw1:PLongWord; Key:PDESKey);
Description: To be documented
[Expand]
procedure DESProcess(Block,Key:PLongWord);
Description: To be documented
[Expand]
function DESKeySetup(Key:Pointer; KeySize:LongWord; EncryptKey,DecryptKey:PDESKey):Boolean;
Description: To be documented
[Expand]
procedure DESEncryptBlock(Plain,Crypt:Pointer; EncryptKey:PDESKey);
Description: To be documented
[Expand]
procedure DESDecryptBlock(Crypt,Plain:Pointer; DecryptKey:PDESKey);
Description: To be documented
3DES helper functions
[Expand]
function DES3KeySetup(Key:Pointer; KeySize:LongWord; DES3Key:PDES3Key):Boolean;
Description: To be documented
[Expand]
procedure DES3EncryptBlock(Plain,Crypt:Pointer; DES3Key:PDES3Key);
Description: To be documented
[Expand]
procedure DES3DecryptBlock(Crypt,Plain:Pointer; DES3Key:PDES3Key);
Description: To be documented
SHA1 helper functions
[Expand]
procedure SHA1Init(var Context:TSHA1Context);
Description: Initialize a SHA1 context with constants
[Expand]
procedure SHA1Update(var Context:TSHA1Context; Data:Pointer; Size:LongWord);
Description: Add more bytes to the data buffer, add to the hash in 64 byte chunks
[Expand]
procedure SHA1Final(var Context:TSHA1Context; var Digest:TSHA1Digest);
Description: Finalize the SHA1 context by padding to a 64 Byte boundary, adding QWord count of bits processed and copying the hash to the digest
[Expand]
procedure SHA1Transform(var Context:TSHA1Context; Buffer:Pointer);
Description: The core SHA1 algorithm, adds an additional 64 Bytes (512 bits) to the hash
[Expand]
function SHA1DigestToString(Digest:PSHA1Digest):String;
Description: To be documented
SHA256 helper functions
[Expand]
procedure SHA256Init(var Context:TSHA256Context);
Description: Initialize a SHA256 context with constants
[Expand]
procedure SHA256Process(var Context:TSHA256Context; Data:Pointer; Size:LongWord);
Description: Add more bytes to the data buffer, add to the hash in 64 byte chunks
[Expand]
procedure SHA256Complete(var Context:TSHA256Context; var Digest:TSHA256Digest);
Description: Finalize the SHA256 context by padding to a 64 Byte boundary, adding QWord count of bits processed and copying the hash to the digest
[Expand]
procedure SHA256Compress(var Context:TSHA256Context; Buffer:Pointer);
Description: The core SHA256 algorithm, adds an additional 64 Bytes (512 bits) to the hash
[Expand]
function SHA256DigestToString(Digest:PSHA256Digest):String;
Description: To be documented
MIME64 helper functions
[Expand]
procedure MIME64InitTables;
Description: To be documented
Return to Unit Reference