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