!2099 lock key for multi-process and restore key from datamgr_service

Merge pull request !2099 from Sven Wang/master
This commit is contained in:
openharmony_ci 2024-08-10 14:16:10 +00:00 committed by Gitee
commit 6d9a62ae95
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 55 additions and 6 deletions

View File

@ -172,7 +172,7 @@ int32_t RdbServiceImpl::ResolveAutoLaunch(const std::string &identifier, Distrib
if (entry.isEncrypt) {
param.option.iterateTimes = ITERATE_TIMES;
param.option.cipher = DistributedDB::CipherType::AES_256_GCM;
GetPassword(entry, param.option.passwd);
GetDBPassword(entry, param.option.passwd);
}
AutoCache::GetInstance().GetStore(entry, GetWatchers(entry.tokenId, entry.storeId));
return true;
@ -887,7 +887,7 @@ Details RdbServiceImpl::HandleGenDetails(const GenDetails &details)
return dbDetails;
}
bool RdbServiceImpl::GetPassword(const StoreMetaData &metaData, DistributedDB::CipherPassword &password)
bool RdbServiceImpl::GetDBPassword(const StoreMetaData &metaData, DistributedDB::CipherPassword &password)
{
if (!metaData.isEncrypt) {
return true;
@ -1108,13 +1108,37 @@ int32_t RdbServiceImpl::Disable(const RdbSyncerParam& param)
auto tokenId = IPCSkeleton::GetCallingTokenID();
auto storeId = RemoveSuffix(param.storeName_);
AutoCache::GetInstance().Disable(tokenId, storeId);
return E_OK;
return RDB_OK;
}
int32_t RdbServiceImpl::Enable(const RdbSyncerParam& param)
{
auto tokenId = IPCSkeleton::GetCallingTokenID();
auto storeId = RemoveSuffix(param.storeName_);
AutoCache::GetInstance().Enable(tokenId, storeId);
return E_OK;
return RDB_OK;
}
int32_t RdbServiceImpl::GetPassword(const RdbSyncerParam &param, std::vector<uint8_t> &password)
{
if (!CheckAccess(param.bundleName_, param.storeName_)) {
ZLOGE("bundleName:%{public}s, storeName:%{public}s. Permission error", param.bundleName_.c_str(),
Anonymous::Change(param.storeName_).c_str());
return RDB_ERROR;
}
auto meta = GetStoreMetaData(param);
SecretKeyMetaData secretKey;
if (!MetaDataManager::GetInstance().LoadMeta(meta.GetSecretKey(), secretKey, true)) {
ZLOGE("bundleName:%{public}s, storeName:%{public}s. no meta", param.bundleName_.c_str(),
Anonymous::Change(param.storeName_).c_str());
return RDB_NO_META;
}
if (!CryptoManager::GetInstance().Decrypt(secretKey.sKey, password)) {
ZLOGE("bundleName:%{public}s, storeName:%{public}s. decrypt err", param.bundleName_.c_str(),
Anonymous::Change(param.storeName_).c_str());
return RDB_ERROR;
}
return RDB_OK;
}
} // namespace OHOS::DistributedRdb

View File

@ -94,6 +94,8 @@ public:
int32_t AfterOpen(const RdbSyncerParam &param) override;
int32_t GetPassword(const RdbSyncerParam &param, std::vector<uint8_t> &password) override;
private:
using Watchers = DistributedData::AutoCache::Watchers;
using StaticActs = DistributedData::StaticActs;
@ -177,7 +179,7 @@ private:
static std::pair<int32_t, int32_t> GetInstIndexAndUser(uint32_t tokenId, const std::string &bundleName);
static bool GetPassword(const StoreMetaData &metaData, DistributedDB::CipherPassword &password);
static bool GetDBPassword(const StoreMetaData &metaData, DistributedDB::CipherPassword &password);
void GetCloudSchema(const RdbSyncerParam &param);

View File

@ -352,4 +352,24 @@ int32_t RdbServiceStub::OnEnable(MessageParcel& data, MessageParcel& reply)
}
return RDB_OK;
}
int32_t RdbServiceStub::OnGetPassword(MessageParcel &data, MessageParcel &reply)
{
RdbSyncerParam param;
if (!ITypesUtil::Unmarshal(data, param)) {
ZLOGE("Unmarshal bundleName_:%{public}s storeName_:%{public}s", param.bundleName_.c_str(),
Anonymous::Change(param.storeName_).c_str());
return IPC_STUB_INVALID_DATA_ERR;
}
std::vector<uint8_t> key;
auto status = GetPassword(param, key);
if (!ITypesUtil::Marshal(reply, status, key)) {
key.assign(key.size(), 0);
ZLOGE("Marshal status:0x%{public}x", status);
return IPC_STUB_WRITE_PARCEL_ERR;
}
key.assign(key.size(), 0);
return RDB_OK;
}
} // namespace OHOS::DistributedRdb

View File

@ -66,6 +66,8 @@ private:
int32_t OnEnable(MessageParcel& data, MessageParcel& reply);
int32_t OnGetPassword(MessageParcel& data, MessageParcel& reply);
using RequestHandle = int (RdbServiceStub::*)(MessageParcel &, MessageParcel &);
static constexpr RequestHandle HANDLERS[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_MAX)] = {
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_OBTAIN_TABLE)] =
@ -90,7 +92,8 @@ private:
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_DISABLE)] = &RdbServiceStub::OnDisable,
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_ENABLE)] = &RdbServiceStub::OnEnable,
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_BEFORE_OPEN)] = &RdbServiceStub::OnBeforeOpen,
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_AFTER_OPEN)] = &RdbServiceStub::OnAfterOpen
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_AFTER_OPEN)] = &RdbServiceStub::OnAfterOpen,
[static_cast<uint32_t>(RdbServiceCode::RDB_SERVICE_CMD_GET_PASSWORD)] = &RdbServiceStub::OnGetPassword
};
};
} // namespace OHOS::DistributedRdb