mainform.pas

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

PAS
860
字号
         end
         else
         begin // xetKeyTransport
           RSAKeyData := TElXMLKeyInfoRSAData.Create(True);
           RSAKeyData.RSAKeyMaterial.Passphrase := frmEnc.Passphrase;
           X509KeyData := TElXMLKeyInfoX509Data.Create(True);
{$ifndef SBB_EXCL_XML_PGP}
           PGPKeyData := TElXMLKeyInfoPGPData.Create(True);
{$endif}
(*
           F := TFileStream.Create(frmEnc.KeyFile, fmCreate);
           RSAKeyData.RSAKeyMaterial.Generate(1024);
           RSAKeyData.RSAKeyMaterial.SaveSecret(F);
           FreeAndNil(F);
*)

           {$ifndef DELPHI_NET}
           F := TFileStream.Create(frmEnc.KeyFile, fmOpenRead or fmShareDenyWrite);
           {$else}
           F := FileStream.Create(frmEnc.KeyFile, FileMode.Open, FileAccess.Read);
           {$endif}

           try
             RSAKeyData.RSAKeyMaterial.LoadPublic(F);
           except
           end;

           if not RSAKeyData.RSAKeyMaterial.PublicKey then
           begin
             F.Position := 0;
             try
               RSAKeyData.RSAKeyMaterial.LoadSecret(F);
             except
             end;
           end;

           if not RSAKeyData.RSAKeyMaterial.PublicKey then
           begin
             F.Position := 0;
             LoadCertificate(F, frmEnc.Passphrase, X509KeyData);
           end;

{$ifndef SBB_EXCL_XML_PGP}
           if not RSAKeyData.RSAKeyMaterial.PublicKey and
              not Assigned(X509KeyData.Certificate) then
           begin
             F.Position := 0;
             PGPKeyData.PublicKey := TElPGPPublicKey.Create;
             try
               PGPKeyData.PublicKey.LoadFromStream(F);
             except
               PGPKeyData.PublicKey.Free;
               PGPKeyData.PublicKey := nil;
             end;

             if not Assigned(PGPKeyData.PublicKey) then
             begin
               F.Position := 0;
               PGPKeyData.SecretKey := TElPGPSecretKey.Create;
               PGPKeyData.SecretKey.Passphrase := frmEnc.Passphrase;
               try
                 PGPKeyData.SecretKey.LoadFromStream(F);
               except
                 PGPKeyData.SecretKey.Free;
                 PGPKeyData.SecretKey := nil;
               end;
             end;
           end;
{$endif}

           FreeAndNil(F);

           if RSAKeyData.RSAKeyMaterial.PublicKey then
             Encryptor.KeyEncryptionKeyData := RSAKeyData
           else
           if Assigned(X509KeyData.Certificate) then
             Encryptor.KeyEncryptionKeyData := X509KeyData
{$ifndef SBB_EXCL_XML_PGP}
           else
           if Assigned(PGPKeyData.PublicKey) or
              Assigned(PGPKeyData.SecretKey) then
             Encryptor.KeyEncryptionKeyData := PGPKeyData
{$endif}
           else
             raise EXMLError.Create('Key not loaded.');
         end;
       end
       else
       begin
         SymKeyData := TElXMLKeyInfoSymmetricData.Create(True);

(*
         SymKeyData.Key.Algorithm := SB_ALGORITHM_CNT_3DES;
         SymKeyData.Key.Generate(24 * 8);
//         for i := 0 to 23 do
//           SymKeyData.Key.Key[i] := Ord('a') + i;

         SymKeyData.Key.GenerateIV(8 * 8);
         F := TFileStream.Create(frmEnc.edKeyFile.Text, fmCreate);
         SymKeyData.Key.Save(F);
         FreeAndNil(F);
*)

         {$ifndef DELPHI_NET}
         F := TFileStream.Create(frmEnc.KeyFile, fmOpenRead or fmShareDenyWrite);
         {$else}
         F := FileStream.Create(frmEnc.KeyFile, FileMode.Open, FileAccess.Read);
         {$endif}
         try
           SymKeyData.Key.Load(F);
         finally
           FreeAndNil(F);
         end;

         // generate random IV
         if (Encryptor.EncryptionMethod = xem3DES) or
            (Encryptor.EncryptionMethod = xemDES) then
           SymKeyData.Key.GenerateIV(8 * 8)
         else
           SymKeyData.Key.GenerateIV(16 * 8);

         Encryptor.KeyData := SymKeyData;
       end;

       if Encryptor.EncryptedDataType = xedtExternal then
       begin
         Encryptor.MimeType := frmEnc.MimeType;

         {$ifndef DELPHI_NET}
         F := TFileStream.Create(frmEnc.ExternalFile, fmOpenRead or fmShareDenyWrite);
         {$else}
         F := FileStream.Create(frmEnc.ExternalFile, FileMode.Open, FileAccess.Read);
         {$endif}
         try
           SetLength(Buf, F.{$ifndef DELPHI_NET}Size{$else}Length{$endif});
           if F.{$ifndef DELPHI_NET}Size{$else}Length{$endif} > 0 then
             {$ifndef DELPHI_NET}
             F.Read(Buf[0], Length(Buf));
             {$else}
             F.Read(Buf, 0, Length(Buf));
             {$endif}
         finally
           FreeAndNil(F);
         end;

         Encryptor.Encrypt(Buf);

         FreeAndNil(FXMLDocument);
         FXMLDocument := TElXMLDOMDocument.Create;

         try
           EncNode := Encryptor.Save(FXMLDocument);
         except
           on E: Exception do
             raise EXMLError.CreateFmt('Encrypted data saving failed. (%s)', [E.Message]);
         end;

         FXMLDocument.AppendChild(EncNode);
         UpdateXML;
       end
       else
       begin
         if not Assigned(tvXML.Selected) or
            not Assigned(tvXML.Selected.Data) then
         begin
           MessageDlg('Please, select node for encryption.', mtInformation, [mbOK], 0);
           Exit;
         end;

         Node := TElXMLDOMNode(tvXML.Selected.Data);

         Encryptor.Encrypt(Node);

         try
           EncNode := Encryptor.Save(FXMLDocument);
         except
           on E: Exception do
             raise EXMLError.CreateFmt('Encrypted data saving failed. (%s)', [E.Message]);
         end;

         if Encryptor.EncryptedDataType = xedtElement then
           Node.ParentNode.ReplaceChild(EncNode, Node)
         else // xedtContent
         begin
           if Node is TElXMLDOMElement then
           begin
             while Assigned(Node.LastChild) do
               Node.RemoveChild(Node.LastChild);

             Node.AppendChild(EncNode);
           end
           else
             Node.ParentNode.ReplaceChild(EncNode, Node);
         end;

         UpdateXML;
       end;

    finally
      FreeAndNil(Encryptor);
      FreeAndNil(SymKeyData);
      FreeAndNil(SymKEKData);
      FreeAndNil(RSAKeyData);
      FreeAndNil(X509KeyData);
{$ifndef SBB_EXCL_XML_PGP}
      FreeAndNil(PGPKeyData);
{$endif}
    end;
  end;
end;

procedure TfrmMain.btnLoadXMLClick(Sender: TObject);
var
  F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
  {$ifndef DELPHI_NET}
  F := TFileStream.Create(edXMLFile.Text, fmOpenRead or fmShareDenyWrite);
  {$else}
  F := FileStream.Create(edXMLFile.Text, FileMode.Open, FileAccess.Read);
  {$endif}
  try
    FXMLDocument.LoadFromStream(F);
  except
    on E : Exception do
    begin
      MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
    end;
  end;

  FreeAndNil(F);
  UpdateXML;
end;

procedure TfrmMain.btnSaveXMLClick(Sender: TObject);
var
  F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
begin
  {$ifndef DELPHI_NET}
  F := TFileStream.Create(edXMLFile.Text, fmCreate or fmOpenWrite);
  {$else}
  F := System.IO.FileStream.Create(edXMLFile.Text, FileMode.Create, FileAccess.ReadWrite);
  {$endif}
  try
    FXMLDocument.SaveToStream(F);
  except
    on E : Exception do
    begin
      MessageDlg('Error: ' + E.Message, mtError, [mbOk], 0);
    end;
  end;

  FreeAndNil(F);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FXMLDocument := TElXMLDOMDocument.Create;
  UpdateXML;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FXMLDocument);
end;

procedure TfrmMain.LoadCertificate(F: {$ifndef DELPHI_NET}TFileStream{$else}FileStream{$endif};
  const Password: string; X509KeyData: TElXMLKeyInfoX509Data);
var
  CertFormat : TSBCertFileFormat;
begin
  X509KeyData.Certificate := TElX509Certificate.Create(nil);
  try
    CertFormat := X509KeyData.Certificate.DetectCertFileFormat(F);
    F.Position := 0;

    case CertFormat of
      cfDER: X509KeyData.Certificate.LoadFromStream(F);
      cfPEM: X509KeyData.Certificate.LoadFromStreamPEM(F, Password);
      cfPFX: X509KeyData.Certificate.LoadFromStreamPFX(F, Password);
    else
      X509KeyData.Certificate.Free;
      X509KeyData.Certificate := nil;
    end;
  except
    X509KeyData.Certificate.Free;
    X509KeyData.Certificate := nil;
  end;
end;

procedure TfrmMain.sbBrowseXMLFileClick(Sender: TObject);
begin
  dlgOpenXML.InitialDir := ExtractFilePath(Application.ExeName) + 'Samples';
  dlgOpenXML.FileName := edXMLFile.Text;
  if dlgOpenXML.Execute then
    edXMLFile.Text := dlgOpenXML.FileName;
end;

procedure TfrmMain.tvXMLChange(Sender: TObject; Node: TTreeNode);
var
  N: TElXMLDOMNode;
  s, nt: string;
begin
  if Assigned(tvXML.Selected) and
     Assigned(tvXML.Selected.Data) then
  begin
    N := TElXMLDOMNode(tvXML.Selected.Data);
    if N is TElXMLDOMAttr then
      s := TElXMLDOMAttr(N).NodeValue
    else
      s := N.OuterXML;

    dlbNamespaceURI.Caption := N.NamespaceURI;
    mmXML.Text := AdjustLineBreaks(s);
    if N is TElXMLDOMAttr then
      nt := 'Attribute'
    else
    if N is TElXMLDOMElement then
    begin
      if Assigned(N.ParentNode) and
         not (N.ParentNode is TElXMLDOMDocument) then
        nt := 'Element'
      else
        nt := 'Root element';
    end
    else
    if N is TElXMLDOMText then
      nt := 'Text'
    else
    if N is TElXMLDOMComment then
      nt := 'Comment'
    else
    if N is TElXMLDOMDocument then
      nt := 'Document'
    else
      nt := 'Unknown';

    dlbNodeType.Caption := nt;
  end
  else
  begin
    mmXML.Clear;
    dlbNodeType.Caption := 'None';
    dlbNamespaceURI.Caption := '';
  end;
end;

procedure TfrmMain.UpdateXML;

  function AddNode(Sibling: TTreeNode; Node: TElXMLDOMNode): TTreeNode;
  var
    T: TElXMLDOMNode;
    AttrNode: TTreeNode;
    Attributes: TElXMLDOMNamedNodeMap;
    i: Integer;
    s: string;
  begin
    if Node is TElXMLDOMDocument then
      s := TElXMLDOMDocument(Node).LocalName
    else if Node is TElXMLDOMElement then
      s := TElXMLDOMElement(Node).NodeName
    else if Node is TElXMLDOMAttr then
      s := TElXMLDOMAttr(Node).NodeName
    else
      s := Node.NodeName;

    Result := tvXML.Items.AddChild(Sibling, s);
    Result.Data := {$ifndef DELPHI_NET}Pointer{$endif}(Node);
    if Node is TElXMLDOMElement then
    begin
      Attributes := TElXMLDOMElement(Node).Attributes;
      if Assigned(Attributes) and (Attributes.Length > 0) then
      begin
        AttrNode := Result;
//        AttrNode := tvXML.Items.AddChild(Result, 'Attributes');
        for i := 0 to Attributes.Length - 1 do
          AddNode(AttrNode, Attributes.Item[i]);
      end;
    end;

    if Node is TElXMLDOMAttr then
      Exit;

    T := Node.FirstChild;
    while Assigned(T) do
    begin
      if (T is TElXMLDOMElement) or
         (T is TElXMLDOMAttr) or
         ((T is TElXMLDOMText) and (Trim(TElXMLDOMText(T).NodeValue) <> '')) then
        AddNode(Result, T);

      T := T.NextSibling;
    end;
  end;

begin
  mmXML.Clear;
  tvXML.Items.BeginUpdate;
  try
    tvXML.Items.Clear;
    AddNode(nil, FXMLDocument);
    tvXML.Items.GetFirstNode.Expand(False);
  finally
    tvXML.Items.EndUpdate;
  end;
end;

initialization
  {$ifndef DELPHI_NET}
SetLicenseKey('ADDCD14AD06709806817E0B3D7BFD0A2222D536FE156466C5D5FE65DB5DEAE76' + 
  'FFDEBC07E915A5751C12C01C783958872A38E4A5EDA140E7247E0F2E56442A3C' + 
  'F3E9347AD8FDE52083A0DFC86BC00ECB0FD0CF1B51159A2BCB84F6EA6349EF47' + 
  '5C15A59AFCC55F7C3AAD26C279628B5D91B1DC94BD2385354A70CCA3B76101D9' + 
  'F41C84A639FC3CCE4BA8F0CC4A66DCD150114A3F58C1AD46B7B94643741BC20A' + 
  '8DCA83AB921480951B423CAA19EF1863A47CA2C3422E7E5634BED98939A5AE43' + 
  'DE1E4BAD79E66D8A5C973B3455656C8C9B6FF024FADD6CDA02D0F506D98493C8' + 
  'BD1ED7B237DB75FA31F2C82654490CDDDEE24E19939137B9E1DB05508733B22F');
  {$else}
  SBUtils.SetLicenseKey(
  '0566A0892842A9A7E2957B21B3D81A1C6EDB361CFEC2CCCA088A386D658ED927' +
  'B01744E8DFBC590717631F42F840ED63C0322DDA17AA712010211551FFCD6042' +
  'AB769E2D8FE083C15338C99902232783FAB30AA65EEBEE98338B8FCBC1AFE342' +
  'DF79686C1E1587E6E3EACCBF9DA720F12BA80C66CE2191BDE832BB59AB459236' +
  'B12FC1EFFC0FDDB198869B2E95FC5C5593FE6D69FEA95AC03E97D4F78C948C85' +
  'AD18E5589A7E827E7D09AB04FEB7C69C0AA7ED2530F8AEE623BCE705D4F39E16' +
  '44CF22872C3425C2A260234AE3410F32642FE0683781FC6833F5A5BA7306488B' +
  'CE4F7D13D91E892DAE4C908D92415BF05F61A380CB8CB796F047334B58FE79FA'
  );
  {$endif}
end.

⌨️ 快捷键说明

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