/**
* 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.tls.protocol.extension;
import de.rub.nds.tlsattacker.tls.constants.ExtensionByteLength;
import de.rub.nds.tlsattacker.tls.constants.ExtensionType;
import de.rub.nds.tlsattacker.tls.constants.NamedCurve;
import de.rub.nds.tlsattacker.util.ArrayConverter;
/**
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
*/
public class EllipticCurvesExtensionHandler extends ExtensionHandler<EllipticCurvesExtensionMessage> {
private static EllipticCurvesExtensionHandler instance;
/**
* byte length of the supported elliptic curves length
*/
public static final int SUPPORTED_ELLIPTIC_CURVES_LENGTH = 2;
private EllipticCurvesExtensionHandler() {
}
public static EllipticCurvesExtensionHandler getInstance() {
if (instance == null) {
instance = new EllipticCurvesExtensionHandler();
}
return instance;
}
/**
* @param extension
*/
@Override
public void initializeClientHelloExtension(EllipticCurvesExtensionMessage extension) {
byte[] curves = null;
for (NamedCurve curve : extension.getSupportedCurvesConfig()) {
curves = ArrayConverter.concatenate(curves, curve.getValue());
}
extension.setExtensionType(ExtensionType.ELLIPTIC_CURVES.getValue());
extension.setSupportedCurves(curves);
extension.setSupportedCurvesLength(curves != null ? curves.length : 0);
extension.setExtensionLength(extension.getSupportedCurvesLength().getValue() + ExtensionByteLength.EXTENSIONS);
byte[] ecExtensionBytes = ArrayConverter.concatenate(extension.getExtensionType().getValue(), ArrayConverter
.intToBytes(extension.getExtensionLength().getValue(), ExtensionByteLength.EXTENSIONS), ArrayConverter
.intToBytes(extension.getSupportedCurvesLength().getValue(), SUPPORTED_ELLIPTIC_CURVES_LENGTH),
extension.getSupportedCurves().getValue());
extension.setExtensionBytes(ecExtensionBytes);
}
@Override
public int parseExtension(byte[] message, int pointer) {
throw new UnsupportedOperationException("Elliptic curve extension handler not supported yet.");
}
}