first pass step3
This commit is contained in:
97
src/main/java/step3/Main.java
Normal file
97
src/main/java/step3/Main.java
Normal 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) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user