如何编写一个测试HIDL接口的vts(gtest)的testcase
生活随笔
收集整理的這篇文章主要介紹了
如何编写一个测试HIDL接口的vts(gtest)的testcase
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
快速鏈接:
.
👉👉👉 個(gè)人博客筆記導(dǎo)讀目錄(全部) 👈👈👈
相關(guān)推薦:
VTS工具測(cè)試HIDL接口
編寫(xiě)一個(gè)測(cè)試HIDL接口的vts(gtest)
Android11有哪些vts
我們先看一下vts HIDL測(cè)試的模型:
以keymaster為例,先實(shí)現(xiàn)一套調(diào)用Keymaster HIDL的接口
1、實(shí)現(xiàn)Keymaster HIDL的調(diào)用接口
class KeymasterHidlTest : public ::testing::TestWithParam<std::string> {public:void SetUp() override;void TearDown() override {if (key_blob_.size()) {CheckedDeleteKey();}AbortIfNeeded();}void InitializeKeymaster(sp<IKeymasterDevice> keymaster);IKeymasterDevice& keymaster() { return *keymaster_; }uint32_t os_version() { return os_version_; }uint32_t os_patch_level() { return os_patch_level_; }ErrorCode GenerateKey(const AuthorizationSet& key_desc, HidlBuf* key_blob,KeyCharacteristics* key_characteristics);ErrorCode GenerateKey(const AuthorizationSet& key_desc);ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format,const string& key_material, HidlBuf* key_blob,KeyCharacteristics* key_characteristics);ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format,const string& key_material);ErrorCode ImportWrappedKey(string wrapped_key, string wrapping_key,const AuthorizationSet& wrapping_key_desc, string masking_key,const AuthorizationSet& unwrapping_params);ErrorCode ExportKey(KeyFormat format, const HidlBuf& key_blob, const HidlBuf& client_id,const HidlBuf& app_data, HidlBuf* key_material);ErrorCode ExportKey(KeyFormat format, HidlBuf* key_material);ErrorCode DeleteKey(HidlBuf* key_blob, bool keep_key_blob = false);ErrorCode DeleteKey(bool keep_key_blob = false);ErrorCode DeleteAllKeys();void CheckedDeleteKey(HidlBuf* key_blob, bool keep_key_blob = false);void CheckedDeleteKey();void CheckGetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id,const HidlBuf& app_data, KeyCharacteristics* key_characteristics);ErrorCode GetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id,const HidlBuf& app_data, KeyCharacteristics* key_characteristics);ErrorCode GetCharacteristics(const HidlBuf& key_blob, KeyCharacteristics* key_characteristics);ErrorCode GetDebugInfo(DebugInfo* debug_info);ErrorCode Begin(KeyPurpose purpose, const HidlBuf& key_blob, const AuthorizationSet& in_params,AuthorizationSet* out_params, OperationHandle* op_handle);ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params,AuthorizationSet* out_params);ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params);ErrorCode Update(OperationHandle op_handle, const AuthorizationSet& in_params,const string& input, AuthorizationSet* out_params, string* output,size_t* input_consumed);ErrorCode Update(const string& input, string* out, size_t* input_consumed);ErrorCode Finish(OperationHandle op_handle, const AuthorizationSet& in_params,const string& input, const string& signature, AuthorizationSet* out_params,string* output);ErrorCode Finish(const string& message, string* output);ErrorCode Finish(const string& message, const string& signature, string* output);ErrorCode Finish(string* output) { return Finish(string(), output); }ErrorCode Abort(OperationHandle op_handle);void AbortIfNeeded();ErrorCode AttestKey(const HidlBuf& key_blob, const AuthorizationSet& attest_params,hidl_vec<hidl_vec<uint8_t>>* cert_chain);ErrorCode AttestKey(const AuthorizationSet& attest_params,hidl_vec<hidl_vec<uint8_t>>* cert_chain);string ProcessMessage(const HidlBuf& key_blob, KeyPurpose operation, const string& message,const AuthorizationSet& in_params, AuthorizationSet* out_params);string SignMessage(const HidlBuf& key_blob, const string& message,const AuthorizationSet& params);string SignMessage(const string& message, const AuthorizationSet& params);string MacMessage(const string& message, Digest digest, size_t mac_length);void CheckHmacTestVector(const string& key, const string& message, Digest digest,const string& expected_mac);void CheckAesCtrTestVector(const string& key, const string& nonce, const string& message,const string& expected_ciphertext);void CheckTripleDesTestVector(KeyPurpose purpose, BlockMode block_mode,PaddingMode padding_mode, const string& key, const string& iv,const string& input, const string& expected_output);void VerifyMessage(const HidlBuf& key_blob, const string& message, const string& signature,const AuthorizationSet& params);void VerifyMessage(const string& message, const string& signature,const AuthorizationSet& params);string EncryptMessage(const HidlBuf& key_blob, const string& message,const AuthorizationSet& in_params, AuthorizationSet* out_params);string EncryptMessage(const string& message, const AuthorizationSet& params,AuthorizationSet* out_params);string EncryptMessage(const string& message, const AuthorizationSet& params);string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding);string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,HidlBuf* iv_out);string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,const HidlBuf& iv_in);string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,uint8_t mac_length_bits, const HidlBuf& iv_in);string DecryptMessage(const HidlBuf& key_blob, const string& ciphertext,const AuthorizationSet& params);string DecryptMessage(const string& ciphertext, const AuthorizationSet& params);string DecryptMessage(const string& ciphertext, BlockMode block_mode, PaddingMode padding_mode,const HidlBuf& iv);std::pair<ErrorCode, HidlBuf> UpgradeKey(const HidlBuf& key_blob);bool IsSecure() { return securityLevel_ != SecurityLevel::SOFTWARE; }SecurityLevel SecLevel() { return securityLevel_; }std::vector<uint32_t> ValidKeySizes(Algorithm algorithm);std::vector<uint32_t> InvalidKeySizes(Algorithm algorithm);std::vector<EcCurve> ValidCurves();std::vector<EcCurve> InvalidCurves();std::vector<Digest> ValidDigests(bool withNone, bool withMD5);std::vector<Digest> InvalidDigests();HidlBuf key_blob_;KeyCharacteristics key_characteristics_;OperationHandle op_handle_ = kOpHandleSentinel;static std::vector<std::string> build_params() {auto params = android::hardware::getAllHalInstanceNames(IKeymasterDevice::descriptor);return params;}private:sp<IKeymasterDevice> keymaster_;uint32_t os_version_;uint32_t os_patch_level_;SecurityLevel securityLevel_;hidl_string name_;hidl_string author_; };然后去實(shí)現(xiàn)這些函數(shù),部分函數(shù)的實(shí)現(xiàn)如下:
void KeymasterHidlTest::InitializeKeymaster(sp<IKeymasterDevice> keymaster) {ASSERT_NE(keymaster, nullptr);keymaster_ = keymaster;ASSERT_TRUE(keymaster_->getHardwareInfo([&](SecurityLevel securityLevel, const hidl_string& name,const hidl_string& author) {securityLevel_ = securityLevel;name_ = name;author_ = author;}).isOk());os_version_ = support::getOsVersion();os_patch_level_ = support::getOsPatchlevel(); }void KeymasterHidlTest::SetUp() {InitializeKeymaster(IKeymasterDevice::getService(GetParam())); }ErrorCode KeymasterHidlTest::GenerateKey(const AuthorizationSet& key_desc, HidlBuf* key_blob,KeyCharacteristics* key_characteristics) {EXPECT_NE(key_blob, nullptr) << "Key blob pointer must not be null. Test bug";EXPECT_EQ(0U, key_blob->size()) << "Key blob not empty before generating key. Test bug.";EXPECT_NE(key_characteristics, nullptr)<< "Previous characteristics not deleted before generating key. Test bug.";ErrorCode error;EXPECT_TRUE(keymaster_->generateKey(key_desc.hidl_data(),[&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob,const KeyCharacteristics& hidl_key_characteristics) {error = hidl_error;*key_blob = hidl_key_blob;*key_characteristics = hidl_key_characteristics;}).isOk());// On error, blob & characteristics should be empty.if (error != ErrorCode::OK) {EXPECT_EQ(0U, key_blob->size());EXPECT_EQ(0U, (key_characteristics->softwareEnforced.size() +key_characteristics->hardwareEnforced.size()));}return error; }ErrorCode KeymasterHidlTest::GenerateKey(const AuthorizationSet& key_desc) {return GenerateKey(key_desc, &key_blob_, &key_characteristics_); }2、在gtest框架下實(shí)現(xiàn)具體的testcase
/** NewKeyGenerationTest.Rsa** Verifies that keymaster can generate all required RSA key sizes, and that the resulting keys have* correct characteristics.*/ TEST_P(NewKeyGenerationTest, Rsa) {for (auto key_size : ValidKeySizes(Algorithm::RSA)) {HidlBuf key_blob;KeyCharacteristics key_characteristics;ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder().RsaSigningKey(key_size, 65537).Digest(Digest::NONE).Padding(PaddingMode::NONE),&key_blob, &key_characteristics));ASSERT_GT(key_blob.size(), 0U);CheckBaseParams(key_characteristics);CheckCharacteristics(key_blob, key_characteristics);AuthorizationSet crypto_params;if (IsSecure()) {crypto_params = key_characteristics.hardwareEnforced;} else {crypto_params = key_characteristics.softwareEnforced;}EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::RSA));EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size))<< "Key size " << key_size << "missing";EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 65537U));CheckedDeleteKey(&key_blob);} }int main(int argc, char** argv) {::testing::InitGoogleTest(&argc, argv);for (int i = 1; i < argc; ++i) {if (argv[i][0] == '-') {if (std::string(argv[i]) == "--arm_deleteAllKeys") {arm_deleteAllKeys = true;}if (std::string(argv[i]) == "--dump_attestations") {dump_Attestations = true;}}}int status = RUN_ALL_TESTS();ALOGI("Test result = %d", status);return status; }參考:如何在google測(cè)試框架下(gtest)編寫(xiě)testcase
總結(jié)
以上是生活随笔為你收集整理的如何编写一个测试HIDL接口的vts(gtest)的testcase的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VTS工具测试指定的testcase函数
- 下一篇: Android11有哪些vts