pgpdialogs.pas

来自「用DELPHI实现的 PGP 加密算法」· PAS 代码 · 共 989 行 · 第 1/3 页

PAS
989
字号
	finally
	  PGPFreeKeySet(pPGPKeySet(KeysFound));
	end;
      end;
    finally
      FreeKeyServer(ThreadStorage, KeyServerSpecs, KeyServerCount);
      PGPFreeFilter(KeyFilter);
    end;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function KeyImportDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
			 FromFile: Longbool; IgnoreKnownFlag: Integer; KeyPropFlags, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
  FileSpec	 : pPGPFileSpec;
  KeysToImport	 : Pointer;
  KeySetSelected : pPGPKeySet;
begin
  FileSpec:=nil;
  KeysToImport:=nil;
  KeySetSelected:=nil;
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    if FromFile then begin
      Result:=PGPNewFileSpecFromFullPath(Context, PChar(KeyData), FileSpec);
      if Result<>0 then Exit;
      try
	if PGP7X then begin
	  Result:=PGPImport(Context, KeysToImport,
			    PGPOInputFile(Context, FileSpec),
			    PGPOLastOption(Context));
	end
	else begin
	  Result:=PGPImportKeySet(Context, KeysToImport,
				  PGPOInputFile(Context, FileSpec),
				  PGPOLastOption(Context));
	end;
      finally
	PGPFreeFileSpec(FileSpec);
      end;
    end
    else begin
      if PGP7X then begin
	Result:=PGPImport(Context, KeysToImport,
			  PGPOInputBuffer(Context, PChar(KeyData), Length(KeyData)),
			  PGPOLastOption(Context));
      end
      else begin
	Result:=PGPImportKeySet(Context, KeysToImport,
				PGPOInputBuffer(Context, PChar(KeyData), Length(KeyData)),
				PGPOLastOption(Context));
      end;
    end;
    if Result<>0 then Exit;
    if PGP7X then begin
      try
	KeySetSelected:=PGPPeekKeyDBRootKeySet(pPGPKeyDB(KeysToImport));
	Result:=GetExclusiveKeySet(KeySetSelected, KeySetMain, Context, IgnoreKnownFlag);
	if Result<>0 then Exit;
	if Prompt='' then begin
	  Result:=AddKeysToKeyRing(Context, KeySetMain, KeysToImport, KeyPropsList, KeyPropFlags);
	  if Result>0 then Result:=0;
	end
	else begin
	  Result:=SelectAddKeysToKeyRing(Context, tlsContext, PGPPeekKeyDBRootKeySet(pPGPKeyDB(KeysToImport)),
					 KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);
	end;
      finally
	PGPFreeKeyDB(pPGPKeyDB(KeysToImport));
      end;
    end
    else begin
      try
	Result:=GetExclusiveKeySet(pPGPKeySet(KeysToImport), KeySetMain, Context, IgnoreKnownFlag);
	if Result<>0 then Exit;
	if Prompt='' then begin
	  Result:=AddKeysToKeyRing(Context, KeySetMain, KeysToImport, KeyPropsList, KeyPropFlags);
	  if Result>0 then Result:=0;
	end
	else begin
	  Result:=SelectAddKeysToKeyRing(Context, tlsContext, pPGPKeySet(KeysToImport),
					 KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);
	end;
      finally
	PGPFreeKeySet(pPGPKeySet(KeysToImport));
      end;
    end;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function KeyExportDialog(Prompt: String; const KeyIDs: TStrings; var KeyData: String; var KeyPropsList: TKeyPropsList;
			 ToFile, ExportCompatible, ExportPrivate: Longbool; KeyPropFlags, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  tlsContext	 : pPGPtlsContext;
  KeySetMain	 : pPGPKeySet;
  KeySetSelected : pPGPKeySet;
  KeyCount	 : PGPUInt32;
  ExportFormat	 : PGPExportFormat;
  FileSpec	 : pPGPFileSpec;
  OptionList	 : pPGPOptionList;
  OptionListBuf	 : pPGPOptionList;
  KeyOutput	 : PChar;
  KeyLength	 : PGPUInt32;
begin
  KeySetSelected:=nil;
  FileSpec:=nil;
  OptionList:=nil;
  OptionListBuf:=nil;
  Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
  if Result<>0 then Exit;
  try
    if Prompt='' then
      Result:=GetKeySetByAnyIDs(Context, KeySetMain, KeyIDs.CommaText, KeySetSelected)
    else begin
      Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetMain, KeySetMain, 0, KeySetSelected);
      ProcessMessages;
    end;
    if Result<>0 then Exit;
    try
      Result:=PGPCountKeys(KeySetSelected, KeyCount);
      if Result<>0 then Exit;
      if KeyCount<>0 then begin
	if ExportCompatible then
	  ExportFormat:=kPGPExportFormat_Basic
	else ExportFormat:=kPGPExportFormat_Complete;
	Result:=PGPBuildOptionList(Context, OptionList,
	  [
	    PGPOExportFormat(Context, ExportFormat),
	    PGPOExportPrivateKeys(Context, PGPBoolean(ExportPrivate) and 1),
	    PGPOVersionString(Context, MyVersion)
	  ]);
	if Result<>0 then Exit;
	try
	  if ToFile then begin
	    Result:=PGPNewFileSpecFromFullPath(Context, PChar(KeyData), FileSpec);
	    if Result<>0 then Exit;
	    try
	      if Result<>0 then Exit;
	      Result:=PGPAppendOptionList(OptionList, [PGPOOutputFile(Context, FileSpec)]);
	      if Result<>0 then Exit;
	      if PGP7X then begin
		Result:=PGPAppendOptionList(OptionList, [PGPOExportKeySet(Context, KeySetSelected)]);
		if Result=0 then Result:=PGPExport(Context, OptionList, PGPOLastOption(Context));
	      end
	      else Result:=PGPExportKeySet(KeySetSelected, OptionList, PGPOLastOption(Context));
	      if Result=0 then Result:=GetKeySetProps(Context, KeySetSelected, KeyPropsList, KeyPropFlags,
						      KeyFilterFlag_AllKeys, UserID_Ordering);
	      if Result>0 then Result:=0;
	    finally
	      PGPFreeFileSpec(FileSpec);
	    end;
	  end
	  else begin
	    Result:=PGPCopyOptionList(OptionList, OptionListBuf);
	    if Result<>0 then Exit;
	    Result:=PGPAppendOptionList(OptionList, [PGPOAllocatedOutputBuffer(Context, KeyOutput, $FFFFFFFF, KeyLength)]);
	    if Result<>0 then Exit;
	    if PGP7X then begin
	      Result:=PGPAppendOptionList(OptionList, [PGPOExportKeySet(Context, KeySetSelected)]);
	      if Result=0 then Result:=PGPExport(Context, OptionList, PGPOLastOption(Context));
	    end
	    else Result:=PGPExportKeySet(KeySetSelected, OptionList, PGPOLastOption(Context));
	    if (Result=0) and (KeyLength<>0) then begin
	      try
		SetLength(KeyData, KeyLength);
		StrPLCopy(PChar(KeyData), KeyOutput, KeyLength);
	      finally
		PGPFreeData(KeyOutput);
	      end;
	    end
	    else KeyData:='';
	    if Result=0 then Result:=GetKeySetProps(Context, KeySetSelected, KeyPropsList, KeyPropFlags,
						    KeyFilterFlag_AllKeys, UserID_Ordering);
	    if Result>0 then Result:=0;
	  end;
	finally
	  PGPFreeOptionList(OptionListBuf);
	  PGPFreeOptionList(OptionList);
	end;
      end;
    finally
      PGPFreeKeySet(KeySetSelected);
    end;
  finally
    KeyDlgFree(Context, tlsContext, KeySetMain);
  end;
end;

function KeyRevokeDialog(const KeyHexID, PassPrompt: String; WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  KeySetMain	 : pPGPKeySet;
  KeySetFound	 : pPGPKeySet;
  Passphrase	 : PChar;
begin
  KeySetFound:=nil;
  Passphrase:=nil;
  Result:=KeyRings.InitKeyRings(Context, KeySetMain);
  if Result<>0 then Exit;
  try
    Result:=GetKeySetByAnyIDs(Context, KeySetMain, KeyHexID, KeySetFound);
    if Result<>0 then Exit;
    try
      Result:=KeyPassphraseDialog(Context, KeySetFound, Passphrase, PassPrompt, WinHandle);
      ProcessMessages;
      if Result<>0 then Exit;
    finally
      PGPFreeKeySet(KeySetFound);
    end;
    try
      KeyRevoke(PChar(KeyHexID), Passphrase);
    finally
      PGPFreeData(Passphrase);
    end;
  finally
    KeyRings.FreeKeyRings;
  end;
end;

function KeyPassChangeDialog(const KeyHexID, OldPrompt, NewPrompt: String;
			     MinPassLength, MinPassQuality, WinHandle: Integer): Integer;
var
  Context	 : pPGPContext;
  KeySetMain	 : pPGPKeySet;
  KeySetFound	 : pPGPKeySet;
  OldPassphrase	 : PChar;
  NewPassphrase  : PChar;
begin
  KeySetFound:=nil;
  OldPassphrase:=nil;
  NewPassphrase:=nil;
  Result:=KeyRings.InitKeyRings(Context, KeySetMain);
  if Result<>0 then Exit;
  try
    Result:=GetKeySetByAnyIDs(Context, KeySetMain, KeyHexID, KeySetFound);
    if Result<>0 then Exit;
    try
      Result:=KeyPassphraseDialog(Context, KeySetFound, OldPassphrase, OldPrompt, WinHandle);
      ProcessMessages;
      if Result<>0 then Exit;
    finally
      PGPFreeKeySet(KeySetFound);
    end;
    try
      Result:=ConfirmationPassphraseDialog(Context, NewPassphrase,
					   MinPassLength, MinPassQuality, true,
					   NewPrompt, WinHandle);
      ProcessMessages;
      if Result<>0 then Exit;
      try
	ChangePassphrase(PChar(KeyHexID), OldPassphrase, NewPassphrase);
      finally
	PGPFreeData(NewPassphrase);
      end;
    finally
      PGPFreeData(OldPassphrase);
    end;
  finally
    KeyRings.FreeKeyRings;
  end;
end;

function SelectAddKeysToKeyRing(Context: pPGPContext; tlsContext: pPGPtlsContext;
				KeysToAdd: pPGPKeySet; KeySetMain: pPGPKeySet;
				var KeyPropsList: TKeyPropsList;
				const Prompt: String; SingleKey: Longbool;
				KeyPropFlags, WinHandle: Integer): PGPError;
var
  KeyCount	 : PGPUInt32;
  KeyDBTemp	 : pPGPKeyDB;
  KeySetTemp	 : pPGPKeySet;
  KeySetSelected : pPGPKeySet;
  KeySetSelToAdd : pPGPKeySet;
begin
  KeySetSelected:=nil;
  KeySetSelToAdd:=nil;
  Result:=PGPCountKeys(KeysToAdd, KeyCount);
  if Result<>0 then Exit;
  if KeyCount<>0 then begin
    if PGP7X then begin
      KeyDBTemp:=nil;
      Result:=PGPNewKeyDB(Context, KeyDBTemp);
      if Result<>0 then Exit;
      try
	KeySetTemp:=nil;
	Result:=PGPCopyKeys(KeySetMain, KeyDBTemp, KeySetTemp);
	if Result<>0 then Exit;
	PGPFreeKeySet(KeySetTemp);
	Result:=PGPCopyKeys(KeysToAdd, KeyDBTemp, KeySetTemp);
	if Result<>0 then Exit;
	try
	  // KeyDBTemp and KeySetTemp are needed for displaying "web of trust" validities
	  Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetTemp,
				  nil, (ord(SingleKey) and 1)*PGPCL_SINGLESELECTION, KeySetSelected);
	  ProcessMessages;
	  if Result<>0 then Exit;
	  try
	    Result:=PGPCopyKeys(KeySetSelected, PGPPeekKeySetKeyDB(KeySetMain), KeySetSelToAdd);
	  finally
	    PGPFreeKeySet(KeySetSelected);
	  end;
	finally
	  PGPFreeKeySet(KeySetTemp);
	end;
      finally
	PGPFreeKeyDB(KeyDBTemp);
      end;
    end
    else begin
      Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeysToAdd,
			      KeySetMain, (ord(SingleKey) and 1)*PGPCL_SINGLESELECTION, KeySetSelected);
      ProcessMessages;
      if Result<>0 then Exit;
      KeySetSelToAdd:=KeySetSelected;
      Result:=PGPAddKeys(KeySetSelToAdd, KeySetMain);
    end;
    if Result<>0 then Exit;
    try
      Result:=KeyRings.UpdateKeyRings;
      if Result<>0 then Exit;
      Result:=GetKeySetProps(Context, KeySetSelToAdd, KeyPropsList, KeyPropFlags,

⌨️ 快捷键说明

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