fmain.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 586 行 · 第 1/2 页

PAS
586
字号
unit fMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SBUtils, SBDomainKeys, ExtCtrls;

type
  TfrmMain = class(TForm)
    lblStep1: TLabel;
    btnLoadMessage: TButton;
    lblMessageHeader: TLabel;
    memMessageHeader: TMemo;
    btnProcessHeader: TButton;
    lblStep3: TLabel;
    btnProcessBody: TButton;
    lblMessageBody: TLabel;
    memMessageBody: TMemo;
    lblStep2: TLabel;
    grpSenderSignature: TGroupBox;
    lblSenderSignatureAlgorithm: TLabel;
    lblSenderDigestAlgorithm: TLabel;
    lblSenderQueryType: TLabel;
    lblSenderSelector: TLabel;
    lblSenderDomain: TLabel;
    lblSenderAvailable: TLabel;
    grpAuthorSignature: TGroupBox;
    lblAuthorSignatureAlgorithm: TLabel;
    lblAuthorDigestAlgorithm: TLabel;
    lblAuthorQueryType: TLabel;
    lblAuthorSelector: TLabel;
    lblAuthorDomain: TLabel;
    lblAuthorAvailable: TLabel;
    lblStep4: TLabel;
    btnQueryDNS: TButton;
    lblStep5: TLabel;
    lblStep6: TLabel;
    lblStep2Result: TLabel;
    lblStep3Result: TLabel;
    dlgOpenMessage: TOpenDialog;
    grpAuthorDNS: TGroupBox;
    edtAuthorDomain: TEdit;
    lblAuthorGranularity: TLabel;
    lblAuthorTestMode: TLabel;
    edtAuthorNotes: TEdit;
    lblAuthorPublicKey: TLabel;
    lblAuthorRevoked: TLabel;
    grpSenderDNS: TGroupBox;
    lblSenderGranularity: TLabel;
    lblSenderTestMode: TLabel;
    lblSenderPublicKey: TLabel;
    lblSenderRevoked: TLabel;
    edtSenderDomain: TEdit;
    edtSenderNotes: TEdit;
    btnVerify: TButton;
    pnlBottom: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    btnReset: TButton;
    lblSenderSignature: TLabel;
    lblAuthorSignature: TLabel;
    pnlTop: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnLoadMessageClick(Sender: TObject);
    procedure btnProcessHeaderClick(Sender: TObject);
    procedure btnProcessBodyClick(Sender: TObject);
    procedure btnQueryDNSClick(Sender: TObject);
    procedure btnVerifyClick(Sender: TObject);
    procedure btnResetClick(Sender: TObject);
  private
    // Verifier
    FVerifier: TElDomainKeysVerifier;
    // DNS Records
    FAuthorRecord: TElDKDNSRecord;
    FSenderRecord: TElDKDNSRecord;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

uses
  fDNS;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  // create an instance of verifier
  FVerifier := TElDomainKeysVerifier.Create(nil);
  // create instances of DNS records
  FSenderRecord := TElDKDNSRecord.Create;
  FAuthorRecord := TElDKDNSRecord.Create;
  // disable all steps except the first one
  btnProcessHeader.Enabled := False;      // step 2
  btnProcessBody.Enabled := False;        // step 3
  btnQueryDNS.Enabled := False;           // step 4
  btnVerify.Enabled := False;             // step 5
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  // destroy the instainces of DNS records
  FreeAndNil(FAuthorRecord);
  FreeAndNil(FSenderRecord);
  // destroy the instance of verifier
  FreeAndNil(FVerifier);
end;

procedure TfrmMain.btnLoadMessageClick(Sender: TObject);
var
  Text: TStringList;
  I: Integer;
  HeaderDone: Boolean;
  S: string;
begin
  // call Open File Dialog
  if dlgOpenMessage.Execute then
  begin
    // create a temporary string list
    Text := TStringList.Create;
    try
      // load content of the file to the temporary string list
      Text.LoadFromFile(dlgOpenMessage.FileName);
      // iterate the content line by line to separate header and body
      HeaderDone := False;
      for I := 0 to Text.Count - 1 do
      begin
        S := Text[I];
        if not HeaderDone then
        begin
          // header is not loaded yet
          memMessageHeader.Lines.Add(S);
          if S = '' then    // first empty line separates header and body
            HeaderDone := True;
        end
        else
        begin
          // header is loaded already
          memMessageBody.Lines.Add(S);
        end;
      end;
    finally
      Text.Free;
    end;
    // if the message was loaded successfully, enable the next step
    btnProcessHeader.Enabled := True;
    // and disable the current step
    btnLoadMessage.Enabled := False;
  end;
end;

procedure TfrmMain.btnProcessHeaderClick(Sender: TObject);
var
  Result: Integer;
begin
  // call ProcessHeader method of verifier
  Result := FVerifier.ProcessHeader(memMessageHeader.Lines);
  // analyze the returned value
  if Result = SB_DK_VERIFIER_ERROR_SUCCESS then
  begin
    // ProcessHeader method returned no error
    lblStep2Result.Caption := 'Succeeded';
    // check if sender signature is available 
    if FVerifier.SenderSignature.Available then
    begin
      lblSenderAvailable.Caption := 'YES';
      // get the parameters of sender signature
      lblSenderDomain.Caption := FVerifier.SenderSignature.Domain;
      lblSenderSelector.Caption := FVerifier.SenderSignature.Selector;
      if FVerifier.SenderSignature.QueryType = dkDNS then
        lblSenderQueryType.Caption := 'DNS'
      else
        lblSenderQueryType.Caption := 'Unknown';
      if FVerifier.SenderSignature.SignatureAlgorithm = dkRSA then
        lblSenderSignatureAlgorithm.Caption := 'RSA'
      else
        lblSenderSignatureAlgorithm.Caption := 'Unknown';
      if FVerifier.SenderSignature.DigestAlgorithm = dkSHA1 then
        lblSenderDigestAlgorithm.Caption := 'SHA-1'
      else
        lblSenderDigestAlgorithm.Caption := 'Unknown';
      // get domain for DNS query
      edtSenderDomain.Text := FVerifier.SenderSignature.Selector +
        '._domainkey.' + FVerifier.SenderSignature.Domain;
    end
    else
      lblSenderAvailable.Caption := 'NO';
    // check if author signature is available 
    if FVerifier.AuthorSignature.Available then
    begin
      lblAuthorAvailable.Caption := 'YES';
      // get the parameters of author signature
      lblAuthorDomain.Caption := FVerifier.AuthorSignature.Domain;
      lblAuthorSelector.Caption := FVerifier.AuthorSignature.Selector;
      if FVerifier.AuthorSignature.QueryType = dkDNS then
        lblAuthorQueryType.Caption := 'DNS'
      else
        lblAuthorQueryType.Caption := 'Unknown';
      if FVerifier.AuthorSignature.SignatureAlgorithm = dkRSA then
        lblAuthorSignatureAlgorithm.Caption := 'RSA'
      else
        lblAuthorSignatureAlgorithm.Caption := 'Unknown';
      if FVerifier.AuthorSignature.DigestAlgorithm = dkSHA1 then
        lblAuthorDigestAlgorithm.Caption := 'SHA-1'
      else
        lblAuthorDigestAlgorithm.Caption := 'Unknown';
      // get domain for DNS query
      edtAuthorDomain.Text := FVerifier.AuthorSignature.Selector +
        '._domainkey.' + FVerifier.AuthorSignature.Domain;
    end
    else
      lblAuthorAvailable.Caption := 'NO';
    // enable the next step
    btnProcessBody.Enabled := True;
    // and disable the current step
    btnProcessHeader.Enabled := False;
    // scroll the form to make Step 3 controls visible
    ScrollInView(btnQueryDNS);
  end
  else
  begin
    // ProcessHeader method returned an error
    case Result of
      SB_DK_VERIFIER_ERROR_INVALID_STATE:
        begin
          // returned if the ProcessHeader and ProcessBodyLine
          // methods are called in wrang order; so this error will
          // not be returned in this demo app
          lblStep2Result.Caption := 'Internal error';
        end;
      SB_DK_VERIFIER_ERROR_INVALID_HEADER:
        begin
          // returned if verifier has failed to parse message header
          lblStep2Result.Caption := 'Invalid header format';
        end;
      SB_DK_VERIFIER_ERROR_INVALID_SENDER:
        begin
          // returned if verifier has field to extract sender's domain name
          // from the Sender header field
          lblStep2Result.Caption := 'Invalid message sender';
        end;
      SB_DK_VERIFIER_ERROR_INVALID_AUTHOR:
        begin
          // returned if verifier has field to extract author's domain name
          // from the From header field
          lblStep2Result.Caption := 'Invalid message author'; 
        end;
      SB_DK_VERIFIER_ERROR_NO_ADDRESS:
        begin
          // returned if the message doesn't contain Sender nor From fields
          lblStep2Result.Caption := 'No Sender nor Author specified';
        end;
      SB_DK_VERIFIER_ERROR_NO_SIGNATURE:
        begin
          // returned if the message is not signed
          lblStep2Result.Caption := 'The message is not singed. Nothing to verify';
        end;
      SB_DK_VERIFIER_ERROR_INVALID_FORMAT:
        begin
          // returned if verifier has failed to parse a signature
          lblStep2Result.Caption := 'Invalid signature format';
        end;
      SB_DK_VERIFIER_ERROR_UNKNOWN_ALGORITHM:
        begin
          // returned if verifier has found an unknown algorithm
          // specified in the message
          lblStep2Result.Caption := 'Invalid algorithm';
        end;
      SB_DK_VERIFIER_ERROR_FAILURE:
        begin
          // this code is returned only from ProcessMessage method
          // when it fails to read from stream
          lblStep2Result.Caption := 'Internal Error';
        end;
    else
      // unknown error code
      lblStep2Result.Caption := 'Unknown Internal Error';
    end;
    // disable the current step; Reset method of verifier must be called
    // to process next message
    btnProcessHeader.Enabled := False;
  end;
end;

procedure TfrmMain.btnProcessBodyClick(Sender: TObject);
var
  I, Result: Integer;

⌨️ 快捷键说明

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