blob: 4e546ed553cfbd9488c766bcf2031b609af06bbc [file] [log] [blame]
Selene Huang31ab4042020-04-29 04:22:39 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
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.
15 */
16
Selene Huang31ab4042020-04-29 04:22:39 -070017#pragma once
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
Selene Huang31ab4042020-04-29 04:22:39 -070021#include <binder/IServiceManager.h>
22#include <binder/ProcessState.h>
23#include <gtest/gtest.h>
24
Janis Danisevskis24c04702020-12-16 18:28:39 -080025#include <aidl/android/hardware/security/keymint/ErrorCode.h>
26#include <aidl/android/hardware/security/keymint/IKeyMintDevice.h>
Shawn Willden1d3f85e2020-12-09 14:18:44 -070027
Shawn Willden08a7e432020-12-11 13:05:27 +000028#include <keymint_support/authorization_set.h>
Selene Huang31ab4042020-04-29 04:22:39 -070029
Shawn Willden0e80b5d2020-12-17 09:07:27 -070030namespace aidl::android::hardware::security::keymint {
31
32::std::ostream& operator<<(::std::ostream& os, const AuthorizationSet& set);
33
34namespace test {
Selene Huang31ab4042020-04-29 04:22:39 -070035
36using ::android::sp;
Janis Danisevskis24c04702020-12-16 18:28:39 -080037using Status = ::ndk::ScopedAStatus;
Selene Huang31ab4042020-04-29 04:22:39 -070038using ::std::shared_ptr;
39using ::std::string;
40using ::std::vector;
41
42constexpr uint64_t kOpHandleSentinel = 0xFFFFFFFFFFFFFFFF;
43
Selene Huang31ab4042020-04-29 04:22:39 -070044class KeyMintAidlTestBase : public ::testing::TestWithParam<string> {
45 public:
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +000046 struct KeyData {
47 vector<uint8_t> blob;
48 vector<KeyCharacteristics> characteristics;
49 };
50
Selene Huang31ab4042020-04-29 04:22:39 -070051 void SetUp() override;
52 void TearDown() override {
53 if (key_blob_.size()) {
54 CheckedDeleteKey();
55 }
56 AbortIfNeeded();
57 }
58
Janis Danisevskis24c04702020-12-16 18:28:39 -080059 void InitializeKeyMint(std::shared_ptr<IKeyMintDevice> keyMint);
Selene Huang31ab4042020-04-29 04:22:39 -070060 IKeyMintDevice& keyMint() { return *keymint_; }
61 uint32_t os_version() { return os_version_; }
62 uint32_t os_patch_level() { return os_patch_level_; }
63
Janis Danisevskis24c04702020-12-16 18:28:39 -080064 ErrorCode GetReturnErrorCode(const Status& result);
Selene Huang31ab4042020-04-29 04:22:39 -070065 ErrorCode GenerateKey(const AuthorizationSet& key_desc, vector<uint8_t>* key_blob,
Shawn Willden7f424372021-01-10 18:06:50 -070066 vector<KeyCharacteristics>* key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -070067
68 ErrorCode GenerateKey(const AuthorizationSet& key_desc);
Selene Huang31ab4042020-04-29 04:22:39 -070069 ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format,
70 const string& key_material, vector<uint8_t>* key_blob,
Shawn Willden7f424372021-01-10 18:06:50 -070071 vector<KeyCharacteristics>* key_characteristics);
Selene Huang31ab4042020-04-29 04:22:39 -070072 ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format,
73 const string& key_material);
74
75 ErrorCode ImportWrappedKey(string wrapped_key, string wrapping_key,
76 const AuthorizationSet& wrapping_key_desc, string masking_key,
77 const AuthorizationSet& unwrapping_params);
78
79 ErrorCode DeleteKey(vector<uint8_t>* key_blob, bool keep_key_blob = false);
80 ErrorCode DeleteKey(bool keep_key_blob = false);
81
82 ErrorCode DeleteAllKeys();
83
84 void CheckedDeleteKey(vector<uint8_t>* key_blob, bool keep_key_blob = false);
85 void CheckedDeleteKey();
86
87 ErrorCode Begin(KeyPurpose purpose, const vector<uint8_t>& key_blob,
88 const AuthorizationSet& in_params, AuthorizationSet* out_params,
Janis Danisevskis24c04702020-12-16 18:28:39 -080089 std::shared_ptr<IKeyMintOperation>& op);
Selene Huang31ab4042020-04-29 04:22:39 -070090 ErrorCode Begin(KeyPurpose purpose, const vector<uint8_t>& key_blob,
91 const AuthorizationSet& in_params, AuthorizationSet* out_params);
92 ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params,
93 AuthorizationSet* out_params);
94 ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params);
95
96 ErrorCode Update(const AuthorizationSet& in_params, const string& input,
97 AuthorizationSet* out_params, string* output, int32_t* input_consumed);
98 ErrorCode Update(const string& input, string* out, int32_t* input_consumed);
99
100 ErrorCode Finish(const AuthorizationSet& in_params, const string& input,
101 const string& signature, AuthorizationSet* out_params, string* output);
102 ErrorCode Finish(const string& message, string* output);
103 ErrorCode Finish(const string& message, const string& signature, string* output);
104 ErrorCode Finish(string* output) { return Finish(string(), output); }
105
106 ErrorCode Abort();
Janis Danisevskis24c04702020-12-16 18:28:39 -0800107 ErrorCode Abort(const shared_ptr<IKeyMintOperation>& op);
Selene Huang31ab4042020-04-29 04:22:39 -0700108 void AbortIfNeeded();
109
110 string ProcessMessage(const vector<uint8_t>& key_blob, KeyPurpose operation,
111 const string& message, const AuthorizationSet& in_params,
112 AuthorizationSet* out_params);
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +0000113 std::tuple<ErrorCode, std::string /* processedMessage */, AuthorizationSet /* out_params */>
114 ProcessMessage(const vector<uint8_t>& key_blob, KeyPurpose operation,
115 const std::string& message, const AuthorizationSet& in_params);
Selene Huang31ab4042020-04-29 04:22:39 -0700116 string SignMessage(const vector<uint8_t>& key_blob, const string& message,
117 const AuthorizationSet& params);
118 string SignMessage(const string& message, const AuthorizationSet& params);
119
120 string MacMessage(const string& message, Digest digest, size_t mac_length);
121
122 void CheckHmacTestVector(const string& key, const string& message, Digest digest,
123 const string& expected_mac);
124
125 void CheckAesCtrTestVector(const string& key, const string& nonce, const string& message,
126 const string& expected_ciphertext);
127
128 void CheckTripleDesTestVector(KeyPurpose purpose, BlockMode block_mode,
129 PaddingMode padding_mode, const string& key, const string& iv,
130 const string& input, const string& expected_output);
131
132 void VerifyMessage(const vector<uint8_t>& key_blob, const string& message,
133 const string& signature, const AuthorizationSet& params);
134 void VerifyMessage(const string& message, const string& signature,
135 const AuthorizationSet& params);
136
137 string EncryptMessage(const vector<uint8_t>& key_blob, const string& message,
138 const AuthorizationSet& in_params, AuthorizationSet* out_params);
139 string EncryptMessage(const string& message, const AuthorizationSet& params,
140 AuthorizationSet* out_params);
141 string EncryptMessage(const string& message, const AuthorizationSet& params);
142 string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding);
143 string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,
144 vector<uint8_t>* iv_out);
145 string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,
146 const vector<uint8_t>& iv_in);
147 string EncryptMessage(const string& message, BlockMode block_mode, PaddingMode padding,
148 uint8_t mac_length_bits, const vector<uint8_t>& iv_in);
149
150 string DecryptMessage(const vector<uint8_t>& key_blob, const string& ciphertext,
151 const AuthorizationSet& params);
152 string DecryptMessage(const string& ciphertext, const AuthorizationSet& params);
153 string DecryptMessage(const string& ciphertext, BlockMode block_mode, PaddingMode padding_mode,
154 const vector<uint8_t>& iv);
155
156 std::pair<ErrorCode, vector<uint8_t>> UpgradeKey(const vector<uint8_t>& key_blob);
157
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +0000158 template <typename TagType>
159 std::tuple<KeyData /* aesKey */, KeyData /* hmacKey */, KeyData /* rsaKey */,
160 KeyData /* ecdsaKey */>
161 CreateTestKeys(TagType tagToTest, ErrorCode expectedReturn) {
162 /* AES */
163 KeyData aesKeyData;
164 ErrorCode errorCode = GenerateKey(AuthorizationSetBuilder()
165 .AesEncryptionKey(128)
166 .Authorization(tagToTest)
167 .BlockMode(BlockMode::ECB)
168 .Padding(PaddingMode::NONE)
169 .Authorization(TAG_NO_AUTH_REQUIRED),
170 &aesKeyData.blob, &aesKeyData.characteristics);
171 EXPECT_EQ(expectedReturn, errorCode);
172
173 /* HMAC */
174 KeyData hmacKeyData;
175 errorCode = GenerateKey(AuthorizationSetBuilder()
176 .HmacKey(128)
177 .Authorization(tagToTest)
178 .Digest(Digest::SHA_2_256)
179 .Authorization(TAG_MIN_MAC_LENGTH, 128)
180 .Authorization(TAG_NO_AUTH_REQUIRED),
181 &hmacKeyData.blob, &hmacKeyData.characteristics);
182 EXPECT_EQ(expectedReturn, errorCode);
183
184 /* RSA */
185 KeyData rsaKeyData;
186 errorCode = GenerateKey(AuthorizationSetBuilder()
187 .RsaSigningKey(2048, 65537)
188 .Authorization(tagToTest)
189 .Digest(Digest::NONE)
190 .Padding(PaddingMode::NONE)
191 .Authorization(TAG_NO_AUTH_REQUIRED)
192 .SetDefaultValidity(),
193 &rsaKeyData.blob, &rsaKeyData.characteristics);
194 EXPECT_EQ(expectedReturn, errorCode);
195
196 /* ECDSA */
197 KeyData ecdsaKeyData;
198 errorCode = GenerateKey(AuthorizationSetBuilder()
199 .EcdsaSigningKey(256)
200 .Authorization(tagToTest)
201 .Digest(Digest::SHA_2_256)
202 .Authorization(TAG_NO_AUTH_REQUIRED)
203 .SetDefaultValidity(),
204 &ecdsaKeyData.blob, &ecdsaKeyData.characteristics);
205 EXPECT_EQ(expectedReturn, errorCode);
206 return {aesKeyData, hmacKeyData, rsaKeyData, ecdsaKeyData};
207 }
Shawn Willden7f424372021-01-10 18:06:50 -0700208 bool IsSecure() const { return securityLevel_ != SecurityLevel::SOFTWARE; }
209 SecurityLevel SecLevel() const { return securityLevel_; }
Selene Huang31ab4042020-04-29 04:22:39 -0700210
211 vector<uint32_t> ValidKeySizes(Algorithm algorithm);
212 vector<uint32_t> InvalidKeySizes(Algorithm algorithm);
213
214 vector<EcCurve> ValidCurves();
215 vector<EcCurve> InvalidCurves();
216
217 vector<Digest> ValidDigests(bool withNone, bool withMD5);
218
219 static vector<string> build_params() {
Janis Danisevskis24c04702020-12-16 18:28:39 -0800220 auto params = ::android::getAidlHalInstanceNames(IKeyMintDevice::descriptor);
Selene Huang31ab4042020-04-29 04:22:39 -0700221 return params;
222 }
223
Janis Danisevskis24c04702020-12-16 18:28:39 -0800224 std::shared_ptr<IKeyMintOperation> op_;
Shawn Willden7f424372021-01-10 18:06:50 -0700225 vector<Certificate> cert_chain_;
Selene Huang31ab4042020-04-29 04:22:39 -0700226 vector<uint8_t> key_blob_;
Shawn Willden7f424372021-01-10 18:06:50 -0700227 vector<KeyCharacteristics> key_characteristics_;
228
229 const vector<KeyParameter>& SecLevelAuthorizations(
230 const vector<KeyCharacteristics>& key_characteristics);
231 inline const vector<KeyParameter>& SecLevelAuthorizations() {
232 return SecLevelAuthorizations(key_characteristics_);
233 }
Qi Wubeefae42021-01-28 23:16:37 +0800234 const vector<KeyParameter>& SecLevelAuthorizations(
235 const vector<KeyCharacteristics>& key_characteristics, SecurityLevel securityLevel);
236
237 AuthorizationSet HwEnforcedAuthorizations(
Shawn Willden0e80b5d2020-12-17 09:07:27 -0700238 const vector<KeyCharacteristics>& key_characteristics);
Qi Wubeefae42021-01-28 23:16:37 +0800239 AuthorizationSet SwEnforcedAuthorizations(
Shawn Willden0e80b5d2020-12-17 09:07:27 -0700240 const vector<KeyCharacteristics>& key_characteristics);
Chirag Pathak9ea6a0a2021-02-01 23:54:27 +0000241 ErrorCode UseAesKey(const vector<uint8_t>& aesKeyBlob);
242 ErrorCode UseHmacKey(const vector<uint8_t>& hmacKeyBlob);
243 ErrorCode UseRsaKey(const vector<uint8_t>& rsaKeyBlob);
244 ErrorCode UseEcdsaKey(const vector<uint8_t>& ecdsaKeyBlob);
Selene Huang31ab4042020-04-29 04:22:39 -0700245
246 private:
Janis Danisevskis24c04702020-12-16 18:28:39 -0800247 std::shared_ptr<IKeyMintDevice> keymint_;
Selene Huang31ab4042020-04-29 04:22:39 -0700248 uint32_t os_version_;
249 uint32_t os_patch_level_;
250
251 SecurityLevel securityLevel_;
252 string name_;
253 string author_;
254 long challenge_;
255};
256
257#define INSTANTIATE_KEYMINT_AIDL_TEST(name) \
258 INSTANTIATE_TEST_SUITE_P(PerInstance, name, \
259 testing::ValuesIn(KeyMintAidlTestBase::build_params()), \
Janis Danisevskis24c04702020-12-16 18:28:39 -0800260 ::android::PrintInstanceNameToString)
Selene Huang31ab4042020-04-29 04:22:39 -0700261
Shawn Willden0e80b5d2020-12-17 09:07:27 -0700262} // namespace test
263
264} // namespace aidl::android::hardware::security::keymint