Skip to content

Commit cbb21e3

Browse files
committed
use PAdESService for signing toBeSigned 1.3.0
1 parent 8e8d025 commit cbb21e3

File tree

9 files changed

+106
-63
lines changed

9 files changed

+106
-63
lines changed

src/main/java/de/governikus/datasign/cookbook/cades/SealDocumentExample.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
import de.governikus.datasign.cookbook.AbstractExample;
44
import de.governikus.datasign.cookbook.types.*;
5+
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
56
import de.governikus.datasign.cookbook.types.request.DocumentToBeSigned;
67
import de.governikus.datasign.cookbook.types.request.SealDocumentTransactionRequest;
7-
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
88
import de.governikus.datasign.cookbook.types.response.AvailableSeals;
99
import de.governikus.datasign.cookbook.types.response.DocumentSealTransaction;
1010
import de.governikus.datasign.cookbook.types.response.UploadedDocument;
11+
import de.governikus.datasign.cookbook.util.DSSFactory;
12+
import eu.europa.esig.dss.model.InMemoryDocument;
1113

1214
import java.io.FileInputStream;
1315
import java.util.List;
@@ -69,6 +71,14 @@ public void runExample() throws Exception {
6971
var pkcs7SignatureBytes = retrieveBytes(GET(pkcs7Signatures.href().toString())
7072
.header("Authorization", accessToken.toAuthorizationHeader()));
7173

74+
// check if the signature is valid
75+
var report = DSSFactory.signedDocumentValidator(new InMemoryDocument(new FileInputStream("sample.docx")),
76+
new InMemoryDocument(pkcs7SignatureBytes)).validateDocument().getSimpleReport();
77+
var indication = report.getIndication(report.getFirstSignatureId()).name();
78+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
79+
System.err.println("signature is not valid");
80+
}
81+
7282
writeToDisk(pkcs7SignatureBytes, "sample_sealed.docx.p7s");
7383
System.out.println("sample.pdf is now sealed and the signature is written to disk as sample_sealed.docx.p7s");
7484
}

src/main/java/de/governikus/datasign/cookbook/cades/SealToBeSignedExample.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
import de.governikus.datasign.cookbook.types.SignatureLevel;
77
import de.governikus.datasign.cookbook.types.SignatureNiveau;
88
import de.governikus.datasign.cookbook.types.request.SealToBeSignedTransactionRequest;
9-
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
109
import de.governikus.datasign.cookbook.types.request.ToBeSigned;
1110
import de.governikus.datasign.cookbook.types.request.ToBeSignedSignatureParameter;
1211
import de.governikus.datasign.cookbook.types.response.AvailableSeals;
1312
import de.governikus.datasign.cookbook.types.response.Certificate;
1413
import de.governikus.datasign.cookbook.types.response.ToBeSignedSealTransaction;
1514
import de.governikus.datasign.cookbook.util.DSSFactory;
1615
import eu.europa.esig.dss.cades.CAdESSignatureParameters;
17-
import eu.europa.esig.dss.enumerations.*;
16+
import eu.europa.esig.dss.enumerations.DigestAlgorithm;
17+
import eu.europa.esig.dss.enumerations.EncryptionAlgorithm;
18+
import eu.europa.esig.dss.enumerations.SignatureAlgorithm;
19+
import eu.europa.esig.dss.enumerations.SignaturePackaging;
1820
import eu.europa.esig.dss.model.InMemoryDocument;
1921
import eu.europa.esig.dss.model.SignatureValue;
2022
import eu.europa.esig.dss.model.x509.CertificateToken;
@@ -95,10 +97,11 @@ public void runExample() throws Exception {
9597
new SignatureValue(signatureAlgorithm(provider), signatureValueWithTimestamp.signatureValue()));
9698
var detachedSignature = DSSUtils.toCMSSignedData(signedDocument).getEncoded();
9799

98-
try {
99-
DSSFactory.signedDocumentValidator(unsignedDocument, signedDocument).validateDocument();
100-
} catch (Exception e) {
101-
System.err.println("signatureValue is not coherent with document digest");
100+
// check if the signature is valid
101+
var report = DSSFactory.signedDocumentValidator(unsignedDocument, signedDocument).validateDocument().getSimpleReport();
102+
var indication = report.getIndication(report.getFirstSignatureId()).name();
103+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
104+
System.err.println("signature is not valid");
102105
}
103106

104107
writeToDisk(detachedSignature, "sample_sealed.docx.p7s");

src/main/java/de/governikus/datasign/cookbook/cades/SignDocumentExample.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22

33
import de.governikus.datasign.cookbook.AbstractExample;
44
import de.governikus.datasign.cookbook.types.*;
5-
import de.governikus.datasign.cookbook.types.request.*;
5+
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
6+
import de.governikus.datasign.cookbook.types.request.DocumentToBeSigned;
7+
import de.governikus.datasign.cookbook.types.request.SignatureDocumentTransactionRequest;
8+
import de.governikus.datasign.cookbook.types.request.TanAuthorizeRequest;
69
import de.governikus.datasign.cookbook.types.response.DocumentSignTransaction;
710
import de.governikus.datasign.cookbook.types.response.UploadedDocument;
811
import de.governikus.datasign.cookbook.types.response.UserState;
12+
import de.governikus.datasign.cookbook.util.DSSFactory;
13+
import eu.europa.esig.dss.model.InMemoryDocument;
914

1015
import java.io.FileInputStream;
1116
import java.net.URLEncoder;
@@ -108,11 +113,18 @@ public void runExample() throws Exception {
108113
r.documentId().equals(uploadedDocument.documentId())).findFirst().orElseThrow();
109114

110115
// GET /documents/{documentId}/signatures/{signatureId}
111-
var documentRevisionBytes = retrieveBytes(GET(result.href().toString())
116+
var pkcs7SignatureBytes = retrieveBytes(GET(result.href().toString())
112117
.header("Authorization", accessToken.toAuthorizationHeader()));
113118

119+
// check if the signature is valid
120+
var report = DSSFactory.signedDocumentValidator(new InMemoryDocument(new FileInputStream("sample.docx")),
121+
new InMemoryDocument(pkcs7SignatureBytes)).validateDocument().getSimpleReport();
122+
var indication = report.getIndication(report.getFirstSignatureId()).name();
123+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
124+
System.err.println("signature is not valid");
125+
}
114126

115-
writeToDisk(documentRevisionBytes, "sample_signed.pdf.p7s");
127+
writeToDisk(pkcs7SignatureBytes, "sample_signed.pdf.p7s");
116128
System.out.println("sample.pdf is now signed and the signature is written to disk as sample_signed.pdf.p7s");
117129
}
118130

src/main/java/de/governikus/datasign/cookbook/cades/SignToBeSignedExample.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import de.governikus.datasign.cookbook.types.Provider;
66
import de.governikus.datasign.cookbook.types.SignatureLevel;
77
import de.governikus.datasign.cookbook.types.SignatureNiveau;
8-
import de.governikus.datasign.cookbook.types.request.*;
8+
import de.governikus.datasign.cookbook.types.request.SignatureToBeSignedTransactionRequest;
9+
import de.governikus.datasign.cookbook.types.request.TanAuthorizeRequest;
10+
import de.governikus.datasign.cookbook.types.request.ToBeSigned;
11+
import de.governikus.datasign.cookbook.types.request.ToBeSignedSignatureParameter;
912
import de.governikus.datasign.cookbook.types.response.Certificate;
1013
import de.governikus.datasign.cookbook.types.response.ToBeSignedSignTransaction;
1114
import de.governikus.datasign.cookbook.types.response.UserState;
@@ -137,10 +140,11 @@ public void runExample() throws Exception {
137140
new SignatureValue(signatureAlgorithm(provider), signatureValueWithTimestamp.signatureValue()));
138141
var detachedSignature = DSSUtils.toCMSSignedData(signedDocument).getEncoded();
139142

140-
try {
141-
DSSFactory.signedDocumentValidator(unsignedDocument, signedDocument).validateDocument();
142-
} catch (Exception e) {
143-
System.err.println("signatureValue is not coherent with document digest");
143+
// check if the signature is valid
144+
var report = DSSFactory.signedDocumentValidator(unsignedDocument, signedDocument).validateDocument().getSimpleReport();
145+
var indication = report.getIndication(report.getFirstSignatureId()).name();
146+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
147+
System.err.println("signature is not valid");
144148
}
145149

146150
writeToDisk(detachedSignature, "sample_signed.docx.p7s");

src/main/java/de/governikus/datasign/cookbook/pades/SealDocumentExample.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@
22

33
import de.governikus.datasign.cookbook.AbstractExample;
44
import de.governikus.datasign.cookbook.types.*;
5-
import de.governikus.datasign.cookbook.types.request.*;
6-
import de.governikus.datasign.cookbook.types.response.*;
5+
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
6+
import de.governikus.datasign.cookbook.types.request.DocumentToBeSigned;
7+
import de.governikus.datasign.cookbook.types.request.SealDocumentTransactionRequest;
8+
import de.governikus.datasign.cookbook.types.request.VisualParameter;
9+
import de.governikus.datasign.cookbook.types.response.AvailableSeals;
10+
import de.governikus.datasign.cookbook.types.response.DocumentSealTransaction;
11+
import de.governikus.datasign.cookbook.types.response.UploadedDocument;
12+
import de.governikus.datasign.cookbook.util.DSSFactory;
13+
import eu.europa.esig.dss.model.InMemoryDocument;
714

815
import java.io.FileInputStream;
916
import java.util.List;
@@ -67,8 +74,15 @@ public void runExample() throws Exception {
6774

6875
// GET /documents/{documentId}/revisions/{revisionId}
6976
var documentRevisionBytes = retrieveBytes(GET(documentRevision.href().toString())
70-
.header("Authorization", accessToken.toAuthorizationHeader())
71-
.header("Accept", "application/octet-stream"));
77+
.header("Authorization", accessToken.toAuthorizationHeader()));
78+
79+
// check if the signature is valid
80+
var report = DSSFactory.signedDocumentValidator(new InMemoryDocument(new FileInputStream("sample.pdf")),
81+
new InMemoryDocument(documentRevisionBytes)).validateDocument().getSimpleReport();
82+
var indication = report.getIndication(report.getFirstSignatureId()).name();
83+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
84+
System.err.println("signature is not valid");
85+
}
7286

7387
writeToDisk(documentRevisionBytes, "sample_sealed.pdf");
7488
System.out.println("sample.pdf is now sealed and written to disk as sample_sealed.pdf");

src/main/java/de/governikus/datasign/cookbook/pades/SealToBeSignedExample.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import de.governikus.datasign.cookbook.types.Provider;
66
import de.governikus.datasign.cookbook.types.SignatureLevel;
77
import de.governikus.datasign.cookbook.types.SignatureNiveau;
8-
import de.governikus.datasign.cookbook.types.request.DocumentSignatureParameter;
98
import de.governikus.datasign.cookbook.types.request.SealToBeSignedTransactionRequest;
109
import de.governikus.datasign.cookbook.types.request.ToBeSigned;
1110
import de.governikus.datasign.cookbook.types.request.ToBeSignedSignatureParameter;
@@ -24,7 +23,6 @@
2423
import java.net.URLEncoder;
2524
import java.nio.charset.StandardCharsets;
2625
import java.util.List;
27-
import java.util.Scanner;
2826
import java.util.UUID;
2927

3028
import static de.governikus.datasign.cookbook.util.AccessTokenUtil.retrieveAccessToken;
@@ -69,12 +67,8 @@ public void runExample() throws Exception {
6967
// calculate the DTBS from the unsigned document
7068
var unsignedDocument = new InMemoryDocument(new FileInputStream("sample.pdf"));
7169

72-
var padesWithExternalCMSService = DSSFactory.padesWithExternalCMSService();
7370
var signatureParameter = signatureParameter(provider, certificate.certificate());
74-
var documentDigest = padesWithExternalCMSService.getMessageDigest(unsignedDocument, signatureParameter);
75-
76-
var externalCMSService = DSSFactory.externalCMSService();
77-
var dtbs = externalCMSService.getDataToSign(documentDigest, signatureParameter);
71+
var dtbs = DSSFactory.pAdESService().getDataToSign(unsignedDocument, signatureParameter);
7872

7973
// POST /seal/to-be-signed/transactions
8074
var toBeSignedId = UUID.randomUUID();
@@ -92,15 +86,17 @@ public void runExample() throws Exception {
9286
.filter(v -> v.id().equals(toBeSignedId)).findFirst().orElseThrow();
9387

9488
// use the signature value to incorporate a signature into the unsigned document
95-
var cmsSignedData = DSSFactory.externalCMSService(signatureValueWithTimestamp.timestamp())
96-
.signMessageDigest(documentDigest, signatureParameter, new SignatureValue(signatureParameter.getSignatureAlgorithm(), signatureValueWithTimestamp.signatureValue()));
89+
var signatureValue = new SignatureValue(signatureParameter.getSignatureAlgorithm(), signatureValueWithTimestamp.signatureValue());
90+
var signedDocument = DSSFactory.pAdESService(signatureValueWithTimestamp.timestamp())
91+
.signDocument(unsignedDocument, signatureParameter, signatureValue);
9792

98-
if (!padesWithExternalCMSService.isValidCMSSignedData(documentDigest, cmsSignedData)) {
93+
if (!DSSFactory.pAdESService().isValidSignatureValue(dtbs, signatureValue, new CertificateToken(toX509Certificate(certificate.certificate())))) {
9994
System.err.println("signatureValue is not coherent with document digest");
10095
return;
10196
}
10297

103-
var signedDocument = padesWithExternalCMSService.signDocument(unsignedDocument, signatureParameter, cmsSignedData);
98+
// extend signature to LT-Level
99+
signedDocument = DSSFactory.pAdESExtensionService().incorporateValidationData(signedDocument, null, true);
104100

105101
writeToDisk(signedDocument, "sample_sealed.pdf");
106102
System.out.println("sample.pdf is now sealed and written to disk as sample_sealed.pdf");
@@ -120,9 +116,4 @@ private static PAdESSignatureParameters signatureParameter(Provider provider, by
120116
return pAdESSignatureParameters;
121117
}
122118

123-
private String prompt(String toDisplay) {
124-
System.out.println(toDisplay);
125-
return new Scanner(System.in).nextLine().trim();
126-
}
127-
128119
}

src/main/java/de/governikus/datasign/cookbook/pades/SignDocumentExample.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
import de.governikus.datasign.cookbook.AbstractExample;
44
import de.governikus.datasign.cookbook.types.*;
55
import de.governikus.datasign.cookbook.types.request.*;
6-
import de.governikus.datasign.cookbook.types.response.*;
6+
import de.governikus.datasign.cookbook.types.response.DocumentSignTransaction;
7+
import de.governikus.datasign.cookbook.types.response.UploadedDocument;
8+
import de.governikus.datasign.cookbook.types.response.UserState;
9+
import de.governikus.datasign.cookbook.util.DSSFactory;
10+
import eu.europa.esig.dss.model.InMemoryDocument;
711

812
import java.io.FileInputStream;
913
import java.net.URLEncoder;
@@ -110,9 +114,15 @@ public void runExample() throws Exception {
110114

111115
// GET /documents/{documentId}/revisions/{revisionId}
112116
var documentRevisionBytes = retrieveBytes(GET(documentRevision.href().toString())
113-
.header("Authorization", accessToken.toAuthorizationHeader())
114-
.header("Accept", "application/octet-stream"));
115-
117+
.header("Authorization", accessToken.toAuthorizationHeader()));
118+
119+
// check if the signature is valid
120+
var report = DSSFactory.signedDocumentValidator(new InMemoryDocument(new FileInputStream("sample.pdf")),
121+
new InMemoryDocument(documentRevisionBytes)).validateDocument().getSimpleReport();
122+
var indication = report.getIndication(report.getFirstSignatureId()).name();
123+
if (indication.equals("FAILED") || indication.equals("TOTAL_FAILED") || indication.equals("NO_SIGNATURE_FOUND")) {
124+
System.err.println("signature is not valid");
125+
}
116126

117127
writeToDisk(documentRevisionBytes, "sample_signed.pdf");
118128
System.out.println("sample.pdf is now signed and written to disk as sample_signed.pdf");

src/main/java/de/governikus/datasign/cookbook/pades/SignToBeSignedExample.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import de.governikus.datasign.cookbook.types.Provider;
66
import de.governikus.datasign.cookbook.types.SignatureLevel;
77
import de.governikus.datasign.cookbook.types.SignatureNiveau;
8-
import de.governikus.datasign.cookbook.types.request.*;
8+
import de.governikus.datasign.cookbook.types.request.SignatureToBeSignedTransactionRequest;
9+
import de.governikus.datasign.cookbook.types.request.TanAuthorizeRequest;
10+
import de.governikus.datasign.cookbook.types.request.ToBeSigned;
11+
import de.governikus.datasign.cookbook.types.request.ToBeSignedSignatureParameter;
912
import de.governikus.datasign.cookbook.types.response.Certificate;
1013
import de.governikus.datasign.cookbook.types.response.ToBeSignedSignTransaction;
1114
import de.governikus.datasign.cookbook.types.response.UserState;
@@ -69,12 +72,8 @@ public void runExample() throws Exception {
6972
// calculate the DTBS from the unsigned document
7073
var unsignedDocument = new InMemoryDocument(new FileInputStream("sample.pdf"));
7174

72-
var padesWithExternalCMSService = DSSFactory.padesWithExternalCMSService();
7375
var signatureParameter = signatureParameter(provider, certificate.certificate());
74-
var documentDigest = padesWithExternalCMSService.getMessageDigest(unsignedDocument, signatureParameter);
75-
76-
var externalCMSService = DSSFactory.externalCMSService();
77-
var dtbs = externalCMSService.getDataToSign(documentDigest, signatureParameter);
76+
var dtbs = DSSFactory.pAdESService().getDataToSign(unsignedDocument, signatureParameter);
7877

7978
// POST /sign/to-be-signed/transactions
8079
var toBeSignedId = UUID.randomUUID();
@@ -130,15 +129,19 @@ public void runExample() throws Exception {
130129
.filter(v -> v.id().equals(toBeSignedId)).findFirst().orElseThrow();
131130

132131
// use the signature value to incorporate a signature into the unsigned document
133-
var cmsSignedData = DSSFactory.externalCMSService(signatureValueWithTimestamp.timestamp())
134-
.signMessageDigest(documentDigest, signatureParameter, new SignatureValue(signatureParameter.getSignatureAlgorithm(), signatureValueWithTimestamp.signatureValue()));
132+
var signatureValue = new SignatureValue(signatureParameter.getSignatureAlgorithm(), signatureValueWithTimestamp.signatureValue());
133+
var signedDocument = DSSFactory.pAdESService(signatureValueWithTimestamp.timestamp())
134+
.signDocument(unsignedDocument, signatureParameter, signatureValue);
135135

136-
if (!padesWithExternalCMSService.isValidCMSSignedData(documentDigest, cmsSignedData)) {
136+
if (!DSSFactory.pAdESService().isValidSignatureValue(dtbs, signatureValue, new CertificateToken(toX509Certificate(certificate.certificate())))) {
137137
System.err.println("signatureValue is not coherent with document digest");
138138
return;
139139
}
140140

141-
var signedDocument = padesWithExternalCMSService.signDocument(unsignedDocument, signatureParameter, cmsSignedData);
141+
// extend signature to LT-Level
142+
signedDocument = DSSFactory.pAdESExtensionService().incorporateValidationData(signedDocument, null, true);
143+
144+
DSSFactory.signedDocumentValidator(unsignedDocument, signedDocument).validateDocument();
142145

143146
writeToDisk(signedDocument, "sample_signed.pdf");
144147
System.out.println("sample.pdf is now signed and written to disk as sample_signed.pdf");

0 commit comments

Comments
 (0)