mainform.cpp
来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 749 行 · 第 1/2 页
CPP
749 行
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
SetLicenseKey(
(AnsiString)"ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76" +
"FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C" +
"F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47" +
"5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9" +
"F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A" +
"8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43" +
"DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8" +
"BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F");
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnClearClick(TObject *Sender)
{
if(FXMLDocument){delete FXMLDocument; FXMLDocument = NULL;};
FXMLDocument = new TElXMLDOMDocument;
UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnDeleteClick(TObject *Sender)
{
TElXMLDOMNode* N;
if ((tvXML->Selected) &&
(tvXML->Selected->Data))
{
N = (TElXMLDOMNode*)(tvXML->Selected->Data);
if ((AnsiString(N->ClassName()) == "TElXMLDOMElement") ||
(AnsiString(N->ClassName()) == "TElXMLDOMText"))
{
if (N->ParentNode != NULL)
N->ParentNode->RemoveChild(N);
else
FXMLDocument->RemoveChild(N);
}
else if ((AnsiString(N->ClassName()) == "TElXMLDOMAttr") &&
(tvXML->Selected->Parent != NULL) &&
(tvXML->Selected->Parent->Data != NULL) &&
(AnsiString(((TElXMLDOMNode*)(tvXML->Selected->Parent->Data))->ClassName()) == "TElXMLDOMElement"))
((TElXMLDOMElement*)(tvXML->Selected->Parent->Data))->RemoveAttributeNode((TElXMLDOMAttr*)N);
}
UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnLoadXMLClick(TObject *Sender)
{
TFileStream* F = new TFileStream(edXMLFile->Text, fmOpenRead | fmShareDenyWrite);
try
{
FXMLDocument->LoadFromStream(F);
}
catch(Exception &e)
{
MessageDlg("Error: " + e.Message, mtError, TMsgDlgButtons()>>mbOK, 0);
}
delete F;
UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnRemoveSignatureClick(TObject *Sender)
{
TElXMLVerifier* Verifier;
TElXMLDOMNode* Node;
TElXMLDOMNode* T;
if ((tvXML->Selected != NULL) &&
(tvXML->Selected->Data))
Node = (TElXMLDOMNode*)(tvXML->Selected->Data);
else
Node = (TElXMLDOMNode*)(FXMLDocument);
while ((AnsiString(Node->ClassName()) == "TElXMLDOMElement") &&
(((TElXMLDOMElement*)Node)->LocalName != XMLString("Signature")) &&
(Node->ParentNode != NULL))
Node = Node->ParentNode;
if ((AnsiString(Node->ClassName()) == "TElXMLDOMElement") &&
(((TElXMLDOMElement*)Node)->LocalName == XMLString("Signature")) &&
(Node->ParentNode != NULL) &&
(AnsiString(Node->ParentNode->ClassName()) == "TElXMLDOMDocument"))
Node = Node->ParentNode;
if (AnsiString(Node->ClassName()) == "TElXMLDOMDocument")
T = Node->FirstChild;
else
T = Node;
if ((AnsiString(T->ClassName()) != "TElXMLDOMElement") ||
((((TElXMLDOMElement*)T)->LocalName != XMLString("Signature")) &&
(FindChildElementSig((TElXMLDOMElement*)T, "Signature") == NULL)))
{
MessageDlg("Please, select Signature element for verifying.", mtInformation, TMsgDlgButtons()<<mbOK, 0);
return;
}
Verifier = new TElXMLVerifier(NULL);
try
{
try
{
Verifier->Load((TElXMLDOMElement*)T);
}
catch(Exception &e)
{
AnsiString s;
s.sprintf("Signature data loading failed. (%s)", e.Message);
throw(EXMLError(s));
}
Verifier->SignatureType = xstEnveloped;
T->ParentNode->ReplaceChild(Verifier->RemoveSignature(), T);
}
__finally
{
delete Verifier;
}
UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSaveXMLClick(TObject *Sender)
{
TFileStream* F = new TFileStream(edXMLFile->Text, fmCreate | fmOpenWrite);
try
{
FXMLDocument->SaveToStream(F);
}
catch(Exception &e)
{
MessageDlg("Error: " + e.Message, mtError, TMsgDlgButtons()<<mbOK, 0);
}
delete F;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSignClick(TObject *Sender)
{
TElXMLSigner* Signer;
TElXMLKeyInfoHMACData* HMACKeyData;
TElXMLKeyInfoRSAData* RSAKeyData;
TElXMLKeyInfoX509Data* X509KeyData;
TElXMLKeyInfoPGPData* PGPKeyData;
TElX509Certificate* Cert;
TFileStream* F;
TElXMLDOMNode* Node;
TElXMLDOMNode* SigNode;
TElXMLDOMNode* ParentNode;
ByteArray Buf;
TElXMLReference* Ref;
TElXMLReferenceList* Refs;
int i;
HMACKeyData = NULL;
RSAKeyData = NULL;
X509KeyData = NULL;
PGPKeyData = NULL;
Refs = new TElXMLReferenceList;
try
{
if ((tvXML->Selected!=NULL) &&
(tvXML->Selected->Data))
{
Ref = new TElXMLReference;
Ref->DigestMethod = xdmSHA1;
if (AnsiString(((TElXMLDOMNode*)(tvXML->Selected->Data))->ClassName()) == "TElXMLDOMDocument")
{
Node = ((TElXMLDOMDocument*)(tvXML->Selected->Data))->FirstChild;
while ((Node!=NULL) && (AnsiString(Node->ClassName())!= "TElXMLDOMElement"))
Node = Node->NextSibling;
Ref->URINode = Node;
Ref->URI = "";
}
else if (AnsiString(((TElXMLDOMNode*)(tvXML->Selected->Data))->ClassName()) == "TElXMLDOMElement")
{
Ref->URINode = ((TElXMLDOMNode*)(tvXML->Selected->Data));
if (((TElXMLDOMElement*)(tvXML->Selected->Data))->AttribStrings["Id"] != XMLString(""))
Ref->URI = XMLString("#") + ((TElXMLDOMElement*)(tvXML->Selected->Data))->AttribStrings["Id"];
else if (AnsiString(((TElXMLDOMElement*)(tvXML->Selected->Data))->ParentNode->ClassName()) == "TElXMLDOMDocument")
Ref->URI = "";
else
Ref->URI = ((TElXMLDOMElement*)(tvXML->Selected->Data))->LocalName;
}
else
{
Ref->URINode = ((TElXMLDOMNode*)(tvXML->Selected->Data));
Ref->URI = ((TElXMLDOMNode*)(tvXML->Selected->Data))->LocalName;
}
Ref->TransformChain->Add(new TElXMLEnvelopedSignatureTransform);
Refs->Add(Ref);
}
frmReference->Document = FXMLDocument;
frmReferences->References = Refs;
frmReferences->Verify = false;
if (frmSign->ShowModal() == mrOk)
{
Signer = new TElXMLSigner(this);
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;
Cert = frmSelWinCert->Certificate;
if (Signer->SignatureMethodType == xmtMAC)
{
HMACKeyData = new TElXMLKeyInfoHMACData(true);
F = new TFileStream(frmSign->KeyFile, fmOpenRead | fmShareDenyWrite);
Buf.set_length(F->Size);
if (F->Size > 0)
F->Read(&(Buf[0]), F->Size);
delete F;
HMACKeyData->Key->Key = Buf;
Signer->KeyData = HMACKeyData;
}
else
{
if ((Cert != NULL) && Cert->PrivateKeyExists)
{
X509KeyData = new TElXMLKeyInfoX509Data(false);
X509KeyData->Certificate = Cert;
Signer->KeyData = X509KeyData;
}
else
{
RSAKeyData = new TElXMLKeyInfoRSAData(true);
RSAKeyData->RSAKeyMaterial->Passphrase = frmSign->Passphrase;
X509KeyData = new TElXMLKeyInfoX509Data(true);
PGPKeyData = new TElXMLKeyInfoPGPData(true);
F = new TFileStream(frmSign->KeyFile, fmOpenRead | fmShareDenyWrite);
try
{
RSAKeyData->RSAKeyMaterial->LoadSecret(F);
}
catch(Exception &){}
if (RSAKeyData->RSAKeyMaterial->SecretKey)
{
F->Position = 0;
LoadCertificate(F, frmSign->Passphrase, X509KeyData);
}
if ((!RSAKeyData->RSAKeyMaterial->PublicKey) &&
(X509KeyData->Certificate != NULL))
{
F->Position = 0;
PGPKeyData->SecretKey = new TElPGPSecretKey;
PGPKeyData->SecretKey->Passphrase = frmSign->Passphrase;
try
{
PGPKeyData->SecretKey->LoadFromStream(F);
}
catch(Exception &e)
{
PGPKeyData->SecretKey->Free();
PGPKeyData->SecretKey = NULL;
}
}
delete F;
if (RSAKeyData->RSAKeyMaterial->SecretKey)
Signer->KeyData = RSAKeyData;
else if (X509KeyData->Certificate != NULL)
Signer->KeyData = X509KeyData;
else if (PGPKeyData->SecretKey != NULL)
Signer->KeyData = PGPKeyData;
else
throw(EXMLError("Key not loaded."));
}
}
Signer->UpdateReferencesDigest();
if (Signer->SignatureType == xstDetached)
{
Signer->Sign();
if (FXMLDocument){delete FXMLDocument; FXMLDocument = NULL;}
try
{
SigNode = NULL;
Signer->Save(SigNode);
FXMLDocument = SigNode->OwnerDocument;
}
catch(Exception &e)
{
FXMLDocument = new TElXMLDOMDocument;
AnsiString s;
s.sprintf("Signed data saving failed. (%s)", e.Message);
throw (EXMLError(s));
}
}
else
{
if ((tvXML->Selected == NULL) ||
(tvXML->Selected->Data == NULL))
{
MessageDlg("Please, select node for signing.", mtInformation, TMsgDlgButtons()<<mbOK, 0);
return;
}
Signer->Sign();
SigNode = ((TElXMLDOMNode*)(tvXML->Selected->Data));
if (AnsiString(SigNode->ClassName()) == "TElXMLDOMDocument")
{
SigNode = SigNode->FirstChild;
while ((SigNode != NULL) && (AnsiString(SigNode->ClassName()) != "TElXMLDOMElement"))
SigNode = SigNode->NextSibling;
}
try
{
Signer->Save(SigNode);
}
catch(Exception &e)
{
AnsiString s;
s.sprintf("Signed data saving failed. (%s)", e.Message);
throw EXMLError(s);
}
}
UpdateXML();
}
__finally
{
delete Signer;
delete HMACKeyData;
delete RSAKeyData;
delete X509KeyData;
delete PGPKeyData;
}
}
}
__finally
{
delete Refs;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnVerifyClick(TObject *Sender)
{
TElXMLVerifier* Verifier;
TElXMLKeyInfoHMACData* HMACKeyData;
TElXMLKeyInfoRSAData* RSAKeyData;
TElXMLKeyInfoX509Data* X509KeyData;
TElXMLKeyInfoPGPData* PGPKeyData;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?