just for now
This commit is contained in:
@ -6,7 +6,30 @@ import logging
|
||||
from asyncio import StreamReader, StreamWriter
|
||||
|
||||
from insecurelib import *
|
||||
from pwn_utils.utils import read_line_safe
|
||||
|
||||
async def read_line_safe(reader):
|
||||
"""
|
||||
Simple implementation to read a line from an async reader
|
||||
Mimics the original read_line_safe functionality
|
||||
"""
|
||||
try:
|
||||
line = await reader.readline()
|
||||
return line.decode().strip()
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def log_error(e, client_writer=None):
|
||||
"""
|
||||
Basic error logging function
|
||||
"""
|
||||
print(f"Error occurred: {e}")
|
||||
if client_writer:
|
||||
try:
|
||||
client_writer.write(f"Error: {str(e)}\n".encode())
|
||||
except Exception:
|
||||
print("Could not send error to client")
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
clients = {} # task -> (reader, writer)
|
||||
@ -73,20 +96,20 @@ class AuthenticatedChannel:
|
||||
return None
|
||||
|
||||
# calculate shared key
|
||||
print("calculating key now")
|
||||
key = str(pow(Y, a, mod=p))
|
||||
key = KDRV256(key.encode())
|
||||
|
||||
# decrypt and verify signature
|
||||
decrypted_sig = decrypt(key, s)
|
||||
if not verify(bob_public, message=f'{Y},{X}'.encode(), signature=decrypted_sig):
|
||||
self.writer.write('Signature verification failed\n'.encode())
|
||||
await self.writer.drain()
|
||||
return None
|
||||
|
||||
# sign X and Y and send signature
|
||||
sig = sign(privKey, f'{X},{Y}'.encode())
|
||||
sig = encrypt(key, sig)
|
||||
self.writer.write(sig + b'\n')
|
||||
print("finished the do_STS_key_exchange")
|
||||
await self.writer.drain()
|
||||
|
||||
self.shared_key = key
|
||||
@ -111,7 +134,7 @@ async def do_session_key_DH_exchange(channel: AuthenticatedChannel) -> bytes | N
|
||||
return
|
||||
|
||||
p, g, X = map(int, pgX.split(','))
|
||||
|
||||
print("p, g, x is here: ", (p,g,X))
|
||||
# two checks to prevent DOSes and improve performance
|
||||
if not check_int_range(p):
|
||||
await channel.send_encrypted(f'{p} must be in [{0}..{MAX_PRIME}]'.encode())
|
||||
@ -119,7 +142,7 @@ async def do_session_key_DH_exchange(channel: AuthenticatedChannel) -> bytes | N
|
||||
if not check_int_range(g):
|
||||
await channel.send_encrypted(f'{g} must be in [{0}..{MAX_PRIME}]'.encode())
|
||||
return
|
||||
|
||||
print("two checks to prevent doses and improve performance finished")
|
||||
# check if parameters are valid
|
||||
if not is_prime(p):
|
||||
await channel.send_encrypted(f'{p} is not a prime number!'.encode())
|
||||
@ -132,13 +155,13 @@ async def do_session_key_DH_exchange(channel: AuthenticatedChannel) -> bytes | N
|
||||
if X >= p:
|
||||
await channel.send_encrypted(f"X ({X} can't be larger or equal to p {p}!".encode())
|
||||
return
|
||||
|
||||
print("check if parameters are valid finished")
|
||||
# create own public/private key parts:
|
||||
b = random.randint(1, p - 1)
|
||||
Y = pow(g, b, mod=p)
|
||||
|
||||
print("sending encryption")
|
||||
await channel.send_encrypted(f'{Y}'.encode())
|
||||
|
||||
print("sending encyrption finished")
|
||||
# calculate shared key
|
||||
key = str(pow(X, b, mod=p))
|
||||
key = KDRV256(key.encode())
|
||||
@ -165,7 +188,7 @@ async def handle_client(client_reader: StreamReader, client_writer: StreamWriter
|
||||
|
||||
msg = 'Hey Bob, plz send me my f14g :-)'
|
||||
encrypted_msg = encrypt(session_key, msg.encode())
|
||||
|
||||
print("sending encypretd message about igving me flag")
|
||||
await authenticated_channel.send_encrypted(encrypted_msg)
|
||||
|
||||
data = await authenticated_channel.recv_encrypted()
|
||||
|
Reference in New Issue
Block a user