{$MODE OBJFPC}
{$H+}
program TestCrypto;
uses SysUtils, zCrypto;
var
sha1, sha2, sha3 :TDigest;
des, aes :TCipher;
rsa :TRsa;
plaindata,
encrypted,
decrypted,
key, iv, hmac,
a, b, c :TCryptoBytes;
tls :TTls;
begin
// https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program
WriteLn(TEngine.Version);
WriteLn;
a := TRandom.Generate(16);
b := TRandom.Generate(16);
WriteLn('a : ', a.ToHexString);
WriteLn('b : ', b.ToHexString);
c := a.XorWith(b);
WriteLn('a xor b : ', c.ToHexString);
c := a.OrWith(b);
WriteLn('a or b : ', c.ToHexString);
c := a.AndWith(b);
WriteLn('a and b : ', c.ToHexString);
WriteLn;
// test short message len 0
sha1 := TDigest.Create('sha1'); // MD = da39a3ee5e6b4b0d3255bfef95601890afd80709
sha2 := TDigest.Create('sha256'); // MD = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
sha3 := TDigest.Create('sha3-512'); // MD = a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26
WriteLn('digest');
WriteLn('sha1 : ', sha1.Digest(BytesOf('')).ToHexString);
WriteLn('sha2 : ', sha2.Digest(BytesOf('')).ToHexString);
WriteLn('sha3 : ', sha3.Digest(BytesOf('')).ToHexString);
{
// https://tools.ietf.org/html/rfc2202 sha1
test_case = 1
key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
key_len = 20
data = "Hi There"
data_len = 8
digest = 0xb617318655057264e28bc0b6fb378c8ef146be00
}
plaindata := BytesOf('Hi There');
key := BytesOf(#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b#$0b);
hmac := sha1.Sign(plaindata, key);
WriteLn;
WriteLn('sha1 sign : ', hmac.ToHexString);
WriteLn('sha1 verify : ', sha1.Verify(plaindata, key, hmac));
{
https://tools.ietf.org/html/rfc4231
Key = 0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
0b0b0b0b (20 bytes)
Data = 4869205468657265 ("Hi There")
HMAC-SHA-256 = b0344c61d8db38535ca8afceaf0bf12b
881dc200c9833da726e9376c2e32cff7
}
hmac := sha2.Sign(plaindata, key);
WriteLn;
WriteLn('sha2 sign : ', hmac.ToHexString);
WriteLn('sha2 verify : ', sha2.Verify(plaindata, key, hmac));
// test vector ????
hmac := sha3.Sign(plaindata, key);
WriteLn;
WriteLn('sha3 sign : ', hmac.ToHexString);
WriteLn('sha3 verify : ', sha3.Verify(plaindata, key, hmac));
des := TCipher.Create('des-ede3-cbc');
{
COUNT = 0
KEY1 = 46133dcbf232b519
KEY2 = 64e0d95e83208f15
KEY3 = 6732bf75b673abf1
IV = 34814c87f47fd59d
PLAINTEXT = de655a0ea771436c
CIPHERTEXT = 092368405296744a
}
key := BytesOf(#$46#$13#$3d#$cb#$f2#$32#$b5#$19#$64#$e0#$d9#$5e#$83#$20#$8f#$15#$67#$32#$bf#$75#$b6#$73#$ab#$f1);
iv := BytesOf(#$34#$81#$4c#$87#$f4#$7f#$d5#$9d);
plaindata := BytesOf(#$de#$65#$5a#$0e#$a7#$71#$43#$6c);
encrypted := des.Encrypt(plaindata, key, iv);
decrypted := des.Decrypt(encrypted, key, iv);
WriteLn;
WriteLn('des');
WriteLn('key : ', key.ToHexString);
WriteLn('iv : ', iv.ToHexString);
WriteLn('kcv : ', des.GetCheckValue(key).ToHexString);
WriteLn('plaindata : ', plaindata.ToHexString);
WriteLn('encrypted : ', encrypted.ToHexString);
WriteLn('decrypted : ', decrypted.ToHexString);
aes := TCipher.Create('aes-256-cbc');
{
COUNT = 0
KEY = 6ed76d2d97c69fd1339589523931f2a6cff554b15f738f21ec72dd97a7330907
IV = 851e8764776e6796aab722dbb644ace8
PLAINTEXT = 6282b8c05c5c1530b97d4816ca434762
CIPHERTEXT = 6acc04142e100a65f51b97adf5172c41
}
key := BytesOf(#$6e#$d7#$6d#$2d#$97#$c6#$9f#$d1#$33#$95#$89#$52#$39#$31#$f2#$a6#$cf#$f5#$54#$b1#$5f#$73#$8f#$21#$ec#$72#$dd#$97#$a7#$33#$09#$07);
iv := BytesOf(#$85#$1e#$87#$64#$77#$6e#$67#$96#$aa#$b7#$22#$db#$b6#$44#$ac#$e8);
plaindata := BytesOf(#$62#$82#$b8#$c0#$5c#$5c#$15#$30#$b9#$7d#$48#$16#$ca#$43#$47#$62);
encrypted := aes.Encrypt(plaindata, key, iv);
decrypted := aes.Decrypt(encrypted, key, iv);
WriteLn;
WriteLn('aes');
WriteLn('key : ', key.ToHexString);
WriteLn('iv : ', iv.ToHexString);
WriteLn('kcv : ', aes.GetCheckValue(key).ToHexString);
WriteLn('plaindata : ', plaindata.ToHexString);
WriteLn('encrypted : ', encrypted.ToHexString);
WriteLn('decrypted : ', decrypted.ToHexString);
rsa := TRsa.Create(2048, $010001);
if rsa.GenerateKeyPair then
begin
WriteLn;
WriteLn('version : ', rsa.GetVersion);
WriteLn('modulus : ', rsa.GetModulus);
WriteLn('exponent : ', rsa.GetExponent);
WriteLn('public key : ', rsa.GetPublicKey.ToHexString);
plaindata := BytesOf('Hello');
encrypted := rsa.PublicEncrypt (plaindata);
decrypted := rsa.PrivateDecrypt (encrypted);
WriteLn;
WriteLn('public encrypt private decrypt');
WriteLn('plaindata : ', plaindata.ToHexString);
WriteLn('encrypted : ', encrypted.ToHexString);
WriteLn('decrypted : ', decrypted.ToHexString);
plaindata := BytesOf('Hello');
encrypted := rsa.PrivateEncrypt (plaindata);
decrypted := rsa.PublicDecrypt (encrypted);
WriteLn;
WriteLn('private encrypt public decrypt');
WriteLn('plaindata : ', plaindata.ToHexString);
WriteLn('encrypted : ', encrypted.ToHexString);
WriteLn('decrypted : ', decrypted.ToHexString);
end;
// TLS
tls := TTls.Create;
WriteLn;
WriteLn('tls');
WriteLn('tls version : ', tls.Version);
WriteLn('tls cipher : ', tls.GetCipherName);
tls.Free;
sha3.Free;
sha2.Free;
sha1.Free;
des.Free;
aes.Free;
rsa.Free;
end.