TrustedPeerManager.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Collections.Concurrent;
  2. using Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets;
  3. using PCC.App.Security;
  4. using PCC.Common.AssemblyInject.Interfaces;
  5. using PCC.Common.EventBus;
  6. namespace PCC.App.Tpm;
  7. // Handshake 1 → Public Key SHA256
  8. // Handshake 2 ← ACK for Yes or No(close connection)
  9. // *Complete Handshake
  10. // SendText 1 → Payload
  11. // SendText 2 ← ACK
  12. // ACK: SHA256(incoming payload)
  13. public abstract class TrustedPeerManager(IPeerInfoProvider peerInfoProvider, IEventBus eventBus, ILogger<TrustedPeerManager> logger) : IAssemblyInjectSyncInitStarStop
  14. {
  15. private const int NONCE_LENGTH_BYTES = 16;
  16. private const int NONCE_EXPIRE_SECOND = 60;
  17. private const int NONCE_SKEW_SECOND = 30;
  18. private readonly SocketConnectionContextFactory _connectionContextFactory = new(new(), logger);
  19. private readonly ConcurrentDictionary<string, LocalPeerManager> _localPeers = new();
  20. private TimestampNonceManager? _nonceManager;
  21. public void Init()
  22. { }
  23. public void Start()
  24. {
  25. _nonceManager = new(NONCE_LENGTH_BYTES - TimestampNonceManager.TimestampLength, TimeSpan.FromMicroseconds(NONCE_EXPIRE_SECOND), TimeSpan.FromSeconds(NONCE_SKEW_SECOND));
  26. foreach (var item in peerInfoProvider.PeerInfo)
  27. {
  28. _localPeers[item.PeerId] = new LocalPeerManager(_connectionContextFactory, _nonceManager, item, eventBus, logger);
  29. }
  30. foreach (var item in _localPeers.Values) item.Start();
  31. }
  32. public void Stop()
  33. {
  34. foreach (var item in _localPeers.Values) item.Stop();
  35. _localPeers.Clear();
  36. _nonceManager?.Dispose();
  37. }
  38. public void AddOrReplaceLocalPeer(ILocalPeerInfo localPeerInfo)
  39. {
  40. RemoveLocalPeer(localPeerInfo.PeerId);
  41. _localPeers[localPeerInfo.PeerId] = new LocalPeerManager(_connectionContextFactory, _nonceManager, localPeerInfo, eventBus, logger);
  42. }
  43. public bool AddOrReplaceRemotePeer(string localPeerId, IRemotePeerInfo remotePeerInfo)
  44. {
  45. if (!_localPeers.TryGetValue(localPeerId, out var localPeerManager)) return false;
  46. localPeerManager.AddOrReplaceRemotePeer(remotePeerInfo);
  47. return true;
  48. }
  49. public bool RemoveLocalPeer(string localPeerId)
  50. {
  51. if (_localPeers.Remove(localPeerId, out var localPeerManager) == false) return false;
  52. localPeerManager.Stop();
  53. return true;
  54. }
  55. public bool RemoveRemotePeer(string localPeerId, string remotePeerId)
  56. {
  57. return _localPeers.TryGetValue(localPeerId, out var localPeerManager) && localPeerManager.RemoveRemotePeer(remotePeerId);
  58. }
  59. public bool ConnectToPeerAsync(string localPeerId, string remotePeerId)
  60. {
  61. return _localPeers.TryGetValue(localPeerId, out var localPeerManager) && localPeerManager.ConnectToRemotePeer(remotePeerId);
  62. }
  63. public bool SendToPeer(string localPeerId, string remotePeerId, byte[] payload)
  64. {
  65. return _localPeers.TryGetValue(localPeerId, out var localPeerManager) && localPeerManager.SendToRemotePeer(remotePeerId, payload);
  66. }
  67. }