public static List<ExtensionMessage> getAllSendExtensions(WorkflowTrace trace) { List<HandshakeMessage> handshakeMessageList = getAllSendHandshakeMessages(trace); List<ExtensionMessage> extensionList = new LinkedList<>(); for (HandshakeMessage message : handshakeMessageList) { extensionList.addAll(message.getExtensions()); } return extensionList; }
@Override public List<ModifiableVariableHolder> getAllModifiableVariableHolders() { List<ModifiableVariableHolder> holders = super.getAllModifiableVariableHolders(); if (getExtensions() != null) { for (ExtensionMessage em : getExtensions()) { if (em != null) { holders.addAll(em.getAllModifiableVariableHolders()); } } } return holders; } }
protected void adjustExtensions(ProtocolMessage message, HandshakeMessageType handshakeMessageType) { if (message.getExtensions() != null) { for (ExtensionMessage extension : message.getExtensions()) { if (extension instanceof HRRKeyShareExtensionMessage) { // TODO // fix // design // flaw handshakeMessageType = HandshakeMessageType.HELLO_RETRY_REQUEST; } ExtensionHandler handler = HandlerFactory.getExtensionHandler(tlsContext, extension.getExtensionTypeConstant(), handshakeMessageType); handler.adjustTLSContext(extension); } } } }
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())); }
private WorkflowTrace createFullZeroRttWorkflow() { AliasedConnection ourConnection = getConnection(); WorkflowTrace trace = createHandshakeWorkflow(); // Remove extensions that are only required in the 2nd ClientHello for (TlsAction action : trace.getTlsActions()) { if (action.isMessageAction()) { for (ProtocolMessage msg : ((MessageAction) action).getMessages()) { if (msg instanceof ClientHelloMessage) { List<ExtensionMessage> extensions = ((HandshakeMessage) msg).getExtensions(); for (int x = 0; x < extensions.size(); x++) { if (extensions.get(x) instanceof PreSharedKeyExtensionMessage || extensions.get(x) instanceof EarlyDataExtensionMessage) { ((HandshakeMessage) msg).getExtensions().remove(extensions.get(x)); x--; } } } } } } trace.addTlsAction(MessageActionFactory.createAction(ourConnection, ConnectionEndType.SERVER, new NewSessionTicketMessage(false))); trace.addTlsAction(new ResetConnectionAction()); WorkflowTrace zeroRttTrace = createZeroRttWorkflow(); for (TlsAction zeroRttAction : zeroRttTrace.getTlsActions()) { trace.addTlsAction(zeroRttAction); } return trace; }
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())); }