mainform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 966 行 · 第 1/3 页

PAS
966
字号
unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ComCtrls,
  {$ifdef DELPHI_NET}
  System.IO,
  System.ComponentModel,
  {$endif}
  ReferencesForm, SignForm, SelWinCertForm, ReferenceForm, XAdESForm,
  SBUtils, SBConstants, SBAES, SB3DES, SBDES, SBCamellia, SBRC4, SBX509,
  SBPublicKeyCrypto, SBPGPKeys, SBTSPClient, SBHTTPSClient, SBHTTPTSPClient,
  SBXMLCore, SBXMLDefs, SBXMLSig, SBXMLSec, SBXMLCharsets, SBXMLTransform,
  SBXMLAdESIntf,
  SBChSConv, SBChSConvCharsets,
  // Use SBChSCJK to add support of asian languages
  SBChSCJK;

type
  TfrmMain = class(TForm)
    edXMLFile: TEdit;
    btnLoadXML: TButton;
    lbXMLFile: TLabel;
    sbBrowseXMLFile: TSpeedButton;
    btnSaveXML: TButton;
    dlgOpenXML: TOpenDialog;
    tvXML: TTreeView;
    btnSign: TButton;
    btnVerify: TButton;
    mmXML: TMemo;
    btnClear: TButton;
    lbNodeType: TLabel;
    dlbNodeType: TLabel;
    btnDelete: TButton;
    lbNamespaceURI: TLabel;
    dlbNamespaceURI: TLabel;
    btnRemoveSignature: TButton;
    cbNormalizeNEL: TCheckBox;
    lbCharset: TLabel;
    cbCharset: TComboBox;
    procedure btnSignClick(Sender: TObject);
    procedure btnRemoveSignatureClick(Sender: TObject);
    procedure btnVerifyClick(Sender: TObject);
    procedure btnDeleteClick(Sender: TObject);
    procedure btnSaveXMLClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure tvXMLChange(Sender: TObject; Node: TTreeNode);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnLoadXMLClick(Sender: TObject);
    procedure sbBrowseXMLFileClick(Sender: TObject);
  private
    FXMLDocument: TElXMLDOMDocument;
  public
    procedure LoadCertificate(F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
      const Password: string; X509KeyData: TElXMLKeyInfoX509Data);

    procedure UpdateXML;
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure EnumCharsetsCallback(const Category, Description, Name, Aliases: string;
  UserData: TUserData; var Stop: Boolean);
var
  cb: TComboBox;
begin
  if not (TObject(UserData) is TComboBox) then
  begin
    Stop := True;
    Exit;
  end;

  cb := TComboBox(UserData);
  cb.Items.Add(Name);
end;

procedure TfrmMain.btnClearClick(Sender: TObject);
begin
  FreeAndNil(FXMLDocument);
  FXMLDocument := TElXMLDOMDocument.Create;
  UpdateXML;
end;

procedure TfrmMain.btnDeleteClick(Sender: TObject);
var
  N: TElXMLDOMNode;
begin
  if Assigned(tvXML.Selected) and
     Assigned(tvXML.Selected.Data) then
  begin
    N := TElXMLDOMNode(tvXML.Selected.Data);
    if (N is TElXMLDOMElement) or
       (N is TElXMLDOMText) then
    begin
      if Assigned(N.ParentNode) then
        N.ParentNode.RemoveChild(N)
      else
        FXMLDocument.RemoveChild(N);
    end
    else
    if (N is TElXMLDOMAttr) and Assigned(tvXML.Selected.Parent)
       and Assigned(tvXML.Selected.Parent.Data) and
       (TElXMLDOMNode(tvXML.Selected.Parent.Data) is TElXMLDOMElement) then
      TElXMLDOMElement(tvXML.Selected.Parent.Data).RemoveAttributeNode(TElXMLDOMAttr(N));
  end;

  UpdateXML;
end;

procedure TfrmMain.btnLoadXMLClick(Sender: TObject);
var
  F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
  {$ifndef DELPHI_NET}
  F := TFileStream.Create(edXMLFile.Text, fmOpenRead or fmShareDenyWrite);
  {$else}
  F := FileStream.Create(edXMLFile.Text, FileMode.Open, FileAccess.Read);
  {$endif}
  try
    FXMLDocument.LoadFromStream(F, cbCharset.Text, cbNormalizeNEL.Checked);
  except
    on E : Exception do
    begin
      MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
    end;
  end;

  FreeAndNil(F);
  UpdateXML;
end;

procedure TfrmMain.btnRemoveSignatureClick(Sender: TObject);
var
  Verifier: TElXMLVerifier;
  Node, T: TElXMLDOMNode;
begin
  if Assigned(tvXML.Selected) and
     Assigned(tvXML.Selected.Data) then
    Node := TElXMLDOMNode(tvXML.Selected.Data)
  else
    Node := TElXMLDOMNode(FXMLDocument);

  // go up by tree and check if user selected element from Signature
  T := Node;
  while (T is TElXMLDOMElement) and
        (TElXMLDOMElement(T).LocalName <> 'Signature') and
        Assigned(T.ParentNode) do
    T := T.ParentNode;

  if not (T is TElXMLDOMDocument) then
    Node := T;

  if Node is TElXMLDOMDocument then
    T := TElXMLDOMDocument(Node).DocumentElement
  else
    T := Node;

  if not (T is TElXMLDOMElement) or
     ((TElXMLDOMElement(T).LocalName <> 'Signature') and
     not Assigned(FindElementByName(TElXMLDOMElement(T), 'Signature', xmlSignatureNamespace))) then
  begin
<<<<<<< MainForm.pas
<<<<<<< MainForm.pas
    MessageDlg('Please, select Signature element for removal.', mtInformation, [mbOK], 0);
=======
    MessageDlg('Please, select Signature element for removing.', mtInformation, [mbOK], 0);
>>>>>>> 1.10
=======
    MessageDlg('Please, select Signature element for removal.', mtInformation, [mbOK], 0);
>>>>>>> 1.11
    Exit;
  end;

  Verifier := TElXMLVerifier.Create(nil);
  try
    try
      Verifier.Load(TElXMLDOMElement(T));
    except
      on E: Exception do
        raise EXMLError.CreateFmt('Signature data loading failed. (%s)', [E.Message]);
    end;

    Verifier.RemoveSignature;
  finally
    FreeAndNil(Verifier);
  end;

  UpdateXML;
end;

procedure TfrmMain.btnSaveXMLClick(Sender: TObject);
var
  F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
  {$ifndef DELPHI_NET}
  F := TFileStream.Create(edXMLFile.Text, fmCreate or fmOpenWrite);
  {$else}
  F := System.IO.FileStream.Create(edXMLFile.Text, FileMode.Create, FileAccess.ReadWrite);
  {$endif}
  try
    FXMLDocument.SaveToStream(F, xcmNone, cbCharset.Text);
  except
    on E : Exception do
    begin
      MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
    end;
  end;

  FreeAndNil(F);
end;

procedure TfrmMain.btnSignClick(Sender: TObject);
var
  Signer: TElXMLSigner;
  XAdESSigner: TElXAdESSigner;
  HMACKeyData: TElXMLKeyInfoHMACData;
  RSAKeyData: TElXMLKeyInfoRSAData;
  X509KeyData: TElXMLKeyInfoX509Data;
  PGPKeyData: TElXMLKeyInfoPGPData;
  Cert: TElX509Certificate;
  F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
  SigNode: TElXMLDOMNode;
  El: TElXMLDOMElement;
  Buf: ByteArray;
  Ref: TElXMLReference;
  Refs: TElXMLReferenceList;
  HTTPClient: TElHTTPSClient;
  TSPClient: TElHttpTSPClient;
begin
  XAdESSigner := nil;
  TSPClient := nil;
  HTTPClient := nil;
  HMACKeyData := nil;
  RSAKeyData := nil;
  X509KeyData := nil;
  PGPKeyData := nil;
  Refs := TElXMLReferenceList.Create;
  try
    if Assigned(tvXML.Selected) and
       Assigned(tvXML.Selected.Data) then
    begin
      Ref := TElXMLReference.Create;
      Ref.DigestMethod := xdmSHA1;
      if TElXMLDOMNode(tvXML.Selected.Data) is TElXMLDOMDocument then
      begin
        Ref.URINode := TElXMLDOMDocument(tvXML.Selected.Data).DocumentElement;
        Ref.URI := '';
      end
      else
      if TElXMLDOMNode(tvXML.Selected.Data) is TElXMLDOMElement then
      begin
        Ref.URINode := TElXMLDOMNode(tvXML.Selected.Data);
        El := TElXMLDOMElement(tvXML.Selected.Data);
        if El.AttribStrings['Id'] <> '' then
          Ref.URI := '#' + El.AttribStrings['Id']
        else
        if El.ParentNode is TElXMLDOMDocument then
          Ref.URI := ''
        else
        begin
          El.AttribStrings['Id'] := 'id-' + IntToStr(SBRndGenerate(MaxInt));
          Ref.URI := '#' + El.AttribStrings['Id'];
        end;
      end
      else
      begin
        Ref.URINode := TElXMLDOMNode(tvXML.Selected.Data);
        Ref.URI := TElXMLDOMNode(tvXML.Selected.Data).LocalName;
      end;

      Ref.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
      Refs.Add(Ref);
    end;

    frmReference.Document := FXMLDocument;
    frmReferences.References := Refs;
    frmReferences.Verify := False;
    frmSign.cbIncludeKey.Enabled := True;
    frmXAdES.Verify := False;

    if frmSign.ShowModal = mrOK then
    begin
      Signer := TElXMLSigner.Create(Self);
      try
        Signer.SignatureType := frmSign.SignatureType;
        Signer.CanonicalizationMethod := frmSign.CanonicalizationMethod;
        Signer.SignatureMethodType := frmSign.SignatureMethodType;
        Signer.SignatureMethod := frmSign.SigMethod;
        Signer.MACMethod := frmSign.HMACMethod;
        Signer.References := Refs;
        Signer.KeyName := frmSign.KeyName;
        Signer.IncludeKey := frmSign.IncludeKey;

        Cert := frmSelWinCert.Certificate;

        if Signer.SignatureMethodType = xmtMAC then
        begin
          HMACKeyData := TElXMLKeyInfoHMACData.Create(True);

          {$ifndef DELPHI_NET}
          F := TFileStream.Create(frmSign.KeyFile, fmOpenRead or fmShareDenyWrite);
          {$else}
          F := FileStream.Create(frmSign.KeyFile, FileMode.Open, FileAccess.Read);
          {$endif}

          SetLength(Buf, F.{$ifndef DELPHI_NET}Size{$else}Length{$endif});
          if F.{$ifndef DELPHI_NET}Size{$else}Length{$endif} > 0 then
            {$ifndef DELPHI_NET}
            F.Read(Buf[0], F.Size);
            {$else}
            F.Read(Buf, 0, F.Length);
            {$endif}

          FreeAndNil(F);

⌨️ 快捷键说明

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