|
8 | 8 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
9 | 9 | import org.junit.jupiter.api.Assumptions;
|
10 | 10 | import org.junit.jupiter.api.Named;
|
| 11 | +import org.junit.jupiter.api.Test; |
11 | 12 | import org.junit.jupiter.params.ParameterizedTest;
|
12 | 13 | import org.junit.jupiter.params.provider.Arguments;
|
13 | 14 | import org.junit.jupiter.params.provider.MethodSource;
|
|
18 | 19 | import java.io.IOException;
|
19 | 20 | import java.io.InputStream;
|
20 | 21 | import java.nio.ByteBuffer;
|
| 22 | +import java.nio.charset.StandardCharsets; |
21 | 23 | import java.security.*;
|
22 | 24 | import java.security.spec.NamedParameterSpec;
|
23 | 25 | import java.util.List;
|
@@ -665,4 +667,78 @@ public void nextBytes(final byte[] bytes) {
|
665 | 667 | throw new RuntimeException(e);
|
666 | 668 | }
|
667 | 669 | }
|
| 670 | + |
| 671 | + @Test |
| 672 | + void dhkemHfs() throws NoSuchAlgorithmException, AEADBadTagException { |
| 673 | + final NoiseHandshake initiatorHandshake = NoiseHandshakeBuilder.forNNHfsInitiator() |
| 674 | + .setKeyAgreement("25519") |
| 675 | + .setKeyEncapsulationMechanism("DHKEM") |
| 676 | + .setCipher("AESGCM") |
| 677 | + .setHash("SHA256") |
| 678 | + .build(); |
| 679 | + |
| 680 | + final NoiseHandshake responderHandshake = NoiseHandshakeBuilder.forNNHfsResponder() |
| 681 | + .setKeyAgreement("25519") |
| 682 | + .setKeyEncapsulationMechanism("DHKEM") |
| 683 | + .setCipher("AESGCM") |
| 684 | + .setHash("SHA256") |
| 685 | + .build(); |
| 686 | + |
| 687 | + // -> e (with an empty payload) |
| 688 | + final byte[] initiatorEMessage = initiatorHandshake.writeMessage((byte[]) null); |
| 689 | + responderHandshake.readMessage(initiatorEMessage); |
| 690 | + |
| 691 | + // <- e, ee (with an empty payload) |
| 692 | + final byte[] responderEEeMessage = responderHandshake.writeMessage((byte[]) null); |
| 693 | + initiatorHandshake.readMessage(responderEEeMessage); |
| 694 | + |
| 695 | + assertTrue(initiatorHandshake.isDone()); |
| 696 | + assertTrue(responderHandshake.isDone()); |
| 697 | + |
| 698 | + final NoiseTransport initiatorTransport = initiatorHandshake.toTransport(); |
| 699 | + final NoiseTransport responderTransport = responderHandshake.toTransport(); |
| 700 | + |
| 701 | + final byte[] originalPlaintext = "Original payload!".getBytes(StandardCharsets.UTF_8); |
| 702 | + final byte[] originalCiphertext = initiatorTransport.writeMessage(originalPlaintext); |
| 703 | + final byte[] decryptedPlaintext = responderTransport.readMessage(originalCiphertext); |
| 704 | + |
| 705 | + assertArrayEquals(originalPlaintext, decryptedPlaintext); |
| 706 | + } |
| 707 | + |
| 708 | + @Test |
| 709 | + void dhkemHfsByteBuffer() throws NoSuchAlgorithmException, AEADBadTagException { |
| 710 | + final NoiseHandshake initiatorHandshake = NoiseHandshakeBuilder.forNNHfsInitiator() |
| 711 | + .setKeyAgreement("25519") |
| 712 | + .setKeyEncapsulationMechanism("DHKEM") |
| 713 | + .setCipher("AESGCM") |
| 714 | + .setHash("SHA256") |
| 715 | + .build(); |
| 716 | + |
| 717 | + final NoiseHandshake responderHandshake = NoiseHandshakeBuilder.forNNHfsResponder() |
| 718 | + .setKeyAgreement("25519") |
| 719 | + .setKeyEncapsulationMechanism("DHKEM") |
| 720 | + .setCipher("AESGCM") |
| 721 | + .setHash("SHA256") |
| 722 | + .build(); |
| 723 | + |
| 724 | + // -> e (with an empty payload) |
| 725 | + final ByteBuffer initiatorEMessage = initiatorHandshake.writeMessage((ByteBuffer) null); |
| 726 | + responderHandshake.readMessage(initiatorEMessage); |
| 727 | + |
| 728 | + // <- e, ee (with an empty payload) |
| 729 | + final ByteBuffer responderEEeMessage = responderHandshake.writeMessage((ByteBuffer) null); |
| 730 | + initiatorHandshake.readMessage(responderEEeMessage); |
| 731 | + |
| 732 | + assertTrue(initiatorHandshake.isDone()); |
| 733 | + assertTrue(responderHandshake.isDone()); |
| 734 | + |
| 735 | + final NoiseTransport initiatorTransport = initiatorHandshake.toTransport(); |
| 736 | + final NoiseTransport responderTransport = responderHandshake.toTransport(); |
| 737 | + |
| 738 | + final ByteBuffer originalPlaintext = ByteBuffer.wrap("Original payload!".getBytes(StandardCharsets.UTF_8)); |
| 739 | + final ByteBuffer originalCiphertext = initiatorTransport.writeMessage(originalPlaintext); |
| 740 | + final ByteBuffer decryptedPlaintext = responderTransport.readMessage(originalCiphertext); |
| 741 | + |
| 742 | + assertEquals(originalPlaintext.rewind(), decryptedPlaintext); |
| 743 | + } |
668 | 744 | }
|
0 commit comments