fixes and added images
This commit is contained in:
parent
837caa17e0
commit
271a19bd2c
31
README.md
31
README.md
@ -0,0 +1,31 @@
|
|||||||
|
# youandme
|
||||||
|
|
||||||
|
Python library to share data anonymously and securely* with limited traffic metadata.
|
||||||
|
|
||||||
|
\* The ID one connects to a host with must be shared via a secure (private, authenticated) channel.
|
||||||
|
|
||||||
|
`$ pip install youandme`
|
||||||
|
|
||||||
|
# why
|
||||||
|
|
||||||
|
In normal socket connections, Eve can see when Alex and Bob communicate and the size of their communications.
|
||||||
|
|
||||||
|
This library sends continuous streams of data even when no information is being communicated, in order to increase unobservability of transmission times and packet sizes.
|
||||||
|
|
||||||
|
Anonymity and encryption is provided via Tor onion services, though this library could easily be adapted to use plaintext (and encryption by an application) or
|
||||||
|
|
||||||
|
|
||||||
|
# security
|
||||||
|
|
||||||
|
As stated above, this library does no authentication. However, if the ID is shared privately and safely, the tunnel will have roughly the security of a Tor v3 onion service, with increased metadata unobservability.
|
||||||
|
|
||||||
|
|
||||||
|
## What an attacker sees in a normal Tor connection
|
||||||
|
|
||||||
|
![](no-dummy.png)
|
||||||
|
|
||||||
|
|
||||||
|
## What an attacker sees in a youandme connection
|
||||||
|
|
||||||
|
|
||||||
|
![](dummy.png)
|
BIN
no-dummy.png
Normal file
BIN
no-dummy.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 73 KiB |
9
setup.py
9
setup.py
@ -1,8 +1,15 @@
|
|||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
|
from os import path
|
||||||
|
this_directory = path.abspath(path.dirname(__file__))
|
||||||
|
with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f:
|
||||||
|
long_description = f.read()
|
||||||
|
|
||||||
|
|
||||||
setup(name='youandme',
|
setup(name='youandme',
|
||||||
version='0.0.0',
|
version='0.0.0',
|
||||||
description='Unix philosophy private messages via raw pipes and metadata paranoia',
|
description='Simple private data sharing via bytearrays, Tor tunneling and metadata paranoia',
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type='text/markdown',
|
||||||
author='Kevin Froman',
|
author='Kevin Froman',
|
||||||
author_email='beardog@mailbox.org',
|
author_email='beardog@mailbox.org',
|
||||||
url='https://chaoswebs.net',
|
url='https://chaoswebs.net',
|
||||||
|
27
src/yam.py
27
src/yam.py
@ -23,7 +23,6 @@ def connector(host, send_data, recv_data, address="", control_port=1337, socks_p
|
|||||||
result = sock.connect_ex(('127.0.0.1', socks_port))
|
result = sock.connect_ex(('127.0.0.1', socks_port))
|
||||||
if result != 0:
|
if result != 0:
|
||||||
launch_tor(control_port=control_port, socks_port=socks_port)
|
launch_tor(control_port=control_port, socks_port=socks_port)
|
||||||
print(host)
|
|
||||||
if host:
|
if host:
|
||||||
with Controller.from_port(port=control_port) as controller:
|
with Controller.from_port(port=control_port) as controller:
|
||||||
controller.authenticate()
|
controller.authenticate()
|
||||||
@ -39,15 +38,15 @@ def connector(host, send_data, recv_data, address="", control_port=1337, socks_p
|
|||||||
)
|
)
|
||||||
_Address.address = serv.service_id
|
_Address.address = serv.service_id
|
||||||
conn, addr = s.accept()
|
conn, addr = s.accept()
|
||||||
server(1, controller, conn, send_data, recv_data)
|
server(0.01, controller, conn, send_data, recv_data)
|
||||||
else:
|
else:
|
||||||
print('adderr', address)
|
|
||||||
if not address.endswith('.onion'):
|
if not address.endswith('.onion'):
|
||||||
address += '.onion'
|
address += '.onion'
|
||||||
client(1, address, socks_port, send_data, recv_data)
|
client(0.01, address, socks_port, send_data, recv_data)
|
||||||
|
|
||||||
|
|
||||||
def chat(mode, send_data, recv_data):
|
def chat(mode, send_data, recv_data):
|
||||||
|
display_buffer = []
|
||||||
if mode == 'host':
|
if mode == 'host':
|
||||||
while _Address.address == "":
|
while _Address.address == "":
|
||||||
sleep(0.01)
|
sleep(0.01)
|
||||||
@ -56,22 +55,32 @@ def chat(mode, send_data, recv_data):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
char = chr(recv_data.pop(0))
|
char = chr(recv_data.pop(0))
|
||||||
print('')
|
display_buffer.append(char)
|
||||||
print(char, end='')
|
if char == "\n" or char == "\r\n" or len(display_buffer) > 100:
|
||||||
|
#print("\033[1;33m", char, "\033[0m", end="\n")
|
||||||
|
while len(display_buffer) != 0:
|
||||||
|
#print("\033[1;33m", display_buffer.pop(0), "\033[0m", end='')
|
||||||
|
print("\033[1;33m" + display_buffer.pop(0) + "\033[0m", end="")
|
||||||
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
Thread(target=display_new, daemon=True).start()
|
Thread(target=display_new, daemon=True).start()
|
||||||
def make_message():
|
def make_message():
|
||||||
while True:
|
while True:
|
||||||
new = input().encode('utf-8')
|
new = input("\033[0m").encode('utf-8')
|
||||||
for b in new:
|
for b in new:
|
||||||
send_data.append(b)
|
send_data.append(b)
|
||||||
|
send_data.append(ord(b"\n"))
|
||||||
Thread(target=make_message, daemon=True).start()
|
Thread(target=make_message, daemon=True).start()
|
||||||
while True:
|
while True:
|
||||||
|
try:
|
||||||
|
if send_data is None:
|
||||||
|
print("Well crap, we lost connection.")
|
||||||
|
break
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) >= 2:
|
if len(sys.argv) >= 2:
|
||||||
|
@ -22,7 +22,12 @@ def client(delay: int, hs_id, socks_port, send_data: bytearray, recv_data: bytea
|
|||||||
try:
|
try:
|
||||||
s.send(chr(to_send).encode('utf-8'))
|
s.send(chr(to_send).encode('utf-8'))
|
||||||
except TypeError:
|
except TypeError:
|
||||||
|
try:
|
||||||
|
if to_send is not None:
|
||||||
s.send(to_send)
|
s.send(to_send)
|
||||||
|
except BrokenPipeError:
|
||||||
|
# lost connection
|
||||||
|
pass
|
||||||
except BrokenPipeError:
|
except BrokenPipeError:
|
||||||
pass
|
pass
|
||||||
sleep(delay)
|
sleep(delay)
|
||||||
|
@ -23,12 +23,20 @@ def server(delay: int, controller, conn, send_data: bytearray, recv_data: bytear
|
|||||||
conn.sendall(chr(char).encode('utf-8'))
|
conn.sendall(chr(char).encode('utf-8'))
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
first_rec = True
|
||||||
|
WELCOME_MESSAGE = "Connection established\n"
|
||||||
with conn:
|
with conn:
|
||||||
Thread(target=send_loop, daemon=True).start()
|
Thread(target=send_loop, daemon=True).start()
|
||||||
while True:
|
while True:
|
||||||
|
try:
|
||||||
data = conn.recv(1)
|
data = conn.recv(1)
|
||||||
|
except ConnectionResetError:
|
||||||
|
break
|
||||||
if not data: break
|
if not data: break
|
||||||
|
if first_rec:
|
||||||
|
for i in WELCOME_MESSAGE:
|
||||||
|
send_data.append(ord(i))
|
||||||
|
first_rec = False
|
||||||
if data != garbage_character and data:
|
if data != garbage_character and data:
|
||||||
for i in data:
|
for i in data:
|
||||||
recv_data.append(i)
|
recv_data.append(i)
|
||||||
|
Loading…
Reference in New Issue
Block a user