This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 8592de95fa Move PassphraseVO to use String instead of byte[] to
support Encrypt annotation (#7302)
8592de95fa is described below
commit 8592de95fa0920f6d19c1fa455139fea647f7c87
Author: Wei Zhou <[email protected]>
AuthorDate: Fri Mar 3 13:08:17 2023 +0100
Move PassphraseVO to use String instead of byte[] to support Encrypt
annotation (#7302)
Co-authored-by: Marcus Sorensen <[email protected]>
---
.../engine/orchestration/VolumeOrchestrator.java | 6 ++--
.../org/apache/cloudstack/secret/PassphraseVO.java | 39 +++++++++++++---------
.../utils/cryptsetup/CryptSetupTest.java | 2 +-
3 files changed, 27 insertions(+), 20 deletions(-)
diff --git
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 4808733bd2..ad7da2ceac 100644
---
a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++
b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -319,8 +319,7 @@ public class VolumeOrchestrator extends ManagerBase
implements VolumeOrchestrati
newVol.setFormat(oldVol.getFormat());
if (oldVol.getPassphraseId() != null) {
- PassphraseVO passphrase = passphraseDao.persist(new
PassphraseVO());
- passphrase.clearPassphrase();
+ PassphraseVO passphrase = passphraseDao.persist(new
PassphraseVO(true));
newVol.setPassphraseId(passphrase.getId());
}
@@ -1801,8 +1800,7 @@ public class VolumeOrchestrator extends ManagerBase
implements VolumeOrchestrati
}
s_logger.debug("Creating passphrase for the volume: " +
volume.getName());
long startTime = System.currentTimeMillis();
- PassphraseVO passphrase = passphraseDao.persist(new PassphraseVO());
- passphrase.clearPassphrase();
+ PassphraseVO passphrase = passphraseDao.persist(new
PassphraseVO(true));
volume.setPassphraseId(passphrase.getId());
long finishTime = System.currentTimeMillis();
s_logger.debug("Creating and persisting passphrase took: " +
(finishTime - startTime) + " ms for the volume: " + volume.toString());
diff --git
a/engine/schema/src/main/java/org/apache/cloudstack/secret/PassphraseVO.java
b/engine/schema/src/main/java/org/apache/cloudstack/secret/PassphraseVO.java
index 1c0e5e47ec..7d70eff3dc 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/secret/PassphraseVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/secret/PassphraseVO.java
@@ -20,6 +20,7 @@ package org.apache.cloudstack.secret;
import com.cloud.utils.db.Encrypt;
import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.commons.lang3.StringUtils;
import javax.persistence.Column;
import javax.persistence.Entity;
@@ -27,6 +28,7 @@ import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
+
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
@@ -42,32 +44,39 @@ public class PassphraseVO {
@Column(name = "passphrase")
@Encrypt
- private byte[] passphrase;
+ private String passphrase;
public PassphraseVO() {
- try {
- SecureRandom random = SecureRandom.getInstanceStrong();
- byte[] temporary = new byte[48]; // 48 byte random passphrase
buffer
- this.passphrase = new byte[64]; // 48 byte random passphrase as
base64 for usability
- random.nextBytes(temporary);
- Base64.getEncoder().encode(temporary, this.passphrase);
- Arrays.fill(temporary, (byte) 0); // clear passphrase from buffer
- } catch (NoSuchAlgorithmException ex ) {
- throw new CloudRuntimeException("Volume encryption requested but
system is missing specified algorithm to generate passphrase");
+ }
+
+ public PassphraseVO(boolean initialize) {
+ if (initialize) {
+ try {
+ SecureRandom random = SecureRandom.getInstanceStrong();
+ byte[] temporary = new byte[48]; // 48 byte random passphrase
buffer
+ random.nextBytes(temporary);
+ this.passphrase =
Base64.getEncoder().encodeToString(temporary);
+ Arrays.fill(temporary, (byte) 0); // clear passphrase from
buffer
+ } catch (NoSuchAlgorithmException ex ) {
+ throw new CloudRuntimeException("Volume encryption requested
but system is missing specified algorithm to generate passphrase");
+ }
}
}
public PassphraseVO(PassphraseVO existing) {
- this.passphrase = existing.getPassphrase();
+ this.passphrase = existing.getPassphraseString();
}
- public void clearPassphrase() {
- if (this.passphrase != null) {
- Arrays.fill(this.passphrase, (byte) 0);
+ public byte[] getPassphrase() {
+ if (StringUtils.isBlank(this.passphrase)) {
+ return new byte[]{};
}
+ return this.passphrase.getBytes();
}
- public byte[] getPassphrase() { return this.passphrase; }
+ public String getPassphraseString() {
+ return this.passphrase;
+ }
public Long getId() { return this.id; }
}
diff --git
a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/cryptsetup/CryptSetupTest.java
b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/cryptsetup/CryptSetupTest.java
index 007d2c6dc6..c54bbe7354 100644
---
a/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/cryptsetup/CryptSetupTest.java
+++
b/plugins/hypervisors/kvm/src/test/java/org/apache/cloudstack/utils/cryptsetup/CryptSetupTest.java
@@ -51,7 +51,7 @@ public class CryptSetupTest {
file.close();
String filePath = path.toAbsolutePath().toString();
- PassphraseVO passphrase = new PassphraseVO();
+ PassphraseVO passphrase = new PassphraseVO(true);
cryptSetup.luksFormat(passphrase.getPassphrase(),
CryptSetup.LuksType.LUKS, filePath);