xref: /aosp_15_r20/system/security/keystore/tests/aaid_truncation_test.cpp (revision e1997b9af69e3155ead6e072d106a0077849ffba)
1 /*
2  * Copyright (C) 2018 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 <string>
20 #include <utils/String16.h>
21 
22 #include <keymaster/logger.h>
23 #include <keystore/keystore_attestation_id.h>
24 
25 #include <android/security/keystore/KeyAttestationApplicationId.h>
26 #include <android/security/keystore/KeyAttestationPackageInfo.h>
27 #include <android/security/keystore/Signature.h>
28 
29 using ::android::String16;
30 using ::android::security::KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE;
31 using ::android::security::keystore::KeyAttestationApplicationId;
32 using ::android::security::keystore::KeyAttestationPackageInfo;
33 using std::vector;
34 
35 namespace keystore {
36 
37 namespace test {
38 
39 namespace {
40 
41 constexpr const char* kDummyPackageName = "DummyPackage";
42 
43 constexpr const char* kLongPackageName =
44     "a.long.package.name"
45     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
46     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
47     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
48     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
49     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
50     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
51     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
52     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
53     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
54     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
55     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
56     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
57 
58 constexpr const char* kReasonablePackageName =
59     "a.reasonable.length.package.name"
60     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
61     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
62     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
63     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
64 
65 constexpr const size_t kTooManyPackages = 4;
66 
67 // Signatures should be 32 bytes
68 constexpr const uint8_t kDummySignature[32] = {
69     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
70     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
71 constexpr const size_t kTooManySignatures = 35;
72 
73 }  // namespace
74 
75 using ::android::security::build_attestation_application_id;
76 using ::android::security::keystore::Signature;
77 
make_package_info_with_signatures(const char * package_name,std::vector<Signature> signatures)78 KeyAttestationPackageInfo make_package_info_with_signatures(const char* package_name,
79                                                             std::vector<Signature> signatures) {
80     auto pInfo = KeyAttestationPackageInfo();
81     pInfo.packageName = String16(package_name);
82     pInfo.versionCode = 1;
83     std::move(signatures.begin(), signatures.end(), std::back_inserter(pInfo.signatures));
84 
85     return pInfo;
86 }
87 
make_package_info(const char * package_name)88 KeyAttestationPackageInfo make_package_info(const char* package_name) {
89     return make_package_info_with_signatures(package_name, std::vector<Signature>());
90 }
91 
TEST(AaidTruncationTest,shortPackageInfoTest)92 TEST(AaidTruncationTest, shortPackageInfoTest) {
93     KeyAttestationApplicationId app_id;
94     auto pInfo = make_package_info(kDummyPackageName);
95     app_id.packageInfos.push_back(std::move(pInfo));
96 
97     auto result = build_attestation_application_id(app_id);
98     ASSERT_TRUE(result.isOk());
99     std::vector<uint8_t>& encoded_app_id = result;
100     ASSERT_LT(encoded_app_id.size(), KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE);
101 }
102 
TEST(AaidTruncationTest,tooLongPackageNameTest)103 TEST(AaidTruncationTest, tooLongPackageNameTest) {
104     KeyAttestationApplicationId app_id;
105     auto pInfo = make_package_info(kLongPackageName);
106     app_id.packageInfos.push_back(std::move(pInfo));
107 
108     auto result = build_attestation_application_id(app_id);
109     ASSERT_TRUE(result.isOk());
110     std::vector<uint8_t>& encoded_app_id = result;
111     ASSERT_LT(encoded_app_id.size(), KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE);
112 }
113 
TEST(AaidTruncationTest,tooManySignaturesTest)114 TEST(AaidTruncationTest, tooManySignaturesTest) {
115     std::vector<uint8_t> dummy_sig_data(kDummySignature, kDummySignature + 32);
116     std::vector<Signature> signatures;
117     // Add 35 signatures which will surely exceed the 1K limit.
118     for (size_t i = 0; i < kTooManySignatures; ++i) {
119         auto sign = Signature();
120         sign.data = dummy_sig_data;
121         signatures.push_back(std::move(sign));
122     }
123 
124     auto pInfo = make_package_info_with_signatures(kDummyPackageName, std::move(signatures));
125     KeyAttestationApplicationId app_id;
126     app_id.packageInfos.push_back(std::move(pInfo));
127 
128     auto result = build_attestation_application_id(app_id);
129     ASSERT_TRUE(result.isOk());
130     std::vector<uint8_t>& encoded_app_id = result;
131     ASSERT_LT(encoded_app_id.size(), KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE);
132 }
133 
TEST(AaidTruncationTest,combinedPackagesAndSignaturesTest)134 TEST(AaidTruncationTest, combinedPackagesAndSignaturesTest) {
135     std::vector<uint8_t> dummy_sig_data(kDummySignature, kDummySignature + 32);
136     ::std::vector<KeyAttestationPackageInfo> packages;
137 
138     for (size_t i = 0; i < kTooManyPackages; ++i) {
139         std::vector<Signature> signatures;
140         // Add a few signatures for each package
141         for (int j = 0; j < 3; ++j) {
142             auto sign = Signature();
143             sign.data = dummy_sig_data;
144             signatures.push_back(std::move(sign));
145         }
146         packages.push_back(std::move(
147             make_package_info_with_signatures(kReasonablePackageName, std::move(signatures))));
148     }
149     KeyAttestationApplicationId app_id;
150     std::move(packages.begin(), packages.end(), std::back_inserter(app_id.packageInfos));
151 
152     auto result = build_attestation_application_id(app_id);
153     ASSERT_TRUE(result.isOk());
154     std::vector<uint8_t>& encoded_app_id = result;
155     ASSERT_LT(encoded_app_id.size(), KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE);
156 }
157 
158 }  // namespace test
159 }  // namespace keystore
160