From 8e28bc9f25e3c22b0b7f31641b113ca5fbd5acf6 Mon Sep 17 00:00:00 2001 From: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> Date: Fri, 14 Nov 2025 15:50:49 +0530 Subject: [PATCH] Extracted public key data in getPublicKey API [MOSIP-22993] Signed-off-by: GOKULRAJ136 <110164849+GOKULRAJ136@users.noreply.github.com> --- .../impl/SyncConfigDetailsServiceImpl.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/admin/kernel-syncdata-service/src/main/java/io/mosip/kernel/syncdata/service/impl/SyncConfigDetailsServiceImpl.java b/admin/kernel-syncdata-service/src/main/java/io/mosip/kernel/syncdata/service/impl/SyncConfigDetailsServiceImpl.java index a09904a156..8f2632b76c 100644 --- a/admin/kernel-syncdata-service/src/main/java/io/mosip/kernel/syncdata/service/impl/SyncConfigDetailsServiceImpl.java +++ b/admin/kernel-syncdata-service/src/main/java/io/mosip/kernel/syncdata/service/impl/SyncConfigDetailsServiceImpl.java @@ -1,6 +1,6 @@ package io.mosip.kernel.syncdata.service.impl; -import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.kernel.clientcrypto.dto.TpmCryptoRequestDto; import io.mosip.kernel.clientcrypto.dto.TpmCryptoResponseDto; @@ -9,6 +9,7 @@ import io.mosip.kernel.core.exception.ServiceError; import io.mosip.kernel.core.http.ResponseWrapper; import io.mosip.kernel.core.util.CryptoUtil; +import io.mosip.kernel.core.util.DateUtils2; import io.mosip.kernel.core.util.HMACUtils2; import io.mosip.kernel.syncdata.constant.MasterDataErrorCode; import io.mosip.kernel.syncdata.constant.SyncConfigDetailsErrorCode; @@ -39,9 +40,13 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.io.IOException; +import java.io.ByteArrayInputStream; import java.io.StringReader; import java.nio.charset.StandardCharsets; +import java.security.PublicKey; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.time.OffsetDateTime; import java.util.*; import java.util.Map.Entry; @@ -62,6 +67,8 @@ public class SyncConfigDetailsServiceImpl implements SyncConfigDetailsService { private static final Logger LOGGER = LoggerFactory.getLogger(SyncConfigDetailsServiceImpl.class); private static final String SLASH = "/"; + private static final String BEGIN_KEY = "-----BEGIN PUBLIC KEY-----"; + private static final String END_KEY = "-----END PUBLIC KEY-----"; @Autowired private RestTemplate restTemplate; @@ -236,14 +243,31 @@ public PublicKeyResponse getPublicKey(String applicationId, String timeS } try { - publicKeyResponseMapped = objectMapper.readValue(publicKeyResponseEntity.getBody(), - new TypeReference>>() { - }); - - publicKeyResponseMapped.getResponse().setProfile(environment.getActiveProfiles()[0]); - LOGGER.debug("Public key fetched successfully for applicationId: {}", applicationId); - return publicKeyResponseMapped.getResponse(); - } catch (IOException | NullPointerException e) { + JsonNode root = objectMapper.readTree(publicKeyResponseEntity.getBody()); + String certificatePem = root.path("response").path("certificate").asText(); + String issuedAt = root.path("response").path("issuedAt").asText(); + String expiryAt = root.path("response").path("expiryAt").asText(); + + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + ByteArrayInputStream certStream = new ByteArrayInputStream(certificatePem.getBytes(StandardCharsets.UTF_8)); + X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(certStream); + PublicKey publicKey = certificate.getPublicKey(); + + String publicKeyPEM = convertToPEM(publicKey); + + OffsetDateTime issued = OffsetDateTime.parse(issuedAt); + OffsetDateTime expiry = OffsetDateTime.parse(expiryAt); + + PublicKeyResponse response = new PublicKeyResponse<>(); + response.setPublicKey(publicKeyPEM); + response.setLastSyncTime(DateUtils2.getUTCCurrentDateTimeString()); + response.setIssuedAt(issued.toLocalDateTime()); + response.setExpiryAt(expiry.toLocalDateTime()); + response.setProfile(environment.getActiveProfiles()[0]); + + return response; + + } catch (Exception e) { LOGGER.error("Failed to parse public key response: {}", e.getMessage()); throw new SyncDataServiceException(SyncConfigDetailsErrorCode.SYNC_IO_EXCEPTION.getErrorCode(), SyncConfigDetailsErrorCode.SYNC_IO_EXCEPTION.getErrorMessage(), e); @@ -345,4 +369,17 @@ private String getEncryptedData(String data, Machine machine) { SyncConfigDetailsErrorCode.SYNC_SERIALIZATION_ERROR.getErrorMessage()); } } + + private String convertToPEM(PublicKey publicKey) { + String encoded = CryptoUtil.encodeBase64String(publicKey.getEncoded()); + StringBuilder pemBuilder = new StringBuilder(); + pemBuilder.append(BEGIN_KEY).append("\n"); + for (int i = 0; i < encoded.length(); i += 64) { + int endIndex = Math.min(i + 64, encoded.length()); + pemBuilder.append(encoded, i, endIndex).append("\n"); + } + pemBuilder.append(END_KEY); + return pemBuilder.toString(); + } + } \ No newline at end of file