Skip to content
Closed
Show file tree
Hide file tree
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
6 changes: 3 additions & 3 deletions kernel/kernel-keymanager-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>io.mosip.kernel</groupId>
<artifactId>kernel-keymanager-service</artifactId>
<version>1.2.1-SNAPSHOT</version>
<version>1.2.2-SNAPSHOT</version>
<name>kernel-keymanager-service</name>
<description>Mosip commons project </description>
<url>https://github.com/mosip/keymanager</url>
Expand All @@ -26,8 +26,8 @@
<central.publishing.maven.plugin.version>0.7.0</central.publishing.maven.plugin.version>

<!-- Kernel -->
<kernel.bom.version>1.2.1-SNAPSHOT</kernel.bom.version>
<kernel.core.version>1.2.1-SNAPSHOT</kernel.core.version>
<kernel.bom.version>1.2.2-SNAPSHOT</kernel.bom.version>
<kernel.core.version>1.2.2-SNAPSHOT</kernel.core.version>
<kernel.logger.logback.version>1.2.1-SNAPSHOT</kernel.logger.logback.version>
<kernel.pdfgenerator.version>1.2.1-SNAPSHOT</kernel.pdfgenerator.version>
<kernel.dataaccess.hibernate.version>1.2.1-SNAPSHOT</kernel.dataaccess.hibernate.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,27 +158,52 @@ public byte[] encrypt(ClientType clientType, byte[] publicKey, byte[] dataToEncr
}

public byte[] decrypt(byte[] dataToDecrypt) {
byte[] encryptedSecretKey = Arrays.copyOfRange(dataToDecrypt, 0, symmetricKeyLength);
byte[] secretKeyBytes = Objects.requireNonNull(getClientSecurity()).asymmetricDecrypt(encryptedSecretKey);
SecretKey secretKey = new SecretKeySpec(secretKeyBytes, "AES");
// Extract encrypted AES key and decrypt it
byte[] encryptedSecretKey = new byte[symmetricKeyLength];
System.arraycopy(dataToDecrypt, 0, encryptedSecretKey, 0, symmetricKeyLength);
byte[] secretKeyBytes = Objects.requireNonNull(getClientSecurity()).asymmetricDecrypt(encryptedSecretKey);
SecretKey secretKey = new SecretKeySpec(secretKeyBytes, "AES");

try {
byte[] iv = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength, symmetricKeyLength + ivLength);
byte[] aad = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength + ivLength, symmetricKeyLength + ivLength + aadLength);
byte[] cipher = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength + ivLength + aadLength,
dataToDecrypt.length);
return cryptoCore.symmetricDecrypt(secretKey, cipher, iv, aad);
} catch (Throwable t) {
LOGGER.error("Failed to decrypt the data due to : ", t.getMessage());
//1.1.4.4 backward compatibility code, for IV_LENGTH = 16 and AAD_LENGTH = 12;
byte[] iv = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength, symmetricKeyLength + 16);
byte[] aad = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength + 16, symmetricKeyLength + 16 + 12);
byte[] cipher = Arrays.copyOfRange(dataToDecrypt, symmetricKeyLength + 16 + 12,
dataToDecrypt.length);
return cryptoCore.symmetricDecrypt(secretKey, cipher, iv, aad);
}
// Pre-calculate offsets
final int ivOffset = symmetricKeyLength;
final int aadOffset = ivOffset + ivLength;
final int cipherOffset = aadOffset + aadLength;

try {
byte[] iv = new byte[ivLength];
byte[] aad = new byte[aadLength];
byte[] cipher = new byte[dataToDecrypt.length - cipherOffset];

System.arraycopy(dataToDecrypt, ivOffset, iv, 0, ivLength);
System.arraycopy(dataToDecrypt, aadOffset, aad, 0, aadLength);
System.arraycopy(dataToDecrypt, cipherOffset, cipher, 0, cipher.length);

return cryptoCore.symmetricDecrypt(secretKey, cipher, iv, aad);

} catch (Throwable t) {
LOGGER.error("Failed to decrypt using default IV/AAD lengths. Trying fallback. Error: ", t);

// 1.1.4.4 backward compatibility block
final int fallbackIvLength = 16;
final int fallbackAadLength = 12;

int fallbackIvOffset = symmetricKeyLength;
int fallbackAadOffset = fallbackIvOffset + fallbackIvLength;
int fallbackCipherOffset = fallbackAadOffset + fallbackAadLength;

byte[] iv = new byte[fallbackIvLength];
byte[] aad = new byte[fallbackAadLength];
byte[] cipher = new byte[dataToDecrypt.length - fallbackCipherOffset];

System.arraycopy(dataToDecrypt, fallbackIvOffset, iv, 0, fallbackIvLength);
System.arraycopy(dataToDecrypt, fallbackAadOffset, aad, 0, fallbackAadLength);
System.arraycopy(dataToDecrypt, fallbackCipherOffset, cipher, 0, cipher.length);

return cryptoCore.symmetricDecrypt(secretKey, cipher, iv, aad);
}
}


public static byte[] generateRandomBytes(int length) {
if(secureRandom == null)
secureRandom = new SecureRandom();
Expand Down
Loading