selwincertform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 163 行

PAS
163
字号
unit SelWinCertForm;

interface

uses
  {$ifdef DELPHI_NET}
  System.ComponentModel,
  {$endif}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls,
  SBWinCertStorage, SBX509, SBX509Ext, SBUtils, StdCtrls, ExtCtrls;

type
  TfrmSelWinCert = class(TForm)
    lvCerificates: TListView;
    Label1: TLabel;
    btnOK: TButton;
    btnCancel: TButton;
    Panel1: TPanel;
    lbPrivateKey: TLabel;
    dlbPrivateKey: TLabel;
    lbUsage: TLabel;
    dlbUsage: TLabel;
    procedure lvCerificatesChange(Sender: TObject; Item: TListItem;
      Change: TItemChange);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FCertificate: TElX509Certificate;
  public
    WinCertStorage: TElWinCertStorage;

    procedure UpdateCertificates;
    procedure UpdateCertInfo;

    property Certificate: TElX509Certificate read FCertificate;
  end;

var
  frmSelWinCert: TfrmSelWinCert;

implementation

{$R *.dfm}

procedure TfrmSelWinCert.FormCreate(Sender: TObject);
begin
  WinCertStorage := TElWinCertStorage.Create(nil);
  WinCertStorage.SystemStores.Text := 'MY';
  UpdateCertificates;
  UpdateCertInfo;
end;

procedure TfrmSelWinCert.FormDestroy(Sender: TObject);
begin
  FreeAndNil(WinCertStorage);
end;

procedure TfrmSelWinCert.lvCerificatesChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
  if Assigned(lvCerificates.Selected) then
    FCertificate := TElX509Certificate(lvCerificates.Selected.Data)
  else
    FCertificate := nil;

  UpdateCertInfo;
end;

procedure TfrmSelWinCert.UpdateCertInfo;
var
  KeyUsage: TElKeyUsageExtension;
  ExtKeyUsage: TElExtendedKeyUsageExtension;
  s: string;
begin
  if not Assigned(FCertificate) then
  begin
    dlbPrivateKey.Caption := 'None';
    dlbUsage.Caption := 'None';
    Exit;
  end;

  if FCertificate.PrivateKeyExists then
    dlbPrivateKey.Caption := 'Available'
  else
    dlbPrivateKey.Caption := 'None';

  s := '';
  {$ifndef DELPHI_NET}
  if ceKeyUsage in FCertificate.Extensions.Included then
  {$else}
  if (FCertificate.Extensions.Included and ceKeyUsage) = ceKeyUsage then
  {$endif}
  begin
    KeyUsage := FCertificate.Extensions.KeyUsage;
    if KeyUsage.DigitalSignature then
      s := s + 'Digital Signitare, ';
    if KeyUsage.NonRepudiation then
      s := s + 'Non-repudiation, ';
    if KeyUsage.KeyEncipherment then
      s := s + 'Key Transport, ';
    if KeyUsage.DataEncipherment then
      s := s + 'Data Encipherment, ';
    if KeyUsage.KeyAgreement then
      s := s + 'Key Agreement, ';
    if KeyUsage.KeyCertSign then
      s := s + 'Certificate Signing, ';
    if KeyUsage.CRLSign then
      s := s + 'CRL Signing, ';
    if KeyUsage.EncipherOnly then
      s := s + 'Encipher only, ';
    if KeyUsage.DecipherOnly then
      s := s + 'Decipher only, ';

    if Length(s) > 0 then
      Delete(s, Length(s) - 1, 2);
  end;
  dlbUsage.Caption := s;
end;

procedure TfrmSelWinCert.UpdateCertificates;
var
  i: Integer;
  Cert: TElX509Certificate;
  Item: TListItem;
  s: string;
begin
  for i := 0 to WinCertStorage.Count - 1 do
  begin
    Cert := WinCertStorage.Certificates[i];
    Item := lvCerificates.Items.Add;
    Item.Data := Cert;
    // Serial Number
    {$ifndef DELPHI_NET}
    s := Cert.SerialNumber;
    Item.Caption := BeautifyBinaryString(BinaryToString(@s[1], Length(s)), ' ');
    {$else}
    Item.Caption := BeautifyBinaryString(BinaryToString(Cert.SerialNumber), ' ');
    {$endif}
    // Subject
    s := Cert.SubjectName.CommonName;
    if s = '' then
      s := Cert.SubjectName.Organization;
    Item.SubItems.Add(s);
    // Issuer
    s := Cert.IssuerName.CommonName;
    if s = '' then
      s := Cert.IssuerName.Organization;
    Item.SubItems.Add(s);
    // Valid From
    Item.SubItems.Add(DateTimeToStr(Cert.ValidFrom));
    // Valid To
    Item.SubItems.Add(DateTimeToStr(Cert.ValidTo));
    // Private Key
    if Cert.PrivateKeyExists then    
      Item.SubItems.Add('Yes')
    else
      Item.SubItems.Add('No');
  end;
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?