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 + -
显示快捷键?