From 3b2f4dccda98001d65457adffdf2a52a0690375f Mon Sep 17 00:00:00 2001 From: tangbo Date: Fri, 29 Mar 2024 16:59:49 +0800 Subject: [PATCH 1/4] stream encryption --- .../controller/EncryptionController.java | 46 +++++++++++++++ .../controller/SignatureController.java | 20 +++---- .../{BlockCipher.java => Encryptor.java} | 8 +-- .../devtools/crypto/ParametersFactory.java | 26 +++++--- .../crypto/{Signature.java => Signer.java} | 8 +-- ...Padding.java => AESEncryptionPadding.java} | 4 +- .../crypto/algorithms/MessageDigest.java | 9 ++- .../algorithms/RSAEncryptionPadding.java | 19 ++++++ .../parameters/BlockEncryptionParameters.java | 19 ++++++ .../crypto/parameters/BlockParameters.java | 43 -------------- .../parameters/EncryptionParameters.java | 35 +++++++++++ ...ricParameters.java => SignParameters.java} | 12 ++-- .../parameters/aes/AESCBCParameters.java | 8 +-- .../parameters/aes/AESECBParameters.java | 16 ++--- .../parameters/aes/AESGCMParameters.java | 4 +- .../parameters/ecdsa/ECCParameters.java | 4 +- .../parameters/ecdsa/ECIESParameters.java | 51 ++++++++++++++++ .../parameters/eddsa/Ed25519Parameters.java | 4 +- .../parameters/eddsa/Ed448Parameters.java | 4 +- .../crypto/parameters/rsa/RSAParameters.java | 4 +- .../parameters/rsa/RSAStreamParameters.java | 59 +++++++++++++++++++ .../crypto/parameters/sm2/SM2Parameters.java | 4 +- .../parameters/sm4/SM4CBCParameters.java | 8 +-- .../parameters/sm4/SM4ECBParameters.java | 16 ++--- .../parameters/sm4/SM4GCMParameters.java | 4 +- .../devtools/BlockCipherTest.java | 12 ++-- .../heliannuuthus/devtools/SignatureTest.java | 4 +- 27 files changed, 325 insertions(+), 126 deletions(-) create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java rename src/main/java/io/ghcr/heliannuuthus/devtools/crypto/{BlockCipher.java => Encryptor.java} (82%) rename src/main/java/io/ghcr/heliannuuthus/devtools/crypto/{Signature.java => Signer.java} (79%) rename src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/{Padding.java => AESEncryptionPadding.java} (76%) create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/RSAEncryptionPadding.java create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockEncryptionParameters.java delete mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockParameters.java create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/EncryptionParameters.java rename src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/{AsymmetricParameters.java => SignParameters.java} (83%) create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java new file mode 100644 index 0000000..74e142e --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java @@ -0,0 +1,46 @@ +package io.ghcr.heliannuuthus.devtools.controller; + +import static io.ghcr.heliannuuthus.devtools.crypto.parameters.OamParameters.*; + +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.jcajce.spec.EdDSAParameterSpec; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/crypto") +@Tag(name = "encrypt/decrypt api") +public class EncryptionController { + + @GetMapping("/encryption") + public Flux algorithm() { + return Flux.fromStream( + Stream.concat( + Stream.of(EdDSAParameterSpec.Ed25519, EdDSAParameterSpec.Ed448), + Stream.of(ECDSA_ALGORITHM, RSA_ALGORITHM, SM2_ALGORITHM) + .flatMap( + alg -> + Stream.of(MessageDigest.values()) + .map(md -> md.getValue() + CONNECTOR + alg)))); + } + + @GetMapping("/paddings") + public Flux padding() { + return Flux.fromStream( + Stream.concat( + Stream.of(EdDSAParameterSpec.Ed25519, EdDSAParameterSpec.Ed448), + Stream.of(ECDSA_ALGORITHM, RSA_ALGORITHM, SM2_ALGORITHM) + .flatMap( + alg -> + Stream.of(MessageDigest.values()) + .map(md -> md.getValue() + CONNECTOR + alg)))); + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/controller/SignatureController.java b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/SignatureController.java index 46b22aa..53cd882 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/controller/SignatureController.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/SignatureController.java @@ -3,9 +3,9 @@ import static io.ghcr.heliannuuthus.devtools.crypto.parameters.OamParameters.*; import io.ghcr.heliannuuthus.devtools.crypto.ParametersFactory; -import io.ghcr.heliannuuthus.devtools.crypto.Signature; +import io.ghcr.heliannuuthus.devtools.crypto.Signer; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import io.ghcr.heliannuuthus.devtools.model.dto.SignatureRequest; import io.ghcr.heliannuuthus.devtools.model.dto.VerificationRequest; import io.swagger.v3.oas.annotations.Operation; @@ -23,12 +23,12 @@ @RestController @AllArgsConstructor @RequestMapping("/crypto") -@Tag(name = "signature api") +@Tag(name = "sign/verify api") public class SignatureController { - private final Signature signature; + private final Signer signature; - @GetMapping("/algorithms") + @GetMapping("/signature") @Operation(summary = "fetch signature algorithm") public Flux algorithms() { return Flux.fromStream( @@ -38,7 +38,7 @@ public Flux algorithms() { .flatMap( alg -> Stream.of(MessageDigest.values()) - .map(md -> md.getName() + CONNECTOR + alg)))); + .map(md -> md.getValue() + CONNECTOR + alg)))); } @PostMapping("/sign") @@ -46,9 +46,9 @@ public Flux algorithms() { public Mono sign(@Valid @RequestBody SignatureRequest request) { return Mono.fromCallable( () -> { - AsymmetricParameters parameters = + SignParameters parameters = ParametersFactory.getInstance() - .create( + .createForSign( request.getAlgorithm(), request.getKeyFormat().decode(request.getKey()), true); @@ -64,9 +64,9 @@ public Mono sign(@Valid @RequestBody SignatureRequest request) { public Mono verify(@Valid @RequestBody VerificationRequest request) { return Mono.fromCallable( () -> { - AsymmetricParameters parameters = + SignParameters parameters = ParametersFactory.getInstance() - .create( + .createForSign( request.getAlgorithm(), request.getKeyFormat().decode(request.getKey()), false); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/BlockCipher.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Encryptor.java similarity index 82% rename from src/main/java/io/ghcr/heliannuuthus/devtools/crypto/BlockCipher.java rename to src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Encryptor.java index 0be081a..f7c1bd1 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/BlockCipher.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Encryptor.java @@ -3,15 +3,15 @@ import static io.ghcr.heliannuuthus.devtools.exception.CryptoException.DECRYPT_MODE; import static io.ghcr.heliannuuthus.devtools.exception.CryptoException.ENCRYPT_MODE; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; import io.ghcr.heliannuuthus.devtools.exception.CryptoException; import javax.crypto.Cipher; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.stereotype.Component; @Component -public class BlockCipher { - public byte[] encrypt(byte[] plaintext, BlockParameters parameters) { +public class Encryptor { + public byte[] encrypt(byte[] plaintext, EncryptionParameters parameters) { try { Cipher cipher = Cipher.getInstance(parameters.getAlgorithm(), BouncyCastleProvider.PROVIDER_NAME); @@ -22,7 +22,7 @@ public byte[] encrypt(byte[] plaintext, BlockParameters parameters) { } } - public byte[] decrypt(byte[] cypher, BlockParameters parameters) { + public byte[] decrypt(byte[] cypher, EncryptionParameters parameters) { try { Cipher cipher = Cipher.getInstance(parameters.getAlgorithm(), BouncyCastleProvider.PROVIDER_NAME); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java index 48ac9d6..ed8841f 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java @@ -4,11 +4,13 @@ import com.google.common.collect.Sets; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECCParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECIESParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.eddsa.Ed25519Parameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.eddsa.Ed448Parameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa.RSAParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa.RSAStreamParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm2.SM2Parameters; import io.ghcr.heliannuuthus.devtools.exception.BadRequestException; import java.util.Set; @@ -19,11 +21,6 @@ public class ParametersFactory { private static final ParametersFactory INSTANCE = new ParametersFactory(); - - public static ParametersFactory getInstance() { - return INSTANCE; - } - private static final Set RSA = Stream.of(MessageDigest.values()) .map(md -> md + CONNECTOR + RSA_ALGORITHM) @@ -39,7 +36,11 @@ public static ParametersFactory getInstance() { .map(md -> md + CONNECTOR + SM2_ALGORITHM) .collect(Collectors.toSet()); - public AsymmetricParameters create(String algorithm, byte[] key, boolean forSign) { + public static ParametersFactory getInstance() { + return INSTANCE; + } + + public SignParameters createForSign(String algorithm, byte[] key, boolean forSign) { if (RSA.contains(algorithm)) { return new RSAParameters(key, forSign); } else if (ECC.contains(algorithm)) { @@ -54,6 +55,15 @@ public AsymmetricParameters create(String algorithm, byte[] key, boolean forSign } else if (GM.contains(algorithm)) { return new SM2Parameters(key, forSign); } - throw new BadRequestException("unsupported algorithm " + algorithm); + throw new BadRequestException("unsupported stream sign algorithm " + algorithm); + } + + public SignParameters createForEncrypt(String algorithm, byte[] key, boolean forEncrypt) { + if (RSA.contains(algorithm)) { + return new RSAStreamParameters(key, !forEncrypt); + } else if (ECC.contains(algorithm)) { + return new ECIESParameters(key, !forEncrypt); + } + throw new BadRequestException("unsupported stream encrypt algorithm " + algorithm); } } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signature.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signer.java similarity index 79% rename from src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signature.java rename to src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signer.java index bfe80d0..6a7a5f4 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signature.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/Signer.java @@ -1,13 +1,13 @@ package io.ghcr.heliannuuthus.devtools.crypto; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import io.ghcr.heliannuuthus.devtools.exception.CryptoException; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.stereotype.Component; @Component -public class Signature { - public byte[] sign(byte[] plaintext, AsymmetricParameters parameters) { +public class Signer { + public byte[] sign(byte[] plaintext, SignParameters parameters) { try { java.security.Signature signer = java.security.Signature.getInstance( @@ -20,7 +20,7 @@ public byte[] sign(byte[] plaintext, AsymmetricParameters parameters) { } } - public boolean verify(byte[] plaintext, byte[] signature, AsymmetricParameters parameters) { + public boolean verify(byte[] plaintext, byte[] signature, SignParameters parameters) { try { java.security.Signature signer = java.security.Signature.getInstance( diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/Padding.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/AESEncryptionPadding.java similarity index 76% rename from src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/Padding.java rename to src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/AESEncryptionPadding.java index 8a49b4c..096971d 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/Padding.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/AESEncryptionPadding.java @@ -5,9 +5,9 @@ @Getter @AllArgsConstructor -public enum Padding { +public enum AESEncryptionPadding { PKCS7("PKCS7Padding"), PKCS5("PKCS5Padding"), None("NoPadding"); - private final String name; + private final String value; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/MessageDigest.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/MessageDigest.java index b76dd55..20d6588 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/MessageDigest.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/MessageDigest.java @@ -8,9 +8,12 @@ public enum MessageDigest { NONE("None"), SM3("SM3"), + SHA_1("SHA1"), SHA_256("SHA256"), SHA_384("SHA384"), - SHA_512("SHA512"); - - private final String name; + SHA_512("SHA512"), + SHA3_256("SHA3-256"), + SHA3_384("SHA3-384"), + SHA3_512("SHA3-512"); + private final String value; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/RSAEncryptionPadding.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/RSAEncryptionPadding.java new file mode 100644 index 0000000..4b758df --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/algorithms/RSAEncryptionPadding.java @@ -0,0 +1,19 @@ +package io.ghcr.heliannuuthus.devtools.crypto.algorithms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RSAEncryptionPadding { + OAEP_SHA1("OAEPWithSHA-1AndMGF1Padding", MessageDigest.SHA_1), + OAEP_SHA256("OAEPWithSHA-256AndMGF1Padding", MessageDigest.SHA_256), + OAEP_SHA3_256("OAEPWithSHA3-256AndMGF1Padding", MessageDigest.SHA3_256), + OAEP_SHA3_384("OAEPWithSHA3-384AndMGF1Padding", MessageDigest.SHA3_384), + OAEP_SHA3_512("OAEPWithSHA3-512AndMGF1Padding", MessageDigest.SHA3_512), + OAEP_SHA384("OAEPWithSHA-384AndMGF1Padding", MessageDigest.SHA_384), + OAEP_SHA512("OAEPWithSHA-512AndMGF1Padding", MessageDigest.SHA_512), + PKCSV1_5("PKCS1Padding", null); + private final String value; + private final MessageDigest md; +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockEncryptionParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockEncryptionParameters.java new file mode 100644 index 0000000..47c6e99 --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockEncryptionParameters.java @@ -0,0 +1,19 @@ +package io.ghcr.heliannuuthus.devtools.crypto.parameters; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public abstract class BlockEncryptionParameters implements EncryptionParameters { + + protected byte[] key; + + public abstract String getMode(); + + public SecretKey getKey() { + return new SecretKeySpec(this.key, getName()); + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockParameters.java deleted file mode 100644 index 19889cd..0000000 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/BlockParameters.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.ghcr.heliannuuthus.devtools.crypto.parameters; - -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; -import java.security.spec.AlgorithmParameterSpec; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; -import lombok.Getter; -import lombok.Setter; -import org.apache.commons.lang3.StringUtils; - -@Setter -@Getter -public abstract class BlockParameters implements OamParameters { - - public static final String ECB_MODE = "ECB"; - public static final String CBC_MODE = "CBC"; - public static final String GCM_MODE = "GCM"; - - protected byte[] key; - - @Override - public String getAlgorithm() { - return StringUtils.joinWith("/", getName(), getMode(), getPadding().getName()); - } - - public String getName() { - return null; - } - - public abstract String getMode(); - - public Padding getPadding() { - return Padding.PKCS7; - } - - public SecretKey getKey() { - return new SecretKeySpec(this.key, getName()); - } - - public AlgorithmParameterSpec getSpec() { - return null; - } -} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/EncryptionParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/EncryptionParameters.java new file mode 100644 index 0000000..38a6f4c --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/EncryptionParameters.java @@ -0,0 +1,35 @@ +package io.ghcr.heliannuuthus.devtools.crypto.parameters; + +import com.google.common.base.Joiner; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; +import java.security.Key; +import java.security.spec.AlgorithmParameterSpec; + +public interface EncryptionParameters extends OamParameters { + + String NONE_MODE = "NONE"; + String ECB_MODE = "ECB"; + String CBC_MODE = "CBC"; + String GCM_MODE = "GCM"; + + Key getKey(); + + @Override + default String getAlgorithm() { + return Joiner.on("/").skipNulls().join(getName(), getMode(), getPadding()); + } + + default String getName() { + return null; + } + + String getMode(); + + default String getPadding() { + return AESEncryptionPadding.PKCS7.getValue(); + } + + default AlgorithmParameterSpec getSpec() { + return null; + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/AsymmetricParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/SignParameters.java similarity index 83% rename from src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/AsymmetricParameters.java rename to src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/SignParameters.java index 87c496e..56e8af4 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/AsymmetricParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/SignParameters.java @@ -11,13 +11,13 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider; @Getter -public abstract class AsymmetricParameters implements OamParameters { +public abstract class SignParameters implements OamParameters { private MessageDigest messageDigest = MessageDigest.SHA_256; - protected AsymmetricParameters() {} + protected SignParameters() {} - public AsymmetricParameters(byte[] key, boolean isPrivate) { + public SignParameters(byte[] key, boolean isPrivate) { this(); try { KeyFactory keyFactory = @@ -32,7 +32,7 @@ public AsymmetricParameters(byte[] key, boolean isPrivate) { } } - public AsymmetricParameters(byte[] privateKey, byte[] publicKey) { + public SignParameters(byte[] privateKey, byte[] publicKey) { try { KeyFactory keyFactory = KeyFactory.getInstance(this.getName(), BouncyCastleProvider.PROVIDER_NAME); @@ -49,10 +49,10 @@ public AsymmetricParameters(byte[] privateKey, byte[] publicKey) { public abstract String getName(); public String getMessageDigest() { - return messageDigest.getName(); + return messageDigest.getValue(); } - public AsymmetricParameters md(MessageDigest messageDigest) { + public SignParameters md(MessageDigest messageDigest) { this.messageDigest = messageDigest; return this; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESCBCParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESCBCParameters.java index 77084ea..c5b97a5 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESCBCParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESCBCParameters.java @@ -1,9 +1,9 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.aes; -import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding.PKCS7; +import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding.PKCS7; import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.spec.IvParameterSpec; import lombok.Getter; @@ -19,11 +19,11 @@ public AESCBCParameters(byte[] key) { this(key, nextBytes(16), PKCS7); } - public AESCBCParameters(byte[] key, Padding padding) { + public AESCBCParameters(byte[] key, AESEncryptionPadding padding) { this(key, nextBytes(16), padding); } - protected AESCBCParameters(byte[] key, byte[] iv, Padding padding) { + protected AESCBCParameters(byte[] key, byte[] iv, AESEncryptionPadding padding) { super(key, padding); this.iv = iv; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESECBParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESECBParameters.java index 5d7cdca..01b7703 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESECBParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESECBParameters.java @@ -1,24 +1,24 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.aes; -import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding.PKCS7; +import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding.PKCS7; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockParameters; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockEncryptionParameters; import lombok.Getter; @Getter -public class AESECBParameters extends BlockParameters { +public class AESECBParameters extends BlockEncryptionParameters { public AESECBParameters(byte[] key) { this(key, PKCS7); } - protected AESECBParameters(byte[] key, Padding padding) { + protected AESECBParameters(byte[] key, AESEncryptionPadding padding) { this.key = key; this.padding = padding; } - private final Padding padding; + private final AESEncryptionPadding padding; @Override public String getName() { @@ -30,7 +30,7 @@ public String getMode() { } @Override - public Padding getPadding() { - return this.padding; + public String getPadding() { + return this.padding.getValue(); } } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESGCMParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESGCMParameters.java index 9eb8e61..6956ac9 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESGCMParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/aes/AESGCMParameters.java @@ -2,7 +2,7 @@ import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; import java.security.spec.AlgorithmParameterSpec; import lombok.Getter; import lombok.Setter; @@ -23,7 +23,7 @@ public AESGCMParameters(byte[] key, byte[] iv) { } public AESGCMParameters(byte[] key, byte[] iv, byte[] aad) { - super(key, iv, Padding.None); + super(key, iv, AESEncryptionPadding.None); this.aad = aad; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECCParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECCParameters.java index 64730ad..29540be 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECCParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECCParameters.java @@ -1,8 +1,8 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; -public class ECCParameters extends AsymmetricParameters { +public class ECCParameters extends SignParameters { protected ECCParameters() { super(); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java new file mode 100644 index 0000000..891e73c --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java @@ -0,0 +1,51 @@ +package io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa; + +import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; +import java.security.Key; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Objects; +import org.bouncycastle.jce.spec.IESParameterSpec; +import org.bouncycastle.util.encoders.Hex; + +public class ECIESParameters extends ECCParameters implements EncryptionParameters { + + private static final byte[] DERIVATION = Hex.decode("202122232425262728292a2b2c2d2e2f"); + private static final byte[] ENCODING = Hex.decode("303132333435363738393a3b3c3d3e3f"); + + protected ECIESParameters() { + super(); + } + + public ECIESParameters(byte[] key, boolean isPrivate) { + super(key, isPrivate); + } + + public ECIESParameters(byte[] privateKey, byte[] publicKey) { + super(privateKey, publicKey); + } + + @Override + public Key getKey() { + return Objects.nonNull(super.getPrivateKey()) ? super.getPrivateKey() : super.getPublicKey(); + } + + @Override + public String getMode() { + return null; + } + + @Override + public AlgorithmParameterSpec getSpec() { + return new IESParameterSpec(DERIVATION, ENCODING, 128); + } + + @Override + public String getAlgorithm() { + return "ECIES"; + } + + @Override + public String getPadding() { + return null; + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed25519Parameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed25519Parameters.java index b24b1e9..e306a72 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed25519Parameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed25519Parameters.java @@ -1,10 +1,10 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.eddsa; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import java.security.spec.AlgorithmParameterSpec; import org.bouncycastle.jcajce.spec.EdDSAParameterSpec; -public class Ed25519Parameters extends AsymmetricParameters { +public class Ed25519Parameters extends SignParameters { protected Ed25519Parameters() { super(); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed448Parameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed448Parameters.java index c777a5e..046b02e 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed448Parameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/eddsa/Ed448Parameters.java @@ -1,10 +1,10 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.eddsa; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import java.security.spec.AlgorithmParameterSpec; import org.bouncycastle.jcajce.spec.EdDSAParameterSpec; -public class Ed448Parameters extends AsymmetricParameters { +public class Ed448Parameters extends SignParameters { protected Ed448Parameters() { super(); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAParameters.java index 4bd489e..47e3e20 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAParameters.java @@ -1,8 +1,8 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; -public class RSAParameters extends AsymmetricParameters { +public class RSAParameters extends SignParameters { protected RSAParameters() { super(); } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java new file mode 100644 index 0000000..0330ab1 --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java @@ -0,0 +1,59 @@ +package io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa; + +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.RSAEncryptionPadding; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; +import java.security.Key; +import java.security.spec.AlgorithmParameterSpec; +import java.security.spec.MGF1ParameterSpec; +import java.util.Objects; +import java.util.Optional; +import javax.crypto.spec.OAEPParameterSpec; +import javax.crypto.spec.PSource; + +public class RSAStreamParameters extends RSAParameters implements EncryptionParameters { + protected RSAStreamParameters() { + super(); + } + + public RSAStreamParameters(byte[] key, boolean isPrivate) { + super(key, isPrivate); + } + + public RSAStreamParameters(byte[] privateKey, byte[] publicKey) { + super(privateKey, publicKey); + } + + private RSAEncryptionPadding padding = RSAEncryptionPadding.OAEP_SHA256; + + @Override + public Key getKey() { + return Objects.nonNull(super.getPrivateKey()) ? super.getPrivateKey() : super.getPublicKey(); + } + + public RSAStreamParameters padding(RSAEncryptionPadding padding) { + this.padding = padding; + return this; + } + + @Override + public String getMode() { + return NONE_MODE; + } + + @Override + public String getPadding() { + return padding.getValue(); + } + + @Override + public AlgorithmParameterSpec getSpec() { + MessageDigest md = padding.getMd(); + return Optional.ofNullable(md.getValue()) + .map( + cc -> + new OAEPParameterSpec( + md.getValue(), "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)) + .orElse(null); + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm2/SM2Parameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm2/SM2Parameters.java index 5f2dd16..5c69145 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm2/SM2Parameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm2/SM2Parameters.java @@ -1,8 +1,8 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.sm2; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.AsymmetricParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; -public class SM2Parameters extends AsymmetricParameters { +public class SM2Parameters extends SignParameters { protected SM2Parameters() { super(); } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4CBCParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4CBCParameters.java index cf62764..7df1a65 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4CBCParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4CBCParameters.java @@ -1,9 +1,9 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4; -import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding.PKCS7; +import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding.PKCS7; import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.spec.IvParameterSpec; import lombok.Getter; @@ -19,11 +19,11 @@ public SM4CBCParameters(byte[] key) { this(key, nextBytes(16), PKCS7); } - public SM4CBCParameters(byte[] key, Padding padding) { + public SM4CBCParameters(byte[] key, AESEncryptionPadding padding) { this(key, nextBytes(16), padding); } - protected SM4CBCParameters(byte[] key, byte[] iv, Padding padding) { + protected SM4CBCParameters(byte[] key, byte[] iv, AESEncryptionPadding padding) { super(key, padding); this.iv = iv; } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4ECBParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4ECBParameters.java index d30348d..1ae499c 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4ECBParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4ECBParameters.java @@ -1,24 +1,24 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4; -import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding.PKCS7; +import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding.PKCS7; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockParameters; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockEncryptionParameters; import lombok.Getter; @Getter -public class SM4ECBParameters extends BlockParameters { +public class SM4ECBParameters extends BlockEncryptionParameters { public SM4ECBParameters(byte[] key) { this(key, PKCS7); } - protected SM4ECBParameters(byte[] key, Padding padding) { + protected SM4ECBParameters(byte[] key, AESEncryptionPadding padding) { this.key = key; this.padding = padding; } - private final Padding padding; + private final AESEncryptionPadding padding; @Override public String getName() { @@ -30,7 +30,7 @@ public String getMode() { } @Override - public Padding getPadding() { - return this.padding; + public String getPadding() { + return this.padding.getValue(); } } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4GCMParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4GCMParameters.java index 6edb8ba..7c1a9e9 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4GCMParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/sm4/SM4GCMParameters.java @@ -2,7 +2,7 @@ import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.Padding; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.AESEncryptionPadding; import java.security.spec.AlgorithmParameterSpec; import lombok.Getter; import lombok.Setter; @@ -23,7 +23,7 @@ public SM4GCMParameters(byte[] key, byte[] iv) { } public SM4GCMParameters(byte[] key, byte[] iv, byte[] aad) { - super(key, iv, Padding.None); + super(key, iv, AESEncryptionPadding.None); this.aad = aad; } diff --git a/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java b/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java index f4c83e6..59e79f0 100644 --- a/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java +++ b/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java @@ -1,12 +1,12 @@ package io.ghcr.heliannuuthus.devtools; -import static io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockParameters.ECB_MODE; +import static io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters.ECB_MODE; import static io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESCBCParameters.CBC_MODE; import static io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESCBCParameters.GCM_MODE; import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; -import io.ghcr.heliannuuthus.devtools.crypto.BlockCipher; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.BlockParameters; +import io.ghcr.heliannuuthus.devtools.crypto.Encryptor; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESCBCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESECBParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESGCMParameters; @@ -33,7 +33,7 @@ @ExtendWith(MockitoExtension.class) class BlockCipherTest { - private static final BlockCipher blockCipher = new BlockCipher(); + private static final Encryptor blockCipher = new Encryptor(); private static final SymmetricKeyProvider symmetricKeyProvider = new SymmetricKeyProvider(); @BeforeAll @@ -52,7 +52,7 @@ static Stream aesGenerator() { void testAESEncryption(String mode, int size) throws NoSuchAlgorithmException { byte[] plaintext = "plaintext".getBytes(); byte[] key = symmetricKeyProvider.generate(new AESKeyGenParameters(128)); - BlockParameters blockParameters; + EncryptionParameters blockParameters; switch (mode) { case ECB_MODE -> { blockParameters = new AESECBParameters(key); @@ -75,7 +75,7 @@ void testAESEncryption(String mode, int size) throws NoSuchAlgorithmException { void testSM4Encryption(String mode) { byte[] plaintext = "plaintext".getBytes(); byte[] key = symmetricKeyProvider.generate(new SM4KeyGenParameters()); - BlockParameters blockParameters; + EncryptionParameters blockParameters; switch (mode) { case ECB_MODE -> { blockParameters = new SM4ECBParameters(key); diff --git a/src/test/java/io/ghcr/heliannuuthus/devtools/SignatureTest.java b/src/test/java/io/ghcr/heliannuuthus/devtools/SignatureTest.java index 5edead7..8032d6a 100644 --- a/src/test/java/io/ghcr/heliannuuthus/devtools/SignatureTest.java +++ b/src/test/java/io/ghcr/heliannuuthus/devtools/SignatureTest.java @@ -2,7 +2,7 @@ import static io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest.*; -import io.ghcr.heliannuuthus.devtools.crypto.Signature; +import io.ghcr.heliannuuthus.devtools.crypto.Signer; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.eddsa.Ed25519Parameters; @@ -32,7 +32,7 @@ @ExtendWith(MockitoExtension.class) class SignatureTest { - private final Signature signature = new Signature(); + private final Signer signature = new Signer(); private final AsymmetricKeyProvider provider = new AsymmetricKeyProvider(); @BeforeAll From c1718076c660dd98b034c1c7a77c2ed46861c580 Mon Sep 17 00:00:00 2001 From: tangbo Date: Fri, 29 Mar 2024 22:29:50 +0800 Subject: [PATCH 2/4] stream encryption --- .../StreamEncryptionParameters.java | 47 +++++++++++++++++++ .../parameters/rsa/RSAStreamParameters.java | 14 +++--- ...lockCipherTest.java => EncryptorTest.java} | 39 +++++++++++---- 3 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java rename src/test/java/io/ghcr/heliannuuthus/devtools/{BlockCipherTest.java => EncryptorTest.java} (68%) diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java new file mode 100644 index 0000000..21dd60b --- /dev/null +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java @@ -0,0 +1,47 @@ +package io.ghcr.heliannuuthus.devtools.crypto.parameters; + +import io.ghcr.heliannuuthus.devtools.exception.CryptoException; +import lombok.Getter; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import java.security.Key; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.Objects; + +@Getter +public class StreamEncryptionParameters implements EncryptionParameters { + + private PrivateKey privateKey; + private PublicKey publicKey; + + protected StreamEncryptionParameters() { + } + public StreamEncryptionParameters(byte[] key, boolean isPrivate) { + this(); + try { + KeyFactory keyFactory = + KeyFactory.getInstance(this.getName(), BouncyCastleProvider.PROVIDER_NAME); + if (isPrivate) { + this.privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(key)); + } else { + this.publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(key)); + } + } catch (Exception e) { + throw new CryptoException(CryptoException.INIT_MODE, getName(), e); + } + } + + @Override + public Key getKey() { + return Objects.nonNull(getPrivateKey()) ? privateKey : publicKey; + } + + @Override + public String getMode() { + return null; + } +} diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java index 0330ab1..d51ac18 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java @@ -3,6 +3,8 @@ import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.RSAEncryptionPadding; import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.StreamEncryptionParameters; + import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.MGF1ParameterSpec; @@ -11,7 +13,7 @@ import javax.crypto.spec.OAEPParameterSpec; import javax.crypto.spec.PSource; -public class RSAStreamParameters extends RSAParameters implements EncryptionParameters { +public class RSAStreamParameters extends StreamEncryptionParameters { protected RSAStreamParameters() { super(); } @@ -20,17 +22,13 @@ public RSAStreamParameters(byte[] key, boolean isPrivate) { super(key, isPrivate); } - public RSAStreamParameters(byte[] privateKey, byte[] publicKey) { - super(privateKey, publicKey); + @Override + public String getAlgorithm() { + return super.getAlgorithm(); } private RSAEncryptionPadding padding = RSAEncryptionPadding.OAEP_SHA256; - @Override - public Key getKey() { - return Objects.nonNull(super.getPrivateKey()) ? super.getPrivateKey() : super.getPublicKey(); - } - public RSAStreamParameters padding(RSAEncryptionPadding padding) { this.padding = padding; return this; diff --git a/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java similarity index 68% rename from src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java rename to src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java index 59e79f0..1525189 100644 --- a/src/test/java/io/ghcr/heliannuuthus/devtools/BlockCipherTest.java +++ b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java @@ -10,19 +10,25 @@ import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESCBCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESECBParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESGCMParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa.RSAStreamParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4.SM4CBCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4.SM4ECBParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4.SM4GCMParameters; +import io.ghcr.heliannuuthus.devtools.provider.AsymmetricKeyProvider; import io.ghcr.heliannuuthus.devtools.provider.SymmetricKeyProvider; import io.ghcr.heliannuuthus.devtools.provider.parameters.AESKeyGenParameters; +import io.ghcr.heliannuuthus.devtools.provider.parameters.RSAKeyGenParameters; import io.ghcr.heliannuuthus.devtools.provider.parameters.SM4KeyGenParameters; import java.security.NoSuchAlgorithmException; import java.security.Security; import java.util.stream.Stream; + +import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -31,10 +37,11 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class BlockCipherTest { +class EncryptorTest { - private static final Encryptor blockCipher = new Encryptor(); - private static final SymmetricKeyProvider symmetricKeyProvider = new SymmetricKeyProvider(); + private static final Encryptor ENCRYPTOR = new Encryptor(); + private static final SymmetricKeyProvider SYMMETRIC_KEY_PROVIDER = new SymmetricKeyProvider(); + private static final AsymmetricKeyProvider ASYMMETRIC_KEY_PROVIDER = new AsymmetricKeyProvider(); @BeforeAll static void init() { @@ -51,7 +58,7 @@ static Stream aesGenerator() { @DisplayName("test AES encryption") void testAESEncryption(String mode, int size) throws NoSuchAlgorithmException { byte[] plaintext = "plaintext".getBytes(); - byte[] key = symmetricKeyProvider.generate(new AESKeyGenParameters(128)); + byte[] key = SYMMETRIC_KEY_PROVIDER.generate(new AESKeyGenParameters(128)); EncryptionParameters blockParameters; switch (mode) { case ECB_MODE -> { @@ -65,8 +72,8 @@ void testAESEncryption(String mode, int size) throws NoSuchAlgorithmException { } default -> throw new UnsupportedOperationException(); } - byte[] cipher = blockCipher.encrypt(plaintext, blockParameters); - Assertions.assertArrayEquals(plaintext, blockCipher.decrypt(cipher, blockParameters)); + byte[] cipher = ENCRYPTOR.encrypt(plaintext, blockParameters); + Assertions.assertArrayEquals(plaintext, ENCRYPTOR.decrypt(cipher, blockParameters)); } @ParameterizedTest @@ -74,7 +81,7 @@ void testAESEncryption(String mode, int size) throws NoSuchAlgorithmException { @DisplayName("test SM4 encryption") void testSM4Encryption(String mode) { byte[] plaintext = "plaintext".getBytes(); - byte[] key = symmetricKeyProvider.generate(new SM4KeyGenParameters()); + byte[] key = SYMMETRIC_KEY_PROVIDER.generate(new SM4KeyGenParameters()); EncryptionParameters blockParameters; switch (mode) { case ECB_MODE -> { @@ -88,7 +95,21 @@ void testSM4Encryption(String mode) { } default -> throw new UnsupportedOperationException(); } - byte[] cipher = blockCipher.encrypt(plaintext, blockParameters); - Assertions.assertArrayEquals(plaintext, blockCipher.decrypt(cipher, blockParameters)); + byte[] cipher = ENCRYPTOR.encrypt(plaintext, blockParameters); + Assertions.assertArrayEquals(plaintext, ENCRYPTOR.decrypt(cipher, blockParameters)); + } + + + + @Test + void testRSAStreamEncrypt() { + byte[] plaintext = "plaintext".getBytes(); + Pair keyPair = ASYMMETRIC_KEY_PROVIDER.generate(new RSAKeyGenParameters(2048)); + + EncryptionParameters blockParameters = new RSAStreamParameters(keyPair.getLeft(), true); + byte[] cipher = ENCRYPTOR.encrypt(plaintext, blockParameters); + + Assertions.assertArrayEquals(plaintext, ENCRYPTOR.decrypt(cipher, new RSAStreamParameters(keyPair.getRight(), false))); + } } From 204c84e87b8ac7610251ffa9b145de2ac8287db0 Mon Sep 17 00:00:00 2001 From: heliannuuthus Date: Fri, 29 Mar 2024 22:55:55 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=A8=20Encryption?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devtools/crypto/ParametersFactory.java | 3 +- .../crypto/parameters/OamParameters.java | 3 ++ .../StreamEncryptionParameters.java | 18 ++++---- .../parameters/ecdsa/ECIESParameters.java | 16 +++---- .../parameters/rsa/RSAStreamParameters.java | 12 ++--- .../heliannuuthus/devtools/EncryptorTest.java | 45 +++++++++++++++---- 6 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java index ed8841f..4f2af2c 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/ParametersFactory.java @@ -4,6 +4,7 @@ import com.google.common.collect.Sets; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.SignParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECIESParameters; @@ -58,7 +59,7 @@ public SignParameters createForSign(String algorithm, byte[] key, boolean forSig throw new BadRequestException("unsupported stream sign algorithm " + algorithm); } - public SignParameters createForEncrypt(String algorithm, byte[] key, boolean forEncrypt) { + public EncryptionParameters createForEncrypt(String algorithm, byte[] key, boolean forEncrypt) { if (RSA.contains(algorithm)) { return new RSAStreamParameters(key, !forEncrypt); } else if (ECC.contains(algorithm)) { diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/OamParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/OamParameters.java index 1be2070..8784703 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/OamParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/OamParameters.java @@ -9,6 +9,9 @@ public interface OamParameters { String ECDSA_ALGORITHM = "ECDSA"; String SM2_ALGORITHM = "SM2"; + String ECIES_ALGORITHM = "ECIES"; + String ECDH_ALGORITHM = "ECDH"; + String CONNECTOR = "with"; String getAlgorithm(); diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java index 21dd60b..d0c8336 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/StreamEncryptionParameters.java @@ -1,9 +1,6 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters; import io.ghcr.heliannuuthus.devtools.exception.CryptoException; -import lombok.Getter; -import org.bouncycastle.jce.provider.BouncyCastleProvider; - import java.security.Key; import java.security.KeyFactory; import java.security.PrivateKey; @@ -11,15 +8,17 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Objects; +import lombok.Getter; +import org.bouncycastle.jce.provider.BouncyCastleProvider; @Getter -public class StreamEncryptionParameters implements EncryptionParameters { +public abstract class StreamEncryptionParameters implements EncryptionParameters { private PrivateKey privateKey; private PublicKey publicKey; - protected StreamEncryptionParameters() { - } + protected StreamEncryptionParameters() {} + public StreamEncryptionParameters(byte[] key, boolean isPrivate) { this(); try { @@ -35,13 +34,12 @@ public StreamEncryptionParameters(byte[] key, boolean isPrivate) { } } + public abstract String getName(); + @Override public Key getKey() { return Objects.nonNull(getPrivateKey()) ? privateKey : publicKey; } - @Override - public String getMode() { - return null; - } + public abstract String getMode(); } diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java index 891e73c..8d199f8 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/ecdsa/ECIESParameters.java @@ -1,13 +1,11 @@ package io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; -import java.security.Key; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.StreamEncryptionParameters; import java.security.spec.AlgorithmParameterSpec; -import java.util.Objects; import org.bouncycastle.jce.spec.IESParameterSpec; import org.bouncycastle.util.encoders.Hex; -public class ECIESParameters extends ECCParameters implements EncryptionParameters { +public class ECIESParameters extends StreamEncryptionParameters { private static final byte[] DERIVATION = Hex.decode("202122232425262728292a2b2c2d2e2f"); private static final byte[] ENCODING = Hex.decode("303132333435363738393a3b3c3d3e3f"); @@ -20,13 +18,9 @@ public ECIESParameters(byte[] key, boolean isPrivate) { super(key, isPrivate); } - public ECIESParameters(byte[] privateKey, byte[] publicKey) { - super(privateKey, publicKey); - } - @Override - public Key getKey() { - return Objects.nonNull(super.getPrivateKey()) ? super.getPrivateKey() : super.getPublicKey(); + public String getName() { + return ECDH_ALGORITHM; } @Override @@ -41,7 +35,7 @@ public AlgorithmParameterSpec getSpec() { @Override public String getAlgorithm() { - return "ECIES"; + return ECIES_ALGORITHM; } @Override diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java index d51ac18..82f03e4 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/crypto/parameters/rsa/RSAStreamParameters.java @@ -2,13 +2,9 @@ import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; import io.ghcr.heliannuuthus.devtools.crypto.algorithms.RSAEncryptionPadding; -import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.StreamEncryptionParameters; - -import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.MGF1ParameterSpec; -import java.util.Objects; import java.util.Optional; import javax.crypto.spec.OAEPParameterSpec; import javax.crypto.spec.PSource; @@ -23,8 +19,8 @@ public RSAStreamParameters(byte[] key, boolean isPrivate) { } @Override - public String getAlgorithm() { - return super.getAlgorithm(); + public String getName() { + return RSA_ALGORITHM; } private RSAEncryptionPadding padding = RSAEncryptionPadding.OAEP_SHA256; @@ -47,11 +43,11 @@ public String getPadding() { @Override public AlgorithmParameterSpec getSpec() { MessageDigest md = padding.getMd(); - return Optional.ofNullable(md.getValue()) + return Optional.ofNullable(md) .map( cc -> new OAEPParameterSpec( - md.getValue(), "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)) + cc.getValue(), "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)) .orElse(null); } } diff --git a/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java index 1525189..bcb05a9 100644 --- a/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java +++ b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java @@ -6,10 +6,12 @@ import static io.ghcr.heliannuuthus.devtools.utils.CryptoUtils.nextBytes; import io.ghcr.heliannuuthus.devtools.crypto.Encryptor; +import io.ghcr.heliannuuthus.devtools.crypto.algorithms.RSAEncryptionPadding; import io.ghcr.heliannuuthus.devtools.crypto.parameters.EncryptionParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESCBCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESECBParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.aes.AESGCMParameters; +import io.ghcr.heliannuuthus.devtools.crypto.parameters.ecdsa.ECIESParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.rsa.RSAStreamParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4.SM4CBCParameters; import io.ghcr.heliannuuthus.devtools.crypto.parameters.sm4.SM4ECBParameters; @@ -17,18 +19,17 @@ import io.ghcr.heliannuuthus.devtools.provider.AsymmetricKeyProvider; import io.ghcr.heliannuuthus.devtools.provider.SymmetricKeyProvider; import io.ghcr.heliannuuthus.devtools.provider.parameters.AESKeyGenParameters; +import io.ghcr.heliannuuthus.devtools.provider.parameters.ECKeyGenParameters; import io.ghcr.heliannuuthus.devtools.provider.parameters.RSAKeyGenParameters; import io.ghcr.heliannuuthus.devtools.provider.parameters.SM4KeyGenParameters; import java.security.NoSuchAlgorithmException; import java.security.Security; import java.util.stream.Stream; - import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -99,17 +100,43 @@ void testSM4Encryption(String mode) { Assertions.assertArrayEquals(plaintext, ENCRYPTOR.decrypt(cipher, blockParameters)); } + static Stream rsaStreamEncryption() { + return Stream.of(2048, 3072, 4096) + .flatMap(c -> Stream.of(RSAEncryptionPadding.values()).map(cc -> Arguments.of(c, cc))); + } + + @ParameterizedTest + @MethodSource("rsaStreamEncryption") + void testRSAStreamEncrypt(Integer keySize, RSAEncryptionPadding padding) { + byte[] plaintext = "plaintext".getBytes(); + Pair keyPair = + ASYMMETRIC_KEY_PROVIDER.generate(new RSAKeyGenParameters(keySize)); + EncryptionParameters encryptionParameters = + new RSAStreamParameters(keyPair.getRight(), false).padding(padding); + byte[] cipher = ENCRYPTOR.encrypt(plaintext, encryptionParameters); - @Test - void testRSAStreamEncrypt() { + Assertions.assertArrayEquals( + plaintext, + ENCRYPTOR.decrypt( + cipher, new RSAStreamParameters(keyPair.getLeft(), true).padding(padding))); + } + + static Stream eciesStreamEncrypt() { + return Stream.of("secp256r1", "secp384r1", "secp521r1", "secp256k1").map(Arguments::of); + } + + @ParameterizedTest + @MethodSource("eciesStreamEncrypt") + void testECIESStreamEncrypt(String curveName) { byte[] plaintext = "plaintext".getBytes(); - Pair keyPair = ASYMMETRIC_KEY_PROVIDER.generate(new RSAKeyGenParameters(2048)); + Pair keyPair = + ASYMMETRIC_KEY_PROVIDER.generate(new ECKeyGenParameters(curveName)); - EncryptionParameters blockParameters = new RSAStreamParameters(keyPair.getLeft(), true); - byte[] cipher = ENCRYPTOR.encrypt(plaintext, blockParameters); - - Assertions.assertArrayEquals(plaintext, ENCRYPTOR.decrypt(cipher, new RSAStreamParameters(keyPair.getRight(), false))); + EncryptionParameters encryptionParameters = new ECIESParameters(keyPair.getRight(), false); + byte[] cipher = ENCRYPTOR.encrypt(plaintext, encryptionParameters); + Assertions.assertArrayEquals( + plaintext, ENCRYPTOR.decrypt(cipher, new ECIESParameters(keyPair.getLeft(), true))); } } From ec52ad3c91237974e6cfcd26327240329c5c859a Mon Sep 17 00:00:00 2001 From: heliannuuthus Date: Sat, 30 Mar 2024 10:51:43 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=85=20Test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EncryptionController.java | 25 +------------------ .../heliannuuthus/devtools/EncryptorTest.java | 3 ++- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java index 74e142e..99f7e8d 100644 --- a/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java +++ b/src/main/java/io/ghcr/heliannuuthus/devtools/controller/EncryptionController.java @@ -1,13 +1,9 @@ package io.ghcr.heliannuuthus.devtools.controller; -import static io.ghcr.heliannuuthus.devtools.crypto.parameters.OamParameters.*; - -import io.ghcr.heliannuuthus.devtools.crypto.algorithms.MessageDigest; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.stream.Stream; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.jcajce.spec.EdDSAParameterSpec; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,25 +18,6 @@ public class EncryptionController { @GetMapping("/encryption") public Flux algorithm() { - return Flux.fromStream( - Stream.concat( - Stream.of(EdDSAParameterSpec.Ed25519, EdDSAParameterSpec.Ed448), - Stream.of(ECDSA_ALGORITHM, RSA_ALGORITHM, SM2_ALGORITHM) - .flatMap( - alg -> - Stream.of(MessageDigest.values()) - .map(md -> md.getValue() + CONNECTOR + alg)))); - } - - @GetMapping("/paddings") - public Flux padding() { - return Flux.fromStream( - Stream.concat( - Stream.of(EdDSAParameterSpec.Ed25519, EdDSAParameterSpec.Ed448), - Stream.of(ECDSA_ALGORITHM, RSA_ALGORITHM, SM2_ALGORITHM) - .flatMap( - alg -> - Stream.of(MessageDigest.values()) - .map(md -> md.getValue() + CONNECTOR + alg)))); + return Flux.fromStream(Stream.of("AES", "RSA-OAEP", "ECIES")); } } diff --git a/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java index bcb05a9..3f67986 100644 --- a/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java +++ b/src/test/java/io/ghcr/heliannuuthus/devtools/EncryptorTest.java @@ -123,7 +123,8 @@ void testRSAStreamEncrypt(Integer keySize, RSAEncryptionPadding padding) { } static Stream eciesStreamEncrypt() { - return Stream.of("secp256r1", "secp384r1", "secp521r1", "secp256k1").map(Arguments::of); + return Stream.of("secp256r1", "secp384r1", "secp521r1", "secp256k1", "curve25519") + .map(Arguments::of); } @ParameterizedTest