Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
Decrypt MIME using RSAES-OAEP with SHA256 and AES-128 content encryption
See more MIME Examples
Demonstrates how to decrypt MIME what was encrypted with RSAES-OAEP with SHA256 and AES-128 content encryption.In actuality, we don't really need to know in advance the various algorithms used to encrypt the MIME. When decrypting, the information about the algorithms required are embedded in the PCKS7 message itself, and this tells a decryptor what it should use.
Note: This example requires Chilkat v9.5.0.67 or greater.
Chilkat Pascal (Lazarus/Delphi) Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.Mime,
Chilkat.StringBuilder,
Chilkat.PrivateKey,
Chilkat.Cert;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
sb: TStringBuilder;
bCrlf: Boolean;
mime: TMime;
cert: TCert;
privKey: TPrivateKey;
mime2: TMime;
begin
success := False;
// This requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// We begin with this encrypted MIME:
// Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
// someHeader1: Some value 1
// someHeader2: Some value 2
// Content-Disposition: attachment; filename="smime.p7m"
// Content-Transfer-Encoding: base64
//
// MIIDvAYJKoZIhvcNAQcDoIIDrTCCA6kCAQAxggGgMIIBnAIBADB1MGgxCzAJBgNVBAYTAlVTMQsw
// CQYDVQQIDAJJTDEQMA4GA1UEBwwHV2hlYXRvbjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
// dHkgTHRkMRcwFQYDVQQDDA5DaGlsa2F0V2lkZ2V0cwIJAMRwugDmvniwMBwGCSqGSIb3DQEBBzAP
// oA0wCwYJYIZIAWUDBAIBBIIBAFaUL1ga1bOrdqYKcMm+FHUacBvzfBxk0fnPA0AMBdN8BvTWT3CN
// YuqBhjOGyq0FpYD9pVZybUuFMCVsVyIW2O62HnsOK58YaPEUUcdH2sI+yjqX9UAn0P0nVDSsVdeK
// W8x9kMfZg+3UP+y1q+lu7VRJO3f2C9oLQpTkc4VW4n7UOcUI0waykLCjCTL8lFDb7/J3GeuMKyhH
// 5riNz50kpbzqn7m2Ks9yA+QmcTdXclclGFr2vwEUFzSdT2pxh/vaUrogCxkYWbQ2eV7vZg6O4kV0
// aqHBqySkPTAzHKiHH8K8GVdlTuJ8350CpICa4T8w7/Ht5I7dyOPPKy4C+rVtrvcwggH+BgkqhkiG
// 9w0BBwEwHQYJYIZIAWUDBAECBBDTC2WNBN+z2I47/4Feu9YqgIIB0MZvl3nC/q/Wzil6HtfQTr12
// Q5moHY+ORzAa1P9XvX2ZUFhW530mV395mQw/A4o4ekmX9eRPEZquYzZPLT8hNeZIuNdhpcSQUmad
// rKnKkR0wKJ3jJ3LhOIohVBQSYs8kVDZKq6lJBIznlsurFelZoNEhyRschhteDZx5rb7fCe8c2+/O
// DHxaqaHCAzm/Bd7kcg6FFfuTZy3tu0PgP5IsXN4OFA3kkvwjAs4XsVS8jdIcmDNBkYieE8WmJOIm
// Mz7mh/CHWLgWfGKa0Dkb9RcbFgLwYNT3GzuXFw9XPbKkEZjEAtJajWbN6P0WQl96YYd9qZxUpGxZ
// zjTHEYzViUdUXolfpLufttrRXyxN1RFWhNFMFbv66xYqklMSgpdM/Mbk+EuvX6eXayDPvDBpfYMw
// NoRAzv1Ony2c0ez9rBemJICicxAzpuvHbRxdjYs63Dnv+TYgpBK12AxWWpPIjXvw0WQKgTC3Tg8s
// EnuGhpENqso/clJBEBSn4+2WhYtYbdI5sVme67lvqQl1Xxy3r18SWaQbyDOwgYi1E+54lMDOxMy0
// y0FPHk5pP45DnXWj+XORPp5LhuZr5mf62YOXSSUwR5P0cXy4Rc+pN5lhRQPCf5z2
sb := TStringBuilder.Create;
bCrlf := True;
sb.AppendLine('Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"',bCrlf);
sb.AppendLine('someHeader1: Some value 1',bCrlf);
sb.AppendLine('someHeader2: Some value 2',bCrlf);
sb.AppendLine('Content-Disposition: attachment; filename="smime.p7m"',bCrlf);
sb.AppendLine('Content-Transfer-Encoding: base64',bCrlf);
sb.AppendLine('',bCrlf);
sb.AppendLine('MIIDvAYJKoZIhvcNAQcDoIIDrTCCA6kCAQAxggGgMIIBnAIBADB1MGgxCzAJBgNVBAYTAlVTMQsw',bCrlf);
sb.AppendLine('CQYDVQQIDAJJTDEQMA4GA1UEBwwHV2hlYXRvbjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ',bCrlf);
sb.AppendLine('dHkgTHRkMRcwFQYDVQQDDA5DaGlsa2F0V2lkZ2V0cwIJAMRwugDmvniwMBwGCSqGSIb3DQEBBzAP',bCrlf);
sb.AppendLine('oA0wCwYJYIZIAWUDBAIBBIIBAFaUL1ga1bOrdqYKcMm+FHUacBvzfBxk0fnPA0AMBdN8BvTWT3CN',bCrlf);
sb.AppendLine('YuqBhjOGyq0FpYD9pVZybUuFMCVsVyIW2O62HnsOK58YaPEUUcdH2sI+yjqX9UAn0P0nVDSsVdeK',bCrlf);
sb.AppendLine('W8x9kMfZg+3UP+y1q+lu7VRJO3f2C9oLQpTkc4VW4n7UOcUI0waykLCjCTL8lFDb7/J3GeuMKyhH',bCrlf);
sb.AppendLine('5riNz50kpbzqn7m2Ks9yA+QmcTdXclclGFr2vwEUFzSdT2pxh/vaUrogCxkYWbQ2eV7vZg6O4kV0',bCrlf);
sb.AppendLine('aqHBqySkPTAzHKiHH8K8GVdlTuJ8350CpICa4T8w7/Ht5I7dyOPPKy4C+rVtrvcwggH+BgkqhkiG',bCrlf);
sb.AppendLine('9w0BBwEwHQYJYIZIAWUDBAECBBDTC2WNBN+z2I47/4Feu9YqgIIB0MZvl3nC/q/Wzil6HtfQTr12',bCrlf);
sb.AppendLine('Q5moHY+ORzAa1P9XvX2ZUFhW530mV395mQw/A4o4ekmX9eRPEZquYzZPLT8hNeZIuNdhpcSQUmad',bCrlf);
sb.AppendLine('rKnKkR0wKJ3jJ3LhOIohVBQSYs8kVDZKq6lJBIznlsurFelZoNEhyRschhteDZx5rb7fCe8c2+/O',bCrlf);
sb.AppendLine('DHxaqaHCAzm/Bd7kcg6FFfuTZy3tu0PgP5IsXN4OFA3kkvwjAs4XsVS8jdIcmDNBkYieE8WmJOIm',bCrlf);
sb.AppendLine('Mz7mh/CHWLgWfGKa0Dkb9RcbFgLwYNT3GzuXFw9XPbKkEZjEAtJajWbN6P0WQl96YYd9qZxUpGxZ',bCrlf);
sb.AppendLine('zjTHEYzViUdUXolfpLufttrRXyxN1RFWhNFMFbv66xYqklMSgpdM/Mbk+EuvX6eXayDPvDBpfYMw',bCrlf);
sb.AppendLine('NoRAzv1Ony2c0ez9rBemJICicxAzpuvHbRxdjYs63Dnv+TYgpBK12AxWWpPIjXvw0WQKgTC3Tg8s',bCrlf);
sb.AppendLine('EnuGhpENqso/clJBEBSn4+2WhYtYbdI5sVme67lvqQl1Xxy3r18SWaQbyDOwgYi1E+54lMDOxMy0',bCrlf);
sb.AppendLine('y0FPHk5pP45DnXWj+XORPp5LhuZr5mf62YOXSSUwR5P0cXy4Rc+pN5lhRQPCf5z2',bCrlf);
// Load the encrypted MIME into the MIME object.
mime := TMime.Create;
mime.LoadMimeSb(sb);
// Provide the required cert + private key from a PFX (.pfx/.p12) file.
success := mime.AddPfxSourceFile('qa_data/rsaes-oaep/cert_plus_privatekey.pfx','PFX_PASSWORD');
if (success <> True) then
begin
WriteLn(mime.LastErrorText);
Exit;
end;
// Decrypt.
success := mime.Decrypt();
if (success <> True) then
begin
WriteLn(mime.LastErrorText);
Exit;
end;
// Examine the decrypted MIME.
WriteLn(mime.GetMime());
WriteLn('Decrypt test 1 succeeded.');
// -----------------------------------------------------------
// Now let's decrypt another way..
// We have the same cert and private key in PEM files..
cert := TCert.Create;
success := cert.LoadFromFile('qa_data/rsaes-oaep/cert.pem');
privKey := TPrivateKey.Create;
success := privKey.LoadPemFile('qa_data/rsaes-oaep/privatekey.pem');
// Decrypt using the cert + private key
mime2 := TMime.Create;
mime2.LoadMimeSb(sb);
success := mime2.Decrypt2(cert,privKey);
if (success <> True) then
begin
WriteLn(mime2.LastErrorText);
Exit;
end;
// Examine the decrypted MIME.
WriteLn(mime2.GetMime());
WriteLn('Decrypt test 2 succeeded.');
sb.Free;
mime.Free;
cert.Free;
privKey.Free;
mime2.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.