1 /*
2 * Copyright 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
17 #include <gtest/gtest.h>
18
19 #include "km_compat_type_conversion.h"
20
21 #define TEST_ENUM_CONVERSION(type, variant) \
22 ASSERT_EQ(KMV1::type::variant, convert(V4_0::type::variant)); \
23 ASSERT_EQ(V4_0::type::variant, convert(KMV1::type::variant))
24
TEST(KmCompatTypeConversionTest,testEnumCoversion)25 TEST(KmCompatTypeConversionTest, testEnumCoversion) {
26 TEST_ENUM_CONVERSION(KeyPurpose, ENCRYPT);
27 TEST_ENUM_CONVERSION(KeyPurpose, DECRYPT);
28 TEST_ENUM_CONVERSION(KeyPurpose, SIGN);
29 TEST_ENUM_CONVERSION(KeyPurpose, VERIFY);
30 TEST_ENUM_CONVERSION(KeyPurpose, WRAP_KEY);
31 TEST_ENUM_CONVERSION(Algorithm, RSA);
32 TEST_ENUM_CONVERSION(Algorithm, EC);
33 TEST_ENUM_CONVERSION(Algorithm, AES);
34 TEST_ENUM_CONVERSION(Algorithm, TRIPLE_DES);
35 TEST_ENUM_CONVERSION(Algorithm, HMAC);
36 TEST_ENUM_CONVERSION(Digest, NONE);
37 TEST_ENUM_CONVERSION(Digest, MD5);
38 TEST_ENUM_CONVERSION(Digest, SHA1);
39 TEST_ENUM_CONVERSION(Digest, SHA_2_224);
40 TEST_ENUM_CONVERSION(Digest, SHA_2_256);
41 TEST_ENUM_CONVERSION(Digest, SHA_2_384);
42 TEST_ENUM_CONVERSION(Digest, SHA_2_512);
43 TEST_ENUM_CONVERSION(EcCurve, P_224);
44 TEST_ENUM_CONVERSION(EcCurve, P_256);
45 TEST_ENUM_CONVERSION(EcCurve, P_384);
46 TEST_ENUM_CONVERSION(EcCurve, P_521);
47 TEST_ENUM_CONVERSION(BlockMode, ECB);
48 TEST_ENUM_CONVERSION(BlockMode, CBC);
49 TEST_ENUM_CONVERSION(BlockMode, CTR);
50 TEST_ENUM_CONVERSION(BlockMode, GCM);
51 TEST_ENUM_CONVERSION(PaddingMode, NONE);
52 TEST_ENUM_CONVERSION(PaddingMode, RSA_OAEP);
53 TEST_ENUM_CONVERSION(PaddingMode, RSA_PSS);
54 TEST_ENUM_CONVERSION(PaddingMode, RSA_PKCS1_1_5_ENCRYPT);
55 TEST_ENUM_CONVERSION(PaddingMode, RSA_PKCS1_1_5_SIGN);
56 TEST_ENUM_CONVERSION(PaddingMode, PKCS7);
57 TEST_ENUM_CONVERSION(HardwareAuthenticatorType, PASSWORD);
58 TEST_ENUM_CONVERSION(HardwareAuthenticatorType, FINGERPRINT);
59 TEST_ENUM_CONVERSION(SecurityLevel, SOFTWARE);
60 TEST_ENUM_CONVERSION(SecurityLevel, TRUSTED_ENVIRONMENT);
61 TEST_ENUM_CONVERSION(SecurityLevel, STRONGBOX);
62 TEST_ENUM_CONVERSION(KeyOrigin, GENERATED);
63 TEST_ENUM_CONVERSION(KeyOrigin, DERIVED);
64 TEST_ENUM_CONVERSION(KeyOrigin, IMPORTED);
65 TEST_ENUM_CONVERSION(KeyOrigin, GENERATED);
66 TEST_ENUM_CONVERSION(KeyOrigin, SECURELY_IMPORTED);
67
68 // RESERVED and UNKNOWN correspond but changed their names.
69 ASSERT_EQ(KMV1::KeyOrigin::RESERVED, convert(V4_0::KeyOrigin::UNKNOWN));
70 ASSERT_EQ(V4_0::KeyOrigin::UNKNOWN, convert(KMV1::KeyOrigin::RESERVED));
71 }
72
73 #define TEST_KEY_PARAMETER_CONVERSION_V4_0(tag) \
74 do { \
75 auto kmv1_param = KMV1::makeKeyParameter( \
76 KMV1::tag, KMV1::TypedTag2ValueType<decltype(KMV1::tag)>::type{}); \
77 auto legacy_param = V4_0::makeKeyParameter( \
78 V4_0::tag, V4_0::TypedTag2ValueType<decltype(V4_0::tag)>::type{}); \
79 ASSERT_EQ(legacy_param, convertKeyParameterToLegacy(kmv1_param)); \
80 ASSERT_EQ(kmv1_param, convertKeyParameterFromLegacy(legacy_param)); \
81 } while (false)
82
83 #define TEST_KEY_PARAMETER_CONVERSION_V4_1(tag) \
84 do { \
85 auto kmv1_param = KMV1::makeKeyParameter( \
86 KMV1::tag, KMV1::TypedTag2ValueType<decltype(KMV1::tag)>::type{}); \
87 auto legacy_param = V4_0::makeKeyParameter( \
88 V4_1::tag, V4_0::TypedTag2ValueType<decltype(V4_1::tag)>::type{}); \
89 ASSERT_EQ(legacy_param, convertKeyParameterToLegacy(kmv1_param)); \
90 ASSERT_EQ(kmv1_param, convertKeyParameterFromLegacy(legacy_param)); \
91 } while (false)
92
TEST(KmCompatTypeConversionTest,testKeyParameterConversion)93 TEST(KmCompatTypeConversionTest, testKeyParameterConversion) {
94 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ACTIVE_DATETIME);
95 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ALGORITHM);
96 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ALLOW_WHILE_ON_BODY);
97 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_APPLICATION_DATA);
98 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_APPLICATION_ID);
99 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ASSOCIATED_DATA);
100 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_APPLICATION_ID);
101 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_CHALLENGE);
102 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_BRAND);
103 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_DEVICE);
104 // TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_IMEI);
105 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_MANUFACTURER);
106 // TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_MEID);
107 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_PRODUCT);
108 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_MODEL);
109 // TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ATTESTATION_ID_SERIAL);
110 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_AUTH_TIMEOUT);
111 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_BLOCK_MODE);
112 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_BOOTLOADER_ONLY);
113 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_BOOT_PATCHLEVEL);
114 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_CALLER_NONCE);
115 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_CONFIRMATION_TOKEN);
116 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_CREATION_DATETIME);
117 TEST_KEY_PARAMETER_CONVERSION_V4_1(TAG_DEVICE_UNIQUE_ATTESTATION);
118 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_DIGEST);
119 TEST_KEY_PARAMETER_CONVERSION_V4_1(TAG_EARLY_BOOT_ONLY);
120 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_EC_CURVE);
121 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_HARDWARE_TYPE);
122 TEST_KEY_PARAMETER_CONVERSION_V4_1(TAG_IDENTITY_CREDENTIAL_KEY);
123 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_INCLUDE_UNIQUE_ID);
124 // TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_INVALID);
125 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_KEY_SIZE);
126 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_MAC_LENGTH);
127 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_MAX_USES_PER_BOOT);
128 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_MIN_MAC_LENGTH);
129 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_MIN_SECONDS_BETWEEN_OPS);
130 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_NONCE);
131 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_NO_AUTH_REQUIRED);
132 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ORIGIN);
133 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ORIGINATION_EXPIRE_DATETIME);
134 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_OS_PATCHLEVEL);
135 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_OS_VERSION);
136 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_PADDING);
137 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_PURPOSE);
138 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_RESET_SINCE_ID_ROTATION);
139 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ROLLBACK_RESISTANCE);
140 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_ROOT_OF_TRUST);
141 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_RSA_PUBLIC_EXPONENT);
142 TEST_KEY_PARAMETER_CONVERSION_V4_1(TAG_STORAGE_KEY);
143 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_TRUSTED_CONFIRMATION_REQUIRED);
144 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_TRUSTED_USER_PRESENCE_REQUIRED);
145 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_UNIQUE_ID);
146 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_UNLOCKED_DEVICE_REQUIRED);
147 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_USAGE_EXPIRE_DATETIME);
148 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_USER_AUTH_TYPE);
149 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_USER_ID);
150 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_USER_SECURE_ID);
151 TEST_KEY_PARAMETER_CONVERSION_V4_0(TAG_VENDOR_PATCHLEVEL);
152 }
153
154 #define TEST_ERROR_CODE_CONVERSION(variant) \
155 ASSERT_EQ(KMV1::ErrorCode::variant, convert(V4_0::ErrorCode::variant))
156
TEST(KmCompatTypeConversionTest,testErrorCodeConversion)157 TEST(KmCompatTypeConversionTest, testErrorCodeConversion) {
158 TEST_ERROR_CODE_CONVERSION(OK);
159 TEST_ERROR_CODE_CONVERSION(ROOT_OF_TRUST_ALREADY_SET);
160 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_PURPOSE);
161 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_PURPOSE);
162 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_ALGORITHM);
163 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_ALGORITHM);
164 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_KEY_SIZE);
165 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_BLOCK_MODE);
166 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_BLOCK_MODE);
167 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_MAC_LENGTH);
168 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_PADDING_MODE);
169 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_PADDING_MODE);
170 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_DIGEST);
171 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_DIGEST);
172 TEST_ERROR_CODE_CONVERSION(INVALID_EXPIRATION_TIME);
173 TEST_ERROR_CODE_CONVERSION(INVALID_USER_ID);
174 TEST_ERROR_CODE_CONVERSION(INVALID_AUTHORIZATION_TIMEOUT);
175 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_KEY_FORMAT);
176 TEST_ERROR_CODE_CONVERSION(INCOMPATIBLE_KEY_FORMAT);
177 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM);
178 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_KEY_VERIFICATION_ALGORITHM);
179 TEST_ERROR_CODE_CONVERSION(INVALID_INPUT_LENGTH);
180 TEST_ERROR_CODE_CONVERSION(KEY_EXPORT_OPTIONS_INVALID);
181 TEST_ERROR_CODE_CONVERSION(DELEGATION_NOT_ALLOWED);
182 TEST_ERROR_CODE_CONVERSION(KEY_NOT_YET_VALID);
183 TEST_ERROR_CODE_CONVERSION(KEY_EXPIRED);
184 TEST_ERROR_CODE_CONVERSION(KEY_USER_NOT_AUTHENTICATED);
185 TEST_ERROR_CODE_CONVERSION(OUTPUT_PARAMETER_NULL);
186 TEST_ERROR_CODE_CONVERSION(INVALID_OPERATION_HANDLE);
187 TEST_ERROR_CODE_CONVERSION(INSUFFICIENT_BUFFER_SPACE);
188 TEST_ERROR_CODE_CONVERSION(VERIFICATION_FAILED);
189 TEST_ERROR_CODE_CONVERSION(TOO_MANY_OPERATIONS);
190 TEST_ERROR_CODE_CONVERSION(UNEXPECTED_NULL_POINTER);
191 TEST_ERROR_CODE_CONVERSION(INVALID_KEY_BLOB);
192 TEST_ERROR_CODE_CONVERSION(IMPORTED_KEY_NOT_ENCRYPTED);
193 TEST_ERROR_CODE_CONVERSION(IMPORTED_KEY_DECRYPTION_FAILED);
194 TEST_ERROR_CODE_CONVERSION(IMPORTED_KEY_NOT_SIGNED);
195 TEST_ERROR_CODE_CONVERSION(IMPORTED_KEY_VERIFICATION_FAILED);
196 TEST_ERROR_CODE_CONVERSION(INVALID_ARGUMENT);
197 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_TAG);
198 TEST_ERROR_CODE_CONVERSION(INVALID_TAG);
199 TEST_ERROR_CODE_CONVERSION(MEMORY_ALLOCATION_FAILED);
200 TEST_ERROR_CODE_CONVERSION(IMPORT_PARAMETER_MISMATCH);
201 TEST_ERROR_CODE_CONVERSION(SECURE_HW_ACCESS_DENIED);
202 TEST_ERROR_CODE_CONVERSION(OPERATION_CANCELLED);
203 TEST_ERROR_CODE_CONVERSION(CONCURRENT_ACCESS_CONFLICT);
204 TEST_ERROR_CODE_CONVERSION(SECURE_HW_BUSY);
205 TEST_ERROR_CODE_CONVERSION(SECURE_HW_COMMUNICATION_FAILED);
206 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_EC_FIELD);
207 TEST_ERROR_CODE_CONVERSION(MISSING_NONCE);
208 TEST_ERROR_CODE_CONVERSION(INVALID_NONCE);
209 TEST_ERROR_CODE_CONVERSION(MISSING_MAC_LENGTH);
210 TEST_ERROR_CODE_CONVERSION(KEY_RATE_LIMIT_EXCEEDED);
211 TEST_ERROR_CODE_CONVERSION(CALLER_NONCE_PROHIBITED);
212 TEST_ERROR_CODE_CONVERSION(KEY_MAX_OPS_EXCEEDED);
213 TEST_ERROR_CODE_CONVERSION(INVALID_MAC_LENGTH);
214 TEST_ERROR_CODE_CONVERSION(MISSING_MIN_MAC_LENGTH);
215 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_MIN_MAC_LENGTH);
216 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_KDF);
217 TEST_ERROR_CODE_CONVERSION(UNSUPPORTED_EC_CURVE);
218 TEST_ERROR_CODE_CONVERSION(KEY_REQUIRES_UPGRADE);
219 TEST_ERROR_CODE_CONVERSION(ATTESTATION_CHALLENGE_MISSING);
220 ASSERT_EQ(KMV1::ErrorCode::KEYMINT_NOT_CONFIGURED,
221 convert(V4_0::ErrorCode::KEYMASTER_NOT_CONFIGURED));
222 TEST_ERROR_CODE_CONVERSION(ATTESTATION_APPLICATION_ID_MISSING);
223 TEST_ERROR_CODE_CONVERSION(CANNOT_ATTEST_IDS);
224 TEST_ERROR_CODE_CONVERSION(ROLLBACK_RESISTANCE_UNAVAILABLE);
225 TEST_ERROR_CODE_CONVERSION(HARDWARE_TYPE_UNAVAILABLE);
226 TEST_ERROR_CODE_CONVERSION(PROOF_OF_PRESENCE_REQUIRED);
227 TEST_ERROR_CODE_CONVERSION(CONCURRENT_PROOF_OF_PRESENCE_REQUESTED);
228 TEST_ERROR_CODE_CONVERSION(NO_USER_CONFIRMATION);
229 TEST_ERROR_CODE_CONVERSION(DEVICE_LOCKED);
230 TEST_ERROR_CODE_CONVERSION(UNIMPLEMENTED);
231 TEST_ERROR_CODE_CONVERSION(VERSION_MISMATCH);
232 TEST_ERROR_CODE_CONVERSION(UNKNOWN_ERROR);
233 }
234