{
}
+int InternalEncryptionServer::migrateMasterKey(const std::string& dev, const std::string& password)
+{
+ try {
+ BinaryData masterKey = UpgradeSupport::loadMasterKey(dev);
+
+ // encrypt the master key with given password
+ return keyServer.changePassword2(dev, masterKey, password);
+ } catch (const runtime::Exception&) {
+ INFO("Failed to load the master key stored during upgrade.");
+ }
+
+ return error::Unknown;
+}
+
int InternalEncryptionServer::setMountPassword(const std::string& password)
{
const std::string& dev = engine->getSource();
// check if upgrade flag exists
- if(UpgradeSupport::removeUpgradeFlag()) {
+ if (UpgradeSupport::checkUpgradeFlag()) {
INFO("Upgrade flag detected.");
- // try to load the master key
- try {
- mountKey = UpgradeSupport::loadMasterKey(dev);
- // encrypt the master key with given password
- return keyServer.changePassword2(dev, mountKey, password);
- } catch (const runtime::Exception&) {
- INFO("Failed to load the master key stored during upgrade.");
- }
+ int rc = migrateMasterKey(dev, password);
+ if (rc == error::None)
+ UpgradeSupport::removeUpgradeFlag();
+
+ return rc;
}
return keyServer.get(dev, password, mountKey);
return error::NoSuchDevice;
}
+ // check if key migration is needed
+ if (UpgradeSupport::checkUpgradeFlag()) {
+ INFO("Upgrade flag detected.");
+ const std::string& dev = engine->getSource();
+ int rc = migrateMasterKey(dev, password);
+ if (rc == error::None)
+ UpgradeSupport::removeUpgradeFlag();
+ }
+
BinaryData masterKey;
int ret = keyServer.get(engine->getSource(), password, masterKey);
if (ret != error::None)
const std::string& curPassword,
const std::string& newPassword)
{
+
if (dev.empty() || curPassword.empty() || newPassword.empty())
return error::InvalidParameter;
return error::NoSuchFile;
}
- UpgradeSupport::removeUpgradeFlag();
-
EncryptedKey ek(FileFooter::read(dev));
auto key = ek.decrypt(curPassword);
ek.encrypt(key, newPassword);
FileFooter::write(dev, ek.serialize());
+
+ UpgradeSupport::removeUpgradeFlag();
+
return error::None;
}
file.create(S_IRUSR | S_IWUSR); // 0600
}
-bool removeUpgradeFlag()
+void removeUpgradeFlag()
{
runtime::File file(UPGRADE_FLAG_PATH);
bool exists = file.exists();
if (exists)
file.remove();
+}
- return exists;
+bool checkUpgradeFlag()
+{
+ runtime::File file(UPGRADE_FLAG_PATH);
+ return file.exists();
}
} // namespace UpgradeSupport
BinaryData loadMasterKey(const std::string &device);
void removeMasterKey(const std::string &device);
void createUpgradeFlag();
-bool removeUpgradeFlag();
+void removeUpgradeFlag();
+bool checkUpgradeFlag();
} // namespace UpgradeSupport