first pass step3

This commit is contained in:
Cédric Seron
2025-11-12 13:41:11 +01:00
parent 26e45da333
commit 67115b9693

View File

@@ -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) );
}
}