From 67115b9693d4c3028337bdef98bf8a354ba5cd38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Seron?= Date: Wed, 12 Nov 2025 13:41:11 +0100 Subject: [PATCH] first pass step3 --- src/main/java/step3/Main.java | 97 +++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/main/java/step3/Main.java diff --git a/src/main/java/step3/Main.java b/src/main/java/step3/Main.java new file mode 100644 index 0000000..691a952 --- /dev/null +++ b/src/main/java/step3/Main.java @@ -0,0 +1,97 @@ +package step3; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigInteger; +import java.net.ServerSocket; +import java.net.Socket; +import java.security.GeneralSecurityException; +import java.util.Base64; + +import static common.Logger.displayInfo; +import static common.Logger.displayReceived; +import static common.Logger.displaySent; +import static common.SocketManager.readResponse; +import static common.SocketManager.send; + +public class Main { + + private static final BigInteger P = new BigInteger("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16); + private static final BigInteger G = new BigInteger("2", 16); + + public static void main(String[] args){ + int port = 8888; + if (args.length >= 2 && args[0].equals("--port")) { + port = Integer.parseInt(args[1]); + } + + try (ServerSocket socket = new ServerSocket(port)) { + displayInfo("Server is running on port " + port + "\n waiting for the client to connect..."); + while (true) { + try { + handleClient(socket.accept()); + return; + } catch (IOException ignored) {} + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void handleClient(Socket socket) throws IOException, GeneralSecurityException { + socket.setSoTimeout(30000); + displayInfo("Client connected"); + + BufferedReader reader = new BufferedReader( + new InputStreamReader(socket.getInputStream()) + ); + + String message = readResponse(reader); + displayReceived("Received A : " + message); + byte[] A_bytes = Base64.getDecoder().decode(message.substring(2)); + BigInteger A = new BigInteger(1, A_bytes); + + // Compute b and B + BigInteger b = new BigInteger(256, new java.security.SecureRandom()); + BigInteger B = G.modPow(b, P); + byte[] B_bytes = toFixedLen(B, 256); + + // Send B + message = "B:" + Base64.getEncoder().encodeToString(B_bytes); + send(socket, message); + displaySent("B sent : " + message); + + // Compute shared Z + + BigInteger Z = A.modPow(b, P); + byte[] Z_bytes = toFixedLen(Z, 256); + + } + + private static byte[] toFixedLen(BigInteger x, int len) { + byte[] t = x.toByteArray(); + if (t.length == len) return t; + if (t[0] == 0 && t.length == len + 1) { // strip leading zero + byte[] r = new byte[len]; + System.arraycopy(t, 1, r, 0, len); + return r; + } + byte[] r = new byte[len]; + System.arraycopy(t, Math.max(0, t.length - len), r, len - Math.min(len, t.length), + Math.min(len, t.length)); + return r; + } + + private static byte[] PBKDF_HMAC_key(BigInteger A, BigInteger B, BigInteger p, BigInteger g){ + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); + outputStream.write( toFixedLen(g, 8) ); + outputStream.write( toFixedLen(p, 256) ); + outputStream.write( toFixedLen(A, 256) ); + outputStream.write( toFixedLen(B, 256) ); + + } + +} \ No newline at end of file