From 56cf3f6b0e950a2d4f7d5aee9b183498beb514f2 Mon Sep 17 00:00:00 2001 From: vishesh92 Date: Tue, 10 Feb 2026 21:30:06 +0530 Subject: [PATCH] Change wrapping algo for pkcs --- .../admin/kms/MigrateVolumesToKMSCmd.java | 3 +- .../command/admin/kms/RotateKMSKeyCmd.java | 3 +- .../provider/pkcs11/PKCS11HSMProvider.java | 165 ++++++------------ .../apache/cloudstack/kms/KMSManagerImpl.java | 52 +++--- .../kms/KMSManagerImplKeyRotationTest.java | 120 ++++++++----- .../utils/exception/CSExceptionErrorCode.java | 1 + 6 files changed, 157 insertions(+), 187 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/MigrateVolumesToKMSCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/MigrateVolumesToKMSCmd.java index 308e1dd38a0..4d76abf4155 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/MigrateVolumesToKMSCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/MigrateVolumesToKMSCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.kms; +import com.cloud.dc.DataCenter; import com.cloud.user.Account; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; @@ -127,7 +128,7 @@ public class MigrateVolumesToKMSCmd extends BaseAsyncCmd { @Override public String getEventDescription() { - return "Migrating volumes to KMS for zone: " + _uuidMgr.getUuid(ZoneResponse.class, zoneId); + return "Migrating volumes to KMS for zone: " + _uuidMgr.getUuid(DataCenter.class, zoneId); } @Override diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/RotateKMSKeyCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/RotateKMSKeyCmd.java index ffe0bc32ab3..7ab47a65351 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/RotateKMSKeyCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/kms/RotateKMSKeyCmd.java @@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.AsyncJobResponse; import org.apache.cloudstack.api.response.HSMProfileResponse; import org.apache.cloudstack.api.response.KMSKeyResponse; import org.apache.cloudstack.framework.kms.KMSException; +import org.apache.cloudstack.kms.KMSKey; import org.apache.cloudstack.kms.KMSManager; import javax.inject.Inject; @@ -103,7 +104,7 @@ public class RotateKMSKeyCmd extends BaseAsyncCmd { @Override public String getEventDescription() { - return "Rotating KMS key: " + _uuidMgr.getUuid(KMSKeyResponse.class, id); + return "Rotating KMS key: " + _uuidMgr.getUuid(KMSKey.class, id); } @Override diff --git a/plugins/kms/pkcs11/src/main/java/org/apache/cloudstack/kms/provider/pkcs11/PKCS11HSMProvider.java b/plugins/kms/pkcs11/src/main/java/org/apache/cloudstack/kms/provider/pkcs11/PKCS11HSMProvider.java index e1d059258bd..487a753889c 100644 --- a/plugins/kms/pkcs11/src/main/java/org/apache/cloudstack/kms/provider/pkcs11/PKCS11HSMProvider.java +++ b/plugins/kms/pkcs11/src/main/java/org/apache/cloudstack/kms/provider/pkcs11/PKCS11HSMProvider.java @@ -39,7 +39,7 @@ import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; -import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import java.io.Closeable; @@ -564,9 +564,10 @@ public class PKCS11HSMProvider extends AdapterBase implements KMSProvider { * {@link KMSException.ErrorType} values for proper retry logic and error reporting. */ private static class PKCS11Session { - private static final String ALGORITHM = "AES/GCM/NoPadding"; - private static final int GCM_IV_LENGTH = 12; // 96 bits - private static final int GCM_TAG_LENGTH = 16; // 128 bits + // Use AES-CBC with PKCS5Padding for key wrapping + // This is FIPS-compliant (NIST SP 800-38A) and has universal PKCS#11 support + private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; + private static final int IV_LENGTH = 16; // 128 bits for CBC private static final String PROVIDER_PREFIX = "CloudStackPKCS11-"; private final Map config; @@ -658,7 +659,7 @@ public class PKCS11HSMProvider extends AdapterBase implements KMSProvider { // Zeroize PIN from memory Arrays.fill(pinChars, '\0'); - logger.debug("Successfully connected to PKCS#11 HSM at {}", config.get("library")); + logger.debug("aSuccessfully connected to PKCS#11 HSM at {}", config.get("library")); } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException e) { handlePKCS11Exception(e, "Failed to initialize PKCS#11 connection"); } catch (IOException e) { @@ -937,19 +938,18 @@ public class PKCS11HSMProvider extends AdapterBase implements KMSProvider { /** * Wraps (encrypts) a plaintext DEK using a KEK stored in the HSM. * - *

Uses AES-GCM for authenticated encryption: + *

Uses AES-CBC with PKCS5Padding (FIPS 197 + NIST SP 800-38A): *

* *

Security: The plaintext DEK should be zeroized by the caller after wrapping. * * @param plainDek Plaintext DEK to wrap (will be encrypted) * @param kekLabel Label of the KEK stored in the HSM - * @return Wrapped blob: [IV][ciphertext+tag] + * @return Wrapped key blob: [IV][ciphertext] * @throws KMSException with appropriate ErrorType: *