diff --git a/certify-service/pom.xml b/certify-service/pom.xml
index 0a9dc52e1..c52b7b154 100644
--- a/certify-service/pom.xml
+++ b/certify-service/pom.xml
@@ -26,6 +26,19 @@
danubetech-maven-public
https://repo.danubetech.com/repository/maven-public/
+
+ ossrh-inji
+ CentralRepositoryInji
+ https://central.sonatype.com/repository/maven-snapshots
+
+ true
+
+
+
+ google
+ GoogleMaven
+ https://maven.google.com
+
@@ -236,6 +249,17 @@
kernel-biometrics-api
1.3.0
+
+ io.inji.verify
+ verify-service
+ 0.18.2-SNAPSHOT
+
+
+ io.inji
+ pixelpass-jar
+
+
+
diff --git a/certify-service/src/main/java/io/mosip/certify/CertifyServiceApplication.java b/certify-service/src/main/java/io/mosip/certify/CertifyServiceApplication.java
index 5462c0821..fb2144b95 100644
--- a/certify-service/src/main/java/io/mosip/certify/CertifyServiceApplication.java
+++ b/certify-service/src/main/java/io/mosip/certify/CertifyServiceApplication.java
@@ -8,18 +8,20 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@EnableCaching
-@SpringBootApplication(scanBasePackages = "io.mosip.certify,"+
+@Import(io.inji.verify.config.AppConfig.class)
+@SpringBootApplication(scanBasePackages = "io.mosip.certify," +
"io.mosip.kernel.crypto," +
"io.mosip.kernel.keymanager.hsm," +
"io.mosip.kernel.cryptomanager," +
- "io.mosip.kernel.keymanagerservice.validator,"+
- "io.mosip.kernel.keymanager,"+
+ "io.mosip.kernel.keymanagerservice.validator," +
+ "io.mosip.kernel.keymanager," +
"io.mosip.kernel.cryptomanager.util," +
"io.mosip.kernel.keymanagerservice.helper," +
"io.mosip.kernel.keymanagerservice.repository," +
@@ -30,11 +32,14 @@
"io.mosip.kernel.signature.util," +
"io.mosip.kernel.signature.builder," +
"io.mosip.kernel.signature.*," +
- "io.mosip.kernel.pdfgenerator.*,"+
+ "io.mosip.kernel.pdfgenerator.*," +
"io.mosip.kernel.partnercertservice.service," +
- "io.mosip.kernel.keymanagerservice.repository,"+
- "io.mosip.kernel.keymanagerservice.entity,"+
+ "io.mosip.kernel.keymanagerservice.repository," +
+ "io.mosip.kernel.keymanagerservice.entity," +
"io.mosip.kernel.partnercertservice.helper," +
+ "io.inji.verify.services," +
+ "io.inji.verify.key.impl," +
+ "io.inji.verify.repository," +
"${mosip.certify.integration.scan-base-package}")
public class CertifyServiceApplication {
public static void main(String[] args) {
diff --git a/certify-service/src/main/java/io/mosip/certify/config/AppConfig.java b/certify-service/src/main/java/io/mosip/certify/config/AppConfig.java
index 7125b394d..50aa2c498 100644
--- a/certify-service/src/main/java/io/mosip/certify/config/AppConfig.java
+++ b/certify-service/src/main/java/io/mosip/certify/config/AppConfig.java
@@ -34,8 +34,16 @@
import lombok.extern.slf4j.Slf4j;
@Configuration
-@EnableJpaRepositories(basePackages = {"io.mosip.kernel.keymanagerservice.repository", "io.mosip.certify.repository"})
-@EntityScan(basePackages = {"io.mosip.kernel.keymanagerservice.entity, io.mosip.certify.entity"})
+@EnableJpaRepositories(basePackages = {
+ "io.mosip.kernel.keymanagerservice.repository",
+ "io.mosip.certify.repository",
+ "io.inji.verify.repository"
+})
+@EntityScan(basePackages = {
+ "io.mosip.kernel.keymanagerservice.entity",
+ "io.mosip.certify.entity",
+ "io.inji.verify.models"
+})
@Slf4j
public class AppConfig implements ApplicationRunner {
@@ -79,10 +87,11 @@ public RestTemplate restTemplate() {
return new RestTemplate(requestFactory);
}
- @Bean
+ @Bean("certifyPixelPass")
public PixelPass pixelPass() {
return new PixelPass();
}
+
@Override
public void run(ApplicationArguments args) throws Exception {
initKeys();
diff --git a/certify-service/src/main/java/io/mosip/certify/config/CertifyContextPathOverride.java b/certify-service/src/main/java/io/mosip/certify/config/CertifyContextPathOverride.java
new file mode 100644
index 000000000..0b9897363
--- /dev/null
+++ b/certify-service/src/main/java/io/mosip/certify/config/CertifyContextPathOverride.java
@@ -0,0 +1,19 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+package io.mosip.certify.config;
+import org.springframework.boot.web.server.WebServerFactoryCustomizer;
+import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class CertifyContextPathOverride {
+
+ @Bean
+ public WebServerFactoryCustomizer webServerFactoryCustomizer() {
+ return factory -> factory.setContextPath("");
+ }
+}
diff --git a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java
index b4c88c82d..9e9ddde5e 100644
--- a/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java
+++ b/certify-service/src/main/java/io/mosip/certify/services/CertifyIssuanceServiceImpl.java
@@ -39,6 +39,7 @@
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
@@ -88,6 +89,7 @@ public class CertifyIssuanceServiceImpl implements VCIssuanceService {
private AuditPlugin auditWrapper;
@Autowired
+ @Qualifier("certifyPixelPass")
private PixelPass pixelPass;
private Map didDocument;
diff --git a/certify-service/src/main/java/io/mosip/certify/services/IarPresentationService.java b/certify-service/src/main/java/io/mosip/certify/services/IarPresentationService.java
index ca5faccf5..6cc905fad 100644
--- a/certify-service/src/main/java/io/mosip/certify/services/IarPresentationService.java
+++ b/certify-service/src/main/java/io/mosip/certify/services/IarPresentationService.java
@@ -6,6 +6,11 @@
package io.mosip.certify.services;
import com.fasterxml.jackson.databind.JsonNode;
+import io.inji.verify.dto.result.CredentialResultsDto;
+import io.inji.verify.dto.result.VPVerificationResultDto;
+import io.inji.verify.dto.result.VerificationRequestDto;
+import io.inji.verify.services.VerifiablePresentationRequestService;
+import io.inji.verify.services.VerifiablePresentationSubmissionService;
import io.mosip.certify.core.constants.ErrorConstants;
import io.mosip.certify.core.constants.IarStatus;
import io.mosip.certify.core.dto.IarAuthorizationRequest;
@@ -17,15 +22,9 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
-import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
@@ -34,8 +33,7 @@
import java.util.*;
/**
- * Service for handling VP Presentation processing
- * Handles VP submission to verifier and verification result processing
+ * Service for handling VP Presentation processing using the embedded inji-verify library.
*/
@Slf4j
@Service
@@ -43,12 +41,11 @@ public class IarPresentationService {
private final IarSessionRepository iarSessionRepository;
- private final RestTemplate restTemplate;
-
private final ObjectMapper objectMapper;
- @Value("${mosip.certify.verify.service.vp-result-endpoint:}")
- private String verifyServiceVpResultEndpoint;
+ private final VerifiablePresentationSubmissionService vpSubmissionService;
+
+ private final VerifiablePresentationRequestService vpRequestService;
@Value("${mosip.certify.iar.authorization-code.length:24}")
private int authorizationCodeLength;
@@ -58,11 +55,13 @@ public class IarPresentationService {
@Autowired
public IarPresentationService(IarSessionRepository iarSessionRepository,
- RestTemplate restTemplate,
- ObjectMapper objectMapper) {
+ ObjectMapper objectMapper,
+ VerifiablePresentationSubmissionService vpSubmissionService,
+ VerifiablePresentationRequestService vpRequestService) {
this.iarSessionRepository = iarSessionRepository;
- this.restTemplate = restTemplate;
this.objectMapper = objectMapper;
+ this.vpSubmissionService = vpSubmissionService;
+ this.vpRequestService = vpRequestService;
}
/**
@@ -79,9 +78,9 @@ public IarAuthorizationResponse processVpPresentation(IarAuthorizationRequest pr
}
IarSession session = sessionOpt.get();
- submitVpToVerifier(session.getResponseUri(),
+ submitVpToVerifier(session.getResponseUri(),
presentationRequest.getOpenid4vpPresentation(),
- session.getRequestId(),
+ session.getRequestId(),
session.getTransactionId());
VpVerificationResponse verificationResponse = getVpVerificationResult(session.getTransactionId());
@@ -99,12 +98,12 @@ public IarAuthorizationResponse processVpPresentation(IarAuthorizationRequest pr
String authorizationCode = generateAndStoreAuthorizationCode(session);
response.setStatus(IarStatus.OK);
response.setCode(authorizationCode);
- log.info("Authorization code generated after successful VP cryptographic verification for auth_session: {}, request_id: {}",
+ log.info("Authorization code generated after successful VP cryptographic verification for auth_session: {}, request_id: {}",
presentationRequest.getAuthSession(), session.getRequestId());
} else {
response.setStatus(IarStatus.ERROR);
- log.warn("Authorization denied - VP cryptographic verification failed for auth_session: {}, request_id: {}, error: {}",
- presentationRequest.getAuthSession(), session.getRequestId(),
+ log.warn("Authorization denied - VP cryptographic verification failed for auth_session: {}, request_id: {}, error: {}",
+ presentationRequest.getAuthSession(), session.getRequestId(),
verificationResponse.getError());
}
@@ -122,29 +121,28 @@ public IarAuthorizationResponse processVpPresentation(IarAuthorizationRequest pr
}
/**
- * Submit VP presentation to verifier service
+ * Submit VP presentation to the embedded inji-verify library.
+ * responseUri is retained in the signature for session compatibility but is not used for HTTP.
*/
private void submitVpToVerifier(String responseUri, String vpPresentationJson, String requestId, String transactionId) throws CertifyException {
- log.info("Submitting VP to Verify at {} with state(requestId)={}, transactionId={}",
- responseUri, requestId, transactionId);
-
+ log.info("Submitting VP to vpSubmissionService with state(requestId)={}, transactionId={}",
+ requestId, transactionId);
+
try {
Map vpPresentationData = objectMapper.readValue(vpPresentationJson, new TypeReference