Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MOSIP-28970 #305

Merged
merged 1 commit into from
Oct 30, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

import org.biometric.provider.CryptoUtility;
import org.biometric.provider.JwtUtility;
Expand All @@ -28,7 +31,10 @@
import io.mosip.registration.mdm.dto.ErrorInfo;

public abstract class SBIDeviceHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(SBIDeviceHelper.class);
private static final Logger LOGGER = LoggerFactory.getLogger(SBIDeviceHelper.class);

private static Map<String, PrivateKey> privateKeyMap = new ConcurrentHashMap<>();
private static Map<String, Certificate> certificateMap = new ConcurrentHashMap<>();

private String biometricImageType;
private String purpose;
Expand Down Expand Up @@ -209,7 +215,6 @@ protected DeviceInfo getDeviceInfo(String deviceType, String deviceSubType, Digi
String keyStoreFileName = null;
String keyAlias = null;
String keyPwd = null;
FileInputStream inputStream = null;
try {
String purpose = getPurpose ();
ObjectMapper objectMapper = new ObjectMapper();
Expand Down Expand Up @@ -260,59 +265,30 @@ protected DeviceInfo getDeviceInfo(String deviceType, String deviceSubType, Digi
break;
}

if (FileHelper.exists(fileName) && FileHelper.exists(keyStoreFileName))
deviceInfo = objectMapper.readValue(new File(fileName), DeviceInfo.class);
if (deviceInfo != null)
{
File jsonFile = new File(fileName);
File keyStoreFile = new File(keyStoreFileName);
KeyStore keystore = null;
if (keyStoreFile.exists())
{
inputStream = new FileInputStream (keyStoreFile);
keystore = loadKeyStore (inputStream, keyPwd);
}

PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, keyPwd.toCharArray());

/* Get certificate of public key */
java.security.cert.Certificate cert = keystore.getCertificate(keyAlias);

/* Here it prints the public key*/
//LOGGER.Info("Public Key:");
//LOGGER.Info(cert.getPublicKey());

/* Here it prints the private key*/
//LOGGER.Info("\nPrivate Key:");
//LOGGER.Info(key);

deviceInfo = objectMapper.readValue(jsonFile, DeviceInfo.class);
if (deviceInfo != null)
deviceInfo.setDigitalId(getUnsignedDigitalId (digitalId, false));
deviceInfo.setDeviceStatus(getDeviceStatus());
deviceInfo.setPurpose(getPurpose ());
deviceInfo.setCallbackId("http://" + ApplicationPropertyHelper.getPropertyKeyValue(SBIConstant.SERVER_ADDRESS) + ":" + getPort() + "/");
if (!getDeviceStatus().equalsIgnoreCase(SBIConstant.DEVICE_STATUS_NOTREGISTERED))
{
deviceInfo.setDigitalId(getUnsignedDigitalId (digitalId, false));
deviceInfo.setDeviceStatus(getDeviceStatus());
deviceInfo.setPurpose(getPurpose ());
deviceInfo.setCallbackId("http://" + ApplicationPropertyHelper.getPropertyKeyValue(SBIConstant.SERVER_ADDRESS) + ":" + getPort() + "/");
if (!getDeviceStatus().equalsIgnoreCase(SBIConstant.DEVICE_STATUS_NOTREGISTERED))
{
deviceInfo.setDigitalId(getSignedDigitalId (deviceInfo.getDigitalId(), key, cert));
}
else
{
deviceInfo.setDeviceId("");
deviceInfo.setDeviceCode("");
deviceInfo.setPurpose("");
}
deviceInfo.setDigitalId(getSignedDigitalId (deviceInfo.getDigitalId(),
getPrivateKey(keyStoreFileName, keyAlias, keyPwd),
getCertificate(keyStoreFileName, keyAlias, keyPwd)));
}
return deviceInfo;
}
else
{
deviceInfo.setDeviceId("");
deviceInfo.setDeviceCode("");
deviceInfo.setPurpose("");
}
}
return deviceInfo;
} catch (Exception ex) {
LOGGER.error("getDeviceInfo :: deviceType::" + deviceType + " :: deviceSubType::" + deviceSubType , ex);
}
finally
{
try { // because close can throw an exception
if (inputStream != null) inputStream.close();
} catch (IOException ignored) {}
}
return null;
}

Expand All @@ -321,7 +297,6 @@ protected DeviceInfoDto getDeviceInfoDto(String deviceType, String deviceSubType
String keyStoreFileName = null;
String keyAlias = null;
String keyPwd = null;
FileInputStream inputStream = null;

try {
ObjectMapper objectMapper = new ObjectMapper();
Expand Down Expand Up @@ -367,60 +342,36 @@ protected DeviceInfoDto getDeviceInfoDto(String deviceType, String deviceSubType
break;
}

if (FileHelper.exists(keyStoreFileName))
String strDeviceInfo = objectMapper.writeValueAsString(deviceInfo);
switch (getDeviceStatus())
{
String strDeviceInfo = objectMapper.writeValueAsString(deviceInfo);
File keyStoreFile = new File(keyStoreFileName);
KeyStore keystore = null;
if (keyStoreFile.exists())
{
inputStream = new FileInputStream (keyStoreFile);
keystore = loadKeyStore (inputStream, keyPwd);
}

PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, keyPwd.toCharArray());

/* Get certificate of public key */
java.security.cert.Certificate cert = keystore.getCertificate(keyAlias);

/* Here it prints the public key*/
//LOGGER.Info("Public Key:");
//LOGGER.Info(cert.getPublicKey());

/* Here it prints the private key*/
//LOGGER.Info("\nPrivate Key:");
//LOGGER.Info(key);
switch (getDeviceStatus())
{
case SBIConstant.DEVICE_STATUS_NOTREADY:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"), key, (X509Certificate) cert));
deviceInfoDto.setError(new ErrorInfo ("110", SBIJsonInfo.getErrorDescription("en", "110")));
break;
case SBIConstant.DEVICE_STATUS_ISBUSY:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"), key, (X509Certificate) cert));
deviceInfoDto.setError(new ErrorInfo ("111", SBIJsonInfo.getErrorDescription("en", "111")));
break;
case SBIConstant.DEVICE_STATUS_NOTREGISTERED:
deviceInfoDto.setDeviceInfo(getUnsignedDeviceInfo (deviceInfo, true));
deviceInfoDto.setError(new ErrorInfo ("100", SBIJsonInfo.getErrorDescription("en", "100")));
break;
default:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"), key, (X509Certificate) cert));
deviceInfoDto.setError(new ErrorInfo ("0", SBIJsonInfo.getErrorDescription("en", "0")));
break;
}

return deviceInfoDto ;
}
case SBIConstant.DEVICE_STATUS_NOTREADY:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"),
getPrivateKey(keyStoreFileName, keyAlias, keyPwd),
(X509Certificate) getCertificate(keyStoreFileName, keyAlias, keyPwd)));
deviceInfoDto.setError(new ErrorInfo ("110", SBIJsonInfo.getErrorDescription("en", "110")));
break;
case SBIConstant.DEVICE_STATUS_ISBUSY:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"),
getPrivateKey(keyStoreFileName, keyAlias, keyPwd),
(X509Certificate) getCertificate(keyStoreFileName, keyAlias, keyPwd)));
deviceInfoDto.setError(new ErrorInfo ("111", SBIJsonInfo.getErrorDescription("en", "111")));
break;
case SBIConstant.DEVICE_STATUS_NOTREGISTERED:
deviceInfoDto.setDeviceInfo(getUnsignedDeviceInfo (deviceInfo, true));
deviceInfoDto.setError(new ErrorInfo ("100", SBIJsonInfo.getErrorDescription("en", "100")));
break;
default:
deviceInfoDto.setDeviceInfo(JwtUtility.getJwt(strDeviceInfo.getBytes("UTF-8"),
getPrivateKey(keyStoreFileName, keyAlias, keyPwd),
(X509Certificate) getCertificate(keyStoreFileName, keyAlias, keyPwd)));
deviceInfoDto.setError(new ErrorInfo ("0", SBIJsonInfo.getErrorDescription("en", "0")));
break;
}
return deviceInfoDto ;
} catch (Exception ex) {
LOGGER.error("getDeviceInfoDto :: deviceType::" + deviceType + " :: deviceSubType::" + deviceSubType , ex);
}
finally
{
try { // because close can throw an exception
if (inputStream != null) inputStream.close();
} catch (IOException ignored) {}
}
return null;
}

Expand All @@ -429,7 +380,6 @@ public String getSignBioMetricsDataDto(String deviceType, String deviceSubType,
String keyStoreFileName = null;
String keyAlias = null;
String keyPwd = null;
FileInputStream inputStream = null;

try {
switch (deviceType)
Expand Down Expand Up @@ -474,41 +424,14 @@ public String getSignBioMetricsDataDto(String deviceType, String deviceSubType,
break;
}

if (FileHelper.exists(keyStoreFileName))
{
File keyStoreFile = new File(keyStoreFileName);
KeyStore keystore = null;
if (keyStoreFile.exists())
{
inputStream = new FileInputStream (keyStoreFile);
keystore = loadKeyStore (inputStream, keyPwd);
}

PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, keyPwd.toCharArray());

/* Get certificate of public key */
java.security.cert.Certificate cert = keystore.getCertificate(keyAlias);
signedBioMetricsDataDto = JwtUtility.getJwt(currentBioData.getBytes("UTF-8"),
getPrivateKey(keyStoreFileName, keyAlias, keyPwd),
(X509Certificate) getCertificate(keyStoreFileName, keyAlias, keyPwd));
return signedBioMetricsDataDto ;

/* Here it prints the public key*/
//LOGGER.Info("Public Key:");
//LOGGER.Info(cert.getPublicKey());

/* Here it prints the private key*/
//LOGGER.Info("\nPrivate Key:");
//LOGGER.Info(key);
signedBioMetricsDataDto = JwtUtility.getJwt(currentBioData.getBytes("UTF-8"), key, (X509Certificate) cert);

return signedBioMetricsDataDto ;
}
} catch (Exception ex) {
LOGGER.error("getSignBioMetricsDataDto :: deviceType::" + deviceType + " :: deviceSubType::" + deviceSubType , ex);
}
finally
{
try { // because close can throw an exception
if (inputStream != null) inputStream.close();
} catch (IOException ignored) {}
}
return null;
}

Expand Down Expand Up @@ -557,21 +480,6 @@ private String getSignedDigitalId (String digitalId, PrivateKey privateKey, Cert
}
return null;
}

private KeyStore loadKeyStore(FileInputStream inputStream, String keystorePwd) throws Exception {
KeyStore keyStore = KeyStore.getInstance("JKS");
// if exists, load
keyStore.load(inputStream, keystorePwd.toCharArray());

/*
else {
// if not exists, create
keyStore.load(null, null);
keyStore.store(new FileOutputStream(file), keystorePwd.toCharArray());
}
*/
return keyStore;
}

protected byte[] getLiveStreamBufferedImage() {
byte[] image = null;
Expand Down Expand Up @@ -876,5 +784,42 @@ public int getRandomNumberForSeed(int seed) {
value = 1;

return value;
}
}

private PrivateKey getPrivateKey(String keyStoreFileName, String alias, String keystorePassword) {
loadKeys(keyStoreFileName, alias, keystorePassword);
return privateKeyMap.get(keyStoreFileName);
}

private Certificate getCertificate(String keyStoreFileName, String alias, String keystorePassword) {
loadKeys(keyStoreFileName, alias, keystorePassword);
return certificateMap.get(keyStoreFileName);
}

private void loadKeys(String keyStoreFileName, String alias, String keystorePassword) {
if(privateKeyMap.containsKey(keyStoreFileName) && certificateMap.containsKey(keyStoreFileName)) {
LOGGER.info("Keystore already cached, nothing to load :: " + keystoreFilePath);
return;
}

try(FileInputStream fileInputStream = new FileInputStream(keyStoreFileName)) {
LOGGER.info("Loading keystore into to local cache :: " + keystoreFilePath);
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(fileInputStream, keystorePassword.toCharArray());
privateKeyMap.put(keyStoreFileName, (PrivateKey)keystore.getKey(alias, keystorePassword.toCharArray()));
certificateMap.put(keyStoreFileName, keystore.getCertificate(alias));
} catch (Exception e) {
LOGGER.error("Failed to load keystore into local cache :: " + keystoreFilePath, e);
throw new RuntimeException(e);
}
}

/**
* To be invoked in afterSuite
* @param keystoreFilePath
*/
public static void evictKeys(String keystoreFilePath) {
privateKeyMap.entrySet().removeIf( e -> e.getKey().startsWith(keystoreFilePath));
certificateMap.entrySet().removeIf( e -> e.getKey().startsWith(keystoreFilePath));
}
}
Loading