⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.pas

📁 著名的SecureBlackBox控件完整源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      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 + -