/**
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
*
* Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH
*
* Licensed under Apache License 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*/
package de.rub.nds.tlsattacker.eap;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* State for the Fragmentation process. Sends the EAP-ACKs. Change state if a
* Frag or Fragend Frame was received.
*
* @author Felix Lange <flx.lange@gmail.com>
*/
public class FragState implements EapState {
private static final Logger LOGGER = LogManager.getLogger(FragState.class);
EapolMachine eapolMachine;
int id, count;
EapFactory eaptlsfactory = new EapTlsFactory();
NetworkHandler nic = NetworkHandler.getInstance();
SplitTLS fragment = SplitTLS.getInstance();
EAPFrame eapstart;
byte[] data = {};
public FragState(EapolMachine eapolMachine, int id) {
this.eapolMachine = eapolMachine;
this.id = id;
}
public FragState(EapolMachine eapolMachine, int id, int count) {
this.eapolMachine = eapolMachine;
this.id = id;
this.count = count;
}
@Override
public void send() {
// TODO Auto-generated method stub
}
@Override
public void sendTLS(byte[] tlspacket) {
if (count == 0) {
eapstart = eaptlsfactory.createFrame("EAPTLSFRAGSTART", id, tlspacket);
} else {
eapstart = eaptlsfactory.createFrame("EAPTLSFRAG", id, tlspacket);
}
LOGGER.debug("sendTLS(): {}", eapolMachine.getState());
nic.sendFrame(eapstart.getFrame());
}
@Override
public byte[] receive() {
data = nic.receiveFrame();
id = (int) data[19]; // Get ID
LOGGER.debug("receive() TLS-FLAG: {}", Byte.toString(data[23]));
if (data[23] == (byte) 0x00 && count < (fragment.getCountPacket() - 2)) {
count++;
eapolMachine.setState(new FragState(eapolMachine, id, count));
} else {
eapolMachine.setState(new FragEndState(eapolMachine, id));
}
LOGGER.debug("change State to: {}", eapolMachine.getState());
return data;
}
@Override
public String getState() {
return "FragState";
}
@Override
public int getID() {
return id;
}
}