mirror of
https://github.com/Tencent/MMKV.git
synced 2026-10-17 04:30:56 +08:00
108 lines
2.6 KiB
C++
108 lines
2.6 KiB
C++
/*
|
|
* Tencent is pleased to support the open source community by making
|
|
* MMKV available.
|
|
*
|
|
* Copyright (C) 2018 THL A29 Limited, a Tencent company.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the BSD 3-Clause License (the "License"); you may not use
|
|
* this file except in compliance with the License. You may obtain a copy of
|
|
* the License at
|
|
*
|
|
* https://opensource.org/licenses/BSD-3-Clause
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef AES_CRYPT_H_
|
|
#define AES_CRYPT_H_
|
|
#ifdef __cplusplus
|
|
|
|
#include "MMKVPredef.h"
|
|
#include <cstddef>
|
|
|
|
#ifdef MMKV_DISABLE_CRYPT
|
|
|
|
namespace mmkv {
|
|
class AESCrypt;
|
|
}
|
|
|
|
#else
|
|
|
|
namespace openssl {
|
|
struct AES_KEY;
|
|
}
|
|
|
|
namespace mmkv {
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
struct AESCryptStatus {
|
|
uint8_t m_number;
|
|
uint8_t m_vector[AES_KEY_LEN];
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
class CodedInputDataCrypt;
|
|
|
|
// a AES CFB-128 encrypt-decrypt full-duplex wrapper
|
|
class AESCrypt {
|
|
bool m_isClone = false;
|
|
uint32_t m_number = 0;
|
|
openssl::AES_KEY *m_aesKey = nullptr;
|
|
openssl::AES_KEY *m_aesRollbackKey = nullptr;
|
|
uint8_t m_key[AES_KEY_LEN] = {};
|
|
|
|
public:
|
|
uint8_t m_vector[AES_KEY_LEN] = {};
|
|
|
|
private:
|
|
// for cloneWithStatus()
|
|
AESCrypt(const AESCrypt &other, const AESCryptStatus &status);
|
|
|
|
public:
|
|
AESCrypt(const void *key, size_t keyLength, const void *iv = nullptr, size_t ivLength = 0);
|
|
AESCrypt(AESCrypt &&other) = default;
|
|
|
|
~AESCrypt();
|
|
|
|
void encrypt(const void *input, void *output, size_t length);
|
|
|
|
void decrypt(const void *input, void *output, size_t length);
|
|
|
|
void getCurStatus(AESCryptStatus &status);
|
|
void statusBeforeDecrypt(const void *input, const void *output, size_t length, AESCryptStatus &status);
|
|
|
|
AESCrypt cloneWithStatus(const AESCryptStatus &status) const;
|
|
|
|
void resetIV(const void *iv = nullptr, size_t ivLength = 0);
|
|
void resetStatus(const AESCryptStatus &status);
|
|
|
|
// output must have [AES_KEY_LEN] space
|
|
void getKey(void *output) const;
|
|
|
|
static void fillRandomIV(void *vector);
|
|
|
|
// just forbid it for possibly misuse
|
|
explicit AESCrypt(const AESCrypt &other) = delete;
|
|
AESCrypt &operator=(const AESCrypt &other) = delete;
|
|
|
|
friend CodedInputDataCrypt;
|
|
|
|
#ifndef NDEBUG
|
|
// check if AESCrypt is encrypt-decrypt full-duplex
|
|
static void testAESCrypt();
|
|
#endif
|
|
};
|
|
|
|
} // namespace mmkv
|
|
|
|
#endif // MMKV_DISABLE_CRYPT
|
|
#endif // __cplusplus
|
|
#endif /* AES_CRYPT_H_ */
|