|
3 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; |
4 | 4 | import com.fasterxml.jackson.databind.SerializationFeature; |
5 | 5 |
|
| 6 | +import org.apache.commons.codec.binary.StringUtils; |
6 | 7 | import org.slf4j.Logger; |
7 | 8 | import org.slf4j.LoggerFactory; |
8 | 9 |
|
|
14 | 15 | import ch.qos.logback.classic.LoggerContext; |
15 | 16 | import ch.swisscom.mid.client.MIDClient; |
16 | 17 | import ch.swisscom.mid.client.MIDClientException; |
17 | | -import ch.swisscom.mid.client.config.ClientConfiguration; |
18 | | -import ch.swisscom.mid.client.config.DefaultConfiguration; |
19 | | -import ch.swisscom.mid.client.config.HttpConfiguration; |
20 | | -import ch.swisscom.mid.client.config.ProxyConfiguration; |
21 | | -import ch.swisscom.mid.client.config.TlsConfiguration; |
22 | | -import ch.swisscom.mid.client.config.UrlsConfiguration; |
| 18 | +import ch.swisscom.mid.client.SignatureValidator; |
| 19 | +import ch.swisscom.mid.client.config.*; |
23 | 20 | import ch.swisscom.mid.client.impl.Loggers; |
24 | 21 | import ch.swisscom.mid.client.impl.MIDClientImpl; |
| 22 | +import ch.swisscom.mid.client.impl.SignatureValidatorImpl; |
25 | 23 | import ch.swisscom.mid.client.model.*; |
26 | 24 |
|
27 | 25 | import static ch.swisscom.mid.client.samples.Utils.prettyPrintTheException; |
| 26 | +import static ch.swisscom.mid.client.utils.Utils.getThisOrNull; |
28 | 27 |
|
29 | 28 | /** |
30 | 29 | * Command line interface for the Mobile ID client. Allows the running of the MID Client from the command line, with most of |
@@ -55,6 +54,7 @@ public class Cli { |
55 | 54 | private static final String PARAM_REQUEST_TIMEOUT = "req-timeout"; |
56 | 55 | private static final String PARAM_REST = "rest"; |
57 | 56 | private static final String PARAM_SOAP = "soap"; |
| 57 | + private static final String PARAM_VALIDATE_SIGNATURE = "validate"; |
58 | 58 | private static final String PARAM_HELP = "help"; |
59 | 59 |
|
60 | 60 | private static final String PARAM_VERBOSE1 = "v"; |
@@ -83,6 +83,7 @@ public class Cli { |
83 | 83 | private static final String receiptDtbd = "Login completed successfully"; |
84 | 84 | private static boolean syncSignature = false; |
85 | 85 | private static boolean sendReceipt = false; |
| 86 | + private static boolean validateSignature = false; |
86 | 87 | private static String interfaceType; |
87 | 88 | private static int verboseLevel; |
88 | 89 |
|
@@ -183,17 +184,48 @@ public static void main(String[] args) { |
183 | 184 | } |
184 | 185 | System.out.println(response.toString()); |
185 | 186 |
|
186 | | - if (sendReceipt && response.getStatus().getStatusCode() == StatusCode.SIGNATURE) { |
187 | | - ReceiptRequest receiptRequest = new ReceiptRequest(); |
188 | | - receiptRequest.setStatusCode(StatusCode.REQUEST_OK); |
189 | | - receiptRequest.getMessageToBeDisplayed().setData(receiptDtbd); |
190 | | - receiptRequest.getRequestExtension().getReceiptProfile().setLanguage(lang); |
191 | | - receiptRequest.setTrafficObserver(prettyPrinterTrafficObserver); |
192 | | - |
193 | | - ReceiptResponse receiptResponse = midClient.requestSyncReceipt(response.getTracking(), receiptRequest); |
194 | | - finalResult = "Receipt response:\n" + jacksonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(receiptResponse); |
195 | | - } else { |
196 | | - finalResult = "Signature response:\n" + jacksonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); |
| 187 | + if (response.getStatus().getStatusCode() == StatusCode.SIGNATURE) { |
| 188 | + boolean signatureIsValid = false; |
| 189 | + if (validateSignature) { |
| 190 | + SignatureValidationConfiguration svConfig = new SignatureValidationConfiguration(); |
| 191 | + svConfig.setTrustStoreFile(properties.getProperty("client.signatureValidation.trustStore.file")); |
| 192 | + svConfig.setTrustStoreType(properties.getProperty("client.signatureValidation.trustStore.type")); |
| 193 | + svConfig.setTrustStorePassword(getThisOrNull(properties.getProperty("client.signatureValidation.trustStore.password"))); |
| 194 | + |
| 195 | + SignatureValidator validator = new SignatureValidatorImpl(svConfig); |
| 196 | + SignatureValidationResult result = |
| 197 | + validator.validateSignature(response.getBase64Signature(), request.getDataToBeSigned().getData(), null); |
| 198 | + if (result.isValidationSuccessful()) { |
| 199 | + signatureIsValid = true; |
| 200 | + System.out.println("Signature is valid!"); |
| 201 | + System.out.println("Mobile ID serial number = " + result.getMobileIdSerialNumber()); |
| 202 | + System.out.println("Signed DTBS = " + result.getSignedDtbs()); |
| 203 | + } else { |
| 204 | + // something failed |
| 205 | + System.out.println("Validation failure reason = " + result.getValidationFailureReason()); |
| 206 | + System.out.println("Signing certificate path validation = " + result.isSignerCertificatePathValid()); |
| 207 | + System.out.println("Signing certificate validation = " + result.isSignerCertificateValid()); |
| 208 | + System.out.println("Signature validation = " + result.isSignatureValid()); |
| 209 | + System.out.println("DTBS matching = " + result.isDtbsMatching()); |
| 210 | + if (result.getValidationException() != null) { |
| 211 | + result.getValidationException().printStackTrace(); |
| 212 | + } |
| 213 | + } |
| 214 | + } |
| 215 | + if (sendReceipt) { |
| 216 | + if (!validateSignature || signatureIsValid) { |
| 217 | + ReceiptRequest receiptRequest = new ReceiptRequest(); |
| 218 | + receiptRequest.setStatusCode(StatusCode.REQUEST_OK); |
| 219 | + receiptRequest.getMessageToBeDisplayed().setData(receiptDtbd); |
| 220 | + receiptRequest.getRequestExtension().getReceiptProfile().setLanguage(lang); |
| 221 | + receiptRequest.setTrafficObserver(prettyPrinterTrafficObserver); |
| 222 | + |
| 223 | + ReceiptResponse receiptResponse = midClient.requestSyncReceipt(response.getTracking(), receiptRequest); |
| 224 | + finalResult = "Receipt response:\n" + jacksonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(receiptResponse); |
| 225 | + } else { |
| 226 | + System.out.println("Signature was NOT valid so sending receipt was skipped"); |
| 227 | + } |
| 228 | + } |
197 | 229 | } |
198 | 230 | } |
199 | 231 | } catch (Exception e) { |
@@ -318,6 +350,10 @@ private static void parseArguments(String[] args) { |
318 | 350 | sendReceipt = true; |
319 | 351 | break; |
320 | 352 | } |
| 353 | + case PARAM_VALIDATE_SIGNATURE: { |
| 354 | + validateSignature = true; |
| 355 | + break; |
| 356 | + } |
321 | 357 | case PARAM_MSISDN: { |
322 | 358 | if (argValue == null) { |
323 | 359 | if (argIndex + 1 < args.length) { |
@@ -410,7 +446,8 @@ private static void runInit() { |
410 | 446 | String[][] configPairs = new String[][]{ |
411 | 447 | new String[]{"/cli-files/config-sample.properties", "config.properties"}, |
412 | 448 | new String[]{"/cli-files/keystore.jks", "keystore.jks"}, |
413 | | - new String[]{"/cli-files/truststore.jks", "truststore.jks"} |
| 449 | + new String[]{"/cli-files/truststore.jks", "truststore.jks"}, |
| 450 | + new String[]{"/cli-files/signature-validation-truststore.jks", "signature-validation-truststore.jks"} |
414 | 451 | }; |
415 | 452 | for (String[] configPair : configPairs) { |
416 | 453 | String inputFile = configPair[0]; |
|
0 commit comments