just for now

This commit is contained in:
2024-12-10 00:51:04 +09:00
parent c4c4547706
commit 022291f5af
18 changed files with 311 additions and 32 deletions

View File

@ -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()