pgp2comp.pas

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

PAS
2,057
字号
    end;
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownServerErr);
  end;
end;

function TPGPKeyServer.DoGetDefaultServer: Longint;
var
  Entry		 : TStringList;
  Pref		 : pPGPPref;
  pKeyServerEntry: pPGPKeyServerEntry;
  ServerCount	 : PGPUInt32;
  FlagValue	 : PGPUInt32;
begin
  Pref:=nil;
  pKeyServerEntry:=nil;
  try
    if PGP7X then begin
      Result:=kPGPError_PrefNotFound;
      if PrefsFile<>nil then with PrefsFile do if LoadPrefs then begin
	try
	  Entry:=TStringList.Create;
	  if Entry<>nil then with Entry do begin
	    try
	      CommaText:=PrefsData.Values[KeyServers + '1'];
	      if Count>=8 then with FServerEntry do begin
		if Strings[0]<>E then ServerProtocol:=TServerType(StrToInt(Strings[0]));
		if Strings[3]<>E then ServerDNS:=Strings[3];
		if Strings[4]<>E then ServerPort:=StrToInt(Strings[4]);
		if Strings[7]<>E then begin
		  FlagValue:=StrToInt(Strings[7]);
		  if FlagValue and kKeyServerListed<>0 then Include(ServerFlags, KeyServerListed);
		  if FlagValue and kKeyServerIsRoot<>0 then Include(ServerFlags, KeyServerIsRoot);
		end;
	      end;
	    finally
	      Entry.Free;
	    end;
	    Result:=0;
	  end;
	except
	end;
	PrefsData.Clear;
      end;
    end
    else begin
      Result:=PGPclOpenClientPrefs(PGPGetDefaultMemoryMgr, Pref);
      if Result=0 then begin
	try
	  Result:=PGPGetKeyServerPrefs(Pref, pKeyServerEntry, ServerCount);
	  try
	    if Result=0 then begin
	      if ServerCount<>0 then begin
		with FServerEntry do begin
		  ServerProtocol:=TServerType(pKeyServerEntry^.Protocol);
		  ServerDNS:=pKeyServerEntry^.ServerDNS;
		  ServerPort:=pKeyServerEntry^.ServerPort;
		  if pKeyServerEntry^.Flags and kKeyServerListed<>0 then Include(ServerFlags, KeyServerListed);
		  if pKeyServerEntry^.Flags and kKeyServerIsRoot<>0 then Include(ServerFlags, KeyServerIsRoot);
		end;
		if Assigned(FOnGetDefaultServer) then FOnGetDefaultServer(FServerEntry);
	      end
	      else Result:=kPGPError_PrefNotFound;
	    end;
	  finally
	    PGPFreeData(pKeyServerEntry);
	  end;
	finally
	  PGPclCloseClientPrefs(Pref, false);
	end;
      end;
    end;
    if Result<0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownServerErr);
  end;
end;

function TPGPKeyServer.DoSetDefaultServer: Longint;
var
  Entry		 : TStringList;
  Pref		 : pPGPPref;
  pKeyServerEntry: pPGPKeyServerEntry;
  ServerCount	 : PGPUInt32;
  FlagValue	 : PGPUint32;
begin
  Pref:=nil;
  pKeyServerEntry:=nil;
  try
    if PGP7X then begin
      Result:=kPGPError_PrefNotFound;
      if PrefsFile<>nil then with PrefsFile do if LoadPrefs then begin
	try
	  Entry:=TStringList.Create;
	  if Entry<>nil then with Entry do begin
	    try
	      CommaText:=PrefsData.Values[KeyServers + '1'];
	      if Count>=8 then with FServerEntry do begin
		FlagValue:=ord(KeyServerListed in ServerFlags) * kKeyServerListed or
			   ord(KeyServerIsRoot in ServerFlags) * kKeyServerIsRoot;
		Text:=IntToStr(ord(ServerProtocol)) + CM +
		      Strings[1] + CM +
		      QU + Strings[2] + QU + CM +
		      QU + ServerDNS + QU + CM +
		      IntToStr(ServerPort) + CM +
		      QU + Strings[5] + QU + CM +
		      Strings[6] + CM +
		      IntToStr(FlagValue);
	      end;
	      PrefsData.Values[KeyServers + '1']:=TrimRight(Text);
	    finally
	      Entry.Free;
	    end;
	    if SavePrefs then Result:=0;
	  end;
	except
	end;
	PrefsData.Clear;
      end;
    end
    else begin
      Result:=PGPclOpenClientPrefs(PGPGetDefaultMemoryMgr, Pref);
      if Result=0 then begin
	try
	  Result:=PGPGetKeyServerPrefs(Pref, pKeyServerEntry, ServerCount);
	  try
	    if Result=0 then begin
	      if ServerCount<>0 then begin
		if Assigned(FOnSetDefaultServer) then FOnSetDefaultServer(FServerEntry);
		with FServerEntry do begin
		  pKeyServerEntry^.StructSize:=SizeOf(TPGPKeyServerEntry);
		  if ServerProtocol<>KeyServerType_Invalid then
		    pKeyServerEntry^.Protocol:=PGPKeyServerProtocol(ServerProtocol)
		  else begin
		    Result:=kPGPError_BadParams;
		    Exit;
		  end;
		  if ServerDNS<>EMPTY then
		    StrPLCopy(pKeyServerEntry^.ServerDNS, ServerDNS, kMaxServerNameLength)
		  else begin
		    Result:=kPGPError_BadParams;
		    Exit;
		  end;
		  pKeyServerEntry^.ServerPort:=ServerPort;
		  pKeyServerEntry^.Flags:=ord(KeyServerListed in ServerFlags) * kKeyServerListed or
					  ord(KeyServerIsRoot in ServerFlags) * kKeyServerIsRoot;
		end;
		Result:=PGPSetKeyServerPrefs(Pref, pKeyServerEntry, ServerCount);
		if Result=0 then PGPclNotifyPrefsChanges(GetCurrentProcessID);
	      end
	      else Result:=kPGPError_PrefNotFound;
	    end;
	  finally
	    PGPFreeData(pKeyServerEntry);
	  end;
	finally
	  PGPclCloseClientPrefs(Pref, true);
	end;
      end;
    end;
    if Result<0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownServerErr);
  end;
end;


// TPGPKeysGenerate ------------------------------------------------------------

constructor TPGPKeysGenerate.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if AOwner is TForm then ParentHandle:=TForm(AOwner).Handle;
end;

function TPGPKeysGenerate.DHDSSKeyGenerate: Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited DHDSSKeyGenerate;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else ShowError(FOnFailure, -1, UnknownKeyGenErr);
  end;
end;

function TPGPKeysGenerate.DHSubKeyGenerate: Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited DHSubKeyGenerate;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else ShowError(FOnFailure, -1, UnknownKeyGenErr);
  end;
end;

function TPGPKeysGenerate.DSAKeyGenerate: Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited DSAKeyGenerate;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else ShowError(FOnFailure, -1, UnknownKeyGenErr);
  end;
end;

function TPGPKeysGenerate.RSASubKeyGenerate: Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited RSASubKeyGenerate;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else ShowError(FOnFailure, -1, UnknownKeyGenErr);
  end;
end;

function TPGPKeysGenerate.RSAKeyGenerate(Legacy: Longbool): Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited RSAKeyGenerate(Legacy);
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else ShowError(FOnFailure, -1, UnknownKeyGenErr);
  end;
end;


// TPGPKeyImport ---------------------------------------------------------------

constructor TPGPKeyImport.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if AOwner is TForm then FParentHandle:=TForm(AOwner).Handle;
end;

destructor TPGPKeyImport.Destroy;
begin
  inherited Destroy;
end;

function TPGPKeyImport.DoKeyImport: Longint;
var
  KeyPropsList	: TKeyPropsList;
begin
  Result:=kPGPError_ItemNotFound;
  KeyPropsList:=nil;
  FKeyProps:=FKeyProps + KeyProps_IDComplete;
  try
    if FKeyData<>EMPTY then begin
      Result:=KeyImportDialog(FKeyDlgPrompt, FKeyData, KeyPropsList, false,
			      ord(Ignore_ByHexID in FIgnoreKnownKeys)*IgnoreFlag_ByHexID or
			      ord(Ignore_ByUserID in FIgnoreKnownKeys)*IgnoreFlag_ByUserID,
			      GetKeyPropsFlag(FKeyProps), FParentHandle);
      try
	if (Result=0) or ((Result=kPGPError_FilePermissions) and (KeyPropsList.Count>0)) then begin
	  if Assigned(FOnKeyImported) then FOnKeyImported(KeyPropsList, KeyPropsList.Count);
	end;
      finally
	KeyPropsList.Free;
      end;
    end;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownKeyImportErr);
  end;
end;

function TPGPKeyImport.DoKeyImportFile: Longint;
var
  KeyPropsList	: TKeyPropsList;
begin
  Result:=kPGPError_FileNotFound;
  KeyPropsList:=nil;
  FKeyProps:=FKeyProps + KeyProps_IDComplete;
  try
    if Assigned(FOnGetFileIn) then FOnGetFileIn(FFileIn);
    if FFileIn<>EMPTY then begin
      Result:=KeyImportDialog(FKeyDlgPrompt, FFileIn, KeyPropsList, true,
			      ord(Ignore_ByHexID in FIgnoreKnownKeys)*IgnoreFlag_ByHexID or
			      ord(Ignore_ByUserID in FIgnoreKnownKeys)*IgnoreFlag_ByUserID,
			      GetKeyPropsFlag(FKeyProps), FParentHandle);
      try
	if (Result=0) or ((Result=kPGPError_FilePermissions) and (KeyPropsList.Count>0)) then begin
	  if Assigned(FOnKeyImported) then FOnKeyImported(KeyPropsList, KeyPropsList.Count);
	end;
      finally
	KeyPropsList.Free;
      end;
    end;
    if Result<>0 then ShowError(FOnFailure, Result, EMPTY);
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownKeyImportErr);
  end;
end;


// TPGPKeyExport ---------------------------------------------------------------

constructor TPGPKeyExport.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FExportCompatible:=true;
  FKeyIDs:=TStringList.Create;
  if AOwner is TForm then FParentHandle:=TForm(AOwner).Handle;
end;

destructor TPGPKeyExport.Destroy;
begin
  FKeyIDs.Free;
  inherited Destroy;
end;

procedure TPGPKeyExport.SetKeyIDs(const Value: TStrings);
begin
  FKeyIDs.Assign(Value);
end;

function TPGPKeyExport.DoKeyExport: Longint;
var
  KeyPropsList	: TKeyPropsList;
begin
  Result:=kPGPError_ItemNotFound;
  FKeyData:=EMPTY;
  KeyPropsList:=nil;
  FKeyProps:=FKeyProps + KeyProps_IDComplete;
  try
    if (FKeyIDs<>nil) or (FKeyDlgPrompt<>EMPTY) then begin
      Result:=KeyExportDialog(FKeyDlgPrompt, FKeyIDs, FKeyData,
			      KeyPropsList, false,
			      FExportCompatible, FExportPrivate,
			      GetKeyPropsFlag(FKeyProps), FParentHandle);
    end;
    try
      if Result=0 then begin
	if Assigned(FOnKeyExported) then FOnKeyExported(KeyPropsList, FKeyData, EMPTY);
      end
      else ShowError(FOnFailure, Result, EMPTY);
    finally
      KeyPropsList.Free;
    end;
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownKeyExportErr);
  end;
end;

function TPGPKeyExport.DoKeyExportFile: Longint;
var
  KeyPropsList	: TKeyPropsList;
begin
  Result:=kPGPError_FileNotFound;
  FKeyData:=EMPTY;
  KeyPropsList:=nil;
  FKeyProps:=FKeyProps + KeyProps_IDComplete;
  try
    if Assigned(FOnGetFileOut) then FOnGetFileOut(FFileOut);
    if FFileOut<>EMPTY then begin
      Result:=kPGPError_ItemNotFound;
      if (FKeyIDs<>nil) or (FKeyDlgPrompt<>EMPTY) then begin
	Result:=KeyExportDialog(FKeyDlgPrompt, FKeyIDs, FFileOut,
				KeyPropsList, true,
				FExportCompatible, FExportPrivate,
				GetKeyPropsFlag(FKeyProps), FParentHandle);
      end;
      try
	if Result=0 then begin
	  if Assigned(FOnKeyExported) then FOnKeyExported(KeyPropsList, EMPTY, FFileOut);
	end
	else ShowError(FOnFailure, Result, EMPTY);
      finally
	KeyPropsList.Free;
      end;
    end;
  except
    on EFailException do Raise;
    else Result:=ShowError(FOnFailure, -1, UnknownKeyExportErr);
  end;
end;


// TPGPEncode ------------------------------------------------------------------

constructor TPGPEncode.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if AOwner is TForm then ParentHandle:=TForm(AOwner).Handle;
end;

function TPGPEncode.KeyEncryptBuffer(const DataBuffer: String; Sign: Longbool): Longint;
begin
  Result:=kPGPError_UnknownError;
  try
    Result:=inherited KeyEncryptBuffer(DataBuffer, Sign);
    if Result=0 then begin
      if Assigned(FOnEncoded) then FOnEncoded(Outp

⌨️ 快捷键说明

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