/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX SHARE #include "ob_encryption_struct.h" #include "share/ob_errno.h" namespace oceanbase { using namespace common; namespace share { OB_DEF_SERIALIZE(ObEncryptMeta) { int ret = OB_SUCCESS; if ((OB_ISNULL(buf)) || (buf_len <= 0)) { ret = OB_INVALID_ARGUMENT; SHARE_LOG(WARN, "invalid argument, ", K(ret), KP(buf), K(buf_len)); } else if (OB_FAIL(serialization::encode(buf, buf_len, pos, master_key_version_))) { SHARE_LOG(WARN, "serialize master key verison failed", K(ret), K(buf_len), K(pos)); } else if (OB_FAIL(serialization::encode(buf, buf_len, pos, encrypt_algorithm_))) { SHARE_LOG(WARN, "serialize encrypt algorithm failed", K(ret), K(buf_len), K(pos)); } else if (OB_FAIL(encrypted_table_key_.serialize(buf, buf_len, pos))) { SHARE_LOG(WARN, "serialize table key failed", K(ret), K(buf_len), K(pos)); } return ret; } OB_DEF_DESERIALIZE(ObEncryptMeta) { int ret = OB_SUCCESS; if ((OB_ISNULL(buf)) || (data_len <= 0)) { ret = OB_INVALID_ARGUMENT; SHARE_LOG(WARN, "invalid argument, ", K(ret), KP(buf), K(data_len)); } else if (OB_FAIL(serialization::decode(buf, data_len, pos, master_key_version_))) { SHARE_LOG(WARN, "deserialize master key version failed", K(ret), K(data_len), K(pos)); } else if (OB_FAIL(serialization::decode(buf, data_len, pos, encrypt_algorithm_))) { SHARE_LOG(WARN, "deserialize encrypt algorithm failed", K(ret), K(data_len), K(pos)); } else if (OB_FAIL(encrypted_table_key_.deserialize(buf, data_len, pos))) { SHARE_LOG(WARN, "deserialize table key failed", K(ret), K(data_len), K(pos)); } return ret; } OB_DEF_SERIALIZE_SIZE(ObEncryptMeta) { int64_t size = 0; size += serialization::encoded_length(master_key_version_); size += serialization::encoded_length(encrypt_algorithm_); size += encrypted_table_key_.get_serialize_size(); return size; } int ObEncryptMeta::assign(const ObEncryptMeta &other) { int ret = OB_SUCCESS; if (OB_FAIL(master_key_.assign(other.master_key_))) { SHARE_LOG(WARN, "failed to assign master_key_", KR(ret), K(other)); } else if (OB_FAIL(table_key_.assign(other.table_key_))) { SHARE_LOG(WARN, "failed to assign table_key_", KR(ret), K(other)); } else if (OB_FAIL(encrypted_table_key_.assign(other.encrypted_table_key_))) { SHARE_LOG(WARN, "failed to assign encrypted_table_key_", KR(ret), K(other)); } else { master_key_version_ = other.master_key_version_; encrypt_algorithm_ = other.encrypt_algorithm_; } return ret; } void ObEncryptMeta::reset() { master_key_version_ = -1; encrypt_algorithm_ = -1; master_key_.reset(); table_key_.reset(); encrypted_table_key_.reset(); } int ObEncryptMeta::replace_tenant_id(const uint64_t real_tenant_id) { int ret = OB_SUCCESS; tenant_id_ = real_tenant_id; return ret; } OB_DEF_SERIALIZE(ObZoneEncryptMeta) { int ret = OB_SUCCESS; if ((OB_ISNULL(buf)) || (buf_len <= 0)) { ret = OB_INVALID_ARGUMENT; SHARE_LOG(WARN, "invalid argument, ", K(ret), KP(buf), K(buf_len)); } else if (OB_FAIL(serialization::encode_i16(buf, buf_len, pos, version_))) { SHARE_LOG(WARN, "serialize verison failed", K(ret), K(buf_len), K(pos)); } else if (OB_FAIL(serialization::encode_i64(buf, buf_len, pos, master_key_version_))) { SHARE_LOG(WARN, "serialize master key verison failed", K(ret), K(buf_len), K(pos)); } else if (OB_FAIL(serialization::encode_i64(buf, buf_len, pos, encrypt_algorithm_))) { SHARE_LOG(WARN, "serialize encrypt algorithm failed", K(ret), K(buf_len), K(pos)); } return ret; } OB_DEF_DESERIALIZE(ObZoneEncryptMeta) { int ret = OB_SUCCESS; if ((OB_ISNULL(buf)) || (data_len <= 0)) { ret = OB_INVALID_ARGUMENT; SHARE_LOG(WARN, "invalid argument, ", K(ret), KP(buf), K(data_len)); } else if (OB_FAIL(serialization::decode_i16(buf, data_len, pos, &version_))) { SHARE_LOG(WARN, "deserialize master key version failed", K(ret), K(data_len), K(pos)); } else if (OB_FAIL(serialization::decode_i64(buf, data_len, pos, &master_key_version_))) { SHARE_LOG(WARN, "deserialize master key version failed", K(ret), K(data_len), K(pos)); } else if (OB_FAIL(serialization::decode_i64(buf, data_len, pos, &encrypt_algorithm_))) { SHARE_LOG(WARN, "deserialize encrypt algorithm failed", K(ret), K(data_len), K(pos)); } return ret; } OB_DEF_SERIALIZE_SIZE(ObZoneEncryptMeta) { int64_t size = 0; size += serialization::encoded_length_i16(version_); size += serialization::encoded_length_i64(master_key_version_); size += serialization::encoded_length_i64(encrypt_algorithm_); return size; } void ObZoneEncryptMeta::reset() { version_ = 0; master_key_version_ = -1; encrypt_algorithm_ = -1; } bool ObZoneEncryptMeta::is_valid_except_master_key_version() const { return ObBlockCipher::is_valid_cipher_opmode(static_cast(encrypt_algorithm_)); } bool ObZoneEncryptMeta::is_valid() const { return (master_key_version_ > 0) && is_valid_except_master_key_version(); } int ObZoneEncryptMeta::assign(const ObZoneEncryptMeta &other) { int ret = OB_SUCCESS; version_ = other.version_; master_key_version_ = other.master_key_version_; encrypt_algorithm_ = other.encrypt_algorithm_; return ret; } void ObCLogEncryptStatMap::reset_map() { ATOMIC_STORE(&val_, 0); } void ObCLogEncryptStatMap::set_map(const int64_t idx) { uint16_t mask = static_cast(1 << idx); uint16_t map = ATOMIC_LOAD(&val_) | mask; ATOMIC_STORE(&val_, map); } bool ObCLogEncryptStatMap::test_map(const int64_t idx) const { return (ATOMIC_LOAD(&val_) & (1 << idx)) != 0; } }; };