byte[] explicitePMS = BigIntegers.asUnsignedByteArray(curve.getKeyBits() / 8, secret); pms.setModification(ByteArrayModificationFactory.explicitValue(explicitePMS)); message.prepareComputations(); message.getComputations().setPremasterSecret(pms);
@Override public void prepareAfterParse(boolean clientMode) { msg.prepareComputations(); prepareClientServerRandom(msg); NamedGroup usedGroup = chooser.getSelectedNamedGroup(); LOGGER.debug("Used Group: " + usedGroup.name()); setComputationPrivateKey(msg, clientMode); ECDomainParameters ecParams = getDomainParameters(chooser.getEcCurveType(), usedGroup); if (clientMode) { ECPoint clientPublicKey = ecParams.getG().multiply(msg.getComputations().getPrivateKey().getValue()); clientPublicKey = clientPublicKey.normalize(); if (clientPublicKey.getRawXCoord() != null && clientPublicKey.getRawYCoord() != null) { msg.getComputations().setComputedPublicKeyX(clientPublicKey.getRawXCoord().toBigInteger()); msg.getComputations().setComputedPublicKeyY(clientPublicKey.getRawYCoord().toBigInteger()); } else { LOGGER.warn("Could not compute correct public key. Using empty one instead"); msg.getComputations().setComputedPublicKeyX(BigInteger.ZERO); msg.getComputations().setComputedPublicKeyY(BigInteger.ZERO); } } setComputationPublicKey(msg, clientMode); LOGGER.debug("PublicKey used:" + msg.getComputations().getPublicKey().toString()); LOGGER.debug("PrivateKey used:" + msg.getComputations().getPrivateKey().getValue()); ECPoint publicKey = ecParams.getCurve().createPoint(msg.getComputations().getPublicKey().getX(), msg.getComputations().getPublicKey().getY()); publicKey = publicKey.normalize(); premasterSecret = computePremasterSecret(new ECPublicKeyParameters(publicKey, ecParams), new ECPrivateKeyParameters(msg.getComputations().getPrivateKey().getValue(), ecParams)); preparePremasterSecret(msg); }
private WorkflowTrace executeProtocolFlow() { Config tlsConfig = getTlsConfig(); WorkflowTrace trace = new WorkflowConfigurationFactory(tlsConfig).createWorkflowTrace(WorkflowTraceType.HELLO, RunningModeType.CLIENT); trace.addTlsAction(new SendAction(new ECDHClientKeyExchangeMessage(tlsConfig), new ChangeCipherSpecMessage( tlsConfig), new FinishedMessage(tlsConfig))); trace.addTlsAction(new ReceiveAction(new ChangeCipherSpecMessage(), new FinishedMessage())); State state = new State(tlsConfig, trace); WorkflowExecutor workflowExecutor = WorkflowExecutorFactory.createWorkflowExecutor( tlsConfig.getWorkflowExecutorType(), state); ECDHClientKeyExchangeMessage message = (ECDHClientKeyExchangeMessage) WorkflowTraceUtil.getFirstSendMessage( HandshakeMessageType.CLIENT_KEY_EXCHANGE, trace); ModifiableByteArray serializedPublicKey = ModifiableVariableFactory.createByteArrayModifiableVariable(); byte[] points = ArrayConverter.concatenate(ArrayConverter.bigIntegerToByteArray(config.getPublicPointBaseX()), ArrayConverter.bigIntegerToByteArray(config.getPublicPointBaseY())); byte[] serialized = ArrayConverter.concatenate(new byte[] { 4 }, points); serializedPublicKey.setModification(ByteArrayModificationFactory.explicitValue(serialized)); message.setPublicKey(serializedPublicKey); ModifiableByteArray pms = ModifiableVariableFactory.createByteArrayModifiableVariable(); byte[] explicitPMS = BigIntegers.asUnsignedByteArray(config.getCurveFieldSize(), premasterSecret); pms.setModification(ByteArrayModificationFactory.explicitValue(explicitPMS)); message.prepareComputations(); message.getComputations().setPremasterSecret(pms); LOGGER.info("working with the follwoing premaster secret: " + ArrayConverter.bytesToHexString(explicitPMS)); workflowExecutor.executeWorkflow(); return trace; } }