blob: 3a94ec1c8116792aa5869d83adb11eba9cbcbd67 [file] [log] [blame]
Eran Messeri03fc4c82018-08-16 18:53:15 +01001/*
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
Eran Messeri03fc4c82018-08-16 18:53:15 +010022#include <keymaster/logger.h>
David Zeuthenf2a28672020-01-30 16:20:07 -050023#include <keystore/keystore_attestation_id.h>
Eran Messeri03fc4c82018-08-16 18:53:15 +010024
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000025#include <android/security/keystore/KeyAttestationApplicationId.h>
26#include <android/security/keystore/KeyAttestationPackageInfo.h>
27#include <android/security/keystore/Signature.h>
Eran Messeri03fc4c82018-08-16 18:53:15 +010028
29using ::android::String16;
30using ::android::security::KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE;
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000031using ::android::security::keystore::KeyAttestationApplicationId;
32using ::android::security::keystore::KeyAttestationPackageInfo;
Eran Messeri03fc4c82018-08-16 18:53:15 +010033using std::vector;
34
35namespace keystore {
36
37namespace test {
38
39namespace {
40
41constexpr const char* kDummyPackageName = "DummyPackage";
42
43constexpr 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
58constexpr const char* kReasonablePackageName =
59 "a.reasonable.length.package.name"
60 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
61 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
62 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
63 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
64
65constexpr const size_t kTooManyPackages = 4;
66
67// Signatures should be 32 bytes
68constexpr 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};
71constexpr const size_t kTooManySignatures = 35;
72
73} // namespace
74
Eran Messeri03fc4c82018-08-16 18:53:15 +010075using ::android::security::build_attestation_application_id;
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000076using ::android::security::keystore::Signature;
Eran Messeri03fc4c82018-08-16 18:53:15 +010077
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000078KeyAttestationPackageInfo 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;
Eran Messeri03fc4c82018-08-16 18:53:15 +010086}
87
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000088KeyAttestationPackageInfo make_package_info(const char* package_name) {
89 return make_package_info_with_signatures(package_name, std::vector<Signature>());
Eran Messeri03fc4c82018-08-16 18:53:15 +010090}
91
92TEST(AaidTruncationTest, shortPackageInfoTest) {
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +000093 KeyAttestationApplicationId app_id;
94 auto pInfo = make_package_info(kDummyPackageName);
95 app_id.packageInfos.push_back(std::move(pInfo));
Eran Messeri03fc4c82018-08-16 18:53:15 +010096
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
103TEST(AaidTruncationTest, tooLongPackageNameTest) {
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000104 KeyAttestationApplicationId app_id;
105 auto pInfo = make_package_info(kLongPackageName);
106 app_id.packageInfos.push_back(std::move(pInfo));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100107
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
114TEST(AaidTruncationTest, tooManySignaturesTest) {
115 std::vector<uint8_t> dummy_sig_data(kDummySignature, kDummySignature + 32);
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000116 std::vector<Signature> signatures;
Eran Messeri03fc4c82018-08-16 18:53:15 +0100117 // Add 35 signatures which will surely exceed the 1K limit.
118 for (size_t i = 0; i < kTooManySignatures; ++i) {
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000119 auto sign = Signature();
120 sign.data = dummy_sig_data;
121 signatures.push_back(std::move(sign));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100122 }
123
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000124 auto pInfo = make_package_info_with_signatures(kDummyPackageName, std::move(signatures));
125 KeyAttestationApplicationId app_id;
126 app_id.packageInfos.push_back(std::move(pInfo));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100127
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
134TEST(AaidTruncationTest, combinedPackagesAndSignaturesTest) {
135 std::vector<uint8_t> dummy_sig_data(kDummySignature, kDummySignature + 32);
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000136 ::std::vector<KeyAttestationPackageInfo> packages;
Eran Messeri03fc4c82018-08-16 18:53:15 +0100137
138 for (size_t i = 0; i < kTooManyPackages; ++i) {
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000139 std::vector<Signature> signatures;
Eran Messeri03fc4c82018-08-16 18:53:15 +0100140 // Add a few signatures for each package
141 for (int j = 0; j < 3; ++j) {
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000142 auto sign = Signature();
143 sign.data = dummy_sig_data;
144 signatures.push_back(std::move(sign));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100145 }
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000146 packages.push_back(std::move(
147 make_package_info_with_signatures(kReasonablePackageName, std::move(signatures))));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100148 }
Rajesh Nyamagoud3f6c15c2023-03-11 01:26:48 +0000149 KeyAttestationApplicationId app_id;
150 std::move(packages.begin(), packages.end(), std::back_inserter(app_id.packageInfos));
Eran Messeri03fc4c82018-08-16 18:53:15 +0100151
Eran Messeri03fc4c82018-08-16 18:53:15 +0100152 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