Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ApplicationServer/src/main/java/utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class Constants {
public static final int TGS_REPLY_MESSSAGE_TYPE = 13;
public static final int AP_REQUEST_MESSAGE_TYPE = 14;
public static final int AP_REPLY_MESSAGE_TYPE = 15;
public static final int KRB_ERROR_MESSAGE_TYPE = 30;

// Hardcoded Server PrincipalNames
public static final PrincipalName AS_SERVER = new PrincipalName("as_server");
Expand Down
100 changes: 79 additions & 21 deletions Client/src/main/java/entities/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,13 @@ public class Client {
private String loginPassword;
private ImmutableKrbKdcReq requestToAs;
private ImmutableKrbKdcRep replyFromAs;
private ImmutableKrbError errorReplyFromAs;
private ImmutableKrbKdcReq requestToTgs;
private ImmutableKrbKdcRep replyFromTgs;
private ImmutableKrbError errorReplyFromTgs;
private ImmutableKrbApReq requestToAp;
private ImmutableKrbApRep replyFromAp;
private ImmutableKrbError errorReplyFromAp;
private Ticket ticketGrantingTicket;
private Ticket serviceGrantingTicket;
private byte[] sessionKeyWithTgs;
Expand All @@ -67,7 +70,7 @@ public Client(PrincipalName clientKerberosId, String loginPassword) {
This is used for request/response exchange with a server.
Server can either be KDC or Application Server
*/
private void sendRequestToServerAndReceiveResponse(int serverPort, ServerType serverType) {
private int sendRequestToServerAndReceiveResponse(int serverPort, ServerType serverType) {
try {
/*
* Instantiate client socket.
Expand All @@ -79,22 +82,37 @@ private void sendRequestToServerAndReceiveResponse(int serverPort, ServerType se
InetAddress IPAddress = InetAddress.getByName("localhost");

/* Serialization of object into json string */
int applicationNumber = 0;
String requestJsonString = null;
ObjectMapper objectMapper = new ObjectMapper();
switch (serverType) {
case AS:
applicationNumber = AS_REQUEST_MESSSAGE_TYPE;
requestJsonString = objectMapper.writeValueAsString(requestToAs);
break;
case TGS:
applicationNumber = TGS_REQUEST_MESSSAGE_TYPE;
requestJsonString = objectMapper.writeValueAsString(requestToTgs);
break;
case AP:
applicationNumber = AP_REQUEST_MESSAGE_TYPE;
requestJsonString = objectMapper.writeValueAsString(requestToAp);
break;
}

/* Convert string to byte array */
byte[] data = requestJsonString.getBytes();
byte[] requestData = requestJsonString.getBytes(StandardCharsets.UTF_8);

/* Enclose this message bodu inside the KrbMessage */
ImmutableKrbMessage krbMessageRequest = ImmutableKrbMessage.builder()
.applicationNumber(applicationNumber)
.krbMessageBody(requestData)
.build();

String krbMessageJsonString = objectMapper.writeValueAsString(krbMessageRequest);

/* Convert string to byte array */
byte[] data = krbMessageJsonString.getBytes(StandardCharsets.UTF_8);

/* Creating a UDP packet */
DatagramPacket sendingPacket = new DatagramPacket(data, data.length, IPAddress, serverPort);
Expand All @@ -108,26 +126,48 @@ private void sendRequestToServerAndReceiveResponse(int serverPort, ServerType se
DatagramPacket receivingPacket = new DatagramPacket(receivingDataBuffer, receivingDataBuffer.length);
clientSocket.receive(receivingPacket);

byte[] dataReceived = receivingPacket.getData();
String dataString = new String(dataReceived);

/* Deserialization of json string to object */
switch (serverType) {
case AS:
replyFromAs = objectMapper.readValue(dataString, ImmutableKrbKdcRep.class);
break;
case TGS:
replyFromTgs = objectMapper.readValue(dataString, ImmutableKrbKdcRep.class);
break;
case AP:
replyFromAp = objectMapper.readValue(dataString, ImmutableKrbApRep.class);
break;
byte[] krbMessageReceivedData = receivingPacket.getData();
String krbMessageReceivedString = new String(krbMessageReceivedData, StandardCharsets.UTF_8);

/* Deserialization of json string to object (KrbMessage) */
KrbMessage krbMessageReceived = objectMapper.readValue(krbMessageReceivedString, KrbMessage.class);

if (krbMessageReceived.applicationNumber() == KRB_ERROR_MESSAGE_TYPE) {
// Error
switch (serverType) {
case AS:
errorReplyFromAs = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbError.class);
break;
case TGS:
errorReplyFromTgs = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbError.class);
break;
case AP:
errorReplyFromAp = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbError.class);
break;
}
System.out.println();
return KRB_ERROR_MESSAGE_TYPE;

} else {
/* Deserialization of json string to object */
switch (serverType) {
case AS:
replyFromAs = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbKdcRep.class);
break;
case TGS:
replyFromTgs = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbKdcRep.class);
break;
case AP:
replyFromAp = objectMapper.readValue(krbMessageReceivedString, ImmutableKrbApRep.class);
break;
}

// Closing the socket connection with the server
clientSocket.close();
return SUCCESS;
}

// System.out.println(replyFromAs.toString());

// Closing the socket connection with the server
clientSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
Expand Down Expand Up @@ -359,6 +399,16 @@ private void handleApReply() throws InvalidAlgorithmParameterException, NoSuchPa
}
}

private void printKerberosErrorMessageFromAs() {
System.out.println("Kerberos Authentication Failed!");
System.out.println("Error Code " + errorReplyFromAs.eText() + ": " + errorReplyFromAs.eText());
}

private void printKerberosErrorMessageFromTgs() {
System.out.println("Kerberos Authentication Failed!");
System.out.println("Error Code " + errorReplyFromTgs.eText() + ": " + errorReplyFromTgs.eText());
}

public static void main(String[] args) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeySpecException, BadPaddingException, InvalidKeyException, JsonProcessingException, TimestampMismatchException {
System.out.println("WELCOME TO KERBEROS AUTHENTICATION SYSTEM!");
System.out.println("Please enter your kerberos id and password to get started");
Expand All @@ -373,7 +423,11 @@ public static void main(String[] args) throws InvalidAlgorithmParameterException

/* AS Exchange */
client.constructAuthenticationServerRequest();
client.sendRequestToServerAndReceiveResponse(KDC_SERVICE_PORT, ServerType.AS);
int ret = client.sendRequestToServerAndReceiveResponse(KDC_SERVICE_PORT, ServerType.AS);
if (ret == KRB_ERROR_MESSAGE_TYPE) {
client.printKerberosErrorMessageFromAs();
exit(1);
}
/* TODO: check if user is successfully authenticated */
client.handleAsReply();

Expand All @@ -385,7 +439,11 @@ public static void main(String[] args) throws InvalidAlgorithmParameterException

/* TGS Exchange */
client.constructTicketGrantingServerRequest(client.applicationServerKerberosId);
client.sendRequestToServerAndReceiveResponse(KDC_SERVICE_PORT, ServerType.TGS);
ret = client.sendRequestToServerAndReceiveResponse(KDC_SERVICE_PORT, ServerType.TGS);
if (ret == KRB_ERROR_MESSAGE_TYPE) {
client.printKerberosErrorMessageFromTgs();
exit(1);
}
client.handleTgsReply();

/* AP Exchange */
Expand Down
23 changes: 23 additions & 0 deletions Client/src/main/java/messageformats/KrbError.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package messageformats;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.immutables.value.Value;

import java.sql.Timestamp;
import java.util.Optional;

@Value.Immutable
@Value.Style(privateNoargConstructor = true)
@JsonSerialize(as = ImmutableKrbError.class)
@JsonDeserialize(as = ImmutableKrbError.class)
public interface KrbError {
int pvno();
int msgType();
Optional<Timestamp> ctime();
Timestamp stime();
int errorCode();
Optional<PrincipalName> cname();
PrincipalName sname();
String eText();
}
16 changes: 16 additions & 0 deletions Client/src/main/java/messageformats/KrbMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package messageformats;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.immutables.value.Value;

@Value.Immutable
@Value.Style(privateNoargConstructor = true)
@JsonSerialize(as = ImmutableKrbMessage.class)
@JsonDeserialize(as = ImmutableKrbMessage.class)
public interface KrbMessage {
// Message Header
int applicationNumber();
// Message Body
byte[] krbMessageBody();
}
18 changes: 2 additions & 16 deletions Client/src/main/java/utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class Constants {
public static final int TGS_REQUEST_MESSSAGE_TYPE = 12;
public static final int TGS_REPLY_MESSSAGE_TYPE = 13;
public static final int AP_REQUEST_MESSAGE_TYPE = 14;
public static final int KRB_ERROR_MESSAGE_TYPE = 30;

// Hardcoded Server PrincipalNames
public static final PrincipalName AS_SERVER = new PrincipalName("as_server");
Expand All @@ -39,21 +40,6 @@ public static enum ServerType {
AP
}


// public static final ImmutablePrincipalName client = ImmutablePrincipalName.builder()
// .nameString("client")
// .build();

// public static final ImmutablePrincipalName as_server = ImmutablePrincipalName.builder()
// .nameString("as_server")
// .build();

// public static final ImmutablePrincipalName tgs_server = ImmutablePrincipalName.builder()
// .nameString("tgs_server")
// .build();
//
// public static final ImmutablePrincipalName application_server = ImmutablePrincipalName.builder()
// .nameString("application_server")
// .build();
public static final int SUCCESS = 0;

}
Loading