Add checking return value
[platform/core/security/ode.git] / server / key-server.cpp
index a7d4a69..2e6d55c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2015-2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *  Copyright (c) 2015 - 2019 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
 #include <string>
 #include <algorithm>
 #include <map>
+#include <utility>
+#include <sstream>
+#include <iomanip>
 
 #include "key-server.h"
 #include "file-footer.h"
 #include "logger.h"
-#include "key-manager/key-manager.h"
 #include "misc.h"
 #include "rmi/common.h"
+#include "key-manager/encrypted-key.h"
+#include "key-manager/key-generator.h"
+#include "upgrade-support.h"
 
 namespace ode {
 
@@ -48,6 +53,8 @@ KeyServer::KeyServer(ServerContext& srv) :
        server.expose(this, PRIVILEGE_PLATFORM, (int)(KeyServer::remove)(std::string, std::string));
        server.expose(this, PRIVILEGE_PLATFORM, (int)(KeyServer::changePassword)(std::string, std::string, std::string));
        server.expose(this, PRIVILEGE_PLATFORM, (int)(KeyServer::verifyPassword)(std::string, std::string));
+       server.expose(this, PRIVILEGE_PLATFORM, (int)(KeyServer::storeMasterKey)(std::string, std::string));
+       server.expose(this, PRIVILEGE_PLATFORM, (int)(KeyServer::removeMasterKey)(std::string));
 }
 
 KeyServer::~KeyServer()
@@ -56,6 +63,8 @@ KeyServer::~KeyServer()
 
 int KeyServer::isInitialized(const std::string& dev)
 {
+       RequestLifetime rl(server);
+
        if (dev.empty())
                return error::InvalidParameter;
 
@@ -66,30 +75,42 @@ int KeyServer::init(const std::string& dev,
                                        const std::string& password,
                                        int params)
 {
+       RequestLifetime rl(server);
+
+       BinaryData dummy;
+       return initAndGet(dev, password, params, dummy);
+}
+
+int KeyServer::initAndGet(const std::string& dev,
+                                                 const std::string& password,
+                                                 int params,
+                                                 BinaryData& masterKey)
+{
        if (dev.empty() || password.empty() || KEY_SIZE.find(params) == KEY_SIZE.end())
                return error::InvalidParameter;
 
-       KeyManager::data pwData(password.begin(), password.end());
-       KeyManager keyManager;
+       masterKey = KeyGenerator::RNG(KEY_SIZE.at(params));
 
-       keyManager.initPassword(pwData, KEY_SIZE.at(params));
+       EncryptedKey ek(masterKey, password);
+
+       std::lock_guard<std::mutex> lock(footerLock);
+       FileFooter::write(dev, ek.serialize());
 
-       FileFooter::write(dev, keyManager.serialize());
        return error::None;
 }
 
 int KeyServer::remove(const std::string& dev, const std::string& password)
 {
+       RequestLifetime rl(server);
+
        if (dev.empty() || password.empty())
                return error::InvalidParameter;
 
-       KeyManager::data pwData(password.begin(), password.end());
-       KeyManager keyManager(FileFooter::read(dev));
-
-       if (!keyManager.verifyPassword(pwData)) {
-               ERROR(SINK, "Wrong password passed.");
-               return error::WrongPassword;
-       }
+       std::lock_guard<std::mutex> lock(footerLock);
+       BinaryData key;
+       int ret = internalGet(dev, password, key);
+       if (ret != error::None)
+               return ret;
 
        FileFooter::clear(dev);
        return error::None;
@@ -99,33 +120,141 @@ int KeyServer::changePassword(const std::string& dev,
                                                          const std::string& curPassword,
                                                          const std::string& newPassword)
 {
+       RequestLifetime rl(server);
+
        if (dev.empty() || curPassword.empty() || newPassword.empty())
                return error::InvalidParameter;
 
-       KeyManager::data curPwData(curPassword.begin(), curPassword.end());
-       KeyManager::data newPwData(newPassword.begin(), newPassword.end());
-       KeyManager keyManager(FileFooter::read(dev));
+       std::lock_guard<std::mutex> lock(footerLock);
+       if (!FileFooter::exist(dev)) {
+               ERROR(SINK, "Given device has no master key.");
+               return error::NoSuchFile;
+       }
+
+       EncryptedKey ek(FileFooter::read(dev));
 
-       if (!keyManager.verifyPassword(curPwData)) {
+       auto key = ek.decrypt(curPassword);
+       if (key.empty()) {
                ERROR(SINK, "Wrong password passed.");
                return error::WrongPassword;
        }
 
-       keyManager.changePassword(curPwData, newPwData);
-       FileFooter::write(dev, keyManager.serialize());
+       ek.encrypt(key, newPassword);
+
+       FileFooter::write(dev, ek.serialize());
+
+       UpgradeSupport::removeUpgradeFlag();
+
+       return error::None;
+}
+
+int KeyServer::changePassword2(const std::string& dev,
+                                                          const BinaryData& masterKey,
+                                                          const std::string& newPassword)
+{
+       if (dev.empty() || masterKey.empty() || newPassword.empty())
+               return error::InvalidParameter;
+
+       std::lock_guard<std::mutex> lock(footerLock);
+       EncryptedKey ek(masterKey, newPassword);
+
+       FileFooter::write(dev, ek.serialize());
        return error::None;
 }
 
 int KeyServer::verifyPassword(const std::string& dev,
                                                          const std::string& password)
 {
+       RequestLifetime rl(server);
+
+       if (dev.empty() || password.empty())
+               return error::InvalidParameter;
+
+       BinaryData dummy;
+       std::lock_guard<std::mutex> lock(footerLock);
+       return internalGet(dev, password, dummy);
+}
+
+int KeyServer::get(const std::string& dev,
+                                  const std::string& password,
+                                  BinaryData& masterKey) const
+{
+       if (dev.empty() || password.empty())
+               return error::InvalidParameter;
+
+       std::lock_guard<std::mutex> lock(footerLock);
+       return internalGet(dev, password, masterKey);
+}
+
+void KeyServer::removePassword(const std::string& dev)
+{
+       if (dev.empty())
+               return;
+
+       std::lock_guard<std::mutex> lock(footerLock);
+       FileFooter::clear(dev);
+}
+
+int KeyServer::storeMasterKey(const std::string& dev,
+                                                         const std::string& password)
+{
+       RequestLifetime rl(server);
+
        if (dev.empty() || password.empty())
                return error::InvalidParameter;
 
-       KeyManager::data pwData(password.begin(), password.end());
-       KeyManager keyManager(FileFooter::read(dev));
+       std::unique_lock<std::mutex> lock(footerLock);
+       BinaryData masterKey;
+       int ret = internalGet(dev, password, masterKey);
+       if (ret != error::None)
+               return ret;
+
+       lock.unlock();
+
+       try {
+               UpgradeSupport::storeMasterKey(dev, masterKey);
+       } catch (const runtime::Exception& e) {
+               ERROR(SINK, e.what());
+               return error::Unknown;
+       }
+       return error::None;
+}
+
+int KeyServer::removeMasterKey(const std::string& dev)
+{
+       RequestLifetime rl(server);
+
+       if (dev.empty())
+               return error::InvalidParameter;
+
+       try {
+               UpgradeSupport::removeMasterKey(dev);
+       } catch (const runtime::Exception& e) {
+               ERROR(SINK, e.what());
+               return error::Unknown;
+       }
+       return error::None;
+}
 
-       return keyManager.verifyPassword(pwData) ? error::None : error::WrongPassword;
+int KeyServer::internalGet(const std::string& dev,
+                                                  const std::string& password,
+                                                  BinaryData& key) const
+{
+       if (!FileFooter::exist(dev)) {
+               ERROR(SINK, "Given device has no master key.");
+               return error::NoSuchFile;
+       }
+
+       UpgradeSupport::removeUpgradeFlag();
+
+       EncryptedKey ek(FileFooter::read(dev));
+
+       key = ek.decrypt(password);
+       if (key.empty()) {
+               ERROR(SINK, "Wrong password passed.");
+               return error::WrongPassword;
+       }
+       return error::None;
 }
 
 } // namespace ode