blob: ea84183ef368f168a595e198180d2ccc5656ecae [file] [log] [blame]
Martijn Coenenba1c9dc2021-02-04 13:18:29 +01001/*
2 * Copyright (C) 2021 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 <string>
18
19#include <android-base/file.h>
20#include <android-base/logging.h>
21#include <binder/IServiceManager.h>
22
23#include <fcntl.h>
24#include <sys/stat.h>
25#include <sys/types.h>
26
27#include "CertUtils.h"
28#include "KeyConstants.h"
29#include "KeystoreKey.h"
30
31using android::defaultServiceManager;
32using android::IServiceManager;
33using android::sp;
34using android::String16;
35
36using android::hardware::security::keymint::Algorithm;
37using android::hardware::security::keymint::Digest;
38using android::hardware::security::keymint::KeyParameter;
39using android::hardware::security::keymint::KeyParameterValue;
40using android::hardware::security::keymint::KeyPurpose;
41using android::hardware::security::keymint::PaddingMode;
42using android::hardware::security::keymint::SecurityLevel;
43using android::hardware::security::keymint::Tag;
44
45using android::system::keystore2::CreateOperationResponse;
46using android::system::keystore2::Domain;
47using android::system::keystore2::KeyDescriptor;
48using android::system::keystore2::KeyEntryResponse;
49using android::system::keystore2::KeyMetadata;
50
51using android::base::Error;
52using android::base::Result;
53
54using android::base::unique_fd;
55
56static KeyDescriptor getKeyDescriptor() {
57 // AIDL parcelable objects don't have constructor
58 static KeyDescriptor descriptor;
59 static std::once_flag flag;
60 std::call_once(flag, [&]() {
61 descriptor.domain = Domain::SELINUX;
62 descriptor.alias = String16("ondevice-signing");
63 descriptor.nspace = 101; // odsign_key
64 });
65
66 return descriptor;
67}
68
69KeystoreKey::KeystoreKey() {}
70
71Result<KeyMetadata> KeystoreKey::createNewKey(const KeyDescriptor& descriptor) {
72 std::vector<KeyParameter> params;
73
74 KeyParameter algo;
75 algo.tag = Tag::ALGORITHM;
76 algo.value = KeyParameterValue::make<KeyParameterValue::algorithm>(Algorithm::RSA);
77 params.push_back(algo);
78
79 KeyParameter key_size;
80 key_size.tag = Tag::KEY_SIZE;
81 key_size.value = KeyParameterValue::make<KeyParameterValue::integer>(kRsaKeySize);
82 params.push_back(key_size);
83
84 KeyParameter digest;
85 digest.tag = Tag::DIGEST;
86 digest.value = KeyParameterValue::make<KeyParameterValue::digest>(Digest::SHA_2_256);
87 params.push_back(digest);
88
89 KeyParameter padding;
90 padding.tag = Tag::PADDING;
91 padding.value =
92 KeyParameterValue::make<KeyParameterValue::paddingMode>(PaddingMode::RSA_PKCS1_1_5_SIGN);
93 params.push_back(padding);
94
95 KeyParameter exponent;
96 exponent.tag = Tag::RSA_PUBLIC_EXPONENT;
97 exponent.value = KeyParameterValue::make<KeyParameterValue::longInteger>(kRsaKeyExponent);
98 params.push_back(exponent);
99
100 KeyParameter purpose;
101 purpose.tag = Tag::PURPOSE;
102 purpose.value = KeyParameterValue::make<KeyParameterValue::keyPurpose>(KeyPurpose::SIGN);
103 params.push_back(purpose);
104
105 KeyParameter auth;
106 auth.tag = Tag::NO_AUTH_REQUIRED;
107 auth.value = KeyParameterValue::make<KeyParameterValue::boolValue>(true);
108 params.push_back(auth);
109
110 KeyMetadata metadata;
111 auto status = mSecurityLevel->generateKey(descriptor, {}, params, 0, {}, &metadata);
112 if (!status.isOk()) {
113 return Error() << "Failed to create new key";
114 }
115
116 return metadata;
117}
118
119bool KeystoreKey::initialize() {
120 sp<IServiceManager> sm = defaultServiceManager();
121 if (sm == nullptr) {
122 return false;
123 }
124 auto service = sm->getService(String16("android.system.keystore2"));
125 if (service == nullptr) {
126 return false;
127 }
128 mService = interface_cast<android::system::keystore2::IKeystoreService>(service);
129 if (mService == nullptr) {
130 return false;
131 }
132
133 auto status = mService->getSecurityLevel(SecurityLevel::STRONGBOX, &mSecurityLevel);
134 if (!status.isOk()) {
135 // TODO fallback to TEE
136 return false;
137 }
138
139 auto descriptor = getKeyDescriptor();
140 // See if we can fetch an existing key
141 KeyEntryResponse keyEntryResponse;
142 LOG(INFO) << "Trying to retrieve existing keystore key...";
143 status = mService->getKeyEntry(descriptor, &keyEntryResponse);
144 if (!status.isOk()) {
145 LOG(INFO) << "Existing keystore key not found, creating new key";
146 auto newKeyStatus = createNewKey(descriptor);
147 if (!newKeyStatus.ok()) {
148 LOG(ERROR) << "Failed to create new key";
149 return false;
150 }
151 mKeyMetadata = *newKeyStatus;
152 } else {
153 mKeyMetadata = keyEntryResponse.metadata;
154 }
155
156 LOG(ERROR) << "Initialized Keystore key.";
157 return true;
158}
159
160Result<SigningKey*> KeystoreKey::getInstance() {
161 static KeystoreKey keystoreKey;
162
163 if (!keystoreKey.initialize()) {
164 return Error() << "Failed to initialize keystore key.";
165 } else {
166 return &keystoreKey;
167 }
168}
169
170static std::vector<KeyParameter> getSignOpParameters() {
171 std::vector<KeyParameter> opParameters;
172
173 KeyParameter algo;
174 algo.tag = Tag::ALGORITHM;
175 algo.value = KeyParameterValue::make<KeyParameterValue::algorithm>(Algorithm::RSA);
176 opParameters.push_back(algo);
177
178 KeyParameter digest;
179 digest.tag = Tag::DIGEST;
180 digest.value = KeyParameterValue::make<KeyParameterValue::digest>(Digest::SHA_2_256);
181 opParameters.push_back(digest);
182
183 KeyParameter padding;
184 padding.tag = Tag::PADDING;
185 padding.value =
186 KeyParameterValue::make<KeyParameterValue::paddingMode>(PaddingMode::RSA_PKCS1_1_5_SIGN);
187 opParameters.push_back(padding);
188
189 KeyParameter purpose;
190 purpose.tag = Tag::PURPOSE;
191 purpose.value = KeyParameterValue::make<KeyParameterValue::keyPurpose>(KeyPurpose::SIGN);
192 opParameters.push_back(purpose);
193
194 return opParameters;
195}
196
197Result<std::string> KeystoreKey::sign(const std::string& message) const {
198 static auto opParameters = getSignOpParameters();
199
200 CreateOperationResponse opResponse;
201
202 auto status =
203 mSecurityLevel->createOperation(getKeyDescriptor(), opParameters, false, &opResponse);
204 if (!status.isOk()) {
205 return Error() << "Failed to create keystore signing operation: "
206 << status.serviceSpecificErrorCode();
207 }
208 auto operation = opResponse.iOperation;
209
210 std::optional<std::vector<uint8_t>> out;
211 status = operation->update({message.begin(), message.end()}, &out);
212 if (!status.isOk()) {
213 return Error() << "Failed to call keystore update operation.";
214 }
215
216 std::optional<std::vector<uint8_t>> signature;
217 status = operation->finish({}, {}, &signature);
218 if (!status.isOk()) {
219 return Error() << "Failed to call keystore finish operation.";
220 }
221
222 if (!signature.has_value()) {
223 return Error() << "Didn't receive a signature from keystore finish operation.";
224 }
225
226 std::string result{signature.value().begin(), signature.value().end()};
227
228 return result;
229}
230
231Result<std::vector<uint8_t>> KeystoreKey::getPublicKey() const {
232 return extractPublicKeyFromX509(mKeyMetadata.certificate.value());
233}