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 + -
显示快捷键?