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

📄 unit1.pas

📁 example code for signing in p7m
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,CAPICOM_TLB;

type
  TForm1 = class(TForm)
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Form1.SignXML(filepathname:String;browse:Smallint):boolean;
var
  FileSaveStream:TFileStream;
  MemoryStream:TMemoryStream;

  SignedString:WideString;
  P:PByteArray;
  VarArray:Variant;
  oUtilities:CAPICOM_TLB.IUtilities;

  Store: CAPICOM_TLB.IStore;
  SignedData: CAPICOM_TLB.ISignedData;
  Signer:CAPICOM_TLB.ISigner;
  Signer2:ISigner2;
  Attribute:IAttribute;
begin



if detached then begin
 SaveDialog.FileName:=filepathname + '.p7s'
end else begin
 SaveDialog.FileName:=filepathname + '.p7m';
end;
SaveDialog.Title:='...message.............';

if not SaveDialog.Execute then Exit;

if not Assigned(FFileStream) or (FFileStream.Size=0) then begin
FFileStream:=TFileStream.Create(filepathname, fmOpenRead or fmShareExclusive);
end;
if not Assigned(FFileStream) or (FFileStream.Size=0) then exit;


MemoryStream:=TMemoryStream.Create;
FFileStream.Position:=0;
MemoryStream.CopyFrom(FFileStream, FFileStream.Size);
MemoryStream.Position:=0;

VarArray:=VarArrayCreate([0, MemoryStream.Size-1], VarByte);
P:=VarArrayLock(VarArray);

  try
    Move(MemoryStream.Memory^, P^, MemoryStream.Size);
  finally
    VarArrayUnlock(VarArray);
   end;

 oUtilities:=CoUtilities.Create;

 Store:=CoStore.Create;
 Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);

 SignedData := CoSignedData.Create;
 SignedData.Content:=oUtilities.ByteArrayToBinaryString(VarArray); 

 Signer:=CoSigner.Create;
 Attribute:=CoAttribute.Create;
 Attribute.Name:=CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
 Attribute.Value:=Now;

 Signer.AuthenticatedAttributes.Add(Attribute);

 Signer2:=signer as ISigner2;

 MemoryStream.Clear;
 MemoryStream.Position:=0;


 VarClear(VarArray);
 VarArray:=oUtilities.BinaryStringToByteArray(SignedData.Sign(Signer2, detached, CAPICOM_ENCODE_BINARY));
 if (not VarIsArray(VarArray)) then raise Exception.Create('.....');

 P:=VarArrayLock(VarArray);
  try
    MemoryStream.Write(P^, VarArrayHighBound(VarArray,1)+1);
  finally
    VarArrayUnlock(VarArray);
   end;
  MemoryStream.Position:=0;

 FileSaveStream:=TFileStream.Create(SaveDialog.FileName, fmCreate or fmShareExclusive);

 FileSaveStream.CopyFrom(MemoryStream, MemoryStream.Size);
 Form.Label.Caption:='' + SaveDialog.FileName;
 Form.ShowModal;
 FreeAndNil(FileSaveStream);
 FreeAndNil(MemoryStream);

end;
end.
 

⌨️ 快捷键说明

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