private static List<HandshakeMessage> filterMessageList(List<HandshakeMessage> messages, HandshakeMessageType type) { List<HandshakeMessage> returnedMessages = new LinkedList<>(); for (HandshakeMessage handshakeMessage : messages) { if (handshakeMessage.getHandshakeMessageType() == type) { returnedMessages.add(handshakeMessage); } } return returnedMessages; }
public static Boolean didReceiveTypeBeforeType(ProtocolMessageType protocolMessageType, HandshakeMessageType type, WorkflowTrace trace) { List<ProtocolMessage> receivedMessages = getAllReceivedMessages(trace); for (ProtocolMessage message : receivedMessages) { if (message.getProtocolMessageType() == protocolMessageType) { return true; } if (message instanceof HandshakeMessage) { if (((HandshakeMessage) message).getHandshakeMessageType() == type) { return false; } } } return false; }
/** * Reads the next bytes as the ExtensionBytes and writes them in the message * and adds parsed Extensions to the message * * @param message * Message to write in */ protected void parseExtensionBytes(T message) { byte[] extensionBytes = parseByteArrayField(message.getExtensionsLength().getValue()); message.setExtensionBytes(extensionBytes); LOGGER.debug("ExtensionBytes:" + ArrayConverter.bytesToHexString(extensionBytes, false)); List<ExtensionMessage> extensionMessages = new LinkedList<>(); int pointer = 0; while (pointer < extensionBytes.length) { ExtensionParser parser = ExtensionParserFactory.getExtensionParser(extensionBytes, pointer, message.getHandshakeMessageType()); extensionMessages.add(parser.parse()); if (pointer == parser.getPointer()) { throw new ParserException("Ran into infinite Loop while parsing Extensions"); } pointer = parser.getPointer(); } message.setExtensions(extensionMessages); }
protected void prepareExtensions() { ByteArrayOutputStream stream = new ByteArrayOutputStream(); if (msg.getExtensions() != null) { for (ExtensionMessage extensionMessage : msg.getExtensions()) { HandshakeMessageType handshakeMessageType = msg.getHandshakeMessageType(); if (extensionMessage instanceof HRRKeyShareExtensionMessage) { handshakeMessageType = HandshakeMessageType.HELLO_RETRY_REQUEST; } ExtensionHandler handler = HandlerFactory.getExtensionHandler(chooser.getContext(), extensionMessage.getExtensionTypeConstant(), handshakeMessageType); handler.getPreparator(extensionMessage).prepare(); try { stream.write(extensionMessage.getExtensionBytes().getValue()); } catch (IOException ex) { throw new PreparationException("Could not write ExtensionBytes to byte[]", ex); } } } msg.setExtensionBytes(stream.toByteArray()); LOGGER.debug("ExtensionBytes: " + ArrayConverter.bytesToHexString(msg.getExtensionBytes().getValue())); }
protected void afterPrepareExtensions() { ByteArrayOutputStream stream = new ByteArrayOutputStream(); if (msg.getExtensions() != null) { for (ExtensionMessage extensionMessage : msg.getExtensions()) { HandshakeMessageType handshakeMessageType = msg.getHandshakeMessageType(); if (extensionMessage instanceof HRRKeyShareExtensionMessage) { // TODO // fix // design // flaw handshakeMessageType = HandshakeMessageType.HELLO_RETRY_REQUEST; } ExtensionHandler handler = HandlerFactory.getExtensionHandler(chooser.getContext(), extensionMessage.getExtensionTypeConstant(), handshakeMessageType); Preparator preparator = handler.getPreparator(extensionMessage); if (handler instanceof PreSharedKeyExtensionHandler && msg instanceof ClientHelloMessage && chooser.getConnectionEndType() == ConnectionEndType.CLIENT) { ((PreSharedKeyExtensionPreparator) preparator).setClientHello((ClientHelloMessage) msg); preparator.afterPrepare(); } try { stream.write(extensionMessage.getExtensionBytes().getValue()); } catch (IOException ex) { throw new PreparationException("Could not write ExtensionBytes to byte[]", ex); } } } msg.setExtensionBytes(stream.toByteArray()); LOGGER.debug("ExtensionBytes: " + ArrayConverter.bytesToHexString(msg.getExtensionBytes().getValue())); }
@Override protected final void prepareProtocolMessageContents() { prepareHandshakeMessageContents(); // Ugly but only temporary serializer = (HandshakeMessageSerializer) msg.getHandler(chooser.getContext()).getSerializer(msg); prepareMessageLength(serializer.serializeHandshakeMessageContent().length); if (isDTLS()) { prepareFragmentLenth(msg); prepareFragmentOffset(msg); prepareMessageSeq(msg); } prepareMessageType(msg.getHandshakeMessageType()); }