This is the lines error: Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.iterator()" because "inputData" is null at kerberos.server.TicketGrantingServer.createSocketAndListen(TicketGrantingServer.java:249) at kerberos.server.TicketGrantingServer.main(TicketGrantingServer.java:228) and this is th code of the class `public class TicketGrantingServer extends Server {
private EncryptDecrypt ed;
private final static String FILE_SERVER_SECRET_KEY = "saltCTS1CS265";
private final static String TGS_SECRET_KEY = "saltTGS1CS265";
// Keep the TGS session key valid for 15 minutes
private final static Long TICKET_VALIDITY = 15 * 60 * 1000L;
@SuppressWarnings("unused")
private String clientAddress;
private ServerSocket serverSocket;
private Ticket tgtComponents = null, fileServerTicketComponents = null;
public TicketGrantingServer(int port) {
super(port);
ed = new EncryptDecrypt();
}
@Override
protected List<String> parseRequest(Socket socket) throws IOException {
List<String> inputData = new ArrayList<String>();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
String message1 = br.readLine();
message += "\n" + message1;
// Store the client's IP address for future use
clientAddress = socket.getRemoteSocketAddress().toString();
System.out.println("Response received from the Client : " + message);
String[] parsedMessage = message.split(";");
inputData = Arrays.asList(parsedMessage);
//System.out.println("data"+inputData);
String decryptedTgt =null;
String decryptedTgs = null ;
String encryptedAuthenticator = parsedMessage[0];
String encryptedTgt = parsedMessage[1];
byte[] key = TGS_SECRET_KEY.getBytes("UTF-8");
KeyGenerator keyGen = null;
try {
keyGen = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
return null;
}
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
return null;
}
key = sha.digest(key);
key = Arrays.copyOf(key,16); // use only first 128 bit
SecretKeySpec tgsSecretKeySpec = new SecretKeySpec(key, "AES");
try {
decryptedTgt = decrypt(tgsSecretKeySpec, encryptedTgt);
} catch (Exception e) {
return null;
}
System.out.println("Decrypted TGT is: " + decryptedTgt);
parsedMessage = decryptedTgt.split(";");
tgtComponents = new Ticket(parsedMessage[0], parsedMessage[1],
parsedMessage[2], parsedMessage[3]);
String decryptedTgsSessionKey = tgtComponents.getSessionKey();
byte[] encodedKey = Base64.getDecoder().decode(decryptedTgsSessionKey);
SecretKey decryptTgsSessionKeySpec = new SecretKeySpec(encodedKey, 0,
encodedKey.length, "AES");
String decryptedAuthenticator = null;
try {
decryptedAuthenticator = decrypt(decryptTgsSessionKeySpec, encryptedAuthenticator);
System.out.println("Decrypted Authenticator is: "+ decryptedAuthenticator);
} catch (Exception e) {
e.printStackTrace();
return null;
}
parsedMessage = decryptedAuthenticator.split(";");
//@SuppressWarnings("unused")
String authenticatorClientId = parsedMessage[0];
Long authenticatorTimestamp = Long.parseLong(parsedMessage[1]);
Long ticketEndTimestamp = Long.parseLong(tgtComponents.getEndTime());
if (authenticatorTimestamp < ticketEndTimestamp) {
// session is still valid
System.out.println("Session is still valid");
String fileServerSessionKey = SessionKeyGenerator.generateSessionKey();
System.out.println("Generated Client to File Server Session Key :" + fileServerSessionKey);
Long startTime = System.currentTimeMillis();
Long endTime = startTime + TICKET_VALIDITY;
key = decryptedTgsSessionKey.getBytes("UTF-8");
keyGen = null;
try {
keyGen = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
sha = null;
try {
sha = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit
SecretKeySpec encryptTgsSessionKeySpec = new SecretKeySpec(key, "AES");
String encryptedFileServerSessionKey = null;
try {
encryptedFileServerSessionKey = ed.encrypt(encryptTgsSessionKeySpec, fileServerSessionKey);
} catch (Exception e) {
System.err.println("Issue while encrypting File Server Session Key : "
+ e.getMessage());
// return "$$$" + "Issue while encrypting TGS Session Key";
}
fileServerTicketComponents = new Ticket(tgtComponents.getClientID(),
tgtComponents.getClientAddress(), endTime.toString(),
fileServerSessionKey);
String fileServerTicket = fileServerTicketComponents.getClientID() + ";"
+ fileServerTicketComponents.getClientAddress() + ";"
+ fileServerTicketComponents.getEndTime() + ";" + fileServerSessionKey;
System.out.println("File Server ticket :" + fileServerTicket);
key = FILE_SERVER_SECRET_KEY.getBytes("UTF-8");
keyGen = null;
try {
keyGen = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
sha = null;
try {
sha = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit
SecretKeySpec fileServerSecretKeySpec= new SecretKeySpec(key, "AES");
String encryptedFileServerTicket = null;
try {
encryptedFileServerTicket = ed.encrypt(fileServerSecretKeySpec, fileServerTicket);
System.out.println("Encrypted File Server Ticket is: " + encryptedFileServerTicket);
} catch (Exception e) {
e.printStackTrace();
return null;
}
// send message to client
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
// cts = message;
// System.out.println( "CTS:" +tgt);
// String messageToTGS = sendResponsetoTGT(tgsSessionKey, tgt);
String messageToClient = encryptedFileServerSessionKey + ";"+ encryptedFileServerTicket;
bw.write(messageToClient);
bw.flush();
System.out.println("Message sent to the Client: " + messageToClient);
if (socket != null) {
socket.close();
}
} else {
// TODO send error report to the client that TGT is expired.
}
return inputData;
}
@Override
protected String generateResponse(List<String> inputData)
throws IOException {
return null;
}
public static void main(String[] args) throws IOException {
TicketGrantingServer tgs = new TicketGrantingServer(8030);
try {
tgs.createSocketAndListen();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
@Override
protected void createSocketAndListen() throws IOException {
serverSocket = new ServerSocket(super.port);
System.out.println("Ticket Granting Server Socket created at port : "
+ super.port);
Socket socket = null;
while (true) {
// Listening the message from the client
System.out
.println("Ticket Granting Server now listening for client request.....");
socket = serverSocket.accept();
List<String> inputData = parseRequest(socket);
// System.out.println("Parsed List of client Data is :"+inputData);
for (String a : inputData) {
// System.out.println(a);
}
// String response = generateResponse(inputData);
// sendResponse(socket, response);
if (socket != null) {
socket.close();
}
}
}
@Override
protected void sendResponse(Socket socket, String response)
throws IOException {
// TODO Auto-generated method stub
}
} `