Compare commits

...

5015 Commits

Author SHA1 Message Date
f22eaa6db5 2.38.0 2021-05-16 14:26:00 -04:00
e37244fa0d remove deprecated options from config file example
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-05-15 16:35:38 +03:00
c359c6e634 update config file example, add v6 status to windows daemon window, code cleanup
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-05-15 16:31:53 +03:00
d299cbaabd Add/Remove subsession 2021-05-13 19:30:54 -04:00
2b22bfadbc show version in hidden content 2021-05-12 11:48:27 -04:00
baec22610e always set expiration time for NSR tagset 2021-05-12 07:57:37 -04:00
43b587636b delete tags of termiated session right away 2021-05-11 18:49:17 -04:00
c6cdb26f47 reduce range for extra tags 2021-05-10 20:20:25 -04:00
1285e30b3e more pre-calculated x25519 2021-05-10 18:55:39 -04:00
a8e1cd9a13 don't throw exception if local bind fails 2021-05-10 11:04:08 -04:00
d6f5640685 attach updated LeaseSet to ECIESx25519 incoming sessions 2021-05-09 07:33:26 -04:00
79dbf2a43e request encrypted LeaseSet if expired 2021-05-07 22:15:12 -04:00
5ad4c2a65e run ipv6 peer test again if still testing 2021-05-04 14:59:25 -04:00
fffa550bb0 SAM subsessions 2021-05-04 14:27:06 -04:00
0b9cb4e75b check identity and signature length for SessionConfirmed 2021-05-03 19:05:25 -04:00
7f143a7f23 support EdDSA for blinding 2021-05-02 15:02:52 -04:00
d8d8a68814 rekey all routers but floodfills 2021-04-30 15:19:31 -04:00
4018cf9d76 SAM single and master sessions 2021-04-26 21:11:36 -04:00
bd33ac202f handle hostname for STREAM CREATE 2021-04-26 18:21:00 -04:00
e091eba831 don't cleanup ipv6 introducers list twice 2021-04-25 17:55:13 -04:00
4a0dbec4fb recognize non-published NTCP2 address 2021-04-25 16:42:09 -04:00
90dee900f0 fixed crash 2021-04-25 10:57:31 -04:00
94555b9c43 don't select next introducers from existing sessions 2021-04-24 14:56:34 -04:00
db93a7315f find new introducers to connect 2021-04-24 11:11:12 -04:00
7a19533380 reuse current introducers if no more available 2021-04-23 12:17:48 -04:00
9d79b26506 check if port if specified 2021-04-22 19:32:47 -04:00
b43a9cc80d handle master session creation 2021-04-21 19:30:20 -04:00
b5618af308 find all introducers at the time 2021-04-21 15:41:04 -04:00
9c8c3b9174 select few introducers at the time 2021-04-21 10:56:39 -04:00
01e591b261 find ipv6 intrioducer session 2021-04-21 09:55:36 -04:00
060e30d283 select ipv6 random introducer 2021-04-21 08:16:13 -04:00
ad019da553 publish ipv6 introducers 2021-04-20 20:02:30 -04:00
69afd3a1da Merge pull request #1651 from acetoneRu/openssl
Уточнение про логирование в Windows
2021-04-19 07:29:33 -04:00
7978adc577 Уточнение про логирование в Windows 2021-04-19 06:43:51 -04:00
ca77ca6ef0 reseed from compatible address 2021-04-18 17:27:50 -04:00
d5b61ed544 select different routers for peer test 2021-04-17 14:33:53 -04:00
5edb256990 check if our external IP is valid 2021-04-16 19:31:49 -04:00
74d0c04314 ipv6 address for relay reponse and relay intro 2021-04-15 16:06:02 -04:00
39d4464be0 make sure that introducer or peer test router is reachable by SSU 2021-04-15 11:43:43 -04:00
be48dc6e87 pick correct local address for intro key 2021-04-13 15:11:37 -04:00
2783337284 require ipv4 for IBGW 2021-04-13 09:16:52 -04:00
727743979c Merge pull request #1648 from acetoneRu/openssl
SAM section fixed
2021-04-13 07:33:07 -04:00
4543e14c57 SAM section fixed 2021-04-13 02:43:42 -04:00
83fc1b0b8e support b32 and b33 addresses in STREAM CONNECT 2021-04-11 17:26:45 -04:00
df858d9143 publish iexp 2021-04-09 13:29:07 -04:00
ac47c9c673 don't check U cap 2021-04-09 10:56:46 -04:00
b9a2d5df02 send HolePunch back based on actual address type 2021-04-08 21:07:14 -04:00
3e873f88c9 don't drop introducers without iExp 2021-04-07 15:55:38 -04:00
277cef5ec4 eliminate cost field 2021-04-07 13:05:38 -04:00
5c9b478e46 published field for SSU addresses 2021-04-05 21:45:48 -04:00
ff89edf127 pick random introducer 2021-04-05 18:22:48 -04:00
2cc9791bf2 exclude already expired introducers 2021-04-04 10:36:22 -04:00
67b32005f6 check if host if unspecified 2021-04-03 22:18:09 -04:00
0f166973ca check ureachable cap and actual introducers separately 2021-04-03 20:03:19 -04:00
4f3333c841 don't check range ffor unspecified address 2021-04-03 19:24:07 -04:00
bea384abea recongnize v4 and v6 SSU addresses without host 2021-04-03 18:56:50 -04:00
43033695f6 select apropriate address for peer test 2021-04-02 21:31:14 -04:00
51ef7ef61c don't publish LeaseSet without tunnels 2021-04-01 13:37:21 -04:00
823b499a02 remove already expired LeaseSets 2021-04-01 11:45:50 -04:00
bb5ed0b40c assign correct 6 or 4 cap to unpublished address 2021-04-01 11:02:29 -04:00
94ca2514af set zero expiration timeout if no tunnels 2021-04-01 10:29:03 -04:00
5412352dec publish ipv6 introducers for ipv6 addresses 2021-03-31 13:42:57 -04:00
c94e8c7df4 Merge pull request #1646 from acetoneRu/openssl
reg.i2p to subscriptions
2021-03-31 12:28:59 -04:00
094541caa6 reg.i2p to subscriptions 2021-03-31 12:16:06 -04:00
8c59977e34 Merge pull request #1645 from acetoneRu/openssl
Configuration file example updated
2021-03-31 12:13:17 -04:00
881bca6ae3 Depricated "nat" deleted 2021-03-31 12:09:06 -04:00
22865f8ee4 reseed.yggurl and persist.addressbook added 2021-03-31 12:05:23 -04:00
f3b728d828 Yggdrasil configuration added
[meshnets] section
2021-03-31 08:45:56 -04:00
bd7328345f Don't change Yddrasil address if router becomes unreachable through ipv6 2021-03-30 19:27:40 -04:00
25eae3c116 return relay tag for ipv6 introducer 2021-03-30 11:31:11 -04:00
5cca5472e6 don't handle unsilicited HolePunch 2021-03-29 15:50:33 -04:00
8462d382f4 don't create SSU session for HolePunch 2021-03-29 15:16:39 -04:00
2b0d18a6d7 don't change router status from ipv6 2021-03-29 14:44:50 -04:00
edf3b7e2fc set X bandiwth for floodfill by default 2021-03-28 13:13:00 -04:00
167d3a0e3c don't create BN_CTX for ECIES tunnel build record decryption 2021-03-28 12:14:02 -04:00
86415bc61f publish introducer cap for ipv6 address 2021-03-27 18:49:35 -04:00
a6ea37a21e set ipv6 address caps depending on peer test 2021-03-27 15:16:56 -04:00
3695aa924b doesn't send peer test to a reserved address 2021-03-24 10:32:15 -04:00
9e050d1a23 peer test for ipv6 2021-03-23 15:36:57 -04:00
34eee2fc26 fixed #1644. check leaseset buffer size 2021-03-22 20:12:58 -04:00
ac10f3055d pick correct local SSU address for sending peer test 2021-03-19 21:51:45 -04:00
991b74f036 bind ipv6 or yggdrasil acceptor to specified address 2021-03-19 13:10:24 -04:00
589049ef0f connect to ipv6 address through introducer 2021-03-19 10:20:02 -04:00
6b0c7c2313 handle ipv6 address in RelayResponse 2021-03-18 21:29:39 -04:00
a9c7d0d598 common ExtractIPAddressAndPort 2021-03-18 20:11:24 -04:00
ef1dfb153c handle ipv6 address for RelayIntro 2021-03-18 18:37:02 -04:00
ff9ee5873f post LeaseSet creation to I2CP destnation's thread 2021-03-17 15:10:14 -04:00
a7b56bbbb7 publish Yggdrasil address when enabled 2021-03-17 11:26:52 -04:00
820a365474 select random peer for first hop for outbound tunnel if number of connections < 100 2021-03-16 18:45:51 -04:00
1d5d06f731 find actual router for peer 2021-03-16 15:23:00 -04:00
43d458cf72 publish and upublish NTCP2 and yggdrasil addresses separatly 2021-03-16 13:08:10 -04:00
436a3e7f54 2.37.0 2021-03-15 09:00:25 -04:00
7015bad905 2.37.0 2021-03-15 08:30:04 -04:00
cf8665748b network sattus Mesh added 2021-03-13 10:28:03 -05:00
1b8da90cbb more precise compatibility check 2021-03-12 20:51:12 -05:00
6012585067 eliminate false positive symmetric NAT 2021-03-12 17:41:41 -05:00
f162876600 insert ipv4 address if enabled back 2021-03-12 16:13:01 -05:00
6555ae5b0a support authorization for reseed proxy 2021-03-11 17:02:56 -05:00
f5af059ef4 [webconsole] add submission of address registration line to reg.i2p
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-03-11 15:20:40 +03:00
cb8651ec68 [win32] drop service code, fix start with daemon option. Throw notification when unable to parse config
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-03-11 14:40:06 +03:00
7c0b0a4e3e common HTTP basic authorization string 2021-03-10 22:47:31 -05:00
880d1a7ccd NTCP2 proxy with authorization 2021-03-10 20:00:21 -05:00
744b25190a don't set proxy if ntcp2 is disabled 2021-03-10 15:36:10 -05:00
3792bb4928 delete sig buffer 2021-03-09 22:10:51 -05:00
9049902ced [webconsole] add address registration line generator
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-03-10 01:48:54 +03:00
5f93dc72fd convert ifname* params to address* 2021-03-09 15:28:07 -05:00
09dadd7e01 Merge pull request #1640 from brain5lug/openssl
logging opimization
2021-03-09 07:46:28 -05:00
60b92f98db OBEP must be ipv4 compatible 2021-03-08 18:54:17 -05:00
97f315d488 set correct 4 and 6 caps for unreachable addresses 2021-03-08 15:57:05 -05:00
f3676d7f18 logging opimization 2021-03-08 11:31:00 +03:00
742dbdb68a rekey low badwidth routers to ECIES 2021-03-07 10:07:51 -05:00
2d59c968ca don't publish NTCP2 address connected through proxy 2021-03-06 18:43:50 -05:00
ad22247c9e start other acceptors if connected through a proxy 2021-03-06 15:35:31 -05:00
f38920c338 Status: Proxy 2021-03-06 08:50:47 -05:00
8f90b21a5d fixed typo 2021-03-05 22:40:27 -05:00
ff0e6813c6 fixed typo 2021-03-05 21:53:19 -05:00
fa5e4d57fd correct caps for SSU address without host 2021-03-05 19:40:37 -05:00
876973f071 remove coreVersion 2021-03-05 09:29:28 -05:00
b994af9209 check reachability of floodfill to request from 2021-03-05 08:41:44 -05:00
1f6cde652e check caps for SSU address 2021-03-04 22:47:56 -05:00
3bf6db1c08 enable yggdrasil address finding for android
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-03-05 03:20:12 +03:00
e70ffc9d7c re-shedule introducers updates if router becomes firewalled 2021-03-04 15:55:51 -05:00
065cfe3b9d separate ratchet session for ECIES router 2021-03-03 15:30:13 -05:00
def9873a70 request multiple introducers at the time 2021-03-02 21:10:19 -05:00
618aa26454 allow some unreachable floodfills 2021-03-02 14:13:28 -05:00
924a7bc533 use connected peers if others not available 2021-03-02 12:29:51 -05:00
ef85277a1b select reachable routers for one hop tunnels 2021-03-02 08:46:13 -05:00
876375f2c3 precise bandwidth limit 2021-03-01 22:13:17 -05:00
f70ee480ba check connectivity between peers for tunnel 2021-03-01 19:02:27 -05:00
6d88c3ab05 Symmetric NAT error 2021-03-01 12:20:53 -05:00
57c969b0ed constants for cost 2021-03-01 11:09:25 -05:00
ae58a7007b different cost for direct or with introducers SSU address 2021-02-28 19:19:09 -05:00
11c924bbe7 publish and handle SSU addreses without host 2021-02-28 18:58:25 -05:00
8bab4f60ef open socket before bing 2021-02-28 09:04:34 -05:00
bef9a54f4a bind SSU socket to specified address 2021-02-27 16:13:12 -05:00
288b19c3f7 bind NTCP2 ipv4 acceptor to specified local address 2021-02-27 10:35:50 -05:00
40f7e9d33e separate decryptor for tunnel builds and floodfill requests 2021-02-26 21:02:51 -05:00
fab53dda66 fixed typo 2021-02-26 20:38:16 -05:00
a4e8bf9857 bind NTCP2 connections to specified address 2021-02-26 19:31:38 -05:00
2cdf84cdab [actions] upload windows artifacts 2021-02-26 21:09:01 +00:00
fbe83f729d don't try to send to unreachable router 2021-02-25 19:55:46 -05:00
4371a084ec check for pubkey in X25519Keys::Agree
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-26 03:20:06 +03:00
d13f58088a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2021-02-24 18:41:31 -05:00
f75bef7c03 don't set local address if not specified 2021-02-24 18:40:24 -05:00
3d7e93a688 systemd: use SIGTERM instead SIGQUIT, indent UPNP code, make client target
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-25 00:37:41 +03:00
a4dda304d2 cancel connect timer upon SessionConfirmed 2021-02-24 10:03:23 -05:00
124c3ef2d7 always publish SSU port 2021-02-23 21:15:17 -05:00
c3a2fca76a 4 or 6 caps for non-published addresses 2021-02-23 19:59:35 -05:00
b60ebfe1c6 parse '4' and '6' address caps 2021-02-22 22:53:25 -05:00
1d7639b3f4 caps per address 2021-02-22 21:04:26 -05:00
2d972752ff lookuplocal 2021-02-21 16:20:57 -05:00
616f0b2a21 address parameter for server tunnels 2021-02-19 15:15:58 -05:00
94659ba890 create ipv4 and ipv6 NTCP2 addresses separately 2021-02-17 21:51:35 -05:00
d65bc068de create ipv4 and ipv6 NTCP2 addresses separately 2021-02-17 21:12:17 -05:00
1ca0354cf2 find NTCP2 address by static key. Don't make router unreachable if can't connect by NTCP2 2021-02-17 18:46:41 -05:00
b1fcd4d27b show actual IP addresses for proxy connections 2021-02-17 14:26:48 -05:00
74aa07eba8 [actions] update freebsd action 2021-02-15 16:21:30 +03:00
d1a98212ee 2.36.0 2021-02-15 07:57:17 -05:00
75a31c79ae don't process SSU messages after termination 2021-02-13 18:36:23 -05:00
da0b36cb91 enable miniupnpc support by default in debian/ubuntu
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-12 15:06:29 +00:00
aa206d034d fixed #1373. Limit number of tunnels by 16 2021-02-11 18:32:03 -05:00
765ab60753 try to reseed if no compatible routers in netdb 2021-02-10 15:27:13 -05:00
44e4ec573d enable NTCP2 transport for newly created routers 2021-02-10 14:59:08 -05:00
0ed793d6d0 [readme] add links to new android and qt repos
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-10 18:09:51 +03:00
272e25ff07 [actions] remove qt build
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-10 17:59:15 +03:00
63127ab181 add yggdrasil address search for windows
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-10 17:58:14 +03:00
004f3532a0 move android binary build files to contrib
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-10 17:57:31 +03:00
abe1af7b4f moved qt and android sources inn separate repositories
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-10 17:00:35 +03:00
01df1647bc [httpproxy] add viewport and update styles on error
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-09 08:32:35 +03:00
9d8eaf0ccb [win32] dont create notification when taskbar (explorer) restarted
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-08 19:41:46 +03:00
7e4c33d27e resend RouterInfo after some interval 2021-02-07 10:39:26 -05:00
c164601acf reseed from clearnet only if ipv4 or ipv6 is enabled 2021-02-06 21:25:16 -05:00
3b32da4f5c don't disable NTCP2 address if Yggdrasil address is presented 2021-02-06 19:07:39 -05:00
1bc3de8df4 add Yggdrasil address without NTCP2 2021-02-06 18:23:50 -05:00
374e0cbbc3 enable NTCP2 server for Yggdrasil 2021-02-06 18:11:34 -05:00
313921da56 publish and request through exploratory tunnel if floodfill is not reachable 2021-02-06 14:49:42 -05:00
2d0e219197 add Yggdrasil adddress even if NTCP2 is not published. Correct reachable capacity 2021-02-05 17:24:11 -05:00
dc64d1738a try both ipv4 and ipv6 SSU addresses if presented 2021-02-04 21:48:13 -05:00
89e8d99294 check availability of particular address 2021-02-03 20:09:43 -05:00
66a238045f Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2021-02-03 14:25:14 -05:00
33b82b5669 check transport compatibility with peer before connecting 2021-02-03 14:24:43 -05:00
f59d509b15 fix rebase result build issue
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-03 15:12:27 +03:00
6966539b86 reindent Datagram, Daemon, update default subscription in config example
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-02-03 14:57:43 +03:00
0e5dc15005 create Yggdrasil address for new router 2021-02-02 21:39:16 -05:00
a74f685a5d check local address 2021-02-02 19:29:13 -05:00
05c7aacfa5 check for NTCP for yggdrasil address 2021-02-01 22:24:51 -05:00
ace80c29e7 meshnets.yggaddress added 2021-02-01 18:00:03 -05:00
bfb1380dd2 don't update Yggdrasil address from SSU 2021-02-01 13:18:48 -05:00
ea19802d3f update right ipv6 only 2021-02-01 12:47:41 -05:00
fef4f13b8f don't insert Yggdrasil address twice 2021-01-31 19:09:38 -05:00
c4fc0f4ecf add Yggdrasil address 2021-01-31 18:30:53 -05:00
ba3acdac75 NTCP2 transports through the Yggdrasil 2021-01-31 17:50:10 -05:00
aad2d68edb NTCP2 transports through the Yggdrasil 2021-01-31 17:25:07 -05:00
9e5935aea5 NTCP2Mesh added 2021-01-30 18:32:17 -05:00
129b4a2135 don't support NTCP1 address in RouterInfo 2021-01-30 16:50:53 -05:00
82649ab2a7 IsYggdrasilAddress added 2021-01-29 13:27:49 -05:00
1ba5d25819 correct detection of chunked response 2021-01-29 12:12:40 -05:00
daa3f8699b don't detect Yggdrasil for android 2021-01-29 09:32:33 -05:00
df7fda9e0c support ratchets for shared local destination 2021-01-29 07:46:20 -05:00
484f69f16b try to select reachable router of inbound tunnel gateway 2021-01-28 13:33:12 -05:00
7c8280934a update addressbook subscriptions
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-01-27 06:48:35 +03:00
85902b358a remove [] from yggdrasil reseed address 2021-01-26 13:43:20 -05:00
5931cb59ab fix thread setname on NetBSD
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-01-26 18:54:41 +03:00
fd73aab7d0 acetone's certificate 2021-01-25 19:53:00 -05:00
d13fbe5549 support reseed throught the Yggdrasil 2021-01-25 19:48:33 -05:00
ed4c00e4f4 check yggdrasil ipv6 range 2021-01-24 21:21:35 -05:00
07282ec39f get local yggdrasil ipv6 address 2021-01-24 19:42:44 -05:00
2d998aba43 fixed typo 2021-01-24 15:44:54 -05:00
2e0019c8c8 check if NTCP2 address is valid before connection attempt 2021-01-24 11:34:11 -05:00
96e9608036 Merge pull request #1623 from rex4539/fix-warnings2
Fix clang warning
2021-01-24 11:23:12 -05:00
9d5bb1b2b6 drop routing path for LeaseSet resend 2021-01-23 21:25:52 -05:00
67dab9b6d2 Fix clang warning 2021-01-21 11:07:01 +02:00
6fc5f88a3b dump addressbook in hosts.txt format 2021-01-20 19:19:34 -05:00
e0cec79ad6 try both ipv4 and ipv6 NTCP2 addresses if presented 2021-01-18 18:58:16 -05:00
1a9e11d86d don't send updated LeaseSet through a terminated session 2021-01-18 12:58:27 -05:00
1235d18d67 pass address to NTCP2 session 2021-01-17 17:15:41 -05:00
8f25b66760 limit tunnel length to 8 hops 2021-01-14 11:24:03 -05:00
2bc0850b0f [android] add refresh on swipe in webconsole
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2021-01-13 21:07:13 +03:00
29176dd9bf count last send time for expiration 2021-01-09 18:59:09 -05:00
aedcd1bcc0 remove tag after tagset expiration 2021-01-07 14:51:23 -05:00
b1262d54de don't detach ECIESx25519 session from destination 2021-01-05 15:56:48 -05:00
bc4a97774f strong pointer to session for receive tagset 2021-01-04 20:15:48 -05:00
ee3cd44f97 ReceiveRatchetTagSet 2021-01-04 18:20:16 -05:00
726bd0d63b check if x25519 key is valid 2021-01-01 15:03:11 -05:00
ce9640773c Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-12-27 11:19:46 -05:00
7ce92118e4 handle follow-on NSR messages 2020-12-27 11:18:53 -05:00
e12c5fe007 Merge pull request #1601 from gxcreator/openssl
Docker: Move DEFAULT_ARGS to Dockerfile .
2020-12-27 14:51:58 +03:00
86ff0d86db check if new tag was created 2020-12-26 17:18:29 -05:00
b4236b04c6 leaset creation timeout 2020-12-25 09:01:55 -05:00
d34dc397e8 changed to 320 tags max 2020-12-24 14:06:34 -05:00
f2e4d5f06c trim behind not affter max generated tags 2020-12-20 19:52:06 -05:00
da7e2f2580 don't send message through non-established session 2020-12-19 15:07:12 -05:00
e07a20a771 Merge pull request #1608 from nonlinear-chaos-order-etc-etal/openssl-custom
qt: log level ui control now synced with core and log pane ui at runtime
2020-12-19 08:45:00 -05:00
ae1b1da342 qt: log level ui control now synced with core and log pane ui at runtime 2020-12-19 21:16:40 +08:00
a61d7fe115 set correct NAME for NAMING REPLY 2020-12-18 20:48:08 -05:00
b4d1e89696 Merge pull request #1606 from nonlinear-chaos-order-etc-etal/openssl-custom
fixes many i2pd_qt issues
2020-12-17 22:02:06 -05:00
a0d90717c3 qt: i2cp server page is now shown, work towards #914 2020-12-18 10:06:57 +08:00
5c2f1f36e8 qt: sam session is now shown at qt->sam sessions, work towards #914 2020-12-18 09:40:58 +08:00
0b084956e6 qt: stream.kill hrefs done - step to completion of #914 2020-12-18 09:04:40 +08:00
8c61e7d227 replace LeaseSet completely if store type changes 2020-12-17 18:58:30 -05:00
d7342586a6 qt: fixes #1593 2020-12-18 07:44:37 +08:00
242e3d007c qt: fixes #1529 2020-12-18 07:17:01 +08:00
d4b6485102 qt: small improv 2020-12-18 06:57:49 +08:00
370ab6307a qt: fixes #1581 2020-12-18 06:34:22 +08:00
83b10fba62 qt: added assert.h - it is needed for ci circumstances 2020-12-18 05:45:11 +08:00
1921bce4c7 Merge remote-tracking branch 'upstream/openssl' into openssl-custom 2020-12-18 05:37:17 +08:00
669fb62a54 qt: fixed great ui pains with tunnels editing 2020-12-18 05:37:01 +08:00
1a5920ee47 Merge pull request #1605 from nonlinear-chaos-order-etc-etal/openssl-custom
qt: visual fixes + fix for #1582
2020-12-17 15:10:57 -05:00
9c6e3ff1d7 qt: fixes #1582 2020-12-18 03:39:08 +08:00
ca78601ada qt: visual fixes 2020-12-18 02:00:57 +08:00
2edce12759 Merge pull request #1604 from nonlinear-chaos-order-etc-etal/openssl-custom
qt: fixes #1180
2020-12-17 12:42:43 -05:00
ccc604c0f4 qt: fixes #1180 2020-12-18 01:13:50 +08:00
d3bf8c2417 data: ignored *.tmp.xml 2020-12-17 23:15:56 +08:00
dc774f0f94 Merge remote-tracking branch 'upstream/openssl' into openssl-custom 2020-12-17 22:58:35 +08:00
f2059947bf Merge pull request #1603 from nonlinear-chaos-order-etc-etal/openssl-custom
qt: added about box
2020-12-17 09:55:37 -05:00
eccd5b6ff0 qt: removed a few debug log lines 2020-12-17 22:45:10 +08:00
776dc7ec52 qt: about box fixed for older qt5 2020-12-17 22:30:14 +08:00
082c4f1104 qt: added about box 2020-12-17 22:17:05 +08:00
06a7e181cd ECIES for new routers 2020-12-15 16:06:32 -05:00
bf91e16b5d gererate specified number of tags if misssing tag 2020-12-15 15:04:20 -05:00
65945b3462 correct offline signature size for close packet 2020-12-13 21:55:51 -05:00
31f0c35077 Docker: Move DEFAULT_ARGS to Dockerfile . 2020-12-13 17:31:53 +00:00
fc2dc9a019 cumulative ACK bitfields 2020-12-12 21:40:07 -05:00
04645aacc4 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-12-12 17:15:34 -05:00
c91a8711e3 encrypted requests to ECIES floodfills 2020-12-12 17:14:58 -05:00
7373dae026 [avx] check if c++ target supports AVX (closes #1600)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-12 09:54:07 +03:00
ca3b819151 [avx] check ig c++ target supports AVX
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-10 18:32:41 +03:00
ba79b94e06 try to generate missing ECIESx25519 tag in last tagset 2020-12-08 15:16:40 -05:00
bfc3acb834 use correct function for thread naming on OpenBSD
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-07 19:47:50 +03:00
ac67cd7f9a add FreeBSD builder for GHA (#1595) 2020-12-07 08:36:06 +03:00
9a2c6a7619 move thread naming to util
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-07 06:31:46 +03:00
3100d4f902 move thread naming to util
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-07 06:22:30 +03:00
aace200899 don't create paired zero hops tunnel 2020-12-05 08:26:21 -05:00
a843165cb4 try ratchets tag first 2020-12-04 19:15:06 -05:00
36473e3889 add naming to threads
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-04 18:37:17 +03:00
e2fcab34b7 deccrypt and handle garlic message for ECIES router 2020-12-03 22:01:58 -05:00
abdf92c084 encrypt message for ECIES router 2020-12-03 19:43:43 -05:00
32fc6482cc moved Noise initializations to Crypto.cpp 2020-12-03 17:58:37 -05:00
ce14ea6fe5 [windows] add file version to installer
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-12-03 09:35:43 +03:00
2f57013e02 [qt] update project file
Some build systems didn't create required folders for object files, so create them manually with additional call of `mk_obj_dir` target.
2020-12-01 05:07:41 +03:00
ad84944d20 [make] change AES support check 2020-12-01 03:55:41 +03:00
0ab95b1b87 2.35.0 2020-11-30 12:50:15 -05:00
58153c3579 [webconsole] fix content block width
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-11-30 04:10:13 +03:00
746f53ba07 use SendBufferQueue for queued messages from I2P 2020-11-29 14:59:34 -05:00
ff971563db cleanup queue after buffers deletion 2020-11-28 22:25:06 -05:00
242fb7db14 terminate I2CP session if destroyed explicitly 2020-11-28 10:09:38 -05:00
ad36738f57 detach session from destination upon termination 2020-11-27 13:37:03 -05:00
c833b16544 check if session expired before generating more tags 2020-11-26 09:15:45 -05:00
1c5b350c2b TCP_QUICKACK 2020-11-23 18:55:48 -05:00
9301e39af7 minimal version for floodfill 0.9.28 2020-11-23 12:49:18 -05:00
86e3b977e4 check I2CP message size 2020-11-22 21:41:27 -05:00
bc330ff0ea update makefiles, license year
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-11-23 01:46:08 +03:00
771480e368 send queue for incoming I2CP messages 2020-11-22 17:36:00 -05:00
c875ff923a random intro key 2020-11-21 18:44:40 -05:00
3dfb44de31 exclude DSA floodfills 2020-11-21 14:27:08 -05:00
2266c3877c update reseeds
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-11-21 19:45:06 +03:00
f4486bc075 take intro key from right address 2020-11-20 21:48:33 -05:00
0436a65baa upddate DSA router keys 2020-11-20 20:31:50 -05:00
30d6bd144b don't replace an adddress by one with DSA signature 2020-11-19 15:41:00 -05:00
d8381e9486 disable encryption to ECIES routers 2020-11-18 18:11:29 -05:00
feaecbe177 own local destination for each 'transient' 2020-11-18 15:02:06 -05:00
85d796f906 [actions] obj directories before make on windows 2020-11-17 21:39:46 +03:00
0a3af12ee9 [make] track changes in includes
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-11-17 17:59:40 +03:00
3925540517 don't update expired tunnels 2020-11-16 12:56:22 -05:00
3b630fe546 fixed race condition 2020-11-16 10:04:38 -05:00
c69c4ae8a0 don't publish too fast 2020-11-15 21:46:49 -05:00
b4369470cb publish updated RouterInfo 2020-11-15 20:05:27 -05:00
4a44b18b97 fixed typo 2020-11-15 19:56:16 -05:00
2bd6daeb8d disable aes/avx for winxp by default 2020-11-16 03:43:54 +03:00
1ae98b7fe1 [webconsole] graceful timer for windows 2020-11-16 03:43:54 +03:00
44ca315c75 don't build tunnels for all pools at the time 2020-11-15 19:38:34 -05:00
af20b13c7a create paired inbound tunnels if no inbound tunnels yet 2020-11-15 17:02:01 -05:00
1f6be38145 wait for publish confirmation or publish to another floodfill 2020-11-15 13:06:02 -05:00
8b3a7486c7 rename CRYPTO_KEY_TYPE_ECIES_X25519_AEAD_RATCHET to CRYPTO_KEY_TYPE_ECIES_X25519_AEAD 2020-11-14 18:28:50 -05:00
62cd9fffa3 Automate AES-NI and AVX detection on runtime, make it default on x86-based systems (#1578)
Rework CPU extensions detection code and build with AES-NI and AVX support by default
2020-11-15 01:31:20 +03:00
7e874eaa7c pre-calculated h 2020-11-12 15:15:02 -05:00
1c7780a423 garlic clove block for router 2020-11-09 15:35:50 -05:00
07b77443dd don't handle TunnelBuild message for ECIES router 2020-11-07 18:28:38 -05:00
4ba1be2dc0 one time garlic encryption for ECIES routers 2020-11-05 21:21:46 -05:00
6362a7bba5 decrypt garlic on ECIES router 2020-11-05 15:27:37 -05:00
1740715c00 correct reply key and IV for ECIES record 2020-11-04 21:04:28 -05:00
21501cbf81 correct MixHash after decryption 2020-11-04 13:31:28 -05:00
d5f3d6111e correct tunnel build record size to decrept 2020-11-04 11:52:33 -05:00
bd04f92087 correct public key for ECIES address 2020-11-03 18:41:27 -05:00
942b2b05e7 correct key for AEAD decryption 2020-11-03 15:53:47 -05:00
b8064b9b4b copy noise state 2020-11-03 15:42:53 -05:00
f94d03465a don't create transit tunnel if decyrption failed 2020-11-03 15:38:25 -05:00
4e7aafeec1 send transit tunnel reply for ECIES router 2020-11-03 15:23:13 -05:00
d820b8036e correct transient signature length 2020-11-03 09:20:14 -05:00
3907c17cf5 handle TunnelBuildMessage for ECIES router 2020-11-02 18:49:07 -05:00
b12fa97a38 32 bytes private key for ECIESx25519 2020-10-29 18:41:21 -04:00
b9b431e82d Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-28 21:53:41 -04:00
9f2a2e44a3 common MixHash and MixKey 2020-10-28 21:53:11 -04:00
aaf6c1ea8b [RPM] fix build on fedora >= 33
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-29 01:17:07 +03:00
b2f0278180 [RPM] fix build on fedora >= 33
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-29 01:03:36 +03:00
530eba1b91 [RPM] fix build on fedora >= 33
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-29 00:51:01 +03:00
812d312a9e [RPM] fix build on fedora >= 33
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-29 00:38:47 +03:00
5d256e1d80 don't allow STREAM CONNECT and STREAM ACCEPT in command session 2020-10-28 15:35:39 -04:00
d02a0c9b3a [QT] don't build i2pd with aesni/avx for compatability with arm64
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-28 21:18:02 +03:00
bdbd060229 [QT] create obj dirs before building i2pd
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-28 21:02:41 +03:00
bf04962994 [QT] change i2pd make command
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-28 20:47:16 +03:00
33f2ddb696 [QT] fix build with prebuild i2pd libs
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-28 20:07:28 +03:00
e444519889 excluded appcompat 2020-10-27 16:46:39 -04:00
a47aa8c282 [actions] build i2pd library before building gui 2020-10-27 19:55:48 +00:00
0c29aeb9be [actions] add qt gui builder 2020-10-27 19:40:22 +00:00
2b4a91cc80 [actions] Rename worker and jobs 2020-10-27 19:34:38 +00:00
9ffc4155dd Merge pull request #1567 from nonlinear-chaos-order-etc-etal/branch2
qt .pro now uses libi2pd.a and libi2pclient.a instead of sources
2020-10-27 15:17:33 -04:00
979282a0d4 qt .pro now uses libi2pd.a and libi2pclient.a instead of sources 2020-10-28 03:11:14 +08:00
c63818f355 2.34.0 2020-10-27 12:27:08 -04:00
c400372a79 create new ratchets session if previous was not replied 2020-10-27 08:32:38 -04:00
56f3bdd746 [win32] handle WinAPI errors in SSU
Windows can throw WinAPI errors which are not handled by boost asio

Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-27 11:52:02 +03:00
cc0367b079 always send STREAM STATUS reply to STREAM FORWARD 2020-10-26 16:06:19 -04:00
e41bbcb2bb handle SILENT for STREAM FORWARD 2020-10-26 11:19:37 -04:00
b35f43d79e initial implementation of STREAM FORWARD 2020-10-25 17:20:15 -04:00
e9f11e204e check if session is terminated before send 2020-10-24 21:22:48 -04:00
1b63c9f6ad Merge pull request #1564 from nonlinear-chaos-order-etc-etal/openssl
android fixes
2020-10-24 19:12:43 -04:00
21d99e355c MixHash(sepk) added 2020-10-24 15:48:56 -04:00
f0adbcd5e1 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-24 12:40:40 +08:00
bfcf3cfbf1 Fixes #1563 2020-10-24 12:40:22 +08:00
ef5495bfb2 padding for x25519 crypto key 2020-10-23 22:14:00 -04:00
c93ee0d65d tunnels through ECIES routers 2020-10-23 15:53:22 -04:00
db3e48a81a android: more logical daemon state changes 2020-10-24 03:52:53 +08:00
d9b87e877d Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-23 21:41:58 +08:00
b6175132eb android: fix for pre-init jni calls; processAssets moved to a logical place 2020-10-23 21:41:42 +08:00
57d6c7a3b3 Added TunnelConfig.cpp. Removed CryptoWroker.h 2020-10-22 21:06:23 -04:00
d65a282e9d check routers with non ElGamal encryptions for lookup, publish and tunnel build 2020-10-22 18:34:15 -04:00
801ecaa41c temporary exclude routers with non ElGamal crypto types 2020-10-21 19:03:51 -04:00
49bf735c22 don't set destination to routers 2020-10-21 18:59:16 -04:00
cb55944ff6 Merge pull request #1562 from nonlinear-chaos-order-etc-etal/openssl
qt: socks outproxy enabled checkbox added; visual fixes; socks defaults fixes
2020-10-21 13:03:14 -04:00
9c225f8d77 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-22 00:36:18 +08:00
365fce922c qt: socks defaults fixes, socks outproxy enabled checkbox added; visual fixes 2020-10-22 00:35:59 +08:00
fbfc5ecda3 Merge pull request #1560 from nonlinear-chaos-order-etc-etal/openssl
qt: newer options added from docs + visual fixes
2020-10-21 07:42:25 -04:00
4001f48a28 qt: visual fixes & more 2020-10-21 18:12:39 +08:00
22124c25d1 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-21 14:46:55 +08:00
17f5bcbd1c qt: newer options added; not tested 2020-10-21 14:46:31 +08:00
b7ebb3ea3d [android] support NetworkCallback for network state changes
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-20 19:38:49 +03:00
387830e07a encyption type 0,4 by default for client tunnels 2020-10-19 18:26:01 -04:00
da94d40738 check if session is terminated before receive 2020-10-18 14:39:58 -04:00
417b5ed6cc handle SSU v4 and v6 messages in one thread 2020-10-14 21:06:51 -04:00
005581ef62 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-14 23:30:44 +08:00
050390c5c4 qt: all new general options added from docs 2020-10-14 21:37:39 +08:00
2648f1ba89 [workflow] install required packages 2020-10-14 08:14:33 +03:00
d9d31521f9 [workflow] add windows build 2020-10-14 08:06:22 +03:00
8e24d1b909 [workflow] change options order
Apply name for job, not for step.
2020-10-14 07:44:22 +03:00
36fc0daa12 [workflow] use latest boost from PPA 2020-10-14 07:36:16 +03:00
44d3854a13 [workflow] use sudo when installing packages 2020-10-14 07:24:02 +03:00
1dbc35f13d fix workflow 2020-10-14 07:22:00 +03:00
11691fb44a create GH workflow
Add workflow to build on ubuntu with make
2020-10-14 07:20:26 +03:00
acc5592f59 create DH keys for SSU session directly 2020-10-13 21:12:52 -04:00
614921276e [appveyor] update configuration to support cache (#1559) 2020-10-13 15:33:27 +03:00
3f45a11f12 [SSU] handle ICMP responses
Windows network stack can forward ICMP to socket and simple deleting of
packet can cause socket death. Same thing can happen on other systems
but without socket death.

Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-13 15:22:39 +03:00
e3464add50 don't create new tunnels if offline 2020-10-12 17:15:17 -04:00
18bb4a71c2 fix incorrect chars in variable
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-12 18:27:25 +03:00
85e9da82b0 [transports] validate IP when trying connect to remote peer for being in reserved IP range
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-12 14:56:17 +00:00
99d046ca11 [http] handle WebDAV methods
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-12 07:31:57 +03:00
0b372a344c [webconsole] change error status print format
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-10-12 07:29:46 +03:00
ffa0f0afd9 check network status 2020-10-11 17:51:40 -04:00
e21dac21c8 fixed #1557. don't try to send empty message 2020-10-11 14:02:12 -04:00
0108745065 qt: bool optionValuePresent removed 2020-10-08 15:11:55 +08:00
e2a1cd12c3 don't delete unreachable routers if too few 2020-10-07 21:13:26 -04:00
f6ff232106 qt: crypto type added 2020-10-07 23:16:06 +08:00
b0c690d836 qt: build* added to .gitignore 2020-10-07 19:25:02 +08:00
7246624983 list of headers to remove 2020-10-06 19:24:03 -04:00
471c46ad8e remove some HTTP headers from response 2020-10-06 16:22:40 -04:00
59032d515b i2p.streaming.answerPings=false by default for client tunnels 2020-10-04 19:52:12 -04:00
d218c9a983 disable ntcpproxy 2020-10-04 10:12:33 -04:00
243f6e755b restore copyright header 2020-10-04 09:34:15 -04:00
67b76809ea [appveyor] rewrite mirrorlist after updating runtime
If pacman was updated on runtime update, changes which we domne earlier will be rewrited by config from package
2020-10-04 09:57:45 +03:00
77231bfc6c [appeveyor] rewrite mirrorlist (testing)
https://github.com/msys2/MINGW-packages/issues/7084#issuecomment-703211308
2020-10-04 09:53:31 +03:00
e614226926 [appveyor] change repository disabling way (testing) 2020-10-04 09:39:40 +03:00
65e15d74fc [appveyor] print mirrorlist (testing) 2020-10-04 09:32:21 +03:00
7ceb81cc83 [appveyor] clean packages cache after disabling mirrors 2020-10-04 09:16:43 +03:00
d3f7eea0a3 [appveyor] Disable unavailable repository
Ref: https://github.com/msys2/MINGW-packages/issues/7084
2020-10-04 09:05:57 +03:00
c2f13a1496 some cleanup 2020-10-03 22:29:52 -04:00
faae2709d9 removed NTCP 2020-10-03 21:58:20 -04:00
d595006d1f Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-10-03 18:46:40 -04:00
a8d23b5439 disable NTCP for good 2020-10-03 18:46:12 -04:00
cfda807057 [appveyor] use different mirror for keyring
Default repo mirror is not available, changed to other one.
2020-10-04 00:45:30 +03:00
c601a2986f [appveyor] test without manual keyring installation 2020-10-04 00:35:12 +03:00
8483464aab don't attach our RouterInfo to router's request 2020-10-03 17:20:04 -04:00
dca69e9b6e Merge pull request #1555 from zamabuvaraeu/patch-1
Update Win32NetState.h
2020-10-03 17:15:50 -04:00
9450dc84da Update Win32NetState.h
QueryInterface должна увеличивать счётчик ссылок.
2020-10-04 03:32:02 +07:00
3a2724ec58 single thread for I2CP 2020-10-02 13:13:27 -04:00
ee84291997 handle i2p.streaming.answerPings properly 2020-09-30 19:06:13 -04:00
fd9229c467 ping/pong for streaming 2020-09-30 17:12:28 -04:00
ac5a4fe70f [appveyor] remove tasklist print 2020-09-28 04:51:13 +03:00
873b4f3178 [appveyor] suppress error code 2020-09-28 04:48:57 +03:00
beb5d26e6d [appveyor] kill gpg 2020-09-28 04:44:18 +03:00
221b7cbf76 [appveyor] kill bash before second try
Ok, just waiting for bash termination doesn't works, so lets kill it.
2020-09-28 04:29:43 +03:00
7d34f1e883 [appveyor] add delay before second try 2020-09-28 04:20:18 +03:00
208707c00b [appveyor] install keyring package without question 2020-09-28 04:11:40 +03:00
cb41c04551 [appveyor] install keyring package without question 2020-09-28 04:10:11 +03:00
730c6aff11 Update appveyor.yml 2020-09-28 04:08:39 +03:00
3d40c7603d Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-09-27 20:51:34 -04:00
dec7a9a01c shared transient destination between proxies 2020-09-27 20:50:57 -04:00
5f42888b61 [appveyor] disable fix introdued in 7864053 2020-09-28 03:43:47 +03:00
489c38ec5b read Last-Modified 2020-09-27 19:19:48 -04:00
949fc47f31 two tunnels for shared local destination 2020-09-27 19:07:58 -04:00
4d85079372 correct addressbook request 2020-09-27 17:46:15 -04:00
335f9394a5 drop gcc 4.7 support 2020-09-26 19:32:19 -04:00
f939a7b349 reduce variable tunnel build length to 4 2020-09-21 19:22:53 -04:00
09fdb068d2 Database lookups from ECIES destinations 2020-09-19 21:15:42 -04:00
024c29b180 eliminate boost/bind 2020-09-17 21:11:46 -04:00
2b0d1a2190 implement DatabaseLookupTagSet 2020-09-15 19:39:18 -04:00
d0d71c93af set LeaseSet type to 3 for ratchets if not specified 2020-09-10 19:27:29 -04:00
da1e52357f delete symmkey on cleanup 2020-09-08 07:46:55 -04:00
a05a54b38e trim behind ECIESx25519 tags 2020-09-07 18:45:05 -04:00
a0685d804d 2.33.0 2020-08-24 12:48:09 -04:00
954781262c 2.33.0 2020-08-24 12:27:39 -04:00
0777bad2c3 [webconsole] fix warning, mobile page width
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-08-23 22:26:26 +03:00
3159b06988 reseeds update 2020-08-15 13:53:49 -04:00
e7ff6fbffc don't save invalid addreses 2020-08-14 09:54:31 -04:00
6fec92c012 shared transient addresses 2020-08-10 17:49:46 -04:00
e50abbb250 avoid replay upon SSU packet resend 2020-08-08 19:01:55 -04:00
8e25226574 use unordered_map for incomplete and sent messages 2020-08-08 13:34:27 -04:00
9636d82b37 MixHash for SessionConfirmed processing 2020-08-03 18:31:03 -04:00
c3aa6b9cda use delivery type local if destination is not secified 2020-07-29 17:47:46 -04:00
3ef8b3dcbb don't send repliable datagram after less then 100 milliseconds 2020-07-24 20:44:01 -04:00
c41554109b change datagram routing path if nothing comes back in 10 seconds 2020-07-15 16:20:35 -04:00
67b94d3533 unordered_map for RouterInfos and LeaseSets 2020-07-07 15:38:20 -04:00
d52c0633c8 Merge pull request #1544 from wipedlifepotato/openssl
whitelist synonim for accesslist
2020-07-06 19:04:21 -04:00
4e4c117023 whitelist synonim for accesslist 2020-07-07 02:01:56 +03:00
cb0d30cf42 Merge pull request #1 from PurpleI2P/openssl
pull
2020-07-07 01:47:28 +03:00
2d65402ced [webconsole] update styles
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-07-05 10:05:11 +00:00
e15b2cc5d6 [webconsole] rework lists with tunnels, transit, etc
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-07-05 10:05:11 +00:00
c024905d56 Merge pull request #1542 from nonlinear-chaos-order-etc-etal/openssl
Android.mk : openssl-1.1.1d-clang instead of openssl-1.1.1a-clang
2020-07-05 09:48:43 +00:00
6f17624742 Android.mk : openssl-1.1.1d-clang instead of openssl-1.1.1a-clang 2020-07-05 12:59:31 +08:00
6f2e6ed887 key for next send ratchet 2020-06-30 15:05:17 -04:00
5f1e66d64b use pre-calculated x25519 ephemeral keys for ratchets 2020-06-30 13:00:41 -04:00
1f31fdc257 pre-calculate ephemeral keys for x25519 2020-06-29 20:02:09 -04:00
df9965e129 use unordered_map for peers 2020-06-29 18:19:31 -04:00
61e9c31f0d don't hold RouterInfo after successive connect 2020-06-24 11:29:54 -04:00
a0b35ebd3e mark NTCP2 unreachable routers 2020-06-22 22:32:18 -04:00
951ec567c7 don't try to connect though teminated local destination 2020-06-17 21:06:35 -04:00
31494267e5 fixed datagram idle crash 2020-06-17 14:24:25 -04:00
70e4cbc023 differentiate UDP server sessions by port 2020-06-15 20:10:47 -04:00
8d903a09e2 [Docker] drop boost-python2 2020-06-14 22:18:41 +03:00
63451fb781 Merge pull request #1535 from komachi/apparmor-fixes
Improve AppArmor profile
2020-06-14 16:30:08 +00:00
1e609acb03 keep sending through first successive routing path 2020-06-14 11:16:08 -04:00
69194118df generate random padding length in bulk 2020-06-13 21:24:16 -04:00
0f309377ec Improve AppArmor profile
- give it a name
- import needed abstractions
- allow local additions
- cleanup
2020-06-13 20:46:17 +00:00
49a19a52c8 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-06-13 16:18:41 -04:00
1a39f7e5c6 GarlicRoutingPath per session 2020-06-13 16:18:12 -04:00
a5fed64f38 [webconsole] update sliders html and css
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-06-13 18:33:39 +03:00
79858d4372 [webconsole] adaptive styling
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-06-13 18:19:24 +03:00
61897ae16c crypto.ratchet.inboundTags 2020-06-12 20:42:54 -04:00
5e0a8ed232 set UDP receive buffer size 2020-06-12 16:06:07 -04:00
5993cc857a start new tunnel message if remining is too small 2020-06-12 16:03:12 -04:00
6a0174293e send raw datagrams in opposite direction 2020-06-11 22:04:32 -04:00
44bb8f6f16 allocated datagram I2NP from memory pool 2020-06-10 21:19:37 -04:00
a33cad4b70 eliminate datagram send timer 2020-06-10 11:57:40 -04:00
0639cce784 [SAM] fix ECDSA signatures names
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-06-10 05:11:26 +03:00
a8f227f759 send raw follow-on datagrams 2020-06-09 21:48:47 -04:00
f077836bf5 store DatagramSession for bulk 2020-06-09 19:20:24 -04:00
6d7847f2df send bulk datagrams 2020-06-09 16:26:45 -04:00
221c14cf0e don't lookup UDP session if port was not changed 2020-06-07 16:24:11 -04:00
6735b2686b set LeaseSet2 for ECIESx25519 2020-06-05 15:41:30 -04:00
55ff6beb7d don't create ECIESx25519 again if key was not changed 2020-06-05 09:23:50 -04:00
4ae41513ac save new session with NSR tagset 2020-06-04 18:19:38 -04:00
438a225487 pass calculatePublic 2020-06-03 19:58:36 -04:00
e135696530 support multiple encryption keys through the I2CP 2020-06-03 16:05:19 -04:00
9135772f89 2.32.1
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-06-02 19:26:36 +03:00
0dc212d97c fixed non-updating LeaseSet1 2020-05-28 13:46:02 -04:00
45e8d5c50e Return deprecated websocket config options for compatibility
Closes #1523

Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-27 21:29:00 +03:00
37ec90c436 don't gererate more tags for detached session 2020-05-26 16:47:45 -04:00
010541197c Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-05-25 21:41:17 -04:00
bdb918cdb3 honour explicitPeer param in tunnels 2020-05-25 21:40:46 -04:00
64c986ebbb [RPM] update spec files
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 23:01:02 +03:00
a4c4bf4b58 [RPM] update spec files
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 22:30:18 +03:00
60b1b2ca4a [RPM] update spec files
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 21:23:02 +03:00
8e0f1de25a 2.32.0 - [RPM] fix build in fedora copr
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 20:30:48 +03:00
dba6d68108 update debian patch
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 13:45:46 +00:00
d226834eef update debian patch
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 13:33:02 +00:00
2facf14443 fix symbolic link
Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-05-25 13:09:02 +00:00
6bd44f0e4b 2.32.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-05-25 13:06:11 +00:00
1dcb878796 update debian and rpm stuff to 2.32.0
Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-05-25 12:44:34 +00:00
0e0169d22b 2.32.0 2020-05-25 08:37:47 -04:00
50c8a84037 [SOCKS] overwrite connection info after establishing connection to i2p host (closes #1336)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-25 03:53:54 +03:00
1975adc48f print remote peer for queues 2020-05-24 14:14:16 -04:00
71564f0d10 set default i2cp.leaseSetEncType=0,4 for http and socks proxy for android 2020-05-24 10:30:00 -04:00
5a32082624 recreate session after 90 seconds incativity 2020-05-23 15:58:11 -04:00
45aa78d953 revert 7133a07 - it broke usage in some SOCKS implementations
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-23 20:40:27 +03:00
86e8614934 allow session restart after 2 minutes from creation 2020-05-23 10:20:22 -04:00
ead89c767a compress longer RouterInfo 2020-05-22 18:32:44 -04:00
8bae4975fb add copyright headers
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-22 18:14:53 +00:00
7a5146ea74 fix code syle(spaces->tabs, tabulations)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-22 18:14:53 +00:00
9633c247f0 [readme] update docker badges 2020-05-22 19:34:42 +03:00
78640532e1 [appveyor] add build fix (#1520)
Add fix due to msys2/MSYS2-packages#1967
2020-05-22 16:01:25 +03:00
46ee427ee3 common header for repliable datagrams 2020-05-21 21:54:00 -04:00
0c2b0081b5 rollback 2020-05-21 19:38:25 -04:00
f133a7f9fd resend outstading packets again 2020-05-21 18:58:28 -04:00
a6c9ee446a LeaseSet and encryption type for http and socks proxy 2020-05-21 15:36:16 -04:00
153aaa6d21 no compression for RouterInfo gzip 2020-05-21 15:33:12 -04:00
e5901dad91 resend not more than half of window 2020-05-21 14:52:44 -04:00
9318388007 [apparmor] add one more resolv.conf path (reported by user with ubuntu 18.04)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-20 22:30:02 +03:00
bdd75e1171 build client tunnels through router with version >= 0.9.36 2020-05-20 14:59:18 -04:00
7d22ddd710 Merge pull request #1453 from donarrock/patch-1
Update Dockerfile
2020-05-20 12:24:29 +00:00
7e82c8e279 Merge pull request #1394 from zetok/service 2020-05-20 09:57:51 +00:00
db6a0e6ad9 [cmake] remove windows build support (#1517)
Removes support for MSVC, MSYS, MinGW and included NSIS installer in cmake
2020-05-20 12:17:54 +03:00
648d035a0f GzipNoCompression for datagrams 2020-05-19 21:02:32 -04:00
7ebf2f010c shorter padding for optimal packet length 2020-05-19 19:03:12 -04:00
3db4421aa7 don't invoke gzip for decompression if no compression 2020-05-19 10:48:23 -04:00
9fb59e128b resubmit updated LeaseSet if not confirmed 2020-05-18 22:31:36 -04:00
c7c6e5917a Streaming MTU size 1812 for ECIESX25519AEADRatchet 2020-05-18 20:45:25 -04:00
7b418b3adf insert whole message to queue 2020-05-18 17:51:45 -04:00
1c8d662e30 don't add padding for optimal packet size 2020-05-18 16:42:06 -04:00
d4bfeab36c pass gzip parameter to UDP tunnels 2020-05-18 12:01:13 -04:00
e1b1032df9 reseeds update 2020-05-18 08:29:09 -04:00
329439d0ae don't copy datagram payload 2020-05-17 16:49:31 -04:00
0b1cfb2102 send response to recived datagram from ECIESX25519AEADRatchet session 2020-05-16 19:10:17 -04:00
1e4d2fd053 fixed for g++10 2020-05-14 15:45:25 -04:00
716378bd6b [makefile] fix build with g++ 10
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-14 21:53:40 +03:00
de48d3aaec Merge pull request #1515 from BOPOHA/logrotate_config
added logrotate config
2020-05-14 18:04:51 +00:00
b5b195e628 [windows] fix msys build
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-14 20:59:52 +03:00
23be4c01df CreateLeaseSetClove 2020-05-13 18:09:26 -04:00
86782f3479 eliminate extra buffer allocation for incoming packets 2020-05-12 18:30:04 -04:00
a96c205830 allow encryption type param for encrypted LeaseSet 2020-05-08 14:20:13 -04:00
9274881c18 update logrotate config for reusing in debian 2020-05-08 18:45:28 +02:00
24c5f07153 added logrotate config 2020-05-07 12:11:30 +02:00
789ff702ac fixed sudden webconsole hangs 2020-05-06 14:54:41 -04:00
9b6facf3b0 fixed crash of encrypted leaseset without authentication 2020-05-06 14:08:54 -04:00
d503190647 fixed crash of encrypted leaseset without authentication 2020-05-06 10:08:01 -04:00
c4d9c03930 handle termination block 2020-05-05 13:01:23 -04:00
d7d70b707f configurable throw function 2020-05-05 11:13:59 -04:00
dbe1e3f577 ThrowFatal function 2020-05-05 10:16:16 -04:00
bb7f03857c ThrowFatal function 2020-05-05 09:35:41 -04:00
53b43353eb fixed formatting 2020-05-05 08:27:56 -04:00
b197556447 remove dependency from Win32App 2020-05-05 08:11:01 -04:00
42d4781a96 [windows] add binding exceptions messagebox notifications, update exceptions handling code
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-05 02:45:25 +03:00
d991cc3b96 [services] handle binding errors in tunnels, webconsole
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-04 18:19:38 +03:00
4d48d35ad7 [SSU] handle socket binding errors
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-05-04 18:12:23 +03:00
b7ba8f8e93 precalculate initial h and ck 2020-05-03 13:23:08 -04:00
dff510c181 set best compression for RouterInfo 2020-05-03 09:27:17 -04:00
1eead0e885 GzipNoCompression witout zlib calls 2020-05-02 21:18:44 -04:00
e301387896 don't calculate checsum for Data message send through ECIESX25519AEADRatchet session 2020-05-02 11:13:40 -04:00
c49e544781 allow longer families 2020-05-01 14:30:56 -04:00
d48db501e0 max payload is always 1730 2020-05-01 07:33:05 -04:00
ec4e17f75c cleanup previous tagsets 2020-04-30 21:27:35 -04:00
17e69e67b1 create additional tags for NSR tagset 2020-04-30 15:38:15 -04:00
c4f9f7da06 fixed warning 2020-04-30 13:45:26 -04:00
c367476036 [webconsole] fix printing information about ECIESx25519 tags/sessions
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-30 16:21:49 +03:00
f5712c4198 remove not needed initialization for pointer
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-30 04:59:05 +03:00
1aa0da3382 [NTCP2] fix socks proxy support
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-30 04:47:32 +03:00
27d69894d4 show ECIESx25519 session and tag on the web console 2020-04-29 20:50:31 -04:00
7133a07f38 [SOCKS] wrap DNS type requests response as IPv4 (fixes netcat usage, closes #1336)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-30 01:53:07 +03:00
627d8cfe69 correct timestamp check for LeaseSet2 2020-04-29 17:11:48 -04:00
16b992d705 update info about pidfile defaults (closes #1136)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-29 16:55:25 +03:00
3d9c844dca handle out of order NSR 2020-04-28 22:03:13 -04:00
c0de9455bb [android] stop immediatly if no transit tunnels available while graceful shutdown
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-29 02:16:31 +03:00
65e1871cd7 new tag for each NSR 2020-04-28 18:23:13 -04:00
0a431594f8 [Log] Change default loglevel (closes #1230)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-29 00:56:43 +03:00
7b22ef4270 create incoming NSR tagset 2020-04-28 14:47:53 -04:00
f77a58b2dc set some ECIESx25519 params 2020-04-27 18:53:02 -04:00
142a138cfc store previous reverse key 2020-04-27 09:35:02 -04:00
e6fdf5ad8d [Log] create logfile even if loglevel is "none"
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-27 13:59:00 +03:00
5700e18257 [FS] read tunnels configs which ends with .conf only
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-27 13:23:29 +03:00
50a77fedca removed trivial check 2020-04-26 19:37:00 -04:00
51e3d5f7bc create next tagset 2020-04-26 19:27:31 -04:00
7f859978dd [webconsole] Add runtime transit limit changer, fix button CSS
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-26 23:45:30 +03:00
d8134e8a21 handle and send next key message without public key 2020-04-25 21:09:03 -04:00
614d91e0b1 send same next key reponse 2020-04-25 14:45:53 -04:00
30067fc7d7 handle next key forward 2020-04-24 21:36:08 -04:00
ec29597dbd associate tagset for ECIESx25519 tags 2020-04-24 15:46:02 -04:00
ad211a63f3 check if number of peers to exclude doesn't exceed 512 2020-04-23 15:22:07 -04:00
6b596bd05f check ECIES flag for encrypted response 2020-04-21 15:14:03 -04:00
510b85fd23 try ECIESx25519 tag first 2020-04-20 19:37:46 -04:00
e3c8f3fd6f use ack request instead DeliveryStatus for LeaseSet confirmation 2020-04-19 15:00:51 -04:00
f9175db28e store intermediate symmetric keys 2020-04-16 21:30:18 -04:00
f4798d05e7 persist multi encryption keys 2020-04-15 22:04:18 -04:00
a2a0f62135 multi crypto keys in i2cp.leaseSetEncType 2020-04-15 18:01:01 -04:00
d923f0e01b support two encryption keys 2020-04-14 19:12:44 -04:00
2fc16ee13d indetification of incoming garlic messages 2020-04-13 20:00:19 -04:00
152e579f7e [windows] update flag on connectivity state changes, CRLF > LF
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-12 06:02:26 +03:00
90914bb2de [windows] init internet connectivity events checker functional (vista+ supported only)
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-12 05:25:22 +03:00
95fa835191 [android] update strings, menus, add reloading tunnels item
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-11 23:28:45 +03:00
4e37df26a3 2.31.0
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-10 20:33:54 +03:00
5e606573b1 2.31.0 2020-04-10 12:57:47 -04:00
b3974cb52a [webconsole] security hardening headers (closes #1464)
Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-04-10 02:34:47 +00:00
b7c206c44b replace by new incoming session 2020-04-09 15:00:38 -04:00
49c1e47736 correct termination if session already exists 2020-04-08 18:02:12 -04:00
4e1319d874 handle ECIESFlag in DatabaseLookup at floodfill 2020-04-07 11:40:18 -04:00
a9436aa9af drop i2lua
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-03 14:31:38 +03:00
d503f07564 suppress GCC 7 (bug 77728) psabi note
Suppresses messages like that:
    note: parameter passing for argument of type <...> will change in GCC 7.1

Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-04-03 14:31:38 +03:00
aa7750bfd3 keep sending new session reply until first established session message received 2020-04-02 21:48:39 -04:00
8872d1f389 mutex for m_RemoteIdentity 2020-04-01 09:54:10 -04:00
f21af4068f preferred crypto type for Decrypt 2020-03-31 17:35:51 -04:00
f4ca6bbb52 fixed race with identity verifier 2020-03-30 19:27:10 -04:00
869d0156ce handle Ack request 2020-03-26 19:03:38 -04:00
744e893dce check message length 2020-03-23 18:09:57 -04:00
fe9ac10f02 generate new tags based on last received index 2020-03-22 21:21:12 -04:00
6fb80f226a reopen socked and restart receiver on exception 2020-03-22 08:14:20 -04:00
ff19bab800 set only key correctly 2020-03-21 16:21:51 -04:00
962c2160c7 set actual LeaseSet2 buffer size 2020-03-20 17:43:37 -04:00
168da33d8b add comma
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-20 18:43:54 +03:00
b6b25dc9f3 update log messages
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-20 17:51:55 +03:00
3ca17fdc03 support multiple encryption keys 2020-03-19 18:33:42 -04:00
2249708097 [webconsole] remove excess tag
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-19 02:34:45 +03:00
2fcaa7d260 [webconsole] rework spoilers; print tags, leases, router info in table
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-19 02:27:07 +03:00
f3b0e57a54 publish multiple encryption keys 2020-03-18 18:03:03 -04:00
5da92437a1 set msg type for deliverystatus 2020-03-16 16:41:07 -04:00
b5bc05ac2b delete unconfirmed LeaseSet and DeliveryStatus 2020-03-14 16:35:34 -04:00
45145fa50a add ECIESX25519AEADRatchet session to delivery status 2020-03-14 09:33:48 -04:00
dd8200e8b0 cleanup websocks
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-12 03:50:21 +03:00
2f56547d5f Merge pull request #1477 from PurpleI2P/drop-websockets
drop websockets support
2020-03-11 12:37:38 +00:00
82bdcfbbcb Merge pull request #1491 from nonlinear-chaos-order-etc-etal/openssl
qt: delayed save in background. should be better ui experience
2020-03-10 11:39:07 -04:00
0e38e43315 some qt work. fixed on slow computers; now faster as delayed save is implemented 2020-03-10 23:22:49 +08:00
63746be4d5 resolve i2pd_qt.pro conflict 2020-03-10 21:50:57 +08:00
ee73ee365f some work on qt 2020-03-10 21:49:04 +08:00
3c53479864 update LeaseSet for ECIESX25519AEADRatchet sessions 2020-03-08 20:58:59 -04:00
4adc741de3 send DeliveryStatusMsg for LeaseSet 2020-03-08 18:13:41 -04:00
64da62dbe6 alsways store latest symmkey 2020-03-07 18:46:40 -05:00
dd9b5faa5c fixed crash on termination 2020-03-05 18:44:15 -05:00
51d018acc6 webconsole: add stream closing
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-03-05 04:14:39 +03:00
5eec580727 delete strem from destination upon termination 2020-03-04 18:31:22 -05:00
1e9a53da3f delete stream by id for HTTP interface 2020-03-04 15:54:09 -05:00
8dae044600 Merge pull request #1441 from noraj/patch-1
README: explicit linux distro supported
2020-03-03 18:07:01 +00:00
2d3fad2cdb correct proxy buffers 2020-03-02 16:24:00 -05:00
a59a8f62ca Merge pull request #1479 from wipedlifepotato/openssl
Pre init webview button. (android)
2020-03-01 21:17:14 -05:00
35cfa7d9fb Merge branch 'openssl' of github.com:wipedlifepotato/i2pd into openssl 2020-03-02 05:06:06 +03:00
c6ccb373a2 del geti2pdpath 2020-03-02 05:04:37 +03:00
b6368170ed Update README.md 2020-03-02 04:00:28 +03:00
35e8424293 preinit webview+configparser+README.md
tabulation fixes

configparser to comments

dont need

pre init webview

readme changes

delete submodules

webview in main menu

webview pre init

delete modules

delete submodules
2020-03-02 03:58:50 +03:00
e969d58689 handle ntcp2.proxy parameter 2020-03-01 15:11:54 -05:00
ae20e3aa95 NTCP2 proxy 2020-03-01 11:24:18 -05:00
de4cb74173 Merge pull request #1478 from unlnown542a/openssl
add ntcp2proxy support
2020-03-01 10:04:27 -05:00
4f0da87a7a add ntcp2proxy support 2020-03-01 14:35:24 +00:00
97f0347715 Update android stuff:
* switch to c++17
* use boost 1.72.0
* disable minify in release
* enable apk splitting (separate apk for every ABI)
* add version to output apk name

Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-02-29 23:14:35 +00:00
2ffe62ba41 [[fallthrough]] if C++17 only 2020-02-29 09:21:50 -05:00
fe1724e7e6 switch travis-ci to xenial 2020-02-28 23:41:42 +03:00
2ac2da41cf cmake: fix else statement 2020-02-28 23:28:41 +03:00
ed574f9d79 use C++17 if available when configuring with cmake 2020-02-28 23:05:26 +03:00
e0cb26bd9e fixed fallthough warning for C++17 2020-02-28 14:15:41 -05:00
1893127e84 use fold expression if C++17 2020-02-28 14:05:51 -05:00
b02c9fb118 enable C++17 for gcc 2020-02-28 14:03:08 -05:00
bca0809918 cleanup removed websockets funtions
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-02-28 18:48:43 +03:00
00db527377 drop websockets support
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-02-27 14:58:06 +03:00
2c6e041ae2 rpm: make package buildable on mageia cauldron (#1476) 2020-02-26 13:41:35 +00:00
a0d6c654cc 2.30.0
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2020-02-25 20:08:50 +03:00
5115c27e72 2.30.0 2020-02-25 11:15:30 -05:00
d09c3ccb2d Merge pull request #1474 from rex4539/dead-strip
Pass -dead_strip -dead_strip_dylibs -bind_at_load on macOS
2020-02-24 18:16:20 +00:00
5c308026ac Pass -dead_strip -dead_strip_dylibs -bind_at_load on macOS 2020-02-21 11:12:00 +02:00
91919c6d64 check if both sides are ECIESx25519 2020-02-20 21:07:45 -05:00
7168738835 check ctx for null 2020-02-20 21:05:07 -05:00
9c9b723cf5 delete expired ECIESX25519AEADRatchet sessions and tags 2020-02-20 15:44:09 -05:00
50450923df don't add extra , to result string 2020-02-19 20:51:32 -05:00
f392edd66c single thread SAM by default 2020-02-19 13:27:28 -05:00
24b48e5d50 reseeds update 2020-02-18 17:45:04 -05:00
47f384a0e0 postpone SAM destination termination 2020-02-17 15:14:35 -05:00
88594887f9 fixed qt build 2020-02-16 17:44:36 -05:00
32e2f0b1fa correct termination of streaming destination 2020-02-15 16:30:10 -05:00
09ed57ad42 select preferred crypto from LeaseSet2 2020-02-12 11:09:20 -05:00
53a6162b0c generate more receive tags when needed 2020-02-09 17:19:42 -05:00
694d851cdb Symmetric Key Ratchet 2020-02-08 21:51:02 -05:00
8e53c30a00 correct calls sequence for tag and index 2020-02-07 22:08:55 -05:00
63e807b0b4 fixed crash on stop 2020-02-06 10:53:45 -05:00
012f22cc47 create session tags for ECIESX25519 2020-02-05 15:48:51 -05:00
9d891ab5dd single thread mode for SAM 2020-02-04 15:31:04 -05:00
d0e78be867 moved io_service away from ClientDestination 2020-02-04 14:17:23 -05:00
cbedebc9dd change minimal MTU size 2020-02-04 13:32:16 -05:00
969f9aa436 common RuunableBase with private inheritance 2020-02-04 11:48:56 -05:00
b982be5ff5 handle existing session message 2020-02-03 16:21:07 -05:00
2d154ee640 move RunnableService away from LeaseSetDestination 2020-02-02 18:58:58 -05:00
49810eb153 common RunnableService 2020-02-02 17:05:30 -05:00
85b88b8749 second x25519 for new session reply 2020-01-30 19:30:30 -05:00
239c8b5172 destination delivery instructions 2020-01-30 11:48:32 -05:00
8c800dc178 save aepk from new session message 2020-01-29 21:57:10 -05:00
cdd068d99a correct message size 2020-01-29 19:27:38 -05:00
48fa10b080 incoming ECIESX25519AEADRatchet messages hanler 2020-01-29 15:54:11 -05:00
a1dbec0fcb handle new session reply 2020-01-29 12:54:26 -05:00
abe668f1c3 fixed build error 2020-01-28 10:31:35 -05:00
77440c235d replaced map by unordered_map 2020-01-28 10:03:51 -05:00
fd1ee48dbe datetime and padding blocks 2020-01-23 14:26:40 -05:00
205e807b66 reset keys 2020-01-22 21:42:30 -05:00
34295adb05 attach LeaseSet clove 2020-01-22 14:26:47 -05:00
7c212bef63 add new session to the list after reply received 2020-01-22 11:27:47 -05:00
76f95644b7 fixed #1461. Use openssl's HKDF for 1.1.1 anf higher 2020-01-22 09:59:08 -05:00
928b90d5bc fixed #1461. Use openssl's HKDF for 1.1.1 anf higher 2020-01-22 09:50:50 -05:00
09c6c2a4f3 decode aepk and bepk back 2020-01-21 21:09:19 -05:00
2b2bd733e9 correct sharedkey for new outgoing session 2020-01-21 19:13:23 -05:00
0d2d7e5e71 fixed Elligator tests 2020-01-21 17:53:48 -05:00
6142e93252 session tag for ECIESx25519 sessions 2020-01-21 14:40:23 -05:00
ccec3376ba try another ephemeral keys if elligator encoding failes 2020-01-21 12:19:20 -05:00
f497a74ec4 set random two highest bits 2020-01-21 12:18:31 -05:00
0e666e7d6a encoding fail test 2020-01-21 10:53:11 -05:00
f498fabd27 fix for openssl 1.1 2020-01-21 10:52:51 -05:00
8b49a55442 ratchet tagsets 2020-01-20 15:17:38 -05:00
a26eb942a9 Merge pull request #1458 from neheb/jjjjj
replace random_shuffle with shuffle
2020-01-20 07:16:00 -05:00
eabcafa516 replace random_shuffle with shuffle
random_shuffle is gone with C++17.

Found and fixed with clang-tidy.
2020-01-19 18:09:04 -08:00
6cc388c1bc use HKDF for MixKey 2020-01-18 14:43:36 -05:00
62e39ddfbd new session reply 2020-01-17 14:11:15 -05:00
80373623cd create payload 2020-01-17 11:21:41 -05:00
451c3945f0 create new ECIESX25519AEADRatchet session if not found 2020-01-16 19:33:00 -05:00
00cb15d9b4 fixed tyypo 2020-01-16 18:03:51 -05:00
67dd59125e new outgoing ECIESX25519AEADRatchet session 2020-01-16 16:34:13 -05:00
b6800dd125 lookup ECIESX25519AEADRatchet session by static key 2020-01-16 15:45:22 -05:00
dc9da69509 derive ECIESX25519AEADRatchetSession from GarlicRoutingSession 2020-01-16 14:59:19 -05:00
d7d964bf57 GarlicRoutingSession/ElGamalAESSession split 2020-01-16 14:31:01 -05:00
bcfe44db54 handle tunnel delivery instructioin for ECIESx25519 2020-01-16 12:47:08 -05:00
376bf6ba72 correct message size for ECIESx25519 2020-01-15 19:22:42 -05:00
f651baab25 ECIESX25519AEADRatchetSession added 2020-01-15 15:13:43 -05:00
61752e2aab correct ciphertext length 2020-01-13 22:37:31 -05:00
b7d3fd959e Merge pull request #1454 from rex4539/dead-strip
Pass -dead_strip -dead_strip_dylibs -bind_at_load on macOS
2020-01-13 09:17:05 -05:00
7ac05f8487 Pass -dead_strip -dead_strip_dylibs -bind_at_load on macOS 2020-01-13 14:47:15 +02:00
5cfc574f9a Update Dockerfile
Fixes dependencies, re-adds `boost-python` as `boost-python2` which was removed in #1408 .
2020-01-12 16:24:21 +01:00
4f70822b13 always persist crypto keys for public destinations 2020-01-12 10:03:30 -05:00
0007f304d0 don't pass from to HandleI2NPMessage 2020-01-07 15:20:55 -05:00
4afef91359 invoke HandleCloveI2NPMessage 2020-01-06 16:14:41 -05:00
815b6db0bf HandleCloveI2NPMessage 2020-01-06 15:31:20 -05:00
433d3bf582 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2020-01-06 14:38:13 -05:00
a335841509 pass msgID to HandleDeliveryStatus 2020-01-06 14:37:40 -05:00
26ad793d82 use unscoped storage (fixes usage on android 10)
Signed-off-by: r4sas <r4sas@i2pmail.org>
2020-01-05 23:04:08 +00:00
5337aa10f7 check AES tag first 2020-01-02 13:30:54 -05:00
9f79bdae9b encryptor for ECIES-X25519-AEAD-Ratchet 2019-12-19 15:59:15 -05:00
db84be2488 use HKDF for NTCP2 key derivation data phase 2019-12-18 20:48:30 -05:00
599ec62bb0 use HKDF for NTCP2 key derivation data phase 2019-12-18 20:45:47 -05:00
19a88300c6 decrypt payload section 2019-12-18 14:44:02 -05:00
b5d55e1ffb decrypt flags/static section 2019-12-17 16:34:47 -05:00
521fb83e38 initial code for ECIES-X25519-AEAD-Ratchet KDF 2019-12-17 16:18:40 -05:00
553d59c32b decryptor for ECIES-X25519-AEAD-Ratchet 2019-12-11 13:38:36 -05:00
9ed58e5186 encode with highY 2019-12-10 14:10:12 -05:00
36eaaa748c handle case when encoded key is (p-1)/2 2019-12-10 13:40:04 -05:00
4d7b86ca26 elligator test added 2019-12-10 13:20:23 -05:00
5faf84c732 correct conversion from Little Endian 2019-12-10 12:51:39 -05:00
d7b819267f check a for 0 in Legendre 2019-12-10 10:53:39 -05:00
7417867d0f implemented Legendre 2019-12-10 10:45:08 -05:00
8d74905257 0.9.44 2019-12-10 10:44:19 -05:00
c38298c06e Elligator decode 2019-12-09 16:11:46 -05:00
3100d587d1 use d%q 2019-12-09 13:23:17 -05:00
ba849d0300 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2019-12-06 20:29:29 -05:00
95df3e4b39 encode key 2019-12-06 20:29:03 -05:00
72492e33a0 appveyor: drop msys2 overwrite 2019-12-07 01:02:23 +00:00
934f1269f5 appveyor: replace deprecated --force in msys2 2019-12-07 00:59:33 +00:00
e6956d9bb0 calculate constants 2019-12-06 14:54:15 -05:00
2877900233 use 486662 for A 2019-12-05 16:13:59 -05:00
df1aa52e08 Elligator's encode 2019-12-05 16:03:11 -05:00
5fa2485a7d removed reseed.i2p.net.in 2019-12-04 17:27:16 -05:00
29f0e10411 Elligator added 2019-12-04 15:37:24 -05:00
39300a5bbf removed reseed.i2p.net.in 2019-11-28 17:49:36 -05:00
35d6268675 README: explicit linux distro supported
close #1440
2019-11-23 22:52:31 +01:00
0abb871f3f close socket after if accept failed 2019-11-20 13:00:50 -05:00
704fca969f handle accept errors 2019-11-20 12:05:32 -05:00
95debf8c80 update mingw build script
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2019-11-19 14:29:55 +03:00
dd94b77b2a use GetTickCount dll pointer, add USE_WINXP to makefile
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2019-11-19 13:51:14 +03:00
6cfe4fa580 handle sending errors 2019-11-18 14:13:31 -05:00
515c086099 Use GetProcAddress for inet_pton. Fixed build error 2019-11-12 15:06:04 -05:00
34ce06ac17 some cleanup 2019-11-12 14:19:14 -05:00
a104c9881e some cleanup 2019-11-12 11:57:34 -05:00
c3e3c091cc correct implementation of GetMTUWindows for WindowsXP 2019-11-12 11:35:59 -05:00
651240113c mark RI as unreachable if all connections failed 2019-11-12 10:03:33 -05:00
77189bf8e9 start over if an active session got disconnected 2019-11-12 09:38:22 -05:00
60fd3a4542 fixed #1434 use memset inster bzero 2019-11-12 07:17:57 -05:00
c66f9c8d6d reset connection attempts before reconnect 2019-11-12 06:46:08 -05:00
569088eaca 2.29.0 2019-10-21 12:02:43 -04:00
a7e8dd04fe 2.29.0 2019-10-21 11:50:59 -04:00
dfdd76a1bb fixed #1429. Don't use monotonic timer for Win32 2019-10-15 10:32:29 -04:00
28aac6f93b fix bogus date in changelogs
Signed-off-by: R4SAS <r4sas@i2pmail.org>
2019-10-07 21:18:46 +03:00
c2f47119ce fixed #1424. Check if .b32.i2p address string is valid 2019-09-23 13:42:15 -04:00
d6b1d0d4fb remove incoming session from pending list when established 2019-09-22 21:01:34 -04:00
03a861745b removed CloseSession 2019-09-20 20:09:25 -04:00
9a7aed20e9 handle error for SessionConfrimed send 2019-09-19 16:54:23 -04:00
b7f17d4cb1 client auth flag for B33 address 2019-09-06 11:02:19 -04:00
2497c3d187 Merge pull request #1421 from nonlinear-chaos-order-etc/openssl
Fixes three upnp issues, probably including: probably fixed #1419
2019-09-05 15:51:11 -04:00
f7a084969a fixed #1387 2019-09-06 03:21:26 +08:00
2900bc26a5 fixed #1388 : took code from 736c95a870 and fixed it as https://github.com/PurpleI2P/i2pd/issues/1388#issuecomment-528495918 tells 2019-09-06 02:58:28 +08:00
2334c56a96 Merge pull request #1414 from nonlinear-chaos-order-etc/openssl
qt: fixed logging to window in release builds
2019-08-27 12:40:19 -04:00
90a5d02bf6 2.28.0 2019-08-27 10:17:32 -04:00
81d9626da9 qt: fixed logging to window in release builds 2019-08-27 21:56:36 +08:00
44a2549b81 2.28.0 2019-08-27 09:46:54 -04:00
a2b8d468bc Merge pull request #1412 from nonlinear-chaos-order-etc/openssl
qt: disabled broken UPnP + small qt debugging tweaks
2019-08-27 08:53:44 -04:00
d523f0cadd gitignored autosave files by qtcreator 2019-08-27 19:31:57 +08:00
99116ff097 qt: disabled upnp for now - until upnp fixed 2019-08-27 19:31:28 +08:00
3939ca9eb4 enabled default logging debug option for qt debug builds 2019-08-27 17:51:55 +08:00
b5aa67b491 tweaked debug logging in i2pd_qt 2019-08-27 17:10:53 +08:00
e42efec220 correct outet plain text length in case of authKeys 2019-08-26 07:35:11 -04:00
9d06aa2f6a pass authSalt or epk 2019-08-25 20:51:15 -04:00
80765a797b correct outer cipher text len 2019-08-25 19:14:53 -04:00
0b5509a1ed correct authClients offset 2019-08-25 14:54:43 -04:00
478d7b4a83 Merge pull request #1410 from nonlinear-chaos-order-etc/openssl
android various fixes and improvements
2019-08-24 07:31:12 -04:00
9d3b38141a android various fixes and improv 2019-08-24 19:13:10 +08:00
ab3a4d902e Merge pull request #1409 from nonlinear-chaos-order-etc/openssl
android - show battery optimiz. os dialog menu item added; translated all battery stuff into Russian
2019-08-24 07:03:15 -04:00
5eab5f2437 show battery optimiz. menu item now hidden if not supported by os 2019-08-24 18:00:11 +08:00
80f632c19a show battery optimiz. menu item added; translated all battery stuff into Russian 2019-08-24 17:50:30 +08:00
6e4f18543d added *.local to android/.gitignore 2019-08-24 17:04:04 +08:00
54586c9076 Merge pull request #1408 from docker-and-co/fix-dockerfile-non-existend-deps
fix dockerfile: remove unmet dependencies
2019-08-23 11:02:00 -04:00
351c899807 cleanup incoming streams on stop 2019-08-23 10:00:49 -04:00
fe45d431d7 fix dockerfile: remove unmet dependencies 2019-08-23 16:20:09 +03:00
488c2f6d05 bump SDK version 2019-08-22 09:45:49 -04:00
75ab0909b3 Merge pull request #1405 from nonlinear-chaos-order-etc/openssl
various Android stuff. Fixed #1400
2019-08-22 07:15:36 -04:00
8f82d563c1 various Android stuff. Fixed #1400 2019-08-22 10:00:50 +08:00
9bbce5dba6 fixed typo 2019-08-21 20:26:19 -04:00
099adab9ed Update README.md
update head badges links, add snapcraft badge
2019-08-16 21:45:44 +03:00
c8cbf425ac check and send netid for NTCP2 and SSU 2019-08-13 14:55:18 -04:00
ad9c11cd92 correct parsing of addreses containing # 2019-08-10 22:16:26 -04:00
3872c2a3f5 use published encrypted instead orig type 2019-08-07 16:18:00 -04:00
e6a09b49c9 published encrypted flag 2019-08-07 15:43:03 -04:00
db107602bd handle messages with \r\n 2019-08-02 13:48:39 -04:00
a6558a61a7 Recognize RedDSA_SHA512_Ed25519 signature type 2019-08-02 12:54:24 -04:00
254d2b82b3 fixed #1393. store streams by recvStreamID 2019-07-26 14:23:21 -04:00
2c9fa2f738 Fix and update i2pd.service
- /var/run on distros with systemd is a symlink to /run , hence the
path changes.

- Remove unnecessary runtime dependency on `/bin/kill` which is
provided by `procps` and might not be available on minimal installs
(e.g. containers). Instead use `/bin/sh` which has a built-in `kill`.

- `PrivateDevices=yes` causes i2pd to fail to start on latest Debian
unstable. Service exits with the following:

```
i2pd.service: Failed to execute command: Operation not permitted
i2pd.service: Failed at step EXEC spawning /usr/sbin/i2pd: Operation not permitted
i2pd.service: Control process exited, code=exited, status=203/EXEC
i2pd.service: Failed with result 'exit-code'.
Failed to start I2P Router written in C++.
```

According to `man systemd.exec` exit code 203 corresponds to the
`execve(2)` system call failing. So it looks like i2pd tries to do
something it shouldn't be doing. The proper fix would be in i2pd, but
who knows how long that would actually take, so to allow people to
actually launch i2pd in meanwhile the line has been removed from the
service file.

Also, surprisingly, right after installing i2pd it started without any
problems, and only after restarting the box i2pd started to fail for no
apparent reason.
2019-07-24 11:48:18 +01:00
97d9795fc9 pass encrepted LeaseSet auth keys 2019-07-16 16:31:17 -04:00
54071b0e5d set and handle unpublished LeaseSet flag 2019-07-16 11:48:30 -04:00
925e8316c7 read i2cp.leaseSetAuthType, i2cp.leaseSetClient.dh.nnn and i2cp.leaseSetClient.psk.nnn from tunnel config 2019-07-12 20:58:17 -04:00
99e1b74023 create encrypted LeaseSet2 with authentication 2019-07-12 15:40:59 -04:00
7d68ccca53 create encrypted LeaseSet2 with authentication 2019-07-12 15:37:32 -04:00
a090114066 send data message wih raw type fpr raw datagrams 2019-07-10 13:31:49 -04:00
a204841abb handle RAW SEND 2019-07-10 13:30:31 -04:00
cc451809cc send/receive raw datagrams through the SAM 2019-07-10 11:32:56 -04:00
a605e4bab6 send and recieve raw datagrams 2019-07-09 21:33:55 -04:00
3f0534134d check for malformed b33 2019-07-04 13:05:39 -04:00
3acfb129cd 2.27.0 2019-07-03 12:38:55 -04:00
6ccef66920 call shutdown before close 2019-06-26 10:47:16 -04:00
e9fa4e94a6 Merge pull request #1374 from rszibele/openssl
BOB: fix status command.
2019-06-25 18:28:43 -04:00
fecc0c4640 don't call destructor twice 2019-06-25 16:37:06 -04:00
b759294975 BOB: fix status command. 2019-06-25 19:18:40 +02:00
a23e845c03 BOB: improve comment and remove error log in list command 2019-06-25 19:04:27 +02:00
cb8373e487 BOB: status response now correctly starts with "OK DATA". 2019-06-25 17:59:44 +02:00
8e919ddc8e use monotonic clock for uptime 2019-06-19 11:43:04 -04:00
832a9ab6b5 don't set random NTCP2 port if already set 2019-06-18 15:47:58 -04:00
13732ac333 fix #1363 try connect in SSU's thread 2019-06-14 15:43:03 -04:00
3e932a55f4 fixed typo 2019-06-11 15:09:10 -04:00
74e8610ec9 DH auth for encrypted LeaseSet2 2019-06-11 10:40:53 -04:00
089a60ded6 Merge pull request #1367 from rszibele/openssl
fix build on BSDs, as "isset" is a defined macro.
2019-06-10 19:10:34 -04:00
c8eeefe194 fix build on BSDs, as "isset" is a defined macro. 2019-06-10 23:04:59 +02:00
85eeba14c1 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2019-06-08 21:24:16 -04:00
f6f45eab39 flood encrypted LeaseSet2 with store hash 2019-06-08 21:23:25 -04:00
a74065f775 [qt] dont build UnixDaemon.cpp 2019-06-09 01:04:43 +03:00
48d02f7e09 [qt] update headers, fix ChaCha source name, remove duplicates 2019-06-08 22:24:11 +03:00
e60549f8df [qt] fix build 2019-06-08 21:16:20 +03:00
41f4f4713e handle i2cp.leaseSetPrivKey 2019-06-07 14:51:08 -04:00
213a292fd5 correct offsets for auth data 2019-06-07 11:59:48 -04:00
79630e844b 2.26.0 2019-06-07 17:25:55 +03:00
1c9e46dbb3 2.26.0 2019-06-07 10:04:57 -04:00
0a299284f8 correct check for PSK auth 2019-06-06 13:58:31 -04:00
347a5f7346 pass secret to encrypted LeaseSet2 2019-06-06 12:33:33 -04:00
c6a903572c [HTTP] add PROFIND support 2019-06-06 18:07:17 +03:00
14f0d6d26b extract client auth data 2019-06-05 15:57:20 -04:00
485f105555 fixed typo 2019-06-04 15:12:19 -04:00
686c0b776f common blinding code for public and private keys 2019-06-04 14:47:40 -04:00
828862ea49 store hash for ECDSA blidning 2019-06-03 12:51:57 -04:00
c4dffa4dc8 remove obsolete reseeds 2019-06-01 09:37:02 -04:00
3c1906e3d4 Merge pull request #1360 from khumarahn/openssl
link libi2pd to boost and zlib
2019-06-01 09:28:54 -04:00
7147a3694c link libi2pd to boost and zlib 2019-06-01 12:57:09 +01:00
64707dbb22 key blinding test 2019-05-31 11:57:16 -04:00
554e8eeef3 [appveyor] remove gcc-ada and gcc-objc packages
https://github.com/msys2/MINGW-packages/issues/5434#issuecomment-496706950
2019-05-31 16:32:32 +03:00
5e10549543 disable NTCP by default 2019-05-30 19:18:56 -04:00
685f45bd76 publish/unpublish NTCP2 address depending on network status 2019-05-30 17:52:44 -04:00
61d84dd4c1 publish/unpublish NTCP2 address depending on network status 2019-05-30 17:48:49 -04:00
4d10593bb1 publish/unpublish NTCP2 address depending on network status 2019-05-30 16:11:35 -04:00
fbb8903774 correct buffer size for ECDSA blinding 2019-05-30 13:57:43 -04:00
e8cac91bb7 blind ECDSA public key 2019-05-29 15:48:35 -04:00
7328ffa036 Merge pull request #1359 from rszibele/openssl
BOB modifications.
2019-05-29 14:07:30 -04:00
a03e828317 BOB: status: forgot to pass destination for current tunnel. 2019-05-29 18:47:35 +02:00
93d4dc70cf BOB fixes. 2019-05-29 18:05:03 +02:00
8e3d16e9fb update ipv6 addresses from SSU rather than NTCP or NTCP2 2019-05-29 11:36:58 -04:00
07405e57b9 fixed typo 2019-05-25 14:58:10 -04:00
354c9187db detect our ipv6 address 2019-05-23 15:59:44 -04:00
af33df3004 common buffer size 2019-05-23 11:49:54 -04:00
78bfde237f allocate actual RouterInfo's buffer size 2019-05-23 09:34:04 -04:00
7b9033d678 allocate actual RouterInfo's buffer size 2019-05-23 09:32:07 -04:00
f784cfad46 correct RouterInfo buffer size 2019-05-23 06:56:41 -04:00
e40c139ff1 blind ECDSA private key 2019-05-22 16:15:11 -04:00
edf4f7695d fix #1352. correct response for 'list' command 2019-05-22 12:45:50 -04:00
60ec03237e blidning for ECDSA 2019-05-16 15:49:07 -04:00
a91641e427 fix #823, reindent code 2019-05-16 09:39:22 +03:00
5c3992018f fixed #1350 use GetAddress insted GetIdentHash 2019-05-15 14:22:19 -04:00
f5b682619f [webconsole] move b33 to spoiler, fix typo 2019-05-15 14:15:10 +03:00
743fa745b7 show b33 address for encrypted LeaseSet2 2019-05-14 14:42:10 -04:00
39400fd381 move key blinding code from LeaseSet.cpp to Blinding.cpp 2019-05-14 11:42:25 -04:00
5299ac35a6 create NTCP2 ipv6 address 2019-05-13 11:40:08 -04:00
ef76ed394c publish SSU ipv6 address if NTCP if disabled 2019-05-12 13:36:26 -04:00
1472637de7 skip introducers for non-SSU address 2019-05-11 07:27:34 -04:00
3b8baa85a3 2.25.0 2019-05-09 10:21:11 -04:00
73921b1024 fix ipv6 fallback address 2019-05-08 00:45:52 +03:00
ece140f18c [httpproxy] make addresshelper support configurable for every httpproxy 2019-04-25 23:06:14 +03:00
5e42947fbd always lookup SSU session if peer's endpoint doesn't match 2019-04-25 12:54:44 -04:00
1bfb9b02f5 make sure remote endpoint matches stored with 2019-04-24 11:40:58 -04:00
16a14c2b76 [android] set datadir path from system environment 2019-04-20 19:47:06 +00:00
f6199c6c17 print store hash for encrypted LeaseSet 2019-04-20 09:44:16 -04:00
d7e7f06e88 re-request encrypted LeaseSet 2019-04-17 15:53:07 -04:00
4c4e856a1a ntcp2.addressv6 parameter 2019-04-17 14:40:00 -04:00
07bbbbaf61 fixed gcc 4.7 build 2019-04-17 12:42:43 -04:00
3236827781 add/removed NTCP addresses 2019-04-16 21:04:04 -04:00
0be664cc3d publish NTCP2 address instead NTCP if NTCP is disabled 2019-04-15 16:32:16 -04:00
6cc6849ccc use published timestamp for blinding 2019-04-12 14:05:07 -04:00
5d5cd71714 limit expiration by next midnight for encrypted LS2 2019-04-12 11:13:46 -04:00
d248343517 Handle CreateLeaseSet2 I2CP message for encrypted leasesets 2019-04-11 14:06:53 -04:00
64d800427f allow HTTP headers without value 2019-04-10 15:25:09 -04:00
c4c896a833 publish encrypted LS2 2019-04-10 12:04:19 -04:00
b6b5bb3f75 publish LeaseSet with store hash 2019-04-09 15:36:10 -04:00
5d69bb7383 correct ecrypted LS2 layout 2019-04-09 10:34:05 -04:00
76e222079a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2019-04-09 09:21:47 -04:00
73abb9278d correct ecrypted LS2 size 2019-04-09 09:21:38 -04:00
8fd843e7ce Merge pull request #1334 from rex4539/fix-typos
Fix typos
2019-04-08 17:36:55 -04:00
6a497a23d9 Fix typos 2019-04-08 22:22:42 +03:00
3ac74e1091 create encrypted LS2 2019-04-08 13:27:21 -04:00
ef0fb48f1f blind private keys 2019-04-05 16:03:58 -04:00
414ef2bc3d fixed gcc 4.7 build 2019-04-04 16:18:52 -04:00
ea791309ad moved credential and blinding to BlindedPublicKey 2019-04-02 16:32:18 -04:00
706da6e431 allow .b32.i2p in jump links 2019-04-02 13:11:49 -04:00
ed116e7cea add gcc 9 support 2019-03-30 13:05:32 +03:00
5b56f4007b counter is always in Little Endian 2019-03-29 18:45:31 -04:00
e2071542bf use 16 bytes iv for chacha20 2019-03-29 16:18:51 -04:00
cdb217b774 always initialize m_Pkey 2019-03-29 13:15:32 -04:00
079798940b lookup for b33 address 2019-03-29 11:59:59 -04:00
f1c24689bf fixed #1319. send correct response 2019-03-29 09:29:28 -04:00
1f9cf6ed7c show lookup keys 2019-03-28 19:00:56 -04:00
43f218410f correct b33 address length threshold 2019-03-28 18:48:38 -04:00
3fd9d5f641 save b33 addresses 2019-03-28 16:06:53 -04:00
f5ab8f2062 replaced GetIdentHash by GetAddress 2019-03-28 12:19:19 -04:00
8774a8fbc2 handle b33 addresses in I2P tunnels 2019-03-28 10:17:03 -04:00
6f4f0f03d2 handle b33 addresses in I2P tunnels 2019-03-28 09:57:34 -04:00
00b5fdce03 create stream to blinded dest 2019-03-27 16:04:46 -04:00
baee6a0d91 generic address for AdressBook 2019-03-27 15:19:10 -04:00
ff44bcc489 complete implementation of RedDSA 2019-03-24 18:42:52 -04:00
c797ac4268 Update README.md 2019-03-23 03:25:10 +03:00
d22a76d4d1 remove incorrect line 2019-03-22 23:40:59 +00:00
a6642e0ebc add script for packaging archive with android binaries 2019-03-22 23:37:20 +00:00
3d4d260a34 extract b33 address 2019-03-22 16:04:47 -04:00
8e4b9da97d pass blinded key instead identity for encrypted LS2 2019-03-22 15:32:13 -04:00
2be80ba30f Fix Docker build 2019-03-22 13:14:02 -04:00
2e44c88d6c [2.24.0][android] update addressbook 2019-03-21 18:34:39 +03:00
21eb1ce6c9 2.24.0 2019-03-21 11:30:12 -04:00
cdfd411df7 2.24.0 2019-03-21 10:58:59 -04:00
a6149ca90c [android] upload gradlew script 2019-03-21 00:09:49 +03:00
642435486c [android] add gradle wrapper, update buildtools version, fixes in code. 2019-03-20 23:49:54 +03:00
fc84d6c4b7 remove unused timer 2019-03-17 21:37:42 -04:00
aa4bddd6ec common HKDF 2019-03-15 12:25:20 -04:00
8ec12a1b65 fixed race condition for publishing 2019-03-10 09:22:42 -04:00
0fbf552e95 lookup and handle encrypted LeaseSet2 2019-03-07 14:52:59 -05:00
09b1b120d7 update LeaseSet2 if store type changed 2019-03-07 14:51:05 -05:00
557244bc3f verify blinding key for encrypted LS2 2019-03-07 11:55:47 -05:00
24c5ed1cff calculate store hash for encrypted LeaseSet2 2019-03-06 16:08:04 -05:00
32e55ebd0c blind public key for encrypted LeaseSet2 2019-03-05 15:51:24 -05:00
ea3070d02b derivation of subcredentials for LeaseSet2 2019-03-05 12:41:01 -05:00
9aaba49a9f decrypt and handle Layer 2 of encrypted LeaseSet 2 2019-03-04 15:47:35 -05:00
9b64be07a9 set chacha20 counter to 1 2019-03-04 15:08:03 -05:00
42c3c28ea7 [addressbook] reset eTags if addressbook can't be loaded 2019-03-04 18:29:29 +00:00
9e9236badb don't check TRANSIENT destination 2019-03-04 07:35:48 -05:00
560ebcec8d persist.addressbook parameter added 2019-03-01 14:42:20 -05:00
9b1fe4338b reuse_address for ipv6 acceptor 2019-02-28 16:00:26 -05:00
9188e3ad3f ChaCha20 decrypt 2019-02-28 13:31:51 -05:00
af65af5be9 H and HKDF for encrypted LeaseSet2 2019-02-27 15:52:47 -05:00
2f0115c300 handle RedDSA as EdDSA 2019-02-27 13:18:09 -05:00
0646461342 check published timestamp for LeaseSet2 2019-02-26 16:20:24 -05:00
ec30ec0996 Merge pull request #1304 from lifecoder-phoenix/openssl
Fix #1257
2019-02-25 07:01:33 -05:00
cdecb7a43c Fix #1257 2019-02-25 10:10:09 +01:00
aa9c1b66a0 Fix #1257 2019-02-25 09:57:18 +01:00
846eac29dc filter out unspecified addresses. Check floodfill status change 2019-02-24 18:26:58 -05:00
0f9e3c5b33 fix crash if public key is null 2019-02-22 13:17:43 -05:00
aa27746982 remove address string 2019-02-22 11:03:31 -05:00
d8a4954bf1 [NetDb] check PersistProfiles on load
* tabulation fixes
2019-02-22 18:37:32 +03:00
d40a029dae eliminate extra copy 2019-02-20 12:36:05 -05:00
96d961c393 correct public key for EdDSA trasient key 2019-02-15 15:03:58 -05:00
7b6814e32d correct flags 2019-02-14 21:22:49 -05:00
6fee2d3536 correct options szie 2019-02-14 17:49:23 -05:00
636fc633d4 send offline signature in streaming 2019-02-14 12:11:25 -05:00
72a239838e publish offline signature 2019-02-12 14:56:39 -05:00
a463dbc5fb Merge pull request #1295 from l-n-s/websocket_support
Support websocket connections over HTTP proxy
2019-02-12 12:30:44 -05:00
016ae3b9e9 rewrite for efficiency 2019-02-12 11:20:54 -05:00
7d0d421724 [windows] handle unexpected conditions (#1185) 2019-02-12 04:27:09 +03:00
83b5856a19 fix overflow warning, fix little typos 2019-02-12 03:09:29 +03:00
f617b27110 Support websocket connections over HTTP proxy 2019-02-11 17:18:01 -05:00
a91a0263cf update outproxy user-agent header rewrite 2019-02-12 00:51:47 +03:00
80ffe13f3e correct offline signature layout 2019-02-08 15:12:51 -05:00
1eb726c9bb create offline keys 2019-02-08 12:19:51 -05:00
1fa3ba8b42 read offline info 2019-02-07 16:04:31 -05:00
b6bfd66a49 use identity from LeaseSet 2019-02-06 21:19:44 -05:00
1be0e7ddaa [windows] add functional
* check tunnels count on graceful shutdown
* add tray menu item for accept/decline transit tunnels
2019-02-07 02:02:28 +03:00
2cac9b03ff common code for offline signatures 2019-02-06 13:36:03 -05:00
f5f4190803 catch error 10045 on stopping SAM acceptor (#1233), fix warning in util 2019-02-06 03:03:37 +03:00
a14d554947 fix tray icon disappearing, var type warning, code tabulation 2019-02-06 00:24:01 +03:00
6d9e5147b5 handle offline signature 2019-02-05 15:32:18 -05:00
841452cb9e Merge pull request #1292 from PurpleI2P/inet_pton_xp
inet_pton for winxp
2019-02-05 17:36:36 +03:00
9c76368dbc inet_pton for winxp 2019-02-05 14:13:23 +03:00
bd5122c6ea fixed build error 2019-02-01 17:41:12 -05:00
6643258618 implement Update for LeaseSet2 2019-02-01 12:55:13 -05:00
bc3f02cb6b fix #1290. copy correct size if message didn't fit previous 2019-01-31 16:03:10 -05:00
d848ae332a encryption keys priority 2019-01-30 14:10:40 -05:00
08ddc98303 initial LeaseSet2 support in I2CP 2019-01-29 11:30:31 -05:00
a3344c4290 resolve SIGNATURE_TYPE string values 2019-01-23 10:52:17 -05:00
22c1ce3ea5 don't pick port 9150 (Tor browser) 2019-01-23 09:53:30 -05:00
afb14e6782 [fedora] fix build in release on fc30+
fixes #1284
2019-01-22 04:57:53 +03:00
e177363377 [fedora] specify srcdir only if building at 30+ 2019-01-22 04:08:52 +03:00
ce213934c9 try fix build in fedora rawhide 2019-01-22 02:33:44 +03:00
af286ec52e try fix build in fedora rawhide 2019-01-22 02:32:51 +03:00
f7f2b7607b 2.23.0 2019-01-21 18:51:04 +03:00
60a282826c 2.23.0 2019-01-21 10:33:22 -05:00
3eba599aec [android] add addressbook in assets
Sources:
http://inr.i2p/export/alive-hosts.txt
http://stats.i2p/cgi-bin/newhosts.txt
http://i2p-projekt.i2p/hosts.txt
http://identiguy.i2p/hosts.txt

Updated: January ‎18, ‎2019, ‏‎12:00:01 PM
2019-01-18 23:59:22 +03:00
74d876f145 [android] update russian strings, add tunnels.d to assets list 2019-01-18 18:43:48 +03:00
d7609f119c [android] build libi2pd staticly, add update strings, fix messages 2019-01-18 15:44:30 +03:00
65c2c7d80b re-create LeaseSet if store type has changed 2019-01-16 19:00:17 -05:00
468a32a819 check LS2 transient key expires time 2019-01-15 18:56:26 -05:00
b89cf73ae2 correct encryption key type for LS2 2019-01-15 18:41:00 -05:00
9cf43dea1a handle i2cp.leaseSetEncType 2019-01-15 15:43:21 -05:00
670ffe2078 show LS2 in Leasets' list 2019-01-14 18:39:02 -05:00
884cf756ed remove invalid leasesets 2019-01-14 18:37:17 -05:00
e44ba54857 show correct LeaseSet's store type 2019-01-14 16:34:43 -05:00
3712749a94 extract timestamp for LS2 2019-01-14 13:49:27 -05:00
6569c4aa03 actual key size for LS2 2019-01-13 19:17:02 -05:00
d6b2b3c996 take key type for LS2 from identity 2019-01-13 08:34:34 -05:00
06c7900ece show LeaseSet type in destination 2019-01-12 18:26:31 -05:00
52a6a12a9a correct LS2 creation 2019-01-12 18:25:10 -05:00
e647603dce handle i2cp.leaseSetType parameter 2019-01-11 13:58:02 -05:00
dadf6174ba create standard LS2 2019-01-10 11:52:34 -05:00
84de7675c4 don't copy LS2 for signature verification 2019-01-10 10:57:57 -05:00
6311a80d0e use clang for android binary build 2019-01-10 09:47:11 -05:00
9504e69598 LocalLeaseSet2 added 2019-01-09 14:51:47 -05:00
5398b651f7 handle LS2 in destinations 2019-01-09 12:47:47 -05:00
b5596c4596 handle encrypted LS2 2019-01-08 11:26:50 -05:00
fdcea5537c show LeaseSet's store type 2019-01-08 09:35:15 -05:00
8ca8bc810d take elgamal percomputation from config 2019-01-08 09:23:14 -05:00
8f909b051f Merge pull request #1281 from neheb/b
Fix compilation without deprecated OpenSSL APIs
2019-01-06 20:12:51 -05:00
90f2b2d249 Fix compilation without deprecated OpenSSL APIs 2019-01-06 15:39:24 -08:00
f74b27c58c check if chacha20 and poly1305 is presented in openssl build 2019-01-06 17:43:05 -05:00
3f091f4748 remove i2pd-qt android project (closes #1279) 2019-01-06 19:46:17 +03:00
d84c9ad611 Merge pull request #1277 from l-n-s/update_zlib_version
CMake: bump version of ZLib
2019-01-04 23:48:44 +03:00
e55e15693d update LS2 leases 2019-01-02 15:40:48 -05:00
c54e6bafdb process meta LS2 2019-01-02 14:19:10 -05:00
2e56c4895d transient key signature verification 2019-01-02 09:43:18 -05:00
bce4224d6e extract and verify LS2 transient key 2019-01-01 17:00:37 -05:00
812e2814bc read flags from LS2 header 2018-12-31 14:23:48 -05:00
7cd17f8e1f build android app with llvm 2018-12-27 03:16:38 +03:00
6193b06708 LS2 signature verification and store type 2018-12-26 15:27:32 -05:00
12af68bdb5 initial support of LeaseSet2 2018-12-21 15:00:03 -05:00
881f7e9062 correct Authorization header 2018-12-21 10:50:23 -05:00
1db4076bbd CMake: bump version of ZLib 2018-12-19 12:19:30 -05:00
1933e44719 reseeds update 2018-12-17 20:14:12 -05:00
25441cb650 revert mingw makefile
ref: https://github.com/Alexpux/MINGW-packages/issues/4773
2018-12-14 21:44:38 +03:00
bc755ac32f [MSYS2] add boost version detection via pacman 2018-12-14 15:43:52 +03:00
1fa34be52a update mingw makefile 2018-12-14 09:29:41 +03:00
f7a6d57855 fixed bug with loval destination shared between http and socks proxy 2018-12-13 09:53:16 -05:00
8a987af244 initialize m_Pkey 2018-12-11 15:14:51 -05:00
65cbb06080 create ephemeral keys after getting connected 2018-12-07 19:24:46 -05:00
979ea9c252 removed address resolvers as discontinued 2018-12-07 12:27:06 -05:00
aa1f4ee72a fixed possible race condition 2018-12-07 12:25:26 -05:00
74ce485b73 EdDSA signatures by default 2018-12-06 13:13:20 -05:00
165e6508f8 EdDSA signatures by default 2018-12-05 14:58:50 -05:00
c7af2889fa removed dummy initializer 2018-12-05 14:56:40 -05:00
5ab3390434 don't create dummy initializer for android 2018-12-05 11:39:48 -05:00
67f60f1889 set openssl no_config before boost::asio:ssl 2018-12-04 21:20:12 -05:00
985a468d0f don't read openssl config file 2018-12-04 18:39:49 -05:00
34dc6fbdc1 check if session is terminated before sending 2018-12-04 16:10:52 -05:00
b57152cc25 common code for padding and sending termination and RouterInfo messages 2018-12-04 15:56:55 -05:00
dc9562e430 padding for termination message 2018-12-04 15:23:43 -05:00
05689fe183 padding for short messages 2018-12-04 15:00:10 -05:00
8f6f95211e eliminate extra copy of RouterInfo 2018-12-04 12:56:49 -05:00
f30b6c9e6e const reference to vector of buffers 2018-12-04 12:54:48 -05:00
12ac7d6a00 enable sending I2NP messages 2018-12-03 18:47:20 -05:00
10251a6447 fixed typo 2018-12-03 15:54:35 -05:00
089cbbc20a rollback 2018-12-03 14:51:27 -05:00
95ab68acd1 don't copy I2NP messages to NTCP2 frame 2018-12-03 14:14:36 -05:00
abc4f6c70b fixed bug with chacha20 encryption of short messages 2018-12-03 13:36:17 -05:00
8fc3a1f9c9 correct frame size for I2NP msgs 2018-12-03 12:29:24 -05:00
5c3d0fc02c create I2NP blocks 2018-12-02 17:24:31 -05:00
7efb47fed4 send NTCP2 frame from I2NP messages 2018-12-02 14:24:39 -05:00
7692332f0e don't inialize Chacha20 state twice 2018-11-30 21:31:06 -05:00
ef6db64e9f correct chacha20 for multiple messages 2018-11-30 16:21:11 -05:00
e68f1dbc99 AEAD/Chacha20/Poly1305 encrypt multiple buffers 2018-11-30 14:41:14 -05:00
0c9ebc36d4 remove AVX and SSE for CipherBlock XOR 2018-11-27 14:33:31 -05:00
fcd6eb7801 overwrite user-agent for outproxy requests 2018-11-27 19:57:40 +03:00
328c2182c2 alignment for tunnel message AES decryption 2018-11-27 10:35:17 -05:00
08706f5dfb fixed typo 2018-11-25 18:49:59 -05:00
d49f165f0d fixed build warning 2018-11-25 15:59:00 -05:00
cf0fc3a4a9 some performance improvements 2018-11-25 10:33:48 -05:00
72c8fd257c eliminate extra buffer for Poly1305 2018-11-24 15:39:37 -05:00
fa620e41a4 correct alignment for polyKey 2018-11-24 14:41:17 -05:00
b07f851ce7 Merge pull request #1272 from majestrate/openssl
expose poly1305 digest struct in poly1305.h
2018-11-24 14:24:09 -05:00
16b3108719 Merge remote-tracking branch 'purple/openssl' into openssl 2018-11-24 10:08:12 -05:00
f385c624c7 expose poly1305 digester 2018-11-24 10:07:17 -05:00
f7e9975192 restore BlockCipher XOR using SSE 2018-11-24 09:43:30 -05:00
cde989b59d don't compile compatibility code if openssl 1.1.1 2018-11-22 12:13:16 -05:00
c0e263abd3 default value for m_PersistProfiles 2018-11-22 11:30:44 -05:00
79c0c11e80 configure persist of peer profiles
* If persist.profiles = false, peer profiles not stored on disk
* remove inet_pton for windows
* update configs
2018-11-22 00:13:23 +03:00
ca671551c8 flood NTCP2 RouterInfo if requested 2018-11-21 13:24:54 -05:00
42ed312384 handle NTCP2 RouterInfo flag 2018-11-21 11:23:48 -05:00
0e9074aaba reduce start and stop time 2018-11-20 13:57:51 -05:00
7c1961d4ef Cancel Graceful Stop 2018-11-20 12:36:10 -05:00
71e57717c2 request memory permisssion for android >= 6 2018-11-19 15:53:16 -05:00
8a549b83a2 NTP sync in separate thread 2018-11-16 12:49:04 -05:00
d7081c5f23 handle RouterInfo from NTCP2 in netdb's thread 2018-11-14 20:52:54 -05:00
588d64a30b more NTP logging 2018-11-14 12:27:11 -05:00
8335bdf3d4 correct ntp servers 2018-11-14 11:47:50 -05:00
85394f2438 NTP time sync 2018-11-14 11:06:53 -05:00
42b556574f add fedora copr mageia support 2018-11-11 22:28:34 +03:00
f34e65ad9e Merge pull request #1268 from sokolas/webroot
Added configurable web console URL path
2018-11-10 15:08:40 -05:00
51352a6819 update debian/rpm tunnels.d storing
+ testing rpm changes: manpage and configs store
2018-11-10 03:28:24 +00:00
d9887ec370 bump i2pd version in appdata manifest 2018-11-09 14:05:10 -05:00
c994950aaf default webroot in config, webroot in automatic redirect instead of request path 2018-11-09 17:42:04 +03:00
a26ed6fe6c Merge remote-tracking branch 'upstream/openssl' into webroot 2018-11-09 16:30:54 +03:00
a12a7e73f9 redirect with webroot 2018-11-09 16:13:56 +03:00
779228857e 2.22.0 2018-11-09 02:22:55 +00:00
8d0b696d33 packages - tunnels.conf.d fix configs place, links 2018-11-07 18:41:04 +03:00
23ae220aa7 add webroot setting 2018-11-07 18:07:05 +03:00
b7940e0002 add tunnels.d to packages 2018-11-06 20:04:26 +03:00
b3fd8bd0ae check if keys are available before sending termination message 2018-11-04 18:51:25 -05:00
bffeb237de termination might be send for non-established session 2018-11-04 15:32:31 -05:00
23e3602ea1 common MixHash 2018-11-01 16:06:39 -04:00
34cfd205f6 create new static keys by X25519Keys 2018-11-01 10:43:31 -04:00
df3da8be7a Merge pull request #1264 from l-n-s/desktop
fix appdata manifest
2018-10-31 17:24:39 +00:00
940243f45e fix appdata manifest 2018-10-31 13:23:13 -04:00
75d6599143 Update desktop files (#1263)
* Rename files to freedesktop standarts

* Add application icons
2018-10-31 12:23:16 +00:00
929a27a5ac Add Desktop files (#1261)
* Add appstream and desktop files

* More metadata in appstream file
2018-10-30 07:48:02 +00:00
82ddee2104 Merge pull request #1260 from l-n-s/version_display
Add --version flag to display i2pd and system libraries versions
2018-10-28 11:01:46 -04:00
a141678119 Add --version flag to display i2pd and system libraries versions 2018-10-28 10:52:22 -04:00
96d109af81 fixed typo 2018-10-27 19:55:23 -04:00
a309eb9f3c faster CipherBlock XOR implementation for non-AVX 2018-10-27 18:41:05 -04:00
d034dab265 fill m3p2 with SessionRequest 2018-10-26 09:58:18 -04:00
883a035e5c Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2018-10-22 12:26:49 -04:00
08603091c5 2.21.1 2018-10-22 14:21:52 +00:00
a2e84e5a1e 2.21.1 2018-10-22 09:19:39 -04:00
d148898ad7 Merge remote-tracking branch 'purple/openssl' into openssl 2018-10-22 07:35:34 -04:00
9439621849 fixed #1259. read extra tunnels from tunnels.d 2018-10-19 15:23:46 -04:00
36cf622979 Merge pull request #1258 from PurpleI2P/openssl
long I2NP messages
2018-10-15 09:30:56 -04:00
15ded89618 set cost=14 for unpublished NTCP2 addresses 2018-10-11 13:00:37 -04:00
b84f74c167 limit SSU message size to 32K 2018-10-11 11:17:14 -04:00
a97300f8be fixed #1256 I2NP messages up to 64K 2018-10-10 11:31:55 -04:00
9e12cff317 fix #1253 handle incorrect values of SIGNATURE_TYPE and CRYPTO_TYPE 2018-10-08 15:03:41 -04:00
ecdf1f4ddc updated debian patches, add patch disabling few settings in service file, fix name in control file 2018-10-05 13:44:18 +00:00
2fa7a48163 2.21.0 2018-10-04 10:17:33 -04:00
5e31e533e2 Merge pull request #1249 from PurpleI2P/openssl
2.21.0
2018-10-04 09:47:29 -04:00
8adf76dcc9 2.21.0 2018-10-04 09:46:10 -04:00
15899c10b2 2.21.0 2018-10-04 09:38:04 -04:00
05ff05ea4b Merge pull request #1246 from 3pdotsif/openssl
added NTCP2 to qt.pro ; fix for #1111
2018-10-02 11:33:07 -04:00
bd62df48c2 added NTCP2 to qt.pro ; made tunnel conf param keys be optional (fixes #1111) 2018-10-02 23:09:01 +08:00
2366cbc833 count outgoing tags 2018-10-01 18:11:44 +03:00
25fb609544 [appveyor] make it work again
Temporary fix. Read: https://github.com/Alexpux/MSYS2-packages/issues/1428
Waiting for https://github.com/Alexpux/MSYS2-packages/pull/1430
2018-09-30 23:24:48 +03:00
af793395f0 don't publish O with X or P 2018-09-30 16:08:26 -04:00
8f41776858 check send queue size 2018-09-28 09:54:42 -04:00
139b13b8d1 openssl 1.1.1/boost 1.64 for andoroid binary only 2018-09-27 10:31:32 -04:00
4c611a5be1 Merge pull request #1243 from PurpleI2P/android-26up-service
try to fix working of service on api 26+
2018-09-25 11:42:34 -04:00
5e7a21e177 try to fix working of service on api 26+ 2018-09-25 03:37:34 +03:00
5f7dda5ba8 treat extra bandwidth as high bandwidth 2018-09-22 14:12:46 -04:00
2dfa1ca0f2 check RouterInfo's timestamp in SessionConfirmed 2018-09-21 11:45:04 -04:00
358cdcf4c4 removed RSA signatures completly 2018-09-21 11:16:38 -04:00
c8f4ace5c4 update timestamp before publishing 2018-09-21 10:13:18 -04:00
5cac6ca8bb read message body immediatly after length 2018-09-17 13:08:49 -04:00
fccad71df1 temporary buffer for EdDSA signature for openssl 1.1.1 2018-09-16 18:08:59 -04:00
97ae2674dc always use EdDsa signer fallback 2018-09-14 21:54:45 -04:00
7c70affd7f eddsa signer fallback 2018-09-14 21:23:16 -04:00
52ff568d86 fixed incorrect second signature 2018-09-14 18:58:40 -04:00
b917aeaa0b openssl 1.1.1/boost 1.64 for android 2018-09-13 09:43:10 -04:00
8de443ec4c siphash from openssl 1.1.1 2018-09-11 13:26:29 -04:00
7d9893c614 fixed build error 2018-09-09 17:27:53 -04:00
3540712517 some cleanup 2018-09-09 08:38:12 -04:00
a8b1a86bd7 X25519Keys for static key 2018-09-08 22:08:08 -04:00
1babd3a5a2 separate X25519Keys 2018-09-08 16:52:42 -04:00
5ecd04dd4f Merge pull request #1240 from PurpleI2P/openssl
eddsa from 1.1.1
2018-09-08 16:22:12 -04:00
50399e5194 fix #1238 (#1239) 2018-09-06 21:27:28 +00:00
b734acf1b1 -latomic for gcc >= 5 only 2018-09-06 11:19:10 -04:00
33aa8e2471 use x25519 from openssl 1.1.1 for ephemeral keys 2018-09-05 11:19:58 -04:00
2c58fe736b fixed build error with openssl 1.1.1 2018-09-05 09:51:03 -04:00
6fe1de5d86 fix make target dependecy 2018-09-04 10:51:44 +03:00
064460b95f osx makefile changes
Move install target from osx to homebrew
use openssl 1.1.0 when building with brew
2018-09-04 10:39:46 +03:00
2c3b19a539 use EdDSA from openssl 1.1.1 2018-09-03 17:39:49 -04:00
dc30a4c1ae Merge pull request #1234 from l-n-s/fix_typo
Fix typo
2018-09-02 15:50:22 -04:00
86e9901bf2 Fix typo 2018-09-02 15:39:23 -04:00
6519e0835a fixed typo 2018-09-02 07:51:58 -04:00
a52344fc01 Merge pull request #1226 from radfish/PR--make-latomic
makefile: linux: add -latomic
2018-09-01 13:31:17 -04:00
b67424643d done insert NTCP2 ipv6 address twice 2018-08-27 18:56:57 -04:00
575a4c01c9 publish NTCP2 adress if port is specified 2018-08-27 18:35:35 -04:00
f0d4ee6618 pass NTCP2 ipv6 address 2018-08-27 16:01:47 -04:00
8753186a0d publish NTCP2 ipv6 address if applicable 2018-08-27 15:01:43 -04:00
ff8fb8000d Merge pull request #1231 from majestrate/fix-socks-outproxy
enable outproxy on socks
2018-08-26 10:20:39 -04:00
9dd38b99d6 check NTCP2 for addreses comparison 2018-08-26 09:40:27 -04:00
dfe08c1ec9 enable outproxy on socks 2018-08-26 09:24:11 -04:00
fb26e78ecc Merge branch 'openssl' of https://github.com/purplei2p/i2pd into openssl 2018-08-25 14:03:21 -04:00
4c687036c4 enable socks outproxy 2018-08-25 14:01:57 -04:00
062d8d0f4f fixed potential race condition 2018-08-25 13:27:03 -04:00
73b6338f62 Merge pull request #1229 from PurpleI2P/openssl
2.20
2018-08-23 11:21:49 -04:00
c0d1e2c07a 2.20 2018-08-23 18:10:05 +03:00
e70feceafe add install target in OSX Makefile for homebrew formula 2018-08-23 18:06:37 +03:00
71ac0286b1 2.20.0 2018-08-23 10:24:44 -04:00
022f4d2c11 don't send message to not established session 2018-08-23 07:23:50 -04:00
a83a839cff Build docker image from openssl branch 2018-08-22 18:22:54 -04:00
b259ee89aa send RouterInfo from NTCP2Server's thread 2018-08-22 12:33:43 -04:00
65cf14bfce update android miniupnpc to 2.1 2018-08-20 01:01:27 +03:00
d9476fb5ca set correct IV when NTCP2 address gets published 2018-08-19 16:17:57 -04:00
9882365ab4 fix NTCP IPv6 category name in transports, add conversion for leasesets expiring time 2018-08-18 22:56:31 +00:00
2d758ce963 change cost for NTCP and NTCP2 2018-08-18 13:52:35 -04:00
1dd003d26a check m2p3len 2018-08-18 08:27:36 -04:00
0df5b77595 makefile: linux: add -latomic
Tested on Arch Linux and Debian unstable with gcc 8.2.0. On Arch Linux
on x86_64 it built without this, but also builds with this. Without this
patch On Debian unstable on PPC linking fail with undefined symbols:
/usr/include/c++/8/bits/atomic_base.h:396: undefined reference to `__atomic_load_8'
2018-08-17 23:24:37 -04:00
e190a005db make sure assets are ready before proceed 2018-08-17 11:17:17 -04:00
45596a0342 android - holder-based updater for certificate
If holder exsists, check string (version) of assets creation.
If it differs from current app version or null, try delete certificates forder contents
for unpacking new certificates.
2018-08-17 01:41:26 +03:00
405429a300 android - add file for notify about successful unpacking assets 2018-08-16 23:34:05 +03:00
d009a29426 android - dont rewrite files from assets if they exist 2018-08-16 23:34:04 +03:00
f1fb42460a rename ipv6 transports 2018-08-16 23:34:04 +03:00
5e110e9f7b enable NTCP2 by default 2018-08-16 13:48:47 -04:00
77a409935d license added 2018-08-16 13:46:59 -04:00
863baeb68b ignore unpublished addresses 2018-08-16 11:02:53 -04:00
11142690a0 show correct value of time drift 2018-08-16 10:13:32 -04:00
02e8c5faca fixed typo 2018-08-15 13:23:10 -04:00
c41081d35c check timestamps 2018-08-15 11:42:56 -04:00
db4c26a400 copy assets before daemon start 2018-08-15 09:52:13 -04:00
331a23fc20 build JNI for arm v7a and x86 both 2018-08-14 22:44:08 +03:00
db5a40d743 enable NTCP2 for android, use L flag for bandwidth,
additional change for multiarch build
2018-08-14 22:41:12 +03:00
e4ab51329d move handshake messages processing to NTCP2Establisher 2018-08-14 14:01:04 -04:00
8490e7ca7c Merge pull request #1223 from PurpleI2P/openssl
recent changes
2018-08-14 13:50:44 -04:00
86782aeb1b don't send RouterInfo twice 2018-08-14 11:27:27 -04:00
49a44fc92e assume siphash IV in Litte Endian 2018-08-13 14:07:57 -04:00
cd39a52c25 correct endianness for siphash length 2018-08-13 13:43:51 -04:00
634101ceb5 Update HTTPServer.cpp
Fix transport sections in web interface 2
2018-08-13 22:29:58 +05:00
55555c8787 Merge pull request #1222 from PurpleI2P/show-transports
Update HTTPServer.cpp
2018-08-13 12:43:31 -04:00
d36d825ac1 Update HTTPServer.cpp
Fix transport sections in web interface
2018-08-13 21:41:43 +05:00
9bb01cd67c Merge pull request #1221 from l-n-s/issue_1220
Don't add SSU/NTCP addresses to RI if they are disabled in config
2018-08-12 13:19:56 -04:00
29b91075d2 Don't add SSU/NTCP addresses to RI if they are disabled in config (#1220) 2018-08-12 02:36:00 -04:00
6d46fc9f9f check send frame error code 2018-08-11 16:08:21 -04:00
a2c41c9e36 allow NTCP2 only transports 2018-08-10 15:35:43 -04:00
ee700ac861 fixed incorrect iv for published NTCP2 addresses 2018-08-10 15:14:07 -04:00
9884a4336f don't connect to NTCP2 only address using NTCP 2018-08-10 13:42:59 -04:00
5b83d4bef8 move handshake messages creation to NTCP2Establisher 2018-08-10 10:53:34 -04:00
d320a89590 don't copy buffer to ifself 2018-08-09 16:32:43 -04:00
f7e4afc282 use same buffer for input and output for AEAD/Chacha20/Poly1305 2018-08-09 15:47:02 -04:00
88e87d589b add incoming NTCP2 session to the sessions list 2018-08-09 14:20:10 -04:00
d8c6dede7e moved NTCP2 handshake buffers to establisher 2018-08-09 12:53:36 -04:00
5cc84133e3 fixed incorrect lenght 2018-08-08 17:38:21 -04:00
f7728aa1f6 reuse NTCP2 frame buffers 2018-08-08 16:23:44 -04:00
2b61f9a731 fixed #1217. verify decryption result 2018-08-07 10:35:25 -04:00
f407022fe6 connect to NTCP2 address if presented 2018-08-04 13:48:09 -04:00
41b9f19b01 get unpublished NTCP2 address 2018-08-04 08:47:58 -04:00
09c6faf923 don't overwrite NTCP2 keys 2018-08-03 21:16:35 -04:00
26d0177c01 always make NTCP address first 2018-08-03 20:28:29 -04:00
f7415c8a8f enable/disable NTCP2 address 2018-08-03 14:49:28 -04:00
4cf79088f9 NTCP2 idle timeout 2018-08-03 13:19:35 -04:00
50cd321818 NTCP2 idle timeout 2018-08-03 13:10:32 -04:00
83bbe6a9d9 show NTCP2 address 2018-08-03 12:07:09 -04:00
0a33c18e36 send termination message 2018-08-02 15:31:15 -04:00
6cf158ac63 check RouterInfo from SessionConfirmed 2018-08-02 13:58:47 -04:00
f96bfa6afa send RouterInfo 2018-08-02 12:42:39 -04:00
2b64cf9126 publish i in correct place for NTCP2 2018-08-01 12:28:34 -04:00
a8dcfc44f5 handle termination message 2018-08-01 09:43:48 -04:00
0ff9c9da27 complete Bob side of NTCP2 2018-07-31 15:41:13 -04:00
07e7c2d852 ntcp2.published and ntcp2.port parameters 2018-07-31 12:59:38 -04:00
10e4b5b2a3 ignore NTCP2 addresses 2018-07-23 15:44:36 -04:00
998653ea9d NTCP2 acceptors 2018-07-23 15:30:51 -04:00
1a38e925bf publish NTCP2 address 2018-07-23 13:51:29 -04:00
c8f51380e6 publish NTCP2 for new routers 2018-07-21 16:59:58 -04:00
2406d57d51 update android target API to 28, use gradle and ndk parallel building 2018-07-21 00:02:54 +03:00
cb1e47eb71 use preconfigured configs for android package 2018-07-20 23:15:22 +03:00
c0a650f28b update gitignore 2018-07-20 23:04:29 +03:00
460cf6fd20 update windows build script, change makefile.mingw line ending 2018-07-20 22:57:47 +03:00
5bedfc1c84 post I2NP messages to NTCP2 thread 2018-07-19 12:46:19 -04:00
5001592fb4 replace ntcp2 by ntcp2.enabled 2018-07-19 09:45:24 -04:00
f6495e59c5 better MixHash 2018-07-19 09:27:59 -04:00
66bf431481 correct KDF1 calculation 2018-07-18 16:27:43 -04:00
d9685e991e handle RouterInfo block 2018-07-18 15:57:18 -04:00
e0790700cd don't connect to unpublished NTCP2 addresses 2018-07-18 14:19:12 -04:00
910a9600bd display NTCP2 session in web console 2018-07-18 12:58:29 -04:00
fc52b2b940 fixed typo 2018-07-18 12:56:46 -04:00
b99f828583 send I2NP messages through NTCP2 2018-07-18 11:16:40 -04:00
f38891cace fixed build for gcc < 4.8 2018-07-18 11:15:27 -04:00
8c5111e11a handle NTCP2 I2NP messages 2018-07-17 15:17:05 -04:00
5575b981c8 enable NTCP2 as transport 2018-07-13 15:59:28 -04:00
0b36732911 Merge pull request #1212 from yangfl/upstream
fix typo
2018-07-10 06:59:35 -04:00
52f3081a40 fix typo 2018-07-10 17:39:21 +08:00
00c71dc26a handle SessionConfirmed 2018-07-09 15:56:23 -04:00
5218c8584f some refactoring of NTCP2 code 2018-07-04 14:15:40 -04:00
6054bd6621 NTCP2 session establisher 2018-07-03 16:26:02 -04:00
55af4ed385 delete old AESNI definition 2018-06-29 02:30:03 +03:00
64aee9c8ae add DEBUG option for make
By default, binary will be built without stripping debug symbols
2018-06-29 02:27:19 +03:00
5233e72205 add assets symlinks 2018-06-27 23:56:52 +03:00
db5b45222a store and install assets on android 2018-06-27 23:56:52 +03:00
fc4787da4e Merge pull request #1207 from AMDmi3/defined-in-macro
Fix "macro expansion producing 'defined' has undefined behavior" clang warning
2018-06-27 15:36:34 -04:00
4ffbb46cf9 Fix "macro expansion producing 'defined' has undefined behavior" clang warning 2018-06-27 22:31:01 +03:00
c3c2550f17 Merge pull request #1205 from AMDmi3/fix-cpp-lib
Limit tampering with standard C++ library to Linux
2018-06-27 11:01:22 -04:00
41e8ab5383 Limit tampering with standard C++ library to Linux
Otherwise it breaks e.g. FreeBSD build where it is not needed at all
2018-06-27 17:47:22 +03:00
a802940616 Merge pull request #1204 from yangfl/upstream
use builtin __AVX__ and __AES__ macros and reduce code duplication
2018-06-27 07:08:26 -04:00
dec848f072 use builtin __AVX__ and __AES__ macros and reduce code duplication 2018-06-27 17:32:38 +08:00
fb229d4064 Merge pull request #1203 from PurpleI2P/openssl
2.19
2018-06-26 13:58:07 -04:00
fc16e76af1 2.19.0 2018-06-26 17:46:01 +00:00
0dff636dbe 2.19.0 2018-06-26 13:38:02 -04:00
00df3f8d4e 2.19.0 2018-06-26 13:36:30 -04:00
34c45f2694 update debian changelog 2018-06-26 20:05:33 +03:00
a188de2e5c increase limits by default, fix symbolic links, change rules 2018-06-26 20:05:33 +03:00
27fbf67352 add systemd configs, change build info, update changelog 2018-06-26 20:05:33 +03:00
b226e22d2f fixed QT build 2018-06-26 07:25:16 -04:00
5bc157eb19 send data frame for NTCP2 2018-06-25 12:28:07 -04:00
f4122abbad Merge pull request #1201 from PurpleI2P/revert-1200-use-explicitpeer-settings
Revert "Read explicitPeer config settings into params"
2018-06-24 06:46:41 -04:00
f0b32e3f54 Revert "Read explicitPeer config settings into params" 2018-06-24 06:46:22 -04:00
fe00999b2c Merge pull request #1200 from shakamd/use-explicitpeer-settings
Read explicitPeer config settings into params
2018-06-24 06:26:21 -04:00
39eed0f6fb Read explicitPeer config settings into params 2018-06-23 23:52:16 +00:00
510d29b381 gcc 8 arch support 2018-06-23 06:56:05 -04:00
0aa618b938 process AEAD/Chacha20/Poly1305 frame for data phase of NTCP2 2018-06-22 15:02:49 -04:00
5884852612 correct usage of sipkeys 2018-06-22 12:20:35 -04:00
5b29592174 generate sipkeys for data pahse of NTCP2 2018-06-21 16:24:19 -04:00
96411cc93e derive keys for siphash 2018-06-21 12:39:24 -04:00
7d862d8eba service and daemon works as bool without values, other requires true/false 2018-06-21 09:40:53 +03:00
dd392941d0 update Config.cpp, links to examples, manpage 2018-06-21 09:40:53 +03:00
3cec5235c9 NTCP2 according to new specs 2018-06-20 16:09:22 -04:00
b5682012d3 process SessionRequest and send SessionCreated for NTCP2 2018-06-19 15:43:47 -04:00
4351a2736c Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2018-06-19 11:17:14 -04:00
9c7cadb191 better implementation of x25519 2018-06-19 11:14:22 -04:00
4d9143734f store standart configs as docs in deb packages 2018-06-19 15:11:48 +03:00
3cec923294 Update tunnels.conf 2018-06-19 15:08:16 +03:00
58c92b8405 aead/chacha20/poly1305 from openssl 1.1 2018-06-18 12:56:47 -04:00
985b618932 addng forgotten bracket 2018-06-16 23:07:03 +03:00
a027a42c46 fix links to online documentation in manpage 2018-06-16 22:57:18 +03:00
bdc7acffbe remove zero_tokens(), update manpage 2018-06-16 22:38:59 +03:00
6bd73cdea2 Update help message, debian manpage. Prepare changelog message 2018-06-16 18:11:46 +03:00
59954c1d7c Merge pull request #1194 from l-n-s/doc_update
Update contrib/i2pd.conf file with more options
2018-06-16 12:28:42 +00:00
a59cdcc9e0 Update contrib/i2pd.conf file with more options 2018-06-16 08:05:43 -04:00
e1bfa786fc fix #1192 2018-06-16 11:59:54 +03:00
d5214099c5 move out android binary build info from README
little change in MSYS build script
2018-06-16 10:55:59 +03:00
e05110ff44 send RouterInfo in SessionConfirmed 2018-06-15 14:56:03 -04:00
706b976a28 handle and publish NTCP2 address 2018-06-15 12:52:43 -04:00
2bd7a92d20 send SessionConfirmed 2018-06-14 15:29:36 -04:00
6b37a41e00 correct ad calculation for SessionCreated 2018-06-14 10:45:25 -04:00
5447259e1a AEAD/ChaCha20/Poly1305 decryption and SessionCreate prcessing 2018-06-13 16:16:23 -04:00
ee0ae0b74b decrypt Y for NTCP2 2018-06-13 14:56:51 -04:00
966256ac32 correct Poly1305 calculation 2018-06-13 12:58:32 -04:00
6b9061515f AEAD/ChaCha20/Poly1305 test added 2018-06-13 12:25:32 -04:00
df60e78766 AEAD/Chacha20/Poly1305 encryption 2018-06-13 11:41:46 -04:00
bf1e1ad457 eliminate extra dependencies 2018-06-13 10:49:14 -04:00
7fa5b06359 x25519 unti test 2018-06-12 18:29:06 -04:00
3b46e9f351 fixed typo 2018-06-12 14:55:40 -04:00
046a80cfe4 scalar multiplication for x25519 2018-06-12 12:42:20 -04:00
a8278fc78b router's NTCP2 private keys 2018-06-11 15:33:48 -04:00
7f3127ac89 pass unencrypted X to KDF 2018-06-11 14:32:15 -04:00
7cdb021a1f pass correct nonce to chacha20 2018-06-11 14:05:30 -04:00
74c0b729c2 connect to NTCP2 2018-06-11 12:29:30 -04:00
5cb81f8532 send SessionRequest message 2018-06-06 15:38:18 -04:00
4f23d7b7df recognize routers with NTCP2 2018-06-06 11:51:34 -04:00
a70d0edf2e encrypt SessionRequest options block 2018-06-05 16:15:33 -04:00
8c9eaccc11 KeyDerivationFunction for NTCP2 2018-06-05 15:37:08 -04:00
86c1984982 NTCP2 added 2018-06-05 12:53:13 -04:00
cd0f75106a moved Ed25519 away from signature 2018-06-04 16:06:38 -04:00
b5291b5151 Merge pull request #1190 from vmon/resolve--tunnel-get-ready-timout-bug
fixes #1124 and calls the ready callbacks if the tunnel gets ready an…
2018-05-29 09:10:02 -04:00
46283dc0ea fixes #1124 and calls the ready callbacks if the tunnel gets ready and no timeout is set 2018-05-28 17:14:17 -04:00
56e76ec59f fix using debug library compilation in release mode 2018-05-28 19:41:23 +03:00
4cedaa9e80 fixed android build 2018-05-28 09:49:59 -04:00
516f140bef ntcp2 crypto added 2018-05-24 14:32:14 -04:00
5d86c1c9a6 ntcp2 crypto added 2018-05-24 14:27:26 -04:00
d289aa71eb Merge pull request #1184 from mewmew-i2p/openssl
closes #1164 (i.e. added a log viewer to qt), + misc cosmetic
2018-05-19 14:44:39 -04:00
ed2818eaa2 qt log viewer now works 2018-05-19 23:06:06 +08:00
f8fe124428 improved comment at qt.pro file 2018-05-19 23:06:06 +08:00
5ec11c53e9 differentiation between windows release and debug build into i2pd_qt.pro 2018-05-19 23:06:05 +08:00
42d118d9a2 Merge pull request #1182 from l-n-s/issue_1178
Add /etc/resolv.conf to apparmor profile and k flag for pidfile
2018-05-18 19:56:29 +00:00
d8b4765f23 Add /etc/resolv.conf to apparmor profile and k flag for pidfile 2018-05-18 15:54:39 -04:00
be69280d0d Merge pull request #1181 from l-n-s/issue_1177
Restore reseed certificate hottuna_at_mail.i2p.crt
2018-05-18 19:47:32 +00:00
53a1a097a6 Restore reseed certificate hottuna_at_mail.i2p.crt 2018-05-18 15:45:35 -04:00
a22e9a2ca7 don't start shared local destination twice 2018-04-30 13:34:16 -04:00
db03595473 correct message size 2018-04-29 18:05:28 -04:00
8fadac0fdc Merge pull request #1172 from majestrate/check-boundary-04-2018
Check boundary
2018-04-29 18:04:15 -04:00
a63bc1cdca correct sizes 2018-04-29 11:41:03 -04:00
6265d452e9 more bounds checking 2018-04-29 11:34:23 -04:00
b095399770 Merge pull request #1170 from unlnown542a/openssl
Separated buld directory for Android i2pd only binary
2018-04-26 17:19:39 -04:00
Al
db8a546b8f android i2pd executable build instructions 2018-04-26 20:07:51 +00:00
6e95318cba I2PD_LIBS_PATH = /path/to/libraries to be same as in android normal build 2018-04-26 22:44:32 +03:00
08a8ab9892 format 2018-04-26 22:42:12 +03:00
c7b796ff31 separate Android binary build based on DaemonLinux 2018-04-26 22:40:13 +03:00
ad23ccb219 separating android binary build 2018-04-26 22:28:30 +03:00
Al
be7a84fdf3 Merge pull request #2 from PurpleI2P/openssl
sync with main repo
2018-04-26 16:53:56 +00:00
2fbbbf298b use shared pointers for tunnel reload 2018-04-25 16:18:07 -04:00
0df68872ab Merge pull request #1169 from majestrate/master
SAM fixes
2018-04-25 12:02:51 -04:00
0ced38cdcb tabify 2018-04-25 11:27:56 -04:00
b046c45a9e tabify 2018-04-25 11:25:49 -04:00
2ce1ab1634 Merge pull request #1168 from mewmew-i2p/openssl
perfecting qt status page
2018-04-25 10:21:17 -04:00
7225231814 perfecting qt status page 2018-04-25 16:36:42 +08:00
11dca2b352 Merge pull request #1167 from borned-mind/openssl
Delete some for correct compilation
2018-04-24 15:04:12 -04:00
97127e86dc Delete some for correct compilation 2018-04-25 01:59:11 +07:00
cb81195959 Merge pull request #1166 from borned-mind/openssl
Disable aesenc for arm64
2018-04-24 14:51:57 -04:00
adaff9f354 Merge branch 'openssl' of https://github.com/borned-mind/i2pd into openssl 2018-04-25 01:34:40 +07:00
66de7ad049 for first time disable aesenc for arm64 2018-04-24 18:23:40 +00:00
1e1e4da144 delete buffer 2018-04-24 14:02:48 -04:00
623433099b don't use reset 2018-04-24 11:50:51 -04:00
73b3fbc2da wrap m_OpenSockets with mutex 2018-04-24 11:42:37 -04:00
5f525d0e43 fix previous commit 2018-04-24 11:16:15 -04:00
60463fdafa shut down socket and don't allocate buffer for each write in WriteI2PData 2018-04-24 11:11:48 -04:00
b7a67b4b03 use refernce not copy 2018-04-24 09:56:24 -04:00
4643c92d33 Initial SAM cleanup 2018-04-24 09:45:16 -04:00
396cba7339 fix static building on windows, add resource files (closes #1163) 2018-04-24 03:25:25 +03:00
a2b3ee53e0 fixed build error 2018-04-23 14:39:46 -04:00
2c67d2055c Merge pull request #1161 from mewmew-i2p/openssl
qt now statically compiles for win32
2018-04-23 13:45:55 -04:00
c8de7aa23c qt now statically compiles for win32 2018-04-24 01:40:12 +08:00
fa154cc4d6 Merge remote-tracking branch 'purple/openssl' 2018-04-22 07:52:49 -04:00
d9b8731ddc Merge pull request #1160 from unlnown542a/openssl
A small pach into main trunk to build cponsole Android i2pd binary
2018-04-21 16:06:27 -04:00
Al
6cebc1a2a2 Merge pull request #1 from PurpleI2P/openssl
merge "mainline"
2018-04-21 19:10:05 +00:00
faac35cd1e Revert "Change jni to build executable. Clone with minimal changes DaemonUnix into DaemonAndroid"
This reverts commit f11266972e.
2018-04-21 21:55:45 +03:00
6916147dda Few cents to get fullly console i2pd under Android 2018-04-21 21:48:42 +03:00
e2da16e9c3 moved reseed out 2018-04-19 19:46:00 +03:00
0c661e7373 save new local destination for failed insert 2018-04-18 15:08:06 -04:00
413f8e8462 Merge pull request #1159 from majestrate/gut-streaming-limits
remove streaming bans
2018-04-16 10:06:27 -04:00
eefbbd4efe remove all related streaming limit members 2018-04-16 09:47:35 -04:00
83932a6f02 remove streaming bans 2018-04-16 09:38:32 -04:00
c175dc30f8 correct uri for outproxy 2018-04-13 16:29:49 -04:00
17aa91803a update outproxy header in right place 2018-04-13 15:40:25 -04:00
48099a367e send correct buffer to outproxy 2018-04-13 15:13:50 -04:00
a9b64893d8 replace Proxy-Authorization 2018-04-13 12:47:53 -04:00
387e030d83 correct cleanup for CONNECT 2018-04-12 21:25:20 -04:00
855cc9ed83 correct Proxy-Authroization 2018-04-12 19:10:21 -04:00
82534eef12 try fix appveyor build 2018-04-11 20:58:21 +03:00
ff4e254618 0.9.34 2018-04-11 10:30:13 -04:00
571a13f0a7 Merge remote-tracking branch 'purple/master' 2018-04-08 19:56:48 -04:00
2cb6283d00 outproxy authorization 2018-04-06 15:23:56 -04:00
f4056e57bb rollback 2018-04-05 07:16:41 -04:00
e80da3cbeb fixes for i2pd_qt MSYS2 mingw32 2018-04-05 15:40:44 +08:00
c0436297c2 fix typo in systemd service type 2018-04-01 23:37:36 +03:00
0d05b4f095 Merge pull request #1154 from yangfl/upstream
fix systemd service type
2018-03-31 16:53:58 +03:00
f06c8710be fix systemd service type 2018-03-31 14:56:45 +08:00
f11266972e Change jni to build executable. Clone with minimal changes DaemonUnix into DaemonAndroid 2018-03-30 15:50:30 +03:00
479edaf80d Merge pull request #1149 from majestrate/fix-ntcp-threading-race
Fix ntcp threading race
2018-03-24 08:29:04 -04:00
ff5c26adf2 Merge remote-tracking branch 'purple/openssl' into fix-ntcp-threading-race 2018-03-24 07:56:49 -04:00
5361e11395 fix race 2018-03-24 07:53:06 -04:00
b041bcdc65 publish updated LeaseSet in destination's thread 2018-03-23 11:41:36 -04:00
b7c350202d always create EdDSA RouterInfo 2018-03-20 20:43:47 -04:00
b1a6c5ddf7 fixed build for gcc 4.7 2018-03-16 11:12:18 -04:00
ac943b5712 Merge pull request #1147 from PurpleI2P/cmake-libs
WITH_LIBRARY usage
2018-03-12 12:35:34 +03:00
ce8d701ecb WITH_LIBRARY usage
closes #1146. Need to be checked before.
2018-03-11 19:20:47 +03:00
182ffe4495 use croorect encryption type for tunnel build 2018-03-09 14:56:06 -05:00
c13983d395 Merge pull request #1145 from PurpleI2P/openssl
recent changes
2018-03-09 14:47:56 -05:00
066f8863fd pass zero padding parameter to ECEIS encryption 2018-03-07 16:08:44 -05:00
e58aaa3f32 make sure tunnelID is non-zero 2018-03-07 12:36:38 -05:00
ca1fa11cb1 Merge pull request #1143 from l-n-s/i2pcontrol_updates
I2pcontrol updates
2018-03-05 14:34:31 -05:00
64ed485cdf Merge pull request #1142 from ffontaine/openssl
Create LogsDirectory in i2pd.service
2018-03-05 21:30:09 +03:00
b0781668e2 Create LogsDirectory in i2pd.service
Create /var/log/i2pd through LogsDirectory parameter of systemd and set
its permission to 0700 through LogsDirectoryMode. Indeed, this directory
must be created with the correct permission as it is used in ExecStart
command

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2018-03-05 19:06:14 +01:00
f9fc744949 Merge remote-tracking branch 'upstream/openssl' into i2pcontrol_updates 2018-03-05 12:35:10 -05:00
2661db23f6 I2PControl: fix indentation 2018-03-05 12:34:41 -05:00
7d78f60d29 Merge pull request #1140 from ffontaine/openssl
Install libi2pdclient
2018-03-05 10:58:07 -05:00
1d934bd543 Install libi2pdclient
When building with -DBUILD_SHARED_LIBS=ON, libi2pdclient is not
installed on target so install it by calling install. Moreover, rename
i2pdclient to libi2pdclient so library is installed with correct name.

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2018-03-05 15:17:23 +01:00
190435acd9 Merge pull request #1138 from ffontaine/openssl
Fix cmake error when -DBUILD_SHARED_LIBS=ON
2018-03-04 15:35:28 -05:00
656236cb4d Merge pull request #1137 from yangfl/upstream
Makefile: add detection for GNU userspace
2018-03-04 14:48:45 -05:00
6d15be9a32 Fix cmake error when -DBUILD_SHARED_LIBS=ON
Fixes "CMake Error: TARGETS given no LIBRARY DESTINATION for shared
library target" by adding LIBRARY parameter to INSTALL call

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2018-03-04 18:31:02 +01:00
18d3c81018 Makefile: add detection for GNU userspace 2018-03-05 00:51:53 +08:00
12292afdec I2PControl: s/remote_endpoint/peer 2018-03-04 11:28:09 -05:00
aef0f4d7b8 Merge pull request #1135 from l-n-s/issue_954
I2PControl: add new method ClientServicesInfo
2018-03-03 07:48:46 -05:00
21545ab7da I2PControl: add new method ClientServicesInfo 2018-03-03 05:52:11 -05:00
5a2b795440 fixed crash 2018-02-26 19:41:24 -05:00
1303dd478c Merge pull request #1130 from majestrate/i2cp-session-reconfig
implement i2cp session reconfigure
2018-02-26 09:33:25 -05:00
7b4fc19fca be concise 2018-02-26 08:18:01 -05:00
008a064764 revert 2018-02-26 08:12:15 -05:00
82a4630061 use correct function 2018-02-26 08:09:26 -05:00
0f77b4810d revert 2018-02-26 08:00:07 -05:00
2f7cfddfc4 Merge remote-tracking branch 'purple/openssl' into i2cp-session-reconfig 2018-02-26 07:58:03 -05:00
84608c16b3 Merge pull request #1128 from majestrate/fix-issue-1126
Fix issue 1126
2018-02-25 09:34:58 -05:00
157411dcc6 Revert "fix issue #1124"
This reverts commit 29e861d1e6.
2018-02-25 08:51:07 -05:00
59672d23cc Merge branch 'fix-issue-1124' into fix-issue-1126 2018-02-25 08:50:27 -05:00
ce30f89c60 make it compile :D 2018-02-25 08:49:39 -05:00
ce9c9411b1 fix issue #1126 2018-02-25 08:47:39 -05:00
cf0d5b616d Merge pull request #1125 from majestrate/fix-issue-1124
fix issue #1124
2018-02-22 16:18:37 -05:00
29e861d1e6 fix issue #1124 2018-02-22 06:54:33 -05:00
c7accd4a5c Merge pull request #1122 from majestrate/ntcp-threadpool
NTCP threadpool
2018-02-20 14:49:01 -05:00
b469080cd7 make ntcp worker threads configurable in number 2018-02-20 13:18:57 -05:00
547a0057e6 whitespace cleanup 2018-02-20 13:04:39 -05:00
b980ca4a9e whitespace cleanup 2018-02-20 13:03:34 -05:00
098b2e968e whitespace cleanup 2018-02-20 13:03:01 -05:00
cd59ca8376 whitespace cleanup 2018-02-20 12:59:39 -05:00
f2e6fad104 make it work 2018-02-20 12:40:28 -05:00
8d7fde0287 more 2018-02-20 11:43:13 -05:00
91fdb038d9 add threadpool for ntcp dh 2018-02-20 11:38:48 -05:00
a0188765c5 Merge pull request #1121 from majestrate/aesni-osx
More OSX fixes
2018-02-19 12:29:34 -05:00
b970a005de don't log AESNI/AVX here 2018-02-19 10:45:13 -05:00
b64878f4fa use std::move 2018-02-19 10:45:02 -05:00
c8936c79bf Merge pull request #1120 from majestrate/aesni-osx
FIX AESNI build on osx with homebrew
2018-02-19 10:19:45 -05:00
f876cc9079 update makefile 2018-02-19 10:16:48 -05:00
a5cc2f3b5d define bit_* if not already defined 2018-02-19 10:15:39 -05:00
9c93d6f931 Revert "define cpu_* if not set"
This reverts commit a077d7671f.
2018-02-19 10:15:26 -05:00
a077d7671f define cpu_* if not set 2018-02-19 10:15:03 -05:00
6485ebe9a7 Merge pull request #1119 from PurpleI2P/docker_build_badge
Added docker build badge
2018-02-18 20:24:32 +01:00
ecb6bb220a Added docker build badge 2018-02-18 20:21:19 +01:00
e3dc400d74 Merge pull request #1117 from hypnosis-i2p/openssl
fixed #1104
2018-02-17 14:49:18 -05:00
3bb4151074 fixed #1104 - android 2018-02-18 01:01:48 +08:00
1de4c2e8c6 perms prompt now doesn't show the back button - android 2018-02-18 00:25:58 +08:00
fbcc4f28e7 removed design lib from deps - android 2018-02-17 23:55:30 +08:00
30fb0f5a94 Merge pull request #1116 from majestrate/netbsd
NetBSD support
2018-02-17 07:22:51 -05:00
b02464990b work around netbsd quarkyness 2018-02-16 18:54:34 -05:00
4988a32d33 make endian work with netbsd 2018-02-16 18:27:30 -05:00
b3e5874631 fixed android build error 2018-02-16 13:56:44 -05:00
f5349dcef9 Merge pull request #1115 from majestrate/aesni-avx-runtime-detect
AESNI/AVX runtime detection [WIP]
2018-02-16 12:40:28 -05:00
486a4cfdd6 add to qt 2018-02-16 12:36:51 -05:00
2277dcb069 add cpu.cpp to cmake 2018-02-16 12:34:17 -05:00
a618a01b1e don 2018-02-16 11:26:07 -05:00
7e60069968 add uncommitted files 2018-02-16 11:01:04 -05:00
91e45d9a4a initial code for runtime detection of aesni/avx 2018-02-16 11:00:33 -05:00
dea6fbf285 Merge pull request #1114 from majestrate/websocks-datagram
Add datagrams to websocks tunnel
2018-02-16 09:18:24 -05:00
48cc0f4289 use write 2018-02-16 08:33:19 -05:00
cdc5fce583 check port 2018-02-16 08:31:20 -05:00
b41a17d548 add datagrams to websocks 2018-02-16 08:26:46 -05:00
606cbaa519 Merge pull request #1113 from majestrate/sam-xss-fix
fix xss in webui from SAM session name
2018-02-16 07:02:55 -05:00
aaf8f527ef fix xss in webui from SAM session name 2018-02-16 06:28:22 -05:00
b7596b7f70 Merge pull request #1112 from majestrate/dns-rebind
mitigate dns rebinding in webui
2018-02-15 09:57:16 -05:00
0309b574e8 mitigate dns rebinding in webui 2018-02-15 09:52:20 -05:00
ca057177c7 Merge pull request #1110 from radfish/PR--remove-openssl-1.1-warning
cmake: remove warning for OpenSSL 1.1
2018-02-11 14:36:03 -05:00
5d9bf18267 Merge pull request #1109 from radfish/PR--clang-stdlib-fix
cmake: add stdlib args for clang build on Linux
2018-02-11 14:35:32 -05:00
f1b8742782 cmake: remove warning for OpenSSL 1.1
Works fine.
2018-02-11 13:14:12 -05:00
7786c97330 cmake: add stdlib args for clang build on Linux
Otherwise linking fails with undefined symbol ... basic_string ... and
libstdc++: DSO not on included in link command.

or with
Host compiler must support std::atomic!
which is due to
undefined reference to `__gxx_personality_v0' and __cxa_begin_catch and
std::terminate()

This was already patched in 7b537a4e94
PR #972 but it got lost, and also needed some tweaking.

Thested with Clan 5.0.1 on Arch Linux (on armv7h).
2018-02-11 13:11:12 -05:00
f2a14047eb Merge pull request #1108 from majestrate/fix-issue-1107
Fix issue 1107
2018-02-11 06:48:01 -05:00
124a9cb030 correction 2018-02-11 06:07:43 -05:00
3ec000d0f8 fix issue #1107 2018-02-11 06:06:14 -05:00
aac1141ca6 fix issue #1107 2018-02-11 06:05:41 -05:00
33cb96126a appveyor: remove catgets before try update 2018-02-10 19:23:07 +03:00
441db9ad7f fix appveyor build 2018-02-10 19:20:44 +03:00
5225e1d7d1 * HTTP.cpp : use bare snprintf() instead locale-dependent strftime() 2018-02-10 12:40:01 +00:00
de849b3f6a fix date in webconsole page header on windows 2018-02-10 03:10:32 +03:00
fb4387c41f Merge pull request #1103 from hypnosis-i2p/openssl
build.gradle auto-indented; ndk-build is now called by gradle build
2018-02-08 07:18:39 -05:00
a9061a8f58 ndk-build is now called by gradle build 2018-02-08 12:55:09 +08:00
0c099dc52b Merge pull request #1102 from PurpleI2P/revert-1097-revert-1096-openssl
Revert "Revert "fixed #1088""
2018-02-07 14:50:30 -05:00
713e92c28f Revert "Revert "fixed #1088"" 2018-02-07 14:50:15 -05:00
d111025012 Merge pull request #1101 from PurpleI2P/revert-1098-revert-1095-openssl
Revert "Revert "reworked the app, fixed #1094, fixed grace stop""
2018-02-07 14:49:50 -05:00
5f2e6b1262 Revert "Revert "reworked the app, fixed #1094, fixed grace stop"" 2018-02-07 14:49:37 -05:00
b6d838731f Merge pull request #1100 from PurpleI2P/revert-1099-revert-1090-openssl
Revert "Revert "quit features replaced by stop; gradle upgraded; i2pd version name updated at build.gradle""
2018-02-07 14:49:05 -05:00
56db8b40b2 Revert "Revert "quit features replaced by stop; gradle upgraded; i2pd version name updated at build.gradle"" 2018-02-07 14:48:51 -05:00
f488c97a09 Merge pull request #1099 from PurpleI2P/revert-1090-openssl
Revert "quit features replaced by stop; gradle upgraded; i2pd version name updated at build.gradle"
2018-02-07 14:08:34 -05:00
31df49a884 Revert "quit features replaced by stop; gradle upgraded; i2pd version name updated at build.gradle" 2018-02-07 14:08:22 -05:00
e5fdced4ac Merge pull request #1098 from PurpleI2P/revert-1095-openssl
Revert "reworked the app, fixed #1094, fixed grace stop"
2018-02-07 14:07:40 -05:00
71546367cf Revert "reworked the app, fixed #1094, fixed grace stop" 2018-02-07 14:07:26 -05:00
857817dae8 Merge pull request #1097 from PurpleI2P/revert-1096-openssl
Revert "fixed #1088"
2018-02-07 14:07:00 -05:00
ae3fca15c7 Revert "fixed #1088" 2018-02-07 14:06:39 -05:00
6bb7382dbd Merge pull request #1096 from hypnosis-i2p/openssl
fixed #1088
2018-02-07 10:47:51 -05:00
badb837b46 fixed #1088 2018-02-07 23:22:31 +08:00
74f5b70a5d Merge pull request #1095 from hypnosis-i2p/openssl
reworked the app, fixed #1094, fixed grace stop
2018-02-07 07:25:33 -05:00
ac495da5fe fixes grac stop 2018-02-07 19:56:44 +08:00
56f6e57118 fixes grac stop 2018-02-07 19:54:19 +08:00
33735b343d fixes 1094; fixes grac stop 2018-02-07 19:24:43 +08:00
1b56d66fc8 android gitignore 2018-02-07 18:25:45 +08:00
0994211a48 android gitignore 2018-02-07 18:25:45 +08:00
62d9a47c3d android work 1 2018-02-07 18:25:45 +08:00
e77037c2b8 fixed warning 2018-02-05 11:13:25 -05:00
030a6ebb71 Merge pull request #1093 from l-n-s/rm_root_docker
Remove broken Dockerfile and it's entrypoint
2018-02-05 04:51:29 +00:00
5a657cff89 Remove broken Dockerfile and it's entrypoint 2018-02-04 23:44:49 -05:00
f3488be7af update rpm, increase release version for Fedora and CentOS 2018-02-05 05:52:12 +03:00
4af0caa506 fix build on GCC 8.0.1
https://bugzilla.redhat.com/show_bug.cgi?id=1541688
2018-02-05 05:07:26 +03:00
0728991821 Merge pull request #1092 from majestrate/master
fix federoa rawhide build with gcc 8
2018-02-03 15:18:15 -05:00
21c35f770b fix federoa rawhide build with gcc 8 2018-02-03 13:46:22 -05:00
f039af6eda Merge pull request #1090 from hypnosis-i2p/openssl
quit features replaced by stop; gradle upgraded; i2pd version name updated at build.gradle
2018-02-03 07:14:14 -05:00
eb3f703b46 gradle upgraded; i2pd version name updated 2018-02-03 19:58:09 +08:00
b88b82a85c quit features replaced by stop - more 2 2018-02-03 19:57:21 +08:00
1d0791dbf5 quit features replaced by stop - more 2018-02-03 19:56:17 +08:00
87f2eefd35 quit features replaced by stop 2018-02-03 19:55:32 +08:00
b8a2c9f955 Merge pull request #1089 from yangfl/upstream
i2pd.service: do not block system shutdown for 10 min
2018-02-02 22:26:06 +03:00
319d748639 i2pd.service: do not block system shutdown for 10 min 2018-02-03 02:29:28 +08:00
4f84d687e4 add endian detection for glibc 2018-02-03 02:27:22 +08:00
fbb9991128 remove obsoletes tag for rpm git package 2018-02-02 10:35:07 +03:00
62bac24246 Merge pull request #1086 from BOPOHA/patch-3
i2pd.spec delete obsoletes tag
2018-02-01 17:43:42 -05:00
4aa8461bea Merge pull request #1087 from BOPOHA/patch-4
systemd issue in centos 7
2018-02-01 17:43:17 -05:00
ce57a130fc systemd issue in centos 7
Not working pre-create pid-file dir (/run/i2pd).
It fixed with one of this ways:

> PermissionsStartOnly=True
or 
> ExecStartPre=/bin/mkdir -p -m 0700 /var/run/i2pd
> ExecStartPre=/bin/chown i2pd: /var/run/i2pd

First way is prefer because RuntimeDirectory's options already used.
2018-02-01 23:21:20 +01:00
80567312ed i2pd.spec delete obsoletes tag
https://github.com/PurpleI2P/i2pd/pull/1084#issuecomment-362215861

```
Resolving Dependencies
--> Running transaction check
---> Package i2pd.x86_64 0:2.17.0-20171206git.el7.centos will be updated
---> Package i2pd.x86_64 0:2.18.0-1.el7.centos will be obsoleting
---> Package i2pd-systemd.x86_64 0:2.17.0-20171206git.el7.centos will be obsoleted
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================
 Package   Arch        Version                     Repository        Size
==========================================================================
Installing:
 i2pd      x86_64      2.18.0-1.el7.centos         vorona-i2pd      915 k
     replacing  i2pd-systemd.x86_64 2.17.0-20171206git.el7.centos

Transaction Summary
==========================================================================
Install  1 Package

Total download size: 915 k
Is this ok [y/d/N]:
```
@l-n-s  thx, obsoletes tag is unneeded in next release)
2018-02-01 22:11:14 +01:00
180730f9cf fix rpm spec's (#1084)
* added spec for git package
* fixed double slashes
* changed versioning for stable builds
2018-02-01 19:37:38 +03:00
fca2693488 add centos/fedora build status 2018-02-01 01:12:06 +03:00
b6e75e9c5a Update changelog 2018-01-30 11:14:29 -05:00
4901434209 2.18.0 2018-01-30 10:41:35 -05:00
13d174c09c add tunconf in systemctl service file 2018-01-30 18:14:54 +03:00
5363c063d1 Merge pull request #1067 from l-n-s/rpm_updates
Update rpm spec and systemd unit
2018-01-30 15:12:54 +00:00
32d300248e update building stuff 2018-01-30 18:09:26 +03:00
3426906a4f [rpm] Fix changelogs to comply with guidelines, add tunconf key to systemd package 2018-01-30 10:03:53 -05:00
3aaa942c94 Merge pull request #1082 from PurpleI2P/apparmor-homedir
add users homedir to apparmor profile
2018-01-30 17:31:22 +03:00
95d8887ab0 update profile 2018-01-30 17:30:01 +03:00
6272e15b47 add users homedir to profile 2018-01-29 04:13:33 +03:00
20b4f6b24d update apparmor profile 2018-01-29 03:47:43 +03:00
6ee279d83e [rpm] Merge i2pd-systemd with i2pd package + changelog 2018-01-27 10:54:03 -05:00
b00ff43be7 Update README.md 2018-01-26 19:52:11 -05:00
dfbefee477 graceful shutdown complete if no transit tunnels anymore 2018-01-26 14:34:05 -05:00
8c2de4973c rollback 2018-01-26 14:33:06 -05:00
e1527dc137 update LeaseSet if a tunnel was deleted 2018-01-26 14:07:51 -05:00
0957f6b143 Merge pull request #1055 from yangfl/upstream
replace non-working CheckLibcxxAtomic
2018-01-26 15:33:39 +03:00
7db2e9dc4a don't verify signature twice 2018-01-25 10:32:08 -05:00
b1c701085b don't verify signature twice 2018-01-25 10:09:34 -05:00
e8d6c803cd Merge pull request #1076 from majestrate/fix-streaming-race-2018-01-25
try streaming race condition fix
2018-01-25 09:35:58 -05:00
f4a2dda94e try streaming race condition fix 2018-01-25 09:00:00 -05:00
c4216379ed Merge pull request #1074 from l-n-s/fix_docker_2
Fix docker 2
2018-01-24 19:46:38 +00:00
52195bf296 Merge remote-tracking branch 'upstream/openssl' into fix_docker_2 2018-01-24 14:42:55 -05:00
10fe75ed87 Merge pull request #1073 from majestrate/fix-netdb-ls-publish-2018-01-24
check for valid LS before updating
2018-01-24 13:00:30 -05:00
1c659d6ef6 Merge remote-tracking branch 'upstream/openssl' into fix_docker_2 2018-01-24 12:48:57 -05:00
3ac86db038 Fix Docker image error 2018-01-24 12:48:05 -05:00
4a77a03033 * Add LeaseSetBufferValidate which checks lease validity and extracts timestamp
* check for leases with LeaseSetBufferValidate before update in floodfill code as to prevent malicous nodes removing good LS
2018-01-24 10:16:51 -05:00
3820b51960 Revert "check for valid LS before updating"
This reverts commit e070ce4e34.
2018-01-24 09:44:55 -05:00
e070ce4e34 check for valid LS before updating 2018-01-24 09:36:09 -05:00
0bb0adbf3e fix addressbook fetch timeout 2018-01-24 15:34:32 +03:00
ddd25f0945 limit number of retries for subscriptions 2018-01-23 15:50:28 -05:00
162bd592f8 recreate http and socks proxy upon reload 2018-01-23 15:13:43 -05:00
85fa728d41 change shared local destination upon reload 2018-01-23 14:40:05 -05:00
c7db9010ad fixed #1047. Return EXIT_FAILURE 2018-01-23 11:01:50 -05:00
be16545063 Merge pull request #1070 from vmon/f--port-0-for-TCPAcceptor
the change allows when an TCPIPAcceptor is constructed by setting por…
2018-01-23 06:48:18 -05:00
c730839989 the change allows when an TCPIPAcceptor is constructed by setting port = 0, the random port chosen by asio can be retrieved using TCPIPAcceptor::GetLocalEndpoint().port() 2018-01-22 20:47:31 -05:00
4ee364640d Update rpm spec and systemd unit 2018-01-22 13:55:12 -05:00
56dd0db001 Merge pull request #1066 from PurpleI2P/revert-1065-openssl
Revert " Fixes for #1024 , #1018 #1064 "
2018-01-22 13:00:15 -05:00
626ed720a6 Revert " Fixes for #1024 , #1018 #1064 " 2018-01-22 12:59:34 -05:00
b8fd9ba83f Merge pull request #1065 from unlnown542a/openssl
Fixes for #1024 , #1018 #1064
2018-01-22 07:08:34 -05:00
316a4457af Merge github.com:unlnown542a/i2pd into openssl 2018-01-22 01:39:51 +03:00
347a2c2150 fixing conflicts 2018-01-22 01:30:21 +03:00
42d3770b14 fixed layout 2018-01-21 11:28:16 -05:00
39ca07bcc6 Merge pull request #1058 from majestrate/streaming_race_fix_2018_01_15
Streaming race fix 2018 01 15
2018-01-21 11:15:44 -05:00
df304fb38b Merge pull request #1063 from PurpleI2P/openssl
recent changes
2018-01-21 10:29:31 -05:00
914566ece0 removed unused Java router certificates 2018-01-21 10:27:41 -05:00
f537e7b2c6 removed unused cert 2018-01-21 08:09:01 -05:00
06020b8f54 re-enable packet pool 2018-01-20 13:06:08 -05:00
b486d1cd27 rollback
non buildable under x64
2018-01-20 12:07:57 -05:00
b3b38015c2 check max buffer size in Stream::Send 2018-01-20 07:31:58 -05:00
4c6988e3bc code cleanup 2018-01-18 19:35:37 +03:00
0bd4db4cc7 less lines 2018-01-18 16:41:02 +03:00
bc72800fef moved hard code into java side and successfully passed back to native 2018-01-17 20:58:56 +03:00
951f8972c7 replace non-working CheckLibcxxAtomic 2018-01-17 16:12:46 +08:00
38b694a055 Merge pull request #1060 from inetic/openssl
Inherit _publicly_ from shared_from_this in I2PService
2018-01-15 11:58:27 -05:00
44a9c3ca0c Merge pull request #1059 from K1773R/fix-headers-rn
removed redundant \r\n in HTTP header builder
2018-01-15 10:36:42 -05:00
6bf823fb15 removed \r\n in header builder which was redundant and caused the further headers to be ignored 2018-01-15 16:30:01 +01:00
43a751ee0b Merge remote-tracking branch 'purple/openssl' into streaming_race_fix_2018_01_15 2018-01-15 08:25:58 -05:00
207212557e fix sam race conditions 2018-01-15 08:19:57 -05:00
fd1aeeac92 Merge pull request #1045 from yangfl/upstream
code cleanup
2018-01-13 18:11:19 +03:00
50ba52756f fix mixing tabs and spaces 2018-01-13 22:51:02 +08:00
e630b8f8a8 Inherit _publicly_ from shared_from_this in I2PService 2018-01-12 11:04:26 +01:00
cf5081d300 fixed creating certificates.zip when target zip did not include the directory certificates, so they were bein unpacked into datadir. Added entryCompression ZipEntryCompression.STORED since final APK is being compressed as well. Put all custom tasks under android plugin definitions 2018-01-07 19:30:32 +03:00
8864cbf80a return to strdup() when filling argv[] for i2p::android::start(argc,argv).c_str() 2018-01-07 00:40:17 +03:00
81d7a832c0 netDB and certificates in internal storage 2018-01-07 00:08:07 +03:00
d41fabbc9f netDB and certificates in internal storage 2018-01-06 23:59:22 +03:00
46f62e1af9 remove trailing whitespaces 2018-01-06 22:24:03 +08:00
b91efaa973 Merge pull request #1044 from yangfl/upstream
update Makefile and CMakeLists
2018-01-06 09:22:11 -05:00
e3238ff75c CMakeLists: autodetect libatomic 2018-01-06 22:06:44 +08:00
9cc4e8d03a Makefile: get target platform from compiler 2018-01-06 22:06:28 +08:00
68b1afa2df Merge remote-tracking branch 'purple/openssl' into i2cp-session-reconfig 2018-01-04 08:33:06 -05:00
34c98e03c1 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2018-01-03 12:53:05 -05:00
41e40bbc0d fixed typo 2018-01-03 12:52:29 -05:00
80149342f2 proper bounds check 2018-01-03 10:02:11 -05:00
1967dee50c don't recreate tunnels of different size 2018-01-02 12:59:16 -05:00
ab80def94b use reference instead of copy 2018-01-02 12:06:10 -05:00
254bf313a2 fix previous commit 2018-01-02 11:48:38 -05:00
938d5d901a implement i2cp session reconfigure 2018-01-02 11:34:58 -05:00
7b00d828b2 fix lambda capture, don't capture copy 2018-01-01 09:35:32 -05:00
ca49944c85 Merge pull request #1041 from majestrate/fix-streaming-race
fix race condition
2018-01-01 09:26:21 -05:00
d5e9fc7677 fix race condition 2018-01-01 08:28:42 -05:00
6db7c5733d use outbound.nickname as tunnel name if inbound.nickname is not set 2017-12-20 11:38:35 -05:00
418f86ecbd Merge pull request #1039 from majestrate/fix-arm-compile-latomic
Fix arm compile latomic
2017-12-20 10:48:45 -05:00
c68c5af856 fix lib name 2017-12-20 08:56:39 -05:00
950dffbe06 update gitignore 2017-12-20 08:54:41 -05:00
5d557003b6 include cmake stuff 2017-12-20 08:54:02 -05:00
3b8c3c1346 try fixing issue #897 2017-12-20 08:49:47 -05:00
1853263f6c Merge pull request #1038 from PurpleI2P/master
Master
2017-12-18 08:59:19 -05:00
b0f6d81f57 Merge pull request #1037 from PurpleI2P/openssl
recent changes
2017-12-15 22:00:09 -05:00
9ba0329432 Merge pull request #1036 from KenanSulayman/patch-1
Fix typo (confrimed -> confirmed)
2017-12-15 21:56:09 -05:00
614101c4b8 Fix typo (confrimed -> confirmed) 2017-12-16 02:36:01 +01:00
50e4fb138a close #1032 (#1034) 2017-12-13 15:17:45 +03:00
6dba0c6e0e Merge pull request #1031 from AMDmi3/boost-asio-fix
Don't use deprecated boost::asio::ssl::context ctor
2017-12-11 15:30:39 -05:00
0f2d2156e6 Don't use deprecated boost::asio::ssl::context ctor
This was removed in boost 1.66, in prior versions the service
argument was not used
2017-12-11 22:34:48 +03:00
13b17c5a93 Merge pull request #1030 from AMDmi3/freebsd_kernel
Reorder preprocessor conditions in libi2pd/I2PEndian.h
2017-12-11 12:37:08 -05:00
511499d950 Reorder preprocessor conditions in libi2pd/I2PEndian.h
The problem is that __FreeBSD_kernel__ may be defined on FreeBSD as
well, while it always needs <sys/endian.h>
2017-12-11 19:59:06 +03:00
6632b71273 gradle relese build 2017-12-10 09:01:13 -05:00
60ef70cee4 gradle build added 2017-12-10 08:46:13 -05:00
b3ba0a7241 Merge pull request #1027 from majestrate/transient-by-default
Use transient destinations
2017-12-09 07:49:43 -05:00
fc73dabc0b Use transient destinations by default instead of shared local destination 2017-12-09 07:42:32 -05:00
1121d45eb6 Merge pull request #1025 from yangfl/pr
fix typo
2017-12-07 09:09:42 -05:00
18b6353803 fix typo 2017-12-07 21:26:28 +08:00
c0c0642bd1 temporary disable osx build due to of big waiting time of VM 2017-12-06 02:16:01 +03:00
3cf26a84dc Merge pull request #1022 from AMDmi3/patch-1
Don't meddle with stdlib
2017-12-05 10:14:31 -05:00
44d6d4405e Don't meddle with stdlib
Forgotten part of #1014: -stdlib should not be changed. It breaks build on e.g. FreeBSD where libc++ is used.
2017-12-05 13:45:22 +03:00
cafa027f0b Merge pull request #1021 from PurpleI2P/openssl
2.17.0
2017-12-04 13:42:04 -05:00
1c970b0714 2.17.0 2017-12-04 21:40:32 +03:00
6636e432d7 2.17.0 2017-12-04 13:05:04 -05:00
158889b85c check for invalid params 2017-12-01 16:25:32 -05:00
92bebb7ecc webconsole update (#1017)
* webconsole exploratory tunnel mark
* loglevel on commands page
* fix line break on destination page
2017-12-01 22:18:04 +03:00
fff34e77f5 pass signature and crypto type to newkeys 2017-12-01 13:43:00 -05:00
df18692af9 check I2NP messsage buffer size 2017-12-01 12:57:05 -05:00
276a78cb2e Merge pull request #1019 from PurpleI2P/openssl
recent changes
2017-12-01 12:55:45 -05:00
a1e820182c CRYPTO_TYPE for DEST GENERATE 2017-11-28 13:24:07 -05:00
272090fc8f don't accept streams from RSA detinations 2017-11-28 11:33:51 -05:00
ab6bc52a0f don't create destination with RSA signature 2017-11-28 10:59:11 -05:00
c69c369502 close div, update qt gitignore 2017-11-26 12:30:18 +03:00
a5b1b24fee implement i2p.streaming.connectDelay option 2017-11-24 15:37:17 -05:00
40cfbc5d61 Merge pull request #1016 from majestrate/fix-streaming-overflow
fix overflow
2017-11-23 13:54:34 -05:00
ffad1ecd6d reduce buffer size 2017-11-23 13:46:04 -05:00
e1b5803902 fix overflow 2017-11-23 12:27:28 -05:00
492d71a924 transient keys 2017-11-22 14:49:45 -05:00
6d01a3a7d1 fix (quote) 2017-11-21 21:33:24 +03:00
b71e20dfa3 changed back 2017-11-21 13:25:40 -05:00
474158dd18 rollback. build error 2017-11-21 11:04:32 -05:00
914db816c2 Merge pull request #1014 from AMDmi3/patch-1
Fix flags
2017-11-21 07:17:49 -05:00
4485d6fdf4 Fix flags
-stdlib should not be changed. It breaks build on e.g. FreeBSD where libc++ is used.
2017-11-21 14:35:39 +03:00
2c394661a6 Merge pull request #1011 from hypnosis-i2p/openssl
updated qt to build and to reflect some core changes like log dest
2017-11-19 07:14:50 -05:00
611c1a7502 updated qt to build and to reflect some core changes like log dest 2017-11-19 19:26:36 +08:00
4e8858a764 Merge pull request #1009 from majestrate/reseed-proxy
reseed proxy
2017-11-18 16:15:37 -05:00
fb46de5ca6 Delete old R4SAS's reseed cert 2017-11-18 23:56:52 +03:00
65db96e663 reseed proxy 2017-11-18 09:50:30 -05:00
5109d40d8e don't publish unknown crypto type to Java floodfill again 2017-11-17 14:28:48 -05:00
1ba1fa37f9 update travis-ci stuff (#1006)
* enable osx in travis config
* fix brew commands, change comiler
* disable clang build with make on linux
* update README
* tabulation fix in Crypto.cpp
2017-11-17 20:43:00 +03:00
9c97ee6407 check for existing addressbook record 2017-11-16 01:13:42 +03:00
7477d2c219 fix forgotten log colors 2017-11-15 21:51:03 +03:00
a6fb3b602e add loglevel none (closing #998) 2017-11-15 21:46:20 +03:00
d9b9457b56 update webconsole 2017-11-15 00:49:32 +03:00
cfb6ddbfc6 CRYPTO_TYPE for SAM destinations 2017-11-14 15:05:07 -05:00
7de21c1f93 show proxy tunnel name 2017-11-14 13:20:54 -05:00
100f3380c4 fix upnp definitions and make cmake silent (#999) 2017-11-14 08:38:45 +03:00
20e484bb8b travis-ci cmake fix 2017-11-14 06:34:57 +03:00
94fc1a1cee debian wheezy upnp fix 2017-11-14 03:41:01 +03:00
ae28df5276 2.16.0 2017-11-13 22:20:41 +03:00
3a4f1382f3 2.16.0 2017-11-13 14:09:55 -05:00
01a7e08585 0.2.16 2017-11-13 14:01:04 -05:00
847fd15af2 0.2.16 2017-11-13 13:59:41 -05:00
a21fb17d73 renamed ECIES-P256 2017-11-13 11:50:17 -05:00
0c34bd440b reject routers with RSA signatures 2017-11-13 11:25:42 -05:00
1008510750 Merge pull request #997 from PurpleI2P/openssl
recent changes
2017-11-13 11:23:32 -05:00
34d6eb52d0 Merge pull request #996 from majestrate/stream-limits
Stream limits
2017-11-13 07:46:06 -05:00
5820425b6c Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into stream-limits 2017-11-13 07:26:32 -05:00
a4b39a3648 disable connection limiting by default 2017-11-13 07:26:27 -05:00
3dc5542a28 update mingw makefile 2017-11-13 04:46:19 +03:00
dde4643e77 fix shutdown from webconsole in windows 2017-11-13 03:30:52 +03:00
7a857e08c1 update windows build batch 2017-11-13 03:30:52 +03:00
80a3bd6a3b correct new key pair 2017-11-12 17:31:00 -05:00
7fb8ee60b4 correct random padding for ICIES public key 2017-11-11 22:10:54 -05:00
dca4cf2edb fixed #993. bind inbound tunnel to inhost 2017-11-10 11:27:20 -05:00
2bc33f22df fixed #994. check if keys are set 2017-11-10 09:49:50 -05:00
d14c6e2829 cryptotype for server tunnels 2017-11-09 16:18:59 -05:00
a4ce224cd1 pass correct crypto type to identity 2017-11-09 15:49:27 -05:00
ab1cd3f5cf ECIES for GOST R 34.10 2017-11-09 15:01:07 -05:00
1e75de9bb8 514 bytes ECIES block 2017-11-08 21:06:58 -05:00
19a03c42a5 use generic Decrypt instead ElGamalDecrypt 2017-11-08 20:45:53 -05:00
9e5d1bf0fc cryptotype tunnel configuration parameter added 2017-11-08 15:59:41 -05:00
c5f784719d implement Decrypt for all local destination 2017-11-08 13:49:48 -05:00
60aa459dfc 0.9.32 2017-11-08 11:01:00 -05:00
53d71d29ff call RoutingDestination::Encrypt instead ElGamalEncrypt 2017-11-07 20:30:05 -05:00
81658d2ff9 generic encryption for RoutingDestination 2017-11-07 15:05:22 -05:00
9fa67b0e0a crypto key encryptor and decryptor 2017-11-06 15:54:18 -05:00
88ba494701 fixed build error 2017-11-06 15:12:51 -05:00
efacfced45 CryptoKey added 2017-11-06 13:40:58 -05:00
b3c836f298 Merge pull request #987 from majestrate/gcc-7-ubuntu-artsy-fix
fix gcc 7 on ubuntu
2017-11-05 06:22:49 -05:00
3330bf4f2f fix gcc 7 on ubuntu 2017-11-04 07:53:24 -04:00
e634c89995 generate non-ElGamal encryption keys pair 2017-11-02 16:13:10 -04:00
5aa53eee43 GetIdentity for RoutingDestination 2017-11-02 14:50:57 -04:00
42483b6f32 Merge pull request #986 from PurpleI2P/openssl
recent changes
2017-11-02 14:45:47 -04:00
00bbb81375 ECICS gerenarate keys 2017-11-01 14:06:55 -04:00
5271cdacf2 ECICSDecrypt 2017-11-01 10:59:36 -04:00
6d01726961 use AES-CBC for ECICS 2017-11-01 10:20:11 -04:00
12feac1f50 fixed build error for wheezy 2017-10-31 21:25:52 -04:00
39c1c3567b ECICSEncrypt added 2017-10-30 16:16:21 -04:00
63ae6850d3 Fix #979. Router without host but with introducers is considered as SSU v4 2017-10-30 12:58:20 -04:00
bec24e052c Merge pull request #983 from majestrate/i2np-transport-limits
fix limits when not specififed
2017-10-30 09:54:28 -04:00
91eb2b2c4a fix limits when not specififed 2017-10-30 09:53:41 -04:00
0bae2a3397 Merge pull request #982 from majestrate/i2np-transport-limits
I2np transport limits
2017-10-30 09:23:47 -04:00
42ec6db746 Merge remote-tracking branch 'purple/openssl' into i2np-transport-limits 2017-10-30 08:39:58 -04:00
7a9dc0eec0 use terminate 2017-10-30 08:37:54 -04:00
6441c9d5d8 initial ntcp soft/hard limits 2017-10-30 08:27:55 -04:00
2930d39ce7 Merge pull request #978 from majestrate/http-i2p-outproxy
support i2p outproxy in httpproxy
2017-10-29 10:30:03 -04:00
1500e805dd add is_i2p 2017-10-29 09:56:51 -04:00
b14d1801f0 support i2p outproxy 2017-10-27 08:43:54 -04:00
bc11181d5e tables for GOST R 34.11 2017-10-23 14:25:26 -04:00
9739e677aa Merge pull request #975 from chris-barry/974-apparmor-debian
Add apparmor profile to debian. #974
2017-10-16 01:19:35 +03:00
056f076ae8 Add apparmor profile to debian. #974 2017-10-15 13:40:59 -04:00
7dfb6f4a13 update makefiles 2017-10-13 21:46:10 +03:00
b347b719f3 fixed race condition 2017-10-13 14:38:32 -04:00
7b537a4e94 Merge pull request #972 from radfish/PR--cmake-stdlib-args-for-clang
cmake: add stdlib args for clang build on Linux
2017-10-08 21:46:32 -04:00
291f28fcce cmake: add stdlib args for clang build on Linux
Otherwise linking fails with undefined symbol ... basic_string ... and
libstdc++: DSO not on included in link command.
2017-10-08 19:11:12 -04:00
fa9c39732d change max bandwidth limit 2017-10-05 10:37:28 -04:00
bfdf006bd2 add SAM session in webconsole 2017-10-05 05:29:07 +03:00
057d6ca05b windows warnings, tabulation workaround 2017-10-04 20:16:34 +03:00
7d7f5ff4e2 set default nickname after initialization 2017-10-04 12:40:43 -04:00
6e32f4bc85 set nickname for destination 2017-10-04 12:27:08 -04:00
8460a8f4ef update local destination if changed 2017-09-29 15:34:26 -04:00
8c09a7429c Merge pull request #967 from brain5lug/openssl
missed self assigment check for EDDSAPoint
2017-09-29 06:40:19 -04:00
346bf14b7b added missed invariant for MemoryPool 2017-09-29 10:17:23 +03:00
8e3c9410dc missed self assigment check for EDDSAPoint 2017-09-29 00:48:14 +03:00
cb0552e20d Merge pull request #966 from brain5lug/openssl
fixed perfect forwarding for the memory pool
2017-09-28 17:38:58 -04:00
8c8127dda6 fixed perfect forwarding for the memory pool 2017-09-29 00:03:07 +03:00
1d8a481d59 fix tabulation 2017-09-27 23:41:34 +03:00
dd4f066e95 add graceful shutdown in webconsole for windows
add stop graceful shutdown menu item
add reload menu item
2017-09-27 23:30:30 +03:00
5e0d4163a2 Merge pull request #965 from majestrate/fix-leak-2017-09-27
try fixing leak
2017-09-27 10:34:34 -04:00
7fb2d13a8b use BN_CTX_start and BN_CTX_end instead of removing BN_CTX_start 2017-09-27 09:49:43 -04:00
acde10b46e Merge remote-tracking branch 'purple/openssl' into fix-leak-2017-09-27 2017-09-27 09:48:19 -04:00
c0bcab8bc5 try fixing leak 2017-09-27 09:05:52 -04:00
fd6d0922ab Merge pull request #964 from radfish/PR--cmake-openssl-warn
cmake: issue a non-fatal warning for openssl >=1.1
2017-09-26 21:16:20 -04:00
8179e7dbf8 cmake: issue a non-fatal warning for openssl >=1.1 2017-09-26 20:46:06 -04:00
eabeeaccfe Merge pull request #963 from radfish/PR--cmake-check-openssl-ver
cmake: check openssl version
2017-09-26 12:34:31 -04:00
94bba69dee cmake: check openssl version
See #835 for memory leak issues with OpenSSL >= 1.1
2017-09-26 10:56:02 -04:00
4d23de96d5 Merge pull request #961 from l-n-s/small_patches
fixed typo + added optional full date in logs `logclftime=true`
2017-09-19 22:02:30 -04:00
681810ea38 Use setter method for m_TimeFormat, set time format in Daemon.cpp instead of Log.cpp 2017-09-19 19:46:28 -04:00
d500fe66fd Add option logclftime=true for writing full date and time to logs 2017-09-18 18:49:03 -04:00
05c2adeefd fix typo 2017-09-18 15:24:53 -04:00
d46e0fb474 Merge pull request #958 from majestrate/macos-static
fix up homebrew makefile to allow static linking
2017-09-11 10:00:39 -04:00
330fab2efa update macos i2pd qt build to statically compile in libraries for portability 2017-09-11 08:57:43 -04:00
d59d36f93c fix up homebrew makefile 2017-09-11 07:48:10 -04:00
fd6827fdca add space 2017-09-09 20:13:45 +03:00
dca94f17d7 Merge pull request #952 from hypnosis-i2p/openssl
ui beautifying + fixed tunnels invalid ui data handling
2017-09-08 15:07:25 -04:00
d4e16881ff fixed tunnels invalid ui data handling 3 2017-09-09 01:13:42 +08:00
cd3f274763 fixed tunnels invalid ui data handling 2 2017-09-09 01:09:31 +08:00
1947be4957 fixed tunnels invalid ui data handling 2017-09-08 23:25:25 +08:00
21de4709ea ui beautifying more 2017-09-08 23:16:54 +08:00
ec76381a0b ui beautifying 2017-09-08 23:07:37 +08:00
66661417d7 Merge pull request #950 from hypnosis-i2p/openssl
ui critical fixes
2017-09-08 08:54:38 -04:00
81b79e6e53 ui critical fixes 2017-09-08 19:43:27 +08:00
5ae93d852e Merge pull request #948 from hypnosis-i2p/openssl
fixes #945 and #935
2017-09-08 07:00:30 -04:00
96cb663fa8 some work + fixed red errors on malformed input 2017-09-08 18:58:04 +08:00
1efc2a9b5d little ui fixes 2017-09-08 18:02:12 +08:00
9441c1cffe fixed #935 2017-09-08 17:57:15 +08:00
ef30d2d3b6 fixes #945 2017-09-08 15:59:19 +08:00
1673966e36 Merge pull request #942 from Markovskij/openssl
Make tunnels.conf more readable with QT GUI
2017-09-07 09:37:07 -04:00
1d8f913364 Merge branch 'openssl' of github.com:Markovskij/i2pd into openssl 2017-09-04 07:25:06 +03:00
a549ebc25f Add constants 2017-09-04 07:23:59 +03:00
ce853786b5 Merge pull request #2 from PurpleI2P/openssl
Update
2017-09-04 06:52:57 +03:00
7e0ab6d0b1 Merge pull request #943 from majestrate/connect-proxy
HTTP CONNECT in http proxy
2017-09-03 15:28:28 -04:00
d6f907a05b make it work 2017-09-03 11:13:43 -04:00
b2d1962b81 add http connect to http proxy (untested) 2017-09-03 09:46:55 -04:00
b0a6c9fa53 Make tunnels.conf more readable 2017-09-03 15:55:51 +03:00
7a0337f3db Merge pull request #1 from PurpleI2P/openssl
Update
2017-09-03 14:10:25 +03:00
c1dbd3ffd0 Merge pull request #940 from majestrate/defer-connect
Defer connect
2017-09-01 11:40:26 -04:00
1ea6d2016d add initial connection timeout for i2ptunnel 2017-08-31 12:08:22 -04:00
416589cc93 Revert "add deferred ready checking for destination"
This reverts commit 3f409d0e28.
2017-08-31 10:38:26 -04:00
41ce9d47e5 Revert "re trigger timer"
This reverts commit f87a51034e.
2017-08-31 10:37:58 -04:00
d7e4deab4e Revert "tabify"
This reverts commit 897cfad399.
2017-08-31 10:37:57 -04:00
27782ceddd Revert "clarify"
This reverts commit 7af3b751d4.
2017-08-31 10:37:56 -04:00
a6f62a99b9 Revert "use shared from this"
This reverts commit 4e4def4fb9.
2017-08-31 10:37:53 -04:00
4e4def4fb9 use shared from this 2017-08-31 10:24:07 -04:00
7af3b751d4 clarify 2017-08-31 10:14:06 -04:00
897cfad399 tabify 2017-08-31 10:12:59 -04:00
f87a51034e re trigger timer 2017-08-31 10:07:09 -04:00
3f409d0e28 add deferred ready checking for destination 2017-08-31 09:59:04 -04:00
543566840c Merge pull request #936 from hypnosis-i2p/openssl
ReloadConfig + --log fix
2017-08-27 13:43:09 -04:00
1c3174a277 fixed #841 2017-08-27 21:16:52 +08:00
fc2ae6f887 fixed ReloadConfig(); fixed --log 2017-08-27 20:52:55 +08:00
63e175d389 fixed #913 2017-08-27 20:39:10 +08:00
9bfbba6fea Merge pull request #934 from hypnosis-i2p/openssl
various small qt gui fixes
2017-08-27 07:28:15 -04:00
69d245c4bd Merge pull request #933 from myfingerhurt/openssl
Fix deformed json result with an extra comma
2017-08-27 06:44:02 -04:00
7738eae4b0 general settings widget ui revolution for convenience + widget locks: fixed #927 2017-08-27 16:10:09 +08:00
3d5fb07ca8 various small qt gui fixes 2017-08-27 12:41:10 +08:00
0f0fb266c7 Fix deformed json result with an extra comma
{"id":1,"result":{"i2p.router.net.bw.in":48,"i2p.router.net.bw.out":48,},"jsonrpc":"2.0"}
You can see there is an extra comma behind the number 48.
2017-08-27 12:57:06 +09:00
5c3d6298b0 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2017-08-25 14:46:24 -04:00
028f0bdb8d Fixed #931. don't insert null pointer into DHkeys list 2017-08-25 14:45:58 -04:00
44bcdc6866 Merge pull request #932 from Markovskij/openssl
Web interface fix
2017-08-24 20:46:21 -04:00
b9f6f92bad Web interface fix 2017-08-25 02:37:01 +03:00
1607535416 strip out Accept and From headers 2017-08-24 15:13:15 -04:00
f6ced9279b new reseed added 2017-08-20 17:34:53 -04:00
95af716a96 Merge pull request #925 from hypnosis-i2p/openssl
Qt GUI now shows buttons under Status and their corresponding info panes
2017-08-20 06:56:39 -04:00
07fe51fa25 some qt gui changes 2017-08-20 13:40:14 +08:00
822995cbaf ignored android/libs/ 2017-08-20 13:40:14 +08:00
db0e02c05d qt ui - status commands are now pushbuttons with no handlers 2017-08-20 13:40:14 +08:00
856dda68db qt ui - now all buttons have handlers 2017-08-20 13:40:14 +08:00
163cbcb89d qt ui - status main page now works 2017-08-20 13:40:14 +08:00
a79f614e12 qt ui - now pixel perfect buttons 2017-08-20 13:40:14 +08:00
7d3a818565 qt ui - laid out better 2017-08-20 13:40:14 +08:00
978bb47b92 qt ui - settings buttons renamed to *Settings 2017-08-20 13:40:14 +08:00
b791a6a348 qt ui - status buttons done 2017-08-20 13:40:14 +08:00
c21c1f5225 Merge pull request #920 from PurpleI2P/openssl
2.15.0
2017-08-17 14:20:41 -04:00
d6253b1dee remove dupe lines 2017-08-17 21:17:25 +03:00
390bb07cca 2.15.0 2017-08-17 14:09:16 -04:00
309822d933 teminate hadlers upon cleanup 2017-08-10 20:29:35 -04:00
8cb612c10c Merge pull request #919 from l-n-s/peertest_fix2
Don't do peertest if nat=false. FIX #915
2017-08-09 11:09:32 -04:00
7e244455c4 Don't do peertest if nat=false. FIX #915 2017-08-09 10:52:52 -04:00
907fe3d8d9 Merge pull request #918 from majestrate/readme_fixups
explicitly link to build instructions in readme
2017-08-09 08:51:02 -04:00
6420e33fb8 link to build instructions in readme 2017-08-09 08:50:00 -04:00
0b560fdd27 0.9.31 2017-08-08 09:29:30 -04:00
04297eda80 Merge pull request #916 from majestrate/vanity
add stuff for address generator tool
2017-08-07 15:05:19 -04:00
c13fd2261e add stuff for address generator tool 2017-08-07 14:00:50 -04:00
034bff5b2f added gostcoin family certificate 2017-08-02 21:19:12 -04:00
987ad214ff avoid bind exeptions during reload 2017-08-02 21:00:04 -04:00
d11ac64b95 stop I2P tunnel upon deletion 2017-07-28 15:40:07 -04:00
4c8c3b6947 add and remove tunnels without stopping others 2017-07-28 15:12:15 -04:00
d47d8d22a3 removed all Accept-* headers but Accept-Encoding 2017-07-28 11:16:42 -04:00
0ec9defc6e Merge pull request #911 from hypnosis-i2p/openssl
qt ui fixes
2017-07-28 06:27:12 -04:00
4776f11b6a http proxy and socks - initialized comboboxes correctly 2017-07-28 12:57:19 +08:00
3118d7bede restart button now has a handler 2017-07-28 11:59:45 +08:00
a83be187f3 ui fixes 2017-07-28 10:43:20 +08:00
deb5e435e5 fixed i2pd qt gui a bit 2017-07-28 09:21:41 +08:00
9f824f3aa9 remove Accept-Language 2017-07-27 18:45:53 -04:00
032e68da05 Merge pull request #908 from r4sas/openssl
add socks.outproxy.enabled and workout with Config.cpp tabulation
2017-07-19 07:12:19 -04:00
486661d6c6 implement != 2017-07-18 18:27:07 -04:00
aa86ab97f0 update i2pd.conf example, update socks proxy tunnel 2017-07-19 00:36:56 +03:00
a17f07495a add socks.outproxy.enable option 2017-07-19 00:21:02 +03:00
16d3440a4c tabulation workout on Config.cpp 2017-07-18 23:55:53 +03:00
d7b412c1eb overwrite existing address 2017-07-18 15:58:32 -04:00
e5751334d6 update doxygen config 2017-07-15 10:02:15 +03:00
1fb1d7e4e9 don't create SSU session if endpoint is not specified. Wait from RelayResponse 2017-07-13 14:13:58 -04:00
adc20e78da Merge pull request #906 from l-n-s/fix_docker
Docker: fix permissions issue
2017-07-11 21:07:25 +00:00
d499e250e0 Docker: fix permissions issue 2017-07-11 17:00:50 -04:00
68166c22b3 Merge pull request #904 from l-n-s/fix_netdb_thread
NetDb: If NetDb is empty, throw exception instead of killing NetDb thread
2017-07-11 06:28:33 -04:00
06b2b26e39 NetDb: If NetDb is empty, throw exception instead of killing NetDb thread 2017-07-11 02:55:38 -04:00
641ca3d49d install windows service with daemon argument 2017-07-10 01:14:55 +03:00
6d259e00a3 add additional break row 2017-07-08 16:59:10 +03:00
2bc5b97662 separate transports output for IPv4 and IPv6 2017-07-08 16:54:12 +03:00
676c61aa99 fix typo 2017-07-08 16:53:33 +03:00
eade8003ef Merge pull request #902 from l-n-s/fix_options
Fix options: make useless boolean flags configurable in command line
2017-07-07 22:13:01 -04:00
817bbefac6 Fix options: make useless boolean flags configurable in command line 2017-07-07 18:23:27 -04:00
cded6206dc cleanup unused destinations 2017-07-07 15:12:34 -04:00
c287fb58bd reference counter for destinations 2017-07-06 16:12:06 -04:00
1b97f9b6c9 Merge pull request #894 from kayrus/kayrus/run_systemd
Create run dir for i2pd process in systemd unit file
2017-06-23 14:52:14 +03:00
14ca3fc2f3 Merge pull request #896 from PurpleI2P/openssl
recent changes
2017-06-23 07:41:31 -04:00
4bc1143418 update makefile to use gcc 7 on archlinux 2017-06-23 13:02:31 +03:00
4267063dba Create run dir for i2pd process in systemd unit file 2017-06-23 10:25:13 +02:00
8f8b4536b6 add future R4SAS reseed cert replacement
warn: will use after 2.16.0 release
2017-06-22 15:45:23 +03:00
8121ab5163 added including of configs and certificates in mingw batch build 2017-06-22 15:37:02 +03:00
76fab1fea8 reseeds update 2017-06-18 16:41:09 -04:00
143b235a22 Merge pull request #892 from hypnosis-i2p/openssl
Qt GUI + more of SAM debug logging
2017-06-17 08:38:18 -04:00
3a89f2c32f now starting the i2pd daemon - uncommented emit start line 2017-06-17 20:31:00 +08:00
7bab92042a removed some obsolete files 2017-06-17 20:23:33 +08:00
7379b4ddd2 merged with upstream 2017-06-17 20:23:33 +08:00
298181999d qtui first draft completed 2017-06-17 20:23:33 +08:00
61e1e7fe8f added one missing sigtype to Identity.h. Some work on qt gui. 2017-06-17 20:23:33 +08:00
b3050af1a7 some work on desktop qt gui 2017-06-17 20:23:33 +08:00
275da075e0 various qt work 2017-06-17 20:23:33 +08:00
9925e2732a rework + now restarts after app kill event 2017-06-17 20:23:33 +08:00
59b3daabc5 qt gui preliminary results 2017-06-17 20:23:33 +08:00
f2b0f64138 tmp 2017-06-17 20:23:33 +08:00
5df77eb474 qt forms now work even better! 2017-06-17 20:23:33 +08:00
f202fb9af6 qt forms now work! 2017-06-17 20:23:33 +08:00
5b769869d0 fixed qt .pro file 2017-06-17 20:23:33 +08:00
8e266058ae more of SAM debug logging 2017-06-17 20:23:33 +08:00
7c21712e80 Merge pull request #891 from r4sas/win_patch
remove msvc project and fix some warnings
2017-06-11 15:13:37 +03:00
193fc343fe reupload mistakenly deleted iss project 2017-06-11 09:38:07 +03:00
a1e9c3d270 remove NSIS template 2017-06-11 09:34:19 +03:00
629261c4be remove msvc and NSIS project files
fix some windows build warnings
2017-06-11 09:29:31 +03:00
f6d3a6239c Merge pull request #884 from l-n-s/dockerfile_updates
Add updated Dockerfile
2017-06-08 16:21:45 +02:00
83c5131b67 skip expired introducer 2017-06-07 10:53:50 -04:00
36afef3498 Merge pull request #889 from PurpleI2P/openssl
recent changes
2017-06-05 09:02:42 -04:00
52c0485b0c Merge pull request #887 from BOPOHA/patch-2
bogus date in contrib/rpm/i2pd.spec
2017-06-04 18:43:03 -04:00
8c23a091da bogus date in contrib/rpm/i2pd.spec
fixed bad date and  bogus date in %changelog
2017-06-05 00:41:14 +02:00
ca121f80ee Merge pull request #885 from ryzhovau/spaces
Cosmetic changes for "Host XXX.YY not inside I2P network" message
2017-06-04 19:57:55 +03:00
b48846506f Cosmetic changes for "Host XXX.YY not inside I2P network" message
Signed-off-by: Alexander Ryzhov <github@ryzhov-al.ru>
2017-06-04 19:39:15 +03:00
a1c72be2a9 Add updated Dockerfile 2017-06-04 02:47:27 -04:00
2098368417 Merge pull request #883 from BOPOHA/patch-1
base version updated to 2.14.0
2017-06-04 05:51:33 +00:00
4014d86a57 base version updated to 2.14.0 2017-06-04 00:23:22 +02:00
e84e8748bd fixed android build 2017-06-01 10:41:15 -04:00
bd8166e630 2.14.0 2017-06-01 10:05:20 -04:00
03d1519b39 2.14.0 2017-06-01 10:04:02 -04:00
36c4719570 Merge pull request #881 from majestrate/ntcp-socks
NTCP SOCKS/HTTP Proxy support
2017-05-29 10:36:46 -04:00
7c970771c5 fix 2017-05-29 10:09:24 -04:00
3f64c042bd Fixed #880. Print if AESNI or AVX enabled 2017-05-29 10:08:49 -04:00
e336cbfb2d add http proxy, change socks4a to socks5 2017-05-29 09:57:30 -04:00
24eec76428 more 2017-05-29 02:16:57 -04:00
71c9b15ff1 more 2017-05-29 02:12:16 -04:00
2940f0d67c capture by value not reference 2017-05-29 01:53:34 -04:00
cbb1d2d3b5 more whitespace bullshit 2017-05-29 01:44:06 -04:00
36dd11a899 more whitespace bullshit 2017-05-29 01:39:11 -04:00
be88969b79 more whitespace bullshit 2017-05-29 01:38:32 -04:00
d91ad54ed9 more whitespace bullshit 2017-05-29 01:37:19 -04:00
1330228080 fix whitespace bullshit 2017-05-29 01:35:11 -04:00
3ea1eca350 ntcp socks proxy (initial) 2017-05-29 01:28:16 -04:00
a4e6d8120b handle iexp 2017-05-24 12:49:36 -04:00
3219de235c Merge pull request #875 from majestrate/cmake-avx
add AVX option to cmake build system
2017-05-22 14:37:42 -04:00
4e5c2ff620 add AVX option to cmake build system 2017-05-22 11:12:08 -04:00
63e25f0ff9 Merge pull request #873 from majestrate/fix-addressbook
try fixing issue #871
2017-05-22 10:51:48 -04:00
840225b580 try fixing issue #871 2017-05-22 10:34:29 -04:00
bd221d60d6 Merge pull request #872 from majestrate/fix-websocket-cmake
fix cmake compile error with websockets
2017-05-21 08:38:07 -04:00
8a3bb50143 fix cmake compile error with websockets 2017-05-21 08:18:16 -04:00
e4cd1a465c ignore comments 2017-05-10 09:36:58 -04:00
2173a9f246 Merge pull request #869 from bit/patch-1
Build depends on zlib.h (zlib1g-dev)
2017-05-08 14:58:33 -04:00
bit
973a838e2a Build depends on zlib.h (zlib1g-dev) 2017-05-08 12:54:08 +02:00
d95ee55497 skip comment address line 2017-05-05 13:54:21 -04:00
124e2e759c fix #846. ability to limit transit bandwidth 2017-05-04 14:58:12 -04:00
ac918e3618 0.9.30 2017-05-04 09:40:00 -04:00
009a720c32 disabled dead reseed 2017-05-02 21:08:51 -04:00
0dbfa43dad moveable to SD card 2017-05-02 19:25:34 -04:00
e0b4d36a74 changed target sdk back to 25 2017-05-02 18:06:06 -04:00
a441474d75 show transit bandwidth 2017-05-02 14:20:00 -04:00
cfd3c3628e count and show transit traffic 2017-04-27 16:11:37 -04:00
474d52f805 minor performance improvements 2017-04-27 10:12:22 -04:00
7ee8bdf2f3 Merge branch 'master' of https://github.com/PurpleI2P/i2pd into openssl 2017-04-27 10:11:45 -04:00
8a9757111f enable SAM by default 2017-04-24 12:20:15 -04:00
65dda4a70b Merge pull request #865 from l-n-s/update_config
Sample config: enable SAM by default + update description for notransit
2017-04-24 15:10:57 +00:00
1ed39dbbed Sample config: enable SAM by default + update description for notransit 2017-04-24 11:07:54 -04:00
8162c2e4e4 GST added 2017-04-23 06:52:37 -04:00
a7d74f3f98 update debian stuff 2017-04-23 07:09:12 +03:00
ad83ae1e7a removed stdafx 2017-04-22 14:52:19 -04:00
066374906e Merge pull request #862 from r4sas/makefile
update Makefile, tunnels.conf, android platform
2017-04-22 05:35:53 +04:00
ec79a4a6f6 Merge pull request #861 from majestrate/fix-case-insensative-include
remove uneeded lines in qt build file
2017-04-21 21:34:02 -04:00
9fae215db4 update android platform to 14 2017-04-22 04:20:22 +03:00
92b40c9485 update tunnels.conf 2017-04-22 04:19:32 +03:00
19fc59739f update makefile-s 2017-04-22 04:17:01 +03:00
7e0ae4c601 remove uneeded lines in qt build file 2017-04-21 21:01:48 -04:00
81c2f4b30b Merge pull request #860 from majestrate/fix-case-insensative-include
NetDb.h -> NetDb.hpp
2017-04-21 20:46:56 -04:00
e238f7ed37 NetDb.h -> NetDb.hpp for case insensative file systems clashing with libc's netdb.h 2017-04-21 20:04:16 -04:00
2756f3332c changed android target sdk to 25 2017-04-21 12:05:58 -04:00
14b3eefbaf change minimal requirement to android 4.0 2017-04-21 11:54:08 -04:00
dc946582a4 generic path to sdk 2017-04-21 09:54:35 -04:00
dfa14a73a8 Merge pull request #858 from majestrate/restructure
Restructure
2017-04-21 08:52:59 -04:00
112aa845f4 use correct #include in Win32 2017-04-21 07:20:50 -04:00
150a309175 include daemon directory for Win32 mingw 2017-04-21 07:08:31 -04:00
55c14819a3 Merge pull request #859 from PurpleI2P/openssl
recent changes
2017-04-21 06:53:56 -04:00
598897caa6 fix mingw build 2017-04-21 06:48:57 -04:00
cf3f8a796a fix path 2017-04-21 06:36:49 -04:00
bffc294b13 fix path 2017-04-21 06:35:39 -04:00
4cc3b7f9fb restructure build to separate the 3 main components into 3 subdirectories
libi2pd for core libs

libi2pd_client for i2pd client libs

daemon for i2pd daemon libs
2017-04-21 06:33:45 -04:00
b3161dde93 Merge pull request #855 from v2e/patch-2
kbps --> KBps
2017-04-19 07:05:29 -04:00
v2e
5550eabac1 kbs -- KBs in i2pd.conf 2017-04-19 11:39:01 +03:00
v2e
b2b320174b kbps -- KBps in Config.cpp 2017-04-19 11:36:19 +03:00
dd79348b35 delete used tag before update 2017-04-14 22:08:43 -04:00
bd6ce7d4da reduced memory usage 2017-04-14 10:19:26 -04:00
7a67670e1a Fixed #846. httpproxy.addresshelper config parameter added 2017-04-11 14:36:28 -04:00
539bf482b9 Merge pull request #844 from majestrate/datagram-fixes
Datagram fixes
2017-04-09 09:16:37 -04:00
ed67ce7f33 tabifty 2017-04-09 08:53:47 -04:00
d91c7e5e79 fix datagram bugs 2017-04-09 08:52:42 -04:00
4f1dfe2ef7 fixed android build 2017-04-08 17:21:56 -04:00
36ea6c13df Merge pull request #843 from majestrate/obep-ibgw
Allow point to point client tunnels to use OB tunnels that share OBEP and IBGW of remote destination
2017-04-08 15:32:26 -04:00
3acb0aac98 tabify 2017-04-08 15:16:51 -04:00
fdf4b3878f tabify 2017-04-08 15:15:59 -04:00
2fe71782a7 tabify 2017-04-08 15:14:47 -04:00
89dfe2b763 delay request 2017-04-08 15:10:16 -04:00
9b62f238ed add option for client tunnels to build tunnels such that OBEP==IBGW 2017-04-08 15:10:06 -04:00
987688f196 GOST hash of a Little Endian stream 2017-04-07 11:17:40 -04:00
46cb95f16c Merge pull request #842 from PurpleI2P/openssl
2.13.0
2017-04-06 10:02:54 -04:00
4e1fcbb706 update appveyor tag to 2.13 2017-04-06 17:01:39 +03:00
e4c038762b 2.13.0 2017-04-06 09:48:47 -04:00
86dfa200a6 update changelog to 2.13 2017-04-06 16:32:00 +03:00
165cf980d2 fixed memory leak 2017-04-05 18:26:56 -04:00
13ccb16a4a fixed memory leak 2017-04-05 17:44:23 -04:00
f4b5426865 update debian/control 2017-04-04 18:47:50 +03:00
c2f62ba52a persist incoming tags 2017-04-03 15:05:10 -04:00
b2d2c56a09 Merge pull request #839 from PurpleI2P/openssl
recent changes
2017-04-03 11:47:31 -04:00
abf0f5ac87 fixed typo 2017-03-31 12:26:20 -04:00
fa1965deb4 assign signature types 8 and 9 to GOST R 34.10 2017-03-31 10:04:39 -04:00
1f76dc78d8 cleanup acceptor for AcceptOnce 2017-03-30 20:27:31 -04:00
4448884a3e handle SIGNATURE_TYPE for DEST GENERATE 2017-03-30 15:43:02 -04:00
e3fc23bae8 restore previous acceptor later 2017-03-30 13:40:29 -04:00
29ceed74a2 don't drop destination's acceptor if inactive acceptor gets closed 2017-03-30 11:59:39 -04:00
382308c3fd change acceptor back to previous before processing 2017-03-30 11:22:38 -04:00
3d1b6e29c6 Merge pull request #838 from majestrate/sam-crash-fix-2017-03-29
try fixing sam crashyness
2017-03-29 15:01:22 -04:00
3a9a5ec669 try fixing sam crashyness 2017-03-29 14:38:55 -04:00
8c37c491a9 send STREAM CONNECT follow on data 2017-03-29 13:59:48 -04:00
fdf11e6038 allow unknown options for api 2017-03-29 10:51:32 -04:00
8e558f0826 recover public key from GOST R 34.10 signature 2017-03-26 08:55:15 -04:00
69804c23f1 check if destination keys are correct 2017-03-25 16:53:20 -04:00
9aa9a62ed4 AESNI for x86 2017-03-25 08:16:56 -04:00
d9b79f47c8 GetGroup () for GOST curve 2017-03-23 19:26:39 -04:00
249bc42667 merge S,P,L for GOST R 34.11-2012 2017-03-22 10:26:11 -04:00
644c184f7c Merge branch 'openssl' into openssl 2017-03-22 17:49:44 +04:00
66cfae7b3b more memory allocation optimization 2017-03-21 20:51:13 -04:00
bd2c2acd5f use CryptoProA params for GOST R 34.10-2012 256 bits 2017-03-21 11:48:34 -04:00
13aab750dd GOST signature unit test added 2017-03-21 10:45:57 -04:00
7a51abc2f9 GOST unit tests added 2017-03-21 09:44:09 -04:00
44a3e08095 GOST unit tests added 2017-03-21 09:43:36 -04:00
2aa8cf7104 update gitignore 2017-03-21 15:24:27 +03:00
1b1cfe1b92 rewrote win build script and moved it to build folder 2017-03-21 15:03:31 +03:00
199c2cdb66 some improvement of GOST R 34.11 2017-03-20 14:25:38 -04:00
726828a487 use GOST 34.11-2012 with GOST 34.10 2017-03-20 11:57:39 -04:00
fcbf81a3d4 correct implementation of L for GOST R 34.11-2012 2017-03-20 11:33:45 -04:00
7637b51ba5 fix #833. Handle SIGPIPE 2017-03-20 09:52:43 -04:00
3afed3b316 Merge pull request #832 from PurpleI2P/openssl
recent changes
2017-03-19 11:02:36 -04:00
3d6e334007 Appveyor merge (#1) 2017-03-18 05:22:02 +04:00
6c848a57b6 recreated appveyor config 2017-03-18 02:40:39 +03:00
eb12d43800 update windows build scripts 2017-03-17 20:59:10 +03:00
465366e644 new ressed 2017-03-16 20:55:05 -04:00
289e9c809f correct padding for GOST 34.11 2017-03-16 16:30:32 -04:00
8b40354786 GOST R 34.11-2012 implementation 2017-03-16 13:31:25 -04:00
8de8de1b1e GOST 34.11-2012 functions 2017-03-15 20:46:27 -04:00
4b76c76712 correct x for tc26 paramSetA 256 2017-03-15 14:59:17 -04:00
6b9a270506 enable TC26 paramSet A 512 for GOST 34.10-2012 2017-03-15 12:41:02 -04:00
da2c49ab66 tc26 paramSetA 512 for GOST 34.1002012 2017-03-14 21:15:17 -04:00
af2a3f3a65 Gost.cpp added 2017-03-14 21:14:23 -04:00
6369a900da added TC26 param sets for GOST R 34.10-2012 2017-03-14 20:03:44 -04:00
e877247032 support of GOST 34.10-2012 512 bits 2017-03-14 16:41:06 -04:00
5bcc5ff873 initial support of GOST R 34.10-2012 2017-03-14 16:02:16 -04:00
a52064463e fixed race condition 2017-03-14 12:03:51 -04:00
6ed7f19673 moved GOST to separate file 2017-03-13 20:28:36 -04:00
9aba0ba5a8 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2017-03-12 14:48:47 -04:00
5803a84bd7 change establish timeout to 10 seconds 2017-03-12 14:48:11 -04:00
ce0bf0f4b4 re-fix year 2017-03-12 18:29:57 +03:00
65ed57aff4 fix year 2017-03-12 18:28:25 +03:00
1317b80fca terminate incoming connection by timeout 2017-03-11 21:32:35 -05:00
f0d6145fa6 terminate incoming connection by timeout 2017-03-11 21:17:19 -05:00
c0c157ecef use common context for ElGamal encrypt/decrypt 2017-03-11 16:48:54 -05:00
4bb607f180 Merge pull request #824 from BOPOHA/openssl
i2pd.spec: changed Release format, upgrade Version
2017-03-10 19:25:28 -05:00
2eec205e31 i2pd.spec: changed Release format, upgrade Version 2017-03-11 00:31:00 +01:00
bd8cdd345a A,B,B param sets for GOST R 34.10 2017-03-10 16:57:56 -05:00
7caf3ea7d0 eliminate dependancy from GOST engine for GOST R 34.10 2017-03-10 13:21:22 -05:00
ba89c60b6d correct param set for GOST R 34.10 verification 2017-03-10 11:55:30 -05:00
084e48d6dd ZEC added 2017-03-10 11:53:49 -05:00
1bed3f3936 ZEC added 2017-03-10 11:53:05 -05:00
cd860bfbf8 correct param set for GOST R 34.10 signing 2017-03-09 21:46:34 -05:00
439c2d445c GOST R 34.10 sign 2017-03-09 20:13:21 -05:00
7f71d5dbd8 generate GOST R 34.10 keys with param set 2017-03-09 18:46:28 -05:00
831c835106 GOST R 34.10 param sets 2017-03-08 19:35:51 -05:00
5dfb7cb938 GOST R 34.10 curve added 2017-03-07 16:36:17 -05:00
044d6a2207 eliminate some BIGNUM allocation overhead 2017-03-07 15:02:01 -05:00
955b46534d eliminate some BIGNUM allocation overhead 2017-03-07 14:51:05 -05:00
0e8d80e055 eliminate some BIGNUM allocation overhead 2017-03-07 14:24:19 -05:00
92fc736cfa recreate SSU session again if session key is invalid 2017-03-05 17:08:20 -05:00
60ed43c11b #818. Exploratory config 2017-02-28 15:58:53 -05:00
319f72ae2a 0.9.29 2017-02-28 15:19:49 -05:00
04dc34260f replaced stringstream by a list of buffers 2017-02-26 15:05:14 -05:00
a8196d1f33 Merge pull request #816 from PurpleI2P/openssl
recent changes
2017-02-26 09:29:14 -05:00
1ce6ad5ccc cleanup send buffer 2017-02-24 11:04:40 -05:00
145e36925f check certificate size 2017-02-23 22:08:25 -05:00
c07928144c GOST support for Android openssl 1.1 2017-02-21 15:43:03 -05:00
d8c30f6cbb fixed typo 2017-02-21 11:38:11 -05:00
e968c6a2a4 fixed typo 2017-02-21 11:36:53 -05:00
ffc3a31d09 fixed andorid build 2017-02-21 11:23:14 -05:00
d6e037dd28 fixed build error 2017-02-19 19:31:37 -05:00
83b9b3bf4a enable GOST R 34.10 signatures from netid!=2 2017-02-19 18:08:10 -05:00
1cb89ce20d set correct curve parameters for GOST R 34.10 2017-02-19 14:45:10 -05:00
d75b916153 correct GOST engine initialization 2017-02-18 18:45:21 -05:00
192b484a8c fixed typo 2017-02-18 07:00:14 -05:00
85e2137d0e disable incorrect check 2017-02-18 09:14:23 +03:00
c1042c8f20 GOST R 34.11 hash 2017-02-17 22:26:24 -05:00
c91b05bd4b set correct curve from GOST R 34.10 signer and verifier 2017-02-17 13:37:53 -05:00
f8a09df5c0 generate GOST R 34.10 keys pair 2017-02-16 21:45:12 -05:00
9363db816c GOST R 34.10 signer and verifier 2017-02-16 21:18:18 -05:00
22af4da4d4 initial support of GOST crypto 2017-02-16 16:27:24 -05:00
16fa10b056 fix incorrect traffic counting 2017-02-16 17:45:38 +03:00
f044851abb fix typo 2017-02-16 16:29:08 +03:00
217e99a0e2 updated InnoSetup script
deleted old unused icon
added doxygen "docs/generated" folder to gitignore
2017-02-16 16:16:19 +03:00
1bc4aea217 Merge pull request #808 from l-n-s/update_docs
Update docs
2017-02-16 11:52:32 +00:00
4997934bfe Fix paths for moved contrib files 2017-02-16 06:48:06 -05:00
4905dded87 Moved files from docs/ to contrib/ 2017-02-16 06:36:01 -05:00
ff6447ae2b Merge pull request #806 from l-n-s/update_docs
Update docs
2017-02-16 06:37:55 +00:00
7f51857fa5 Update README.md 2017-02-16 01:20:59 -05:00
78c3babc37 Move docs to new repo 2017-02-16 01:14:07 -05:00
83300044dd fix osx upnp support
fix tabulation in UPnP.cpp
2017-02-15 09:04:40 +03:00
55f891e2aa fixed build error for gcc 4.7 2017-02-14 14:20:37 -05:00
7ae40d89c1 updated ChangeLog 2017-02-14 12:39:59 -05:00
29cc1cf390 Merge pull request #805 from PurpleI2P/openssl
2.12.0
2017-02-14 12:38:32 -05:00
960d9a8534 updated ChangeLog 2017-02-14 12:36:54 -05:00
bcc8529bfc update year, maintainer, ulimit -n 4096 default 2017-02-14 20:17:20 +03:00
d773647a20 2.12.0 2017-02-14 12:11:43 -05:00
3a5a0837c7 don't show error if stream closed 2017-02-14 12:11:30 -05:00
44cfe6af1c upstream pull 2017-02-13 14:17:48 +03:00
cf6d445080 winapi - fix style, delete hFont object after drawing (fixes overflow) 2017-02-13 14:12:48 +03:00
422f8b3660 publish with min interval of 20 seconds 2017-02-12 20:52:46 -05:00
b097938f47 compressed addressbook request 2017-02-12 15:11:19 -05:00
c231eff4b1 MTU size of 1488 for ipv6 2017-02-12 10:12:12 -05:00
1ddc96f965 correct publication verification 2017-02-12 10:08:52 -05:00
13111c4b42 don't re-schedule resend timer if nothing to resend 2017-02-11 18:18:37 -05:00
7c70dbce65 Merge pull request #801 from l-n-s/apparmor
Added AppArmor profile
2017-02-10 18:56:38 +00:00
25559f1772 Added AppArmor profile 2017-02-10 13:51:19 -05:00
c010c83654 signaturetype ofr HTTP and SOCKS proxy 2017-02-10 12:51:55 -05:00
2057531e8c Processing transferred data (winapi) 2017-02-09 21:41:52 +03:00
277d4d9333 Added status output to main window 2017-02-09 19:45:22 +03:00
051e642c0c fixed #798. Correct buffer size 2017-02-09 11:05:42 -05:00
a8778e358d handle HTTP response 2017-02-06 21:39:15 -05:00
d2edbfd6fa eliminate extra copy 2017-02-06 12:50:54 -05:00
d96dbe9365 use _USE_32BIT_TIME_T in win32 build
Add i2pd.exe in .gitignore
2017-02-06 16:18:23 +03:00
35b5dcdb22 new reseed 2017-02-05 17:08:42 -05:00
66f3bd186f send http headers in original order 2017-02-04 22:39:54 -05:00
7ae38a71cc reduced I2NP message size for tunnel gateway 2017-02-03 20:57:04 -05:00
2ed356be65 Merge pull request #794 from l-n-s/reseed_from_zip
Added protection from clickjacking (#706)
2017-02-03 14:38:25 -05:00
99436c1334 Added protection from clickjacking (#706) 2017-02-03 14:13:55 -05:00
9e57a4ea28 use I2NP message of tunnel data length for TunnelData 2017-02-02 20:45:33 -05:00
19e5b8cc50 Merge pull request #793 from l-n-s/reseed_from_zip
Added reseed.threshold + refactor
2017-02-02 15:52:25 -05:00
33310732a6 Add reseed.threshold option 2017-02-02 15:40:57 -05:00
a03bf89190 Refactored code to Reseed module 2017-02-02 15:25:25 -05:00
1b089ca5e6 Merge pull request #792 from l-n-s/reseed_from_zip
Added option to reseed from ZIP file
2017-02-01 17:34:51 -05:00
21e23d5511 Added option to reseed from ZIP file 2017-02-01 17:17:25 -05:00
8a2c4ab3de don't create identity if presented in netdb already 2017-02-01 15:20:03 -05:00
040585bf3d Merge pull request #791 from PurpleI2P/openssl
recent changes
2017-02-01 14:18:41 -05:00
9030b3e04c Merge pull request #790 from majestrate/sam-datagrams
udp datagrams and whitespace cleanups in SAM
2017-01-31 12:14:27 -05:00
0b46495afd i2p.router.net.tunnels.successrate 2017-01-31 12:12:39 -05:00
ace16d473f fix 2017-01-31 11:55:57 -05:00
925c51420d use correct format 2017-01-31 11:32:50 -05:00
764b8ab7a5 wrong param 2017-01-31 11:22:28 -05:00
cb6a1bfb1d unindent 2017-01-31 11:20:16 -05:00
775b9f30f0 indentation fixes and SAM datagrams 2017-01-31 11:16:55 -05:00
76fd1c5c58 udp sockets for sam 2017-01-31 11:06:45 -05:00
3e2605490f cleanup error messages 2017-01-30 20:36:35 -05:00
7094588c53 print zlib error codes 2017-01-30 19:56:06 -05:00
3523047243 #788 ReseedFromZIPFile added 2017-01-30 19:31:01 -05:00
bdcbaa031d clean transit tunnels endpoints 2017-01-29 19:16:34 -05:00
f722b3e9cb Moved reopening of log to SIGUSR1 (16)
Added --pidfile option to init.d script
2017-01-29 17:08:36 +03:00
2d46cb072e disabled cleanup() before deleting stream on termination (line 54) 2017-01-28 19:23:14 +03:00
28cf450bfa show status of shared local destination 2017-01-28 09:18:30 -05:00
4aa48fb4b6 websocks added 2017-01-27 20:41:15 -05:00
aa86593702 send correct response if JSON parse error 2017-01-27 14:51:06 -05:00
faa368cc07 show if router is connected in i2p.router.status 2017-01-26 15:59:33 -05:00
a840ed06b7 update android notification icon
update android qt app icon
add mingw build batch and .gitignore
2017-01-26 11:08:25 +03:00
7196bfd157 keep bandwidth caps if unreachable 2017-01-25 16:37:21 -05:00
a6785e9143 support of 'X' in RouterInfo 2017-01-25 16:14:01 -05:00
4d2f26b1cd limit number of precalculated DH pairs 2017-01-25 11:20:15 -05:00
188987a8ff eliminated deprecated function 2017-01-23 16:22:48 -05:00
14d74d3230 use openssl 1.1 for androidn build 2017-01-23 15:36:45 -05:00
bcd6bd6b04 correct handle of AESNI/AVX 2017-01-23 13:22:03 -05:00
8e4bd7fe4a build with openssl 1.1 2017-01-23 13:14:08 -05:00
8ab552793a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2017-01-22 21:22:47 -05:00
29944f6bf2 cleanup stream upon termination 2017-01-22 21:22:12 -05:00
162b60a05b Added script - builder for mingw. 2017-01-22 11:00:58 +03:00
da50d92d1e Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2017-01-21 19:00:30 -05:00
a746f5657f calculate shared key in separate thread for incoming connection 2017-01-21 18:59:50 -05:00
65ccc5bfce send actual local address to webirc 2017-01-20 10:02:16 -05:00
34939f9381 calculate shared key in separate therad 2017-01-19 22:00:02 -05:00
26e7821aaa Merge pull request #781 from PurpleI2P/openssl
recent changes
2017-01-19 21:57:08 -05:00
298c5f0de2 moved v6 receiver to separate thread 2017-01-19 15:47:01 -05:00
a6c2b25f6f increased socket buffer 2017-01-19 11:19:09 -05:00
3a8c90c0d4 acquire shared 2017-01-19 10:20:34 -05:00
a25ce2296a rollback 2017-01-19 09:58:55 -05:00
280407a553 new reseed 2017-01-18 20:04:23 -05:00
32c98e2161 correct packet size 2017-01-18 19:59:25 -05:00
2cbdb0bc17 fixed shared_ptr error 2017-01-17 12:13:56 -05:00
4317694c64 memory pool for SSU packets 2017-01-16 22:22:51 -05:00
e0879fbccb Merge pull request #779 from PurpleI2P/openssl
recent changes
2017-01-16 22:06:32 -05:00
9cb8e194b0 use generic container 2017-01-16 15:58:05 -05:00
dc914b1806 multithreaded memory pool 2017-01-16 15:40:01 -05:00
c70817b21a Merge pull request #778 from majestrate/datagram-fix-2017-01-13
use std::shared_from_this for DatagramSession
2017-01-16 09:01:25 -05:00
77918fd412 use std::shared_from_this 2017-01-16 07:54:56 -05:00
90d02234c7 Merge pull request #777 from l-n-s/fix_api_netid
Respect for netId option in api.cpp #696
2017-01-13 14:30:37 -05:00
b0b1c5af71 Respect for netId option in api.cpp #696 2017-01-13 14:24:53 -05:00
a8bd87938d honor enableuniquelocal for all server tunnel types 2017-01-13 13:47:51 -05:00
10d2f0a565 Merge pull request #774 from majestrate/datagram-fix-2017-01-13
try fixing crash in datagram code
2017-01-13 12:23:32 -05:00
c68aca4ada try fixing crash in datagram code 2017-01-13 11:54:29 -05:00
f46d96c4c6 renamed maptolooback to enableuniquelocal 2017-01-12 16:17:11 -05:00
e7b1ded486 correct behaviour of IsAcceptorSet 2017-01-12 14:19:57 -05:00
719de94821 acquire unique_ptr 2017-01-11 19:45:04 -05:00
7ea0249e6e use memory poll for streaming 2017-01-10 21:31:52 -05:00
feab95ce4b initial commit for memory pool 2017-01-10 16:14:18 -05:00
ca6f755634 http.enabled 2017-01-10 15:08:01 -05:00
70b30f7849 Merge pull request #772 from majestrate/ssu-revert
don't use heap allocated buffers in ssu and fill uninitialized memory
2017-01-08 15:28:23 -05:00
01ab027615 don't use heap allocated buffers in ssu 2017-01-08 11:10:23 -05:00
11f5db871f don't copy private keys 2017-01-08 09:07:54 -05:00
d83fc3181b EdDSA keys compatible with Java 2017-01-07 21:20:09 -05:00
b4657a0d05 Merge pull request #771 from majestrate/websocks
merge recent features and bugfixes
2017-01-07 14:13:42 -05:00
a5d6820453 fix 2017-01-07 13:55:17 -05:00
7b16aa6050 revert 2017-01-07 08:40:02 -05:00
c5d3c0c6f8 * add websocks
* enable socks, websocks and httpproxy as client tunnels

* remove old websocks config
2017-01-07 08:32:50 -05:00
43c1a87c48 Merge remote-tracking branch 'purple/openssl' into websocks 2017-01-07 07:39:04 -05:00
3755002381 Moving dockerfile to trigger autobuild of docker images. 2017-01-07 02:56:45 +01:00
dba38408c9 Merge pull request #770 from PurpleI2P/docker
Improved docker image
2017-01-06 20:37:04 -05:00
5b2bc23d03 Adding readme 2017-01-07 02:30:17 +01:00
a4cfdcb5c4 Improved and minimalized docker image 2017-01-07 02:17:02 +01:00
b6097160f1 Adding default port to config docs 2017-01-06 21:47:55 +01:00
fde1c08945 change country code to A1 2017-01-06 14:02:54 -05:00
417eb56a9b rollback to 2.6.0 2017-01-06 09:59:22 -05:00
0b28812f7e rollback 2017-01-05 17:37:39 -05:00
5ad25376bb send all outgoing messages in one buffer 2017-01-05 16:03:53 -05:00
b3ab85f3b5 Merge pull request #768 from PurpleI2P/openssl
recent changes
2017-01-05 15:47:04 -05:00
11231abe8a fixed warning 2017-01-05 13:31:23 -05:00
c577706415 Merge pull request #766 from majestrate/i2pcontrol-fixes
fix i2pcontrol bugs
2017-01-05 12:32:51 -05:00
f1eea6a0bf fix i2pcontrol bugs 2017-01-05 11:57:54 -05:00
8ce55f90d3 more i2pcontrol options 2017-01-05 10:30:27 -05:00
723f35ec5a fixed crash 2017-01-04 20:55:18 -05:00
025d9d3276 fixed #765 2017-01-04 19:12:43 -05:00
4f0c1d11eb 16 bytes alignment for extra buffer 2017-01-04 17:25:30 -05:00
1aae921ce7 allocated bigger buffer for remaining data 2017-01-03 13:22:42 -05:00
2e1c508bc4 allocated bigger buffer for remaining data 2017-01-03 13:19:35 -05:00
cea6ea4344 correct receive stats 2017-01-03 12:29:36 -05:00
57310fdbd6 reduced memory footprint 2017-01-03 11:52:28 -05:00
62ca6212ce don't store SSU-specific data for NTCP address 2017-01-02 16:36:59 -05:00
d4f5871e74 Merge pull request #764 from PurpleI2P/openssl
recent changes
2017-01-02 16:16:51 -05:00
a739580d3f Merge pull request #763 from hypnosis-i2p/openssl
updated icons, added README.md to i2pd_qt folder, updated android sdk version
2017-01-02 14:35:31 -05:00
5203565175 updated icons 2017-01-03 01:14:44 +08:00
c91f6db68a updated to newer android sdk 2017-01-02 23:38:15 +08:00
b776b85fc3 Update README.md 2017-01-02 23:38:15 +08:00
b35e5f1582 Create README.md 2017-01-02 23:38:15 +08:00
7d5a929b5e #761 info instead error 2017-01-02 09:03:12 -05:00
c2e7bc13a6 last sample should have more relevance for latency 2017-01-01 14:29:39 -05:00
97818c6f32 Merge pull request #760 from majestrate/fix-http-auth
Fix http auth when long password used and add peer count on transports page
2017-01-01 09:45:13 -05:00
a8973f5463 add peer count to transports 2017-01-01 08:58:21 -05:00
75d790137d don't use sizeof 2017-01-01 08:54:11 -05:00
7ef6c72fc0 fix http auth fail when auth too long 2017-01-01 08:53:15 -05:00
c5f8e2249e Merge remote-tracking branch 'purple/openssl' into websocks 2016-12-31 17:08:49 -05:00
585a6c29d4 add relaytag after session established 2016-12-31 13:52:26 -05:00
6b6df15dd9 eliminate ban list overhead 2016-12-31 10:51:42 -05:00
f4de68cb22 avoid exception if not connected 2016-12-31 10:50:48 -05:00
86d5cbc355 Merge branch 'master' into websocks 2016-12-31 10:42:57 -05:00
88f9b69e2a Merge remote-tracking branch 'purple/openssl' 2016-12-31 08:42:42 -05:00
d77c782f69 removed IdentHash from RoutingProfile 2016-12-30 20:59:18 -05:00
c115131ed2 removed IdentHash from RoutingProfile 2016-12-30 20:09:41 -05:00
178dedf78c store relay session directly 2016-12-30 17:53:54 -05:00
b0c64afc6e Merge remote-tracking branch 'purple/openssl' 2016-12-30 04:47:01 -05:00
be0c1c0912 Merge remote-tracking branch 'purple/openssl' 2016-12-30 04:46:55 -05:00
2e8fa88fcb fixed memory leak 2016-12-29 22:06:33 -05:00
b1b5904852 show SOCKS proxy as client tunnel 2016-12-27 22:45:51 -05:00
08f029850f Merge pull request #754 from majestrate/ratelimit-datagram-ls
dont re-request LS
2016-12-26 20:05:57 -05:00
f3d4077142 dont re-request LS 2016-12-26 18:47:47 -05:00
59dd479a6d check if address not found 2016-12-26 17:19:54 -05:00
76d9f1ea37 * make loopback address mapping configurable
* add loopback address mapping to udp server tunnel
2016-12-25 08:56:47 -05:00
858b497199 prevent overflow 2016-12-25 08:18:23 -05:00
cee9f1df95 Merge pull request #750 from majestrate/tunnelgateway-leak
Fix Tunnel Gateway Leak
2016-12-24 18:01:10 -05:00
5bc2001ce3 Fix Tunnel Gateway Leak 2016-12-24 17:19:07 -05:00
652226dbf0 allow multiple acceptors 2016-12-24 16:34:18 -05:00
4688e6d534 fix segfault 2016-12-24 16:31:28 -05:00
1b0fc180c4 Fix Tunnel Gateway Leak 2016-12-24 16:05:44 -05:00
2524972807 don't use stack allocated buffers in SSU 2016-12-24 12:04:39 -05:00
8f51dc2c22 reload acceptor with correct stream 2016-12-24 09:55:59 -05:00
b363b50320 multiple acceptors 2016-12-24 08:53:35 -05:00
88a48a5c79 implement AcceptOnce for multiple acceptors 2016-12-23 10:09:40 -05:00
7be951b962 fix last commit, it was broken 2016-12-23 07:38:41 -05:00
3dcc4e6bc1 i2ptunnel fixes 2016-12-23 07:32:43 -05:00
573ee0b584 fixed typo 2016-12-22 20:34:06 -05:00
213629ef52 drop highest bit for token 2016-12-22 20:30:50 -05:00
27e1579e4c rollback 2016-12-22 19:38:17 -05:00
f2c401b6c0 fixed some memory leak 2016-12-22 15:00:40 -05:00
442c63d7a4 #746. initialize io_service after daeminization 2016-12-22 13:32:06 -05:00
5babfb0f1e fixed #724 2016-12-22 10:52:26 -05:00
0ad3078524 open log stream in log thread 2016-12-22 10:08:35 -05:00
f765c25020 Merge remote-tracking branch 'purple/openssl' 2016-12-22 09:33:02 -05:00
4145251afd new reseed 2016-12-21 21:29:46 -05:00
88c3532162 removed ssl ceritifcates 2016-12-21 14:54:48 -05:00
84b3ad3221 removed non-used ceritificates 2016-12-21 14:52:17 -05:00
e699d3d02d SNI support 2016-12-21 07:41:18 -05:00
9da984b866 use ElGamalEncrypt 2016-12-20 14:10:14 -05:00
fc08d15a79 Merge pull request #743 from PurpleI2P/openssl
2.11.0
2016-12-18 18:11:22 -05:00
ffaabe8674 update ChangeLog 2016-12-18 18:07:06 -05:00
0233ab4deb added info, modifyed timestamp 2016-12-19 00:31:29 +03:00
c9dc010c0b 2.11.0 2016-12-18 16:02:19 -05:00
557696b1d8 Merge remote-tracking branch 'purple/openssl' 2016-12-18 13:31:02 -05:00
9fefbb0c4a Merge pull request #742 from majestrate/sam-multiaccept
Multiple stream acceptors with SAM
2016-12-18 13:16:14 -05:00
eb9ea97e21 don't crash 2016-12-18 13:01:28 -05:00
673b7a95b7 fix sam crash on exit and datagram crash with no outbound tunnel 2016-12-18 12:57:49 -05:00
d5f27ecb0e fix termination crash 2016-12-18 12:57:39 -05:00
8f8b928cc4 enable multiple acceptors in sam (initial) 2016-12-18 12:57:31 -05:00
965896b932 fix sam crash on exit and datagram crash with no outbound tunnel 2016-12-18 12:56:34 -05:00
042adb5e34 fix termination crash 2016-12-18 12:28:32 -05:00
67927bd8f4 enable multiple acceptors in sam (initial) 2016-12-18 11:49:50 -05:00
259a63e612 fixed session termination crash 2016-12-18 10:11:40 -05:00
adcf2158bf Merge remote-tracking branch 'purple/openssl' 2016-12-18 10:09:45 -05:00
05c914156a fixed session termination crash 2016-12-18 09:40:52 -05:00
f69884d573 AVX disabled for debuild by patch 2016-12-18 16:27:14 +03:00
d097554f7d Merge remote-tracking branch 'purple/openssl' 2016-12-17 15:16:58 -05:00
1e2fd57c4c Merge remote-tracking branch 'purple/openssl' into websocks 2016-12-17 15:16:50 -05:00
8b8007695c don't close streams after 1 hour 2016-12-17 22:49:51 +03:00
68f3c877ee Merge branch 'master' into websocks 2016-12-17 08:54:56 -05:00
ae442ee015 Merge pull request #739 from majestrate/udp-tunnel-crash-fix
Udp tunnel crash fix
2016-12-17 07:58:45 -05:00
99b5f1b7b8 remove pedantic log entry 2016-12-17 07:36:59 -05:00
8071df0e68 don't crash on os x when no lease set found for udp tunnel 2016-12-17 07:36:47 -05:00
88d1aab7a3 Merge branch 'master' of github.com:majestrate/i2pd 2016-12-17 07:35:24 -05:00
08001ba373 remove pedantic log entry 2016-12-17 06:37:34 -05:00
ebc24cee55 Merge remote-tracking branch 'origin/openssl' 2016-12-17 06:36:26 -05:00
ae3bb30d8a don't crash on os x when no lease set found for udp tunnel 2016-12-17 06:35:38 -05:00
63d6b23344 use correct encryption key for ElGamal 2016-12-16 21:23:04 -05:00
c009e6bd04 Merge remote-tracking branch 'origin/openssl' 2016-12-15 18:24:45 -05:00
38d85a49e7 use AVX instructions for XOR in AES-CBC if applicable 2016-12-15 14:42:26 -05:00
0edc149ecc fixed typo 2016-12-15 13:36:52 -05:00
10d6cd9896 use token for commands 2016-12-15 13:10:12 -05:00
6913da7efa fixed AVX crash for mingw build 2016-12-15 10:43:48 -05:00
34df1b1646 add AVX to clobber list 2016-12-15 07:21:34 -05:00
992603496e don't copy address 2016-12-14 13:54:16 -05:00
b9552c42f1 don't overwrite whole lease 2016-12-14 11:32:20 -05:00
37e4dfc5d5 cleanup from some overhead 2016-12-14 10:59:36 -05:00
15b7284a8f AVX support for Windows 2016-12-14 09:48:05 -05:00
b57a62fece static and AVX support for OSX 2016-12-14 09:35:15 -05:00
9c7de5ad03 avoid sending RST instead FIN 2016-12-13 14:54:48 -05:00
c065fae422 store remote IdentHash only 2016-12-13 12:45:18 -05:00
cfde1f8c27 rollback 2016-12-13 12:44:05 -05:00
c45f72a63e make sure all outstading data got sent before closing socket 2016-12-13 11:01:13 -05:00
e1d9eca7bd 0.9.28 2016-12-13 09:49:42 -05:00
573e5eb5bd fix typo 2016-12-13 09:10:39 -05:00
d9090486e3 Merge remote-tracking branch 'origin/udptunnel-fix' 2016-12-12 19:20:24 -05:00
b4e7a91645 be less picky about next lease set 2016-12-12 19:16:02 -05:00
92dd68fca1 fix 2016-12-12 18:54:56 -05:00
82e955ec02 fix 2016-12-12 18:54:31 -05:00
2e66c4c9f5 Merge pull request #738 from majestrate/udptunnel-fix
make udp tunnel utilize GarlicRoutingPath correctly
2016-12-12 18:16:01 -05:00
0c6ee5e139 Merge remote-tracking branch 'origin/udptunnel-fix' 2016-12-12 15:53:48 -05:00
9a19b5994b fix 2016-12-12 15:50:36 -05:00
920586f56c Merge remote-tracking branch 'origin/openssl' into udptunnel-fix 2016-12-12 14:51:01 -05:00
919aa2895a request lease set 2016-12-12 14:50:38 -05:00
75690598e3 try fixing datagram 2016-12-12 14:50:31 -05:00
ac2caf2787 make sure all incoming data gets sent before closing a socket 2016-12-12 14:45:37 -05:00
5640c96fd5 request lease set 2016-12-12 14:39:05 -05:00
0396c4a4de try fixing datagram 2016-12-12 13:40:24 -05:00
f061fe581a Merge remote-tracking branch 'purple/openssl' 2016-12-12 10:58:20 -05:00
5405876d84 temporary exlude mamoth's shit from reseeds 2016-12-11 20:38:19 -05:00
4b9de0777b queue up LeaseSet requests 2016-12-11 14:17:09 -05:00
a59e073536 consmetic fixes 2016-12-11 12:22:23 -05:00
67492bf024 send v4 address for peer test 2016-12-11 09:53:43 -05:00
77c83c4f42 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into websocks 2016-12-11 09:36:51 -05:00
259baa0e84 use vzeroall to complete AVX mode 2016-12-10 20:41:42 -05:00
dca48c7eec use AVX for HMAC 2016-12-09 15:46:21 -05:00
0d83a34cfd add initial WebSOCKS implementation 2016-12-09 15:36:38 -05:00
7386b0a523 fixed android build 2016-12-09 13:42:00 -05:00
eda13f9023 Merge remote-tracking branch 'purple/openssl' 2016-12-09 11:42:31 -05:00
d0e9fe1e3e Merge pull request #734 from majestrate/fix-732
fixe issue 732
2016-12-09 09:59:18 -05:00
2b7bab04dd add BloomFilter to QT android 2016-12-09 09:50:42 -05:00
ad5f890a1e Merge pull request #733 from majestrate/bloom-filter
add simple bloomfilter implementation
2016-12-09 09:41:09 -05:00
fa191e2928 fixes issue 732 and wave hi to ISPG 2016-12-09 09:27:19 -05:00
6d8a23ec16 tabify 2016-12-09 09:10:08 -05:00
12371650f9 tabify 2016-12-09 09:09:35 -05:00
79e1d54e4c implement simple bloom filter 2016-12-09 09:08:03 -05:00
447f5f69c9 use AVX for DHT 2016-12-08 15:23:40 -05:00
e08a26d015 AVX instructions support 2016-12-08 12:59:19 -05:00
975265b0af more 2016-12-07 11:52:20 -05:00
4d5e9c52b2 Use eddsa-sh512-ed25519 by default 2016-12-07 09:38:19 -05:00
d1b154c285 Merge remote-tracking branch 'purple/openssl' 2016-12-07 09:34:33 -05:00
381f6b184e clean up incomplete messages 2016-12-06 16:23:52 -05:00
59681398cb don't store lookup replies anymore 2016-12-05 18:39:01 -05:00
adf887a06b request destination if we are not closest 2016-12-05 16:36:51 -05:00
42f70cd55d request destination after frist lookup 2016-12-05 15:45:04 -05:00
3704a4ff47 2.10.2 2016-12-05 00:31:41 +03:00
5b8d637f6a 2.10.2 2016-12-05 00:21:18 +03:00
436621f79f 2.10.2 2016-12-04 14:38:57 -05:00
0ea5fbfe0a Merge pull request #731 from PurpleI2P/openssl
recent changes
2016-12-03 09:38:28 -05:00
f1acd122bc Merge remote-tracking branch 'purple/openssl' 2016-12-03 08:10:00 -05:00
739b6645f8 eliminate bad_function_call exception 2016-12-02 16:10:49 -05:00
7a7ae4cc83 select ipv4 peers for peer test 2016-12-02 11:17:22 -05:00
db83cbe58f handle read_some errors 2016-12-01 22:14:43 -05:00
87228429d6 handle receive_from errors 2016-12-01 19:24:15 -05:00
2651723b50 fixed termination crash 2016-12-01 19:23:55 -05:00
b8a01d2ff1 rollback 2016-12-01 15:03:54 -05:00
5c20751937 give priority to ipv6 2016-12-01 14:06:23 -05:00
06b0a50462 static libminiupnpc 2016-12-01 20:17:28 +03:00
0d589895f6 print time difference with one in timestamp message 2016-12-01 10:51:01 -05:00
230c2aaf26 reopen UDP socket in case of error 2016-11-30 21:14:10 -05:00
1d8807a6ba handle async_receive_from errors 2016-11-30 14:51:26 -05:00
81978b214c correct NTCP sessions termination 2016-11-30 09:24:49 -05:00
8704234669 Merge remote-tracking branch 'purple/openssl' 2016-11-30 04:29:16 -05:00
5699b7bae5 5 seconds connection timeout for NTCP 2016-11-29 14:12:44 -05:00
2756cb8b8f Merge pull request #729 from PurpleI2P/openssl
recent changes
2016-11-29 13:39:26 -05:00
e726d216bb cleanup tags on stop 2016-11-28 22:47:37 -05:00
3480824290 correct leaseset requests cleanup 2016-11-28 14:37:17 -05:00
c8b935151a fixed tremination crash 2016-11-28 13:47:10 -05:00
5e5aefa290 cleanup leaseset requests on stop 2016-11-27 10:14:54 -05:00
0e14b54b6d break circular reference 2016-11-25 22:36:35 -05:00
c6ddae2d8e excluded obsolete boost dependancies 2016-11-25 13:45:41 -05:00
bc0aed186e Merge remote-tracking branch 'purple/openssl' 2016-11-25 10:46:28 -05:00
d092b21da7 assume ElGamal data size as 222 bytes 2016-11-24 16:02:14 -05:00
a8061003dd Merge pull request #725 from majestrate/fix-722
don't add multiple router addresses when specifying ifname4/6
2016-11-24 14:05:30 -05:00
50f0099645 don't add multiple router addresses 2016-11-24 13:56:37 -05:00
c270687223 Merge pull request #723 from majestrate/fix-722
add ifname4 and ifname6 options
2016-11-24 10:43:39 -05:00
a92652f4ad add ifname4 and ifname6 options 2016-11-24 10:11:46 -05:00
9ba961fa72 Merge remote-tracking branch 'purple/openssl' 2016-11-24 08:07:32 -05:00
006e4526e8 fixed memory leak 2016-11-23 16:41:27 -05:00
55dbbb3546 fixed memory leak 2016-11-23 16:30:36 -05:00
c166bc9b18 Merge pull request #719 from PurpleI2P/openssl
recent changes
2016-11-23 11:31:58 -05:00
e4fe18e435 Merge pull request #718 from l-n-s/my_fixes
Add possibility to reseed from HTTPS URL
2016-11-23 08:58:28 -05:00
cea38549da Merge remote-tracking branch 'upstream/openssl' into my_fixes 2016-11-23 07:45:06 -05:00
0487e730ba Add possibility to reseed from HTTPS URL 2016-11-23 07:42:38 -05:00
8fdd7205d7 check if routing session got detached 2016-11-22 15:20:48 -05:00
1d8d71cfb6 16-bytes alignment for IV for AES-CBC 2016-11-21 21:13:13 -05:00
10bd017e57 16-byte alignment for received I2NP message 2016-11-21 19:45:29 -05:00
f36a9c4409 Merge remote-tracking branch 'purple/openssl' 2016-11-21 06:43:23 -05:00
70f39eb959 Added new logo to webconsole 2016-11-21 00:58:38 +03:00
3a3b0cc847 New logo 2016-11-21 00:27:39 +03:00
01da9e3ca2 fix outproxy 2016-11-20 12:13:11 -05:00
f168e4586c undo pedantic whitespace 2016-11-20 09:32:28 -05:00
03ff390685 undo pedantic whitespaces 2016-11-20 09:31:33 -05:00
2a77486567 tabify 2016-11-20 09:30:46 -05:00
32a5950aad Merge remote-tracking branch 'purple/openssl' 2016-11-20 09:28:11 -05:00
f1370189b6 initial outproxy support for http proxy 2016-11-20 09:25:56 -05:00
65d721285b fixed build error for some compilers 2016-11-20 08:33:33 -05:00
565f844b7f correct termination of pending leaseset 2016-11-19 17:24:38 -05:00
248992b27b temporarty fix crash 2016-11-19 14:28:58 -05:00
3125e05b49 Merge remote-tracking branch 'purple/openssl' 2016-11-19 07:19:11 -05:00
bdd6037726 use std::map for unconfirmed tags 2016-11-18 14:50:29 -05:00
9d292bb6a4 fixed potential race condition 2016-11-18 11:16:55 -05:00
12b9b49902 fixed infinite loop bug 2016-11-18 10:27:49 -05:00
93b8bd7f02 set high bandwidth together with extra badnwidth 2016-11-18 09:27:40 -05:00
cd8169c0a5 reopen log upon daemon start 2016-11-17 22:44:02 -05:00
b4a9d4df8c fixed crash in daemon mode 2016-11-17 22:11:34 -05:00
d62525abb6 insert I2CP session with correct sessionid 2016-11-17 19:16:38 -05:00
a4988fd7cb insert I2CP session with correct sessionid 2016-11-17 19:14:25 -05:00
d91691c344 write to log through the separate thread 2016-11-17 15:46:28 -05:00
164d3566e3 fixed linker error 2016-11-17 15:00:30 -05:00
058120d001 show I2CP local destinations 2016-11-17 13:10:29 -05:00
59f292333f use correct ports 2016-11-17 11:42:23 -05:00
b7a2c11e81 use shared_ptr instead 2016-11-17 11:37:48 -05:00
3d07ddfba5 read more than 1 udp packet 2016-11-17 11:13:40 -05:00
9286e4794b add logging 2016-11-17 11:10:42 -05:00
81276cb7f5 unbreak (maybe?) 2016-11-17 10:43:27 -05:00
e270f90f8d try fixing udp tunnel (probably broken) 2016-11-17 10:36:27 -05:00
b1fdfec18c Merge remote-tracking branch 'purple/openssl' 2016-11-17 09:25:48 -05:00
1dfa09cda9 queue up multiple LeaseSet requests 2016-11-16 22:28:13 -05:00
913438e3ff addresshelper message changed to "Proxy info" 2016-11-17 06:04:29 +03:00
1aa939ae73 correct tigger for 0-hops LeaseSet update 2016-11-16 19:32:45 -05:00
a914608264 clean up non received DeliveryStatus messages 2016-11-16 14:43:29 -05:00
fb59d80897 Merge pull request #712 from PurpleI2P/openssl
recent changes
2016-11-16 14:40:50 -05:00
5d0852c1e2 fixed memory leak 2016-11-16 12:10:13 -05:00
e0e50faa47 publish 0-hops leaseset 2016-11-16 10:59:11 -05:00
f6721a2ced fixed startup crash 2016-11-15 17:45:37 -05:00
e384ec32b8 unbreak i2lua build 2016-11-15 15:40:09 -05:00
d93361939c Merge branch 'low-latency-merge' 2016-11-15 15:14:52 -05:00
644c0e3d33 Merge remote-tracking branch 'purple/openssl' 2016-11-15 15:12:09 -05:00
b1333b7d99 Merge pull request #709 from majestrate/low-latency-merge
implement latency control option
2016-11-15 15:08:09 -05:00
673a2acade Merge remote-tracking branch 'purple/openssl' into low-latency-merge 2016-11-15 14:45:16 -05:00
752e74d33c show latency of tunnels in web ui 2016-11-15 14:42:18 -05:00
6bacf94a62 handle all loopback messages 2016-11-15 14:11:55 -05:00
336cd60920 don't insert same floodfill twice 2016-11-15 12:17:21 -05:00
76c9b66db4 don't blow up 2016-11-15 11:31:15 -05:00
0c5ca28a14 fall back on regular tunnel algorithm 2016-11-15 11:27:00 -05:00
db63bb4495 make it compile for real 2016-11-15 11:18:12 -05:00
34afb54c21 make it compile 2016-11-15 11:16:32 -05:00
69888e148e use correct latency computation 2016-11-15 11:15:48 -05:00
98a55c0613 make it compile 2016-11-15 10:48:33 -05:00
5425e9aee3 select tunnels correctly 2016-11-15 10:46:58 -05:00
7fef5f5654 when selecting tunnels if we can't find a low latency tunnel fall back to regular selection algorithm 2016-11-15 10:37:58 -05:00
fc94e846a6 add latency requirement option 2016-11-15 10:20:09 -05:00
7d7bbf15bf use DSA for http and socks proxy by defualt 2016-11-15 10:10:13 -05:00
8a545b98ec Merge remote-tracking branch 'purple/openssl' 2016-11-14 16:26:37 -05:00
ecdb60b44e cleanup netdb after failed reseed 2016-11-14 16:23:42 -05:00
2eea85b786 increase reseed expiration time to 81 hours 2016-11-14 15:04:40 -05:00
87fd0e6f29 recommit fixed ASCII art 2016-11-14 22:38:35 +03:00
ea191afd9d fixed build error 2016-11-14 13:48:34 -05:00
89b624308e added ASCII art 2016-11-14 21:40:03 +03:00
facdf0ca9c Merge pull request #708 from majestrate/reseed-from-floodfill
add reseed from floodfill option
2016-11-14 13:31:51 -05:00
98484d54c0 check for outdated routers in reseed 2016-11-14 13:13:57 -05:00
ea31ca5ee8 add reseed from floodfill option 2016-11-14 12:09:07 -05:00
6b5b9b3d62 add reseed from floodfill option 2016-11-14 12:05:44 -05:00
975dab6d1d add hacking.md for notes on internal structure 2016-11-14 08:38:25 -05:00
eaa7adc88c Update usage.md 2016-11-13 23:04:41 +00:00
f76b014a52 re-run PeerTest 2016-11-13 09:14:05 -05:00
8676a1b4ef update changelog, added leaseset list to client/server tunnel pages 2016-11-12 17:49:16 +03:00
e1eaa2097e Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-11-11 12:45:06 -05:00
6f2357c695 fixed openssl 1.1 crash 2016-11-11 12:44:44 -05:00
91427264c3 Fix link to configuration 2016-11-11 10:01:38 +00:00
74aa961561 Fix RTD: Use 4 spaces, not tabs in docs 2016-11-11 09:42:18 +00:00
aa47e11471 fixed race condition 2016-11-10 21:44:40 -05:00
89d69a5d5a rollback due the race condition 2016-11-10 18:38:29 -05:00
3bbe1e9c0c excluded deprecated reseed 2016-11-10 14:59:21 -05:00
6377631ae7 OpenSSL 1.1 for EVP_PKEY 2016-11-10 12:51:39 -05:00
3562ac1438 Merge pull request #704 from majestrate/master
add .dir-locals.el for emacs users
2016-11-10 09:11:52 -05:00
e152785de9 remove tab width setting in dir-locals 2016-11-10 08:25:16 -05:00
dd259f1852 fix formatting 2016-11-10 08:22:52 -05:00
5001cea3a3 add dir-locals for emacs users with code standards set 2016-11-10 08:21:32 -05:00
a4d586b24e openssl 1.1 for ECDSA 2016-11-09 15:59:01 -05:00
46f927fc1b cleanup unclaimed out-of-sequence fragments 2016-11-09 14:51:55 -05:00
7419f992e7 Merge pull request #703 from PurpleI2P/openssl
recent changes
2016-11-09 14:49:12 -05:00
b83e7e6c5c correct PeerTest 2016-11-09 12:13:42 -05:00
5f463d5f6b rollback 2016-11-09 10:16:37 -05:00
2e301c2919 fixed VS build 2016-11-08 20:25:47 -05:00
9526d42ec5 Merge pull request #701 from PurpleI2P/atnaguzin-fix-makefile
fix branch detect
2016-11-08 17:26:29 -05:00
a566479ddb fix branch detect 2016-11-09 01:07:10 +03:00
1bba0f6bb2 store and concatenate all out-of-sequence fragments 2016-11-08 15:37:27 -05:00
232d42881b support openssl 1.1 for DH 2016-11-08 13:11:38 -05:00
abeaf76fe9 Update usage.md 2016-11-08 17:55:40 +00:00
03d4584562 Control i2pd and link to configuration page 2016-11-08 17:14:53 +00:00
f2f5226ebb extract database store key once 2016-11-07 18:32:22 -05:00
660860b92d verify LeaseSet's ident hash 2016-11-07 15:54:35 -05:00
c0a1a8b47c limit number of DH precalculations at the time 2016-11-07 14:44:32 -05:00
bd82e81e26 correct DH keys number to precalculate 2016-11-07 12:29:24 -05:00
0a94df592c 2.10.1 2016-11-07 09:18:44 -05:00
66506ea1ce Update installer.iss 2016-11-07 07:30:44 +03:00
4a4292a0dc Merge pull request #700 from PurpleI2P/openssl
recent changes
2016-11-06 14:40:43 -05:00
7bff4db483 eliminate potential excessive CPU usage 2016-11-06 09:53:45 -05:00
9208da8a50 more precise peer test 2016-11-05 21:08:14 -04:00
70fcd93ca7 fixed build error for clang 2016-11-04 12:13:03 -04:00
9ba9bd4415 preparation for openssl 1.1 2016-11-04 10:59:55 -04:00
480ce6f522 core file is limited by a system by default 2016-11-03 21:37:47 -04:00
f1254fd5d4 fixed android build 2016-11-03 21:31:21 -04:00
10ebcff48e * Log.{cpp,h}:
* use colors only when using stdout
  * use static string array instead bunch of #define's
2016-11-04 00:43:43 +00:00
6ee227675a * DaemonLinux.cpp : resource limiting 2016-11-04 00:43:29 +00:00
89059abe15 * Config.cpp : limits.coresize & limits.openfiles 2016-11-04 00:43:28 +00:00
4503223a4e * SOCKS.cpp : boost::lexical_cast -> std::to_string 2016-11-04 00:43:25 +00:00
07c31a90f3 * RouterContext.cpp : boost::lexical_cast -> std::to_string 2016-11-04 00:43:24 +00:00
bbcb9af01f * SAM.cpp : boost::lexical_cast -> std::stoi 2016-11-04 00:43:22 +00:00
1cd415a3ae * BOB.cpp : boost::lexical_cast -> std::stoi 2016-11-04 00:43:20 +00:00
c344e75701 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-11-03 15:29:09 -04:00
0305e4cf8a tunnel options for SOCKS proxy 2016-11-03 15:28:33 -04:00
bc86b0345f Merge pull request #698 from atnaguzin/systemd
systemd unit, debian patch fix, makefile last-dist added, package log&pid folder edited
2016-11-03 12:20:14 -04:00
8b0ce30dfc systemd unit, debian patch fix, makefile last-dist added, package log&pid folder edited 2016-11-03 19:08:21 +03:00
4b983300fe fixed layout 2016-11-03 11:47:33 -04:00
8829ebba6c fixed layout 2016-11-03 11:46:24 -04:00
11b90d2113 lenght and number of tunnels for HTTP Proxy 2016-11-03 11:44:25 -04:00
9d8d4c09c6 reduce explratory tunnels quatity to 3 2016-11-02 15:17:05 -04:00
c90d5bb67c don't override Host if not specified explicitly 2016-11-02 10:12:54 -04:00
7263d9f03e Event.h/.cpp added 2016-11-01 19:49:48 -04:00
d5e77e9bb2 10 seconds max timeout for NTP 2016-11-01 18:40:00 -04:00
1ecd5250fc eliminate overhead 2016-11-01 17:49:42 -04:00
44af5e04e4 correct NTP request 2016-11-01 16:27:44 -04:00
4582a4fd95 eliminate some overhead 2016-11-01 13:57:25 -04:00
2d513277f2 fixed #696. set netid before context::Init 2016-11-01 13:34:19 -04:00
7934974d92 fixed android build 2016-11-01 12:16:18 -04:00
4dce35b1e6 Merge pull request #695 from majestrate/merge-websocket
add optional websocket ui
2016-11-01 11:54:50 -04:00
e5f5f96771 merge webui code 2016-11-01 10:46:07 -04:00
d4a0076aba merge 2016-11-01 10:26:40 -04:00
cd9cd84c5b properly send expiration notice for websockets 2016-11-01 10:07:34 -04:00
93eca799dd add more websocket events 2016-11-01 10:06:38 -04:00
34f090662a stop websockets 2016-11-01 10:02:41 -04:00
1a1d54387c update build files and allow compile without websocket 2016-11-01 10:02:24 -04:00
9575f70f38 fix conflicts 2016-11-01 10:02:10 -04:00
b4e9ed7d18 add web socket ui 2016-11-01 09:59:50 -04:00
3d4e2a275c correct separator for android 2016-10-31 18:10:33 -04:00
b526718846 show HTTP proxy as client tunnel 2016-10-31 15:42:50 -04:00
a4883cfa15 print tunnel peers in direct order 2016-10-31 15:13:43 -04:00
a41f179785 get home directory from EXTERNAL_STORAGE for andorid 2016-10-31 14:00:31 -04:00
bef628212e fixed corrupted buffer duing IRC handshake 2016-10-31 09:46:59 -04:00
ef3030abe5 Merge pull request #694 from lehitoskin/graceful-typo
gracefull -> graceful
2016-10-31 06:59:18 -04:00
754ad20eff gracefull -> graceful 2016-10-31 03:27:27 -07:00
647175cf12 correct RTO reset 2016-10-30 09:29:43 -04:00
5f0a440f0a Merge pull request #692 from l-n-s/my_fixes
My fixes
2016-10-28 17:44:50 -04:00
d68544038c Merge branch 'openssl' into my_fixes 2016-10-28 20:28:11 +00:00
df36b0eb7e Uppercase first letters in config help 2016-10-28 16:17:48 -04:00
4f4748b8df Update nat option: if nat=false, skip reachability testing 2016-10-28 15:57:18 -04:00
028a896303 Merge pull request #690 from majestrate/no-churn
add trust.routers option and fix restricted routes
2016-10-28 14:37:32 -04:00
578083df3e Add libdl (-ldl) flag. Fixes openssl errors when building statically. 2016-10-28 13:18:35 -04:00
c5e1823f15 dont't set to firewalled, ssu will try introducers 2016-10-28 13:11:50 -04:00
5f396d6311 add option to only connect to certain routers 2016-10-28 12:50:26 -04:00
5c64c2ff42 handle stream ternimation properly 2016-10-28 11:33:11 -04:00
2dcb91b284 don't create same incoming stream twice 2016-10-27 20:46:05 -04:00
d708e7f682 check if a lease has been excluded from LeaseSet 2016-10-26 21:40:06 -04:00
a8a4ef82cd fixed android build 2016-10-26 16:19:32 -04:00
1286f1c968 inalidate shared routing path 2016-10-26 13:02:19 -04:00
9368a93279 * fgrep can't be used with regex 2016-10-26 00:41:48 +00:00
143aaa2d28 * util.h : drop i2p::util::lexical_cast(), not used anymore (#314) 2016-10-26 00:24:16 +00:00
b8dcdece38 * Destination.cpp : drop use of i2p::util::lexical_cast(), make more compact code 2016-10-26 00:24:13 +00:00
be7f4c5da7 * update changelog 2016-10-26 00:21:24 +00:00
890807b8d7 * build docs : markdown cleanup & reformatting 2016-10-26 00:21:22 +00:00
8e1687e7b3 * reorganize docs in build-notes*.md 2016-10-26 00:21:17 +00:00
d8510ead43 don't return expired LeaseSet 2016-10-25 14:07:34 -04:00
c74db4b81c resubmit non-confirmed LeaseSet 2016-10-24 20:58:25 -04:00
4ee9b4524d correct netid handling 2016-10-24 10:33:46 -04:00
28cf351878 fixed typo 2016-10-24 07:11:18 -04:00
c5e2ec5e00 random remote lease selection for LeaseSet update 2016-10-23 16:16:08 -04:00
fe3ebc4c84 Merge pull request #685 from majestrate/i2lua-cmake
update cmake for i2lua
2016-10-23 11:28:51 -04:00
6688f9a5ef update cmake for i2lua 2016-10-23 08:14:55 -04:00
3167ae21b0 send own LeasetSet through a stalled stream 2016-10-22 20:08:15 -04:00
bc92586323 Merge pull request #684 from PurpleI2P/openssl
recent changes
2016-10-22 20:05:28 -04:00
c40a463549 Merge pull request #683 from vaygr/openbsd-build
fixed build with OpenBSD
2016-10-22 18:12:54 -04:00
87a85fff08 Merge branch 'openssl' into openbsd-build 2016-10-22 16:44:15 -04:00
b68381db58 fixed build with OpenBSD 2016-10-22 16:38:45 -04:00
25c1884961 correct stream termination 2016-10-20 15:20:08 -04:00
9980df2c67 Merge pull request #680 from vaygr/libressl-support
fixed build with LibreSSL
2016-10-20 10:50:40 -04:00
ed09c1171b fixed build with LibreSSL 2016-10-20 10:37:45 -04:00
c473b10667 Merge pull request #679 from BOPOHA/openssl
fix paths
2016-10-20 10:33:44 -04:00
c15e53e9c0 fix paths 2016-10-20 15:49:56 +02:00
e9d3278fc5 Merge pull request #678 from l-n-s/move_rpm_files
move rpm-related files to contrib folder
2016-10-20 13:12:10 +00:00
b683c07d55 move rpm-related files to contrib folder 2016-10-20 13:08:38 +00:00
681f055b16 Merge pull request #677 from BOPOHA/patch-1
fixed Centos 7 notes
2016-10-20 12:51:22 +00:00
f4cb4c1756 fixed Centos 7 notes 2016-10-20 13:41:41 +02:00
1cc67bbbe8 Merge pull request #676 from BOPOHA/openssl
added spec and service files
2016-10-20 07:24:27 -04:00
0df0450107 added spec and service files 2016-10-20 12:18:59 +02:00
cb324ca723 portable windows data directory 2016-10-19 12:54:13 -04:00
442a0c48e7 fixed #675. I2LUA define 2016-10-19 10:23:02 -04:00
d97acacae6 sequential LeaseSet request 2016-10-17 18:45:20 -04:00
3643d6b5d5 Update changelog 2016-10-17 07:37:40 +03:00
2edd64470b Update changelog 2016-10-16 09:19:48 -04:00
c42e2fe02d Update i2pd.conf 2016-10-16 13:17:00 +00:00
12c67b5db4 2.10.0 2016-10-16 08:35:48 -04:00
a943cc09fe 2.10.0 2016-10-16 07:58:26 -04:00
1ceda52f59 2.10.0 2016-10-16 07:52:45 -04:00
04ee419951 small fixes for docs 2016-10-16 11:04:59 +00:00
f687728c3a edit link to usage documentation 2016-10-16 10:59:48 +00:00
bde5d27a20 Update README.md 2016-10-13 16:56:23 +00:00
07a1651fa2 Update usage.md
fix for readthedocs
2016-10-13 07:45:30 +00:00
32b47bee2c Update README.md
Add link to Russian docs
2016-10-12 17:52:07 +00:00
fbf75ea3b9 check if signer/verifier is set already 2016-10-12 13:28:22 -04:00
a157aba74f Merge pull request #671 from atnaguzin/patch-2
Update installer.iss
2016-10-12 12:32:12 -04:00
e45e5df377 openssl 1.1 DSA functions 2016-10-12 12:31:27 -04:00
85c7bfa160 Update installer.iss 2016-10-12 19:30:20 +03:00
8182f97c15 Merge pull request #670 from atnaguzin/patch-2
script for inno setup
2016-10-12 12:09:03 -04:00
eba824f5d0 script for inno setup 2016-10-12 19:03:35 +03:00
40456ebaae Merge pull request #669 from PurpleI2P/openssl
recent changes
2016-10-12 11:54:51 -04:00
99983798a4 configurable netid 2016-10-12 11:26:48 -04:00
93ed032015 avoid potential deadlock 2016-10-12 09:39:16 -04:00
9359f5b296 Update README.md
Less complicated description
2016-10-12 12:09:58 +00:00
3b467c19cb Merge pull request #668 from l-n-s/addressbook_configurable
Add addressbook options + improved docs
2016-10-12 07:08:55 -04:00
470a6f0ab2 Add addressbook options + improved docs 2016-10-12 10:23:43 +00:00
fe8a0c1a6b #622. Force SU3 verification by reseed.verify 2016-10-11 15:02:23 -04:00
f0d098d0ef use shared local destination for lookup if destination is not set 2016-10-11 13:39:07 -04:00
f17df1f16d spinlock added 2016-10-11 12:06:40 -04:00
b1f8f9830b fixed another cases for #651 2016-10-11 10:18:42 -04:00
e78ccc6bec fixed #651. check is destination is set 2016-10-11 07:31:16 -04:00
b54892a783 Merge pull request #664 from brain5lug/tag-cleanup
Tag class clean-up
2016-10-10 18:13:37 -04:00
16c37a0f3d indentation fix for missed Fill function 2016-10-11 00:46:18 +03:00
141fb78237 Tag class clean-up 2016-10-11 00:19:34 +03:00
eb31b9a4d6 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-10-10 16:34:08 -04:00
f10d9e1332 update reseed lists 2016-10-10 16:31:26 -04:00
6d63521622 update miniupnpc instructions 2016-10-10 11:46:52 -04:00
e1aa066489 Merge pull request #663 from l-n-s/update_readme
Update readme
2016-10-10 15:17:10 +00:00
c78ec12e99 Add specs link 2016-10-10 15:07:22 +00:00
3fa4e2f58d Update README.md 2016-10-10 15:00:36 +00:00
c64aaade70 Merge pull request #662 from majestrate/merge-recent-udp-tunnel
Merge recent udp tunnel changes
2016-10-10 09:13:57 -04:00
e8d8b290a6 rename 2016-10-10 09:07:49 -04:00
456d9e79e6 Revert "minimize count of errors "I2CP: Failed to send message. No outbound tunnels""
This reverts commit 8ff2627e8e.
2016-10-10 09:06:32 -04:00
3095e14247 undo weird mutex changes 2016-10-10 09:04:24 -04:00
a332d68704 Revert "fix f79ad91"
This reverts commit e8e3db6888.
2016-10-10 09:02:39 -04:00
84ca992e91 Revert "Unused parameter warnings removal"
This reverts commit 5350078543.
2016-10-10 08:59:48 -04:00
f91f3796a8 make sure verifier gets created once 2016-10-10 08:59:45 -04:00
22250ae552 Merge remote-tracking branch 'purple/openssl' into merge-recent-udp-tunnel 2016-10-10 08:36:06 -04:00
8a95b5b5b0 tabify 2016-10-10 08:30:33 -04:00
7506619f4c add minimum path lifetime 2016-10-10 08:25:07 -04:00
577d9ddf65 fix memory leak with udp tunnel 2016-10-10 08:23:54 -04:00
43c3bdf7c5 fix 2016-10-10 08:21:47 -04:00
8ba142eb45 increase datagram session switching interval 2016-10-10 08:21:33 -04:00
0fc4e01b1e remove tools 2016-10-10 08:18:54 -04:00
f83ebbcd3a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-10-09 15:45:54 -04:00
77ec4b5cad added warning 2016-10-09 14:57:15 -04:00
9a687976bc Merge pull request #659 from brain5lug/thread-sanitizer
thread sanitizer configuration option have been added
2016-10-09 14:52:42 -04:00
5a796a86d7 thread sanitizer configuration option have been added 2016-10-06 22:49:44 +03:00
71d4221af2 add keyinfo tool 2016-10-05 11:40:25 -04:00
526ba37435 Merge branch 'merge-upd-tunnel-fix' into openssl 2016-10-05 11:36:15 -04:00
f3c080f8a4 Merge branch 'merge-650' into openssl 2016-10-05 11:29:55 -04:00
09a0cf07e4 Merge branch 'check_pr_653' into upstream-openssl 2016-10-05 11:24:44 -04:00
4a3bf46c30 Revert "try fixing appveyor"
This reverts commit 30dfe12910.
2016-10-05 11:03:51 -04:00
30dfe12910 try fixing appveyor 2016-10-05 10:46:15 -04:00
ae2b5dfd3e fix udp tunnel route switching logic 2016-10-05 07:42:00 -04:00
cb0f968467 Added building option "USE_ASLR" 2016-10-05 06:45:41 +05:00
e8e3db6888 fix f79ad91 2016-10-05 01:20:43 +05:00
012ade5000 Added extra-cmake-modules 2016-10-04 18:13:45 +03:00
5350078543 Unused parameter warnings removal 2016-10-04 00:24:42 +03:00
404715e02d thread sanitizer configuration option have been added 2016-10-03 23:24:22 +03:00
31dde394eb remove unnecessary brackets 2016-10-03 20:20:45 +05:00
8ff2627e8e minimize count of errors "I2CP: Failed to send message. No outbound tunnels" 2016-10-03 20:06:10 +05:00
f79ad91a9a probably fix hanging of call I2CP-SendMsgTo-FindLeaseSet 2016-10-03 20:01:31 +05:00
ff6a79bca3 Merge remote-tracking branch 'origin' into openssl 2016-10-02 03:22:50 +05:00
e4d6092939 copy addresses list atomically 2016-10-01 15:05:35 -04:00
9d998d27c5 Merge remote-tracking branch 'origin' into openssl 2016-09-29 20:58:53 +05:00
d6aca6fa00 always send reply 2016-09-29 11:24:52 -04:00
7c34c45983 Merge pull request #646 from PurpleI2P/openssl
recent changes
2016-09-27 16:19:01 -04:00
dd15472da7 Merge remote-tracking branch 'origin' into openssl 2016-09-26 02:45:44 +05:00
b03712a30e correct outbound tunnel selection 2016-09-25 17:23:21 -04:00
d025ba2793 Fixed visibility of variable outboundTunnel 2016-09-26 01:37:00 +05:00
e5e09c9b51 check for boost version 2016-09-24 08:29:08 -04:00
5b8d1df349 Merge pull request #643 from atnaguzin/patch-1
Fixed links and msys2 example filename
2016-09-24 07:32:51 -04:00
fa092c0162 Fixed links 2016-09-24 14:26:59 +03:00
08c1359a27 fixed MiniUPnP link 2016-09-24 13:50:14 +03:00
dba355eccd use atomic_store for addresses' list re-assignment 2016-09-23 13:15:08 -04:00
2ad927b677 NTP request 2016-09-21 16:18:51 -04:00
315f672254 Timestamp.cpp added 2016-09-21 12:02:52 -04:00
7a51407f6d show error message in the web-console 2016-09-19 21:37:04 -04:00
783c2b6b03 Merge pull request #640 from atnaguzin/patch-1
add sliders for LeaseSets
2016-09-19 13:24:32 -04:00
a64e1b2aa6 add sliders for LeaseSets 2016-09-19 20:22:15 +03:00
440516e95f detect clock skew 2016-09-18 18:42:21 -04:00
31f6d13cd8 Merge pull request #639 from PurpleI2P/openssl
recent changes
2016-09-18 07:43:21 -04:00
dc6108575c Merge pull request #638 from brain5lug/openssl
address sanitizer configuration option have been added
2016-09-17 07:42:54 -04:00
6c7316408b address sanitizer configuration option have been added 2016-09-17 11:01:01 +03:00
9aecc69461 Merge pull request #636 from l-n-s/reseeds_config
Adding option to configure reseed URLs
2016-09-16 19:11:08 -04:00
949be436a6 Adding option to configure reseed URLs 2016-09-16 22:56:51 +00:00
cb91891f22 check buffer size 2016-09-16 16:18:50 -04:00
8795f0c8c4 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-09-16 10:31:45 -04:00
fbb5bb2f05 fix #634.don't create timer in constructor 2016-09-16 10:31:11 -04:00
ba309fe6e5 Merge pull request #633 from brain5lug/openssl
perfect forwarding for logging arguments
2016-09-15 21:27:30 -04:00
fee5f959fd perfect forwarding for logging arguments 2016-09-16 01:47:53 +03:00
f9a5f4955c check RI signture before processing 2016-09-12 21:37:43 -04:00
325b362727 show UDP tunnels 2016-09-12 12:05:01 -04:00
75065f29f7 check if field is incomplete 2016-09-12 11:39:33 -04:00
ed874fe3ea check if RouterInfo has been decompressed completely 2016-09-11 21:36:17 -04:00
502e6b0ce5 Merge pull request #631 from rabits/patch-1
Fixed upstart i2pd forking
2016-09-10 19:35:02 -04:00
516380f979 Fixed upstart forking
Upstart can't track daemonize fork without expect fork
2016-09-11 01:15:22 +04:00
6885761f87 check if sessions list is empty 2016-09-08 10:56:22 -04:00
a4762fe65c remove expired session through one pass 2016-09-08 10:46:13 -04:00
bee407ea34 clean-up datagram session toghters with leasesets and tags 2016-09-08 10:16:42 -04:00
db71673722 fixed #629. catch HTTPServer exceptions 2016-09-08 09:19:30 -04:00
9ecbbf09cc Merge pull request #628 from majestrate/merge_udp_tunnel
Merge Recent Changes
2016-09-07 15:27:54 -04:00
b6b14f4957 Merge remote-tracking branch 'purple/openssl' into merge_udp_tunnel 2016-09-07 15:08:45 -04:00
6e0d6dcac5 reselect tunnels if LeaseSet delivery was not confirmed 2016-09-07 13:25:11 -04:00
47a0ebdc91 Merge pull request #627 from vovasty/ios-build
build instruction for iOS
2016-09-06 16:01:27 -04:00
f3a61007a7 build instruction for iOS 2016-09-06 12:26:59 -07:00
4a56d6bf1c Merge pull request #626 from majestrate/webui-freeze-fix
Webui freeze fix
2016-09-04 18:47:09 -04:00
517d4dc6f5 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into webui-freeze-fix 2016-09-04 16:43:55 -04:00
722f1c4430 try fixing webui freeze 2016-09-04 16:43:34 -04:00
f4d1b87f73 expire tags 2016-09-03 18:34:18 -04:00
f64f875806 don't show udp tunnels in ui yet 2016-09-03 18:04:54 -04:00
7ae09fa1fe try fixing memory errors 2016-09-03 17:58:16 -04:00
8a29dfc3fa tabify and use shared pointers 2016-09-03 17:53:46 -04:00
1015188c4e use shared pointers 2016-09-03 16:54:39 -04:00
f0bc2a3645 add null checks 2016-09-03 16:43:02 -04:00
82f46464f3 prevent double free 2016-09-03 16:29:50 -04:00
d336d920e8 fix typo 2016-09-03 16:16:16 -04:00
2f61dd1c41 fix double free 2016-09-03 16:12:43 -04:00
10ffd5c1ab don't check for expired lease 2016-09-03 16:06:14 -04:00
7e99be12b0 fix typo 2016-09-03 16:03:38 -04:00
d37a790b57 fix another typo 2016-09-03 15:58:52 -04:00
7ea8509dfe fix typo 2016-09-03 15:54:22 -04:00
783c0c7c7b update datagram lease selection 2016-09-03 15:53:28 -04:00
68b0775e4b update datagram path logic 2016-09-03 15:35:42 -04:00
682334d844 fix typo 2016-09-03 15:35:32 -04:00
75981491a7 adding usage docs 2016-09-03 22:23:48 +03:00
7cc805b203 update datagram session logic 2016-09-03 14:56:51 -04:00
8cdd3a0abb update routing path when we get a new lease set 2016-09-03 14:42:27 -04:00
571c630d93 try creating routing session if not present 2016-09-03 14:37:36 -04:00
fa1021df59 add webui for udp tunnels 2016-09-03 13:58:34 -04:00
9acbb2203c Update Indentation and don't spam route changes in datagram sessions 2016-09-03 11:46:47 -04:00
c770bcbf96 prevent race condition in datagram destination
clean up style a bit
2016-09-03 10:24:06 -04:00
caace05ba6 fix up compiler warnings 2016-09-03 10:01:23 -04:00
c65dc44f20 Fix up I2PTunnel UDP tunnels 2016-09-03 09:38:53 -04:00
3ea624e1db cosmetic fix 2016-09-01 15:54:48 -04:00
c9c58074fa Merge remote-tracking branch 'purple/openssl' 2016-09-01 11:28:04 -04:00
aa687afd37 updated LeaseSet must be sent after completion 2016-09-01 09:48:04 -04:00
8cb69c1482 fixed #624. correct v6 address size 2016-08-31 22:47:32 -04:00
a68326490d fix 2016-08-30 20:02:27 -04:00
ab763c38d9 use shared pointers 2016-08-30 19:59:24 -04:00
970557660e Add NetDb::VisitRandomRouterInfos 2016-08-30 15:54:53 -04:00
fa8548fe34 implement SetCustomPeerSelector and ensure locking is good 2016-08-30 15:11:39 -04:00
ac88c1a8f1 add ClientDestination::Ready 2016-08-30 13:27:57 -04:00
f2893097a7 check before bind to 127.x.x.x 2016-08-30 02:53:26 +05:00
c0cba7b376 move ready to run 2016-08-29 16:59:17 -04:00
87d1058de3 fix 2016-08-29 16:57:34 -04:00
85e65da492 server tunnel on linux binds on 127.x.x.x 2016-08-30 01:48:47 +05:00
ce97fa87e7 don't use std::promise * 2016-08-29 15:34:59 -04:00
10ffdb2766 add NetDb::WaitForReady 2016-08-29 15:26:19 -04:00
fec49e5609 add hooks for visiting netdb 2016-08-29 14:16:29 -04:00
28fdd992c9 add hooks for custom peer selection 2016-08-29 12:09:37 -04:00
048d3c8386 Merge remote-tracking branch 'purple/openssl' 2016-08-29 10:56:27 -04:00
50e3d6ff37 Merge pull request #623 from majestrate/fix_streaming_hang
make sure m_RTO > 0 in Streaming.cpp so it doesn't hang
2016-08-29 10:48:15 -04:00
37b80f0ce3 make sure m_RTO > 0 in Streaming.cpp so it doesn't hang 2016-08-29 10:44:54 -04:00
7d37b02cff datagram fixes 2016-08-29 10:42:51 -04:00
c6556b8442 make sure m_RTO > 0 in Streaming.cpp so it doesn't hang 2016-08-29 10:41:15 -04:00
5685c376cb fix broken build 2016-08-27 16:13:11 -04:00
2ce64e1bf5 fix typo 2016-08-27 16:10:18 -04:00
7d03a41e3e try manual expiration of tags 2016-08-27 16:09:02 -04:00
35b68db847 schedule cleanup again and add logging 2016-08-27 15:45:56 -04:00
0b21fce94e try adding garlic and session tags to datagram destination 2016-08-27 13:17:34 -04:00
abaf36a2de try unbreaking static build 2016-08-27 09:29:18 -04:00
26440d94f1 * HTTPServer : keep response data for async_write() 2016-08-26 14:42:34 +00:00
205b61e4cf * HTTPServer : fix tag 2016-08-26 14:42:34 +00:00
fc5fc5bbee don't throw exception if connection failed 2016-08-26 10:06:28 -04:00
c4171a01bd fix #622. extract correct CN 2016-08-26 09:48:19 -04:00
32669cb07f stop termination timer on shutdown 2016-08-24 12:34:18 -04:00
7018c381ee Merge remote-tracking branch 'purple/openssl' 2016-08-24 11:42:35 -04:00
b02677ee21 common termination timer for all SSU sessions 2016-08-24 11:21:49 -04:00
63edc60753 Merge pull request #618 from PurpleI2P/openssl
recent changes
2016-08-24 11:12:04 -04:00
065d01bcf6 logging update 2016-08-22 18:29:12 -04:00
42b15e8bbe fix 2016-08-22 17:31:23 -04:00
e8195b78ba fix 2016-08-22 17:26:43 -04:00
1d7d7cf9a0 more changes 2016-08-22 17:19:22 -04:00
979575c311 fix 2016-08-22 13:59:51 -04:00
be12739342 fix 2016-08-22 13:55:44 -04:00
7f7acd8bde fixes 2016-08-22 13:54:00 -04:00
f5e2899275 post work to io service 2016-08-22 13:04:36 -04:00
bee34a3222 fix 2016-08-21 22:54:06 -04:00
5b00cb1e64 osx fix 2016-08-21 22:38:41 -04:00
6bb9de5a96 osx fix 2016-08-21 22:34:48 -04:00
b977050caf osx fix 2016-08-21 22:29:55 -04:00
3f63732c31 osx fix 2016-08-21 22:26:30 -04:00
211660eb3d osx fix 2016-08-21 22:23:27 -04:00
0c709f431f osx fix 2016-08-21 22:18:59 -04:00
9062bf14b6 osx fix 2016-08-21 22:16:35 -04:00
47ebb6ae6c osx fix 2016-08-21 22:11:41 -04:00
b1e3f88704 osx fix 2016-08-21 22:00:31 -04:00
bc439cc47f osx fix 2016-08-21 21:57:36 -04:00
1bba5d5c94 osx fix 2016-08-21 21:55:00 -04:00
d159d49700 os x fix 2016-08-21 21:51:32 -04:00
7ef7ef03dd fix 2016-08-21 21:47:56 -04:00
808b758cd7 fix 2016-08-21 21:45:08 -04:00
ff6d66b96e init addressbook first 2016-08-21 21:40:21 -04:00
da82b14307 changes 2016-08-21 21:28:24 -04:00
7b5e18d94b changes 2016-08-21 21:17:09 -04:00
72974c85c8 try fix 2016-08-21 20:23:39 -04:00
28627a81dc update 2016-08-21 20:18:41 -04:00
bbfe6b66ef fix 2016-08-21 19:48:47 -04:00
bce0e3ebf6 fix 2016-08-21 19:45:32 -04:00
bf46c241d0 fixes 2016-08-21 19:38:12 -04:00
287e32aaed logging 2016-08-21 19:33:33 -04:00
aa11a5deb8 fix 2016-08-21 19:27:01 -04:00
194d63acd8 fixes 2016-08-21 19:17:08 -04:00
46d640cd86 fixes 2016-08-21 18:46:34 -04:00
51783a45e6 set last activity 2016-08-21 15:56:52 -04:00
2679c58892 logging and ip checks 2016-08-21 15:51:39 -04:00
2a5af37075 retrgiger expiration 2016-08-21 15:47:00 -04:00
e529d3ecc9 fixes 2016-08-21 15:39:11 -04:00
e8f9ecc7d9 fixes 2016-08-21 15:33:19 -04:00
aa3723d2bd udp tunnels 2016-08-21 15:02:17 -04:00
bbbda44218 * HTTPServer : show termination time in main page (closes #506) 2016-08-21 13:49:11 +00:00
f99aea5cb1 * Makefile.linux : use linker flags instead full paths to obj files (#602) 2016-08-21 13:49:08 +00:00
65c003eef8 Merge pull request #615 from AMDmi3/miniupnpc-library-detection
Find miniupnpc library as well as header
2016-08-19 07:01:35 -04:00
959843ee9c Find miniupnpc library as well as header 2016-08-19 12:16:28 +03:00
c16632d99a Merge remote-tracking branch 'purple/master' 2016-08-18 18:37:32 -04:00
3d066ea1b8 common termination timer for all NTCP sessions 2016-08-17 10:58:57 -04:00
e163730118 Merge pull request #614 from PurpleI2P/openssl
recent changes
2016-08-17 10:37:09 -04:00
3c8838af08 Merge branch 'upstream-master' 2016-08-16 10:55:54 -04:00
ac5394a1dc Merge pull request #613 from majestrate/fix-static-cmake
Fix static cmake
2016-08-16 10:51:26 -04:00
2e74d91ddc try fixing https://github.com/PurpleI2P/i2pd/issues/612 2016-08-16 10:27:33 -04:00
2d82c4ada4 try fixing https://github.com/PurpleI2P/i2pd/issues/612 2016-08-16 10:25:56 -04:00
03f0ca965e fixed race condition 2016-08-15 22:36:58 -04:00
a527dcd95b moved HTTP to libi2pd 2016-08-15 14:01:57 -04:00
de29abb05c check string buffer size 2016-08-15 13:12:56 -04:00
cb7efcb188 add 'O' to extra bandwidth for flooadfill 2016-08-14 17:58:50 -04:00
bf4f22b203 add 'O' to extra bandwidth 2016-08-14 17:52:11 -04:00
7f3a467a66 Merge pull request #608 from atnaguzin/patch-1
Updated debian/changelog
2016-08-13 14:47:28 -04:00
72ef621f9d Update changelog 2016-08-13 16:52:51 +03:00
73452f758c Update changelog 2016-08-13 16:52:27 +03:00
049e1b2679 Update changelog 2016-08-13 16:50:08 +03:00
4631123231 reseed-ru.lngserv.ru added 2016-08-13 09:05:35 -04:00
c86bcb4dd6 r4sas_at_mail.i2p.crt added 2016-08-13 08:23:32 -04:00
a6280661ee Merge pull request #607 from atnaguzin/patch-1
Updated i2pd.conf
2016-08-12 16:29:04 -04:00
ca7709a284 Update i2pd.conf 2016-08-12 23:23:10 +03:00
384c06f2e9 Merge pull request #606 from atnaguzin/patch-1
Updates in debian part.
2016-08-12 16:20:30 -04:00
774c11781d Update changelog 2016-08-12 22:47:20 +03:00
7a692898e4 moved tunnels.conf 2016-08-12 22:36:31 +03:00
2f1971ea8f moved tunnels.conf 2016-08-12 22:36:17 +03:00
ce13de7d6c moved subscriptions.txt 2016-08-12 22:35:09 +03:00
d51ad77ab4 moved subscriptions.txt 2016-08-12 22:34:29 +03:00
a9b289626e Update logrotate 2016-08-12 22:30:26 +03:00
8a542f2ce8 Update i2pd.upstart 2016-08-12 22:29:32 +03:00
14a2c9d48f Update i2pd.install 2016-08-12 22:28:35 +03:00
37fef7e4f8 Update ChangeLog 2016-08-12 15:21:55 -04:00
b83ab85fd9 Update i2pd.init 2016-08-12 22:21:33 +03:00
d424e1e9ff Update ChangeLog 2016-08-12 15:19:45 -04:00
aaa52bd767 Update i2pd.default 2016-08-12 22:17:25 +03:00
56254e728c Merge tag 'tags/2.9.0' 2016-08-12 13:25:25 -04:00
284159aadc Merge pull request #605 from manasb/manasb-patch-docs
fix a typo
2016-08-12 12:56:33 -04:00
29593f0161 fix a typo 2016-08-12 12:43:59 -04:00
deca217544 don't always set port 4567 2016-08-12 11:07:00 -04:00
c09212de81 Merge pull request #604 from PurpleI2P/openssl
recent changes
2016-08-12 10:44:02 -04:00
db8d93d308 2.9.0 2016-08-12 10:43:06 -04:00
4c96106666 reseed.file added 2016-08-12 10:37:03 -04:00
8e849ea6f8 reseed from file 2016-08-12 10:33:53 -04:00
82d80d2ead moved Config.cpp to libi2pd 2016-08-12 10:28:36 -04:00
a5da55d0f7 Update build_notes_android.md 2016-08-12 09:38:31 -04:00
702e6c8080 buld instruction without QT 2016-08-12 09:30:35 -04:00
46e957ab7e Merge pull request #603 from atnaguzin/patch-2
Replaced arrows to HTML code. Deleted tab spaces.
2016-08-11 07:20:54 -04:00
c27f8a5c1e Replaced arrows to HTML code. Deleted tab spaces. 2016-08-11 12:25:26 +03:00
8e835f2f6b fixed race condition 2016-08-09 20:51:54 -04:00
35e8a027ad Merge pull request #600 from brain5lug/openssl
copy elimination for ranges #part4
2016-08-09 20:50:44 -04:00
94642f9066 copy elimination for ranges #part4 2016-08-10 01:16:24 +03:00
2dd5de4373 handle default subscription in separate thread 2016-08-09 10:17:40 -04:00
793e80490c Merge pull request #598 from brain5lug/openssl
copy elimination for ranges #part3
2016-08-09 07:25:24 -04:00
727a1f4ddd Merge pull request #599 from atnaguzin/patch-1
Update HTTPServer.cpp
2016-08-09 07:22:34 -04:00
6a752a56ff Update HTTPServer.cpp 2016-08-09 13:54:47 +03:00
32466e3804 don't notify before wait 2016-08-08 22:15:09 -04:00
a530503c0c copy elimination for ranges #part3 2016-08-09 01:53:37 +03:00
7ba4af7e2e fixed build error 2016-08-08 17:31:32 -04:00
c9c05ad2a8 Merge pull request #596 from atnaguzin/patch-2
"SAM sessions" link check added
2016-08-08 17:23:58 -04:00
ab1df3a1d0 Update HTTPServer.cpp 2016-08-08 23:37:16 +03:00
56a60772a4 fixed potential deadlock 2016-08-08 11:53:38 -04:00
63e6731207 Merge pull request #595 from brain5lug/openssl
copy elimination for ranges #part2
2016-08-07 18:31:32 -04:00
8b53ded53a copy elimination for ranges #part2 2016-08-08 00:52:48 +03:00
d5075d706c eliminate decay timer 2016-08-07 16:27:36 -04:00
03927b0a68 Merge branch 'upstream-openssl' 2016-08-06 20:27:57 -04:00
0d88b8012b Merge pull request #591 from brain5lug/openssl
The temporary object elemination part#1
2016-08-05 19:33:19 -04:00
a583c21136 merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-08-06 01:26:34 +03:00
b8ec63cf8c copy ellimination for ranges #part1 2016-08-06 01:03:13 +03:00
4b9afdf53a fix typo 2016-08-05 18:06:06 +00:00
788d1650a2 Merge pull request #590 from brain5lug/openssl
tiny commit to check pulling
2016-08-04 17:31:52 -04:00
8f58886a21 tiny commit to check pulling 2016-08-04 23:27:07 +03:00
94b3bb2391 adjust termination timeout 2016-08-04 10:26:50 -04:00
c8f5fb4d03 close duplicate ntcp sessions 2016-08-03 10:40:30 -04:00
070a21a9eb Merge remote-tracking branch 'purple/openssl' 2016-07-31 19:29:12 -04:00
5698ff9c4c wait for UPnP discovery during startup 2016-07-31 10:22:41 -04:00
47b562b032 temporary disable OS X 2016-07-30 18:22:14 -04:00
69234db848 Merge pull request #588 from atnaguzin/patch-1
Update 01-tune-build-opts.patch
2016-07-30 14:58:09 -04:00
ebc132ea65 Update 01-tune-build-opts.patch 2016-07-30 21:27:17 +03:00
0899eeddc0 UPnP for x86_64 2016-07-29 10:59:44 -04:00
cf8ff2cf86 make it compile 2016-07-28 15:35:13 -04:00
ee9dc789af change scope of Stream::Terminate 2016-07-28 15:34:32 -04:00
570598f556 abruptly close 2016-07-28 15:33:03 -04:00
e8c3546433 try fixing 2016-07-28 13:27:51 -04:00
1062776762 cleanup router's tags 2016-07-28 13:24:25 -04:00
584379b502 fix 2016-07-28 12:48:32 -04:00
87e1c45c05 fug 2016-07-28 12:34:33 -04:00
9447afe49c try changing i2cp option 2016-07-28 12:32:05 -04:00
fc5b1ae3e2 fug 2016-07-28 12:28:18 -04:00
13735d0475 move setting 2016-07-28 12:26:05 -04:00
6b3a783ce9 change type 2016-07-28 12:21:59 -04:00
3b66bba92e more fixes 2016-07-28 12:17:24 -04:00
a2e01f8a53 more tweaks 2016-07-28 11:42:31 -04:00
34da9a9655 streaming limiting tweaks 2016-07-28 11:37:33 -04:00
df8d73ae43 typo 2016-07-28 11:20:24 -04:00
aa3a93b6a0 implement streaming limiting (initial) 2016-07-28 11:16:29 -04:00
17bfa35f77 don't use warning for no tags 2016-07-28 10:02:26 -04:00
59797a5c9a streaming log tweaks and dont set RTT to 0 2016-07-28 10:01:20 -04:00
61fe2923e4 don't set socket option for closed sockets 2016-07-28 09:53:39 -04:00
50b9eca34c check for bogus times in packets 2016-07-28 09:50:19 -04:00
f5684eba90 color log messages for warn and error 2016-07-28 09:49:43 -04:00
f32510e10a set socket options 2016-07-28 09:25:05 -04:00
4fb0eeda37 Merge remote-tracking branch 'purple/openssl' 2016-07-28 09:06:58 -04:00
b1aeae6772 * util.{cpp,h} : kill with fire i2p::util::http (#314, closes #432) 2016-07-27 13:10:29 +00:00
5a6bd38d22 * docs/configuration.md 2016-07-27 13:10:29 +00:00
97da8e2f2e * HTTPServer.cpp : true random password 2016-07-27 13:10:28 +00:00
10be150503 invoke GracefulShutdown for Win32 2016-07-26 12:11:52 -04:00
36aa248556 Graceful shutdown 2016-07-26 11:52:44 -04:00
183c22cc84 rollback 2016-07-26 11:22:53 -04:00
63f4cf3d07 graceful shutdown for windows 2016-07-26 11:10:10 -04:00
eeeae12639 check for correctly loaded privatekeys 2016-07-25 11:13:54 -04:00
0d854c6ea6 Merge remote-tracking branch 'purple/master' 2016-07-25 10:29:10 -04:00
1e1c4d159b do reload 2016-07-25 10:28:20 -04:00
4dc9f6948d bounds checks 2016-07-25 09:57:35 -04:00
c06e739c9b Merge pull request #583 from PurpleI2P/openssl
recent changes
2016-07-25 09:43:18 -04:00
061720bcf0 handle'\r\n' terminated address from Transmission 2016-07-24 10:20:37 -04:00
11585327bf correct status response 2016-07-24 09:24:20 -04:00
2793eeb10a Merge pull request #581 from PurpleI2P/reloadconfig_on_SIGHUP
Reload client config on SIGHUP
2016-07-24 08:15:00 -04:00
8fb093b272 Reload client config on SIGHUP 2016-07-24 17:58:26 +08:00
c90c008f65 Merge remote-tracking branch 'purple/openssl' 2016-07-23 21:22:02 -04:00
3d1a7f173c select Charlie based on Alice's address type 2016-07-22 13:08:41 -04:00
ba078f3ff5 support peer test for ipv6 2016-07-22 12:50:03 -04:00
6d54401d7c Merge remote-tracking branch 'devnull/linux_tunnel_reload_on_hup' 2016-07-22 12:42:59 -04:00
c9a0897208 Merge remote-tracking branch 'purple/openssl' 2016-07-22 11:57:48 -04:00
6a1049bfb7 override address if v6 only 2016-07-22 10:34:56 -04:00
5995ab3f4c Merge branch 'upstream-openssl' 2016-07-22 10:18:58 -04:00
a4112ebed2 add both v4 and v6 addresses 2016-07-22 10:16:57 -04:00
289cae4213 Merge remote-tracking branch 'purple/openssl' 2016-07-22 09:59:56 -04:00
eaac21cda1 * check router info addresses for nullptr
* Request LS before expiration for smoother handover
2016-07-22 09:56:17 -04:00
3b9b827ebf getnick doean't return error if was set before 2016-07-21 20:42:40 -04:00
c908beade2 Added client tunnel reload on SIGHUP for Linux 2016-07-21 17:57:43 -06:00
abcf030181 more BOB error messages 2016-07-21 14:02:13 -04:00
22a16da09e fixed android build 2016-07-20 21:44:17 -04:00
0e31da5e51 Merge pull request #578 from PurpleI2P/openssl
recent changes
2016-07-20 18:33:43 -04:00
61e6a03d70 check correct #ifdef for windows 2016-07-20 09:33:50 -04:00
3f2119556f upnp.name 2016-07-19 12:05:32 -04:00
77493d0d09 configurable UPnP name 2016-07-19 12:03:03 -04:00
340c73cbdf send actual status back 2016-07-19 11:08:28 -04:00
ea7f4447b2 * Reseed.cpp : check response code 2016-07-19 00:59:16 +00:00
19f3c75a8d * Reseed.cpp : use new response parsing 2016-07-19 00:59:15 +00:00
25ba08abcf * Reseed.cpp : use new http classes 2016-07-19 00:59:13 +00:00
26be0c7c82 * move i2p::util::config::GetHost to RouterContext.cpp 2016-07-19 00:59:11 +00:00
b7c5e3b5d5 correct termination of UPnP 2016-07-18 14:01:58 -04:00
701653a6bd Merge pull request #576 from rjmalagon/patch-1
Update BOB.cpp
2016-07-16 12:18:51 -04:00
2c099c7f0e Update BOB.cpp
fixed typo
2016-07-16 10:21:07 -04:00
fba53117d8 Update BOB.cpp
Fix a little typo
2016-07-16 09:21:01 -05:00
e1bf53d90a handle status command 2016-07-16 09:31:33 -04:00
ecc82739d8 * HTTP.cpp : fix is_gzipped() 2016-07-16 12:13:00 +00:00
d16afa9692 * Addressbook.cpp : tune logs 2016-07-16 12:11:23 +00:00
9f3ce09e88 * Addressbook.{cpp,h} : show new hosts 2016-07-16 12:11:23 +00:00
cbfb1edb79 * Addressbook.{cpp,h}:
* Request() now renamed and returns value
  * move spawning download thread to Addressbook class
  * CheckSubscription() renamed and handles return value of Request()
2016-07-16 12:11:10 +00:00
b6c336bf72 * Addressbook.cpp : use HTTPRes class for response parsing 2016-07-16 12:10:43 +00:00
403e34506e * Addressbook.cpp : use HTTPReq class for building request 2016-07-16 12:10:37 +00:00
83db868542 * Addressbook.cpp : use new URL class, unwrap some conditions 2016-07-16 12:10:34 +00:00
1b6e673b50 Merge pull request #574 from majestrate/master
Floodfill fixes, testnet fixes, add lease set view page in HTTPServer
2016-07-15 14:52:12 -04:00
a0144f093f fix typo 2016-07-15 13:59:56 -04:00
a5d84bf8a9 pedantic whitespace fix 2016-07-15 13:54:34 -04:00
84bb740e62 clean up code 2016-07-15 13:52:55 -04:00
d37482ada1 IT WORKS, floodfill confirmed working on test network 2016-07-15 13:31:31 -04:00
75fc8202ab fix off by ones 2016-07-15 12:49:45 -04:00
24aff15752 off by one 2016-07-15 10:55:02 -04:00
338b9928f0 repeat correction 2016-07-15 10:45:38 -04:00
b9607b4b8e correct last commit 2016-07-15 10:44:43 -04:00
586f241074 OFF BY ONE 2016-07-15 10:44:08 -04:00
e298987d9e fixed build error 2016-07-15 09:45:54 -04:00
71cc4b5bf2 add lease set page in http server 2016-07-15 09:38:21 -04:00
4fdd9feddc don't try to republish forever 2016-07-14 16:59:26 -04:00
caf7da1053 set reachable/unreachable for v4 only 2016-07-14 14:29:45 -04:00
7d04ba0fc3 CXXFLAGS -> NEEDED_CXXFLAGS 2016-07-14 14:25:20 -04:00
d98d091c43 use list instead vector for addresses 2016-07-14 14:10:38 -04:00
3ad196c4c7 fix meshnet mode:
* don't default to ipv4 when creating router.info
* add i2p::util::config::GetHost for getting host to use from config
* proper check for no transports in Transports.cpp on startup
2016-07-14 09:23:33 -04:00
562f320198 load libstd 2016-07-13 22:34:53 -04:00
3e5581e094 create addresses in defualt constructor 2016-07-13 22:33:39 -04:00
c4721e1020 + HTTP.{cpp,h} : add HTTPRes::is_gzipped() 2016-07-14 00:34:42 +00:00
728f2670f3 * HTTPServer.cpp : drop jumpservices : now handled by HTTPProxy itself 2016-07-14 00:34:38 +00:00
8dd157d2eb * HTTPProxy.cpp : html error messages 2016-07-14 00:32:41 +00:00
2d40d69fa2 fixed race condition 2016-07-13 12:56:23 -04:00
f2f0d69bce Update configuration.md 2016-07-13 11:14:06 -04:00
812f5045b0 enable UPnP for windows and android by default 2016-07-13 11:12:51 -04:00
9a8e7b11e5 detect network status at android 2016-07-13 10:09:22 -04:00
e213e695c8 Merge pull request #572 from hypnosis-i2p/openssl
reworked android. added a build script.
2016-07-13 08:46:23 -04:00
e24eea313c updated 2016-07-13 19:40:09 +08:00
a3286ebac3 updated 2016-07-13 19:36:18 +08:00
95ae23a32c gitignore 2016-07-13 11:08:35 +08:00
d240f3242c gitignore 2016-07-13 11:08:35 +08:00
814f60a512 reworked android. added a build script. 2016-07-13 11:08:35 +08:00
fac6229e43 * cmake debug (closes #562) 2016-07-13 01:01:47 +00:00
c528d739c8 Merge branch 'new-proxy' into openssl 2016-07-13 00:49:00 +00:00
c664be52d7 limit outgoing queue size 2016-07-12 16:26:36 -04:00
4ac4f44ba7 limit delayed messages queue size 2016-07-12 12:37:39 -04:00
174430e3b5 * HTTPServer.cpp : rename command 2016-07-12 02:30:39 +00:00
762b21f809 * Streaming.cpp : tune log messages 2016-07-12 02:23:24 +00:00
9340bf385e * Daemon.cpp : make upnp configurable via options 2016-07-12 02:21:52 +00:00
9f5be52a97 * UPnP.cpp : tune log messages 2016-07-12 02:21:52 +00:00
9dc5a4fce3 * UPnP.{cpp,h} : cleanup & add class stub if opt-out 2016-07-12 02:21:52 +00:00
fda3cd5fe7 * Config.cpp : add --upnp.enabled option 2016-07-12 02:21:52 +00:00
6b8469e9a3 * docs/configuration.md : fix markdown 2016-07-12 02:21:52 +00:00
7dbbe5a7d8 wait until tunnels get created 2016-07-11 14:35:59 -04:00
2d6fdeb7ad Merge pull request #567 from hypnosis-i2p/openssl
android without qt — initial push
2016-07-09 21:50:33 -04:00
4d3a01a5fe android ported all + isConnected notif 2016-07-10 09:42:42 +08:00
8cc6756815 Merge pull request #566 from PurpleI2P/openssl
recent changes
2016-07-09 21:41:43 -04:00
5967ab75b1 Merge branch 'openssl' of https://github.com/hypnosis-i2p/i2pd into openssl 2016-07-10 04:54:15 +08:00
69c954760a android without qt initial commit 2016-07-10 04:54:11 +08:00
40a4c3ccbd junk 2016-07-10 00:19:20 +08:00
aacb9d9570 merged 2016-07-10 00:19:20 +08:00
9b6c229b71 remember tunnels selection for following messages 2016-07-08 14:17:41 -04:00
1da5be2871 clean up unconfirmed tags faster 2016-07-07 22:39:20 -04:00
66dafca61a select existing connection for first hop of a tunnel 2016-07-06 22:34:24 -04:00
1f22b5b083 junk 2016-07-07 02:46:11 +08:00
5be0b7a731 merged 2016-07-07 02:45:13 +08:00
b64b5d9103 Update build_notes_android.md 2016-07-06 17:55:36 +00:00
953d78da9e Update build_notes_android.md 2016-07-06 16:10:30 +00:00
ce9e0981a2 Update index.rst 2016-07-06 16:03:54 +00:00
76e1114a1f Update build_notes_android.md 2016-07-06 11:30:11 -04:00
cfc80b491f Update build_notes_android.md 2016-07-06 11:29:43 -04:00
43ed05d3c2 Create build_notes_android.md 2016-07-06 11:29:00 -04:00
4cf5ce871f destroy socket upon receive an ack for close 2016-07-05 17:52:11 -04:00
91ec08df4e wait for close from other side 2016-07-05 09:52:18 -04:00
c79363ef63 Merge pull request #563 from PurpleI2P/openssl
recent changes
2016-07-05 09:40:17 -04:00
cc6672198a Merge pull request #560 from atnaguzin/openssl
updated appveyor.yml
2016-07-02 07:14:21 -04:00
17cdf7c79d Merge pull request #7 from PurpleI2P/openssl
fixed VS build error
2016-07-02 13:52:18 +03:00
725f939f35 fixed VS build error 2016-07-02 06:45:15 -04:00
e2df00bb2e Merge pull request #6 from PurpleI2P/openssl
Upstream pull
2016-07-01 15:34:01 +03:00
a9a33c6179 fixed build error 2016-07-01 08:31:27 -04:00
8e7eb87a2d Merge pull request #558 from atnaguzin/patch-1
Update i2pd_qt.pro
2016-07-01 08:10:25 -04:00
217004e7a5 Update appveyor.yml 2016-07-01 13:22:47 +03:00
4d10848984 Update i2pd_qt.pro 2016-07-01 13:07:24 +03:00
da2c04f681 * HTTPProxy.cpp : show created stream IDs in log 2016-07-01 00:39:07 +00:00
8deb327b3b * HTTPProxy.cpp :
* migrate to HTTPReq
  * change work with buffers
  * code cleanup
2016-07-01 00:38:55 +00:00
642b01bf0d * HTTPProxy.cpp : add SanitizeHTTPRequest() 2016-07-01 00:38:31 +00:00
9fd78b1eb1 * HTTPProxy.cpp : rename variable 2016-07-01 00:38:31 +00:00
66c09fc44c * HTTPProxy.cpp : HandleJumpServices() -> ExtractAddressHelper() 2016-07-01 00:38:31 +00:00
2cb5e1a6c2 * HTTPProxy.cpp : kill ExtractRequest() 2016-07-01 00:38:31 +00:00
02ac638bd4 * HTTP.cpp : add comments, update test case 2016-07-01 00:34:31 +00:00
323f74c43a * HTTP.cpp : fuck the "special cases", use nginx rewriting frontend or some 2016-07-01 00:34:28 +00:00
1e56d17d39 Merge pull request #5 from PurpleI2P/openssl
upstream pull
2016-07-01 02:12:09 +03:00
16af8e082b Merge pull request #557 from majestrate/merge-testnet-changes
Merge testnet changes
2016-06-30 18:24:49 -04:00
9215a54c23 revert 2016-06-30 18:05:41 -04:00
fab34d3dbb clean up identation 2016-06-30 17:59:14 -04:00
03d7330af5 Merge pull request #556 from PurpleI2P/openssl
floodfill fixes
2016-06-30 17:51:26 -04:00
346b0c9d68 disable testnet by default 2016-06-30 17:50:47 -04:00
c29359e7a8 Merge remote-tracking branch 'purple/openssl' into meshnet 2016-06-30 17:48:46 -04:00
4b903931bc update i2pd testnet addressbook url 2016-06-30 17:34:16 -04:00
4e0929e71a don't print out junk when logging 2016-06-30 17:24:33 -04:00
1bad097a13 don't check for LS expired for FF 2016-06-30 17:21:18 -04:00
331065eec6 remove expired LS 2016-06-30 17:01:00 -04:00
f51ba499d5 Merge pull request #555 from majestrate/fix-ff-off-by-one
off by one?
2016-06-30 15:07:26 -04:00
f62ccc2d48 off by one? 2016-06-30 14:26:05 -04:00
cf485aa62e Merge pull request #554 from atnaguzin/openssl
added hiding information in webconsole
2016-06-30 14:25:39 -04:00
6b16a48568 revert 2016-06-30 14:24:55 -04:00
ff7cf503ae added hiding information in webconsole 2016-06-30 21:21:37 +03:00
2412a0d502 off by one? 2016-06-30 13:35:36 -04:00
b1612bb1ed Merge pull request #4 from PurpleI2P/openssl
Upstream pull
2016-06-30 20:30:45 +03:00
b8a205f755 netdb.cpp:
* explicitly define replyIdent

Daemon.cpp:
* wait for 1 second before checking if transports are bound to wait for transports to bind
2016-06-30 13:25:20 -04:00
eab08ea78c don't accept our own RouterInfo 2016-06-30 13:15:36 -04:00
d7653769b4 more logging 2016-06-30 12:57:20 -04:00
c72d9695da testnet changes 2016-06-30 12:27:23 -04:00
0493f00a7a pass null tunnel config for zero hops tunnel 2016-06-30 12:24:26 -04:00
ff757ddc88 don't check for exact LS 2016-06-30 11:27:40 -04:00
c4c495948a don't flood if older 2016-06-30 11:10:01 -04:00
986ee6bac3 Merge remote-tracking branch 'purple/openssl' into meshnet 2016-06-30 11:03:15 -04:00
6ab7e79987 send own copy of a message during flood 2016-06-30 11:01:21 -04:00
c6e35876fa if LS is older, assume updated so we reply 2016-06-30 10:51:39 -04:00
eb31accf20 Merge remote-tracking branch 'purple/openssl' into meshnet 2016-06-30 10:25:44 -04:00
ea1ba0f09b don't flood to itself 2016-06-30 10:21:53 -04:00
10911f5b64 make it compile 2016-06-30 09:52:37 -04:00
0eab8e9322 more pedantic logging changes 2016-06-30 09:49:28 -04:00
fb2602716e add floodfill to exclude 2016-06-30 09:48:08 -04:00
be68906ae9 logging tweaks 2016-06-30 09:45:06 -04:00
c53d6d80ba Merge branch 'master' into meshnet 2016-06-30 09:15:30 -04:00
1362177352 Merge remote-tracking branch 'purple/openssl' 2016-06-30 08:57:59 -04:00
28ab1230e2 '@' can exist in url path 2016-06-30 08:00:18 -04:00
0784934520 Merge pull request #551 from majestrate/http-router-ident
add RouterInfo hash to web ui
2016-06-30 07:46:28 -04:00
79fbf9d47f add RouterInfo hash to web ui 2016-06-30 07:41:40 -04:00
dabdc8e4c5 Merge branch 'upstream-openssl' 2016-06-30 07:40:15 -04:00
466ad192b0 add RouterInfo hash to web ui 2016-06-30 07:36:35 -04:00
ac59d9e1b6 Merge branch 'upstream-openssl' 2016-06-30 07:36:14 -04:00
d44245e1e9 add RouterInfo hash to web ui 2016-06-30 07:35:30 -04:00
c50105493a fixed zero-hops tunnels 2016-06-29 21:37:17 -04:00
2768a62f92 more logging 2016-06-29 18:05:08 -04:00
5841d0d87d add more specific logging 2016-06-29 17:59:56 -04:00
2a796051bf try fixing LS 2016-06-29 17:42:26 -04:00
50286fd173 use inet_ntop properly 2016-06-29 16:10:43 -04:00
44f0bad2a6 fug 2016-06-29 15:52:32 -04:00
611b9c4fd1 ugh 2016-06-29 15:50:39 -04:00
3f50776062 ugh 2016-06-29 15:48:02 -04:00
c70d2ad6fa try fixing 2016-06-29 15:42:03 -04:00
9dd0bd604c fix 2016-06-29 15:37:37 -04:00
0565519509 don't print out raw ident 2016-06-29 15:15:33 -04:00
c282d95be1 undo change 2016-06-29 15:10:33 -04:00
766286b8bc undo pedantic change 2016-06-29 14:57:42 -04:00
f405c62f1e pedantic style and logging changes 2016-06-29 14:56:00 -04:00
93fbd7b3ba Merge branch 'upstream-openssl' into meshnet 2016-06-29 13:32:39 -04:00
ae5cea7f36 change order of initialization 2016-06-29 11:59:43 -04:00
8b7b6cfbc5 try fixing segfault 2016-06-29 11:57:44 -04:00
f6e988d6fd support zero-hops tunnels for destinations 2016-06-29 11:26:46 -04:00
f88f68f248 Add bind to network interface option 2016-06-29 11:06:51 -04:00
14f2b24b16 update logging 2016-06-29 10:11:14 -04:00
f2dde98e2f add meshnet option to cmake build files 2016-06-29 09:37:38 -04:00
90d8ec0e81 add more logging 2016-06-29 09:37:21 -04:00
14cdb531c8 * Streaming.cpp : tune logs 2016-06-29 02:14:39 +00:00
3a50320f79 add more logging 2016-06-28 15:35:58 -04:00
597b5e6cfb use different constants for now in meshnet mode 2016-06-28 14:50:25 -04:00
2cd056cfb3 try banning non responsive routers 2016-06-28 14:43:55 -04:00
be6aab4c40 revert 2016-06-28 14:24:18 -04:00
d030df925f Merge remote-tracking branch 'purple/openssl' into meshnet 2016-06-28 14:21:09 -04:00
50756eb94a Merge branch 'restricted_routes' into meshnet 2016-06-28 13:28:57 -04:00
21b3576b66 stop using auto 2016-06-28 12:20:18 -04:00
2e5226356b * Tag.h : add (c) header 2016-06-28 14:31:40 +00:00
21b76d3d2b * Config.cpp : drop compat parser 2016-06-28 14:31:40 +00:00
2d252e6459 * HTTP.cpp : rename method 2016-06-28 14:31:40 +00:00
43be363542 Merge remote-tracking branch 'purple/openssl' into meshnet 2016-06-28 09:34:38 -04:00
8cb3e3418a send garlic cloves directly if garlic was received derectly 2016-06-28 09:31:41 -04:00
cd47ddd539 default to USE_MESHNET=yes 2016-06-28 07:57:48 -04:00
2be1c10522 Tag.h and Gzip.h/.cpp added 2016-06-28 07:11:55 -04:00
7f26670173 + tests/test-base-64.cpp 2016-06-28 01:45:14 +00:00
d838ce85c3 * Base.h : extract Tag template class to separate header 2016-06-28 01:45:11 +00:00
6350f5e6e8 * Base.cpp : extract gzip classes to separate file 2016-06-28 01:45:07 +00:00
10f3690ede Merge pull request #547 from atnaguzin/openssl
fixed #546
2016-06-27 20:30:31 -04:00
06daa8bb0e try shooting in the dark for workarround 2016-06-27 17:39:13 -04:00
34a90f442e try shooting in the dark for workarround 2016-06-27 17:37:31 -04:00
afe81dcdbe add logging 2016-06-27 17:25:29 -04:00
24d616672b revert daemon.cpp change 2016-06-27 17:11:03 -04:00
9cfc61cd45 fixed #546 2016-06-28 00:00:54 +03:00
487df84b90 Merge pull request #3 from PurpleI2P/openssl
Upstream pull
2016-06-27 23:54:53 +03:00
614c1306f6 use correct netid when using separate test network 2016-06-27 16:40:46 -04:00
07dca9bd16 tweak ssu mtu again for meshnet 2016-06-27 15:28:26 -04:00
1ebcbd5b0e use smaller mtu for meshnet mode 2016-06-27 15:06:15 -04:00
32644ddada try fixing duplicate Routers In tunnel path 2016-06-27 14:16:29 -04:00
cf3bab996e when routers < 5 and in meshnet mode do not select random peers 2016-06-27 14:00:04 -04:00
926ffe2581 change default addressbook for meshnet mode 2016-06-27 13:46:14 -04:00
fff3587d99 only set as testing when not in meshnet mode 2016-06-27 13:20:21 -04:00
866cf940da make always reachable when in meshnet mode 2016-06-27 13:15:05 -04:00
7868e1527e try fixing ipv6 ssu 2016-06-27 11:08:23 -04:00
556bfb752a disable meshnet by default, use make USE_MESHNET=yes to build for cjdns 2016-06-27 10:33:14 -04:00
a3b08654b4 try adding ipv6 only mode for ssu 2016-06-27 10:24:37 -04:00
4cf4436169 initial meshnet mode 2016-06-27 09:47:53 -04:00
e2acc55819 * HTTPProxy.cpp : unwrap HandleStreamRequestComplete() 2016-06-27 13:14:42 +00:00
6b29d6b8dc * HTTPProxy.cpp : unwrap AsyncSockRead() 2016-06-27 13:14:39 +00:00
b668c4c302 * add global switch USE_UPNP to makefile 2016-06-27 13:12:01 +00:00
646778227a * tune log messages 2016-06-27 13:11:10 +00:00
a973630cb4 * fix tests 2016-06-27 13:11:10 +00:00
4e7375c09c * Addressbook.cpp : move storage creation to Start() 2016-06-27 13:11:10 +00:00
881d0652e7 * update debian package defaults 2016-06-27 13:11:10 +00:00
0c46993baa Merge pull request #544 from atnaguzin/openssl
Updating i2pd_qt.pro
2016-06-27 06:54:49 -04:00
09b15f4940 edited i2pd_qt.pro 2016-06-27 05:55:07 +03:00
ebf7be56bb Merge pull request #2 from PurpleI2P/openssl
upstream pull
2016-06-27 05:52:56 +03:00
727068cc4b * HTTPProxy.cpp : migrate HTTPRequestFailed() to new http classes 2016-06-27 02:37:33 +00:00
6f77c6f3f4 * HTTPProxy.cpp : don't reuse part of httppserver, addresshelpers handling will be moved to proxy in future 2016-06-27 02:37:32 +00:00
c5e3e17eae * HTTPProxy.cpp : extract IsI2PAddress() from class 2016-06-27 02:37:30 +00:00
effdb70417 Merge branch 'upstream-openssl' into restricted_routes 2016-06-26 21:53:13 -04:00
e28f910c88 * enable travis for UPNP=ON back 2016-06-27 01:30:02 +00:00
c84468dbed * fix cmake build with upnp=on 2016-06-27 01:12:20 +00:00
4b9e39ac64 limit SSU outgoing windows 2016-06-26 17:03:04 -04:00
6b0c05ee7c Merge pull request #542 from majestrate/fix-rpi-static
fix static build for rpi linux
2016-06-26 13:31:14 -04:00
5c6ec70126 fix static build for rpi linux 2016-06-26 11:17:05 -04:00
2757ef94c9 don't include UPNP twice for android 2016-06-26 08:37:40 -04:00
9ba7120011 fixed build error 2016-06-26 08:32:36 -04:00
124f9ec44e Merge pull request #1 from PurpleI2P/openssl
upstream pull
2016-06-26 15:29:43 +03:00
0d229175cd Merge pull request #539 from hypnosis-i2p/openssl
added tray icon to linux and windows versions
2016-06-25 21:01:54 -04:00
10638b6e40 fixed unnecessary resources setting 2016-06-26 02:48:13 +08:00
134baad56d added tray icon to linux and windows versions 2016-06-26 02:32:54 +08:00
9a5984d750 Merge branch 'upstream-openssl' into restricted_routes 2016-06-25 10:55:22 -04:00
073f42e64a Merge branch 'upstream-openssl' into restricted_routes 2016-06-25 10:54:41 -04:00
096927beed don't sedn explicit Ack if no NACKs only 2016-06-24 21:54:58 -04:00
4bc76995d1 docs: default httpproxy.port changed to actual 4444 2016-06-24 19:29:59 -04:00
9f41151156 HTTP proxy redirects to 0.0.0.0:7070/?page=jumpservices 2016-06-24 19:25:48 -04:00
6b3bd755b0 fixtypo 2016-06-24 19:07:47 -04:00
7e580e6a0b Update HTTPServer.cpp 2016-06-24 17:58:46 -04:00
047c8eda22 stop accepting tunnels by graceful shutdown 2016-06-24 16:26:13 -04:00
f22e5c209c fixed QT linux build 2016-06-24 16:05:03 -04:00
8cc3a08871 Merge pull request #536 from hypnosis-i2p/openssl
Added graceful quit button; the code for stopping tunnels pending
2016-06-24 15:43:12 -04:00
35f6c6cb98 graceful quit button added 2016-06-25 03:38:50 +08:00
814b174f25 android version code bump 2016-06-25 03:38:50 +08:00
5fbaf0bc7d disabled UPNP=ON 2016-06-24 15:29:36 -04:00
ba772ab481 static miniupnpc 2016-06-24 14:20:35 -04:00
0a4888a18f link with miniupnp 2016-06-24 14:18:50 -04:00
fedbf2cc44 link UPnP with app if USE_UPNP is set 2016-06-24 13:15:51 -04:00
0f68bbac8e single #ifdef for protocol type 2016-06-23 14:01:41 -04:00
13e965096b UPnP for android 2016-06-23 12:57:36 -04:00
92961bb7bf i2cp for android 2016-06-23 11:23:06 -04:00
340686ba06 * HTTPProxy.{cpp,h} : rename classes, drop typedef 2016-06-23 13:24:44 +00:00
d8906f508c * HTTPProxy.cpp : HTTP error message cleanup 2016-06-23 13:24:44 +00:00
dde53ea4ba * HTTPProxy.cpp : HTTPRequestFailed() now responds with error message 2016-06-23 13:24:44 +00:00
225ed5b662 * HTTPProxy.{cpp,h} : move & sort headers 2016-06-23 13:24:44 +00:00
02857cf2b5 * Base.cpp : drop logger dependency 2016-06-23 13:24:44 +00:00
118a771980 * update changelog 2016-06-23 13:24:37 +00:00
359123564f Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-06-22 15:49:02 -04:00
49d2878938 use local sockets for android 2016-06-22 15:48:36 -04:00
f08ea4a9a3 Merge pull request #535 from PurpleI2P/openssl
2.8.0
2016-06-22 15:47:22 -04:00
f2bc71bc2a Merge branch 'upstream-openssl' 2016-06-22 13:19:00 -04:00
2b1e40c6c6 Update build_notes_windows.md 2016-06-22 11:15:40 -04:00
105c2deeb3 Merge pull request #534 from atnaguzin/patch-2
markup update
2016-06-22 11:06:44 -04:00
c3dbbc9144 Update build_notes_windows.md 2016-06-22 18:04:11 +03:00
ca55a9a8a6 build with UPnP 2016-06-22 10:53:29 -04:00
7ea5af448e UPNP support from windows 2016-06-22 09:41:01 -04:00
2f6898142e Merge pull request #533 from atnaguzin/openssl
updated config files
2016-06-22 07:13:23 -04:00
02e0b8cc32 Update i2pd.conf 2016-06-22 11:49:22 +03:00
b962a4c69b updated config files 2016-06-22 11:46:37 +03:00
ed3e83df67 android is supported now 2016-06-21 12:34:20 -04:00
b07bff61f0 set target SDK to 23 2016-06-21 09:09:31 -04:00
a7c955055c Merge branch 'upstream-openssl' into restricted_routes 2016-06-21 08:15:26 -04:00
13f33a9d19 2.8.0 2016-06-20 21:39:47 -04:00
be3fa6091d app appears as 'i2pd' 2016-06-20 15:28:25 -04:00
8ffddf06e4 fixed memory leak 2016-06-20 12:15:15 -04:00
9b7f583b2b icon and external storage permissions 2016-06-20 11:31:27 -04:00
9fe4f3adea teminate NTCP session on close completely 2016-06-19 21:05:48 -04:00
74d9f89c09 Merge pull request #529 from majestrate/fix-long-uptime-memleak
close ntcp sessions to prevent memory leaks
2016-06-19 21:00:25 -04:00
63c36e917e Merge branch 'upstream-openssl' into restricted_routes 2016-06-19 16:50:51 -04:00
184c6ee252 close ntcp sessions to prevent memory leaks 2016-06-19 16:48:03 -04:00
1c024afc1b Merge pull request #528 from hypnosis-i2p/openssl
fixed #519
2016-06-19 15:09:10 -04:00
51519361e2 various + fixed #519 2016-06-20 02:50:37 +08:00
bd092295a4 fixed #519 2016-06-20 02:50:37 +08:00
153c275d74 use /sdcard for android only if available 2016-06-19 09:58:29 -04:00
db0dfa1bf1 Merge pull request #526 from hypnosis-i2p/openssl
Android setForeground fix + notific.icon + fs crash fix + backg.thread restored
2016-06-19 09:44:59 -04:00
debd13d8c3 fixes: icon + localservice.java 2016-06-19 21:13:21 +08:00
4b8466e5e5 restored backg. thread; removed deinit() 2016-06-19 20:44:23 +08:00
9d9793e1af fs fixed. need another solution 2016-06-19 20:35:37 +08:00
46fafebade setForeground works. 2016-06-19 20:35:17 +08:00
1dae3d951a added qt java wrapper 2016-06-19 17:26:34 +08:00
fb213a1efd Merge pull request #523 from PurpleI2P/openssl
android build
2016-06-18 21:26:40 -04:00
93deb37c94 add primordial goo tier "hidden mode" (aka toy feature needs more work doesn't do it correctly all the way) 2016-06-18 11:10:58 -04:00
004a93a841 Merge branch 'transport_failsafe' into restricted_routes 2016-06-18 09:01:53 -04:00
da5be9f01d temporary disable background thread 2016-06-17 16:37:08 -04:00
344d0ae3ec some cleanup 2016-06-17 16:30:50 -04:00
3639c86adf some cleanup 2016-06-17 12:04:05 -04:00
4fc80fd366 eliminated DaemonQTImpl singleton 2016-06-17 11:25:28 -04:00
336ab2d82a Merge remote-tracking branch 'purple/openssl' into restricted_routes 2016-06-17 11:04:46 -04:00
74a7e67002 implement restricted routes (initial) 2016-06-17 11:03:33 -04:00
f76c04b7a6 fixed build errors 2016-06-17 10:26:51 -04:00
8130487b18 Merge pull request #522 from hypnosis-i2p/openssl
Qt: (1) Daemon now operates in backgr.mode, (2) added GUI Quit button
2016-06-17 10:06:33 -04:00
83790a5a73 qt: daemon now operates in the background thread; added Quit GUI button 2016-06-17 21:54:22 +08:00
1b35f68de9 qt: daemon now operates in the background thread; added Quit GUI button 2016-06-17 21:54:22 +08:00
3e912c6198 qt: daemon now operates in the background thread; added Quit GUI button 2016-06-17 21:52:14 +08:00
f995595202 Merge pull request #521 from PurpleI2P/openssl
android
2016-06-17 09:41:35 -04:00
6264569ca0 use /sdcard/i2pd at android 2016-06-17 09:10:11 -04:00
e868d427dd add options to not use ntcp or ssu 2016-06-17 09:02:12 -04:00
b9cbdb2dc4 Removed dependancy from stdafx 2016-06-16 18:20:07 -04:00
7ae563867c mainfest 2016-06-16 16:22:14 -04:00
f2f760bda4 link against correct openssl libs 2016-06-16 14:29:32 -04:00
ed561ad86b x86 build added 2016-06-16 11:42:34 -04:00
675861c323 Auto webconsole page refresh commented 2016-06-16 09:18:46 -04:00
ba330a42d6 Auto webconsole page refresh removed 2016-06-16 09:15:30 -04:00
2a9727c6b7 Merge pull request #520 from l-n-s/pretty_docs
More informative README and docs index
2016-06-15 19:55:33 -04:00
5be147e8cc More informative README and docs index 2016-06-16 01:11:42 +03:00
eb96edbd31 separate DaemonQT and DaemonQTImpl 2016-06-15 14:43:29 -04:00
14c85fa975 configurable pathes to dependancies 2016-06-15 13:18:04 -04:00
b0e3339370 DaemonQT 2016-06-15 12:20:31 -04:00
70e502e55d QT doesn't depend on Linux daemon anymore 2016-06-15 11:28:59 -04:00
ff38a3bbfe don't demonize 2016-06-15 10:17:02 -04:00
b5723a6c18 use QT's main loop 2016-06-15 09:31:52 -04:00
89012cd73b Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-06-14 14:37:52 -04:00
756e86662b fixed android build 2016-06-14 14:37:22 -04:00
27ca3b4b01 Enable C++11 2016-06-14 13:21:22 -04:00
a5be4c9d0e moved std::to_string to util.h from android 2016-06-14 11:55:44 -04:00
07cc547bab Merge pull request #517 from anon5/openssl
Android i2pd armeabi-v7a with Qt
2016-06-14 11:23:49 -04:00
f672af9706 .apk runs on emulator 2016-06-14 23:17:37 +08:00
58b058ab3a .apk builds. untested 2016-06-14 23:17:37 +08:00
28c2ca8bf8 gitignore improved - added various generated files 2016-06-14 23:17:37 +08:00
d7a06dc7a9 Merge pull request #516 from PurpleI2P/openssl
recent changes
2016-06-14 11:10:20 -04:00
8970e6a48a Merge pull request #515 from vampik/patch-1
Fix html attributes
2016-06-14 07:21:02 -04:00
b8eef181b9 Fix html attributes 2016-06-14 11:25:51 +03:00
fb94d6ae2b read header and payload separately 2016-06-13 13:20:21 -04:00
fa68e392c8 don't abort when ntcp fails to bind 2016-06-13 11:34:44 -04:00
9eaa51442f update comment 2016-06-13 09:01:38 -04:00
68482d712b Merge pull request #513 from majestrate/fix_http_proxy_500
fix 500 response in http proxy
2016-06-13 08:54:06 -04:00
09fc767bb0 fix another typo 2016-06-13 08:53:35 -04:00
ea7e6615f2 fix typo 2016-06-13 08:52:54 -04:00
a183ca8661 fix special case 2016-06-13 08:52:21 -04:00
05939a2bbc special case for i2p.rocks in proxy 2016-06-13 08:50:53 -04:00
543a372435 Merge branch 'fix_http_proxy_500' 2016-06-13 07:51:16 -04:00
e795de5562 fix 500 response in http proxy 2016-06-13 07:48:20 -04:00
ae6877ce2f handle incomplete message header 2016-06-12 08:22:55 -04:00
a0f3e81b11 Merge pull request #512 from D504/openssl
Remove unused assigning (success is assinged anyway)
2016-06-11 08:18:24 -04:00
88f52c4902 Remove unused assigning (success is assinged anyway) 2016-06-11 11:20:20 +03:00
bf8db7725f set -1 as default session id 2016-06-10 22:13:20 -04:00
f4d8c3304a execute lookup wothout session 2016-06-10 18:43:35 -04:00
44556b7f5e correct string size for mapping 2016-06-10 15:25:30 -04:00
2e1e95d483 pass URL params 2016-06-10 15:12:50 -04:00
ccc24337be Merge pull request #511 from PurpleI2P/openssl
recent changes
2016-06-10 14:46:23 -04:00
b15b38868d rolled back to previous implementation 2016-06-10 14:01:39 -04:00
8feca6874a process complete message 2016-06-10 12:18:19 -04:00
ecd3a49d48 handle DestroySession properly 2016-06-10 11:47:22 -04:00
6de7cd5063 don't send 'accepted' if not requested 2016-06-10 11:39:20 -04:00
f6d7f7d984 set port to 80 is not specified 2016-06-09 15:48:31 -04:00
d5d501875e send correct ackThrough 2016-06-09 14:56:12 -04:00
88561c22d3 make sure ackThrough is correct 2016-06-09 14:34:38 -04:00
b786576bcb * HTTPProxy.cpp : always set dest_port 2016-06-09 14:30:36 +00:00
21b5f2c96a fixed crash upon I2CP session disconnect 2016-06-08 14:14:19 -04:00
d8f24b442b fixed mapping 2016-06-08 14:05:20 -04:00
a1c81a63dd Merge remote-tracking branch 'purple/openssl'
Conflicts:
	I2CP.cpp
2016-06-08 10:37:51 -04:00
4d2b535b04 correct concatenation of long I2CP messages 2016-06-08 10:29:48 -04:00
3cfbc05bf9 set pointer to null after delete 2016-06-08 09:56:13 -04:00
895820f14c Merge branch 'upstream-openssl' 2016-06-08 09:55:55 -04:00
37fc21f3cf always assume 20 bytes for signing private key 2016-06-08 09:33:25 -04:00
5e068c3af5 0.9.26 2016-06-07 13:05:44 -04:00
e2c192d254 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-06-06 15:37:10 -04:00
e481ed37ce ReconfigureSessionMessage 2016-06-06 15:36:02 -04:00
4d7c089b09 I2CP config 2016-06-05 10:31:55 -04:00
a4dc67cba0 * HTTP.{cpp,h} : drop HTTPReq.host 2016-06-04 14:44:26 +00:00
03973cc6d4 * HTTPProxy.cpp : drop X-Forwarded-*, Proxy-*, Via headers from request 2016-06-04 14:01:37 +00:00
66c301c031 * HTTPProxy.cpp : allow "tranparent" proxy (#508) 2016-06-04 13:07:39 +00:00
e4edc59689 * HTTPProxy.cpp : force clean recv buffer (#508) 2016-06-04 13:07:37 +00:00
f2d9d38c6f Merge remote-tracking branch 'purple/openssl' 2016-06-03 14:07:02 -04:00
667ea43b3c GetBandwidthLimitMessage 2016-06-03 13:48:21 -04:00
f3856819fe Merge remote-tracking branch 'purple/openssl' 2016-06-03 13:01:49 -04:00
d6bfe7810a skip SigningPrivateKey 2016-06-03 13:01:12 -04:00
7a52ae18f1 Merge remote-tracking branch 'purple/openssl' 2016-06-03 12:13:08 -04:00
444539b826 SendMessageExpires 2016-06-03 12:03:36 -04:00
c8d6425123 DestLookupMessage 2016-06-03 11:49:39 -04:00
e50c35d38c * fix mistype 2016-06-03 01:16:29 +00:00
aa764fbd1c * HTTPProxy: fix converted request (#508)
* I2PService: reword log message, to avoid ambiguity
2016-06-03 01:09:08 +00:00
2628426084 * http proxy : fix converted request (#508) 2016-06-03 00:05:38 +00:00
aa6bc8042a address lookup 2016-06-02 15:49:14 -04:00
26a6c9e932 procee session options 2016-06-02 13:26:41 -04:00
0f9376e959 Merge remote-tracking branch 'purple/openssl' 2016-06-02 07:53:10 -04:00
ace3e86546 MessageStatusMessage 2016-06-01 15:30:57 -04:00
d79c6b8f06 MessagePayloadMessage 2016-06-01 14:38:13 -04:00
6538a2e673 HostLookupMessage 2016-06-01 11:11:18 -04:00
153d883aeb SessionDestoryedMessage 2016-06-01 10:05:40 -04:00
689432f627 fixed typo 2016-05-31 21:37:32 -04:00
cd237219e4 * extract unused image to separate file 2016-06-01 00:14:46 +00:00
8589493581 * add test for MergeChunkedResponse() (#432) 2016-06-01 00:14:40 +00:00
ca2e148ad7 * enable -Wextra for linux builds 2016-06-01 00:14:34 +00:00
f7ca44cad8 * fix compile warnings: reopen() usage 2016-06-01 00:14:28 +00:00
1b2ac38a50 * fix compilation warnings 2016-06-01 00:14:15 +00:00
f62d25fa5f * Config.cpp : fix wrong group for options & code style 2016-06-01 00:09:04 +00:00
025eec1782 I2CP configuration 2016-05-31 11:54:45 -04:00
846ff46b2e fixed build error 2016-05-30 21:42:25 -04:00
f9718bccb9 * update debian changelog (closes #502) 2016-05-31 00:34:33 +00:00
f66f4ffee6 * add generic changelog (#502) 2016-05-31 00:34:31 +00:00
a47417ff49 * I2PService.cpp: tune logs 2016-05-31 00:34:29 +00:00
c9836cf0f7 * fix doxygen warnings 2016-05-31 00:34:26 +00:00
289b679e3c * add doxygen support 2016-05-31 00:34:24 +00:00
23e019ec83 * debian/i2pd.openrc (working version) 2016-05-31 00:34:14 +00:00
eeffcea69e CreateSessionMessage 2016-05-30 15:19:22 -04:00
ae10793d0f SendMessageMessage 2016-05-30 14:31:56 -04:00
a062bca431 CreateLeaseSetMessage 2016-05-30 12:56:42 -04:00
6a453bcc8a check for null pointer 2016-05-30 12:08:20 -04:00
5a2c4919c6 close previous file first upon repon 2016-05-30 09:41:45 -04:00
09a80ed654 RequestVariableLeaseSetMessage 2016-05-29 16:35:57 -04:00
72e954b78f Merge remote-tracking branch 'purple/openssl' 2016-05-29 09:39:23 -04:00
a1c27aed6a Merge remote-tracking branch 'purple/master' 2016-05-29 09:36:34 -04:00
0b3a719a95 Merge branch 'master' of github.com:majestrate/i2pd
Fixed Conflicts:
	SAM.cpp
2016-05-29 09:36:01 -04:00
6c9b4a8c5d moved LeaseSet creating away from LeaseSetDestination 2016-05-29 09:33:50 -04:00
d9babda1b8 + debian/i2pd.openrc (experimental) 2016-05-29 01:31:38 +00:00
ea8e1be294 * update default init-script : make --port optional 2016-05-29 01:31:36 +00:00
44eccd85fd * HTTPServer.cpp :
* autorefresh for status page
  * autoreturn to commands list
2016-05-28 01:49:37 +00:00
a62720b9d8 Merge branch 'new-proxy' into openssl 2016-05-28 00:22:49 +00:00
1a9422c3f9 send SetDateMessage 2016-05-27 16:22:42 -04:00
5e52b3609c Merge pull request #503 from PurpleI2P/openssl
recent changes
2016-05-27 14:31:03 -04:00
8622385e88 I2CPDestination added 2016-05-27 13:46:28 -04:00
d0ffaab339 * HTTPProxy:
* use new http classes instead homemade parser
  * proper error handling for "address not found", "addresshelper" and "not .i2p domain" cases
  * use std::vector instead uint8_t[] for buffers
  * general code cleanup
2016-05-27 01:32:58 +00:00
347157b999 * HTTPProxy.cpp : direct use of parsed url parts in CreateHTTPRequest() 2016-05-27 01:32:15 +00:00
a9f3235fd3 * HTTPProxy.cpp : unwrap HandleStreamRequestComplete() 2016-05-27 01:32:12 +00:00
4098a5c08e * HTTPProxy.cpp : rename variable 2016-05-27 01:32:10 +00:00
dba7a2ee4f * HTTPProxy.cpp : HandleJumpServices() -> ExtractAddressHelper() 2016-05-27 01:32:07 +00:00
a5f49550b3 * HTTPProxy.cpp : unwrap AsyncSockRead() 2016-05-27 01:32:05 +00:00
5c9a69e0e8 * drop boost_regex from build deps 2016-05-27 01:32:03 +00:00
2bf32fb3fa * HTTPProxy.cpp : kill ExtractRequest(), drop boost::regex 2016-05-27 01:32:01 +00:00
0de1e2c6fc * HTTPProxy.cpp : extract IsI2PAddress() from class and generalize 2016-05-27 01:31:57 +00:00
61868d97c4 * HTTPProxy.cpp : migrate HTTPRequestFailed(), RedirectToJumpService() to new http classes 2016-05-27 01:31:55 +00:00
c994c11d8c * HTTPProxy.{cpp,h} : rename classes, drop typedef 2016-05-27 01:31:51 +00:00
5ad10955be use m_Response field for HTTP proxy response 2016-05-26 16:27:53 -04:00
95f100f378 HTTP error message cleanup 2016-05-26 16:21:27 -04:00
3d6c93cd6b moved transient encryption keys to LeaseSetDestination 2016-05-26 15:53:32 -04:00
fc25da37c5 removed GetPrivateKeys from LocalDestination 2016-05-26 14:54:33 -04:00
896bb2187e * HTTPProxy.cpp : HTTPRequestFailed() now responds with error message 2016-05-26 00:17:25 +00:00
99398bf0da * HTTPProxy.{cpp,h} : move & sort headers 2016-05-26 00:17:23 +00:00
827a54435d * Tunnel.cpp : tune log messages 2016-05-26 00:17:20 +00:00
3c9459e489 * fix mistype in log message 2016-05-26 00:10:01 +00:00
9291f5c9c6 * I2PControl.cpp :
* unwrap big else {} block
  * smaller try {} block, only for json parsing & request handling
  * respond with valid error message on exception
2016-05-26 00:09:44 +00:00
0ab5f993c7 * I2PControl.cpp :
* use new http classes for parsing request
  * implement correct reading rest of json data if HTTP/Content-length is used
  * general cleanup
2016-05-26 00:09:25 +00:00
4f8db487e7 * I2PControl.{cpp,h} : add BuildErrorResponse() 2016-05-26 00:09:25 +00:00
0e1765e045 * I2PControl.cpp : SendResponse() third arg now std::string & 2016-05-26 00:09:25 +00:00
ebc411bbbd * I2PControl.cpp :
* use new http classes for building HTTP response
  * drop boost::lexical_cast & boost::local_time deps
2016-05-26 00:09:13 +00:00
a76d8f0f9f * HTTP.{cpp,h} : add add_header() variant with std::string 2016-05-26 00:08:04 +00:00
f245feb0b0 * HTTP.h : export MergeChunkedResponse() 2016-05-26 00:08:02 +00:00
43a90d7b98 * HTTP.cpp : fix parse_header_line (#501) 2016-05-26 00:08:00 +00:00
2e1a9a8df9 * HTTP.{cpp,h} : move length() method to base class 2016-05-26 00:07:57 +00:00
57bb0da1d6 correct LeaseSet message size 2016-05-25 18:47:16 -04:00
0d2df22074 fixed crash 2016-05-25 17:41:24 -04:00
c7173d5e1c use shared ClientDestination 2016-05-25 16:18:02 -04:00
789eb48698 removed deprecated constructor 2016-05-25 15:30:04 -04:00
e686fad546 rmoved deprecated constructor 2016-05-25 15:18:21 -04:00
4e4f9b6f8b use LocalLeaseSet for own LeaseSets 2016-05-25 15:10:28 -04:00
f2292fd618 LocalLeaseSet added 2016-05-25 14:17:34 -04:00
7035ead9e7 provide reply tunnel expcilitly for LeaseSet 2016-05-25 12:55:58 -04:00
f01f6e94d1 fix #500. check result of readline 2016-05-24 16:27:34 -04:00
f10064ce39 * HTTPServer.cpp : update response building 2016-05-24 12:40:24 +00:00
b68f06ca83 * update tests 2016-05-24 12:40:24 +00:00
2ce61402bb * HTTP.{cpp,h} * add 'body' member ot HTTPRes * change HTTPRes::to_string() to add 'Date', 'Content-Length' headers and body 2016-05-24 12:40:24 +00:00
70e9d85a75 * HTTP.cpp : add internal function gen_rfc1123_date() 2016-05-24 12:40:23 +00:00
a461f462d2 * HTTP.{cpp,h} : add HTTPMsg::{add,del}_header() helpers 2016-05-24 12:40:23 +00:00
50ff0d251a * HTTP.h : add base class HTTPMsg 2016-05-24 12:40:23 +00:00
f6103d3841 moved streaming and datagram destination from LeaseSetDestination to ClientDestination 2016-05-23 14:31:22 -04:00
cb68d19bed ClientDestination/LeaseSetDestination split 2016-05-23 10:33:01 -04:00
89d2505a7c * fix time in webconsole (#496) 2016-05-19 14:15:55 +00:00
9ddfc750e5 * update manpage: add --logfile description (#495) 2016-05-19 14:15:52 +00:00
3b80de1747 Merge pull request #494 from PurpleI2P/openssl
2.7.0
2016-05-18 09:23:55 -04:00
90ea714e48 version 2.7.0 2016-05-18 09:22:48 -04:00
f9e4182624 temporary disable 'reload config' item 2016-05-18 09:22:11 -04:00
0291cc2ef4 Merge pull request #493 from PurpleI2P/openssl
recent changes
2016-05-17 15:06:39 -04:00
caf2e469a6 remove mascot 2016-05-17 12:35:08 -04:00
45da2843ee Merge pull request #492 from weekendi2p/openssl
fix jumpservices uri
2016-05-16 20:10:51 -04:00
8353f928a1 fix jumpservices 2016-05-17 01:42:58 +02:00
9c1a6d042e Merge remote-tracking branch 'purple/openssl' 2016-05-16 16:04:48 -04:00
448b25a8b2 receive I2CP messages 2016-05-13 15:13:36 -04:00
4c2d4009da handle protocol byte 2016-05-12 16:17:10 -04:00
67f1e07508 I2CP added 2016-05-12 15:37:46 -04:00
c49fdf1233 initial commit for reload config command 2016-05-12 11:38:18 -04:00
7c835bae20 changed back to <openssl/ 2016-05-11 16:02:26 -04:00
ae81cc2644 windows doesn't support graceful shutdown yet 2016-05-11 15:33:53 -04:00
3907b4101a include openssl through OPENSSL macro 2016-05-11 15:12:38 -04:00
aa5ea0e3a1 support gcc 6 2016-05-11 11:57:02 -04:00
d21043802e Merge branch 'upstream' 2016-05-11 10:02:49 -04:00
995bdb3f9e Merge pull request #490 from majestrate/pr-fix-http-unit-tests-osx
add missing header to unbreak build
2016-05-11 09:36:27 -04:00
8363b4fda7 add missing header 2016-05-11 09:33:25 -04:00
23979f4ce6 Merge pull request #489 from majestrate/pr-fix-http-unit-tests-osx
fix http unit test SIGBUS in os x
2016-05-11 09:06:29 -04:00
28b5f39b84 fix http unit test SIGBUS in os x 2016-05-11 08:42:50 -04:00
47ce2398a4 fix http unit test SIGBUS in os x 2016-05-11 08:41:32 -04:00
0a83d8e6a0 Merge branch 'openssl' 2016-05-11 08:19:51 -04:00
aa215f2a5a regular/homebrew build selection for Mac OS X 2016-05-11 07:08:02 -04:00
b03a6a5327 Merge branch 'new-webconsole' into openssl
+ new http/url classes
* extract most page/cmd handlers from HTTPConnection class
* general cleanup of HTTPServer.{cpp,h}
+ http basic auth for webconsole
+ gracefull/quick shutdown commands
- drop direct access for b32 addresses from webconsole: use proxy instead
2016-05-11 01:29:47 +00:00
ca36a6fe41 update our IP after signture verification 2016-05-10 15:55:48 -04:00
bd6285c8b1 Merge pull request #487 from majestrate/fix-mac-build
fix mac build
2016-05-09 20:28:25 -04:00
00cfdc7d92 fix mac brew, use libressl and homebrew 2016-05-04 12:12:24 -04:00
5e2dc14dd5 get family string from local RouterInfo 2016-04-28 18:16:11 -04:00
c5f2890cbe Merge pull request #484 from weekendi2p/openssl
Show family name in web interface
2016-04-28 17:30:56 -04:00
36aaca997a Merge pull request #1 from PurpleI2P/openssl
sync
2016-04-28 20:21:27 +00:00
e9f7c61113 Merge pull request #483 from majestrate/fix-issue-482
try fixing issue #482
2016-04-27 12:23:15 -04:00
2373b94d3e try fixing issue #482 2016-04-27 12:08:08 -04:00
f131e31949 * HTTPServer.cpp: add request logging 2016-04-27 00:39:34 +00:00
8fd55a210a * HTTPServer.cpp: add 'Shutdown' commands 2016-04-27 00:39:34 +00:00
678650beaf * HTTPServer.{cpp,h}: basic auth 2016-04-27 00:39:34 +00:00
e09386be44 * add http.auth, http.user & http.pass options 2016-04-27 00:39:34 +00:00
75db2867dc * HTTPServer.cpp: protect SAM pages if disabled 2016-04-27 00:39:34 +00:00
80e37df012 * HTTPServer.{cpp,h}: change page/cmd processing flow 2016-04-27 00:39:33 +00:00
1f404bb622 * HTTPServer.cpp: move html parts outside HTTPConnection class 2016-04-27 00:39:33 +00:00
54078087e5 * HTTPServer.cpp: move common code to function 2016-04-27 00:39:33 +00:00
23b8df1c36 * HTTPServer.cpp: move commands to separate page 2016-04-27 00:39:33 +00:00
65395516b0 * HTTPServer.cpp: drop separate function handlers for commands 2016-04-27 00:39:33 +00:00
849308e28d * HTTPServer.cpp: drop boost::date_time dep 2016-04-27 00:39:24 +00:00
4d98a64000 * HTTPServer.{cpp,h}: extract html-rendering methods from class 2016-04-27 00:39:24 +00:00
0c8fdfca7d * HTTPServer.{cpp,h}: merge HandleWriteReply & Terminate : the same purpose 2016-04-27 00:39:24 +00:00
fd928e8d12 * HTTPServer.h: not virtual: not inherited anywhere 2016-04-27 00:39:24 +00:00
2a1fe99a29 * HTTPServer.{cpp,h}: drop rest of streaming support 2016-04-27 00:39:24 +00:00
4fa4ba6301 * HTTPServer.cpp: move known jump services to std::map 2016-04-27 00:39:24 +00:00
48b3959cfb * HTTPServer.{cpp,h}: cleanup 2016-04-27 00:39:24 +00:00
9bbff744e9 * HTTPServer.{cpp,h}: chg HandleRequest() signature 2016-04-27 00:39:24 +00:00
19b0c266f9 * HTTPServer.{cpp,h}: * extract css-styles to separate block * split /?page= from /?cmd= requests * cleaner html-template 2016-04-27 00:39:24 +00:00
fead940d10 * HTTPServer.{cpp,h}: * move query parsing code to one place * use /?cmd=X instead /?X * unified handler signatures 2016-04-27 00:39:24 +00:00
687e17ac52 * HTTPServer.{cpp,h}: throw away direct quering b32 addresses: use proxy 2016-04-27 00:39:12 +00:00
b1c85dcb74 * HTTPServer.{cpp,h}: throw away request/reply/url, use new impl 2016-04-27 00:39:12 +00:00
a15aad9f9c * unit-tests 2016-04-27 00:39:12 +00:00
06a1a8690d * add HTTP.{cpp,h} to build 2016-04-27 00:39:12 +00:00
42b9b6426a + new http req/res/url structs 2016-04-27 00:39:12 +00:00
332f0118a2 * rename namespace for http 2016-04-27 00:39:12 +00:00
6ed709d6e6 * HTTPServer.{cpp,h}: extract itoopie{Image,Favicon} from HTTPConnection (!) class 2016-04-27 00:39:12 +00:00
7a461c1684 * HTTPServer.{cpp,h}: move #include to one place 2016-04-27 00:39:12 +00:00
7cf171671d * HTTPConnection::reply : to_buffers() -> to_string() 2016-04-27 00:39:12 +00:00
ebee94fb11 removed 1 blank line.. 2016-04-27 01:19:27 +02:00
61e8becd38 wrong file version 2016-04-27 00:48:23 +02:00
a78caa2976 added SetFamilyString(); GetFamilyString() and shows family in webiface 2016-04-27 00:31:33 +02:00
c54f7c81c4 Merge pull request #480 from weekendi2p/openssl
new family: volatile
2016-04-26 13:06:58 -04:00
85840872ab family: volatile.crt 2016-04-26 19:39:10 +02:00
d582c30f6e allow same port at different interfaces 2016-04-24 17:32:24 -04:00
392f5f914a Merge remote-tracking branch 'purple/openssl' 2016-04-23 08:38:34 -04:00
799d25925a Merge pull request #478 from PurpleI2P/openssl
recent changes
2016-04-22 12:49:42 -04:00
4431d50635 limits.transittunnels 2016-04-20 15:02:11 -04:00
e120e9a78e configurable transit tunnels limit 2016-04-20 14:53:50 -04:00
b6e379d14e Merge pull request #475 from weekendi2p/openssl
added limits.transittunnels
2016-04-20 13:32:17 -04:00
9a86034162 limits options 2016-04-20 19:24:50 +02:00
8456c8b47b limits options 2016-04-20 19:22:04 +02:00
bb656ce44b added some limits options 2016-04-20 19:12:14 +02:00
3c2a3898e1 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-04-18 21:08:26 -04:00
c265bd6c4d delete pre-calculated tablle upon termination 2016-04-18 21:07:45 -04:00
aff65083cc precomputation.elgamal 2016-04-17 17:03:56 -04:00
aff8cd478c optional elgamal precomputation for x64 2016-04-17 16:57:58 -04:00
bce2a63772 rollback some changes 2016-04-14 14:05:25 -04:00
3f9d2601b4 + HTTPConnection::SendError() 2016-04-14 00:34:15 +00:00
04bfd52fba * HTTPConnection::SendReply() : cleaner code 2016-04-14 00:34:14 +00:00
87dd890eb0 * HTTPConnection::reply : to_buffers() -> to_string() 2016-04-14 00:34:13 +00:00
a5c0b48b57 * HandleDestinationRequestTimeout() : readable code 2016-04-14 00:34:11 +00:00
5d38693b4d * HTTPServer : fold namespace to two constants 2016-04-14 00:34:10 +00:00
a4773d259d * use std::to_string() instead boost's function 2016-04-14 00:34:08 +00:00
f9b6b1bf76 Merge pull request #473 from PurpleI2P/openssl
precalculate elgamal
2016-04-13 15:10:55 -04:00
ef106f3232 fixed typo 2016-04-13 11:22:08 -04:00
c0b0df34d2 clean montgomery context 2016-04-12 19:07:11 -04:00
d15cc7cc47 changed tray icon back to ictoopie 2016-04-11 12:39:32 -04:00
6336d38a3e Removed downloads. Added Docimentation 2016-04-11 12:04:15 -04:00
6a9d2ba653 use precalculated table for DH 2016-04-10 21:16:18 -04:00
34a8d4a57d use precalculated table for ElGamal encryption 2016-04-10 17:06:02 -04:00
ffc666eaaa g^x mod p using precalculated table 2016-04-09 22:44:13 -04:00
c45aab7cef precalculate g^x mod p table 2016-04-08 15:45:23 -04:00
eefff148e9 Merge pull request #470 from PurpleI2P/openssl
recent changes
2016-04-08 09:41:46 -04:00
05f7578928 Merge remote-tracking branch 'purple/openssl' 2016-04-08 09:39:09 -04:00
2ebb2d8f0e fixed race condition 2016-04-06 21:02:58 -04:00
afe2935c9d webconsole update 2016-04-06 16:33:23 -04:00
380c7b7720 use 226 bits private keys for non-x64 2016-04-06 16:11:18 -04:00
8657226594 use 226 bits private keys for non-x64 2016-04-06 15:49:46 -04:00
41da48f5ff Merge pull request #468 from PurpleI2P/openssl
recent changes
2016-04-06 12:27:15 -04:00
405aa906c5 short exponent for non-x64 2016-04-05 13:18:25 -04:00
1c507a47d2 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-04-05 10:22:35 -04:00
f48a7df80f recreate router.info if missing or malformed 2016-04-05 10:22:32 -04:00
5f73f09836 * RouterInfo::SaveToFile() now returns bool 2016-04-05 11:37:39 +00:00
f63dd75f08 * set bw limits thru i2pcontrol (#461) (experimental) 2016-04-05 11:37:25 +00:00
cc55335a8d * docs/configuration.md 2016-04-05 11:08:07 +00:00
b5875f3a0a * update year in copyrights 2016-04-05 11:08:05 +00:00
cb8333a48f * update manpage 2016-04-05 11:08:02 +00:00
f412f4ca88 * use commented i2pd.conf as default 2016-04-05 11:08:00 +00:00
941f30d1ea show streams from all streaming destinations 2016-04-04 22:17:04 -04:00
97afa502c5 shard_ptr for SAMSession 2016-04-02 22:16:49 -04:00
9ae9ea18e1 Merge remote-tracking branch 'purple/openssl' 2016-04-02 10:13:53 -04:00
0bf2abaa4c fixed race condition at startup 2016-04-02 08:57:35 -04:00
924f281536 * Don't set m_Session to nullptr in SAMSocket::Terminate
* check for null localDestination in SAMSocket::Terminate
2016-04-02 08:05:14 -04:00
1fc5dacd87 Merge pull request #464 from majestrate/master
Add locking to SAM
2016-04-01 12:56:30 -04:00
5c877de2c2 check if hosts is incomplete 2016-04-01 12:51:34 -04:00
751b95d4af add locking to SAM when adding/removing sockets 2016-04-01 11:36:56 -04:00
e0d5ba9915 Merge tag 'tags/2.6.0' 2016-04-01 10:57:22 -04:00
b8a6946661 Merge pull request #462 from PurpleI2P/openssl
2.6.0
2016-03-31 10:34:08 -04:00
e5fac08d1d release 2.6.0 2016-03-31 09:12:21 -04:00
df5b7c7d0d specify bandwidth for floodfill 2016-03-30 21:31:17 -04:00
27649f7d4c * update docs 2016-03-31 00:18:54 +00:00
350dea6228 * update --bandwidth option handling 2016-03-31 00:18:52 +00:00
aef6b7712c * Transports: update IsBandwidthExceeded() and comments in header 2016-03-31 00:18:49 +00:00
642bcfcdea * RouterContext : replace Set(Low|High|Extra)Bandwidth with SetBandwidth() 2016-03-31 00:18:46 +00:00
e625d8aabc * RouterInfo.cpp : remove .c_str() 2016-03-31 00:18:44 +00:00
5888ecbdcd * RouterInfo::UpdateCapsProperty() : add only one bw letter 2016-03-31 00:18:42 +00:00
e2a76056b8 * RouterInfo.h : add comments with bandwidth letter speed in KBps 2016-03-31 00:18:40 +00:00
a98498eb06 Merge remote-tracking branch 'purple/openssl' 2016-03-30 07:17:03 -04:00
8366c8d2a7 don't initiate graceful shutdown twice 2016-03-29 21:37:30 -04:00
ed8d441a02 Merge pull request #459 from PurpleI2P/add_exceptions
Adding exceptions on clients
2016-03-30 00:08:52 +02:00
f1fb265119 Adding exceptions for SOCKS, SAM and BOB proxy/briges 2016-03-30 00:03:15 +02:00
6c628094ce Adding exception handler on HTTP Proxy 2016-03-29 23:55:29 +02:00
a60c52e2f0 Merge pull request #454 from PurpleI2P/Travis_fixes
Adding working Travis build config for Linux Clang + OS X Clang / GCC
2016-03-29 19:25:23 +02:00
ac2e1709f8 graceful shutdown by SIGINT 2016-03-29 12:50:34 -04:00
db88183a23 graceful shutdown by SIGINT 2016-03-29 12:34:53 -04:00
c7d55ad858 Trying to fix broken builds on 10.7. Works fine on local 10.11 2016-03-29 16:01:07 +02:00
06a4e6c323 OSX worker already got boost and cmake installed 2016-03-29 15:30:06 +02:00
d1de89f387 Merge pull request #455 from PurpleI2P/openssl
recent changes
2016-03-29 09:20:54 -04:00
bbba01da92 OSX travis update (Test) 2016-03-29 15:09:40 +02:00
25dbf62274 Merge pull request #453 from manasb/openssl
update mca2-i2p.crt for correct CN
2016-03-28 18:17:02 -04:00
ed6851863b update mca2-i2p.crt 2016-03-28 18:08:11 -04:00
ba924e295e Merge pull request #452 from manasb/openssl
Rename i2p.crt to mca2-i2p.crt
2016-03-28 17:56:39 -04:00
0828065a62 Rename i2p.crt to mca2-i2p.crt 2016-03-28 17:51:24 -04:00
68c789dceb Merge pull request #451 from majestrate/master
fix failed build on freebsd 10.1
2016-03-28 17:36:25 -04:00
6424084502 Merge pull request #450 from manasb/openssl
i2p family cert file
2016-03-28 17:35:44 -04:00
4abea18afe Merge remote-tracking branch 'purple/openssl' 2016-03-28 17:16:05 -04:00
0a3c4f131e fix issue #449 failed build of freebsd 10.1 2016-03-28 17:15:27 -04:00
f5e1077e20 i2p family cert file 2016-03-28 17:05:39 -04:00
44d1c3fd2f Merge pull request #448 from xcps/openssl
default subscription address to inr, jump services b32
2016-03-28 14:42:21 -04:00
e345161763 default subscription address to inr, jump services b32 2016-03-28 14:33:55 -04:00
64d7c87591 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd 2016-03-28 12:26:09 -04:00
1fae3baaa3 * logger: print also thread id 2016-03-28 14:44:56 +00:00
38103aaac5 * logger: explicit allow log output 2016-03-28 14:44:54 +00:00
cc25b22f11 * update docs 2016-03-28 11:36:07 +00:00
e6dbeda18e * rename tunnels.conf -> tunnels.conf, add detection of old config 2016-03-28 11:36:05 +00:00
8437d45866 * rename i2p.conf -> i2pd.conf, add detection of old config 2016-03-28 11:35:49 +00:00
0bb89de821 Merge branch 'logs-refactoring' into openssl 2016-03-28 11:33:58 +00:00
905cad56d8 * add note 2016-03-28 06:02:56 +00:00
65eeb70eb3 Merge pull request #444 from i2phttp/openssl
Renamed i2pd.conf->i2p.conf with some fixes
2016-03-27 22:54:23 -04:00
266744f640 fixe memory leak 2016-03-27 12:06:00 -04:00
23d6739580 Renamed i2pd.conf->i2p.conf with some fixes 2016-03-27 16:27:36 +03:00
5c9970c786 delete packet if not saved 2016-03-27 09:16:30 -04:00
3eae716a2d * drop MsgQueue wrapper : not used anymore 2016-03-27 00:17:34 +00:00
c57b13d922 * migration 2016-03-27 00:17:29 +00:00
17fb419fb1 * new logs: code 2016-03-27 00:15:50 +00:00
598d0e216a * fix build requrements 2016-03-27 00:05:47 +00:00
7bbe926232 * use freopen() instead close()/open() : avoid potential fd leak 2016-03-27 00:05:47 +00:00
2e848a7c9a * chg default branch for 'dist' target 2016-03-27 00:05:47 +00:00
437225b43e * convert makefiles back to unix linefeeds 2016-03-27 00:05:47 +00:00
d39229713f lookup address upon request 2016-03-26 15:02:27 -04:00
93911be1b9 Merge pull request #441 from xcps/openssl
Sent/received traffic amount humanize
2016-03-26 10:34:53 -04:00
b74055478c Merge pull request #440 from majestrate/master
add syslog option for logging
2016-03-26 10:34:26 -04:00
8614c4db73 Sent/received traffic amount humanize 2016-03-26 10:32:19 -04:00
215d39fc54 address lookup 2016-03-26 10:31:47 -04:00
c4e5a130ee don't break win32 2016-03-26 09:49:45 -04:00
630072b574 Merge remote-tracking branch 'purple/openssl' 2016-03-26 09:41:31 -04:00
5261a3e845 add syslog logging option 2016-03-26 09:40:19 -04:00
0096a91a57 Merge pull request #439 from xcps/check_if_i2p_address
check if i2p address before call jump service
2016-03-26 02:48:17 -04:00
56699a9f89 check if i2p address to call jump service 2016-03-26 02:45:37 -04:00
31ff1372ae Merge pull request #438 from PurpleI2P/openssl
transort resolvers
2016-03-25 21:47:24 -04:00
3afb1922bb Update family.md 2016-03-25 16:04:44 -04:00
83c0a8b047 Merge pull request #437 from 0niichan/patch-8
Fixed b64 textarea in the webconsole
2016-03-25 11:53:22 -04:00
6699bd47b5 Fixed b64 textarea in the webconsole 2016-03-25 22:48:58 +07:00
34223b8d4f select appropritae address 2016-03-24 20:14:58 -04:00
5befe1f019 select appropritae address 2016-03-24 20:04:45 -04:00
87f86e72f4 Merge pull request #436 from majestrate/master
add option for toggling ipv4
2016-03-24 19:56:29 -04:00
53b7eba31a Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2016-03-24 18:46:09 -04:00
12c12a8ad1 add no ipv4 option in config 2016-03-24 18:44:41 -04:00
897cc7d355 Merge remote-tracking branch 'purple/openssl' 2016-03-24 18:40:15 -04:00
2e5c56205c address resolver 2016-03-24 14:48:07 -04:00
bc5ff37e37 check for chunk size 2016-03-24 11:18:11 -04:00
20341a381f show version in the 'About' window 2016-03-24 11:05:47 -04:00
926b945846 * UPnP.h : comments 2016-03-24 10:32:20 +00:00
aa877a73ba * fix mistype 2016-03-24 10:32:18 +00:00
b28208d1bf 0.9.25 2016-03-23 19:03:17 -04:00
9bd97383bd don't connect to ipv6 address if not supported 2016-03-23 16:04:42 -04:00
522c7b2f9d Merge pull request #433 from 0niichan/patch-7
Fix height and width of the main window
2016-03-22 15:43:53 -04:00
1833c0acbc Fix height and width of the main window 2016-03-23 02:37:22 +07:00
c5644ee3f9 hold previous lookup response 2016-03-22 13:10:02 -04:00
447566fe14 gcc 4.8 2016-03-22 09:50:24 -04:00
9692c34f6c don't insert same address twice 2016-03-22 07:30:16 -04:00
37c450f1e1 fixed race condition 2016-03-21 15:13:07 -04:00
a003e396c5 fixed UPnP build 2016-03-21 13:45:35 -04:00
996f61efe1 use shared_ptr for Address 2016-03-21 13:02:51 -04:00
40cdcf8b06 Merge pull request #431 from PurpleI2P/openssl
recent changes
2016-03-21 10:54:02 -04:00
5947364846 updated reseeds list 2016-03-21 09:02:44 -04:00
9470107bba show mascot image 2016-03-20 18:34:29 -04:00
54b945511b Merge pull request #428 from 0niichan/0niichan-Fixed-Anke.ico
Fixed anke.ico
2016-03-20 17:02:52 -04:00
acfaa0041e fixed anke.ico 2016-03-20 17:01:20 -04:00
aeed2dbc3e Fixed anke.ico 2016-03-21 03:36:17 +07:00
0c6befe8a5 fixed build 2016-03-20 16:00:29 -04:00
bdcb26edae mascot bitmap added to resources 2016-03-20 14:58:35 -04:00
e091667b42 Merge pull request #426 from 0niichan/"Anke"-by-MilkHater,-the-I2Pd-mascot-1
"Anke" by MilkHater, the I2Pd mascot
2016-03-20 14:42:45 -04:00
d35b14f4cc "Anke" by MilkHater, the I2Pd mascot
700px .bmp and 2200px .jpg
2016-03-20 23:00:20 +07:00
87996c6811 Merge pull request #425 from 0niichan/"Anke"-by-MilkHater,-the-I2Pd-mascot
"Anke" by MilkHater, the I2Pd mascot
2016-03-20 09:52:27 -04:00
a880c733c8 "Anke" by MilkHater, the I2Pd mascot 2016-03-20 20:47:09 +07:00
ca10dfeb5f Merge pull request #424 from 0niichan/New-.ico-by-MilkHater
New .ico by MilkHater
2016-03-20 09:10:40 -04:00
91f55a637b New .ico by MilkHater 2016-03-20 20:02:04 +07:00
8ae43cfd14 Merge pull request #421 from l-n-s/openssl
Added example configuration file
2016-03-19 19:18:45 -04:00
83d9513c4a Added example configuration file 2016-03-20 01:39:35 +03:00
1c76d43e44 mention true/false values for bool params 2016-03-19 08:17:30 -04:00
1036ce0fa5 create addressbook before etags 2016-03-19 08:07:09 -04:00
3dbab68f17 don't send own RouterInfo twice 2016-03-18 22:53:03 -04:00
5896cebeaa list 'enabled' options 2016-03-18 13:35:33 -04:00
fbe629154d Merge pull request #418 from xcps/connection_strip
strip connection http header
2016-03-18 11:09:15 -04:00
364136213b extra space 2016-03-18 10:06:53 -04:00
136b663cef strip connection http header 2016-03-18 10:00:10 -04:00
803f11bebb local addresses 2016-03-16 15:40:29 -04:00
7c8036807a Cross compiling notes for Win32 target 2016-03-15 19:04:57 -05:00
84ccca0e98 read persistent ETags 2016-03-15 14:37:07 -04:00
74efdb95e8 persist etag 2016-03-14 22:00:05 -04:00
10e45ac493 Merge pull request #414 from mlt/fix413
Fix VS2013 build and close #413
2016-03-14 18:19:37 -04:00
60befdb36e VS2013 snprintf compatibility 2016-03-14 15:18:51 -05:00
59f99ea9bb Ask to minimize on Win32app close
This closes #413
2016-03-14 15:15:13 -05:00
1a894abcff persist etag for addressbook subscription 2016-03-14 16:05:57 -04:00
4934fc8809 fixed typo 2016-03-14 13:33:51 -04:00
18cc6a184f Merge pull request #412 from PurpleI2P/openssl
recent changes
2016-03-14 11:52:43 -04:00
0a08765d73 Win32: hide to tray, webconsole menu item
Standard icon works for me on Windows 8
2016-03-14 02:35:15 -05:00
355c7437ed supoort win32 console application 2016-03-11 22:24:23 -05:00
3c55c2d777 fixed race condition at startup 2016-03-11 19:27:43 -05:00
94806ad0b3 try subscriptions right after initial download 2016-03-11 16:29:49 -05:00
6840259734 Merge pull request #410 from xcps/jumpservice
jump services
2016-03-11 07:05:25 -05:00
a1fc48f2a6 Update HTTPServer.cpp 2016-03-11 16:16:11 +05:00
400e3d21f9 jump services 2016-03-11 15:30:50 +05:00
8f3daad502 Sane TTL for UPnP API>=14 and remove old miniupnpc support 2016-03-11 02:37:04 -06:00
b0395933de * Addressbook: fix module name 2016-03-11 00:46:58 +00:00
f8f2ab9cba fixed windows build 2016-03-10 19:34:32 -05:00
ae5f5375da Merge pull request #406 from mlt/msvc
Compatibility fixes for 64 bit MSVC build
2016-03-10 18:07:54 -05:00
ab5f1e712b AppVeyor msys fix attempt 2016-03-10 14:40:35 -06:00
4532ca97fa caffeine insomnia for win32 2016-03-10 14:20:46 -06:00
5a9ef57f78 Make mingw via cmake happy with _WIN32 in FS.CPP 2016-03-10 14:20:45 -06:00
8791f382b3 Make a deep copy of our addresses for UPnP
Somehow "Expression: vector iterators incompatible" gets thrown especially on fresh start
TODO: figure out details
2016-03-10 14:20:45 -06:00
abdef67ccc _WIN32_WINNT drove nuts 64 bit MSVC builds
TODO: figure out why
2016-03-10 14:20:44 -06:00
33494c4f4b Catch up for miniupnpc API 15 2016-03-10 14:20:43 -06:00
daad975f5d fixup! invoke win32app functions from main 2016-03-10 14:20:43 -06:00
18c00f0a4b Avoid debug symbol files (PDB) collision with MSVC 2016-03-10 14:20:41 -06:00
e7f46b4fbe Create missing directories on the way 2016-03-10 14:20:40 -06:00
74827cd8cf Workaround c++11 dynamic array for MSVC 2016-03-10 14:20:40 -06:00
5ffe1893cd reduce windows binary size 2016-03-10 14:46:45 -05:00
f24618e8df Merge pull request #409 from PurpleI2P/openssl
recent changes
2016-03-10 13:37:59 -05:00
0e5b32ef13 2.5.1 2016-03-10 13:34:16 -05:00
0493a321d2 oveeride --log for windows 2016-03-10 12:23:17 -05:00
38b6c12153 fixed bug with missed data directory 2016-03-10 12:05:28 -05:00
74d4b8e0b9 invoke win32app functions from main 2016-03-09 14:41:14 -05:00
f843d34234 Merge pull request #407 from PurpleI2P/openssl
recent changes
2016-03-09 13:41:55 -05:00
95b2bf3645 fixed windows build 2016-03-09 09:38:19 -05:00
121ac4f1de * move mingw-specific rules to Makefile.mingw 2016-03-09 13:36:39 +00:00
ec8550d587 use ictoopie_16 in tray 2016-03-08 21:18:48 -05:00
e403c419e5 16x16 icon added 2016-03-08 17:40:43 -05:00
4b0d587fe1 Daemon::run 2016-03-08 15:02:32 -05:00
ebd356c7bd set correct icons 2016-03-08 11:24:29 -05:00
507093dbad compile with resources 2016-03-07 21:36:11 -05:00
4cfdc77015 invoke daemon 2016-03-07 16:17:06 -05:00
9096cacba8 tray icon added 2016-03-07 16:06:34 -05:00
607336d3ce tray icon added 2016-03-07 15:57:32 -05:00
6383fc3575 initial commit of Win32App 2016-03-07 14:54:57 -05:00
a5576ddbf3 don't acquire DH keys pair until connection is established 2016-03-06 09:57:38 -05:00
e2a70873b8 fixed garbage in console for windows 2016-03-05 21:46:01 -05:00
23c7340afe Merge pull request #404 from PurpleI2P/openssl
2.5.0
2016-03-04 21:35:41 -05:00
380b56a89d 2.5.0 2016-03-04 21:34:23 -05:00
8e09f3478f fixed warnings 2016-03-04 20:35:53 -05:00
c1ce51eb12 Merge pull request #403 from xcps/webirc2
variable name
2016-03-04 09:53:52 -05:00
9aeb773169 variable name 2016-03-04 19:26:28 +05:00
091c13ff41 Merge pull request #402 from xcps/webirc2
WebIRC support
2016-03-04 07:05:37 -05:00
ef0bab0c6e webirc support 2016-03-04 11:37:38 +05:00
70bd16adf6 set established state for zero-hops tunnles 2016-03-03 17:57:15 -05:00
96a713afeb zero-hops outbound tunnels 2016-03-03 16:24:13 -05:00
bf3615fb32 Merge pull request #401 from PurpleI2P/openssl
recent changes
2016-03-03 10:31:04 -05:00
0f56b1c943 show number of received bytes for zero-hops inbound tunnel 2016-03-03 07:30:38 -05:00
d541572882 enable zero-hops inbound tunnel 2016-03-02 22:41:53 -05:00
ecfdc377ec send close floodfills only in DatabaseSearchReply 2016-03-02 19:46:32 -05:00
fa67e90767 inbound zero-hops tunnel 2016-03-02 16:12:02 -05:00
81b72d5481 fixed crash on termination if proxies were excluded 2016-03-02 12:04:02 -05:00
ef6028e933 replace std::map to std::list for inbound tunnels 2016-03-02 11:58:52 -05:00
5d41fe4a35 Merge pull request #400 from majestrate/webui-add-tunnel-count
Add Transit/Client Tunnel Count to web ui
2016-03-02 10:13:51 -05:00
1dc6cec1aa add client/transit tunnel count in webui 2016-03-02 10:05:26 -05:00
9378668e52 add colin 2016-03-02 10:03:50 -05:00
eb96ead80e add tunnel counts to front page of web ui 2016-03-02 10:03:36 -05:00
9403fbaf81 common tunnels' hash table 2016-03-01 20:48:56 -05:00
79190f313d use shared_ptr for transit tunnels 2016-03-01 15:22:36 -05:00
4c124284b6 Merge pull request #399 from PurpleI2P/openssl
irc tunnel and gzip
2016-03-01 13:39:26 -05:00
6d892179c8 added gzip parameter for server tunnels 2016-02-29 14:44:15 -05:00
61675c20d8 don't delete log file upon HUP 2016-02-29 11:02:55 -05:00
4aae878db8 increase LeaseSet expiration threshold 2016-02-28 21:43:18 -05:00
918884bd11 Merge pull request #398 from xcps/irc_ip2b32
irc tunnel
2016-02-28 16:19:19 -05:00
8799f9079b change part for replace 2016-02-29 02:15:29 +05:00
0b471cfd06 Merge pull request #397 from xcps/irc_ip2b32
Irc ip to b32
2016-02-28 14:14:11 -05:00
7b39a12396 ready 2016-02-28 22:32:34 +05:00
57a53b4b6c fixed I2PServerTunnelHTTP call 2016-02-28 21:13:01 +05:00
f6d0b3368f znx cert added 2016-02-28 09:56:17 -05:00
0fe7bdf849 init 2016-02-28 18:17:36 +05:00
a26dc39a6d ident fix 2016-02-28 18:17:35 +05:00
e45cfe7d0c init 2016-02-28 18:17:35 +05:00
efefa8caf5 Merge pull request #395 from PurpleI2P/openssl
socks outproxy
2016-02-27 16:16:15 -05:00
cc13db9b1f updated FreeBSD instructions 2016-02-27 15:44:36 -05:00
f339544256 Merge pull request #394 from majestrate/outproxy-socks
support for outproxy via local upstream socks proxy
2016-02-26 21:42:04 -05:00
1a05bcb295 initial support for out proxy via local upstream socks proxy 2016-02-26 17:06:11 -05:00
190e26276a reuse tunnel pair for LS request 2016-02-26 16:17:29 -05:00
bb33760e87 don't re-request twice 2016-02-26 16:16:59 -05:00
9e105b4983 Merge pull request #393 from PurpleI2P/openssl
recent changes
2016-02-26 15:13:31 -05:00
8dcf70408d hostoverride added 2016-02-25 20:32:05 -05:00
9d6d1825c7 pass flag to SSU header 2016-02-25 18:40:40 -05:00
1a4923cdce don't request relayTag if we are reachable 2016-02-25 15:57:58 -05:00
316e440390 Merge pull request #392 from PurpleI2P/openssl
recent changes
2016-02-25 13:51:03 -05:00
7d66019220 start checking for expiration after 10 minutes 2016-02-24 11:50:56 -05:00
f98a6fb665 tighten RouterInfo expiration 2016-02-24 11:31:14 -05:00
dbdc7279c4 Merge pull request #391 from PurpleI2P/openssl
new fs
2016-02-24 11:21:36 -05:00
7726705b5c process request relay tag extended SSU option 2016-02-23 12:16:53 -05:00
34b7e8815a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-02-23 11:17:14 -05:00
8ac2b58a44 Merge branch 'master' of https://github.com/PurpleI2P/i2pd into openssl 2016-02-23 11:17:01 -05:00
fe97f0929b delete expired floodfills thorugh a separate loop 2016-02-22 20:51:32 -05:00
6eec353c2b moved tunnel config file inialization to ClientContext 2016-02-22 15:27:40 -05:00
2b4c3b8d1f start up if i2p.conf is not presented 2016-02-22 15:17:58 -05:00
df99b37c4d Merge pull request #388 from l-n-s/openssl
added family documentation
2016-02-22 13:45:29 -05:00
ab6f3fcf8e added family documentation 2016-02-22 20:49:17 +03:00
ca6f656e1b ignore non-reachable floodfills 2016-02-22 10:27:43 -05:00
88798b1a9e fixed windows build 2016-02-22 09:53:26 -05:00
c197270125 Merge branch 'new-fs' into openssl
Conflicts:
	Family.cpp
2016-02-22 13:04:53 +00:00
dc344d4658 * add comment 2016-02-22 12:57:25 +00:00
b4864831e0 Merge pull request #387 from PurpleI2P/openssl
family
2016-02-21 20:29:49 -05:00
476dffff13 Create family.md 2016-02-21 15:26:14 -05:00
389ee974f3 family 2016-02-20 21:20:21 -05:00
0d15eceacb * Profiling : move storage from FS.cpp to Profiling.cpp 2016-02-21 01:49:35 +00:00
b69fbdda9a * NetDb : move storage from FS.cpp to NetDb.cpp 2016-02-21 01:49:32 +00:00
d3746e0119 * FS.h : add include guards 2016-02-21 01:49:29 +00:00
230af9cafa set router's family 2016-02-20 20:20:19 -05:00
4db63d113c i2pd-dev certificate updated 2016-02-20 09:22:09 -05:00
008583396d extract CN 2016-02-20 08:33:13 -05:00
33a33e3c71 * i2p::util::http::GetHttpContent() : use std::transform instead boost 2016-02-20 01:47:34 +00:00
d312d753e9 * Destination.cpp : fix lambda with 4.7 2016-02-20 01:47:32 +00:00
02310d4af6 * Family : use i2p::fs::ReadDir instead direct boost::filesystem call 2016-02-20 01:47:29 +00:00
0e6d8c4e25 i2pd-dev family certificate added 2016-02-19 20:09:48 -05:00
55315fca80 Merge branch 'openssl' into new-fs
Conflicts:
	AddressBook.cpp
	NetDb.cpp
	filelist.mk
2016-02-20 00:59:48 +00:00
4eef9e780f extract and verify family from RouterInfo 2016-02-19 16:37:41 -05:00
7bfc3562af extract EcDSA key from family certificate 2016-02-19 16:13:46 -05:00
5b0b0d6d36 Merge pull request #386 from PurpleI2P/openssl
recent changes
2016-02-19 13:18:36 -05:00
cb64072f7b fixed windows build 2016-02-19 11:18:01 -05:00
c5b6da7201 case-insensitive http responses 2016-02-19 10:04:52 -05:00
f1d4818045 Family.cpp added 2016-02-18 22:39:09 -05:00
76b49f6985 uncompress stream by chunks 2016-02-18 22:34:55 -05:00
094d9193b9 start addressbook first 2016-02-18 22:34:14 -05:00
3053a9b6a0 enable i2p gzip compression 2016-02-18 20:35:14 -05:00
47bf0ef591 free pkey after usage 2016-02-18 16:28:43 -05:00
e2aa2709ac family added 2016-02-18 15:57:43 -05:00
9a6d478eb1 handle compressed addressbook 2016-02-18 13:19:31 -05:00
4f37e7dc3c Merge pull request #383 from PurpleI2P/openssl
recent changes
2016-02-18 09:06:48 -05:00
2a4ba8d349 * Addressbook : move storage init code from constructor to Init() : was too early 2016-02-18 10:42:50 +00:00
85bd7a63c6 * AddressBook : embed HashedStorage instance into AddressBookFilesystemStorage class 2016-02-18 10:42:50 +00:00
138d57143a * FS.cpp : add const to accessors 2016-02-18 10:42:50 +00:00
464a228106 * FS.cpp : rename method 2016-02-18 10:42:50 +00:00
2b92a039bb * FS.h : more comments 2016-02-18 10:42:50 +00:00
f190ee951c * use characters sets from Base.cpp - remove ABook class 2016-02-18 10:42:50 +00:00
68cc75cada * Base.cpp : add T32 character set + accessor 2016-02-18 10:42:41 +00:00
b4e324ec0e flood to 3 closest floodfills 2016-02-17 21:24:21 -05:00
32fe2e7974 correct monotonic expiration time calculation 2016-02-17 19:36:07 -05:00
713513aacc flood newer RI/LS only 2016-02-17 15:36:55 -05:00
b4ffca56a3 update lease's expiration time continiously 2016-02-17 13:10:29 -05:00
f2168774a5 check leaseset timestamp 2016-02-16 22:57:38 -05:00
febc00d357 fixed race condition of DeliveryStatus message 2016-02-16 16:10:22 -05:00
01a8c507e5 Merge pull request #381 from PurpleI2P/openssl
recent changes
2016-02-16 16:01:12 -05:00
bf7982cc2e build with make added 2016-02-16 15:08:35 -05:00
2e9689886b build with make added 2016-02-16 15:07:56 -05:00
2003b34036 12 hours expiration if more than 2500 routers 2016-02-15 21:40:49 -05:00
e1995b5c70 try to download default hosts.txt until success 2016-02-15 18:20:01 -05:00
3890acabc4 Merge pull request #380 from PurpleI2P/openssl
fixed http issues
2016-02-15 16:22:15 -05:00
ba6c0d0423 fixed messy http pages 2016-02-15 15:16:53 -05:00
882e7a845e process remaining data from stream 2016-02-14 22:10:56 -05:00
ca56d3fc23 handle LeaseSet expiration correctly 2016-02-14 18:30:07 -05:00
49b1e76585 use rtt for ack timeout 2016-02-13 23:10:51 -05:00
80f81685d1 use rtt for ack timeout 2016-02-13 23:02:58 -05:00
21dead3125 increase lease expiration threshold 2016-02-13 17:56:42 -05:00
1521d08285 family cetificates added 2016-02-13 17:13:07 -05:00
59b2e31add ssl certificates updated 2016-02-13 17:10:54 -05:00
b5feb3fd66 update reseeds list 2016-02-13 17:03:25 -05:00
7785e6ebd2 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-02-12 20:56:46 -05:00
c561d71dc0 count lease expiration threshold 2016-02-12 20:56:29 -05:00
2cfb697867 strip our Referer and replace User-Agent 2016-02-12 15:42:13 -05:00
c680ff006e Merge pull request #378 from PurpleI2P/openssl
recent changes
2016-02-12 11:23:29 -05:00
333103f50e shared RTT 2016-02-11 22:18:44 -05:00
517385fb63 Lease enddate threshold 2016-02-11 22:18:24 -05:00
ee8ab58d64 don't reply to lookup with expired LeaseSet 2016-02-11 22:17:33 -05:00
b967acda58 flood to floodfills that are close than us only 2016-02-11 15:05:46 -05:00
d81ca5f919 local destination leaseset storage verification 2016-02-11 14:45:33 -05:00
07adf64aec Merge pull request #376 from PurpleI2P/openssl
recent changes
2016-02-11 14:37:11 -05:00
fbb98e1aec show actual name of an invalid parameter 2016-02-11 11:18:15 -05:00
2fdf927704 show actual name of an invalid parameter 2016-02-11 10:54:36 -05:00
4b84656133 * i2p::fs migration: drop unused code from util.* (#314) 2016-02-11 13:05:00 +00:00
97c136d043 * i2p::fs migration: Daemon, DaemonLinux, api (#290) 2016-02-11 13:05:00 +00:00
79bf44b3f5 * i2p::fs migration: ClientContext, Destination, HTTPServer, Reseed, RouterContext 2016-02-11 13:05:00 +00:00
ddd8d4aeb2 * i2p::fs migration: AddressBook.* 2016-02-11 13:05:00 +00:00
bfcb6f577f * i2p::fs migration: Profiling.* 2016-02-11 13:05:00 +00:00
2b137b43e6 * i2p::fs migration: I2PControl.* 2016-02-11 13:05:00 +00:00
6d74493491 * i2p::fs migration: NetDb.* 2016-02-11 13:05:00 +00:00
6f4271c054 * update buildsystems 2016-02-11 13:05:00 +00:00
f24054100e * new i2p::fs implementation 2016-02-11 13:05:00 +00:00
6e98649607 * I2PControl: send valid error response, instead closing connection 2016-02-11 13:00:56 +00:00
b2108ff2d0 * fix flags on std::ifstream 2016-02-11 13:00:56 +00:00
8949ebf041 * tune logging 2016-02-11 13:00:56 +00:00
576801cd32 * Addressbook: load addresses at start, not on first request 2016-02-11 13:00:56 +00:00
2f2b12811f * Addressbook: don't save to disk if address map is empty 2016-02-11 13:00:56 +00:00
d8ea3a9035 * make target 'strip' 2016-02-11 13:00:56 +00:00
45c3b3987b reset floodfill 2016-02-11 07:50:29 -05:00
93720fffd4 shared path between streams 2016-02-10 22:51:08 -05:00
61ad6a2b88 set supported transports flag after actual address insertion 2016-02-10 16:09:34 -05:00
c9d5b3c0ff Merge pull request #373 from PurpleI2P/openssl
recent changes
2016-02-10 10:51:21 -05:00
d51bf735c4 * fix mistype 2016-02-10 10:37:30 +00:00
22c388ab18 * fix compilation with gcc 4.7/4.8 2016-02-10 10:37:30 +00:00
d5f831301f * explicit log message when bandwidth set to 'low' 2016-02-10 10:37:30 +00:00
dcab37a148 * update debian/i2pd.{init,upstart} : logging options 2016-02-10 10:37:30 +00:00
60b2da3671 * add --datadir option (not actually works yet) (#290) 2016-02-10 10:37:30 +00:00
5c1b5816d4 * fix segfault when offline (#330) 2016-02-10 10:37:30 +00:00
7a0a45e9d2 * use IsDefault() to check explicitly set values 2016-02-10 10:37:30 +00:00
70f72a78f6 + i2p::config::IsDefault 2016-02-10 10:37:30 +00:00
e056c9c135 drop expired leasesand renew leaseset 2016-02-09 22:42:01 -05:00
c754b5ae18 fixed crash 2016-02-09 17:54:22 -05:00
481fafc11d invalidate excluded leases 2016-02-09 15:27:23 -05:00
7d927b0e28 shared_ptr for Lease 2016-02-09 10:46:27 -05:00
c314b07136 Merge pull request #371 from PurpleI2P/openssl
recent changes
2016-02-09 10:37:46 -05:00
16fe13bf4a Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-02-08 20:30:53 -05:00
d19eda7e08 moved Config.cpp to libi2pd 2016-02-08 20:29:56 -05:00
6f0a136727 some cleanup 2016-02-08 20:29:34 -05:00
e2e101e4fb queue up out of sequence packets 2016-02-08 15:47:39 -05:00
74f03202b7 queue up out of sequence packets 2016-02-08 15:02:17 -05:00
3d19e92059 queue up out of sequence packets 2016-02-08 14:42:20 -05:00
bfff125cc5 Merge pull request #370 from PurpleI2P/openssl
recent changes
2016-02-08 14:41:40 -05:00
e90baf3ca6 correct required base64 buffer size 2016-02-07 21:35:06 -05:00
f3b277aeef doesn't store leases in netdb 2016-02-07 19:45:06 -05:00
76096747b6 cleanup incoming and outgoing tags together 2016-02-07 17:45:11 -05:00
4c6ef32d72 fixed #369 2016-02-06 08:52:02 -05:00
a8e12e624d fixed hanging connection 2016-02-05 21:38:03 -05:00
88a43bfc28 Merge pull request #368 from majestrate/fix_sam_b32_naming
allow resolving of .b32.i2p addresses in SAM name lookup
2016-02-05 16:37:00 -05:00
3b268fe3cc allow resolving of .b32.i2p addresses in SAM name lookup 2016-02-05 16:17:53 -05:00
4c72d43a8a use more efficient XOR over ChipherBlocks for win32 2016-02-05 15:58:14 -05:00
0a5f8527b2 Merge pull request #366 from majestrate/bug_fixes
Squash potential future bugs.
2016-02-05 13:12:08 -05:00
9f1b84d6f2 use const size_t instead of size_t 2016-02-05 12:39:17 -05:00
babcbcbcea use const size_t instead of size_t 2016-02-05 12:32:50 -05:00
823a6017fe Merge pull request #364 from 0niichan/patch-6
Added instructions for a 64-bit OS
2016-02-05 11:12:57 -05:00
f034aef2ae Added instructions for a 64-bit OS 2016-02-05 22:58:04 +07:00
bf38bd5a1d * Fill padding with random in NTCP phase3
* Fill padding with random in NTCPSession::CreateMsgBuffer

* Silence unused variable warnings in NTCPSession.cpp
2016-02-05 10:40:23 -05:00
b922809c9d Merge branch 'openssl' into bug_fixes 2016-02-05 10:20:22 -05:00
05b0bda8bb Merge remote-tracking branch 'purple/openssl' into openssl 2016-02-05 10:16:42 -05:00
0aa3aa1b8d Merge pull request #363 from majestrate/fix_su3_overflow
fix issue #362 , add bounds check to su3 fileNameLength
2016-02-05 10:03:34 -05:00
d4febb4e84 * bounds check on Identity::FromBuffer
* properly indet last commits
2016-02-05 08:52:07 -05:00
21090eaa39 forgot to commit Base.cpp changes 2016-02-05 08:46:08 -05:00
d0ea59c568 add base64 buffer encoding bounds checking 2016-02-05 08:44:09 -05:00
a292bc77ba fix issue #362 , add bounds check to su3 fileNameLength 2016-02-05 07:55:28 -05:00
98d5e0b56d #355. reopen log file by SIGHUP 2016-02-04 13:53:38 -05:00
7ca1cfab1a use shared_ptr for log's stream 2016-02-04 12:36:58 -05:00
2e7ce38552 compatibility with gcc 4.6 2016-02-04 12:36:54 -05:00
0ef3a2472d Merge pull request #361 from PurpleI2P/openssl
rebase master to 2.4.0
2016-02-04 10:08:17 -05:00
b97f095de4 Merge pull request #360 from AMDmi3/build-type
Do not force build type
2016-02-04 10:06:09 -05:00
10e2b35483 Merge pull request #359 from AMDmi3/system-include-dirs
Include system directories as SYSTEM
2016-02-04 10:00:47 -05:00
16920a89f3 Merge pull request #358 from AMDmi3/local-include-dirs-before
Always place local include directories before all others
2016-02-04 10:00:10 -05:00
1a5b9de82e Merge pull request #357 from AMDmi3/conditional-miniupnp
Do not try to use miniupnp if upnp support is disabled
2016-02-04 09:59:18 -05:00
4ef183fee6 Do not force build type 2016-02-04 16:53:24 +03:00
2115ce6606 Do not try to use miniupnp if upnp support is disabled 2016-02-04 16:52:41 +03:00
61d1b733f7 Include system directories as SYSTEM 2016-02-04 16:52:20 +03:00
4978edb8be Always place local include directories before all others 2016-02-04 16:49:07 +03:00
51f7aba807 fixed crash 2016-02-03 16:18:49 -05:00
b9b143e4e7 don't persist proxy keys by defualt 2016-02-03 15:29:15 -05:00
0e7596a205 Update build_notes_windows.md 2016-02-03 15:01:28 -05:00
8c401cf01b check for USE_AESNI=1 2016-02-03 15:00:55 -05:00
6782e6a532 AES-NI 2016-02-03 13:46:26 -05:00
4386bd93c3 handle USE_AESNI for mingw 2016-02-03 12:48:59 -05:00
72b3c10ebd * fix updating address in RI 2016-02-03 14:21:22 +00:00
62cec2a31c * correct shutdown of httpserver & socksproxy 2016-02-03 13:14:54 +00:00
0c442622af * chg default for --host= option : was broken in 900fc1c 2016-02-03 12:28:33 +00:00
bf3c4bc588 * bump version 2016-02-03 11:28:58 +00:00
d98dd83369 * sync actial options and docs (#356) 2016-02-03 11:28:55 +00:00
21ecf309bb * Daemon.cpp : --log option now uses descriptive values: file, stdout (#356) 2016-02-03 11:28:53 +00:00
4bb4012d87 * Daemon.cpp : move logs init to single place 2016-02-03 11:28:52 +00:00
10fd8eb709 * Daemon.cpp : move ParseCmdline() before use of i2p::fs -- allow redefined paths 2016-02-03 11:28:49 +00:00
b1cc1db967 fixed POST for server http tunnel 2016-02-02 22:00:51 -05:00
77d8bae2c2 fixed server http tunnel header 2016-02-02 19:24:49 -05:00
7274d43645 fixed incorrect long fragment size 2016-02-02 18:27:52 -05:00
3eeee1b08d set correct log level for console 2016-02-02 12:16:29 -05:00
64b2a32c9a #343. check for malformed messages 2016-02-02 11:55:38 -05:00
4ced1e5075 proccess loglevel and logfile correctly 2016-02-02 07:24:14 -05:00
8de15c9d0d fixed bandwidth logic 2016-02-01 18:10:45 -05:00
31d716bd0c fixed race condition 2016-02-01 14:19:54 -05:00
3da6b3930b * I2PControl.cpp : fix handling relative paths for cert/key 2016-02-01 15:57:25 +00:00
900fc1cb46 Merge branch 'new-cmdline' into openssl
Conflicts:
	ClientContext.cpp
	Daemon.cpp
	I2PControl.cpp
	I2PControl.h
	docs/configuration.md
2016-02-01 15:08:20 +00:00
deb87f1d4c * for compatibility - leave --log option with arg 2016-02-01 14:42:52 +00:00
ed44d23afb * update docs/ 2016-02-01 14:26:40 +00:00
8baf7f3f6a * temporary remove short options : conflicts with remapping 2016-02-01 14:26:26 +00:00
d2d4fa29e4 * add --logfile option 2016-02-01 10:53:17 +00:00
0c56cd63bd * chg default port for http proxy 2016-02-01 10:53:15 +00:00
c9cf84f2f4 correct SAM datagram size for Windows 2016-01-31 22:37:38 -05:00
0966369723 copy transit message for nedb 2016-01-31 18:27:47 -05:00
4f6c3d52b3 Merge pull request #354 from h0bbyte/openssl
I2PControl add total.sent|received.bytes
2016-01-31 15:55:47 -05:00
97f8ab5c51 Update build_notes_windows.md 2016-01-31 14:58:49 -05:00
8805f1e4d6 I2PControl add total.sent|received.bytes 2016-01-31 22:52:20 +03:00
3ae57e0ca9 Merge pull request #353 from 0niichan/patch-5
correct BOOST_SUFFIX
2016-01-31 14:20:11 -05:00
a8e4301f23 correct BOOST_SUFFIX 2016-01-31 23:59:37 +06:00
68bc78d00b Update README.md 2016-01-30 21:04:02 -05:00
1dc9e74df4 check TunnelBuild message size 2016-01-30 10:35:32 -05:00
a69cee03e5 remove coreVersion and stat_update 2016-01-29 22:35:51 -05:00
bf15ad3bba 0.9.24 2016-01-29 21:53:57 -05:00
bb3f50f967 Merge pull request #352 from 0niichan/patch-4
httpProxyPort 4444
2016-01-28 19:45:30 -05:00
1042e19845 httpProxyPort 4444 2016-01-29 07:18:49 +07:00
85830d5076 fixed race condtion #350 2016-01-27 22:09:35 -05:00
c053bebccd reduced numeber of error messages 2016-01-27 21:54:42 -05:00
d6d6ae8af2 * Config.cpp : add old options remapping (revert this after 2.6.0) 2016-01-27 12:17:41 +00:00
6d8b0e3a5d control logs destination through -log parameter 2016-01-26 22:30:00 -05:00
cfd7f1571b check clock skew 2016-01-26 19:02:06 -05:00
f31c04d92a Merge pull request #347 from evgkrsk/log-subdir
Write service log to separate directory
2016-01-26 09:53:09 -05:00
89b58ec3af Removed confusing accesslist 2016-01-26 09:45:29 -05:00
ab0d66c2ef Write service log to separate directory 2016-01-26 21:12:48 +07:00
9774865d4a * docs/configuration.md 2016-01-26 08:03:44 +00:00
3817a0c2a1 Merge branch 'openssl' into new-cmdline 2016-01-26 08:03:18 +00:00
5215bdc035 clean up remote destinations without outgoing and unconfirmed tags 2016-01-25 22:10:06 -05:00
8061d306dd check tunnel payload size 2016-01-25 14:31:51 -05:00
30f68759ff fixed race condition 2016-01-25 13:34:04 -05:00
3f0b595085 fixed typo 2016-01-24 22:24:39 -05:00
0c9ce6258c sockoutproxy params added 2016-01-24 09:59:02 -05:00
7da17ba21e * tune logs 2016-01-24 12:41:08 +00:00
7b23d79dc2 * util.cpp : update Get*ConfigFile() : autodetect configs 2016-01-24 11:14:19 +00:00
415314a90d * update docs 2016-01-24 11:14:19 +00:00
0f7e2ad11a * Daemon_Singleton::init : rewrite setting bandwidth limit and floodfill mode 2016-01-24 11:14:19 +00:00
26d232c567 * Daemon_Singleton::init : unwrap spagetti-code 2016-01-24 11:14:19 +00:00
efa48a7e39 * tune logs 2016-01-24 11:05:16 +00:00
022642f4d5 * Config.cpp : don't try to parse config, if path is empty 2016-01-24 11:04:41 +00:00
e6e2f04a10 * Config.cpp : set default value for boolean options 2016-01-24 11:04:15 +00:00
f7e21dbe5c show tags for local destinations 2016-01-23 22:53:19 -05:00
f593802a51 I2CP option crypto.tagsToSend added for I2P tunnels 2016-01-23 20:52:21 -05:00
f545e6eb27 Merge pull request #340 from al42and/openssl-boost-asio-check
Better checking if boost::asio::buffer works with std::array
2016-01-23 13:53:12 -05:00
1778d82bc3 Better checking if boost::asio::buffer works with std::array
Otherwise, had troubles with clang 3.4 and boost 1.54
2016-01-23 17:36:06 +03:00
03587d7035 changed data path back to AppData/Roaming 2016-01-22 10:56:25 -05:00
6663788612 fixed some coding style 2016-01-22 07:08:21 -05:00
ac2cb773df * I2PControl.cpp : tune logs 2016-01-22 12:04:14 +00:00
b70b3ec85b * I2PControl : drop I2P_CONTROL_ID* vars : ugly 2016-01-22 12:04:11 +00:00
1e69b8c41d Merge pull request #335 from xcps/http_remove_referer
Http remove referer
2016-01-22 07:00:44 -05:00
d5aa1a4880 * use GetOption instead hardcoded values in header * move cert/key from $DATADIR/i2pcontrol/ to $DATADIR/ 2016-01-22 11:59:15 +00:00
de0658eaab * I2PControlService::CreateCertificate : use function parameters instead direct GetPath calls 2016-01-22 11:59:13 +00:00
939c28b74b removed extra lines 2016-01-22 16:30:24 +05:00
o
c10d628a45 Merge branch 'openssl' into http_remove_referer 2016-01-22 16:13:12 +05:00
o
92830172f9 asdf 2016-01-22 16:08:54 +05:00
431af2c0dd fixed issue #331. reuse existing local detination for tunnels 2016-01-21 15:51:08 -05:00
97ca8b7ada * fix build 2016-01-21 12:59:00 +00:00
f3a7c233b3 * I2PControl.cpp : #329 2016-01-21 12:40:07 +00:00
928abf7094 - I2PControlService::LoadConfig : not used anymore 2016-01-21 07:46:17 +00:00
2cace0008e - I2PControlService::SaveConfig : not used anymore 2016-01-21 07:41:09 +00:00
db9c20f3dd * I2PControl : move boost1.49+gcc4.7 hack 2016-01-21 07:38:11 +00:00
e1a1aef990 * I2PControl : use password option from main config 2016-01-21 07:37:38 +00:00
23cf6ebc89 * add new option 'i2pcontrol.password' 2016-01-21 07:35:26 +00:00
55c279cc7e Rolled back to working Makefile.mingw 2016-01-20 21:51:18 -05:00
4e89f90c4f Merge pull request #328 from 0niichan/patch-3
add "mkdir obj/Win32" in Windows
2016-01-20 16:01:38 -05:00
bd0eb81c1b add "mkdir obj/Win32" in Windows 2016-01-21 03:52:13 +07:00
a77a0d98e0 Merge pull request #327 from 0niichan/patch-2
new default boost' suffix; new paths
2016-01-20 14:16:44 -05:00
e5037fc9f9 new default boost' suffix; new paths 2016-01-21 02:05:16 +07:00
7ac2022159 Merge pull request #326 from 0niichan/patch-2
Update Makefile.mingw
2016-01-20 13:39:53 -05:00
bc41a15eba Update Makefile.mingw
new default boost' suffix; new paths
2016-01-21 01:33:28 +07:00
8aa158c1e0 * update debian/ 2016-01-20 11:32:12 +00:00
1f6f4d9c49 + docs/config_opts_after_2.3.0.md 2016-01-20 11:31:07 +00:00
3686a27c19 * update docs/configuration.md 2016-01-20 11:31:04 +00:00
1bcc311738 - drop i2p::util::config namespace : not used anymore 2016-01-20 11:30:09 +00:00
2335d3879e * migrate to new settings 2016-01-20 11:29:54 +00:00
209934ad67 * update buildsystems to include Config.cpp 2016-01-20 11:29:38 +00:00
35200a1ee5 + new cmdline & config impl 2016-01-20 11:28:57 +00:00
6c4977ee78 * tune log messages 2016-01-20 11:25:43 +00:00
5482a57c45 add clock skew to expiration 2016-01-19 11:16:50 -05:00
18914978d5 pass X-I2P_DestB32 and X-I2P-DestB64 2016-01-19 09:36:56 -05:00
36750ab900 * DaemonWin32 : separate --service (boolean) from --svcctl (string) option 2016-01-19 11:07:25 +00:00
c5f6a690de * Daemon.h : use boolean variables for flags 2016-01-19 11:07:23 +00:00
9611f80a39 check I2NP messages fro expiration 2016-01-18 21:13:43 -05:00
eb2d68fc28 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-01-18 10:29:37 -05:00
937d346676 set clove expiration time interval to 8 seconds 2016-01-18 10:29:07 -05:00
7565843fbe * move ReadConfigFile() : i2p::filesystem -> i2p::config * don't export i2p::config::mapArgs outside namespace 2016-01-18 09:05:03 +00:00
6740ec464c * unwrap i2p::util::config::* calls in Daemon.cpp 2016-01-18 09:04:25 +00:00
314e1e4bfe * unwrap i2p::util::config::* calls in ClientContext.cpp 2016-01-18 09:04:25 +00:00
45d68d89a9 * clean outdated declaration 2016-01-18 09:03:35 +00:00
1d5194a138 * drop mapMultiArgs : it's not used anywhere 2016-01-18 09:03:06 +00:00
05043f30dc * tune logs 2016-01-18 09:02:34 +00:00
cd549937c5 support multiple server tunnels with same destination and different ports 2016-01-17 18:55:09 -05:00
efdea07b7b change message expiration timeout to 8 secs (RTT) 2016-01-17 18:03:40 -05:00
06d4998d87 Merge pull request #323 from zenjy/openssl
Misc fixes
2016-01-17 14:38:27 -05:00
02b566055e * HTTPServer.cpp: add space after "Queue size:" 2016-01-17 18:18:21 +00:00
c312dbaac1 * Daemon.h: replace "#pragma once" with "#define" 2016-01-17 18:13:36 +00:00
b6dcb2f4c0 show streams as table (byt sha-db) 2016-01-17 11:10:56 -05:00
a85d3f2573 Merge branch 'openssl' of https://github.com/PurpleI2P/i2pd into openssl 2016-01-16 15:36:58 -05:00
0ca3fb5af0 specify and check netId 2016-01-16 15:36:30 -05:00
2a4d78d9bf wordwrapping (by sha-db) 2016-01-16 15:36:26 -05:00
d9e199092d fixed race condition 2016-01-15 16:23:03 -05:00
02bbb46d2e separate keys and destination creation 2016-01-15 14:46:29 -05:00
13ffdc6dd2 common ReadI2CPOptions 2016-01-15 12:24:40 -05:00
c8c2c4d376 Merge pull request #321 from scrrrapy/fedora-docs
Fedora/Centos docs to build from source
2016-01-15 07:13:38 -05:00
01f7343781 added instructions to build on Fedora/Centos 2016-01-15 03:14:44 +00:00
3acc244692 reordered unix targeted documentation to be more user-friendly
Also fixed wrong build root.
2016-01-15 03:14:40 +00:00
094068e4ff Merge pull request #320 from 0niichan/patch-1
Update util.cpp
2016-01-14 19:46:24 -05:00
ec958697e2 Update util.cpp
change i2pd home data path for Windows
2016-01-15 07:44:26 +07:00
208e8f8247 new webconsole style by sha-db 2016-01-14 19:05:46 -05:00
3d4890a28b handle I2CP keys correctly 2016-01-14 18:45:47 -05:00
fe4362f459 tunnel parameters 2016-01-14 15:57:55 -05:00
81d3ad2d35 Update README.md 2016-01-14 11:06:05 -05:00
ffb8c3e53c Update README.md 2016-01-14 07:47:58 -05:00
2d4d2374e3 Update README.md 2016-01-14 07:47:04 -05:00
09f31a9278 Merge pull request #319 from scrrrapy/travis-ci
Travis-CI integration
2016-01-14 07:19:40 -05:00
80b0a3cdec fixed travis badge branch 2016-01-14 10:16:42 +00:00
c533bfc83d integration with travis-ci 2016-01-14 02:45:06 +00:00
8fa053f7c7 show I2P tunnels at web console 2016-01-13 20:21:53 -05:00
b152bb26e3 more parameters 2016-01-13 09:42:06 -05:00
a0816b04e5 purple links, coloured tunnels 2016-01-12 20:31:25 -05:00
0819517902 * Addressbook : readable http-req assembly 2016-01-12 23:34:59 +00:00
55ea8c82e9 * Addressbook : logging 2016-01-12 23:32:32 +00:00
ffbbf88de4 * DaemonLinux : restore old behaviour: always write pidfile by default, but allow override path 2016-01-12 23:31:01 +00:00
e2ff49825f favicon added 2016-01-12 13:18:01 -05:00
7f325827c4 Merge pull request #317 from l-n-s/openssl
Prepare documentation for Read the docs
2016-01-12 11:30:16 -05:00
cae9ccfda1 version 2.3.0 2016-01-12 10:14:22 -05:00
248ae7d4d5 do nothing upon SIGHUP for now 2016-01-12 10:12:55 -05:00
7f08bbe938 handle -pidfile parameter correctly 2016-01-12 10:00:17 -05:00
81b2f2114d purplei2p webconsole style(by sha-db) 2016-01-12 09:36:01 -05:00
5eee430be3 fixed typo 2016-01-12 09:34:46 -05:00
623edf3bc9 Tuning docs for Sphinx 2016-01-12 07:18:17 +03:00
bd4a224051 Added Sphinx documentation files 2016-01-12 07:03:29 +03:00
870e84a700 new webconsole layout (by nda) 2016-01-11 22:05:10 -05:00
8d4fae24ea fixed misalignment 2016-01-11 19:03:04 -05:00
7a84daf3f7 temporary disable openssl mutexes 2016-01-11 17:37:20 -05:00
7968279bc2 send X-I2P-DestHash 2016-01-11 13:48:18 -05:00
258be40285 notransit parameter added 2016-01-11 11:08:06 -05:00
b2ae30eba1 * fix cmake output library name (#315) 2016-01-11 11:31:55 +00:00
daaba1dbc0 * prevent zero-division exception when running offline 2016-01-11 11:31:02 +00:00
a3c6ed4dd2 * fix warnings from -Wunused-result 2016-01-11 11:31:02 +00:00
e4255ed712 + add --pidfile cmdline option 2016-01-11 11:31:02 +00:00
5d510f1cf4 * DaemonLinux : set umask to 0027 instead 0000 2016-01-11 10:55:50 +00:00
1819bd910a * add log message when fork failed 2016-01-11 10:55:18 +00:00
43eecdbb3f * update default tunnels.cfg 2016-01-11 02:55:21 +00:00
108c1bcac4 * update docs/configuration.md 2016-01-11 02:52:16 +00:00
4b7e5864d4 * cleanup default config file 2016-01-11 02:52:00 +00:00
fb1d2abbfa * cleanup manpage 2016-01-11 02:51:35 +00:00
0c290e65ef removed deprecated parameters 2016-01-10 21:39:29 -05:00
5487fad2ce fixed race conditin 2016-01-10 18:55:00 -05:00
d41f930f69 fixed unintialized reply key 2016-01-10 16:40:28 -05:00
595b2619fd fixed misalignment for timestamp 2016-01-09 19:24:52 -05:00
26d305d866 fixed misalignment of certificate length 2016-01-09 17:26:17 -05:00
c9d95ff161 eliminate one extra multipilication 2016-01-08 10:21:43 -05:00
9cc592b564 correct buffer size for deflate 2016-01-05 14:50:45 -05:00
ff48422ec0 check I2NP message buffer size 2016-01-05 14:29:18 -05:00
a26c5f85c3 ignore LeaseSets coming from transit tunnels 2016-01-04 19:56:46 -05:00
727436e1cf specify signature type for I2P tunnels 2016-01-03 21:43:43 -05:00
d1c57a1872 New bandwidth values 2016-01-03 19:15:12 -05:00
b7c021af8c clear extra bandwidth bit 2016-01-03 09:54:03 -05:00
7149b509d7 extra bandwidth caps 2016-01-02 22:17:04 -05:00
45e7111dda publish stats for floodfill 2016-01-02 17:23:20 -05:00
9fc69db9eb reserve extra 16 bytes for padding 2016-01-01 17:39:12 -05:00
2ba314d9d9 count checksum and padding for buffer size 2016-01-01 15:41:18 -05:00
f35660c8e2 fixed windows build 2016-01-01 08:30:38 -05:00
68b1fe8631 use TUNNEL_DATA_ENCRYPTED_SIZE for tunnel encryption 2015-12-31 19:46:14 -05:00
4242c86d40 check for buffer overflow during flood 2015-12-31 17:09:04 -05:00
ef4dc3cbc9 fixed race condition of openssl calls 2015-12-31 16:02:10 -05:00
8daa7561fa pass ident hash by values to RequestComplete 2015-12-31 11:21:01 -05:00
2cc3dfc2ce fixed windows build 2015-12-28 12:26:10 -05:00
459800568a fixed windows build 2015-12-28 11:55:55 -05:00
3a35b84b03 fixed FreeBSD build 2015-12-28 10:52:02 -05:00
79cfa52bf9 fixed windows build 2015-12-28 08:30:40 -05:00
a0e8fe5848 * implement --loglevel option 2015-12-28 10:54:00 +00:00
2dae5bccb2 * util.cpp : reorder defines 2015-12-28 10:54:00 +00:00
8e867ab0c0 * util.cpp : reorder defines 2015-12-28 10:54:00 +00:00
1b2c88fe38 * drop i2p::util::config::GetCharArg 2015-12-28 10:54:00 +00:00
f3bee5ff3f * log message fix 2015-12-28 10:53:48 +00:00
196d7e8f72 send correct RouterInfo statistics 2015-12-26 09:41:12 -05:00
16596c18fb log max packet size 2015-12-23 20:47:44 -05:00
7ea3a87bfc * missing initializer for member ‘i2p::transport::Peer::delayedMessages‘ 2015-12-24 00:55:53 +00:00
a57905b6cd * merged branch 'sane-log-messages' 2015-12-24 00:46:32 +00:00
f9c592ca22 static link against libgcc, libstdc++ and libwinpthread 2015-12-23 10:24:10 -05:00
aecac0ef85 * bump version in debian/changelog 2015-12-23 01:32:01 +00:00
ca315c51a0 version 2.2.0 2015-12-21 20:49:27 -05:00
45c8858140 persist temporary keys 2015-12-21 10:17:00 -05:00
06e45bff24 removed unused parameter 2015-12-21 09:33:09 -05:00
2635a658d0 Fix missing cached openssl in appveyor 2015-12-20 22:57:55 -06:00
f48a98f691 * disable AESNI by default for .deb package (#312) 2015-12-21 03:48:35 +00:00
3badda95c1 * reseed now https only 2015-12-21 03:46:35 +00:00
364ccc05d5 * Log.h: drop unused template 2015-12-21 03:00:12 +00:00
d09fedf208 * sane log messages: TransitTunnel.cpp 2015-12-21 03:00:12 +00:00
7936f8730f * sane log messages: Reseed.cpp 2015-12-21 03:00:12 +00:00
6c0dfc4356 * sane log messages: Log.cpp 2015-12-21 03:00:12 +00:00
d9af8c31a2 * sane log messages: LeaseSet.cpp 2015-12-21 03:00:12 +00:00
ca375314f0 * sane log messages: Identity.cpp 2015-12-21 03:00:12 +00:00
5266d4d79c * sane log messages: RouterInfo.cpp 2015-12-21 03:00:12 +00:00
1cb0826de0 * sane log messages: SSUData.cpp 2015-12-21 03:00:12 +00:00
89e3178ea3 * sane log messages: HTTPServer.cpp 2015-12-21 03:00:12 +00:00
3b5d9d6cee * sane log messages: RouterContext.cpp 2015-12-21 03:00:12 +00:00
ce4ed19029 * sane log messages: SSU.cpp 2015-12-21 03:00:11 +00:00
01a502339c * sane log messages: api.cpp 2015-12-21 03:00:11 +00:00
642d0e6f74 * sane log messages: Streaming.cpp 2015-12-21 03:00:11 +00:00
d9e659deb0 * sane log messages: Destination.cpp 2015-12-21 03:00:11 +00:00
830fe7f9b8 * sane log messages: Transports.cpp 2015-12-21 03:00:11 +00:00
3e8c247c05 * sane log messages: ClientContext.cpp 2015-12-21 03:00:11 +00:00
16880074fa * sane log messages: DaemonWin32.cpp 2015-12-21 03:00:11 +00:00
19c74ce9fa * sane log messages: DaemonLinux.cpp 2015-12-21 03:00:11 +00:00
56ef0dad9c * sane log messages: Daemon.cpp 2015-12-21 03:00:11 +00:00
8d99808821 * sane log messages: I2PTunnel.cpp 2015-12-21 03:00:11 +00:00
1cb08fdecc * sane log messages: util.cpp 2015-12-21 03:00:11 +00:00
e8952d7e02 * sane log messages: TunnelPool.cpp 2015-12-21 03:00:11 +00:00
18fad9c9d9 * sane log messages: Garlic.cpp 2015-12-21 03:00:11 +00:00
89a0a94f3e * sane log messages: SAM.cpp 2015-12-21 03:00:11 +00:00
0859cf30f8 * sane log messages: UPnP.cpp 2015-12-21 03:00:11 +00:00
a0fe02a560 * sane log messages: BOB.cpp 2015-12-21 03:00:11 +00:00
3156f7dacd * sane log messages: Tunnel.cpp 2015-12-21 03:00:11 +00:00
c3958bf042 * sane log messages: NTCPSession.cpp 2015-12-21 03:00:11 +00:00
facc5f8aa7 * sane log messages: SSUSession.cpp 2015-12-21 03:00:11 +00:00
8170257c26 * sane log messages: AddressBook.cpp 2015-12-21 03:00:11 +00:00
489e37b2a1 * sane log messages: NetDb.cpp 2015-12-21 03:00:11 +00:00
4899e0d2d5 * sane log messages: I2NPProtocol.cpp 2015-12-21 03:00:11 +00:00
762f9c4b23 Merge pull request #308 from mlt/openssl-cmake
Cleaned up appveyor CI along with MSVC & mingw builds
2015-12-20 13:38:12 -06:00
6d3dac0ec1 Windows build status badge update in README.md 2015-12-19 22:19:06 -06:00
f684815272 Build miniupnpc.dll on Appveyor 2015-12-19 22:19:05 -06:00
8e04218c95 Install optional miniupnpc.dll if exist 2015-12-19 22:19:04 -06:00
23cb45454b Set default install folder for CMake based NSIS 2015-12-19 22:19:02 -06:00
7fc9a161b1 Default NSIS template from CMake 2015-12-19 22:19:01 -06:00
95a5473051 Initial CMake based packaging 2015-12-19 22:19:00 -06:00
66ceb573dc Update Windows build docs 2015-12-19 22:18:59 -06:00
5f8223ebb5 Patch for 64-bit zlib build with MSVC assembly 2015-12-19 22:18:58 -06:00
51146d4152 MSVC optimization & hardening 2015-12-19 22:18:57 -06:00
3334281949 Search for patch tool with CMake
This is to enable static build of "bundled" zlib with MSVC
2015-12-19 00:03:32 -06:00
8e85d9ac00 Sync Windows VERSIONINFO resource with version.h 2015-12-19 00:03:31 -06:00
e1c69a6250 Transparency in icon 2015-12-19 00:03:30 -06:00
edd9a18257 Cleanup some CMake msys specifics
* Exclude MSYS from -z relro
* WIN32_LEAN_AND_MEAN
2015-12-19 00:03:28 -06:00
65f993677f Remove unnecessary thread & chrono Boost libs
Prevent boost thread auto-link erroneous attempts with MSVC
2015-12-19 00:03:27 -06:00
bc775140bb appveyor.yml 2015-12-19 00:03:26 -06:00
4b2bd6e18f Include dir for precompiled headers with gcc 2015-12-19 00:03:24 -06:00
c36a810bcb ignore extended options for SessionCreated and SessionConfirmed 2015-12-18 11:52:44 -05:00
a994bbc36b call CryptoConstants from Crypto.cpp only 2015-12-18 10:09:25 -05:00
c3238f4d0b * fix warnings of type mismatch (#298) 2015-12-17 08:10:17 +00:00
632d26e398 * update maintainer scripts 2015-12-17 07:16:26 +00:00
214cc8b810 * install reseed certs 2015-12-17 05:00:03 +00:00
8f218141f4 * add 'i2pd' user (#313) 2015-12-17 04:39:08 +00:00
3676304751 * provide default subscriptions.txt 2015-12-17 04:39:08 +00:00
c605fd57aa * AddressBook.cpp : mistype in log message 2015-12-17 04:39:08 +00:00
4599f6919c shared_ptr for local destination in TunnelPool 2015-12-16 14:52:48 -05:00
8ad20c0db3 * allow parallel builds (#310) 2015-12-16 01:12:14 +00:00
638a69e5f0 * fix comments in default config (#311) 2015-12-16 00:19:52 +00:00
9fa6b1ebe1 keep pending incoming streams if acceptor is not set 2015-12-14 22:36:23 -05:00
5930e2d221 keep pending incoming streams if acceptor is not set 2015-12-14 22:23:28 -05:00
fdd96975fb cancel destination request 2015-12-13 14:40:43 -05:00
de6dd77046 use shared_ptr for LeaseSet request 2015-12-13 10:51:43 -05:00
1b6ad8413e spread addresses between subdirectories 2015-12-11 15:48:33 -05:00
6096d572f3 handle RelayResponse 2015-12-09 22:17:43 -05:00
badcd64b62 print full tunnel path 2015-12-09 19:07:12 -05:00
a7b8b52dbd fixed crash 2015-12-09 18:01:42 -05:00
d89f0f51df show full tunnel path 2015-12-09 10:35:04 -05:00
be358f3f2e enable RI catch for OBEP back 2015-12-09 10:03:51 -05:00
f122da1485 change and save I2PControl password 2015-12-08 10:40:43 -05:00
0dda4728b6 * update README 2015-12-08 12:18:25 +00:00
45fd95e02b * update default/i2pd and traditional init script 2015-12-08 11:38:28 +00:00
91aa2d7f6f + add example config files 2015-12-08 11:38:28 +00:00
a96b7d2a80 * drop patch not needed anymore 2015-12-08 11:38:28 +00:00
8f9cea54c5 * rename main binary 2015-12-08 11:38:28 +00:00
045558bede correct path to openssl 2015-12-06 22:48:08 -05:00
58124ebaab * update debian/docs 2015-12-05 11:55:27 +00:00
0c87dd5624 * added debian/logrotate (thanks to kytv) 2015-12-05 11:55:27 +00:00
b87f986a49 * added manpage (thanks to kytv) 2015-12-05 11:55:27 +00:00
c6a6035bb9 * debian/control : compat level -> 9 2015-12-05 07:56:51 +00:00
1ef12f0645 updated reseeders list 2015-12-04 14:59:31 -05:00
ef3ec33ba3 create all subdirectories for non-case sensitive systems 2015-12-04 14:06:37 -05:00
c82ef1ee8f link against openssl for Mac OS X 2015-12-04 13:19:08 -05:00
23b8a60242 Appveyor status badge 2015-12-03 23:39:09 -06:00
ac9511165e Merge pull request #307 from mlt/openssl-cmake
Better CMake support for MSVC builds
2015-12-03 23:35:14 -06:00
9d70851eb9 Respect static for zlib with CMake 2015-12-03 23:23:26 -06:00
759dfb28ce Increase PCH heap limit for MSVC 2015-12-03 23:07:31 -06:00
ff356b1f21 Use assembly language when building zlib for MSVC++ 2015-12-03 23:07:30 -06:00
b2a6c1bc68 fixup! read Content-Length from http header
MSVC++ complains on ssize_t
2015-12-03 23:07:29 -06:00
76549d0a4a Fix win32 resource compilation with msys
squash! Fix win32 resource

winres.h is missing for mingw
2015-12-03 23:07:27 -06:00
e5c72cae83 Fix CMake stuff for msys2 2015-12-03 23:07:26 -06:00
bf47df46c9 allow DNS names for SSU 2015-12-03 15:45:01 -05:00
0ef42870e5 try SSU if NTCP address is not presented 2015-12-02 12:48:10 -05:00
da8a6a4c2b make sure to use ipv4 introducers only 2015-12-01 09:21:02 -05:00
988007a8c9 pass correct pointer to sessions table 2015-11-30 19:45:57 -05:00
710439e83c * cleanup README
* move all docs to single dir
2015-12-01 00:06:00 +00:00
80a0a3d4fb * BUILD_NOTES.md : add hints for building deb 2015-12-01 00:02:59 +00:00
43299aea10 * BUILD_NOTES.md : update 2015-12-01 00:02:59 +00:00
f5aea766a7 * move 'Requirements' sections to BUILD_NOTES.md 2015-12-01 00:02:59 +00:00
c5308e3f2f separate SSU sessions lists for V4 and V6 2015-11-30 15:53:07 -05:00
2b8e662f81 connect through introducer in v4 thread 2015-11-30 14:59:32 -05:00
0a6d849435 pass shared_ptr to SendRelayIntro 2015-11-30 10:23:05 -05:00
a0106fe5d8 Merge pull request #306 from erlend1/openssl
Configurable addresses from master
2015-11-30 10:20:19 -05:00
cee1b8a64a Configurable addresses from master 2015-11-30 16:44:32 +02:00
4e2ba71d59 more introducers 2015-11-29 17:25:42 -05:00
fb2bdfb9ee create SSU session in SSU thread 2015-11-29 09:10:49 -05:00
72785f6740 eliminate some unnecessary calculations 2015-11-27 22:16:10 -05:00
a94a05fac9 replaced radix-16 to radix-256 2015-11-27 19:02:54 -05:00
430368de97 temporary disable Ed25519 per thread 2015-11-27 15:46:30 -05:00
7bfb499549 reduce number of precalculated points 2015-11-27 13:19:45 -05:00
9bc477e1b6 * use stricter linker options for .deb packages 2015-11-27 14:02:19 +00:00
f84ac18472 * set defaults to *FLAGS instead redefining them 2015-11-27 14:01:15 +00:00
cd515a2e54 * fix Depends: for i2pd-dbg 2015-11-27 14:01:15 +00:00
c73c8fdc47 * fix building of empty -dbg package 2015-11-27 13:35:24 +00:00
e755a32b23 * take some enchancements for debian/ dir from kytv (#1) 2015-11-27 12:09:31 +00:00
d4d1768575 * Makefile.* : fix build with gcc 4.7.2 (#299) 2015-11-27 11:42:44 +00:00
0a5745c559 Update README.md 2015-11-26 21:04:19 -05:00
b24959205b Update README.md 2015-11-26 21:03:58 -05:00
d69f297c05 split between CreateSession and CreateSessionThrough Introducer 2015-11-26 16:20:24 -05:00
3c8e331809 Ed25519 per thread 2015-11-26 14:00:40 -05:00
d169471e8c copy constructor for Ed22519 2015-11-26 13:31:30 -05:00
56453f6b5c moved BN_CTX creation to curve's Verify and Sign 2015-11-26 10:25:51 -05:00
dac2e8c79e use left sift instead multipilication by 2 2015-11-26 09:48:06 -05:00
ccc96bc610 Merge pull request #304 from hagen-i2p/fixes
Misc fixes
2015-11-26 07:05:46 -05:00
654371cb6a fix debian/ directory 2015-11-26 11:24:28 +00:00
1af8d873bb delete build/cmake_modules/FindCryptoPP.cmake (now using openssl) 2015-11-26 11:24:02 +00:00
b7a0e23309 fix BUILD_NOTES: url, md-format, crypto++ reference 2015-11-26 11:23:32 +00:00
4a0f868941 fix Dockerfile : drop crypto++, add openssl 2015-11-26 11:23:30 +00:00
448073cdd6 format '%lu' expects argument of type 'long unsigned int', but argument 5 has type 'size_t {aka unsigned int} 2015-11-26 11:23:27 +00:00
ad79ec7b1f async handshake 2015-11-25 13:11:02 -05:00
e194854c6d replace GetSession to CreateSession 2015-11-25 12:51:35 -05:00
d01d033209 eliminate session creation collision 2015-11-25 11:51:35 -05:00
06c4aca490 always use shared_ptr for I2NPMessage 2015-11-24 13:09:12 -05:00
885d57138a read Content-Length from http header 2015-11-23 19:47:08 -05:00
9e2a770a26 read complete request 2015-11-23 16:40:06 -05:00
942b699bb9 fixed few SSL errors 2015-11-23 14:48:56 -05:00
c9d03a8094 I2PControl through SSL 2015-11-23 13:22:02 -05:00
d015538bb4 create certificate for https 2015-11-23 11:56:00 -05:00
90d6c5c5bb fixed race condition 2015-11-23 09:26:32 -05:00
387ce4b6fa fixed access to eepsites from webconsole 2015-11-22 21:02:02 -05:00
7943b13891 use shared_ptr for sockets 2015-11-22 17:01:37 -05:00
50a7cd19b4 Update README.md 2015-11-22 16:48:38 -05:00
53e9335bb0 Update README.md 2015-11-22 16:47:55 -05:00
e5cb70972e moved status_string to reply structure 2015-11-22 10:58:57 -05:00
0d84871037 backport of 'make http server http/1.1 compliant' 2015-11-21 17:26:12 -05:00
1d37745c0c more separation between api and executable builds 2015-11-21 17:04:40 -05:00
ad9ade7849 reduce number of transient BIGNUM allocations 2015-11-20 21:27:16 -05:00
c1e2ee32b4 fixed mingw build error 2015-11-20 12:34:53 -05:00
1588d2734c use path.string () instead path.c_str () 2015-11-20 12:30:20 -05:00
50dda4263f fixed mingw build error 2015-11-20 11:42:38 -05:00
a8f2239495 backport GetMTU 2015-11-20 10:36:04 -05:00
c42636b0ee check for zero-length 2015-11-20 10:10:13 -05:00
54b2c8bd7e backport fix build for clang 2015-11-20 10:02:54 -05:00
d01a21a867 backport openbsd support 2015-11-20 09:55:34 -05:00
5d43052c05 Merge pull request #296 from edwtjo/make-tunnelscfg-configurable-again
Make tunnels.cfg configurable
2015-11-20 09:08:26 -05:00
4109ab1590 Make tunnels.cfg configurable 2015-11-20 13:59:00 +01:00
f6eabd695b don't store B explicitly 2015-11-19 22:38:18 -05:00
24d9dacfd9 fixed mingw build 2015-11-19 21:02:55 -05:00
66d51a9eb1 0.9.23/2.1.0 version update 2015-11-19 09:26:38 -05:00
302df75d83 skip extended options in SSU header 2015-11-16 13:27:27 -05:00
11b7e637e9 fixed complation error for boost 1.49 and gcc 4.7 and higher 2015-11-12 15:39:48 -05:00
135c92bd85 Merge pull request #295 from mlt/openssl-cmake
Bring CMake stuff in agreement with #294 discussion
2015-11-12 07:18:26 -05:00
c15c26a233 Bring CMake stuff in agreement with #294 discussion 2015-11-11 21:24:53 -06:00
5d94760cce eliminate some transient BIGNUM allocations 2015-11-11 16:24:56 -05:00
79517a0ba3 fixed clobbed z and t for Double 2015-11-11 15:19:00 -05:00
64295e3541 Merge pull request #294 from mlt/openssl-cmake
Updated CMake stuff to build OpenSSL version with MSVC++
2015-11-11 15:03:47 -05:00
cc2816aaf5 Use OpenSSL & zlib in precompiled headers 2015-11-11 13:48:49 -06:00
4a2fcb9deb Use OpenSSL & zlib with CMake instead of Crypto++ 2015-11-11 13:46:29 -06:00
7f27580f1b Proper miniupnpc CMake detection 2015-11-11 13:45:37 -06:00
94d0915004 Reorder ssl/boost includes to avoid winsock complains 2015-11-11 13:44:52 -06:00
88db99e593 Minor omissions
* Missing UPnP namespace
* Public key pointer dereferencing for MSVC
* Redundant WIN32_LEAN_AND_MEAN found in Makefile.mingw as well
2015-11-11 13:21:52 -06:00
593b25a5cd fix build error 2015-11-11 13:32:58 -05:00
5c58bf44c0 Makefile.mingw added 2015-11-10 14:09:26 -05:00
73ae6cf164 (h*a)%l for signing 2015-11-09 14:41:04 -05:00
7749319c75 h%l for verification 2015-11-07 18:07:59 -05:00
73037b86ac fixed build for gcc 4.6 and boost 1.46 2015-11-06 09:01:02 -05:00
d50ba1259c calculations in projective coordinates 2015-11-05 15:02:10 -05:00
962261fee7 EdDSA speed improvement 2015-11-04 13:48:30 -05:00
4dea2ef1a4 use EdDSA as default for RouterInfo 2015-11-03 13:05:37 -05:00
aa12eb4ed4 removed autotools build 2015-11-03 09:37:08 -05:00
8a75363784 Update README.md 2015-11-03 09:34:44 -05:00
01dd982587 Update README.md 2015-11-03 09:22:09 -05:00
62cf83921b cumulative update from bitbucket 2015-11-03 09:15:49 -05:00
73d4025256 version 0.10.0 2015-07-06 12:11:17 -04:00
3405ffd8d8 check for buffer size 2015-07-05 07:59:38 -04:00
e03f1597a0 don't send DatabaseStore until time sync complete 2015-07-03 21:50:26 -04:00
c5644e0e32 const I2NP messages 2015-07-03 21:27:40 -04:00
bf14b7da9a move FillI2NPMessageHeader into I2NPMessage 2015-07-03 11:11:07 -04:00
0c8fb376db some cleanup 2015-07-03 10:11:55 -04:00
17acdcc4d5 temporary fix of crash 2015-07-02 14:11:30 -04:00
654357f5ce copy shared_ptr 2015-07-02 13:43:03 -04:00
fbebdd3055 fixed race condition 2015-07-01 17:20:41 -04:00
83e76c6b53 use shared flood message 2015-07-01 14:13:42 -04:00
adf12b6084 handle DeliveryStatus garlic clove directly 2015-06-29 21:40:43 -04:00
047c6a93a3 don't copy transit DatabaseStore 2015-06-27 22:02:00 -04:00
bf4c33325c random non-zero padding 2015-06-26 16:06:59 -04:00
be1a4548e6 pass const I2NP message to HandleTunnelDataMsg 2015-06-25 21:49:16 -04:00
d8cd2afd12 different input anf output I2NP message for tunnel encryption 2015-06-24 22:19:56 -04:00
6ff3f8df87 Merge pull request #218 from mlt/fix208
Check for invalid SAM destination
2015-06-24 15:49:25 -04:00
95c4a87ccc Check for invalid SAM destination
This closes #208
2015-06-24 14:20:16 -05:00
206f094dd4 use shared_ptr for DeliverStatus 2015-06-24 10:45:58 -04:00
a05a20440e deleted deprecated SendMessage 2015-06-24 10:25:05 -04:00
ff12421d60 shared_ptr for lookup messages 2015-06-22 15:47:45 -04:00
2cbd6e85c6 use shared_ptr for garlic messages 2015-06-21 22:29:50 -04:00
1fc50a59f5 different in and out buffers for tunnel encryption 2015-06-21 17:05:01 -04:00
9c9401ce2f use shared_ptr for all incoming I2NP messages 2015-06-21 15:08:22 -04:00
f732a84a7c Merge pull request #214 from mlt/cmake-upnp-libdl
Missing libdl for UPnP
2015-06-20 14:39:41 -04:00
efe7e469ce Missing libdl for UPnP 2015-06-20 12:16:36 -05:00
ed136c9d8b Merge pull request #213 from mlt/fix-upnp
fixup! Fix UPnP for Win32
2015-06-20 06:56:01 -04:00
60e2722a21 fixup! Fix UPnP for Win32 2015-06-20 00:50:12 -05:00
4fab07b4da fixed build error 2015-06-19 16:06:14 -04:00
d07c68bd9a Merge pull request #210 from mlt/fixes
Few fixes
2015-06-19 16:00:12 -04:00
2738169a9d Use static for now while returning HTTP 500 error 2015-06-19 14:47:44 -05:00
490b65dfe2 Materialize temporary string obtained from boost path 2015-06-19 14:47:33 -05:00
38ebe28923 Rearrange eol removal for handshake 2015-06-19 14:47:20 -05:00
4ed7e29896 use shared_ptr for I2NP messages through tunnels 2015-06-19 14:38:31 -04:00
122b8c2a84 use shared_ptr for transit tunnel participant 2015-06-17 12:31:28 -04:00
98c91a01e3 use shared_ptr for outbound tunnel build messages 2015-06-17 12:26:07 -04:00
a7cd16c159 use shared_ptr for direct DatabaseLookup message 2015-06-17 12:25:02 -04:00
5ca86b87f5 create shared I2NP tunnel message in OBGW 2015-06-17 12:08:06 -04:00
25a163cdeb send I2NP messages as shared_ptr 2015-06-17 11:41:07 -04:00
3a63f6775a pass I2NP message to transport session as shared_ptr 2015-06-17 10:47:26 -04:00
d65257c7b0 pass I2NP as shared_ptr to netDB 2015-06-16 13:32:42 -04:00
465945f8a8 more generic queue 2015-06-16 13:14:33 -04:00
a0de60e179 use share_ptr for garlic messages 2015-06-16 10:14:14 -04:00
b48682012d verify adler checksum 2015-06-14 10:37:15 -04:00
e624cb31bd Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-06-11 11:43:58 -04:00
20e43951e5 reduce CPU usage 2015-06-11 11:43:35 -04:00
576802a1d6 Merge pull request #202 from mlt/fix201
This closes #201
2015-06-10 17:18:36 -04:00
23a3d48611 This closes #201 2015-06-10 16:11:13 -05:00
b6ec0a3526 Merge pull request #200 from mlt/cmake
Cmake: fix static, precompiled headers, fix crypto++ include dir search
2015-06-10 15:40:42 -04:00
ef6a038451 handle explicitPeers I2CP parameter 2015-06-10 15:32:55 -04:00
0354685e35 Precompiled headers
Sample times:
MSVC 2013, debug x64: 5min 15sec -> 2min 15sec
Ubuntu 15.04, with hardening, static, release: 5min 21sec -> 3min 24sec
2015-06-10 13:41:08 -05:00
ba2b792916 Cleanup cryptopp headers path search 2015-06-10 13:41:07 -05:00
44768e92ad CMake: fix static builds, add LTO for MinSizeRel 2015-06-10 13:41:06 -05:00
0e8bdf8299 fixed race condition 2015-06-09 22:14:31 -04:00
09298d7457 changed profiling algorithm 2015-06-09 14:04:25 -04:00
e8d80e16ba very hash in one pass 2015-06-09 13:02:37 -04:00
e461982a31 support multiple transport sessions to the same peer 2015-06-09 11:00:37 -04:00
c896f6d0d7 select first hop for inbound tunnel from connected peers 2015-06-07 08:37:34 -04:00
9a9b38a8c3 Merge pull request #199 from mlt/cmake-msvc
MSVC specific debug symbols don't belong to other platforms
2015-06-06 21:47:49 -04:00
b26b52cca8 Merge pull request #198 from mlt/upnp
Fix UPnP for Win32
2015-06-06 21:47:28 -04:00
b5ee997da9 MSVC specific debug symbols don't belong to other platforms 2015-06-06 14:16:29 -05:00
046ffd8648 Fix UPnP for Win32
* find_package for headers
* Swap includes order to pass compilation with MSVC 2013
* Enforce SO address resolution checks
* Change SO/DLL name on Windows
* Portable sleep from C++11

This closes #186
2015-06-06 13:53:22 -05:00
d7e7823606 Merge pull request #197 from mlt/cmake-msvc
Fix Win32 build with CMake and MSVC
2015-06-06 14:19:38 -04:00
2d3493a225 Perhaps bitness detection is an introspection
http://www.cmake.org/cmake/help/v3.0/command/find_library.html
2015-06-06 12:34:06 -05:00
a3b08c0016 Fix Win32 build with CMake and MSVC 2015-06-06 12:21:35 -05:00
d9c0f52846 don't pick node for 5 minutes if declined 2015-06-05 22:09:16 -04:00
a96482b186 skip missing sections 2015-06-05 21:15:02 -04:00
10e78785cd additional statistics for profiling 2015-06-05 15:55:21 -04:00
da56397b39 fixed bug with zero-size clove 2015-06-04 11:31:22 -04:00
abc05b4485 version 0.9.20 2015-06-04 09:54:46 -04:00
09fd0baf78 replace Host: for server http tunnels 2015-06-03 12:30:15 -04:00
d7deb938c5 catch HTTP header of HTTP server tunnel connection 2015-06-02 16:21:38 -04:00
68834df271 use addresses in server tunnel configuration 2015-06-02 13:18:41 -04:00
8a3c276e66 I2PTunnelConnectionHTTP added 2015-06-02 13:03:22 -04:00
6a043649f5 use random msg_id for I2NP messages 2015-05-27 13:35:54 -04:00
019af7bd3a http server tunnel added 2015-05-20 16:00:09 -04:00
4f2f67d5b1 Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-05-17 19:40:57 -04:00
2a59ae294d check length of garlic message 2015-05-17 19:40:46 -04:00
6d586bde6c Note that Boost 1.58 works 2015-05-14 08:29:17 +00:00
9510bba3b0 excluded dead reseeds 2015-05-12 11:56:42 -04:00
eb559f7b6a excluded dead reseeds 2015-05-12 11:51:03 -04:00
64dbd9abdf Merge pull request #195 from ipslot/master
Update Log.cpp
2015-05-12 06:28:47 -04:00
dfd41385b1 Update Log.cpp
set default log to std::cerr stream
2015-05-12 13:27:02 +06:00
2b797fcd54 use shared_ptr for NetDb's I2NPMessages 2015-05-11 15:17:43 -04:00
5cd557ef9d check for I2NP message buffer boudary 2015-05-11 12:53:08 -04:00
8baab2de37 Merge pull request #191 from apprb/dev
CMakeLists.txt: compilation speed up
2015-05-11 06:33:36 -04:00
c266cff956 CMakeLists.txt: compilation speed up 2015-05-11 15:56:13 +06:00
53affa3303 Merge pull request #190 from multikatt/patch-1
typo: Gralic -> Garlic
2015-05-09 19:28:22 -04:00
ec772c5d46 typo: Gralic -> Garlic 2015-05-09 19:25:11 -04:00
7b5a7e10a9 fixed log crash at shutdown 2015-05-08 21:42:28 -04:00
188f1fcff8 rewrite tunnel path inversion code 2015-05-08 14:07:33 -04:00
39c346df10 created paired inbound tunnel after outbound 2015-05-07 16:03:12 -04:00
490e829083 Merge pull request #189 from hagen-i2p/gcc5-makefile
* add gcc 5.* to supported compilers
2015-05-07 11:16:20 -04:00
846128a791 * add gcc5 to supported compilers 2015-05-07 03:40:19 +00:00
6bad2daa62 fixed build errors for gcc 4.6 2015-05-06 19:18:00 -04:00
4c91d08cea pass TunnelConfig as shared_ptr 2015-05-06 16:17:48 -04:00
2442d0e910 moved UPnP instance to Transports. Use actual port from RouterContext 2015-05-06 12:19:20 -04:00
7c13194d5a don't recalculate timestamp for each log message 2015-05-06 11:24:35 -04:00
0ae7bbd34d Update README.md 2015-05-05 17:30:32 -04:00
0b2654f6b1 Update README.md 2015-05-05 17:30:14 -04:00
42d49bde86 handle tunnels quantity params 2015-05-05 12:32:13 -04:00
d2b4a6fd50 select first hop from existing connections if applicable 2015-05-05 10:33:19 -04:00
7f172964f6 check profile only once 2015-05-04 13:01:27 -04:00
b8b8d70c7f reseed certificate updates 2015-05-02 21:00:43 +00:00
969695f318 check garlic clove length 2015-04-21 18:59:35 -04:00
7ec701a816 uin32_t for elapsed time 2015-04-21 18:33:04 -04:00
c96b81206d changed some profiling parameters 2015-04-21 15:59:40 -04:00
5f8356741e fixed potential memory leak 2015-04-18 13:55:15 -04:00
3987d5e5a0 recreate tunnel after 9.5 minutes 2015-04-17 11:36:42 -04:00
fcb56db224 try to pick an outbound tunnel with same endpoint instead expired 2015-04-17 10:11:51 -04:00
873754c6ca select next lease with same gateway if possible 2015-04-16 11:38:36 -04:00
12465f840a check outbound tunnles for readiness 2015-04-15 18:25:05 -04:00
e8c9d2db10 double RTO after every resend attempt 2015-04-15 11:52:49 -04:00
a8b4f38865 router don't expire if less than 75 2015-04-15 07:30:37 -04:00
27bd193708 re-create tunnel before expiration 2015-04-14 21:37:21 -04:00
c56ddce2f6 some cleanup 2015-04-14 10:46:44 -04:00
5d2f9f9f0b fixed potential memory leak 2015-04-14 10:40:46 -04:00
864aba9f4e version 0.9.19 2015-04-13 18:54:13 -04:00
4d27399ce3 check profile for high bandwidth peer selection only 2015-04-13 18:51:31 -04:00
76c54ffdef always check profile for peer selection 2015-04-13 18:41:19 -04:00
c873e9dd68 don't send reset message due problem at other side 2015-04-13 11:38:23 -04:00
ce99357ebe check for zero ident 2015-04-12 16:59:59 -04:00
562de3514a check database lookup type 2015-04-12 15:54:28 -04:00
128a8f3b48 delete obsolete profiles 2015-04-11 15:39:23 -04:00
1839b85d97 Merge pull request #180 from 7histle/master
Fix for #179
2015-04-11 07:03:10 -04:00
f0f154cd10 Fix for #179 2015-04-11 13:47:49 +03:00
624bff3036 reduced log file size 2015-04-10 19:58:32 -04:00
1d2950b4a7 reduced CPU load at floodfill 2015-04-10 19:49:58 -04:00
9072a018dd reduced CPU load at floodfill 2015-04-10 18:13:11 -04:00
2a997d94bf GetClosestFloodfills added 2015-04-10 16:15:13 -04:00
2741e94a72 fixed infinite loop 2015-04-10 13:19:23 -04:00
7c660ee556 show local destination for SAM sessions 2015-04-10 12:11:10 -04:00
51b850aa85 show windows size and connection status 2015-04-10 11:52:14 -04:00
b29e94005d fixed crash 2015-04-10 09:58:08 -04:00
ddd506fde7 Merge pull request #178 from yuri-sevatz/master
Fix -lboost_date_time missing from CMakeLists.txt
2015-04-10 06:57:37 -04:00
20310cb109 Fix -lboost_date_time missing from CMakeLists.txt 2015-04-10 00:10:35 -04:00
11177d37ea send and handle RESET flag 2015-04-09 21:09:30 -04:00
da006a1d6e use AsyncSend 2015-04-09 18:40:23 -04:00
451b0382ea implemented AsyncSend 2015-04-09 15:07:25 -04:00
950f250d66 NetDb/NetDbRequests split 2015-04-09 12:45:00 -04:00
01913d2b14 EdDSA signer added 2015-04-09 10:03:21 -04:00
e0b19a6383 fixed crash 2015-04-08 19:06:47 -04:00
48289845df EdDSA signature type added 2015-04-08 16:28:52 -04:00
454f2dabbd EdDSA signature type added 2015-04-08 16:18:16 -04:00
8891d9aa4d Decode point 2015-04-08 15:31:13 -04:00
49d59fc116 IsOnCurve added 2015-04-08 14:07:45 -04:00
8c92c50f9a multiplication by integer 2015-04-08 13:49:27 -04:00
75d45ae988 initial code for Ed25519 added 2015-04-08 13:21:49 -04:00
d5e1d5db9c validate leaseset for zero leases 2015-04-08 10:34:16 -04:00
9ce9d9b7fc variable length buffer for LeaseSet 2015-04-08 09:39:02 -04:00
e9edc7b205 Merge pull request #177 from robertfoss/asan_1
Fixed memory leak: delete -> delete[]
2015-04-07 17:27:18 -04:00
56822d9424 fixed null pointer exception 2015-04-07 17:22:14 -04:00
2c480bee9a Fixed memory leak: delete -> delete[] 2015-04-07 22:37:24 +02:00
3983838694 use unique_ptr for ElGamalEncryption 2015-04-07 16:02:07 -04:00
1e74ff8a85 use shared_ptr for CreateDatabaseStore 2015-04-07 15:15:27 -04:00
8c47bf9dd3 use shared_ptr for local LeaseSet 2015-04-07 15:02:00 -04:00
3a26383c4d made Encrypt const 2015-04-07 14:40:36 -04:00
634976cdde pass LeaseSet to callback of RequestDestination 2015-04-07 12:02:25 -04:00
bc21f5955f use shared_ptr for AddressReceiver 2015-04-06 15:02:37 -04:00
e72eb35cc2 use shared_ptr for socket in I2PTunnelConnection 2015-04-06 14:41:07 -04:00
fbe4e64e44 lookup always takes full address from LeaseSet 2015-04-06 12:22:13 -04:00
be301dc090 4 tags for LeaseSet request 2015-04-05 20:07:32 -04:00
250af7f247 fixed race condition 2015-04-05 13:56:41 -04:00
10577cd1e5 select tunnel from TunnelPool rather than from LeaseSet for DeliveryStatus 2015-04-05 12:54:15 -04:00
62593f60c5 fixed memory leak 2015-04-04 15:44:29 -04:00
89ed8c2173 set datagram receiver per port 2015-04-03 20:34:37 -04:00
321dd252ea fixed crash if no routers available 2015-04-03 10:02:45 -04:00
19325d552a fixed race condition 2015-04-02 15:10:02 -04:00
43f8ec46cc fixed crash if can't connect to a reseed 2015-04-02 10:27:07 -04:00
cb9f78540a Update README.md 2015-04-02 09:01:15 -04:00
0a15088572 RC4_SHA cipher suite 2015-04-01 20:23:06 -04:00
ec68338a20 fixed typo 2015-04-01 15:42:26 -04:00
173b35f77d https://netdb.rows.io:444/ added 2015-04-01 15:07:45 -04:00
f47831c339 RSA_WITH_AES_256_CBC_SHA support 2015-04-01 14:41:36 -04:00
e7d4f63884 use SendFinished 2015-04-01 13:55:50 -04:00
4e81083bb4 AES256 cipher template 2015-04-01 12:56:41 -04:00
0446a5ae73 moved encryption/decryption to TlsCipher 2015-04-01 12:03:58 -04:00
a2aec4340d Merge pull request #173 from hagen-i2p/readme-fix
* README.md
2015-04-01 10:37:05 -04:00
fda68c114c * README.md 2015-04-01 13:48:54 +00:00
de5c55160b count tunnel acceptance ratio for peer selection 2015-03-31 17:13:01 -04:00
d0ac6345c2 0.9.0 2015-03-31 08:34:55 -04:00
d9911f4314 save last update time 2015-03-30 21:05:04 -04:00
92bd29ebf1 delete trailing paddings of SSU packtes 2015-03-30 13:10:36 -04:00
00ac1f7ec9 check # of block to encrypt/decrypt for zero 2015-03-30 11:56:24 -04:00
12641ab0c0 fixed addressbook crash at shutdown 2015-03-30 10:21:52 -04:00
629b5ff171 fixed typo 2015-03-30 07:21:47 -04:00
6ec5858561 Merge pull request #170 from guanqun/fix-wrong-buffer-size
setup the correct buffer size
2015-03-30 07:04:48 -04:00
ab7550947a setup the correct buffer size 2015-03-30 09:26:37 +08:00
f2078f6d5b schedule interoducers again if still testing 2015-03-29 21:05:12 -04:00
1a440e3a83 count non-replied tunnel build requests 2015-03-28 16:09:34 -04:00
b8acce115f repeat peer test if previous was not successive 2015-03-28 14:57:39 -04:00
577ba9b397 initial filtration of bad peers 2015-03-27 20:34:31 -04:00
5f199432f0 proper size of remaining data 2015-03-27 16:31:53 -04:00
8b10fc497d pass correct datagram size 2015-03-27 16:09:43 -04:00
e80d09aa17 fixed typo 2015-03-27 15:50:24 -04:00
4c1e12921a restore imcomplete string back 2015-03-27 15:29:46 -04:00
1824a9a38e try to receive remanining message 2015-03-27 15:22:56 -04:00
3e59535a53 try to receive remanining message 2015-03-27 14:58:26 -04:00
8c174cd548 merge incomplete DATAGRAM SEND message 2015-03-27 14:36:54 -04:00
2a4d1c978e process multiple DATAGRAM SEND message 2015-03-27 14:02:27 -04:00
cc91a6d96f send ports with datagram 2015-03-27 11:29:40 -04:00
96ace89789 increase SAM connection buffer size 2015-03-27 09:44:27 -04:00
d226477852 Merge pull request #168 from guanqun/master
fix the 'sleep_for' missing error on linux platform
2015-03-27 06:59:18 -04:00
eddb5fa91e fix the 'sleep_for' missing error on linux platform 2015-03-27 10:48:26 +08:00
c92e00c21f proper verification for DSA_SHA1 2015-03-26 22:17:26 -04:00
f07d29bc8a handle DATAGRAM SEND 2015-03-26 21:23:59 -04:00
f7b4cbc94a Merge pull request #167 from guanqun/fix-readme
fix tab in README.md
2015-03-26 16:14:47 -04:00
d226a4a0b7 store session with Alice with PeerTest 2015-03-26 16:10:52 -04:00
c62659cdbc single buf for ProcessPeerTest 2015-03-26 15:05:52 -04:00
4831e9705c const buffer for ProcessPeerTest 2015-03-26 14:35:20 -04:00
fce74a710f fix tab in README.md 2015-03-26 23:31:03 +08:00
39641f05b9 create datagram destination for DATAGRAM session 2015-03-26 11:15:29 -04:00
2a23537dbd check lease expiration with threshold 2015-03-26 10:30:29 -04:00
ca3b9f253d pass data for streams only 2015-03-25 22:23:41 -04:00
1a0abfbc06 create keys only by DEST GENERATE 2015-03-25 19:13:30 -04:00
6e9149afd4 fixed misalignment 2015-03-25 09:04:19 -04:00
0a7bf4db47 load profiles 2015-03-25 08:45:50 -04:00
8a790fd0b3 Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-03-24 18:48:53 -04:00
fd3dab35cc collect and save participation agreed/declined stats 2015-03-24 18:48:16 -04:00
5fd179524f --host is deprecated 2015-03-24 13:33:29 -04:00
f8a7beb001 --host is deprectaed 2015-03-24 13:31:56 -04:00
02903cc98c moved Dockerfile to build 2015-03-24 13:31:01 -04:00
7c5993b1cd Merge pull request #166 from multikatt/docker
adding docker and fig files
2015-03-24 12:20:52 -05:00
a6f78134c0 Profiling added 2015-03-24 12:47:57 -04:00
21d4f49d31 adding docker and fig files 2015-03-24 12:47:43 -04:00
3f4bd13091 don't wait for remote LeaseSet request complete 2015-03-23 22:23:40 -04:00
6125288e95 select really other remote lease 2015-03-23 22:18:30 -04:00
7f91c9e63e close stream is SYN has not been received 2015-03-23 18:07:43 -04:00
ec319f950f add random milliseconds to end date 2015-03-23 15:53:20 -04:00
217ddfe98d fixed crash 2015-03-23 13:08:04 -04:00
57578a3aa3 Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-03-23 12:56:47 -04:00
9a7e21778e eliminate misalignment for LeaseSet 2015-03-23 12:55:42 -04:00
cdb42b33ce Removed external IP detection step 2015-03-22 18:42:18 -04:00
4b47bfb5db re-request remote LeaseSet 2015-03-22 18:34:39 -04:00
18deb8b4f2 DeliveryStatus for LeaseSet 2015-03-22 14:59:27 -04:00
e58ebb8656 increased transit tunnels # to 2500 2015-03-21 18:39:48 -04:00
05d7b79d07 proper formatting 2015-03-21 18:35:17 -04:00
d5c43e66fa Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-03-21 16:26:33 -04:00
5f3b17af64 better resend and tunnel reselection algorithm 2015-03-21 16:26:14 -04:00
7bec2b8417 Merge pull request #165 from hagen-i2p/tun-config
* README : describe format of tunnels.cfg
2015-03-21 14:55:39 -05:00
70396240c3 * README : describe format of tunnels.cfg 2015-03-21 12:34:20 +00:00
ac79d8ed3e fixed misspelling 2015-03-20 21:13:06 -04:00
02de91f7f2 use unique_ptr for socket in I2PTunnelConnection 2015-03-20 16:04:48 -04:00
77fd296095 wait for LeaseSet request completion 2015-03-20 15:53:53 -04:00
1cc3dd5ee4 send I2PControl response without write_json 2015-03-20 14:45:22 -04:00
41ad5d12a3 use propery tree for params 2015-03-20 11:36:57 -04:00
b26c960450 fixed outgoing message size 2015-03-19 22:18:18 -04:00
7ea12ddd61 RouterInfo version and status 2015-03-19 21:51:18 -04:00
4e1e47d9e5 always use 'O' class for high-bandwidth 2015-03-19 11:52:46 -04:00
3ccc8d9508 badwidth parameter 2015-03-19 11:14:21 -04:00
123e6b7de4 made keys parameter optional for client tunnels 2015-03-19 10:22:01 -04:00
1caacaacf0 UpdateStats for RouterContext 2015-03-18 15:36:07 -04:00
0b754ec65d publish number of leasets and routers for floodfill 2015-03-18 15:06:15 -04:00
647bb501d1 make sure packet size is multiple of 16 bytes 2015-03-18 13:30:38 -04:00
47c3d5ed23 don't accept tunnels if bandwidth is exceeded 2015-03-18 13:07:11 -04:00
b693d13144 Merge pull request #164 from ir4y/master
Add libi2pd.so to .gitignore
2015-03-18 06:17:45 -05:00
a5ada6f487 Add libi2pd.so to .gitignore 2015-03-18 11:26:17 +06:00
60351f2677 send exporatory message directly if connected to a floodfill 2015-03-17 20:56:51 -04:00
1e2f038ef5 proper badnwidth calculation 2015-03-17 19:04:58 -04:00
708e17162c handle i2p.router.net.bw requests 2015-03-17 15:36:15 -04:00
60c60b4db1 calculate bandwidth 2015-03-17 15:19:38 -04:00
a09c67772c specify keys file for proxy's local destination 2015-03-17 11:44:01 -04:00
028e3a6c35 show total send/received bytes 2015-03-16 19:33:59 -04:00
a72d7652af moved num sent/received bytes to TransportSession 2015-03-16 18:57:22 -04:00
76ad7f24ee access list for server tunnels 2015-03-16 14:52:42 -04:00
1ac689b886 Merge pull request #163 from ygrishin/master
Added MTU detection code for Windows XP and newer
2015-03-15 15:32:26 -04:00
f32399454c Whitespace to follow coding style convention 2015-03-15 10:07:39 -07:00
f2665262f7 Added MTU detection code for Windows 2015-03-15 08:51:07 -07:00
fee68cf333 read optional destination port form config 2015-03-15 11:28:30 -04:00
1d737409ec fill padding with random data 2015-03-14 17:15:23 -04:00
897af615f9 create persistent destinations with ECDSA 2015-03-13 22:11:51 -04:00
ea6597c3ad .ini file format for tunnel.cfg 2015-03-13 19:51:31 -04:00
5a31d2e817 read tunnels.cfg using property tree 2015-03-13 16:05:39 -04:00
09f1966e5f pass destination port to client tunnel 2015-03-13 13:29:27 -04:00
ad649aba48 reduce memory usage 2015-03-12 22:38:22 -04:00
c7edc36106 reduce memory usage 2015-03-12 16:26:08 -04:00
57d4ccfdfd reduced memory usage 2015-03-12 11:43:36 -04:00
550f9de41a fixed memory corruption 2015-03-12 07:31:46 -04:00
f3aab569ca don't return error if received data is available 2015-03-11 21:43:30 -04:00
2f9e510f4f check I2NP message size for saved fragments 2015-03-11 14:34:39 -04:00
1d7fd8ac96 reduce memory usage 2015-03-11 13:24:13 -04:00
ccb4e967cf fixed crash 2015-03-11 12:17:38 -04:00
08f5af68f0 reduce memory usage 2015-03-11 11:28:51 -04:00
d51b87e80a reduced memory usage 2015-03-10 21:54:25 -04:00
c2edbdc487 drop RTO to initial if tunnels pair changes 2015-03-10 18:51:04 -04:00
5bc854bedc reduced memory usage 2015-03-10 15:38:37 -04:00
3e889ee06c resend packing with RTO interval 2015-03-10 11:11:42 -04:00
9c338a5c81 don't lost received data 2015-03-09 22:05:26 -04:00
d13b4f6698 send FIN if closed by peer 2015-03-09 21:37:51 -04:00
cd0933522d handle stream close depending on state 2015-03-09 12:06:35 -04:00
dc599bbc63 stream status 2015-03-08 19:36:33 -04:00
4b82e90ffb send proper send time for NACK reply 2015-03-07 20:16:31 -05:00
36de881041 send close after buffer 2015-03-06 21:39:05 -05:00
e0f80c9f91 save and check token 2015-03-06 11:33:54 -05:00
55f6fe6d3a exclude Token from requests 2015-03-05 15:33:45 -05:00
42f314669f show router status through I2PControl 2015-03-05 15:17:16 -05:00
9d273acd42 resend message immediately if NACK recieved 2015-03-04 21:55:40 -05:00
7fbe2754a4 use v4 only sessions between Bob and Charlie 2015-03-04 12:50:31 -05:00
c0043e5098 send outstanding data on close 2015-03-03 22:46:52 -05:00
756e15fe19 fixed typo 2015-03-03 16:00:02 -05:00
d9218134e2 pass source and destination ports to datagram receiver 2015-03-03 15:31:49 -05:00
c66ba370d5 bind streaming destination to port for server tunnel 2015-03-03 14:52:16 -05:00
6fc0b2ecfb create additional streaming destination 2015-03-02 22:04:59 -05:00
7b938b246a choose streaming destination for destination port 2015-03-02 16:09:59 -05:00
45cb98c8de shared_ptr for streaming destination 2015-03-02 15:54:38 -05:00
0f8ea92a53 handle local destination port 2015-03-01 21:08:34 -05:00
ac57e7ced2 fixed typo 2015-03-01 17:13:55 -05:00
513dc2fcc5 don't use explicit unreachable parameter anymore 2015-03-01 07:55:03 -05:00
3c10ba4511 show base64 address 2015-02-28 20:12:21 -05:00
6f9d8ed01b show tunlel creation success ratio 2015-02-28 07:59:34 -05:00
3977cec408 fixed crash at startup 2015-02-27 17:58:01 -05:00
7949ffe41e fixed crash 2015-02-27 13:07:32 -05:00
bd9e68e69f fixed api build 2015-02-27 11:47:32 -05:00
ccf689ffd5 connect to introducer if not any yet 2015-02-26 21:05:35 -05:00
b95b49bd19 start unsing introducers after firewall detection 2015-02-26 19:19:03 -05:00
dc8209837c cleanup expired peer tests 2015-02-26 14:54:28 -05:00
582daffd7f select peer test capable routers 2015-02-26 14:17:16 -05:00
30715c2512 firewall detection 2015-02-26 13:44:18 -05:00
51aea367c3 full implementation of peer test 2015-02-25 21:56:51 -05:00
34e31f3d78 PeerTest from Alice to Charlie 2015-02-25 16:39:48 -05:00
e250628174 global peer tests 2015-02-25 15:26:06 -05:00
eee968ce56 fixed incorrect instantiation in gcc 4.6 2015-02-24 22:17:46 -05:00
52f806ff94 use shared_ptr for ClientDestination 2015-02-24 15:40:50 -05:00
58ebd8cc59 1 hours expiration of RI in case of floodfill 2015-02-24 11:58:39 -05:00
d08d1c9127 show uptime properly 2015-02-23 17:54:51 -05:00
1a307f3093 limit number of transit tunnels 2015-02-23 15:06:14 -05:00
dc18c012ed show uptime through I2PControl 2015-02-23 14:57:57 -05:00
c46a82420d show uptime 2015-02-23 14:41:56 -05:00
e002c05350 Merge branch 'master' of https://github.com/PurpleI2P/i2pd 2015-02-22 17:07:42 -05:00
6401ed71ae Update version.h
0.8.0
2015-02-22 17:05:52 -05:00
621bfde961 handle incoming connection failure 2015-02-22 17:04:42 -05:00
5b5c06179c original_at_mail.i2p.crt added 2015-02-22 09:12:43 -05:00
b187babd20 128 bytes key expansion 2015-02-21 22:07:55 -05:00
05e49bbeab show SAM sessions through web interface 2015-02-20 22:47:36 -05:00
c88c6a9b63 include https hosts to reseeder's list 2015-02-20 15:15:23 -05:00
8e795cc2aa include https hosts to reseeder's list 2015-02-20 15:11:00 -05:00
ad5bac6598 ClientKeyExchange length depend on key length from ceritifcate 2015-02-20 14:26:49 -05:00
0d468a8f48 extract https content 2015-02-20 12:21:33 -05:00
71dae29077 send and receive data 2015-02-20 10:47:44 -05:00
d1b26b72e3 proper handshake messages hash calculations 2015-02-19 22:13:41 -05:00
64a4799c8c fixed incorrect MAC calculation 2015-02-19 16:35:07 -05:00
e5d9c26868 use 256 bytes block for keys expansion 2015-02-19 13:50:04 -05:00
5deccd7833 calculate MAC 2015-02-19 11:26:37 -05:00
e1f64e2476 moved https code to TlsSession 2015-02-19 10:06:11 -05:00
cf5499375e encrypt finishes message 2015-02-18 22:25:30 -05:00
a3736fc06e tls encrypt and decrypt 2015-02-18 16:52:00 -05:00
68a03c2134 send ChangeCipherSpecs 2015-02-18 11:44:32 -05:00
dce8cf1af2 tls 1.2 and RSA_WITH_AES_256_CBC_SHA256 2015-02-18 10:28:29 -05:00
29d118a19a hanshakes hash and finishes message 2015-02-17 22:45:55 -05:00
ec50b97aa8 reduced amount of logging 2015-02-17 19:14:31 -05:00
fbf672288f MAC and encryption keys 2015-02-17 16:50:37 -05:00
47e8cfd91e calculate master secret 2015-02-17 15:34:30 -05:00
9968485cdd send ClientKeyExchange 2015-02-16 21:28:37 -05:00
6ea037cc47 process server certificate 2015-02-16 11:21:33 -05:00
c5f0be126e client hello for HTTPS 2015-02-15 23:03:04 -05:00
8db34a4d7f Merge branch 'master' of github.com:PurpleI2P/i2pd 2015-02-15 19:20:41 +00:00
732ff67076 New certificate; will be switched on the server for a future release. 2015-02-15 19:19:09 +00:00
e3190a4ca9 SSU data receive batching 2015-02-15 14:17:55 -05:00
f2c849703a Remove reseed host, no longer in use 2015-02-15 19:17:41 +00:00
e901307d8d fixed crash 2015-02-15 10:23:06 -05:00
e038467c89 unique_ptr for sent and incomplete messages 2015-02-14 22:24:10 -05:00
776582e019 fixed typo 2015-02-14 21:00:40 -05:00
018daa8837 catch sendto exception 2015-02-14 17:23:15 -05:00
10b733d215 don't throw exception 2015-02-14 17:20:21 -05:00
97ec65cccd read all sections from tunnels.cfg 2015-02-13 19:00:17 -05:00
d2d7b3b348 multiple server I2P tunnels 2015-02-13 15:56:57 -05:00
b0052eae05 doesn't create same local destination twice 2015-02-13 14:55:48 -05:00
ed692ffba3 make sure only one I2P tunnel per local prot 2015-02-13 10:18:42 -05:00
242bc3624a read tunnels.cfg 2015-02-12 22:20:07 -05:00
18121a99ca config file for I2PTunnels 2015-02-12 16:11:56 -05:00
93c2c13f96 fixed memory leak 2015-02-12 14:03:59 -05:00
b11fd250c1 fixed race condition 2015-02-12 11:40:42 -05:00
93857b690a fixed hand at shutdown 2015-02-11 22:48:26 -05:00
34d88db0b2 Merge pull request #158 from multikatt/master
typo: stoped->stopped
2015-02-11 22:10:07 -05:00
dcad550a2f typo: stoped->stopped 2015-02-11 21:06:52 -05:00
816e4d533d fixed race condition 2015-02-11 18:47:20 -05:00
53adf7a793 cleanup dead peers 2015-02-11 14:45:25 -05:00
0ed9dc4e93 complete session if presented 2015-02-10 17:36:39 -05:00
9eba7923a7 use insert instead [] 2015-02-10 16:51:47 -05:00
3263f6fefc ban abusing ipv6 addresses 2015-02-10 15:54:07 -05:00
a27dd17cef fixed memory leak 2015-02-10 15:51:56 -05:00
52f9d5f0aa ban abusing IPs 2015-02-10 13:05:08 -05:00
6783b22ad0 terminate non-responding NTCP sessions by timeout 2015-02-10 10:54:04 -05:00
a3c1c314d0 don't insert same transit tunnel twice 2015-02-10 09:39:49 -05:00
d01f3b094b allow netDb cleanup after every 500 messages 2015-02-10 09:30:48 -05:00
8492e87d29 fxied race condition 2015-02-09 22:19:29 -05:00
923b64eb48 delete messages sent to disconnected session 2015-02-09 16:33:52 -05:00
89883e2078 don't look for session if a packet is from same endpoint as previous 2015-02-09 14:50:19 -05:00
23907e6cb1 don't look for session if a packet is from same endpoint as previous 2015-02-09 14:48:01 -05:00
c6c414c382 receive multiple UDP packets 2015-02-09 11:53:11 -05:00
c349652a27 terminate receivers 2015-02-08 21:12:38 -05:00
f9731a76ec separate receivers thread 2015-02-08 20:28:18 -05:00
7dd159add2 use 'available' method 2015-02-08 20:27:17 -05:00
1ad04bf8bf read more data from socket if available 2015-02-08 11:52:03 -05:00
6064d12af3 Sync reseed servers with the java router
contrib/certificates/ssl/netdb.i2p2.no2.crt will be needed
when netdb.i2p2.no updates to a stronger certificate later this year
2015-02-08 16:27:01 +00:00
9b7820a09d clean obsolete SSU data 2015-02-08 09:15:13 -05:00
e5fdee272b clean obsolete SSU data 2015-02-08 08:50:05 -05:00
a80e4ef0ea fixed memory leak 2015-02-07 17:58:29 -05:00
ab0bd908ec fixed race condition 2015-02-07 15:25:06 -05:00
9c7fcfbe3f Merge pull request #157 from klondi/httpproxy
Get Jump services working again although, at what price!
2015-02-07 13:34:31 -05:00
1bbaa5ba22 URLdecode the base64 part of the key 2015-02-07 18:34:25 +01:00
b22423e2d5 Get Jump services working again although, at what price\! 2015-02-07 17:57:16 +01:00
5730b15f01 fixed race condition 2015-02-06 20:53:48 -05:00
8305fd5f82 check if connection to peer exists already 2015-02-06 18:37:37 -05:00
0518b08ca6 drop second incoming connection with same identity 2015-02-06 16:03:47 -05:00
8e75d8c39a check accepted socket for error 2015-02-06 13:49:00 -05:00
6beb527058 teminate non-connected NTCP session 2015-02-06 11:14:41 -05:00
b9e3931e80 use shared_ptr for inbound tunnels 2015-02-05 18:53:43 -05:00
7945126e86 use unique_ptr for requested destination 2015-02-05 13:36:28 -05:00
408a67f34f use unique_ptr for incomplete message 2015-02-05 12:13:37 -05:00
0dac2a74d3 check for duplicate msgID 2015-02-04 22:16:44 -05:00
9896570e32 cleanup from extra log messages 2015-02-04 22:05:09 -05:00
9639ab7f1e fixed memory leak 2015-02-04 21:24:48 -05:00
778d1afda0 cleand destination requests every 15 seconds 2015-02-04 15:34:52 -05:00
02c22b850b fixed compilation bug for boost < 1.49 and boost 1.49 with gcc 4.7 2015-02-04 11:08:26 -05:00
bd035e1c3d fixed build for boost below 1.49 2015-02-04 09:40:00 -05:00
b923b1e31d Update version.h
release 0.7.0
2015-02-03 20:59:12 -05:00
14f448f4c7 show tunnels queue size 2015-02-03 16:45:19 -05:00
cd8e9e59fa don't request same RouterInfo twice 2015-02-03 16:14:33 -05:00
4a6847da8d RTT 2015-02-03 13:46:44 -05:00
c5a3832eae handle exploratory lookups 2015-02-02 22:34:55 -05:00
7f75d250c7 Merge pull request #151 from ygrishin/master
fixed HTTP connection being reset on Windows
2015-02-02 21:58:53 -05:00
95dbc20350 log more disgnostics data 2015-02-02 20:15:49 -05:00
f846b87590 make sure DeliveryStatus and DatabseStore are sent first 2015-02-02 16:08:35 -05:00
e3764bef37 fixed incorect reply data parsing for DatabaseStore 2015-02-02 13:06:02 -05:00
d7c5c24ce4 pass ident hash by value to transports thread 2015-02-02 12:01:21 -05:00
60ba7be319 floodfill parameter 2015-02-02 11:15:38 -05:00
2215dd7bd7 ability to turn floodfill off 2015-02-02 11:14:09 -05:00
07ce9c41bf DatabaseLookup flags 2015-02-02 11:06:36 -05:00
24564f1faa moved UPNP to common files 2015-02-02 09:58:34 -05:00
ba11971513 don't delete updated RouterInfo 2015-02-02 09:40:03 -05:00
803737011a fixed HTTP connection being reset on Windows 2015-02-01 22:24:47 -07:00
8ad9f2681c send 3 closest floodfills 2015-02-01 19:58:26 -05:00
b46c3036d8 flood 2015-02-01 18:30:27 -05:00
02ed7d6059 fixed non-responding destination request 2015-02-01 16:18:08 -05:00
2c2acae50d invoke acceptor on reset 2015-02-01 09:34:32 -05:00
ac438fbd7d use stream buffer for sending identity 2015-01-31 21:49:54 -05:00
feffbc9330 fixed typo 2015-01-31 10:39:29 -05:00
908404ab62 show send buffer size 2015-01-30 21:41:32 -05:00
618abd6320 use unique_ptr for sent fragments 2015-01-30 20:30:39 -05:00
79087f6942 detect congesion for first message in sned queue only 2015-01-30 16:43:31 -05:00
9a43f0d54c don't send DatabaseStore reply for local destinations 2015-01-30 15:29:33 -05:00
79af7c22d9 send DatabaseStore reply 2015-01-30 15:13:09 -05:00
0b911a5caa use I2NPMessagesHandler for SSU 2015-01-29 22:35:57 -05:00
aae837f642 congesion control during retransmission 2015-01-29 19:17:44 -05:00
5887e8c8c4 slow start and congestion avoidance 2015-01-29 15:34:43 -05:00
974a7ff3f5 shared_ptr for RoutingDestination 2015-01-28 21:37:08 -05:00
938fa00469 publishing with flood 2015-01-28 21:01:16 -05:00
679faf5149 specify reply token for RIs DatabaseStore 2015-01-28 16:16:25 -05:00
7e45233c7d floodfill parameter 2015-01-28 15:12:15 -05:00
2ed69ef602 clean up expired LeaseSets 2015-01-28 14:20:28 -05:00
192a08b5bf check tunnel status instead fidning it every time 2015-01-27 22:31:57 -05:00
763547f465 fixed corrupted NTCP messages 2015-01-27 19:12:27 -05:00
b3e08b2cf4 shared_ptr for tunnels 2015-01-27 14:55:46 -05:00
d1d6797d3e store LeaseSet as shared_ptr 2015-01-27 11:27:58 -05:00
4b094b2156 handle tunnel build messages in tunnels thread 2015-01-26 20:49:16 -05:00
562cdc12d1 check message type of follow on message 2015-01-26 14:48:24 -05:00
8f562215b0 separate inbound and outbound pending tunnels 2015-01-26 11:56:10 -05:00
8a478e4616 check for max number of NACKs 2015-01-25 22:01:09 -05:00
f75de6af82 window 2015-01-25 17:43:34 -05:00
a061f3339e use send buffer for a stream 2015-01-25 16:18:26 -05:00
724c417f09 fixed typo 2015-01-25 11:43:27 -05:00
9c23d03d8d fixed typo 2015-01-25 10:05:50 -05:00
b8740c008b fixed crash 2015-01-25 10:05:19 -05:00
588c613043 naming lookup of .b32 address through LeaseSet request 2015-01-24 15:34:46 -05:00
1dc166f0f8 transit tunnel gateway batching 2015-01-23 22:05:33 -05:00
82103e6a39 process TunnelGateway message in tunnel thread 2015-01-23 16:26:39 -05:00
33bce67a4e Update copyright
name changed to PurpleI2P
2015-01-23 14:03:41 -05:00
aeb3c8b8b9 Update LICENSE
name changed to PurpleI2P
2015-01-23 14:02:37 -05:00
24c00b0985 schedule routing session cleanup 2015-01-23 12:48:25 -05:00
a25646a129 cleanup routing sessions 2015-01-23 10:07:11 -05:00
0c73aff0a2 I2NPMessagesHandler 2015-01-22 22:00:41 -05:00
3ed1fee7ce remove stream on close 2015-01-22 19:02:28 -05:00
b269bda52b shared_ptr for GarlicRouting Session 2015-01-22 15:31:34 -05:00
2ab0ff8aea TransitTunnelParticipant 2015-01-21 21:50:46 -05:00
46a36f766f don't restart subscriptions update timer if no subscription presented 2015-01-21 16:34:50 -05:00
276d5097c1 fixed 'bad descriptor' exception 2015-01-21 15:59:05 -05:00
ec980edf56 don't look for tunnel again if tunnelID is the same as for previous message 2015-01-21 15:13:46 -05:00
89dead79c4 common HandleTunnelData for own and transit tunnels 2015-01-21 14:40:48 -05:00
e7f849184c some cleanup 2015-01-21 12:08:15 -05:00
c61cd350ee send multiple messages though single write call 2015-01-20 22:35:27 -05:00
ea353ac3ba send batch of I2NP messages 2015-01-20 21:05:57 -05:00
74c89ce06e proper cleanup of pending tunnels 2015-01-20 18:06:42 -05:00
42354ee5d5 removed useless mutex lock 2015-01-20 07:50:25 -05:00
e4d0fdaa56 Merge pull request #150 from chris-barry/patch-1
Update copyright
2015-01-19 22:29:45 -05:00
ebb5c53c3a use shared_ptr for TunnelPool 2015-01-19 22:28:13 -05:00
676892cb00 Update copyright
Changing Debian information to match information in root directory.
2015-01-19 21:06:30 -05:00
e09da5cb54 correct CRC32 verification at big endian CPU 2015-01-19 14:30:30 -05:00
027c43c99c Reseed through I2PControl 2015-01-19 13:57:37 -05:00
f5b937667a don't try to re-request expired LeaseSet 2015-01-19 12:31:14 -05:00
f36229bd95 make sure DatabaseStore message is first 2015-01-18 18:46:22 -05:00
3c9e6054b5 use shared local destination for proxies 2015-01-17 09:42:44 -05:00
284fb5458e fixed resolve bug 2015-01-17 08:22:43 -05:00
bf7b53a2a6 resolve address for NTCP 2015-01-16 23:01:40 -05:00
07c6f2a20b make HTTP header if necessary 2015-01-16 16:51:52 -05:00
514947ba49 skip HTTP header 2015-01-16 16:19:17 -05:00
f3fbf6bd89 address resolver for NTCP address 2015-01-16 15:25:44 -05:00
0f227e8317 For some reason, the daemon src don't include I2PControl.cpp for OSX
builds.
2015-01-16 20:37:52 +01:00
905aa7cdc4 Adding download link 2015-01-16 02:44:18 +01:00
25cc118890 I2PControl method 2015-01-15 16:42:28 -05:00
72a4f8a9a1 fixed crash on shutdown 2015-01-14 20:27:19 -05:00
e898e6bf82 use RouterInfo request callback instead timeout 2015-01-14 16:37:03 -05:00
ad9d7931f5 RequestComplete for RouterInfo 2015-01-14 16:11:09 -05:00
fb3c577601 handle i2p.router.netdb.activepeers 2015-01-14 13:24:25 -05:00
02b7cd71c5 handle i2p.router.netdb.activepeers 2015-01-14 13:21:41 -05:00
98e930bd46 moved delayed queue to Peer 2015-01-13 22:19:13 -05:00
3481161616 send messages through Peer 2015-01-13 21:31:39 -05:00
a3352ac1dc Merge pull request #148 from Nefelim4ag/master
Makefile fixes
2015-01-13 11:26:05 -05:00
214eb0caa5 Not overwrite -fPIC with CXXFLAGS 2015-01-13 15:14:52 +03:00
3a30c00dae Fix: mkdir exist in multi thread building 2015-01-13 12:55:14 +03:00
d971dff593 introduced Peer 2015-01-12 22:53:35 -05:00
1eef996701 NetworkSetting method 2015-01-12 14:31:45 -05:00
dcae7fc541 participating request 2015-01-12 14:03:20 -05:00
aeb2e235e5 use lookup tables for requests 2015-01-12 13:38:16 -05:00
ff856d2f20 fixed race condition 2015-01-12 12:15:54 -05:00
a15c2c5d86 license -> BSD 3-clause 2015-01-12 17:54:09 +02:00
c37d13af84 Merge pull request #147 from space-and-time/master
Fixed windows build, assertion failed
2015-01-12 07:29:03 -05:00
bf443265ff fixed boost\asio\detail\socket_types.hpp(24) fatal error C1189: "WinSock.h has already been included" 2015-01-12 08:53:24 +04:00
9ebe38e59d added I2PService to VS project 2015-01-12 08:50:22 +04:00
a85cc6aa77 fixed race condition 2015-01-11 21:00:38 -05:00
6683a9cf76 moved NTCP to separate thread 2015-01-11 17:41:56 -05:00
e3e0702813 fxied crash at startup 2015-01-11 17:40:11 -05:00
d8942a3359 use TransportSession for sending messages 2015-01-10 23:00:27 -05:00
4d25634b66 less agressive exploratory 2015-01-10 16:08:13 -05:00
717940d969 some cleanup 2015-01-10 09:07:07 -05:00
912146b1c9 shutdown and graceful shutdown through I2PControl 2015-01-09 22:27:52 -05:00
70b6c024bf handle i2p.router.netdb.knownpeers RouterInfo request 2015-01-09 11:58:14 -05:00
047f08b482 put dot-separated params 2015-01-09 11:12:22 -05:00
4ce3817d28 put dot-separated params 2015-01-09 11:11:35 -05:00
8910412068 pass results by reference 2015-01-09 10:28:16 -05:00
c61ed150b7 check for pending LeaseSet request 2015-01-08 22:04:41 -05:00
1bbb86d304 changed addressbook subscription update interval to 12 hours 2015-01-08 16:16:56 -05:00
2a76f1decd publish own RouterInfo every 40 minutes if nothing changed 2015-01-08 16:14:05 -05:00
f3548daede I2PControl Authenticate and Echo 2015-01-08 16:11:40 -05:00
efdadfd7c5 added I2PControl to ClientContext 2015-01-08 13:28:51 -05:00
e82507ca4e call TCPIPAccetor::Start from I2PClientTunnel::Start 2015-01-08 07:39:35 -05:00
d67db32015 Merge pull request #146 from klondi/i2pservice
I2pservice
2015-01-07 22:52:21 -05:00
56014962d4 Make I2PClientTunnel use TCPIPAcceptor 2015-01-08 03:49:35 +01:00
df3e8ce937 Move Stream creation to its own handler for cleanliness, it will hand over to a tunnel connection when done 2015-01-08 03:28:54 +01:00
7d9c0b76fc Make SOCKS use TCPIPAcceptor 2015-01-08 01:45:49 +01:00
8a6bea64bc Make the HTTP Proxy use TCPIPAcceptor 2015-01-08 01:35:42 +01:00
114022d18a Add the TCPIPAcceptor class for handling TCP/IP services on clearnet 2015-01-08 01:34:31 +01:00
a85af553b8 Merge branch 'master' of https://github.com/PrivacySolutions/i2pd 2015-01-07 16:51:09 -05:00
1cf5a0c948 Merge pull request #145 from klondi/i2pservice
Solve weak_ptr issue
2015-01-07 16:50:22 -05:00
6643b4188a Solve weak_ptr issue 2015-01-07 22:49:28 +01:00
bc11689f35 extract params 2015-01-07 16:41:11 -05:00
0339a4f963 JSON parser 2015-01-07 16:09:32 -05:00
6a39f48a9e Merge pull request #144 from klondi/i2pservice
I2pservice
2015-01-07 16:01:56 -05:00
b3232b42db Use shared_from_this to avoid being killed easily on stop 2015-01-07 21:58:58 +01:00
c1a29b08ac Remove ClientContext.h dependency 2015-01-07 21:58:58 +01:00
75f6cc4319 Merge pull request #143 from klondi/i2pservice
I2pservice
2015-01-07 15:20:18 -05:00
bcbe207515 Make HTTPProxy use SIGNING_KEY_TYPE_DSA_SHA1 2015-01-07 21:15:04 +01:00
29039fd039 Merge with upstream 2015-01-07 20:47:47 +01:00
90005c8237 Migrate to I2Pservice 2015-01-07 20:44:24 +01:00
cdc0aa658a I2PControl added 2015-01-07 13:26:44 -05:00
dd42819a2f Create I2Pservice as a way to integrate service management, hide unnecessary handlers 2015-01-07 19:09:59 +01:00
88560d06a1 Merge pull request #141 from klondi/httpproxy
Force Connection: Close and allow http/1.1
2015-01-06 20:42:41 -05:00
cb8a465605 Force Connection: Close and allow http/1.1 2015-01-07 02:40:57 +01:00
fe13a85c0f read all available data from closed stream 2015-01-06 19:05:48 -05:00
89b6be91a3 Merge pull request #140 from klondi/httpproxy
Httpproxy
2015-01-06 19:00:41 -05:00
6aca908462 Initial HTTPProxy support by simply transferring control to a tunnel 2015-01-07 00:15:54 +01:00
634718d6b4 Detect null stream on I2PConnect 2015-01-07 00:15:54 +01:00
2fca028161 Remove unnecessary header 2015-01-07 00:15:54 +01:00
5e8d28abba Reorder SOCKS headers for cleanness 2015-01-07 00:15:54 +01:00
bc78460f63 Enter state BEFORE reading data to avoid race conditions 2015-01-07 00:15:54 +01:00
e228ba963d Merge pull request #139 from iShift/patch-1
fix deps for ubuntu/debian
2015-01-06 16:00:47 -05:00
63927fc1fa fix deps for ubuntu/debian
fix https://github.com/PrivacySolutions/i2pd/issues/137
2015-01-06 23:52:13 +03:00
cbcfe50eb5 Merge pull request #138 from klondi/master
Reintroduce Request verification, allow for extra data after connect request.
2015-01-06 12:51:25 -05:00
7da95bd28a Introduce missing call to request verification, so unknown address types and commands are handled properly, allow for extra socket data after the request for fast request sending, it will just be forwarded on I2PConnect 2015-01-06 18:49:00 +01:00
5444889715 Update version.h
Version updated
2015-01-06 07:52:36 -05:00
3e13a1feed long ElGamal private key 2015-01-05 19:32:46 -05:00
7e4c416bc1 Merge pull request #136 from klondi/master
Improve SOCKS, handle  .b32.i2p conversions into address book
2015-01-05 15:09:16 -05:00
882b559d3a Reduce the parsing to a single state machine, automatic removal of objects and destruction of sockets/streams 2015-01-05 20:17:07 +01:00
610fd2ac67 Reduce memory usage a bit 2015-01-05 20:17:07 +01:00
f383ebb718 Return adequate SOCKS replies 2015-01-05 20:17:07 +01:00
cb94d43092 Use the address book for conversion into .b32.i2p 2015-01-05 20:17:07 +01:00
8812a45607 DatabaseLookup for RouterInfo 2015-01-04 17:25:16 -05:00
37a374000c elimimated cast to ClearText 2015-01-04 09:33:19 -05:00
ac17f116be Merge pull request #134 from klondi/httpproxy
More SOCKS Proxy cleanups
2015-01-03 23:14:38 -05:00
ecf709cbba fill clear text buffer of BuildRequestRecord 2015-01-03 23:13:07 -05:00
225aa7fa6a Merge SOCKS4a and SOCKS5 request parsers, add stub support for SOCKS4 and IPv4 and IPv6 addresses on SOCKS5 2015-01-04 04:47:03 +01:00
46b16237b6 Use enums instead of magic numbers on SOCKS 2015-01-04 04:47:03 +01:00
7a387b9a9f Updating UPnP code for windows. (untested) 2015-01-04 00:06:43 +01:00
3c5e9ddd4e eliminated cast to ecnryptted build record 2015-01-03 16:31:44 -05:00
02851d7587 Merge branch 'master' of https://github.com/PrivacySolutions/i2pd 2015-01-03 16:30:07 -05:00
1b3652e135 Merge pull request #133 from klondi/httpproxy
SOCKS5 support
2015-01-03 16:29:41 -05:00
17ccaab792 Clean up SOCKS a bit 2015-01-03 22:18:05 +01:00
c9576dcdbe Add Initial SOCKS5 support 2015-01-03 22:10:03 +01:00
7acdc0a606 Libminiupnpc library support (v1.5 and v1.6), dynamic runtime linking. 2015-01-03 21:38:48 +01:00
f552f24e6e Following BSD standards 2015-01-03 21:35:30 +01:00
79d13eb6cb Fix Mac OSX build error. 2015-01-03 21:33:27 +01:00
41974b8c75 fixed race condition 2015-01-03 15:20:11 -05:00
729cc4330e Merge pull request #132 from klondi/httpproxy
SOCKSProxy
2015-01-03 10:30:29 -05:00
27d510d1b7 Handle port correctly 2015-01-03 16:16:27 +01:00
8a293f45fa eliminated cast to BuildResponse Record 2015-01-03 09:47:24 -05:00
44bc09b007 Rewrite SOCKS proxy parsing to allow for SOCKS5, also fix any remaining logs 2015-01-03 15:40:01 +01:00
b58d58ef29 Merge pull request #131 from klondi/httpproxy
Get SOCKS proxy back in working state
2015-01-03 08:03:28 -05:00
ba12331a11 Rewrite SOCKS proxy so it uses I2PTunnelConnection and I2PTunnel 2015-01-03 06:44:21 +01:00
b88b04515e Remove unnecessary RemoteLeaseSet 2015-01-03 06:44:21 +01:00
ba9a0c0b2e Fix strange indentation. 2015-01-03 06:44:21 +01:00
9237174026 request failed in destination is not ready 2015-01-02 22:37:46 -05:00
fd9a8fd2b1 eliminated cast to DatabaseStoreMsg 2015-01-02 21:11:40 -05:00
7b59ce61bb Merge pull request #130 from klondi/httpproxy
Clean up  I2PClientTunnel
2015-01-02 21:06:44 -05:00
1ae55e5872 Use the new asynchronous API on I2PClientTunnel and clean up after ourselves 2015-01-03 02:43:59 +01:00
6489230e68 Simplify and merge the identHash caching codepath on I2PClientTunnel 2015-01-03 02:17:01 +01:00
c05f411ba0 Fix a memory leak in ClientConnection 2015-01-03 02:07:55 +01:00
b30de01b12 eliminated cast to DeliveryStatus struct 2015-01-02 17:39:35 -05:00
79e1096eca process follow-on packets with zero send stream id 2015-01-02 10:04:57 -05:00
f1ae5817eb Merge pull request #129 from klondi/httpproxy
Asynchronous stream creation
2015-01-02 08:12:54 -05:00
a906d7f02f Allow for asynchronous creation of streams 2015-01-02 13:37:26 +01:00
50fb373655 Use i2p::data::SigningKeyType instead of uint16_t 2015-01-02 13:37:26 +01:00
29d1aa0146 more fixes of misalignment 2015-01-01 23:00:33 -05:00
fa4009821e Merge pull request #128 from klondi/httpproxy
Httpproxy
2015-01-01 19:12:11 -05:00
e5503c51b4 Allow for easy stream creation at LocalDestination (for now it's only synchronous) 2015-01-02 00:56:26 +01:00
ccb68088a8 Allow for I2PTunnels without LocalDestination 2015-01-02 00:56:21 +01:00
0f07b04627 eliminated TunnelGatewayHeader 2015-01-01 18:53:44 -05:00
bfc6274cd8 methods for I2NP header access 2015-01-01 16:51:15 -05:00
c5c0d2060c rollback 2015-01-01 11:18:24 -05:00
dde2b4a879 destroy local destination on 'clear' 2015-01-01 09:54:15 -05:00
df21a067ff print out number of NACKs 2015-01-01 09:53:30 -05:00
8c49f76534 copy request to buffer if LeaseSet is requested 2014-12-31 21:47:49 -05:00
96a9575049 Merge pull request #127 from klondi/alignmentfixes
Fix even more alignment problems
2014-12-31 14:06:53 -05:00
0a9368fc70 Merge pull request #126 from klondi/cmakefixes
Cmakefixes
2014-12-31 14:03:22 -05:00
84f7966a0b Fix even more alignment problems 2014-12-31 19:48:46 +01:00
8f7dea698e Allow disabling binary compilation (useful for multilib builds in Gentoo) 2014-12-31 19:46:09 +01:00
9e7e0a456d Use better install paths 2014-12-31 19:46:09 +01:00
64b47a29cf Fix library compilation 2014-12-31 19:46:09 +01:00
cbfe8b8232 invoke accepter after receiving remote identity 2014-12-30 22:37:14 -05:00
583838e2c2 fixed misalignment 2014-12-30 15:33:11 -05:00
7bfb73dacf LeaseSet database lookup 2014-12-30 12:25:08 -05:00
350e942b6a fixed windows build 2014-12-30 10:30:45 -05:00
ed82f388e6 Merge pull request #123 from klondi/master
Fix any remaning aliasing rules with propper memcpy wrappers
2014-12-30 09:50:28 -05:00
b5f624a10f Use htobuf16 for 0 value instead of htobe16buf 2014-12-30 15:42:24 +01:00
700c53e60a Fix any remaning aliasing rules with propper memcpy wrappers 2014-12-30 15:37:24 +01:00
2ed99ba245 fix calling individual targets
(broken in 82af922b40)

Otherwise commands like `make i2p` will fail.
2014-12-30 13:34:25 +00:00
472c5f542f Merge branch 'master' of https://github.com/torbjo/i2pd 2014-12-30 02:32:33 +00:00
1636187e26 Avoid aliasing problems by using special buf endian handling functions wrapping memcpy 2014-12-29 23:04:02 +01:00
4d640dac2a always use destination's thread to avoid race conditions 2014-12-29 14:29:55 -05:00
7bf11df3b8 Minor: Makefile - added mk_build_dir to .PHONY target 2014-12-29 17:40:55 +01:00
ddf2aa38cc Minor: fixed clang compile warning [-Wmismatched-tags] 2014-12-29 17:40:03 +01:00
e8c544c774 Merge pull request #120 from torbjo/master
Fixed building on OS X. - Tested and accepted :)
2014-12-29 17:31:36 +01:00
82af922b40 Fixed building on OS X.
I got it to work on OS X 10.10.2 using clang.

Note: I'm an OS noob :)
2014-12-29 17:12:05 +01:00
446e5fd665 report about termination after actual processing 2014-12-28 15:45:58 -05:00
7847982a57 fixed crash 2014-12-27 22:43:00 -05:00
86a7f96a46 take tunnels from exploratory pool only 2014-12-27 20:36:32 -05:00
da01ea997d wait from LeaseSet request comlete 2014-12-27 10:09:55 -05:00
59aa40e2b0 wait until LeaseSet request complete instead timeout 2014-12-26 21:06:24 -05:00
6fb5fa1c52 LeaseSet request complete callback 2014-12-26 19:09:44 -05:00
64df22def8 read reamaining data from closed stream 2014-12-26 08:55:24 -05:00
bbe403fb40 main netdb can request router info only 2014-12-25 21:13:51 -05:00
3547a4042c request and handle LeaseSets through local destination only 2014-12-25 16:47:15 -05:00
46ea2291fe read incoming data util it's available 2014-12-25 10:42:49 -05:00
66c2c7f789 wait until download complete 2014-12-25 08:41:21 -05:00
78c06bdd22 manage non-reponded database requests 2014-12-24 11:20:38 -05:00
afd69e4afd send if-none-match 2014-12-24 09:45:25 -05:00
ff7ff3b55b check status code 304 2014-12-24 07:48:18 -05:00
14e2c76799 Merge pull request #118 from hagen-i2p/make-deps
* new makefile target: deps
2014-12-24 07:19:24 -05:00
677e3585c9 * new makefile target: deps 2014-12-24 05:08:43 +00:00
e349facd65 HTTP 1.1 for addressbook 2014-12-23 21:03:00 -05:00
7b5e8a9661 check and update addressbook subscriptions 2014-12-23 13:57:09 -05:00
3f314d8355 merge chunked responses 2014-12-22 21:20:39 -05:00
325117114a fixed typo 2014-12-22 21:02:32 -05:00
e1d445ab50 parse HTTP header fields 2014-12-22 16:45:50 -05:00
b1b72d2d33 rolled back to HTTP 1.0 since chunked is not implemented 2014-12-22 16:10:32 -05:00
bb5e520a79 reduce minimal # of routers to 50 2014-12-22 15:14:49 -05:00
fd0069cb0e fixed merge conflict 2014-12-22 15:09:50 -05:00
52ee861d3a load subscriptions 2014-12-22 15:06:54 -05:00
42075e74ad fetch with HTTP/1.1 2014-12-22 18:01:59 +00:00
1e87aedbb8 Merge branch 'master' of https://github.com/PrivacySolutions/i2pd 2014-12-21 21:33:00 -05:00
5221e09b67 use VerifyDigest for verification 2014-12-21 21:32:21 -05:00
0972782553 delete useless field 2014-12-21 17:27:46 -05:00
425c746b87 typo fix 2014-12-21 21:48:30 +00:00
db2d0df2c4 download hosts.txt without proxy 2014-12-21 09:33:02 -05:00
da1397ff76 fixed build error 2014-12-20 21:21:43 -05:00
c009fc5d72 look for LeaseSet in shared local destination 2014-12-20 20:16:45 -05:00
993b4c92b0 slightly stricter use of mkdir/rm -rf 2014-12-20 20:11:55 +00:00
b26bc5c7f4 Add api target 2014-12-20 20:10:44 +00:00
e4cc15d19e Don't build the lib when making static binaries
Without this, building on 64-bit systems will fail.
2014-12-20 19:48:53 +00:00
e5c2022f71 Fix building in kFreeBSD
broken in 8c218bd5
2014-12-20 16:57:41 +00:00
b343c24a9f add explanatory comments to Makefiles 2014-12-20 16:57:41 +00:00
21e3778e69 Revert the 'clean-up' commits so that custom build-time flags can be set
These commits removed the 'NEEDED*' vars which were added so that CXX*
and LDFLAGS could be specified at build time. By doing away with these
and using solely CXXFLAGS and LDFLAGS, special flags cannot be added.
Indeed, specifying your own CXXFLAGS would cause the build to fail. We
want the build flags to be APPENDED, not overwritten.
2014-12-20 16:57:41 +00:00
f4f6e74ea2 process addressbook request response 2014-12-19 22:03:34 -05:00
c887f54740 fixed crash 2014-12-19 17:41:08 -05:00
1179731959 send request to addressbook link directly without proxy 2014-12-19 14:40:02 -05:00
91e833cdaf fixed crash at shutdown 2014-12-19 12:07:54 -05:00
84e5f30c70 delete local destination on session close 2014-12-18 18:48:36 -05:00
b007b66b15 store SAMSession by pointer 2014-12-17 19:02:16 -05:00
8b05455545 Cancel added 2014-12-17 15:31:13 -05:00
a44ca91409 terminate acceptor and sessions on stop 2014-12-17 15:21:50 -05:00
84235fe479 fixed typo 2014-12-17 11:42:16 -05:00
392 changed files with 58564 additions and 41783 deletions

2
.dir-locals.el Normal file
View File

@ -0,0 +1,2 @@
((c++-mode . ((indent-tabs-mode . t)))
(c-mode . ((mode . c++))))

20
.github/workflows/build-freebsd.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Build on FreeBSD
on: [push, pull_request]
jobs:
build:
runs-on: macos-latest
name: with UPnP
steps:
- uses: actions/checkout@v2
- name: Test in FreeBSD
id: test
uses: vmactions/freebsd-vm@v0.1.2
with:
usesh: true
prepare: pkg install -y devel/cmake devel/gmake devel/boost-libs security/openssl net/miniupnpc
run: |
cd build
cmake -DWITH_UPNP=ON -DCMAKE_BUILD_TYPE=Release .
gmake -j2

20
.github/workflows/build-osx.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Build on OSX
on: [push, pull_request]
jobs:
build:
name: With USE_UPNP=${{ matrix.with_upnp }}
runs-on: macOS-latest
strategy:
fail-fast: true
matrix:
with_upnp: ['yes', 'no']
steps:
- uses: actions/checkout@v2
- name: install packages
run: |
brew update
brew install boost miniupnpc openssl@1.1
- name: build application
run: make HOMEBREW=1 USE_UPNP=${{ matrix.with_upnp }} PREFIX=$GITHUB_WORKSPACE/output -j3

35
.github/workflows/build-windows.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Build on Windows
on: [push, pull_request]
defaults:
run:
shell: msys2 {0}
jobs:
build:
name: Building for ${{ matrix.arch }}
runs-on: windows-latest
strategy:
fail-fast: true
matrix:
include: [
{ msystem: MINGW64, arch: x86_64 },
{ msystem: MINGW32, arch: i686 }
]
steps:
- uses: actions/checkout@v2
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.msystem }}
install: base-devel mingw-w64-${{ matrix.arch }}-gcc mingw-w64-${{ matrix.arch }}-boost mingw-w64-${{ matrix.arch }}-openssl mingw-w64-${{ matrix.arch }}-miniupnpc
update: true
- name: build application
run: |
mkdir -p obj/Win32 obj/libi2pd obj/libi2pd_client obj/daemon
make USE_UPNP=yes DEBUG=no -j3
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
path: i2pd.exe

21
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Build on Ubuntu
on: [push, pull_request]
jobs:
build:
name: With USE_UPNP=${{ matrix.with_upnp }}
runs-on: ubuntu-16.04
strategy:
fail-fast: true
matrix:
with_upnp: ['yes', 'no']
steps:
- uses: actions/checkout@v2
- name: install packages
run: |
sudo add-apt-repository ppa:mhier/libboost-latest
sudo apt-get update
sudo apt-get install build-essential libboost1.74-dev libminiupnpc-dev libssl-dev zlib1g-dev
- name: build application
run: make USE_UPNP=${{ matrix.with_upnp }} -j3

46
.gitignore vendored
View File

@ -1,15 +1,22 @@
# i2pd
obj/*.o
*.o
router.info
router.keys
i2p
netDb
/i2pd
/libi2pd.a
/libi2pdclient.a
/libi2pd.so
/libi2pdclient.so
*.exe
# Autotools
autom4te.cache
.deps
stamp-h1
Makefile
#Makefile
config.h
config.h.in~
config.log
@ -229,3 +236,38 @@ pip-log.txt
#Mr Developer
.mr.developer.cfg
# Sphinx
docs/_build
/androidIdea/
# Doxygen
docs/generated
# emacs files
*~
*\#*
# gdb files
.gdb_history
# cmake makefile
build/Makefile
# debian stuff
.pc/
# qt
qt/i2pd_qt/*.autosave
qt/i2pd_qt/*.ui.bk*
qt/i2pd_qt/*.ui_*
#unknown android stuff
android/libs/
#various logs
*LOGS/
qt/build-*.sh*

54
.travis.yml Normal file
View File

@ -0,0 +1,54 @@
language: cpp
cache:
apt: true
os:
- linux
#- osx
dist: xenial
sudo: required
compiler:
- g++
- clang++
env:
global:
- MAKEFLAGS="-j 2"
matrix:
- BUILD_TYPE=make UPNP=ON MAKE_UPNP=yes
- BUILD_TYPE=make UPNP=OFF MAKE_UPNP=no
- BUILD_TYPE=cmake UPNP=ON MAKE_UPNP=yes
- BUILD_TYPE=cmake UPNP=OFF MAKE_UPNP=no
matrix:
exclude:
- os: osx
env: BUILD_TYPE=cmake UPNP=ON MAKE_UPNP=yes
- os: osx
env: BUILD_TYPE=cmake UPNP=OFF MAKE_UPNP=no
- os: linux
compiler: clang++
env: BUILD_TYPE=make UPNP=ON MAKE_UPNP=yes
- os: linux
compiler: clang++
env: BUILD_TYPE=make UPNP=OFF MAKE_UPNP=no
addons:
apt:
packages:
- build-essential
- cmake
- g++
- clang
- libboost-chrono-dev
- libboost-date-time-dev
- libboost-filesystem-dev
- libboost-program-options-dev
- libboost-system-dev
- libboost-thread-dev
- libminiupnpc-dev
- libssl-dev
before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libressl miniupnpc ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew outdated boost || brew upgrade boost ; fi
script:
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "cmake" ]]; then cd build && cmake -DCMAKE_BUILD_TYPE=Release -DWITH_UPNP=${UPNP} && make ; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$BUILD_TYPE" == "make" ]]; then make USE_UPNP=${MAKE_UPNP} ; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then make HOMEBREW=1 USE_UPNP=${MAKE_UPNP} ; fi

View File

@ -1,314 +0,0 @@
#include <string.h>
#include <inttypes.h>
#include <string>
#include <map>
#include <fstream>
#include <boost/filesystem.hpp>
#include "base64.h"
#include "util.h"
#include "Identity.h"
#include "Log.h"
#include "AddressBook.h"
namespace i2p
{
namespace client
{
class AddressBookFilesystemStorage: public AddressBookStorage
{
public:
AddressBookFilesystemStorage ();
bool GetAddress (const i2p::data::IdentHash& ident, i2p::data::IdentityEx& address) const;
void AddAddress (const i2p::data::IdentityEx& address);
void RemoveAddress (const i2p::data::IdentHash& ident);
int Load (std::map<std::string, i2p::data::IdentHash>& addresses);
int Save (const std::map<std::string, i2p::data::IdentHash>& addresses);
private:
boost::filesystem::path GetPath () const { return i2p::util::filesystem::GetDefaultDataDir() / "addressbook"; };
};
AddressBookFilesystemStorage::AddressBookFilesystemStorage ()
{
auto path = GetPath ();
if (!boost::filesystem::exists (path))
{
// Create directory is necessary
if (!boost::filesystem::create_directory (path))
LogPrint (eLogError, "Failed to create addressbook directory");
}
}
bool AddressBookFilesystemStorage::GetAddress (const i2p::data::IdentHash& ident, i2p::data::IdentityEx& address) const
{
auto filename = GetPath () / (ident.ToBase32() + ".b32");
std::ifstream f(filename.c_str (), std::ifstream::binary);
if (f.is_open ())
{
f.seekg (0,std::ios::end);
size_t len = f.tellg ();
if (len < i2p::data::DEFAULT_IDENTITY_SIZE)
{
LogPrint (eLogError, "File ", filename, " is too short. ", len);
return false;
}
f.seekg(0, std::ios::beg);
uint8_t * buf = new uint8_t[len];
f.read((char *)buf, len);
address.FromBuffer (buf, len);
delete[] buf;
return true;
}
else
return false;
}
void AddressBookFilesystemStorage::AddAddress (const i2p::data::IdentityEx& address)
{
auto filename = GetPath () / (address.GetIdentHash ().ToBase32() + ".b32");
std::ofstream f (filename.c_str (), std::ofstream::binary | std::ofstream::out);
if (f.is_open ())
{
size_t len = address.GetFullLen ();
uint8_t * buf = new uint8_t[len];
address.ToBuffer (buf, len);
f.write ((char *)buf, len);
delete[] buf;
}
else
LogPrint (eLogError, "Can't open file ", filename);
}
void AddressBookFilesystemStorage::RemoveAddress (const i2p::data::IdentHash& ident)
{
auto filename = GetPath () / (ident.ToBase32() + ".b32");
if (boost::filesystem::exists (filename))
boost::filesystem::remove (filename);
}
int AddressBookFilesystemStorage::Load (std::map<std::string, i2p::data::IdentHash>& addresses)
{
int num = 0;
auto filename = GetPath () / "addresses.csv";
std::ifstream f (filename.c_str (), std::ofstream::in); // in text mode
if (f.is_open ())
{
addresses.clear ();
while (!f.eof ())
{
std::string s;
getline(f, s);
if (!s.length())
continue; // skip empty line
size_t pos = s.find(',');
if (pos != std::string::npos)
{
std::string name = s.substr(0, pos++);
std::string addr = s.substr(pos);
i2p::data::IdentHash ident;
ident.FromBase32 (addr);
addresses[name] = ident;
num++;
}
}
LogPrint (eLogInfo, num, " addresses loaded");
}
else
LogPrint (eLogWarning, filename, " not found");
return num;
}
int AddressBookFilesystemStorage::Save (const std::map<std::string, i2p::data::IdentHash>& addresses)
{
int num = 0;
auto filename = GetPath () / "addresses.csv";
std::ofstream f (filename.c_str (), std::ofstream::out); // in text mode
if (f.is_open ())
{
for (auto it: addresses)
{
f << it.first << "," << it.second.ToBase32 () << std::endl;
num++;
}
LogPrint (eLogInfo, num, " addresses save");
}
else
LogPrint (eLogError, "Can't open file ", filename);
return num;
}
//---------------------------------------------------------------------
AddressBook::AddressBook (): m_IsLoaded (false), m_IsDowloading (false)
{
}
AddressBook::~AddressBook ()
{
if (m_Storage)
{
m_Storage->Save (m_Addresses);
delete m_Storage;
}
}
AddressBookStorage * AddressBook::CreateStorage ()
{
return new AddressBookFilesystemStorage ();
}
bool AddressBook::GetIdentHash (const std::string& address, i2p::data::IdentHash& ident)
{
auto pos = address.find(".b32.i2p");
if (pos != std::string::npos)
{
Base32ToByteStream (address.c_str(), pos, ident, 32);
return true;
}
else
{
pos = address.find (".i2p");
if (pos != std::string::npos)
{
auto identHash = FindAddress (address);
if (identHash)
{
ident = *identHash;
return true;
}
else
return false;
}
}
// if not .b32 we assume full base64 address
i2p::data::IdentityEx dest;
if (!dest.FromBase64 (address))
return false;
ident = dest.GetIdentHash ();
return true;
}
const i2p::data::IdentHash * AddressBook::FindAddress (const std::string& address)
{
if (!m_IsLoaded)
LoadHosts ();
if (m_IsLoaded)
{
auto it = m_Addresses.find (address);
if (it != m_Addresses.end ())
return &it->second;
}
return nullptr;
}
void AddressBook::InsertAddress (const std::string& address, const std::string& base64)
{
i2p::data::IdentityEx ident;
ident.FromBase64 (base64);
if (!m_Storage)
m_Storage = CreateStorage ();
m_Storage->AddAddress (ident);
m_Addresses[address] = ident.GetIdentHash ();
LogPrint (address,"->",ident.GetIdentHash ().ToBase32 (), ".b32.i2p added");
}
void AddressBook::InsertAddress (const i2p::data::IdentityEx& address)
{
if (!m_Storage)
m_Storage = CreateStorage ();
m_Storage->AddAddress (address);
}
bool AddressBook::GetAddress (const std::string& address, i2p::data::IdentityEx& identity)
{
if (!m_Storage)
m_Storage = CreateStorage ();
i2p::data::IdentHash ident;
if (!GetIdentHash (address, ident)) return false;
return m_Storage->GetAddress (ident, identity);
}
void AddressBook::LoadHostsFromI2P ()
{
std::string content;
int http_code = i2p::util::http::httpRequestViaI2pProxy("http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt", content);
if (http_code == 200)
{
std::ofstream f_save(i2p::util::filesystem::GetFullPath("hosts.txt").c_str(), std::ofstream::out);
if (f_save.is_open())
{
f_save << content;
f_save.close();
}
else
LogPrint("Can't write hosts.txt");
m_IsLoaded = false;
}
else
LogPrint ("Failed to download hosts.txt");
m_IsDowloading = false;
return;
}
void AddressBook::LoadHosts ()
{
if (!m_Storage)
m_Storage = CreateStorage ();
int numAddresses = m_Storage->Load (m_Addresses);
if (numAddresses > 0)
{
m_IsLoaded = true;
return;
}
// otherwise try hosts.txt
std::ifstream f (i2p::util::filesystem::GetFullPath ("hosts.txt").c_str (), std::ofstream::in); // in text mode
if (!f.is_open ())
{
LogPrint ("hosts.txt not found. Try to load...");
if (!m_IsDowloading)
{
m_IsDowloading = true;
std::thread load_hosts(&AddressBook::LoadHostsFromI2P, this);
load_hosts.detach();
}
return;
}
std::string s;
while (!f.eof ())
{
getline(f, s);
if (!s.length())
continue; // skip empty line
size_t pos = s.find('=');
if (pos != std::string::npos)
{
std::string name = s.substr(0, pos++);
std::string addr = s.substr(pos);
i2p::data::IdentityEx ident;
ident.FromBase64(addr);
m_Addresses[name] = ident.GetIdentHash ();
m_Storage->AddAddress (ident);
numAddresses++;
}
}
LogPrint (numAddresses, " addresses loaded");
m_Storage->Save (m_Addresses);
m_IsLoaded = true;
}
}
}

View File

@ -1,59 +0,0 @@
#ifndef ADDRESS_BOOK_H__
#define ADDRESS_BOOK_H__
#include <string.h>
#include <string>
#include <map>
#include "base64.h"
#include "util.h"
#include "Identity.h"
#include "Log.h"
namespace i2p
{
namespace client
{
class AddressBookStorage // interface for storage
{
public:
virtual ~AddressBookStorage () {};
virtual bool GetAddress (const i2p::data::IdentHash& ident, i2p::data::IdentityEx& address) const = 0;
virtual void AddAddress (const i2p::data::IdentityEx& address) = 0;
virtual void RemoveAddress (const i2p::data::IdentHash& ident) = 0;
virtual int Load (std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
virtual int Save (const std::map<std::string, i2p::data::IdentHash>& addresses) = 0;
};
class AddressBook
{
public:
AddressBook ();
~AddressBook ();
bool GetIdentHash (const std::string& address, i2p::data::IdentHash& ident);
bool GetAddress (const std::string& address, i2p::data::IdentityEx& identity);
const i2p::data::IdentHash * FindAddress (const std::string& address);
void InsertAddress (const std::string& address, const std::string& base64); // for jump service
void InsertAddress (const i2p::data::IdentityEx& address);
private:
AddressBookStorage * CreateStorage ();
private:
void LoadHosts ();
void LoadHostsFromI2P ();
std::map<std::string, i2p::data::IdentHash> m_Addresses;
AddressBookStorage * m_Storage;
bool m_IsLoaded, m_IsDowloading;
};
}
}
#endif

656
BOB.cpp
View File

@ -1,656 +0,0 @@
#include <string.h>
#include <boost/lexical_cast.hpp>
#include "Log.h"
#include "NetDb.h"
#include "ClientContext.h"
#include "BOB.h"
namespace i2p
{
namespace client
{
BOBI2PInboundTunnel::BOBI2PInboundTunnel (boost::asio::io_service& service, int port, ClientDestination * localDestination):
BOBI2PTunnel (service, localDestination),
m_Acceptor (service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)),
m_Timer (service)
{
}
BOBI2PInboundTunnel::~BOBI2PInboundTunnel ()
{
Stop ();
}
void BOBI2PInboundTunnel::Start ()
{
m_Acceptor.listen ();
Accept ();
}
void BOBI2PInboundTunnel::Stop ()
{
m_Acceptor.close();
ClearConnections ();
}
void BOBI2PInboundTunnel::Accept ()
{
auto receiver = new AddressReceiver ();
receiver->socket = new boost::asio::ip::tcp::socket (GetService ());
m_Acceptor.async_accept (*receiver->socket, std::bind (&BOBI2PInboundTunnel::HandleAccept, this,
std::placeholders::_1, receiver));
}
void BOBI2PInboundTunnel::HandleAccept (const boost::system::error_code& ecode, AddressReceiver * receiver)
{
if (!ecode)
{
Accept ();
ReceiveAddress (receiver);
}
else
{
delete receiver->socket;
delete receiver;
}
}
void BOBI2PInboundTunnel::ReceiveAddress (AddressReceiver * receiver)
{
receiver->socket->async_read_some (boost::asio::buffer(
receiver->buffer + receiver->bufferOffset,
BOB_COMMAND_BUFFER_SIZE - receiver->bufferOffset),
std::bind(&BOBI2PInboundTunnel::HandleReceivedAddress, this,
std::placeholders::_1, std::placeholders::_2, receiver));
}
void BOBI2PInboundTunnel::HandleReceivedAddress (const boost::system::error_code& ecode, std::size_t bytes_transferred,
AddressReceiver * receiver)
{
if (ecode)
{
LogPrint ("BOB inbound tunnel read error: ", ecode.message ());
delete receiver->socket;
delete receiver;
}
else
{
receiver->bufferOffset += bytes_transferred;
receiver->buffer[receiver->bufferOffset] = 0;
char * eol = strchr (receiver->buffer, '\n');
if (eol)
{
*eol = 0;
receiver->data = (uint8_t *)eol + 1;
receiver->dataLen = receiver->bufferOffset - (eol - receiver->buffer + 1);
i2p::data::IdentHash ident;
if (!context.GetAddressBook ().GetIdentHash (receiver->buffer, ident))
{
LogPrint (eLogError, "BOB address ", receiver->buffer, " not found");
delete receiver->socket;
delete receiver;
return;
}
auto leaseSet = GetLocalDestination ()->FindLeaseSet (ident);
if (leaseSet)
CreateConnection (receiver, leaseSet);
else
{
i2p::data::netdb.RequestDestination (ident, true, GetLocalDestination ()->GetTunnelPool ());
m_Timer.expires_from_now (boost::posix_time::seconds (I2P_TUNNEL_DESTINATION_REQUEST_TIMEOUT));
m_Timer.async_wait (std::bind (&BOBI2PInboundTunnel::HandleDestinationRequestTimer,
this, std::placeholders::_1, receiver, ident));
}
}
else
{
if (receiver->bufferOffset < BOB_COMMAND_BUFFER_SIZE)
ReceiveAddress (receiver);
else
{
LogPrint ("BOB missing inbound address ");
delete receiver->socket;
delete receiver;
}
}
}
}
void BOBI2PInboundTunnel::HandleDestinationRequestTimer (const boost::system::error_code& ecode, AddressReceiver * receiver, i2p::data::IdentHash ident)
{
if (ecode != boost::asio::error::operation_aborted)
{
auto leaseSet = GetLocalDestination ()->FindLeaseSet (ident);
if (leaseSet)
{
CreateConnection (receiver, leaseSet);
return;
}
else
LogPrint ("LeaseSet for BOB inbound destination not found");
}
delete receiver->socket;
delete receiver;
}
void BOBI2PInboundTunnel::CreateConnection (AddressReceiver * receiver, const i2p::data::LeaseSet * leaseSet)
{
LogPrint ("New BOB inbound connection");
auto connection = std::make_shared<I2PTunnelConnection>(this, receiver->socket, leaseSet);
AddConnection (connection);
connection->I2PConnect (receiver->data, receiver->dataLen);
delete receiver;
}
BOBI2POutboundTunnel::BOBI2POutboundTunnel (boost::asio::io_service& service, const std::string& address, int port,
ClientDestination * localDestination, bool quiet): BOBI2PTunnel (service, localDestination),
m_Endpoint (boost::asio::ip::address::from_string (address), port), m_IsQuiet (quiet)
{
}
void BOBI2POutboundTunnel::Start ()
{
Accept ();
}
void BOBI2POutboundTunnel::Stop ()
{
ClearConnections ();
}
void BOBI2POutboundTunnel::Accept ()
{
auto localDestination = GetLocalDestination ();
if (localDestination)
localDestination->AcceptStreams (std::bind (&BOBI2POutboundTunnel::HandleAccept, this, std::placeholders::_1));
else
LogPrint ("Local destination not set for server tunnel");
}
void BOBI2POutboundTunnel::HandleAccept (std::shared_ptr<i2p::stream::Stream> stream)
{
if (stream)
{
auto conn = std::make_shared<I2PTunnelConnection> (this, stream, new boost::asio::ip::tcp::socket (GetService ()), m_Endpoint, m_IsQuiet);
AddConnection (conn);
conn->Connect ();
}
}
BOBDestination::BOBDestination (boost::asio::io_service& service, ClientDestination& localDestination):
m_Service (service), m_LocalDestination (localDestination),
m_OutboundTunnel (nullptr), m_InboundTunnel (nullptr)
{
}
BOBDestination::~BOBDestination ()
{
delete m_OutboundTunnel;
delete m_InboundTunnel;
}
void BOBDestination::Start ()
{
if (m_OutboundTunnel) m_OutboundTunnel->Start ();
if (m_InboundTunnel) m_InboundTunnel->Start ();
}
void BOBDestination::Stop ()
{
StopTunnels ();
m_LocalDestination.Stop ();
}
void BOBDestination::StopTunnels ()
{
if (m_OutboundTunnel)
{
m_OutboundTunnel->Stop ();
delete m_OutboundTunnel;
m_OutboundTunnel = nullptr;
}
if (m_InboundTunnel)
{
m_InboundTunnel->Stop ();
delete m_InboundTunnel;
m_InboundTunnel = nullptr;
}
}
void BOBDestination::CreateInboundTunnel (int port)
{
if (!m_InboundTunnel)
m_InboundTunnel = new BOBI2PInboundTunnel (m_Service, port, &m_LocalDestination);
}
void BOBDestination::CreateOutboundTunnel (const std::string& address, int port, bool quiet)
{
if (!m_OutboundTunnel)
m_OutboundTunnel = new BOBI2POutboundTunnel (m_Service, address, port, &m_LocalDestination, quiet);
}
BOBCommandSession::BOBCommandSession (BOBCommandChannel& owner):
m_Owner (owner), m_Socket (m_Owner.GetService ()), m_ReceiveBufferOffset (0),
m_IsOpen (true), m_IsQuiet (false), m_InPort (0), m_OutPort (0),
m_CurrentDestination (nullptr)
{
}
BOBCommandSession::~BOBCommandSession ()
{
}
void BOBCommandSession::Terminate ()
{
m_Socket.close ();
m_IsOpen = false;
}
void BOBCommandSession::Receive ()
{
m_Socket.async_read_some (boost::asio::buffer(m_ReceiveBuffer + m_ReceiveBufferOffset, BOB_COMMAND_BUFFER_SIZE - m_ReceiveBufferOffset),
std::bind(&BOBCommandSession::HandleReceived, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void BOBCommandSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("BOB command channel read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
size_t size = m_ReceiveBufferOffset + bytes_transferred;
m_ReceiveBuffer[size] = 0;
char * eol = strchr (m_ReceiveBuffer, '\n');
if (eol)
{
*eol = 0;
char * operand = strchr (m_ReceiveBuffer, ' ');
if (operand)
{
*operand = 0;
operand++;
}
else
operand = eol;
// process command
auto& handlers = m_Owner.GetCommandHandlers ();
auto it = handlers.find (m_ReceiveBuffer);
if (it != handlers.end ())
(this->*(it->second))(operand, eol - operand);
else
{
LogPrint (eLogError, "BOB unknown command ", m_ReceiveBuffer);
SendReplyError ("unknown command");
}
m_ReceiveBufferOffset = size - (eol - m_ReceiveBuffer) - 1;
memmove (m_ReceiveBuffer, eol + 1, m_ReceiveBufferOffset);
}
else
{
if (size < BOB_COMMAND_BUFFER_SIZE)
m_ReceiveBufferOffset = size;
else
{
LogPrint (eLogError, "Malformed input of the BOB command channel");
Terminate ();
}
}
}
}
void BOBCommandSession::Send (size_t len)
{
boost::asio::async_write (m_Socket, boost::asio::buffer (m_SendBuffer, len),
boost::asio::transfer_all (),
std::bind(&BOBCommandSession::HandleSent, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void BOBCommandSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("BOB command channel send error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
if (m_IsOpen)
Receive ();
else
Terminate ();
}
}
void BOBCommandSession::SendReplyOK (const char * msg)
{
#ifdef _MSC_VER
size_t len = sprintf_s (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_REPLY_OK, msg);
#else
size_t len = snprintf (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_REPLY_OK, msg);
#endif
Send (len);
}
void BOBCommandSession::SendReplyError (const char * msg)
{
#ifdef _MSC_VER
size_t len = sprintf_s (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_REPLY_ERROR, msg);
#else
size_t len = snprintf (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_REPLY_ERROR, msg);
#endif
Send (len);
}
void BOBCommandSession::SendVersion ()
{
size_t len = strlen (BOB_VERSION);
memcpy (m_SendBuffer, BOB_VERSION, len);
Send (len);
}
void BOBCommandSession::SendData (const char * nickname)
{
#ifdef _MSC_VER
size_t len = sprintf_s (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_DATA, nickname);
#else
size_t len = snprintf (m_SendBuffer, BOB_COMMAND_BUFFER_SIZE, BOB_DATA, nickname);
#endif
Send (len);
}
void BOBCommandSession::ZapCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: zap");
Terminate ();
}
void BOBCommandSession::QuitCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: quit");
m_IsOpen = false;
SendReplyOK ("Bye!");
}
void BOBCommandSession::StartCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: start ", m_Nickname);
if (!m_CurrentDestination)
{
m_CurrentDestination = new BOBDestination (m_Owner.GetService (),
*context.CreateNewLocalDestination (m_Keys, true, &m_Options));
m_Owner.AddDestination (m_Nickname, m_CurrentDestination);
}
if (m_InPort)
m_CurrentDestination->CreateInboundTunnel (m_InPort);
if (m_OutPort && !m_Address.empty ())
m_CurrentDestination->CreateOutboundTunnel (m_Address, m_OutPort, m_IsQuiet);
m_CurrentDestination->Start ();
SendReplyOK ("tunnel starting");
}
void BOBCommandSession::StopCommandHandler (const char * operand, size_t len)
{
auto dest = m_Owner.FindDestination (m_Nickname);
if (dest)
{
dest->StopTunnels ();
SendReplyOK ("tunnel stopping");
}
else
SendReplyError ("tunnel not found");
}
void BOBCommandSession::SetNickCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: setnick ", operand);
m_Nickname = operand;
std::string msg ("Nickname set to ");
msg += operand;
SendReplyOK (msg.c_str ());
}
void BOBCommandSession::GetNickCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: getnick ", operand);
m_CurrentDestination = m_Owner.FindDestination (operand);
if (m_CurrentDestination)
{
m_Keys = m_CurrentDestination->GetKeys ();
m_Nickname = operand;
std::string msg ("Nickname set to ");
msg += operand;
SendReplyOK (msg.c_str ());
}
else
SendReplyError ("tunnel not found");
}
void BOBCommandSession::NewkeysCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: newkeys");
m_Keys = i2p::data::PrivateKeys::CreateRandomKeys ();
SendReplyOK (m_Keys.GetPublic ().ToBase64 ().c_str ());
}
void BOBCommandSession::SetkeysCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: setkeys ", operand);
m_Keys.FromBase64 (operand);
SendReplyOK (m_Keys.GetPublic ().ToBase64 ().c_str ());
}
void BOBCommandSession::GetkeysCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: getkeys");
SendReplyOK (m_Keys.ToBase64 ().c_str ());
}
void BOBCommandSession::GetdestCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: getdest");
SendReplyOK (m_Keys.GetPublic ().ToBase64 ().c_str ());
}
void BOBCommandSession::OuthostCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: outhost ", operand);
m_Address = operand;
SendReplyOK ("outhost set");
}
void BOBCommandSession::OutportCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: outport ", operand);
m_OutPort = boost::lexical_cast<int>(operand);
SendReplyOK ("outbound port set");
}
void BOBCommandSession::InhostCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: inhost ", operand);
m_Address = operand;
SendReplyOK ("inhost set");
}
void BOBCommandSession::InportCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: inport ", operand);
m_InPort = boost::lexical_cast<int>(operand);
SendReplyOK ("inbound port set");
}
void BOBCommandSession::QuietCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: quiet");
m_IsQuiet = true;
SendReplyOK ("quiet");
}
void BOBCommandSession::LookupCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: lookup ", operand);
i2p::data::IdentityEx addr;
if (!context.GetAddressBook ().GetAddress (operand, addr))
{
SendReplyError ("Address Not found");
return;
}
SendReplyOK (addr.ToBase64 ().c_str ());
}
void BOBCommandSession::ClearCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: clear");
m_Owner.DeleteDestination (m_Nickname);
SendReplyOK ("cleared");
}
void BOBCommandSession::ListCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: list");
auto& destinations = m_Owner.GetDestinations ();
for (auto it: destinations)
SendData (it.first.c_str ());
SendReplyOK ("Listing done");
}
void BOBCommandSession::OptionCommandHandler (const char * operand, size_t len)
{
LogPrint (eLogDebug, "BOB: option ", operand);
const char * value = strchr (operand, '=');
if (value)
{
*(const_cast<char *>(value)) = 0;
m_Options[operand] = value + 1;
*(const_cast<char *>(value)) = '=';
SendReplyOK ("option");
}
else
SendReplyError ("malformed");
}
BOBCommandChannel::BOBCommandChannel (int port):
m_IsRunning (false), m_Thread (nullptr),
m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))
{
// command -> handler
m_CommandHandlers[BOB_COMMAND_ZAP] = &BOBCommandSession::ZapCommandHandler;
m_CommandHandlers[BOB_COMMAND_QUIT] = &BOBCommandSession::QuitCommandHandler;
m_CommandHandlers[BOB_COMMAND_START] = &BOBCommandSession::StartCommandHandler;
m_CommandHandlers[BOB_COMMAND_STOP] = &BOBCommandSession::StopCommandHandler;
m_CommandHandlers[BOB_COMMAND_SETNICK] = &BOBCommandSession::SetNickCommandHandler;
m_CommandHandlers[BOB_COMMAND_GETNICK] = &BOBCommandSession::GetNickCommandHandler;
m_CommandHandlers[BOB_COMMAND_NEWKEYS] = &BOBCommandSession::NewkeysCommandHandler;
m_CommandHandlers[BOB_COMMAND_GETKEYS] = &BOBCommandSession::GetkeysCommandHandler;
m_CommandHandlers[BOB_COMMAND_SETKEYS] = &BOBCommandSession::SetkeysCommandHandler;
m_CommandHandlers[BOB_COMMAND_GETDEST] = &BOBCommandSession::GetdestCommandHandler;
m_CommandHandlers[BOB_COMMAND_OUTHOST] = &BOBCommandSession::OuthostCommandHandler;
m_CommandHandlers[BOB_COMMAND_OUTPORT] = &BOBCommandSession::OutportCommandHandler;
m_CommandHandlers[BOB_COMMAND_INHOST] = &BOBCommandSession::InhostCommandHandler;
m_CommandHandlers[BOB_COMMAND_INPORT] = &BOBCommandSession::InportCommandHandler;
m_CommandHandlers[BOB_COMMAND_QUIET] = &BOBCommandSession::QuietCommandHandler;
m_CommandHandlers[BOB_COMMAND_LOOKUP] = &BOBCommandSession::LookupCommandHandler;
m_CommandHandlers[BOB_COMMAND_CLEAR] = &BOBCommandSession::ClearCommandHandler;
m_CommandHandlers[BOB_COMMAND_LIST] = &BOBCommandSession::ListCommandHandler;
m_CommandHandlers[BOB_COMMAND_OPTION] = &BOBCommandSession::OptionCommandHandler;
}
BOBCommandChannel::~BOBCommandChannel ()
{
Stop ();
for (auto it: m_Destinations)
delete it.second;
}
void BOBCommandChannel::Start ()
{
Accept ();
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&BOBCommandChannel::Run, this));
}
void BOBCommandChannel::Stop ()
{
for (auto it: m_Destinations)
it.second->Stop ();
m_IsRunning = false;
m_Service.stop ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = nullptr;
}
}
void BOBCommandChannel::Run ()
{
while (m_IsRunning)
{
try
{
m_Service.run ();
}
catch (std::exception& ex)
{
LogPrint (eLogError, "BOB: ", ex.what ());
}
}
}
void BOBCommandChannel::AddDestination (const std::string& name, BOBDestination * dest)
{
m_Destinations[name] = dest;
}
void BOBCommandChannel::DeleteDestination (const std::string& name)
{
auto it = m_Destinations.find (name);
if (it != m_Destinations.end ())
{
it->second->Stop ();
delete it->second;
m_Destinations.erase (it);
}
}
BOBDestination * BOBCommandChannel::FindDestination (const std::string& name)
{
auto it = m_Destinations.find (name);
if (it != m_Destinations.end ())
return it->second;
return nullptr;
}
void BOBCommandChannel::Accept ()
{
auto newSession = std::make_shared<BOBCommandSession> (*this);
m_Acceptor.async_accept (newSession->GetSocket (), std::bind (&BOBCommandChannel::HandleAccept, this,
std::placeholders::_1, newSession));
}
void BOBCommandChannel::HandleAccept(const boost::system::error_code& ecode, std::shared_ptr<BOBCommandSession> session)
{
if (ecode != boost::asio::error::operation_aborted)
Accept ();
if (!ecode)
{
LogPrint (eLogInfo, "New BOB command connection from ", session->GetSocket ().remote_endpoint ());
session->SendVersion ();
}
else
LogPrint (eLogError, "BOB accept error: ", ecode.message ());
}
}
}

238
BOB.h
View File

@ -1,238 +0,0 @@
#ifndef BOB_H__
#define BOB_H__
#include <inttypes.h>
#include <thread>
#include <memory>
#include <map>
#include <string>
#include <boost/asio.hpp>
#include "I2PTunnel.h"
#include "Identity.h"
#include "LeaseSet.h"
namespace i2p
{
namespace client
{
const size_t BOB_COMMAND_BUFFER_SIZE = 1024;
const char BOB_COMMAND_ZAP[] = "zap";
const char BOB_COMMAND_QUIT[] = "quit";
const char BOB_COMMAND_START[] = "start";
const char BOB_COMMAND_STOP[] = "stop";
const char BOB_COMMAND_SETNICK[] = "setnick";
const char BOB_COMMAND_GETNICK[] = "getnick";
const char BOB_COMMAND_NEWKEYS[] = "newkeys";
const char BOB_COMMAND_GETKEYS[] = "getkeys";
const char BOB_COMMAND_SETKEYS[] = "setkeys";
const char BOB_COMMAND_GETDEST[] = "getdest";
const char BOB_COMMAND_OUTHOST[] = "outhost";
const char BOB_COMMAND_OUTPORT[] = "outport";
const char BOB_COMMAND_INHOST[] = "inhost";
const char BOB_COMMAND_INPORT[] = "inport";
const char BOB_COMMAND_QUIET[] = "quiet";
const char BOB_COMMAND_LOOKUP[] = "lookup";
const char BOB_COMMAND_CLEAR[] = "clear";
const char BOB_COMMAND_LIST[] = "list";
const char BOB_COMMAND_OPTION[] = "option";
const char BOB_VERSION[] = "BOB 00.00.10\nOK\n";
const char BOB_REPLY_OK[] = "OK %s\n";
const char BOB_REPLY_ERROR[] = "ERROR %s\n";
const char BOB_DATA[] = "NICKNAME %s\n";
class BOBI2PTunnel: public I2PTunnel
{
public:
BOBI2PTunnel (boost::asio::io_service& service, ClientDestination * localDestination):
I2PTunnel (service, localDestination) {};
virtual void Start () {};
virtual void Stop () {};
};
class BOBI2PInboundTunnel: public BOBI2PTunnel
{
struct AddressReceiver
{
boost::asio::ip::tcp::socket * socket;
char buffer[BOB_COMMAND_BUFFER_SIZE + 1]; // for destination base64 address
uint8_t * data;
size_t dataLen, bufferOffset;
AddressReceiver (): data (nullptr), dataLen (0), bufferOffset (0) {};
};
public:
BOBI2PInboundTunnel (boost::asio::io_service& service, int port, ClientDestination * localDestination);
~BOBI2PInboundTunnel ();
void Start ();
void Stop ();
private:
void Accept ();
void HandleAccept (const boost::system::error_code& ecode, AddressReceiver * receiver);
void ReceiveAddress (AddressReceiver * receiver);
void HandleReceivedAddress (const boost::system::error_code& ecode, std::size_t bytes_transferred,
AddressReceiver * receiver);
void HandleDestinationRequestTimer (const boost::system::error_code& ecode, AddressReceiver * receiver, i2p::data::IdentHash ident);
void CreateConnection (AddressReceiver * receiver, const i2p::data::LeaseSet * leaseSet);
private:
boost::asio::ip::tcp::acceptor m_Acceptor;
boost::asio::deadline_timer m_Timer;
};
class BOBI2POutboundTunnel: public BOBI2PTunnel
{
public:
BOBI2POutboundTunnel (boost::asio::io_service& service, const std::string& address, int port,
ClientDestination * localDestination, bool quiet);
void Start ();
void Stop ();
void SetQuiet () { m_IsQuiet = true; };
private:
void Accept ();
void HandleAccept (std::shared_ptr<i2p::stream::Stream> stream);
private:
boost::asio::ip::tcp::endpoint m_Endpoint;
bool m_IsQuiet;
};
class BOBDestination
{
public:
BOBDestination (boost::asio::io_service& service, ClientDestination& localDestination);
~BOBDestination ();
void Start ();
void Stop ();
void StopTunnels ();
void CreateInboundTunnel (int port);
void CreateOutboundTunnel (const std::string& address, int port, bool quiet);
const i2p::data::PrivateKeys& GetKeys () const { return m_LocalDestination.GetPrivateKeys (); };
private:
boost::asio::io_service& m_Service;
ClientDestination& m_LocalDestination;
BOBI2POutboundTunnel * m_OutboundTunnel;
BOBI2PInboundTunnel * m_InboundTunnel;
};
class BOBCommandChannel;
class BOBCommandSession: public std::enable_shared_from_this<BOBCommandSession>
{
public:
BOBCommandSession (BOBCommandChannel& owner);
~BOBCommandSession ();
void Terminate ();
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
void SendVersion ();
// command handlers
void ZapCommandHandler (const char * operand, size_t len);
void QuitCommandHandler (const char * operand, size_t len);
void StartCommandHandler (const char * operand, size_t len);
void StopCommandHandler (const char * operand, size_t len);
void SetNickCommandHandler (const char * operand, size_t len);
void GetNickCommandHandler (const char * operand, size_t len);
void NewkeysCommandHandler (const char * operand, size_t len);
void SetkeysCommandHandler (const char * operand, size_t len);
void GetkeysCommandHandler (const char * operand, size_t len);
void GetdestCommandHandler (const char * operand, size_t len);
void OuthostCommandHandler (const char * operand, size_t len);
void OutportCommandHandler (const char * operand, size_t len);
void InhostCommandHandler (const char * operand, size_t len);
void InportCommandHandler (const char * operand, size_t len);
void QuietCommandHandler (const char * operand, size_t len);
void LookupCommandHandler (const char * operand, size_t len);
void ClearCommandHandler (const char * operand, size_t len);
void ListCommandHandler (const char * operand, size_t len);
void OptionCommandHandler (const char * operand, size_t len);
private:
void Receive ();
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void Send (size_t len);
void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void SendReplyOK (const char * msg);
void SendReplyError (const char * msg);
void SendData (const char * nickname);
private:
BOBCommandChannel& m_Owner;
boost::asio::ip::tcp::socket m_Socket;
char m_ReceiveBuffer[BOB_COMMAND_BUFFER_SIZE + 1], m_SendBuffer[BOB_COMMAND_BUFFER_SIZE + 1];
size_t m_ReceiveBufferOffset;
bool m_IsOpen, m_IsQuiet;
std::string m_Nickname, m_Address;
int m_InPort, m_OutPort;
i2p::data::PrivateKeys m_Keys;
std::map<std::string, std::string> m_Options;
BOBDestination * m_CurrentDestination;
};
typedef void (BOBCommandSession::*BOBCommandHandler)(const char * operand, size_t len);
class BOBCommandChannel
{
public:
BOBCommandChannel (int port);
~BOBCommandChannel ();
void Start ();
void Stop ();
boost::asio::io_service& GetService () { return m_Service; };
void AddDestination (const std::string& name, BOBDestination * dest);
void DeleteDestination (const std::string& name);
BOBDestination * FindDestination (const std::string& name);
private:
void Run ();
void Accept ();
void HandleAccept(const boost::system::error_code& ecode, std::shared_ptr<BOBCommandSession> session);
private:
bool m_IsRunning;
std::thread * m_Thread;
boost::asio::io_service m_Service;
boost::asio::ip::tcp::acceptor m_Acceptor;
std::map<std::string, BOBDestination *> m_Destinations;
std::map<std::string, BOBCommandHandler> m_CommandHandlers;
public:
const decltype(m_CommandHandlers)& GetCommandHandlers () const { return m_CommandHandlers; };
const decltype(m_Destinations)& GetDestinations () const { return m_Destinations; };
};
}
}
#endif

665
ChangeLog Normal file
View File

@ -0,0 +1,665 @@
# for this file format description,
# see https://github.com/olivierlacan/keep-a-changelog
## [2.38.0] - 2021-03-17
### Added
- Publish ipv6 introducers
- Bind ipv6 or yggdrasil NTCP2 acceptor to specified address
- Support .b32.i2p addresses and hostnames for SAM STREAM CREATE
- ipv6 peer tests
- Publish iexp param for introducers
- Show ipv6 network status on the webconsole
- EdDSA signing keys can also be blinded
- Show router version on the webconsole
### Changed
- Rekey of all routers but floodfills to ECIES
- Increased number of precalculated x25519 keys to 15
- Don't publish LeaseSet without inbound tunnels
- Reseed from compatible address(ipv4 or ipv6)
- Recongnize v4 and v6 SSU addresses without host
- Inbound tunnel gateway must be ipv4 compatible
- Don't select next introducers from existing sessions
- Set X bandwidth for floodfill by default
### Fixed
- Incoming ECIES-x25519 session doesn't send updated LeaseSet
- Unique local address for server tunnels
- Race condition for LeaseSet creation in I2CP
- Relay tag for ipv6 introducer
- Already expired introducers
- Find connected router for first peer in tunnel
- Failed outgoing ECIES-x25519 session's tagset stays forever
- Yggdrasil address disappears if router becomes unreachable through ipv6
- Ignore SSU address/introducers if port is not specified
- Check identity and signature length for SSU SessionConfirmed
## [2.37.0] - 2021-03-15
### Added
- Address registration line for reg.i2p and stats.i2p through the web console
- "4" and "6" caps for addresses without published IP address
- Mesh and Proxy network statuses
- Symmetric NAT network status error
- Bind server tunnel connection to specified address
- lookuplocal BOB extended command
- address4 and address6 parameters to bind outgoing connections to
- Rekey of low-bandwidth routers to ECIES
- Popup notification windows when unable to parse config for Windows
### Changed
- Floodfills with "U" cap are not ignored anymore
- Check transports reachability between tunnel peers and between router and floodfill
- NTCP2 and reseed HTTP proxy support authorization now
- Show actual IP addresses for proxy connections
- Publish and handle SSU addreses without host
- Outbound tunnel endpoint must be ipv4 compatible
- Logging optimization
- Removed Windows service
### Fixed
- Incoming SSU session terminates after 5 seconds
- Outgoing NTCP2 ipv4 session even if ipv4 is disabled
- No incoming Yggdrasil connection if connected through NTCP2 proxy
- Race condition between tunnel build and floodfill requests decryption for ECIES routers
- Numeric bandwidth limitation
- Yggdrasil for Android
## [2.36.0] - 2021-02-15
### Added
- Encrypted lookup and publications to ECIES-x25519 floodfiils
- Yggdrasil transports and reseeds
- Dump addressbook in hosts.txt format
- Request RouterInfo through exploratory tunnels if direct connection to fllodfill is not possible
- Threads naming
- Check if public x25519 key is valid
- ECIES-X25519-AEAD-Ratchet for shared local destination
- LeaseSet creation timeout for I2CP session
- Resend RouterInfo after some interval for longer NTCP2 sessions
- Select reachable router of inbound tunnel gateway
- Reseed if no compatible routers in netdb
- Refresh on swipe in Android webconsole
### Changed
- reg.i2p for default addressbook instead inr.i2p
- ECIES-x25519 (crypto type 4) for new routers
- Try to connect to all compatible addresses from peer's RouterInfo
- Replace LeaseSet completely if store type changes
- Try ECIES-X25519-AEAD-Ratchet tag before ElGamal
- Don't detach ECIES-X25519-AEAD-Ratchet session from destination immediately
- Viewport and styles on error in HTTP proxy
- Don't create notification when Windows taskbar restarted
- Cumulative SSU ACK bitfields
- limit tunnel length to 8 hops
- Limit tunnels quantity to 16
### Fixed
- Handling chunked HTTP response in addressbook
- Missing ECIES-X25519-AEAD-Ratchet tags for multiple streams with the same destination
- Correct NAME for NAMING REPLY in SAM
- SSU crash on termination
- Offline signature length for stream close packet
- Don't send updated LeaseSet through a terminated session
- Decryption of follow-on ECIES-X25519-AEAD-Ratchet NSR messages
- Non-confirmed LeaseSet is resent too late for ECIES-X25519-AEAD-Ratchet session
## [2.35.0] - 2020-11-30
### Added
- ECIES-x25519 routers
- Random intro keys for SSU
- Graceful shutdown timer for windows
- Send queue for I2CP messages
- Update DSA router keys to EdDSA
- TCP_QUICKACK for NTCP2 sockets on Linux
### Changed
- Exclude floodfills with DSA signatures and < 0.9.28
- Random intervals between tunnel tests and manage for tunnel pools
- Don't replace an addressbook record by one with DSA signature
- Publish RouterInfo after update
- Create paired inbound tunnels if no inbound tunnels yet
- Reseed servers list
### Fixed
- Transient signature length, if different from identity
- Terminate I2CP session if destroyed
- RouterInfo publishing confirmation
- Check if ECIES-X25519-AEAD-Ratchet session expired before generating more tags
- Correct block size for delivery type local for ECIES-X25519-AEAD-Ratchet
## [2.34.0] - 2020-10-27
### Added
- Ping responses for streaming
- STREAM FORWARD for SAM
- Tunnels through ECIES-x25519 routers
- Single thread for I2CP
- Shared transient destination between proxies
- Database lookups from ECIES destinations with ratchets response
- Handle WebDAV HTTP methods
- Don't try to connect or build tunnels if offline
- Validate IP when trying connect to remote peer
- Handle ICMP responses and WinAPI errors for SSU
### Changed
- Removed NTCP
- Dropped gcc 4.7 support
- Encyption type 0,4 by default for client tunnels
- Stripped out some HTTP header for HTTP server response
- HTTP 1.1 addressbook requests
- Set LeaseSet type to 3 for ratchets if not specified
- Handle SSU v4 and v6 messages in one thread
- Eliminate DH keys thread
### Fixed
- Random crashes on I2CP session disconnect
- Stream through racthets hangs if first SYN was not acked
- Check "Last-Modified" instead "If-Modified-Since" for addressbook reponse
- Trim behind ECIESx25519 tags
- Few bugs with Android main activity
- QT visual and layout issues
## [2.33.0] - 2020-08-24
### Added
- Shared transient addresses
- crypto.ratchet.inboundTags paramater
- Multiple encryption keys through I2CP
- Pre-calculated x25519 ephemeral keys
- Change datagram routing path if nothing comes back in 10 seconds
- Shared routing path for datagram session
### Changed
- UDP tunnels send mix of repliable and raw datagrams in bulk
- Encrypt SSU packet again upon resend
- Start new tunnel message if remaining buffer is too small
- Use LeaseSet2 for ECIES-X25519-AEAD-Ratchet automatically
- Save new ECIES-X25519-AEAD-Ratchet session with NSR tagset
- Generate random padding lengths for ECIES-X25519-AEAD-Ratchet in bulk
- Webconsole layout
- Reseed servers list
### Fixed
- Don't connect through terminated SAM destination
- Differentiate UDP server sessions by port
- ECIES-X25519-AEAD-Ratchet through I2CP
- Don't save invalid address to AddressBook
- ECDSA signatures names in SAM
- AppArmor profile
## [2.32.1] - 2020-06-02
### Added
- Read explicit peers in tunnels config
### Fixed
- Generation of tags for detached sessions
- Non-updating LeaseSet1
- Start when deprecated websocket options present in i2pd.conf
## [2.32.0] - 2020-05-25
### Added
- Multiple encryption types for local destinations
- Next key and tagset for ECIES-X25519-AEAD-Ratchet
- NTCP2 through SOCKS proxy
- Throw error message if any port to bind is occupied
- gzip parameter for UDP tunnels
- Show ECIES-X25519-AEAD-Ratchet sessions and tags on the web console
- Simplified implementation of gzip for no compression mode
- Allow ECIES-X25519-AEAD-Ratchet session restart after 2 minutes
- Added logrotate config for rpm package
### Changed
- Select peers for client tunnels among routers >= 0.9.36
- Check ECIES flag for encrypted lookup reply
- Streaming MTU size 1812 for ECIES-X25519-AEAD-Ratchet
- Don't calculate checksum for Data message send through ECIES-X25519-AEAD-Ratchet
- Catch network connectivity status for Windows
- Stop as soon as no more transit tunnels during graceful shutdown for Android
- RouterInfo gzip compression level depends on size
- Send response to received datagram from ECIES-X25519-AEAD-Ratchet session
- Update webconsole functional
- Increased max transit tunnels limit
- Reseeds list
- Dropped windows support in cmake
### Fixed
- Correct timestamp check for LeaseSet2
- Encrypted leaseset without authentication
- Change SOCKS proxy connection response for clients without socks5h support (#1336)
## [2.31.0] - 2020-04-10
### Added
- NTCP2 through HTTP proxy
- Publish LeaseSet2 for I2CP destinations
- Show status page on main activity for android
- Handle ECIESFlag in DatabaseLookup at floodfill
- C++17 features for eligible compilers
### Changed
- Droped Websockets and Lua support
- Send DeliveryStatusMsg for LeaseSet for ECIES-X25519-AEAD-Ratchet
- Keep sending new session reply until established for ECIES-X25519-AEAD-Ratchet
- Updated SSU log messages
- Reopen SSU socket on exception
- Security hardening headers in web console
- Various web console changes
- Various QT changes
### Fixed
- NTCP2 socket descriptors leak
- Race condition with router's identity in transport sessions
- Not terminated streams remain forever
## [2.30.0] - 2020-02-25
### Added
- Single threaded SAM
- Experimental support of ECIES-X25519-AEAD-Ratchet crypto type
### Changed
- Minimal MTU size is 1280 for ipv6
- Use unordered_map instead map for destination's sessions and tags list
- Use std::shuffle instead std::random_shuffle
- SAM is single threaded by default
- Reseeds list
### Fixed
- Correct termination of streaming destination
- Extra ',' in RouterInfo response in I2PControl
- SAM crash on session termination
- Storage for Android 10
## [2.29.0] - 2019-10-21
### Added
- Client auth flag for b33 address
### Changed
- Remove incoming NTCP2 session from pending list when established
- Handle errors for NTCP2 SessionConfrimed send
### Fixed
- Failure to start on Windows XP
- SAM crash if invalid lookup address
- Possible crash when UPnP enabled on shutdown
## [2.28.0] - 2019-08-27
### Added
- RAW datagrams in SAM
- Publishing encrypted LeaseSet2 with DH or PSH authentication
- Ability to disable battery optimization for Android
- Transport Network ID Check
### Changed
- Set and handle published encrypted flag for LeaseSet2
### Fixed
- ReceiveID changes in the same stream
- "\r\n" command terminator in SAM
- Addressbook lines with signatures
## [2.27.0] - 2019-07-03
### Added
- Support of PSK and DH authentication for encrypted LeaseSet2
### Changed
- Uptime is based on monotonic timer
### Fixed
- BOB status command response
- Correct NTCP2 port if NTCP is disabled
- Flood encrypted LeaseSet2 with store hash
## [2.26.0] - 2019-06-07
### Added
- HTTP method "PROPFIND"
- Detection of external ipv6 address through the SSU
- NTCP2 publishing depends on network status
### Changed
- ntcp is disabled by default, ntcp2 is published by default
- Response to BOB's "list" command
- ipv6 address is not longer NTCP's local endpoint's address
- Reseeds list
- HTTP_REFERER stripping in httpproxy (#823)
### Fixed
- Check and handle incorrect BOB input
- Ignore introducers for NTCP or NTCP2 addresses
- RouterInfo check from NTCP2
## [2.25.0] - 2019-05-09
### Added
- Create, publish and handle encrypted LeaseSet2
- Support of b33 addresses
- RedDSA key blinding
- .b32.i2p addresses in jump links
- ntcp2.addressv6 parameter
### Changed
- Allow HTTP headers without value
- Set data directory from external storage path for Android
- addresshelper support is configurable per tunnel
- gradlew script for android build
### Fixed
- Deletion of expired encrypted LeaseSet2 on floodfills
- ipv6 fallback address
- SSU incoming packets routing
## [2.24.0] - 2019-03-21
### Added
- Support of transient keys for LeaseSet2
- Support of encrypted LeaseSet2
- Recognize signature type 11 (RedDSA)
- Support websocket connections over HTTP proxy
- Ability to disable full addressbook persist
### Changed
- Don't load peer profiles if non-persistant
- REUSE_ADDR for ipv6 acceptors
- Reset eTags if addressbook can't be loaded
### Fixed
- Build with boost 1.70
- Filter out unspecified addresses from RouterInfo
- Check floodfill status change
- Correct SAM response for invalid key
- SAM crash on termination for Windows
- Race condition for publishing
## [2.23.0] - 2019-01-21
### Added
- Standard LeaseSet2 support
- Ability to adjust timestamps through the NTP
- Ability to disable peer profile persist
- Request permission for android >= 6
- Initial addressbook to android assets
- Cancel graceful shutdown for android
- Russian translation for android
### Changed
- Chacha20 and Poly1305 implementation
- Eliminate extra copy of NTCP2 send buffers
- Extract content of tunnel.d from assets on android
- Removed name resolvers from transports
- Update reseed certificates
### Fixed
- LeaseSet published content verification
- Exclude invalid LeaseSets from the list on a floodfill
- Build for OpenWrt with openssl 1.1.1
## [2.22.0] - 2018-11-09
### Added
- Multiple tunnel config files from tunnels.d folder
### Changed
- Fetch own RouterInfo upon SessionRequest for NTCP2
- Faster XOR between AES blocks for non AVX capable CPUs
### Fixed
- Fixed NTCP2 termination send
## [2.21.1] - 2018-10-22
### Changed
- cost=13 for unpublished NTCP2 address
### Fixed
- Handle I2NP messages longer than 32K
## [2.21.0] - 2018-10-04
### Added
- EdDSA, x25519 and SipHash from openssl 1.1.1
- NTCP2 ipv6 incoming connections
- Show total number of destination's outgoing tags in the web console
### Changed
- Android build with openssl 1.1.1/boost 1.64
- Bandwidth classes 'P' and 'X' don't add 'O' anymore
### Fixed
- Update own RouterInfo if no SSU
- Recognize 'P' and 'X' routers as high bandwidth without 'O'
- NTCP address doesn't disappear if NTCP2 enabled
- Android with api 26+
## [2.20.0] - 2018-08-23
### Added
- Full implementation of NTCP2
- Assets for android
### Changed
- armeabi-v7a and x86 in one apk for android
- NTCP2 is enabled by default
- Show lease's expiration time in readable format in the web console
### Fixed
- Correct names for transports in the web console
## [2.19.0] - 2018-06-26
### Added
- ECIES support for RouterInfo
- HTTP outproxy authorization
- AVX/AESNI runtime detection
- Initial implementation of NTCP2
- I2CP session reconfigure
- I2CP method ClientServicesInfo
- Datagrams to websocks
### Changed
- RouterInfo uses EdDSA signature by default
- Remove stream bans
- Android build system changed to gradle
- Multiple changes in QT GUI
- Dockerfile
### Fixed
- zero tunnelID issue
- tunnels reload
- headers in webconsole
- XSS in webconsole from SAM session name
- build for gcc 8
- cmake build scripts
- systemd service files
- some netbsd issues
## [2.18.0] - 2018-01-30
### Added
- Show tunnel nicknames for I2CP destination in WebUI
- Re-create HTTP and SOCKS proxy by tunnel reload
- Graceful shutdown as soon as no more transit tunnels
### Changed
- Regenerate shared local destination by tunnel reload
- Use transient local destination by default if not specified
- Return correct code if pid file can't be created
- Timing and number of attempts for adressbook requests
- Certificates list
### Fixed
- Malformed addressbook subsctiption request
- Build with boost 1.66
- Few race conditions for SAM
- Check LeaseSet's signature before update
## [2.17.0] - 2017-12-04
### Added
- Reseed through HTTP and SOCKS proxy
- Show status of client services through web console
- Change log level through web connsole
- transient keys for tunnels
- i2p.streaming.initialAckDelay parameter
- CRYPTO_TYPE for SAM destination
- signature and crypto type for newkeys BOB command
### Changed
- Correct publication of ECIES destinations
- Disable RSA signatures completely
### Fixed
- CVE-2017-17066
- Possible buffer overflow for RSA-4096
- Shutdown from web console for Windows
- Web console page layout
## [2.16.0] - 2017-11-13
### Added
- https and "Connect" method for HTTP proxy
- outproxy for HTTP proxy
- initial support of ECIES crypto
- NTCP soft and hard descriptors limits
- Support full timestamps in logs
### Changed
- Faster implementation of GOST R 34.11 hash
- Reject routers with RSA signtures
- Reload config and shudown from Windows GUI
- Update tunnels address(destination) without restart
### Fixed
- BOB crashes if destination is not set
- Correct SAM tunnel name
- QT GUI issues
## [2.15.0] - 2017-08-17
### Added
- QT GUI
- Ability to add and remove I2P tunnels without restart
- Ability to disable SOCKS outproxy option
### Changed
- Strip-out Accept-* hedaers in HTTP proxy
- Don't run peer test if nat=false
- Separate output of NTCP and SSU sessions in Transports tab
### Fixed
- Handle lines with comments in hosts.txt file for address book
- Run router with empty netdb for testnet
- Skip expired introducers by iexp
## [2.14.0] - 2017-06-01
### Added
- Transit traffic bandwidth limitation
- NTCP connections through HTTP and SOCKS proxies
- Ability to disable address helper for HTTP proxy
### Changed
- Reseed servers list
- Minimal required version is 4.0 for Android
### Fixed
- Ignore comments in addressbook feed
## [2.13.0] - 2017-04-06
### Added
- Persist local destination's tags
- GOST signature types 9 and 10
- Exploratory tunnels configuration
### Changed
- Reseed servers list
- Inactive NTCP sockets get closed faster
- Some EdDSA speed up
### Fixed
- Multiple acceptors for SAM
- Follow on data after STREAM CREATE for SAM
- Memory leaks
## [2.12.0] - 2017-02-14
### Added
- Additional HTTP and SOCKS proxy tunnels
- Reseed from ZIP archive
- Some stats in a main window for Windows version
### Changed
- Reseed servers list
- MTU of 1488 for ipv6
- Android and Mac OS X versions use OpenSSL 1.1
- New logo for Android
### Fixed
- Multiple memory leaks
- Incomptibility of some EdDSA private keys with Java
- Clock skew for Windows XP
- Occasional crashes with I2PSnark
## [2.11.0] - 2016-12-18
### Added
- Websockets support
- Reseed through a floodfill
- Tunnel configuration for HTTP and SOCKS proxy
- Zero-hops tunnels for destinations
- Multiple acceptors for SAM
### Changed
- Reseed servers list
- DHT uses AVX if applicable
- New logo
- LeaseSet lookups
### Fixed
- HTTP Proxy connection reset for Windows
- Crash upon SAM session termination
- Can't connect to a destination for a longer time after restart
- Mass packet loss for UDP tunnels
## [2.10.2] - 2016-12-04
### Fixed
- Fixes UPnP discovery bug, producing excessive CPU usage
- Fixes sudden SSU thread stop for Windows.
## [2.10.1] - 2016-11-07
### Fixed
- Fixed some performance issues for Windows and Android
## [2.10.0] - 2016-10-17
### Added
- Datagram i2p tunnels
- Unique local addresses for server tunnels
- Configurable list of reseed servers and initial addressbook
- Configurable netid
- Initial iOS support
### Changed
- Reduced file descriptors usage
- Strict reseed checks enabled by default
## Fixed
- Multiple fixes in I2CP and BOB implementations
## [2.9.0] - 2016-08-12
### Changed
- Proxy refactoring & speedup
- Transmission-I2P support
- Graceful shutdown for Windows
- Android without QT
- Reduced number of timers in SSU
- ipv6 peer test support
- Reseed from SU3 file
## [2.8.0] - 2016-06-20
### Added
- Basic Android support
- I2CP implementation
- 'doxygen' target
### Changed
- I2PControl refactoring & fixes (proper jsonrpc responses on errors)
- boost::regex no more needed
### Fixed
- initscripts: added openrc one, in sysv-ish make I2PD_PORT optional
- properly close NTCP sessions (memleak)
## [2.7.0] - 2016-05-18
### Added
- Precomputed El-Gamal/DH tables
- Configurable limit of transit tunnels
### Changed
- Speed-up of asymmetric crypto for non-x64 platforms
- Refactoring of web-console
## [2.6.0] - 2016-03-31
### Added
- Graceful shutdown on SIGINT
- Numeric bandwidth limits (was: by router class)
- Jumpservices in web-console
- Logging to syslog
- Tray icon for windows application
### Changed
- Logs refactoring
- Improved statistics in web-console
### Deprecated:
- Renamed main/tunnels config files (will use old, if found, but emits warning)
## [2.5.1] - 2016-03-10
### Fixed
- Doesn't create ~/.i2pd dir if missing
## [2.5.0] - 2016-03-04
### Added
- IRC server tunnels
- SOCKS outproxy support
- Support for gzipped addressbook updates
- Support for router families
### Changed
- Shared RTT/RTO between streams
- Filesystem work refactoring
## [2.4.0] - 2016-02-03
### Added
- X-I2P-* headers for server http-tunnels
- I2CP options for I2P tunnels
- Show I2P tunnels in webconsole
### Changed
- Refactoring of cmdline/config parsing
## [2.3.0] - 2016-01-12
### Added
- Support for new router bandwidth class codes (P and X)
- I2PControl supports external webui
- Added --pidfile and --notransit parameters
- Ability to specify signature type for i2p tunnel
### Changed
- Fixed multiple floodfill-related bugs
- New webconsole layout
## [2.2.0] - 2015-12-22
### Added
- Ability to connect to router without ip via introducer
### Changed
- Persist temporary encryption keys for local destinations
- Performance improvements for EdDSA
- New addressbook structure
## [2.1.0] - 2015-11-12
### Added
- Implementation of EdDSA
### Changed
- EdDSA is default signature type for new RouterInfos

View File

@ -1,223 +0,0 @@
#include <fstream>
#include "util.h"
#include "Log.h"
#include "Identity.h"
#include "ClientContext.h"
namespace i2p
{
namespace client
{
ClientContext context;
ClientContext::ClientContext (): m_SharedLocalDestination (nullptr),
m_HttpProxy (nullptr), m_SocksProxy (nullptr), m_IrcTunnel (nullptr),
m_ServerTunnel (nullptr), m_SamBridge (nullptr), m_BOBCommandChannel (nullptr)
{
}
ClientContext::~ClientContext ()
{
delete m_HttpProxy;
delete m_SocksProxy;
delete m_IrcTunnel;
delete m_ServerTunnel;
delete m_SamBridge;
delete m_BOBCommandChannel;
}
void ClientContext::Start ()
{
if (!m_SharedLocalDestination)
{
m_SharedLocalDestination = CreateNewLocalDestination (); // non-public, DSA
m_Destinations[m_SharedLocalDestination->GetIdentity ().GetIdentHash ()] = m_SharedLocalDestination;
m_SharedLocalDestination->Start ();
}
m_HttpProxy = new i2p::proxy::HTTPProxy(i2p::util::config::GetArg("-httpproxyport", 4446));
m_HttpProxy->Start();
LogPrint("HTTP Proxy started");
m_SocksProxy = new i2p::proxy::SOCKSProxy(i2p::util::config::GetArg("-socksproxyport", 4447));
m_SocksProxy->Start();
LogPrint("SOCKS Proxy Started");
std::string ircDestination = i2p::util::config::GetArg("-ircdest", "");
if (ircDestination.length () > 0) // ircdest is presented
{
ClientDestination * localDestination = nullptr;
std::string ircKeys = i2p::util::config::GetArg("-irckeys", "");
if (ircKeys.length () > 0)
localDestination = LoadLocalDestination (ircKeys, false);
m_IrcTunnel = new I2PClientTunnel (m_SocksProxy->GetService (), ircDestination,
i2p::util::config::GetArg("-ircport", 6668), localDestination);
m_IrcTunnel->Start ();
LogPrint("IRC tunnel started");
}
std::string eepKeys = i2p::util::config::GetArg("-eepkeys", "");
if (eepKeys.length () > 0) // eepkeys file is presented
{
auto localDestination = LoadLocalDestination (eepKeys, true);
m_ServerTunnel = new I2PServerTunnel (m_SocksProxy->GetService (),
i2p::util::config::GetArg("-eephost", "127.0.0.1"), i2p::util::config::GetArg("-eepport", 80),
localDestination);
m_ServerTunnel->Start ();
LogPrint("Server tunnel started");
}
int samPort = i2p::util::config::GetArg("-samport", 0);
if (samPort)
{
m_SamBridge = new SAMBridge (samPort);
m_SamBridge->Start ();
LogPrint("SAM bridge started");
}
int bobPort = i2p::util::config::GetArg("-bobport", 0);
if (bobPort)
{
m_BOBCommandChannel = new BOBCommandChannel (bobPort);
m_BOBCommandChannel->Start ();
LogPrint("BOB command channel started");
}
}
void ClientContext::Stop ()
{
m_HttpProxy->Stop();
delete m_HttpProxy;
m_HttpProxy = nullptr;
LogPrint("HTTP Proxy stoped");
m_SocksProxy->Stop();
delete m_SocksProxy;
m_SocksProxy = nullptr;
LogPrint("SOCKS Proxy stoped");
if (m_IrcTunnel)
{
m_IrcTunnel->Stop ();
delete m_IrcTunnel;
m_IrcTunnel = nullptr;
LogPrint("IRC tunnel stoped");
}
if (m_ServerTunnel)
{
m_ServerTunnel->Stop ();
delete m_ServerTunnel;
m_ServerTunnel = nullptr;
LogPrint("Server tunnel stoped");
}
if (m_SamBridge)
{
m_SamBridge->Stop ();
delete m_SamBridge;
m_SamBridge = nullptr;
LogPrint("SAM brdige stoped");
}
if (m_BOBCommandChannel)
{
m_BOBCommandChannel->Stop ();
delete m_BOBCommandChannel;
m_BOBCommandChannel = nullptr;
LogPrint("BOB command channel stoped");
}
for (auto it: m_Destinations)
{
it.second->Stop ();
delete it.second;
}
m_Destinations.clear ();
m_SharedLocalDestination = 0; // deleted through m_Destination
}
ClientDestination * ClientContext::LoadLocalDestination (const std::string& filename, bool isPublic)
{
i2p::data::PrivateKeys keys;
std::string fullPath = i2p::util::filesystem::GetFullPath (filename);
std::ifstream s(fullPath.c_str (), std::ifstream::binary);
if (s.is_open ())
{
s.seekg (0, std::ios::end);
size_t len = s.tellg();
s.seekg (0, std::ios::beg);
uint8_t * buf = new uint8_t[len];
s.read ((char *)buf, len);
keys.FromBuffer (buf, len);
delete[] buf;
LogPrint ("Local address ", keys.GetPublic ().GetIdentHash ().ToBase32 (), ".b32.i2p loaded");
}
else
{
LogPrint ("Can't open file ", fullPath, " Creating new one");
keys = i2p::data::PrivateKeys::CreateRandomKeys (i2p::data::SIGNING_KEY_TYPE_DSA_SHA1);
std::ofstream f (fullPath, std::ofstream::binary | std::ofstream::out);
size_t len = keys.GetFullLen ();
uint8_t * buf = new uint8_t[len];
len = keys.ToBuffer (buf, len);
f.write ((char *)buf, len);
delete[] buf;
LogPrint ("New private keys file ", fullPath, " for ", keys.GetPublic ().GetIdentHash ().ToBase32 (), ".b32.i2p created");
}
auto localDestination = new ClientDestination (keys, isPublic);
std::unique_lock<std::mutex> l(m_DestinationsMutex);
m_Destinations[localDestination->GetIdentHash ()] = localDestination;
localDestination->Start ();
return localDestination;
}
ClientDestination * ClientContext::CreateNewLocalDestination (bool isPublic, i2p::data::SigningKeyType sigType,
const std::map<std::string, std::string> * params)
{
i2p::data::PrivateKeys keys = i2p::data::PrivateKeys::CreateRandomKeys (sigType);
auto localDestination = new ClientDestination (keys, isPublic, params);
std::unique_lock<std::mutex> l(m_DestinationsMutex);
m_Destinations[localDestination->GetIdentHash ()] = localDestination;
localDestination->Start ();
return localDestination;
}
void ClientContext::DeleteLocalDestination (ClientDestination * destination)
{
if (!destination) return;
auto it = m_Destinations.find (destination->GetIdentHash ());
if (it != m_Destinations.end ())
{
auto d = it->second;
{
std::unique_lock<std::mutex> l(m_DestinationsMutex);
m_Destinations.erase (it);
}
d->Stop ();
delete d;
}
}
ClientDestination * ClientContext::CreateNewLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic,
const std::map<std::string, std::string> * params)
{
auto it = m_Destinations.find (keys.GetPublic ().GetIdentHash ());
if (it != m_Destinations.end ())
{
LogPrint ("Local destination ", keys.GetPublic ().GetIdentHash ().ToBase32 (), ".b32.i2p exists");
if (!it->second->IsRunning ())
{
it->second->Start ();
return it->second;
}
return nullptr;
}
auto localDestination = new ClientDestination (keys, isPublic, params);
std::unique_lock<std::mutex> l(m_DestinationsMutex);
m_Destinations[keys.GetPublic ().GetIdentHash ()] = localDestination;
localDestination->Start ();
return localDestination;
}
ClientDestination * ClientContext::FindLocalDestination (const i2p::data::IdentHash& destination) const
{
auto it = m_Destinations.find (destination);
if (it != m_Destinations.end ())
return it->second;
return nullptr;
}
}
}

View File

@ -1,62 +0,0 @@
#ifndef CLIENT_CONTEXT_H__
#define CLIENT_CONTEXT_H__
#include <mutex>
#include "Destination.h"
#include "HTTPProxy.h"
#include "SOCKS.h"
#include "I2PTunnel.h"
#include "SAM.h"
#include "BOB.h"
#include "AddressBook.h"
namespace i2p
{
namespace client
{
class ClientContext
{
public:
ClientContext ();
~ClientContext ();
void Start ();
void Stop ();
ClientDestination * GetSharedLocalDestination () const { return m_SharedLocalDestination; };
ClientDestination * CreateNewLocalDestination (bool isPublic = false, i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1,
const std::map<std::string, std::string> * params = nullptr); // transient
ClientDestination * CreateNewLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic = true,
const std::map<std::string, std::string> * params = nullptr);
void DeleteLocalDestination (ClientDestination * destination);
ClientDestination * FindLocalDestination (const i2p::data::IdentHash& destination) const;
ClientDestination * LoadLocalDestination (const std::string& filename, bool isPublic);
AddressBook& GetAddressBook () { return m_AddressBook; };
private:
std::mutex m_DestinationsMutex;
std::map<i2p::data::IdentHash, ClientDestination *> m_Destinations;
ClientDestination * m_SharedLocalDestination;
AddressBook m_AddressBook;
i2p::proxy::HTTPProxy * m_HttpProxy;
i2p::proxy::SOCKSProxy * m_SocksProxy;
I2PClientTunnel * m_IrcTunnel;
I2PServerTunnel * m_ServerTunnel;
SAMBridge * m_SamBridge;
BOBCommandChannel * m_BOBCommandChannel;
public:
// for HTTP
const decltype(m_Destinations)& GetDestinations () const { return m_Destinations; };
};
extern ClientContext context;
}
}
#endif

View File

@ -1,73 +0,0 @@
#include <inttypes.h>
#include "CryptoConst.h"
namespace i2p
{
namespace crypto
{
const uint8_t elgp_[256]=
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
const uint8_t dsap_[128]=
{
0x9c, 0x05, 0xb2, 0xaa, 0x96, 0x0d, 0x9b, 0x97, 0xb8, 0x93, 0x19, 0x63, 0xc9, 0xcc, 0x9e, 0x8c,
0x30, 0x26, 0xe9, 0xb8, 0xed, 0x92, 0xfa, 0xd0, 0xa6, 0x9c, 0xc8, 0x86, 0xd5, 0xbf, 0x80, 0x15,
0xfc, 0xad, 0xae, 0x31, 0xa0, 0xad, 0x18, 0xfa, 0xb3, 0xf0, 0x1b, 0x00, 0xa3, 0x58, 0xde, 0x23,
0x76, 0x55, 0xc4, 0x96, 0x4a, 0xfa, 0xa2, 0xb3, 0x37, 0xe9, 0x6a, 0xd3, 0x16, 0xb9, 0xfb, 0x1c,
0xc5, 0x64, 0xb5, 0xae, 0xc5, 0xb6, 0x9a, 0x9f, 0xf6, 0xc3, 0xe4, 0x54, 0x87, 0x07, 0xfe, 0xf8,
0x50, 0x3d, 0x91, 0xdd, 0x86, 0x02, 0xe8, 0x67, 0xe6, 0xd3, 0x5d, 0x22, 0x35, 0xc1, 0x86, 0x9c,
0xe2, 0x47, 0x9c, 0x3b, 0x9d, 0x54, 0x01, 0xde, 0x04, 0xe0, 0x72, 0x7f, 0xb3, 0x3d, 0x65, 0x11,
0x28, 0x5d, 0x4c, 0xf2, 0x95, 0x38, 0xd9, 0xe3, 0xb6, 0x05, 0x1f, 0x5b, 0x22, 0xcc, 0x1c, 0x93
};
const uint8_t dsaq_[20]=
{
0xa5, 0xdf, 0xc2, 0x8f, 0xef, 0x4c, 0xa1, 0xe2, 0x86, 0x74, 0x4c, 0xd8, 0xee, 0xd9, 0xd2, 0x9d,
0x68, 0x40, 0x46, 0xb7
};
const uint8_t dsag_[128]=
{
0x0c, 0x1f, 0x4d, 0x27, 0xd4, 0x00, 0x93, 0xb4, 0x29, 0xe9, 0x62, 0xd7, 0x22, 0x38, 0x24, 0xe0,
0xbb, 0xc4, 0x7e, 0x7c, 0x83, 0x2a, 0x39, 0x23, 0x6f, 0xc6, 0x83, 0xaf, 0x84, 0x88, 0x95, 0x81,
0x07, 0x5f, 0xf9, 0x08, 0x2e, 0xd3, 0x23, 0x53, 0xd4, 0x37, 0x4d, 0x73, 0x01, 0xcd, 0xa1, 0xd2,
0x3c, 0x43, 0x1f, 0x46, 0x98, 0x59, 0x9d, 0xda, 0x02, 0x45, 0x18, 0x24, 0xff, 0x36, 0x97, 0x52,
0x59, 0x36, 0x47, 0xcc, 0x3d, 0xdc, 0x19, 0x7d, 0xe9, 0x85, 0xe4, 0x3d, 0x13, 0x6c, 0xdc, 0xfc,
0x6b, 0xd5, 0x40, 0x9c, 0xd2, 0xf4, 0x50, 0x82, 0x11, 0x42, 0xa5, 0xe6, 0xf8, 0xeb, 0x1c, 0x3a,
0xb5, 0xd0, 0x48, 0x4b, 0x81, 0x29, 0xfc, 0xf1, 0x7b, 0xce, 0x4f, 0x7f, 0x33, 0x32, 0x1c, 0x3c,
0xb3, 0xdb, 0xb1, 0x4a, 0x90, 0x5e, 0x7b, 0x2b, 0x3e, 0x93, 0xbe, 0x47, 0x08, 0xcb, 0xcc, 0x82
};
const CryptoConstants& GetCryptoConstants ()
{
static CryptoConstants cryptoConstants =
{
{elgp_, 256}, // elgp
{2}, // elgg
{dsap_, 128}, // dsap
{dsaq_, 20}, // dsaq
{dsag_, 128} // dsag
};
return cryptoConstants;
}
}
}

View File

@ -1,38 +0,0 @@
#ifndef CRYPTO_CONST_H__
#define CRYPTO_CONST_H__
#include <cryptopp/integer.h>
namespace i2p
{
namespace crypto
{
struct CryptoConstants
{
// DH/ElGamal
const CryptoPP::Integer elgp;
const CryptoPP::Integer elgg;
// DSA
const CryptoPP::Integer dsap;
const CryptoPP::Integer dsaq;
const CryptoPP::Integer dsag;
};
const CryptoConstants& GetCryptoConstants ();
// DH/ElGamal
#define elgp GetCryptoConstants ().elgp
#define elgg GetCryptoConstants ().elgg
// DSA
#define dsap GetCryptoConstants ().dsap
#define dsaq GetCryptoConstants ().dsaq
#define dsag GetCryptoConstants ().dsag
// RSA
const int rsae = 65537;
}
}
#endif

View File

@ -1,138 +0,0 @@
#include <thread>
#include "Daemon.h"
#include "Log.h"
#include "base64.h"
#include "version.h"
#include "Transports.h"
#include "NTCPSession.h"
#include "RouterInfo.h"
#include "RouterContext.h"
#include "Tunnel.h"
#include "NetDb.h"
#include "Garlic.h"
#include "util.h"
#include "Streaming.h"
#include "Destination.h"
#include "HTTPServer.h"
#include "ClientContext.h"
namespace i2p
{
namespace util
{
class Daemon_Singleton::Daemon_Singleton_Private
{
public:
Daemon_Singleton_Private() : httpServer(nullptr)
{};
~Daemon_Singleton_Private()
{
delete httpServer;
};
i2p::util::HTTPServer *httpServer;
};
Daemon_Singleton::Daemon_Singleton() : running(1), d(*new Daemon_Singleton_Private()) {};
Daemon_Singleton::~Daemon_Singleton() {
delete &d;
};
bool Daemon_Singleton::IsService () const
{
#ifndef _WIN32
return i2p::util::config::GetArg("-service", 0);
#else
return false;
#endif
}
bool Daemon_Singleton::init(int argc, char* argv[])
{
i2p::util::config::OptionParser(argc, argv);
i2p::context.Init ();
LogPrint("\n\n\n\ni2pd starting\n");
LogPrint("Version ", VERSION);
LogPrint("data directory: ", i2p::util::filesystem::GetDataDir().string());
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs);
isDaemon = i2p::util::config::GetArg("-daemon", 0);
isLogging = i2p::util::config::GetArg("-log", 1);
int port = i2p::util::config::GetArg("-port", 0);
if (port)
i2p::context.UpdatePort (port);
const char * host = i2p::util::config::GetCharArg("-host", "");
if (host && host[0])
i2p::context.UpdateAddress (boost::asio::ip::address::from_string (host));
if (i2p::util::config::GetArg("-unreachable", 0))
i2p::context.SetUnreachable ();
i2p::context.SetSupportsV6 (i2p::util::config::GetArg("-v6", 0));
LogPrint("CMD parameters:");
for (int i = 0; i < argc; ++i)
LogPrint(i, " ", argv[i]);
return true;
}
bool Daemon_Singleton::start()
{
// initialize log
if (isLogging)
{
if (isDaemon)
{
std::string logfile_path = IsService () ? "/var/log" : i2p::util::filesystem::GetDataDir().string();
#ifndef _WIN32
logfile_path.append("/i2pd.log");
#else
logfile_path.append("\\i2pd.log");
#endif
StartLog (logfile_path);
}
else
StartLog (""); // write to stdout
}
d.httpServer = new i2p::util::HTTPServer(i2p::util::config::GetArg("-httpport", 7070));
d.httpServer->Start();
LogPrint("HTTP Server started");
i2p::data::netdb.Start();
LogPrint("NetDB started");
i2p::transport::transports.Start();
LogPrint("Transports started");
i2p::tunnel::tunnels.Start();
LogPrint("Tunnels started");
i2p::client::context.Start ();
LogPrint("Client started");
return true;
}
bool Daemon_Singleton::stop()
{
LogPrint("Shutdown started.");
i2p::client::context.Stop();
LogPrint("Client stoped");
i2p::tunnel::tunnels.Stop();
LogPrint("Tunnels stoped");
i2p::transport::transports.Stop();
LogPrint("Transports stoped");
i2p::data::netdb.Stop();
LogPrint("NetDB stoped");
d.httpServer->Stop();
LogPrint("HTTP Server stoped");
StopLog ();
delete d.httpServer; d.httpServer = nullptr;
return true;
}
}
}

View File

@ -1,71 +0,0 @@
#pragma once
#include <string>
#ifdef _WIN32
#define Daemon i2p::util::DaemonWin32::Instance()
#else
#define Daemon i2p::util::DaemonLinux::Instance()
#endif
namespace i2p
{
namespace util
{
class Daemon_Singleton_Private;
class Daemon_Singleton
{
public:
virtual bool init(int argc, char* argv[]);
virtual bool start();
virtual bool stop();
int isLogging;
int isDaemon;
int running;
protected:
Daemon_Singleton();
virtual ~Daemon_Singleton();
bool IsService () const;
// d-pointer for httpServer, httpProxy, etc.
class Daemon_Singleton_Private;
Daemon_Singleton_Private &d;
};
#ifdef _WIN32
class DaemonWin32 : public Daemon_Singleton
{
public:
static DaemonWin32& Instance()
{
static DaemonWin32 instance;
return instance;
}
virtual bool init(int argc, char* argv[]);
virtual bool start();
virtual bool stop();
};
#else
class DaemonLinux : public Daemon_Singleton
{
public:
static DaemonLinux& Instance()
{
static DaemonLinux instance;
return instance;
}
virtual bool start();
virtual bool stop();
private:
std::string pidfile;
int pidFilehandle;
};
#endif
}
}

View File

@ -1,118 +0,0 @@
#include "Daemon.h"
#ifndef _WIN32
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "Log.h"
#include "util.h"
void handle_signal(int sig)
{
switch (sig)
{
case SIGHUP:
if (i2p::util::config::GetArg("daemon", 0) == 1)
{
static bool first=true;
if (first)
{
first=false;
return;
}
}
LogPrint("Reloading config.");
i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs);
break;
case SIGABRT:
case SIGTERM:
case SIGINT:
Daemon.running = 0; // Exit loop
break;
}
}
namespace i2p
{
namespace util
{
bool DaemonLinux::start()
{
if (isDaemon == 1)
{
pid_t pid;
pid = fork();
if (pid > 0) // parent
::exit (EXIT_SUCCESS);
if (pid < 0) // error
return false;
// child
umask(0);
int sid = setsid();
if (sid < 0)
{
LogPrint("Error, could not create process group.");
return false;
}
chdir(i2p::util::filesystem::GetDataDir().string().c_str());
// close stdin/stdout/stderr descriptors
::close (0);
::open ("/dev/null", O_RDWR);
::close (1);
::open ("/dev/null", O_RDWR);
::close (2);
::open ("/dev/null", O_RDWR);
}
// Pidfile
pidfile = IsService () ? "/var/run" : i2p::util::filesystem::GetDataDir().string();
pidfile.append("/i2pd.pid");
pidFilehandle = open(pidfile.c_str(), O_RDWR | O_CREAT, 0600);
if (pidFilehandle == -1)
{
LogPrint("Error, could not create pid file (", pidfile, ")\nIs an instance already running?");
return false;
}
if (lockf(pidFilehandle, F_TLOCK, 0) == -1)
{
LogPrint("Error, could not lock pid file (", pidfile, ")\nIs an instance already running?");
return false;
}
char pid[10];
sprintf(pid, "%d\n", getpid());
write(pidFilehandle, pid, strlen(pid));
// Signal handler
struct sigaction sa;
sa.sa_handler = handle_signal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGHUP, &sa, 0);
sigaction(SIGABRT, &sa, 0);
sigaction(SIGTERM, &sa, 0);
sigaction(SIGINT, &sa, 0);
return Daemon_Singleton::start();
}
bool DaemonLinux::stop()
{
close(pidFilehandle);
unlink(pidfile.c_str());
return Daemon_Singleton::stop();
}
}
}
#endif

View File

@ -1,83 +0,0 @@
#include "Daemon.h"
#include "util.h"
#include "Log.h"
#ifdef _WIN32
#include "./Win32/Win32Service.h"
namespace i2p
{
namespace util
{
bool DaemonWin32::init(int argc, char* argv[])
{
setlocale(LC_CTYPE, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
if (!Daemon_Singleton::init(argc, argv)) return false;
if (I2PService::isService())
isDaemon = 1;
else
isDaemon = 0;
std::string serviceControl = i2p::util::config::GetArg("-service", "none");
if (serviceControl == "install")
{
InstallService(
SERVICE_NAME, // Name of service
SERVICE_DISPLAY_NAME, // Name to display
SERVICE_START_TYPE, // Service start type
SERVICE_DEPENDENCIES, // Dependencies
SERVICE_ACCOUNT, // Service running account
SERVICE_PASSWORD // Password of the account
);
exit(0);
}
else if (serviceControl == "remove")
{
UninstallService(SERVICE_NAME);
exit(0);
}
else if (serviceControl != "none")
{
printf(" --service=install to install the service.\n");
printf(" --service=remove to remove the service.\n");
}
if (isDaemon == 1)
{
LogPrint("Service session");
I2PService service(SERVICE_NAME);
if (!I2PService::Run(service))
{
LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError());
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
else
LogPrint("User session");
return true;
}
bool DaemonWin32::start()
{
setlocale(LC_CTYPE, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
return Daemon_Singleton::start();
}
bool DaemonWin32::stop()
{
return Daemon_Singleton::stop();
}
}
}
#endif

View File

@ -1,135 +0,0 @@
#include <string.h>
#include <vector>
#include <cryptopp/sha.h>
#include <cryptopp/gzip.h>
#include "Log.h"
#include "TunnelBase.h"
#include "RouterContext.h"
#include "Destination.h"
#include "Datagram.h"
namespace i2p
{
namespace datagram
{
DatagramDestination::DatagramDestination (i2p::client::ClientDestination& owner):
m_Owner (owner), m_Receiver (nullptr)
{
}
void DatagramDestination::SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::LeaseSet& remote)
{
uint8_t buf[MAX_DATAGRAM_SIZE];
auto identityLen = m_Owner.GetIdentity ().ToBuffer (buf, MAX_DATAGRAM_SIZE);
uint8_t * signature = buf + identityLen;
auto signatureLen = m_Owner.GetIdentity ().GetSignatureLen ();
uint8_t * buf1 = signature + signatureLen;
size_t headerLen = identityLen + signatureLen;
memcpy (buf1, payload, len);
if (m_Owner.GetIdentity ().GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1)
{
uint8_t hash[32];
CryptoPP::SHA256().CalculateDigest (hash, buf1, len);
m_Owner.Sign (hash, 32, signature);
}
else
m_Owner.Sign (buf1, len, signature);
m_Owner.GetService ().post (std::bind (&DatagramDestination::SendMsg, this,
CreateDataMessage (buf, len + headerLen), remote));
}
void DatagramDestination::SendMsg (I2NPMessage * msg, const i2p::data::LeaseSet& remote)
{
auto outboundTunnel = m_Owner.GetTunnelPool ()->GetNextOutboundTunnel ();
auto leases = remote.GetNonExpiredLeases ();
if (!leases.empty () && outboundTunnel)
{
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
uint32_t i = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, leases.size () - 1);
auto garlic = m_Owner.WrapMessage (remote, msg, true);
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeTunnel,
leases[i].tunnelGateway, leases[i].tunnelID,
garlic
});
outboundTunnel->SendTunnelDataMsg (msgs);
}
else
{
if (outboundTunnel)
LogPrint (eLogWarning, "Failed to send datagram. All leases expired");
else
LogPrint (eLogWarning, "Failed to send datagram. No outbound tunnels");
DeleteI2NPMessage (msg);
}
}
void DatagramDestination::HandleDatagram (const uint8_t * buf, size_t len)
{
i2p::data::IdentityEx identity;
size_t identityLen = identity.FromBuffer (buf, len);
const uint8_t * signature = buf + identityLen;
size_t headerLen = identityLen + identity.GetSignatureLen ();
bool verified = false;
if (identity.GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1)
{
uint8_t hash[32];
CryptoPP::SHA256().CalculateDigest (hash, buf + headerLen, len - headerLen);
verified = identity.Verify (hash, 32, signature);
}
else
verified = identity.Verify (buf + headerLen, len - headerLen, signature);
if (verified)
{
if (m_Receiver != nullptr)
m_Receiver (identity, buf + headerLen, len -headerLen);
else
LogPrint (eLogWarning, "Receiver for datagram is not set");
}
else
LogPrint (eLogWarning, "Datagram signature verification failed");
}
void DatagramDestination::HandleDataMessagePayload (const uint8_t * buf, size_t len)
{
// unzip it
CryptoPP::Gunzip decompressor;
decompressor.Put (buf, len);
decompressor.MessageEnd();
uint8_t uncompressed[MAX_DATAGRAM_SIZE];
auto uncompressedLen = decompressor.MaxRetrievable ();
if (uncompressedLen <= MAX_DATAGRAM_SIZE)
{
decompressor.Get (uncompressed, uncompressedLen);
HandleDatagram (uncompressed, uncompressedLen);
}
else
LogPrint ("Received datagram size ", uncompressedLen, " exceeds max size");
}
I2NPMessage * DatagramDestination::CreateDataMessage (const uint8_t * payload, size_t len)
{
I2NPMessage * msg = NewI2NPMessage ();
CryptoPP::Gzip compressor; // default level
compressor.Put (payload, len);
compressor.MessageEnd();
int size = compressor.MaxRetrievable ();
uint8_t * buf = msg->GetPayload ();
*(uint32_t *)buf = htobe32 (size); // length
buf += 4;
compressor.Get (buf, size);
memset (buf + 4, 0, 4); // source and destination are zeroes
buf[9] = i2p::client::PROTOCOL_TYPE_DATAGRAM; // datagram protocol
msg->len += size + 4;
FillI2NPMessageHeader (msg, eI2NPData);
return msg;
}
}
}

View File

@ -1,49 +0,0 @@
#ifndef DATAGRAM_H__
#define DATAGRAM_H__
#include <inttypes.h>
#include <functional>
#include "Identity.h"
#include "LeaseSet.h"
#include "I2NPProtocol.h"
namespace i2p
{
namespace client
{
class ClientDestination;
}
namespace datagram
{
const size_t MAX_DATAGRAM_SIZE = 32768;
class DatagramDestination
{
typedef std::function<void (const i2p::data::IdentityEx& ident, const uint8_t *, size_t)> Receiver;
public:
DatagramDestination (i2p::client::ClientDestination& owner);
~DatagramDestination () {};
void SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::LeaseSet& remote);
void HandleDataMessagePayload (const uint8_t * buf, size_t len);
void SetReceiver (const Receiver& receiver) { m_Receiver = receiver; };
void ResetReceiver () { m_Receiver = nullptr; };
private:
I2NPMessage * CreateDataMessage (const uint8_t * payload, size_t len);
void SendMsg (I2NPMessage * msg, const i2p::data::LeaseSet& remote);
void HandleDatagram (const uint8_t * buf, size_t len);
private:
i2p::client::ClientDestination& m_Owner;
Receiver m_Receiver;
};
}
}
#endif

View File

@ -1,354 +0,0 @@
#include <algorithm>
#include <boost/lexical_cast.hpp>
#include <cryptopp/dh.h>
#include "Log.h"
#include "util.h"
#include "NetDb.h"
#include "Destination.h"
namespace i2p
{
namespace client
{
ClientDestination::ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic,
const std::map<std::string, std::string> * params):
m_IsRunning (false), m_Thread (nullptr), m_Work (m_Service),
m_Keys (keys), m_LeaseSet (nullptr), m_IsPublic (isPublic), m_PublishReplyToken (0),
m_DatagramDestination (nullptr), m_PublishConfirmationTimer (m_Service)
{
CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg);
dh.GenerateKeyPair(i2p::context.GetRandomNumberGenerator (), m_EncryptionPrivateKey, m_EncryptionPublicKey);
int inboundTunnelLen = DEFAULT_INBOUND_TUNNEL_LENGTH;
int outboundTunnelLen = DEFAULT_OUTBOUND_TUNNEL_LENGTH;
if (params)
{
auto it = params->find (I2CP_PARAM_INBOUND_TUNNEL_LENGTH);
if (it != params->end ())
{
int len = boost::lexical_cast<int>(it->second);
if (len > 0)
{
inboundTunnelLen = len;
LogPrint (eLogInfo, "Inbound tunnel length set to ", len);
}
}
it = params->find (I2CP_PARAM_OUTBOUND_TUNNEL_LENGTH);
if (it != params->end ())
{
int len = boost::lexical_cast<int>(it->second);
if (len > 0)
{
outboundTunnelLen = len;
LogPrint (eLogInfo, "Outbound tunnel length set to ", len);
}
}
}
m_Pool = i2p::tunnel::tunnels.CreateTunnelPool (this, inboundTunnelLen, outboundTunnelLen);
if (m_IsPublic)
LogPrint (eLogInfo, "Local address ", GetIdentHash ().ToBase32 (), ".b32.i2p created");
m_StreamingDestination = new i2p::stream::StreamingDestination (*this); // TODO:
}
ClientDestination::~ClientDestination ()
{
Stop ();
for (auto it: m_RemoteLeaseSets)
delete it.second;
if (m_Pool)
i2p::tunnel::tunnels.DeleteTunnelPool (m_Pool);
}
void ClientDestination::Run ()
{
while (m_IsRunning)
{
try
{
m_Service.run ();
}
catch (std::exception& ex)
{
LogPrint ("Destination: ", ex.what ());
}
}
}
void ClientDestination::Start ()
{
m_Pool->SetLocalDestination (this);
m_Pool->SetActive (true);
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&ClientDestination::Run, this));
m_StreamingDestination->Start ();
}
void ClientDestination::Stop ()
{
m_StreamingDestination->Stop ();
if (m_DatagramDestination)
{
auto d = m_DatagramDestination;
m_DatagramDestination = nullptr;
delete d;
}
if (m_Pool)
{
m_Pool->SetLocalDestination (nullptr);
i2p::tunnel::tunnels.StopTunnelPool (m_Pool);
}
m_IsRunning = false;
m_Service.stop ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = 0;
}
}
const i2p::data::LeaseSet * ClientDestination::FindLeaseSet (const i2p::data::IdentHash& ident)
{
auto it = m_RemoteLeaseSets.find (ident);
if (it != m_RemoteLeaseSets.end ())
{
if (it->second->HasNonExpiredLeases ())
return it->second;
else
{
LogPrint ("All leases of remote LeaseSet expired. Request it");
i2p::data::netdb.RequestDestination (ident, true, m_Pool);
}
}
else
{
auto ls = i2p::data::netdb.FindLeaseSet (ident);
if (ls)
{
ls = new i2p::data::LeaseSet (*ls);
m_RemoteLeaseSets[ident] = ls;
return ls;
}
}
return nullptr;
}
const i2p::data::LeaseSet * ClientDestination::GetLeaseSet ()
{
if (!m_Pool) return nullptr;
if (!m_LeaseSet)
UpdateLeaseSet ();
return m_LeaseSet;
}
void ClientDestination::UpdateLeaseSet ()
{
auto newLeaseSet = new i2p::data::LeaseSet (*m_Pool);
if (!m_LeaseSet)
m_LeaseSet = newLeaseSet;
else
{
// TODO: implement it better
*m_LeaseSet = *newLeaseSet;
delete newLeaseSet;
}
}
bool ClientDestination::SubmitSessionKey (const uint8_t * key, const uint8_t * tag)
{
struct
{
uint8_t k[32], t[32];
} data;
memcpy (data.k, key, 32);
memcpy (data.t, tag, 32);
m_Service.post ([this,data](void)
{
this->AddSessionKey (data.k, data.t);
});
return true;
}
void ClientDestination::ProcessGarlicMessage (I2NPMessage * msg)
{
m_Service.post (std::bind (&ClientDestination::HandleGarlicMessage, this, msg));
}
void ClientDestination::ProcessDeliveryStatusMessage (I2NPMessage * msg)
{
m_Service.post (std::bind (&ClientDestination::HandleDeliveryStatusMessage, this, msg));
}
void ClientDestination::HandleI2NPMessage (const uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from)
{
I2NPHeader * header = (I2NPHeader *)buf;
switch (header->typeID)
{
case eI2NPData:
HandleDataMessage (buf + sizeof (I2NPHeader), be16toh (header->size));
break;
case eI2NPDatabaseStore:
HandleDatabaseStoreMessage (buf + sizeof (I2NPHeader), be16toh (header->size));
i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from)); // TODO: remove
break;
default:
i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from));
}
}
void ClientDestination::HandleDatabaseStoreMessage (const uint8_t * buf, size_t len)
{
I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)buf;
size_t offset = sizeof (I2NPDatabaseStoreMsg);
if (msg->replyToken) // TODO:
offset += 36;
if (msg->type == 1) // LeaseSet
{
LogPrint (eLogDebug, "Remote LeaseSet");
auto it = m_RemoteLeaseSets.find (msg->key);
if (it != m_RemoteLeaseSets.end ())
{
it->second->Update (buf + offset, len - offset);
LogPrint (eLogDebug, "Remote LeaseSet updated");
}
else
{
LogPrint (eLogDebug, "New remote LeaseSet added");
m_RemoteLeaseSets[msg->key] = new i2p::data::LeaseSet (buf + offset, len - offset);
}
}
else
LogPrint (eLogError, "Unexpected client's DatabaseStore type ", msg->type, ". Dropped");
}
void ClientDestination::HandleDeliveryStatusMessage (I2NPMessage * msg)
{
I2NPDeliveryStatusMsg * deliveryStatus = (I2NPDeliveryStatusMsg *)msg->GetPayload ();
uint32_t msgID = be32toh (deliveryStatus->msgID);
if (msgID == m_PublishReplyToken)
{
LogPrint (eLogDebug, "Publishing confirmed");
m_ExcludedFloodfills.clear ();
m_PublishReplyToken = 0;
i2p::DeleteI2NPMessage (msg);
}
else
i2p::garlic::GarlicDestination::HandleDeliveryStatusMessage (msg);
}
void ClientDestination::SetLeaseSetUpdated ()
{
i2p::garlic::GarlicDestination::SetLeaseSetUpdated ();
UpdateLeaseSet ();
if (m_IsPublic)
Publish ();
}
void ClientDestination::Publish ()
{
if (!m_LeaseSet || !m_Pool)
{
LogPrint (eLogError, "Can't publish non-existing LeaseSet");
return;
}
if (m_PublishReplyToken)
{
LogPrint (eLogInfo, "Publishing is pending");
return;
}
auto outbound = m_Pool->GetNextOutboundTunnel ();
if (!outbound)
{
LogPrint ("Can't publish LeaseSet. No outbound tunnels");
return;
}
std::set<i2p::data::IdentHash> excluded;
auto floodfill = i2p::data::netdb.GetClosestFloodfill (m_LeaseSet->GetIdentHash (), m_ExcludedFloodfills);
if (!floodfill)
{
LogPrint ("Can't publish LeaseSet. No more floodfills found");
m_ExcludedFloodfills.clear ();
return;
}
m_ExcludedFloodfills.insert (floodfill->GetIdentHash ());
LogPrint (eLogDebug, "Publish LeaseSet of ", GetIdentHash ().ToBase32 ());
m_PublishReplyToken = i2p::context.GetRandomNumberGenerator ().GenerateWord32 ();
auto msg = WrapMessage (*floodfill, i2p::CreateDatabaseStoreMsg (m_LeaseSet, m_PublishReplyToken));
m_PublishConfirmationTimer.expires_from_now (boost::posix_time::seconds(PUBLISH_CONFIRMATION_TIMEOUT));
m_PublishConfirmationTimer.async_wait (std::bind (&ClientDestination::HandlePublishConfirmationTimer,
this, std::placeholders::_1));
outbound->SendTunnelDataMsg (floodfill->GetIdentHash (), 0, msg);
}
void ClientDestination::HandlePublishConfirmationTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
if (m_PublishReplyToken)
{
LogPrint (eLogWarning, "Publish confirmation was not received in ", PUBLISH_CONFIRMATION_TIMEOUT, "seconds. Try again");
m_PublishReplyToken = 0;
Publish ();
}
}
}
void ClientDestination::HandleDataMessage (const uint8_t * buf, size_t len)
{
uint32_t length = be32toh (*(uint32_t *)buf);
buf += 4;
// we assume I2CP payload
switch (buf[9])
{
case PROTOCOL_TYPE_STREAMING:
// streaming protocol
if (m_StreamingDestination)
m_StreamingDestination->HandleDataMessagePayload (buf, length);
else
LogPrint ("Missing streaming destination");
break;
case PROTOCOL_TYPE_DATAGRAM:
// datagram protocol
if (m_DatagramDestination)
m_DatagramDestination->HandleDataMessagePayload (buf, length);
else
LogPrint ("Missing streaming destination");
break;
default:
LogPrint ("Data: unexpected protocol ", buf[9]);
}
}
std::shared_ptr<i2p::stream::Stream> ClientDestination::CreateStream (const i2p::data::LeaseSet& remote, int port)
{
if (m_StreamingDestination)
return m_StreamingDestination->CreateNewOutgoingStream (remote, port);
return nullptr;
}
void ClientDestination::AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor)
{
if (m_StreamingDestination)
m_StreamingDestination->SetAcceptor (acceptor);
}
void ClientDestination::StopAcceptingStreams ()
{
if (m_StreamingDestination)
m_StreamingDestination->ResetAcceptor ();
}
bool ClientDestination::IsAcceptingStreams () const
{
if (m_StreamingDestination)
return m_StreamingDestination->IsAcceptorSet ();
return false;
}
i2p::datagram::DatagramDestination * ClientDestination::CreateDatagramDestination ()
{
if (!m_DatagramDestination)
m_DatagramDestination = new i2p::datagram::DatagramDestination (*this);
return m_DatagramDestination;
}
}
}

View File

@ -1,114 +0,0 @@
#ifndef DESTINATION_H__
#define DESTINATION_H__
#include <thread>
#include <mutex>
#include <memory>
#include <map>
#include <string>
#include "Identity.h"
#include "TunnelPool.h"
#include "CryptoConst.h"
#include "LeaseSet.h"
#include "Garlic.h"
#include "Streaming.h"
#include "Datagram.h"
namespace i2p
{
namespace client
{
const uint8_t PROTOCOL_TYPE_STREAMING = 6;
const uint8_t PROTOCOL_TYPE_DATAGRAM = 17;
const uint8_t PROTOCOL_TYPE_RAW = 18;
const int PUBLISH_CONFIRMATION_TIMEOUT = 5; // in seconds
// I2CP
const char I2CP_PARAM_INBOUND_TUNNEL_LENGTH[] = "inbound.length";
const int DEFAULT_INBOUND_TUNNEL_LENGTH = 3;
const char I2CP_PARAM_OUTBOUND_TUNNEL_LENGTH[] = "outbound.length";
const int DEFAULT_OUTBOUND_TUNNEL_LENGTH = 3;
class ClientDestination: public i2p::garlic::GarlicDestination
{
public:
ClientDestination (const i2p::data::PrivateKeys& keys, bool isPublic, const std::map<std::string, std::string> * params = nullptr);
~ClientDestination ();
virtual void Start ();
virtual void Stop ();
bool IsRunning () const { return m_IsRunning; };
boost::asio::io_service& GetService () { return m_Service; };
i2p::tunnel::TunnelPool * GetTunnelPool () { return m_Pool; };
bool IsReady () const { return m_LeaseSet && m_LeaseSet->HasNonExpiredLeases (); };
const i2p::data::LeaseSet * FindLeaseSet (const i2p::data::IdentHash& ident);
// streaming
i2p::stream::StreamingDestination * GetStreamingDestination () const { return m_StreamingDestination; };
std::shared_ptr<i2p::stream::Stream> CreateStream (const i2p::data::LeaseSet& remote, int port = 0);
void AcceptStreams (const i2p::stream::StreamingDestination::Acceptor& acceptor);
void StopAcceptingStreams ();
bool IsAcceptingStreams () const;
// datagram
i2p::datagram::DatagramDestination * GetDatagramDestination () const { return m_DatagramDestination; };
i2p::datagram::DatagramDestination * CreateDatagramDestination ();
// implements LocalDestination
const i2p::data::PrivateKeys& GetPrivateKeys () const { return m_Keys; };
const uint8_t * GetEncryptionPrivateKey () const { return m_EncryptionPrivateKey; };
const uint8_t * GetEncryptionPublicKey () const { return m_EncryptionPublicKey; };
// implements GarlicDestination
const i2p::data::LeaseSet * GetLeaseSet ();
void HandleI2NPMessage (const uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from);
// override GarlicDestination
bool SubmitSessionKey (const uint8_t * key, const uint8_t * tag);
void ProcessGarlicMessage (I2NPMessage * msg);
void ProcessDeliveryStatusMessage (I2NPMessage * msg);
void SetLeaseSetUpdated ();
// I2CP
void HandleDataMessage (const uint8_t * buf, size_t len);
private:
void Run ();
void UpdateLeaseSet ();
void Publish ();
void HandlePublishConfirmationTimer (const boost::system::error_code& ecode);
void HandleDatabaseStoreMessage (const uint8_t * buf, size_t len);
void HandleDeliveryStatusMessage (I2NPMessage * msg);
private:
bool m_IsRunning;
std::thread * m_Thread;
boost::asio::io_service m_Service;
boost::asio::io_service::work m_Work;
i2p::data::PrivateKeys m_Keys;
uint8_t m_EncryptionPublicKey[256], m_EncryptionPrivateKey[256];
std::map<i2p::data::IdentHash, i2p::data::LeaseSet *> m_RemoteLeaseSets;
i2p::tunnel::TunnelPool * m_Pool;
i2p::data::LeaseSet * m_LeaseSet;
bool m_IsPublic;
uint32_t m_PublishReplyToken;
std::set<i2p::data::IdentHash> m_ExcludedFloodfills; // for publishing
i2p::stream::StreamingDestination * m_StreamingDestination;
i2p::datagram::DatagramDestination * m_DatagramDestination;
boost::asio::deadline_timer m_PublishConfirmationTimer;
public:
// for HTTP only
int GetNumRemoteLeaseSets () const { return m_RemoteLeaseSets.size (); };
};
}
}
#endif

View File

@ -1,77 +0,0 @@
#ifndef EL_GAMAL_H__
#define EL_GAMAL_H__
#include <inttypes.h>
#include <cryptopp/integer.h>
#include <cryptopp/osrng.h>
#include <cryptopp/sha.h>
#include "CryptoConst.h"
#include "Log.h"
namespace i2p
{
namespace crypto
{
class ElGamalEncryption
{
public:
ElGamalEncryption (const uint8_t * key):
y (key, 256), k (rnd, CryptoPP::Integer::One(), elgp-1),
a (a_exp_b_mod_c (elgg, k, elgp)), b1 (a_exp_b_mod_c (y, k, elgp))
{
}
void Encrypt (const uint8_t * data, int len, uint8_t * encrypted, bool zeroPadding = false)
{
// calculate b = b1*m mod p
uint8_t m[255];
m[0] = 0xFF;
memcpy (m+33, data, len);
CryptoPP::SHA256().CalculateDigest(m+1, m+33, 222);
CryptoPP::Integer b (a_times_b_mod_c (b1, CryptoPP::Integer (m, 255), elgp));
// copy a and b
if (zeroPadding)
{
encrypted[0] = 0;
a.Encode (encrypted + 1, 256);
encrypted[257] = 0;
b.Encode (encrypted + 258, 256);
}
else
{
a.Encode (encrypted, 256);
b.Encode (encrypted + 256, 256);
}
}
private:
CryptoPP::AutoSeededRandomPool rnd;
CryptoPP::Integer y, k, a, b1;
bool m_ZeroPadding;
};
inline bool ElGamalDecrypt (const uint8_t * key, const uint8_t * encrypted,
uint8_t * data, bool zeroPadding = false)
{
CryptoPP::Integer x(key, 256), a(zeroPadding? encrypted +1 : encrypted, 256),
b(zeroPadding? encrypted + 258 :encrypted + 256, 256);
uint8_t m[255], hash[32];
a_times_b_mod_c (b, a_exp_b_mod_c (a, elgp - x - 1, elgp), elgp).Encode (m, 255);
CryptoPP::SHA256().CalculateDigest(hash, m+33, 222);
for (int i = 0; i < 32; i++)
if (hash[i] != m[i+1])
{
LogPrint ("ElGamal decrypt hash doesn't match");
return false;
}
memcpy (data, m + 33, 222);
return true;
}
}
}
#endif

View File

@ -1,563 +0,0 @@
#include <inttypes.h>
#include "I2PEndian.h"
#include <map>
#include <string>
#include "RouterContext.h"
#include "I2NPProtocol.h"
#include "Tunnel.h"
#include "TunnelPool.h"
#include "Timestamp.h"
#include "Destination.h"
#include "Garlic.h"
namespace i2p
{
namespace garlic
{
GarlicRoutingSession::GarlicRoutingSession (GarlicDestination * owner,
const i2p::data::RoutingDestination * destination, int numTags):
m_Owner (owner), m_Destination (destination), m_NumTags (numTags),
m_LeaseSetUpdated (numTags > 0)
{
// create new session tags and session key
m_Rnd.GenerateBlock (m_SessionKey, 32);
m_Encryption.SetKey (m_SessionKey);
}
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag):
m_Owner (nullptr), m_Destination (nullptr), m_NumTags (1), m_LeaseSetUpdated (false)
{
memcpy (m_SessionKey, sessionKey, 32);
m_Encryption.SetKey (m_SessionKey);
m_SessionTags.push_back (sessionTag);
m_SessionTags.back ().creationTime = i2p::util::GetSecondsSinceEpoch ();
}
GarlicRoutingSession::~GarlicRoutingSession ()
{
for (auto it: m_UnconfirmedTagsMsgs)
delete it.second;
m_UnconfirmedTagsMsgs.clear ();
}
GarlicRoutingSession::UnconfirmedTags * GarlicRoutingSession::GenerateSessionTags ()
{
auto tags = new UnconfirmedTags (m_NumTags);
tags->tagsCreationTime = i2p::util::GetSecondsSinceEpoch ();
for (int i = 0; i < m_NumTags; i++)
{
m_Rnd.GenerateBlock (tags->sessionTags[i], 32);
tags->sessionTags[i].creationTime = tags->tagsCreationTime;
}
return tags;
}
void GarlicRoutingSession::TagsConfirmed (uint32_t msgID)
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
auto it = m_UnconfirmedTagsMsgs.find (msgID);
if (it != m_UnconfirmedTagsMsgs.end ())
{
UnconfirmedTags * tags = it->second;
if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT)
{
for (int i = 0; i < tags->numTags; i++)
m_SessionTags.push_back (tags->sessionTags[i]);
}
m_UnconfirmedTagsMsgs.erase (it);
delete tags;
}
// delete expired unconfirmed tags
for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();)
{
if (ts >= it->second->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT)
{
delete it->second;
it = m_UnconfirmedTagsMsgs.erase (it);
}
else
it++;
}
}
I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg)
{
I2NPMessage * m = NewI2NPMessage ();
m->Align (12); // in order to get buf aligned to 16 (12 + 4)
size_t len = 0;
uint8_t * buf = m->GetPayload () + 4; // 4 bytes for length
// find non-expired tag
bool tagFound = false;
SessionTag tag;
if (m_NumTags > 0)
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
while (!m_SessionTags.empty ())
{
if (ts < m_SessionTags.front ().creationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT)
{
tag = m_SessionTags.front ();
m_SessionTags.pop_front (); // use same tag only once
tagFound = true;
break;
}
else
m_SessionTags.pop_front (); // remove expired tag
}
}
// create message
if (!tagFound) // new session
{
LogPrint ("No garlic tags available. Use ElGamal");
if (!m_Destination)
{
LogPrint ("Can't use ElGamal for unknown destination");
return nullptr;
}
// create ElGamal block
ElGamalBlock elGamal;
memcpy (elGamal.sessionKey, m_SessionKey, 32);
m_Rnd.GenerateBlock (elGamal.preIV, 32); // Pre-IV
uint8_t iv[32]; // IV is first 16 bytes
CryptoPP::SHA256().CalculateDigest(iv, elGamal.preIV, 32);
m_Destination->GetElGamalEncryption ()->Encrypt ((uint8_t *)&elGamal, sizeof(elGamal), buf, true);
m_Encryption.SetIV (iv);
buf += 514;
len += 514;
}
else // existing session
{
// session tag
memcpy (buf, tag, 32);
uint8_t iv[32]; // IV is first 16 bytes
CryptoPP::SHA256().CalculateDigest(iv, tag, 32);
m_Encryption.SetIV (iv);
buf += 32;
len += 32;
}
// AES block
len += CreateAESBlock (buf, msg);
*(uint32_t *)(m->GetPayload ()) = htobe32 (len);
m->len += len + 4;
FillI2NPMessageHeader (m, eI2NPGarlic);
if (msg)
DeleteI2NPMessage (msg);
return m;
}
size_t GarlicRoutingSession::CreateAESBlock (uint8_t * buf, const I2NPMessage * msg)
{
size_t blockSize = 0;
bool createNewTags = m_Owner && m_NumTags && ((int)m_SessionTags.size () <= m_NumTags/2);
UnconfirmedTags * newTags = createNewTags ? GenerateSessionTags () : nullptr;
*(uint16_t *)buf = newTags ? htobe16 (newTags->numTags) : 0; // tag count
blockSize += 2;
if (newTags) // session tags recreated
{
for (int i = 0; i < newTags->numTags; i++)
{
memcpy (buf + blockSize, newTags->sessionTags[i], 32); // tags
blockSize += 32;
}
}
uint32_t * payloadSize = (uint32_t *)(buf + blockSize);
blockSize += 4;
uint8_t * payloadHash = buf + blockSize;
blockSize += 32;
buf[blockSize] = 0; // flag
blockSize++;
size_t len = CreateGarlicPayload (buf + blockSize, msg, newTags);
*payloadSize = htobe32 (len);
CryptoPP::SHA256().CalculateDigest(payloadHash, buf + blockSize, len);
blockSize += len;
size_t rem = blockSize % 16;
if (rem)
blockSize += (16-rem); //padding
m_Encryption.Encrypt(buf, blockSize, buf);
return blockSize;
}
size_t GarlicRoutingSession::CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg, UnconfirmedTags * newTags)
{
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 5000; // 5 sec
uint32_t msgID = m_Rnd.GenerateWord32 ();
size_t size = 0;
uint8_t * numCloves = payload + size;
*numCloves = 0;
size++;
if (m_Owner)
{
if (newTags) // new session
{
// clove is DeliveryStatus
size += CreateDeliveryStatusClove (payload + size, msgID);
if (size > 0) // successive?
{
(*numCloves)++;
m_UnconfirmedTagsMsgs[msgID] = newTags;
m_Owner->DeliveryStatusSent (this, msgID);
}
else
LogPrint ("DeliveryStatus clove was not created");
}
if (m_LeaseSetUpdated)
{
m_LeaseSetUpdated = false;
// clove if our leaseSet must be attached
auto leaseSet = CreateDatabaseStoreMsg (m_Owner->GetLeaseSet ());
size += CreateGarlicClove (payload + size, leaseSet, false);
DeleteI2NPMessage (leaseSet);
(*numCloves)++;
}
}
if (msg) // clove message ifself if presented
{
size += CreateGarlicClove (payload + size, msg, m_Destination ? m_Destination->IsDestination () : false);
(*numCloves)++;
}
memset (payload + size, 0, 3); // certificate of message
size += 3;
*(uint32_t *)(payload + size) = htobe32 (msgID); // MessageID
size += 4;
*(uint64_t *)(payload + size) = htobe64 (ts); // Expiration of message
size += 8;
return size;
}
size_t GarlicRoutingSession::CreateGarlicClove (uint8_t * buf, const I2NPMessage * msg, bool isDestination)
{
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 5000; // 5 sec
size_t size = 0;
if (isDestination && m_Destination)
{
buf[size] = eGarlicDeliveryTypeDestination << 5;// delivery instructions flag destination
size++;
memcpy (buf + size, m_Destination->GetIdentHash (), 32);
size += 32;
}
else
{
buf[size] = 0;// delivery instructions flag local
size++;
}
memcpy (buf + size, msg->GetBuffer (), msg->GetLength ());
size += msg->GetLength ();
*(uint32_t *)(buf + size) = htobe32 (m_Rnd.GenerateWord32 ()); // CloveID
size += 4;
*(uint64_t *)(buf + size) = htobe64 (ts); // Expiration of clove
size += 8;
memset (buf + size, 0, 3); // certificate of clove
size += 3;
return size;
}
size_t GarlicRoutingSession::CreateDeliveryStatusClove (uint8_t * buf, uint32_t msgID)
{
size_t size = 0;
if (m_Owner)
{
auto leases = m_Owner->GetLeaseSet ()->GetNonExpiredLeases ();
if (!leases.empty ())
{
buf[size] = eGarlicDeliveryTypeTunnel << 5; // delivery instructions flag tunnel
size++;
uint32_t i = m_Rnd.GenerateWord32 (0, leases.size () - 1);
// hash and tunnelID sequence is reversed for Garlic
memcpy (buf + size, leases[i].tunnelGateway, 32); // To Hash
size += 32;
*(uint32_t *)(buf + size) = htobe32 (leases[i].tunnelID); // tunnelID
size += 4;
// create msg
I2NPMessage * msg = CreateDeliveryStatusMsg (msgID);
if (m_Owner)
{
//encrypt
uint8_t key[32], tag[32];
m_Rnd.GenerateBlock (key, 32); // random session key
m_Rnd.GenerateBlock (tag, 32); // random session tag
m_Owner->SubmitSessionKey (key, tag);
GarlicRoutingSession garlic (key, tag);
msg = garlic.WrapSingleMessage (msg);
}
memcpy (buf + size, msg->GetBuffer (), msg->GetLength ());
size += msg->GetLength ();
DeleteI2NPMessage (msg);
// fill clove
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 5000; // 5 sec
*(uint32_t *)(buf + size) = htobe32 (m_Rnd.GenerateWord32 ()); // CloveID
size += 4;
*(uint64_t *)(buf + size) = htobe64 (ts); // Expiration of clove
size += 8;
memset (buf + size, 0, 3); // certificate of clove
size += 3;
}
else
LogPrint ("All tunnels of local LeaseSet expired");
}
else
LogPrint ("Missing local LeaseSet");
return size;
}
GarlicDestination::~GarlicDestination ()
{
for (auto it: m_Sessions)
delete it.second;
m_Sessions.clear ();
}
void GarlicDestination::AddSessionKey (const uint8_t * key, const uint8_t * tag)
{
if (key)
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
auto decryption = std::make_shared<i2p::crypto::CBCDecryption>();
decryption->SetKey (key);
m_Tags[SessionTag(tag, ts)] = decryption;
}
}
bool GarlicDestination::SubmitSessionKey (const uint8_t * key, const uint8_t * tag)
{
AddSessionKey (key, tag);
return true;
}
void GarlicDestination::HandleGarlicMessage (I2NPMessage * msg)
{
uint8_t * buf = msg->GetPayload ();
uint32_t length = be32toh (*(uint32_t *)buf);
buf += 4; // length
auto it = m_Tags.find (SessionTag(buf));
if (it != m_Tags.end ())
{
// tag found. Use AES
uint8_t iv[32]; // IV is first 16 bytes
CryptoPP::SHA256().CalculateDigest(iv, buf, 32);
it->second->SetIV (iv);
it->second->Decrypt (buf + 32, length - 32, buf + 32);
HandleAESBlock (buf + 32, length - 32, it->second, msg->from);
m_Tags.erase (it); // tag might be used only once
}
else
{
// tag not found. Use ElGamal
ElGamalBlock elGamal;
if (i2p::crypto::ElGamalDecrypt (GetEncryptionPrivateKey (), buf, (uint8_t *)&elGamal, true))
{
auto decryption = std::make_shared<i2p::crypto::CBCDecryption>();
decryption->SetKey (elGamal.sessionKey);
uint8_t iv[32]; // IV is first 16 bytes
CryptoPP::SHA256().CalculateDigest(iv, elGamal.preIV, 32);
decryption->SetIV (iv);
decryption->Decrypt(buf + 514, length - 514, buf + 514);
HandleAESBlock (buf + 514, length - 514, decryption, msg->from);
}
else
LogPrint ("Failed to decrypt garlic");
}
DeleteI2NPMessage (msg);
// cleanup expired tags
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
if (ts > m_LastTagsCleanupTime + INCOMING_TAGS_EXPIRATION_TIMEOUT)
{
if (m_LastTagsCleanupTime)
{
int numExpiredTags = 0;
for (auto it = m_Tags.begin (); it != m_Tags.end ();)
{
if (ts > it->first.creationTime + INCOMING_TAGS_EXPIRATION_TIMEOUT)
{
numExpiredTags++;
it = m_Tags.erase (it);
}
else
it++;
}
LogPrint (numExpiredTags, " tags expired for ", GetIdentHash().ToBase64 ());
}
m_LastTagsCleanupTime = ts;
}
}
void GarlicDestination::HandleAESBlock (uint8_t * buf, size_t len, std::shared_ptr<i2p::crypto::CBCDecryption> decryption,
i2p::tunnel::InboundTunnel * from)
{
uint16_t tagCount = be16toh (*(uint16_t *)buf);
buf += 2; len -= 2;
if (tagCount > 0)
{
if (tagCount*32 > len)
{
LogPrint (eLogError, "Tag count ", tagCount, " exceeds length ", len);
return ;
}
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
for (int i = 0; i < tagCount; i++)
m_Tags[SessionTag(buf + i*32, ts)] = decryption;
}
buf += tagCount*32;
len -= tagCount*32;
uint32_t payloadSize = be32toh (*(uint32_t *)buf);
if (payloadSize > len)
{
LogPrint (eLogError, "Unexpected payload size ", payloadSize);
return;
}
buf += 4;
uint8_t * payloadHash = buf;
buf += 32;// payload hash.
if (*buf) // session key?
buf += 32; // new session key
buf++; // flag
// payload
uint8_t hash[32];
CryptoPP::SHA256().CalculateDigest(hash, buf, payloadSize);
if (memcmp (hash, payloadHash, 32)) // payload hash doesn't match
{
LogPrint ("Wrong payload hash");
return;
}
HandleGarlicPayload (buf, payloadSize, from);
}
void GarlicDestination::HandleGarlicPayload (uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from)
{
int numCloves = buf[0];
LogPrint (numCloves," cloves");
buf++;
for (int i = 0; i < numCloves; i++)
{
// delivery instructions
uint8_t flag = buf[0];
buf++; // flag
if (flag & 0x80) // encrypted?
{
// TODO: implement
LogPrint ("Clove encrypted");
buf += 32;
}
GarlicDeliveryType deliveryType = (GarlicDeliveryType)((flag >> 5) & 0x03);
switch (deliveryType)
{
case eGarlicDeliveryTypeLocal:
LogPrint ("Garlic type local");
HandleI2NPMessage (buf, len, from);
break;
case eGarlicDeliveryTypeDestination:
LogPrint ("Garlic type destination");
buf += 32; // destination. check it later or for multiple destinations
HandleI2NPMessage (buf, len, from);
break;
case eGarlicDeliveryTypeTunnel:
{
LogPrint ("Garlic type tunnel");
// gwHash and gwTunnel sequence is reverted
uint8_t * gwHash = buf;
buf += 32;
uint32_t gwTunnel = be32toh (*(uint32_t *)buf);
buf += 4;
i2p::tunnel::OutboundTunnel * tunnel = nullptr;
if (from && from->GetTunnelPool ())
tunnel = from->GetTunnelPool ()->GetNextOutboundTunnel ();
if (tunnel) // we have send it through an outbound tunnel
{
I2NPMessage * msg = CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from);
tunnel->SendTunnelDataMsg (gwHash, gwTunnel, msg);
}
else
LogPrint ("No outbound tunnels available for garlic clove");
break;
}
case eGarlicDeliveryTypeRouter:
LogPrint ("Garlic type router not supported");
buf += 32;
break;
default:
LogPrint ("Unknow garlic delivery type ", (int)deliveryType);
}
buf += GetI2NPMessageLength (buf); // I2NP
buf += 4; // CloveID
buf += 8; // Date
buf += 3; // Certificate
}
}
I2NPMessage * GarlicDestination::WrapMessage (const i2p::data::RoutingDestination& destination,
I2NPMessage * msg, bool attachLeaseSet)
{
if (attachLeaseSet) // we should maintain this session
{
auto session = GetRoutingSession (destination, 32); // 32 tags by default
return session->WrapSingleMessage (msg);
}
else // one time session
{
GarlicRoutingSession session (this, &destination, 0); // don't use tag if no LeaseSet
return session.WrapSingleMessage (msg);
}
}
GarlicRoutingSession * GarlicDestination::GetRoutingSession (
const i2p::data::RoutingDestination& destination, int numTags)
{
auto it = m_Sessions.find (destination.GetIdentHash ());
GarlicRoutingSession * session = nullptr;
if (it != m_Sessions.end ())
session = it->second;
if (!session)
{
session = new GarlicRoutingSession (this, &destination, numTags);
std::unique_lock<std::mutex> l(m_SessionsMutex);
m_Sessions[destination.GetIdentHash ()] = session;
}
return session;
}
void GarlicDestination::DeliveryStatusSent (GarlicRoutingSession * session, uint32_t msgID)
{
m_CreatedSessions[msgID] = session;
}
void GarlicDestination::HandleDeliveryStatusMessage (I2NPMessage * msg)
{
I2NPDeliveryStatusMsg * deliveryStatus = (I2NPDeliveryStatusMsg *)msg->GetPayload ();
uint32_t msgID = be32toh (deliveryStatus->msgID);
{
auto it = m_CreatedSessions.find (msgID);
if (it != m_CreatedSessions.end ())
{
it->second->TagsConfirmed (msgID);
m_CreatedSessions.erase (it);
LogPrint ("Garlic message ", msgID, " acknowledged");
}
}
DeleteI2NPMessage (msg);
}
void GarlicDestination::SetLeaseSetUpdated ()
{
std::unique_lock<std::mutex> l(m_SessionsMutex);
for (auto it: m_Sessions)
it.second->SetLeaseSetUpdated ();
}
void GarlicDestination::ProcessGarlicMessage (I2NPMessage * msg)
{
HandleGarlicMessage (msg);
}
void GarlicDestination::ProcessDeliveryStatusMessage (I2NPMessage * msg)
{
HandleDeliveryStatusMessage (msg);
}
}
}

148
Garlic.h
View File

@ -1,148 +0,0 @@
#ifndef GARLIC_H__
#define GARLIC_H__
#include <inttypes.h>
#include <map>
#include <list>
#include <string>
#include <thread>
#include <mutex>
#include <memory>
#include <cryptopp/osrng.h>
#include "aes.h"
#include "I2NPProtocol.h"
#include "LeaseSet.h"
#include "Queue.h"
#include "Identity.h"
namespace i2p
{
namespace garlic
{
enum GarlicDeliveryType
{
eGarlicDeliveryTypeLocal = 0,
eGarlicDeliveryTypeDestination = 1,
eGarlicDeliveryTypeRouter = 2,
eGarlicDeliveryTypeTunnel = 3
};
#pragma pack(1)
struct ElGamalBlock
{
uint8_t sessionKey[32];
uint8_t preIV[32];
uint8_t padding[158];
};
#pragma pack()
const int INCOMING_TAGS_EXPIRATION_TIMEOUT = 960; // 16 minutes
const int OUTGOING_TAGS_EXPIRATION_TIMEOUT = 720; // 12 minutes
struct SessionTag: public i2p::data::Tag<32>
{
SessionTag (const uint8_t * buf, uint32_t ts = 0): Tag<32>(buf), creationTime (ts) {};
SessionTag () = default;
SessionTag (const SessionTag& ) = default;
SessionTag& operator= (const SessionTag& ) = default;
#ifndef _WIN32
SessionTag (SessionTag&& ) = default;
SessionTag& operator= (SessionTag&& ) = default;
#endif
uint32_t creationTime; // seconds since epoch
};
class GarlicDestination;
class GarlicRoutingSession
{
struct UnconfirmedTags
{
UnconfirmedTags (int n): numTags (n), tagsCreationTime (0) { sessionTags = new SessionTag[numTags]; };
~UnconfirmedTags () { delete[] sessionTags; };
int numTags;
SessionTag * sessionTags;
uint32_t tagsCreationTime;
};
public:
GarlicRoutingSession (GarlicDestination * owner, const i2p::data::RoutingDestination * destination, int numTags);
GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag); // one time encryption
~GarlicRoutingSession ();
I2NPMessage * WrapSingleMessage (I2NPMessage * msg);
void TagsConfirmed (uint32_t msgID);
void SetLeaseSetUpdated () { m_LeaseSetUpdated = true; };
private:
size_t CreateAESBlock (uint8_t * buf, const I2NPMessage * msg);
size_t CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg, UnconfirmedTags * newTags);
size_t CreateGarlicClove (uint8_t * buf, const I2NPMessage * msg, bool isDestination);
size_t CreateDeliveryStatusClove (uint8_t * buf, uint32_t msgID);
UnconfirmedTags * GenerateSessionTags ();
private:
GarlicDestination * m_Owner;
const i2p::data::RoutingDestination * m_Destination;
i2p::crypto::AESKey m_SessionKey;
std::list<SessionTag> m_SessionTags;
int m_NumTags;
std::map<uint32_t, UnconfirmedTags *> m_UnconfirmedTagsMsgs;
bool m_LeaseSetUpdated;
i2p::crypto::CBCEncryption m_Encryption;
CryptoPP::AutoSeededRandomPool m_Rnd;
};
class GarlicDestination: public i2p::data::LocalDestination
{
public:
GarlicDestination (): m_LastTagsCleanupTime (0) {};
~GarlicDestination ();
GarlicRoutingSession * GetRoutingSession (const i2p::data::RoutingDestination& destination, int numTags);
I2NPMessage * WrapMessage (const i2p::data::RoutingDestination& destination,
I2NPMessage * msg, bool attachLeaseSet = false);
void AddSessionKey (const uint8_t * key, const uint8_t * tag); // one tag
virtual bool SubmitSessionKey (const uint8_t * key, const uint8_t * tag); // from different thread
void DeliveryStatusSent (GarlicRoutingSession * session, uint32_t msgID);
virtual void ProcessGarlicMessage (I2NPMessage * msg);
virtual void ProcessDeliveryStatusMessage (I2NPMessage * msg);
virtual void SetLeaseSetUpdated ();
virtual const i2p::data::LeaseSet * GetLeaseSet () = 0; // TODO
virtual void HandleI2NPMessage (const uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from) = 0;
protected:
void HandleGarlicMessage (I2NPMessage * msg);
void HandleDeliveryStatusMessage (I2NPMessage * msg);
private:
void HandleAESBlock (uint8_t * buf, size_t len, std::shared_ptr<i2p::crypto::CBCDecryption> decryption,
i2p::tunnel::InboundTunnel * from);
void HandleGarlicPayload (uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from);
private:
// outgoing sessions
std::mutex m_SessionsMutex;
std::map<i2p::data::IdentHash, GarlicRoutingSession *> m_Sessions;
// incoming
std::map<SessionTag, std::shared_ptr<i2p::crypto::CBCDecryption>> m_Tags;
uint32_t m_LastTagsCleanupTime;
// DeliveryStatus
std::map<uint32_t, GarlicRoutingSession *> m_CreatedSessions; // msgID -> session
};
}
}
#endif

View File

@ -1,87 +0,0 @@
#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
#include "ClientContext.h"
#include "HTTPProxy.h"
namespace i2p
{
namespace proxy
{
void HTTPProxyConnection::parseHeaders(const std::string& h, std::vector<header>& hm) {
std::string str (h);
std::string::size_type idx;
std::string t;
int i = 0;
while( (idx=str.find ("\r\n")) != std::string::npos) {
t=str.substr (0,idx);
str.erase (0,idx+2);
if (t == "")
break;
idx=t.find(": ");
if (idx == std::string::npos)
{
std::cout << "Bad header line: " << t << std::endl;
break;
}
LogPrint ("Name: ", t.substr (0,idx), " Value: ", t.substr (idx+2));
hm[i].name = t.substr (0,idx);
hm[i].value = t.substr (idx+2);
i++;
}
}
void HTTPProxyConnection::ExtractRequest(request& r)
{
std::string requestString = m_Buffer;
int idx=requestString.find(" ");
std::string method = requestString.substr(0,idx);
requestString = requestString.substr(idx+1);
idx=requestString.find(" ");
std::string requestUrl = requestString.substr(0,idx);
LogPrint("method is: ", method, "\nRequest is: ", requestUrl);
std::string server="";
std::string port="80";
boost::regex rHTTP("http://(.*?)(:(\\d+))?(/.*)");
boost::smatch m;
std::string path;
if(boost::regex_search(requestUrl, m, rHTTP, boost::match_extra)) {
server=m[1].str();
if(m[2].str() != "") {
port=m[3].str();
}
path=m[4].str();
}
LogPrint("server is: ",server, " port is: ", port, "\n path is: ",path);
r.uri = path;
r.method = method;
r.host = server;
r.port = boost::lexical_cast<int>(port);
}
void HTTPProxyConnection::RunRequest()
{
request r;
ExtractRequest(r);
parseHeaders(m_Buffer, r.headers);
size_t addressHelperPos = r.uri.find ("i2paddresshelper");
if (addressHelperPos != std::string::npos)
{
// jump service
size_t addressPos = r.uri.find ("=", addressHelperPos);
if (addressPos != std::string::npos)
{
LogPrint ("Jump service for ", r.host, " found. Inserting to address book");
auto base64 = r.uri.substr (addressPos + 1);
i2p::client::context.GetAddressBook ().InsertAddress (r.host, base64);
}
}
LogPrint("Requesting ", r.host, ":", r.port, " with path ", r.uri, " and method ", r.method);
SendToAddress (r.host, r.port, m_Buffer, m_BufferLen);
}
}
}

View File

@ -1,42 +0,0 @@
#ifndef HTTP_PROXY_H__
#define HTTP_PROXY_H__
#include <sstream>
#include <thread>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include "HTTPServer.h"
namespace i2p
{
namespace proxy
{
class HTTPProxyConnection : public i2p::util::HTTPConnection
{
public:
HTTPProxyConnection (boost::asio::ip::tcp::socket * socket): HTTPConnection(socket) { };
protected:
void RunRequest();
void parseHeaders(const std::string& h, std::vector<header>& hm);
void ExtractRequest(request& r);
};
class HTTPProxy : public i2p::util::HTTPServer
{
public:
HTTPProxy (int port): HTTPServer(port) {};
private:
void CreateConnection(boost::asio::ip::tcp::socket * m_NewSocket)
{
new HTTPProxyConnection(m_NewSocket);
}
};
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,136 +0,0 @@
#ifndef HTTP_SERVER_H__
#define HTTP_SERVER_H__
#include <sstream>
#include <thread>
#include <memory>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include "LeaseSet.h"
#include "Streaming.h"
namespace i2p
{
namespace util
{
const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
const int HTTP_DESTINATION_REQUEST_TIMEOUT = 10; // in seconds
class HTTPConnection
{
protected:
struct header
{
std::string name;
std::string value;
};
struct request
{
std::string method;
std::string uri;
std::string host;
int port;
int http_version_major;
int http_version_minor;
std::vector<header> headers;
};
struct reply
{
std::vector<header> headers;
std::string content;
std::vector<boost::asio::const_buffer> to_buffers (int status);
};
public:
HTTPConnection (boost::asio::ip::tcp::socket * socket):
m_Socket (socket), m_Timer (socket->get_io_service ()),
m_Stream (nullptr), m_BufferLen (0) { Receive (); };
virtual ~HTTPConnection() { delete m_Socket; }
private:
void Terminate ();
void Receive ();
void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void AsyncStreamReceive ();
void HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleWriteReply(const boost::system::error_code& ecode);
void HandleWrite (const boost::system::error_code& ecode);
void SendReply (const std::string& content, int status = 200);
void HandleRequest (const std::string& address);
void HandleCommand (const std::string& command, std::stringstream& s);
void ShowTransports (std::stringstream& s);
void ShowTunnels (std::stringstream& s);
void ShowTransitTunnels (std::stringstream& s);
void ShowLocalDestinations (std::stringstream& s);
void ShowLocalDestination (const std::string& b32, std::stringstream& s);
void StartAcceptingTunnels (std::stringstream& s);
void StopAcceptingTunnels (std::stringstream& s);
void FillContent (std::stringstream& s);
std::string ExtractAddress ();
void ExtractParams (const std::string& str, std::map<std::string, std::string>& params);
protected:
boost::asio::ip::tcp::socket * m_Socket;
boost::asio::deadline_timer m_Timer;
std::shared_ptr<i2p::stream::Stream> m_Stream;
char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1], m_StreamBuffer[HTTP_CONNECTION_BUFFER_SIZE + 1];
size_t m_BufferLen;
request m_Request;
reply m_Reply;
protected:
virtual void RunRequest ();
void HandleDestinationRequest(const std::string& address, const std::string& uri);
void SendToAddress (const std::string& address, int port, const char * buf, size_t len);
void HandleDestinationRequestTimeout (const boost::system::error_code& ecode,
i2p::data::IdentHash destination, int port, const char * buf, size_t len);
void SendToDestination (const i2p::data::LeaseSet * remote, int port, const char * buf, size_t len);
public:
static const std::string itoopieImage;
static const std::string itoopieFavicon;
};
class HTTPServer
{
public:
HTTPServer (int port);
virtual ~HTTPServer ();
void Start ();
void Stop ();
private:
void Run ();
void Accept ();
void HandleAccept(const boost::system::error_code& ecode);
private:
std::thread * m_Thread;
boost::asio::io_service m_Service;
boost::asio::io_service::work m_Work;
boost::asio::ip::tcp::acceptor m_Acceptor;
boost::asio::ip::tcp::socket * m_NewSocket;
protected:
virtual void CreateConnection(boost::asio::ip::tcp::socket * m_NewSocket);
};
}
}
#endif

View File

@ -1,597 +0,0 @@
#include <string.h>
#include <atomic>
#include "I2PEndian.h"
#include <cryptopp/sha.h>
#include <cryptopp/gzip.h>
#include "ElGamal.h"
#include "Timestamp.h"
#include "RouterContext.h"
#include "NetDb.h"
#include "Tunnel.h"
#include "base64.h"
#include "Transports.h"
#include "Garlic.h"
#include "I2NPProtocol.h"
using namespace i2p::transport;
namespace i2p
{
I2NPMessage * NewI2NPMessage ()
{
return new I2NPMessageBuffer<I2NP_MAX_MESSAGE_SIZE>();
}
I2NPMessage * NewI2NPShortMessage ()
{
return new I2NPMessageBuffer<I2NP_MAX_SHORT_MESSAGE_SIZE>();
}
I2NPMessage * NewI2NPMessage (size_t len)
{
return (len < I2NP_MAX_SHORT_MESSAGE_SIZE/2) ? NewI2NPShortMessage () : NewI2NPMessage ();
}
void DeleteI2NPMessage (I2NPMessage * msg)
{
delete msg;
}
static std::atomic<uint32_t> I2NPmsgID(0); // TODO: create class
void FillI2NPMessageHeader (I2NPMessage * msg, I2NPMessageType msgType, uint32_t replyMsgID)
{
I2NPHeader * header = msg->GetHeader ();
header->typeID = msgType;
if (replyMsgID) // for tunnel creation
header->msgID = htobe32 (replyMsgID);
else
{
header->msgID = htobe32 (I2NPmsgID);
I2NPmsgID++;
}
header->expiration = htobe64 (i2p::util::GetMillisecondsSinceEpoch () + 5000); // TODO: 5 secs is a magic number
int len = msg->GetLength () - sizeof (I2NPHeader);
header->size = htobe16 (len);
uint8_t hash[32];
CryptoPP::SHA256().CalculateDigest(hash, msg->GetPayload (), len);
header->chks = hash[0];
}
void RenewI2NPMessageHeader (I2NPMessage * msg)
{
if (msg)
{
I2NPHeader * header = msg->GetHeader ();
header->msgID = htobe32 (I2NPmsgID);
I2NPmsgID++;
header->expiration = htobe64 (i2p::util::GetMillisecondsSinceEpoch () + 5000);
}
}
I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID)
{
I2NPMessage * msg = NewI2NPMessage (len);
memcpy (msg->GetPayload (), buf, len);
msg->len += len;
FillI2NPMessageHeader (msg, msgType, replyMsgID);
return msg;
}
I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from)
{
I2NPMessage * msg = NewI2NPMessage ();
memcpy (msg->GetBuffer (), buf, len);
msg->len = msg->offset + len;
msg->from = from;
return msg;
}
I2NPMessage * CreateDeliveryStatusMsg (uint32_t msgID)
{
I2NPDeliveryStatusMsg msg;
if (msgID)
{
msg.msgID = htobe32 (msgID);
msg.timestamp = htobe64 (i2p::util::GetMillisecondsSinceEpoch ());
}
else // for SSU establishment
{
msg.msgID = htobe32 (i2p::context.GetRandomNumberGenerator ().GenerateWord32 ());
msg.timestamp = htobe64 (2); // netID = 2
}
return CreateI2NPMessage (eI2NPDeliveryStatus, (uint8_t *)&msg, sizeof (msg));
}
I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
uint32_t replyTunnelID, bool exploratory, std::set<i2p::data::IdentHash> * excludedPeers,
bool encryption, i2p::tunnel::TunnelPool * pool)
{
I2NPMessage * m = NewI2NPMessage ();
uint8_t * buf = m->GetPayload ();
memcpy (buf, key, 32); // key
buf += 32;
memcpy (buf, from, 32); // from
buf += 32;
if (replyTunnelID)
{
*buf = encryption ? 0x03: 0x01; // set delivery flag
*(uint32_t *)(buf+1) = htobe32 (replyTunnelID);
buf += 5;
}
else
{
encryption = false; // encryption can we set for tunnels only
*buf = 0; // flag
buf++;
}
if (exploratory)
{
*(uint16_t *)buf = htobe16 (1); // one exlude record
buf += 2;
// reply with non-floodfill routers only
memset (buf, 0, 32);
buf += 32;
}
else
{
if (excludedPeers)
{
int cnt = excludedPeers->size ();
*(uint16_t *)buf = htobe16 (cnt);
buf += 2;
for (auto& it: *excludedPeers)
{
memcpy (buf, it, 32);
buf += 32;
}
}
else
{
// nothing to exclude
*(uint16_t *)buf = htobe16 (0);
buf += 2;
}
}
if (encryption)
{
// session key and tag for reply
auto& rnd = i2p::context.GetRandomNumberGenerator ();
rnd.GenerateBlock (buf, 32); // key
buf[32] = 1; // 1 tag
rnd.GenerateBlock (buf + 33, 32); // tag
if (pool && pool->GetLocalDestination ())
pool->GetLocalDestination ()->SubmitSessionKey (buf, buf + 33); // introduce new key-tag to garlic engine
else
LogPrint ("Destination for encrypteed reply not specified");
buf += 65;
}
m->len += (buf - m->GetPayload ());
FillI2NPMessageHeader (m, eI2NPDatabaseLookup);
return m;
}
I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident,
const i2p::data::RouterInfo * floodfill)
{
I2NPMessage * m = NewI2NPShortMessage ();
uint8_t * buf = m->GetPayload ();
size_t len = 0;
memcpy (buf, ident, 32);
len += 32;
buf[len] = floodfill ? 1 : 0; // 1 router for now
len++;
if (floodfill)
{
memcpy (buf + len, floodfill->GetIdentHash (), 32);
len += 32;
}
memcpy (buf + len, i2p::context.GetRouterInfo ().GetIdentHash (), 32);
len += 32;
m->len += len;
FillI2NPMessageHeader (m, eI2NPDatabaseSearchReply);
return m;
}
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::RouterInfo * router)
{
if (!router) // we send own RouterInfo
router = &context.GetRouterInfo ();
I2NPMessage * m = NewI2NPShortMessage ();
I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)m->GetPayload ();
memcpy (msg->key, router->GetIdentHash (), 32);
msg->type = 0;
msg->replyToken = 0;
CryptoPP::Gzip compressor;
compressor.Put (router->GetBuffer (), router->GetBufferLen ());
compressor.MessageEnd();
auto size = compressor.MaxRetrievable ();
uint8_t * buf = m->GetPayload () + sizeof (I2NPDatabaseStoreMsg);
*(uint16_t *)buf = htobe16 (size); // size
buf += 2;
// TODO: check if size doesn't exceed buffer
compressor.Get (buf, size);
m->len += sizeof (I2NPDatabaseStoreMsg) + 2 + size; // payload size
FillI2NPMessageHeader (m, eI2NPDatabaseStore);
return m;
}
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::LeaseSet * leaseSet, uint32_t replyToken)
{
if (!leaseSet) return nullptr;
I2NPMessage * m = NewI2NPShortMessage ();
uint8_t * payload = m->GetPayload ();
I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)payload;
memcpy (msg->key, leaseSet->GetIdentHash (), 32);
msg->type = 1; // LeaseSet
msg->replyToken = htobe32 (replyToken);
size_t size = sizeof (I2NPDatabaseStoreMsg);
if (replyToken)
{
auto leases = leaseSet->GetNonExpiredLeases ();
if (leases.size () > 0)
{
*(uint32_t *)(payload + size) = htobe32 (leases[0].tunnelID);
size += 4; // reply tunnelID
memcpy (payload + size, leases[0].tunnelGateway, 32);
size += 32; // reply tunnel gateway
}
else
msg->replyToken = 0;
}
memcpy (payload + size, leaseSet->GetBuffer (), leaseSet->GetBufferLen ());
size += leaseSet->GetBufferLen ();
m->len += size;
FillI2NPMessageHeader (m, eI2NPDatabaseStore);
return m;
}
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
const uint8_t * ourIdent, uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
const uint8_t * replyKey, const uint8_t * replyIV, uint32_t nextMessageID,
bool isGateway, bool isEndpoint)
{
I2NPBuildRequestRecordClearText clearText;
clearText.receiveTunnel = htobe32 (receiveTunnelID);
clearText.nextTunnel = htobe32(nextTunnelID);
memcpy (clearText.layerKey, layerKey, 32);
memcpy (clearText.ivKey, ivKey, 32);
memcpy (clearText.replyKey, replyKey, 32);
memcpy (clearText.replyIV, replyIV, 16);
clearText.flag = 0;
if (isGateway) clearText.flag |= 0x80;
if (isEndpoint) clearText.flag |= 0x40;
memcpy (clearText.ourIdent, ourIdent, 32);
memcpy (clearText.nextIdent, nextIdent, 32);
clearText.requestTime = htobe32 (i2p::util::GetHoursSinceEpoch ());
clearText.nextMessageID = htobe32(nextMessageID);
return clearText;
}
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router,
const I2NPBuildRequestRecordClearText& clearText,
I2NPBuildRequestRecordElGamalEncrypted& record)
{
router.GetElGamalEncryption ()->Encrypt ((uint8_t *)&clearText, sizeof(clearText), record.encrypted);
memcpy (record.toPeer, (const uint8_t *)router.GetIdentHash (), 16);
}
bool HandleBuildRequestRecords (int num, I2NPBuildRequestRecordElGamalEncrypted * records, I2NPBuildRequestRecordClearText& clearText)
{
for (int i = 0; i < num; i++)
{
if (!memcmp (records[i].toPeer, (const uint8_t *)i2p::context.GetRouterInfo ().GetIdentHash (), 16))
{
LogPrint ("Record ",i," is ours");
i2p::crypto::ElGamalDecrypt (i2p::context.GetEncryptionPrivateKey (), records[i].encrypted, (uint8_t *)&clearText);
// replace record to reply
I2NPBuildResponseRecord * reply = (I2NPBuildResponseRecord *)(records + i);
if (i2p::context.AcceptsTunnels ())
{
i2p::tunnel::TransitTunnel * transitTunnel =
i2p::tunnel::CreateTransitTunnel (
be32toh (clearText.receiveTunnel),
clearText.nextIdent, be32toh (clearText.nextTunnel),
clearText.layerKey, clearText.ivKey,
clearText.flag & 0x80, clearText.flag & 0x40);
i2p::tunnel::tunnels.AddTransitTunnel (transitTunnel);
reply->ret = 0;
}
else
reply->ret = 30; // always reject with bandwidth reason (30)
//TODO: fill filler
CryptoPP::SHA256().CalculateDigest(reply->hash, reply->padding, sizeof (reply->padding) + 1); // + 1 byte of ret
// encrypt reply
i2p::crypto::CBCEncryption encryption;
for (int j = 0; j < num; j++)
{
encryption.SetKey (clearText.replyKey);
encryption.SetIV (clearText.replyIV);
encryption.Encrypt((uint8_t *)(records + j), sizeof (records[j]), (uint8_t *)(records + j));
}
return true;
}
}
return false;
}
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len)
{
int num = buf[0];
LogPrint ("VariableTunnelBuild ", num, " records");
i2p::tunnel::Tunnel * tunnel = i2p::tunnel::tunnels.GetPendingTunnel (replyMsgID);
if (tunnel)
{
// endpoint of inbound tunnel
LogPrint ("VariableTunnelBuild reply for tunnel ", tunnel->GetTunnelID ());
if (tunnel->HandleTunnelBuildResponse (buf, len))
{
LogPrint ("Inbound tunnel ", tunnel->GetTunnelID (), " has been created");
tunnel->SetState (i2p::tunnel::eTunnelStateEstablished);
i2p::tunnel::tunnels.AddInboundTunnel (static_cast<i2p::tunnel::InboundTunnel *>(tunnel));
}
else
{
LogPrint ("Inbound tunnel ", tunnel->GetTunnelID (), " has been declined");
tunnel->SetState (i2p::tunnel::eTunnelStateBuildFailed);
}
}
else
{
I2NPBuildRequestRecordElGamalEncrypted * records = (I2NPBuildRequestRecordElGamalEncrypted *)(buf+1);
I2NPBuildRequestRecordClearText clearText;
if (HandleBuildRequestRecords (num, records, clearText))
{
if (clearText.flag & 0x40) // we are endpoint of outboud tunnel
{
// so we send it to reply tunnel
transports.SendMessage (clearText.nextIdent,
CreateTunnelGatewayMsg (be32toh (clearText.nextTunnel),
eI2NPVariableTunnelBuildReply, buf, len,
be32toh (clearText.nextMessageID)));
}
else
transports.SendMessage (clearText.nextIdent,
CreateI2NPMessage (eI2NPVariableTunnelBuild, buf, len, be32toh (clearText.nextMessageID)));
}
}
}
void HandleTunnelBuildMsg (uint8_t * buf, size_t len)
{
I2NPBuildRequestRecordClearText clearText;
if (HandleBuildRequestRecords (NUM_TUNNEL_BUILD_RECORDS, (I2NPBuildRequestRecordElGamalEncrypted *)buf, clearText))
{
if (clearText.flag & 0x40) // we are endpoint of outbound tunnel
{
// so we send it to reply tunnel
transports.SendMessage (clearText.nextIdent,
CreateTunnelGatewayMsg (be32toh (clearText.nextTunnel),
eI2NPTunnelBuildReply, buf, len,
be32toh (clearText.nextMessageID)));
}
else
transports.SendMessage (clearText.nextIdent,
CreateI2NPMessage (eI2NPTunnelBuild, buf, len, be32toh (clearText.nextMessageID)));
}
}
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len)
{
LogPrint ("VariableTunnelBuildReplyMsg replyMsgID=", replyMsgID);
i2p::tunnel::Tunnel * tunnel = i2p::tunnel::tunnels.GetPendingTunnel (replyMsgID);
if (tunnel)
{
// reply for outbound tunnel
if (tunnel->HandleTunnelBuildResponse (buf, len))
{
LogPrint ("Outbound tunnel ", tunnel->GetTunnelID (), " has been created");
tunnel->SetState (i2p::tunnel::eTunnelStateEstablished);
i2p::tunnel::tunnels.AddOutboundTunnel (static_cast<i2p::tunnel::OutboundTunnel *>(tunnel));
}
else
{
LogPrint ("Outbound tunnel ", tunnel->GetTunnelID (), " has been declined");
tunnel->SetState (i2p::tunnel::eTunnelStateBuildFailed);
}
}
else
LogPrint ("Pending tunnel for message ", replyMsgID, " not found");
}
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf)
{
I2NPMessage * msg = NewI2NPMessage ();
memcpy (msg->GetPayload (), buf, i2p::tunnel::TUNNEL_DATA_MSG_SIZE);
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
FillI2NPMessageHeader (msg, eI2NPTunnelData);
return msg;
}
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload)
{
I2NPMessage * msg = NewI2NPMessage ();
memcpy (msg->GetPayload () + 4, payload, i2p::tunnel::TUNNEL_DATA_MSG_SIZE - 4);
*(uint32_t *)(msg->GetPayload ()) = htobe32 (tunnelID);
msg->len += i2p::tunnel::TUNNEL_DATA_MSG_SIZE;
FillI2NPMessageHeader (msg, eI2NPTunnelData);
return msg;
}
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len)
{
I2NPMessage * msg = NewI2NPMessage (len);
TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
header->tunnelID = htobe32 (tunnelID);
header->length = htobe16 (len);
memcpy (msg->GetPayload () + sizeof (TunnelGatewayHeader), buf, len);
msg->len += sizeof (TunnelGatewayHeader) + len;
FillI2NPMessageHeader (msg, eI2NPTunnelGateway);
return msg;
}
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessage * msg)
{
if (msg->offset >= sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader))
{
// message is capable to be used without copying
TunnelGatewayHeader * header = (TunnelGatewayHeader *)(msg->GetBuffer () - sizeof (TunnelGatewayHeader));
header->tunnelID = htobe32 (tunnelID);
int len = msg->GetLength ();
header->length = htobe16 (len);
msg->offset -= (sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader));
msg->len = msg->offset + sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader) +len;
FillI2NPMessageHeader (msg, eI2NPTunnelGateway);
return msg;
}
else
{
I2NPMessage * msg1 = CreateTunnelGatewayMsg (tunnelID, msg->GetBuffer (), msg->GetLength ());
DeleteI2NPMessage (msg);
return msg1;
}
}
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
const uint8_t * buf, size_t len, uint32_t replyMsgID)
{
I2NPMessage * msg = NewI2NPMessage (len);
size_t gatewayMsgOffset = sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader);
msg->offset += gatewayMsgOffset;
msg->len += gatewayMsgOffset;
memcpy (msg->GetPayload (), buf, len);
msg->len += len;
FillI2NPMessageHeader (msg, msgType, replyMsgID); // create content message
len = msg->GetLength ();
msg->offset -= gatewayMsgOffset;
TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
header->tunnelID = htobe32 (tunnelID);
header->length = htobe16 (len);
FillI2NPMessageHeader (msg, eI2NPTunnelGateway); // gateway message
return msg;
}
void HandleTunnelGatewayMsg (I2NPMessage * msg)
{
TunnelGatewayHeader * header = (TunnelGatewayHeader *)msg->GetPayload ();
uint32_t tunnelID = be32toh(header->tunnelID);
uint16_t len = be16toh(header->length);
// we make payload as new I2NP message to send
msg->offset += sizeof (I2NPHeader) + sizeof (TunnelGatewayHeader);
msg->len = msg->offset + len;
LogPrint ("TunnelGateway of ", (int)len, " bytes for tunnel ", (unsigned int)tunnelID, ". Msg type ", (int)msg->GetHeader()->typeID);
if (msg->GetHeader()->typeID == eI2NPDatabaseStore ||
msg->GetHeader()->typeID == eI2NPDatabaseSearchReply)
{
// transit DatabaseStore my contain new/updated RI
// or DatabaseSearchReply with new routers
auto ds = NewI2NPMessage ();
*ds = *msg;
i2p::data::netdb.PostI2NPMsg (ds);
}
i2p::tunnel::TransitTunnel * tunnel = i2p::tunnel::tunnels.GetTransitTunnel (tunnelID);
if (tunnel)
tunnel->SendTunnelDataMsg (msg);
else
{
LogPrint ("Tunnel ", (unsigned int)tunnelID, " not found");
i2p::DeleteI2NPMessage (msg);
}
}
size_t GetI2NPMessageLength (const uint8_t * msg)
{
I2NPHeader * header = (I2NPHeader *)msg;
return be16toh (header->size) + sizeof (I2NPHeader);
}
void HandleI2NPMessage (uint8_t * msg, size_t len)
{
I2NPHeader * header = (I2NPHeader *)msg;
uint32_t msgID = be32toh (header->msgID);
LogPrint ("I2NP msg received len=", len,", type=", (int)header->typeID, ", msgID=", (unsigned int)msgID);
uint8_t * buf = msg + sizeof (I2NPHeader);
int size = be16toh (header->size);
switch (header->typeID)
{
case eI2NPVariableTunnelBuild:
LogPrint ("VariableTunnelBuild");
HandleVariableTunnelBuildMsg (msgID, buf, size);
break;
case eI2NPVariableTunnelBuildReply:
LogPrint ("VariableTunnelBuildReply");
HandleVariableTunnelBuildReplyMsg (msgID, buf, size);
break;
case eI2NPTunnelBuild:
LogPrint ("TunnelBuild");
HandleTunnelBuildMsg (buf, size);
break;
case eI2NPTunnelBuildReply:
LogPrint ("TunnelBuildReply");
// TODO:
break;
default:
LogPrint ("Unexpected message ", (int)header->typeID);
}
}
void HandleI2NPMessage (I2NPMessage * msg)
{
if (msg)
{
switch (msg->GetHeader ()->typeID)
{
case eI2NPTunnelData:
LogPrint ("TunnelData");
i2p::tunnel::tunnels.PostTunnelData (msg);
break;
case eI2NPTunnelGateway:
LogPrint ("TunnelGateway");
HandleTunnelGatewayMsg (msg);
break;
case eI2NPGarlic:
LogPrint ("Garlic");
if (msg->from)
{
if (msg->from->GetTunnelPool ())
msg->from->GetTunnelPool ()->ProcessGarlicMessage (msg);
else
{
LogPrint (eLogInfo, "Local destination for garlic doesn't exist anymore");
DeleteI2NPMessage (msg);
}
}
else
i2p::context.ProcessGarlicMessage (msg);
break;
case eI2NPDatabaseStore:
case eI2NPDatabaseSearchReply:
case eI2NPDatabaseLookup:
// forward to netDb
i2p::data::netdb.PostI2NPMsg (msg);
break;
case eI2NPDeliveryStatus:
LogPrint ("DeliveryStatus");
if (msg->from && msg->from->GetTunnelPool ())
msg->from->GetTunnelPool ()->ProcessDeliveryStatus (msg);
else
i2p::context.ProcessDeliveryStatusMessage (msg);
break;
default:
HandleI2NPMessage (msg->GetBuffer (), msg->GetLength ());
DeleteI2NPMessage (msg);
}
}
}
}

View File

@ -1,217 +0,0 @@
#ifndef I2NP_PROTOCOL_H__
#define I2NP_PROTOCOL_H__
#include <inttypes.h>
#include <set>
#include <string.h>
#include "I2PEndian.h"
#include "RouterInfo.h"
#include "LeaseSet.h"
namespace i2p
{
#pragma pack (1)
struct I2NPHeader
{
uint8_t typeID;
uint32_t msgID;
uint64_t expiration;
uint16_t size;
uint8_t chks;
};
struct I2NPHeaderShort
{
uint8_t typeID;
uint32_t shortExpiration;
};
struct I2NPDatabaseStoreMsg
{
uint8_t key[32];
uint8_t type;
uint32_t replyToken;
};
struct I2NPDeliveryStatusMsg
{
uint32_t msgID;
uint64_t timestamp;
};
struct I2NPBuildRequestRecordClearText
{
uint32_t receiveTunnel;
uint8_t ourIdent[32];
uint32_t nextTunnel;
uint8_t nextIdent[32];
uint8_t layerKey[32];
uint8_t ivKey[32];
uint8_t replyKey[32];
uint8_t replyIV[16];
uint8_t flag;
uint32_t requestTime;
uint32_t nextMessageID;
uint8_t filler[29];
};
struct I2NPBuildResponseRecord
{
uint8_t hash[32];
uint8_t padding[495];
uint8_t ret;
};
struct I2NPBuildRequestRecordElGamalEncrypted
{
uint8_t toPeer[16];
uint8_t encrypted[512];
};
struct TunnelGatewayHeader
{
uint32_t tunnelID;
uint16_t length;
};
#pragma pack ()
enum I2NPMessageType
{
eI2NPDatabaseStore = 1,
eI2NPDatabaseLookup = 2,
eI2NPDatabaseSearchReply = 3,
eI2NPDeliveryStatus = 10,
eI2NPGarlic = 11,
eI2NPTunnelData = 18,
eI2NPTunnelGateway = 19,
eI2NPData = 20,
eI2NPTunnelBuild = 21,
eI2NPTunnelBuildReply = 22,
eI2NPVariableTunnelBuild = 23,
eI2NPVariableTunnelBuildReply = 24
};
const int NUM_TUNNEL_BUILD_RECORDS = 8;
namespace tunnel
{
class InboundTunnel;
class TunnelPool;
}
const size_t I2NP_MAX_MESSAGE_SIZE = 32768;
const size_t I2NP_MAX_SHORT_MESSAGE_SIZE = 2400;
struct I2NPMessage
{
uint8_t * buf;
size_t len, offset, maxLen;
i2p::tunnel::InboundTunnel * from;
I2NPMessage (): buf (nullptr),len (sizeof (I2NPHeader) + 2),
offset(2), maxLen (0), from (nullptr) {};
// reserve 2 bytes for NTCP header
I2NPHeader * GetHeader () { return (I2NPHeader *)GetBuffer (); };
uint8_t * GetPayload () { return GetBuffer () + sizeof(I2NPHeader); };
uint8_t * GetBuffer () { return buf + offset; };
const uint8_t * GetBuffer () const { return buf + offset; };
size_t GetLength () const { return len - offset; };
void Align (size_t alignment)
{
size_t rem = ((size_t)GetBuffer ()) % alignment;
if (rem)
{
offset += (alignment - rem);
len += (alignment - rem);
}
}
I2NPMessage& operator=(const I2NPMessage& other)
{
memcpy (buf + offset, other.buf + other.offset, other.GetLength ());
len = offset + other.GetLength ();
from = other.from;
return *this;
}
// for SSU only
uint8_t * GetSSUHeader () { return buf + offset + sizeof(I2NPHeader) - sizeof(I2NPHeaderShort); };
void FromSSU (uint32_t msgID) // we have received SSU message and convert it to regular
{
I2NPHeaderShort ssu = *(I2NPHeaderShort *)GetSSUHeader ();
I2NPHeader * header = GetHeader ();
header->typeID = ssu.typeID;
header->msgID = htobe32 (msgID);
header->expiration = htobe64 (be32toh (ssu.shortExpiration)*1000LL);
header->size = htobe16 (len - offset - sizeof (I2NPHeader));
header->chks = 0;
}
uint32_t ToSSU () // return msgID
{
I2NPHeader header = *GetHeader ();
I2NPHeaderShort * ssu = (I2NPHeaderShort *)GetSSUHeader ();
ssu->typeID = header.typeID;
ssu->shortExpiration = htobe32 (be64toh (header.expiration)/1000LL);
len = offset + sizeof (I2NPHeaderShort) + be16toh (header.size);
return be32toh (header.msgID);
}
};
template<int sz>
struct I2NPMessageBuffer: public I2NPMessage
{
I2NPMessageBuffer () { buf = m_Buffer; maxLen = sz; };
uint8_t m_Buffer[sz];
};
I2NPMessage * NewI2NPMessage ();
I2NPMessage * NewI2NPShortMessage ();
I2NPMessage * NewI2NPMessage (size_t len);
void DeleteI2NPMessage (I2NPMessage * msg);
void FillI2NPMessageHeader (I2NPMessage * msg, I2NPMessageType msgType, uint32_t replyMsgID = 0);
void RenewI2NPMessageHeader (I2NPMessage * msg);
I2NPMessage * CreateI2NPMessage (I2NPMessageType msgType, const uint8_t * buf, int len, uint32_t replyMsgID = 0);
I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from = nullptr);
I2NPMessage * CreateDeliveryStatusMsg (uint32_t msgID);
I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from,
uint32_t replyTunnelID, bool exploratory = false,
std::set<i2p::data::IdentHash> * excludedPeers = nullptr, bool encryption = false,
i2p::tunnel::TunnelPool * pool = nullptr);
I2NPMessage * CreateDatabaseSearchReply (const i2p::data::IdentHash& ident, const i2p::data::RouterInfo * floodfill);
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::RouterInfo * router = nullptr);
I2NPMessage * CreateDatabaseStoreMsg (const i2p::data::LeaseSet * leaseSet, uint32_t replyToken = 0);
I2NPBuildRequestRecordClearText CreateBuildRequestRecord (
const uint8_t * ourIdent, uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
const uint8_t * replyKey, const uint8_t * replyIV, uint32_t nextMessageID,
bool isGateway, bool isEndpoint);
void EncryptBuildRequestRecord (const i2p::data::RouterInfo& router,
const I2NPBuildRequestRecordClearText& clearText,
I2NPBuildRequestRecordElGamalEncrypted& record);
bool HandleBuildRequestRecords (int num, I2NPBuildRequestRecordElGamalEncrypted * records, I2NPBuildRequestRecordClearText& clearText);
void HandleVariableTunnelBuildMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
void HandleVariableTunnelBuildReplyMsg (uint32_t replyMsgID, uint8_t * buf, size_t len);
void HandleTunnelBuildMsg (uint8_t * buf, size_t len);
I2NPMessage * CreateTunnelDataMsg (const uint8_t * buf);
I2NPMessage * CreateTunnelDataMsg (uint32_t tunnelID, const uint8_t * payload);
void HandleTunnelGatewayMsg (I2NPMessage * msg);
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, const uint8_t * buf, size_t len);
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessageType msgType,
const uint8_t * buf, size_t len, uint32_t replyMsgID = 0);
I2NPMessage * CreateTunnelGatewayMsg (uint32_t tunnelID, I2NPMessage * msg);
size_t GetI2NPMessageLength (const uint8_t * msg);
void HandleI2NPMessage (uint8_t * msg, size_t len);
void HandleI2NPMessage (I2NPMessage * msg);
}
#endif

View File

@ -1,48 +0,0 @@
#ifndef I2PENDIAN_H__
#define I2PENDIAN_H__
#if defined(__linux__) || defined(__FreeBSD_kernel__)
#include <endian.h>
#elif __FreeBSD__
#include <sys/endian.h>
#elif defined(__APPLE__) && defined(__MACH__)
#include <libkern/OSByteOrder.h>
#define htobe16(x) OSSwapHostToBigInt16(x)
#define htole16(x) OSSwapHostToLittleInt16(x)
#define be16toh(x) OSSwapBigToHostInt16(x)
#define le16toh(x) OSSwapLittleToHostInt16(x)
#define htobe32(x) OSSwapHostToBigInt32(x)
#define htole32(x) OSSwapHostToLittleInt32(x)
#define be32toh(x) OSSwapBigToHostInt32(x)
#define le32toh(x) OSSwapLittleToHostInt32(x)
#define htobe64(x) OSSwapHostToBigInt64(x)
#define htole64(x) OSSwapHostToLittleInt64(x)
#define be64toh(x) OSSwapBigToHostInt64(x)
#define le64toh(x) OSSwapLittleToHostInt64(x)
#else
#include <cstdint>
uint16_t htobe16(uint16_t int16);
uint32_t htobe32(uint32_t int32);
uint64_t htobe64(uint64_t int64);
uint16_t be16toh(uint16_t big16);
uint32_t be32toh(uint32_t big32);
uint64_t be64toh(uint64_t big64);
// assume LittleEndine
#define htole16
#define htole32
#define htole64
#define le16toh
#define le32toh
#define le64toh
#endif
#endif // I2PENDIAN_H__

View File

@ -1,300 +0,0 @@
#include "base64.h"
#include "Log.h"
#include "NetDb.h"
#include "Destination.h"
#include "ClientContext.h"
#include "I2PTunnel.h"
namespace i2p
{
namespace client
{
I2PTunnelConnection::I2PTunnelConnection (I2PTunnel * owner,
boost::asio::ip::tcp::socket * socket, const i2p::data::LeaseSet * leaseSet):
m_Socket (socket), m_Owner (owner), m_RemoteEndpoint (socket->remote_endpoint ()),
m_IsQuiet (true)
{
m_Stream = m_Owner->GetLocalDestination ()->CreateStream (*leaseSet);
}
I2PTunnelConnection::I2PTunnelConnection (I2PTunnel * owner, std::shared_ptr<i2p::stream::Stream> stream,
boost::asio::ip::tcp::socket * socket, const boost::asio::ip::tcp::endpoint& target, bool quiet):
m_Socket (socket), m_Stream (stream), m_Owner (owner), m_RemoteEndpoint (target), m_IsQuiet (quiet)
{
}
I2PTunnelConnection::~I2PTunnelConnection ()
{
delete m_Socket;
}
void I2PTunnelConnection::I2PConnect (const uint8_t * msg, size_t len)
{
if (msg)
m_Stream->Send (msg, len); // connect and send
else
m_Stream->Send (m_Buffer, 0); // connect
StreamReceive ();
Receive ();
}
void I2PTunnelConnection::Connect ()
{
if (m_Socket)
m_Socket->async_connect (m_RemoteEndpoint, std::bind (&I2PTunnelConnection::HandleConnect,
shared_from_this (), std::placeholders::_1));
}
void I2PTunnelConnection::Terminate ()
{
if (m_Stream)
{
m_Stream->Close ();
m_Stream.reset ();
}
m_Socket->close ();
if (m_Owner)
m_Owner->RemoveConnection (shared_from_this ());
}
void I2PTunnelConnection::Receive ()
{
m_Socket->async_read_some (boost::asio::buffer(m_Buffer, I2P_TUNNEL_CONNECTION_BUFFER_SIZE),
std::bind(&I2PTunnelConnection::HandleReceived, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void I2PTunnelConnection::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("I2PTunnel read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
if (m_Stream)
m_Stream->Send (m_Buffer, bytes_transferred);
Receive ();
}
}
void I2PTunnelConnection::HandleWrite (const boost::system::error_code& ecode)
{
if (ecode)
{
LogPrint ("I2PTunnel write error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
StreamReceive ();
}
void I2PTunnelConnection::StreamReceive ()
{
if (m_Stream)
m_Stream->AsyncReceive (boost::asio::buffer (m_StreamBuffer, I2P_TUNNEL_CONNECTION_BUFFER_SIZE),
std::bind (&I2PTunnelConnection::HandleStreamReceive, shared_from_this (),
std::placeholders::_1, std::placeholders::_2),
I2P_TUNNEL_CONNECTION_MAX_IDLE);
}
void I2PTunnelConnection::HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("I2PTunnel stream read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
boost::asio::async_write (*m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred),
std::bind (&I2PTunnelConnection::HandleWrite, shared_from_this (), std::placeholders::_1));
}
}
void I2PTunnelConnection::HandleConnect (const boost::system::error_code& ecode)
{
if (ecode)
{
LogPrint ("I2PTunnel connect error: ", ecode.message ());
Terminate ();
}
else
{
LogPrint ("I2PTunnel connected");
if (m_IsQuiet)
StreamReceive ();
else
{
// send destination first like received from I2P
std::string dest = m_Stream->GetRemoteIdentity ().ToBase64 ();
dest += "\n";
memcpy (m_StreamBuffer, dest.c_str (), dest.size ());
HandleStreamReceive (boost::system::error_code (), dest.size ());
}
Receive ();
}
}
void I2PTunnel::AddConnection (std::shared_ptr<I2PTunnelConnection> conn)
{
m_Connections.insert (conn);
}
void I2PTunnel::RemoveConnection (std::shared_ptr<I2PTunnelConnection> conn)
{
m_Connections.erase (conn);
}
void I2PTunnel::ClearConnections ()
{
m_Connections.clear ();
}
I2PClientTunnel::I2PClientTunnel (boost::asio::io_service& service, const std::string& destination,
int port, ClientDestination * localDestination):
I2PTunnel (service, localDestination ? localDestination :
i2p::client::context.CreateNewLocalDestination (false, i2p::data::SIGNING_KEY_TYPE_ECDSA_SHA256_P256)),
m_Acceptor (service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)),
m_Timer (service), m_Destination (destination), m_DestinationIdentHash (nullptr),
m_RemoteLeaseSet (nullptr)
{
}
I2PClientTunnel::~I2PClientTunnel ()
{
Stop ();
}
void I2PClientTunnel::Start ()
{
i2p::data::IdentHash identHash;
if (i2p::client::context.GetAddressBook ().GetIdentHash (m_Destination, identHash))
m_DestinationIdentHash = new i2p::data::IdentHash (identHash);
if (!m_DestinationIdentHash)
LogPrint ("I2PTunnel unknown destination ", m_Destination);
m_Acceptor.listen ();
Accept ();
}
void I2PClientTunnel::Stop ()
{
m_Acceptor.close();
m_Timer.cancel ();
ClearConnections ();
m_DestinationIdentHash = nullptr;
}
void I2PClientTunnel::Accept ()
{
auto newSocket = new boost::asio::ip::tcp::socket (GetService ());
m_Acceptor.async_accept (*newSocket, std::bind (&I2PClientTunnel::HandleAccept, this,
std::placeholders::_1, newSocket));
}
void I2PClientTunnel::HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket)
{
if (!ecode)
{
if (!m_DestinationIdentHash)
{
i2p::data::IdentHash identHash;
if (i2p::client::context.GetAddressBook ().GetIdentHash (m_Destination, identHash))
m_DestinationIdentHash = new i2p::data::IdentHash (identHash);
}
if (m_DestinationIdentHash)
{
// try to get a LeaseSet
m_RemoteLeaseSet = GetLocalDestination ()->FindLeaseSet (*m_DestinationIdentHash);
if (m_RemoteLeaseSet && m_RemoteLeaseSet->HasNonExpiredLeases ())
CreateConnection (socket);
else
{
i2p::data::netdb.RequestDestination (*m_DestinationIdentHash, true, GetLocalDestination ()->GetTunnelPool ());
m_Timer.expires_from_now (boost::posix_time::seconds (I2P_TUNNEL_DESTINATION_REQUEST_TIMEOUT));
m_Timer.async_wait (std::bind (&I2PClientTunnel::HandleDestinationRequestTimer,
this, std::placeholders::_1, socket));
}
}
else
{
LogPrint ("Remote destination ", m_Destination, " not found");
delete socket;
}
Accept ();
}
else
delete socket;
}
void I2PClientTunnel::HandleDestinationRequestTimer (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket)
{
if (ecode != boost::asio::error::operation_aborted)
{
if (m_DestinationIdentHash)
{
m_RemoteLeaseSet = GetLocalDestination ()->FindLeaseSet (*m_DestinationIdentHash);
CreateConnection (socket);
return;
}
}
delete socket;
}
void I2PClientTunnel::CreateConnection (boost::asio::ip::tcp::socket * socket)
{
if (m_RemoteLeaseSet) // leaseSet found
{
LogPrint ("New I2PTunnel connection");
auto connection = std::make_shared<I2PTunnelConnection>(this, socket, m_RemoteLeaseSet);
AddConnection (connection);
connection->I2PConnect ();
}
else
{
LogPrint ("LeaseSet for I2PTunnel destination not found");
delete socket;
}
}
I2PServerTunnel::I2PServerTunnel (boost::asio::io_service& service, const std::string& address, int port,
ClientDestination * localDestination): I2PTunnel (service, localDestination),
m_Endpoint (boost::asio::ip::address::from_string (address), port)
{
}
void I2PServerTunnel::Start ()
{
Accept ();
}
void I2PServerTunnel::Stop ()
{
ClearConnections ();
}
void I2PServerTunnel::Accept ()
{
auto localDestination = GetLocalDestination ();
if (localDestination)
localDestination->AcceptStreams (std::bind (&I2PServerTunnel::HandleAccept, this, std::placeholders::_1));
else
LogPrint ("Local destination not set for server tunnel");
}
void I2PServerTunnel::HandleAccept (std::shared_ptr<i2p::stream::Stream> stream)
{
if (stream)
{
auto conn = std::make_shared<I2PTunnelConnection> (this, stream, new boost::asio::ip::tcp::socket (GetService ()), m_Endpoint);
AddConnection (conn);
conn->Connect ();
}
}
}
}

View File

@ -1,129 +0,0 @@
#ifndef I2PTUNNEL_H__
#define I2PTUNNEL_H__
#include <inttypes.h>
#include <string>
#include <set>
#include <memory>
#include <boost/asio.hpp>
#include "Identity.h"
#include "Destination.h"
#include "Streaming.h"
namespace i2p
{
namespace client
{
const size_t I2P_TUNNEL_CONNECTION_BUFFER_SIZE = 8192;
const int I2P_TUNNEL_CONNECTION_MAX_IDLE = 3600; // in seconds
const int I2P_TUNNEL_DESTINATION_REQUEST_TIMEOUT = 10; // in seconds
class I2PTunnel;
class I2PTunnelConnection: public std::enable_shared_from_this<I2PTunnelConnection>
{
public:
I2PTunnelConnection (I2PTunnel * owner, boost::asio::ip::tcp::socket * socket,
const i2p::data::LeaseSet * leaseSet); // to I2P
I2PTunnelConnection (I2PTunnel * owner, std::shared_ptr<i2p::stream::Stream> stream, boost::asio::ip::tcp::socket * socket,
const boost::asio::ip::tcp::endpoint& target, bool quiet = true); // from I2P
~I2PTunnelConnection ();
void I2PConnect (const uint8_t * msg = nullptr, size_t len = 0);
void Connect ();
private:
void Terminate ();
void Receive ();
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleWrite (const boost::system::error_code& ecode);
void StreamReceive ();
void HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleConnect (const boost::system::error_code& ecode);
private:
uint8_t m_Buffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE], m_StreamBuffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE];
boost::asio::ip::tcp::socket * m_Socket;
std::shared_ptr<i2p::stream::Stream> m_Stream;
I2PTunnel * m_Owner;
boost::asio::ip::tcp::endpoint m_RemoteEndpoint;
bool m_IsQuiet; // don't send destination
};
class I2PTunnel
{
public:
I2PTunnel (boost::asio::io_service& service, ClientDestination * localDestination):
m_Service (service), m_LocalDestination (localDestination) {};
virtual ~I2PTunnel () { ClearConnections (); };
void AddConnection (std::shared_ptr<I2PTunnelConnection> conn);
void RemoveConnection (std::shared_ptr<I2PTunnelConnection> conn);
void ClearConnections ();
ClientDestination * GetLocalDestination () { return m_LocalDestination; };
void SetLocalDestination (ClientDestination * dest) { m_LocalDestination = dest; };
boost::asio::io_service& GetService () { return m_Service; };
private:
boost::asio::io_service& m_Service;
ClientDestination * m_LocalDestination;
std::set<std::shared_ptr<I2PTunnelConnection> > m_Connections;
};
class I2PClientTunnel: public I2PTunnel
{
public:
I2PClientTunnel (boost::asio::io_service& service, const std::string& destination, int port,
ClientDestination * localDestination = nullptr);
~I2PClientTunnel ();
void Start ();
void Stop ();
private:
void Accept ();
void HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket);
void HandleDestinationRequestTimer (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket);
void CreateConnection (boost::asio::ip::tcp::socket * socket);
private:
boost::asio::ip::tcp::acceptor m_Acceptor;
boost::asio::deadline_timer m_Timer;
std::string m_Destination;
const i2p::data::IdentHash * m_DestinationIdentHash;
const i2p::data::LeaseSet * m_RemoteLeaseSet;
};
class I2PServerTunnel: public I2PTunnel
{
public:
I2PServerTunnel (boost::asio::io_service& service, const std::string& address, int port,
ClientDestination * localDestination);
void Start ();
void Stop ();
private:
void Accept ();
void HandleAccept (std::shared_ptr<i2p::stream::Stream> stream);
private:
boost::asio::ip::tcp::endpoint m_Endpoint;
};
}
}
#endif

View File

@ -1,548 +0,0 @@
#include <time.h>
#include <stdio.h>
#include <cryptopp/sha.h>
#include <cryptopp/osrng.h>
#include <cryptopp/dsa.h>
#include "base64.h"
#include "CryptoConst.h"
#include "RouterContext.h"
#include "Identity.h"
#include "I2PEndian.h"
namespace i2p
{
namespace data
{
Identity& Identity::operator=(const Keys& keys)
{
// copy public and signing keys together
memcpy (publicKey, keys.publicKey, sizeof (publicKey) + sizeof (signingKey));
memset (&certificate, 0, sizeof (certificate));
return *this;
}
size_t Identity::FromBuffer (const uint8_t * buf, size_t len)
{
memcpy (publicKey, buf, DEFAULT_IDENTITY_SIZE);
return DEFAULT_IDENTITY_SIZE;
}
IdentHash Identity::Hash () const
{
IdentHash hash;
CryptoPP::SHA256().CalculateDigest(hash, publicKey, DEFAULT_IDENTITY_SIZE);
return hash;
}
IdentityEx::IdentityEx ():
m_Verifier (nullptr), m_ExtendedLen (0), m_ExtendedBuffer (nullptr)
{
}
IdentityEx::IdentityEx(const uint8_t * publicKey, const uint8_t * signingKey, SigningKeyType type)
{
memcpy (m_StandardIdentity.publicKey, publicKey, sizeof (m_StandardIdentity.publicKey));
if (type != SIGNING_KEY_TYPE_DSA_SHA1)
{
size_t excessLen = 0;
uint8_t * excessBuf = nullptr;
switch (type)
{
case SIGNING_KEY_TYPE_ECDSA_SHA256_P256:
{
size_t padding = 128 - i2p::crypto::ECDSAP256_KEY_LENGTH; // 64 = 128 - 64
memcpy (m_StandardIdentity.signingKey + padding, signingKey, i2p::crypto::ECDSAP256_KEY_LENGTH);
break;
}
case SIGNING_KEY_TYPE_ECDSA_SHA384_P384:
{
size_t padding = 128 - i2p::crypto::ECDSAP384_KEY_LENGTH; // 32 = 128 - 96
memcpy (m_StandardIdentity.signingKey + padding, signingKey, i2p::crypto::ECDSAP384_KEY_LENGTH);
break;
}
case SIGNING_KEY_TYPE_ECDSA_SHA512_P521:
{
memcpy (m_StandardIdentity.signingKey, signingKey, 128);
excessLen = i2p::crypto::ECDSAP521_KEY_LENGTH - 128; // 4 = 132 - 128
excessBuf = new uint8_t[excessLen];
memcpy (excessBuf, signingKey + 128, excessLen);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
{
memcpy (m_StandardIdentity.signingKey, signingKey, 128);
excessLen = i2p::crypto::RSASHA2562048_KEY_LENGTH - 128; // 128 = 256 - 128
excessBuf = new uint8_t[excessLen];
memcpy (excessBuf, signingKey + 128, excessLen);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
{
memcpy (m_StandardIdentity.signingKey, signingKey, 128);
excessLen = i2p::crypto::RSASHA3843072_KEY_LENGTH - 128; // 256 = 384 - 128
excessBuf = new uint8_t[excessLen];
memcpy (excessBuf, signingKey + 128, excessLen);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
{
memcpy (m_StandardIdentity.signingKey, signingKey, 128);
excessLen = i2p::crypto::RSASHA5124096_KEY_LENGTH - 128; // 384 = 512 - 128
excessBuf = new uint8_t[excessLen];
memcpy (excessBuf, signingKey + 128, excessLen);
break;
}
default:
LogPrint ("Signing key type ", (int)type, " is not supported");
}
m_ExtendedLen = 4 + excessLen; // 4 bytes extra + excess length
// fill certificate
m_StandardIdentity.certificate.type = CERTIFICATE_TYPE_KEY;
m_StandardIdentity.certificate.length = htobe16 (m_ExtendedLen);
// fill extended buffer
m_ExtendedBuffer = new uint8_t[m_ExtendedLen];
*(uint16_t *)m_ExtendedBuffer = htobe16 (type);
*(uint16_t *)(m_ExtendedBuffer + 2) = htobe16 (CRYPTO_KEY_TYPE_ELGAMAL);
if (excessLen && excessBuf)
{
memcpy (m_ExtendedBuffer + 4, excessBuf, excessLen);
delete[] excessBuf;
}
// calculate ident hash
uint8_t * buf = new uint8_t[GetFullLen ()];
ToBuffer (buf, GetFullLen ());
CryptoPP::SHA256().CalculateDigest(m_IdentHash, buf, GetFullLen ());
delete[] buf;
}
else // DSA-SHA1
{
memcpy (m_StandardIdentity.signingKey, signingKey, sizeof (m_StandardIdentity.signingKey));
memset (&m_StandardIdentity.certificate, 0, sizeof (m_StandardIdentity.certificate));
m_IdentHash = m_StandardIdentity.Hash ();
m_ExtendedLen = 0;
m_ExtendedBuffer = nullptr;
}
CreateVerifier ();
}
IdentityEx::IdentityEx (const uint8_t * buf, size_t len):
m_Verifier (nullptr), m_ExtendedLen (0), m_ExtendedBuffer (nullptr)
{
FromBuffer (buf, len);
}
IdentityEx::IdentityEx (const IdentityEx& other):
m_Verifier (nullptr), m_ExtendedBuffer (nullptr)
{
*this = other;
}
IdentityEx::~IdentityEx ()
{
delete m_Verifier;
delete[] m_ExtendedBuffer;
}
IdentityEx& IdentityEx::operator=(const IdentityEx& other)
{
memcpy (&m_StandardIdentity, &other.m_StandardIdentity, DEFAULT_IDENTITY_SIZE);
m_IdentHash = other.m_IdentHash;
delete[] m_ExtendedBuffer;
m_ExtendedLen = other.m_ExtendedLen;
if (m_ExtendedLen > 0)
{
m_ExtendedBuffer = new uint8_t[m_ExtendedLen];
memcpy (m_ExtendedBuffer, other.m_ExtendedBuffer, m_ExtendedLen);
}
else
m_ExtendedBuffer = nullptr;
delete m_Verifier;
m_Verifier = nullptr;
return *this;
}
IdentityEx& IdentityEx::operator=(const Identity& standard)
{
m_StandardIdentity = standard;
m_IdentHash = m_StandardIdentity.Hash ();
delete[] m_ExtendedBuffer;
m_ExtendedBuffer = nullptr;
m_ExtendedLen = 0;
delete m_Verifier;
m_Verifier = nullptr;
return *this;
}
size_t IdentityEx::FromBuffer (const uint8_t * buf, size_t len)
{
if (len < DEFAULT_IDENTITY_SIZE)
{
LogPrint (eLogError, "Identity buffer length ", len, " is too small");
return 0;
}
memcpy (&m_StandardIdentity, buf, DEFAULT_IDENTITY_SIZE);
delete[] m_ExtendedBuffer;
if (m_StandardIdentity.certificate.length)
{
m_ExtendedLen = be16toh (m_StandardIdentity.certificate.length);
if (m_ExtendedLen + DEFAULT_IDENTITY_SIZE <= len)
{
m_ExtendedBuffer = new uint8_t[m_ExtendedLen];
memcpy (m_ExtendedBuffer, buf + DEFAULT_IDENTITY_SIZE, m_ExtendedLen);
}
else
{
LogPrint (eLogError, "Certificate length ", m_ExtendedLen, " exceeds buffer length ", len - DEFAULT_IDENTITY_SIZE);
return 0;
}
}
else
{
m_ExtendedLen = 0;
m_ExtendedBuffer = nullptr;
}
CryptoPP::SHA256().CalculateDigest(m_IdentHash, buf, GetFullLen ());
delete m_Verifier;
m_Verifier = nullptr;
return GetFullLen ();
}
size_t IdentityEx::ToBuffer (uint8_t * buf, size_t len) const
{
memcpy (buf, &m_StandardIdentity, DEFAULT_IDENTITY_SIZE);
if (m_ExtendedLen > 0 && m_ExtendedBuffer)
memcpy (buf + DEFAULT_IDENTITY_SIZE, m_ExtendedBuffer, m_ExtendedLen);
return GetFullLen ();
}
size_t IdentityEx::FromBase64(const std::string& s)
{
uint8_t buf[1024];
auto len = Base64ToByteStream (s.c_str(), s.length(), buf, 1024);
return FromBuffer (buf, len);
}
std::string IdentityEx::ToBase64 () const
{
uint8_t buf[1024];
char str[1536];
size_t l = ToBuffer (buf, 1024);
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, str, 1536);
str[l1] = 0;
return std::string (str);
}
size_t IdentityEx::GetSigningPublicKeyLen () const
{
if (!m_Verifier) CreateVerifier ();
if (m_Verifier)
return m_Verifier->GetPublicKeyLen ();
return 128;
}
size_t IdentityEx::GetSigningPrivateKeyLen () const
{
if (!m_Verifier) CreateVerifier ();
if (m_Verifier)
return m_Verifier->GetPrivateKeyLen ();
return GetSignatureLen ()/2;
}
size_t IdentityEx::GetSignatureLen () const
{
if (!m_Verifier) CreateVerifier ();
if (m_Verifier)
return m_Verifier->GetSignatureLen ();
return 40;
}
bool IdentityEx::Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const
{
if (!m_Verifier) CreateVerifier ();
if (m_Verifier)
return m_Verifier->Verify (buf, len, signature);
return false;
}
SigningKeyType IdentityEx::GetSigningKeyType () const
{
if (m_StandardIdentity.certificate.type == CERTIFICATE_TYPE_KEY && m_ExtendedBuffer)
return be16toh (*(const uint16_t *)m_ExtendedBuffer); // signing key
return SIGNING_KEY_TYPE_DSA_SHA1;
}
CryptoKeyType IdentityEx::GetCryptoKeyType () const
{
if (m_StandardIdentity.certificate.type == CERTIFICATE_TYPE_KEY && m_ExtendedBuffer)
return be16toh (*(const uint16_t *)(m_ExtendedBuffer + 2)); // crypto key
return CRYPTO_KEY_TYPE_ELGAMAL;
}
void IdentityEx::CreateVerifier () const
{
auto keyType = GetSigningKeyType ();
switch (keyType)
{
case SIGNING_KEY_TYPE_DSA_SHA1:
m_Verifier = new i2p::crypto::DSAVerifier (m_StandardIdentity.signingKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA256_P256:
{
size_t padding = 128 - i2p::crypto::ECDSAP256_KEY_LENGTH; // 64 = 128 - 64
m_Verifier = new i2p::crypto::ECDSAP256Verifier (m_StandardIdentity.signingKey + padding);
break;
}
case SIGNING_KEY_TYPE_ECDSA_SHA384_P384:
{
size_t padding = 128 - i2p::crypto::ECDSAP384_KEY_LENGTH; // 32 = 128 - 96
m_Verifier = new i2p::crypto::ECDSAP384Verifier (m_StandardIdentity.signingKey + padding);
break;
}
case SIGNING_KEY_TYPE_ECDSA_SHA512_P521:
{
uint8_t signingKey[i2p::crypto::ECDSAP521_KEY_LENGTH];
memcpy (signingKey, m_StandardIdentity.signingKey, 128);
size_t excessLen = i2p::crypto::ECDSAP521_KEY_LENGTH - 128; // 4 = 132- 128
memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
m_Verifier = new i2p::crypto::ECDSAP521Verifier (signingKey);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
{
uint8_t signingKey[i2p::crypto::RSASHA2562048_KEY_LENGTH];
memcpy (signingKey, m_StandardIdentity.signingKey, 128);
size_t excessLen = i2p::crypto::RSASHA2562048_KEY_LENGTH - 128; // 128 = 256- 128
memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
m_Verifier = new i2p::crypto:: RSASHA2562048Verifier (signingKey);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
{
uint8_t signingKey[i2p::crypto::RSASHA3843072_KEY_LENGTH];
memcpy (signingKey, m_StandardIdentity.signingKey, 128);
size_t excessLen = i2p::crypto::RSASHA3843072_KEY_LENGTH - 128; // 256 = 384- 128
memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
m_Verifier = new i2p::crypto:: RSASHA3843072Verifier (signingKey);
break;
}
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
{
uint8_t signingKey[i2p::crypto::RSASHA5124096_KEY_LENGTH];
memcpy (signingKey, m_StandardIdentity.signingKey, 128);
size_t excessLen = i2p::crypto::RSASHA5124096_KEY_LENGTH - 128; // 384 = 512- 128
memcpy (signingKey + 128, m_ExtendedBuffer + 4, excessLen); // right after signing and crypto key types
m_Verifier = new i2p::crypto:: RSASHA5124096Verifier (signingKey);
break;
}
default:
LogPrint ("Signing key type ", (int)keyType, " is not supported");
}
}
void IdentityEx::DropVerifier ()
{
auto verifier = m_Verifier;
m_Verifier = nullptr; // TODO: make this atomic
delete verifier;
}
PrivateKeys& PrivateKeys::operator=(const Keys& keys)
{
m_Public = Identity (keys);
memcpy (m_PrivateKey, keys.privateKey, 256); // 256
memcpy (m_SigningPrivateKey, keys.signingPrivateKey, m_Public.GetSigningPrivateKeyLen ());
delete m_Signer;
m_Signer = nullptr;
CreateSigner ();
return *this;
}
PrivateKeys& PrivateKeys::operator=(const PrivateKeys& other)
{
m_Public = other.m_Public;
memcpy (m_PrivateKey, other.m_PrivateKey, 256); // 256
memcpy (m_SigningPrivateKey, other.m_SigningPrivateKey, m_Public.GetSigningPrivateKeyLen ());
delete m_Signer;
m_Signer = nullptr;
CreateSigner ();
return *this;
}
size_t PrivateKeys::FromBuffer (const uint8_t * buf, size_t len)
{
size_t ret = m_Public.FromBuffer (buf, len);
memcpy (m_PrivateKey, buf + ret, 256); // private key always 256
ret += 256;
size_t signingPrivateKeySize = m_Public.GetSigningPrivateKeyLen ();
memcpy (m_SigningPrivateKey, buf + ret, signingPrivateKeySize);
ret += signingPrivateKeySize;
delete m_Signer;
m_Signer = nullptr;
CreateSigner ();
return ret;
}
size_t PrivateKeys::ToBuffer (uint8_t * buf, size_t len) const
{
size_t ret = m_Public.ToBuffer (buf, len);
memcpy (buf + ret, m_PrivateKey, 256); // private key always 256
ret += 256;
size_t signingPrivateKeySize = m_Public.GetSigningPrivateKeyLen ();
memcpy (buf + ret, m_SigningPrivateKey, signingPrivateKeySize);
ret += signingPrivateKeySize;
return ret;
}
size_t PrivateKeys::FromBase64(const std::string& s)
{
uint8_t * buf = new uint8_t[s.length ()];
size_t l = i2p::data::Base64ToByteStream (s.c_str (), s.length (), buf, s.length ());
size_t ret = FromBuffer (buf, l);
delete[] buf;
return ret;
}
std::string PrivateKeys::ToBase64 () const
{
uint8_t * buf = new uint8_t[GetFullLen ()];
char * str = new char[GetFullLen ()*2];
size_t l = ToBuffer (buf, GetFullLen ());
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, str, GetFullLen ()*2);
str[l1] = 0;
delete[] buf;
std::string ret(str);
delete[] str;
return ret;
}
void PrivateKeys::Sign (const uint8_t * buf, int len, uint8_t * signature) const
{
if (m_Signer)
m_Signer->Sign (i2p::context.GetRandomNumberGenerator (), buf, len, signature);
}
void PrivateKeys::CreateSigner ()
{
switch (m_Public.GetSigningKeyType ())
{
case SIGNING_KEY_TYPE_DSA_SHA1:
m_Signer = new i2p::crypto::DSASigner (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA256_P256:
m_Signer = new i2p::crypto::ECDSAP256Signer (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA384_P384:
m_Signer = new i2p::crypto::ECDSAP384Signer (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA512_P521:
m_Signer = new i2p::crypto::ECDSAP521Signer (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
m_Signer = new i2p::crypto::RSASHA2562048Signer (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
m_Signer = new i2p::crypto::RSASHA3843072Signer (m_SigningPrivateKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
m_Signer = new i2p::crypto::RSASHA5124096Signer (m_SigningPrivateKey);
break;
default:
LogPrint ("Signing key type ", (int)m_Public.GetSigningKeyType (), " is not supported");
}
}
PrivateKeys PrivateKeys::CreateRandomKeys (SigningKeyType type)
{
if (type != SIGNING_KEY_TYPE_DSA_SHA1)
{
PrivateKeys keys;
auto& rnd = i2p::context.GetRandomNumberGenerator ();
// signature
uint8_t signingPublicKey[512]; // signing public key is 512 bytes max
switch (type)
{
case SIGNING_KEY_TYPE_ECDSA_SHA256_P256:
i2p::crypto::CreateECDSAP256RandomKeys (rnd, keys.m_SigningPrivateKey, signingPublicKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA384_P384:
i2p::crypto::CreateECDSAP384RandomKeys (rnd, keys.m_SigningPrivateKey, signingPublicKey);
break;
case SIGNING_KEY_TYPE_ECDSA_SHA512_P521:
i2p::crypto::CreateECDSAP521RandomKeys (rnd, keys.m_SigningPrivateKey, signingPublicKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA256_2048:
i2p::crypto::CreateRSARandomKeys (rnd, i2p::crypto::RSASHA2562048_KEY_LENGTH, keys.m_SigningPrivateKey, signingPublicKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA384_3072:
i2p::crypto::CreateRSARandomKeys (rnd, i2p::crypto::RSASHA3843072_KEY_LENGTH, keys.m_SigningPrivateKey, signingPublicKey);
break;
case SIGNING_KEY_TYPE_RSA_SHA512_4096:
i2p::crypto::CreateRSARandomKeys (rnd, i2p::crypto::RSASHA5124096_KEY_LENGTH, keys.m_SigningPrivateKey, signingPublicKey);
break;
default:
LogPrint ("Signing key type ", (int)type, " is not supported. Create DSA-SHA1");
return PrivateKeys (i2p::data::CreateRandomKeys ()); // DSA-SHA1
}
// encryption
uint8_t publicKey[256];
CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg);
dh.GenerateKeyPair(rnd, keys.m_PrivateKey, publicKey);
// identity
keys.m_Public = IdentityEx (publicKey, signingPublicKey, type);
keys.CreateSigner ();
return keys;
}
return PrivateKeys (i2p::data::CreateRandomKeys ()); // DSA-SHA1
}
Keys CreateRandomKeys ()
{
Keys keys;
auto& rnd = i2p::context.GetRandomNumberGenerator ();
// encryption
CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg);
dh.GenerateKeyPair(rnd, keys.privateKey, keys.publicKey);
// signing
i2p::crypto::CreateDSARandomKeys (rnd, keys.signingPrivateKey, keys.signingKey);
return keys;
}
IdentHash CreateRoutingKey (const IdentHash& ident)
{
uint8_t buf[41]; // ident + yyyymmdd
memcpy (buf, (const uint8_t *)ident, 32);
time_t t = time (nullptr);
struct tm tm;
#ifdef _WIN32
gmtime_s(&tm, &t);
sprintf_s((char *)(buf + 32), 9, "%04i%02i%02i", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
#else
gmtime_r(&t, &tm);
sprintf((char *)(buf + 32), "%04i%02i%02i", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
#endif
IdentHash key;
CryptoPP::SHA256().CalculateDigest((uint8_t *)key, buf, 40);
return key;
}
XORMetric operator^(const IdentHash& key1, const IdentHash& key2)
{
XORMetric m;
const uint64_t * hash1 = key1.GetLL (), * hash2 = key2.GetLL ();
m.metric_ll[0] = hash1[0] ^ hash2[0];
m.metric_ll[1] = hash1[1] ^ hash2[1];
m.metric_ll[2] = hash1[2] ^ hash2[2];
m.metric_ll[3] = hash1[3] ^ hash2[3];
return m;
}
}
}

View File

@ -1,261 +0,0 @@
#ifndef IDENTITY_H__
#define IDENTITY_H__
#include <inttypes.h>
#include <string.h>
#include <string>
#include "base64.h"
#include "ElGamal.h"
#include "Signature.h"
namespace i2p
{
namespace data
{
template<int sz>
class Tag
{
public:
Tag (const uint8_t * buf) { memcpy (m_Buf, buf, sz); };
Tag (const Tag<sz>& ) = default;
#ifndef _WIN32 // FIXME!!! msvs 2013 can't compile it
Tag (Tag<sz>&& ) = default;
#endif
Tag () = default;
Tag<sz>& operator= (const Tag<sz>& ) = default;
#ifndef _WIN32
Tag<sz>& operator= (Tag<sz>&& ) = default;
#endif
uint8_t * operator()() { return m_Buf; };
const uint8_t * operator()() const { return m_Buf; };
operator uint8_t * () { return m_Buf; };
operator const uint8_t * () const { return m_Buf; };
const uint64_t * GetLL () const { return ll; };
bool operator== (const Tag<sz>& other) const { return !memcmp (m_Buf, other.m_Buf, sz); };
bool operator< (const Tag<sz>& other) const { return memcmp (m_Buf, other.m_Buf, sz) < 0; };
std::string ToBase64 () const
{
char str[sz*2];
int l = i2p::data::ByteStreamToBase64 (m_Buf, sz, str, sz*2);
str[l] = 0;
return std::string (str);
}
std::string ToBase32 () const
{
char str[sz*2];
int l = i2p::data::ByteStreamToBase32 (m_Buf, sz, str, sz*2);
str[l] = 0;
return std::string (str);
}
void FromBase32 (const std::string& s)
{
i2p::data::Base32ToByteStream (s.c_str (), s.length (), m_Buf, sz);
}
private:
union // 8 bytes alignment
{
uint8_t m_Buf[sz];
uint64_t ll[sz/8];
};
};
typedef Tag<32> IdentHash;
#pragma pack(1)
struct Keys
{
uint8_t privateKey[256];
uint8_t signingPrivateKey[20];
uint8_t publicKey[256];
uint8_t signingKey[128];
};
const uint8_t CERTIFICATE_TYPE_NULL = 0;
const uint8_t CERTIFICATE_TYPE_HASHCASH = 1;
const uint8_t CERTIFICATE_TYPE_HIDDEN = 2;
const uint8_t CERTIFICATE_TYPE_SIGNED = 3;
const uint8_t CERTIFICATE_TYPE_MULTIPLE = 4;
const uint8_t CERTIFICATE_TYPE_KEY = 5;
struct Identity
{
uint8_t publicKey[256];
uint8_t signingKey[128];
struct
{
uint8_t type;
uint16_t length;
} certificate;
Identity () = default;
Identity (const Keys& keys) { *this = keys; };
Identity& operator=(const Keys& keys);
size_t FromBuffer (const uint8_t * buf, size_t len);
IdentHash Hash () const;
};
#pragma pack()
Keys CreateRandomKeys ();
const size_t DEFAULT_IDENTITY_SIZE = sizeof (Identity); // 387 bytes
const uint16_t CRYPTO_KEY_TYPE_ELGAMAL = 0;
const uint16_t SIGNING_KEY_TYPE_DSA_SHA1 = 0;
const uint16_t SIGNING_KEY_TYPE_ECDSA_SHA256_P256 = 1;
const uint16_t SIGNING_KEY_TYPE_ECDSA_SHA384_P384 = 2;
const uint16_t SIGNING_KEY_TYPE_ECDSA_SHA512_P521 = 3;
const uint16_t SIGNING_KEY_TYPE_RSA_SHA256_2048 = 4;
const uint16_t SIGNING_KEY_TYPE_RSA_SHA384_3072 = 5;
const uint16_t SIGNING_KEY_TYPE_RSA_SHA512_4096 = 6;
typedef uint16_t SigningKeyType;
typedef uint16_t CryptoKeyType;
class IdentityEx
{
public:
IdentityEx ();
IdentityEx (const uint8_t * publicKey, const uint8_t * signingKey,
SigningKeyType type = SIGNING_KEY_TYPE_DSA_SHA1);
IdentityEx (const uint8_t * buf, size_t len);
IdentityEx (const IdentityEx& other);
~IdentityEx ();
IdentityEx& operator=(const IdentityEx& other);
IdentityEx& operator=(const Identity& standard);
size_t FromBuffer (const uint8_t * buf, size_t len);
size_t ToBuffer (uint8_t * buf, size_t len) const;
size_t FromBase64(const std::string& s);
std::string ToBase64 () const;
const Identity& GetStandardIdentity () const { return m_StandardIdentity; };
const IdentHash& GetIdentHash () const { return m_IdentHash; };
size_t GetFullLen () const { return m_ExtendedLen + DEFAULT_IDENTITY_SIZE; };
size_t GetSigningPublicKeyLen () const;
size_t GetSigningPrivateKeyLen () const;
size_t GetSignatureLen () const;
bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const;
SigningKeyType GetSigningKeyType () const;
CryptoKeyType GetCryptoKeyType () const;
void DropVerifier (); // to save memory
private:
void CreateVerifier () const;
private:
Identity m_StandardIdentity;
IdentHash m_IdentHash;
mutable i2p::crypto::Verifier * m_Verifier;
size_t m_ExtendedLen;
uint8_t * m_ExtendedBuffer;
};
class PrivateKeys // for eepsites
{
public:
PrivateKeys (): m_Signer (nullptr) {};
PrivateKeys (const PrivateKeys& other): m_Signer (nullptr) { *this = other; };
PrivateKeys (const Keys& keys): m_Signer (nullptr) { *this = keys; };
PrivateKeys& operator=(const Keys& keys);
PrivateKeys& operator=(const PrivateKeys& other);
~PrivateKeys () { delete m_Signer; };
const IdentityEx& GetPublic () const { return m_Public; };
const uint8_t * GetPrivateKey () const { return m_PrivateKey; };
const uint8_t * GetSigningPrivateKey () const { return m_SigningPrivateKey; };
void Sign (const uint8_t * buf, int len, uint8_t * signature) const;
size_t GetFullLen () const { return m_Public.GetFullLen () + 256 + m_Public.GetSigningPrivateKeyLen (); };
size_t FromBuffer (const uint8_t * buf, size_t len);
size_t ToBuffer (uint8_t * buf, size_t len) const;
size_t FromBase64(const std::string& s);
std::string ToBase64 () const;
static PrivateKeys CreateRandomKeys (SigningKeyType type = SIGNING_KEY_TYPE_DSA_SHA1);
private:
void CreateSigner ();
private:
IdentityEx m_Public;
uint8_t m_PrivateKey[256];
uint8_t m_SigningPrivateKey[1024]; // assume private key doesn't exceed 1024 bytes
i2p::crypto::Signer * m_Signer;
};
// kademlia
struct XORMetric
{
union
{
uint8_t metric[32];
uint64_t metric_ll[4];
};
void SetMin () { memset (metric, 0, 32); };
void SetMax () { memset (metric, 0xFF, 32); };
bool operator< (const XORMetric& other) const { return memcmp (metric, other.metric, 32) < 0; };
};
IdentHash CreateRoutingKey (const IdentHash& ident);
XORMetric operator^(const IdentHash& key1, const IdentHash& key2);
// destination for delivery instuctions
class RoutingDestination
{
public:
RoutingDestination (): m_ElGamalEncryption (nullptr) {};
virtual ~RoutingDestination () { delete m_ElGamalEncryption; };
virtual const IdentHash& GetIdentHash () const = 0;
virtual const uint8_t * GetEncryptionPublicKey () const = 0;
virtual bool IsDestination () const = 0; // for garlic
i2p::crypto::ElGamalEncryption * GetElGamalEncryption () const
{
if (!m_ElGamalEncryption)
m_ElGamalEncryption = new i2p::crypto::ElGamalEncryption (GetEncryptionPublicKey ());
return m_ElGamalEncryption;
}
private:
mutable i2p::crypto::ElGamalEncryption * m_ElGamalEncryption; // use lazy initialization
};
class LocalDestination
{
public:
virtual ~LocalDestination() {};
virtual const PrivateKeys& GetPrivateKeys () const = 0;
virtual const uint8_t * GetEncryptionPrivateKey () const = 0;
virtual const uint8_t * GetEncryptionPublicKey () const = 0;
const IdentityEx& GetIdentity () const { return GetPrivateKeys ().GetPublic (); };
const IdentHash& GetIdentHash () const { return GetIdentity ().GetIdentHash (); };
void Sign (const uint8_t * buf, int len, uint8_t * signature) const
{
GetPrivateKeys ().Sign (buf, len, signature);
};
};
}
}
#endif

354
LICENSE
View File

@ -1,339 +1,27 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (c) 2013-2020, The PurpleI2P Project
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
All rights reserved.
Preamble
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
1. Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
2. Redistributions in binary form must reproduce the above copyright notice, this list of
conditions and the following disclaimer in the documentation and/or other materials
provided with the distribution.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
3. Neither the name of the copyright holder nor the names of its contributors may be used
to endorse or promote products derived from this software without specific prior written
permission.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
i2p router for Linux written on C++
Copyright (C) 2013 orignal
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,128 +0,0 @@
#include "I2PEndian.h"
#include <cryptopp/dsa.h>
#include "CryptoConst.h"
#include "Log.h"
#include "Timestamp.h"
#include "NetDb.h"
#include "TunnelPool.h"
#include "LeaseSet.h"
namespace i2p
{
namespace data
{
LeaseSet::LeaseSet (const uint8_t * buf, int len)
{
memcpy (m_Buffer, buf, len);
m_BufferLen = len;
ReadFromBuffer ();
}
LeaseSet::LeaseSet (const i2p::tunnel::TunnelPool& pool)
{
// header
const i2p::data::LocalDestination * localDestination = pool.GetLocalDestination ();
if (!localDestination)
{
m_BufferLen = 0;
LogPrint (eLogError, "Destination for local LeaseSet doesn't exist");
return;
}
m_BufferLen = localDestination->GetIdentity ().ToBuffer (m_Buffer, MAX_LS_BUFFER_SIZE);
memcpy (m_Buffer + m_BufferLen, localDestination->GetEncryptionPublicKey (), 256);
m_BufferLen += 256;
auto signingKeyLen = localDestination->GetIdentity ().GetSigningPublicKeyLen ();
memset (m_Buffer + m_BufferLen, 0, signingKeyLen);
m_BufferLen += signingKeyLen;
auto tunnels = pool.GetInboundTunnels (5); // 5 tunnels maximum
m_Buffer[m_BufferLen] = tunnels.size (); // num leases
m_BufferLen++;
// leases
for (auto it: tunnels)
{
Lease * lease = (Lease *)(m_Buffer + m_BufferLen);
memcpy (lease->tunnelGateway, it->GetNextIdentHash (), 32);
lease->tunnelID = htobe32 (it->GetNextTunnelID ());
uint64_t ts = it->GetCreationTime () + i2p::tunnel::TUNNEL_EXPIRATION_TIMEOUT - 60; // 1 minute before expiration
ts *= 1000; // in milliseconds
lease->endDate = htobe64 (ts);
m_BufferLen += sizeof (Lease);
}
// signature
localDestination->Sign (m_Buffer, m_BufferLen, m_Buffer + m_BufferLen);
m_BufferLen += localDestination->GetIdentity ().GetSignatureLen ();
LogPrint ("Local LeaseSet of ", tunnels.size (), " leases created");
ReadFromBuffer ();
}
void LeaseSet::Update (const uint8_t * buf, int len)
{
m_Leases.clear ();
memcpy (m_Buffer, buf, len);
m_BufferLen = len;
ReadFromBuffer ();
}
void LeaseSet::ReadFromBuffer ()
{
size_t size = m_Identity.FromBuffer (m_Buffer, m_BufferLen);
memcpy (m_EncryptionKey, m_Buffer + size, 256);
size += 256; // encryption key
size += m_Identity.GetSigningPublicKeyLen (); // unused signing key
uint8_t num = m_Buffer[size];
size++; // num
LogPrint ("LeaseSet num=", (int)num);
// process leases
const uint8_t * leases = m_Buffer + size;
for (int i = 0; i < num; i++)
{
Lease lease = *(Lease *)leases;
lease.tunnelID = be32toh (lease.tunnelID);
lease.endDate = be64toh (lease.endDate);
m_Leases.push_back (lease);
leases += sizeof (Lease);
// check if lease's gateway is in our netDb
if (!netdb.FindRouter (lease.tunnelGateway))
{
// if not found request it
LogPrint ("Lease's tunnel gateway not found. Requested");
netdb.RequestDestination (lease.tunnelGateway);
}
}
// verify
if (!m_Identity.Verify (m_Buffer, leases - m_Buffer, leases))
LogPrint ("LeaseSet verification failed");
}
const std::vector<Lease> LeaseSet::GetNonExpiredLeases () const
{
auto ts = i2p::util::GetMillisecondsSinceEpoch ();
std::vector<Lease> leases;
for (auto& it: m_Leases)
if (ts < it.endDate)
leases.push_back (it);
return leases;
}
bool LeaseSet::HasExpiredLeases () const
{
auto ts = i2p::util::GetMillisecondsSinceEpoch ();
for (auto& it: m_Leases)
if (ts >= it.endDate) return true;
return false;
}
bool LeaseSet::HasNonExpiredLeases () const
{
auto ts = i2p::util::GetMillisecondsSinceEpoch ();
for (auto& it: m_Leases)
if (ts < it.endDate) return true;
return false;
}
}
}

View File

@ -1,78 +0,0 @@
#ifndef LEASE_SET_H__
#define LEASE_SET_H__
#include <inttypes.h>
#include <string.h>
#include <vector>
#include "Identity.h"
namespace i2p
{
namespace tunnel
{
class TunnelPool;
}
namespace data
{
#pragma pack(1)
struct Lease
{
uint8_t tunnelGateway[32];
uint32_t tunnelID;
uint64_t endDate;
bool operator< (const Lease& other) const
{
if (endDate != other.endDate)
return endDate > other.endDate;
else
return tunnelID < other.tunnelID;
}
};
#pragma pack()
const int MAX_LS_BUFFER_SIZE = 3072;
class LeaseSet: public RoutingDestination
{
public:
LeaseSet (const uint8_t * buf, int len);
LeaseSet (const LeaseSet& ) = default;
LeaseSet (const i2p::tunnel::TunnelPool& pool);
LeaseSet& operator=(const LeaseSet& ) = default;
void Update (const uint8_t * buf, int len);
const IdentityEx& GetIdentity () const { return m_Identity; };
const uint8_t * GetBuffer () const { return m_Buffer; };
size_t GetBufferLen () const { return m_BufferLen; };
// implements RoutingDestination
const IdentHash& GetIdentHash () const { return m_Identity.GetIdentHash (); };
const std::vector<Lease>& GetLeases () const { return m_Leases; };
const std::vector<Lease> GetNonExpiredLeases () const;
bool HasExpiredLeases () const;
bool HasNonExpiredLeases () const;
const uint8_t * GetEncryptionPublicKey () const { return m_EncryptionKey; };
bool IsDestination () const { return true; };
private:
void ReadFromBuffer ();
private:
std::vector<Lease> m_Leases;
IdentityEx m_Identity;
uint8_t m_EncryptionKey[256];
uint8_t m_Buffer[MAX_LS_BUFFER_SIZE];
size_t m_BufferLen;
};
}
}
#endif

View File

@ -1,242 +0,0 @@
// LittleBigEndian.h fixed for 64-bits added union
//
#ifndef LITTLEBIGENDIAN_H
#define LITTLEBIGENDIAN_H
// Determine Little-Endian or Big-Endian
#define CURRENT_BYTE_ORDER (*(int *)"\x01\x02\x03\x04")
#define LITTLE_ENDIAN_BYTE_ORDER 0x04030201
#define BIG_ENDIAN_BYTE_ORDER 0x01020304
#define PDP_ENDIAN_BYTE_ORDER 0x02010403
#define IS_LITTLE_ENDIAN (CURRENT_BYTE_ORDER == LITTLE_ENDIAN_BYTE_ORDER)
#define IS_BIG_ENDIAN (CURRENT_BYTE_ORDER == BIG_ENDIAN_BYTE_ORDER)
#define IS_PDP_ENDIAN (CURRENT_BYTE_ORDER == PDP_ENDIAN_BYTE_ORDER)
// Forward declaration
template<typename T>
struct LittleEndian;
template<typename T>
struct BigEndian;
// Little-Endian template
#pragma pack(push,1)
template<typename T>
struct LittleEndian
{
union
{
unsigned char bytes[sizeof(T)];
T raw_value;
};
LittleEndian(T t = T())
{
operator =(t);
}
LittleEndian(const LittleEndian<T> & t)
{
raw_value = t.raw_value;
}
LittleEndian(const BigEndian<T> & t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = t.bytes[sizeof(T)-1-i];
}
operator const T() const
{
T t = T();
for (unsigned i = 0; i < sizeof(T); i++)
t |= T(bytes[i]) << (i << 3);
return t;
}
const T operator = (const T t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[sizeof(T)-1 - i] = static_cast<unsigned char>(t >> (i << 3));
return t;
}
// operators
const T operator += (const T t)
{
return (*this = *this + t);
}
const T operator -= (const T t)
{
return (*this = *this - t);
}
const T operator *= (const T t)
{
return (*this = *this * t);
}
const T operator /= (const T t)
{
return (*this = *this / t);
}
const T operator %= (const T t)
{
return (*this = *this % t);
}
LittleEndian<T> operator ++ (int)
{
LittleEndian<T> tmp(*this);
operator ++ ();
return tmp;
}
LittleEndian<T> & operator ++ ()
{
for (unsigned i = 0; i < sizeof(T); i++)
{
++bytes[i];
if (bytes[i] != 0)
break;
}
return (*this);
}
LittleEndian<T> operator -- (int)
{
LittleEndian<T> tmp(*this);
operator -- ();
return tmp;
}
LittleEndian<T> & operator -- ()
{
for (unsigned i = 0; i < sizeof(T); i++)
{
--bytes[i];
if (bytes[i] != (T)(-1))
break;
}
return (*this);
}
};
#pragma pack(pop)
// Big-Endian template
#pragma pack(push,1)
template<typename T>
struct BigEndian
{
union
{
unsigned char bytes[sizeof(T)];
T raw_value;
};
BigEndian(T t = T())
{
operator =(t);
}
BigEndian(const BigEndian<T> & t)
{
raw_value = t.raw_value;
}
BigEndian(const LittleEndian<T> & t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[i] = t.bytes[sizeof(T)-1-i];
}
operator const T() const
{
T t = T();
for (unsigned i = 0; i < sizeof(T); i++)
t |= T(bytes[sizeof(T) - 1 - i]) << (i << 3);
return t;
}
const T operator = (const T t)
{
for (unsigned i = 0; i < sizeof(T); i++)
bytes[sizeof(T) - 1 - i] = t >> (i << 3);
return t;
}
// operators
const T operator += (const T t)
{
return (*this = *this + t);
}
const T operator -= (const T t)
{
return (*this = *this - t);
}
const T operator *= (const T t)
{
return (*this = *this * t);
}
const T operator /= (const T t)
{
return (*this = *this / t);
}
const T operator %= (const T t)
{
return (*this = *this % t);
}
BigEndian<T> operator ++ (int)
{
BigEndian<T> tmp(*this);
operator ++ ();
return tmp;
}
BigEndian<T> & operator ++ ()
{
for (unsigned i = 0; i < sizeof(T); i++)
{
++bytes[sizeof(T) - 1 - i];
if (bytes[sizeof(T) - 1 - i] != 0)
break;
}
return (*this);
}
BigEndian<T> operator -- (int)
{
BigEndian<T> tmp(*this);
operator -- ();
return tmp;
}
BigEndian<T> & operator -- ()
{
for (unsigned i = 0; i < sizeof(T); i++)
{
--bytes[sizeof(T) - 1 - i];
if (bytes[sizeof(T) - 1 - i] != (T)(-1))
break;
}
return (*this);
}
};
#pragma pack(pop)
#endif // LITTLEBIGENDIAN_H

43
Log.cpp
View File

@ -1,43 +0,0 @@
#include "Log.h"
#include <boost/date_time/posix_time/posix_time.hpp>
Log * g_Log = nullptr;
static const char * g_LogLevelStr[eNumLogLevels] =
{
"error", // eLogError
"warn", // eLogWarning
"info", // eLogInfo
"debug" // eLogDebug
};
void LogMsg::Process()
{
output << boost::posix_time::second_clock::local_time().time_of_day () <<
"/" << g_LogLevelStr[level] << " - ";
output << s.str();
}
void Log::Flush ()
{
if (m_LogStream)
m_LogStream->flush();
}
void Log::SetLogFile (const std::string& fullFilePath)
{
auto logFile = new std::ofstream (fullFilePath, std::ofstream::out | std::ofstream::binary | std::ofstream::trunc);
if (logFile->is_open ())
{
SetLogStream (logFile);
LogPrint("Logging to file ", fullFilePath, " enabled.");
}
else
delete logFile;
}
void Log::SetLogStream (std::ostream * logStream)
{
if (m_LogStream) delete m_LogStream;
m_LogStream = logStream;
}

117
Log.h
View File

@ -1,117 +0,0 @@
#ifndef LOG_H__
#define LOG_H__
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <functional>
#include "Queue.h"
enum LogLevel
{
eLogError = 0,
eLogWarning,
eLogInfo,
eLogDebug,
eNumLogLevels
};
struct LogMsg
{
std::stringstream s;
std::ostream& output;
LogLevel level;
LogMsg (std::ostream& o = std::cout, LogLevel l = eLogInfo): output (o), level (l) {};
void Process();
};
class Log: public i2p::util::MsgQueue<LogMsg>
{
public:
Log (): m_LogStream (nullptr) { SetOnEmpty (std::bind (&Log::Flush, this)); };
~Log () { delete m_LogStream; };
void SetLogFile (const std::string& fullFilePath);
void SetLogStream (std::ostream * logStream);
std::ostream * GetLogStream () const { return m_LogStream; };
private:
void Flush ();
private:
std::ostream * m_LogStream;
};
extern Log * g_Log;
inline void StartLog (const std::string& fullFilePath)
{
if (!g_Log)
{
g_Log = new Log ();
if (fullFilePath.length () > 0)
g_Log->SetLogFile (fullFilePath);
}
}
inline void StartLog (std::ostream * s)
{
if (!g_Log)
{
g_Log = new Log ();
if (s)
g_Log->SetLogStream (s);
}
}
inline void StopLog ()
{
if (g_Log)
{
delete g_Log;
g_Log = nullptr;
}
}
template<typename TValue>
void LogPrint (std::stringstream& s, TValue arg)
{
s << arg;
}
template<typename TValue, typename... TArgs>
void LogPrint (std::stringstream& s, TValue arg, TArgs... args)
{
LogPrint (s, arg);
LogPrint (s, args...);
}
template<typename... TArgs>
void LogPrint (LogLevel level, TArgs... args)
{
LogMsg * msg = (g_Log && g_Log->GetLogStream ()) ? new LogMsg (*g_Log->GetLogStream (), level) :
new LogMsg (std::cout, level);
LogPrint (msg->s, args...);
msg->s << std::endl;
if (g_Log)
g_Log->Put (msg);
else
{
msg->Process ();
delete msg;
}
}
template<typename... TArgs>
void LogPrint (TArgs... args)
{
LogPrint (eLogInfo, args...);
}
#endif

141
Makefile
View File

@ -1,52 +1,135 @@
UNAME := $(shell uname -s)
SYS := $(shell $(CXX) -dumpmachine)
SHLIB := libi2pd.so
I2PD := i2p
ARLIB := libi2pd.a
SHLIB_CLIENT := libi2pdclient.so
ARLIB_CLIENT := libi2pdclient.a
I2PD := i2pd
LIB_SRC_DIR := libi2pd
LIB_CLIENT_SRC_DIR := libi2pd_client
DAEMON_SRC_DIR := daemon
# import source files lists
include filelist.mk
USE_AESNI := yes
USE_STATIC := no
USE_AESNI := yes
USE_STATIC := no
USE_MESHNET := no
USE_UPNP := no
DEBUG := yes
ifeq ($(UNAME),Darwin)
DAEMON_SRC += DaemonLinux.cpp
include Makefile.osx
else ifeq ($(UNAME),FreeBSD)
DAEMON_SRC += DaemonLinux.cpp
include Makefile.bsd
else ifeq ($(UNAME),Linux)
DAEMON_SRC += DaemonLinux.cpp
include Makefile.linux
else # win32
DAEMON_SRC += DaemonWin32.cpp
ifeq ($(DEBUG),yes)
CXX_DEBUG = -g
else
CXX_DEBUG = -Os
LD_DEBUG = -s
endif
all: obj $(SHLIB) $(I2PD)
ifneq (, $(findstring darwin, $(SYS)))
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
ifeq ($(HOMEBREW),1)
include Makefile.homebrew
else
include Makefile.osx
endif
else ifneq (, $(findstring linux, $(SYS))$(findstring gnu, $(SYS)))
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
include Makefile.linux
else ifneq (, $(findstring freebsd, $(SYS))$(findstring openbsd, $(SYS)))
DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp
include Makefile.bsd
else ifneq (, $(findstring mingw, $(SYS))$(findstring cygwin, $(SYS)))
DAEMON_SRC += Win32/DaemonWin32.cpp Win32/Win32App.cpp Win32/Win32NetState.cpp
include Makefile.mingw
else # not supported
$(error Not supported platform)
endif
obj:
mkdir -p obj
ifeq ($(USE_MESHNET),yes)
NEEDED_CXXFLAGS += -DMESHNET
endif
obj/%.o : %.cpp %.h
$(CXX) $(CXXFLAGS) $(INCFLAGS) -c -o $@ $<
NEEDED_CXXFLAGS += -MMD -MP -I$(LIB_SRC_DIR) -I$(LIB_CLIENT_SRC_DIR)
# weaker rule for building files without headers
obj/%.o : %.cpp
$(CXX) $(CXXFLAGS) $(INCFLAGS) -c -o $@ $<
LIB_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_SRC))
LIB_CLIENT_OBJS += $(patsubst %.cpp,obj/%.o,$(LIB_CLIENT_SRC))
DAEMON_OBJS += $(patsubst %.cpp,obj/%.o,$(DAEMON_SRC))
DEPS += $(LIB_OBJS:.o=.d) $(LIB_CLIENT_OBJS:.o=.d) $(DAEMON_OBJS:.o=.d)
$(I2PD): $(patsubst %.cpp,obj/%.o,$(DAEMON_SRC))
$(CXX) -o $@ $^ $(LDFLAGS) $(LDLIBS)
all: mk_obj_dir $(ARLIB) $(ARLIB_CLIENT) $(I2PD)
$(SHLIB): $(patsubst %.cpp,obj/%.o,$(LIB_SRC))
$(CXX) -o $@ $^ $(LDFLAGS) $(LDLIBS) -shared
mk_obj_dir:
@mkdir -p obj
@mkdir -p obj/Win32
@mkdir -p obj/$(LIB_SRC_DIR)
@mkdir -p obj/$(LIB_CLIENT_SRC_DIR)
@mkdir -p obj/$(DAEMON_SRC_DIR)
api: mk_obj_dir $(SHLIB) $(ARLIB)
client: mk_obj_dir $(SHLIB_CLIENT) $(ARLIB_CLIENT)
api_client: mk_obj_dir $(SHLIB) $(ARLIB) $(SHLIB_CLIENT) $(ARLIB_CLIENT)
## NOTE: The NEEDED_CXXFLAGS are here so that CXXFLAGS can be specified at build time
## **without** overwriting the CXXFLAGS which we need in order to build.
## For example, when adding 'hardening flags' to the build
## (e.g. -fstack-protector-strong -Wformat -Werror=format-security), we do not want to remove
## -std=c++11. If you want to remove this variable please do so in a way that allows setting
## custom FLAGS to work at build-time.
obj/%.o: %.cpp
$(CXX) $(CXXFLAGS) $(NEEDED_CXXFLAGS) $(INCFLAGS) -c -o $@ $<
# '-' is 'ignore if missing' on first run
-include $(DEPS)
$(I2PD): $(DAEMON_OBJS) $(ARLIB) $(ARLIB_CLIENT)
$(CXX) -o $@ $(LDFLAGS) $^ $(LDLIBS)
$(SHLIB): $(LIB_OBJS)
ifneq ($(USE_STATIC),yes)
$(CXX) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS)
endif
$(SHLIB_CLIENT): $(LIB_CLIENT_OBJS)
ifneq ($(USE_STATIC),yes)
$(CXX) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS) $(SHLIB)
endif
$(ARLIB): $(LIB_OBJS)
$(AR) -r $@ $^
$(ARLIB_CLIENT): $(LIB_CLIENT_OBJS)
$(AR) -r $@ $^
clean:
rm -fr obj $(I2PD) $(SHLIB)
$(RM) -r obj
$(RM) -r docs/generated
$(RM) $(I2PD) $(SHLIB) $(ARLIB) $(SHLIB_CLIENT) $(ARLIB_CLIENT)
LATEST_TAG=$(shell git describe --tags --abbrev=0 master)
strip: $(I2PD) $(SHLIB_CLIENT) $(SHLIB)
strip $^
LATEST_TAG=$(shell git describe --tags --abbrev=0 openssl)
BRANCH=$(shell git rev-parse --abbrev-ref HEAD)
dist:
git archive --format=tar.gz -9 --worktree-attributes \
--prefix=i2pd_$(LATEST_TAG)/ $(LATEST_TAG) -o i2pd_$(LATEST_TAG).tar.gz
last-dist:
git archive --format=tar.gz -9 --worktree-attributes \
--prefix=i2pd_$(LATEST_TAG)/ $(BRANCH) -o ../i2pd_$(LATEST_TAG).orig.tar.gz
doxygen:
doxygen -s docs/Doxyfile
.PHONY: all
.PHONY: clean
.PHONY: doxygen
.PHONY: dist
.PHONY: last-dist
.PHONY: api
.PHONY: api_client
.PHONY: client
.PHONY: mk_obj_dir
.PHONY: install
.PHONY: strip

View File

@ -1,5 +1,12 @@
CXX = g++
CXXFLAGS = -g -Wall -O2 -std=c++11
CXX = clang++
CXXFLAGS ?= ${CXX_DEBUG} -Wall -Wextra -Wno-unused-parameter -pedantic -Wno-misleading-indentation
## NOTE: NEEDED_CXXFLAGS is here so that custom CXXFLAGS can be specified at build time
## **without** overwriting the CXXFLAGS which we need in order to build.
## For example, when adding 'hardening flags' to the build
## (e.g. -fstack-protector-strong -Wformat -Werror=format-security), we do not want to remove
## -std=c++11. If you want to remove this variable please do so in a way that allows setting
## custom FLAGS to work at build-time.
NEEDED_CXXFLAGS = -std=c++11 -D_GLIBCXX_USE_NANOSLEEP=1
INCFLAGS = -I/usr/include/ -I/usr/local/include/
LDFLAGS = -Wl,-rpath,/usr/local/lib -L/usr/local/lib
LDLIBS = -lcryptopp -lboost_system -lboost_date_time -lboost_filesystem -lboost_regex -lboost_program_options -lpthread
LDFLAGS = ${LD_DEBUG} -Wl,-rpath,/usr/local/lib -L/usr/local/lib
LDLIBS = -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread

51
Makefile.homebrew Normal file
View File

@ -0,0 +1,51 @@
# root directory holding homebrew
BREWROOT = /usr/local
BOOSTROOT = ${BREWROOT}/opt/boost
SSLROOT = ${BREWROOT}/opt/openssl@1.1
UPNPROOT = ${BREWROOT}/opt/miniupnpc
CXXFLAGS = ${CXX_DEBUG} -Wall -std=c++11 -DMAC_OSX -Wno-overloaded-virtual
INCFLAGS = -I${SSLROOT}/include -I${BOOSTROOT}/include
LDFLAGS = ${LD_DEBUG}
ifndef TRAVIS
CXX = clang++
endif
ifeq ($(USE_STATIC),yes)
LDLIBS = -lz ${SSLROOT}/lib/libcrypto.a ${SSLROOT}/lib/libssl.a ${BOOSTROOT}/lib/libboost_system.a ${BOOSTROOT}/lib/libboost_date_time.a ${BOOSTROOT}/lib/libboost_filesystem.a ${BOOSTROOT}/lib/libboost_program_options.a -lpthread
else
LDFLAGS += -L${SSLROOT}/lib -L${BOOSTROOT}/lib
LDLIBS = -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
endif
ifeq ($(USE_UPNP),yes)
LDFLAGS += -ldl
CXXFLAGS += -DUSE_UPNP
INCFLAGS += -I${UPNPROOT}/include
ifeq ($(USE_STATIC),yes)
LDLIBS += ${UPNPROOT}/lib/libminiupnpc.a
else
LDFLAGS += -L${UPNPROOT}/lib
LDLIBS += -lminiupnpc
endif
endif
# OSX Notes
# http://www.hutsby.net/2011/08/macs-with-aes-ni.html
# Seems like all recent Mac's have AES-NI, after firmware upgrade 2.2
# Found no good way to detect it from command line. TODO: Might be some osx sysinfo magic
ifeq ($(USE_AESNI),yes)
CXXFLAGS += -D__AES__ -maes
endif
install: all
install -d ${PREFIX}/bin ${PREFIX}/etc/i2pd ${PREFIX}/share/doc/i2pd ${PREFIX}/share/i2pd ${PREFIX}/share/man/man1 ${PREFIX}/var/lib/i2pd
install -m 755 ${I2PD} ${PREFIX}/bin/
install -m 644 contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/etc/i2pd
@cp -R contrib/certificates ${PREFIX}/share/i2pd/
install -m 644 ChangeLog LICENSE README.md contrib/i2pd.conf contrib/subscriptions.txt contrib/tunnels.conf ${PREFIX}/share/doc/i2pd
@gzip debian/i2pd.1 && install debian/i2pd.1.gz ${PREFIX}/share/man/man1
@ln -sf ${PREFIX}/share/i2pd/certificates ${PREFIX}/var/lib/i2pd/
@ln -sf ${PREFIX}/etc/i2pd/i2pd.conf ${PREFIX}/var/lib/i2pd/i2pd.conf
@ln -sf ${PREFIX}/etc/i2pd/subscriptions.txt ${PREFIX}/var/lib/i2pd/subscriptions.txt
@ln -sf ${PREFIX}/etc/i2pd/tunnels.conf ${PREFIX}/var/lib/i2pd/tunnels.conf

View File

@ -1,43 +1,64 @@
CXXFLAGS = -g -Wall -fPIC
INCFLAGS =
# set defaults instead redefine
CXXFLAGS ?= ${CXX_DEBUG} -Wall -Wextra -Wno-unused-parameter -pedantic -Wno-psabi
LDFLAGS ?= ${LD_DEBUG}
# detect proper flag for c++11 support by gcc
## NOTE: The NEEDED_CXXFLAGS are here so that custom CXXFLAGS can be specified at build time
## **without** overwriting the CXXFLAGS which we need in order to build.
## For example, when adding 'hardening flags' to the build
## (e.g. -fstack-protector-strong -Wformat -Werror=format-security), we do not want to remove
## -std=c++11. If you want to remove this variable please do so in a way that allows setting
## custom FDLAGS to work at build-time.
# detect proper flag for c++11 support by compilers
CXXVER := $(shell $(CXX) -dumpversion)
ifeq ($(shell expr match ${CXXVER} "4\.[0-9][0-9]"),4) # >= 4.10
CXXFLAGS += -std=c++11
else ifeq ($(shell expr match ${CXXVER} "4\.[7-9]"),3) # >= 4.7
CXXFLAGS += -std=c++11
else ifeq ($(shell expr match ${CXXVER} "4\.6"),3) # = 4.6
CXXFLAGS += -std=c++0x
else ifeq ($(shell expr match $(CXX) 'clang'),5)
CXXFLAGS += -std=c++11
ifeq ($(shell expr match $(CXX) 'clang'),5)
NEEDED_CXXFLAGS += -std=c++11
else ifeq ($(shell expr match ${CXXVER} "4\.[0-9][0-9]"),4) # gcc >= 4.10
NEEDED_CXXFLAGS += -std=c++11
else ifeq ($(shell expr match ${CXXVER} "4\.[8-9]"),3) # gcc 4.8 - 4.9
NEEDED_CXXFLAGS += -std=c++11 -D_GLIBCXX_USE_NANOSLEEP=1
else ifeq ($(shell expr match ${CXXVER} "[5-6]"),1) # gcc 5 - 6
NEEDED_CXXFLAGS += -std=c++11
LDLIBS = -latomic
else ifeq ($(shell expr match ${CXXVER} "[1,7-9]"),1) # gcc >= 7
NEEDED_CXXFLAGS += -std=c++17
LDLIBS = -latomic
else # not supported
$(error Compiler too old)
$(error Compiler too old)
endif
NEEDED_CXXFLAGS += -fPIC
ifeq ($(USE_STATIC),yes)
LIBDIR := /usr/lib
LDLIBS = $(LIBDIR)/libboost_system.a
LDLIBS += $(LIBDIR)/libboost_date_time.a
LDLIBS += $(LIBDIR)/libboost_filesystem.a
LDLIBS += $(LIBDIR)/libboost_regex.a
LDLIBS += $(LIBDIR)/libboost_program_options.a
LDLIBS += $(LIBDIR)/libcryptopp.a
LDLIBS += -lpthread -static-libstdc++ -static-libgcc
USE_AESNI := no
# NOTE: on glibc you will get this warning:
# Using 'getaddrinfo' in statically linked applications requires at runtime
# the shared libraries from the glibc version used for linking
LIBDIR := /usr/lib/$(SYS)
LDLIBS += $(LIBDIR)/libboost_system.a
LDLIBS += $(LIBDIR)/libboost_date_time.a
LDLIBS += $(LIBDIR)/libboost_filesystem.a
LDLIBS += $(LIBDIR)/libboost_program_options.a
LDLIBS += $(LIBDIR)/libssl.a
LDLIBS += $(LIBDIR)/libcrypto.a
LDLIBS += $(LIBDIR)/libz.a
ifeq ($(USE_UPNP),yes)
LDLIBS += $(LIBDIR)/libminiupnpc.a
endif
LDLIBS += -lpthread -ldl
else
LDLIBS = -lcryptopp -lboost_system -lboost_date_time -lboost_filesystem -lboost_regex -lboost_program_options -lpthread
LDLIBS += -lcrypto -lssl -lz -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
ifeq ($(USE_UPNP),yes)
LDLIBS += -lminiupnpc
endif
endif
# UPNP Support (miniupnpc 1.5 and higher)
ifeq ($(USE_UPNP),yes)
NEEDED_CXXFLAGS += -DUSE_UPNP
endif
GREP = fgrep
IS_64 := $(shell $(CXX) -dumpmachine 2>&1 | $(GREP) -c "64")
ifeq ($(USE_AESNI),yes)
ifeq ($(IS_64),1)
#check if AES-NI is supported by CPU
ifneq ($(shell $(GREP) -c aes /proc/cpuinfo),0)
CXXFLAGS += -maes -DAESNI
else
$(warning "AESNI support enabled requested but not supported by this CPU")
endif
ifneq (, $(findstring i386, $(SYS))$(findstring i686, $(SYS))$(findstring x86_64, $(SYS))) # only x86-based CPU supports that
NEEDED_CXXFLAGS += -D__AES__ -maes
endif
endif

65
Makefile.mingw Normal file
View File

@ -0,0 +1,65 @@
# Build application with GUI (tray, main window)
USE_WIN32_APP := yes
WINDRES = windres
CXXFLAGS := $(CXX_DEBUG) -D_MT -DWIN32_LEAN_AND_MEAN -fPIC -msse
INCFLAGS = -I$(DAEMON_SRC_DIR) -IWin32
LDFLAGS := ${LD_DEBUG} -Wl,-Bstatic -static-libgcc
# detect proper flag for c++11 support by compilers
CXXVER := $(shell $(CXX) -dumpversion)
ifeq ($(shell expr match ${CXXVER} "[4]\.[7-9]\|4\.1[0-9]\|[5-6]"),4) # gcc 4.7 - 6
NEEDED_CXXFLAGS += -std=c++11
else ifeq ($(shell expr match ${CXXVER} "[1,7-9]"),1) # gcc >= 7
NEEDED_CXXFLAGS += -std=c++17
else # not supported
$(error Compiler too old)
endif
# Boost libraries suffix
BOOST_SUFFIX = -mt
# UPNP Support
ifeq ($(USE_UPNP),yes)
CXXFLAGS += -DUSE_UPNP -DMINIUPNP_STATICLIB
LDLIBS = -lminiupnpc
endif
LDLIBS += \
-lboost_system$(BOOST_SUFFIX) \
-lboost_date_time$(BOOST_SUFFIX) \
-lboost_filesystem$(BOOST_SUFFIX) \
-lboost_program_options$(BOOST_SUFFIX) \
-lssl \
-lcrypto \
-lz \
-lwsock32 \
-lws2_32 \
-lgdi32 \
-liphlpapi \
-lole32 \
-luuid \
-lpthread
ifeq ($(USE_WIN32_APP), yes)
NEEDED_CXXFLAGS += -DWIN32_APP
LDFLAGS += -mwindows
DAEMON_RC += Win32/Resource.rc
DAEMON_OBJS += $(patsubst %.rc,obj/%.o,$(DAEMON_RC))
endif
ifeq ($(USE_WINXP_FLAGS), yes)
NEEDED_CXXFLAGS += -DWINVER=0x0501 -D_WIN32_WINNT=0x0501
endif
ifeq ($(USE_AESNI),yes)
NEEDED_CXXFLAGS += -D__AES__ -maes
endif
ifeq ($(USE_ASLR),yes)
LDFLAGS += -Wl,--nxcompat -Wl,--high-entropy-va -Wl,--dynamicbase,--export-all-symbols
endif
obj/%.o : %.rc
$(WINDRES) -i $< -o $@

View File

@ -1,17 +1,29 @@
CXX = clang++
CXXFLAGS = -g -Wall -std=c++11 -lstdc++ -DCRYPTOPP_DISABLE_ASM
CXXFLAGS := ${CXX_DEBUG} -Wall -std=c++11 -DMAC_OSX
INCFLAGS = -I/usr/local/include
LDFLAGS = -Wl,-rpath,/usr/local/lib -L/usr/local/lib
LDLIBS = -lcryptopp -lboost_system -lboost_date_time -lboost_filesystem -lboost_regex -lboost_program_options -lpthread
LDFLAGS := -Wl,-rpath,/usr/local/lib -L/usr/local/lib
LDFLAGS += -Wl,-dead_strip
LDFLAGS += -Wl,-dead_strip_dylibs
LDFLAGS += -Wl,-bind_at_load
# OSX Notes
# http://www.hutsby.net/2011/08/macs-with-aes-ni.html
# Seems like all recent Mac's have AES-NI, after firmware upgrade 2.2
# Found no good way to detect it from command line. TODO: Might be some osx sysinfo magic
ifeq ($(USE_AESNI),yes)
CXXFLAGS += -maes -DAESNI
ifeq ($(USE_STATIC),yes)
LDLIBS = -lz /usr/local/lib/libcrypto.a /usr/local/lib/libssl.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_program_options.a -lpthread
else
LDLIBS = -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_program_options -lpthread
endif
install: all
mkdir -p ${PREFIX}/
cp -r i2p ${PREFIX}/
ifeq ($(USE_UPNP),yes)
LDFLAGS += -ldl
CXXFLAGS += -DUSE_UPNP
ifeq ($(USE_STATIC),yes)
LDLIBS += /usr/local/lib/libminiupnpc.a
else
LDLIBS += -lminiupnpc
endif
endif
ifeq ($(USE_AESNI),yes)
CXXFLAGS += -D__AES__ -maes
else
CXXFLAGS += -msse
endif

View File

@ -1,659 +0,0 @@
#include <string.h>
#include <stdlib.h>
#include "I2PEndian.h"
#include <cryptopp/dh.h>
#include "base64.h"
#include "Log.h"
#include "Timestamp.h"
#include "CryptoConst.h"
#include "I2NPProtocol.h"
#include "RouterContext.h"
#include "Transports.h"
#include "NetDb.h"
#include "NTCPSession.h"
using namespace i2p::crypto;
namespace i2p
{
namespace transport
{
NTCPSession::NTCPSession (boost::asio::io_service& service, std::shared_ptr<const i2p::data::RouterInfo> in_RemoteRouter):
TransportSession (in_RemoteRouter), m_Socket (service),
m_TerminationTimer (service), m_IsEstablished (false), m_ReceiveBufferOffset (0),
m_NextMessage (nullptr), m_NumSentBytes (0), m_NumReceivedBytes (0)
{
m_DHKeysPair = transports.GetNextDHKeysPair ();
m_Establisher = new Establisher;
}
NTCPSession::~NTCPSession ()
{
delete m_Establisher;
if (m_NextMessage)
i2p::DeleteI2NPMessage (m_NextMessage);
for (auto it :m_DelayedMessages)
i2p::DeleteI2NPMessage (it);
m_DelayedMessages.clear ();
}
void NTCPSession::CreateAESKey (uint8_t * pubKey, i2p::crypto::AESKey& key)
{
CryptoPP::DH dh (elgp, elgg);
uint8_t sharedKey[256];
if (!dh.Agree (sharedKey, m_DHKeysPair->privateKey, pubKey))
{
LogPrint (eLogError, "Couldn't create shared key");
Terminate ();
return;
};
uint8_t * aesKey = key;
if (sharedKey[0] & 0x80)
{
aesKey[0] = 0;
memcpy (aesKey + 1, sharedKey, 31);
}
else if (sharedKey[0])
memcpy (aesKey, sharedKey, 32);
else
{
// find first non-zero byte
uint8_t * nonZero = sharedKey + 1;
while (!*nonZero)
{
nonZero++;
if (nonZero - sharedKey > 32)
{
LogPrint (eLogWarning, "First 32 bytes of shared key is all zeros. Ignored");
return;
}
}
memcpy (aesKey, nonZero, 32);
}
}
void NTCPSession::Terminate ()
{
m_IsEstablished = false;
m_Socket.close ();
int numDelayed = 0;
for (auto it :m_DelayedMessages)
{
// try to send them again
if (m_RemoteRouter)
transports.SendMessage (m_RemoteRouter->GetIdentHash (), it);
numDelayed++;
}
m_DelayedMessages.clear ();
if (numDelayed > 0)
LogPrint (eLogWarning, "NTCP session ", numDelayed, " not sent");
// TODO: notify tunnels
transports.RemoveNTCPSession (shared_from_this ());
LogPrint ("NTCP session terminated");
}
void NTCPSession::Connected ()
{
m_IsEstablished = true;
delete m_Establisher;
m_Establisher = nullptr;
delete m_DHKeysPair;
m_DHKeysPair = nullptr;
SendTimeSyncMessage ();
SendI2NPMessage (CreateDatabaseStoreMsg ()); // we tell immediately who we are
if (!m_DelayedMessages.empty ())
{
for (auto it :m_DelayedMessages)
SendI2NPMessage (it);
m_DelayedMessages.clear ();
}
}
void NTCPSession::ClientLogin ()
{
if (!m_DHKeysPair)
m_DHKeysPair = transports.GetNextDHKeysPair ();
// send Phase1
const uint8_t * x = m_DHKeysPair->publicKey;
memcpy (m_Establisher->phase1.pubKey, x, 256);
CryptoPP::SHA256().CalculateDigest(m_Establisher->phase1.HXxorHI, x, 256);
const uint8_t * ident = m_RemoteIdentity.GetIdentHash ();
for (int i = 0; i < 32; i++)
m_Establisher->phase1.HXxorHI[i] ^= ident[i];
boost::asio::async_write (m_Socket, boost::asio::buffer (&m_Establisher->phase1, sizeof (NTCPPhase1)), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase1Sent, shared_from_this (), std::placeholders::_1, std::placeholders::_2));
}
void NTCPSession::ServerLogin ()
{
// receive Phase1
boost::asio::async_read (m_Socket, boost::asio::buffer(&m_Establisher->phase1, sizeof (NTCPPhase1)), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase1Received, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void NTCPSession::HandlePhase1Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint (eLogWarning, "Couldn't send Phase 1 message: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 1 sent: ", bytes_transferred);
boost::asio::async_read (m_Socket, boost::asio::buffer(&m_Establisher->phase2, sizeof (NTCPPhase2)), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase2Received, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
}
void NTCPSession::HandlePhase1Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint (eLogError, "Phase 1 read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 1 received: ", bytes_transferred);
// verify ident
uint8_t digest[32];
CryptoPP::SHA256().CalculateDigest(digest, m_Establisher->phase1.pubKey, 256);
const uint8_t * ident = i2p::context.GetRouterInfo ().GetIdentHash ();
for (int i = 0; i < 32; i++)
{
if ((m_Establisher->phase1.HXxorHI[i] ^ ident[i]) != digest[i])
{
LogPrint (eLogError, "Wrong ident");
Terminate ();
return;
}
}
SendPhase2 ();
}
}
void NTCPSession::SendPhase2 ()
{
if (!m_DHKeysPair)
m_DHKeysPair = transports.GetNextDHKeysPair ();
const uint8_t * y = m_DHKeysPair->publicKey;
memcpy (m_Establisher->phase2.pubKey, y, 256);
uint8_t xy[512];
memcpy (xy, m_Establisher->phase1.pubKey, 256);
memcpy (xy + 256, y, 256);
CryptoPP::SHA256().CalculateDigest(m_Establisher->phase2.encrypted.hxy, xy, 512);
uint32_t tsB = htobe32 (i2p::util::GetSecondsSinceEpoch ());
m_Establisher->phase2.encrypted.timestamp = tsB;
// TODO: fill filler
i2p::crypto::AESKey aesKey;
CreateAESKey (m_Establisher->phase1.pubKey, aesKey);
m_Encryption.SetKey (aesKey);
m_Encryption.SetIV (y + 240);
m_Decryption.SetKey (aesKey);
m_Decryption.SetIV (m_Establisher->phase1.HXxorHI + 16);
m_Encryption.Encrypt ((uint8_t *)&m_Establisher->phase2.encrypted, sizeof(m_Establisher->phase2.encrypted), (uint8_t *)&m_Establisher->phase2.encrypted);
boost::asio::async_write (m_Socket, boost::asio::buffer (&m_Establisher->phase2, sizeof (NTCPPhase2)), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase2Sent, shared_from_this (), std::placeholders::_1, std::placeholders::_2, tsB));
}
void NTCPSession::HandlePhase2Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB)
{
if (ecode)
{
LogPrint (eLogWarning, "Couldn't send Phase 2 message: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 2 sent: ", bytes_transferred);
boost::asio::async_read (m_Socket, boost::asio::buffer(m_ReceiveBuffer, NTCP_DEFAULT_PHASE3_SIZE), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase3Received, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, tsB));
}
}
void NTCPSession::HandlePhase2Received (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("Phase 2 read error: ", ecode.message (), ". Wrong ident assumed");
if (ecode != boost::asio::error::operation_aborted)
{
// this RI is not valid
i2p::data::netdb.SetUnreachable (GetRemoteIdentity ().GetIdentHash (), true);
transports.ReuseDHKeysPair (m_DHKeysPair);
m_DHKeysPair = nullptr;
Terminate ();
}
}
else
{
LogPrint (eLogDebug, "Phase 2 received: ", bytes_transferred);
i2p::crypto::AESKey aesKey;
CreateAESKey (m_Establisher->phase2.pubKey, aesKey);
m_Decryption.SetKey (aesKey);
m_Decryption.SetIV (m_Establisher->phase2.pubKey + 240);
m_Encryption.SetKey (aesKey);
m_Encryption.SetIV (m_Establisher->phase1.HXxorHI + 16);
m_Decryption.Decrypt((uint8_t *)&m_Establisher->phase2.encrypted, sizeof(m_Establisher->phase2.encrypted), (uint8_t *)&m_Establisher->phase2.encrypted);
// verify
uint8_t xy[512], hxy[32];
memcpy (xy, m_DHKeysPair->publicKey, 256);
memcpy (xy + 256, m_Establisher->phase2.pubKey, 256);
CryptoPP::SHA256().CalculateDigest(hxy, xy, 512);
if (memcmp (hxy, m_Establisher->phase2.encrypted.hxy, 32))
{
LogPrint (eLogError, "Incorrect hash");
transports.ReuseDHKeysPair (m_DHKeysPair);
m_DHKeysPair = nullptr;
Terminate ();
return ;
}
SendPhase3 ();
}
}
void NTCPSession::SendPhase3 ()
{
auto keys = i2p::context.GetPrivateKeys ();
uint8_t * buf = m_ReceiveBuffer;
*(uint16_t *)buf = htobe16 (keys.GetPublic ().GetFullLen ());
buf += 2;
buf += i2p::context.GetIdentity ().ToBuffer (buf, NTCP_BUFFER_SIZE);
uint32_t tsA = htobe32 (i2p::util::GetSecondsSinceEpoch ());
*(uint32_t *)buf = tsA;
buf += 4;
size_t signatureLen = keys.GetPublic ().GetSignatureLen ();
size_t len = (buf - m_ReceiveBuffer) + signatureLen;
size_t paddingSize = len & 0x0F; // %16
if (paddingSize > 0)
{
paddingSize = 16 - paddingSize;
// TODO: fill padding with random data
buf += paddingSize;
len += paddingSize;
}
SignedData s;
s.Insert (m_Establisher->phase1.pubKey, 256); // x
s.Insert (m_Establisher->phase2.pubKey, 256); // y
s.Insert (m_RemoteIdentity.GetIdentHash (), 32); // ident
s.Insert (tsA); // tsA
s.Insert (m_Establisher->phase2.encrypted.timestamp); // tsB
s.Sign (keys, buf);
m_Encryption.Encrypt(m_ReceiveBuffer, len, m_ReceiveBuffer);
boost::asio::async_write (m_Socket, boost::asio::buffer (m_ReceiveBuffer, len), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase3Sent, shared_from_this (), std::placeholders::_1, std::placeholders::_2, tsA));
}
void NTCPSession::HandlePhase3Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA)
{
if (ecode)
{
LogPrint (eLogWarning, "Couldn't send Phase 3 message: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 3 sent: ", bytes_transferred);
// wait for phase4
auto signatureLen = m_RemoteIdentity.GetSignatureLen ();
size_t paddingSize = signatureLen & 0x0F; // %16
if (paddingSize > 0) signatureLen += (16 - paddingSize);
boost::asio::async_read (m_Socket, boost::asio::buffer(m_ReceiveBuffer, signatureLen), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase4Received, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, tsA));
}
}
void NTCPSession::HandlePhase3Received (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB)
{
if (ecode)
{
LogPrint (eLogError, "Phase 3 read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 3 received: ", bytes_transferred);
m_Decryption.Decrypt (m_ReceiveBuffer, bytes_transferred, m_ReceiveBuffer);
uint8_t * buf = m_ReceiveBuffer;
uint16_t size = be16toh (*(uint16_t *)buf);
m_RemoteIdentity.FromBuffer (buf + 2, size);
size_t expectedSize = size + 2/*size*/ + 4/*timestamp*/ + m_RemoteIdentity.GetSignatureLen ();
size_t paddingLen = expectedSize & 0x0F;
if (paddingLen) paddingLen = (16 - paddingLen);
if (expectedSize > NTCP_DEFAULT_PHASE3_SIZE)
{
// we need more bytes for Phase3
expectedSize += paddingLen;
LogPrint (eLogDebug, "Wait for ", expectedSize, " more bytes for Phase3");
boost::asio::async_read (m_Socket, boost::asio::buffer(m_ReceiveBuffer + NTCP_DEFAULT_PHASE3_SIZE, expectedSize), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase3ExtraReceived, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, tsB, paddingLen));
}
else
HandlePhase3 (tsB, paddingLen);
}
}
void NTCPSession::HandlePhase3ExtraReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB, size_t paddingLen)
{
if (ecode)
{
LogPrint (eLogError, "Phase 3 extra read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 3 extra received: ", bytes_transferred);
m_Decryption.Decrypt (m_ReceiveBuffer + NTCP_DEFAULT_PHASE3_SIZE, bytes_transferred, m_ReceiveBuffer+ NTCP_DEFAULT_PHASE3_SIZE);
HandlePhase3 (tsB, paddingLen);
}
}
void NTCPSession::HandlePhase3 (uint32_t tsB, size_t paddingLen)
{
uint8_t * buf = m_ReceiveBuffer + m_RemoteIdentity.GetFullLen () + 2 /*size*/;
uint32_t tsA = *(uint32_t *)buf;
buf += 4;
buf += paddingLen;
SignedData s;
s.Insert (m_Establisher->phase1.pubKey, 256); // x
s.Insert (m_Establisher->phase2.pubKey, 256); // y
s.Insert (i2p::context.GetRouterInfo ().GetIdentHash (), 32); // ident
s.Insert (tsA); // tsA
s.Insert (tsB); // tsB
if (!s.Verify (m_RemoteIdentity, buf))
{
LogPrint (eLogError, "signature verification failed");
Terminate ();
return;
}
SendPhase4 (tsA, tsB);
}
void NTCPSession::SendPhase4 (uint32_t tsA, uint32_t tsB)
{
SignedData s;
s.Insert (m_Establisher->phase1.pubKey, 256); // x
s.Insert (m_Establisher->phase2.pubKey, 256); // y
s.Insert (m_RemoteIdentity.GetIdentHash (), 32); // ident
s.Insert (tsA); // tsA
s.Insert (tsB); // tsB
auto keys = i2p::context.GetPrivateKeys ();
auto signatureLen = keys.GetPublic ().GetSignatureLen ();
s.Sign (keys, m_ReceiveBuffer);
size_t paddingSize = signatureLen & 0x0F; // %16
if (paddingSize > 0) signatureLen += (16 - paddingSize);
m_Encryption.Encrypt (m_ReceiveBuffer, signatureLen, m_ReceiveBuffer);
boost::asio::async_write (m_Socket, boost::asio::buffer (m_ReceiveBuffer, signatureLen), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandlePhase4Sent, shared_from_this (), std::placeholders::_1, std::placeholders::_2));
}
void NTCPSession::HandlePhase4Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint (eLogWarning, "Couldn't send Phase 4 message: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
LogPrint (eLogDebug, "Phase 4 sent: ", bytes_transferred);
LogPrint ("NTCP server session connected");
transports.AddNTCPSession (shared_from_this ());
Connected ();
m_ReceiveBufferOffset = 0;
m_NextMessage = nullptr;
Receive ();
}
}
void NTCPSession::HandlePhase4Received (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA)
{
if (ecode)
{
LogPrint (eLogError, "Phase 4 read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
{
// this router doesn't like us
i2p::data::netdb.SetUnreachable (GetRemoteIdentity ().GetIdentHash (), true);
Terminate ();
}
}
else
{
LogPrint (eLogDebug, "Phase 4 received: ", bytes_transferred);
m_Decryption.Decrypt(m_ReceiveBuffer, bytes_transferred, m_ReceiveBuffer);
// verify signature
SignedData s;
s.Insert (m_Establisher->phase1.pubKey, 256); // x
s.Insert (m_Establisher->phase2.pubKey, 256); // y
s.Insert (i2p::context.GetRouterInfo ().GetIdentHash (), 32); // ident
s.Insert (tsA); // tsA
s.Insert (m_Establisher->phase2.encrypted.timestamp); // tsB
if (!s.Verify (m_RemoteIdentity, m_ReceiveBuffer))
{
LogPrint (eLogError, "signature verification failed");
Terminate ();
return;
}
LogPrint ("NTCP session connected");
Connected ();
m_ReceiveBufferOffset = 0;
m_NextMessage = nullptr;
Receive ();
}
}
void NTCPSession::Receive ()
{
m_Socket.async_read_some (boost::asio::buffer(m_ReceiveBuffer + m_ReceiveBufferOffset, NTCP_BUFFER_SIZE - m_ReceiveBufferOffset),
std::bind(&NTCPSession::HandleReceived, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void NTCPSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint (eLogError, "Read error: ", ecode.message ());
//if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
m_NumReceivedBytes += bytes_transferred;
m_ReceiveBufferOffset += bytes_transferred;
if (m_ReceiveBufferOffset >= 16)
{
uint8_t * nextBlock = m_ReceiveBuffer;
while (m_ReceiveBufferOffset >= 16)
{
if (!DecryptNextBlock (nextBlock)) // 16 bytes
{
Terminate ();
return;
}
nextBlock += 16;
m_ReceiveBufferOffset -= 16;
}
if (m_ReceiveBufferOffset > 0)
memcpy (m_ReceiveBuffer, nextBlock, m_ReceiveBufferOffset);
}
ScheduleTermination (); // reset termination timer
Receive ();
}
}
bool NTCPSession::DecryptNextBlock (const uint8_t * encrypted) // 16 bytes
{
if (!m_NextMessage) // new message, header expected
{
m_NextMessage = i2p::NewI2NPMessage ();
m_NextMessageOffset = 0;
m_Decryption.Decrypt (encrypted, m_NextMessage->buf);
uint16_t dataSize = be16toh (*(uint16_t *)m_NextMessage->buf);
if (dataSize)
{
// new message
if (dataSize > NTCP_MAX_MESSAGE_SIZE)
{
LogPrint (eLogError, "NTCP data size ", dataSize, " exceeds max size");
i2p::DeleteI2NPMessage (m_NextMessage);
m_NextMessage = nullptr;
return false;
}
m_NextMessageOffset += 16;
m_NextMessage->offset = 2; // size field
m_NextMessage->len = dataSize + 2;
}
else
{
// timestamp
LogPrint ("Timestamp");
i2p::DeleteI2NPMessage (m_NextMessage);
m_NextMessage = nullptr;
return true;
}
}
else // message continues
{
m_Decryption.Decrypt (encrypted, m_NextMessage->buf + m_NextMessageOffset);
m_NextMessageOffset += 16;
}
if (m_NextMessageOffset >= m_NextMessage->len + 4) // +checksum
{
// we have a complete I2NP message
i2p::HandleI2NPMessage (m_NextMessage);
m_NextMessage = nullptr;
}
return true;
}
void NTCPSession::Send (i2p::I2NPMessage * msg)
{
uint8_t * sendBuffer;
int len;
if (msg)
{
// regular I2NP
if (msg->offset < 2)
{
LogPrint (eLogError, "Malformed I2NP message");
i2p::DeleteI2NPMessage (msg);
}
sendBuffer = msg->GetBuffer () - 2;
len = msg->GetLength ();
*((uint16_t *)sendBuffer) = htobe16 (len);
}
else
{
// prepare timestamp
sendBuffer = m_TimeSyncBuffer;
len = 4;
*((uint16_t *)sendBuffer) = 0;
*((uint32_t *)(sendBuffer + 2)) = htobe32 (time (0));
}
int rem = (len + 6) & 0x0F; // %16
int padding = 0;
if (rem > 0) padding = 16 - rem;
// TODO: fill padding
m_Adler.CalculateDigest (sendBuffer + len + 2 + padding, sendBuffer, len + 2+ padding);
int l = len + padding + 6;
m_Encryption.Encrypt(sendBuffer, l, sendBuffer);
boost::asio::async_write (m_Socket, boost::asio::buffer (sendBuffer, l), boost::asio::transfer_all (),
std::bind(&NTCPSession::HandleSent, shared_from_this (), std::placeholders::_1, std::placeholders::_2, msg));
}
void NTCPSession::HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, i2p::I2NPMessage * msg)
{
if (msg)
i2p::DeleteI2NPMessage (msg);
if (ecode)
{
LogPrint (eLogWarning, "Couldn't send msg: ", ecode.message ());
// we shouldn't call Terminate () here, because HandleReceive takes care
// TODO: 'delete this' statement in Terminate () must be eliminated later
// Terminate ();
}
else
{
m_NumSentBytes += bytes_transferred;
ScheduleTermination (); // reset termination timer
}
}
void NTCPSession::SendTimeSyncMessage ()
{
Send (nullptr);
}
void NTCPSession::SendI2NPMessage (I2NPMessage * msg)
{
if (msg)
{
if (m_IsEstablished)
Send (msg);
else
m_DelayedMessages.push_back (msg);
}
}
void NTCPSession::ScheduleTermination ()
{
m_TerminationTimer.cancel ();
m_TerminationTimer.expires_from_now (boost::posix_time::seconds(NTCP_TERMINATION_TIMEOUT));
m_TerminationTimer.async_wait (std::bind (&NTCPSession::HandleTerminationTimer,
shared_from_this (), std::placeholders::_1));
}
void NTCPSession::HandleTerminationTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
LogPrint ("No activity fo ", NTCP_TERMINATION_TIMEOUT, " seconds");
//Terminate ();
m_Socket.close ();// invoke Terminate () from HandleReceive
}
}
}
}

View File

@ -1,133 +0,0 @@
#ifndef NTCP_SESSION_H__
#define NTCP_SESSION_H__
#include <inttypes.h>
#include <list>
#include <memory>
#include <cryptopp/modes.h>
#include <cryptopp/aes.h>
#include <cryptopp/adler32.h>
#include "aes.h"
#include "Identity.h"
#include "RouterInfo.h"
#include "I2NPProtocol.h"
#include "TransportSession.h"
namespace i2p
{
namespace transport
{
#pragma pack(1)
struct NTCPPhase1
{
uint8_t pubKey[256];
uint8_t HXxorHI[32];
};
struct NTCPPhase2
{
uint8_t pubKey[256];
struct
{
uint8_t hxy[32];
uint32_t timestamp;
uint8_t filler[12];
} encrypted;
};
#pragma pack()
const size_t NTCP_MAX_MESSAGE_SIZE = 16384;
const size_t NTCP_BUFFER_SIZE = 1040; // fits one tunnel message (1028)
const int NTCP_TERMINATION_TIMEOUT = 120; // 2 minutes
const size_t NTCP_DEFAULT_PHASE3_SIZE = 2/*size*/ + i2p::data::DEFAULT_IDENTITY_SIZE/*387*/ + 4/*ts*/ + 15/*padding*/ + 40/*signature*/; // 448
class NTCPSession: public TransportSession, public std::enable_shared_from_this<NTCPSession>
{
public:
NTCPSession (boost::asio::io_service& service, std::shared_ptr<const i2p::data::RouterInfo> in_RemoteRouter = nullptr);
~NTCPSession ();
void Terminate ();
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
bool IsEstablished () const { return m_IsEstablished; };
void ClientLogin ();
void ServerLogin ();
void SendI2NPMessage (I2NPMessage * msg);
size_t GetNumSentBytes () const { return m_NumSentBytes; };
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
protected:
void Connected ();
void SendTimeSyncMessage ();
void SetIsEstablished (bool isEstablished) { m_IsEstablished = isEstablished; }
private:
void CreateAESKey (uint8_t * pubKey, i2p::crypto::AESKey& key);
// client
void SendPhase3 ();
void HandlePhase1Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandlePhase2Received (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandlePhase3Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA);
void HandlePhase4Received (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsA);
//server
void SendPhase2 ();
void SendPhase4 (uint32_t tsA, uint32_t tsB);
void HandlePhase1Received (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandlePhase2Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB);
void HandlePhase3Received (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB);
void HandlePhase3ExtraReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred, uint32_t tsB, size_t paddingLen);
void HandlePhase3 (uint32_t tsB, size_t paddingLen);
void HandlePhase4Sent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
// common
void Receive ();
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
bool DecryptNextBlock (const uint8_t * encrypted);
void Send (i2p::I2NPMessage * msg);
void HandleSent (const boost::system::error_code& ecode, std::size_t bytes_transferred, i2p::I2NPMessage * msg);
// timer
void ScheduleTermination ();
void HandleTerminationTimer (const boost::system::error_code& ecode);
private:
boost::asio::ip::tcp::socket m_Socket;
boost::asio::deadline_timer m_TerminationTimer;
bool m_IsEstablished;
i2p::crypto::CBCDecryption m_Decryption;
i2p::crypto::CBCEncryption m_Encryption;
CryptoPP::Adler32 m_Adler;
struct Establisher
{
NTCPPhase1 phase1;
NTCPPhase2 phase2;
} * m_Establisher;
i2p::crypto::AESAlignedBuffer<NTCP_BUFFER_SIZE + 16> m_ReceiveBuffer;
i2p::crypto::AESAlignedBuffer<16> m_TimeSyncBuffer;
int m_ReceiveBufferOffset;
i2p::I2NPMessage * m_NextMessage;
std::list<i2p::I2NPMessage *> m_DelayedMessages;
size_t m_NextMessageOffset;
size_t m_NumSentBytes, m_NumReceivedBytes;
};
}
}
#endif

922
NetDb.cpp
View File

@ -1,922 +0,0 @@
#include "I2PEndian.h"
#include <fstream>
#include <vector>
#include <boost/asio.hpp>
#include <cryptopp/gzip.h>
#include "base64.h"
#include "Log.h"
#include "Timestamp.h"
#include "I2NPProtocol.h"
#include "Tunnel.h"
#include "Transports.h"
#include "RouterContext.h"
#include "Garlic.h"
#include "NetDb.h"
#include "Reseed.h"
#include "util.h"
using namespace i2p::transport;
namespace i2p
{
namespace data
{
I2NPMessage * RequestedDestination::CreateRequestMessage (std::shared_ptr<const RouterInfo> router,
const i2p::tunnel::InboundTunnel * replyTunnel)
{
I2NPMessage * msg = i2p::CreateDatabaseLookupMsg (m_Destination,
replyTunnel->GetNextIdentHash (), replyTunnel->GetNextTunnelID (), m_IsExploratory,
&m_ExcludedPeers, m_IsLeaseSet, m_Pool);
if (m_IsLeaseSet) // wrap lookup message into garlic
{
if (m_Pool && m_Pool->GetLocalDestination ())
msg = m_Pool->GetLocalDestination ()->WrapMessage (*router, msg);
else
LogPrint ("Can't create garlic message without destination");
}
m_ExcludedPeers.insert (router->GetIdentHash ());
m_LastRouter = router;
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
return msg;
}
I2NPMessage * RequestedDestination::CreateRequestMessage (const IdentHash& floodfill)
{
I2NPMessage * msg = i2p::CreateDatabaseLookupMsg (m_Destination,
i2p::context.GetRouterInfo ().GetIdentHash () , 0, false, &m_ExcludedPeers);
m_ExcludedPeers.insert (floodfill);
m_LastRouter = nullptr;
m_CreationTime = i2p::util::GetSecondsSinceEpoch ();
return msg;
}
void RequestedDestination::ClearExcludedPeers ()
{
m_ExcludedPeers.clear ();
}
#ifndef _WIN32
const char NetDb::m_NetDbPath[] = "/netDb";
#else
const char NetDb::m_NetDbPath[] = "\\netDb";
#endif
NetDb netdb;
NetDb::NetDb (): m_IsRunning (false), m_Thread (0)
{
}
NetDb::~NetDb ()
{
Stop ();
for (auto l:m_LeaseSets)
delete l.second;
for (auto r:m_RequestedDestinations)
delete r.second;
}
void NetDb::Start ()
{
Load (m_NetDbPath);
if (m_RouterInfos.size () < 100) // reseed if # of router less than 100
{
Reseeder reseeder;
reseeder.LoadCertificates (); // we need certificates for SU3 verification
// try SU3 first
int reseedRetries = 0;
while (m_RouterInfos.size () < 100 && reseedRetries < 10)
{
reseeder.ReseedNowSU3();
reseedRetries++;
}
// if still not enough download .dat files
reseedRetries = 0;
while (m_RouterInfos.size () < 100 && reseedRetries < 10)
{
reseeder.reseedNow();
reseedRetries++;
Load (m_NetDbPath);
}
}
m_Thread = new std::thread (std::bind (&NetDb::Run, this));
}
void NetDb::Stop ()
{
if (m_Thread)
{
m_IsRunning = false;
m_Queue.WakeUp ();
m_Thread->join ();
delete m_Thread;
m_Thread = 0;
}
}
void NetDb::Run ()
{
uint32_t lastSave = 0, lastPublish = 0;
m_IsRunning = true;
while (m_IsRunning)
{
try
{
I2NPMessage * msg = m_Queue.GetNextWithTimeout (15000); // 15 sec
if (msg)
{
while (msg)
{
switch (msg->GetHeader ()->typeID)
{
case eI2NPDatabaseStore:
LogPrint ("DatabaseStore");
HandleDatabaseStoreMsg (msg);
break;
case eI2NPDatabaseSearchReply:
LogPrint ("DatabaseSearchReply");
HandleDatabaseSearchReplyMsg (msg);
break;
case eI2NPDatabaseLookup:
LogPrint ("DatabaseLookup");
HandleDatabaseLookupMsg (msg);
break;
default: // WTF?
LogPrint ("NetDb: unexpected message type ", msg->GetHeader ()->typeID);
i2p::HandleI2NPMessage (msg);
}
msg = m_Queue.Get ();
}
}
else
{
if (!m_IsRunning) break;
// if no new DatabaseStore coming, explore it
auto numRouters = m_RouterInfos.size ();
Explore (numRouters < 1500 ? 5 : 1);
}
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
if (ts - lastSave >= 60) // save routers, manage leasesets and validate subscriptions every minute
{
if (lastSave)
{
SaveUpdated (m_NetDbPath);
ManageLeaseSets ();
}
lastSave = ts;
}
if (ts - lastPublish >= 600) // publish every 10 minutes
{
Publish ();
lastPublish = ts;
}
}
catch (std::exception& ex)
{
LogPrint ("NetDb: ", ex.what ());
}
}
}
void NetDb::AddRouterInfo (const uint8_t * buf, int len)
{
IdentityEx identity;
if (identity.FromBuffer (buf, len))
AddRouterInfo (identity.GetIdentHash (), buf, len);
}
void NetDb::AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len)
{
DeleteRequestedDestination (ident);
auto r = FindRouter (ident);
if (r)
{
auto ts = r->GetTimestamp ();
r->Update (buf, len);
if (r->GetTimestamp () > ts)
LogPrint ("RouterInfo updated");
}
else
{
LogPrint ("New RouterInfo added");
auto newRouter = std::make_shared<RouterInfo> (buf, len);
{
std::unique_lock<std::mutex> l(m_RouterInfosMutex);
m_RouterInfos[newRouter->GetIdentHash ()] = newRouter;
}
if (newRouter->IsFloodfill ())
{
std::unique_lock<std::mutex> l(m_FloodfillsMutex);
m_Floodfills.push_back (newRouter);
}
}
}
void NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len,
i2p::tunnel::InboundTunnel * from)
{
DeleteRequestedDestination (ident);
if (!from) // unsolicited LS must be received directly
{
auto it = m_LeaseSets.find(ident);
if (it != m_LeaseSets.end ())
{
it->second->Update (buf, len);
LogPrint ("LeaseSet updated");
}
else
{
LogPrint ("New LeaseSet added");
m_LeaseSets[ident] = new LeaseSet (buf, len);
}
}
}
std::shared_ptr<RouterInfo> NetDb::FindRouter (const IdentHash& ident) const
{
std::unique_lock<std::mutex> l(m_RouterInfosMutex);
auto it = m_RouterInfos.find (ident);
if (it != m_RouterInfos.end ())
return it->second;
else
return nullptr;
}
LeaseSet * NetDb::FindLeaseSet (const IdentHash& destination) const
{
auto it = m_LeaseSets.find (destination);
if (it != m_LeaseSets.end ())
return it->second;
else
return nullptr;
}
void NetDb::SetUnreachable (const IdentHash& ident, bool unreachable)
{
auto it = m_RouterInfos.find (ident);
if (it != m_RouterInfos.end ())
return it->second->SetUnreachable (unreachable);
}
// TODO: Move to reseed and/or scheduled tasks. (In java version, scheduler fix this as well as sort RIs.)
bool NetDb::CreateNetDb(boost::filesystem::path directory)
{
LogPrint (directory.string(), " doesn't exist, trying to create it.");
if (!boost::filesystem::create_directory (directory))
{
LogPrint("Failed to create directory ", directory.string());
return false;
}
// list of chars might appear in base64 string
const char * chars = GetBase64SubstitutionTable (); // 64 bytes
boost::filesystem::path suffix;
for (int i = 0; i < 64; i++)
{
#ifndef _WIN32
suffix = std::string ("/r") + chars[i];
#else
suffix = std::string ("\\r") + chars[i];
#endif
if (!boost::filesystem::create_directory( boost::filesystem::path (directory / suffix) )) return false;
}
return true;
}
void NetDb::Load (const char * directory)
{
boost::filesystem::path p (i2p::util::filesystem::GetDataDir());
p /= (directory);
if (!boost::filesystem::exists (p))
{
// seems netDb doesn't exist yet
if (!CreateNetDb(p)) return;
}
// make sure we cleanup netDb from previous attempts
m_RouterInfos.clear ();
m_Floodfills.clear ();
// load routers now
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch ();
int numRouters = 0;
boost::filesystem::directory_iterator end;
for (boost::filesystem::directory_iterator it (p); it != end; ++it)
{
if (boost::filesystem::is_directory (it->status()))
{
for (boost::filesystem::directory_iterator it1 (it->path ()); it1 != end; ++it1)
{
#if BOOST_VERSION > 10500
const std::string& fullPath = it1->path().string();
#else
const std::string& fullPath = it1->path();
#endif
auto r = std::make_shared<RouterInfo>(fullPath);
if (!r->IsUnreachable () && (!r->UsesIntroducer () || ts < r->GetTimestamp () + 3600*1000LL)) // 1 hour
{
r->DeleteBuffer ();
m_RouterInfos[r->GetIdentHash ()] = r;
if (r->IsFloodfill ())
m_Floodfills.push_back (r);
numRouters++;
}
else
{
if (boost::filesystem::exists (fullPath))
boost::filesystem::remove (fullPath);
}
}
}
}
LogPrint (numRouters, " routers loaded");
LogPrint (m_Floodfills.size (), " floodfills loaded");
}
void NetDb::SaveUpdated (const char * directory)
{
auto GetFilePath = [](const char * directory, const RouterInfo * routerInfo)
{
#ifndef _WIN32
return std::string (directory) + "/r" +
routerInfo->GetIdentHashBase64 ()[0] + "/routerInfo-" +
#else
return std::string (directory) + "\\r" +
routerInfo->GetIdentHashBase64 ()[0] + "\\routerInfo-" +
#endif
routerInfo->GetIdentHashBase64 () + ".dat";
};
boost::filesystem::path p (i2p::util::filesystem::GetDataDir());
p /= (directory);
#if BOOST_VERSION > 10500
const char * fullDirectory = p.string().c_str ();
#else
const char * fullDirectory = p.c_str ();
#endif
int count = 0, deletedCount = 0;
auto total = m_RouterInfos.size ();
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch ();
for (auto it: m_RouterInfos)
{
if (it.second->IsUpdated ())
{
it.second->SaveToFile (GetFilePath(fullDirectory, it.second.get ()));
it.second->SetUpdated (false);
it.second->DeleteBuffer ();
count++;
}
else
{
// RouterInfo expires after 1 hour if uses introducer
if ((it.second->UsesIntroducer () && ts > it.second->GetTimestamp () + 3600*1000LL) // 1 hour
// RouterInfo expires in 72 hours if more than 300
|| (total > 300 && ts > it.second->GetTimestamp () + 3*24*3600*1000LL)) // 3 days
{
total--;
it.second->SetUnreachable (true);
}
if (it.second->IsUnreachable ())
{
// delete RI file
if (boost::filesystem::exists (GetFilePath (fullDirectory, it.second.get ())))
{
boost::filesystem::remove (GetFilePath (fullDirectory, it.second.get ()));
deletedCount++;
}
// delete from floodfills list
if (it.second->IsFloodfill ())
{
std::unique_lock<std::mutex> l(m_FloodfillsMutex);
m_Floodfills.remove (it.second);
}
}
}
}
if (count > 0)
LogPrint (count," new/updated routers saved");
if (deletedCount > 0)
{
LogPrint (deletedCount," routers deleted");
// clean up RouterInfos table
std::unique_lock<std::mutex> l(m_RouterInfosMutex);
for (auto it = m_RouterInfos.begin (); it != m_RouterInfos.end ();)
{
if (it->second->IsUnreachable ())
it = m_RouterInfos.erase (it);
else
it++;
}
}
}
void NetDb::RequestDestination (const IdentHash& destination, bool isLeaseSet, i2p::tunnel::TunnelPool * pool)
{
if (isLeaseSet) // we request LeaseSet through tunnels
{
i2p::tunnel::OutboundTunnel * outbound = pool ? pool->GetNextOutboundTunnel () : i2p::tunnel::tunnels.GetNextOutboundTunnel ();
if (outbound)
{
i2p::tunnel::InboundTunnel * inbound = pool ? pool->GetNextInboundTunnel () :i2p::tunnel::tunnels.GetNextInboundTunnel ();
if (inbound)
{
RequestedDestination * dest = CreateRequestedDestination (destination, true, false, pool);
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ());
if (floodfill)
{
// DatabaseLookup message
outbound->SendTunnelDataMsg (
{
i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
floodfill->GetIdentHash (), 0,
dest->CreateRequestMessage (floodfill, inbound)
}
});
}
else
LogPrint ("No more floodfills found");
}
else
LogPrint ("No inbound tunnels found");
}
else
LogPrint ("No outbound tunnels found");
}
else // RouterInfo is requested directly
{
RequestedDestination * dest = CreateRequestedDestination (destination, false, false, pool);
auto floodfill = GetClosestFloodfill (destination, dest->GetExcludedPeers ());
if (floodfill)
transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
}
}
void NetDb::HandleDatabaseStoreMsg (I2NPMessage * m)
{
const uint8_t * buf = m->GetPayload ();
size_t len = be16toh (m->GetHeader ()->size);
I2NPDatabaseStoreMsg * msg = (I2NPDatabaseStoreMsg *)buf;
size_t offset = sizeof (I2NPDatabaseStoreMsg);
if (msg->replyToken)
offset += 36;
if (msg->type)
{
LogPrint ("LeaseSet");
AddLeaseSet (msg->key, buf + offset, len - offset, m->from);
}
else
{
LogPrint ("RouterInfo");
size_t size = be16toh (*(uint16_t *)(buf + offset));
if (size > 2048)
{
LogPrint ("Invalid RouterInfo length ", (int)size);
return;
}
offset += 2;
CryptoPP::Gunzip decompressor;
decompressor.Put (buf + offset, size);
decompressor.MessageEnd();
uint8_t uncompressed[2048];
size_t uncomressedSize = decompressor.MaxRetrievable ();
decompressor.Get (uncompressed, uncomressedSize);
AddRouterInfo (msg->key, uncompressed, uncomressedSize);
}
i2p::DeleteI2NPMessage (m);
}
void NetDb::HandleDatabaseSearchReplyMsg (I2NPMessage * msg)
{
uint8_t * buf = msg->GetPayload ();
char key[48];
int l = i2p::data::ByteStreamToBase64 (buf, 32, key, 48);
key[l] = 0;
int num = buf[32]; // num
LogPrint ("DatabaseSearchReply for ", key, " num=", num);
auto it = m_RequestedDestinations.find (IdentHash (buf));
if (it != m_RequestedDestinations.end ())
{
RequestedDestination * dest = it->second;
bool deleteDest = true;
if (num > 0)
{
auto pool = dest ? dest->GetTunnelPool () : nullptr;
auto outbound = pool ? pool->GetNextOutboundTunnel () : i2p::tunnel::tunnels.GetNextOutboundTunnel ();
auto inbound = pool ? pool->GetNextInboundTunnel () : i2p::tunnel::tunnels.GetNextInboundTunnel ();
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
if (!dest->IsExploratory ())
{
// reply to our destination. Try other floodfills
if (outbound && inbound )
{
auto count = dest->GetExcludedPeers ().size ();
if (count < 7)
{
auto nextFloodfill = GetClosestFloodfill (dest->GetDestination (), dest->GetExcludedPeers ());
if (nextFloodfill)
{
if (!dest->IsLeaseSet ())
{
// tell floodfill about us
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
nextFloodfill->GetIdentHash (), 0,
CreateDatabaseStoreMsg ()
});
}
// request destination
LogPrint ("Try ", key, " at ", count, " floodfill ", nextFloodfill->GetIdentHash ().ToBase64 ());
auto msg = dest->CreateRequestMessage (nextFloodfill, inbound);
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
nextFloodfill->GetIdentHash (), 0, msg
});
deleteDest = false;
}
}
else
LogPrint (key, " was not found on 7 floodfills");
}
}
for (int i = 0; i < num; i++)
{
uint8_t * router = buf + 33 + i*32;
char peerHash[48];
int l1 = i2p::data::ByteStreamToBase64 (router, 32, peerHash, 48);
peerHash[l1] = 0;
LogPrint (i,": ", peerHash);
if (dest->IsExploratory ())
{
auto r = FindRouter (router);
if (!r || i2p::util::GetMillisecondsSinceEpoch () > r->GetTimestamp () + 3600*1000LL)
{
// router with ident not found or too old (1 hour)
LogPrint ("Found new/outdated router. Requesting RouterInfo ...");
if (outbound && inbound && dest->GetLastRouter ())
{
RequestedDestination * d1 = CreateRequestedDestination (router, false, false, pool);
auto msg = d1->CreateRequestMessage (dest->GetLastRouter (), inbound);
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
dest->GetLastRouter ()->GetIdentHash (), 0, msg
});
}
else
RequestDestination (router, false, pool);
}
else
LogPrint ("Bayan");
}
else
{
auto r = FindRouter (router);
// do we have that floodfill router in our database?
if (!r)
{
// request router
LogPrint ("Found new floodfill. Request it");
RequestDestination (router, false, pool);
}
}
}
if (outbound && msgs.size () > 0)
outbound->SendTunnelDataMsg (msgs);
if (deleteDest)
{
// no more requests for the destinationation. delete it
delete it->second;
m_RequestedDestinations.erase (it);
}
}
else
{
// no more requests for detination possible. delete it
delete it->second;
m_RequestedDestinations.erase (it);
}
}
else
{
LogPrint ("Requested destination for ", key, " not found");
// it might contain new routers
for (int i = 0; i < num; i++)
{
IdentHash router (buf + 33 + i*32);
if (!FindRouter (router))
{
LogPrint ("New router ", router.ToBase64 (), " found. Request it");
RequestDestination (router);
}
}
}
i2p::DeleteI2NPMessage (msg);
}
void NetDb::HandleDatabaseLookupMsg (I2NPMessage * msg)
{
uint8_t * buf = msg->GetPayload ();
char key[48];
int l = i2p::data::ByteStreamToBase64 (buf, 32, key, 48);
key[l] = 0;
LogPrint ("DatabaseLookup for ", key, " recieved");
uint8_t flag = buf[64];
uint8_t * excluded = buf + 65;
uint32_t replyTunnelID = 0;
if (flag & 0x01) //reply to tunnel
{
replyTunnelID = be32toh (*(uint32_t *)(buf + 64));
excluded += 4;
}
uint16_t numExcluded = be16toh (*(uint16_t *)excluded);
excluded += 2;
if (numExcluded > 512)
{
LogPrint ("Number of excluded peers", numExcluded, " exceeds 512");
numExcluded = 0; // TODO:
}
I2NPMessage * replyMsg = nullptr;
{
auto router = FindRouter (buf);
if (router)
{
LogPrint ("Requested RouterInfo ", key, " found");
router->LoadBuffer ();
if (router->GetBuffer ())
replyMsg = CreateDatabaseStoreMsg (router.get ());
}
}
if (!replyMsg)
{
auto leaseSet = FindLeaseSet (buf);
if (leaseSet) // we don't send back our LeaseSets
{
LogPrint ("Requested LeaseSet ", key, " found");
replyMsg = CreateDatabaseStoreMsg (leaseSet);
}
}
if (!replyMsg)
{
LogPrint ("Requested ", key, " not found. ", numExcluded, " excluded");
std::set<IdentHash> excludedRouters;
for (int i = 0; i < numExcluded; i++)
{
// TODO: check for all zeroes (exploratory)
excludedRouters.insert (excluded);
excluded += 32;
}
replyMsg = CreateDatabaseSearchReply (buf, GetClosestFloodfill (buf, excludedRouters).get ());
}
else
excluded += numExcluded*32; // we don't care about exluded
if (replyMsg)
{
if (replyTunnelID)
{
// encryption might be used though tunnel only
if (flag & 0x02) // encrypted reply requested
{
uint8_t * sessionKey = excluded;
uint8_t numTags = sessionKey[32];
if (numTags > 0)
{
uint8_t * sessionTag = sessionKey + 33; // take first tag
i2p::garlic::GarlicRoutingSession garlic (sessionKey, sessionTag);
replyMsg = garlic.WrapSingleMessage (replyMsg);
}
}
auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool ();
auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : nullptr;
if (outbound)
outbound->SendTunnelDataMsg (buf+32, replyTunnelID, replyMsg);
else
transports.SendMessage (buf+32, i2p::CreateTunnelGatewayMsg (replyTunnelID, replyMsg));
}
else
transports.SendMessage (buf+32, replyMsg);
}
i2p::DeleteI2NPMessage (msg);
}
void NetDb::Explore (int numDestinations)
{
// clean up previous exploratories
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
for (auto it = m_RequestedDestinations.begin (); it != m_RequestedDestinations.end ();)
{
if (it->second->IsExploratory () || ts > it->second->GetCreationTime () + 60) // no response for 1 minute
{
delete it->second;
it = m_RequestedDestinations.erase (it);
}
else
it++;
}
// new requests
auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool ();
auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : i2p::tunnel::tunnels.GetNextOutboundTunnel ();
auto inbound = exploratoryPool ? exploratoryPool->GetNextInboundTunnel () : i2p::tunnel::tunnels.GetNextInboundTunnel ();
bool throughTunnels = outbound && inbound;
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
uint8_t randomHash[32];
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
std::set<const RouterInfo *> floodfills;
LogPrint ("Exploring new ", numDestinations, " routers ...");
for (int i = 0; i < numDestinations; i++)
{
rnd.GenerateBlock (randomHash, 32);
RequestedDestination * dest = CreateRequestedDestination (IdentHash (randomHash), false, true, exploratoryPool);
auto floodfill = GetClosestFloodfill (randomHash, dest->GetExcludedPeers ());
if (floodfill && !floodfills.count (floodfill.get ())) // request floodfill only once
{
floodfills.insert (floodfill.get ());
if (throughTunnels)
{
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
floodfill->GetIdentHash (), 0,
CreateDatabaseStoreMsg () // tell floodfill about us
});
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeRouter,
floodfill->GetIdentHash (), 0,
dest->CreateRequestMessage (floodfill, inbound) // explore
});
}
else
i2p::transport::transports.SendMessage (floodfill->GetIdentHash (), dest->CreateRequestMessage (floodfill->GetIdentHash ()));
}
else
DeleteRequestedDestination (dest);
}
if (throughTunnels && msgs.size () > 0)
outbound->SendTunnelDataMsg (msgs);
}
void NetDb::Publish ()
{
std::set<IdentHash> excluded; // TODO: fill up later
for (int i = 0; i < 3; i++)
{
auto floodfill = GetClosestFloodfill (i2p::context.GetRouterInfo ().GetIdentHash (), excluded);
if (floodfill)
{
LogPrint ("Publishing our RouterInfo to ", floodfill->GetIdentHashAbbreviation ());
transports.SendMessage (floodfill->GetIdentHash (), CreateDatabaseStoreMsg ());
excluded.insert (floodfill->GetIdentHash ());
}
}
}
RequestedDestination * NetDb::CreateRequestedDestination (const IdentHash& dest,
bool isLeaseSet, bool isExploratory, i2p::tunnel::TunnelPool * pool)
{
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
auto it = m_RequestedDestinations.find (dest);
if (it == m_RequestedDestinations.end ()) // not exist yet
{
RequestedDestination * d = new RequestedDestination (dest, isLeaseSet, isExploratory, pool);
m_RequestedDestinations[dest] = d;
return d;
}
else
return it->second;
}
bool NetDb::DeleteRequestedDestination (const IdentHash& dest)
{
auto it = m_RequestedDestinations.find (dest);
if (it != m_RequestedDestinations.end ())
{
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
delete it->second;
m_RequestedDestinations.erase (it);
return true;
}
return false;
}
void NetDb::DeleteRequestedDestination (RequestedDestination * dest)
{
if (dest)
{
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
m_RequestedDestinations.erase (dest->GetDestination ());
delete dest;
}
}
std::shared_ptr<const RouterInfo> NetDb::GetRandomRouter () const
{
return GetRandomRouter (
[](std::shared_ptr<const RouterInfo> router)->bool
{
return !router->IsHidden ();
});
}
std::shared_ptr<const RouterInfo> NetDb::GetRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith) const
{
return GetRandomRouter (
[compatibleWith](std::shared_ptr<const RouterInfo> router)->bool
{
return !router->IsHidden () && router != compatibleWith &&
router->IsCompatible (*compatibleWith);
});
}
std::shared_ptr<const RouterInfo> NetDb::GetHighBandwidthRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith) const
{
return GetRandomRouter (
[compatibleWith](std::shared_ptr<const RouterInfo> router)->bool
{
return !router->IsHidden () && router != compatibleWith &&
router->IsCompatible (*compatibleWith) && (router->GetCaps () & RouterInfo::eHighBandwidth);
});
}
template<typename Filter>
std::shared_ptr<const RouterInfo> NetDb::GetRandomRouter (Filter filter) const
{
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
uint32_t ind = rnd.GenerateWord32 (0, m_RouterInfos.size () - 1);
for (int j = 0; j < 2; j++)
{
uint32_t i = 0;
std::unique_lock<std::mutex> l(m_RouterInfosMutex);
for (auto it: m_RouterInfos)
{
if (i >= ind)
{
if (!it.second->IsUnreachable () && filter (it.second))
return it.second;
}
else
i++;
}
// we couldn't find anything, try second pass
ind = 0;
}
return nullptr; // seems we have too few routers
}
void NetDb::PostI2NPMsg (I2NPMessage * msg)
{
if (msg) m_Queue.Put (msg);
}
std::shared_ptr<const RouterInfo> NetDb::GetClosestFloodfill (const IdentHash& destination,
const std::set<IdentHash>& excluded) const
{
std::shared_ptr<const RouterInfo> r;
XORMetric minMetric;
IdentHash destKey = CreateRoutingKey (destination);
minMetric.SetMax ();
std::unique_lock<std::mutex> l(m_FloodfillsMutex);
for (auto it: m_Floodfills)
{
if (!it->IsUnreachable () && !excluded.count (it->GetIdentHash ()))
{
XORMetric m = destKey ^ it->GetIdentHash ();
if (m < minMetric)
{
minMetric = m;
r = it;
}
}
}
return r;
}
void NetDb::ManageLeaseSets ()
{
for (auto it = m_LeaseSets.begin (); it != m_LeaseSets.end ();)
{
if (it->second->HasNonExpiredLeases ()) // all leases expired
{
LogPrint ("LeaseSet ", it->second->GetIdentHash ().ToBase64 (), " expired");
delete it->second;
it = m_LeaseSets.erase (it);
}
else
it++;
}
}
}
}

130
NetDb.h
View File

@ -1,130 +0,0 @@
#ifndef NETDB_H__
#define NETDB_H__
#include <inttypes.h>
#include <set>
#include <map>
#include <list>
#include <string>
#include <thread>
#include <mutex>
#include <boost/filesystem.hpp>
#include "Queue.h"
#include "I2NPProtocol.h"
#include "RouterInfo.h"
#include "LeaseSet.h"
#include "Tunnel.h"
#include "TunnelPool.h"
namespace i2p
{
namespace data
{
class RequestedDestination
{
public:
RequestedDestination (const IdentHash& destination, bool isLeaseSet,
bool isExploratory = false, i2p::tunnel::TunnelPool * pool = nullptr):
m_Destination (destination), m_IsLeaseSet (isLeaseSet), m_IsExploratory (isExploratory),
m_Pool (pool), m_CreationTime (0) {};
const IdentHash& GetDestination () const { return m_Destination; };
int GetNumExcludedPeers () const { return m_ExcludedPeers.size (); };
const std::set<IdentHash>& GetExcludedPeers () { return m_ExcludedPeers; };
void ClearExcludedPeers ();
std::shared_ptr<const RouterInfo> GetLastRouter () const { return m_LastRouter; };
i2p::tunnel::TunnelPool * GetTunnelPool () { return m_Pool; };
bool IsExploratory () const { return m_IsExploratory; };
bool IsLeaseSet () const { return m_IsLeaseSet; };
bool IsExcluded (const IdentHash& ident) const { return m_ExcludedPeers.count (ident); };
uint64_t GetCreationTime () const { return m_CreationTime; };
I2NPMessage * CreateRequestMessage (std::shared_ptr<const RouterInfo>, const i2p::tunnel::InboundTunnel * replyTunnel);
I2NPMessage * CreateRequestMessage (const IdentHash& floodfill);
private:
IdentHash m_Destination;
bool m_IsLeaseSet, m_IsExploratory;
i2p::tunnel::TunnelPool * m_Pool;
std::set<IdentHash> m_ExcludedPeers;
std::shared_ptr<const RouterInfo> m_LastRouter;
uint64_t m_CreationTime;
};
class NetDb
{
public:
NetDb ();
~NetDb ();
void Start ();
void Stop ();
void AddRouterInfo (const uint8_t * buf, int len);
void AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len);
void AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from);
std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const;
LeaseSet * FindLeaseSet (const IdentHash& destination) const;
void RequestDestination (const IdentHash& destination, bool isLeaseSet = false,
i2p::tunnel::TunnelPool * pool = nullptr);
void HandleDatabaseStoreMsg (I2NPMessage * msg);
void HandleDatabaseSearchReplyMsg (I2NPMessage * msg);
void HandleDatabaseLookupMsg (I2NPMessage * msg);
std::shared_ptr<const RouterInfo> GetRandomRouter () const;
std::shared_ptr<const RouterInfo> GetRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith) const;
std::shared_ptr<const RouterInfo> GetHighBandwidthRandomRouter (std::shared_ptr<const RouterInfo> compatibleWith) const;
std::shared_ptr<const RouterInfo> GetClosestFloodfill (const IdentHash& destination, const std::set<IdentHash>& excluded) const;
void SetUnreachable (const IdentHash& ident, bool unreachable);
void PostI2NPMsg (I2NPMessage * msg);
// for web interface
int GetNumRouters () const { return m_RouterInfos.size (); };
int GetNumFloodfills () const { return m_Floodfills.size (); };
int GetNumLeaseSets () const { return m_LeaseSets.size (); };
private:
bool CreateNetDb(boost::filesystem::path directory);
void Load (const char * directory);
void SaveUpdated (const char * directory);
void Run (); // exploratory thread
void Explore (int numDestinations);
void Publish ();
void ManageLeaseSets ();
RequestedDestination * CreateRequestedDestination (const IdentHash& dest,
bool isLeaseSet, bool isExploratory = false, i2p::tunnel::TunnelPool * pool = nullptr);
bool DeleteRequestedDestination (const IdentHash& dest); // returns true if found
void DeleteRequestedDestination (RequestedDestination * dest);
template<typename Filter>
std::shared_ptr<const RouterInfo> GetRandomRouter (Filter filter) const;
private:
std::map<IdentHash, LeaseSet *> m_LeaseSets;
mutable std::mutex m_RouterInfosMutex;
std::map<IdentHash, std::shared_ptr<RouterInfo> > m_RouterInfos;
mutable std::mutex m_FloodfillsMutex;
std::list<std::shared_ptr<RouterInfo> > m_Floodfills;
std::mutex m_RequestedDestinationsMutex;
std::map<IdentHash, RequestedDestination *> m_RequestedDestinations;
bool m_IsRunning;
std::thread * m_Thread;
i2p::util::Queue<I2NPMessage> m_Queue; // of I2NPDatabaseStoreMsg
static const char m_NetDbPath[];
};
extern NetDb netdb;
}
}
#endif

161
README.md
View File

@ -1,85 +1,102 @@
[![GitHub release](https://img.shields.io/github/release/PurpleI2P/i2pd.svg?label=latest%20release)](https://github.com/PurpleI2P/i2pd/releases/latest)
[![Snapcraft release](https://snapcraft.io/i2pd/badge.svg)](https://snapcraft.io/i2pd)
[![License](https://img.shields.io/github/license/PurpleI2P/i2pd.svg)](https://github.com/PurpleI2P/i2pd/blob/openssl/LICENSE)
[![Packaging status](https://repology.org/badge/tiny-repos/i2pd.svg)](https://repology.org/project/i2pd/versions)
[![Docker Pulls](https://img.shields.io/docker/pulls/purplei2p/i2pd)](https://hub.docker.com/r/purplei2p/i2pd)
*note: i2pd for Android can be found in [i2pd-android](https://github.com/PurpleI2P/i2pd-android) repository and with Qt GUI in [i2pd-qt](https://github.com/PurpleI2P/i2pd-qt) repository*
i2pd
====
I2P router written in C++
[Русская версия](https://github.com/PurpleI2P/i2pd_docs_ru/blob/master/README.md)
Requirements for Linux/FreeBSD/OSX
----------------------------------
i2pd (I2P Daemon) is a full-featured C++ implementation of I2P client.
GCC 4.6 or newer, Boost 1.46 or newer, crypto++. Clang can be used instead of
GCC.
I2P (Invisible Internet Protocol) is a universal anonymous network layer.
All communications over I2P are anonymous and end-to-end encrypted, participants
don't reveal their real IP addresses.
Requirements for Windows
------------------------
I2P client is a software used for building and using anonymous I2P
networks. Such networks are commonly used for anonymous peer-to-peer
applications (filesharing, cryptocurrencies) and anonymous client-server
applications (websites, instant messengers, chat-servers).
VS2013 (known to work with 12.0.21005.1 or newer), Boost 1.46 or newer,
crypto++ 5.62. See Win32/README-Build.txt for instructions on how to build i2pd
and its dependencies.
I2P allows people from all around the world to communicate and share information
without restrictions.
Build Statuses
---------------
Features
--------
- Linux x64 - [![Build Status](https://jenkins.nordcloud.no/buildStatus/icon?job=i2pd-linux)](https://jenkins.nordcloud.no/job/i2pd-linux/)
- Linux ARM - To be added
- Mac OS X - To be added
- Microsoft VC13 - To be added
* Distributed anonymous networking framework
* End-to-end encrypted communications
* Small footprint, simple dependencies, fast performance
* Rich set of APIs for developers of secure applications
Resources
---------
* [Website](http://i2pd.website)
* [Documentation](https://i2pd.readthedocs.io/en/latest/)
* [Wiki](https://github.com/PurpleI2P/i2pd/wiki)
* [Tickets/Issues](https://github.com/PurpleI2P/i2pd/issues)
* [Specifications](https://geti2p.net/spec)
* [Twitter](https://twitter.com/hashtag/i2pd)
Installing
----------
The easiest way to install i2pd is by using precompiled packages and binaries.
You can fetch most of them on [release](https://github.com/PurpleI2P/i2pd/releases/latest) page.
Please see [documentation](https://i2pd.readthedocs.io/en/latest/user-guide/install/) for more info.
Building
--------
See [documentation](https://i2pd.readthedocs.io/en/latest/) for how to build
i2pd from source on your OS.
note: i2pd with Qt GUI can be found in [i2pd-qt](https://github.com/PurpleI2P/i2pd-qt) repository and for android in [i2pd-android](https://github.com/PurpleI2P/i2pd-android) repository.
Testing
Build instructions:
* [unix](https://i2pd.readthedocs.io/en/latest/devs/building/unix/)
* [windows](https://i2pd.readthedocs.io/en/latest/devs/building/windows/)
* [iOS](https://i2pd.readthedocs.io/en/latest/devs/building/ios/)
* [android](https://i2pd.readthedocs.io/en/latest/devs/building/android/)
**Supported systems:**
* GNU/Linux - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd)
* CentOS / Fedora / Mageia - [![Build Status](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/status_image/last_build.png)](https://copr.fedorainfracloud.org/coprs/supervillain/i2pd/package/i2pd-git/)
* Alpine, ArchLinux, openSUSE, Gentoo, Debian, Ubuntu, etc.
* Windows - [![Build status](https://ci.appveyor.com/api/projects/status/1908qe4p48ff1x23?svg=true)](https://ci.appveyor.com/project/PurpleI2P/i2pd)
* Mac OS X - [![Build Status](https://travis-ci.org/PurpleI2P/i2pd.svg?branch=openssl)](https://travis-ci.org/PurpleI2P/i2pd)
* Docker image - [![Build Status](https://img.shields.io/docker/cloud/build/purplei2p/i2pd)](https://hub.docker.com/r/purplei2p/i2pd/builds/)
* Snap
* FreeBSD
* Android
* iOS
Using i2pd
----------
See [documentation](https://i2pd.readthedocs.io/en/latest/user-guide/run/) and
[example config file](https://github.com/PurpleI2P/i2pd/blob/openssl/contrib/i2pd.conf).
Donations
---------
BTC: 3MDoGJW9TLMTCDGrR9bLgWXfm6sjmgy86f
LTC: LKQirrYrDeTuAPnpYq5y7LVKtywfkkHi59
ETH: 0x9e5bac70d20d1079ceaa111127f4fb3bccce379d
DASH: Xw8YUrQpYzP9tZBmbjqxS3M97Q7v3vJKUF
ZEC: t1cTckLuXsr1dwVrK4NDzfhehss4NvMadAJ
GST: GbD2JSQHBHCKLa9WTHmigJRpyFgmBj4woG
License
-------
First, build it.
* $ cd i2pd
* $ make
Next, find out your public ip. (find it for example at http://www.whatismyip.com/)
Then, run it with:
$ ./i2p --host=YOUR_PUBLIC_IP
The client should now reseed by itself.
To visit an I2P page, you need to find the b32 address of your destination.
After that, go to the webconsole and add it behind the url. (Remove http:// from the address)
This should resulting in for example:
http://localhost:7070/4oes3rlgrpbkmzv4lqcfili23h3cvpwslqcfjlk6vvguxyggspwa.b32.i2p
Cmdline options
---------------
* --host= - The external IP
* --port= - The port to listen on
* --httpport= - The http port to listen on
* --log= - Enable or disable logging to file. 1 for yes, 0 for no.
* --daemon= - Enable or disable daemon mode. 1 for yes, 0 for no.
* --service= - 1 if uses system folders (/var/run/i2pd.pid, /var/log/i2pd.log, /var/lib/i2pd).
* --unreachable= - 1 if router is declared as unreachable and works through introducers.
* --v6= - 1 if supports communication through ipv6, off by default
* --httpproxyport= - The port to listen on (HTTP Proxy)
* --socksproxyport= - The port to listen on (SOCKS Proxy)
* --ircport= - The local port of IRC tunnel to listen on. 6668 by default
* --ircdest= - I2P destination address of IRC server. For example irc.postman.i2p
* --irckeys= - optional keys file for local destination
* --eepkeys= - File name containing destination keys, for example privKeys.dat.
The file will be created if it does not already exist (issue #110).
* --eephost= - Address incoming trafic forward to. 127.0.0.1 by default
* --eepport= - Port incoming trafic forward to. 80 by default
* --samport= - Port of SAM bridge. Usually 7656. SAM is off if not specified
* --bobport= - Port of BOB command channel. Usually 2827. BOB is off if not specified
* --conf= - Config file (default: ~/.i2pd/i2p.conf or /var/lib/i2pd/i2p.conf)
This parameter will be silently ignored if the specified config file does not exist.
Options specified on the command line take precedence over those in the config file.
Config file
-----------
INI-like, syntax is the following : <key> = <value>.
All command-line parameters are allowed as keys, for example:
log = 1
v6 = 0
ircdest = irc.postman.i2p
This project is licensed under the BSD 3-clause license, which can be found in the file
LICENSE in the root of the project source code.

View File

@ -1,502 +0,0 @@
#include <string.h>
#include <fstream>
#include <sstream>
#include <boost/regex.hpp>
#include <boost/filesystem.hpp>
#include <cryptopp/osrng.h>
#include <cryptopp/asn.h>
#include <cryptopp/base64.h>
#include <cryptopp/crc.h>
#include <cryptopp/zinflate.h>
#include "I2PEndian.h"
#include "Reseed.h"
#include "Log.h"
#include "Identity.h"
#include "CryptoConst.h"
#include "NetDb.h"
#include "util.h"
namespace i2p
{
namespace data
{
static std::vector<std::string> httpReseedHostList = {
"http://193.150.121.66/netDb/",
"http://netdb.i2p2.no/",
"http://reseed.i2p-projekt.de/",
"http://cowpuncher.drollette.com/netdb/",
"http://i2p.mooo.com/netDb/",
"http://reseed.info/",
"http://uk.reseed.i2p2.no/",
"http://us.reseed.i2p2.no/",
"http://jp.reseed.i2p2.no/",
"http://i2p-netdb.innovatio.no/",
"http://ieb9oopo.mooo.com"
};
//TODO: Remember to add custom port support. Not all serves on 443
static std::vector<std::string> httpsReseedHostList = {
"https://193.150.121.66/netDb/",
"https://netdb.i2p2.no/",
"https://reseed.i2p-projekt.de/",
"https://cowpuncher.drollette.com/netdb/",
"https://i2p.mooo.com/netDb/",
"https://reseed.info/",
"https://i2p-netdb.innovatio.no/",
"https://ieb9oopo.mooo.com/",
"https://ssl.webpack.de/ivae2he9.sg4.e-plaza.de/" // Only HTTPS and SU3 (v2) support
};
//TODO: Implement v2 reseeding. Lightweight zip library is needed.
//TODO: Implement SU3, utils.
Reseeder::Reseeder()
{
}
Reseeder::~Reseeder()
{
}
bool Reseeder::reseedNow()
{
try
{
// Seems like the best place to try to intercept with SSL
/*ssl_server = true;
try {
// SSL
}
catch (std::exception& e)
{
LogPrint("Exception in SSL: ", e.what());
}*/
std::string reseedHost = httpReseedHostList[(rand() % httpReseedHostList.size())];
LogPrint("Reseeding from ", reseedHost);
std::string content = i2p::util::http::httpRequest(reseedHost);
if (content == "")
{
LogPrint("Reseed failed");
return false;
}
boost::regex e("<\\s*A\\s+[^>]*href\\s*=\\s*\"([^\"]*)\"", boost::regex::normal | boost::regbase::icase);
boost::sregex_token_iterator i(content.begin(), content.end(), e, 1);
boost::sregex_token_iterator j;
//TODO: Ugly code, try to clean up.
//TODO: Try to reduce N number of variables
std::string name;
std::string routerInfo;
std::string tmpUrl;
std::string filename;
std::string ignoreFileSuffix = ".su3";
boost::filesystem::path root = i2p::util::filesystem::GetDataDir();
while (i != j)
{
name = *i++;
if (name.find(ignoreFileSuffix)!=std::string::npos)
continue;
LogPrint("Downloading ", name);
tmpUrl = reseedHost;
tmpUrl.append(name);
routerInfo = i2p::util::http::httpRequest(tmpUrl);
if (routerInfo.size()==0)
continue;
filename = root.string();
#ifndef _WIN32
filename += "/netDb/r";
#else
filename += "\\netDb\\r";
#endif
filename += name.at(11); // first char in id
#ifndef _WIN32
filename.append("/");
#else
filename.append("\\");
#endif
filename.append(name.c_str());
std::ofstream outfile (filename, std::ios::binary);
outfile << routerInfo;
outfile.close();
}
return true;
}
catch (std::exception& ex)
{
//TODO: error reporting
return false;
}
return false;
}
int Reseeder::ReseedNowSU3 ()
{
CryptoPP::AutoSeededRandomPool rnd;
auto ind = rnd.GenerateWord32 (0, httpReseedHostList.size() - 1);
std::string reseedHost = httpReseedHostList[ind];
return ReseedFromSU3 (reseedHost);
}
int Reseeder::ReseedFromSU3 (const std::string& host)
{
std::string url = host + "i2pseeds.su3";
LogPrint (eLogInfo, "Dowloading SU3 from ", host);
std::string su3 = i2p::util::http::httpRequest (url);
if (su3.length () > 0)
{
std::stringstream s(su3);
return ProcessSU3Stream (s);
}
else
{
LogPrint (eLogWarning, "SU3 download failed");
return 0;
}
}
int Reseeder::ProcessSU3File (const char * filename)
{
std::ifstream s(filename, std::ifstream::binary);
if (s.is_open ())
return ProcessSU3Stream (s);
else
{
LogPrint (eLogError, "Can't open file ", filename);
return 0;
}
}
const char SU3_MAGIC_NUMBER[]="I2Psu3";
const uint32_t ZIP_HEADER_SIGNATURE = 0x04034B50;
const uint32_t ZIP_CENTRAL_DIRECTORY_HEADER_SIGNATURE = 0x02014B50;
const uint16_t ZIP_BIT_FLAG_DATA_DESCRIPTOR = 0x0008;
int Reseeder::ProcessSU3Stream (std::istream& s)
{
char magicNumber[7];
s.read (magicNumber, 7); // magic number and zero byte 6
if (strcmp (magicNumber, SU3_MAGIC_NUMBER))
{
LogPrint (eLogError, "Unexpected SU3 magic number");
return 0;
}
s.seekg (1, std::ios::cur); // su3 file format version
SigningKeyType signatureType;
s.read ((char *)&signatureType, 2); // signature type
signatureType = be16toh (signatureType);
uint16_t signatureLength;
s.read ((char *)&signatureLength, 2); // signature length
signatureLength = be16toh (signatureLength);
s.seekg (1, std::ios::cur); // unused
uint8_t versionLength;
s.read ((char *)&versionLength, 1); // version length
s.seekg (1, std::ios::cur); // unused
uint8_t signerIDLength;
s.read ((char *)&signerIDLength, 1); // signer ID length
uint64_t contentLength;
s.read ((char *)&contentLength, 8); // content length
contentLength = be64toh (contentLength);
s.seekg (1, std::ios::cur); // unused
uint8_t fileType;
s.read ((char *)&fileType, 1); // file type
if (fileType != 0x00) // zip file
{
LogPrint (eLogError, "Can't handle file type ", (int)fileType);
return 0;
}
s.seekg (1, std::ios::cur); // unused
uint8_t contentType;
s.read ((char *)&contentType, 1); // content type
if (contentType != 0x03) // reseed data
{
LogPrint (eLogError, "Unexpected content type ", (int)contentType);
return 0;
}
s.seekg (12, std::ios::cur); // unused
s.seekg (versionLength, std::ios::cur); // skip version
char signerID[256];
s.read (signerID, signerIDLength); // signerID
signerID[signerIDLength] = 0;
//try to verify signature
auto it = m_SigningKeys.find (signerID);
if (it != m_SigningKeys.end ())
{
// TODO: implement all signature types
if (signatureType == SIGNING_KEY_TYPE_RSA_SHA512_4096)
{
size_t pos = s.tellg ();
size_t tbsLen = pos + contentLength;
uint8_t * tbs = new uint8_t[tbsLen];
s.seekg (0, std::ios::beg);
s.read ((char *)tbs, tbsLen);
uint8_t * signature = new uint8_t[signatureLength];
s.read ((char *)signature, signatureLength);
// RSA-raw
i2p::crypto::RSASHA5124096RawVerifier verifier(it->second);
verifier.Update (tbs, tbsLen);
if (!verifier.Verify (signature))
LogPrint (eLogWarning, "SU3 signature verification failed");
delete[] signature;
delete[] tbs;
s.seekg (pos, std::ios::beg);
}
else
LogPrint (eLogWarning, "Signature type ", signatureType, " is not supported");
}
else
LogPrint (eLogWarning, "Certificate for ", signerID, " not loaded");
// handle content
int numFiles = 0;
size_t contentPos = s.tellg ();
while (!s.eof ())
{
uint32_t signature;
s.read ((char *)&signature, 4);
signature = le32toh (signature);
if (signature == ZIP_HEADER_SIGNATURE)
{
// next local file
s.seekg (2, std::ios::cur); // version
uint16_t bitFlag;
s.read ((char *)&bitFlag, 2);
bitFlag = le16toh (bitFlag);
uint16_t compressionMethod;
s.read ((char *)&compressionMethod, 2);
compressionMethod = le16toh (compressionMethod);
s.seekg (4, std::ios::cur); // skip fields we don't care about
uint32_t crc32, compressedSize, uncompressedSize;
s.read ((char *)&crc32, 4);
crc32 = le32toh (crc32);
s.read ((char *)&compressedSize, 4);
compressedSize = le32toh (compressedSize);
s.read ((char *)&uncompressedSize, 4);
uncompressedSize = le32toh (uncompressedSize);
uint16_t fileNameLength, extraFieldLength;
s.read ((char *)&fileNameLength, 2);
fileNameLength = le16toh (fileNameLength);
s.read ((char *)&extraFieldLength, 2);
extraFieldLength = le16toh (extraFieldLength);
char localFileName[255];
s.read (localFileName, fileNameLength);
localFileName[fileNameLength] = 0;
s.seekg (extraFieldLength, std::ios::cur);
// take care about data desriptor if presented
if (bitFlag & ZIP_BIT_FLAG_DATA_DESCRIPTOR)
{
size_t pos = s.tellg ();
if (!FindZipDataDescriptor (s))
{
LogPrint (eLogError, "SU3 archive data descriptor not found");
return numFiles;
}
s.read ((char *)&crc32, 4);
crc32 = le32toh (crc32);
s.read ((char *)&compressedSize, 4);
compressedSize = le32toh (compressedSize) + 4; // ??? we must consider signature as part of compressed data
s.read ((char *)&uncompressedSize, 4);
uncompressedSize = le32toh (uncompressedSize);
// now we know compressed and uncompressed size
s.seekg (pos, std::ios::beg); // back to compressed data
}
LogPrint (eLogDebug, "Proccessing file ", localFileName, " ", compressedSize, " bytes");
if (!compressedSize)
{
LogPrint (eLogWarning, "Unexpected size 0. Skipped");
continue;
}
uint8_t * compressed = new uint8_t[compressedSize];
s.read ((char *)compressed, compressedSize);
if (compressionMethod) // we assume Deflate
{
CryptoPP::Inflator decompressor;
decompressor.Put (compressed, compressedSize);
decompressor.MessageEnd();
if (decompressor.MaxRetrievable () <= uncompressedSize)
{
uint8_t * uncompressed = new uint8_t[uncompressedSize];
decompressor.Get (uncompressed, uncompressedSize);
if (CryptoPP::CRC32().VerifyDigest ((uint8_t *)&crc32, uncompressed, uncompressedSize))
{
i2p::data::netdb.AddRouterInfo (uncompressed, uncompressedSize);
numFiles++;
}
else
LogPrint (eLogError, "CRC32 verification failed");
delete[] uncompressed;
}
else
LogPrint (eLogError, "Actual uncompressed size ", decompressor.MaxRetrievable (), " exceed ", uncompressedSize, " from header");
}
else // no compression
{
i2p::data::netdb.AddRouterInfo (compressed, compressedSize);
numFiles++;
}
delete[] compressed;
if (bitFlag & ZIP_BIT_FLAG_DATA_DESCRIPTOR)
s.seekg (12, std::ios::cur); // skip data descriptor section if presented (12 = 16 - 4)
}
else
{
if (signature != ZIP_CENTRAL_DIRECTORY_HEADER_SIGNATURE)
LogPrint (eLogWarning, "Missing zip central directory header");
break; // no more files
}
size_t end = s.tellg ();
if (end - contentPos >= contentLength)
break; // we are beyond contentLength
}
return numFiles;
}
const uint8_t ZIP_DATA_DESCRIPTOR_SIGNATURE[] = { 0x50, 0x4B, 0x07, 0x08 };
bool Reseeder::FindZipDataDescriptor (std::istream& s)
{
size_t nextInd = 0;
while (!s.eof ())
{
uint8_t nextByte;
s.read ((char *)&nextByte, 1);
if (nextByte == ZIP_DATA_DESCRIPTOR_SIGNATURE[nextInd])
{
nextInd++;
if (nextInd >= sizeof (ZIP_DATA_DESCRIPTOR_SIGNATURE))
return true;
}
else
nextInd = 0;
}
return s;
}
const char CERTIFICATE_HEADER[] = "-----BEGIN CERTIFICATE-----";
const char CERTIFICATE_FOOTER[] = "-----END CERTIFICATE-----";
void Reseeder::LoadCertificate (const std::string& filename)
{
std::ifstream s(filename, std::ifstream::binary);
if (s.is_open ())
{
s.seekg (0, std::ios::end);
size_t len = s.tellg ();
s.seekg (0, std::ios::beg);
char buf[2048];
s.read (buf, len);
std::string cert (buf, len);
// assume file in pem format
auto pos1 = cert.find (CERTIFICATE_HEADER);
auto pos2 = cert.find (CERTIFICATE_FOOTER);
if (pos1 == std::string::npos || pos2 == std::string::npos)
{
LogPrint (eLogError, "Malformed certificate file");
return;
}
pos1 += strlen (CERTIFICATE_HEADER);
pos2 -= pos1;
std::string base64 = cert.substr (pos1, pos2);
CryptoPP::ByteQueue queue;
CryptoPP::Base64Decoder decoder; // regular base64 rather than I2P
decoder.Attach (new CryptoPP::Redirector (queue));
decoder.Put ((const uint8_t *)base64.data(), base64.length());
decoder.MessageEnd ();
// extract X.509
CryptoPP::BERSequenceDecoder x509Cert (queue);
CryptoPP::BERSequenceDecoder tbsCert (x509Cert);
// version
uint32_t ver;
CryptoPP::BERGeneralDecoder context (tbsCert, CryptoPP::CONTEXT_SPECIFIC | CryptoPP::CONSTRUCTED);
CryptoPP::BERDecodeUnsigned<uint32_t>(context, ver, CryptoPP::INTEGER);
// serial
CryptoPP::Integer serial;
serial.BERDecode(tbsCert);
// signature
CryptoPP::BERSequenceDecoder signature (tbsCert);
signature.SkipAll();
// issuer
std::string name;
CryptoPP::BERSequenceDecoder issuer (tbsCert);
{
CryptoPP::BERSetDecoder c (issuer); c.SkipAll();
CryptoPP::BERSetDecoder st (issuer); st.SkipAll();
CryptoPP::BERSetDecoder l (issuer); l.SkipAll();
CryptoPP::BERSetDecoder o (issuer); o.SkipAll();
CryptoPP::BERSetDecoder ou (issuer); ou.SkipAll();
CryptoPP::BERSetDecoder cn (issuer);
{
CryptoPP::BERSequenceDecoder attributes (cn);
{
CryptoPP::BERGeneralDecoder ident(attributes, CryptoPP::OBJECT_IDENTIFIER);
ident.SkipAll ();
CryptoPP::BERDecodeTextString (attributes, name, CryptoPP::UTF8_STRING);
}
}
}
issuer.SkipAll();
// validity
CryptoPP::BERSequenceDecoder validity (tbsCert);
validity.SkipAll();
// subject
CryptoPP::BERSequenceDecoder subject (tbsCert);
subject.SkipAll();
// public key
CryptoPP::BERSequenceDecoder publicKey (tbsCert);
{
CryptoPP::BERSequenceDecoder ident (publicKey);
ident.SkipAll ();
CryptoPP::BERGeneralDecoder key (publicKey, CryptoPP::BIT_STRING);
key.Skip (1); // FIXME: probably bug in crypto++
CryptoPP::BERSequenceDecoder keyPair (key);
CryptoPP::Integer n;
n.BERDecode (keyPair);
if (name.length () > 0)
{
PublicKey value;
n.Encode (value, 512);
m_SigningKeys[name] = value;
}
else
LogPrint (eLogWarning, "Unknown issuer. Skipped");
}
publicKey.SkipAll();
tbsCert.SkipAll();
x509Cert.SkipAll();
}
else
LogPrint (eLogError, "Can't open certificate file ", filename);
}
void Reseeder::LoadCertificates ()
{
boost::filesystem::path reseedDir = i2p::util::filesystem::GetCertificatesDir() / "reseed";
if (!boost::filesystem::exists (reseedDir))
{
LogPrint (eLogWarning, "Reseed certificates not loaded. ", reseedDir, " doesn't exist");
return;
}
int numCertificates = 0;
boost::filesystem::directory_iterator end; // empty
for (boost::filesystem::directory_iterator it (reseedDir); it != end; ++it)
{
if (boost::filesystem::is_regular_file (it->status()) && it->path ().extension () == ".crt")
{
LoadCertificate (it->path ().string ());
numCertificates++;
}
}
LogPrint (eLogInfo, numCertificates, " certificates loaded");
}
}
}

View File

@ -1,45 +0,0 @@
#ifndef RESEED_H
#define RESEED_H
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "Identity.h"
namespace i2p
{
namespace data
{
class Reseeder
{
typedef Tag<512> PublicKey;
public:
Reseeder();
~Reseeder();
bool reseedNow(); // depreacted
int ReseedNowSU3 ();
void LoadCertificates ();
private:
void LoadCertificate (const std::string& filename);
int ReseedFromSU3 (const std::string& host);
int ProcessSU3File (const char * filename);
int ProcessSU3Stream (std::istream& s);
bool FindZipDataDescriptor (std::istream& s);
private:
std::map<std::string, PublicKey> m_SigningKeys;
};
}
}
#endif

View File

@ -1,211 +0,0 @@
#include <fstream>
#include <cryptopp/dh.h>
#include <cryptopp/dsa.h>
#include "CryptoConst.h"
#include "RouterContext.h"
#include "Timestamp.h"
#include "I2NPProtocol.h"
#include "util.h"
#include "version.h"
namespace i2p
{
RouterContext context;
RouterContext::RouterContext ():
m_LastUpdateTime (0), m_IsUnreachable (false), m_AcceptsTunnels (true)
{
}
void RouterContext::Init ()
{
if (!Load ())
CreateNewRouter ();
UpdateRouterInfo ();
}
void RouterContext::CreateNewRouter ()
{
m_Keys = i2p::data::CreateRandomKeys ();
SaveKeys ();
NewRouterInfo ();
}
void RouterContext::NewRouterInfo ()
{
i2p::data::RouterInfo routerInfo;
routerInfo.SetRouterIdentity (GetIdentity ());
int port = i2p::util::config::GetArg("-port", 0);
if (!port)
port = m_Rnd.GenerateWord32 (9111, 30777); // I2P network ports range
routerInfo.AddSSUAddress (i2p::util::config::GetCharArg("-host", "127.0.0.1"), port, routerInfo.GetIdentHash ());
routerInfo.AddNTCPAddress (i2p::util::config::GetCharArg("-host", "127.0.0.1"), port);
routerInfo.SetCaps (i2p::data::RouterInfo::eReachable |
i2p::data::RouterInfo::eSSUTesting | i2p::data::RouterInfo::eSSUIntroducer); // LR, BC
routerInfo.SetProperty ("coreVersion", I2P_VERSION);
routerInfo.SetProperty ("netId", "2");
routerInfo.SetProperty ("router.version", I2P_VERSION);
routerInfo.SetProperty ("stat_uptime", "90m");
routerInfo.CreateBuffer (m_Keys);
m_RouterInfo.Update (routerInfo.GetBuffer (), routerInfo.GetBufferLen ());
}
void RouterContext::UpdateRouterInfo ()
{
m_RouterInfo.CreateBuffer (m_Keys);
m_RouterInfo.SaveToFile (i2p::util::filesystem::GetFullPath (ROUTER_INFO));
m_LastUpdateTime = i2p::util::GetSecondsSinceEpoch ();
}
void RouterContext::UpdatePort (int port)
{
bool updated = false;
for (auto& address : m_RouterInfo.GetAddresses ())
{
if (address.port != port)
{
address.port = port;
updated = true;
}
}
if (updated)
UpdateRouterInfo ();
}
void RouterContext::UpdateAddress (const boost::asio::ip::address& host)
{
bool updated = false;
for (auto& address : m_RouterInfo.GetAddresses ())
{
if (address.host != host && address.IsCompatible (host))
{
address.host = host;
updated = true;
}
}
auto ts = i2p::util::GetSecondsSinceEpoch ();
if (updated || ts > m_LastUpdateTime + ROUTER_INFO_UPDATE_INTERVAL)
UpdateRouterInfo ();
}
bool RouterContext::AddIntroducer (const i2p::data::RouterInfo& routerInfo, uint32_t tag)
{
bool ret = false;
auto address = routerInfo.GetSSUAddress ();
if (address)
{
ret = m_RouterInfo.AddIntroducer (address, tag);
if (ret)
UpdateRouterInfo ();
}
return ret;
}
void RouterContext::RemoveIntroducer (const boost::asio::ip::udp::endpoint& e)
{
if (m_RouterInfo.RemoveIntroducer (e))
UpdateRouterInfo ();
}
void RouterContext::SetUnreachable ()
{
m_IsUnreachable = true;
// set caps
m_RouterInfo.SetCaps (i2p::data::RouterInfo::eUnreachable | i2p::data::RouterInfo::eSSUTesting); // LU, B
// remove NTCP address
auto& addresses = m_RouterInfo.GetAddresses ();
for (size_t i = 0; i < addresses.size (); i++)
{
if (addresses[i].transportStyle == i2p::data::RouterInfo::eTransportNTCP)
{
addresses.erase (addresses.begin () + i);
break;
}
}
// delete previous introducers
for (auto& addr : addresses)
addr.introducers.clear ();
// update
UpdateRouterInfo ();
}
void RouterContext::SetSupportsV6 (bool supportsV6)
{
if (supportsV6)
m_RouterInfo.EnableV6 ();
else
m_RouterInfo.DisableV6 ();
UpdateRouterInfo ();
}
void RouterContext::UpdateNTCPV6Address (const boost::asio::ip::address& host)
{
bool updated = false, found = false;
int port = 0;
auto& addresses = m_RouterInfo.GetAddresses ();
for (auto& addr : addresses)
{
if (addr.host.is_v6 () && addr.transportStyle == i2p::data::RouterInfo::eTransportNTCP)
{
if (addr.host != host)
{
addr.host = host;
updated = true;
}
found = true;
}
else
port = addr.port;
}
if (!found)
{
// create new address
m_RouterInfo.AddNTCPAddress (host.to_string ().c_str (), port);
auto mtu = i2p::util::net::GetMTU (host);
if (mtu)
{
LogPrint ("Our v6 MTU=", mtu);
if (mtu > 1472) mtu = 1472;
}
m_RouterInfo.AddSSUAddress (host.to_string ().c_str (), port, GetIdentHash (), mtu ? mtu : 1472); // TODO
updated = true;
}
if (updated)
UpdateRouterInfo ();
}
bool RouterContext::Load ()
{
std::ifstream fk (i2p::util::filesystem::GetFullPath (ROUTER_KEYS).c_str (), std::ifstream::binary | std::ofstream::in);
if (!fk.is_open ()) return false;
i2p::data::Keys keys;
fk.read ((char *)&keys, sizeof (keys));
m_Keys = keys;
i2p::data::RouterInfo routerInfo(i2p::util::filesystem::GetFullPath (ROUTER_INFO)); // TODO
m_RouterInfo.Update (routerInfo.GetBuffer (), routerInfo.GetBufferLen ());
m_RouterInfo.SetProperty ("coreVersion", I2P_VERSION);
m_RouterInfo.SetProperty ("router.version", I2P_VERSION);
return true;
}
void RouterContext::SaveKeys ()
{
std::ofstream fk (i2p::util::filesystem::GetFullPath (ROUTER_KEYS).c_str (), std::ofstream::binary | std::ofstream::out);
i2p::data::Keys keys;
memcpy (keys.privateKey, m_Keys.GetPrivateKey (), sizeof (keys.privateKey));
memcpy (keys.signingPrivateKey, m_Keys.GetSigningPrivateKey (), sizeof (keys.signingPrivateKey));
auto& ident = GetIdentity ().GetStandardIdentity ();
memcpy (keys.publicKey, ident.publicKey, sizeof (keys.publicKey));
memcpy (keys.signingKey, ident.signingKey, sizeof (keys.signingKey));
fk.write ((char *)&keys, sizeof (keys));
}
void RouterContext::HandleI2NPMessage (const uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from)
{
i2p::HandleI2NPMessage (CreateI2NPMessage (buf, GetI2NPMessageLength (buf), from));
}
}

View File

@ -1,77 +0,0 @@
#ifndef ROUTER_CONTEXT_H__
#define ROUTER_CONTEXT_H__
#include <inttypes.h>
#include <string>
#include <memory>
#include <boost/asio.hpp>
#include <cryptopp/dsa.h>
#include <cryptopp/osrng.h>
#include "Identity.h"
#include "RouterInfo.h"
#include "Garlic.h"
namespace i2p
{
const char ROUTER_INFO[] = "router.info";
const char ROUTER_KEYS[] = "router.keys";
const int ROUTER_INFO_UPDATE_INTERVAL = 1800; // 30 minutes
class RouterContext: public i2p::garlic::GarlicDestination
{
public:
RouterContext ();
void Init ();
i2p::data::RouterInfo& GetRouterInfo () { return m_RouterInfo; };
std::shared_ptr<const i2p::data::RouterInfo> GetSharedRouterInfo () const
{
return std::shared_ptr<const i2p::data::RouterInfo> (&m_RouterInfo,
[](const i2p::data::RouterInfo *) {});
}
CryptoPP::RandomNumberGenerator& GetRandomNumberGenerator () { return m_Rnd; };
void UpdatePort (int port); // called from Daemon
void UpdateAddress (const boost::asio::ip::address& host); // called from SSU or Daemon
bool AddIntroducer (const i2p::data::RouterInfo& routerInfo, uint32_t tag);
void RemoveIntroducer (const boost::asio::ip::udp::endpoint& e);
bool IsUnreachable () const { return m_IsUnreachable; };
void SetUnreachable ();
bool AcceptsTunnels () const { return m_AcceptsTunnels; };
void SetAcceptsTunnels (bool acceptsTunnels) { m_AcceptsTunnels = acceptsTunnels; };
bool SupportsV6 () const { return m_RouterInfo.IsV6 (); };
void SetSupportsV6 (bool supportsV6);
void UpdateNTCPV6Address (const boost::asio::ip::address& host); // called from NTCP session
// implements LocalDestination
const i2p::data::PrivateKeys& GetPrivateKeys () const { return m_Keys; };
const uint8_t * GetEncryptionPrivateKey () const { return m_Keys.GetPrivateKey (); };
const uint8_t * GetEncryptionPublicKey () const { return GetIdentity ().GetStandardIdentity ().publicKey; };
void SetLeaseSetUpdated () {};
// implements GarlicDestination
const i2p::data::LeaseSet * GetLeaseSet () { return nullptr; };
void HandleI2NPMessage (const uint8_t * buf, size_t len, i2p::tunnel::InboundTunnel * from);
private:
void CreateNewRouter ();
void NewRouterInfo ();
void UpdateRouterInfo ();
bool Load ();
void SaveKeys ();
private:
i2p::data::RouterInfo m_RouterInfo;
i2p::data::PrivateKeys m_Keys;
CryptoPP::AutoSeededRandomPool m_Rnd;
uint64_t m_LastUpdateTime;
bool m_IsUnreachable, m_AcceptsTunnels;
};
extern RouterContext context;
}
#endif

View File

@ -1,646 +0,0 @@
#include <stdio.h>
#include <string.h>
#include "I2PEndian.h"
#include <fstream>
#include <boost/lexical_cast.hpp>
#include <cryptopp/sha.h>
#include <cryptopp/dsa.h>
#include "CryptoConst.h"
#include "base64.h"
#include "Timestamp.h"
#include "Log.h"
#include "RouterInfo.h"
#include "RouterContext.h"
namespace i2p
{
namespace data
{
RouterInfo::RouterInfo (const std::string& fullPath):
m_FullPath (fullPath), m_IsUpdated (false), m_IsUnreachable (false),
m_SupportedTransports (0), m_Caps (0)
{
m_Buffer = new uint8_t[MAX_RI_BUFFER_SIZE];
ReadFromFile ();
}
RouterInfo::RouterInfo (const uint8_t * buf, int len):
m_IsUpdated (true), m_IsUnreachable (false), m_SupportedTransports (0), m_Caps (0)
{
m_Buffer = new uint8_t[MAX_RI_BUFFER_SIZE];
memcpy (m_Buffer, buf, len);
m_BufferLen = len;
ReadFromBuffer (true);
}
RouterInfo::~RouterInfo ()
{
delete m_Buffer;
}
void RouterInfo::Update (const uint8_t * buf, int len)
{
if (!m_Buffer)
m_Buffer = new uint8_t[MAX_RI_BUFFER_SIZE];
m_IsUpdated = true;
m_IsUnreachable = false;
m_SupportedTransports = 0;
m_Caps = 0;
m_Addresses.clear ();
m_Properties.clear ();
memcpy (m_Buffer, buf, len);
m_BufferLen = len;
ReadFromBuffer (true);
// don't delete buffer until save to file
}
void RouterInfo::SetRouterIdentity (const IdentityEx& identity)
{
m_RouterIdentity = identity;
m_Timestamp = i2p::util::GetMillisecondsSinceEpoch ();
}
bool RouterInfo::LoadFile ()
{
std::ifstream s(m_FullPath.c_str (), std::ifstream::binary);
if (s.is_open ())
{
s.seekg (0,std::ios::end);
m_BufferLen = s.tellg ();
if (m_BufferLen < 40)
{
LogPrint(eLogError, "File", m_FullPath, " is malformed");
return false;
}
s.seekg(0, std::ios::beg);
if (!m_Buffer)
m_Buffer = new uint8_t[MAX_RI_BUFFER_SIZE];
s.read((char *)m_Buffer, m_BufferLen);
}
else
{
LogPrint (eLogError, "Can't open file ", m_FullPath);
return false;
}
return true;
}
void RouterInfo::ReadFromFile ()
{
if (LoadFile ())
ReadFromBuffer (false);
}
void RouterInfo::ReadFromBuffer (bool verifySignature)
{
size_t identityLen = m_RouterIdentity.FromBuffer (m_Buffer, m_BufferLen);
std::stringstream str (std::string ((char *)m_Buffer + identityLen, m_BufferLen - identityLen));
ReadFromStream (str);
if (verifySignature)
{
// verify signature
int l = m_BufferLen - m_RouterIdentity.GetSignatureLen ();
if (!m_RouterIdentity.Verify ((uint8_t *)m_Buffer, l, (uint8_t *)m_Buffer + l))
{
LogPrint (eLogError, "signature verification failed");
m_IsUnreachable = true;
}
m_RouterIdentity.DropVerifier ();
}
}
void RouterInfo::ReadFromStream (std::istream& s)
{
s.read ((char *)&m_Timestamp, sizeof (m_Timestamp));
m_Timestamp = be64toh (m_Timestamp);
// read addresses
uint8_t numAddresses;
s.read ((char *)&numAddresses, sizeof (numAddresses));
bool introducers = false;
for (int i = 0; i < numAddresses; i++)
{
bool isValidAddress = true;
Address address;
s.read ((char *)&address.cost, sizeof (address.cost));
s.read ((char *)&address.date, sizeof (address.date));
char transportStyle[5];
ReadString (transportStyle, s);
if (!strcmp (transportStyle, "NTCP"))
address.transportStyle = eTransportNTCP;
else if (!strcmp (transportStyle, "SSU"))
address.transportStyle = eTransportSSU;
else
address.transportStyle = eTransportUnknown;
address.port = 0;
address.mtu = 0;
uint16_t size, r = 0;
s.read ((char *)&size, sizeof (size));
size = be16toh (size);
while (r < size)
{
char key[500], value[500];
r += ReadString (key, s);
s.seekg (1, std::ios_base::cur); r++; // =
r += ReadString (value, s);
s.seekg (1, std::ios_base::cur); r++; // ;
if (!strcmp (key, "host"))
{
boost::system::error_code ecode;
address.host = boost::asio::ip::address::from_string (value, ecode);
if (ecode)
{
// TODO: we should try to resolve address here
LogPrint (eLogWarning, "Unexpected address ", value);
isValidAddress = false;
}
else
{
// add supported protocol
if (address.host.is_v4 ())
m_SupportedTransports |= (address.transportStyle == eTransportNTCP) ? eNTCPV4 : eSSUV4;
else
m_SupportedTransports |= (address.transportStyle == eTransportNTCP) ? eNTCPV6 : eSSUV6;
}
}
else if (!strcmp (key, "port"))
address.port = boost::lexical_cast<int>(value);
else if (!strcmp (key, "mtu"))
address.mtu = boost::lexical_cast<int>(value);
else if (!strcmp (key, "key"))
Base64ToByteStream (value, strlen (value), address.key, 32);
else if (!strcmp (key, "caps"))
ExtractCaps (value);
else if (key[0] == 'i')
{
// introducers
introducers = true;
size_t l = strlen(key);
unsigned char index = key[l-1] - '0'; // TODO:
key[l-1] = 0;
if (index >= address.introducers.size ())
address.introducers.resize (index + 1);
Introducer& introducer = address.introducers.at (index);
if (!strcmp (key, "ihost"))
{
boost::system::error_code ecode;
introducer.iHost = boost::asio::ip::address::from_string (value, ecode);
}
else if (!strcmp (key, "iport"))
introducer.iPort = boost::lexical_cast<int>(value);
else if (!strcmp (key, "itag"))
introducer.iTag = boost::lexical_cast<uint32_t>(value);
else if (!strcmp (key, "ikey"))
Base64ToByteStream (value, strlen (value), introducer.iKey, 32);
}
}
if (isValidAddress)
m_Addresses.push_back(address);
}
// read peers
uint8_t numPeers;
s.read ((char *)&numPeers, sizeof (numPeers));
s.seekg (numPeers*32, std::ios_base::cur); // TODO: read peers
// read properties
uint16_t size, r = 0;
s.read ((char *)&size, sizeof (size));
size = be16toh (size);
while (r < size)
{
#ifdef _WIN32
char key[500], value[500];
// TODO: investigate why properties get read as one long string under Windows
// length should not be more than 44
#else
char key[50], value[50];
#endif
r += ReadString (key, s);
s.seekg (1, std::ios_base::cur); r++; // =
r += ReadString (value, s);
s.seekg (1, std::ios_base::cur); r++; // ;
m_Properties[key] = value;
// extract caps
if (!strcmp (key, "caps"))
ExtractCaps (value);
}
if (!m_SupportedTransports || !m_Addresses.size() || (UsesIntroducer () && !introducers))
SetUnreachable (true);
}
void RouterInfo::ExtractCaps (const char * value)
{
const char * cap = value;
while (*cap)
{
switch (*cap)
{
case CAPS_FLAG_FLOODFILL:
m_Caps |= Caps::eFloodfill;
break;
case CAPS_FLAG_HIGH_BANDWIDTH1:
case CAPS_FLAG_HIGH_BANDWIDTH2:
case CAPS_FLAG_HIGH_BANDWIDTH3:
m_Caps |= Caps::eHighBandwidth;
break;
case CAPS_FLAG_HIDDEN:
m_Caps |= Caps::eHidden;
break;
case CAPS_FLAG_REACHABLE:
m_Caps |= Caps::eReachable;
break;
case CAPS_FLAG_UNREACHABLE:
m_Caps |= Caps::eUnreachable;
break;
case CAPS_FLAG_SSU_TESTING:
m_Caps |= Caps::eSSUTesting;
break;
case CAPS_FLAG_SSU_INTRODUCER:
m_Caps |= Caps::eSSUIntroducer;
break;
default: ;
}
cap++;
}
}
void RouterInfo::UpdateCapsProperty ()
{
std::string caps;
caps += (m_Caps & eHighBandwidth) ? CAPS_FLAG_HIGH_BANDWIDTH1 : CAPS_FLAG_LOW_BANDWIDTH2; // bandwidth
if (m_Caps & eFloodfill) caps += CAPS_FLAG_FLOODFILL; // floodfill
if (m_Caps & eHidden) caps += CAPS_FLAG_HIDDEN; // hidden
if (m_Caps & eReachable) caps += CAPS_FLAG_REACHABLE; // reachable
if (m_Caps & eUnreachable) caps += CAPS_FLAG_UNREACHABLE; // unreachable
SetProperty ("caps", caps.c_str ());
}
void RouterInfo::WriteToStream (std::ostream& s)
{
uint64_t ts = htobe64 (m_Timestamp);
s.write ((char *)&ts, sizeof (ts));
// addresses
uint8_t numAddresses = m_Addresses.size ();
s.write ((char *)&numAddresses, sizeof (numAddresses));
for (auto& address : m_Addresses)
{
s.write ((char *)&address.cost, sizeof (address.cost));
s.write ((char *)&address.date, sizeof (address.date));
std::stringstream properties;
if (address.transportStyle == eTransportNTCP)
WriteString ("NTCP", s);
else if (address.transportStyle == eTransportSSU)
{
WriteString ("SSU", s);
// caps
WriteString ("caps", properties);
properties << '=';
std::string caps;
if (IsPeerTesting ()) caps += CAPS_FLAG_SSU_TESTING;
if (IsIntroducer ()) caps += CAPS_FLAG_SSU_INTRODUCER;
WriteString (caps, properties);
properties << ';';
}
else
WriteString ("", s);
WriteString ("host", properties);
properties << '=';
WriteString (address.host.to_string (), properties);
properties << ';';
if (address.transportStyle == eTransportSSU)
{
// write introducers if any
if (address.introducers.size () > 0)
{
int i = 0;
for (auto introducer: address.introducers)
{
WriteString ("ihost" + boost::lexical_cast<std::string>(i), properties);
properties << '=';
WriteString (introducer.iHost.to_string (), properties);
properties << ';';
i++;
}
i = 0;
for (auto introducer: address.introducers)
{
WriteString ("ikey" + boost::lexical_cast<std::string>(i), properties);
properties << '=';
char value[64];
size_t l = ByteStreamToBase64 (introducer.iKey, 32, value, 64);
value[l] = 0;
WriteString (value, properties);
properties << ';';
i++;
}
i = 0;
for (auto introducer: address.introducers)
{
WriteString ("iport" + boost::lexical_cast<std::string>(i), properties);
properties << '=';
WriteString (boost::lexical_cast<std::string>(introducer.iPort), properties);
properties << ';';
i++;
}
i = 0;
for (auto introducer: address.introducers)
{
WriteString ("itag" + boost::lexical_cast<std::string>(i), properties);
properties << '=';
WriteString (boost::lexical_cast<std::string>(introducer.iTag), properties);
properties << ';';
i++;
}
}
// write intro key
WriteString ("key", properties);
properties << '=';
char value[64];
size_t l = ByteStreamToBase64 (address.key, 32, value, 64);
value[l] = 0;
WriteString (value, properties);
properties << ';';
// write mtu
if (address.mtu)
{
WriteString ("mtu", properties);
properties << '=';
WriteString (boost::lexical_cast<std::string>(address.mtu), properties);
properties << ';';
}
}
WriteString ("port", properties);
properties << '=';
WriteString (boost::lexical_cast<std::string>(address.port), properties);
properties << ';';
uint16_t size = htobe16 (properties.str ().size ());
s.write ((char *)&size, sizeof (size));
s.write (properties.str ().c_str (), properties.str ().size ());
}
// peers
uint8_t numPeers = 0;
s.write ((char *)&numPeers, sizeof (numPeers));
// properties
std::stringstream properties;
for (auto& p : m_Properties)
{
WriteString (p.first, properties);
properties << '=';
WriteString (p.second, properties);
properties << ';';
}
uint16_t size = htobe16 (properties.str ().size ());
s.write ((char *)&size, sizeof (size));
s.write (properties.str ().c_str (), properties.str ().size ());
}
const uint8_t * RouterInfo::LoadBuffer ()
{
if (!m_Buffer)
{
if (LoadFile ())
LogPrint ("Buffer for ", GetIdentHashAbbreviation (), " loaded from file");
}
return m_Buffer;
}
void RouterInfo::CreateBuffer (const PrivateKeys& privateKeys)
{
m_Timestamp = i2p::util::GetMillisecondsSinceEpoch (); // refresh timstamp
std::stringstream s;
uint8_t ident[1024];
auto identLen = privateKeys.GetPublic ().ToBuffer (ident, 1024);
s.write ((char *)ident, identLen);
WriteToStream (s);
m_BufferLen = s.str ().size ();
if (!m_Buffer)
m_Buffer = new uint8_t[MAX_RI_BUFFER_SIZE];
memcpy (m_Buffer, s.str ().c_str (), m_BufferLen);
// signature
privateKeys.Sign ((uint8_t *)m_Buffer, m_BufferLen, (uint8_t *)m_Buffer + m_BufferLen);
m_BufferLen += privateKeys.GetPublic ().GetSignatureLen ();
}
void RouterInfo::SaveToFile (const std::string& fullPath)
{
m_FullPath = fullPath;
if (m_Buffer)
{
std::ofstream f (fullPath, std::ofstream::binary | std::ofstream::out);
f.write ((char *)m_Buffer, m_BufferLen);
}
else
LogPrint (eLogError, "Can't save to file");
}
size_t RouterInfo::ReadString (char * str, std::istream& s)
{
uint8_t len;
s.read ((char *)&len, 1);
s.read (str, len);
str[len] = 0;
return len+1;
}
void RouterInfo::WriteString (const std::string& str, std::ostream& s)
{
uint8_t len = str.size ();
s.write ((char *)&len, 1);
s.write (str.c_str (), len);
}
void RouterInfo::AddNTCPAddress (const char * host, int port)
{
Address addr;
addr.host = boost::asio::ip::address::from_string (host);
addr.port = port;
addr.transportStyle = eTransportNTCP;
addr.cost = 2;
addr.date = 0;
addr.mtu = 0;
m_Addresses.push_back(addr);
m_SupportedTransports |= addr.host.is_v6 () ? eNTCPV6 : eNTCPV4;
}
void RouterInfo::AddSSUAddress (const char * host, int port, const uint8_t * key, int mtu)
{
Address addr;
addr.host = boost::asio::ip::address::from_string (host);
addr.port = port;
addr.transportStyle = eTransportSSU;
addr.cost = 10; // NTCP should have priority over SSU
addr.date = 0;
addr.mtu = mtu;
memcpy (addr.key, key, 32);
m_Addresses.push_back(addr);
m_SupportedTransports |= addr.host.is_v6 () ? eNTCPV6 : eSSUV4;
m_Caps |= eSSUTesting;
m_Caps |= eSSUIntroducer;
}
bool RouterInfo::AddIntroducer (const Address * address, uint32_t tag)
{
for (auto& addr : m_Addresses)
{
if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ())
{
for (auto intro: addr.introducers)
if (intro.iTag == tag) return false; // already presented
Introducer x;
x.iHost = address->host;
x.iPort = address->port;
x.iTag = tag;
memcpy (x.iKey, address->key, 32); // TODO: replace to Tag<32>
addr.introducers.push_back (x);
return true;
}
}
return false;
}
bool RouterInfo::RemoveIntroducer (const boost::asio::ip::udp::endpoint& e)
{
for (auto& addr : m_Addresses)
{
if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ())
{
for (std::vector<Introducer>::iterator it = addr.introducers.begin (); it != addr.introducers.end (); it++)
if ( boost::asio::ip::udp::endpoint (it->iHost, it->iPort) == e)
{
addr.introducers.erase (it);
return true;
}
}
}
return false;
}
void RouterInfo::SetCaps (uint8_t caps)
{
m_Caps = caps;
UpdateCapsProperty ();
}
void RouterInfo::SetCaps (const char * caps)
{
SetProperty ("caps", caps);
m_Caps = 0;
ExtractCaps (caps);
}
void RouterInfo::SetProperty (const char * key, const char * value)
{
m_Properties[key] = value;
}
const char * RouterInfo::GetProperty (const char * key) const
{
auto it = m_Properties.find (key);
if (it != m_Properties.end ())
return it->second.c_str ();
return 0;
}
bool RouterInfo::IsFloodfill () const
{
return m_Caps & Caps::eFloodfill;
}
bool RouterInfo::IsNTCP (bool v4only) const
{
if (v4only)
return m_SupportedTransports & eNTCPV4;
else
return m_SupportedTransports & (eNTCPV4 | eNTCPV6);
}
bool RouterInfo::IsSSU (bool v4only) const
{
if (v4only)
return m_SupportedTransports & eSSUV4;
else
return m_SupportedTransports & (eSSUV4 | eSSUV6);
}
bool RouterInfo::IsV6 () const
{
return m_SupportedTransports & (eNTCPV6 | eSSUV6);
}
void RouterInfo::EnableV6 ()
{
if (!IsV6 ())
m_SupportedTransports |= eNTCPV6 | eSSUV6;
}
void RouterInfo::DisableV6 ()
{
if (IsV6 ())
{
// NTCP
m_SupportedTransports &= ~eNTCPV6;
for (size_t i = 0; i < m_Addresses.size (); i++)
{
if (m_Addresses[i].transportStyle == i2p::data::RouterInfo::eTransportNTCP &&
m_Addresses[i].host.is_v6 ())
{
m_Addresses.erase (m_Addresses.begin () + i);
break;
}
}
// SSU
m_SupportedTransports &= ~eSSUV6;
for (size_t i = 0; i < m_Addresses.size (); i++)
{
if (m_Addresses[i].transportStyle == i2p::data::RouterInfo::eTransportSSU &&
m_Addresses[i].host.is_v6 ())
{
m_Addresses.erase (m_Addresses.begin () + i);
break;
}
}
}
}
bool RouterInfo::UsesIntroducer () const
{
return m_Caps & Caps::eUnreachable; // non-reachable
}
const RouterInfo::Address * RouterInfo::GetNTCPAddress (bool v4only) const
{
return GetAddress (eTransportNTCP, v4only);
}
const RouterInfo::Address * RouterInfo::GetSSUAddress (bool v4only) const
{
return GetAddress (eTransportSSU, v4only);
}
const RouterInfo::Address * RouterInfo::GetSSUV6Address () const
{
return GetAddress (eTransportSSU, false, true);
}
const RouterInfo::Address * RouterInfo::GetAddress (TransportStyle s, bool v4only, bool v6only) const
{
for (auto& address : m_Addresses)
{
if (address.transportStyle == s)
{
if ((!v4only || address.host.is_v4 ()) && (!v6only || address.host.is_v6 ()))
return &address;
}
}
return nullptr;
}
}
}

View File

@ -1,174 +0,0 @@
#ifndef ROUTER_INFO_H__
#define ROUTER_INFO_H__
#include <inttypes.h>
#include <string>
#include <map>
#include <vector>
#include <iostream>
#include <boost/asio.hpp>
#include "Identity.h"
namespace i2p
{
namespace data
{
const char CAPS_FLAG_FLOODFILL = 'f';
const char CAPS_FLAG_HIDDEN = 'H';
const char CAPS_FLAG_REACHABLE = 'R';
const char CAPS_FLAG_UNREACHABLE = 'U';
const char CAPS_FLAG_LOW_BANDWIDTH1 = 'K';
const char CAPS_FLAG_LOW_BANDWIDTH2 = 'L';
const char CAPS_FLAG_HIGH_BANDWIDTH1 = 'M';
const char CAPS_FLAG_HIGH_BANDWIDTH2 = 'N';
const char CAPS_FLAG_HIGH_BANDWIDTH3 = 'O';
const char CAPS_FLAG_SSU_TESTING = 'B';
const char CAPS_FLAG_SSU_INTRODUCER = 'C';
const int MAX_RI_BUFFER_SIZE = 2048;
class RouterInfo: public RoutingDestination
{
public:
enum SupportedTranports
{
eNTCPV4 = 0x01,
eNTCPV6 = 0x02,
eSSUV4 = 0x04,
eSSUV6 = 0x08
};
enum Caps
{
eFloodfill = 0x01,
eHighBandwidth = 0x02,
eReachable = 0x04,
eSSUTesting = 0x08,
eSSUIntroducer = 0x10,
eHidden = 0x20,
eUnreachable = 0x40
};
enum TransportStyle
{
eTransportUnknown = 0,
eTransportNTCP,
eTransportSSU
};
struct Introducer
{
boost::asio::ip::address iHost;
int iPort;
Tag<32> iKey;
uint32_t iTag;
};
struct Address
{
TransportStyle transportStyle;
boost::asio::ip::address host;
int port, mtu;
uint64_t date;
uint8_t cost;
// SSU only
Tag<32> key; // intro key for SSU
std::vector<Introducer> introducers;
bool IsCompatible (const boost::asio::ip::address& other) const
{
return (host.is_v4 () && other.is_v4 ()) ||
(host.is_v6 () && other.is_v6 ());
}
};
RouterInfo (const std::string& fullPath);
RouterInfo (): m_Buffer (nullptr) { };
RouterInfo (const RouterInfo& ) = default;
RouterInfo& operator=(const RouterInfo& ) = default;
RouterInfo (const uint8_t * buf, int len);
~RouterInfo ();
const IdentityEx& GetRouterIdentity () const { return m_RouterIdentity; };
void SetRouterIdentity (const IdentityEx& identity);
std::string GetIdentHashBase64 () const { return GetIdentHash ().ToBase64 (); };
std::string GetIdentHashAbbreviation () const { return GetIdentHash ().ToBase64 ().substr (0, 4); };
uint64_t GetTimestamp () const { return m_Timestamp; };
std::vector<Address>& GetAddresses () { return m_Addresses; };
const Address * GetNTCPAddress (bool v4only = true) const;
const Address * GetSSUAddress (bool v4only = true) const;
const Address * GetSSUV6Address () const;
void AddNTCPAddress (const char * host, int port);
void AddSSUAddress (const char * host, int port, const uint8_t * key, int mtu = 0);
bool AddIntroducer (const Address * address, uint32_t tag);
bool RemoveIntroducer (const boost::asio::ip::udp::endpoint& e);
void SetProperty (const char * key, const char * value);
const char * GetProperty (const char * key) const;
bool IsFloodfill () const;
bool IsNTCP (bool v4only = true) const;
bool IsSSU (bool v4only = true) const;
bool IsV6 () const;
void EnableV6 ();
void DisableV6 ();
bool IsCompatible (const RouterInfo& other) const { return m_SupportedTransports & other.m_SupportedTransports; };
bool UsesIntroducer () const;
bool IsIntroducer () const { return m_Caps & eSSUIntroducer; };
bool IsPeerTesting () const { return m_Caps & eSSUTesting; };
bool IsHidden () const { return m_Caps & eHidden; };
uint8_t GetCaps () const { return m_Caps; };
void SetCaps (uint8_t caps);
void SetCaps (const char * caps);
void SetUnreachable (bool unreachable) { m_IsUnreachable = unreachable; };
bool IsUnreachable () const { return m_IsUnreachable; };
const uint8_t * GetBuffer () const { return m_Buffer; };
const uint8_t * LoadBuffer (); // load if necessary
int GetBufferLen () const { return m_BufferLen; };
void CreateBuffer (const PrivateKeys& privateKeys);
bool IsUpdated () const { return m_IsUpdated; };
void SetUpdated (bool updated) { m_IsUpdated = updated; };
void SaveToFile (const std::string& fullPath);
void Update (const uint8_t * buf, int len);
void DeleteBuffer () { delete m_Buffer; m_Buffer = nullptr; };
// implements RoutingDestination
const IdentHash& GetIdentHash () const { return m_RouterIdentity.GetIdentHash (); };
const uint8_t * GetEncryptionPublicKey () const { return m_RouterIdentity.GetStandardIdentity ().publicKey; };
bool IsDestination () const { return false; };
private:
bool LoadFile ();
void ReadFromFile ();
void ReadFromStream (std::istream& s);
void ReadFromBuffer (bool verifySignature);
void WriteToStream (std::ostream& s);
size_t ReadString (char * str, std::istream& s);
void WriteString (const std::string& str, std::ostream& s);
void ExtractCaps (const char * value);
const Address * GetAddress (TransportStyle s, bool v4only, bool v6only = false) const;
void UpdateCapsProperty ();
private:
std::string m_FullPath;
IdentityEx m_RouterIdentity;
uint8_t * m_Buffer;
int m_BufferLen;
uint64_t m_Timestamp;
std::vector<Address> m_Addresses;
std::map<std::string, std::string> m_Properties;
bool m_IsUpdated, m_IsUnreachable;
uint8_t m_SupportedTransports, m_Caps;
};
}
}
#endif

753
SAM.cpp
View File

@ -1,753 +0,0 @@
#include <string.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <stdlib.h>
#endif
#include <boost/lexical_cast.hpp>
#include "base64.h"
#include "Identity.h"
#include "Log.h"
#include "NetDb.h"
#include "Destination.h"
#include "ClientContext.h"
#include "SAM.h"
namespace i2p
{
namespace client
{
SAMSocket::SAMSocket (SAMBridge& owner):
m_Owner (owner), m_Socket (m_Owner.GetService ()), m_Timer (m_Owner.GetService ()),
m_SocketType (eSAMSocketTypeUnknown), m_IsSilent (false), m_Stream (nullptr),
m_Session (nullptr)
{
}
SAMSocket::~SAMSocket ()
{
Terminate ();
}
void SAMSocket::CloseStream ()
{
if (m_Stream)
{
m_Stream->Close ();
m_Stream.reset ();
}
}
void SAMSocket::Terminate ()
{
CloseStream ();
switch (m_SocketType)
{
case eSAMSocketTypeSession:
m_Owner.CloseSession (m_ID);
break;
case eSAMSocketTypeStream:
{
if (m_Session)
m_Session->sockets.remove (shared_from_this ());
break;
}
case eSAMSocketTypeAcceptor:
{
if (m_Session)
{
m_Session->sockets.remove (shared_from_this ());
m_Session->localDestination->StopAcceptingStreams ();
}
break;
}
default:
;
}
m_SocketType = eSAMSocketTypeTerminated;
m_Socket.close ();
}
void SAMSocket::ReceiveHandshake ()
{
m_Socket.async_read_some (boost::asio::buffer(m_Buffer, SAM_SOCKET_BUFFER_SIZE),
std::bind(&SAMSocket::HandleHandshakeReceived, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
void SAMSocket::HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("SAM handshake read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
m_Buffer[bytes_transferred] = 0;
LogPrint ("SAM handshake ", m_Buffer);
char * separator = strchr (m_Buffer, ' ');
if (separator)
{
separator = strchr (separator + 1, ' ');
if (separator)
*separator = 0;
}
if (!strcmp (m_Buffer, SAM_HANDSHAKE))
{
std::string version("3.0");
// try to find MIN and MAX, 3.0 if not found
if (separator)
{
separator++;
std::map<std::string, std::string> params;
ExtractParams (separator, bytes_transferred - (separator - m_Buffer), params);
auto it = params.find (SAM_PARAM_MAX);
// TODO: check MIN as well
if (it != params.end ())
version = it->second;
}
if (version[0] == '3') // we support v3 (3.0 and 3.1) only
{
#ifdef _MSC_VER
size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ());
#else
size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ());
#endif
boost::asio::async_write (m_Socket, boost::asio::buffer (m_Buffer, l), boost::asio::transfer_all (),
std::bind(&SAMSocket::HandleHandshakeReplySent, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
else
SendMessageReply (SAM_HANDSHAKE_I2P_ERROR, strlen (SAM_HANDSHAKE_I2P_ERROR), true);
}
else
{
LogPrint ("SAM handshake mismatch");
Terminate ();
}
}
}
void SAMSocket::HandleHandshakeReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("SAM handshake reply send error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
m_Socket.async_read_some (boost::asio::buffer(m_Buffer, SAM_SOCKET_BUFFER_SIZE),
std::bind(&SAMSocket::HandleMessage, shared_from_this (),
std::placeholders::_1, std::placeholders::_2));
}
}
void SAMSocket::SendMessageReply (const char * msg, size_t len, bool close)
{
if (!m_IsSilent || m_SocketType == eSAMSocketTypeAcceptor)
boost::asio::async_write (m_Socket, boost::asio::buffer (msg, len), boost::asio::transfer_all (),
std::bind(&SAMSocket::HandleMessageReplySent, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, close));
else
{
if (close)
Terminate ();
else
Receive ();
}
}
void SAMSocket::HandleMessageReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred, bool close)
{
if (ecode)
{
LogPrint ("SAM reply send error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
if (close)
Terminate ();
else
Receive ();
}
}
void SAMSocket::HandleMessage (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("SAM read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
m_Buffer[bytes_transferred] = 0;
char * eol = strchr (m_Buffer, '\n');
if (eol)
{
*eol = 0;
char * separator = strchr (m_Buffer, ' ');
if (separator)
{
separator = strchr (separator + 1, ' ');
if (separator)
*separator = 0;
else
separator = eol;
if (!strcmp (m_Buffer, SAM_SESSION_CREATE))
ProcessSessionCreate (separator + 1, bytes_transferred - (separator - m_Buffer) - 1);
else if (!strcmp (m_Buffer, SAM_STREAM_CONNECT))
ProcessStreamConnect (separator + 1, bytes_transferred - (separator - m_Buffer) - 1);
else if (!strcmp (m_Buffer, SAM_STREAM_ACCEPT))
ProcessStreamAccept (separator + 1, bytes_transferred - (separator - m_Buffer) - 1);
else if (!strcmp (m_Buffer, SAM_DEST_GENERATE))
ProcessDestGenerate ();
else if (!strcmp (m_Buffer, SAM_NAMING_LOOKUP))
ProcessNamingLookup (separator + 1, bytes_transferred - (separator - m_Buffer) - 1);
else
{
LogPrint ("SAM unexpected message ", m_Buffer);
Terminate ();
}
}
else
{
LogPrint ("SAM malformed message ", m_Buffer);
Terminate ();
}
}
else
{
LogPrint ("SAM malformed message ", m_Buffer);
Terminate ();
}
}
}
void SAMSocket::ProcessSessionCreate (char * buf, size_t len)
{
LogPrint ("SAM session create: ", buf);
std::map<std::string, std::string> params;
ExtractParams (buf, len, params);
std::string& style = params[SAM_PARAM_STYLE];
std::string& id = params[SAM_PARAM_ID];
std::string& destination = params[SAM_PARAM_DESTINATION];
m_ID = id;
if (m_Owner.FindSession (id))
{
// session exists
SendMessageReply (SAM_SESSION_CREATE_DUPLICATED_ID, strlen(SAM_SESSION_CREATE_DUPLICATED_ID), true);
return;
}
// create destination
m_Session = m_Owner.CreateSession (id, destination == SAM_VALUE_TRANSIENT ? "" : destination, &params);
if (m_Session)
{
m_SocketType = eSAMSocketTypeSession;
if (m_Session->localDestination->IsReady ())
{
if (style == SAM_VALUE_DATAGRAM)
{
auto dest = m_Session->localDestination->CreateDatagramDestination ();
dest->SetReceiver (std::bind (&SAMSocket::HandleI2PDatagramReceive, shared_from_this (),
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
}
SendSessionCreateReplyOk ();
}
else
{
m_Timer.expires_from_now (boost::posix_time::seconds(SAM_SESSION_READINESS_CHECK_INTERVAL));
m_Timer.async_wait (std::bind (&SAMSocket::HandleSessionReadinessCheckTimer,
shared_from_this (), std::placeholders::_1));
}
}
else
SendMessageReply (SAM_SESSION_CREATE_DUPLICATED_DEST, strlen(SAM_SESSION_CREATE_DUPLICATED_DEST), true);
}
void SAMSocket::HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
if (m_Session->localDestination->IsReady ())
SendSessionCreateReplyOk ();
else
{
m_Timer.expires_from_now (boost::posix_time::seconds(SAM_SESSION_READINESS_CHECK_INTERVAL));
m_Timer.async_wait (std::bind (&SAMSocket::HandleSessionReadinessCheckTimer,
shared_from_this (), std::placeholders::_1));
}
}
}
void SAMSocket::SendSessionCreateReplyOk ()
{
uint8_t buf[1024];
char priv[1024];
size_t l = m_Session->localDestination->GetPrivateKeys ().ToBuffer (buf, 1024);
size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, priv, 1024);
priv[l1] = 0;
#ifdef _MSC_VER
size_t l2 = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv);
#else
size_t l2 = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv);
#endif
SendMessageReply (m_Buffer, l2, false);
}
void SAMSocket::ProcessStreamConnect (char * buf, size_t len)
{
LogPrint ("SAM stream connect: ", buf);
std::map<std::string, std::string> params;
ExtractParams (buf, len, params);
std::string& id = params[SAM_PARAM_ID];
std::string& destination = params[SAM_PARAM_DESTINATION];
std::string& silent = params[SAM_PARAM_SILENT];
if (silent == SAM_VALUE_TRUE) m_IsSilent = true;
m_ID = id;
m_Session = m_Owner.FindSession (id);
if (m_Session)
{
i2p::data::IdentityEx dest;
dest.FromBase64 (destination);
context.GetAddressBook ().InsertAddress (dest);
auto leaseSet = i2p::data::netdb.FindLeaseSet (dest.GetIdentHash ());
if (leaseSet)
Connect (*leaseSet);
else
{
i2p::data::netdb.RequestDestination (dest.GetIdentHash (), true, m_Session->localDestination->GetTunnelPool ());
m_Timer.expires_from_now (boost::posix_time::seconds(SAM_CONNECT_TIMEOUT));
m_Timer.async_wait (std::bind (&SAMSocket::HandleStreamDestinationRequestTimer,
shared_from_this (), std::placeholders::_1, dest.GetIdentHash ()));
}
}
else
SendMessageReply (SAM_STREAM_STATUS_INVALID_ID, strlen(SAM_STREAM_STATUS_INVALID_ID), true);
}
void SAMSocket::Connect (const i2p::data::LeaseSet& remote)
{
m_SocketType = eSAMSocketTypeStream;
m_Session->sockets.push_back (shared_from_this ());
m_Stream = m_Session->localDestination->CreateStream (remote);
m_Stream->Send ((uint8_t *)m_Buffer, 0); // connect
I2PReceive ();
SendMessageReply (SAM_STREAM_STATUS_OK, strlen(SAM_STREAM_STATUS_OK), false);
}
void SAMSocket::HandleStreamDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident)
{
if (!ecode) // timeout expired
{
auto leaseSet = m_Session->localDestination->FindLeaseSet (ident);
if (leaseSet)
Connect (*leaseSet);
else
{
LogPrint ("SAM destination to connect not found");
SendMessageReply (SAM_STREAM_STATUS_CANT_REACH_PEER, strlen(SAM_STREAM_STATUS_CANT_REACH_PEER), true);
}
}
}
void SAMSocket::ProcessStreamAccept (char * buf, size_t len)
{
LogPrint ("SAM stream accept: ", buf);
std::map<std::string, std::string> params;
ExtractParams (buf, len, params);
std::string& id = params[SAM_PARAM_ID];
std::string& silent = params[SAM_PARAM_SILENT];
if (silent == SAM_VALUE_TRUE) m_IsSilent = true;
m_ID = id;
m_Session = m_Owner.FindSession (id);
if (m_Session)
{
if (!m_Session->localDestination->IsAcceptingStreams ())
{
m_SocketType = eSAMSocketTypeAcceptor;
m_Session->sockets.push_back (shared_from_this ());
m_Session->localDestination->AcceptStreams (std::bind (&SAMSocket::HandleI2PAccept, shared_from_this (), std::placeholders::_1));
SendMessageReply (SAM_STREAM_STATUS_OK, strlen(SAM_STREAM_STATUS_OK), false);
}
else
SendMessageReply (SAM_STREAM_STATUS_I2P_ERROR, strlen(SAM_STREAM_STATUS_I2P_ERROR), true);
}
else
SendMessageReply (SAM_STREAM_STATUS_INVALID_ID, strlen(SAM_STREAM_STATUS_INVALID_ID), true);
}
void SAMSocket::ProcessDestGenerate ()
{
LogPrint ("SAM dest generate");
auto localDestination = i2p::client::context.CreateNewLocalDestination ();
if (localDestination)
{
auto priv = localDestination->GetPrivateKeys ().ToBase64 ();
auto pub = localDestination->GetIdentity ().ToBase64 ();
#ifdef _MSC_VER
size_t len = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_DEST_REPLY, pub.c_str (), priv.c_str ());
#else
size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_DEST_REPLY, pub.c_str (), priv.c_str ());
#endif
SendMessageReply (m_Buffer, len, true);
}
else
SendMessageReply (SAM_DEST_REPLY_I2P_ERROR, strlen(SAM_DEST_REPLY_I2P_ERROR), true);
}
void SAMSocket::ProcessNamingLookup (char * buf, size_t len)
{
LogPrint ("SAM naming lookup: ", buf);
std::map<std::string, std::string> params;
ExtractParams (buf, len, params);
std::string& name = params[SAM_PARAM_NAME];
i2p::data::IdentHash ident;
i2p::data::IdentityEx identity;
if (name == "ME")
SendNamingLookupReply (nullptr);
else if (context.GetAddressBook ().GetAddress (name, identity))
SendNamingLookupReply (identity);
else
{
#ifdef _MSC_VER
size_t len = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str());
#else
size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str());
#endif
SendMessageReply (m_Buffer, len, false);
}
}
void SAMSocket::SendNamingLookupReply (const i2p::data::LeaseSet * leaseSet)
{
const i2p::data::IdentityEx& identity = leaseSet ? leaseSet->GetIdentity () : m_Session->localDestination->GetIdentity ();
if (leaseSet)
// we found LeaseSet for our address, store it to addressbook
context.GetAddressBook ().InsertAddress (identity);
SendNamingLookupReply (identity);
}
void SAMSocket::SendNamingLookupReply (const i2p::data::IdentityEx& identity)
{
auto base64 = identity.ToBase64 ();
#ifdef _MSC_VER
size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY, base64.c_str ());
#else
size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY, base64.c_str ());
#endif
SendMessageReply (m_Buffer, l, false);
}
void SAMSocket::ExtractParams (char * buf, size_t len, std::map<std::string, std::string>& params)
{
char * separator;
do
{
separator = strchr (buf, ' ');
if (separator) *separator = 0;
char * value = strchr (buf, '=');
if (value)
{
*value = 0;
value++;
params[buf] = value;
}
buf = separator + 1;
}
while (separator);
}
void SAMSocket::Receive ()
{
m_Socket.async_read_some (boost::asio::buffer(m_Buffer, SAM_SOCKET_BUFFER_SIZE),
std::bind((m_SocketType == eSAMSocketTypeSession) ? &SAMSocket::HandleMessage : &SAMSocket::HandleReceived,
shared_from_this (), std::placeholders::_1, std::placeholders::_2));
}
void SAMSocket::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("SAM read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
if (m_Stream)
m_Stream->Send ((uint8_t *)m_Buffer, bytes_transferred);
Receive ();
}
}
void SAMSocket::I2PReceive ()
{
if (m_Stream)
m_Stream->AsyncReceive (boost::asio::buffer (m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE),
std::bind (&SAMSocket::HandleI2PReceive, shared_from_this (),
std::placeholders::_1, std::placeholders::_2),
SAM_SOCKET_CONNECTION_MAX_IDLE);
}
void SAMSocket::HandleI2PReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (ecode)
{
LogPrint ("SAM stream read error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
{
boost::asio::async_write (m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred),
std::bind (&SAMSocket::HandleWriteI2PData, shared_from_this (), std::placeholders::_1));
}
}
void SAMSocket::HandleWriteI2PData (const boost::system::error_code& ecode)
{
if (ecode)
{
LogPrint ("SAM socket write error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Terminate ();
}
else
I2PReceive ();
}
void SAMSocket::HandleI2PAccept (std::shared_ptr<i2p::stream::Stream> stream)
{
if (stream)
{
LogPrint ("SAM incoming I2P connection for session ", m_ID);
m_Stream = stream;
context.GetAddressBook ().InsertAddress (stream->GetRemoteIdentity ());
auto session = m_Owner.FindSession (m_ID);
if (session)
session->localDestination->StopAcceptingStreams ();
if (!m_IsSilent)
{
// send remote peer address
uint8_t ident[1024];
size_t l = stream->GetRemoteIdentity ().ToBuffer (ident, 1024);
size_t l1 = i2p::data::ByteStreamToBase64 (ident, l, m_Buffer, SAM_SOCKET_BUFFER_SIZE);
m_Buffer[l1] = '\n';
SendMessageReply (m_Buffer, l1 + 1, false);
}
I2PReceive ();
}
}
void SAMSocket::HandleI2PDatagramReceive (const i2p::data::IdentityEx& ident, const uint8_t * buf, size_t len)
{
auto base64 = ident.ToBase64 ();
#ifdef _MSC_VER
size_t l = sprintf_s ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_DATAGRAM_RECEIVED, base64.c_str (), len);
#else
size_t l = snprintf ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_DATAGRAM_RECEIVED, base64.c_str (), len);
#endif
if (len < SAM_SOCKET_BUFFER_SIZE - l)
{
memcpy (m_StreamBuffer + l, buf, len);
boost::asio::async_write (m_Socket, boost::asio::buffer (m_StreamBuffer, len + l),
std::bind (&SAMSocket::HandleWriteI2PData, shared_from_this (), std::placeholders::_1));
}
else
LogPrint (eLogWarning, "Datagram size ", len," exceeds buffer");
}
SAMBridge::SAMBridge (int port):
m_IsRunning (false), m_Thread (nullptr),
m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)),
m_DatagramEndpoint (boost::asio::ip::udp::v4 (), port-1), m_DatagramSocket (m_Service, m_DatagramEndpoint)
{
}
SAMBridge::~SAMBridge ()
{
Stop ();
}
void SAMBridge::Start ()
{
Accept ();
ReceiveDatagram ();
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&SAMBridge::Run, this));
}
void SAMBridge::Stop ()
{
m_IsRunning = false;
m_Service.stop ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = nullptr;
}
}
void SAMBridge::Run ()
{
while (m_IsRunning)
{
try
{
m_Service.run ();
}
catch (std::exception& ex)
{
LogPrint ("SAM: ", ex.what ());
}
}
}
void SAMBridge::Accept ()
{
auto newSocket = std::make_shared<SAMSocket> (*this);
m_Acceptor.async_accept (newSocket->GetSocket (), std::bind (&SAMBridge::HandleAccept, this,
std::placeholders::_1, newSocket));
}
void SAMBridge::HandleAccept(const boost::system::error_code& ecode, std::shared_ptr<SAMSocket> socket)
{
if (!ecode)
{
LogPrint ("New SAM connection from ", socket->GetSocket ().remote_endpoint ());
socket->ReceiveHandshake ();
}
else
LogPrint ("SAM accept error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
Accept ();
}
SAMSession * SAMBridge::CreateSession (const std::string& id, const std::string& destination,
const std::map<std::string, std::string> * params)
{
ClientDestination * localDestination = nullptr;
if (destination != "")
{
i2p::data::PrivateKeys keys;
keys.FromBase64 (destination);
localDestination = i2p::client::context.CreateNewLocalDestination (keys, true, params);
}
else // transient
{
// extract signature type
i2p::data::SigningKeyType signatureType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1;
if (params)
{
auto it = params->find (SAM_PARAM_SIGNATURE_TYPE);
if (it != params->end ())
// TODO: extract string values
signatureType = boost::lexical_cast<int> (it->second);
}
localDestination = i2p::client::context.CreateNewLocalDestination (false, signatureType, params);
}
if (localDestination)
{
SAMSession session;
session.localDestination = localDestination;
std::unique_lock<std::mutex> l(m_SessionsMutex);
auto ret = m_Sessions.insert (std::pair<std::string, SAMSession>(id, session));
if (!ret.second)
LogPrint ("Session ", id, " already exists");
return &(ret.first->second);
}
return nullptr;
}
void SAMBridge::CloseSession (const std::string& id)
{
std::unique_lock<std::mutex> l(m_SessionsMutex);
auto it = m_Sessions.find (id);
if (it != m_Sessions.end ())
{
for (auto it1: it->second.sockets)
it1->CloseStream ();
it->second.sockets.clear ();
i2p::client::context.DeleteLocalDestination (it->second.localDestination);
m_Sessions.erase (it);
}
}
SAMSession * SAMBridge::FindSession (const std::string& id)
{
std::unique_lock<std::mutex> l(m_SessionsMutex);
auto it = m_Sessions.find (id);
if (it != m_Sessions.end ())
return &it->second;
return nullptr;
}
void SAMBridge::ReceiveDatagram ()
{
m_DatagramSocket.async_receive_from (
boost::asio::buffer (m_DatagramReceiveBuffer, i2p::datagram::MAX_DATAGRAM_SIZE),
m_SenderEndpoint,
std::bind (&SAMBridge::HandleReceivedDatagram, this, std::placeholders::_1, std::placeholders::_2));
}
void SAMBridge::HandleReceivedDatagram (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (!ecode)
{
m_DatagramReceiveBuffer[bytes_transferred] = 0;
char * eol = strchr ((char *)m_DatagramReceiveBuffer, '\n');
*eol = 0; eol++;
size_t payloadLen = bytes_transferred - ((uint8_t *)eol - m_DatagramReceiveBuffer);
LogPrint ("SAM datagram received ", m_DatagramReceiveBuffer," size=", payloadLen);
char * sessionID = strchr ((char *)m_DatagramReceiveBuffer, ' ');
if (sessionID)
{
sessionID++;
char * destination = strchr (sessionID, ' ');
if (destination)
{
*destination = 0; destination++;
auto session = FindSession (sessionID);
if (session)
{
i2p::data::IdentityEx dest;
dest.FromBase64 (destination);
auto leaseSet = i2p::data::netdb.FindLeaseSet (dest.GetIdentHash ());
if (leaseSet)
session->localDestination->GetDatagramDestination ()->
SendDatagramTo ((uint8_t *)eol, payloadLen, *leaseSet);
else
{
LogPrint ("SAM datagram destination not found");
i2p::data::netdb.RequestDestination (dest.GetIdentHash (), true,
session->localDestination->GetTunnelPool ());
}
}
else
LogPrint ("Session ", sessionID, " not found");
}
else
LogPrint ("Missing destination key");
}
else
LogPrint ("Missing sessionID");
ReceiveDatagram ();
}
else
LogPrint ("SAM datagram receive error: ", ecode.message ());
}
}
}

184
SAM.h
View File

@ -1,184 +0,0 @@
#ifndef SAM_H__
#define SAM_H__
#include <inttypes.h>
#include <string>
#include <map>
#include <list>
#include <thread>
#include <mutex>
#include <memory>
#include <boost/asio.hpp>
#include "Identity.h"
#include "LeaseSet.h"
#include "Streaming.h"
#include "Destination.h"
namespace i2p
{
namespace client
{
const size_t SAM_SOCKET_BUFFER_SIZE = 4096;
const int SAM_SOCKET_CONNECTION_MAX_IDLE = 3600; // in seconds
const int SAM_CONNECT_TIMEOUT = 5; // in seconds
const int SAM_NAMING_LOOKUP_TIMEOUT = 5; // in seconds
const int SAM_SESSION_READINESS_CHECK_INTERVAL = 20; // in seconds
const char SAM_HANDSHAKE[] = "HELLO VERSION";
const char SAM_HANDSHAKE_REPLY[] = "HELLO REPLY RESULT=OK VERSION=%s\n";
const char SAM_HANDSHAKE_I2P_ERROR[] = "HELLO REPLY RESULT=I2P_ERROR\n";
const char SAM_SESSION_CREATE[] = "SESSION CREATE";
const char SAM_SESSION_CREATE_REPLY_OK[] = "SESSION STATUS RESULT=OK DESTINATION=%s\n";
const char SAM_SESSION_CREATE_DUPLICATED_ID[] = "SESSION STATUS RESULT=DUPLICATED_ID\n";
const char SAM_SESSION_CREATE_DUPLICATED_DEST[] = "SESSION STATUS RESULT=DUPLICATED_DEST\n";
const char SAM_STREAM_CONNECT[] = "STREAM CONNECT";
const char SAM_STREAM_STATUS_OK[] = "STREAM STATUS RESULT=OK\n";
const char SAM_STREAM_STATUS_INVALID_ID[] = "STREAM STATUS RESULT=INVALID_ID\n";
const char SAM_STREAM_STATUS_CANT_REACH_PEER[] = "STREAM STATUS RESULT=CANT_REACH_PEER\n";
const char SAM_STREAM_STATUS_I2P_ERROR[] = "STREAM STATUS RESULT=I2P_ERROR\n";
const char SAM_STREAM_ACCEPT[] = "STREAM ACCEPT";
const char SAM_DEST_GENERATE[] = "DEST GENERATE";
const char SAM_DEST_REPLY[] = "DEST REPLY PUB=%s PRIV=%s\n";
const char SAM_DEST_REPLY_I2P_ERROR[] = "DEST REPLY RESULT=I2P_ERROR\n";
const char SAM_NAMING_LOOKUP[] = "NAMING LOOKUP";
const char SAM_NAMING_REPLY[] = "NAMING REPLY RESULT=OK NAME=ME VALUE=%s\n";
const char SAM_DATAGRAM_RECEIVED[] = "DATAGRAM_RECEIVED DESTINATION=%s SIZE=%lu\n";
const char SAM_NAMING_REPLY_INVALID_KEY[] = "NAMING REPLY RESULT=INVALID_KEY NAME=%s\n";
const char SAM_NAMING_REPLY_KEY_NOT_FOUND[] = "NAMING REPLY RESULT=INVALID_KEY_NOT_FOUND NAME=%s\n";
const char SAM_PARAM_MIN[] = "MIN";
const char SAM_PARAM_MAX[] = "MAX";
const char SAM_PARAM_STYLE[] = "STYLE";
const char SAM_PARAM_ID[] = "ID";
const char SAM_PARAM_SILENT[] = "SILENT";
const char SAM_PARAM_DESTINATION[] = "DESTINATION";
const char SAM_PARAM_NAME[] = "NAME";
const char SAM_PARAM_SIGNATURE_TYPE[] = "SIGNATURE_TYPE";
const char SAM_VALUE_TRANSIENT[] = "TRANSIENT";
const char SAM_VALUE_STREAM[] = "STREAM";
const char SAM_VALUE_DATAGRAM[] = "DATAGRAM";
const char SAM_VALUE_RAW[] = "RAW";
const char SAM_VALUE_TRUE[] = "true";
const char SAM_VALUE_FALSE[] = "false";
enum SAMSocketType
{
eSAMSocketTypeUnknown,
eSAMSocketTypeSession,
eSAMSocketTypeStream,
eSAMSocketTypeAcceptor,
eSAMSocketTypeTerminated
};
class SAMBridge;
class SAMSession;
class SAMSocket: public std::enable_shared_from_this<SAMSocket>
{
public:
SAMSocket (SAMBridge& owner);
~SAMSocket ();
void CloseStream (); // TODO: implement it better
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
void ReceiveHandshake ();
void SetSocketType (SAMSocketType socketType) { m_SocketType = socketType; };
private:
void Terminate ();
void HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleHandshakeReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleMessage (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void SendMessageReply (const char * msg, size_t len, bool close);
void HandleMessageReplySent (const boost::system::error_code& ecode, std::size_t bytes_transferred, bool close);
void Receive ();
void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void I2PReceive ();
void HandleI2PReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleI2PAccept (std::shared_ptr<i2p::stream::Stream> stream);
void HandleWriteI2PData (const boost::system::error_code& ecode);
void HandleI2PDatagramReceive (const i2p::data::IdentityEx& ident, const uint8_t * buf, size_t len);
void ProcessSessionCreate (char * buf, size_t len);
void ProcessStreamConnect (char * buf, size_t len);
void ProcessStreamAccept (char * buf, size_t len);
void ProcessDestGenerate ();
void ProcessNamingLookup (char * buf, size_t len);
void ExtractParams (char * buf, size_t len, std::map<std::string, std::string>& params);
void Connect (const i2p::data::LeaseSet& remote);
void HandleStreamDestinationRequestTimer (const boost::system::error_code& ecode, i2p::data::IdentHash ident);
void SendNamingLookupReply (const i2p::data::LeaseSet * leaseSet);
void SendNamingLookupReply (const i2p::data::IdentityEx& identity);
void HandleSessionReadinessCheckTimer (const boost::system::error_code& ecode);
void SendSessionCreateReplyOk ();
private:
SAMBridge& m_Owner;
boost::asio::ip::tcp::socket m_Socket;
boost::asio::deadline_timer m_Timer;
char m_Buffer[SAM_SOCKET_BUFFER_SIZE + 1];
uint8_t m_StreamBuffer[SAM_SOCKET_BUFFER_SIZE];
SAMSocketType m_SocketType;
std::string m_ID; // nickname
bool m_IsSilent;
std::shared_ptr<i2p::stream::Stream> m_Stream;
SAMSession * m_Session;
};
struct SAMSession
{
ClientDestination * localDestination;
std::list<std::shared_ptr<SAMSocket> > sockets;
~SAMSession ()
{
for (auto it: sockets)
it->SetSocketType (eSAMSocketTypeTerminated);
}
};
class SAMBridge
{
public:
SAMBridge (int port);
~SAMBridge ();
void Start ();
void Stop ();
boost::asio::io_service& GetService () { return m_Service; };
SAMSession * CreateSession (const std::string& id, const std::string& destination, // empty string means transient
const std::map<std::string, std::string> * params);
void CloseSession (const std::string& id);
SAMSession * FindSession (const std::string& id);
private:
void Run ();
void Accept ();
void HandleAccept(const boost::system::error_code& ecode, std::shared_ptr<SAMSocket> socket);
void ReceiveDatagram ();
void HandleReceivedDatagram (const boost::system::error_code& ecode, std::size_t bytes_transferred);
private:
bool m_IsRunning;
std::thread * m_Thread;
boost::asio::io_service m_Service;
boost::asio::ip::tcp::acceptor m_Acceptor;
boost::asio::ip::udp::endpoint m_DatagramEndpoint, m_SenderEndpoint;
boost::asio::ip::udp::socket m_DatagramSocket;
std::mutex m_SessionsMutex;
std::map<std::string, SAMSession> m_Sessions;
uint8_t m_DatagramReceiveBuffer[i2p::datagram::MAX_DATAGRAM_SIZE+1];
};
}
}
#endif

283
SOCKS.cpp
View File

@ -1,283 +0,0 @@
#include "SOCKS.h"
#include "Identity.h"
#include "NetDb.h"
#include "Destination.h"
#include "ClientContext.h"
#include <cstring>
#include <stdexcept>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/bind.hpp>
namespace i2p
{
namespace proxy
{
const uint8_t socks_leaseset_timeout = 10;
const uint8_t socks_timeout = 60;
void SOCKS4AHandler::AsyncSockRead()
{
LogPrint("--- socks4a async sock read");
if(m_sock) {
if (m_state == INITIAL) {
m_sock->async_receive(boost::asio::buffer(m_sock_buff, socks_buffer_size),
boost::bind(&SOCKS4AHandler::HandleSockRecv, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
} else {
m_sock->async_receive(boost::asio::buffer(m_sock_buff, socks_buffer_size),
boost::bind(&SOCKS4AHandler::HandleSockForward, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
} else {
LogPrint("--- socks4a no socket for read");
}
}
void SOCKS4AHandler::AsyncStreamRead()
{
LogPrint("--- socks4a async stream read");
if (m_stream) {
m_stream->AsyncReceive(
boost::asio::buffer(m_stream_buff, socks_buffer_size),
boost::bind(&SOCKS4AHandler::HandleStreamRecv, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred), socks_timeout);
} else {
LogPrint("--- socks4a no stream for read");
}
}
void SOCKS4AHandler::Terminate() {
CloseStream();
CloseSock();
delete this; // ew
}
void SOCKS4AHandler::SocksFailed()
{
LogPrint("--- socks4a failed");
m_sock->send(boost::asio::buffer("\x00\x5b 12345"));
Terminate();
}
void SOCKS4AHandler::CloseSock()
{
if (m_sock) {
LogPrint("--- socks4a close sock");
m_sock->close();
delete m_sock;
m_sock = nullptr;
}
}
void SOCKS4AHandler::CloseStream()
{
if (m_stream) {
LogPrint("--- socks4a close stream");
m_stream.reset ();
}
}
const size_t socks_hostname_size = 1024;
const size_t socks_ident_size = 1024;
const size_t destb32_len = 52;
void SOCKS4AHandler::HandleSockForward(const boost::system::error_code & ecode, std::size_t len)
{
if(ecode) {
LogPrint("--- socks4a forward got error: ", ecode);
Terminate();
return;
}
LogPrint("--- socks4a sock forward: ", len);
m_stream->Send(m_sock_buff, len);
}
void SOCKS4AHandler::HandleSockRecv(const boost::system::error_code & ecode, std::size_t len)
{
LogPrint("--- socks4a sock recv: ", len);
if(ecode) {
LogPrint(" --- sock recv got error: ", ecode);
Terminate();
return;
}
if (m_state == INITIAL) {
char hostbuff[socks_hostname_size];
char identbuff[socks_ident_size];
std::memset(hostbuff, 0, sizeof(hostbuff));
std::memset(identbuff, 0, sizeof(hostbuff));
std::string dest;
// get port
uint16_t port = 0;
uint16_t idx1 = 0;
uint16_t idx2 = 0;
LogPrint("--- socks4a state initial ", len);
// check valid request
if( m_sock_buff[0] != 4 || m_sock_buff[1] != 1 || m_sock_buff[len-1] ) {
LogPrint("--- socks4a rejected invalid");
SocksFailed();
return;
}
// get port
port = m_sock_buff[3] | m_sock_buff[2] << 8;
// read ident
do {
LogPrint("--- socks4a ", (int) m_sock_buff[9+idx1]);
identbuff[idx1] = m_sock_buff[8+idx1];
} while( identbuff[idx1++] && idx1 < socks_ident_size );
LogPrint("--- socks4a ident ", identbuff);
// read hostname
do {
hostbuff[idx2] = m_sock_buff[8+idx1+idx2];
} while( hostbuff[idx2++] && idx2 < socks_hostname_size );
LogPrint("--- socks4a requested ", hostbuff, ":" , port);
dest = std::string(hostbuff);
if(dest.find(".b32.i2p") == std::string::npos) {
LogPrint("--- socks4a invalid hostname: ", dest);
SocksFailed();
return;
}
if ( i2p::data::Base32ToByteStream(hostbuff, destb32_len, (uint8_t *) m_dest, 32) != 32 ) {
LogPrint("--- sock4a invalid b32: ", dest);
}
LogPrint("--- sock4a find lease set");
m_ls = i2p::data::netdb.FindLeaseSet(m_dest);
if (!m_ls || m_ls->HasNonExpiredLeases()) {
i2p::data::netdb.RequestDestination (m_dest, true, i2p::client::context.GetSharedLocalDestination ()->GetTunnelPool ());
m_ls_timer.expires_from_now(boost::posix_time::seconds(socks_leaseset_timeout));
m_ls_timer.async_wait(boost::bind(&SOCKS4AHandler::LeaseSetTimeout, this, boost::asio::placeholders::error));
} else {
ConnectionSuccess();
}
} else {
LogPrint("--- socks4a state?? ", m_state);
}
}
void SOCKS4AHandler::HandleStreamRecv(const boost::system::error_code & ecode, std::size_t len)
{
if(ecode) { LogPrint("--- socks4a stream recv error: ", ecode); m_state = END; }
switch(m_state) {
case INITIAL:
case END:
Terminate();
return;
case OKAY:
LogPrint("--- socks4a stream recv ", len);
boost::asio::async_write(*m_sock, boost::asio::buffer(m_stream_buff, len),
boost::bind(&SOCKS4AHandler::StreamWrote, this,
boost::asio::placeholders::error));
}
}
void SOCKS4AHandler::SockWrote(const boost::system::error_code & ecode)
{
LogPrint("--- socks4a sock wrote");
if(ecode) { LogPrint("--- socks4a SockWrote error: ",ecode); }
else { AsyncSockRead(); }
}
void SOCKS4AHandler::StreamWrote(const boost::system::error_code & ecode)
{
LogPrint("--- socks4a stream wrote");
if(ecode) { LogPrint("--- socks4a StreamWrote error: ",ecode); }
else { AsyncStreamRead(); }
}
void SOCKS4AHandler::LeaseSetTimeout(const boost::system::error_code & ecode)
{
m_ls = i2p::data::netdb.FindLeaseSet(m_dest);
if(m_ls) {
ConnectionSuccess();
} else {
LogPrint("--- socks4a ls timeout");
SocksFailed();
}
}
void SOCKS4AHandler::ConnectionSuccess()
{
LogPrint("--- socks4a connection success");
boost::asio::async_write(*m_sock, boost::asio::buffer("\x00\x5a 12345"),
boost::bind(&SOCKS4AHandler::SentConnectionSuccess, this,
boost::asio::placeholders::error));
}
void SOCKS4AHandler::SentConnectionSuccess(const boost::system::error_code & ecode)
{
LogPrint("--- socks4a making connection");
m_stream = i2p::client::context.GetSharedLocalDestination ()->CreateStream(*m_ls);
m_state = OKAY;
LogPrint("--- socks4a state is ", m_state);
AsyncSockRead();
AsyncStreamRead();
}
void SOCKS4AServer::Run()
{
LogPrint("--- socks4a run");
m_run = true;
while(m_run) {
try {
m_ios.run();
} catch (std::runtime_error & exc) {
LogPrint("--- socks4a exception: ", exc.what());
}
}
}
void SOCKS4AServer::Accept()
{
m_new_sock = new boost::asio::ip::tcp::socket(m_ios);
m_acceptor.async_accept(*m_new_sock,
boost::bind(
&SOCKS4AServer::HandleAccept, this, boost::asio::placeholders::error));
}
void SOCKS4AServer::Start()
{
m_run = true;
m_thread = new std::thread(std::bind(&SOCKS4AServer::Run, this));
m_acceptor.listen();
Accept();
}
void SOCKS4AServer::Stop()
{
m_acceptor.close();
m_run = false;
m_ios.stop();
if (m_thread) {
m_thread->join();
delete m_thread;
m_thread = nullptr;
}
}
void SOCKS4AServer::HandleAccept(const boost::system::error_code & ecode)
{
if (!ecode) {
LogPrint("--- socks4a accepted");
new SOCKS4AHandler(&m_ios, m_new_sock);
Accept();
}
}
}
}

99
SOCKS.h
View File

@ -1,99 +0,0 @@
#ifndef SOCKS4A_H__
#define SOCKS4A_H__
#include <thread>
#include <boost/asio.hpp>
#include <vector>
#include <mutex>
#include <memory>
#include "Identity.h"
#include "Streaming.h"
namespace i2p
{
namespace proxy
{
const size_t socks_buffer_size = 8192;
class SOCKS4AHandler {
private:
enum state {
INITIAL,
OKAY,
END
};
void GotClientRequest(boost::system::error_code & ecode, std::string & host, uint16_t port);
void HandleSockRecv(const boost::system::error_code & ecode, std::size_t bytes_transfered);
void HandleSockForward(const boost::system::error_code & ecode, std::size_t bytes_transfered);
void HandleStreamRecv(const boost::system::error_code & ecode, std::size_t bytes_transfered);
void Terminate();
void CloseSock();
void CloseStream();
void AsyncSockRead();
void AsyncStreamRead();
void SocksFailed();
void LeaseSetTimeout(const boost::system::error_code & ecode);
void StreamWrote(const boost::system::error_code & ecode);
void SockWrote(const boost::system::error_code & ecode);
void SentConnectionSuccess(const boost::system::error_code & ecode);
void ConnectionSuccess();
uint8_t m_sock_buff[socks_buffer_size];
uint8_t m_stream_buff[socks_buffer_size];
boost::asio::io_service * m_ios;
boost::asio::ip::tcp::socket * m_sock;
boost::asio::deadline_timer m_ls_timer;
std::shared_ptr<i2p::stream::Stream> m_stream;
i2p::data::LeaseSet * m_ls;
i2p::data::IdentHash m_dest;
state m_state;
public:
SOCKS4AHandler(boost::asio::io_service * ios, boost::asio::ip::tcp::socket * sock) :
m_ios(ios), m_sock(sock), m_ls_timer(*ios),
m_stream(nullptr), m_ls(nullptr), m_state(INITIAL) { AsyncSockRead(); }
~SOCKS4AHandler() { CloseSock(); CloseStream(); }
bool isComplete() { return m_state == END; }
};
class SOCKS4AServer {
public:
SOCKS4AServer(int port) : m_run(false),
m_thread(nullptr),
m_work(m_ios),
m_acceptor(m_ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)),
m_new_sock(nullptr) { }
~SOCKS4AServer() { Stop(); }
void Start();
void Stop();
boost::asio::io_service& GetService () { return m_ios; };
private:
void Run();
void Accept();
void HandleAccept(const boost::system::error_code& ecode);
bool m_run;
std::thread * m_thread;
boost::asio::io_service m_ios;
boost::asio::io_service::work m_work;
boost::asio::ip::tcp::acceptor m_acceptor;
boost::asio::ip::tcp::socket * m_new_sock;
};
typedef SOCKS4AServer SOCKSProxy;
}
}
#endif

386
SSU.cpp
View File

@ -1,386 +0,0 @@
#include <string.h>
#include <boost/bind.hpp>
#include "Log.h"
#include "Timestamp.h"
#include "RouterContext.h"
#include "SSU.h"
namespace i2p
{
namespace transport
{
SSUServer::SSUServer (int port): m_Thread (nullptr), m_ThreadV6 (nullptr), m_Work (m_Service),
m_WorkV6 (m_ServiceV6),m_Endpoint (boost::asio::ip::udp::v4 (), port),
m_EndpointV6 (boost::asio::ip::udp::v6 (), port), m_Socket (m_Service, m_Endpoint),
m_SocketV6 (m_ServiceV6), m_IntroducersUpdateTimer (m_Service)
{
m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535));
m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535));
if (context.SupportsV6 ())
{
m_SocketV6.open (boost::asio::ip::udp::v6());
m_SocketV6.set_option (boost::asio::ip::v6_only (true));
m_SocketV6.set_option (boost::asio::socket_base::receive_buffer_size (65535));
m_SocketV6.set_option (boost::asio::socket_base::send_buffer_size (65535));
m_SocketV6.bind (m_EndpointV6);
}
}
SSUServer::~SSUServer ()
{
}
void SSUServer::Start ()
{
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&SSUServer::Run, this));
m_Service.post (std::bind (&SSUServer::Receive, this));
if (context.SupportsV6 ())
{
m_ThreadV6 = new std::thread (std::bind (&SSUServer::RunV6, this));
m_ServiceV6.post (std::bind (&SSUServer::ReceiveV6, this));
}
if (i2p::context.IsUnreachable ())
ScheduleIntroducersUpdateTimer ();
}
void SSUServer::Stop ()
{
DeleteAllSessions ();
m_IsRunning = false;
m_Service.stop ();
m_Socket.close ();
m_ServiceV6.stop ();
m_SocketV6.close ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = nullptr;
}
if (m_ThreadV6)
{
m_ThreadV6->join ();
delete m_ThreadV6;
m_ThreadV6 = nullptr;
}
}
void SSUServer::Run ()
{
while (m_IsRunning)
{
try
{
m_Service.run ();
}
catch (std::exception& ex)
{
LogPrint (eLogError, "SSU server: ", ex.what ());
}
}
}
void SSUServer::RunV6 ()
{
while (m_IsRunning)
{
try
{
m_ServiceV6.run ();
}
catch (std::exception& ex)
{
LogPrint (eLogError, "SSU V6 server: ", ex.what ());
}
}
}
void SSUServer::AddRelay (uint32_t tag, const boost::asio::ip::udp::endpoint& relay)
{
m_Relays[tag] = relay;
}
std::shared_ptr<SSUSession> SSUServer::FindRelaySession (uint32_t tag)
{
auto it = m_Relays.find (tag);
if (it != m_Relays.end ())
return FindSession (it->second);
return nullptr;
}
void SSUServer::Send (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& to)
{
if (to.protocol () == boost::asio::ip::udp::v4())
m_Socket.send_to (boost::asio::buffer (buf, len), to);
else
m_SocketV6.send_to (boost::asio::buffer (buf, len), to);
}
void SSUServer::Receive ()
{
m_Socket.async_receive_from (boost::asio::buffer (m_ReceiveBuffer, SSU_MTU_V4), m_SenderEndpoint,
boost::bind (&SSUServer::HandleReceivedFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void SSUServer::ReceiveV6 ()
{
m_SocketV6.async_receive_from (boost::asio::buffer (m_ReceiveBufferV6, SSU_MTU_V6), m_SenderEndpointV6,
boost::bind (&SSUServer::HandleReceivedFromV6, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void SSUServer::HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (!ecode)
{
HandleReceivedBuffer (m_SenderEndpoint, m_ReceiveBuffer, bytes_transferred);
Receive ();
}
else
LogPrint ("SSU receive error: ", ecode.message ());
}
void SSUServer::HandleReceivedFromV6 (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{
if (!ecode)
{
HandleReceivedBuffer (m_SenderEndpointV6, m_ReceiveBufferV6, bytes_transferred);
ReceiveV6 ();
}
else
LogPrint ("SSU V6 receive error: ", ecode.message ());
}
void SSUServer::HandleReceivedBuffer (boost::asio::ip::udp::endpoint& from, uint8_t * buf, std::size_t bytes_transferred)
{
std::shared_ptr<SSUSession> session;
auto it = m_Sessions.find (from);
if (it != m_Sessions.end ())
session = it->second;
if (!session)
{
session = std::make_shared<SSUSession> (*this, from);
session->WaitForConnect ();
m_Sessions[from] = session;
LogPrint ("New SSU session from ", from.address ().to_string (), ":", from.port (), " created");
}
session->ProcessNextMessage (buf, bytes_transferred, from);
}
std::shared_ptr<SSUSession> SSUServer::FindSession (std::shared_ptr<const i2p::data::RouterInfo> router) const
{
if (!router) return nullptr;
auto address = router->GetSSUAddress (true); // v4 only
if (!address) return nullptr;
auto session = FindSession (boost::asio::ip::udp::endpoint (address->host, address->port));
if (session || !context.SupportsV6 ())
return session;
// try v6
address = router->GetSSUV6Address ();
if (!address) return nullptr;
return FindSession (boost::asio::ip::udp::endpoint (address->host, address->port));
}
std::shared_ptr<SSUSession> SSUServer::FindSession (const boost::asio::ip::udp::endpoint& e) const
{
auto it = m_Sessions.find (e);
if (it != m_Sessions.end ())
return it->second;
else
return nullptr;
}
std::shared_ptr<SSUSession> SSUServer::GetSession (std::shared_ptr<const i2p::data::RouterInfo> router, bool peerTest)
{
std::shared_ptr<SSUSession> session;
if (router)
{
auto address = router->GetSSUAddress (!context.SupportsV6 ());
if (address)
{
boost::asio::ip::udp::endpoint remoteEndpoint (address->host, address->port);
auto it = m_Sessions.find (remoteEndpoint);
if (it != m_Sessions.end ())
session = it->second;
else
{
// otherwise create new session
session = std::make_shared<SSUSession> (*this, remoteEndpoint, router, peerTest);
m_Sessions[remoteEndpoint] = session;
if (!router->UsesIntroducer ())
{
// connect directly
LogPrint ("Creating new SSU session to [", router->GetIdentHashAbbreviation (), "] ",
remoteEndpoint.address ().to_string (), ":", remoteEndpoint.port ());
session->Connect ();
}
else
{
// connect through introducer
int numIntroducers = address->introducers.size ();
if (numIntroducers > 0)
{
std::shared_ptr<SSUSession> introducerSession;
const i2p::data::RouterInfo::Introducer * introducer = nullptr;
// we might have a session to introducer already
for (int i = 0; i < numIntroducers; i++)
{
introducer = &(address->introducers[i]);
it = m_Sessions.find (boost::asio::ip::udp::endpoint (introducer->iHost, introducer->iPort));
if (it != m_Sessions.end ())
{
introducerSession = it->second;
break;
}
}
if (introducerSession) // session found
LogPrint ("Session to introducer already exists");
else // create new
{
LogPrint ("Creating new session to introducer");
introducer = &(address->introducers[0]); // TODO:
boost::asio::ip::udp::endpoint introducerEndpoint (introducer->iHost, introducer->iPort);
introducerSession = std::make_shared<SSUSession> (*this, introducerEndpoint, router);
m_Sessions[introducerEndpoint] = introducerSession;
}
// introduce
LogPrint ("Introduce new SSU session to [", router->GetIdentHashAbbreviation (),
"] through introducer ", introducer->iHost, ":", introducer->iPort);
session->WaitForIntroduction ();
if (i2p::context.GetRouterInfo ().UsesIntroducer ()) // if we are unreachable
Send (m_ReceiveBuffer, 0, remoteEndpoint); // send HolePunch
introducerSession->Introduce (introducer->iTag, introducer->iKey);
}
else
{
LogPrint (eLogWarning, "Can't connect to unreachable router. No introducers presented");
m_Sessions.erase (remoteEndpoint);
session.reset ();
}
}
}
}
else
LogPrint (eLogWarning, "Router ", router->GetIdentHashAbbreviation (), " doesn't have SSU address");
}
return session;
}
void SSUServer::DeleteSession (std::shared_ptr<SSUSession> session)
{
if (session)
{
session->Close ();
m_Sessions.erase (session->GetRemoteEndpoint ());
}
}
void SSUServer::DeleteAllSessions ()
{
for (auto it: m_Sessions)
it.second->Close ();
m_Sessions.clear ();
}
template<typename Filter>
std::shared_ptr<SSUSession> SSUServer::GetRandomSession (Filter filter)
{
std::vector<std::shared_ptr<SSUSession> > filteredSessions;
for (auto s :m_Sessions)
if (filter (s.second)) filteredSessions.push_back (s.second);
if (filteredSessions.size () > 0)
{
auto ind = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, filteredSessions.size ()-1);
return filteredSessions[ind];
}
return nullptr;
}
std::shared_ptr<SSUSession> SSUServer::GetRandomEstablishedSession (std::shared_ptr<const SSUSession> excluded)
{
return GetRandomSession (
[excluded](std::shared_ptr<SSUSession> session)->bool
{
return session->GetState () == eSessionStateEstablished &&
session != excluded;
}
);
}
std::set<SSUSession *> SSUServer::FindIntroducers (int maxNumIntroducers)
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
std::set<SSUSession *> ret;
for (int i = 0; i < maxNumIntroducers; i++)
{
auto session = GetRandomSession (
[&ret, ts](std::shared_ptr<SSUSession> session)->bool
{
return session->GetRelayTag () && !ret.count (session.get ()) &&
session->GetState () == eSessionStateEstablished &&
ts < session->GetCreationTime () + SSU_TO_INTRODUCER_SESSION_DURATION;
}
);
if (session)
{
ret.insert (session.get ());
break;
}
}
return ret;
}
void SSUServer::ScheduleIntroducersUpdateTimer ()
{
m_IntroducersUpdateTimer.expires_from_now (boost::posix_time::seconds(SSU_KEEP_ALIVE_INTERVAL));
m_IntroducersUpdateTimer.async_wait (std::bind (&SSUServer::HandleIntroducersUpdateTimer,
this, std::placeholders::_1));
}
void SSUServer::HandleIntroducersUpdateTimer (const boost::system::error_code& ecode)
{
if (!ecode)
{
// timeout expired
std::list<boost::asio::ip::udp::endpoint> newList;
size_t numIntroducers = 0;
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
for (auto it :m_Introducers)
{
auto session = FindSession (it);
if (session && ts < session->GetCreationTime () + SSU_TO_INTRODUCER_SESSION_DURATION)
{
session->SendKeepAlive ();
newList.push_back (it);
numIntroducers++;
}
else
i2p::context.RemoveIntroducer (it);
}
if (numIntroducers < SSU_MAX_NUM_INTRODUCERS)
{
// create new
auto introducers = FindIntroducers (SSU_MAX_NUM_INTRODUCERS);
if (introducers.size () > 0)
{
for (auto it1: introducers)
{
auto router = it1->GetRemoteRouter ();
if (router && i2p::context.AddIntroducer (*router, it1->GetRelayTag ()))
{
newList.push_back (it1->GetRemoteEndpoint ());
if (newList.size () >= SSU_MAX_NUM_INTRODUCERS) break;
}
}
}
}
m_Introducers = newList;
ScheduleIntroducersUpdateTimer ();
}
}
}
}

88
SSU.h
View File

@ -1,88 +0,0 @@
#ifndef SSU_H__
#define SSU_H__
#include <inttypes.h>
#include <string.h>
#include <map>
#include <list>
#include <set>
#include <thread>
#include <boost/asio.hpp>
#include "aes.h"
#include "I2PEndian.h"
#include "Identity.h"
#include "RouterInfo.h"
#include "I2NPProtocol.h"
#include "SSUSession.h"
namespace i2p
{
namespace transport
{
const int SSU_KEEP_ALIVE_INTERVAL = 30; // 30 seconds
const int SSU_TO_INTRODUCER_SESSION_DURATION = 3600; // 1 hour
const size_t SSU_MAX_NUM_INTRODUCERS = 3;
class SSUServer
{
public:
SSUServer (int port);
~SSUServer ();
void Start ();
void Stop ();
std::shared_ptr<SSUSession> GetSession (std::shared_ptr<const i2p::data::RouterInfo> router, bool peerTest = false);
std::shared_ptr<SSUSession> FindSession (std::shared_ptr<const i2p::data::RouterInfo> router) const;
std::shared_ptr<SSUSession> FindSession (const boost::asio::ip::udp::endpoint& e) const;
std::shared_ptr<SSUSession> GetRandomEstablishedSession (std::shared_ptr<const SSUSession> excluded);
void DeleteSession (std::shared_ptr<SSUSession> session);
void DeleteAllSessions ();
boost::asio::io_service& GetService () { return m_Socket.get_io_service(); };
const boost::asio::ip::udp::endpoint& GetEndpoint () const { return m_Endpoint; };
void Send (const uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& to);
void AddRelay (uint32_t tag, const boost::asio::ip::udp::endpoint& relay);
std::shared_ptr<SSUSession> FindRelaySession (uint32_t tag);
private:
void Run ();
void RunV6 ();
void Receive ();
void ReceiveV6 ();
void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleReceivedFromV6 (const boost::system::error_code& ecode, std::size_t bytes_transferred);
void HandleReceivedBuffer (boost::asio::ip::udp::endpoint& from, uint8_t * buf, std::size_t bytes_transferred);
template<typename Filter>
std::shared_ptr<SSUSession> GetRandomSession (Filter filter);
std::set<SSUSession *> FindIntroducers (int maxNumIntroducers);
void ScheduleIntroducersUpdateTimer ();
void HandleIntroducersUpdateTimer (const boost::system::error_code& ecode);
private:
bool m_IsRunning;
std::thread * m_Thread, * m_ThreadV6;
boost::asio::io_service m_Service, m_ServiceV6;
boost::asio::io_service::work m_Work, m_WorkV6;
boost::asio::ip::udp::endpoint m_Endpoint, m_EndpointV6;
boost::asio::ip::udp::socket m_Socket, m_SocketV6;
boost::asio::ip::udp::endpoint m_SenderEndpoint, m_SenderEndpointV6;
boost::asio::deadline_timer m_IntroducersUpdateTimer;
std::list<boost::asio::ip::udp::endpoint> m_Introducers; // introducers we are connected to
i2p::crypto::AESAlignedBuffer<2*SSU_MTU_V4> m_ReceiveBuffer;
i2p::crypto::AESAlignedBuffer<2*SSU_MTU_V6> m_ReceiveBufferV6;
std::map<boost::asio::ip::udp::endpoint, std::shared_ptr<SSUSession> > m_Sessions;
std::map<uint32_t, boost::asio::ip::udp::endpoint> m_Relays; // we are introducer
public:
// for HTTP only
const decltype(m_Sessions)& GetSessions () const { return m_Sessions; };
};
}
}
#endif

View File

@ -1,430 +0,0 @@
#include <stdlib.h>
#include <boost/bind.hpp>
#include "Log.h"
#include "Timestamp.h"
#include "NetDb.h"
#include "SSU.h"
#include "SSUData.h"
namespace i2p
{
namespace transport
{
SSUData::SSUData (SSUSession& session):
m_Session (session), m_ResendTimer (session.m_Server.GetService ())
{
m_MaxPacketSize = session.IsV6 () ? SSU_V6_MAX_PACKET_SIZE : SSU_V4_MAX_PACKET_SIZE;
m_PacketSize = m_MaxPacketSize;
auto remoteRouter = session.GetRemoteRouter ();
if (remoteRouter)
AdjustPacketSize (*remoteRouter);
}
SSUData::~SSUData ()
{
for (auto it: m_IncomleteMessages)
if (it.second)
{
DeleteI2NPMessage (it.second->msg);
delete it.second;
}
for (auto it: m_SentMessages)
delete it.second;
}
void SSUData::AdjustPacketSize (const i2p::data::RouterInfo& remoteRouter)
{
auto ssuAddress = remoteRouter.GetSSUAddress ();
if (ssuAddress && ssuAddress->mtu)
{
if (m_Session.IsV6 ())
m_PacketSize = ssuAddress->mtu - IPV6_HEADER_SIZE - UDP_HEADER_SIZE;
else
m_PacketSize = ssuAddress->mtu - IPV4_HEADER_SIZE - UDP_HEADER_SIZE;
if (m_PacketSize > 0)
{
// make sure packet size multiple of 16
m_PacketSize >>= 4;
m_PacketSize <<= 4;
if (m_PacketSize > m_MaxPacketSize) m_PacketSize = m_MaxPacketSize;
LogPrint ("MTU=", ssuAddress->mtu, " packet size=", m_PacketSize);
}
else
{
LogPrint (eLogWarning, "Unexpected MTU ", ssuAddress->mtu);
m_PacketSize = m_MaxPacketSize;
}
}
}
void SSUData::UpdatePacketSize (const i2p::data::IdentHash& remoteIdent)
{
auto routerInfo = i2p::data::netdb.FindRouter (remoteIdent);
if (routerInfo)
AdjustPacketSize (*routerInfo);
}
void SSUData::ProcessSentMessageAck (uint32_t msgID)
{
auto it = m_SentMessages.find (msgID);
if (it != m_SentMessages.end ())
{
delete it->second;
m_SentMessages.erase (it);
if (m_SentMessages.empty ())
m_ResendTimer.cancel ();
}
}
void SSUData::ProcessAcks (uint8_t *& buf, uint8_t flag)
{
if (flag & DATA_FLAG_EXPLICIT_ACKS_INCLUDED)
{
// explicit ACKs
uint8_t numAcks =*buf;
buf++;
for (int i = 0; i < numAcks; i++)
ProcessSentMessageAck (be32toh (((uint32_t *)buf)[i]));
buf += numAcks*4;
}
if (flag & DATA_FLAG_ACK_BITFIELDS_INCLUDED)
{
// explicit ACK bitfields
uint8_t numBitfields =*buf;
buf++;
for (int i = 0; i < numBitfields; i++)
{
uint32_t msgID = be32toh (*(uint32_t *)buf);
buf += 4; // msgID
auto it = m_SentMessages.find (msgID);
// process individual Ack bitfields
bool isNonLast = false;
int fragment = 0;
do
{
uint8_t bitfield = *buf;
isNonLast = bitfield & 0x80;
bitfield &= 0x7F; // clear MSB
if (bitfield && it != m_SentMessages.end ())
{
int numSentFragments = it->second->fragments.size ();
// process bits
uint8_t mask = 0x01;
for (int j = 0; j < 7; j++)
{
if (bitfield & mask)
{
if (fragment < numSentFragments)
{
delete it->second->fragments[fragment];
it->second->fragments[fragment] = nullptr;
}
}
fragment++;
mask <<= 1;
}
}
buf++;
}
while (isNonLast);
}
}
}
void SSUData::ProcessFragments (uint8_t * buf)
{
uint8_t numFragments = *buf; // number of fragments
buf++;
for (int i = 0; i < numFragments; i++)
{
uint32_t msgID = be32toh (*(uint32_t *)buf); // message ID
buf += 4;
uint8_t frag[4];
frag[0] = 0;
memcpy (frag + 1, buf, 3);
buf += 3;
uint32_t fragmentInfo = be32toh (*(uint32_t *)frag); // fragment info
uint16_t fragmentSize = fragmentInfo & 0x1FFF; // bits 0 - 13
bool isLast = fragmentInfo & 0x010000; // bit 16
uint8_t fragmentNum = fragmentInfo >> 17; // bits 23 - 17
LogPrint (eLogDebug, "SSU data fragment ", (int)fragmentNum, " of message ", msgID, " size=", (int)fragmentSize, isLast ? " last" : " non-last");
if (fragmentSize >= SSU_V4_MAX_PACKET_SIZE)
{
LogPrint (eLogError, "Fragment size ", fragmentSize, "exceeds max SSU packet size");
return;
}
// find message with msgID
I2NPMessage * msg = nullptr;
IncompleteMessage * incompleteMessage = nullptr;
auto it = m_IncomleteMessages.find (msgID);
if (it != m_IncomleteMessages.end ())
{
// message exists
incompleteMessage = it->second;
msg = incompleteMessage->msg;
}
else
{
// create new message
msg = NewI2NPMessage ();
msg->len -= sizeof (I2NPHeaderShort);
incompleteMessage = new IncompleteMessage (msg);
m_IncomleteMessages[msgID] = incompleteMessage;
}
// handle current fragment
if (fragmentNum == incompleteMessage->nextFragmentNum)
{
// expected fragment
memcpy (msg->buf + msg->len, buf, fragmentSize);
msg->len += fragmentSize;
incompleteMessage->nextFragmentNum++;
if (!isLast && !incompleteMessage->savedFragments.empty ())
{
// try saved fragments
for (auto it1 = incompleteMessage->savedFragments.begin (); it1 != incompleteMessage->savedFragments.end ();)
{
auto savedFragment = *it1;
if (savedFragment->fragmentNum == incompleteMessage->nextFragmentNum)
{
memcpy (msg->buf + msg->len, savedFragment->buf, savedFragment->len);
msg->len += savedFragment->len;
isLast = savedFragment->isLast;
incompleteMessage->nextFragmentNum++;
incompleteMessage->savedFragments.erase (it1++);
delete savedFragment;
}
else
break;
}
if (isLast)
LogPrint (eLogDebug, "Message ", msgID, " complete");
}
}
else
{
if (fragmentNum < incompleteMessage->nextFragmentNum)
// duplicate fragment
LogPrint (eLogWarning, "Duplicate fragment ", (int)fragmentNum, " of message ", msgID, ". Ignored");
else
{
// missing fragment
LogPrint (eLogWarning, "Missing fragments from ", (int)incompleteMessage->nextFragmentNum, " to ", fragmentNum - 1, " of message ", msgID);
auto savedFragment = new Fragment (fragmentNum, buf, fragmentSize, isLast);
if (!incompleteMessage->savedFragments.insert (savedFragment).second)
{
LogPrint (eLogWarning, "Fragment ", (int)fragmentNum, " of message ", msgID, " already saved");
delete savedFragment;
}
}
isLast = false;
}
if (isLast)
{
// delete incomplete message
delete incompleteMessage;
m_IncomleteMessages.erase (msgID);
// process message
SendMsgAck (msgID);
msg->FromSSU (msgID);
if (m_Session.GetState () == eSessionStateEstablished)
{
if (!m_ReceivedMessages.count (msgID))
{
if (m_ReceivedMessages.size () > 100) m_ReceivedMessages.clear ();
m_ReceivedMessages.insert (msgID);
i2p::HandleI2NPMessage (msg);
}
else
{
LogPrint (eLogWarning, "SSU message ", msgID, " already received");
i2p::DeleteI2NPMessage (msg);
}
}
else
{
// we expect DeliveryStatus
if (msg->GetHeader ()->typeID == eI2NPDeliveryStatus)
{
LogPrint ("SSU session established");
m_Session.Established ();
}
else
LogPrint (eLogError, "SSU unexpected message ", (int)msg->GetHeader ()->typeID);
DeleteI2NPMessage (msg);
}
}
else
SendFragmentAck (msgID, fragmentNum);
buf += fragmentSize;
}
}
void SSUData::ProcessMessage (uint8_t * buf, size_t len)
{
//uint8_t * start = buf;
uint8_t flag = *buf;
buf++;
LogPrint (eLogDebug, "Process SSU data flags=", (int)flag);
// process acks if presented
if (flag & (DATA_FLAG_ACK_BITFIELDS_INCLUDED | DATA_FLAG_EXPLICIT_ACKS_INCLUDED))
ProcessAcks (buf, flag);
// extended data if presented
if (flag & DATA_FLAG_EXTENDED_DATA_INCLUDED)
{
uint8_t extendedDataSize = *buf;
buf++; // size
LogPrint (eLogDebug, "SSU extended data of ", extendedDataSize, " bytes presented");
buf += extendedDataSize;
}
// process data
ProcessFragments (buf);
}
void SSUData::Send (i2p::I2NPMessage * msg)
{
uint32_t msgID = msg->ToSSU ();
if (m_SentMessages.count (msgID) > 0)
{
LogPrint (eLogWarning, "SSU message ", msgID, " already sent");
DeleteI2NPMessage (msg);
return;
}
if (m_SentMessages.empty ()) // schedule resend at first message only
ScheduleResend ();
SentMessage * sentMessage = new SentMessage;
m_SentMessages[msgID] = sentMessage;
sentMessage->nextResendTime = i2p::util::GetSecondsSinceEpoch () + RESEND_INTERVAL;
sentMessage->numResends = 0;
auto& fragments = sentMessage->fragments;
msgID = htobe32 (msgID);
size_t payloadSize = m_PacketSize - sizeof (SSUHeader) - 9; // 9 = flag + #frg(1) + messageID(4) + frag info (3)
size_t len = msg->GetLength ();
uint8_t * msgBuf = msg->GetSSUHeader ();
uint32_t fragmentNum = 0;
while (len > 0)
{
Fragment * fragment = new Fragment;
fragment->fragmentNum = fragmentNum;
uint8_t * buf = fragment->buf;
fragments.push_back (fragment);
uint8_t * payload = buf + sizeof (SSUHeader);
*payload = DATA_FLAG_WANT_REPLY; // for compatibility
payload++;
*payload = 1; // always 1 message fragment per message
payload++;
*(uint32_t *)payload = msgID;
payload += 4;
bool isLast = (len <= payloadSize);
size_t size = isLast ? len : payloadSize;
uint32_t fragmentInfo = (fragmentNum << 17);
if (isLast)
fragmentInfo |= 0x010000;
fragmentInfo |= size;
fragmentInfo = htobe32 (fragmentInfo);
memcpy (payload, (uint8_t *)(&fragmentInfo) + 1, 3);
payload += 3;
memcpy (payload, msgBuf, size);
size += payload - buf;
if (size & 0x0F) // make sure 16 bytes boundary
size = ((size >> 4) + 1) << 4; // (/16 + 1)*16
fragment->len = size;
// encrypt message with session key
m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, size);
m_Session.Send (buf, size);
if (!isLast)
{
len -= payloadSize;
msgBuf += payloadSize;
}
else
len = 0;
fragmentNum++;
}
DeleteI2NPMessage (msg);
}
void SSUData::SendMsgAck (uint32_t msgID)
{
uint8_t buf[48 + 18]; // actual length is 44 = 37 + 7 but pad it to multiple of 16
uint8_t * payload = buf + sizeof (SSUHeader);
*payload = DATA_FLAG_EXPLICIT_ACKS_INCLUDED; // flag
payload++;
*payload = 1; // number of ACKs
payload++;
*(uint32_t *)(payload) = htobe32 (msgID); // msgID
payload += 4;
*payload = 0; // number of fragments
// encrypt message with session key
m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, 48);
m_Session.Send (buf, 48);
}
void SSUData::SendFragmentAck (uint32_t msgID, int fragmentNum)
{
if (fragmentNum > 64)
{
LogPrint (eLogWarning, "Fragment number ", fragmentNum, " exceeds 64");
return;
}
uint8_t buf[64 + 18];
uint8_t * payload = buf + sizeof (SSUHeader);
*payload = DATA_FLAG_ACK_BITFIELDS_INCLUDED; // flag
payload++;
*payload = 1; // number of ACK bitfields
payload++;
// one ack
*(uint32_t *)(payload) = htobe32 (msgID); // msgID
payload += 4;
div_t d = div (fragmentNum, 7);
memset (payload, 0x80, d.quot); // 0x80 means non-last
payload += d.quot;
*payload = 0x01 << d.rem; // set corresponding bit
payload++;
*payload = 0; // number of fragments
size_t len = d.quot < 4 ? 48 : 64; // 48 = 37 + 7 + 4 (3+1)
// encrypt message with session key
m_Session.FillHeaderAndEncrypt (PAYLOAD_TYPE_DATA, buf, len);
m_Session.Send (buf, len);
}
void SSUData::ScheduleResend()
{
m_ResendTimer.cancel ();
m_ResendTimer.expires_from_now (boost::posix_time::seconds(RESEND_INTERVAL));
auto s = m_Session.shared_from_this();
m_ResendTimer.async_wait ([s](const boost::system::error_code& ecode)
{ s->m_Data.HandleResendTimer (ecode); });
}
void SSUData::HandleResendTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
for (auto it : m_SentMessages)
{
if (ts >= it.second->nextResendTime && it.second->numResends < MAX_NUM_RESENDS)
{
for (auto f: it.second->fragments)
if (f) m_Session.Send (f->buf, f->len); // resend
it.second->numResends++;
it.second->nextResendTime += it.second->numResends*RESEND_INTERVAL;
}
}
ScheduleResend ();
}
}
}
}

114
SSUData.h
View File

@ -1,114 +0,0 @@
#ifndef SSU_DATA_H__
#define SSU_DATA_H__
#include <inttypes.h>
#include <string.h>
#include <map>
#include <vector>
#include <set>
#include <boost/asio.hpp>
#include "I2NPProtocol.h"
#include "Identity.h"
#include "RouterInfo.h"
namespace i2p
{
namespace transport
{
const size_t SSU_MTU_V4 = 1484;
const size_t SSU_MTU_V6 = 1472;
const size_t IPV4_HEADER_SIZE = 20;
const size_t IPV6_HEADER_SIZE = 40;
const size_t UDP_HEADER_SIZE = 8;
const size_t SSU_V4_MAX_PACKET_SIZE = SSU_MTU_V4 - IPV4_HEADER_SIZE - UDP_HEADER_SIZE; // 1456
const size_t SSU_V6_MAX_PACKET_SIZE = SSU_MTU_V6 - IPV6_HEADER_SIZE - UDP_HEADER_SIZE; // 1424
const int RESEND_INTERVAL = 3; // in seconds
const int MAX_NUM_RESENDS = 5;
// data flags
const uint8_t DATA_FLAG_EXTENDED_DATA_INCLUDED = 0x02;
const uint8_t DATA_FLAG_WANT_REPLY = 0x04;
const uint8_t DATA_FLAG_REQUEST_PREVIOUS_ACKS = 0x08;
const uint8_t DATA_FLAG_EXPLICIT_CONGESTION_NOTIFICATION = 0x10;
const uint8_t DATA_FLAG_ACK_BITFIELDS_INCLUDED = 0x40;
const uint8_t DATA_FLAG_EXPLICIT_ACKS_INCLUDED = 0x80;
struct Fragment
{
int fragmentNum;
size_t len;
bool isLast;
uint8_t buf[SSU_V4_MAX_PACKET_SIZE + 18]; // use biggest
Fragment () = default;
Fragment (int n, const uint8_t * b, int l, bool last):
fragmentNum (n), len (l), isLast (last) { memcpy (buf, b, len); };
};
struct FragmentCmp
{
bool operator() (const Fragment * f1, const Fragment * f2) const
{
return f1->fragmentNum < f2->fragmentNum;
};
};
struct IncompleteMessage
{
I2NPMessage * msg;
int nextFragmentNum;
std::set<Fragment *, FragmentCmp> savedFragments;
IncompleteMessage (I2NPMessage * m): msg (m), nextFragmentNum (0) {};
~IncompleteMessage () { for (auto it: savedFragments) { delete it; }; };
};
struct SentMessage
{
std::vector<Fragment *> fragments;
uint32_t nextResendTime; // in seconds
int numResends;
~SentMessage () { for (auto it: fragments) { delete it; }; };
};
class SSUSession;
class SSUData
{
public:
SSUData (SSUSession& session);
~SSUData ();
void ProcessMessage (uint8_t * buf, size_t len);
void Send (i2p::I2NPMessage * msg);
void UpdatePacketSize (const i2p::data::IdentHash& remoteIdent);
private:
void SendMsgAck (uint32_t msgID);
void SendFragmentAck (uint32_t msgID, int fragmentNum);
void ProcessAcks (uint8_t *& buf, uint8_t flag);
void ProcessFragments (uint8_t * buf);
void ProcessSentMessageAck (uint32_t msgID);
void ScheduleResend ();
void HandleResendTimer (const boost::system::error_code& ecode);
void AdjustPacketSize (const i2p::data::RouterInfo& remoteRouter);
private:
SSUSession& m_Session;
std::map<uint32_t, IncompleteMessage *> m_IncomleteMessages;
std::map<uint32_t, SentMessage *> m_SentMessages;
std::set<uint32_t> m_ReceivedMessages;
boost::asio::deadline_timer m_ResendTimer;
int m_MaxPacketSize, m_PacketSize;
};
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,146 +0,0 @@
#ifndef SSU_SESSION_H__
#define SSU_SESSION_H__
#include <inttypes.h>
#include <set>
#include <list>
#include <memory>
#include "aes.h"
#include "hmac.h"
#include "I2NPProtocol.h"
#include "TransportSession.h"
#include "SSUData.h"
namespace i2p
{
namespace transport
{
#pragma pack(1)
struct SSUHeader
{
uint8_t mac[16];
uint8_t iv[16];
uint8_t flag;
uint32_t time;
uint8_t GetPayloadType () const { return flag >> 4; };
};
#pragma pack()
const int SSU_CONNECT_TIMEOUT = 5; // 5 seconds
const int SSU_TERMINATION_TIMEOUT = 330; // 5.5 minutes
// payload types (4 bits)
const uint8_t PAYLOAD_TYPE_SESSION_REQUEST = 0;
const uint8_t PAYLOAD_TYPE_SESSION_CREATED = 1;
const uint8_t PAYLOAD_TYPE_SESSION_CONFIRMED = 2;
const uint8_t PAYLOAD_TYPE_RELAY_REQUEST = 3;
const uint8_t PAYLOAD_TYPE_RELAY_RESPONSE = 4;
const uint8_t PAYLOAD_TYPE_RELAY_INTRO = 5;
const uint8_t PAYLOAD_TYPE_DATA = 6;
const uint8_t PAYLOAD_TYPE_PEER_TEST = 7;
const uint8_t PAYLOAD_TYPE_SESSION_DESTROYED = 8;
enum SessionState
{
eSessionStateUnknown,
eSessionStateIntroduced,
eSessionStateEstablished,
eSessionStateFailed
};
class SSUServer;
class SSUSession: public TransportSession, public std::enable_shared_from_this<SSUSession>
{
public:
SSUSession (SSUServer& server, boost::asio::ip::udp::endpoint& remoteEndpoint,
std::shared_ptr<const i2p::data::RouterInfo> router = nullptr, bool peerTest = false);
void ProcessNextMessage (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
~SSUSession ();
void Connect ();
void WaitForConnect ();
void Introduce (uint32_t iTag, const uint8_t * iKey);
void WaitForIntroduction ();
void Close ();
boost::asio::ip::udp::endpoint& GetRemoteEndpoint () { return m_RemoteEndpoint; };
bool IsV6 () const { return m_RemoteEndpoint.address ().is_v6 (); };
void SendI2NPMessage (I2NPMessage * msg);
void SendPeerTest (); // Alice
SessionState GetState () const { return m_State; };
size_t GetNumSentBytes () const { return m_NumSentBytes; };
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
void SendKeepAlive ();
uint32_t GetRelayTag () const { return m_RelayTag; };
uint32_t GetCreationTime () const { return m_CreationTime; };
private:
void CreateAESandMacKey (const uint8_t * pubKey);
void PostI2NPMessage (I2NPMessage * msg);
void ProcessMessage (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint); // call for established session
void ProcessSessionRequest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
void SendSessionRequest ();
void SendRelayRequest (uint32_t iTag, const uint8_t * iKey);
void ProcessSessionCreated (uint8_t * buf, size_t len);
void SendSessionCreated (const uint8_t * x);
void ProcessSessionConfirmed (uint8_t * buf, size_t len);
void SendSessionConfirmed (const uint8_t * y, const uint8_t * ourAddress, size_t ourAddressLen);
void ProcessRelayRequest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& from);
void SendRelayResponse (uint32_t nonce, const boost::asio::ip::udp::endpoint& from,
const uint8_t * introKey, const boost::asio::ip::udp::endpoint& to);
void SendRelayIntro (SSUSession * session, const boost::asio::ip::udp::endpoint& from);
void ProcessRelayResponse (uint8_t * buf, size_t len);
void ProcessRelayIntro (uint8_t * buf, size_t len);
void Established ();
void Failed ();
void ScheduleConnectTimer ();
void HandleConnectTimer (const boost::system::error_code& ecode);
void ProcessPeerTest (uint8_t * buf, size_t len, const boost::asio::ip::udp::endpoint& senderEndpoint);
void SendPeerTest (uint32_t nonce, uint32_t address, uint16_t port, const uint8_t * introKey, bool toAddress = true);
void ProcessData (uint8_t * buf, size_t len);
void SendSesionDestroyed ();
void Send (uint8_t type, const uint8_t * payload, size_t len); // with session key
void Send (const uint8_t * buf, size_t size);
void FillHeaderAndEncrypt (uint8_t payloadType, uint8_t * buf, size_t len, const uint8_t * aesKey, const uint8_t * iv, const uint8_t * macKey);
void FillHeaderAndEncrypt (uint8_t payloadType, uint8_t * buf, size_t len); // with session key
void Decrypt (uint8_t * buf, size_t len, const uint8_t * aesKey);
void DecryptSessionKey (uint8_t * buf, size_t len);
bool Validate (uint8_t * buf, size_t len, const uint8_t * macKey);
const uint8_t * GetIntroKey () const;
void ScheduleTermination ();
void HandleTerminationTimer (const boost::system::error_code& ecode);
private:
friend class SSUData; // TODO: change in later
SSUServer& m_Server;
boost::asio::ip::udp::endpoint m_RemoteEndpoint;
boost::asio::deadline_timer m_Timer;
bool m_PeerTest;
SessionState m_State;
bool m_IsSessionKey;
uint32_t m_RelayTag;
std::set<uint32_t> m_PeerTestNonces;
i2p::crypto::CBCEncryption m_SessionKeyEncryption;
i2p::crypto::CBCDecryption m_SessionKeyDecryption;
i2p::crypto::AESKey m_SessionKey;
i2p::crypto::MACKey m_MacKey;
std::list<i2p::I2NPMessage *> m_DelayedMessages;
SSUData m_Data;
size_t m_NumSentBytes, m_NumReceivedBytes;
uint32_t m_CreationTime; // seconds since epoch
};
}
}
#endif

View File

@ -1,417 +0,0 @@
#ifndef SIGNATURE_H__
#define SIGNATURE_H__
#include <inttypes.h>
#include <cryptopp/dsa.h>
#include <cryptopp/rsa.h>
#include <cryptopp/asn.h>
#include <cryptopp/oids.h>
#include <cryptopp/osrng.h>
#include <cryptopp/eccrypto.h>
#include "CryptoConst.h"
namespace i2p
{
namespace crypto
{
class Verifier
{
public:
virtual ~Verifier () {};
virtual bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const = 0;
virtual size_t GetPublicKeyLen () const = 0;
virtual size_t GetSignatureLen () const = 0;
virtual size_t GetPrivateKeyLen () const { return GetSignatureLen ()/2; };
};
class Signer
{
public:
virtual ~Signer () {};
virtual void Sign (CryptoPP::RandomNumberGenerator& rnd, const uint8_t * buf, int len, uint8_t * signature) const = 0;
};
const size_t DSA_PUBLIC_KEY_LENGTH = 128;
const size_t DSA_SIGNATURE_LENGTH = 40;
const size_t DSA_PRIVATE_KEY_LENGTH = DSA_SIGNATURE_LENGTH/2;
class DSAVerifier: public Verifier
{
public:
DSAVerifier (const uint8_t * signingKey)
{
m_PublicKey.Initialize (dsap, dsaq, dsag, CryptoPP::Integer (signingKey, DSA_PUBLIC_KEY_LENGTH));
}
bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const
{
CryptoPP::DSA::Verifier verifier (m_PublicKey);
return verifier.VerifyMessage (buf, len, signature, DSA_SIGNATURE_LENGTH);
}
size_t GetPublicKeyLen () const { return DSA_PUBLIC_KEY_LENGTH; };
size_t GetSignatureLen () const { return DSA_SIGNATURE_LENGTH; };
private:
CryptoPP::DSA::PublicKey m_PublicKey;
};
class DSASigner: public Signer
{
public:
DSASigner (const uint8_t * signingPrivateKey)
{
m_PrivateKey.Initialize (dsap, dsaq, dsag, CryptoPP::Integer (signingPrivateKey, DSA_PRIVATE_KEY_LENGTH));
}
void Sign (CryptoPP::RandomNumberGenerator& rnd, const uint8_t * buf, int len, uint8_t * signature) const
{
CryptoPP::DSA::Signer signer (m_PrivateKey);
signer.SignMessage (rnd, buf, len, signature);
}
private:
CryptoPP::DSA::PrivateKey m_PrivateKey;
};
inline void CreateDSARandomKeys (CryptoPP::RandomNumberGenerator& rnd, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
CryptoPP::DSA::PrivateKey privateKey;
CryptoPP::DSA::PublicKey publicKey;
privateKey.Initialize (rnd, dsap, dsaq, dsag);
privateKey.MakePublicKey (publicKey);
privateKey.GetPrivateExponent ().Encode (signingPrivateKey, DSA_PRIVATE_KEY_LENGTH);
publicKey.GetPublicElement ().Encode (signingPublicKey, DSA_PUBLIC_KEY_LENGTH);
}
template<typename Hash, size_t keyLen>
class ECDSAVerifier: public Verifier
{
public:
template<typename Curve>
ECDSAVerifier (Curve curve, const uint8_t * signingKey)
{
m_PublicKey.Initialize (curve,
CryptoPP::ECP::Point (CryptoPP::Integer (signingKey, keyLen/2),
CryptoPP::Integer (signingKey + keyLen/2, keyLen/2)));
}
bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const
{
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::Verifier verifier (m_PublicKey);
return verifier.VerifyMessage (buf, len, signature, keyLen); // signature length
}
size_t GetPublicKeyLen () const { return keyLen; };
size_t GetSignatureLen () const { return keyLen; }; // signature length = key length
private:
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::PublicKey m_PublicKey;
};
template<typename Hash>
class ECDSASigner: public Signer
{
public:
template<typename Curve>
ECDSASigner (Curve curve, const uint8_t * signingPrivateKey, size_t keyLen)
{
m_PrivateKey.Initialize (curve, CryptoPP::Integer (signingPrivateKey, keyLen/2)); // private key length
}
void Sign (CryptoPP::RandomNumberGenerator& rnd, const uint8_t * buf, int len, uint8_t * signature) const
{
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::Signer signer (m_PrivateKey);
signer.SignMessage (rnd, buf, len, signature);
}
private:
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::PrivateKey m_PrivateKey;
};
template<typename Hash, typename Curve>
inline void CreateECDSARandomKeys (CryptoPP::RandomNumberGenerator& rnd, Curve curve,
size_t keyLen, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::PrivateKey privateKey;
typename CryptoPP::ECDSA<CryptoPP::ECP, Hash>::PublicKey publicKey;
privateKey.Initialize (rnd, curve);
privateKey.MakePublicKey (publicKey);
privateKey.GetPrivateExponent ().Encode (signingPrivateKey, keyLen/2);
auto q = publicKey.GetPublicElement ();
q.x.Encode (signingPublicKey, keyLen/2);
q.y.Encode (signingPublicKey + keyLen/2, keyLen/2);
}
// ECDSA_SHA256_P256
const size_t ECDSAP256_KEY_LENGTH = 64;
class ECDSAP256Verifier: public ECDSAVerifier<CryptoPP::SHA256, ECDSAP256_KEY_LENGTH>
{
public:
ECDSAP256Verifier (const uint8_t * signingKey):
ECDSAVerifier (CryptoPP::ASN1::secp256r1(), signingKey)
{
}
};
class ECDSAP256Signer: public ECDSASigner<CryptoPP::SHA256>
{
public:
ECDSAP256Signer (const uint8_t * signingPrivateKey):
ECDSASigner (CryptoPP::ASN1::secp256r1(), signingPrivateKey, ECDSAP256_KEY_LENGTH)
{
}
};
inline void CreateECDSAP256RandomKeys (CryptoPP::RandomNumberGenerator& rnd, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
CreateECDSARandomKeys<CryptoPP::SHA256> (rnd, CryptoPP::ASN1::secp256r1(), ECDSAP256_KEY_LENGTH, signingPrivateKey, signingPublicKey);
}
// ECDSA_SHA384_P384
const size_t ECDSAP384_KEY_LENGTH = 96;
class ECDSAP384Verifier: public ECDSAVerifier<CryptoPP::SHA384, ECDSAP384_KEY_LENGTH>
{
public:
ECDSAP384Verifier (const uint8_t * signingKey):
ECDSAVerifier (CryptoPP::ASN1::secp384r1(), signingKey)
{
}
};
class ECDSAP384Signer: public ECDSASigner<CryptoPP::SHA384>
{
public:
ECDSAP384Signer (const uint8_t * signingPrivateKey):
ECDSASigner (CryptoPP::ASN1::secp384r1(), signingPrivateKey, ECDSAP384_KEY_LENGTH)
{
}
};
inline void CreateECDSAP384RandomKeys (CryptoPP::RandomNumberGenerator& rnd, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
CreateECDSARandomKeys<CryptoPP::SHA384> (rnd, CryptoPP::ASN1::secp384r1(), ECDSAP384_KEY_LENGTH, signingPrivateKey, signingPublicKey);
}
// ECDSA_SHA512_P521
const size_t ECDSAP521_KEY_LENGTH = 132;
class ECDSAP521Verifier: public ECDSAVerifier<CryptoPP::SHA512, ECDSAP521_KEY_LENGTH>
{
public:
ECDSAP521Verifier (const uint8_t * signingKey):
ECDSAVerifier (CryptoPP::ASN1::secp521r1(), signingKey)
{
}
};
class ECDSAP521Signer: public ECDSASigner<CryptoPP::SHA512>
{
public:
ECDSAP521Signer (const uint8_t * signingPrivateKey):
ECDSASigner (CryptoPP::ASN1::secp521r1(), signingPrivateKey, ECDSAP521_KEY_LENGTH)
{
}
};
inline void CreateECDSAP521RandomKeys (CryptoPP::RandomNumberGenerator& rnd, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
CreateECDSARandomKeys<CryptoPP::SHA512> (rnd, CryptoPP::ASN1::secp521r1(), ECDSAP521_KEY_LENGTH, signingPrivateKey, signingPublicKey);
}
// RSA
template<typename Hash, size_t keyLen>
class RSAVerifier: public Verifier
{
public:
RSAVerifier (const uint8_t * signingKey)
{
m_PublicKey.Initialize (CryptoPP::Integer (signingKey, keyLen), CryptoPP::Integer (rsae));
}
bool Verify (const uint8_t * buf, size_t len, const uint8_t * signature) const
{
typename CryptoPP::RSASS<CryptoPP::PKCS1v15, Hash>::Verifier verifier (m_PublicKey);
return verifier.VerifyMessage (buf, len, signature, keyLen); // signature length
}
size_t GetPublicKeyLen () const { return keyLen; }
size_t GetSignatureLen () const { return keyLen; }
size_t GetPrivateKeyLen () const { return GetSignatureLen ()*2; };
private:
CryptoPP::RSA::PublicKey m_PublicKey;
};
template<typename Hash>
class RSASigner: public Signer
{
public:
RSASigner (const uint8_t * signingPrivateKey, size_t keyLen)
{
m_PrivateKey.Initialize (CryptoPP::Integer (signingPrivateKey, keyLen/2),
rsae,
CryptoPP::Integer (signingPrivateKey + keyLen/2, keyLen/2));
}
void Sign (CryptoPP::RandomNumberGenerator& rnd, const uint8_t * buf, int len, uint8_t * signature) const
{
typename CryptoPP::RSASS<CryptoPP::PKCS1v15, Hash>::Signer signer (m_PrivateKey);
signer.SignMessage (rnd, buf, len, signature);
}
private:
CryptoPP::RSA::PrivateKey m_PrivateKey;
};
inline void CreateRSARandomKeys (CryptoPP::RandomNumberGenerator& rnd,
size_t publicKeyLen, uint8_t * signingPrivateKey, uint8_t * signingPublicKey)
{
CryptoPP::RSA::PrivateKey privateKey;
privateKey.Initialize (rnd, publicKeyLen*8, rsae);
privateKey.GetModulus ().Encode (signingPrivateKey, publicKeyLen);
privateKey.GetPrivateExponent ().Encode (signingPrivateKey + publicKeyLen, publicKeyLen);
privateKey.GetModulus ().Encode (signingPublicKey, publicKeyLen);
}
// RSA_SHA256_2048
const size_t RSASHA2562048_KEY_LENGTH = 256;
class RSASHA2562048Verifier: public RSAVerifier<CryptoPP::SHA256, RSASHA2562048_KEY_LENGTH>
{
public:
RSASHA2562048Verifier (const uint8_t * signingKey): RSAVerifier (signingKey)
{
}
};
class RSASHA2562048Signer: public RSASigner<CryptoPP::SHA256>
{
public:
RSASHA2562048Signer (const uint8_t * signingPrivateKey):
RSASigner (signingPrivateKey, RSASHA2562048_KEY_LENGTH*2)
{
}
};
// RSA_SHA384_3072
const size_t RSASHA3843072_KEY_LENGTH = 384;
class RSASHA3843072Verifier: public RSAVerifier<CryptoPP::SHA384, RSASHA3843072_KEY_LENGTH>
{
public:
RSASHA3843072Verifier (const uint8_t * signingKey): RSAVerifier (signingKey)
{
}
};
class RSASHA3843072Signer: public RSASigner<CryptoPP::SHA384>
{
public:
RSASHA3843072Signer (const uint8_t * signingPrivateKey):
RSASigner (signingPrivateKey, RSASHA3843072_KEY_LENGTH*2)
{
}
};
// RSA_SHA512_4096
const size_t RSASHA5124096_KEY_LENGTH = 512;
class RSASHA5124096Verifier: public RSAVerifier<CryptoPP::SHA512, RSASHA5124096_KEY_LENGTH>
{
public:
RSASHA5124096Verifier (const uint8_t * signingKey): RSAVerifier (signingKey)
{
}
};
class RSASHA5124096Signer: public RSASigner<CryptoPP::SHA512>
{
public:
RSASHA5124096Signer (const uint8_t * signingPrivateKey):
RSASigner (signingPrivateKey, RSASHA5124096_KEY_LENGTH*2)
{
}
};
// Raw verifiers
class RawVerifier
{
public:
virtual ~RawVerifier () {};
virtual void Update (const uint8_t * buf, size_t len) = 0;
virtual bool Verify (const uint8_t * signature) = 0;
};
template<typename Hash, size_t keyLen>
class RSARawVerifier: public RawVerifier
{
public:
RSARawVerifier (const uint8_t * signingKey):
n (signingKey, keyLen)
{
}
void Update (const uint8_t * buf, size_t len)
{
m_Hash.Update (buf, len);
}
bool Verify (const uint8_t * signature)
{
// RSA encryption first
CryptoPP::Integer enSig (a_exp_b_mod_c (CryptoPP::Integer (signature, keyLen),
CryptoPP::Integer (i2p::crypto::rsae), n)); // s^e mod n
uint8_t enSigBuf[keyLen];
enSig.Encode (enSigBuf, keyLen);
uint8_t digest[Hash::DIGESTSIZE];
m_Hash.Final (digest);
if ((int)keyLen < Hash::DIGESTSIZE) return false; // can't verify digest longer than key
// we assume digest is right aligned, at least for PKCS#1 v1.5 padding
return !memcmp (enSigBuf + (keyLen - Hash::DIGESTSIZE), digest, Hash::DIGESTSIZE);
}
private:
CryptoPP::Integer n; // RSA modulus
Hash m_Hash;
};
class RSASHA5124096RawVerifier: public RSARawVerifier<CryptoPP::SHA512, RSASHA5124096_KEY_LENGTH>
{
public:
RSASHA5124096RawVerifier (const uint8_t * signingKey): RSARawVerifier (signingKey)
{
}
};
}
}
#endif

View File

@ -1,721 +0,0 @@
#include <cryptopp/gzip.h>
#include "Log.h"
#include "RouterInfo.h"
#include "RouterContext.h"
#include "Tunnel.h"
#include "Timestamp.h"
#include "Destination.h"
#include "Streaming.h"
namespace i2p
{
namespace stream
{
Stream::Stream (boost::asio::io_service& service, StreamingDestination& local,
const i2p::data::LeaseSet& remote, int port): m_Service (service), m_SendStreamID (0),
m_SequenceNumber (0), m_LastReceivedSequenceNumber (-1), m_IsOpen (false),
m_IsReset (false), m_IsAckSendScheduled (false), m_LocalDestination (local),
m_RemoteLeaseSet (&remote), m_RoutingSession (nullptr), m_CurrentOutboundTunnel (nullptr),
m_ReceiveTimer (m_Service), m_ResendTimer (m_Service), m_AckSendTimer (m_Service),
m_NumSentBytes (0), m_NumReceivedBytes (0), m_Port (port)
{
m_RecvStreamID = i2p::context.GetRandomNumberGenerator ().GenerateWord32 ();
UpdateCurrentRemoteLease ();
}
Stream::Stream (boost::asio::io_service& service, StreamingDestination& local):
m_Service (service), m_SendStreamID (0), m_SequenceNumber (0), m_LastReceivedSequenceNumber (-1),
m_IsOpen (false), m_IsReset (false), m_IsAckSendScheduled (false), m_LocalDestination (local),
m_RemoteLeaseSet (nullptr), m_RoutingSession (nullptr), m_CurrentOutboundTunnel (nullptr),
m_ReceiveTimer (m_Service), m_ResendTimer (m_Service), m_AckSendTimer (m_Service),
m_NumSentBytes (0), m_NumReceivedBytes (0), m_Port (0)
{
m_RecvStreamID = i2p::context.GetRandomNumberGenerator ().GenerateWord32 ();
}
Stream::~Stream ()
{
m_AckSendTimer.cancel ();
while (!m_ReceiveQueue.empty ())
{
auto packet = m_ReceiveQueue.front ();
m_ReceiveQueue.pop ();
delete packet;
}
m_ReceiveTimer.cancel ();
for (auto it: m_SentPackets)
delete it;
m_SentPackets.clear ();
m_ResendTimer.cancel ();
for (auto it: m_SavedPackets)
delete it;
m_SavedPackets.clear ();
LogPrint (eLogDebug, "Stream deleted");
}
void Stream::HandleNextPacket (Packet * packet)
{
m_NumReceivedBytes += packet->GetLength ();
if (!m_SendStreamID)
m_SendStreamID = packet->GetReceiveStreamID ();
if (!packet->IsNoAck ()) // ack received
ProcessAck (packet);
int32_t receivedSeqn = packet->GetSeqn ();
bool isSyn = packet->IsSYN ();
if (!receivedSeqn && !isSyn)
{
// plain ack
LogPrint (eLogDebug, "Plain ACK received");
delete packet;
return;
}
LogPrint (eLogDebug, "Received seqn=", receivedSeqn);
if (isSyn || receivedSeqn == m_LastReceivedSequenceNumber + 1)
{
// we have received next in sequence message
ProcessPacket (packet);
// we should also try stored messages if any
for (auto it = m_SavedPackets.begin (); it != m_SavedPackets.end ();)
{
if ((*it)->GetSeqn () == (uint32_t)(m_LastReceivedSequenceNumber + 1))
{
Packet * savedPacket = *it;
m_SavedPackets.erase (it++);
ProcessPacket (savedPacket);
}
else
break;
}
// schedule ack for last message
if (m_IsOpen)
{
if (!m_IsAckSendScheduled)
{
m_IsAckSendScheduled = true;
m_AckSendTimer.expires_from_now (boost::posix_time::milliseconds(ACK_SEND_TIMEOUT));
m_AckSendTimer.async_wait (std::bind (&Stream::HandleAckSendTimer,
shared_from_this (), std::placeholders::_1));
}
}
else if (isSyn)
// we have to send SYN back to incoming connection
Send (nullptr, 0); // also sets m_IsOpen
}
else
{
if (receivedSeqn <= m_LastReceivedSequenceNumber)
{
// we have received duplicate. Most likely our outbound tunnel is dead
LogPrint (eLogWarning, "Duplicate message ", receivedSeqn, " received");
m_CurrentOutboundTunnel = nullptr; // pick another outbound tunnel
UpdateCurrentRemoteLease (); // pick another lease
SendQuickAck (); // resend ack for previous message again
delete packet; // packet dropped
}
else
{
LogPrint (eLogWarning, "Missing messages from ", m_LastReceivedSequenceNumber + 1, " to ", receivedSeqn - 1);
// save message and wait for missing message again
SavePacket (packet);
// send NACKs for missing messages ASAP
if (m_IsAckSendScheduled)
{
m_IsAckSendScheduled = false;
m_AckSendTimer.cancel ();
}
SendQuickAck ();
}
}
}
void Stream::SavePacket (Packet * packet)
{
m_SavedPackets.insert (packet);
}
void Stream::ProcessPacket (Packet * packet)
{
// process flags
uint32_t receivedSeqn = packet->GetSeqn ();
uint16_t flags = packet->GetFlags ();
LogPrint (eLogDebug, "Process seqn=", receivedSeqn, ", flags=", flags);
const uint8_t * optionData = packet->GetOptionData ();
if (flags & PACKET_FLAG_SYNCHRONIZE)
LogPrint (eLogDebug, "Synchronize");
if (flags & PACKET_FLAG_DELAY_REQUESTED)
{
optionData += 2;
}
if (flags & PACKET_FLAG_FROM_INCLUDED)
{
optionData += m_RemoteIdentity.FromBuffer (optionData, packet->GetOptionSize ());
LogPrint (eLogInfo, "From identity ", m_RemoteIdentity.GetIdentHash ().ToBase64 ());
if (!m_RemoteLeaseSet)
LogPrint (eLogDebug, "Incoming stream from ", m_RemoteIdentity.GetIdentHash ().ToBase64 ());
}
if (flags & PACKET_FLAG_MAX_PACKET_SIZE_INCLUDED)
{
uint16_t maxPacketSize = be16toh (*(uint16_t *)optionData);
LogPrint (eLogDebug, "Max packet size ", maxPacketSize);
optionData += 2;
}
if (flags & PACKET_FLAG_SIGNATURE_INCLUDED)
{
LogPrint (eLogDebug, "Signature");
uint8_t signature[256];
auto signatureLen = m_RemoteIdentity.GetSignatureLen ();
memcpy (signature, optionData, signatureLen);
memset (const_cast<uint8_t *>(optionData), 0, signatureLen);
if (!m_RemoteIdentity.Verify (packet->GetBuffer (), packet->GetLength (), signature))
{
LogPrint (eLogError, "Signature verification failed");
Close ();
flags |= PACKET_FLAG_CLOSE;
}
memcpy (const_cast<uint8_t *>(optionData), signature, signatureLen);
optionData += signatureLen;
}
packet->offset = packet->GetPayload () - packet->buf;
if (packet->GetLength () > 0)
{
m_ReceiveQueue.push (packet);
m_ReceiveTimer.cancel ();
}
else
delete packet;
m_LastReceivedSequenceNumber = receivedSeqn;
if (flags & PACKET_FLAG_CLOSE)
{
LogPrint (eLogInfo, "Closed");
Close ();
m_IsOpen = false;
m_IsReset = true;
}
}
void Stream::ProcessAck (Packet * packet)
{
uint32_t ackThrough = packet->GetAckThrough ();
int nackCount = packet->GetNACKCount ();
for (auto it = m_SentPackets.begin (); it != m_SentPackets.end ();)
{
auto seqn = (*it)->GetSeqn ();
if (seqn <= ackThrough)
{
if (nackCount > 0)
{
bool nacked = false;
for (int i = 0; i < nackCount; i++)
if (seqn == packet->GetNACK (i))
{
nacked = true;
break;
}
if (nacked)
{
LogPrint (eLogDebug, "Packet ", seqn, " NACK");
it++;
continue;
}
}
auto sentPacket = *it;
LogPrint (eLogDebug, "Packet ", seqn, " acknowledged");
m_SentPackets.erase (it++);
delete sentPacket;
}
else
break;
}
if (m_SentPackets.empty ())
m_ResendTimer.cancel ();
}
size_t Stream::Send (const uint8_t * buf, size_t len)
{
bool isNoAck = m_LastReceivedSequenceNumber < 0; // first packet
std::vector<Packet *> packets;
while (!m_IsOpen || len > 0)
{
Packet * p = new Packet ();
uint8_t * packet = p->GetBuffer ();
// TODO: implement setters
size_t size = 0;
*(uint32_t *)(packet + size) = htobe32 (m_SendStreamID);
size += 4; // sendStreamID
*(uint32_t *)(packet + size) = htobe32 (m_RecvStreamID);
size += 4; // receiveStreamID
*(uint32_t *)(packet + size) = htobe32 (m_SequenceNumber++);
size += 4; // sequenceNum
if (isNoAck)
*(uint32_t *)(packet + size) = htobe32 (m_LastReceivedSequenceNumber);
else
*(uint32_t *)(packet + size) = 0;
size += 4; // ack Through
packet[size] = 0;
size++; // NACK count
size++; // resend delay
if (!m_IsOpen)
{
// initial packet
m_IsOpen = true; m_IsReset = false;
uint16_t flags = PACKET_FLAG_SYNCHRONIZE | PACKET_FLAG_FROM_INCLUDED |
PACKET_FLAG_SIGNATURE_INCLUDED | PACKET_FLAG_MAX_PACKET_SIZE_INCLUDED;
if (isNoAck) flags |= PACKET_FLAG_NO_ACK;
*(uint16_t *)(packet + size) = htobe16 (flags);
size += 2; // flags
size_t identityLen = m_LocalDestination.GetOwner ().GetIdentity ().GetFullLen ();
size_t signatureLen = m_LocalDestination.GetOwner ().GetIdentity ().GetSignatureLen ();
*(uint16_t *)(packet + size) = htobe16 (identityLen + signatureLen + 2); // identity + signature + packet size
size += 2; // options size
m_LocalDestination.GetOwner ().GetIdentity ().ToBuffer (packet + size, identityLen);
size += identityLen; // from
*(uint16_t *)(packet + size) = htobe16 (STREAMING_MTU);
size += 2; // max packet size
uint8_t * signature = packet + size; // set it later
memset (signature, 0, signatureLen); // zeroes for now
size += signatureLen; // signature
size_t sentLen = STREAMING_MTU - size;
if (len < sentLen) sentLen = len;
memcpy (packet + size, buf, sentLen);
buf += sentLen;
len -= sentLen;
size += sentLen; // payload
m_LocalDestination.GetOwner ().Sign (packet, size, signature);
}
else
{
// follow on packet
*(uint16_t *)(packet + size) = 0;
size += 2; // flags
*(uint16_t *)(packet + size) = 0; // no options
size += 2; // options size
size_t sentLen = STREAMING_MTU - size;
if (len < sentLen) sentLen = len;
memcpy (packet + size, buf, sentLen);
buf += sentLen;
len -= sentLen;
size += sentLen; // payload
}
p->len = size;
packets.push_back (p);
}
if (packets.size () > 0)
m_Service.post (std::bind (&Stream::PostPackets, shared_from_this (), packets));
return len;
}
void Stream::SendQuickAck ()
{
int32_t lastReceivedSeqn = m_LastReceivedSequenceNumber;
if (!m_SavedPackets.empty ())
{
int32_t seqn = (*m_SavedPackets.rbegin ())->GetSeqn ();
if (seqn > lastReceivedSeqn) lastReceivedSeqn = seqn;
}
if (lastReceivedSeqn < 0)
{
LogPrint (eLogError, "No packets have been received yet");
return;
}
Packet p;
uint8_t * packet = p.GetBuffer ();
size_t size = 0;
*(uint32_t *)(packet + size) = htobe32 (m_SendStreamID);
size += 4; // sendStreamID
*(uint32_t *)(packet + size) = htobe32 (m_RecvStreamID);
size += 4; // receiveStreamID
*(uint32_t *)(packet + size) = 0; // this is plain Ack message
size += 4; // sequenceNum
*(uint32_t *)(packet + size) = htobe32 (lastReceivedSeqn);
size += 4; // ack Through
if (lastReceivedSeqn > m_LastReceivedSequenceNumber)
{
// fill NACKs
uint8_t * nacks = packet + size + 1;
uint8_t numNacks = 0;
auto nextSeqn = m_LastReceivedSequenceNumber + 1;
for (auto it: m_SavedPackets)
{
auto seqn = it->GetSeqn ();
for (uint32_t i = nextSeqn; i < seqn; i++)
{
*(uint32_t *)nacks = htobe32 (i);
nacks += 4;
numNacks++;
}
nextSeqn = seqn + 1;
}
packet[size] = numNacks;
size++; // NACK count
size += numNacks*4; // NACKs
}
else
{
// No NACKs
packet[size] = 0;
size++; // NACK count
}
size++; // resend delay
*(uint16_t *)(packet + size) = 0; // nof flags set
size += 2; // flags
*(uint16_t *)(packet + size) = 0; // no options
size += 2; // options size
p.len = size;
SendPackets (std::vector<Packet *> { &p });
LogPrint ("Quick Ack sent");
}
void Stream::Close ()
{
if (m_IsOpen)
{
m_IsOpen = false;
Packet * p = new Packet ();
uint8_t * packet = p->GetBuffer ();
size_t size = 0;
*(uint32_t *)(packet + size) = htobe32 (m_SendStreamID);
size += 4; // sendStreamID
*(uint32_t *)(packet + size) = htobe32 (m_RecvStreamID);
size += 4; // receiveStreamID
*(uint32_t *)(packet + size) = htobe32 (m_SequenceNumber++);
size += 4; // sequenceNum
*(uint32_t *)(packet + size) = htobe32 (m_LastReceivedSequenceNumber);
size += 4; // ack Through
packet[size] = 0;
size++; // NACK count
size++; // resend delay
*(uint16_t *)(packet + size) = htobe16 (PACKET_FLAG_CLOSE | PACKET_FLAG_SIGNATURE_INCLUDED);
size += 2; // flags
size_t signatureLen = m_LocalDestination.GetOwner ().GetIdentity ().GetSignatureLen ();
*(uint16_t *)(packet + size) = htobe16 (signatureLen); // signature only
size += 2; // options size
uint8_t * signature = packet + size;
memset (packet + size, 0, signatureLen);
size += signatureLen; // signature
m_LocalDestination.GetOwner ().Sign (packet, size, signature);
p->len = size;
m_Service.post (std::bind (&Stream::SendPacket, shared_from_this (), p));
LogPrint ("FIN sent");
m_ReceiveTimer.cancel ();
m_LocalDestination.DeleteStream (shared_from_this ());
}
}
size_t Stream::ConcatenatePackets (uint8_t * buf, size_t len)
{
size_t pos = 0;
while (pos < len && !m_ReceiveQueue.empty ())
{
Packet * packet = m_ReceiveQueue.front ();
size_t l = std::min (packet->GetLength (), len - pos);
memcpy (buf + pos, packet->GetBuffer (), l);
pos += l;
packet->offset += l;
if (!packet->GetLength ())
{
m_ReceiveQueue.pop ();
delete packet;
}
}
return pos;
}
bool Stream::SendPacket (Packet * packet)
{
if (packet)
{
if (m_IsAckSendScheduled)
{
m_IsAckSendScheduled = false;
m_AckSendTimer.cancel ();
}
SendPackets (std::vector<Packet *> { packet });
if (m_IsOpen)
{
bool isEmpty = m_SentPackets.empty ();
m_SentPackets.insert (packet);
if (isEmpty)
ScheduleResend ();
}
else
delete packet;
return true;
}
else
return false;
}
void Stream::PostPackets (const std::vector<Packet *> packets)
{
if (m_IsOpen)
{
if (packets.size () > 0)
{
m_IsAckSendScheduled = false;
m_AckSendTimer.cancel ();
}
bool isEmpty = m_SentPackets.empty ();
for (auto it: packets)
m_SentPackets.insert (it);
SendPackets (packets);
if (isEmpty)
ScheduleResend ();
}
else
{
// delete
for (auto it: packets)
delete it;
}
}
void Stream::SendPackets (const std::vector<Packet *>& packets)
{
if (!m_RemoteLeaseSet)
{
UpdateCurrentRemoteLease ();
if (!m_RemoteLeaseSet)
{
LogPrint ("Can't send packets. Missing remote LeaseSet");
return;
}
}
m_CurrentOutboundTunnel = m_LocalDestination.GetOwner ().GetTunnelPool ()->GetNextOutboundTunnel (m_CurrentOutboundTunnel);
if (!m_CurrentOutboundTunnel)
{
LogPrint ("No outbound tunnels in the pool");
return;
}
auto ts = i2p::util::GetMillisecondsSinceEpoch ();
if (ts >= m_CurrentRemoteLease.endDate)
UpdateCurrentRemoteLease ();
if (ts < m_CurrentRemoteLease.endDate)
{
std::vector<i2p::tunnel::TunnelMessageBlock> msgs;
for (auto it: packets)
{
auto msg = m_RoutingSession->WrapSingleMessage (CreateDataMessage (it->GetBuffer (), it->GetLength ()));
msgs.push_back (i2p::tunnel::TunnelMessageBlock
{
i2p::tunnel::eDeliveryTypeTunnel,
m_CurrentRemoteLease.tunnelGateway, m_CurrentRemoteLease.tunnelID,
msg
});
m_NumSentBytes += it->GetLength ();
}
m_CurrentOutboundTunnel->SendTunnelDataMsg (msgs);
}
else
LogPrint ("All leases are expired");
}
void Stream::ScheduleResend ()
{
m_ResendTimer.cancel ();
m_ResendTimer.expires_from_now (boost::posix_time::seconds(RESEND_TIMEOUT));
m_ResendTimer.async_wait (std::bind (&Stream::HandleResendTimer,
shared_from_this (), std::placeholders::_1));
}
void Stream::HandleResendTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
std::vector<Packet *> packets;
for (auto it : m_SentPackets)
{
it->numResendAttempts++;
if (it->numResendAttempts <= MAX_NUM_RESEND_ATTEMPTS)
packets.push_back (it);
else
{
LogPrint (eLogWarning, "Packet ", it->GetSeqn (), "was not ACKed after ", MAX_NUM_RESEND_ATTEMPTS, " attempts. Terminate");
m_IsOpen = false;
m_IsReset = true;
m_ReceiveTimer.cancel ();
return;
}
}
if (packets.size () > 0)
{
m_CurrentOutboundTunnel = nullptr; // pick another outbound tunnel
UpdateCurrentRemoteLease (); // pick another lease
SendPackets (packets);
}
ScheduleResend ();
}
}
void Stream::HandleAckSendTimer (const boost::system::error_code& ecode)
{
if (m_IsAckSendScheduled)
{
if (m_IsOpen)
SendQuickAck ();
m_IsAckSendScheduled = false;
}
}
void Stream::UpdateCurrentRemoteLease ()
{
if (!m_RemoteLeaseSet)
{
m_RemoteLeaseSet = m_LocalDestination.GetOwner ().FindLeaseSet (m_RemoteIdentity.GetIdentHash ());
if (!m_RemoteLeaseSet)
LogPrint ("LeaseSet ", m_RemoteIdentity.GetIdentHash ().ToBase64 (), " not found");
}
if (m_RemoteLeaseSet)
{
if (!m_RoutingSession)
m_RoutingSession = m_LocalDestination.GetOwner ().GetRoutingSession (*m_RemoteLeaseSet, 32);
auto leases = m_RemoteLeaseSet->GetNonExpiredLeases ();
if (!leases.empty ())
{
uint32_t i = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, leases.size () - 1);
m_CurrentRemoteLease = leases[i];
}
else
{
m_RemoteLeaseSet = m_LocalDestination.GetOwner ().FindLeaseSet (m_RemoteIdentity.GetIdentHash ()); // re-request expired
m_CurrentRemoteLease.endDate = 0;
}
}
else
m_CurrentRemoteLease.endDate = 0;
}
I2NPMessage * Stream::CreateDataMessage (const uint8_t * payload, size_t len)
{
I2NPMessage * msg = NewI2NPShortMessage ();
CryptoPP::Gzip compressor;
if (len <= i2p::stream::COMPRESSION_THRESHOLD_SIZE)
compressor.SetDeflateLevel (CryptoPP::Gzip::MIN_DEFLATE_LEVEL);
else
compressor.SetDeflateLevel (CryptoPP::Gzip::DEFAULT_DEFLATE_LEVEL);
compressor.Put (payload, len);
compressor.MessageEnd();
int size = compressor.MaxRetrievable ();
uint8_t * buf = msg->GetPayload ();
*(uint32_t *)buf = htobe32 (size); // length
buf += 4;
compressor.Get (buf, size);
*(uint16_t *)(buf + 4) = 0; // source port
*(uint16_t *)(buf + 6) = htobe16 (m_Port); // destination port
buf[9] = i2p::client::PROTOCOL_TYPE_STREAMING; // streaming protocol
msg->len += size + 4;
FillI2NPMessageHeader (msg, eI2NPData);
return msg;
}
void StreamingDestination::Start ()
{
}
void StreamingDestination::Stop ()
{
ResetAcceptor ();
{
std::unique_lock<std::mutex> l(m_StreamsMutex);
m_Streams.clear ();
}
}
void StreamingDestination::HandleNextPacket (Packet * packet)
{
uint32_t sendStreamID = packet->GetSendStreamID ();
if (sendStreamID)
{
auto it = m_Streams.find (sendStreamID);
if (it != m_Streams.end ())
it->second->HandleNextPacket (packet);
else
{
LogPrint ("Unknown stream ", sendStreamID);
delete packet;
}
}
else // new incoming stream
{
auto incomingStream = CreateNewIncomingStream ();
incomingStream->HandleNextPacket (packet);
if (m_Acceptor != nullptr)
m_Acceptor (incomingStream);
else
{
LogPrint ("Acceptor for incoming stream is not set");
DeleteStream (incomingStream);
}
}
}
std::shared_ptr<Stream> StreamingDestination::CreateNewOutgoingStream (const i2p::data::LeaseSet& remote, int port)
{
auto s = std::make_shared<Stream> (m_Owner.GetService (), *this, remote, port);
std::unique_lock<std::mutex> l(m_StreamsMutex);
m_Streams[s->GetRecvStreamID ()] = s;
return s;
}
std::shared_ptr<Stream> StreamingDestination::CreateNewIncomingStream ()
{
auto s = std::make_shared<Stream> (m_Owner.GetService (), *this);
std::unique_lock<std::mutex> l(m_StreamsMutex);
m_Streams[s->GetRecvStreamID ()] = s;
return s;
}
void StreamingDestination::DeleteStream (std::shared_ptr<Stream> stream)
{
if (stream)
{
std::unique_lock<std::mutex> l(m_StreamsMutex);
auto it = m_Streams.find (stream->GetRecvStreamID ());
if (it != m_Streams.end ())
m_Streams.erase (it);
}
}
void StreamingDestination::HandleDataMessagePayload (const uint8_t * buf, size_t len)
{
// unzip it
CryptoPP::Gunzip decompressor;
decompressor.Put (buf, len);
decompressor.MessageEnd();
Packet * uncompressed = new Packet;
uncompressed->offset = 0;
uncompressed->len = decompressor.MaxRetrievable ();
if (uncompressed->len <= MAX_PACKET_SIZE)
{
decompressor.Get (uncompressed->buf, uncompressed->len);
HandleNextPacket (uncompressed);
}
else
{
LogPrint ("Received packet size ", uncompressed->len, " exceeds max packet size. Skipped");
delete uncompressed;
}
}
}
}

View File

@ -1,236 +0,0 @@
#ifndef STREAMING_H__
#define STREAMING_H__
#include <inttypes.h>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <functional>
#include <memory>
#include <boost/asio.hpp>
#include "I2PEndian.h"
#include "Identity.h"
#include "LeaseSet.h"
#include "I2NPProtocol.h"
#include "Garlic.h"
#include "Tunnel.h"
namespace i2p
{
namespace client
{
class ClientDestination;
}
namespace stream
{
const uint16_t PACKET_FLAG_SYNCHRONIZE = 0x0001;
const uint16_t PACKET_FLAG_CLOSE = 0x0002;
const uint16_t PACKET_FLAG_RESET = 0x0004;
const uint16_t PACKET_FLAG_SIGNATURE_INCLUDED = 0x0008;
const uint16_t PACKET_FLAG_SIGNATURE_REQUESTED = 0x0010;
const uint16_t PACKET_FLAG_FROM_INCLUDED = 0x0020;
const uint16_t PACKET_FLAG_DELAY_REQUESTED = 0x0040;
const uint16_t PACKET_FLAG_MAX_PACKET_SIZE_INCLUDED = 0x0080;
const uint16_t PACKET_FLAG_PROFILE_INTERACTIVE = 0x0100;
const uint16_t PACKET_FLAG_ECHO = 0x0200;
const uint16_t PACKET_FLAG_NO_ACK = 0x0400;
const size_t STREAMING_MTU = 1730;
const size_t MAX_PACKET_SIZE = 4096;
const size_t COMPRESSION_THRESHOLD_SIZE = 66;
const int RESEND_TIMEOUT = 10; // in seconds
const int ACK_SEND_TIMEOUT = 200; // in milliseconds
const int MAX_NUM_RESEND_ATTEMPTS = 5;
struct Packet
{
size_t len, offset;
uint8_t buf[MAX_PACKET_SIZE];
int numResendAttempts;
Packet (): len (0), offset (0), numResendAttempts (0) {};
uint8_t * GetBuffer () { return buf + offset; };
size_t GetLength () const { return len - offset; };
uint32_t GetSendStreamID () const { return be32toh (*(uint32_t *)buf); };
uint32_t GetReceiveStreamID () const { return be32toh (*(uint32_t *)(buf + 4)); };
uint32_t GetSeqn () const { return be32toh (*(uint32_t *)(buf + 8)); };
uint32_t GetAckThrough () const { return be32toh (*(uint32_t *)(buf + 12)); };
uint8_t GetNACKCount () const { return buf[16]; };
uint32_t GetNACK (int i) const { return be32toh (((uint32_t *)(buf + 17))[i]); };
const uint8_t * GetOption () const { return buf + 17 + GetNACKCount ()*4 + 3; }; // 3 = resendDelay + flags
uint16_t GetFlags () const { return be16toh (*(uint16_t *)(GetOption () - 2)); };
uint16_t GetOptionSize () const { return be16toh (*(uint16_t *)GetOption ()); };
const uint8_t * GetOptionData () const { return GetOption () + 2; };
const uint8_t * GetPayload () const { return GetOptionData () + GetOptionSize (); };
bool IsSYN () const { return GetFlags () & PACKET_FLAG_SYNCHRONIZE; };
bool IsNoAck () const { return GetFlags () & PACKET_FLAG_NO_ACK; };
};
struct PacketCmp
{
bool operator() (const Packet * p1, const Packet * p2) const
{
return p1->GetSeqn () < p2->GetSeqn ();
};
};
class StreamingDestination;
class Stream: public std::enable_shared_from_this<Stream>
{
public:
Stream (boost::asio::io_service& service, StreamingDestination& local,
const i2p::data::LeaseSet& remote, int port = 0); // outgoing
Stream (boost::asio::io_service& service, StreamingDestination& local); // incoming
~Stream ();
uint32_t GetSendStreamID () const { return m_SendStreamID; };
uint32_t GetRecvStreamID () const { return m_RecvStreamID; };
const i2p::data::LeaseSet * GetRemoteLeaseSet () const { return m_RemoteLeaseSet; };
const i2p::data::IdentityEx& GetRemoteIdentity () const { return m_RemoteIdentity; };
bool IsOpen () const { return m_IsOpen; };
bool IsEstablished () const { return m_SendStreamID; };
StreamingDestination& GetLocalDestination () { return m_LocalDestination; };
void HandleNextPacket (Packet * packet);
size_t Send (const uint8_t * buf, size_t len);
template<typename Buffer, typename ReceiveHandler>
void AsyncReceive (const Buffer& buffer, ReceiveHandler handler, int timeout = 0);
void Close ();
size_t GetNumSentBytes () const { return m_NumSentBytes; };
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
size_t GetSendQueueSize () const { return m_SentPackets.size (); };
size_t GetReceiveQueueSize () const { return m_ReceiveQueue.size (); };
private:
void SendQuickAck ();
bool SendPacket (Packet * packet);
void PostPackets (const std::vector<Packet *> packets);
void SendPackets (const std::vector<Packet *>& packets);
void SavePacket (Packet * packet);
void ProcessPacket (Packet * packet);
void ProcessAck (Packet * packet);
size_t ConcatenatePackets (uint8_t * buf, size_t len);
void UpdateCurrentRemoteLease ();
template<typename Buffer, typename ReceiveHandler>
void HandleReceiveTimer (const boost::system::error_code& ecode, const Buffer& buffer, ReceiveHandler handler);
void ScheduleResend ();
void HandleResendTimer (const boost::system::error_code& ecode);
void HandleAckSendTimer (const boost::system::error_code& ecode);
I2NPMessage * CreateDataMessage (const uint8_t * payload, size_t len);
private:
boost::asio::io_service& m_Service;
uint32_t m_SendStreamID, m_RecvStreamID, m_SequenceNumber;
int32_t m_LastReceivedSequenceNumber;
bool m_IsOpen, m_IsReset, m_IsAckSendScheduled;
StreamingDestination& m_LocalDestination;
i2p::data::IdentityEx m_RemoteIdentity;
const i2p::data::LeaseSet * m_RemoteLeaseSet;
i2p::garlic::GarlicRoutingSession * m_RoutingSession;
i2p::data::Lease m_CurrentRemoteLease;
i2p::tunnel::OutboundTunnel * m_CurrentOutboundTunnel;
std::queue<Packet *> m_ReceiveQueue;
std::set<Packet *, PacketCmp> m_SavedPackets;
std::set<Packet *, PacketCmp> m_SentPackets;
boost::asio::deadline_timer m_ReceiveTimer, m_ResendTimer, m_AckSendTimer;
size_t m_NumSentBytes, m_NumReceivedBytes;
uint16_t m_Port;
};
class StreamingDestination
{
public:
typedef std::function<void (std::shared_ptr<Stream>)> Acceptor;
StreamingDestination (i2p::client::ClientDestination& owner): m_Owner (owner) {};
~StreamingDestination () {};
void Start ();
void Stop ();
std::shared_ptr<Stream> CreateNewOutgoingStream (const i2p::data::LeaseSet& remote, int port = 0);
void DeleteStream (std::shared_ptr<Stream> stream);
void SetAcceptor (const Acceptor& acceptor) { m_Acceptor = acceptor; };
void ResetAcceptor () { m_Acceptor = nullptr; };
bool IsAcceptorSet () const { return m_Acceptor != nullptr; };
i2p::client::ClientDestination& GetOwner () { return m_Owner; };
void HandleDataMessagePayload (const uint8_t * buf, size_t len);
private:
void HandleNextPacket (Packet * packet);
std::shared_ptr<Stream> CreateNewIncomingStream ();
private:
i2p::client::ClientDestination& m_Owner;
std::mutex m_StreamsMutex;
std::map<uint32_t, std::shared_ptr<Stream> > m_Streams;
Acceptor m_Acceptor;
public:
// for HTTP only
const decltype(m_Streams)& GetStreams () const { return m_Streams; };
};
//-------------------------------------------------
template<typename Buffer, typename ReceiveHandler>
void Stream::AsyncReceive (const Buffer& buffer, ReceiveHandler handler, int timeout)
{
if (!m_ReceiveQueue.empty ())
{
auto s = shared_from_this();
m_Service.post ([=](void) { s->HandleReceiveTimer (
boost::asio::error::make_error_code (boost::asio::error::operation_aborted),
buffer, handler); });
}
else
{
m_ReceiveTimer.expires_from_now (boost::posix_time::seconds(timeout));
auto s = shared_from_this();
m_ReceiveTimer.async_wait ([=](const boost::system::error_code& ecode)
{ s->HandleReceiveTimer (ecode, buffer, handler); });
}
}
template<typename Buffer, typename ReceiveHandler>
void Stream::HandleReceiveTimer (const boost::system::error_code& ecode, const Buffer& buffer, ReceiveHandler handler)
{
size_t received = ConcatenatePackets (boost::asio::buffer_cast<uint8_t *>(buffer), boost::asio::buffer_size(buffer));
if (ecode == boost::asio::error::operation_aborted)
{
// timeout not expired
if (m_IsOpen)
// no error
handler (boost::system::error_code (), received);
else
// socket closed
handler (m_IsReset ? boost::asio::error::make_error_code (boost::asio::error::connection_reset) :
boost::asio::error::make_error_code (boost::asio::error::operation_aborted), 0);
}
else
// timeout expired
handler (boost::asio::error::make_error_code (boost::asio::error::timed_out), received);
}
}
}
#endif

View File

@ -1,32 +0,0 @@
#ifndef TIMESTAMP_H__
#define TIMESTAMP_H__
#include <inttypes.h>
#include <chrono>
namespace i2p
{
namespace util
{
inline uint64_t GetMillisecondsSinceEpoch ()
{
return std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::system_clock::now().time_since_epoch()).count ();
}
inline uint32_t GetHoursSinceEpoch ()
{
return std::chrono::duration_cast<std::chrono::hours>(
std::chrono::system_clock::now().time_since_epoch()).count ();
}
inline uint64_t GetSecondsSinceEpoch ()
{
return std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::system_clock::now().time_since_epoch()).count ();
}
}
}
#endif

View File

@ -1,85 +0,0 @@
#include <string.h>
#include "I2PEndian.h"
#include "Log.h"
#include "RouterContext.h"
#include "I2NPProtocol.h"
#include "Tunnel.h"
#include "Transports.h"
#include "TransitTunnel.h"
namespace i2p
{
namespace tunnel
{
TransitTunnel::TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
m_TunnelID (receiveTunnelID), m_NextTunnelID (nextTunnelID),
m_NextIdent (nextIdent), m_NumTransmittedBytes (0)
{
m_Encryption.SetKeys (layerKey, ivKey);
}
void TransitTunnel::EncryptTunnelMsg (I2NPMessage * tunnelMsg)
{
m_Encryption.Encrypt (tunnelMsg->GetPayload () + 4);
}
void TransitTunnel::HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg)
{
EncryptTunnelMsg (tunnelMsg);
LogPrint ("TransitTunnel: ",m_TunnelID,"->", m_NextTunnelID);
m_NumTransmittedBytes += tunnelMsg->GetLength ();
*(uint32_t *)(tunnelMsg->GetPayload ()) = htobe32 (m_NextTunnelID);
FillI2NPMessageHeader (tunnelMsg, eI2NPTunnelData);
i2p::transport::transports.SendMessage (m_NextIdent, tunnelMsg);
}
void TransitTunnel::SendTunnelDataMsg (i2p::I2NPMessage * msg)
{
LogPrint ("We are not a gateway for transit tunnel ", m_TunnelID);
i2p::DeleteI2NPMessage (msg);
}
void TransitTunnelGateway::SendTunnelDataMsg (i2p::I2NPMessage * msg)
{
TunnelMessageBlock block;
block.deliveryType = eDeliveryTypeLocal;
block.data = msg;
std::unique_lock<std::mutex> l(m_SendMutex);
m_Gateway.SendTunnelDataMsg (block);
}
void TransitTunnelEndpoint::HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg)
{
EncryptTunnelMsg (tunnelMsg);
LogPrint ("TransitTunnel endpoint for ", GetTunnelID ());
m_Endpoint.HandleDecryptedTunnelDataMsg (tunnelMsg);
}
TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint)
{
if (isEndpoint)
{
LogPrint ("TransitTunnel endpoint: ", receiveTunnelID, " created");
return new TransitTunnelEndpoint (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
else if (isGateway)
{
LogPrint ("TransitTunnel gateway: ", receiveTunnelID, " created");
return new TransitTunnelGateway (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
else
{
LogPrint ("TransitTunnel: ", receiveTunnelID, "->", nextTunnelID, " created");
return new TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey);
}
}
}
}

View File

@ -1,88 +0,0 @@
#ifndef TRANSIT_TUNNEL_H__
#define TRANSIT_TUNNEL_H__
#include <inttypes.h>
#include <mutex>
#include "aes.h"
#include "I2NPProtocol.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
#include "TunnelBase.h"
namespace i2p
{
namespace tunnel
{
class TransitTunnel: public TunnelBase // tunnel patricipant
{
public:
TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey);
virtual void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
virtual void SendTunnelDataMsg (i2p::I2NPMessage * msg);
virtual size_t GetNumTransmittedBytes () const { return m_NumTransmittedBytes; };
uint32_t GetTunnelID () const { return m_TunnelID; };
// implements TunnelBase
void EncryptTunnelMsg (I2NPMessage * tunnelMsg);
uint32_t GetNextTunnelID () const { return m_NextTunnelID; };
const i2p::data::IdentHash& GetNextIdentHash () const { return m_NextIdent; };
private:
uint32_t m_TunnelID, m_NextTunnelID;
i2p::data::IdentHash m_NextIdent;
size_t m_NumTransmittedBytes;
i2p::crypto::TunnelEncryption m_Encryption;
};
class TransitTunnelGateway: public TransitTunnel
{
public:
TransitTunnelGateway (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
layerKey, ivKey), m_Gateway(this) {};
void SendTunnelDataMsg (i2p::I2NPMessage * msg);
size_t GetNumTransmittedBytes () const { return m_Gateway.GetNumSentBytes (); };
private:
std::mutex m_SendMutex;
TunnelGateway m_Gateway;
};
class TransitTunnelEndpoint: public TransitTunnel
{
public:
TransitTunnelEndpoint (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey),
m_Endpoint (false) {}; // transit endpoint is always outbound
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
size_t GetNumTransmittedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }
private:
TunnelEndpoint m_Endpoint;
};
TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint);
}
}
#endif

View File

@ -1,76 +0,0 @@
#ifndef TRANSPORT_SESSION_H__
#define TRANSPORT_SESSION_H__
#include <inttypes.h>
#include <iostream>
#include <memory>
#include "Identity.h"
#include "RouterInfo.h"
namespace i2p
{
namespace transport
{
struct DHKeysPair // transient keys for transport sessions
{
uint8_t publicKey[256];
uint8_t privateKey[256];
};
class SignedData
{
public:
SignedData () {};
void Insert (const uint8_t * buf, size_t len)
{
m_Stream.write ((char *)buf, len);
}
template<typename T>
void Insert (T t)
{
m_Stream.write ((char *)&t, sizeof (T));
}
bool Verify (const i2p::data::IdentityEx& ident, const uint8_t * signature) const
{
return ident.Verify ((const uint8_t *)m_Stream.str ().c_str (), m_Stream.str ().size (), signature);
}
void Sign (const i2p::data::PrivateKeys& keys, uint8_t * signature) const
{
keys.Sign ((const uint8_t *)m_Stream.str ().c_str (), m_Stream.str ().size (), signature);
}
private:
std::stringstream m_Stream;
};
class TransportSession
{
public:
TransportSession (std::shared_ptr<const i2p::data::RouterInfo> in_RemoteRouter):
m_RemoteRouter (in_RemoteRouter), m_DHKeysPair (nullptr)
{
if (m_RemoteRouter)
m_RemoteIdentity = m_RemoteRouter->GetRouterIdentity ();
}
virtual ~TransportSession () { delete m_DHKeysPair; };
std::shared_ptr<const i2p::data::RouterInfo> GetRemoteRouter () { return m_RemoteRouter; };
const i2p::data::IdentityEx& GetRemoteIdentity () { return m_RemoteIdentity; };
protected:
std::shared_ptr<const i2p::data::RouterInfo> m_RemoteRouter;
i2p::data::IdentityEx m_RemoteIdentity;
DHKeysPair * m_DHKeysPair; // X - for client and Y - for server
};
}
}
#endif

View File

@ -1,401 +0,0 @@
#include <cryptopp/dh.h>
#include <boost/bind.hpp>
#include "Log.h"
#include "CryptoConst.h"
#include "RouterContext.h"
#include "I2NPProtocol.h"
#include "NetDb.h"
#include "Transports.h"
using namespace i2p::data;
namespace i2p
{
namespace transport
{
DHKeysPairSupplier::DHKeysPairSupplier (int size):
m_QueueSize (size), m_IsRunning (false), m_Thread (nullptr)
{
}
DHKeysPairSupplier::~DHKeysPairSupplier ()
{
Stop ();
}
void DHKeysPairSupplier::Start ()
{
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&DHKeysPairSupplier::Run, this));
}
void DHKeysPairSupplier::Stop ()
{
m_IsRunning = false;
m_Acquired.notify_one ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = 0;
}
}
void DHKeysPairSupplier::Run ()
{
while (m_IsRunning)
{
int num;
while ((num = m_QueueSize - m_Queue.size ()) > 0)
CreateDHKeysPairs (num);
std::unique_lock<std::mutex> l(m_AcquiredMutex);
m_Acquired.wait (l); // wait for element gets aquired
}
}
void DHKeysPairSupplier::CreateDHKeysPairs (int num)
{
if (num > 0)
{
CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg);
for (int i = 0; i < num; i++)
{
i2p::transport::DHKeysPair * pair = new i2p::transport::DHKeysPair ();
dh.GenerateKeyPair(m_Rnd, pair->privateKey, pair->publicKey);
std::unique_lock<std::mutex> l(m_AcquiredMutex);
m_Queue.push (pair);
}
}
}
DHKeysPair * DHKeysPairSupplier::Acquire ()
{
if (!m_Queue.empty ())
{
std::unique_lock<std::mutex> l(m_AcquiredMutex);
auto pair = m_Queue.front ();
m_Queue.pop ();
m_Acquired.notify_one ();
return pair;
}
else // queue is empty, create new
{
DHKeysPair * pair = new DHKeysPair ();
CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg);
dh.GenerateKeyPair(m_Rnd, pair->privateKey, pair->publicKey);
return pair;
}
}
void DHKeysPairSupplier::Return (DHKeysPair * pair)
{
std::unique_lock<std::mutex> l(m_AcquiredMutex);
m_Queue.push (pair);
}
Transports transports;
Transports::Transports ():
m_Thread (nullptr), m_Work (m_Service), m_NTCPAcceptor (nullptr), m_NTCPV6Acceptor (nullptr),
m_SSUServer (nullptr), m_DHKeysPairSupplier (5) // 5 pre-generated keys
{
}
Transports::~Transports ()
{
Stop ();
}
void Transports::Start ()
{
m_DHKeysPairSupplier.Start ();
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&Transports::Run, this));
// create acceptors
auto addresses = context.GetRouterInfo ().GetAddresses ();
for (auto& address : addresses)
{
if (address.transportStyle == RouterInfo::eTransportNTCP && address.host.is_v4 ())
{
m_NTCPAcceptor = new boost::asio::ip::tcp::acceptor (m_Service,
boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), address.port));
LogPrint ("Start listening TCP port ", address.port);
auto conn = std::make_shared<NTCPSession>(m_Service);
m_NTCPAcceptor->async_accept(conn->GetSocket (), boost::bind (&Transports::HandleAccept, this,
conn, boost::asio::placeholders::error));
if (context.SupportsV6 ())
{
m_NTCPV6Acceptor = new boost::asio::ip::tcp::acceptor (m_Service);
m_NTCPV6Acceptor->open (boost::asio::ip::tcp::v6());
m_NTCPV6Acceptor->set_option (boost::asio::ip::v6_only (true));
m_NTCPV6Acceptor->bind (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), address.port));
m_NTCPV6Acceptor->listen ();
LogPrint ("Start listening V6 TCP port ", address.port);
auto conn = std::make_shared<NTCPSession> (m_Service);
m_NTCPV6Acceptor->async_accept(conn->GetSocket (), boost::bind (&Transports::HandleAcceptV6,
this, conn, boost::asio::placeholders::error));
}
}
else if (address.transportStyle == RouterInfo::eTransportSSU && address.host.is_v4 ())
{
if (!m_SSUServer)
{
m_SSUServer = new SSUServer (address.port);
LogPrint ("Start listening UDP port ", address.port);
m_SSUServer->Start ();
DetectExternalIP ();
}
else
LogPrint ("SSU server already exists");
}
}
}
void Transports::Stop ()
{
if (m_SSUServer)
{
m_SSUServer->Stop ();
delete m_SSUServer;
m_SSUServer = nullptr;
}
m_NTCPSessions.clear ();
delete m_NTCPAcceptor;
m_NTCPAcceptor = nullptr;
delete m_NTCPV6Acceptor;
m_NTCPV6Acceptor = nullptr;
m_DHKeysPairSupplier.Stop ();
m_IsRunning = false;
m_Service.stop ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = nullptr;
}
}
void Transports::Run ()
{
while (m_IsRunning)
{
try
{
m_Service.run ();
}
catch (std::exception& ex)
{
LogPrint ("Transports: ", ex.what ());
}
}
}
void Transports::AddNTCPSession (std::shared_ptr<NTCPSession> session)
{
if (session)
m_NTCPSessions[session->GetRemoteIdentity ().GetIdentHash ()] = session;
}
void Transports::RemoveNTCPSession (std::shared_ptr<NTCPSession> session)
{
if (session)
m_NTCPSessions.erase (session->GetRemoteIdentity ().GetIdentHash ());
}
void Transports::HandleAccept (std::shared_ptr<NTCPSession> conn, const boost::system::error_code& error)
{
if (!error)
{
LogPrint ("Connected from ", conn->GetSocket ().remote_endpoint().address ().to_string ());
conn->ServerLogin ();
}
if (error != boost::asio::error::operation_aborted)
{
conn = std::make_shared<NTCPSession> (m_Service);
m_NTCPAcceptor->async_accept(conn->GetSocket (), boost::bind (&Transports::HandleAccept, this,
conn, boost::asio::placeholders::error));
}
}
void Transports::HandleAcceptV6 (std::shared_ptr<NTCPSession> conn, const boost::system::error_code& error)
{
if (!error)
{
LogPrint ("Connected from ", conn->GetSocket ().remote_endpoint().address ().to_string ());
conn->ServerLogin ();
}
if (error != boost::asio::error::operation_aborted)
{
conn = std::make_shared<NTCPSession> (m_Service);
m_NTCPV6Acceptor->async_accept(conn->GetSocket (), boost::bind (&Transports::HandleAcceptV6, this,
conn, boost::asio::placeholders::error));
}
}
void Transports::Connect (const boost::asio::ip::address& address, int port, std::shared_ptr<NTCPSession> conn)
{
LogPrint ("Connecting to ", address ,":", port);
conn->GetSocket ().async_connect (boost::asio::ip::tcp::endpoint (address, port),
boost::bind (&Transports::HandleConnect, this, boost::asio::placeholders::error, conn));
}
void Transports::HandleConnect (const boost::system::error_code& ecode, std::shared_ptr<NTCPSession> conn)
{
if (ecode)
{
LogPrint ("Connect error: ", ecode.message ());
if (ecode != boost::asio::error::operation_aborted)
{
i2p::data::netdb.SetUnreachable (conn->GetRemoteIdentity ().GetIdentHash (), true);
conn->Terminate ();
}
}
else
{
LogPrint ("Connected");
if (conn->GetSocket ().local_endpoint ().protocol () == boost::asio::ip::tcp::v6()) // ipv6
context.UpdateNTCPV6Address (conn->GetSocket ().local_endpoint ().address ());
conn->ClientLogin ();
}
}
std::shared_ptr<NTCPSession> Transports::GetNextNTCPSession ()
{
for (auto session: m_NTCPSessions)
if (session.second->IsEstablished ())
return session.second;
return 0;
}
std::shared_ptr<NTCPSession> Transports::FindNTCPSession (const i2p::data::IdentHash& ident)
{
auto it = m_NTCPSessions.find (ident);
if (it != m_NTCPSessions.end ())
return it->second;
return 0;
}
void Transports::SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg)
{
if (ident == i2p::context.GetRouterInfo ().GetIdentHash ())
// we send it to ourself
i2p::HandleI2NPMessage (msg);
else
m_Service.post (boost::bind (&Transports::PostMessage, this, ident, msg));
}
void Transports::PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg)
{
auto session = FindNTCPSession (ident);
if (session)
session->SendI2NPMessage (msg);
else
{
auto r = netdb.FindRouter (ident);
if (r)
{
auto ssuSession = m_SSUServer ? m_SSUServer->FindSession (r) : nullptr;
if (ssuSession)
ssuSession->SendI2NPMessage (msg);
else
{
// existing session not found. create new
// try NTCP first if message size < 16K
auto address = r->GetNTCPAddress (!context.SupportsV6 ());
if (address && !r->UsesIntroducer () && !r->IsUnreachable () && msg->GetLength () < NTCP_MAX_MESSAGE_SIZE)
{
auto s = std::make_shared<NTCPSession> (m_Service, r);
AddNTCPSession (s);
s->SendI2NPMessage (msg);
Connect (address->host, address->port, s);
}
else
{
// then SSU
auto s = m_SSUServer ? m_SSUServer->GetSession (r) : nullptr;
if (s)
s->SendI2NPMessage (msg);
else
{
LogPrint ("No NTCP and SSU addresses available");
DeleteI2NPMessage (msg);
}
}
}
}
else
{
LogPrint ("Router not found. Requested");
i2p::data::netdb.RequestDestination (ident);
auto resendTimer = new boost::asio::deadline_timer (m_Service);
resendTimer->expires_from_now (boost::posix_time::seconds(5)); // 5 seconds
resendTimer->async_wait (boost::bind (&Transports::HandleResendTimer,
this, boost::asio::placeholders::error, resendTimer, ident, msg));
}
}
}
void Transports::HandleResendTimer (const boost::system::error_code& ecode,
boost::asio::deadline_timer * timer, const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg)
{
auto r = netdb.FindRouter (ident);
if (r)
{
LogPrint ("Router found. Sending message");
PostMessage (ident, msg);
}
else
{
LogPrint ("Router not found. Failed to send message");
DeleteI2NPMessage (msg);
}
delete timer;
}
void Transports::CloseSession (std::shared_ptr<const i2p::data::RouterInfo> router)
{
if (!router) return;
m_Service.post (boost::bind (&Transports::PostCloseSession, this, router));
}
void Transports::PostCloseSession (std::shared_ptr<const i2p::data::RouterInfo> router)
{
auto ssuSession = m_SSUServer ? m_SSUServer->FindSession (router) : nullptr;
if (ssuSession) // try SSU first
{
m_SSUServer->DeleteSession (ssuSession);
LogPrint ("SSU session closed");
}
// TODO: delete NTCP
}
void Transports::DetectExternalIP ()
{
for (int i = 0; i < 5; i++)
{
auto router = i2p::data::netdb.GetRandomRouter ();
if (router && router->IsSSU () && m_SSUServer)
m_SSUServer->GetSession (router, true); // peer test
}
}
DHKeysPair * Transports::GetNextDHKeysPair ()
{
return m_DHKeysPairSupplier.Acquire ();
}
void Transports::ReuseDHKeysPair (DHKeysPair * pair)
{
m_DHKeysPairSupplier.Return (pair);
}
}
}

View File

@ -1,115 +0,0 @@
#ifndef TRANSPORTS_H__
#define TRANSPORTS_H__
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <map>
#include <queue>
#include <string>
#include <memory>
#include <cryptopp/osrng.h>
#include <boost/asio.hpp>
#include "TransportSession.h"
#include "NTCPSession.h"
#include "SSU.h"
#include "RouterInfo.h"
#include "I2NPProtocol.h"
#include "Identity.h"
namespace i2p
{
namespace transport
{
class DHKeysPairSupplier
{
public:
DHKeysPairSupplier (int size);
~DHKeysPairSupplier ();
void Start ();
void Stop ();
DHKeysPair * Acquire ();
void Return (DHKeysPair * pair);
private:
void Run ();
void CreateDHKeysPairs (int num);
private:
const int m_QueueSize;
std::queue<DHKeysPair *> m_Queue;
bool m_IsRunning;
std::thread * m_Thread;
std::condition_variable m_Acquired;
std::mutex m_AcquiredMutex;
CryptoPP::AutoSeededRandomPool m_Rnd;
};
class Transports
{
public:
Transports ();
~Transports ();
void Start ();
void Stop ();
boost::asio::io_service& GetService () { return m_Service; };
i2p::transport::DHKeysPair * GetNextDHKeysPair ();
void ReuseDHKeysPair (DHKeysPair * pair);
void AddNTCPSession (std::shared_ptr<NTCPSession> session);
void RemoveNTCPSession (std::shared_ptr<NTCPSession> session);
std::shared_ptr<NTCPSession> GetNextNTCPSession ();
std::shared_ptr<NTCPSession> FindNTCPSession (const i2p::data::IdentHash& ident);
void SendMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg);
void CloseSession (std::shared_ptr<const i2p::data::RouterInfo> router);
private:
void Run ();
void HandleAccept (std::shared_ptr<NTCPSession> conn, const boost::system::error_code& error);
void HandleAcceptV6 (std::shared_ptr<NTCPSession> conn, const boost::system::error_code& error);
void HandleResendTimer (const boost::system::error_code& ecode, boost::asio::deadline_timer * timer,
const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg);
void PostMessage (const i2p::data::IdentHash& ident, i2p::I2NPMessage * msg);
void PostCloseSession (std::shared_ptr<const i2p::data::RouterInfo> router);
void Connect (const boost::asio::ip::address& address, int port, std::shared_ptr<NTCPSession> conn);
void HandleConnect (const boost::system::error_code& ecode, std::shared_ptr<NTCPSession> conn);
void DetectExternalIP ();
private:
bool m_IsRunning;
std::thread * m_Thread;
boost::asio::io_service m_Service;
boost::asio::io_service::work m_Work;
boost::asio::ip::tcp::acceptor * m_NTCPAcceptor, * m_NTCPV6Acceptor;
std::map<i2p::data::IdentHash, std::shared_ptr<NTCPSession> > m_NTCPSessions;
SSUServer * m_SSUServer;
DHKeysPairSupplier m_DHKeysPairSupplier;
public:
// for HTTP only
const decltype(m_NTCPSessions)& GetNTCPSessions () const { return m_NTCPSessions; };
const SSUServer * GetSSUServer () const { return m_SSUServer; };
};
extern Transports transports;
}
}
#endif

View File

@ -1,621 +0,0 @@
#include "I2PEndian.h"
#include <thread>
#include <algorithm>
#include <vector>
#include <cryptopp/sha.h>
#include "RouterContext.h"
#include "Log.h"
#include "Timestamp.h"
#include "I2NPProtocol.h"
#include "Transports.h"
#include "NetDb.h"
#include "Tunnel.h"
namespace i2p
{
namespace tunnel
{
Tunnel::Tunnel (TunnelConfig * config):
m_Config (config), m_Pool (nullptr), m_State (eTunnelStatePending)
{
}
Tunnel::~Tunnel ()
{
delete m_Config;
}
void Tunnel::Build (uint32_t replyMsgID, OutboundTunnel * outboundTunnel)
{
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
auto numHops = m_Config->GetNumHops ();
int numRecords = numHops <= STANDARD_NUM_RECORDS ? STANDARD_NUM_RECORDS : numHops;
I2NPMessage * msg = NewI2NPMessage ();
*msg->GetPayload () = numRecords;
msg->len += numRecords*sizeof (I2NPBuildRequestRecordElGamalEncrypted) + 1;
// shuffle records
std::vector<int> recordIndicies;
for (int i = 0; i < numRecords; i++) recordIndicies.push_back(i);
std::random_shuffle (recordIndicies.begin(), recordIndicies.end());
// create real records
I2NPBuildRequestRecordElGamalEncrypted * records = (I2NPBuildRequestRecordElGamalEncrypted *)(msg->GetPayload () + 1);
TunnelHopConfig * hop = m_Config->GetFirstHop ();
int i = 0;
while (hop)
{
int idx = recordIndicies[i];
EncryptBuildRequestRecord (*hop->router,
CreateBuildRequestRecord (hop->router->GetIdentHash (),
hop->tunnelID,
hop->nextRouter->GetIdentHash (),
hop->nextTunnelID,
hop->layerKey, hop->ivKey,
hop->replyKey, hop->replyIV,
hop->next ? rnd.GenerateWord32 () : replyMsgID, // we set replyMsgID for last hop only
hop->isGateway, hop->isEndpoint),
records[idx]);
hop->recordIndex = idx;
i++;
hop = hop->next;
}
// fill up fake records with random data
for (int i = numHops; i < numRecords; i++)
{
int idx = recordIndicies[i];
rnd.GenerateBlock ((uint8_t *)(records + idx), sizeof (records[idx]));
}
// decrypt real records
i2p::crypto::CBCDecryption decryption;
hop = m_Config->GetLastHop ()->prev;
while (hop)
{
decryption.SetKey (hop->replyKey);
// decrypt records after current hop
TunnelHopConfig * hop1 = hop->next;
while (hop1)
{
decryption.SetIV (hop->replyIV);
decryption.Decrypt((uint8_t *)&records[hop1->recordIndex],
sizeof (I2NPBuildRequestRecordElGamalEncrypted),
(uint8_t *)&records[hop1->recordIndex]);
hop1 = hop1->next;
}
hop = hop->prev;
}
FillI2NPMessageHeader (msg, eI2NPVariableTunnelBuild);
// send message
if (outboundTunnel)
outboundTunnel->SendTunnelDataMsg (GetNextIdentHash (), 0, msg);
else
i2p::transport::transports.SendMessage (GetNextIdentHash (), msg);
}
bool Tunnel::HandleTunnelBuildResponse (uint8_t * msg, size_t len)
{
LogPrint ("TunnelBuildResponse ", (int)msg[0], " records.");
i2p::crypto::CBCDecryption decryption;
TunnelHopConfig * hop = m_Config->GetLastHop ();
while (hop)
{
decryption.SetKey (hop->replyKey);
// decrypt records before and including current hop
TunnelHopConfig * hop1 = hop;
while (hop1)
{
auto idx = hop1->recordIndex;
if (idx >= 0 && idx < msg[0])
{
uint8_t * record = msg + 1 + idx*sizeof (I2NPBuildResponseRecord);
decryption.SetIV (hop->replyIV);
decryption.Decrypt(record, sizeof (I2NPBuildResponseRecord), record);
}
else
LogPrint ("Tunnel hop index ", idx, " is out of range");
hop1 = hop1->prev;
}
hop = hop->prev;
}
bool established = true;
hop = m_Config->GetFirstHop ();
while (hop)
{
I2NPBuildResponseRecord * record = (I2NPBuildResponseRecord *)(msg + 1 + hop->recordIndex*sizeof (I2NPBuildResponseRecord));
LogPrint ("Ret code=", (int)record->ret);
if (record->ret)
// if any of participants declined the tunnel is not established
established = false;
hop = hop->next;
}
if (established)
{
// change reply keys to layer keys
hop = m_Config->GetFirstHop ();
while (hop)
{
hop->decryption.SetKeys (hop->layerKey, hop->ivKey);
hop = hop->next;
}
}
if (established) m_State = eTunnelStateEstablished;
return established;
}
void Tunnel::EncryptTunnelMsg (I2NPMessage * tunnelMsg)
{
uint8_t * payload = tunnelMsg->GetPayload () + 4;
TunnelHopConfig * hop = m_Config->GetLastHop ();
while (hop)
{
hop->decryption.Decrypt (payload);
hop = hop->prev;
}
}
void InboundTunnel::HandleTunnelDataMsg (I2NPMessage * msg)
{
if (IsFailed ()) SetState (eTunnelStateEstablished); // incoming messages means a tunnel is alive
msg->from = this;
EncryptTunnelMsg (msg);
m_Endpoint.HandleDecryptedTunnelDataMsg (msg);
}
void OutboundTunnel::SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg)
{
TunnelMessageBlock block;
if (gwHash)
{
block.hash = gwHash;
if (gwTunnel)
{
block.deliveryType = eDeliveryTypeTunnel;
block.tunnelID = gwTunnel;
}
else
block.deliveryType = eDeliveryTypeRouter;
}
else
block.deliveryType = eDeliveryTypeLocal;
block.data = msg;
std::unique_lock<std::mutex> l(m_SendMutex);
m_Gateway.SendTunnelDataMsg (block);
}
void OutboundTunnel::SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs)
{
std::unique_lock<std::mutex> l(m_SendMutex);
for (auto& it : msgs)
m_Gateway.PutTunnelDataMsg (it);
m_Gateway.SendBuffer ();
}
Tunnels tunnels;
Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr), m_ExploratoryPool (nullptr)
{
}
Tunnels::~Tunnels ()
{
for (auto& it : m_OutboundTunnels)
delete it;
m_OutboundTunnels.clear ();
for (auto& it : m_InboundTunnels)
delete it.second;
m_InboundTunnels.clear ();
for (auto& it : m_TransitTunnels)
delete it.second;
m_TransitTunnels.clear ();
/*for (auto& it : m_PendingTunnels)
delete it.second;
m_PendingTunnels.clear ();*/
for (auto& it: m_Pools)
delete it;
m_Pools.clear ();
}
InboundTunnel * Tunnels::GetInboundTunnel (uint32_t tunnelID)
{
auto it = m_InboundTunnels.find(tunnelID);
if (it != m_InboundTunnels.end ())
return it->second;
return nullptr;
}
TransitTunnel * Tunnels::GetTransitTunnel (uint32_t tunnelID)
{
auto it = m_TransitTunnels.find(tunnelID);
if (it != m_TransitTunnels.end ())
return it->second;
return nullptr;
}
Tunnel * Tunnels::GetPendingTunnel (uint32_t replyMsgID)
{
auto it = m_PendingTunnels.find(replyMsgID);
if (it != m_PendingTunnels.end () && it->second->GetState () == eTunnelStatePending)
{
it->second->SetState (eTunnelStateBuildReplyReceived);
return it->second;
}
return nullptr;
}
InboundTunnel * Tunnels::GetNextInboundTunnel ()
{
InboundTunnel * tunnel = nullptr;
size_t minReceived = 0;
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
for (auto it : m_InboundTunnels)
{
if (!it.second->IsEstablished ()) continue;
if (!tunnel || it.second->GetNumReceivedBytes () < minReceived)
{
tunnel = it.second;
minReceived = it.second->GetNumReceivedBytes ();
}
}
return tunnel;
}
OutboundTunnel * Tunnels::GetNextOutboundTunnel ()
{
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
uint32_t ind = rnd.GenerateWord32 (0, m_OutboundTunnels.size () - 1), i = 0;
OutboundTunnel * tunnel = nullptr;
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
for (auto it: m_OutboundTunnels)
{
if (it->IsEstablished ())
{
tunnel = it;
i++;
}
if (i > ind && tunnel) break;
}
return tunnel;
}
TunnelPool * Tunnels::CreateTunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops)
{
auto pool = new TunnelPool (localDestination, numInboundHops, numOutboundHops);
std::unique_lock<std::mutex> l(m_PoolsMutex);
m_Pools.push_back (pool);
return pool;
}
void Tunnels::DeleteTunnelPool (TunnelPool * pool)
{
if (pool)
{
StopTunnelPool (pool);
{
std::unique_lock<std::mutex> l(m_PoolsMutex);
m_Pools.remove (pool);
}
for (auto it: m_PendingTunnels)
if (it.second->GetTunnelPool () == pool)
it.second->SetTunnelPool (nullptr);
delete pool;
}
}
void Tunnels::StopTunnelPool (TunnelPool * pool)
{
if (pool)
{
pool->SetActive (false);
pool->DetachTunnels ();
}
}
void Tunnels::AddTransitTunnel (TransitTunnel * tunnel)
{
std::unique_lock<std::mutex> l(m_TransitTunnelsMutex);
m_TransitTunnels[tunnel->GetTunnelID ()] = tunnel;
}
void Tunnels::Start ()
{
m_IsRunning = true;
m_Thread = new std::thread (std::bind (&Tunnels::Run, this));
}
void Tunnels::Stop ()
{
m_IsRunning = false;
m_Queue.WakeUp ();
if (m_Thread)
{
m_Thread->join ();
delete m_Thread;
m_Thread = 0;
}
}
void Tunnels::Run ()
{
std::this_thread::sleep_for (std::chrono::seconds(1)); // wait for other parts are ready
uint64_t lastTs = 0;
while (m_IsRunning)
{
try
{
I2NPMessage * msg = m_Queue.GetNextWithTimeout (1000); // 1 sec
while (msg)
{
uint32_t tunnelID = be32toh (*(uint32_t *)msg->GetPayload ());
InboundTunnel * tunnel = GetInboundTunnel (tunnelID);
if (tunnel)
tunnel->HandleTunnelDataMsg (msg);
else
{
TransitTunnel * transitTunnel = GetTransitTunnel (tunnelID);
if (transitTunnel)
transitTunnel->HandleTunnelDataMsg (msg);
else
{
LogPrint ("Tunnel ", tunnelID, " not found");
i2p::DeleteI2NPMessage (msg);
}
}
msg = m_Queue.Get ();
}
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
if (ts - lastTs >= 15) // manage tunnels every 15 seconds
{
ManageTunnels ();
lastTs = ts;
}
}
catch (std::exception& ex)
{
LogPrint ("Tunnels: ", ex.what ());
}
}
}
void Tunnels::ManageTunnels ()
{
ManagePendingTunnels ();
ManageInboundTunnels ();
ManageOutboundTunnels ();
ManageTransitTunnels ();
ManageTunnelPools ();
}
void Tunnels::ManagePendingTunnels ()
{
// check pending tunnel. delete failed or timeout
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
for (auto it = m_PendingTunnels.begin (); it != m_PendingTunnels.end ();)
{
auto tunnel = it->second;
switch (tunnel->GetState ())
{
case eTunnelStatePending:
if (ts > tunnel->GetCreationTime () + TUNNEL_CREATION_TIMEOUT)
{
LogPrint ("Pending tunnel build request ", it->first, " timeout. Deleted");
delete tunnel;
it = m_PendingTunnels.erase (it);
}
else
it++;
break;
case eTunnelStateBuildFailed:
LogPrint ("Pending tunnel build request ", it->first, " failed. Deleted");
delete tunnel;
it = m_PendingTunnels.erase (it);
break;
case eTunnelStateBuildReplyReceived:
// intermidiate state, will be either established of build failed
it++;
break;
default:
it = m_PendingTunnels.erase (it);
}
}
}
void Tunnels::ManageOutboundTunnels ()
{
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
{
for (auto it = m_OutboundTunnels.begin (); it != m_OutboundTunnels.end ();)
{
auto tunnel = *it;
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
{
LogPrint ("Tunnel ", tunnel->GetTunnelID (), " expired");
{
std::unique_lock<std::mutex> l(m_PoolsMutex);
auto pool = tunnel->GetTunnelPool ();
if (pool)
pool->TunnelExpired (tunnel);
}
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
it = m_OutboundTunnels.erase (it);
}
delete tunnel;
}
else
{
if (tunnel->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
tunnel->SetState (eTunnelStateExpiring);
it++;
}
}
}
if (m_OutboundTunnels.size () < 5)
{
// trying to create one more oubound tunnel
InboundTunnel * inboundTunnel = GetNextInboundTunnel ();
if (!inboundTunnel) return;
LogPrint ("Creating one hop outbound tunnel...");
CreateTunnel<OutboundTunnel> (
new TunnelConfig (std::vector<std::shared_ptr<const i2p::data::RouterInfo> >
{
i2p::data::netdb.GetRandomRouter ()
},
inboundTunnel->GetTunnelConfig ()));
}
}
void Tunnels::ManageInboundTunnels ()
{
uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
{
for (auto it = m_InboundTunnels.begin (); it != m_InboundTunnels.end ();)
{
auto tunnel = it->second;
if (ts > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
{
LogPrint ("Tunnel ", tunnel->GetTunnelID (), " expired");
{
std::unique_lock<std::mutex> l(m_PoolsMutex);
auto pool = tunnel->GetTunnelPool ();
if (pool)
pool->TunnelExpired (tunnel);
}
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
it = m_InboundTunnels.erase (it);
}
delete tunnel;
}
else
{
if (tunnel->IsEstablished () && ts + TUNNEL_EXPIRATION_THRESHOLD > tunnel->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
tunnel->SetState (eTunnelStateExpiring);
it++;
}
}
}
if (m_InboundTunnels.empty ())
{
LogPrint ("Creating zero hops inbound tunnel...");
CreateZeroHopsInboundTunnel ();
if (!m_ExploratoryPool)
m_ExploratoryPool = CreateTunnelPool (&i2p::context, 2, 2); // 2-hop exploratory
return;
}
if (m_OutboundTunnels.empty () || m_InboundTunnels.size () < 5)
{
// trying to create one more inbound tunnel
LogPrint ("Creating one hop inbound tunnel...");
CreateTunnel<InboundTunnel> (
new TunnelConfig (std::vector<std::shared_ptr<const i2p::data::RouterInfo> >
{
i2p::data::netdb.GetRandomRouter ()
}));
}
}
void Tunnels::ManageTransitTunnels ()
{
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
for (auto it = m_TransitTunnels.begin (); it != m_TransitTunnels.end ();)
{
if (ts > it->second->GetCreationTime () + TUNNEL_EXPIRATION_TIMEOUT)
{
LogPrint ("Transit tunnel ", it->second->GetTunnelID (), " expired");
auto tmp = it->second;
{
std::unique_lock<std::mutex> l(m_TransitTunnelsMutex);
it = m_TransitTunnels.erase (it);
}
delete tmp;
}
else
it++;
}
}
void Tunnels::ManageTunnelPools ()
{
std::unique_lock<std::mutex> l(m_PoolsMutex);
for (auto it: m_Pools)
{
TunnelPool * pool = it;
if (pool->IsActive ())
{
pool->CreateTunnels ();
pool->TestTunnels ();
}
}
}
void Tunnels::PostTunnelData (I2NPMessage * msg)
{
if (msg) m_Queue.Put (msg);
}
template<class TTunnel>
TTunnel * Tunnels::CreateTunnel (TunnelConfig * config, OutboundTunnel * outboundTunnel)
{
TTunnel * newTunnel = new TTunnel (config);
uint32_t replyMsgID = i2p::context.GetRandomNumberGenerator ().GenerateWord32 ();
m_PendingTunnels[replyMsgID] = newTunnel;
newTunnel->Build (replyMsgID, outboundTunnel);
return newTunnel;
}
void Tunnels::AddOutboundTunnel (OutboundTunnel * newTunnel)
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
m_OutboundTunnels.push_back (newTunnel);
auto pool = newTunnel->GetTunnelPool ();
if (pool && pool->IsActive ())
pool->TunnelCreated (newTunnel);
else
newTunnel->SetTunnelPool (nullptr);
}
void Tunnels::AddInboundTunnel (InboundTunnel * newTunnel)
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
m_InboundTunnels[newTunnel->GetTunnelID ()] = newTunnel;
auto pool = newTunnel->GetTunnelPool ();
if (!pool)
{
// build symmetric outbound tunnel
CreateTunnel<OutboundTunnel> (newTunnel->GetTunnelConfig ()->Invert (), GetNextOutboundTunnel ());
}
else
{
if (pool->IsActive ())
pool->TunnelCreated (newTunnel);
else
newTunnel->SetTunnelPool (nullptr);
}
}
void Tunnels::CreateZeroHopsInboundTunnel ()
{
CreateTunnel<InboundTunnel> (
new TunnelConfig (std::vector<std::shared_ptr<const i2p::data::RouterInfo> >
{
i2p::context.GetSharedRouterInfo ()
}));
}
}
}

176
Tunnel.h
View File

@ -1,176 +0,0 @@
#ifndef TUNNEL_H__
#define TUNNEL_H__
#include <inttypes.h>
#include <map>
#include <list>
#include <vector>
#include <string>
#include <thread>
#include <mutex>
#include "Queue.h"
#include "TunnelConfig.h"
#include "TunnelPool.h"
#include "TransitTunnel.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
#include "TunnelBase.h"
#include "I2NPProtocol.h"
namespace i2p
{
namespace tunnel
{
const int TUNNEL_EXPIRATION_TIMEOUT = 660; // 11 minutes
const int TUNNEL_EXPIRATION_THRESHOLD = 60; // 1 minute
const int TUNNEL_CREATION_TIMEOUT = 30; // 30 seconds
const int STANDARD_NUM_RECORDS = 5; // in VariableTunnelBuild message
enum TunnelState
{
eTunnelStatePending,
eTunnelStateBuildReplyReceived,
eTunnelStateBuildFailed,
eTunnelStateEstablished,
eTunnelStateTestFailed,
eTunnelStateFailed,
eTunnelStateExpiring
};
class OutboundTunnel;
class InboundTunnel;
class Tunnel: public TunnelBase
{
public:
Tunnel (TunnelConfig * config);
~Tunnel ();
void Build (uint32_t replyMsgID, OutboundTunnel * outboundTunnel = 0);
TunnelConfig * GetTunnelConfig () const { return m_Config; }
TunnelState GetState () const { return m_State; };
void SetState (TunnelState state) { m_State = state; };
bool IsEstablished () const { return m_State == eTunnelStateEstablished; };
bool IsFailed () const { return m_State == eTunnelStateFailed; };
TunnelPool * GetTunnelPool () const { return m_Pool; };
void SetTunnelPool (TunnelPool * pool) { m_Pool = pool; };
bool HandleTunnelBuildResponse (uint8_t * msg, size_t len);
// implements TunnelBase
void EncryptTunnelMsg (I2NPMessage * tunnelMsg);
uint32_t GetNextTunnelID () const { return m_Config->GetFirstHop ()->tunnelID; };
const i2p::data::IdentHash& GetNextIdentHash () const { return m_Config->GetFirstHop ()->router->GetIdentHash (); };
private:
TunnelConfig * m_Config;
TunnelPool * m_Pool; // pool, tunnel belongs to, or null
TunnelState m_State;
};
class OutboundTunnel: public Tunnel
{
public:
OutboundTunnel (TunnelConfig * config): Tunnel (config), m_Gateway (this) {};
void SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg);
void SendTunnelDataMsg (const std::vector<TunnelMessageBlock>& msgs); // multiple messages
std::shared_ptr<const i2p::data::RouterInfo> GetEndpointRouter () const
{ return GetTunnelConfig ()->GetLastHop ()->router; };
size_t GetNumSentBytes () const { return m_Gateway.GetNumSentBytes (); };
// implements TunnelBase
uint32_t GetTunnelID () const { return GetNextTunnelID (); };
private:
std::mutex m_SendMutex;
TunnelGateway m_Gateway;
};
class InboundTunnel: public Tunnel
{
public:
InboundTunnel (TunnelConfig * config): Tunnel (config), m_Endpoint (true) {};
void HandleTunnelDataMsg (I2NPMessage * msg);
size_t GetNumReceivedBytes () const { return m_Endpoint.GetNumReceivedBytes (); };
// implements TunnelBase
uint32_t GetTunnelID () const { return GetTunnelConfig ()->GetLastHop ()->nextTunnelID; };
private:
TunnelEndpoint m_Endpoint;
};
class Tunnels
{
public:
Tunnels ();
~Tunnels ();
void Start ();
void Stop ();
InboundTunnel * GetInboundTunnel (uint32_t tunnelID);
Tunnel * GetPendingTunnel (uint32_t replyMsgID);
InboundTunnel * GetNextInboundTunnel ();
OutboundTunnel * GetNextOutboundTunnel ();
TunnelPool * GetExploratoryPool () const { return m_ExploratoryPool; };
TransitTunnel * GetTransitTunnel (uint32_t tunnelID);
void AddTransitTunnel (TransitTunnel * tunnel);
void AddOutboundTunnel (OutboundTunnel * newTunnel);
void AddInboundTunnel (InboundTunnel * newTunnel);
void PostTunnelData (I2NPMessage * msg);
template<class TTunnel>
TTunnel * CreateTunnel (TunnelConfig * config, OutboundTunnel * outboundTunnel = 0);
TunnelPool * CreateTunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOuboundHops);
void DeleteTunnelPool (TunnelPool * pool);
void StopTunnelPool (TunnelPool * pool);
private:
void Run ();
void ManageTunnels ();
void ManageOutboundTunnels ();
void ManageInboundTunnels ();
void ManageTransitTunnels ();
void ManagePendingTunnels ();
void ManageTunnelPools ();
void CreateZeroHopsInboundTunnel ();
private:
bool m_IsRunning;
std::thread * m_Thread;
std::map<uint32_t, Tunnel *> m_PendingTunnels; // by replyMsgID
std::mutex m_InboundTunnelsMutex;
std::map<uint32_t, InboundTunnel *> m_InboundTunnels;
std::mutex m_OutboundTunnelsMutex;
std::list<OutboundTunnel *> m_OutboundTunnels;
std::mutex m_TransitTunnelsMutex;
std::map<uint32_t, TransitTunnel *> m_TransitTunnels;
std::mutex m_PoolsMutex;
std::list<TunnelPool *> m_Pools;
TunnelPool * m_ExploratoryPool;
i2p::util::Queue<I2NPMessage> m_Queue;
public:
// for HTTP only
const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; };
const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; };
const decltype(m_TransitTunnels)& GetTransitTunnels () const { return m_TransitTunnels; };
};
extern Tunnels tunnels;
}
}
#endif

View File

@ -1,65 +0,0 @@
#ifndef TUNNEL_BASE_H__
#define TUNNEL_BASE_H__
#include <inttypes.h>
#include "Timestamp.h"
#include "I2NPProtocol.h"
#include "Identity.h"
namespace i2p
{
namespace tunnel
{
const size_t TUNNEL_DATA_MSG_SIZE = 1028;
const size_t TUNNEL_DATA_ENCRYPTED_SIZE = 1008;
const size_t TUNNEL_DATA_MAX_PAYLOAD_SIZE = 1003;
enum TunnelDeliveryType
{
eDeliveryTypeLocal = 0,
eDeliveryTypeTunnel = 1,
eDeliveryTypeRouter = 2
};
struct TunnelMessageBlock
{
TunnelDeliveryType deliveryType;
i2p::data::IdentHash hash;
uint32_t tunnelID;
I2NPMessage * data;
};
class TunnelBase
{
public:
//WARNING!!! GetSecondsSinceEpoch() return uint64_t
TunnelBase (): m_CreationTime (i2p::util::GetSecondsSinceEpoch ()) {};
virtual ~TunnelBase () {};
virtual void EncryptTunnelMsg (I2NPMessage * tunnelMsg) = 0;
virtual uint32_t GetNextTunnelID () const = 0;
virtual const i2p::data::IdentHash& GetNextIdentHash () const = 0;
virtual uint32_t GetTunnelID () const = 0; // as known at our side
uint32_t GetCreationTime () const { return m_CreationTime; };
void SetCreationTime (uint32_t t) { m_CreationTime = t; };
private:
uint32_t m_CreationTime; // seconds since epoch
};
struct TunnelCreationTimeCmp
{
bool operator() (const TunnelBase * t1, const TunnelBase * t2) const
{
if (t1->GetCreationTime () != t2->GetCreationTime ())
return t1->GetCreationTime () > t2->GetCreationTime ();
else
return t1 < t2;
};
};
}
}
#endif

View File

@ -1,223 +0,0 @@
#ifndef TUNNEL_CONFIG_H__
#define TUNNEL_CONFIG_H__
#include <inttypes.h>
#include <sstream>
#include <vector>
#include <memory>
#include "aes.h"
#include "RouterInfo.h"
#include "RouterContext.h"
namespace i2p
{
namespace tunnel
{
struct TunnelHopConfig
{
std::shared_ptr<const i2p::data::RouterInfo> router, nextRouter;
uint32_t tunnelID, nextTunnelID;
uint8_t layerKey[32];
uint8_t ivKey[32];
uint8_t replyKey[32];
uint8_t replyIV[16];
bool isGateway, isEndpoint;
TunnelHopConfig * next, * prev;
i2p::crypto::TunnelDecryption decryption;
int recordIndex; // record # in tunnel build message
TunnelHopConfig (std::shared_ptr<const i2p::data::RouterInfo> r)
{
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
rnd.GenerateBlock (layerKey, 32);
rnd.GenerateBlock (ivKey, 32);
rnd.GenerateBlock (replyIV, 16);
tunnelID = rnd.GenerateWord32 ();
isGateway = true;
isEndpoint = true;
router = r;
//nextRouter = nullptr;
nextTunnelID = 0;
next = nullptr;
prev = nullptr;
}
void SetNextRouter (std::shared_ptr<const i2p::data::RouterInfo> r)
{
nextRouter = r;
isEndpoint = false;
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
nextTunnelID = rnd.GenerateWord32 ();
}
void SetReplyHop (const TunnelHopConfig * replyFirstHop)
{
nextRouter = replyFirstHop->router;
nextTunnelID = replyFirstHop->tunnelID;
isEndpoint = true;
}
void SetNext (TunnelHopConfig * n)
{
next = n;
if (next)
{
next->prev = this;
next->isGateway = false;
isEndpoint = false;
nextRouter = next->router;
nextTunnelID = next->tunnelID;
}
}
void SetPrev (TunnelHopConfig * p)
{
prev = p;
if (prev)
{
prev->next = this;
prev->isEndpoint = false;
isGateway = false;
}
}
};
class TunnelConfig
{
public:
TunnelConfig (std::vector<std::shared_ptr<const i2p::data::RouterInfo> > peers,
const TunnelConfig * replyTunnelConfig = nullptr) // replyTunnelConfig=nullptr means inbound
{
TunnelHopConfig * prev = nullptr;
for (auto it: peers)
{
auto hop = new TunnelHopConfig (it);
if (prev)
prev->SetNext (hop);
else
m_FirstHop = hop;
prev = hop;
}
m_LastHop = prev;
if (replyTunnelConfig) // outbound
{
m_FirstHop->isGateway = false;
m_LastHop->SetReplyHop (replyTunnelConfig->GetFirstHop ());
}
else // inbound
m_LastHop->SetNextRouter (i2p::context.GetSharedRouterInfo ());
}
~TunnelConfig ()
{
TunnelHopConfig * hop = m_FirstHop;
while (hop)
{
auto tmp = hop;
hop = hop->next;
delete tmp;
}
}
TunnelHopConfig * GetFirstHop () const
{
return m_FirstHop;
}
TunnelHopConfig * GetLastHop () const
{
return m_LastHop;
}
int GetNumHops () const
{
int num = 0;
TunnelHopConfig * hop = m_FirstHop;
while (hop)
{
num++;
hop = hop->next;
}
return num;
}
void Print (std::stringstream& s) const
{
TunnelHopConfig * hop = m_FirstHop;
if (!m_FirstHop->isGateway)
s << "me";
s << "-->" << m_FirstHop->tunnelID;
while (hop)
{
s << ":" << hop->router->GetIdentHashAbbreviation () << "-->";
if (!hop->isEndpoint)
s << hop->nextTunnelID;
else
return;
hop = hop->next;
}
// we didn't reach enpoint that mean we are last hop
s << ":me";
}
TunnelConfig * Invert () const
{
TunnelConfig * newConfig = new TunnelConfig ();
TunnelHopConfig * hop = m_FirstHop, * nextNewHop = nullptr;
while (hop)
{
TunnelHopConfig * newHop = new TunnelHopConfig (hop->router);
if (nextNewHop)
newHop->SetNext (nextNewHop);
nextNewHop = newHop;
newHop->isEndpoint = hop->isGateway;
newHop->isGateway = hop->isEndpoint;
if (!hop->prev) // first hop
{
newConfig->m_LastHop = newHop;
if (hop->isGateway) // inbound tunnel
newHop->SetReplyHop (m_FirstHop); // use it as reply tunnel
else
newHop->SetNextRouter (i2p::context.GetSharedRouterInfo ());
}
if (!hop->next) newConfig->m_FirstHop = newHop; // last hop
hop = hop->next;
}
return newConfig;
}
TunnelConfig * Clone (const TunnelConfig * replyTunnelConfig = nullptr) const
{
std::vector<std::shared_ptr<const i2p::data::RouterInfo> > peers;
TunnelHopConfig * hop = m_FirstHop;
while (hop)
{
peers.push_back (hop->router);
hop = hop->next;
}
return new TunnelConfig (peers, replyTunnelConfig);
}
private:
// this constructor can't be called from outside
TunnelConfig (): m_FirstHop (nullptr), m_LastHop (nullptr)
{
}
private:
TunnelHopConfig * m_FirstHop, * m_LastHop;
};
}
}
#endif

View File

@ -1,270 +0,0 @@
#include "I2PEndian.h"
#include <string.h>
#include "Log.h"
#include "NetDb.h"
#include "I2NPProtocol.h"
#include "Transports.h"
#include "RouterContext.h"
#include "TunnelEndpoint.h"
namespace i2p
{
namespace tunnel
{
TunnelEndpoint::~TunnelEndpoint ()
{
for (auto it: m_IncompleteMessages)
i2p::DeleteI2NPMessage (it.second.data);
for (auto it: m_OutOfSequenceFragments)
i2p::DeleteI2NPMessage (it.second.data);
}
void TunnelEndpoint::HandleDecryptedTunnelDataMsg (I2NPMessage * msg)
{
m_NumReceivedBytes += TUNNEL_DATA_MSG_SIZE;
uint8_t * decrypted = msg->GetPayload () + 20; // 4 + 16
uint8_t * zero = (uint8_t *)memchr (decrypted + 4, 0, TUNNEL_DATA_ENCRYPTED_SIZE - 4); // witout 4-byte checksum
if (zero)
{
LogPrint ("TunnelMessage: zero found at ", (int)(zero-decrypted));
uint8_t * fragment = zero + 1;
// verify checksum
memcpy (msg->GetPayload () + TUNNEL_DATA_MSG_SIZE, msg->GetPayload () + 4, 16); // copy iv to the end
uint8_t hash[32];
CryptoPP::SHA256().CalculateDigest (hash, fragment, TUNNEL_DATA_MSG_SIZE -(fragment - msg->GetPayload ()) + 16); // payload + iv
if (memcmp (hash, decrypted, 4))
{
LogPrint ("TunnelMessage: checksum verification failed");
i2p::DeleteI2NPMessage (msg);
return;
}
// process fragments
while (fragment < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
{
uint8_t flag = fragment[0];
fragment++;
bool isFollowOnFragment = flag & 0x80, isLastFragment = true;
uint32_t msgID = 0;
int fragmentNum = 0;
TunnelMessageBlockEx m;
if (!isFollowOnFragment)
{
// first fragment
m.deliveryType = (TunnelDeliveryType)((flag >> 5) & 0x03);
switch (m.deliveryType)
{
case eDeliveryTypeLocal: // 0
LogPrint ("Delivery type local");
break;
case eDeliveryTypeTunnel: // 1
LogPrint ("Delivery type tunnel");
m.tunnelID = be32toh (*(uint32_t *)fragment);
fragment += 4; // tunnelID
m.hash = i2p::data::IdentHash (fragment);
fragment += 32; // hash
break;
case eDeliveryTypeRouter: // 2
LogPrint ("Delivery type router");
m.hash = i2p::data::IdentHash (fragment);
fragment += 32; // to hash
break;
default:
;
}
bool isFragmented = flag & 0x08;
if (isFragmented)
{
// Message ID
msgID = be32toh (*(uint32_t *)fragment);
fragment += 4;
LogPrint ("Fragmented message ", msgID);
isLastFragment = false;
}
}
else
{
// follow on
msgID = be32toh (*(uint32_t *)fragment); // MessageID
fragment += 4;
fragmentNum = (flag >> 1) & 0x3F; // 6 bits
isLastFragment = flag & 0x01;
LogPrint ("Follow on fragment ", fragmentNum, " of message ", msgID, isLastFragment ? " last" : " non-last");
}
uint16_t size = be16toh (*(uint16_t *)fragment);
fragment += 2;
LogPrint ("Fragment size=", (int)size);
msg->offset = fragment - msg->buf;
msg->len = msg->offset + size;
if (fragment + size < decrypted + TUNNEL_DATA_ENCRYPTED_SIZE)
{
// this is not last message. we have to copy it
m.data = NewI2NPMessage ();
m.data->offset += sizeof (TunnelGatewayHeader); // reserve room for TunnelGateway header
m.data->len += sizeof (TunnelGatewayHeader);
*(m.data) = *msg;
}
else
m.data = msg;
if (!isFollowOnFragment && isLastFragment)
HandleNextMessage (m);
else
{
if (msgID) // msgID is presented, assume message is fragmented
{
if (!isFollowOnFragment) // create new incomlete message
{
m.nextFragmentNum = 1;
auto& msg = m_IncompleteMessages[msgID];
msg = m;
HandleOutOfSequenceFragment (msgID, msg);
}
else
{
m.nextFragmentNum = fragmentNum;
HandleFollowOnFragment (msgID, isLastFragment, m);
}
}
else
LogPrint ("Message is fragmented, but msgID is not presented");
}
fragment += size;
}
}
else
{
LogPrint ("TunnelMessage: zero not found");
i2p::DeleteI2NPMessage (msg);
}
}
void TunnelEndpoint::HandleFollowOnFragment (uint32_t msgID, bool isLastFragment, const TunnelMessageBlockEx& m)
{
auto fragment = m.data->GetBuffer ();
auto size = m.data->GetLength ();
auto it = m_IncompleteMessages.find (msgID);
if (it != m_IncompleteMessages.end())
{
auto& msg = it->second;
if (m.nextFragmentNum == msg.nextFragmentNum)
{
if (msg.data->len + size < I2NP_MAX_MESSAGE_SIZE) // check if messega is not too long
{
memcpy (msg.data->buf + msg.data->len, fragment, size); // concatenate fragment
msg.data->len += size;
if (isLastFragment)
{
// message complete
HandleNextMessage (msg);
m_IncompleteMessages.erase (it);
}
else
{
msg.nextFragmentNum++;
HandleOutOfSequenceFragment (msgID, msg);
}
}
else
{
LogPrint ("Fragment ", m.nextFragmentNum, " of message ", msgID, "exceeds max I2NP message size. Message dropped");
i2p::DeleteI2NPMessage (msg.data);
m_IncompleteMessages.erase (it);
}
i2p::DeleteI2NPMessage (m.data);
}
else
{
LogPrint ("Unexpected fragment ", (int)m.nextFragmentNum, " instead ", (int)msg.nextFragmentNum, " of message ", msgID, ". Saved");
AddOutOfSequenceFragment (msgID, m.nextFragmentNum, isLastFragment, m.data);
}
}
else
{
LogPrint ("First fragment of message ", msgID, " not found. Saved");
AddOutOfSequenceFragment (msgID, m.nextFragmentNum, isLastFragment, m.data);
}
}
void TunnelEndpoint::AddOutOfSequenceFragment (uint32_t msgID, uint8_t fragmentNum, bool isLastFragment, I2NPMessage * data)
{
auto it = m_OutOfSequenceFragments.find (msgID);
if (it == m_OutOfSequenceFragments.end ())
m_OutOfSequenceFragments.insert (std::pair<uint32_t, Fragment> (msgID, {fragmentNum, isLastFragment, data}));
else
i2p::DeleteI2NPMessage (data);
}
void TunnelEndpoint::HandleOutOfSequenceFragment (uint32_t msgID, TunnelMessageBlockEx& msg)
{
auto it = m_OutOfSequenceFragments.find (msgID);
if (it != m_OutOfSequenceFragments.end ())
{
if (it->second.fragmentNum == msg.nextFragmentNum)
{
LogPrint ("Out-of-sequence fragment ", (int)it->second.fragmentNum, " of message ", msgID, " found");
auto size = it->second.data->GetLength ();
memcpy (msg.data->buf + msg.data->len, it->second.data->GetBuffer (), size); // concatenate out-of-sync fragment
msg.data->len += size;
if (it->second.isLastFragment)
{
// message complete
HandleNextMessage (msg);
m_IncompleteMessages.erase (msgID);
}
else
msg.nextFragmentNum++;
i2p::DeleteI2NPMessage (it->second.data);
m_OutOfSequenceFragments.erase (it);
}
}
}
void TunnelEndpoint::HandleNextMessage (const TunnelMessageBlock& msg)
{
LogPrint ("TunnelMessage: handle fragment of ", msg.data->GetLength ()," bytes. Msg type ", (int)msg.data->GetHeader()->typeID);
switch (msg.deliveryType)
{
case eDeliveryTypeLocal:
i2p::HandleI2NPMessage (msg.data);
break;
case eDeliveryTypeTunnel:
i2p::transport::transports.SendMessage (msg.hash, i2p::CreateTunnelGatewayMsg (msg.tunnelID, msg.data));
break;
case eDeliveryTypeRouter:
if (msg.hash == i2p::context.GetRouterInfo ().GetIdentHash ()) // check if message is sent to us
i2p::HandleI2NPMessage (msg.data);
else
{
// to somebody else
if (!m_IsInbound) // outbound transit tunnel
{
if (msg.data->GetHeader()->typeID == eI2NPDatabaseStore ||
msg.data->GetHeader()->typeID == eI2NPDatabaseSearchReply )
{
// catch RI or reply with new list of routers
auto ds = NewI2NPMessage ();
*ds = *(msg.data);
i2p::data::netdb.PostI2NPMsg (ds);
}
i2p::transport::transports.SendMessage (msg.hash, msg.data);
}
else // we shouldn't send this message. possible leakage
{
LogPrint ("Message to another router arrived from an inbound tunnel. Dropped");
i2p::DeleteI2NPMessage (msg.data);
}
}
break;
default:
LogPrint ("TunnelMessage: Unknown delivery type ", (int)msg.deliveryType);
};
}
}
}

View File

@ -1,55 +0,0 @@
#ifndef TUNNEL_GATEWAY_H__
#define TUNNEL_GATEWAY_H__
#include <inttypes.h>
#include <vector>
#include "I2NPProtocol.h"
#include "TunnelBase.h"
namespace i2p
{
namespace tunnel
{
class TunnelGatewayBuffer
{
public:
TunnelGatewayBuffer (uint32_t tunnelID): m_TunnelID (tunnelID),
m_CurrentTunnelDataMsg (nullptr), m_RemainingSize (0) {};
void PutI2NPMsg (const TunnelMessageBlock& block);
const std::vector<I2NPMessage *>& GetTunnelDataMsgs () const { return m_TunnelDataMsgs; };
void ClearTunnelDataMsgs ();
void CompleteCurrentTunnelDataMessage ();
private:
void CreateCurrentTunnelDataMessage ();
private:
uint32_t m_TunnelID;
std::vector<I2NPMessage *> m_TunnelDataMsgs;
I2NPMessage * m_CurrentTunnelDataMsg;
size_t m_RemainingSize;
};
class TunnelGateway
{
public:
TunnelGateway (TunnelBase * tunnel):
m_Tunnel (tunnel), m_Buffer (tunnel->GetNextTunnelID ()), m_NumSentBytes (0) {};
void SendTunnelDataMsg (const TunnelMessageBlock& block);
void PutTunnelDataMsg (const TunnelMessageBlock& block);
void SendBuffer ();
size_t GetNumSentBytes () const { return m_NumSentBytes; };
private:
TunnelBase * m_Tunnel;
TunnelGatewayBuffer m_Buffer;
size_t m_NumSentBytes;
};
}
}
#endif

View File

@ -1,354 +0,0 @@
#include "I2PEndian.h"
#include "CryptoConst.h"
#include "Tunnel.h"
#include "NetDb.h"
#include "Timestamp.h"
#include "Garlic.h"
#include "TunnelPool.h"
namespace i2p
{
namespace tunnel
{
TunnelPool::TunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops, int numTunnels):
m_LocalDestination (localDestination), m_NumInboundHops (numInboundHops), m_NumOutboundHops (numOutboundHops),
m_NumTunnels (numTunnels), m_IsActive (true)
{
}
TunnelPool::~TunnelPool ()
{
DetachTunnels ();
}
void TunnelPool::DetachTunnels ()
{
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
for (auto it: m_InboundTunnels)
it->SetTunnelPool (nullptr);
m_InboundTunnels.clear ();
}
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
for (auto it: m_OutboundTunnels)
it->SetTunnelPool (nullptr);
m_OutboundTunnels.clear ();
}
m_Tests.clear ();
}
void TunnelPool::TunnelCreated (InboundTunnel * createdTunnel)
{
if (!m_IsActive) return;
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
m_InboundTunnels.insert (createdTunnel);
}
if (m_LocalDestination)
m_LocalDestination->SetLeaseSetUpdated ();
}
void TunnelPool::TunnelExpired (InboundTunnel * expiredTunnel)
{
if (expiredTunnel)
{
expiredTunnel->SetTunnelPool (nullptr);
for (auto it: m_Tests)
if (it.second.second == expiredTunnel) it.second.second = nullptr;
RecreateInboundTunnel (expiredTunnel);
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
m_InboundTunnels.erase (expiredTunnel);
}
}
void TunnelPool::TunnelCreated (OutboundTunnel * createdTunnel)
{
if (!m_IsActive) return;
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
m_OutboundTunnels.insert (createdTunnel);
}
void TunnelPool::TunnelExpired (OutboundTunnel * expiredTunnel)
{
if (expiredTunnel)
{
expiredTunnel->SetTunnelPool (nullptr);
for (auto it: m_Tests)
if (it.second.first == expiredTunnel) it.second.first = nullptr;
RecreateOutboundTunnel (expiredTunnel);
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
m_OutboundTunnels.erase (expiredTunnel);
}
}
std::vector<InboundTunnel *> TunnelPool::GetInboundTunnels (int num) const
{
std::vector<InboundTunnel *> v;
int i = 0;
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
for (auto it : m_InboundTunnels)
{
if (i >= num) break;
if (it->IsEstablished ())
{
v.push_back (it);
i++;
}
}
return v;
}
OutboundTunnel * TunnelPool::GetNextOutboundTunnel (OutboundTunnel * suggested) const
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
return GetNextTunnel (m_OutboundTunnels, suggested);
}
InboundTunnel * TunnelPool::GetNextInboundTunnel (InboundTunnel * suggested) const
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
return GetNextTunnel (m_InboundTunnels, suggested);
}
template<class TTunnels>
typename TTunnels::value_type TunnelPool::GetNextTunnel (TTunnels& tunnels,
typename TTunnels::value_type suggested) const
{
if (tunnels.empty ()) return nullptr;
if (suggested && tunnels.count (suggested) > 0 && suggested->IsEstablished ())
return suggested;
CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator ();
uint32_t ind = rnd.GenerateWord32 (0, tunnels.size ()/2), i = 0;
typename TTunnels::value_type tunnel = nullptr;
for (auto it: tunnels)
{
if (it->IsEstablished ())
{
tunnel = it;
i++;
}
if (i > ind && tunnel) break;
}
return tunnel;
}
void TunnelPool::CreateTunnels ()
{
int num = 0;
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
for (auto it : m_InboundTunnels)
if (it->IsEstablished ()) num++;
}
for (int i = num; i < m_NumTunnels; i++)
CreateInboundTunnel ();
num = 0;
{
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
for (auto it : m_OutboundTunnels)
if (it->IsEstablished ()) num++;
}
for (int i = num; i < m_NumTunnels; i++)
CreateOutboundTunnel ();
}
void TunnelPool::TestTunnels ()
{
auto& rnd = i2p::context.GetRandomNumberGenerator ();
for (auto it: m_Tests)
{
LogPrint ("Tunnel test ", (int)it.first, " failed");
// if test failed again with another tunnel we consider it failed
if (it.second.first)
{
if (it.second.first->GetState () == eTunnelStateTestFailed)
{
it.second.first->SetState (eTunnelStateFailed);
std::unique_lock<std::mutex> l(m_OutboundTunnelsMutex);
m_OutboundTunnels.erase (it.second.first);
}
else
it.second.first->SetState (eTunnelStateTestFailed);
}
if (it.second.second)
{
if (it.second.second->GetState () == eTunnelStateTestFailed)
{
it.second.second->SetState (eTunnelStateFailed);
{
std::unique_lock<std::mutex> l(m_InboundTunnelsMutex);
m_InboundTunnels.erase (it.second.second);
}
if (m_LocalDestination)
m_LocalDestination->SetLeaseSetUpdated ();
}
else
it.second.second->SetState (eTunnelStateTestFailed);
}
}
m_Tests.clear ();
// new tests
auto it1 = m_OutboundTunnels.begin ();
auto it2 = m_InboundTunnels.begin ();
while (it1 != m_OutboundTunnels.end () && it2 != m_InboundTunnels.end ())
{
bool failed = false;
if ((*it1)->IsFailed ())
{
failed = true;
it1++;
}
if ((*it2)->IsFailed ())
{
failed = true;
it2++;
}
if (!failed)
{
uint32_t msgID = rnd.GenerateWord32 ();
m_Tests[msgID] = std::make_pair (*it1, *it2);
(*it1)->SendTunnelDataMsg ((*it2)->GetNextIdentHash (), (*it2)->GetNextTunnelID (),
CreateDeliveryStatusMsg (msgID));
it1++; it2++;
}
}
}
void TunnelPool::ProcessGarlicMessage (I2NPMessage * msg)
{
if (m_LocalDestination)
m_LocalDestination->ProcessGarlicMessage (msg);
else
{
LogPrint (eLogWarning, "Local destination doesn't exist. Dropped");
DeleteI2NPMessage (msg);
}
}
void TunnelPool::ProcessDeliveryStatus (I2NPMessage * msg)
{
I2NPDeliveryStatusMsg * deliveryStatus = (I2NPDeliveryStatusMsg *)msg->GetPayload ();
auto it = m_Tests.find (be32toh (deliveryStatus->msgID));
if (it != m_Tests.end ())
{
// restore from test failed state if any
if (it->second.first->GetState () == eTunnelStateTestFailed)
it->second.first->SetState (eTunnelStateEstablished);
if (it->second.second->GetState () == eTunnelStateTestFailed)
it->second.second->SetState (eTunnelStateEstablished);
LogPrint ("Tunnel test ", it->first, " successive. ", i2p::util::GetMillisecondsSinceEpoch () - be64toh (deliveryStatus->timestamp), " milliseconds");
m_Tests.erase (it);
DeleteI2NPMessage (msg);
}
else
{
if (m_LocalDestination)
m_LocalDestination->ProcessDeliveryStatusMessage (msg);
else
{
LogPrint (eLogWarning, "Local destination doesn't exist. Dropped");
DeleteI2NPMessage (msg);
}
}
}
std::shared_ptr<const i2p::data::RouterInfo> TunnelPool::SelectNextHop (std::shared_ptr<const i2p::data::RouterInfo> prevHop) const
{
bool isExploratory = (m_LocalDestination == &i2p::context); // TODO: implement it better
auto hop = isExploratory ? i2p::data::netdb.GetRandomRouter (prevHop):
i2p::data::netdb.GetHighBandwidthRandomRouter (prevHop);
if (!hop)
hop = i2p::data::netdb.GetRandomRouter ();
return hop;
}
void TunnelPool::CreateInboundTunnel ()
{
OutboundTunnel * outboundTunnel = GetNextOutboundTunnel ();
if (!outboundTunnel)
outboundTunnel = tunnels.GetNextOutboundTunnel ();
LogPrint ("Creating destination inbound tunnel...");
auto prevHop = i2p::context.GetSharedRouterInfo ();
std::vector<std::shared_ptr<const i2p::data::RouterInfo> > hops;
int numHops = m_NumInboundHops;
if (outboundTunnel)
{
// last hop
auto hop = outboundTunnel->GetTunnelConfig ()->GetFirstHop ()->router;
if (hop->GetIdentHash () != i2p::context.GetIdentHash ()) // outbound shouldn't be zero-hop tunnel
{
prevHop = hop;
hops.push_back (prevHop);
numHops--;
}
}
for (int i = 0; i < numHops; i++)
{
auto hop = SelectNextHop (prevHop);
prevHop = hop;
hops.push_back (hop);
}
std::reverse (hops.begin (), hops.end ());
auto * tunnel = tunnels.CreateTunnel<InboundTunnel> (new TunnelConfig (hops), outboundTunnel);
tunnel->SetTunnelPool (this);
}
void TunnelPool::RecreateInboundTunnel (InboundTunnel * tunnel)
{
OutboundTunnel * outboundTunnel = GetNextOutboundTunnel ();
if (!outboundTunnel)
outboundTunnel = tunnels.GetNextOutboundTunnel ();
LogPrint ("Re-creating destination inbound tunnel...");
auto * newTunnel = tunnels.CreateTunnel<InboundTunnel> (tunnel->GetTunnelConfig ()->Clone (), outboundTunnel);
newTunnel->SetTunnelPool (this);
}
void TunnelPool::CreateOutboundTunnel ()
{
InboundTunnel * inboundTunnel = GetNextInboundTunnel ();
if (!inboundTunnel)
inboundTunnel = tunnels.GetNextInboundTunnel ();
if (inboundTunnel)
{
LogPrint ("Creating destination outbound tunnel...");
auto prevHop = i2p::context.GetSharedRouterInfo ();
std::vector<std::shared_ptr<const i2p::data::RouterInfo> > hops;
for (int i = 0; i < m_NumOutboundHops; i++)
{
auto hop = SelectNextHop (prevHop);
prevHop = hop;
hops.push_back (hop);
}
auto * tunnel = tunnels.CreateTunnel<OutboundTunnel> (
new TunnelConfig (hops, inboundTunnel->GetTunnelConfig ()));
tunnel->SetTunnelPool (this);
}
else
LogPrint ("Can't create outbound tunnel. No inbound tunnels found");
}
void TunnelPool::RecreateOutboundTunnel (OutboundTunnel * tunnel)
{
InboundTunnel * inboundTunnel = GetNextInboundTunnel ();
if (!inboundTunnel)
inboundTunnel = tunnels.GetNextInboundTunnel ();
if (inboundTunnel)
{
LogPrint ("Re-creating destination outbound tunnel...");
auto * newTunnel = tunnels.CreateTunnel<OutboundTunnel> (
tunnel->GetTunnelConfig ()->Clone (inboundTunnel->GetTunnelConfig ()));
newTunnel->SetTunnelPool (this);
}
else
LogPrint ("Can't re-create outbound tunnel. No inbound tunnels found");
}
}
}

View File

@ -1,85 +0,0 @@
#ifndef TUNNEL_POOL__
#define TUNNEL_POOL__
#include <inttypes.h>
#include <set>
#include <vector>
#include <utility>
#include <mutex>
#include "Identity.h"
#include "LeaseSet.h"
#include "RouterInfo.h"
#include "I2NPProtocol.h"
#include "TunnelBase.h"
#include "RouterContext.h"
#include "Garlic.h"
namespace i2p
{
namespace tunnel
{
class Tunnel;
class InboundTunnel;
class OutboundTunnel;
class TunnelPool // per local destination
{
public:
TunnelPool (i2p::garlic::GarlicDestination * localDestination, int numInboundHops, int numOutboundHops, int numTunnels = 5);
~TunnelPool ();
i2p::garlic::GarlicDestination * GetLocalDestination () const { return m_LocalDestination; };
void SetLocalDestination (i2p::garlic::GarlicDestination * destination) { m_LocalDestination = destination; };
void CreateTunnels ();
void TunnelCreated (InboundTunnel * createdTunnel);
void TunnelExpired (InboundTunnel * expiredTunnel);
void TunnelCreated (OutboundTunnel * createdTunnel);
void TunnelExpired (OutboundTunnel * expiredTunnel);
std::vector<InboundTunnel *> GetInboundTunnels (int num) const;
OutboundTunnel * GetNextOutboundTunnel (OutboundTunnel * suggested = nullptr) const;
InboundTunnel * GetNextInboundTunnel (InboundTunnel * suggested = nullptr) const;
void TestTunnels ();
void ProcessGarlicMessage (I2NPMessage * msg);
void ProcessDeliveryStatus (I2NPMessage * msg);
bool IsActive () const { return m_IsActive; };
void SetActive (bool isActive) { m_IsActive = isActive; };
void DetachTunnels ();
private:
void CreateInboundTunnel ();
void CreateOutboundTunnel ();
void RecreateInboundTunnel (InboundTunnel * tunnel);
void RecreateOutboundTunnel (OutboundTunnel * tunnel);
template<class TTunnels>
typename TTunnels::value_type GetNextTunnel (TTunnels& tunnels,
typename TTunnels::value_type suggested = nullptr) const;
std::shared_ptr<const i2p::data::RouterInfo> SelectNextHop (std::shared_ptr<const i2p::data::RouterInfo> prevHop) const;
private:
i2p::garlic::GarlicDestination * m_LocalDestination;
int m_NumInboundHops, m_NumOutboundHops, m_NumTunnels;
mutable std::mutex m_InboundTunnelsMutex;
std::set<InboundTunnel *, TunnelCreationTimeCmp> m_InboundTunnels; // recent tunnel appears first
mutable std::mutex m_OutboundTunnelsMutex;
std::set<OutboundTunnel *, TunnelCreationTimeCmp> m_OutboundTunnels;
std::map<uint32_t, std::pair<OutboundTunnel *, InboundTunnel *> > m_Tests;
bool m_IsActive;
public:
// for HTTP only
const decltype(m_OutboundTunnels)& GetOutboundTunnels () const { return m_OutboundTunnels; };
const decltype(m_InboundTunnels)& GetInboundTunnels () const { return m_InboundTunnels; };
};
}
}
#endif

View File

@ -1,68 +0,0 @@
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/bind.hpp>
#include "Log.h"
#include "UPnP.h"
namespace i2p
{
UPnP::UPnP (): m_Timer (m_Service),
m_Endpoint (boost::asio::ip::udp::v4 (), UPNP_REPLY_PORT),
m_MulticastEndpoint (boost::asio::ip::address::from_string (UPNP_GROUP), UPNP_PORT),
m_Socket (m_Service, m_Endpoint.protocol ())
{
m_Socket.set_option (boost::asio::socket_base::receive_buffer_size (65535));
m_Socket.set_option (boost::asio::socket_base::send_buffer_size (65535));
m_Socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
}
UPnP::~UPnP ()
{
}
void UPnP::Run ()
{
DiscoverRouter ();
m_Service.run ();
}
void UPnP::DiscoverRouter ()
{
m_Timer.expires_from_now (boost::posix_time::seconds(5)); // 5 seconds
m_Timer.async_wait (boost::bind (&UPnP::HandleTimer, this, boost::asio::placeholders::error));
std::string address = UPNP_GROUP;
address += ":" + boost::lexical_cast<std::string>(UPNP_PORT);
std::string request = "M-SEARCH * HTTP/1.1\r\n"
"HOST: " + address + "\r\n"
"ST:" + UPNP_ROUTER + "\r\n"
"MAN:\"ssdp:discover\"\r\n"
"MX:3\r\n"
"\r\n\r\n";
m_Socket.send_to (boost::asio::buffer (request.c_str (), request.length ()), m_MulticastEndpoint);
Receive ();
}
void UPnP::Receive ()
{
m_Socket.async_receive_from (boost::asio::buffer (m_ReceiveBuffer, UPNP_MAX_PACKET_LEN), m_SenderEndpoint,
boost::bind (&UPnP::HandleReceivedFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void UPnP::HandleReceivedFrom (const boost::system::error_code& ecode, size_t bytes_transferred)
{
LogPrint ("UPnP: ", bytes_transferred, " received from ", m_SenderEndpoint.address ());
std::string str (m_ReceiveBuffer, bytes_transferred);
LogPrint (str);
m_Timer.cancel ();
}
void UPnP::HandleTimer (const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted)
{
LogPrint ("UPnP: timeout expired");
m_Service.stop ();
}
}
}

41
UPnP.h
View File

@ -1,41 +0,0 @@
#ifndef UPNP_H__
#define UPNP_H__
#include <boost/asio.hpp>
namespace i2p
{
const int UPNP_MAX_PACKET_LEN = 1500;
const char UPNP_GROUP[] = "239.255.255.250";
const int UPNP_PORT = 1900;
const int UPNP_REPLY_PORT = 1901;
const char UPNP_ROUTER[] = "urn:schemas-upnp-org:device:InternetGatewayDevice:1";
class UPnP
{
public:
UPnP ();
~UPnP ();
void Run ();
private:
void DiscoverRouter ();
void Receive ();
void HandleReceivedFrom (const boost::system::error_code& ecode, size_t bytes_transferred);
void HandleTimer (const boost::system::error_code& ecode);
private:
boost::asio::io_service m_Service;
boost::asio::deadline_timer m_Timer;
boost::asio::ip::udp::endpoint m_Endpoint, m_MulticastEndpoint, m_SenderEndpoint;
boost::asio::ip::udp::socket m_Socket;
char m_ReceiveBuffer[UPNP_MAX_PACKET_LEN];
};
}
#endif

14
Win32/.gitignore vendored
View File

@ -1,14 +0,0 @@
*
!*/
!*.h
!*.cpp
!*.bat
!*.sln
!*.vcproj
!*.vcxproj
!*.vcxproj.filters
!*.iss
!.gitignore

89
Win32/DaemonWin32.cpp Normal file
View File

@ -0,0 +1,89 @@
/*
* Copyright (c) 2013-2020, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
#include <thread>
#include <clocale>
#include "Config.h"
#include "Daemon.h"
#include "util.h"
#include "Log.h"
#ifdef _WIN32
#ifdef WIN32_APP
#include <windows.h>
#include "Win32App.h"
#endif
namespace i2p
{
namespace util
{
bool DaemonWin32::init(int argc, char* argv[])
{
setlocale(LC_CTYPE, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
setlocale(LC_TIME, "C");
i2p::log::SetThrowFunction ([](const std::string& s)
{
MessageBox(0, TEXT(s.c_str ()), TEXT("i2pd"), MB_ICONERROR | MB_TASKMODAL | MB_OK );
}
);
if (!Daemon_Singleton::init(argc, argv))
return false;
return true;
}
bool DaemonWin32::start()
{
setlocale(LC_CTYPE, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
setlocale(LC_TIME, "C");
#ifdef WIN32_APP
if (!i2p::win32::StartWin32App ()) return false;
#endif
bool ret = Daemon_Singleton::start();
if (ret && i2p::log::Logger().GetLogType() == eLogFile)
{
// TODO: find out where this garbage to console comes from
SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
}
bool insomnia; i2p::config::GetOption("insomnia", insomnia);
if (insomnia)
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
return ret;
}
bool DaemonWin32::stop()
{
#ifdef WIN32_APP
i2p::win32::StopWin32App ();
#endif
return Daemon_Singleton::stop();
}
void DaemonWin32::run ()
{
#ifdef WIN32_APP
i2p::win32::RunWin32App ();
#else
while (running)
{
std::this_thread::sleep_for (std::chrono::seconds(1));
}
#endif
}
}
}
#endif //_WIN32

View File

@ -1,282 +0,0 @@
# NSIS Installer script. (Tested with NSIS 2.64 on Windows 7)
# Author: Mikal Villa (Meeh)
# Version: 1.1
Name PurpleI2P
RequestExecutionLevel highest
SetCompressor /SOLID lzma
ShowInstDetails show
# General Symbol Definitions
!define REGKEY "SOFTWARE\$(^Name)"
!define VERSION 0.3.0.0
!define COMPANY "The Privacy Solutions Project"
!define URL "https://i2p.io"
# MUI Symbol Definitions
!define MUI_ICON "ictoopie.ico"
#!define MUI_WELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
#!define MUI_HEADERIMAGE_BITMAP "../share/pixmaps/nsis-header.bmp"
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
!define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY}
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
!define MUI_STARTMENUPAGE_DEFAULTFOLDER PurpleI2P
!define MUI_FINISHPAGE_RUN $INSTDIR\i2pd.exe
!define MUI_FINISHPAGE_SHOWREADME $INSTDIR\Readme.txt
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp"
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
# Included files
!include Sections.nsh
!include MUI2.nsh
!include nsDialogs.nsh
!include winmessages.nsh
!include logiclib.nsh
# Local included files
!include nsi\helper_readme.nsh
;!include nsi\servicelib.nsh
# Variables
Var StartMenuGroup
# Installer pages
# Execution flow of installer windows
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_README "../Readme.md"
!insertmacro MUI_PAGE_DIRECTORY
# Disabled for now. Use the bat
;Page custom mode_selection # Meeh's hack for installing and starting service.
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuGroup
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
# Uninstall pages
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
# Installer languages
!insertmacro MUI_LANGUAGE English
# Installer attributes
OutFile PurpleI2P-0.3.0.0-win32-setup.exe
InstallDir $PROGRAMFILES\PurpleI2P
CRCCheck on
XPStyle on
BrandingText " "
ShowInstDetails show
VIProductVersion 0.3.0.0
VIAddVersionKey ProductName PurpleI2P
VIAddVersionKey ProductVersion "${VERSION}"
VIAddVersionKey CompanyName "${COMPANY}"
VIAddVersionKey CompanyWebsite "${URL}"
VIAddVersionKey FileVersion "${VERSION}"
VIAddVersionKey FileDescription ""
VIAddVersionKey LegalCopyright ""
InstallDirRegKey HKCU "${REGKEY}" Path
ShowUninstDetails show
# Readme definitions
;--------------------------------
;Languages
;Set up install lang strings for 1st lang
${ReadmeLanguage} "${LANG_ENGLISH}" \
"Read Me" \
"Please review the following important information." \
"About $(^name):" \
"$\n Click on scrollbar arrows or press Page Down to review the entire text."
;Add 2nd language
!insertmacro MUI_LANGUAGE "Norwegian"
;set up install lang strings for second lang
${ReadmeLanguage} "${LANG_NORWEGIAN}" \
"Les meg!" \
"Vennligst les informasjonen om hvordan du skal bruke PurpleI2P." \
"Om $(^name):" \
"$\n Klikk på scrollbaren til høyre for å se hele innholdet."
;--------------------------------
# Installer sections
Section -Main SEC0000
SetOutPath $INSTDIR
SetOverwrite on
File /oname=i2pd.exe Release\i2pd.exe
File /oname=install_service.bat install_service.bat
File /oname=uninstall_service.bat uninstall_service.bat
File /oname=LICENSE.txt ..\LICENSE
File /oname=Readme.txt ..\README.md
SetOutPath $INSTDIR\src
File /r /x *.nsi /x *.rc /x *.exe /x *.obj /x *.nsh /x *.sln /x *.vcxproj /x *.tlog /x *.log /x *.res /x *.pdb /x *.suo /x *.opensdf /x *.filters /x *.sdf /x *.iss /x *.aps /x .gitignore /x *.o ../\*.*
SetOutPath $INSTDIR
RMDir /r /REBOOTOK $INSTDIR\src\.git # Remove git directory
RMDir /r /REBOOTOK $INSTDIR\src\Win32\Release # Removing release directory
RMDir /r /REBOOTOK $INSTDIR\src\Win32\nsi
WriteRegStr HKCU "${REGKEY}\Components" Main 1
SectionEnd
Section -post SEC0001
WriteRegStr HKCU "${REGKEY}" Path $INSTDIR
SetOutPath $INSTDIR
WriteUninstaller $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory $SMPROGRAMS\$StartMenuGroup
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\PurpleI2P.lnk" $INSTDIR\i2pd.exe
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Install PurpleI2P Service.lnk" $INSTDIR\install_service.bat
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall PurpleI2P Service.lnk" $INSTDIR\uninstall_service.bat
CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall PurpleI2P.lnk" $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_END
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" Publisher "${COMPANY}"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" URLInfoAbout "${URL}"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayIcon $INSTDIR\uninstall.exe
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1
WriteRegStr HKCR "i2pd" "URL Protocol" ""
WriteRegStr HKCR "i2pd" "" "URL:i2pd" # TODO: if a instance of own is found, relaunch with a proxyfied browser to open webage. (e.g i2pd://meeh.i2p)
WriteRegStr HKCR "i2pd\DefaultIcon" "" $INSTDIR\i2pd.exe
WriteRegStr HKCR "i2pd\shell\open\command" "" '"$INSTDIR\i2pd.exe" "%1"'
SectionEnd
# Macro for selecting uninstaller sections
!macro SELECT_UNSECTION SECTION_NAME UNSECTION_ID
Push $R0
ReadRegStr $R0 HKCU "${REGKEY}\Components" "${SECTION_NAME}"
StrCmp $R0 1 0 next${UNSECTION_ID}
!insertmacro SelectSection "${UNSECTION_ID}"
GoTo done${UNSECTION_ID}
next${UNSECTION_ID}:
!insertmacro UnselectSection "${UNSECTION_ID}"
done${UNSECTION_ID}:
Pop $R0
!macroend
# Uninstaller sections
Section /o -un.Main UNSEC0000
Delete /REBOOTOK $INSTDIR\i2pd.exe
Delete /REBOOTOK $INSTDIR\LICENSE.txt
Delete /REBOOTOK $INSTDIR\Readme.txt
Delete /REBOOTOK $INSTDIR\install_service.bat
Delete /REBOOTOK $INSTDIR\uninstall_service.bat
RMDir /r /REBOOTOK $INSTDIR\src
DeleteRegValue HKCU "${REGKEY}\Components" Main
SectionEnd
Section -un.post UNSEC0001
DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall PurpleI2P.lnk"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\PurpleI2P.lnk"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Install PurpleI2P Service.lnk"
Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\UnInstall PurpleI2P Service.lnk"
Delete /REBOOTOK "$SMSTARTUP\PurpleI2P.lnk"
Delete /REBOOTOK $INSTDIR\uninstall.exe
Delete /REBOOTOK $INSTDIR\debug.log
DeleteRegValue HKCU "${REGKEY}" StartMenuGroup
DeleteRegValue HKCU "${REGKEY}" Path
DeleteRegKey /IfEmpty HKCU "${REGKEY}\Components"
DeleteRegKey /IfEmpty HKCU "${REGKEY}"
DeleteRegKey HKCR "i2pd"
RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup
RmDir /REBOOTOK $INSTDIR
Push $R0
StrCpy $R0 $StartMenuGroup 1
StrCmp $R0 ">" no_smgroup
no_smgroup:
Pop $R0
SectionEnd
; var hwndExecModeRadio
; var hwndRunServiceNowRadio
; Function mode_selection
; nsDialogs::Create 1018
; Pop $0
; ${NSD_CreateLabel} 0 10 75% 20u "How would you like PurpleI2P (i2pd) to run?"
; Pop $0
; ${NSD_CreateRadioButton} 20 60 80% 25u "Service Mode"
; Pop $hwndExecModeRadio
; ${NSD_AddStyle} $hwndExecModeRadio ${WS_GROUP}
; ${NSD_CreateRadioButton} 20 90 80% 25u "Command line Mode"
; Pop $0
; ${NSD_CreateButton} 20 150 -40 14u "Do it!"
; Pop $0
; ${NSD_OnClick} $0 perform_mode
; nsDialogs::Show
; FunctionEnd
; Function start_now_selection
; nsDialogs::Create 1018
; Pop $0
; ${NSD_CreateLabel} 0 10 75% 20u "Enable the service now?"
; Pop $0
; ${NSD_CreateRadioButton} 20 60 80% 25u "Yes"
; Pop $hwndRunServiceNowRadio
; ${NSD_AddStyle} $hwndRunServiceNowRadio ${WS_GROUP}
; ${NSD_CreateRadioButton} 20 90 80% 25u "No"
; Pop $0
; ${NSD_CreateButton} 20 150 -40 14u "Do it!"
; Pop $0
; ${NSD_OnClick} $0 perform_mode
; nsDialogs::Show
; FunctionEnd
; Function perform_mode
; ${NSD_GetState} $hwndExecModeRadio $0
; ${If} $0 = ${BST_CHECKED}
; Call service_mode
; ${EndIF}
; FunctionEnd
; Function start_now
; ${NSD_GetState} $hwndRunServiceNowRadio $0
; ${If} $0 = ${BST_CHECKED}
; Call start_now_selection
; ${EndIF}
; FunctionEnd
; Function service_mode
; Push "create"
; Push "PurpleI2P Service"
; Push "$INSTDIR\i2pd.exe;autostart=1;display=PurpleI2P"
; Call Service
; Pop $0 ; Actually more to write than !insertmacro, but much more fun :D
; Push "start"
; Push "PurpleI2P Service"
; Call Service
; Pop $0
; Call start_now
; !define MUI_FINISHPAGE_RUN_NOTCHECKED
; !define MUI_FINISHPAGE_RUN_TEXT "No need to run now since we already installed and launched it as a Windows service!"
; FunctionEnd
# Installer functions
Function .onInit
InitPluginsDir
!insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd
# Uninstaller functions
Function un.onInit
ReadRegStr $INSTDIR HKCU "${REGKEY}" Path
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup
!insertmacro SELECT_UNSECTION Main ${UNSEC0000}
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd

View File

@ -1,84 +0,0 @@
Building i2pd for Windows
=========================
Requirements for building:
* Visual Studio 2013 (tested with VS2013 Update 1, Update 3, and Update 4 RC)
* Boost (tested with 1.56 and 1.57)
* Crypto++ (tested with 5.6.2)
Building Boost (32-bit)
-----------------------
Open a Visual Studio x86 command prompt and run the following:
cd C:\path\to\boost\sources
bootstrap
b2 toolset=msvc-12.0 --build-type=complete --libdir=C:\Boost\lib\Win32 install --with-filesystem --with-program_options --with-regex --with-date_time
Building Boost (64-bit)
-----------------------
Open a Visual Studio x64 command prompt and run the following:
cd C:\path\to\boost\sources
bootstrap
b2 toolset=msvc-12.0 --build-type=complete --libdir=C:\Boost\lib\x64 architecture=x86 address-model=64 install --with-filesystem --with-program_options --with-regex --with-date_time
After Boost is compiled, set the environment variable `BOOST` to the directory
Boost was installed to. If you followed the instructions outlined here, you
should set it to `C:\Boost`. Additionally, set the BOOSTVER variable to the
version of Boost that you're using, but instead of a '.' use a '_'. For
example, I have `BOOSTVER` set to `1_57`.
Building Crypto++
-----------------
* Open the crypttest Solution in VS2013
* Visual Studio will ask to update the Solution/Project. Allow it.
* Build the `cryptopp` project, both the Debug and Release targets and for both
Win32 and x64.
* Create a folder called `cryptopp` in the crypto++ source directory, then copy
the header files to this new directory.
* Set the `CRYPTOPP` environment variable pointing to the Crypto++ source directory.
Building i2pd
-------------
## Prep work ##
I strongly advise setting up your own `INCLUDES` and `LIBS` instead of relying
on the settings in the i2pd project file. By using your own settings, if the
i2pd devs change the paths in the project file, your builds will still work.
To do this, create or edit the file
`%localappdata%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user`.
For comparison, my file is reproduced below:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<LibraryPath>$(CRYPTOPP)\$(Platform)\Output\$(Configuration);$(BOOST)\lib\$(Platform);$(LibraryPath)</LibraryPath>
<IncludePath>$(CRYPTOPP);$(BOOST)\include\boost-$(BOOSTVER);$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup />
<ItemGroup />
</Project>
If you want to build x64 binaries as well, you'll want to edit or create the
file `%localappdata%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user`. If you
followed the steps outlined earlier you can copy (or link) the win32 file to
the x64 one.
## Anti-Climatic End ##
After following the above instructions, you'll be able to build Debug Win32,
Debug x64, Release Win32, and Release x64 i2pd binaries.

Binary file not shown.

38
Win32/Resource.rc2 Normal file
View File

@ -0,0 +1,38 @@
#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif //APSTUDIO_INVOKED
#include "../libi2pd/version.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION I2PD_VERSION_MAJOR,I2PD_VERSION_MINOR,I2PD_VERSION_MICRO,I2PD_VERSION_PATCH
PRODUCTVERSION I2P_VERSION_MAJOR,I2P_VERSION_MINOR,I2P_VERSION_MICRO,I2P_VERSION_PATCH
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Purple I2P"
VALUE "FileDescription", "C++ I2P daemon"
VALUE "FileVersion", I2PD_VERSION
VALUE "InternalName", CODENAME
VALUE "LegalCopyright", "Copyright (C) 2013-2020, The PurpleI2P Project"
VALUE "OriginalFilename", "i2pd"
VALUE "ProductName", "Purple I2P"
VALUE "ProductVersion", I2P_VERSION
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

483
Win32/Win32App.cpp Normal file
View File

@ -0,0 +1,483 @@
/*
* Copyright (c) 2013-2020, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <shellapi.h>
#include "ClientContext.h"
#include "Config.h"
#include "NetDb.hpp"
#include "RouterContext.h"
#include "Transports.h"
#include "Tunnel.h"
#include "version.h"
#include "resource.h"
#include "Daemon.h"
#include "Win32App.h"
#include "Win32NetState.h"
#define ID_ABOUT 2000
#define ID_EXIT 2001
#define ID_CONSOLE 2002
#define ID_APP 2003
#define ID_GRACEFUL_SHUTDOWN 2004
#define ID_STOP_GRACEFUL_SHUTDOWN 2005
#define ID_RELOAD 2006
#define ID_ACCEPT_TRANSIT 2007
#define ID_DECLINE_TRANSIT 2008
#define ID_TRAY_ICON 2050
#define WM_TRAYICON (WM_USER + 1)
#define IDT_GRACEFUL_SHUTDOWN_TIMER 2100
#define FRAME_UPDATE_TIMER 2101
#define IDT_GRACEFUL_TUNNELCHECK_TIMER 2102
namespace i2p
{
namespace win32
{
DWORD g_GracefulShutdownEndtime = 0;
static void ShowPopupMenu (HWND hWnd, POINT *curpos, int wDefaultItem)
{
HMENU hPopup = CreatePopupMenu();
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_CONSOLE, "Open &console");
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_APP, "Show app");
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_ABOUT, "&About...");
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
if(!i2p::context.AcceptsTunnels())
InsertMenu (hPopup, -1,
i2p::util::DaemonWin32::Instance ().isGraceful ? MF_BYPOSITION | MF_STRING | MF_GRAYED : MF_BYPOSITION | MF_STRING,
ID_ACCEPT_TRANSIT, "Accept &transit");
else
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_DECLINE_TRANSIT, "Decline &transit");
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_RELOAD, "&Reload tunnels config");
if (!i2p::util::DaemonWin32::Instance ().isGraceful)
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_GRACEFUL_SHUTDOWN, "&Graceful shutdown");
else
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_STOP_GRACEFUL_SHUTDOWN, "Stop &graceful shutdown");
InsertMenu (hPopup, -1, MF_BYPOSITION | MF_STRING, ID_EXIT, "E&xit");
SetMenuDefaultItem (hPopup, ID_CONSOLE, FALSE);
SendMessage (hWnd, WM_INITMENUPOPUP, (WPARAM)hPopup, 0);
POINT p;
if (!curpos)
{
GetCursorPos (&p);
curpos = &p;
}
WORD cmd = TrackPopupMenu (hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, curpos->x, curpos->y, 0, hWnd, NULL);
SendMessage (hWnd, WM_COMMAND, cmd, 0);
DestroyMenu(hPopup);
}
static void AddTrayIcon (HWND hWnd, bool notify = false)
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.uID = ID_TRAY_ICON;
nid.uFlags = notify ? NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO : NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
nid.uCallbackMessage = WM_TRAYICON;
nid.hIcon = LoadIcon (GetModuleHandle(NULL), MAKEINTRESOURCE (MAINICON));
strcpy (nid.szTip, "i2pd");
if (notify) strcpy (nid.szInfo, "i2pd is starting");
Shell_NotifyIcon(NIM_ADD, &nid );
}
static void RemoveTrayIcon (HWND hWnd)
{
NOTIFYICONDATA nid;
nid.hWnd = hWnd;
nid.uID = ID_TRAY_ICON;
Shell_NotifyIcon (NIM_DELETE, &nid);
}
static void ShowUptime (std::stringstream& s, int seconds)
{
int num;
if ((num = seconds / 86400) > 0) {
s << num << " days, ";
seconds -= num * 86400;
}
if ((num = seconds / 3600) > 0) {
s << num << " hours, ";
seconds -= num * 3600;
}
if ((num = seconds / 60) > 0) {
s << num << " min, ";
seconds -= num * 60;
}
s << seconds << " seconds\n";
}
template <typename size> static void ShowTransfered (std::stringstream& s, size transfer)
{
auto bytes = transfer & 0x03ff;
transfer >>= 10;
auto kbytes = transfer & 0x03ff;
transfer >>= 10;
auto mbytes = transfer & 0x03ff;
transfer >>= 10;
auto gbytes = transfer & 0x03ff;
if (gbytes)
s << gbytes << " GB, ";
if (mbytes)
s << mbytes << " MB, ";
if (kbytes)
s << kbytes << " KB, ";
s << bytes << " Bytes\n";
}
static void ShowNetworkStatus (std::stringstream& s, RouterStatus status)
{
switch (status)
{
case eRouterStatusOK: s << "OK"; break;
case eRouterStatusTesting: s << "Test"; break;
case eRouterStatusFirewalled: s << "FW"; break;
case eRouterStatusUnknown: s << "Unk"; break;
case eRouterStatusProxy: s << "Proxy"; break;
case eRouterStatusMesh: s << "Mesh"; break;
case eRouterStatusError:
{
s << "Err";
switch (i2p::context.GetError ())
{
case eRouterErrorClockSkew:
s << " - Clock skew";
break;
case eRouterErrorOffline:
s << " - Offline";
break;
case eRouterErrorSymmetricNAT:
s << " - Symmetric NAT";
break;
default: ;
}
break;
}
default: s << "Unk";
}
}
static void PrintMainWindowText (std::stringstream& s)
{
s << "\n";
s << "Status: ";
ShowNetworkStatus (s, i2p::context.GetStatus ());
if (i2p::context.SupportsV6 ())
{
s << " / ";
ShowNetworkStatus (s, i2p::context.GetStatusV6 ());
}
s << "; ";
s << "Success Rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate() << "%\n";
s << "Uptime: "; ShowUptime(s, i2p::context.GetUptime ());
if (g_GracefulShutdownEndtime != 0)
{
DWORD GracefulTimeLeft = (g_GracefulShutdownEndtime - GetTickCount()) / 1000;
s << "Graceful shutdown, time left: "; ShowUptime(s, GracefulTimeLeft);
}
else
s << "\n";
s << "Inbound: " << i2p::transport::transports.GetInBandwidth() / 1024 << " KiB/s; ";
s << "Outbound: " << i2p::transport::transports.GetOutBandwidth() / 1024 << " KiB/s\n";
s << "Received: "; ShowTransfered (s, i2p::transport::transports.GetTotalReceivedBytes());
s << "Sent: "; ShowTransfered (s, i2p::transport::transports.GetTotalSentBytes());
s << "\n";
s << "Routers: " << i2p::data::netdb.GetNumRouters () << "; ";
s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << "; ";
s << "LeaseSets: " << i2p::data::netdb.GetNumLeaseSets () << "\n";
s << "Tunnels: ";
s << "In: " << i2p::tunnel::tunnels.CountInboundTunnels() << "; ";
s << "Out: " << i2p::tunnel::tunnels.CountOutboundTunnels() << "; ";
s << "Transit: " << i2p::tunnel::tunnels.CountTransitTunnels() << "\n";
s << "\n";
}
static LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UINT s_uTaskbarRestart;
switch (uMsg)
{
case WM_CREATE:
{
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
AddTrayIcon (hWnd, true);
break;
}
case WM_CLOSE:
{
RemoveTrayIcon (hWnd);
KillTimer (hWnd, FRAME_UPDATE_TIMER);
KillTimer (hWnd, IDT_GRACEFUL_SHUTDOWN_TIMER);
KillTimer (hWnd, IDT_GRACEFUL_TUNNELCHECK_TIMER);
PostQuitMessage (0);
break;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case ID_ABOUT:
{
std::stringstream text;
text << "Version: " << I2PD_VERSION << " " << CODENAME;
MessageBox( hWnd, TEXT(text.str ().c_str ()), TEXT("i2pd"), MB_ICONINFORMATION | MB_OK );
return 0;
}
case ID_EXIT:
{
PostMessage (hWnd, WM_CLOSE, 0, 0);
return 0;
}
case ID_ACCEPT_TRANSIT:
{
i2p::context.SetAcceptsTunnels (true);
std::stringstream text;
text << "I2Pd now accept transit tunnels";
MessageBox( hWnd, TEXT(text.str ().c_str ()), TEXT("i2pd"), MB_ICONINFORMATION | MB_OK );
return 0;
}
case ID_DECLINE_TRANSIT:
{
i2p::context.SetAcceptsTunnels (false);
std::stringstream text;
text << "I2Pd now decline new transit tunnels";
MessageBox( hWnd, TEXT(text.str ().c_str ()), TEXT("i2pd"), MB_ICONINFORMATION | MB_OK );
return 0;
}
case ID_GRACEFUL_SHUTDOWN:
{
i2p::context.SetAcceptsTunnels (false);
SetTimer (hWnd, IDT_GRACEFUL_SHUTDOWN_TIMER, 10*60*1000, nullptr); // 10 minutes
SetTimer (hWnd, IDT_GRACEFUL_TUNNELCHECK_TIMER, 1000, nullptr); // check tunnels every second
g_GracefulShutdownEndtime = GetTickCount() + 10*60*1000;
i2p::util::DaemonWin32::Instance ().isGraceful = true;
return 0;
}
case ID_STOP_GRACEFUL_SHUTDOWN:
{
i2p::context.SetAcceptsTunnels (true);
KillTimer (hWnd, IDT_GRACEFUL_SHUTDOWN_TIMER);
KillTimer (hWnd, IDT_GRACEFUL_TUNNELCHECK_TIMER);
g_GracefulShutdownEndtime = 0;
i2p::util::DaemonWin32::Instance ().isGraceful = false;
return 0;
}
case ID_RELOAD:
{
i2p::client::context.ReloadConfig();
std::stringstream text;
text << "I2Pd reloading configs...";
MessageBox( hWnd, TEXT(text.str ().c_str ()), TEXT("i2pd"), MB_ICONINFORMATION | MB_OK );
return 0;
}
case ID_CONSOLE:
{
char buf[30];
std::string httpAddr; i2p::config::GetOption("http.address", httpAddr);
uint16_t httpPort; i2p::config::GetOption("http.port", httpPort);
snprintf(buf, 30, "http://%s:%d", httpAddr.c_str(), httpPort);
ShellExecute(NULL, "open", buf, NULL, NULL, SW_SHOWNORMAL);
return 0;
}
case ID_APP:
{
ShowWindow(hWnd, SW_SHOW);
SetTimer(hWnd, FRAME_UPDATE_TIMER, 3000, NULL);
return 0;
}
}
break;
}
case WM_SYSCOMMAND:
{
switch (wParam)
{
case SC_MINIMIZE:
{
ShowWindow(hWnd, SW_HIDE);
KillTimer (hWnd, FRAME_UPDATE_TIMER);
return 0;
}
case SC_CLOSE:
{
std::string close; i2p::config::GetOption("close", close);
if (0 == close.compare("ask"))
switch(::MessageBox(hWnd, "Would you like to minimize instead of exiting?"
" You can add 'close' configuration option. Valid values are: ask, minimize, exit.",
"Minimize instead of exiting?", MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON1))
{
case IDYES: close = "minimize"; break;
case IDNO: close = "exit"; break;
default: return 0;
}
if (0 == close.compare("minimize"))
{
ShowWindow(hWnd, SW_HIDE);
KillTimer (hWnd, FRAME_UPDATE_TIMER);
return 0;
}
if (0 != close.compare("exit"))
{
::MessageBox(hWnd, close.c_str(), "Unknown close action in config", MB_OK | MB_ICONWARNING);
return 0;
}
}
}
}
case WM_TRAYICON:
{
switch (lParam)
{
case WM_LBUTTONUP:
case WM_RBUTTONUP:
{
SetForegroundWindow (hWnd);
ShowPopupMenu(hWnd, NULL, -1);
PostMessage (hWnd, WM_APP + 1, 0, 0);
break;
}
}
break;
}
case WM_TIMER:
{
switch(wParam)
{
case IDT_GRACEFUL_SHUTDOWN_TIMER:
{
g_GracefulShutdownEndtime = 0;
PostMessage (hWnd, WM_CLOSE, 0, 0); // exit
return 0;
}
case IDT_GRACEFUL_TUNNELCHECK_TIMER:
{
if (i2p::tunnel::tunnels.CountTransitTunnels() == 0)
PostMessage (hWnd, WM_CLOSE, 0, 0);
else
SetTimer (hWnd, IDT_GRACEFUL_TUNNELCHECK_TIMER, 1000, nullptr);
return 0;
}
case FRAME_UPDATE_TIMER:
{
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}
}
break;
}
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
RECT rp;
HFONT hFont;
std::stringstream s; PrintMainWindowText (s);
hDC = BeginPaint (hWnd, &ps);
GetClientRect(hWnd, &rp);
SetTextColor(hDC, 0x00D43B69);
hFont = CreateFont(18,0,0,0,0,0,0,0,DEFAULT_CHARSET,0,0,0,0,TEXT("Times New Roman"));
SelectObject(hDC,hFont);
DrawText(hDC, TEXT(s.str().c_str()), s.str().length(), &rp, DT_CENTER|DT_VCENTER);
DeleteObject(hFont);
EndPaint(hWnd, &ps);
break;
}
default:
{
if (uMsg == s_uTaskbarRestart)
AddTrayIcon (hWnd, false);
break;
}
}
return DefWindowProc( hWnd, uMsg, wParam, lParam);
}
bool StartWin32App ()
{
if (FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd")))
{
MessageBox(NULL, TEXT("I2Pd is running already"), TEXT("Warning"), MB_OK);
return false;
}
// register main window
auto hInst = GetModuleHandle(NULL);
WNDCLASSEX wclx;
memset (&wclx, 0, sizeof(wclx));
wclx.cbSize = sizeof(wclx);
wclx.style = 0;
wclx.lpfnWndProc = WndProc;
//wclx.cbClsExtra = 0;
//wclx.cbWndExtra = 0;
wclx.hInstance = hInst;
wclx.hIcon = LoadIcon (hInst, MAKEINTRESOURCE(MAINICON));
wclx.hCursor = LoadCursor (NULL, IDC_ARROW);
//wclx.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wclx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wclx.lpszMenuName = NULL;
wclx.lpszClassName = I2PD_WIN32_CLASSNAME;
RegisterClassEx (&wclx);
// create new window
if (!CreateWindow(I2PD_WIN32_CLASSNAME, TEXT("i2pd"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 100, 100, 350, 210, NULL, NULL, hInst, NULL))
{
MessageBox(NULL, "Failed to create main window", TEXT("Warning!"), MB_ICONERROR | MB_OK | MB_TOPMOST);
return false;
}
SubscribeToEvents();
return true;
}
int RunWin32App ()
{
MSG msg;
while (GetMessage (&msg, NULL, 0, 0 ))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
void StopWin32App ()
{
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
if (hWnd)
PostMessage (hWnd, WM_COMMAND, MAKEWPARAM(ID_EXIT, 0), 0);
// UnSubscribeFromEvents(); // TODO: understand why unsubscribing crashes app
UnregisterClass (I2PD_WIN32_CLASSNAME, GetModuleHandle(NULL));
}
bool GracefulShutdown ()
{
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
if (hWnd)
PostMessage (hWnd, WM_COMMAND, MAKEWPARAM(ID_GRACEFUL_SHUTDOWN, 0), 0);
return hWnd;
}
bool StopGracefulShutdown ()
{
HWND hWnd = FindWindow (I2PD_WIN32_CLASSNAME, TEXT("i2pd"));
if (hWnd)
PostMessage (hWnd, WM_COMMAND, MAKEWPARAM(ID_STOP_GRACEFUL_SHUTDOWN, 0), 0);
return hWnd;
}
}
}

27
Win32/Win32App.h Normal file
View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2013-2020, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
#ifndef WIN32APP_H__
#define WIN32APP_H__
#define I2PD_WIN32_CLASSNAME "i2pd main window"
namespace i2p
{
namespace win32
{
extern DWORD g_GracefulShutdownEndtime;
bool StartWin32App ();
void StopWin32App ();
int RunWin32App ();
bool GracefulShutdown ();
bool StopGracefulShutdown ();
}
}
#endif // WIN32APP_H__

86
Win32/Win32NetState.cpp Normal file
View File

@ -0,0 +1,86 @@
/*
* Copyright (c) 2013-2020, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
#if WINVER != 0x0501 // supported since Vista
#include "Win32NetState.h"
#include <windows.h>
#include "Log.h"
IUnknown *pUnknown = nullptr;
INetworkListManager *pNetworkListManager = nullptr;
IConnectionPointContainer *pCPContainer = nullptr;
IConnectionPoint *pConnectPoint = nullptr;
DWORD Cookie = 0;
void SubscribeToEvents()
{
LogPrint(eLogInfo, "NetState: Trying to subscribe to NetworkListManagerEvents");
CoInitialize(NULL);
HRESULT Result = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown);
if (SUCCEEDED(Result))
{
Result = pUnknown->QueryInterface(IID_INetworkListManager, (void **)&pNetworkListManager);
if (SUCCEEDED(Result))
{
VARIANT_BOOL IsConnect = VARIANT_FALSE;
Result = pNetworkListManager->IsConnectedToInternet(&IsConnect);
if (SUCCEEDED(Result)) {
i2p::transport::transports.SetOnline (true);
LogPrint(eLogInfo, "NetState: current state: ", IsConnect == VARIANT_TRUE ? "connected" : "disconnected");
}
Result = pNetworkListManager->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPContainer);
if (SUCCEEDED(Result))
{
Result = pCPContainer->FindConnectionPoint(IID_INetworkListManagerEvents, &pConnectPoint);
if(SUCCEEDED(Result))
{
CNetworkListManagerEvent *NetEvent = new CNetworkListManagerEvent;
Result = pConnectPoint->Advise((IUnknown *)NetEvent, &Cookie);
if (SUCCEEDED(Result))
LogPrint(eLogInfo, "NetState: Successfully subscribed to NetworkListManagerEvent messages");
else
LogPrint(eLogError, "NetState: Unable to subscribe to NetworkListManagerEvent messages");
} else
LogPrint(eLogError, "NetState: Unable to find interface connection point");
} else
LogPrint(eLogError, "NetState: Unable to query NetworkListManager interface");
} else
LogPrint(eLogError, "NetState: Unable to query global interface");
} else
LogPrint(eLogError, "NetState: Unable to create INetworkListManager interface");
}
void UnSubscribeFromEvents()
{
try
{
if (pConnectPoint) {
pConnectPoint->Unadvise(Cookie);
pConnectPoint->Release();
}
if (pCPContainer)
pCPContainer->Release();
if (pNetworkListManager)
pNetworkListManager->Release();
if (pUnknown)
pUnknown->Release();
CoUninitialize();
}
catch (std::exception& ex)
{
LogPrint (eLogError, "NetState: received exception: ", ex.what ());
}
}
#endif // WINVER

94
Win32/Win32NetState.h Normal file
View File

@ -0,0 +1,94 @@
/*
* Copyright (c) 2013-2020, The PurpleI2P Project
*
* This file is part of Purple i2pd project and licensed under BSD3
*
* See full license text in LICENSE file at top of project tree
*/
#ifndef WIN_32_NETSTATE_H__
#define WIN_32_NETSTATE_H__
#if WINVER != 0x0501 // supported since Vista
#include <netlistmgr.h>
#include <ocidl.h>
#include "Log.h"
#include "Transports.h"
class CNetworkListManagerEvent : public INetworkListManagerEvents
{
public:
CNetworkListManagerEvent() : m_ref(1) { }
~CNetworkListManagerEvent() { }
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
HRESULT Result = S_OK;
if (IsEqualIID(riid, IID_IUnknown)) {
*ppvObject = (IUnknown *)this;
} else if (IsEqualIID(riid ,IID_INetworkListManagerEvents)) {
*ppvObject = (INetworkListManagerEvents *)this;
} else {
Result = E_NOINTERFACE;
}
AddRef();
return Result;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return (ULONG)InterlockedIncrement(&m_ref);
}
ULONG STDMETHODCALLTYPE Release()
{
LONG Result = InterlockedDecrement(&m_ref);
if (Result == 0)
delete this;
return (ULONG)Result;
}
virtual HRESULT STDMETHODCALLTYPE ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
{
if (newConnectivity == NLM_CONNECTIVITY_DISCONNECTED) {
i2p::transport::transports.SetOnline (false);
LogPrint(eLogInfo, "NetState: disconnected from network");
}
if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) != 0) {
i2p::transport::transports.SetOnline (true);
LogPrint(eLogInfo, "NetState: connected to internet with IPv4 capability");
}
if (((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) != 0) {
i2p::transport::transports.SetOnline (true);
LogPrint(eLogInfo, "NetState: connected to internet with IPv6 capability");
}
if (
(((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV4_INTERNET) == 0) &&
(((int)newConnectivity & (int)NLM_CONNECTIVITY_IPV6_INTERNET) == 0)
) {
i2p::transport::transports.SetOnline (false);
LogPrint(eLogInfo, "NetState: connected without internet access");
}
return S_OK;
}
private:
LONG m_ref;
};
void SubscribeToEvents();
void UnSubscribeFromEvents();
#else // WINVER == 0x0501
void SubscribeToEvents() { }
void UnSubscribeFromEvents() { }
#endif // WINVER
#endif

Some files were not shown because too many files have changed in this diff Show More