Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,34 @@ codeunit 1279 "Cryptography Management Impl."
EncryptedText := Convert.ToBase64String(EncMemoryStream.ToArray());
end;

[NonDebuggable]
procedure EncryptBinaryDataRijndael(BinaryDataAsBase64: Text) EncryptedBinaryDataAsBase64: Text
begin
EncryptedBinaryDataAsBase64 := EncryptBinaryDataRijndaelSecret(BinaryDataAsBase64).Unwrap();
end;

[NonDebuggable]
procedure EncryptBinaryDataRijndaelSecret(BinaryDataAsBase64: SecretText) EncryptedBinaryDataAsBase64: SecretText
var
Encryptor: DotNet "Cryptography.ICryptoTransform";
Convert: DotNet Convert;
EncMemoryStream: DotNet MemoryStream;
EncCryptoStream: DotNet "Cryptography.CryptoStream";
PlainBytes: DotNet Array;
begin
Construct();
Encryptor := RijndaelProvider.CreateEncryptor();
PlainBytes := Convert.FromBase64String(BinaryDataAsBase64.Unwrap());
EncMemoryStream := EncMemoryStream.MemoryStream();
EncCryptoStream := EncCryptoStream.CryptoStream(EncMemoryStream, Encryptor, CryptoStreamMode.Write);
EncCryptoStream.Write(PlainBytes, 0, PlainBytes.Length());
EncCryptoStream.FlushFinalBlock();
EncryptedBinaryDataAsBase64 := Convert.ToBase64String(EncMemoryStream.ToArray());
EncCryptoStream.Close();
EncMemoryStream.Close();
Encryptor.Dispose();
end;

[NonDebuggable]
procedure DecryptRijndael(EncryptedText: SecretText) PlainText: Text
begin
Expand Down Expand Up @@ -640,6 +668,36 @@ codeunit 1279 "Cryptography Management Impl."
DecMemoryStream.Close();
end;

[NonDebuggable]
procedure DecryptBinaryDataRijndael(EncryptedBinaryDataAsBase64: SecretText) PlainText: Text
begin
PlainText := DecryptBinaryDataRijndaelSecret(EncryptedBinaryDataAsBase64).Unwrap();
end;

[NonDebuggable]
procedure DecryptBinaryDataRijndaelSecret(EncryptedBinaryDataAsBase64: SecretText) PlainTextAsBase64: SecretText
var
Decryptor: DotNet "Cryptography.ICryptoTransform";
Convert: DotNet Convert;
DecMemoryStream: DotNet MemoryStream;
DecCryptoStream: DotNet "Cryptography.CryptoStream";
OutputMemoryStream: DotNet MemoryStream;
ByteArray: DotNet Array;
begin
Construct();
Decryptor := RijndaelProvider.CreateDecryptor();
DecMemoryStream := DecMemoryStream.MemoryStream(Convert.FromBase64String(EncryptedBinaryDataAsBase64.Unwrap()));
DecCryptoStream := DecCryptoStream.CryptoStream(DecMemoryStream, Decryptor, CryptoStreamMode.Read);
OutputMemoryStream := OutputMemoryStream.MemoryStream();
DecCryptoStream.CopyTo(OutputMemoryStream);
ByteArray := OutputMemoryStream.ToArray();
PlainTextAsBase64 := Convert.ToBase64String(ByteArray);
DecCryptoStream.Close();
DecMemoryStream.Close();
OutputMemoryStream.Close();
Decryptor.Dispose();
end;

local procedure Construct()
begin
if IsNull(RijndaelProvider) then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,26 @@ codeunit 1258 "Rijndael Cryptography"
CryptedText := CryptographyManagementImpl.EncryptRijndaelSecret(PlainText);
end;

/// <summary>
/// Returns encrypted binary data as base64
/// </summary>
/// <param name="BinaryDataAsBase64">The value to encrypt.</param>
/// <returns>Encrypted value.</returns>
procedure EncryptBinaryData(BinaryDataAsBase64: Text) EncryptedBinaryDataAsBase64: Text
begin
EncryptedBinaryDataAsBase64 := CryptographyManagementImpl.EncryptBinaryDataRijndael(BinaryDataAsBase64);
end;

/// <summary>
/// Returns encrypted binary data as base64
/// </summary>
/// <param name="BinaryDataAsBase64">The value to encrypt.</param>
/// <returns>Encrypted value.</returns>
procedure EncryptBinaryData(BinaryDataAsBase64: SecretText) EncryptedBinaryDataAsBase64: SecretText
begin
EncryptedBinaryDataAsBase64 := CryptographyManagementImpl.EncryptBinaryDataRijndaelSecret(BinaryDataAsBase64);
end;

/// <summary>
/// Returns encrypted text as plain text.
/// </summary>
Expand All @@ -187,4 +207,24 @@ codeunit 1258 "Rijndael Cryptography"
begin
PlainText := CryptographyManagementImpl.DecryptRijndaelSecret(CryptedText);
end;

/// <summary>
/// Returns decrypted binary data as base64
/// </summary>
/// <param name="CryptedBinaryDataAsBase64">The value to decrypt.</param>
/// <returns>Decrypted value.</returns>
procedure DecryptBinaryData(CryptedBinaryDataAsBase64: Text) BinaryDataAsBase64: Text
begin
BinaryDataAsBase64 := CryptographyManagementImpl.DecryptBinaryDataRijndael(CryptedBinaryDataAsBase64);
end;

/// <summary>
/// Returns decrypted binary data as base64
/// </summary>
/// <param name="CryptedBinaryDataAsBase64">The value to decrypt.</param>
/// <returns>Decrypted value.</returns>
procedure DecryptBinaryData(CryptedBinaryDataAsBase64: SecretText) BinaryDataAsBase64: SecretText
begin
BinaryDataAsBase64 := CryptographyManagementImpl.DecryptBinaryDataRijndaelSecret(CryptedBinaryDataAsBase64);
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,65 @@ codeunit 132575 "Rijndael Cryptography Test"
LibraryAssert.AreEqual(PlainText, RijndaelCryptography2.Decrypt(CryptedText), 'Set Encryption Datay and Decrypt failed');
end;

[Test]
procedure VerifyEncryptBinaryDataProducesExpectedResult()
var
RijndaelCryptography: Codeunit "Rijndael Cryptography";
BinaryDataAsBase64: Text;
EncryptedBinaryDataAsBase64: Text;
ExpectedEncryptedBinaryDataAsBase64: Text;
begin
// [GIVEN] With Encryption Key and binary data as Base64
InitializeCBCEncryption(RijndaelCryptography);
BinaryDataAsBase64 := GetBinaryDataAsBase64();
// [WHEN] Encrypt Binary Data
EncryptedBinaryDataAsBase64 := RijndaelCryptography.EncryptBinaryData(BinaryDataAsBase64);
ExpectedEncryptedBinaryDataAsBase64 := GetEncryptedBinaryDataAsBase64();
// [THEN] Verify Result is equal expected value
LibraryAssert.AreEqual(ExpectedEncryptedBinaryDataAsBase64, EncryptedBinaryDataAsBase64, 'Failed to encrypt binary data.');
end;

[Test]
procedure VerifyDecryptBinaryDataProducesExpectedResult()
var
RijndaelCryptography: Codeunit "Rijndael Cryptography";
EncryptedBinaryDataAsBase64: Text;
DecryptedBinaryDataAsBase64: Text;
ExpectedDecryptedBinaryDataAsBase64: Text;
begin
// [GIVEN] With Encryption Key and binary data as Base64
InitializeCBCEncryption(RijndaelCryptography);
EncryptedBinaryDataAsBase64 := GetEncryptedBinaryDataAsBase64();
// [WHEN] Decrypt Binary Data
DecryptedBinaryDataAsBase64 := RijndaelCryptography.DecryptBinaryData(EncryptedBinaryDataAsBase64);
ExpectedDecryptedBinaryDataAsBase64 := GetBinaryDataAsBase64();
// [THEN] Verify Result is equal expected value
LibraryAssert.AreEqual(ExpectedDecryptedBinaryDataAsBase64, DecryptedBinaryDataAsBase64, 'Failed to decrypt binary data.');
end;

[Test]
procedure VerifyEncryptThenDecryptRestoresOriginalData()
var
RijndaelCryptography: Codeunit "Rijndael Cryptography";
BinaryDataAsBase64: Text;
ResultAsBase64: Text;
begin
// [GIVEN] Default Encryption
BinaryDataAsBase64 := GetBinaryDataAsBase64();
// [WHEN] Encrypt And Decrypt
ResultAsBase64 := RijndaelCryptography.DecryptBinaryData(RijndaelCryptography.EncryptBinaryData(BinaryDataAsBase64));
// [THEN] Verify Result
LibraryAssert.AreEqual(BinaryDataAsBase64, ResultAsBase64, 'Decrypting an encrypted binary data failed.');
end;

local procedure InitializeCBCEncryption(var RijndaelCryptography: Codeunit "Rijndael Cryptography")
begin
RijndaelCryptography.SetEncryptionData(GetCBCEncryptionKeyAsBase64(), GetCBCInitializationVectorAsBase64());
RijndaelCryptography.SetBlockSize(128);
RijndaelCryptography.SetCipherMode('CBC');
RijndaelCryptography.SetPaddingMode('PKCS7');
end;

local procedure GetECP128BitCryptedText(): Text
begin
exit('7ah/ajzDcgtEQ/KM54R3udodzz0wHAJrZrK/mFJ+XBA=');
Expand All @@ -131,4 +190,29 @@ codeunit 132575 "Rijndael Cryptography Test"
exit(KeyValue);
end;

local procedure GetBinaryDataAsBase64(): Text
begin
exit('UEsDBBQAAAAIAD1yZVs+1MwDIgAAACAAAAAMAAAARmlsZU5hbWUudHh0S0xLNExKTUw2TLZMMzI2S04zM7dINrY0sjQzTjYxNzQDAFBLAQIUABQAAAAIAD1yZVs+1MwDIgAAACAAAAAMAAAAAAAAAAAAAAAAAAAAAABGaWxlTmFtZS50eHRQSwUGAAAAAAEAAQA6AAAATAAAAAAA');
end;

local procedure GetEncryptedBinaryDataAsBase64(): Text
begin
exit('Nhl/hypzm6+rQBmAv8piOD9flIp3Wb7ZO+a0m02mdM3Y+2UVKAJHvD6cV6NVSagdEas09MqJ9465aUp/7KSeqM5/0KqcygSsac2IuSsjCry9jveBo5mWGr5De3ylTEOJGW/G6cpk5u6T4g1DTAh9xH9Mu9nihYPrHewqnXKOIhtVw0Ji63rnYiQJSqVn8yYiA6VDnBqawBe0l5rvOSjEqA==');
end;

local procedure GetCBCEncryptionKeyAsBase64(): SecretText
var
KeyValue: Text;
begin
KeyValue := 'cHNGdVR4RUQyY3VSQVRBR2I3b00zTlJzMVBHQzd6UGo=';
exit(KeyValue);
end;

local procedure GetCBCInitializationVectorAsBase64(): Text
var
IVValue: Text;
begin
IVValue := 'cE80ZUljaFM0N1BzYUhCYw==';
exit(IVValue);
end;
}
Loading