pgpdialogs.pas
来自「用DELPHI实现的 PGP 加密算法」· PAS 代码 · 共 989 行 · 第 1/3 页
PAS
989 行
{$J+,Z4}
unit PGPDialogs;
{------------------------------------------------------------------------------}
{ }
{ This unit is partly based on Steve Heller's }
{ SPGP sources available from http://www.oz.net/~srheller/spgp/ }
{ }
{ Portions created by Michael in der Wiesche are }
{ Copyright (C) 2001-2003 by Michael in der Wiesche }
{ }
{------------------------------------------------------------------------------}
interface
uses
Windows,
Classes,
SysUtils,
KeyPropTypes,
pgpBase,
pgpErrors,
pgpPubTypes,
pgpUtilities,
pgpOptionList,
pgpMemoryMgr,
pgpKeyServer,
pgpGroups,
pgpKeys,
pgpTLS,
pgpUI,
pgpCL,
KeyFuncs,
PrefFuncs;
type
TSignOption = (soEnc, soClear, soDetached);
{ "public" functions }
function PreferencesDialog(PrefsPage, WinHandle: Integer): Integer;
function SelectKeysDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
SingleKey: Longbool; PropertyFlags, FilterFlags, WinHandle: Integer): Integer;
function SendKeyToServerDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
KeyPropFlags, WinHandle: Integer): Integer;
function GetKeyFromServerDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
KeyPropFlags, WinHandle: Integer): Integer;
function KeyImportDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
FromFile: Longbool; IgnoreKnownFlag: Integer; KeyPropFlags, WinHandle: Integer): Integer;
function KeyExportDialog(Prompt: String; const KeyIDs: TStrings; var KeyData: String; var KeyPropsList: TKeyPropsList;
ToFile, ExportCompatible, ExportPrivate: Longbool; KeyPropFlags, WinHandle: Integer): Integer;
function KeyRevokeDialog(const KeyHexID, PassPrompt: String; WinHandle: Integer): Integer;
function KeyPassChangeDialog(const KeyHexID, OldPrompt, NewPrompt: String;
MinPassLength, MinPassQuality, WinHandle: Integer): Integer;
{ "private" functions }
function SelectAddKeysToKeyRing(Context: pPGPContext; tlsContext: pPGPtlsContext;
KeysToAdd: pPGPKeySet; KeySetMain: pPGPKeySet;
var KeyPropsList: TKeyPropsList;
const Prompt: String; SingleKey: Longbool;
KeyPropFlags, WinHandle: Integer): PGPError;
function RecipientsDialog(Context: pPGPContext; AllKeys: pPGPKeySet;
AlwaysDisplayDialog: PGPBoolean; var Armor, EyesOnly, MIME, Textmode: PGPUInt32;
const DefaultKey: String; var RecipientKeys: Pointer;
const Prompt: String; WinHandle: Integer): PGPError;
function KeyServerDialog(Context: pPGPContext; tlsContext: pPGPtlsContext;
KeySetMain: pPGPKeySet; const KeyData: String;
var KeysFound: Pointer; WinHandle: Integer): PGPError;
function CollectRandomDataDialog(Context: pPGPContext; NeededEntropyBits: PGPUInt32; WinHandle: Integer): PGPError;
function ConvEncPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
const Prompt: String; WinHandle: Integer): PGPError;
function ConvDecPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
const Prompt: String; WinHandle: Integer): PGPError;
function KeyPassphraseDialog(Context: pPGPContext; KeySet: pPGPKeySet; var Passphrase: PChar;
const Prompt: String; WinHandle: Integer): PGPError;
function SigningPassphraseDialog(Context: pPGPContext; KeySetMain: pPGPKeySet;
var SigningKey: pPGPKey; var SignKeyPass: PChar;
const DefaultKeyID: String; FindMatchingKey: Longbool; SignOption: TSignOption;
var Armor, MIME, RipeMD: PGPUInt32; const Prompt: String; WinHandle: Integer): PGPError;
function DecryptionPassphraseDialog(Context: pPGPContext; RecipientKeys: pPGPKeySet;
KeyIDCount: PGPUInt32; const KeyIDList: pPGPKeyID7;
var DecryptionKey: pPGPKey; var DecryptKeyPass: PChar;
FindMatchingKey: Longbool; const Prompt: String; WinHandle: Integer): PGPError;
function ConfirmationPassphraseDialog(Context: pPGPContext; var Passphrase: PChar;
MinPassLength, MinPassQuality: Integer;
ShowPassphraseQuality: Longbool;
const Prompt: String; WinHandle: Integer): PGPError;
function KeyDlgInit(var Context: pPGPContext; var tlsContext: pPGPtlsContext; var KeySetMain: pPGPKeySet): Integer;
procedure KeyDlgFree(Context: pPGPContext; tlsContext: pPGPtlsContext; KeySetMain: pPGPKeySet);
implementation
function KeyDlgInit(var Context: pPGPContext; var tlsContext: pPGPtlsContext; var KeySetMain: pPGPKeySet): Integer;
begin
tlsContext:=nil;
Result:=KeyRings.InitKeyRings(Context, KeySetMain);
if Result<>0 then Exit;
Result:=PGPNewTLSContext(Context, tlsContext);
if Result<>0 then begin
PGPFreeContext(Context);
Context:=nil;
Exit;
end;
Result:=PGPclInitLibrary(Context, 0);
if Result<>0 then begin
PGPFreeTLSContext(tlsContext);
PGPFreeContext(Context);
tlsContext:=nil;
Context:=nil;
end;
end;
procedure KeyDlgFree(Context: pPGPContext; tlsContext: pPGPtlsContext; KeySetMain: pPGPKeySet);
begin
PGPclCloseLibrary;
PGPFreeTLSContext(tlsContext);
KeyRings.FreeKeyRings;
end;
function PreferencesDialog(PrefsPage, WinHandle: Integer): Integer;
var
Context : pPGPContext;
tlsContext : pPGPtlsContext;
KeySetMain : pPGPKeySet;
begin
Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
if Result<>0 then Exit;
try
Result:=PGPclPreferences(Context, WinHandle, PrefsPage, KeySetMain);
ProcessMessages;
finally
KeyDlgFree(Context, tlsContext, KeySetMain);
end;
end;
function SelectKeysDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
SingleKey: Longbool; PropertyFlags, FilterFlags, WinHandle: Integer): Integer;
var
Context : pPGPContext;
tlsContext : pPGPtlsContext;
KeySetMain : pPGPKeySet;
KeyFilter : pPGPFilter;
KeySetFiltered : pPGPKeySet;
KeySetSelected : pPGPKeySet;
KeyCount : PGPUInt32;
begin
KeyFilter:=nil;
KeySetFiltered:=nil;
KeySetSelected:=nil;
Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
if Result<>0 then Exit;
try
if FilterFlags<>KeyFilterFlag_AllKeys then begin
Result:=GetKeyFilter(Context, FilterFlags, KeyFilter);
if Result<>0 then Exit;
try
Result:=PGPFilterKeySet(KeySetMain, KeyFilter, KeySetFiltered);
if Result<>0 then Exit;
finally
PGPFreeFilter(KeyFilter);
end;
end
else KeySetFiltered:=KeySetMain;
try
Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetFiltered,
KeySetMain, (ord(SingleKey) and 1)*PGPCL_SINGLESELECTION, KeySetSelected);
ProcessMessages;
if Result<>0 then Exit;
finally
if KeySetFiltered<>KeySetMain then PGPFreeKeySet(KeySetFiltered);
end;
try
Result:=PGPCountKeys(KeySetSelected, KeyCount);
if Result<>0 then Exit;
if KeyCount<>0 then begin
Result:=GetKeySetProps(Context, KeySetSelected, KeyPropsList, PropertyFlags,
KeyFilterFlag_AllKeys, UserID_Ordering);
if Result>0 then Result:=0;
end;
finally
PGPFreeKeySet(KeySetSelected);
end;
finally
KeyDlgFree(Context, tlsContext, KeySetMain);
end;
end;
function InitKeyServer(Context: pPGPContext; var ServerThreadStorage: pPGPKeyServerThreadStorage;
var KeyServerSpecList: pPGPKeyServerSpec; var KeyServerCount: PGPUInt32): PGPError;
var
KeyServerEntry : pPGPKeyServerSpec;
KeyServerList : TStringList;
KeyServerIndex : Integer;
begin
ServerThreadStorage:=nil;
KeyServerSpecList:=nil;
KeyServerCount:=0;
KeyServerList:=nil;
Result:=PGPKeyServerInit;
if Result<>0 then Exit;
Result:=PGPKeyServerCreateThreadStorage(ServerThreadStorage);
if Result<>0 then Exit;
try
Result:=GetServerList(KeyServerList);
if (Result=0) and (KeyServerList<>nil) then with KeyServerList do begin
KeyServerSpecList:=AllocMem(SizeOf(TPGPKeyServerSpec)*Count);
if KeyServerSpecList<>nil then begin
KeyServerEntry:=KeyServerSpecList;
for KeyServerIndex:=0 to pred(Count) do begin
Result:=PGPNewKeyServer(Context, kPGPKeyServerClass_PGP, KeyServerEntry.Server,
PGPONetURL(Context, PChar(Strings[KeyServerIndex])), PGPOLastOption(Context));
if Result<>0 then Exit;
inc(KeyServerCount);
inc(KeyServerEntry);
end;
end
else Result:=kPGPError_OutOfMemory;
end;
finally
KeyServerList.Free;
end;
end;
procedure FreeKeyServer(ServerThreadStorage: pPGPKeyServerThreadStorage;
KeyServerSpecList: pPGPKeyServerSpec; KeyServerCount: PGPUInt32);
var
KeyServerEntry : pPGPKeyServerSpec;
begin
KeyServerEntry:=KeyServerSpecList;
try
for KeyServerCount:=KeyServerCount downto 1 do begin
PGPFreeKeyServer(KeyServerEntry.Server);
inc(KeyServerEntry);
end;
finally
if KeyServerSpecList<>nil then FreeMem(KeyServerSpecList);
PGPKeyServerDisposeThreadStorage(ServerThreadStorage);
PGPKeyServerCleanup;
end;
end;
function SendKeyToServerDialog(const Prompt: String; var KeyPropsList: TKeyPropsList;
KeyPropFlags, WinHandle: Integer): Integer;
var
Context : pPGPContext;
tlsContext : pPGPtlsContext;
KeySetMain : pPGPKeySet;
KeySetToSend : pPGPKeySet;
ThreadStorage : pPGPKeyServerThreadStorage;
KeyServerSpecs : pPGPKeyServerSpec;
KeyServerCount : PGPUInt32;
KeySetFailed : pPGPKeySet;
begin
KeySetToSend:=nil;
KeySetFailed:=nil;
Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
if Result<>0 then Exit;
try
Result:=PGPclSelectKeys(Context, tlsContext, WinHandle, PChar(Prompt), KeySetMain, KeySetMain, 0, KeySetToSend);
ProcessMessages;
if Result<>0 then Exit;
try
Result:=InitKeyServer(Context, ThreadStorage, KeyServerSpecs, KeyServerCount);
if Result<>0 then Exit;
Result:=PGPSendToKeyServerDialog(Context, KeyServerSpecs^, tlsContext, KeySetToSend, KeySetFailed,
PGPOUIParentWindowHandle(Context, WinHandle), PGPOLastOption(Context));
Sleep(100); // trying to prevent a strange cancel crash
ProcessMessages;
if (KeySetFailed<>nil) and (KeySetToSend<>nil) then PGPRemoveKeys(KeySetFailed, KeySetToSend);
GetKeySetProps(Context, KeySetToSend, KeyPropsList, KeyPropFlags, KeyFilterFlag_AllKeys, UserID_Ordering);
finally
PGPFreeKeySet(KeySetFailed);
PGPFreeKeySet(KeySetToSend);
FreeKeyServer(ThreadStorage, KeyServerSpecs, KeyServerCount);
end;
finally
KeyDlgFree(Context, tlsContext, KeySetMain);
end;
end;
function GetKeyFromServerDialog(const Prompt, KeyData: String; var KeyPropsList: TKeyPropsList;
KeyPropFlags, WinHandle: Integer): Integer;
var
Context : pPGPContext;
tlsContext : pPGPtlsContext;
KeySetMain : pPGPKeySet;
KeyFilter : pPGPFilter;
ThreadStorage : pPGPKeyServerThreadStorage;
KeyServerSpecs : pPGPKeyServerSpec;
KeyServerCount : PGPUInt32;
OptionList : pPGPOptionList;
KeysFound : Pointer;
begin
KeyFilter:=nil;
OptionList:=nil;
KeysFound:=nil;
Result:=KeyDlgInit(Context, tlsContext, KeySetMain);
if Result<>0 then Exit;
try
Result:=GetKeyFilterByAnyID(Context, KeyData, true, KeyFilter);
if Result<>0 then Exit;
try
Result:=InitKeyServer(Context, ThreadStorage, KeyServerSpecs, KeyServerCount);
if Result<>0 then Exit;
Result:=PGPBuildOptionList(Context, OptionList,
[
PGPOKeyServerSearchFilter(Context, KeyFilter),
PGPOUIParentWindowHandle(Context, WinHandle)
]);
try
Result:=PGPSearchKeyServerDialog(Context, KeyServerCount, KeyServerSpecs, tlsContext, PGPFalse,
KeysFound, OptionList, PGPOLastOption(Context));
Sleep(100); // trying to prevent a strange cancel crash
ProcessMessages;
finally
PGPFreeOptionList(OptionList);
end;
if Result<>0 then Exit;
if PGP7X then begin
try
Result:=SelectAddKeysToKeyRing(Context, tlsContext, PGPPeekKeyDBRootKeySet(pPGPKeyDB(KeysFound)),
KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);
finally
PGPFreeKeyDB(pPGPKeyDB(KeysFound));
end;
end
else begin
try
Result:=SelectAddKeysToKeyRing(Context, tlsContext, pPGPKeySet(KeysFound),
KeySetMain, KeyPropsList, Prompt, false, KeyPropFlags, WinHandle);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?