コード例 #1
0
ファイル: VirtualNode.cs プロジェクト: kazuki/p2pncs
        public VirtualNode(EvalEnvironment env, VirtualNetwork network, EvalOptionSet opt,
			IntervalInterrupter messagingInt, IntervalInterrupter kbrStabilizeInt, IntervalInterrupter anonInt, IntervalInterrupter dhtInt)
        {
            IPAddress pubAdrs = _ipGenerator.Next ();
            int bindPort;
            lock (_rnd) {
                bindPort = _rnd.Next (1024, ushort.MaxValue);
            }
            _pubEP = new IPEndPoint (pubAdrs, bindPort);
            _nodePrivateKey = ECKeyPair.Create (DefaultECDomain);
            _nodeId = Key.Create (_nodePrivateKey);
            VirtualDatagramEventSocket sock = new VirtualDatagramEventSocket (network, pubAdrs);
            sock.Bind (new IPEndPoint (IPAddress.Any, bindPort));
            _msock = opt.BypassMessagingSerializer
                ? (IMessagingSocket)new VirtualMessagingSocket (sock, true, messagingInt, DefaultMessagingRTO, DefaultMessagingRetries, DefaultMessagingRetryBufferSize, DefaultMessagingDupCheckSize)
                : (IMessagingSocket)new MessagingSocket (sock, true, SymmetricKey.NoneKey, Serializer.Instance, null, messagingInt, DefaultMessagingRTO, DefaultMessagingRetries, DefaultMessagingRetryBufferSize, DefaultMessagingDupCheckSize);
            _kbr = new SimpleIterativeRouter2 (_nodeId, 0, _msock, new SimpleRoutingAlgorithm (), Serializer.Instance, opt.NewKBRStrictMode);
            _localDHT = new OnMemoryLocalHashTable (_kbr, dhtInt);
            _dht = new SimpleDHT (_kbr, _msock, _localDHT);
            _dht.RegisterTypeID (typeof (string), 0, new LocalHashTableValueMerger<string> ());
            p2pncs.Net.Overlay.Anonymous.AnonymousRouter.DefaultRelayNodes = opt.AnonymousRouteRelays;
            p2pncs.Net.Overlay.Anonymous.AnonymousRouter.DefaultSubscribeRoutes = opt.AnonymousRouteRoutes + opt.AnonymousRouteBackupRoutes;
            p2pncs.Net.Overlay.Anonymous.AnonymousRouter.AC_DefaultUseSubscribeRoutes = opt.AnonymousRouteRoutes;
            _anonRouter = new AnonymousRouter (_dht, _nodePrivateKey, anonInt);
            _kbrStabilizeInt = kbrStabilizeInt;
            _kbrStabilizeInt.AddInterruption (_kbr.RoutingAlgorithm.Stabilize);
            _env = env;
        }
コード例 #2
0
ファイル: CaptchaContainer.cs プロジェクト: kazuki/p2pncs
 public static object Decrypt(ECKeyPair privateKey, byte[] encrypted)
 {
     using (SymmetricAlgorithm algo = new CamelliaManaged ())
     using (ECIES ecies = new ECIES (DefaultAlgorithm.ECDomainName, algo)) {
         ecies.Parameters.PrivateKey = privateKey.PrivateKey;
         try {
             return Serializer.Instance.Deserialize (ecies.Decrypt (encrypted));
         } catch {
             return null;
         }
     }
 }
コード例 #3
0
ファイル: ECIESTest.cs プロジェクト: kazuki/opencrypto.net
		public void Test_GEC2 ()
		{
			ECDomainNames domainName = ECDomainNames.secp160r1;
			ECDomainParameters domain = ECDomains.GetDomainParameter (domainName);
			ECIES ecies = new ECIES (domainName);
			Number V_Private = Number.Parse ("45FB58A92A17AD4B15101C66E74F277E2B460866", 16);
			ECKeyPair pair = new ECKeyPair (V_Private, null, domain);
			pair.CreatePublicKeyFromPrivateKey ();
			ecies.Parameters._Q = pair._Q;
			byte[] M = System.Text.Encoding.ASCII.GetBytes ("abcdefghijklmnopqrst");
			byte[] k = Number.Parse ("702232148019446860144825009548118511996283736794", 10).ToByteArray (20, false);
			byte[] C = ecies.Encrypt (M, k);
			byte[] expectedC = new byte[] {0x02, 0xCE, 0x28, 0x73, 0xE5, 0xBE, 0x44, 0x95, 0x63, 0x39, 0x1F, 0xEB, 0x47, 0xDD, 0xCB, 0xA2, 0xDC, 0x16, 0x37, 0x91, 0x91, 0x71, 0x23, 0xC8, 0x70, 0xA3, 0x1A, 0x81, 0xEA, 0x75, 0x83, 0x29, 0x0D, 0x1B, 0xA1, 0x7B, 0xC8, 0x75, 0x94, 0x35, 0xED, 0x1C, 0xCD, 0xA9, 0xEB, 0x4E, 0xD2, 0x73, 0x60, 0xBE, 0x89, 0x67, 0x29, 0xAD, 0x18, 0x54, 0x93, 0x62, 0x25, 0x91, 0xE5};
			Assert.AreEqual (expectedC, C, "Encryption");

			ecies = new ECIES (domainName);
			ecies.Parameters._d = V_Private;
			byte[] M2 = ecies.Decrypt (C);
			Assert.AreEqual (M, M2, "Decryption");
		}
コード例 #4
0
ファイル: Program.cs プロジェクト: kazuki/p2pncs
        static void LoadConfig(XmlConfig config, out ECKeyPair privateKey)
        {
            bool saveFlag = false;

            config.Define<int> (CONFIG_BIND_PORT, IntParser.Instance, new IntRangeValidator (1, ushort.MaxValue), 8080);
            config.Define<byte[]> (CONFIG_PRIVATE_KEY, BinaryParser.Instance, null, null);
            config.Define<string> (CONFIG_HOST, StringParser.Instance, null, string.Empty);

            try {
                if (File.Exists (CONFIG_PATH))
                    config.Load (CONFIG_PATH);
            } catch {
                saveFlag = true;
            }

            byte[] raw = config.GetValue<byte[]> (CONFIG_PRIVATE_KEY);
            while (true) {
                if (raw == null || raw.Length == 0) {
                    privateKey = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                    config.SetValue<byte[]> (CONFIG_PRIVATE_KEY, privateKey.PrivateKey, false);
                    saveFlag = true;
                } else {
                    privateKey = ECKeyPairExtensions.CreatePrivate (raw);
                    if (privateKey.DomainName != DefaultAlgorithm.ECDomainName) {
                        raw = null;
                        continue;
                    }
                }
                break;
            }

            if (config.GetValue<string> (CONFIG_HOST).Length == 0) {
                config.SetValue<string> (CONFIG_HOST, "localhost", false);
                saveFlag = true;
            }

            if (saveFlag)
                config.Save (CONFIG_PATH);
        }
コード例 #5
0
ファイル: Node.cs プロジェクト: kazuki/p2pncs
 public Node(Interrupters ints, IDatagramEventSocket bindedDgramSock, ITcpListener tcpListener, string db_path, ushort bindUdpPort, ushort bindTcpPort)
 {
     _udpPort = bindUdpPort;
     _tcpPort = bindTcpPort;
     _ints = ints;
     _dgramSock = bindedDgramSock;
     _tcpListener = tcpListener;
     _rtoAlgo = new RFC2988BasedRTOCalculator (TimeSpan.FromSeconds (1), TimeSpan.FromMilliseconds (100), 50, false);
     _messagingSock = new MessagingSocket (_dgramSock, true, SymmetricKey.NoneKey, p2pncs.Serializer.Instance,
         null, ints.MessagingInt, _rtoAlgo, DefaultMessagingRetry, DefaultMessagingRetryBufferSize, DefaultMessagingDuplicationCheckBufferSize);
     _kbrPrivateKey = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
     _kbr = new SimpleIterativeRouter2 (Key.Create (_kbrPrivateKey), bindTcpPort, _messagingSock, new SimpleRoutingAlgorithm (), p2pncs.Serializer.Instance, true);
     _portChecker = new PortOpenChecker (_kbr);
     _localHT = new OnMemoryLocalHashTable (_kbr, ints.DHTInt);
     IMassKeyDelivererLocalStore mkdLocalStore = _localHT as IMassKeyDelivererLocalStore;
     _dht = new SimpleDHT (_kbr, _messagingSock, _localHT);
     _anonymous = new AnonymousRouter (_dht, _kbrPrivateKey, ints.AnonymousInt);
     ints.KBRStabilizeInt.AddInterruption (Stabilize);
     _mkd = new MassKeyDeliverer (_dht, mkdLocalStore, ints.MassKeyDeliverTimerInt);
     _mmlc = new MMLC (_anonymous, _dht, mkdLocalStore, db_path, ints.StreamSocketTimeoutInt, ints.DFSRePutTimerInt);
     _crawler = new FileInfoCrawler (_tcpListener, _mmlc, _ints.CrawlingTimer);
     _statistics = new Statistics ((AnonymousRouter)_anonymous, _mmlc, _tcpListener);
 }
コード例 #6
0
ファイル: Program.cs プロジェクト: kazuki/p2pncs
 DebugNode(int idx, Interrupters ints, ITcpListener listener, IDatagramEventSocket bindedDgramSock, IPEndPoint bindTcpEp, IPEndPoint bindUdpEp, int gw_port, string dbpath)
     : base(ints, bindedDgramSock, listener, dbpath, (ushort)bindUdpEp.Port, (ushort)bindTcpEp.Port)
 {
     _idx = idx;
     _bindTcpEP = bindTcpEp;
     _imPrivateKey = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
     _imPublicKey = Key.Create (_imPrivateKey);
     _name = "Node-" + idx.ToString ("x");
     _app = new WebApp (this, ints);
     _is_gw = gw_port > 0;
     if (_is_gw) {
         _sessionMiddleware = new SessionMiddleware (MMLC.CreateDBConnection, _app);
         _server = HttpServer.CreateEmbedHttpServer (_sessionMiddleware, null, true, true, false, gw_port, 16);
     }
 }
コード例 #7
0
ファイル: AnonymousRouterTest.cs プロジェクト: kazuki/p2pncs
        public void BidirectionalCommunicationTest()
        {
            using (KBREnvironment env = new KBREnvironment (true, true)) {
                int nodes = 20;
                ECKeyPair[] nodePrivateKeys = new ECKeyPair[nodes];
                Key[] nodeKeys = new Key[nodes];
                for (int i = 0; i < nodePrivateKeys.Length; i ++) {
                    nodePrivateKeys[i] = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                    nodeKeys[i] = Key.Create (nodePrivateKeys[i]);
                }
                env.AddNodes (nodeKeys, nodePrivateKeys);

                ECKeyPair priv1 = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                ECKeyPair priv2 = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                Key id1 = Key.Create (priv1);
                Key id2 = Key.Create (priv2);
                ISubscribeInfo subscribeInfo1 = env.AnonymousRouters[0].SubscribeRecipient (id1, priv1);
                ISubscribeInfo subscribeInfo2 = env.AnonymousRouters[1].SubscribeRecipient (id2, priv2);
                while (true) {
                    if (subscribeInfo1.Status != SubscribeRouteStatus.Establishing && subscribeInfo2.Status != SubscribeRouteStatus.Establishing)
                        break;
                    Thread.Sleep (100);
                }

                byte[] received1 = null;
                object received1_lock = new object ();
                AutoResetEvent received1_done = new AutoResetEvent (false);
                byte[] received2 = null;
                object received2_lock = new object ();
                AutoResetEvent received2_done = new AutoResetEvent (false);
                AutoResetEvent accepted_done = new AutoResetEvent (false);
                IAnonymousSocket sock2 = null;
                subscribeInfo2.Accepting += delegate (object sender, AcceptingEventArgs args) {
                    string msg = args.Payload as string;
                    Assert.IsNotNull (msg);
                    Assert.AreEqual ("HELLO", msg);
                    args.Accept ("HELLO2", null);
                };
                subscribeInfo2.Accepted += delegate (object sender, AcceptedEventArgs args) {
                    lock (received2_lock) {
                        Assert.IsNull (sock2, "2.accepted.#1");
                        sock2 = args.Socket;
                        Assert.IsNotNull (sock2, "2.accepted.#2");
                        accepted_done.Set ();
                    }
                };

                IAsyncResult ar = env.AnonymousRouters[0].BeginConnect (id1, id2, AnonymousConnectionType.LowLatency, "HELLO", null, null);
                IAnonymousSocket sock1 = env.AnonymousRouters[0].EndConnect (ar);
                Assert.IsNotNull (sock1, "1.sock");
                Assert.AreEqual ("HELLO2", sock1.PayloadAtEstablishing as string);
                Assert.IsTrue (accepted_done.WaitOne (1000), "2.waiting");
                Assert.IsNotNull (sock2, "2.sock");
                Assert.AreEqual ("HELLO", sock2.PayloadAtEstablishing as string);
                sock1.Received += delegate (object sender, DatagramReceiveEventArgs args) {
                    lock (received1_lock) {
                        Assert.IsNull (received1, "1.received.#1");
                        received1 = new byte[args.Size];
                        Buffer.BlockCopy (args.Buffer, 0, received1, 0, received1.Length);
                        received1_done.Set ();
                    }
                };
                sock2.Received += delegate (object sender2, DatagramReceiveEventArgs args2) {
                    lock (received2_lock) {
                        Assert.IsNull (received2, "2.received.#1");
                        received2 = new byte[args2.Size];
                        Buffer.BlockCopy (args2.Buffer, 0, received2, 0, received2.Length);
                        received2_done.Set ();
                    }
                };
                sock1.InitializedEventHandlers ();
                sock2.InitializedEventHandlers ();

                for (int i = 0; i < 3; i ++) {
                    string msg = "HELLO " + i.ToString ();
                    sock1.SendTo (Encoding.UTF8.GetBytes (msg), AnonymousRouter.DummyEndPoint);
                    Assert.IsTrue (received2_done.WaitOne (5000), "2.received.#2");
                    Assert.IsNotNull (received2, "2.received.#3");
                    Assert.AreEqual (msg, Encoding.UTF8.GetString (received2));
                    lock (received2_lock) {
                        received2 = null;
                    }

                    msg = "OK " + i.ToString ();
                    sock2.SendTo (Encoding.UTF8.GetBytes (msg), AnonymousRouter.DummyEndPoint);
                    Assert.IsTrue (received1_done.WaitOne (5000), "1.received.#2");
                    Assert.IsNotNull (received1, "1.received.#3");
                    Assert.AreEqual (msg, Encoding.UTF8.GetString (received1));
                    lock (received1_lock) {
                        received1 = null;
                    }
                }
            }
        }
コード例 #8
0
ファイル: AnonymousRouterTest.cs プロジェクト: kazuki/p2pncs
        public void EstablishFailTest()
        {
            using (KBREnvironment env = new KBREnvironment (true, true)) {
                int nodes = 20;
                ECKeyPair[] nodePrivateKeys = new ECKeyPair[nodes];
                Key[] nodeKeys = new Key[nodes];
                for (int i = 0; i < nodePrivateKeys.Length; i ++) {
                    nodePrivateKeys[i] = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                    nodeKeys[i] = Key.Create (nodePrivateKeys[i]);
                }
                env.AddNodes (nodeKeys, nodePrivateKeys);

                ECKeyPair priv1 = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                ECKeyPair priv2 = ECKeyPair.Create (DefaultAlgorithm.ECDomainName);
                Key id1 = Key.Create (priv1);
                Key id2 = Key.Create (priv2);
                ISubscribeInfo subscribeInfo1 = env.AnonymousRouters[0].SubscribeRecipient (id1, priv1);
                ISubscribeInfo subscribeInfo2 = env.AnonymousRouters[1].SubscribeRecipient (id2, priv2);
                while (true) {
                    if (subscribeInfo1.Status != SubscribeRouteStatus.Establishing && subscribeInfo2.Status != SubscribeRouteStatus.Establishing)
                        break;
                    Thread.Sleep (100);
                }

                AutoResetEvent accepted_done = new AutoResetEvent (false);
                IAnonymousSocket sock2 = null;
                subscribeInfo2.Accepting += delegate (object sender, AcceptingEventArgs args) {
                    args.Reject ();
                };
                subscribeInfo2.Accepted += delegate (object sender, AcceptedEventArgs args) {
                    accepted_done.Set ();
                    sock2 = args.Socket;
                };

                try {
                    IAsyncResult ar = env.AnonymousRouters[0].BeginConnect (id1, id2, AnonymousConnectionType.LowLatency, null, null, null);
                    env.AnonymousRouters[0].EndConnect (ar);
                    Assert.Fail ();
                } catch (System.Net.Sockets.SocketException) {}
            }
        }
コード例 #9
0
ファイル: KBREnvironment.cs プロジェクト: kazuki/p2pncs
 public void AddNodes(Key[] keys, ECKeyPair[] keyPairs)
 {
     for (int i = 0; i < keys.Length; i++) {
         IPAddress adrs = _ipGenerator.Next ();
         IPEndPoint ep = new IPEndPoint (adrs, 10000);
         VirtualDatagramEventSocket sock = new VirtualDatagramEventSocket (_network, adrs);
         sock.Bind (new IPEndPoint (IPAddress.Loopback, ep.Port));
         //IMessagingSocket msock = new MessagingSocket (sock, true, SymmetricKey.NoneKey, Serializer.Instance, null, _interrupter, TimeSpan.FromSeconds (1), 2, 1024);
         IMessagingSocket msock = new VirtualMessagingSocket (sock, true, _interrupter, _rtoAlgo, 2, 1024, 1024);
         _sockets.Add (msock);
         IKeyBasedRouter router = new SimpleIterativeRouter2 (keys[i], 0, msock, new SimpleRoutingAlgorithm (), Serializer.Instance, true);
         _routers.Add (router);
         if (_dhts != null) {
             IDistributedHashTable dht = new SimpleDHT (router, msock, new OnMemoryLocalHashTable (router, _dhtInt));
             _dhts.Add (dht);
             if (_anons != null) {
                 IAnonymousRouter anonRouter = new AnonymousRouter (dht, keyPairs[i], _anonInt);
                 _anons.Add (anonRouter);
             }
         }
         if (_endPoints.Count != 0) {
             if (_initEPs == null || _endPoints.Count < 3)
                 _initEPs = _endPoints.ToArray ();
             router.Join (_initEPs);
         }
         _endPoints.Add (ep);
         Thread.Sleep (5);
     }
     Thread.Sleep (500);
 }
コード例 #10
0
ファイル: MergeableFileHeader.cs プロジェクト: kazuki/p2pncs
 public void Sign(ECKeyPair privateKey)
 {
     _key = Key.Create (privateKey);
     using (ECDSA ecdsa = new ECDSA (privateKey)) {
         _sign = ecdsa.SignHash (ComputeHash ());
     }
 }