Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Duplicate Java Verify RSA Signature

See more RSA Examples

Demonstrates how to duplicate a snippet of Java code that verifies an RSA signature.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
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.Cert,
  Chilkat.Rsa;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  base64DataToBeSigned: string;
  base64Certificate: string;
  base64Signature: string;
  cert: TCert;
  rsa: TRsa;

begin
  success := False;

  //  This requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  This example duplicates the following Java code:

  //  import com.sun.org.apache.xml.internal.security.utils.Base64;  
  //  import java.io.ByteArrayInputStream;  
  //  import java.security.PublicKey;  
  //  import java.security.Signature;  
  //  import java.security.cert.CertificateFactory;  
  //  import java.security.cert.X509Certificate;  
  //  public class validateSazetak {  
  //    public static void main(String[] args) {  
  //    String signatureAlgorithm = "SHA256withRSA";  
  //    String base64DataToBeSigned = "Hlp...LE4=";  
  //    String base64Certificate = "MII...TlQ==";  
  //    String base64Signature = "I00...pZA==";  
  //    try {  
  //        CertificateFactory cf;  
  //        X509Certificate certificate = null;  
  //        cf = CertificateFactory.getInstance("X.509");  
  //        certificate = (X509Certificate) cf.generateCertificate(new 
  //        ByteArrayInputStream(Base64.decode(base64Certificate)));  
  //         
  //        Signature signature = Signature.getInstance(signatureAlgorithm, "SunRsaSign");  
  //        PublicKey pk = (PublicKey) certificate.getPublicKey();  
  //        signature.initVerify(pk);  
  //         
  //        byte[] hashBytes = Base64.decode(base64DataToBeSigned);  
  //        signature.update(hashBytes);  
  //         
  //        byte[] sigBytes = Base64.decode(base64Signature);  
  //        boolean validity = signature.verify(sigBytes);  
  //        System.out.println("Is valid signature:" + validity);  
  //      } catch (Exception e) {  
  //          System.out.println(e);  
  //      }  
  //  } 

  base64DataToBeSigned := 'Hlp...LE4=';
  base64Certificate := 'MII...TlQ==';
  base64Signature := 'I00...pZA==';

  cert := TCert.Create;
  success := cert.LoadFromBase64(base64Certificate);
  if (success = False) then
    begin
      WriteLn(cert.LastErrorText);
      Exit;
    end;

  rsa := TRsa.Create;

  success := rsa.SetX509Cert(cert,False);
  if (success = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  rsa.EncodingMode := 'base64';
  success := rsa.VerifyStringENC(base64DataToBeSigned,'sha256',base64Signature);
  if (success = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  WriteLn('Signature verified.');


  cert.Free;
  rsa.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.