xadesform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 240 行

PAS
240
字号
unit XAdESForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls,
  SBRDN, SBX509, SBCustomCertStorage, SBUtils, SBXMLAdES;

type
  TfrmXAdES = class(TForm)
    cbTimestamp: TCheckBox;
    edTimestampServer: TEdit;
    pProductionPlace: TPanel;
    cbProductionPlace: TCheckBox;
    lbCity: TLabel;
    edCity: TEdit;
    lbStateOrProvince: TLabel;
    edStateOrProvince: TEdit;
    lbPostalCode: TLabel;
    edPostalCode: TEdit;
    lbCountry: TLabel;
    edCountry: TEdit;
    btnOK: TButton;
    cbXAdES: TCheckBox;
    gbPolicyId: TGroupBox;
    lbDescription: TLabel;
    edDescription: TEdit;
    lbDocumentationReference: TLabel;
    edDocumentationReference: TEdit;
    lbIdentifier: TLabel;
    edIdentifier: TEdit;
    lbIdentifierQualifier: TLabel;
    edIdentifierQualifier: TEdit;
    lbSignedTime: TLabel;
    lbTimestamp: TLabel;
    lbTimestampSerial: TLabel;
    gbSigningCertificates: TGroupBox;
    lvSigningCertificates: TListView;
    btnRemove: TButton;
    btnAdd: TButton;
    DlgOpen: TOpenDialog;
    procedure cbProductionPlaceClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnRemoveClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    FCertStorage: TElMemoryCertStorage;
    FCertIDs: TElXMLCertIDList;
    FVerify : Boolean;

    function GetXAdESEnabled: Boolean;
    procedure SetVerify(const Value: Boolean);
    procedure UpdateCertificates;
  public
    property XAdESEnabled : Boolean read GetXAdESEnabled;
    property CertStorage : TElMemoryCertStorage read FCertStorage;
    property CertIDs : TElXMLCertIDList read FCertIDs write FCertIDs;
    property Verify : Boolean write SetVerify;
  end;

var
  frmXAdES: TfrmXAdES;

function GetOIDValue(NTS: TElRelativeDistinguishedName; const S: BufferType; const Delimeter: AnsiString = ' / '): AnsiString;

implementation

{$R *.DFM}

function GetOIDValue(NTS: TElRelativeDistinguishedName; const S: BufferType; const Delimeter: AnsiString = ' / '): AnsiString;
var
  i: Integer;
  t: AnsiString;
begin
  Result := '';
  for i := 0 to NTS.Count - 1 do
    if CompareContent(S, NTS.OIDs[i]) then
    begin
      t := AnsiString(NTS.Values[i]);
      if t = '' then
        Continue;

      if Result = '' then
      begin
        Result := t;
        if Delimeter = '' then
          Exit;
      end
      else
        Result := Result + Delimeter + t;
    end;
end;

procedure TfrmXAdES.cbProductionPlaceClick(Sender: TObject);
var
  Enable : Boolean;
begin
  Enable := cbProductionPlace.Checked;
  edCountry.Enabled := Enable;
  lbCountry.Enabled := Enable;
  edPostalCode.Enabled := Enable;
  lbPostalCode.Enabled := Enable;
  edStateOrProvince.Enabled := Enable;
  lbStateOrProvince.Enabled := Enable;
  edCity.Enabled := Enable;
  lbCity.Enabled := Enable;
end;

function TfrmXAdES.GetXAdESEnabled: Boolean;
begin
  Result := cbXAdES.Checked;
end;

procedure TfrmXAdES.SetVerify(const Value: Boolean);
begin
  FVerify := Value;
  cbTimestamp.Visible := not Value;
  edTimestampServer.Visible := not Value;
  btnAdd.Enabled := not Value;
  btnRemove.Enabled := not Value;

  lbSignedTime.Visible := Value;
  lbTimestamp.Visible := Value;
  lbTimestampSerial.Visible := Value;
end;

procedure TfrmXAdES.btnAddClick(Sender: TObject);
var
  F : TFileStream;
  Cert : TElX509Certificate;
  CertFormat : TSBCertFileFormat;
begin
  DlgOpen.Title := 'Select certificate file';
  DlgOpen.Filter := 'PEM-encoded certificate (*.pem)|*.PEM|DER-encoded certificate (*.cer)|*.CER|PFX-encoded certificate (*.pfx)|*.PFX';
  if DlgOpen.Execute then
  begin
    F := TFileStream.Create(DlgOpen.Filename, fmOpenRead or fmShareDenyWrite);
    try
      Cert := TElX509Certificate.Create(nil);
      try
        CertFormat := Cert.DetectCertFileFormat(F);
        F.Position := 0;
        case CertFormat of
          cfDER : Cert.LoadFromStream(F);
          cfPEM : Cert.LoadFromStreamPEM(F, InputBox('Please enter passphrase:', '',''));
          cfPFX : Cert.LoadFromStreamPFX(F, InputBox('Please enter passphrase:', '',''));
        else
          begin
            MessageDlg('Failed to load certificate', mtError, [mbOk], 0);
            FreeAndNil(Cert);
            Exit;
          end;
        end;
      except
        FreeAndNil(Cert);
      end;

      FCertStorage.Add(Cert);
    finally
      FreeAndNil(F);
    end;
  end;

  UpdateCertificates;
end;

procedure TfrmXAdES.FormCreate(Sender: TObject);
begin
  FCertStorage := TElMemoryCertStorage.Create(nil);
end;

procedure TfrmXAdES.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FCertStorage);
end;

procedure TfrmXAdES.btnRemoveClick(Sender: TObject);
begin
  if Assigned(lvSigningCertificates.Selected) then
  begin
    FCertStorage.Remove(FCertStorage.IndexOf(TElX509Certificate(lvSigningCertificates.Selected.Data)));
    UpdateCertificates;
  end;
end;

procedure TfrmXAdES.UpdateCertificates;
var
  Item: TListItem;
  B: BufferType;
  i: Integer;
  s: string;
begin
  lvSigningCertificates.Items.BeginUpdate;
  lvSigningCertificates.Items.Clear;
  if not FVerify then
    for i := 0 to FCertStorage.Count - 1 do
    begin
      s := GetOIDValue(FCertStorage.Certificates[i].IssuerRDN, SB_CERT_OID_COMMON_NAME);
      if s = '' then
        s := GetOIDValue(FCertStorage.Certificates[i].IssuerRDN, SB_CERT_OID_ORGANIZATION);

      if s = '' then
        s := '<unknown>';

      B := FCertStorage.Certificates[i].SerialNumber;
      Item := lvSigningCertificates.Items.Add;
      Item.Caption := BeautifyBinaryString(BinaryToString({$IFDEF DELPHI_NET}B{$ELSE}@B[1], Length(B){$ENDIF}), ' ');
      Item.SubItems.Add(s);
      Item.Data := FCertStorage.Certificates[i];
    end
  else
  if Assigned(FCertIDs) then
    for i := 0 to FCertIDs.Count - 1 do
    begin
      s := GetOIDValue(FCertIDs.CertIDs[i].IssuerSerial.IssuerRDN, SB_CERT_OID_COMMON_NAME);
      if s = '' then
        s := GetOIDValue(FCertIDs.CertIDs[i].IssuerSerial.IssuerRDN, SB_CERT_OID_ORGANIZATION);

      if s = '' then
        s := '<unknown>';

      B := FCertIDs.CertIDs[i].IssuerSerial.SerialNumber;
      Item := lvSigningCertificates.Items.Add;
      Item.Caption := BeautifyBinaryString(BinaryToString({$IFDEF DELPHI_NET}B{$ELSE}@B[1], Length(B){$ENDIF}), ' ');
      Item.SubItems.Add(s);
    end;

  lvSigningCertificates.Items.EndUpdate;
end;

procedure TfrmXAdES.FormShow(Sender: TObject);
begin
  UpdateCertificates;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?