blob: cd54c4f90fa63b483d1c309dfeab87932d4ecb56 [file] [log] [blame]
Kuiying Wang8f706212020-12-16 18:59:24 +08001/*
Manojkiran Edafae57322024-11-12 12:58:11 +05302 Copyright (c) 2020 Intel Corporation
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http:www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
Kuiying Wang8f706212020-12-16 18:59:24 +080015*/
Manojkiran Edafae57322024-11-12 12:58:11 +053016
Kuiying Wang8f706212020-12-16 18:59:24 +080017#pragma once
Kuiying Wang8f706212020-12-16 18:59:24 +080018#include <openssl/evp.h>
19#include <openssl/hmac.h>
20#include <openssl/sha.h>
21
22#include <nlohmann/json.hpp>
23#include <sdbusplus/asio/object_server.hpp>
24#include <sdbusplus/server.hpp>
25#include <xyz/openbmc_project/BIOSConfig/Password/server.hpp>
26
27#include <filesystem>
28#include <string>
29
30namespace bios_config_pwd
31{
Kuiying Wang8f706212020-12-16 18:59:24 +080032static constexpr auto objectPathPwd =
33 "/xyz/openbmc_project/bios_config/password";
Kuiying Wang8f706212020-12-16 18:59:24 +080034constexpr auto biosSeedFile = "seedData";
Ayushi Smriti96e72ec2021-05-20 13:44:12 +053035constexpr uint8_t maxHashSize = 64;
36constexpr uint8_t maxSeedSize = 32;
37constexpr uint8_t maxPasswordLen = 32;
Snehalatha Venkatesh2f7ba732021-09-30 10:25:32 +000038constexpr int iterValue = 1000;
Kuiying Wang8f706212020-12-16 18:59:24 +080039
40using Base = sdbusplus::xyz::openbmc_project::BIOSConfig::server::Password;
41namespace fs = std::filesystem;
42
43/** @class Password
44 *
45 * @brief Implements the BIOS Password
46 */
47class Password : public Base
48{
49 public:
50 Password() = delete;
51 ~Password() = default;
52 Password(const Password&) = delete;
53 Password& operator=(const Password&) = delete;
54 Password(Password&&) = delete;
55 Password& operator=(Password&&) = delete;
56
57 /** @brief Constructs Password object.
58 *
59 * @param[in] objectServer - object server
60 * @param[in] systemBus - bus connection
61 */
62 Password(sdbusplus::asio::object_server& objectServer,
Patrick Williams773c9222024-10-18 21:39:55 -040063 std::shared_ptr<sdbusplus::asio::connection>& systemBus,
64 std::string persistPath);
Kuiying Wang8f706212020-12-16 18:59:24 +080065
66 /** @brief Set the BIOS attribute with a new value, the new value is added
67 * to the PendingAttribute.
68 *
69 * @param[in] userName - User name - user / admin.
70 * @param[in] currentPassword - Current user/ admin Password.
71 * @param[in] newPassword - New user/ admin Password.
72 */
73 void changePassword(std::string userName, std::string currentPassword,
74 std::string newPassword) override;
75
76 private:
77 void verifyPassword(std::string userName, std::string currentPassword,
78 std::string newPassword);
yesd0f034a2022-12-29 18:35:37 +053079 bool compareDigest(const EVP_MD* digestFunc, size_t digestLen,
80 const std::array<uint8_t, maxHashSize>& expected,
81 const std::array<uint8_t, maxSeedSize>& seed,
82 const std::string& rawData);
Ayushi Smriti96e72ec2021-05-20 13:44:12 +053083 bool isMatch(const std::array<uint8_t, maxHashSize>& expected,
84 const std::array<uint8_t, maxSeedSize>& seed,
George Liu616f9222021-12-29 14:25:39 +080085 const std::string& rawData, const std::string& algo);
Smriti-Ayushib3f7a792023-05-09 15:03:24 +053086 bool getParam(std::array<uint8_t, maxHashSize>& orgUsrPwdHash,
87 std::array<uint8_t, maxHashSize>& orgAdminPwdHash,
88 std::array<uint8_t, maxSeedSize>& seed,
89 std::string& hashAlgo);
yes8c22d072023-03-22 15:11:26 +053090 bool verifyIntegrityCheck(std::string& newPassword,
91 std::array<uint8_t, maxSeedSize>& seed,
92 unsigned int mdLen, const EVP_MD* digestFunc);
Kuiying Wang8f706212020-12-16 18:59:24 +080093 sdbusplus::asio::object_server& objServer;
94 std::shared_ptr<sdbusplus::asio::connection>& systemBus;
Kuiying Wang8f706212020-12-16 18:59:24 +080095 std::filesystem::path seedFile;
Ayushi Smriti96e72ec2021-05-20 13:44:12 +053096 std::array<uint8_t, maxHashSize> mNewPwdHash;
Kuiying Wang8f706212020-12-16 18:59:24 +080097};
98
99} // namespace bios_config_pwd