|
40 | 40 | import de.rub.nds.tlsattacker.core.protocol.message.ClientHelloMessage; |
41 | 41 | import de.rub.nds.tlsattacker.core.protocol.message.extension.ClientEsniInner; |
42 | 42 | import de.rub.nds.tlsattacker.core.protocol.message.extension.EncryptedServerNameIndicationExtensionMessage; |
| 43 | +import de.rub.nds.tlsattacker.core.protocol.message.extension.ExtensionMessage; |
| 44 | +import de.rub.nds.tlsattacker.core.protocol.message.extension.KeyShareExtensionMessage; |
43 | 45 | import de.rub.nds.tlsattacker.core.protocol.message.extension.keyshare.KeyShareEntry; |
44 | 46 | import de.rub.nds.tlsattacker.core.protocol.message.extension.keyshare.KeyShareStoreEntry; |
45 | 47 | import de.rub.nds.tlsattacker.core.protocol.parser.extension.ClientEsniInnerParser; |
@@ -240,6 +242,7 @@ private void prepareNamedGroup(EncryptedServerNameIndicationExtensionMessage msg |
240 | 242 |
|
241 | 243 | private void prepareKeyShareEntry(EncryptedServerNameIndicationExtensionMessage msg) { |
242 | 244 | KeyShareEntry keyShareEntry = msg.getKeyShareEntry(); |
| 245 | + keyShareEntry.setPrivateKey(chooser.getConfig().getDefaultEsniClientPrivateKey()); |
243 | 246 | KeyShareEntryPreparator keyShareEntryPreparator = new KeyShareEntryPreparator(chooser, keyShareEntry); |
244 | 247 | keyShareEntryPreparator.prepare(); |
245 | 248 | LOGGER.debug("ClientPrivateKey: " |
@@ -382,6 +385,7 @@ private void prepareEsniMasterSecret(EncryptedServerNameIndicationExtensionMessa |
382 | 385 | } |
383 | 386 |
|
384 | 387 | private void prepareEsniKey(EncryptedServerNameIndicationExtensionMessage msg) { |
| 388 | + |
385 | 389 | byte[] key = null; |
386 | 390 | byte[] esniMasterSecret = msg.getEncryptedSniComputation().getEsniMasterSecret().getValue(); |
387 | 391 | byte[] hashIn = msg.getEncryptedSniComputation().getEsniContentsHash().getValue(); |
@@ -415,36 +419,53 @@ private void prepareEsniIv(EncryptedServerNameIndicationExtensionMessage msg) { |
415 | 419 | } |
416 | 420 |
|
417 | 421 | private void prepareClientHelloKeyShare(EncryptedServerNameIndicationExtensionMessage msg) { |
418 | | - ByteArrayOutputStream clientKeyShareStream = new ByteArrayOutputStream(); |
| 422 | + int keyShareListBytesLength = 0; |
| 423 | + byte[] keyShareListBytesLengthField = null; |
| 424 | + byte[] keyShareListBytes = null; |
419 | 425 | ByteArrayOutputStream clientHelloKeyShareStream = new ByteArrayOutputStream(); |
| 426 | + boolean isClientHelloExensionsFound = false; |
| 427 | + if (clientHelloMessage != null) { |
420 | 428 |
|
421 | | - for (KeyShareStoreEntry pair : chooser.getClientKeyShares()) { |
422 | | - KeyShareEntry entry = new KeyShareEntry(); |
423 | | - KeyShareEntrySerializer serializer = new KeyShareEntrySerializer(entry); |
424 | | - entry.setGroup(pair.getGroup().getValue()); |
425 | | - entry.setPublicKeyLength(pair.getPublicKey().length); |
426 | | - entry.setPublicKey(pair.getPublicKey()); |
427 | | - try { |
428 | | - clientKeyShareStream.write(serializer.serialize()); |
429 | | - } catch (IOException e) { |
430 | | - throw new PreparationException("Failed to write esniContents", e); |
| 429 | + List<ExtensionMessage> clientHelloExtensions = clientHelloMessage.getExtensions(); |
| 430 | + for (ExtensionMessage m : clientHelloExtensions) { |
| 431 | + if (m instanceof KeyShareExtensionMessage) { |
| 432 | + KeyShareExtensionMessage keyShareExtensionMessage = (KeyShareExtensionMessage) m; |
| 433 | + keyShareListBytesLength = keyShareExtensionMessage.getKeyShareListLength().getValue(); |
| 434 | + keyShareListBytes = keyShareExtensionMessage.getKeyShareListBytes().getValue(); |
| 435 | + isClientHelloExensionsFound = true; |
| 436 | + break; |
| 437 | + } |
431 | 438 | } |
432 | 439 | } |
433 | | - byte[] keyShareListBytes = clientKeyShareStream.toByteArray(); |
434 | | - int keyShareListBytesLength = keyShareListBytes.length; |
435 | | - byte[] keyShareListBytesLengthFild = ArrayConverter.intToBytes(keyShareListBytesLength, |
| 440 | + if (!isClientHelloExensionsFound) { |
| 441 | + ByteArrayOutputStream keyShareListStream = new ByteArrayOutputStream(); |
| 442 | + for (KeyShareStoreEntry pair : chooser.getClientKeyShares()) { |
| 443 | + KeyShareEntry entry = new KeyShareEntry(); |
| 444 | + KeyShareEntrySerializer serializer = new KeyShareEntrySerializer(entry); |
| 445 | + entry.setGroup(pair.getGroup().getValue()); |
| 446 | + entry.setPublicKeyLength(pair.getPublicKey().length); |
| 447 | + entry.setPublicKey(pair.getPublicKey()); |
| 448 | + try { |
| 449 | + keyShareListStream.write(serializer.serialize()); |
| 450 | + } catch (IOException e) { |
| 451 | + throw new PreparationException("Failed to write esniContents", e); |
| 452 | + } |
| 453 | + } |
| 454 | + keyShareListBytes = keyShareListStream.toByteArray(); |
| 455 | + keyShareListBytesLength = keyShareListBytes.length; |
| 456 | + } |
| 457 | + |
| 458 | + keyShareListBytesLengthField = ArrayConverter.intToBytes(keyShareListBytesLength, |
436 | 459 | ExtensionByteLength.KEY_SHARE_LIST_LENGTH); |
437 | 460 | try { |
438 | | - clientHelloKeyShareStream.write(keyShareListBytesLengthFild); |
| 461 | + clientHelloKeyShareStream.write(keyShareListBytesLengthField); |
439 | 462 | clientHelloKeyShareStream.write(keyShareListBytes); |
440 | 463 | } catch (IOException e) { |
441 | | - throw new PreparationException("Failed to write esniContents", e); |
| 464 | + throw new PreparationException("Failed to write ClientHelloKeyShare", e); |
442 | 465 | } |
443 | | - |
444 | 466 | byte[] clientHelloKeyShareBytes = clientHelloKeyShareStream.toByteArray(); |
445 | 467 | msg.getEncryptedSniComputation().setClientHelloKeyShare(clientHelloKeyShareBytes); |
446 | | - LOGGER.debug("clientHelloKeyShare: " |
447 | | - + ArrayConverter.bytesToHexString(msg.getEncryptedSniComputation().getClientHelloKeyShare().getValue())); |
| 468 | + LOGGER.debug("clientHelloKeyShare: " + ArrayConverter.bytesToHexString(clientHelloKeyShareBytes)); |
448 | 469 | } |
449 | 470 |
|
450 | 471 | private void prepareEncryptedSni(EncryptedServerNameIndicationExtensionMessage msg) { |
@@ -513,7 +534,7 @@ private void prepareEncryptedSniLength(EncryptedServerNameIndicationExtensionMes |
513 | 534 | private void prepareServerNonce(EncryptedServerNameIndicationExtensionMessage msg) { |
514 | 535 | byte[] receivedClientNonce = chooser.getEsniClientNonce(); |
515 | 536 | msg.setServerNonce(receivedClientNonce); |
516 | | - LOGGER.debug("ServerNonce: " + msg.getServerNonce().getValue()); |
| 537 | + LOGGER.debug("ServerNonce: " + ArrayConverter.bytesToHexString(msg.getServerNonce().getValue())); |
517 | 538 | } |
518 | 539 |
|
519 | 540 | private byte[] generateEsniContents(EncryptedServerNameIndicationExtensionMessage msg) { |
|
0 commit comments