Skip to content

Commit fd886a9

Browse files
mkl-publicnanouh
authored andcommitted
Improved AwsKmsSignature to also support RSASSA-PSS
AwsKmsSignature does not reject the AWS RSASSA_PSS_SHA_* signing algorithms anymore. Instead it returns algorithm identification data for proper iText 8 RSASSA-PSS signatures. The AWS KMS TestSignSimple test suite got a new test testSignSimpleRsaSsaPss that tests AwsKmsSignature for RSASSA-PSS. The former test testSignSimpleRsaSsaPss which tests AwsKmsSignatureContainer for RSASSA-PSS, has been renamed to testSignSimpleRsaSsaPssExternal. Added BouncyCastle adapter to make AWS KMS tests runnable DEVSIX-7804
1 parent e7cc867 commit fd886a9

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

aws-kms/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949
<artifactId>aws-sdk-java</artifactId>
5050
<version>${awssdk.version}</version>
5151
</dependency>
52+
<dependency>
53+
<groupId>com.itextpdf</groupId>
54+
<artifactId>bouncy-castle-adapter</artifactId>
55+
<scope>test</scope>
56+
</dependency>
5257
<dependency>
5358
<groupId>org.junit.jupiter</groupId>
5459
<artifactId>junit-jupiter-api</artifactId>

aws-kms/src/main/java/com/itextpdf/signingexamples/aws/kms/AwsKmsSignature.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.itextpdf.signingexamples.aws.kms;
22

33
import java.security.GeneralSecurityException;
4+
import java.util.List;
5+
import java.util.function.Function;
46

57
import com.itextpdf.signatures.IExternalSignature;
68

79
import com.itextpdf.signatures.ISignatureMechanismParams;
10+
import com.itextpdf.signatures.RSASSAPSSMechanismParams;
11+
812
import software.amazon.awssdk.core.SdkBytes;
913
import software.amazon.awssdk.services.kms.KmsClient;
1014
import software.amazon.awssdk.services.kms.model.GetPublicKeyRequest;
@@ -19,26 +23,29 @@
1923
*/
2024
public class AwsKmsSignature implements IExternalSignature {
2125
public AwsKmsSignature(String keyId) {
26+
this(keyId, a -> a != null && a.size() > 0 ? a.get(0) : null);
27+
}
28+
29+
public AwsKmsSignature(String keyId, Function<List<SigningAlgorithmSpec>, SigningAlgorithmSpec> selector) {
2230
this.keyId = keyId;
2331

2432
try ( KmsClient kmsClient = KmsClient.create() ) {
2533
GetPublicKeyRequest getPublicKeyRequest = GetPublicKeyRequest.builder()
2634
.keyId(keyId)
2735
.build();
2836
GetPublicKeyResponse getPublicKeyResponse = kmsClient.getPublicKey(getPublicKeyRequest);
29-
signingAlgorithmSpec = getPublicKeyResponse.signingAlgorithms().get(0);
37+
signingAlgorithmSpec = selector.apply(getPublicKeyResponse.signingAlgorithms());
3038
switch(signingAlgorithmSpec) {
3139
case ECDSA_SHA_256:
3240
case ECDSA_SHA_384:
3341
case ECDSA_SHA_512:
3442
case RSASSA_PKCS1_V1_5_SHA_256:
3543
case RSASSA_PKCS1_V1_5_SHA_384:
3644
case RSASSA_PKCS1_V1_5_SHA_512:
37-
break;
3845
case RSASSA_PSS_SHA_256:
3946
case RSASSA_PSS_SHA_384:
4047
case RSASSA_PSS_SHA_512:
41-
throw new IllegalArgumentException(String.format("Signing algorithm %s not supported directly by iText", signingAlgorithmSpec));
48+
break;
4249
default:
4350
throw new IllegalArgumentException(String.format("Unknown signing algorithm: %s", signingAlgorithmSpec));
4451
}
@@ -50,12 +57,15 @@ public String getDigestAlgorithmName() {
5057
switch(signingAlgorithmSpec) {
5158
case ECDSA_SHA_256:
5259
case RSASSA_PKCS1_V1_5_SHA_256:
60+
case RSASSA_PSS_SHA_256:
5361
return "SHA-256";
5462
case ECDSA_SHA_384:
5563
case RSASSA_PKCS1_V1_5_SHA_384:
64+
case RSASSA_PSS_SHA_384:
5665
return "SHA-384";
5766
case ECDSA_SHA_512:
5867
case RSASSA_PKCS1_V1_5_SHA_512:
68+
case RSASSA_PSS_SHA_512:
5969
return "SHA-512";
6070
default:
6171
return null;
@@ -73,14 +83,34 @@ public String getSignatureAlgorithmName() {
7383
case RSASSA_PKCS1_V1_5_SHA_384:
7484
case RSASSA_PKCS1_V1_5_SHA_512:
7585
return "RSA";
86+
case RSASSA_PSS_SHA_256:
87+
case RSASSA_PSS_SHA_384:
88+
case RSASSA_PSS_SHA_512:
89+
return "RSASSA-PSS";
7690
default:
7791
return null;
7892
}
7993
}
8094

8195
@Override
8296
public ISignatureMechanismParams getSignatureMechanismParameters() {
83-
return null;
97+
switch (signingAlgorithmSpec)
98+
{
99+
case RSASSA_PSS_SHA_256:
100+
return RSASSAPSSMechanismParams.createForDigestAlgorithm("SHA-256");
101+
case RSASSA_PSS_SHA_384:
102+
return RSASSAPSSMechanismParams.createForDigestAlgorithm("SHA-384");
103+
case RSASSA_PSS_SHA_512:
104+
return RSASSAPSSMechanismParams.createForDigestAlgorithm("SHA-512");
105+
case ECDSA_SHA_256:
106+
case ECDSA_SHA_384:
107+
case ECDSA_SHA_512:
108+
case RSASSA_PKCS1_V1_5_SHA_256:
109+
case RSASSA_PKCS1_V1_5_SHA_384:
110+
case RSASSA_PKCS1_V1_5_SHA_512:
111+
default:
112+
return null;
113+
}
84114
}
85115

86116
@Override

aws-kms/src/test/java/com/itextpdf/signingexamples/aws/kms/TestSignSimple.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ void testSignSimpleRsa() throws IOException, GeneralSecurityException {
4949
PdfSigner pdfSigner = new PdfSigner(pdfReader, result, new StampingProperties().useAppendMode());
5050

5151
IExternalDigest externalDigest = new BouncyCastleDigest();
52-
pdfSigner.signDetached(externalDigest , signature, new Certificate[] {certificate}, null, null, null, 0, CryptoStandard.CMS);
52+
pdfSigner.signDetached(externalDigest, signature, new Certificate[] {certificate}, null, null, null, 0, CryptoStandard.CMS);
5353
}
5454
}
5555

@@ -65,22 +65,23 @@ void testSignSimpleEcdsa() throws IOException, GeneralSecurityException {
6565
PdfSigner pdfSigner = new PdfSigner(pdfReader, result, new StampingProperties().useAppendMode());
6666

6767
IExternalDigest externalDigest = new BouncyCastleDigest();
68-
pdfSigner.signDetached(externalDigest , signature, new Certificate[] {certificate}, null, null, null, 0, CryptoStandard.CMS);
68+
pdfSigner.signDetached(externalDigest, signature, new Certificate[] {certificate}, null, null, null, 0, CryptoStandard.CMS);
6969
}
7070
}
7171

7272
@Test
7373
void testSignSimpleRsaSsaPss() throws IOException, GeneralSecurityException {
7474
String keyId = "alias/SigningExamples-RSA_2048";
75-
X509Certificate certificate = CertificateUtils.generateSelfSignedCertificate(keyId, "CN=AWS KMS PDF Signing Test,OU=mkl tests,O=mkl", TestSignSimple::selectRsaSsaPss);
76-
AwsKmsSignatureContainer signatureContainer = new AwsKmsSignatureContainer(certificate, keyId, TestSignSimple::selectRsaSsaPss);
75+
AwsKmsSignature signature = new AwsKmsSignature(keyId, TestSignSimple::selectRsaSsaPss);
76+
Certificate certificate = CertificateUtils.generateSelfSignedCertificate(keyId, "CN=AWS KMS PDF Signing Test,OU=mkl tests,O=mkl");
7777

7878
try ( InputStream resource = getClass().getResourceAsStream("/circles.pdf");
7979
PdfReader pdfReader = new PdfReader(resource);
8080
OutputStream result = new FileOutputStream(new File(RESULT_FOLDER, "circles-aws-kms-signed-simple-RSASSA_PSS.pdf"))) {
8181
PdfSigner pdfSigner = new PdfSigner(pdfReader, result, new StampingProperties().useAppendMode());
8282

83-
pdfSigner.signExternalContainer(signatureContainer, 8192);
83+
IExternalDigest externalDigest = new BouncyCastleDigest();
84+
pdfSigner.signDetached(externalDigest, signature, new Certificate[] {certificate}, null, null, null, 0, CryptoStandard.CMS);
8485
}
8586
}
8687

@@ -91,6 +92,21 @@ static SigningAlgorithmSpec selectRsaSsaPss (List<SigningAlgorithmSpec> specs) {
9192
return null;
9293
}
9394

95+
@Test
96+
void testSignSimpleRsaSsaPssExternal() throws IOException, GeneralSecurityException {
97+
String keyId = "alias/SigningExamples-RSA_2048";
98+
X509Certificate certificate = CertificateUtils.generateSelfSignedCertificate(keyId, "CN=AWS KMS PDF Signing Test,OU=mkl tests,O=mkl", TestSignSimple::selectRsaSsaPss);
99+
AwsKmsSignatureContainer signatureContainer = new AwsKmsSignatureContainer(certificate, keyId, TestSignSimple::selectRsaSsaPss);
100+
101+
try ( InputStream resource = getClass().getResourceAsStream("/circles.pdf");
102+
PdfReader pdfReader = new PdfReader(resource);
103+
OutputStream result = new FileOutputStream(new File(RESULT_FOLDER, "circles-aws-kms-signed-simple-RSASSA_PSS-External.pdf"))) {
104+
PdfSigner pdfSigner = new PdfSigner(pdfReader, result, new StampingProperties().useAppendMode());
105+
106+
pdfSigner.signExternalContainer(signatureContainer, 8192);
107+
}
108+
}
109+
94110
@Test
95111
void testSignSimpleEcdsaExternal() throws IOException, GeneralSecurityException {
96112
String keyId = "alias/SigningExamples-ECC_NIST_P256";

0 commit comments

Comments
 (0)