📄 mainform.pas
字号:
Exit;
end;
Cert := TElX509Certificate.Create(nil);
Success := true;
try
case OpenCertificateDialog.FilterIndex of
1:
try
Cert.LoadFromStream(F);
except
Msg := 'Invalid certificate file';
Success := false;
end;
2:
begin
Pass := RequestPassword;
if Cert.LoadFromStreamPEM(F, Pass) <> 0 then
begin
Msg := 'Invalid certificate file';
Success := false;
end;
end;
3 :
begin
Pass := RequestPassword;
Code := Cert.LoadFromStreamPFX(F, Pass);
if Code <> 0 then
begin
Msg := 'PFX read error: ' + IntToHex(Code, 4);
Success := false;
end;
end;
end;
finally
F.Free;
end;
if not Success then
begin
Cert.Free;
MessageDlg(Msg, mtError, [mbOk], 0);
end
else
begin
Item := ListViewCertificates.Items.Add;
Item.Data := Cert;
Item.Caption := Cert.SubjectName.CommonName;
Item.SubItems.Add(Cert.IssuerName.CommonName);
case Cert.PublicKeyAlgorithm of
SB_CERT_ALGORITHM_ID_RSA_ENCRYPTION : Msg := 'RSA';
SB_CERT_ALGORITHM_ID_DSA : Msg := 'DSA';
SB_CERT_ALGORITHM_DH_PUBLIC : Msg := 'DH';
else
Msg := 'unknown';
end;
Msg := Msg + '/' + IntToStr(Cert.GetPublicKeySize);
Item.SubItems.Add(Msg);
end;
end;
end;
procedure TFormMain.ButtonRemoveCertificateClick(Sender: TObject);
var
Cert : TElX509Certificate;
begin
if Assigned(ListViewCertificates.Selected) then
begin
Cert := ListViewCertificates.Selected.Data;
ListViewCertificates.Items.Delete(ListViewCertificates.Items.IndexOf(ListViewCertificates.Selected));
Cert.Free;
end;
end;
function TFormMain.RequestPassword : string;
begin
FormPassword.EditPassword.Text := '';
FormPassword.ShowModal;
Result := FormPassword.EditPassword.Text;
end;
function TFormMain.CertificateWithPrivateKeyExists: boolean;
var
I : integer;
Cert : TElX509Certificate;
begin
Result := false;
for I := 0 to ListViewCertificates.Items.Count - 1 do
begin
Cert := ListViewCertificates.Items[I].Data;
if Cert <> nil then
begin
if Cert.PrivateKeyExists then
begin
Result := true;
Break;
end;
end;
end;
end;
procedure TFormMain.OutputSignParameters;
var
I : integer;
Cert : TElX509Certificate;
S : string;
begin
Memo.Lines.Clear;
Memo.Lines.Add('File to sign: ' + EditPath.Text);
Memo.Lines.Add('');
for I := 0 to ListViewCertificates.Items.Count - 1 do
begin
Cert := ListViewCertificates.Items[I].Data;
S := Cert.SubjectName.CommonName + '/' + Cert.IssuerName.CommonName;
Memo.Lines.Add('Certificate #' + IntToStr(I + 1) + ': ' + S);
end;
Memo.Lines.Add('');
if RadioButtonSHA1.Checked then
Memo.Lines.Add('Hash: SHA1')
else
Memo.Lines.Add('Hash: MD5');
Memo.Lines.Add('Description: ' + EditDescription.Text);
Memo.Lines.Add('Description URL: ' + EditURL.Text);
end;
function TFormMain.PerformSign : integer;
var
Code : integer;
BoolResult : boolean;
DigAlg : TSBAuthenticodeDigestAlgorithm;
I : integer;
Cert: TElX509Certificate;
begin
BoolResult := true;
Code := ElAuthenticodeSigner.OpenFile(EditPath.Text);
if Code = 0 then
begin
if RadioButtonSHA1.Checked then
DigAlg := acSHA1
else
DigAlg := acMD5;
BoolResult := ElAuthenticodeSigner.AddAuthenticode(DigAlg);
if BoolResult then
begin
for I := 0 to ListViewCertificates.Items.Count - 1 do
begin
Cert := ListViewCertificates.Items[I].Data;
if Cert.PrivateKeyExists then
Code := ElAuthenticodeSigner.AddSignature(EditDescription.Text,
EditURL.Text, DigAlg, Cert, true, cbTimestamp.Checked)
else
BoolResult := ElAuthenticodeSigner.AddCertificate(Cert);
if (not BoolResult) or (Code <> 0) then Break;
end;
end;
if not BoolResult then
ElAuthenticodeSigner.CloseFile(false)
else
ElAuthenticodeSigner.CloseFile(true);
end;
if (Code = 0) and (not BoolResult) then
Code := -1;
Result := Code;
end;
function TFormMain.PerformVerify : integer;
var
I : integer;
Code : integer;
Cert : TElX509Certificate;
RootNode, SubNode, ChildNode, ItemNode : TTreeNode;
Lst : TStringList;
URL : string;
Description : WideString;
VerifyResult: integer;
Timestamp : TDateTime;
begin
TreeViewResults.Items.Clear;
Code := ElAuthenticodeVerifier.OpenFile(EditPath.Text);
if Code = 0 then
begin
RootNode := TreeViewResults.Items.AddChild(nil, ExtractFileName(EditPath.Text));
RootNode.ImageIndex := 6;
RootNode.SelectedIndex := 6;
SubNode := TreeViewResults.Items.AddChild(RootNode, 'Certificates');
SubNode.ImageIndex := 1;
SubNode.SelectedIndex := 1;
for I := 0 to ElAuthenticodeVerifier.Certificates.Count - 1 do
begin
Cert := ElAuthenticodeVerifier.Certificates.Certificates[I];
ChildNode := TreeViewResults.Items.AddChild(SubNode, Cert.SubjectName.CommonName);
ChildNode.ImageIndex := 0;
ChildNode.SelectedIndex := 0;
ItemNode := TreeViewResults.Items.AddChild(ChildNode,
'Subject: ' + Cert.SubjectName.CommonName);
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
ItemNode := TreeViewResults.Items.AddChild(ChildNode,
'Issuer: ' + Cert.IssuerName.CommonName);
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
ItemNode := TreeViewResults.Items.AddChild(ChildNode, 'Validity: ' +
DateToStr(Cert.ValidFrom) + '...' + DateToStr(Cert.ValidTo));
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
ItemNode := TreeViewResults.Items.AddChild(ChildNode, 'Key size: ' +
IntToStr(Cert.GetPublicKeySize) + ' bits');
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
end;
SubNode := TreeViewResults.Items.AddChild(RootNode, 'Signatures');
SubNode.ImageIndex := 5;
SubNode.SelectedIndex := 5;
Lst := TStringList.Create;
for I := 0 to ElAuthenticodeVerifier.SignatureCount - 1 do
begin
ElAuthenticodeVerifier.Signatures[I].Issuer.Issuer.GetValuesByOID(SB_CERT_OID_COMMON_NAME,
Lst);
if Lst.Count < 1 then Lst.Strings[0] := 'unspecified';
ChildNode := TreeViewResults.Items.AddChild(SubNode, Lst.Strings[0]);
ElAuthenticodeVerifier.GetSignatureInfo(I, Description, URL, Timestamp);
if Length(Description) > 0 then
begin
ItemNode := TreeViewResults.Items.AddChild(ChildNode, 'Description: ' + Description);
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
end;
if Length(URL) > 0 then
begin
ItemNode := TreeViewResults.Items.AddChild(ChildNode, 'URL: ' + URL);
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
end;
if Timestamp <> 0 then
begin
ItemNode := TreeViewResults.Items.AddChild(ChildNode, 'Timestamp: ' +
DateTimeToStr(Timestamp));
ItemNode.ImageIndex := 7;
ItemNode.SelectedIndex := 7;
end;
VerifyResult := ElAuthenticodeVerifier.VerifySignature(I);
if VerifyResult = 0 then
ChildNode.ImageIndex := 2
else if VerifyResult = SB_AUTHENTICODE_ERROR_NO_SIGNER_CERTIFICATE then
ChildNode.ImageIndex := 3
else
ChildNode.ImageIndex := 4;
ChildNode.SelectedIndex := ChildNode.ImageIndex;
end;
Lst.Free;
ElAuthenticodeVerifier.CloseFile;
end;
if TreeViewResults.Items.Count > 0 then
TreeViewResults.Items[0].Expand(false);
Result := Code;
end;
function TFormMain.PerformRemoval: integer;
var
Code : integer;
I : integer;
Cert: TElX509Certificate;
begin
Code := ElAuthenticodeVerifier.OpenFile(EditPath.Text);
if Code = 0 then
begin
result := ElAuthenticodeVerifier.RemoveAuthenticode;
ElAuthenticodeVerifier.CloseFile;
end
else
result := -1;
end;
procedure TFormMain.ElAuthenticodeSignerTimestampNeeded(Sender: TObject;
const Request: ByteArray; var Reply: ByteArray; var Succeeded: Boolean);
var res : integer;
OutStream : TMemoryStream;
begin
OutStream := TMemoryStream.Create;
try
HTTPSClient.OutputStream := OutStream;
res := HTTPSClient.Post(editTSPURL.Text, Request);
Succeeded := res = 200;
if Succeeded then
begin
OutStream.Position := 0;
SetLength(Reply, OutStream.Size);
OutStream.ReadBuffer(Reply[0], OutStream.Size);
end;
finally
OutStream.Free;
end;
end;
initialization
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' +
'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' +
'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' +
'5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' +
'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' +
'8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' +
'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' +
'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -