mainform.cpp
来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 749 行 · 第 1/2 页
CPP
749 行
TElX509Certificate* Cert;
TFileStream* F;
ByteArray Buf;
TElXMLDOMNode* Node;
TElXMLDOMNode* T;
if ((tvXML->Selected != NULL) &&
(tvXML->Selected->Data != NULL))
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;
}
HMACKeyData = NULL;
RSAKeyData = NULL;
X509KeyData = NULL;
PGPKeyData = NULL;
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);
}
frmReference->Document = FXMLDocument;
frmReferences->References = Verifier->References;
frmReferences->Verify = true;
if (!Verifier->ValidateSignature())
{
// KeyInfo doesn't contain correct public key for the signature
// or data corrupted
frmSign->CanonicalizationMethod = Verifier->CanonicalizationMethod;
frmSign->SignatureType = Verifier->SignatureType;
frmSign->SignatureMethodType = Verifier->SignatureMethodType;
frmSign->SigMethod = Verifier->SignatureMethod;
frmSign->HMACMethod = Verifier->MACMethod;
frmSign->KeyName = Verifier->KeyName;
Cert = frmSelWinCert->Certificate;
if (frmSign->ShowModal() == mrOk)
{
frmSign->SignatureType = Verifier->SignatureType;
if (Verifier->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;
Verifier->HMACKey = HMACKeyData;
}
else
{
if (Cert != NULL)
{
X509KeyData = new TElXMLKeyInfoX509Data(false);
X509KeyData->Certificate = Cert;
Verifier->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->LoadPublic(F);
}
catch(Exception &e){}
if (!RSAKeyData->RSAKeyMaterial->PublicKey)
{
F->Position = 0;
try
{
RSAKeyData->RSAKeyMaterial->LoadSecret(F);
}
catch (Exception &e){}
}
if (!RSAKeyData->RSAKeyMaterial->PublicKey)
{
F->Position = 0;
LoadCertificate(F, frmSign->Passphrase, X509KeyData);
}
if ((!RSAKeyData->RSAKeyMaterial->PublicKey) &&
(X509KeyData->Certificate == NULL))
{
F->Position = 0;
PGPKeyData->PublicKey = new TElPGPPublicKey;
try
{
PGPKeyData->PublicKey->LoadFromStream(F);
}
catch(Exception &e)
{
PGPKeyData->PublicKey->Free();
PGPKeyData->PublicKey = NULL;
}
if (PGPKeyData->PublicKey == 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->PublicKey)
Verifier->KeyData = RSAKeyData;
else if (X509KeyData->Certificate != NULL)
Verifier->KeyData = X509KeyData;
else if ((PGPKeyData->PublicKey != NULL) ||
(PGPKeyData->SecretKey != NULL))
Verifier->KeyData = PGPKeyData;
else
throw(EXMLError("Key not loaded."));
}
}
if (Verifier->ValidateSignature())
MessageDlg("Signature validated successfully.", mtInformation, TMsgDlgButtons()<<mbOK, 0);
else
MessageDlg("Signature is invalid", mtError, TMsgDlgButtons()<<mbOK, 0);
}
}
else
{
if (MessageDlg("Signature validated successfully.\x13\x10 Do you want to validate references?", mtInformation, TMsgDlgButtons()<<mbYes<<mbNo, 0) == mrYes)
frmReferences->ShowModal();
}
}
__finally
{
delete Verifier;
delete HMACKeyData;
delete RSAKeyData;
delete X509KeyData;
delete PGPKeyData;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
FXMLDocument = new TElXMLDOMDocument;
UpdateXML();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
delete FXMLDocument;
}
//---------------------------------------------------------------------------
void TfrmMain::LoadCertificate(TFileStream* F, const AnsiString Password, TElXMLKeyInfoX509Data* X509KeyData)
{
TSBCertFileFormat CertFormat;
X509KeyData->Certificate = new TElX509Certificate(NULL);
try
{
CertFormat = X509KeyData->Certificate->DetectCertFileFormat(X509KeyData->Certificate->ClassType(), F);
F->Position = 0;
switch(CertFormat)
{
case cfDER:
X509KeyData->Certificate->LoadFromStream(F);
break;
case cfPEM:
X509KeyData->Certificate->LoadFromStreamPEM(F, Password);
break;
case cfPFX:
X509KeyData->Certificate->LoadFromStreamPFX(F, Password);
break;
default:
X509KeyData->Certificate->Free();
X509KeyData->Certificate = NULL;
}
}
catch(Exception &e)
{
X509KeyData->Certificate->Free();
X509KeyData->Certificate = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::sbBrowseXMLFileClick(TObject *Sender)
{
dlgOpenXML->InitialDir = Sbutils::ExtractFilePath(Application->ExeName) + "Samples";
dlgOpenXML->FileName = edXMLFile->Text;
if (dlgOpenXML->Execute())
edXMLFile->Text = dlgOpenXML->FileName;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::tvXMLChange(TObject *Sender, TTreeNode *Node)
{
TElXMLDOMNode* N;
AnsiString s, nt;
if ((tvXML->Selected != NULL) &&
(tvXML->Selected->Data))
{
N = (TElXMLDOMNode*)(tvXML->Selected->Data);
if (AnsiString(N->ClassName()) == "TElXMLDOMAttr")
s = ((TElXMLDOMAttr*)N)->NodeValue;
else
s = N->OuterXML;
dlbNamespaceURI->Caption = N->NamespaceURI;
mmXML->Text = AdjustLineBreaks(s);
if (AnsiString(N->ClassName()) == "TElXMLDOMAttr")
nt = "Attribute";
else if (AnsiString(N->ClassName()) == "TElXMLDOMElement")
{
if ((N->ParentNode != NULL) &&
(AnsiString(N->ParentNode->ClassName()) != "TElXMLDOMDocument"))
nt = "Element";
else
nt = "Root element";
}
else if (AnsiString(N->ClassName()) == "TElXMLDOMText")
nt = "Text";
else if (AnsiString(N->ClassName()) == "TElXMLDOMComment")
nt = "Comment";
else if (AnsiString(N->ClassName()) == "TElXMLDOMCharacterData")
nt = "CDATA";
else if (AnsiString(N->ClassName()) == "TElXMLDOMDocument")
nt = "Document";
else
nt = "Unknown";
dlbNodeType->Caption = nt;
}
else
{
mmXML->Clear();
dlbNodeType->Caption = "None";
dlbNamespaceURI->Caption = "";
}
}
//---------------------------------------------------------------------------
TTreeNode* TfrmMain::AddNode(TTreeNode* Sibling, TElXMLDOMNode* Node)
{
TTreeNode* Result = NULL;
TElXMLDOMNode* T;
TTreeNode* AttrNode;
TElXMLDOMNamedNodeMap* Attributes;
int i;
AnsiString s;
if (AnsiString(Node->ClassName()) == "TElXMLDOMDocument")
s = ((TElXMLDOMDocument*)Node)->LocalName;
else if (AnsiString(Node->ClassName()) == "TElXMLDOMElement")
s = ((TElXMLDOMElement*)Node)->NodeName;
else if (AnsiString(Node->ClassName()) == "TElXMLDOMAttr")
s = ((TElXMLDOMAttr*)Node)->NodeName;
else
s = Node->NodeName;
Result = tvXML->Items->AddChild(Sibling, s);
Result->Data = Node;
if (AnsiString(Node->ClassName()) == "TElXMLDOMElement")
{
Attributes = ((TElXMLDOMElement*)Node)->Attributes;
if ((Attributes != NULL) && (Attributes->Length > 0))
{
AttrNode = Result;
// AttrNode = tvXML->Items->AddChild(Result, "Attributes");
for (int i = 0; i<Attributes->Length; i++)
AddNode(AttrNode, Attributes->Item[i]);
}
}
if (AnsiString(Node->ClassName()) == "TElXMLDOMAttr")
return Result;
T = Node->FirstChild;
while (T != NULL)
{
if ((AnsiString(T->ClassName()) == "TElXMLDOMElement") ||
(AnsiString(T->ClassName()) == "TElXMLDOMAttr") ||
( (AnsiString(T->ClassName()) == "TElXMLDOMCharacterData") &&
( (Trim(((TElXMLDOMCharacterData*)T)->Data) != XMLString("")) ||
((!T->Loaded) && (T->RawDataLength > 0)) )))
AddNode(Result, T);
T = T->NextSibling;
}
return Result;
}
//---------------------------------------------------------------------------
void TfrmMain::UpdateXML(void)
{
mmXML->Clear();
tvXML->Items->BeginUpdate();
try
{
tvXML->Items->Clear();
AddNode(NULL, FXMLDocument);
tvXML->Items->GetFirstNode()->Expand(false);
}
__finally
{
tvXML->Items->EndUpdate();
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?