这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions core-java-modules/core-java-security-5/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@
</environmentVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.baeldung.kem;

import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.KEM;
import javax.crypto.SecretKey;

public class KemUtils {

public record KemResult(SecretKey sharedSecret, byte[] encapsulation) {}

public static KemResult encapsulate(String algorithm, PublicKey publicKey) throws Exception {
KEM kem = KEM.getInstance(algorithm);
KEM.Encapsulator encapsulator = kem.newEncapsulator(publicKey);
KEM.Encapsulated result = encapsulator.encapsulate();
return new KemResult(result.key(), result.encapsulation());
}

public static KemResult decapsulate(String algorithm, PrivateKey privateKey, byte[] encapsulation)
throws Exception {
KEM kem = KEM.getInstance(algorithm);
KEM.Decapsulator decapsulator = kem.newDecapsulator(privateKey);
SecretKey recoveredSecret = decapsulator.decapsulate(encapsulation);
return new KemResult(recoveredSecret, encapsulation);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.baeldung.kem;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.security.KeyPair;
import java.security.KeyPairGenerator;

import javax.crypto.SecretKey;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

public class KemUtilsUnitTest {
private static KeyPair keyPair;
public static final String KEM_ALGORITHM = "DHKEM";


@BeforeAll
static void setup() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("X25519");
keyPair = kpg.generateKeyPair();
}

@Test
void givenKem_whenSenderEncapsulatesAndReceiverDecapsulates_thenSecretsMatch() throws Exception {
KemUtils.KemResult senderResult = KemUtils.encapsulate(KEM_ALGORITHM, keyPair.getPublic());
assertNotNull(senderResult.sharedSecret());
assertNotNull(senderResult.encapsulation());

KemUtils.KemResult receiverResult = KemUtils.decapsulate(KEM_ALGORITHM, keyPair.getPrivate(),
senderResult.encapsulation());

SecretKey senderSecret = senderResult.sharedSecret();
SecretKey receiverSecret = receiverResult.sharedSecret();

assertArrayEquals(senderSecret.getEncoded(), receiverSecret.getEncoded(),
"Shared secrets from sender and receiver must match");
}

@Test
void givenDifferentReceiverKey_whenDecapsulate_thenFails() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
KeyPair wrongKeyPair = kpg.generateKeyPair();

KemUtils.KemResult senderResult = KemUtils.encapsulate(KEM_ALGORITHM, keyPair.getPublic());

assertThrows(Exception.class, () ->
KemUtils.decapsulate(KEM_ALGORITHM, wrongKeyPair.getPrivate(), senderResult.encapsulation()));
}

}