blob: a24febaa2dcf56204040932acf193ee6118b7059 [file] [log] [blame]
Kenny Roota91203b2012-02-15 15:00:46 -08001/*
2 * Copyright (C) 2009 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
Kenny Root07438c82012-11-02 15:41:02 -070017//#define LOG_NDEBUG 0
18#define LOG_TAG "keystore"
19
Kenny Roota91203b2012-02-15 15:00:46 -080020#include <stdio.h>
21#include <stdint.h>
22#include <string.h>
23#include <unistd.h>
24#include <signal.h>
25#include <errno.h>
26#include <dirent.h>
Kenny Root655b9582013-04-04 08:37:42 -070027#include <errno.h>
Kenny Roota91203b2012-02-15 15:00:46 -080028#include <fcntl.h>
29#include <limits.h>
Kenny Root822c3a92012-03-23 16:34:39 -070030#include <assert.h>
Kenny Roota91203b2012-02-15 15:00:46 -080031#include <sys/types.h>
32#include <sys/socket.h>
33#include <sys/stat.h>
34#include <sys/time.h>
35#include <arpa/inet.h>
36
37#include <openssl/aes.h>
Kenny Root822c3a92012-03-23 16:34:39 -070038#include <openssl/bio.h>
Kenny Roota91203b2012-02-15 15:00:46 -080039#include <openssl/evp.h>
40#include <openssl/md5.h>
Kenny Root822c3a92012-03-23 16:34:39 -070041#include <openssl/pem.h>
Kenny Roota91203b2012-02-15 15:00:46 -080042
Kenny Root70e3a862012-02-15 17:20:23 -080043#include <hardware/keymaster.h>
44
Kenny Root17208e02013-09-04 13:56:03 -070045#include <keymaster/softkeymaster.h>
46
Kenny Root26cfc082013-09-11 14:38:56 -070047#include <UniquePtr.h>
Kenny Root655b9582013-04-04 08:37:42 -070048#include <utils/String8.h>
Kenny Root655b9582013-04-04 08:37:42 -070049#include <utils/Vector.h>
Kenny Root70e3a862012-02-15 17:20:23 -080050
Kenny Root07438c82012-11-02 15:41:02 -070051#include <keystore/IKeystoreService.h>
52#include <binder/IPCThreadState.h>
53#include <binder/IServiceManager.h>
54
Kenny Roota91203b2012-02-15 15:00:46 -080055#include <cutils/log.h>
56#include <cutils/sockets.h>
57#include <private/android_filesystem_config.h>
58
Kenny Root07438c82012-11-02 15:41:02 -070059#include <keystore/keystore.h>
Kenny Roota91203b2012-02-15 15:00:46 -080060
Riley Spahneaabae92014-06-30 12:39:52 -070061#include <selinux/android.h>
62
Kenny Root96427ba2013-08-16 14:02:41 -070063#include "defaults.h"
64
Kenny Roota91203b2012-02-15 15:00:46 -080065/* KeyStore is a secured storage for key-value pairs. In this implementation,
66 * each file stores one key-value pair. Keys are encoded in file names, and
67 * values are encrypted with checksums. The encryption key is protected by a
68 * user-defined password. To keep things simple, buffers are always larger than
69 * the maximum space we needed, so boundary checks on buffers are omitted. */
70
71#define KEY_SIZE ((NAME_MAX - 15) / 2)
72#define VALUE_SIZE 32768
73#define PASSWORD_SIZE VALUE_SIZE
74
Kenny Root822c3a92012-03-23 16:34:39 -070075
Kenny Root96427ba2013-08-16 14:02:41 -070076struct BIGNUM_Delete {
77 void operator()(BIGNUM* p) const {
78 BN_free(p);
79 }
80};
81typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
82
Kenny Root822c3a92012-03-23 16:34:39 -070083struct BIO_Delete {
84 void operator()(BIO* p) const {
85 BIO_free(p);
86 }
87};
88typedef UniquePtr<BIO, BIO_Delete> Unique_BIO;
89
90struct EVP_PKEY_Delete {
91 void operator()(EVP_PKEY* p) const {
92 EVP_PKEY_free(p);
93 }
94};
95typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
96
97struct PKCS8_PRIV_KEY_INFO_Delete {
98 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
99 PKCS8_PRIV_KEY_INFO_free(p);
100 }
101};
102typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
103
104
Kenny Root70e3a862012-02-15 17:20:23 -0800105static int keymaster_device_initialize(keymaster_device_t** dev) {
106 int rc;
107
108 const hw_module_t* mod;
109 rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
110 if (rc) {
111 ALOGE("could not find any keystore module");
112 goto out;
113 }
114
115 rc = keymaster_open(mod, dev);
116 if (rc) {
117 ALOGE("could not open keymaster device in %s (%s)",
118 KEYSTORE_HARDWARE_MODULE_ID, strerror(-rc));
119 goto out;
120 }
121
122 return 0;
123
124out:
125 *dev = NULL;
126 return rc;
127}
128
129static void keymaster_device_release(keymaster_device_t* dev) {
130 keymaster_close(dev);
131}
132
Kenny Root07438c82012-11-02 15:41:02 -0700133/***************
134 * PERMISSIONS *
135 ***************/
136
137/* Here are the permissions, actions, users, and the main function. */
138typedef enum {
Robin Lee4e865752014-08-19 17:37:55 +0100139 P_TEST = 1 << 0,
140 P_GET = 1 << 1,
141 P_INSERT = 1 << 2,
142 P_DELETE = 1 << 3,
143 P_EXIST = 1 << 4,
144 P_SAW = 1 << 5,
145 P_RESET = 1 << 6,
146 P_PASSWORD = 1 << 7,
147 P_LOCK = 1 << 8,
148 P_UNLOCK = 1 << 9,
149 P_ZERO = 1 << 10,
150 P_SIGN = 1 << 11,
151 P_VERIFY = 1 << 12,
152 P_GRANT = 1 << 13,
153 P_DUPLICATE = 1 << 14,
154 P_CLEAR_UID = 1 << 15,
155 P_RESET_UID = 1 << 16,
156 P_SYNC_UID = 1 << 17,
157 P_PASSWORD_UID = 1 << 18,
Kenny Root07438c82012-11-02 15:41:02 -0700158} perm_t;
159
160static struct user_euid {
161 uid_t uid;
162 uid_t euid;
163} user_euids[] = {
164 {AID_VPN, AID_SYSTEM},
165 {AID_WIFI, AID_SYSTEM},
166 {AID_ROOT, AID_SYSTEM},
167};
168
Riley Spahneaabae92014-06-30 12:39:52 -0700169/* perm_labels associcated with keystore_key SELinux class verbs. */
170const char *perm_labels[] = {
171 "test",
172 "get",
173 "insert",
174 "delete",
175 "exist",
176 "saw",
177 "reset",
178 "password",
179 "lock",
180 "unlock",
181 "zero",
182 "sign",
183 "verify",
184 "grant",
185 "duplicate",
Robin Lee4e865752014-08-19 17:37:55 +0100186 "clear_uid",
187 "reset_uid",
188 "sync_uid",
189 "password_uid",
Riley Spahneaabae92014-06-30 12:39:52 -0700190};
191
Kenny Root07438c82012-11-02 15:41:02 -0700192static struct user_perm {
193 uid_t uid;
194 perm_t perms;
195} user_perms[] = {
196 {AID_SYSTEM, static_cast<perm_t>((uint32_t)(~0)) },
197 {AID_VPN, static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
198 {AID_WIFI, static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
199 {AID_ROOT, static_cast<perm_t>(P_GET) },
200};
201
202static const perm_t DEFAULT_PERMS = static_cast<perm_t>(P_TEST | P_GET | P_INSERT | P_DELETE | P_EXIST | P_SAW | P_SIGN
203 | P_VERIFY);
204
Riley Spahneaabae92014-06-30 12:39:52 -0700205static char *tctx;
206static int ks_is_selinux_enabled;
207
208static const char *get_perm_label(perm_t perm) {
209 unsigned int index = ffs(perm);
210 if (index > 0 && index <= (sizeof(perm_labels) / sizeof(perm_labels[0]))) {
211 return perm_labels[index - 1];
212 } else {
213 ALOGE("Keystore: Failed to retrieve permission label.\n");
214 abort();
215 }
216}
217
Kenny Root655b9582013-04-04 08:37:42 -0700218/**
219 * Returns the app ID (in the Android multi-user sense) for the current
220 * UNIX UID.
221 */
222static uid_t get_app_id(uid_t uid) {
223 return uid % AID_USER;
224}
225
226/**
227 * Returns the user ID (in the Android multi-user sense) for the current
228 * UNIX UID.
229 */
230static uid_t get_user_id(uid_t uid) {
231 return uid / AID_USER;
232}
233
Riley Spahneaabae92014-06-30 12:39:52 -0700234static bool keystore_selinux_check_access(uid_t uid, perm_t perm, pid_t spid) {
235 if (!ks_is_selinux_enabled) {
236 return true;
237 }
Nick Kralevich66dbf672014-06-30 17:09:14 +0000238
Riley Spahneaabae92014-06-30 12:39:52 -0700239 char *sctx = NULL;
240 const char *selinux_class = "keystore_key";
241 const char *str_perm = get_perm_label(perm);
242
243 if (!str_perm) {
244 return false;
245 }
246
247 if (getpidcon(spid, &sctx) != 0) {
248 ALOGE("SELinux: Failed to get source pid context.\n");
249 return false;
250 }
251
252 bool allowed = selinux_check_access(sctx, tctx, selinux_class, str_perm,
253 NULL) == 0;
254 freecon(sctx);
255 return allowed;
256}
257
258static bool has_permission(uid_t uid, perm_t perm, pid_t spid) {
Kenny Root655b9582013-04-04 08:37:42 -0700259 // All system users are equivalent for multi-user support.
260 if (get_app_id(uid) == AID_SYSTEM) {
261 uid = AID_SYSTEM;
262 }
263
Kenny Root07438c82012-11-02 15:41:02 -0700264 for (size_t i = 0; i < sizeof(user_perms)/sizeof(user_perms[0]); i++) {
265 struct user_perm user = user_perms[i];
266 if (user.uid == uid) {
Riley Spahneaabae92014-06-30 12:39:52 -0700267 return (user.perms & perm) &&
268 keystore_selinux_check_access(uid, perm, spid);
Kenny Root07438c82012-11-02 15:41:02 -0700269 }
270 }
271
Riley Spahneaabae92014-06-30 12:39:52 -0700272 return (DEFAULT_PERMS & perm) &&
273 keystore_selinux_check_access(uid, perm, spid);
Kenny Root07438c82012-11-02 15:41:02 -0700274}
275
Kenny Root49468902013-03-19 13:41:33 -0700276/**
277 * Returns the UID that the callingUid should act as. This is here for
278 * legacy support of the WiFi and VPN systems and should be removed
279 * when WiFi can operate in its own namespace.
280 */
Kenny Root07438c82012-11-02 15:41:02 -0700281static uid_t get_keystore_euid(uid_t uid) {
282 for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
283 struct user_euid user = user_euids[i];
284 if (user.uid == uid) {
285 return user.euid;
286 }
287 }
288
289 return uid;
290}
291
Kenny Root49468902013-03-19 13:41:33 -0700292/**
293 * Returns true if the callingUid is allowed to interact in the targetUid's
294 * namespace.
295 */
296static bool is_granted_to(uid_t callingUid, uid_t targetUid) {
297 for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
298 struct user_euid user = user_euids[i];
299 if (user.euid == callingUid && user.uid == targetUid) {
300 return true;
301 }
302 }
303
304 return false;
305}
306
Kenny Root007cb232014-07-30 16:59:42 -0700307/**
308 * Allow the system to perform some privileged tasks that have to do with
309 * system maintenance. This should not be used for any function that uses
310 * the keys in any way (e.g., signing).
311 */
312static bool is_self_or_system(uid_t callingUid, uid_t targetUid) {
313 return callingUid == targetUid || callingUid == AID_SYSTEM;
314}
315
Kenny Roota91203b2012-02-15 15:00:46 -0800316/* Here is the encoding of keys. This is necessary in order to allow arbitrary
317 * characters in keys. Characters in [0-~] are not encoded. Others are encoded
318 * into two bytes. The first byte is one of [+-.] which represents the first
319 * two bits of the character. The second byte encodes the rest of the bits into
320 * [0-o]. Therefore in the worst case the length of a key gets doubled. Note
321 * that Base64 cannot be used here due to the need of prefix match on keys. */
322
Kenny Root655b9582013-04-04 08:37:42 -0700323static size_t encode_key_length(const android::String8& keyName) {
324 const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
325 size_t length = keyName.length();
326 for (int i = length; i > 0; --i, ++in) {
327 if (*in < '0' || *in > '~') {
328 ++length;
329 }
330 }
331 return length;
332}
333
Kenny Root07438c82012-11-02 15:41:02 -0700334static int encode_key(char* out, const android::String8& keyName) {
335 const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
336 size_t length = keyName.length();
Kenny Roota91203b2012-02-15 15:00:46 -0800337 for (int i = length; i > 0; --i, ++in, ++out) {
Kenny Root655b9582013-04-04 08:37:42 -0700338 if (*in < '0' || *in > '~') {
Kenny Roota91203b2012-02-15 15:00:46 -0800339 *out = '+' + (*in >> 6);
340 *++out = '0' + (*in & 0x3F);
341 ++length;
Kenny Root655b9582013-04-04 08:37:42 -0700342 } else {
343 *out = *in;
Kenny Roota91203b2012-02-15 15:00:46 -0800344 }
345 }
346 *out = '\0';
Kenny Root70e3a862012-02-15 17:20:23 -0800347 return length;
348}
349
Kenny Root07438c82012-11-02 15:41:02 -0700350/*
351 * Converts from the "escaped" format on disk to actual name.
352 * This will be smaller than the input string.
353 *
354 * Characters that should combine with the next at the end will be truncated.
355 */
356static size_t decode_key_length(const char* in, size_t length) {
357 size_t outLength = 0;
358
359 for (const char* end = in + length; in < end; in++) {
360 /* This combines with the next character. */
361 if (*in < '0' || *in > '~') {
362 continue;
363 }
364
365 outLength++;
366 }
367 return outLength;
368}
369
370static void decode_key(char* out, const char* in, size_t length) {
371 for (const char* end = in + length; in < end; in++) {
372 if (*in < '0' || *in > '~') {
373 /* Truncate combining characters at the end. */
374 if (in + 1 >= end) {
375 break;
376 }
377
378 *out = (*in++ - '+') << 6;
379 *out++ |= (*in - '0') & 0x3F;
Kenny Roota91203b2012-02-15 15:00:46 -0800380 } else {
Kenny Root07438c82012-11-02 15:41:02 -0700381 *out++ = *in;
Kenny Roota91203b2012-02-15 15:00:46 -0800382 }
383 }
384 *out = '\0';
Kenny Roota91203b2012-02-15 15:00:46 -0800385}
386
387static size_t readFully(int fd, uint8_t* data, size_t size) {
388 size_t remaining = size;
389 while (remaining > 0) {
Kenny Root150ca932012-11-14 14:29:02 -0800390 ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, remaining));
Kenny Root5281edb2012-11-21 15:14:04 -0800391 if (n <= 0) {
Kenny Root150ca932012-11-14 14:29:02 -0800392 return size - remaining;
Kenny Roota91203b2012-02-15 15:00:46 -0800393 }
394 data += n;
395 remaining -= n;
396 }
397 return size;
398}
399
400static size_t writeFully(int fd, uint8_t* data, size_t size) {
401 size_t remaining = size;
402 while (remaining > 0) {
Kenny Root150ca932012-11-14 14:29:02 -0800403 ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, remaining));
404 if (n < 0) {
405 ALOGW("write failed: %s", strerror(errno));
406 return size - remaining;
Kenny Roota91203b2012-02-15 15:00:46 -0800407 }
408 data += n;
409 remaining -= n;
410 }
411 return size;
412}
413
414class Entropy {
415public:
416 Entropy() : mRandom(-1) {}
417 ~Entropy() {
Kenny Root150ca932012-11-14 14:29:02 -0800418 if (mRandom >= 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800419 close(mRandom);
420 }
421 }
422
423 bool open() {
424 const char* randomDevice = "/dev/urandom";
Kenny Root150ca932012-11-14 14:29:02 -0800425 mRandom = TEMP_FAILURE_RETRY(::open(randomDevice, O_RDONLY));
426 if (mRandom < 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800427 ALOGE("open: %s: %s", randomDevice, strerror(errno));
428 return false;
429 }
430 return true;
431 }
432
Kenny Root51878182012-03-13 12:53:19 -0700433 bool generate_random_data(uint8_t* data, size_t size) const {
Kenny Roota91203b2012-02-15 15:00:46 -0800434 return (readFully(mRandom, data, size) == size);
435 }
436
437private:
438 int mRandom;
439};
440
441/* Here is the file format. There are two parts in blob.value, the secret and
442 * the description. The secret is stored in ciphertext, and its original size
443 * can be found in blob.length. The description is stored after the secret in
444 * plaintext, and its size is specified in blob.info. The total size of the two
Kenny Root822c3a92012-03-23 16:34:39 -0700445 * parts must be no more than VALUE_SIZE bytes. The first field is the version,
Kenny Rootf9119d62013-04-03 09:22:15 -0700446 * the second is the blob's type, and the third byte is flags. Fields other
Kenny Roota91203b2012-02-15 15:00:46 -0800447 * than blob.info, blob.length, and blob.value are modified by encryptBlob()
448 * and decryptBlob(). Thus they should not be accessed from outside. */
449
Kenny Root822c3a92012-03-23 16:34:39 -0700450/* ** Note to future implementors of encryption: **
451 * Currently this is the construction:
452 * metadata || Enc(MD5(data) || data)
453 *
454 * This should be the construction used for encrypting if re-implementing:
455 *
456 * Derive independent keys for encryption and MAC:
457 * Kenc = AES_encrypt(masterKey, "Encrypt")
458 * Kmac = AES_encrypt(masterKey, "MAC")
459 *
460 * Store this:
461 * metadata || AES_CTR_encrypt(Kenc, rand_IV, data) ||
462 * HMAC(Kmac, metadata || Enc(data))
463 */
Kenny Roota91203b2012-02-15 15:00:46 -0800464struct __attribute__((packed)) blob {
Kenny Root822c3a92012-03-23 16:34:39 -0700465 uint8_t version;
466 uint8_t type;
Kenny Rootf9119d62013-04-03 09:22:15 -0700467 uint8_t flags;
Kenny Roota91203b2012-02-15 15:00:46 -0800468 uint8_t info;
469 uint8_t vector[AES_BLOCK_SIZE];
Kenny Root822c3a92012-03-23 16:34:39 -0700470 uint8_t encrypted[0]; // Marks offset to encrypted data.
Kenny Roota91203b2012-02-15 15:00:46 -0800471 uint8_t digest[MD5_DIGEST_LENGTH];
Kenny Root822c3a92012-03-23 16:34:39 -0700472 uint8_t digested[0]; // Marks offset to digested data.
Kenny Roota91203b2012-02-15 15:00:46 -0800473 int32_t length; // in network byte order when encrypted
474 uint8_t value[VALUE_SIZE + AES_BLOCK_SIZE];
475};
476
Kenny Root822c3a92012-03-23 16:34:39 -0700477typedef enum {
Kenny Rootd53bc922013-03-21 14:10:15 -0700478 TYPE_ANY = 0, // meta type that matches anything
Kenny Root822c3a92012-03-23 16:34:39 -0700479 TYPE_GENERIC = 1,
480 TYPE_MASTER_KEY = 2,
481 TYPE_KEY_PAIR = 3,
482} BlobType;
483
Kenny Rootf9119d62013-04-03 09:22:15 -0700484static const uint8_t CURRENT_BLOB_VERSION = 2;
Kenny Root822c3a92012-03-23 16:34:39 -0700485
Kenny Roota91203b2012-02-15 15:00:46 -0800486class Blob {
487public:
Kenny Root07438c82012-11-02 15:41:02 -0700488 Blob(const uint8_t* value, int32_t valueLength, const uint8_t* info, uint8_t infoLength,
489 BlobType type) {
Kenny Roota91203b2012-02-15 15:00:46 -0800490 mBlob.length = valueLength;
491 memcpy(mBlob.value, value, valueLength);
492
493 mBlob.info = infoLength;
494 memcpy(mBlob.value + valueLength, info, infoLength);
Kenny Root822c3a92012-03-23 16:34:39 -0700495
Kenny Root07438c82012-11-02 15:41:02 -0700496 mBlob.version = CURRENT_BLOB_VERSION;
Kenny Root822c3a92012-03-23 16:34:39 -0700497 mBlob.type = uint8_t(type);
Kenny Rootf9119d62013-04-03 09:22:15 -0700498
Kenny Rootee8068b2013-10-07 09:49:15 -0700499 if (type == TYPE_MASTER_KEY) {
500 mBlob.flags = KEYSTORE_FLAG_ENCRYPTED;
501 } else {
502 mBlob.flags = KEYSTORE_FLAG_NONE;
503 }
Kenny Roota91203b2012-02-15 15:00:46 -0800504 }
505
506 Blob(blob b) {
507 mBlob = b;
508 }
509
510 Blob() {}
511
Kenny Root51878182012-03-13 12:53:19 -0700512 const uint8_t* getValue() const {
Kenny Roota91203b2012-02-15 15:00:46 -0800513 return mBlob.value;
514 }
515
Kenny Root51878182012-03-13 12:53:19 -0700516 int32_t getLength() const {
Kenny Roota91203b2012-02-15 15:00:46 -0800517 return mBlob.length;
518 }
519
Kenny Root51878182012-03-13 12:53:19 -0700520 const uint8_t* getInfo() const {
521 return mBlob.value + mBlob.length;
522 }
523
524 uint8_t getInfoLength() const {
Kenny Roota91203b2012-02-15 15:00:46 -0800525 return mBlob.info;
526 }
527
Kenny Root822c3a92012-03-23 16:34:39 -0700528 uint8_t getVersion() const {
529 return mBlob.version;
530 }
531
Kenny Rootf9119d62013-04-03 09:22:15 -0700532 bool isEncrypted() const {
533 if (mBlob.version < 2) {
534 return true;
535 }
536
537 return mBlob.flags & KEYSTORE_FLAG_ENCRYPTED;
538 }
539
540 void setEncrypted(bool encrypted) {
541 if (encrypted) {
542 mBlob.flags |= KEYSTORE_FLAG_ENCRYPTED;
543 } else {
544 mBlob.flags &= ~KEYSTORE_FLAG_ENCRYPTED;
545 }
546 }
547
Kenny Root17208e02013-09-04 13:56:03 -0700548 bool isFallback() const {
549 return mBlob.flags & KEYSTORE_FLAG_FALLBACK;
550 }
551
552 void setFallback(bool fallback) {
553 if (fallback) {
554 mBlob.flags |= KEYSTORE_FLAG_FALLBACK;
555 } else {
556 mBlob.flags &= ~KEYSTORE_FLAG_FALLBACK;
557 }
558 }
559
Kenny Root822c3a92012-03-23 16:34:39 -0700560 void setVersion(uint8_t version) {
561 mBlob.version = version;
562 }
563
564 BlobType getType() const {
565 return BlobType(mBlob.type);
566 }
567
568 void setType(BlobType type) {
569 mBlob.type = uint8_t(type);
570 }
571
Kenny Rootf9119d62013-04-03 09:22:15 -0700572 ResponseCode writeBlob(const char* filename, AES_KEY *aes_key, State state, Entropy* entropy) {
573 ALOGV("writing blob %s", filename);
574 if (isEncrypted()) {
575 if (state != STATE_NO_ERROR) {
576 ALOGD("couldn't insert encrypted blob while not unlocked");
577 return LOCKED;
578 }
579
580 if (!entropy->generate_random_data(mBlob.vector, AES_BLOCK_SIZE)) {
581 ALOGW("Could not read random data for: %s", filename);
582 return SYSTEM_ERROR;
583 }
Kenny Roota91203b2012-02-15 15:00:46 -0800584 }
585
586 // data includes the value and the value's length
587 size_t dataLength = mBlob.length + sizeof(mBlob.length);
588 // pad data to the AES_BLOCK_SIZE
589 size_t digestedLength = ((dataLength + AES_BLOCK_SIZE - 1)
590 / AES_BLOCK_SIZE * AES_BLOCK_SIZE);
591 // encrypted data includes the digest value
592 size_t encryptedLength = digestedLength + MD5_DIGEST_LENGTH;
593 // move info after space for padding
594 memmove(&mBlob.encrypted[encryptedLength], &mBlob.value[mBlob.length], mBlob.info);
595 // zero padding area
596 memset(mBlob.value + mBlob.length, 0, digestedLength - dataLength);
597
598 mBlob.length = htonl(mBlob.length);
Kenny Roota91203b2012-02-15 15:00:46 -0800599
Kenny Rootf9119d62013-04-03 09:22:15 -0700600 if (isEncrypted()) {
601 MD5(mBlob.digested, digestedLength, mBlob.digest);
Kenny Roota91203b2012-02-15 15:00:46 -0800602
Kenny Rootf9119d62013-04-03 09:22:15 -0700603 uint8_t vector[AES_BLOCK_SIZE];
604 memcpy(vector, mBlob.vector, AES_BLOCK_SIZE);
605 AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength,
606 aes_key, vector, AES_ENCRYPT);
607 }
608
Kenny Roota91203b2012-02-15 15:00:46 -0800609 size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
610 size_t fileLength = encryptedLength + headerLength + mBlob.info;
611
612 const char* tmpFileName = ".tmp";
Kenny Root150ca932012-11-14 14:29:02 -0800613 int out = TEMP_FAILURE_RETRY(open(tmpFileName,
614 O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
615 if (out < 0) {
616 ALOGW("could not open file: %s: %s", tmpFileName, strerror(errno));
Kenny Roota91203b2012-02-15 15:00:46 -0800617 return SYSTEM_ERROR;
618 }
619 size_t writtenBytes = writeFully(out, (uint8_t*) &mBlob, fileLength);
620 if (close(out) != 0) {
621 return SYSTEM_ERROR;
622 }
623 if (writtenBytes != fileLength) {
Kenny Root150ca932012-11-14 14:29:02 -0800624 ALOGW("blob not fully written %zu != %zu", writtenBytes, fileLength);
Kenny Roota91203b2012-02-15 15:00:46 -0800625 unlink(tmpFileName);
626 return SYSTEM_ERROR;
627 }
Kenny Root150ca932012-11-14 14:29:02 -0800628 if (rename(tmpFileName, filename) == -1) {
629 ALOGW("could not rename blob to %s: %s", filename, strerror(errno));
630 return SYSTEM_ERROR;
631 }
632 return NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -0800633 }
634
Kenny Rootf9119d62013-04-03 09:22:15 -0700635 ResponseCode readBlob(const char* filename, AES_KEY *aes_key, State state) {
636 ALOGV("reading blob %s", filename);
Kenny Root150ca932012-11-14 14:29:02 -0800637 int in = TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
638 if (in < 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800639 return (errno == ENOENT) ? KEY_NOT_FOUND : SYSTEM_ERROR;
640 }
641 // fileLength may be less than sizeof(mBlob) since the in
642 // memory version has extra padding to tolerate rounding up to
643 // the AES_BLOCK_SIZE
644 size_t fileLength = readFully(in, (uint8_t*) &mBlob, sizeof(mBlob));
645 if (close(in) != 0) {
646 return SYSTEM_ERROR;
647 }
Kenny Rootf9119d62013-04-03 09:22:15 -0700648
649 if (isEncrypted() && (state != STATE_NO_ERROR)) {
650 return LOCKED;
651 }
652
Kenny Roota91203b2012-02-15 15:00:46 -0800653 size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
654 if (fileLength < headerLength) {
655 return VALUE_CORRUPTED;
656 }
657
658 ssize_t encryptedLength = fileLength - (headerLength + mBlob.info);
Kenny Rootf9119d62013-04-03 09:22:15 -0700659 if (encryptedLength < 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800660 return VALUE_CORRUPTED;
661 }
Kenny Rootf9119d62013-04-03 09:22:15 -0700662
663 ssize_t digestedLength;
664 if (isEncrypted()) {
665 if (encryptedLength % AES_BLOCK_SIZE != 0) {
666 return VALUE_CORRUPTED;
667 }
668
669 AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, aes_key,
670 mBlob.vector, AES_DECRYPT);
671 digestedLength = encryptedLength - MD5_DIGEST_LENGTH;
672 uint8_t computedDigest[MD5_DIGEST_LENGTH];
673 MD5(mBlob.digested, digestedLength, computedDigest);
674 if (memcmp(mBlob.digest, computedDigest, MD5_DIGEST_LENGTH) != 0) {
675 return VALUE_CORRUPTED;
676 }
677 } else {
678 digestedLength = encryptedLength;
Kenny Roota91203b2012-02-15 15:00:46 -0800679 }
680
681 ssize_t maxValueLength = digestedLength - sizeof(mBlob.length);
682 mBlob.length = ntohl(mBlob.length);
683 if (mBlob.length < 0 || mBlob.length > maxValueLength) {
684 return VALUE_CORRUPTED;
685 }
686 if (mBlob.info != 0) {
687 // move info from after padding to after data
688 memmove(&mBlob.value[mBlob.length], &mBlob.value[maxValueLength], mBlob.info);
689 }
Kenny Root07438c82012-11-02 15:41:02 -0700690 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -0800691 }
692
693private:
694 struct blob mBlob;
695};
696
Kenny Root655b9582013-04-04 08:37:42 -0700697class UserState {
Kenny Roota91203b2012-02-15 15:00:46 -0800698public:
Kenny Root655b9582013-04-04 08:37:42 -0700699 UserState(uid_t userId) : mUserId(userId), mRetry(MAX_RETRY) {
700 asprintf(&mUserDir, "user_%u", mUserId);
701 asprintf(&mMasterKeyFile, "%s/.masterkey", mUserDir);
702 }
703
704 ~UserState() {
705 free(mUserDir);
706 free(mMasterKeyFile);
707 }
708
709 bool initialize() {
710 if ((mkdir(mUserDir, S_IRUSR | S_IWUSR | S_IXUSR) < 0) && (errno != EEXIST)) {
711 ALOGE("Could not create directory '%s'", mUserDir);
712 return false;
713 }
714
715 if (access(mMasterKeyFile, R_OK) == 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800716 setState(STATE_LOCKED);
717 } else {
718 setState(STATE_UNINITIALIZED);
719 }
Kenny Root70e3a862012-02-15 17:20:23 -0800720
Kenny Root655b9582013-04-04 08:37:42 -0700721 return true;
722 }
723
724 uid_t getUserId() const {
725 return mUserId;
726 }
727
728 const char* getUserDirName() const {
729 return mUserDir;
730 }
731
732 const char* getMasterKeyFileName() const {
733 return mMasterKeyFile;
734 }
735
736 void setState(State state) {
737 mState = state;
738 if (mState == STATE_NO_ERROR || mState == STATE_UNINITIALIZED) {
739 mRetry = MAX_RETRY;
740 }
Kenny Roota91203b2012-02-15 15:00:46 -0800741 }
742
Kenny Root51878182012-03-13 12:53:19 -0700743 State getState() const {
Kenny Roota91203b2012-02-15 15:00:46 -0800744 return mState;
745 }
746
Kenny Root51878182012-03-13 12:53:19 -0700747 int8_t getRetry() const {
Kenny Roota91203b2012-02-15 15:00:46 -0800748 return mRetry;
749 }
750
Kenny Root655b9582013-04-04 08:37:42 -0700751 void zeroizeMasterKeysInMemory() {
752 memset(mMasterKey, 0, sizeof(mMasterKey));
753 memset(mSalt, 0, sizeof(mSalt));
754 memset(&mMasterKeyEncryption, 0, sizeof(mMasterKeyEncryption));
755 memset(&mMasterKeyDecryption, 0, sizeof(mMasterKeyDecryption));
Kenny Root70e3a862012-02-15 17:20:23 -0800756 }
757
Kenny Root655b9582013-04-04 08:37:42 -0700758 ResponseCode initialize(const android::String8& pw, Entropy* entropy) {
759 if (!generateMasterKey(entropy)) {
Kenny Roota91203b2012-02-15 15:00:46 -0800760 return SYSTEM_ERROR;
761 }
Kenny Root655b9582013-04-04 08:37:42 -0700762 ResponseCode response = writeMasterKey(pw, entropy);
Kenny Roota91203b2012-02-15 15:00:46 -0800763 if (response != NO_ERROR) {
764 return response;
765 }
766 setupMasterKeys();
Kenny Root07438c82012-11-02 15:41:02 -0700767 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -0800768 }
769
Robin Lee4e865752014-08-19 17:37:55 +0100770 ResponseCode copyMasterKey(UserState* src) {
771 if (mState != STATE_UNINITIALIZED) {
772 return ::SYSTEM_ERROR;
773 }
774 if (src->getState() != STATE_NO_ERROR) {
775 return ::SYSTEM_ERROR;
776 }
777 memcpy(mMasterKey, src->mMasterKey, MASTER_KEY_SIZE_BYTES);
778 setupMasterKeys();
779 return ::NO_ERROR;
780 }
781
Kenny Root655b9582013-04-04 08:37:42 -0700782 ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy) {
Kenny Roota91203b2012-02-15 15:00:46 -0800783 uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
784 generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, mSalt);
785 AES_KEY passwordAesKey;
786 AES_set_encrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
Kenny Root822c3a92012-03-23 16:34:39 -0700787 Blob masterKeyBlob(mMasterKey, sizeof(mMasterKey), mSalt, sizeof(mSalt), TYPE_MASTER_KEY);
Kenny Rootf9119d62013-04-03 09:22:15 -0700788 return masterKeyBlob.writeBlob(mMasterKeyFile, &passwordAesKey, STATE_NO_ERROR, entropy);
Kenny Roota91203b2012-02-15 15:00:46 -0800789 }
790
Kenny Root655b9582013-04-04 08:37:42 -0700791 ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy) {
792 int in = TEMP_FAILURE_RETRY(open(mMasterKeyFile, O_RDONLY));
Kenny Root150ca932012-11-14 14:29:02 -0800793 if (in < 0) {
Kenny Roota91203b2012-02-15 15:00:46 -0800794 return SYSTEM_ERROR;
795 }
796
797 // we read the raw blob to just to get the salt to generate
798 // the AES key, then we create the Blob to use with decryptBlob
799 blob rawBlob;
800 size_t length = readFully(in, (uint8_t*) &rawBlob, sizeof(rawBlob));
801 if (close(in) != 0) {
802 return SYSTEM_ERROR;
803 }
804 // find salt at EOF if present, otherwise we have an old file
805 uint8_t* salt;
806 if (length > SALT_SIZE && rawBlob.info == SALT_SIZE) {
807 salt = (uint8_t*) &rawBlob + length - SALT_SIZE;
808 } else {
809 salt = NULL;
810 }
811 uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
812 generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, salt);
813 AES_KEY passwordAesKey;
814 AES_set_decrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
815 Blob masterKeyBlob(rawBlob);
Kenny Rootf9119d62013-04-03 09:22:15 -0700816 ResponseCode response = masterKeyBlob.readBlob(mMasterKeyFile, &passwordAesKey,
817 STATE_NO_ERROR);
Kenny Roota91203b2012-02-15 15:00:46 -0800818 if (response == SYSTEM_ERROR) {
Kenny Rootf9119d62013-04-03 09:22:15 -0700819 return response;
Kenny Roota91203b2012-02-15 15:00:46 -0800820 }
821 if (response == NO_ERROR && masterKeyBlob.getLength() == MASTER_KEY_SIZE_BYTES) {
822 // if salt was missing, generate one and write a new master key file with the salt.
823 if (salt == NULL) {
Kenny Root655b9582013-04-04 08:37:42 -0700824 if (!generateSalt(entropy)) {
Kenny Roota91203b2012-02-15 15:00:46 -0800825 return SYSTEM_ERROR;
826 }
Kenny Root655b9582013-04-04 08:37:42 -0700827 response = writeMasterKey(pw, entropy);
Kenny Roota91203b2012-02-15 15:00:46 -0800828 }
829 if (response == NO_ERROR) {
830 memcpy(mMasterKey, masterKeyBlob.getValue(), MASTER_KEY_SIZE_BYTES);
831 setupMasterKeys();
832 }
833 return response;
834 }
835 if (mRetry <= 0) {
836 reset();
837 return UNINITIALIZED;
838 }
839 --mRetry;
840 switch (mRetry) {
841 case 0: return WRONG_PASSWORD_0;
842 case 1: return WRONG_PASSWORD_1;
843 case 2: return WRONG_PASSWORD_2;
844 case 3: return WRONG_PASSWORD_3;
845 default: return WRONG_PASSWORD_3;
846 }
847 }
848
Kenny Root655b9582013-04-04 08:37:42 -0700849 AES_KEY* getEncryptionKey() {
850 return &mMasterKeyEncryption;
851 }
852
853 AES_KEY* getDecryptionKey() {
854 return &mMasterKeyDecryption;
855 }
856
Kenny Roota91203b2012-02-15 15:00:46 -0800857 bool reset() {
Kenny Root655b9582013-04-04 08:37:42 -0700858 DIR* dir = opendir(getUserDirName());
Kenny Roota91203b2012-02-15 15:00:46 -0800859 if (!dir) {
Kenny Root655b9582013-04-04 08:37:42 -0700860 ALOGW("couldn't open user directory: %s", strerror(errno));
Kenny Roota91203b2012-02-15 15:00:46 -0800861 return false;
862 }
Kenny Root655b9582013-04-04 08:37:42 -0700863
864 struct dirent* file;
Kenny Roota91203b2012-02-15 15:00:46 -0800865 while ((file = readdir(dir)) != NULL) {
Kenny Root655b9582013-04-04 08:37:42 -0700866 // We only care about files.
867 if (file->d_type != DT_REG) {
868 continue;
869 }
870
871 // Skip anything that starts with a "."
Kenny Root931fac02014-07-30 16:39:40 -0700872 if (file->d_name[0] == '.' && strcmp(".masterkey", file->d_name)) {
Kenny Root655b9582013-04-04 08:37:42 -0700873 continue;
874 }
875
876 unlinkat(dirfd(dir), file->d_name, 0);
Kenny Roota91203b2012-02-15 15:00:46 -0800877 }
878 closedir(dir);
879 return true;
880 }
881
Kenny Root655b9582013-04-04 08:37:42 -0700882private:
883 static const int MASTER_KEY_SIZE_BYTES = 16;
884 static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8;
885
886 static const int MAX_RETRY = 4;
887 static const size_t SALT_SIZE = 16;
888
889 void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw,
890 uint8_t* salt) {
891 size_t saltSize;
892 if (salt != NULL) {
893 saltSize = SALT_SIZE;
894 } else {
895 // pre-gingerbread used this hardwired salt, readMasterKey will rewrite these when found
896 salt = (uint8_t*) "keystore";
897 // sizeof = 9, not strlen = 8
898 saltSize = sizeof("keystore");
899 }
900
901 PKCS5_PBKDF2_HMAC_SHA1(reinterpret_cast<const char*>(pw.string()), pw.length(), salt,
902 saltSize, 8192, keySize, key);
903 }
904
905 bool generateSalt(Entropy* entropy) {
906 return entropy->generate_random_data(mSalt, sizeof(mSalt));
907 }
908
909 bool generateMasterKey(Entropy* entropy) {
910 if (!entropy->generate_random_data(mMasterKey, sizeof(mMasterKey))) {
911 return false;
912 }
913 if (!generateSalt(entropy)) {
914 return false;
915 }
916 return true;
917 }
918
919 void setupMasterKeys() {
920 AES_set_encrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyEncryption);
921 AES_set_decrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyDecryption);
922 setState(STATE_NO_ERROR);
923 }
924
925 uid_t mUserId;
926
927 char* mUserDir;
928 char* mMasterKeyFile;
929
930 State mState;
931 int8_t mRetry;
932
933 uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES];
934 uint8_t mSalt[SALT_SIZE];
935
936 AES_KEY mMasterKeyEncryption;
937 AES_KEY mMasterKeyDecryption;
938};
939
940typedef struct {
941 uint32_t uid;
942 const uint8_t* filename;
943} grant_t;
944
945class KeyStore {
946public:
947 KeyStore(Entropy* entropy, keymaster_device_t* device)
948 : mEntropy(entropy)
949 , mDevice(device)
950 {
951 memset(&mMetaData, '\0', sizeof(mMetaData));
952 }
953
954 ~KeyStore() {
955 for (android::Vector<grant_t*>::iterator it(mGrants.begin());
956 it != mGrants.end(); it++) {
957 delete *it;
Kenny Root655b9582013-04-04 08:37:42 -0700958 }
haitao fangc35d4eb2013-12-06 11:34:49 +0800959 mGrants.clear();
Kenny Root655b9582013-04-04 08:37:42 -0700960
961 for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
962 it != mMasterKeys.end(); it++) {
963 delete *it;
Kenny Root655b9582013-04-04 08:37:42 -0700964 }
haitao fangc35d4eb2013-12-06 11:34:49 +0800965 mMasterKeys.clear();
Kenny Root655b9582013-04-04 08:37:42 -0700966 }
967
968 keymaster_device_t* getDevice() const {
969 return mDevice;
970 }
971
972 ResponseCode initialize() {
973 readMetaData();
974 if (upgradeKeystore()) {
975 writeMetaData();
976 }
977
978 return ::NO_ERROR;
979 }
980
981 State getState(uid_t uid) {
982 return getUserState(uid)->getState();
983 }
984
985 ResponseCode initializeUser(const android::String8& pw, uid_t uid) {
986 UserState* userState = getUserState(uid);
987 return userState->initialize(pw, mEntropy);
988 }
989
Robin Lee4e865752014-08-19 17:37:55 +0100990 ResponseCode copyMasterKey(uid_t src, uid_t uid) {
991 UserState *userState = getUserState(uid);
992 UserState *initState = getUserState(src);
993 return userState->copyMasterKey(initState);
994 }
995
Kenny Root655b9582013-04-04 08:37:42 -0700996 ResponseCode writeMasterKey(const android::String8& pw, uid_t uid) {
Robin Lee50122db2014-08-12 17:31:40 +0100997 UserState* userState = getUserState(uid);
Kenny Root655b9582013-04-04 08:37:42 -0700998 return userState->writeMasterKey(pw, mEntropy);
999 }
1000
1001 ResponseCode readMasterKey(const android::String8& pw, uid_t uid) {
Robin Lee50122db2014-08-12 17:31:40 +01001002 UserState* userState = getUserState(uid);
Kenny Root655b9582013-04-04 08:37:42 -07001003 return userState->readMasterKey(pw, mEntropy);
1004 }
1005
1006 android::String8 getKeyName(const android::String8& keyName) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001007 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001008 encode_key(encoded, keyName);
1009 return android::String8(encoded);
1010 }
1011
1012 android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001013 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001014 encode_key(encoded, keyName);
1015 return android::String8::format("%u_%s", uid, encoded);
1016 }
1017
1018 android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001019 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001020 encode_key(encoded, keyName);
1021 return android::String8::format("%s/%u_%s", getUserState(uid)->getUserDirName(), uid,
1022 encoded);
1023 }
1024
1025 bool reset(uid_t uid) {
Robin Lee4b84fdc2014-09-24 11:56:57 +01001026 android::String8 prefix("");
1027 android::Vector<android::String16> aliases;
1028 if (saw(prefix, &aliases, uid) != ::NO_ERROR) {
1029 return ::SYSTEM_ERROR;
1030 }
1031
Kenny Root655b9582013-04-04 08:37:42 -07001032 UserState* userState = getUserState(uid);
Robin Lee4b84fdc2014-09-24 11:56:57 +01001033 for (uint32_t i = 0; i < aliases.size(); i++) {
1034 android::String8 filename(aliases[i]);
1035 filename = android::String8::format("%s/%s", userState->getUserDirName(),
1036 getKeyName(filename).string());
1037 del(filename, ::TYPE_ANY, uid);
1038 }
1039
Kenny Root655b9582013-04-04 08:37:42 -07001040 userState->zeroizeMasterKeysInMemory();
1041 userState->setState(STATE_UNINITIALIZED);
1042 return userState->reset();
1043 }
1044
1045 bool isEmpty(uid_t uid) const {
1046 const UserState* userState = getUserState(uid);
Kenny Root31e27462014-09-10 11:28:03 -07001047 if (userState == NULL || userState->getState() == STATE_UNINITIALIZED) {
Kenny Root655b9582013-04-04 08:37:42 -07001048 return true;
1049 }
1050
1051 DIR* dir = opendir(userState->getUserDirName());
Kenny Roota91203b2012-02-15 15:00:46 -08001052 if (!dir) {
1053 return true;
1054 }
Kenny Root31e27462014-09-10 11:28:03 -07001055
Kenny Roota91203b2012-02-15 15:00:46 -08001056 bool result = true;
Kenny Root31e27462014-09-10 11:28:03 -07001057 struct dirent* file;
Kenny Roota91203b2012-02-15 15:00:46 -08001058 while ((file = readdir(dir)) != NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07001059 // We only care about files.
1060 if (file->d_type != DT_REG) {
1061 continue;
1062 }
1063
1064 // Skip anything that starts with a "."
1065 if (file->d_name[0] == '.') {
1066 continue;
1067 }
1068
Kenny Root31e27462014-09-10 11:28:03 -07001069 result = false;
1070 break;
Kenny Roota91203b2012-02-15 15:00:46 -08001071 }
1072 closedir(dir);
1073 return result;
1074 }
1075
Kenny Root655b9582013-04-04 08:37:42 -07001076 void lock(uid_t uid) {
1077 UserState* userState = getUserState(uid);
1078 userState->zeroizeMasterKeysInMemory();
1079 userState->setState(STATE_LOCKED);
Kenny Roota91203b2012-02-15 15:00:46 -08001080 }
1081
Kenny Root655b9582013-04-04 08:37:42 -07001082 ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t uid) {
1083 UserState* userState = getUserState(uid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001084 ResponseCode rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1085 userState->getState());
Kenny Root822c3a92012-03-23 16:34:39 -07001086 if (rc != NO_ERROR) {
1087 return rc;
1088 }
1089
1090 const uint8_t version = keyBlob->getVersion();
Kenny Root07438c82012-11-02 15:41:02 -07001091 if (version < CURRENT_BLOB_VERSION) {
Kenny Rootcfeae072013-04-04 08:39:57 -07001092 /* If we upgrade the key, we need to write it to disk again. Then
1093 * it must be read it again since the blob is encrypted each time
1094 * it's written.
1095 */
Kenny Root655b9582013-04-04 08:37:42 -07001096 if (upgradeBlob(filename, keyBlob, version, type, uid)) {
1097 if ((rc = this->put(filename, keyBlob, uid)) != NO_ERROR
Kenny Rootf9119d62013-04-03 09:22:15 -07001098 || (rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1099 userState->getState())) != NO_ERROR) {
Kenny Rootcfeae072013-04-04 08:39:57 -07001100 return rc;
1101 }
1102 }
Kenny Root822c3a92012-03-23 16:34:39 -07001103 }
1104
Kenny Root17208e02013-09-04 13:56:03 -07001105 /*
1106 * This will upgrade software-backed keys to hardware-backed keys when
1107 * the HAL for the device supports the newer key types.
1108 */
1109 if (rc == NO_ERROR && type == TYPE_KEY_PAIR
1110 && mDevice->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2
1111 && keyBlob->isFallback()) {
1112 ResponseCode imported = importKey(keyBlob->getValue(), keyBlob->getLength(), filename,
1113 uid, keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
1114
1115 // The HAL allowed the import, reget the key to have the "fresh"
1116 // version.
1117 if (imported == NO_ERROR) {
1118 rc = get(filename, keyBlob, TYPE_KEY_PAIR, uid);
1119 }
1120 }
1121
Kenny Rootd53bc922013-03-21 14:10:15 -07001122 if (type != TYPE_ANY && keyBlob->getType() != type) {
Kenny Root822c3a92012-03-23 16:34:39 -07001123 ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
1124 return KEY_NOT_FOUND;
1125 }
1126
1127 return rc;
Kenny Roota91203b2012-02-15 15:00:46 -08001128 }
1129
Kenny Root655b9582013-04-04 08:37:42 -07001130 ResponseCode put(const char* filename, Blob* keyBlob, uid_t uid) {
1131 UserState* userState = getUserState(uid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001132 return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
1133 mEntropy);
Kenny Roota91203b2012-02-15 15:00:46 -08001134 }
1135
Robin Lee4b84fdc2014-09-24 11:56:57 +01001136 ResponseCode del(const char *filename, const BlobType type, uid_t uid) {
1137 Blob keyBlob;
1138 ResponseCode rc = get(filename, &keyBlob, type, uid);
1139 if (rc != ::NO_ERROR) {
1140 return rc;
1141 }
1142
1143 if (keyBlob.getType() == ::TYPE_KEY_PAIR) {
1144 // A device doesn't have to implement delete_keypair.
1145 if (mDevice->delete_keypair != NULL && !keyBlob.isFallback()) {
1146 if (mDevice->delete_keypair(mDevice, keyBlob.getValue(), keyBlob.getLength())) {
1147 rc = ::SYSTEM_ERROR;
1148 }
1149 }
1150 }
1151 if (rc != ::NO_ERROR) {
1152 return rc;
1153 }
1154
1155 return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
1156 }
1157
1158 ResponseCode saw(const android::String8& prefix, android::Vector<android::String16> *matches,
1159 uid_t uid) {
1160
1161 UserState* userState = getUserState(uid);
1162 size_t n = prefix.length();
1163
1164 DIR* dir = opendir(userState->getUserDirName());
1165 if (!dir) {
1166 ALOGW("can't open directory for user: %s", strerror(errno));
1167 return ::SYSTEM_ERROR;
1168 }
1169
1170 struct dirent* file;
1171 while ((file = readdir(dir)) != NULL) {
1172 // We only care about files.
1173 if (file->d_type != DT_REG) {
1174 continue;
1175 }
1176
1177 // Skip anything that starts with a "."
1178 if (file->d_name[0] == '.') {
1179 continue;
1180 }
1181
1182 if (!strncmp(prefix.string(), file->d_name, n)) {
1183 const char* p = &file->d_name[n];
1184 size_t plen = strlen(p);
1185
1186 size_t extra = decode_key_length(p, plen);
1187 char *match = (char*) malloc(extra + 1);
1188 if (match != NULL) {
1189 decode_key(match, p, plen);
1190 matches->push(android::String16(match, extra));
1191 free(match);
1192 } else {
1193 ALOGW("could not allocate match of size %zd", extra);
1194 }
1195 }
1196 }
1197 closedir(dir);
1198 return ::NO_ERROR;
1199 }
1200
Kenny Root07438c82012-11-02 15:41:02 -07001201 void addGrant(const char* filename, uid_t granteeUid) {
Kenny Root655b9582013-04-04 08:37:42 -07001202 const grant_t* existing = getGrant(filename, granteeUid);
1203 if (existing == NULL) {
1204 grant_t* grant = new grant_t;
Kenny Root07438c82012-11-02 15:41:02 -07001205 grant->uid = granteeUid;
Brian Carlstroma8c703d2012-07-17 14:43:46 -07001206 grant->filename = reinterpret_cast<const uint8_t*>(strdup(filename));
Kenny Root655b9582013-04-04 08:37:42 -07001207 mGrants.add(grant);
Kenny Root70e3a862012-02-15 17:20:23 -08001208 }
1209 }
1210
Kenny Root07438c82012-11-02 15:41:02 -07001211 bool removeGrant(const char* filename, uid_t granteeUid) {
Kenny Root655b9582013-04-04 08:37:42 -07001212 for (android::Vector<grant_t*>::iterator it(mGrants.begin());
1213 it != mGrants.end(); it++) {
1214 grant_t* grant = *it;
1215 if (grant->uid == granteeUid
1216 && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
1217 mGrants.erase(it);
1218 return true;
1219 }
Kenny Root70e3a862012-02-15 17:20:23 -08001220 }
Kenny Root70e3a862012-02-15 17:20:23 -08001221 return false;
1222 }
1223
Brian Carlstroma8c703d2012-07-17 14:43:46 -07001224 bool hasGrant(const char* filename, const uid_t uid) const {
1225 return getGrant(filename, uid) != NULL;
Kenny Root70e3a862012-02-15 17:20:23 -08001226 }
1227
Kenny Rootf9119d62013-04-03 09:22:15 -07001228 ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t uid,
1229 int32_t flags) {
Kenny Root822c3a92012-03-23 16:34:39 -07001230 uint8_t* data;
1231 size_t dataLength;
1232 int rc;
1233
1234 if (mDevice->import_keypair == NULL) {
1235 ALOGE("Keymaster doesn't support import!");
1236 return SYSTEM_ERROR;
1237 }
1238
Kenny Root17208e02013-09-04 13:56:03 -07001239 bool isFallback = false;
Kenny Root07438c82012-11-02 15:41:02 -07001240 rc = mDevice->import_keypair(mDevice, key, keyLen, &data, &dataLength);
Kenny Root822c3a92012-03-23 16:34:39 -07001241 if (rc) {
Kenny Root17208e02013-09-04 13:56:03 -07001242 // If this is an old device HAL, try to fall back to an old version
1243 if (mDevice->common.module->module_api_version < KEYMASTER_MODULE_API_VERSION_0_2) {
1244 rc = openssl_import_keypair(mDevice, key, keyLen, &data, &dataLength);
1245 isFallback = true;
1246 }
1247
1248 if (rc) {
1249 ALOGE("Error while importing keypair: %d", rc);
1250 return SYSTEM_ERROR;
1251 }
Kenny Root822c3a92012-03-23 16:34:39 -07001252 }
1253
1254 Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1255 free(data);
1256
Kenny Rootf9119d62013-04-03 09:22:15 -07001257 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
Kenny Root17208e02013-09-04 13:56:03 -07001258 keyBlob.setFallback(isFallback);
Kenny Rootf9119d62013-04-03 09:22:15 -07001259
Kenny Root655b9582013-04-04 08:37:42 -07001260 return put(filename, &keyBlob, uid);
Kenny Root822c3a92012-03-23 16:34:39 -07001261 }
1262
Kenny Root1b0e3932013-09-05 13:06:32 -07001263 bool isHardwareBacked(const android::String16& keyType) const {
1264 if (mDevice == NULL) {
1265 ALOGW("can't get keymaster device");
1266 return false;
1267 }
1268
1269 if (sRSAKeyType == keyType) {
1270 return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0;
1271 } else {
1272 return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0
1273 && (mDevice->common.module->module_api_version
1274 >= KEYMASTER_MODULE_API_VERSION_0_2);
1275 }
Kenny Root8ddf35a2013-03-29 11:15:50 -07001276 }
1277
Kenny Root655b9582013-04-04 08:37:42 -07001278 ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
1279 const BlobType type) {
Kenny Root86b16e82013-09-09 11:15:54 -07001280 android::String8 filepath8(getKeyNameForUidWithDir(keyName, uid));
Kenny Root655b9582013-04-04 08:37:42 -07001281
1282 ResponseCode responseCode = get(filepath8.string(), keyBlob, type, uid);
1283 if (responseCode == NO_ERROR) {
1284 return responseCode;
1285 }
1286
1287 // If this is one of the legacy UID->UID mappings, use it.
1288 uid_t euid = get_keystore_euid(uid);
1289 if (euid != uid) {
Kenny Root86b16e82013-09-09 11:15:54 -07001290 filepath8 = getKeyNameForUidWithDir(keyName, euid);
Kenny Root655b9582013-04-04 08:37:42 -07001291 responseCode = get(filepath8.string(), keyBlob, type, uid);
1292 if (responseCode == NO_ERROR) {
1293 return responseCode;
1294 }
1295 }
1296
1297 // They might be using a granted key.
Kenny Root86b16e82013-09-09 11:15:54 -07001298 android::String8 filename8 = getKeyName(keyName);
Kenny Root655b9582013-04-04 08:37:42 -07001299 char* end;
Kenny Root86b16e82013-09-09 11:15:54 -07001300 strtoul(filename8.string(), &end, 10);
Kenny Root655b9582013-04-04 08:37:42 -07001301 if (end[0] != '_' || end[1] == 0) {
1302 return KEY_NOT_FOUND;
1303 }
Kenny Root86b16e82013-09-09 11:15:54 -07001304 filepath8 = android::String8::format("%s/%s", getUserState(uid)->getUserDirName(),
1305 filename8.string());
Kenny Root655b9582013-04-04 08:37:42 -07001306 if (!hasGrant(filepath8.string(), uid)) {
1307 return responseCode;
1308 }
1309
1310 // It is a granted key. Try to load it.
1311 return get(filepath8.string(), keyBlob, type, uid);
1312 }
1313
1314 /**
1315 * Returns any existing UserState or creates it if it doesn't exist.
1316 */
1317 UserState* getUserState(uid_t uid) {
1318 uid_t userId = get_user_id(uid);
1319
1320 for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
1321 it != mMasterKeys.end(); it++) {
1322 UserState* state = *it;
1323 if (state->getUserId() == userId) {
1324 return state;
1325 }
1326 }
1327
1328 UserState* userState = new UserState(userId);
1329 if (!userState->initialize()) {
1330 /* There's not much we can do if initialization fails. Trying to
1331 * unlock the keystore for that user will fail as well, so any
1332 * subsequent request for this user will just return SYSTEM_ERROR.
1333 */
1334 ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
1335 }
1336 mMasterKeys.add(userState);
1337 return userState;
1338 }
1339
1340 /**
1341 * Returns NULL if the UserState doesn't already exist.
1342 */
1343 const UserState* getUserState(uid_t uid) const {
1344 uid_t userId = get_user_id(uid);
1345
1346 for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
1347 it != mMasterKeys.end(); it++) {
1348 UserState* state = *it;
1349 if (state->getUserId() == userId) {
1350 return state;
1351 }
1352 }
1353
1354 return NULL;
1355 }
1356
Kenny Roota91203b2012-02-15 15:00:46 -08001357private:
Kenny Root655b9582013-04-04 08:37:42 -07001358 static const char* sOldMasterKey;
1359 static const char* sMetaDataFile;
Kenny Root1b0e3932013-09-05 13:06:32 -07001360 static const android::String16 sRSAKeyType;
Kenny Roota91203b2012-02-15 15:00:46 -08001361 Entropy* mEntropy;
1362
Kenny Root70e3a862012-02-15 17:20:23 -08001363 keymaster_device_t* mDevice;
1364
Kenny Root655b9582013-04-04 08:37:42 -07001365 android::Vector<UserState*> mMasterKeys;
Kenny Roota91203b2012-02-15 15:00:46 -08001366
Kenny Root655b9582013-04-04 08:37:42 -07001367 android::Vector<grant_t*> mGrants;
Kenny Roota91203b2012-02-15 15:00:46 -08001368
Kenny Root655b9582013-04-04 08:37:42 -07001369 typedef struct {
1370 uint32_t version;
1371 } keystore_metadata_t;
Kenny Roota91203b2012-02-15 15:00:46 -08001372
Kenny Root655b9582013-04-04 08:37:42 -07001373 keystore_metadata_t mMetaData;
Kenny Root70e3a862012-02-15 17:20:23 -08001374
Kenny Root655b9582013-04-04 08:37:42 -07001375 const grant_t* getGrant(const char* filename, uid_t uid) const {
1376 for (android::Vector<grant_t*>::const_iterator it(mGrants.begin());
1377 it != mGrants.end(); it++) {
1378 grant_t* grant = *it;
Kenny Root70e3a862012-02-15 17:20:23 -08001379 if (grant->uid == uid
Kenny Root655b9582013-04-04 08:37:42 -07001380 && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
Kenny Root70e3a862012-02-15 17:20:23 -08001381 return grant;
1382 }
1383 }
Kenny Root70e3a862012-02-15 17:20:23 -08001384 return NULL;
1385 }
1386
Kenny Root822c3a92012-03-23 16:34:39 -07001387 /**
1388 * Upgrade code. This will upgrade the key from the current version
1389 * to whatever is newest.
1390 */
Kenny Root655b9582013-04-04 08:37:42 -07001391 bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
1392 const BlobType type, uid_t uid) {
Kenny Root822c3a92012-03-23 16:34:39 -07001393 bool updated = false;
1394 uint8_t version = oldVersion;
1395
1396 /* From V0 -> V1: All old types were unknown */
1397 if (version == 0) {
1398 ALOGV("upgrading to version 1 and setting type %d", type);
1399
1400 blob->setType(type);
1401 if (type == TYPE_KEY_PAIR) {
Kenny Root655b9582013-04-04 08:37:42 -07001402 importBlobAsKey(blob, filename, uid);
Kenny Root822c3a92012-03-23 16:34:39 -07001403 }
1404 version = 1;
1405 updated = true;
1406 }
1407
Kenny Rootf9119d62013-04-03 09:22:15 -07001408 /* From V1 -> V2: All old keys were encrypted */
1409 if (version == 1) {
1410 ALOGV("upgrading to version 2");
1411
1412 blob->setEncrypted(true);
1413 version = 2;
1414 updated = true;
1415 }
1416
Kenny Root822c3a92012-03-23 16:34:39 -07001417 /*
1418 * If we've updated, set the key blob to the right version
1419 * and write it.
Kenny Rootcfeae072013-04-04 08:39:57 -07001420 */
Kenny Root822c3a92012-03-23 16:34:39 -07001421 if (updated) {
1422 ALOGV("updated and writing file %s", filename);
1423 blob->setVersion(version);
Kenny Root822c3a92012-03-23 16:34:39 -07001424 }
Kenny Rootcfeae072013-04-04 08:39:57 -07001425
1426 return updated;
Kenny Root822c3a92012-03-23 16:34:39 -07001427 }
1428
1429 /**
1430 * Takes a blob that is an PEM-encoded RSA key as a byte array and
1431 * converts it to a DER-encoded PKCS#8 for import into a keymaster.
1432 * Then it overwrites the original blob with the new blob
1433 * format that is returned from the keymaster.
1434 */
Kenny Root655b9582013-04-04 08:37:42 -07001435 ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid) {
Kenny Root822c3a92012-03-23 16:34:39 -07001436 // We won't even write to the blob directly with this BIO, so const_cast is okay.
1437 Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
1438 if (b.get() == NULL) {
1439 ALOGE("Problem instantiating BIO");
1440 return SYSTEM_ERROR;
1441 }
1442
1443 Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
1444 if (pkey.get() == NULL) {
1445 ALOGE("Couldn't read old PEM file");
1446 return SYSTEM_ERROR;
1447 }
1448
1449 Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
1450 int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
1451 if (len < 0) {
1452 ALOGE("Couldn't measure PKCS#8 length");
1453 return SYSTEM_ERROR;
1454 }
1455
Kenny Root70c98892013-02-07 09:10:36 -08001456 UniquePtr<unsigned char[]> pkcs8key(new unsigned char[len]);
1457 uint8_t* tmp = pkcs8key.get();
Kenny Root822c3a92012-03-23 16:34:39 -07001458 if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
1459 ALOGE("Couldn't convert to PKCS#8");
1460 return SYSTEM_ERROR;
1461 }
1462
Kenny Rootf9119d62013-04-03 09:22:15 -07001463 ResponseCode rc = importKey(pkcs8key.get(), len, filename, uid,
1464 blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
Kenny Root822c3a92012-03-23 16:34:39 -07001465 if (rc != NO_ERROR) {
1466 return rc;
1467 }
1468
Kenny Root655b9582013-04-04 08:37:42 -07001469 return get(filename, blob, TYPE_KEY_PAIR, uid);
1470 }
1471
1472 void readMetaData() {
1473 int in = TEMP_FAILURE_RETRY(open(sMetaDataFile, O_RDONLY));
1474 if (in < 0) {
1475 return;
1476 }
1477 size_t fileLength = readFully(in, (uint8_t*) &mMetaData, sizeof(mMetaData));
1478 if (fileLength != sizeof(mMetaData)) {
1479 ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength,
1480 sizeof(mMetaData));
1481 }
1482 close(in);
1483 }
1484
1485 void writeMetaData() {
1486 const char* tmpFileName = ".metadata.tmp";
1487 int out = TEMP_FAILURE_RETRY(open(tmpFileName,
1488 O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
1489 if (out < 0) {
1490 ALOGE("couldn't write metadata file: %s", strerror(errno));
1491 return;
1492 }
1493 size_t fileLength = writeFully(out, (uint8_t*) &mMetaData, sizeof(mMetaData));
1494 if (fileLength != sizeof(mMetaData)) {
1495 ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
1496 sizeof(mMetaData));
1497 }
1498 close(out);
1499 rename(tmpFileName, sMetaDataFile);
1500 }
1501
1502 bool upgradeKeystore() {
1503 bool upgraded = false;
1504
1505 if (mMetaData.version == 0) {
1506 UserState* userState = getUserState(0);
1507
1508 // Initialize first so the directory is made.
1509 userState->initialize();
1510
1511 // Migrate the old .masterkey file to user 0.
1512 if (access(sOldMasterKey, R_OK) == 0) {
1513 if (rename(sOldMasterKey, userState->getMasterKeyFileName()) < 0) {
1514 ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
1515 return false;
1516 }
1517 }
1518
1519 // Initialize again in case we had a key.
1520 userState->initialize();
1521
1522 // Try to migrate existing keys.
1523 DIR* dir = opendir(".");
1524 if (!dir) {
1525 // Give up now; maybe we can upgrade later.
1526 ALOGE("couldn't open keystore's directory; something is wrong");
1527 return false;
1528 }
1529
1530 struct dirent* file;
1531 while ((file = readdir(dir)) != NULL) {
1532 // We only care about files.
1533 if (file->d_type != DT_REG) {
1534 continue;
1535 }
1536
1537 // Skip anything that starts with a "."
1538 if (file->d_name[0] == '.') {
1539 continue;
1540 }
1541
1542 // Find the current file's user.
1543 char* end;
1544 unsigned long thisUid = strtoul(file->d_name, &end, 10);
1545 if (end[0] != '_' || end[1] == 0) {
1546 continue;
1547 }
1548 UserState* otherUser = getUserState(thisUid);
1549 if (otherUser->getUserId() != 0) {
1550 unlinkat(dirfd(dir), file->d_name, 0);
1551 }
1552
1553 // Rename the file into user directory.
1554 DIR* otherdir = opendir(otherUser->getUserDirName());
1555 if (otherdir == NULL) {
1556 ALOGW("couldn't open user directory for rename");
1557 continue;
1558 }
1559 if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
1560 ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
1561 }
1562 closedir(otherdir);
1563 }
1564 closedir(dir);
1565
1566 mMetaData.version = 1;
1567 upgraded = true;
1568 }
1569
1570 return upgraded;
Kenny Root822c3a92012-03-23 16:34:39 -07001571 }
Kenny Roota91203b2012-02-15 15:00:46 -08001572};
1573
Kenny Root655b9582013-04-04 08:37:42 -07001574const char* KeyStore::sOldMasterKey = ".masterkey";
1575const char* KeyStore::sMetaDataFile = ".metadata";
Kenny Root70e3a862012-02-15 17:20:23 -08001576
Kenny Root1b0e3932013-09-05 13:06:32 -07001577const android::String16 KeyStore::sRSAKeyType("RSA");
1578
Kenny Root07438c82012-11-02 15:41:02 -07001579namespace android {
1580class KeyStoreProxy : public BnKeystoreService, public IBinder::DeathRecipient {
1581public:
1582 KeyStoreProxy(KeyStore* keyStore)
1583 : mKeyStore(keyStore)
1584 {
Kenny Roota91203b2012-02-15 15:00:46 -08001585 }
Kenny Roota91203b2012-02-15 15:00:46 -08001586
Kenny Root07438c82012-11-02 15:41:02 -07001587 void binderDied(const wp<IBinder>&) {
1588 ALOGE("binder death detected");
Kenny Root822c3a92012-03-23 16:34:39 -07001589 }
Kenny Roota91203b2012-02-15 15:00:46 -08001590
Kenny Root07438c82012-11-02 15:41:02 -07001591 int32_t test() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001592 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001593 pid_t spid = IPCThreadState::self()->getCallingPid();
1594 if (!has_permission(callingUid, P_TEST, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001595 ALOGW("permission denied for %d: test", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001596 return ::PERMISSION_DENIED;
Kenny Roota91203b2012-02-15 15:00:46 -08001597 }
Kenny Roota91203b2012-02-15 15:00:46 -08001598
Kenny Root655b9582013-04-04 08:37:42 -07001599 return mKeyStore->getState(callingUid);
Kenny Root298e7b12012-03-26 13:54:44 -07001600 }
1601
Kenny Root07438c82012-11-02 15:41:02 -07001602 int32_t get(const String16& name, uint8_t** item, size_t* itemLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001603 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001604 pid_t spid = IPCThreadState::self()->getCallingPid();
1605 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001606 ALOGW("permission denied for %d: get", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001607 return ::PERMISSION_DENIED;
Kenny Roota91203b2012-02-15 15:00:46 -08001608 }
Kenny Root07438c82012-11-02 15:41:02 -07001609
Kenny Root07438c82012-11-02 15:41:02 -07001610 String8 name8(name);
Kenny Root07438c82012-11-02 15:41:02 -07001611 Blob keyBlob;
Nick Kralevich66dbf672014-06-30 17:09:14 +00001612
Kenny Root655b9582013-04-04 08:37:42 -07001613 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root49468902013-03-19 13:41:33 -07001614 TYPE_GENERIC);
Kenny Root07438c82012-11-02 15:41:02 -07001615 if (responseCode != ::NO_ERROR) {
Kenny Root655b9582013-04-04 08:37:42 -07001616 ALOGW("Could not read %s", name8.string());
Kenny Root07438c82012-11-02 15:41:02 -07001617 *item = NULL;
1618 *itemLength = 0;
1619 return responseCode;
Kenny Roota91203b2012-02-15 15:00:46 -08001620 }
Kenny Roota91203b2012-02-15 15:00:46 -08001621
Kenny Root07438c82012-11-02 15:41:02 -07001622 *item = (uint8_t*) malloc(keyBlob.getLength());
1623 memcpy(*item, keyBlob.getValue(), keyBlob.getLength());
1624 *itemLength = keyBlob.getLength();
Kenny Roota91203b2012-02-15 15:00:46 -08001625
Kenny Root07438c82012-11-02 15:41:02 -07001626 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001627 }
1628
Kenny Rootf9119d62013-04-03 09:22:15 -07001629 int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int targetUid,
1630 int32_t flags) {
Riley Spahneaabae92014-06-30 12:39:52 -07001631 pid_t spid = IPCThreadState::self()->getCallingPid();
Kenny Rootd38a0b02013-02-13 12:59:14 -08001632 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001633 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001634 ALOGW("permission denied for %d: insert", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001635 return ::PERMISSION_DENIED;
1636 }
Kenny Root07438c82012-11-02 15:41:02 -07001637
Kenny Rootf9119d62013-04-03 09:22:15 -07001638 State state = mKeyStore->getState(callingUid);
1639 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
1640 ALOGD("calling get in state: %d", state);
1641 return state;
1642 }
1643
Kenny Root49468902013-03-19 13:41:33 -07001644 if (targetUid == -1) {
1645 targetUid = callingUid;
1646 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001647 return ::PERMISSION_DENIED;
1648 }
1649
Kenny Root07438c82012-11-02 15:41:02 -07001650 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001651 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07001652
1653 Blob keyBlob(item, itemLength, NULL, 0, ::TYPE_GENERIC);
Kenny Rootee8068b2013-10-07 09:49:15 -07001654 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
1655
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001656 return mKeyStore->put(filename.string(), &keyBlob, targetUid);
Kenny Root70e3a862012-02-15 17:20:23 -08001657 }
1658
Kenny Root49468902013-03-19 13:41:33 -07001659 int32_t del(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001660 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001661 pid_t spid = IPCThreadState::self()->getCallingPid();
1662 if (!has_permission(callingUid, P_DELETE, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001663 ALOGW("permission denied for %d: del", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001664 return ::PERMISSION_DENIED;
1665 }
Kenny Root70e3a862012-02-15 17:20:23 -08001666
Kenny Root49468902013-03-19 13:41:33 -07001667 if (targetUid == -1) {
1668 targetUid = callingUid;
1669 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001670 return ::PERMISSION_DENIED;
1671 }
1672
Kenny Root07438c82012-11-02 15:41:02 -07001673 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001674 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Robin Lee4b84fdc2014-09-24 11:56:57 +01001675 return mKeyStore->del(filename.string(), ::TYPE_GENERIC, targetUid);
Kenny Root70e3a862012-02-15 17:20:23 -08001676 }
1677
Kenny Root49468902013-03-19 13:41:33 -07001678 int32_t exist(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001679 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001680 pid_t spid = IPCThreadState::self()->getCallingPid();
1681 if (!has_permission(callingUid, P_EXIST, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001682 ALOGW("permission denied for %d: exist", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001683 return ::PERMISSION_DENIED;
1684 }
Kenny Root70e3a862012-02-15 17:20:23 -08001685
Kenny Root49468902013-03-19 13:41:33 -07001686 if (targetUid == -1) {
1687 targetUid = callingUid;
1688 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001689 return ::PERMISSION_DENIED;
1690 }
1691
Kenny Root07438c82012-11-02 15:41:02 -07001692 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001693 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root70e3a862012-02-15 17:20:23 -08001694
Kenny Root655b9582013-04-04 08:37:42 -07001695 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07001696 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
1697 }
1698 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001699 }
1700
Kenny Root49468902013-03-19 13:41:33 -07001701 int32_t saw(const String16& prefix, int targetUid, Vector<String16>* matches) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001702 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001703 pid_t spid = IPCThreadState::self()->getCallingPid();
1704 if (!has_permission(callingUid, P_SAW, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001705 ALOGW("permission denied for %d: saw", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001706 return ::PERMISSION_DENIED;
1707 }
Kenny Root70e3a862012-02-15 17:20:23 -08001708
Kenny Root49468902013-03-19 13:41:33 -07001709 if (targetUid == -1) {
1710 targetUid = callingUid;
1711 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001712 return ::PERMISSION_DENIED;
1713 }
1714
Kenny Root07438c82012-11-02 15:41:02 -07001715 const String8 prefix8(prefix);
Kenny Root655b9582013-04-04 08:37:42 -07001716 String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid));
Kenny Root70e3a862012-02-15 17:20:23 -08001717
Robin Lee4b84fdc2014-09-24 11:56:57 +01001718 if (mKeyStore->saw(filename, matches, targetUid) != ::NO_ERROR) {
1719 return ::SYSTEM_ERROR;
Kenny Root9a53d3e2012-08-14 10:47:54 -07001720 }
Kenny Root07438c82012-11-02 15:41:02 -07001721 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001722 }
1723
Kenny Root07438c82012-11-02 15:41:02 -07001724 int32_t reset() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001725 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001726 pid_t spid = IPCThreadState::self()->getCallingPid();
1727 if (!has_permission(callingUid, P_RESET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001728 ALOGW("permission denied for %d: reset", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001729 return ::PERMISSION_DENIED;
1730 }
1731
Robin Lee4b84fdc2014-09-24 11:56:57 +01001732 return mKeyStore->reset(callingUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001733 }
1734
Kenny Root07438c82012-11-02 15:41:02 -07001735 /*
1736 * Here is the history. To improve the security, the parameters to generate the
1737 * master key has been changed. To make a seamless transition, we update the
1738 * file using the same password when the user unlock it for the first time. If
1739 * any thing goes wrong during the transition, the new file will not overwrite
1740 * the old one. This avoids permanent damages of the existing data.
1741 */
1742 int32_t password(const String16& password) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001743 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001744 pid_t spid = IPCThreadState::self()->getCallingPid();
1745 if (!has_permission(callingUid, P_PASSWORD, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001746 ALOGW("permission denied for %d: password", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001747 return ::PERMISSION_DENIED;
1748 }
Kenny Root70e3a862012-02-15 17:20:23 -08001749
Kenny Root07438c82012-11-02 15:41:02 -07001750 const String8 password8(password);
Kenny Root70e3a862012-02-15 17:20:23 -08001751
Kenny Root655b9582013-04-04 08:37:42 -07001752 switch (mKeyStore->getState(callingUid)) {
Kenny Root07438c82012-11-02 15:41:02 -07001753 case ::STATE_UNINITIALIZED: {
1754 // generate master key, encrypt with password, write to file, initialize mMasterKey*.
Kenny Root655b9582013-04-04 08:37:42 -07001755 return mKeyStore->initializeUser(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001756 }
1757 case ::STATE_NO_ERROR: {
1758 // rewrite master key with new password.
Kenny Root655b9582013-04-04 08:37:42 -07001759 return mKeyStore->writeMasterKey(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001760 }
1761 case ::STATE_LOCKED: {
1762 // read master key, decrypt with password, initialize mMasterKey*.
Kenny Root655b9582013-04-04 08:37:42 -07001763 return mKeyStore->readMasterKey(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001764 }
1765 }
1766 return ::SYSTEM_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001767 }
1768
Kenny Root07438c82012-11-02 15:41:02 -07001769 int32_t lock() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001770 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001771 pid_t spid = IPCThreadState::self()->getCallingPid();
1772 if (!has_permission(callingUid, P_LOCK, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001773 ALOGW("permission denied for %d: lock", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001774 return ::PERMISSION_DENIED;
1775 }
Kenny Root70e3a862012-02-15 17:20:23 -08001776
Kenny Root655b9582013-04-04 08:37:42 -07001777 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08001778 if (state != ::STATE_NO_ERROR) {
Kenny Root07438c82012-11-02 15:41:02 -07001779 ALOGD("calling lock in state: %d", state);
1780 return state;
1781 }
1782
Kenny Root655b9582013-04-04 08:37:42 -07001783 mKeyStore->lock(callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001784 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001785 }
1786
Kenny Root07438c82012-11-02 15:41:02 -07001787 int32_t unlock(const String16& pw) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001788 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001789 pid_t spid = IPCThreadState::self()->getCallingPid();
1790 if (!has_permission(callingUid, P_UNLOCK, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001791 ALOGW("permission denied for %d: unlock", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001792 return ::PERMISSION_DENIED;
1793 }
1794
Kenny Root655b9582013-04-04 08:37:42 -07001795 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08001796 if (state != ::STATE_LOCKED) {
Kenny Root07438c82012-11-02 15:41:02 -07001797 ALOGD("calling unlock when not locked");
1798 return state;
1799 }
1800
1801 const String8 password8(pw);
1802 return password(pw);
Kenny Root70e3a862012-02-15 17:20:23 -08001803 }
1804
Kenny Root07438c82012-11-02 15:41:02 -07001805 int32_t zero() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001806 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001807 pid_t spid = IPCThreadState::self()->getCallingPid();
1808 if (!has_permission(callingUid, P_ZERO, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001809 ALOGW("permission denied for %d: zero", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001810 return -1;
1811 }
Kenny Root70e3a862012-02-15 17:20:23 -08001812
Kenny Root655b9582013-04-04 08:37:42 -07001813 return mKeyStore->isEmpty(callingUid) ? ::KEY_NOT_FOUND : ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001814 }
1815
Kenny Root96427ba2013-08-16 14:02:41 -07001816 int32_t generate(const String16& name, int32_t targetUid, int32_t keyType, int32_t keySize,
1817 int32_t flags, Vector<sp<KeystoreArg> >* args) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001818 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001819 pid_t spid = IPCThreadState::self()->getCallingPid();
1820 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001821 ALOGW("permission denied for %d: generate", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001822 return ::PERMISSION_DENIED;
1823 }
Kenny Root70e3a862012-02-15 17:20:23 -08001824
Kenny Root49468902013-03-19 13:41:33 -07001825 if (targetUid == -1) {
1826 targetUid = callingUid;
1827 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001828 return ::PERMISSION_DENIED;
1829 }
1830
Kenny Root655b9582013-04-04 08:37:42 -07001831 State state = mKeyStore->getState(callingUid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001832 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
1833 ALOGW("calling generate in state: %d", state);
Kenny Root07438c82012-11-02 15:41:02 -07001834 return state;
1835 }
Kenny Root70e3a862012-02-15 17:20:23 -08001836
Kenny Root07438c82012-11-02 15:41:02 -07001837 uint8_t* data;
1838 size_t dataLength;
1839 int rc;
Kenny Root17208e02013-09-04 13:56:03 -07001840 bool isFallback = false;
Kenny Root07438c82012-11-02 15:41:02 -07001841
1842 const keymaster_device_t* device = mKeyStore->getDevice();
1843 if (device == NULL) {
1844 return ::SYSTEM_ERROR;
1845 }
1846
1847 if (device->generate_keypair == NULL) {
1848 return ::SYSTEM_ERROR;
1849 }
1850
Kenny Root17208e02013-09-04 13:56:03 -07001851 if (keyType == EVP_PKEY_DSA) {
Kenny Root96427ba2013-08-16 14:02:41 -07001852 keymaster_dsa_keygen_params_t dsa_params;
1853 memset(&dsa_params, '\0', sizeof(dsa_params));
Kenny Root07438c82012-11-02 15:41:02 -07001854
Kenny Root96427ba2013-08-16 14:02:41 -07001855 if (keySize == -1) {
1856 keySize = DSA_DEFAULT_KEY_SIZE;
1857 } else if ((keySize % 64) != 0 || keySize < DSA_MIN_KEY_SIZE
1858 || keySize > DSA_MAX_KEY_SIZE) {
1859 ALOGI("invalid key size %d", keySize);
1860 return ::SYSTEM_ERROR;
1861 }
1862 dsa_params.key_size = keySize;
1863
1864 if (args->size() == 3) {
1865 sp<KeystoreArg> gArg = args->itemAt(0);
1866 sp<KeystoreArg> pArg = args->itemAt(1);
1867 sp<KeystoreArg> qArg = args->itemAt(2);
1868
1869 if (gArg != NULL && pArg != NULL && qArg != NULL) {
1870 dsa_params.generator = reinterpret_cast<const uint8_t*>(gArg->data());
1871 dsa_params.generator_len = gArg->size();
1872
1873 dsa_params.prime_p = reinterpret_cast<const uint8_t*>(pArg->data());
1874 dsa_params.prime_p_len = pArg->size();
1875
1876 dsa_params.prime_q = reinterpret_cast<const uint8_t*>(qArg->data());
1877 dsa_params.prime_q_len = qArg->size();
1878 } else {
1879 ALOGI("not all DSA parameters were read");
1880 return ::SYSTEM_ERROR;
1881 }
1882 } else if (args->size() != 0) {
1883 ALOGI("DSA args must be 3");
1884 return ::SYSTEM_ERROR;
1885 }
1886
Kenny Root1d448c02013-11-21 10:36:53 -08001887 if (isKeyTypeSupported(device, TYPE_DSA)) {
Kenny Root17208e02013-09-04 13:56:03 -07001888 rc = device->generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
1889 } else {
1890 isFallback = true;
1891 rc = openssl_generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
1892 }
1893 } else if (keyType == EVP_PKEY_EC) {
Kenny Root96427ba2013-08-16 14:02:41 -07001894 keymaster_ec_keygen_params_t ec_params;
1895 memset(&ec_params, '\0', sizeof(ec_params));
1896
1897 if (keySize == -1) {
1898 keySize = EC_DEFAULT_KEY_SIZE;
1899 } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
1900 ALOGI("invalid key size %d", keySize);
1901 return ::SYSTEM_ERROR;
1902 }
1903 ec_params.field_size = keySize;
1904
Kenny Root1d448c02013-11-21 10:36:53 -08001905 if (isKeyTypeSupported(device, TYPE_EC)) {
Kenny Root17208e02013-09-04 13:56:03 -07001906 rc = device->generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
1907 } else {
1908 isFallback = true;
1909 rc = openssl_generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
1910 }
Kenny Root96427ba2013-08-16 14:02:41 -07001911 } else if (keyType == EVP_PKEY_RSA) {
1912 keymaster_rsa_keygen_params_t rsa_params;
1913 memset(&rsa_params, '\0', sizeof(rsa_params));
1914 rsa_params.public_exponent = RSA_DEFAULT_EXPONENT;
1915
1916 if (keySize == -1) {
1917 keySize = RSA_DEFAULT_KEY_SIZE;
1918 } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
1919 ALOGI("invalid key size %d", keySize);
1920 return ::SYSTEM_ERROR;
1921 }
1922 rsa_params.modulus_size = keySize;
1923
1924 if (args->size() > 1) {
Matteo Franchin6489e022013-12-02 14:46:29 +00001925 ALOGI("invalid number of arguments: %zu", args->size());
Kenny Root96427ba2013-08-16 14:02:41 -07001926 return ::SYSTEM_ERROR;
1927 } else if (args->size() == 1) {
1928 sp<KeystoreArg> pubExpBlob = args->itemAt(0);
1929 if (pubExpBlob != NULL) {
1930 Unique_BIGNUM pubExpBn(
1931 BN_bin2bn(reinterpret_cast<const unsigned char*>(pubExpBlob->data()),
1932 pubExpBlob->size(), NULL));
1933 if (pubExpBn.get() == NULL) {
1934 ALOGI("Could not convert public exponent to BN");
1935 return ::SYSTEM_ERROR;
1936 }
1937 unsigned long pubExp = BN_get_word(pubExpBn.get());
1938 if (pubExp == 0xFFFFFFFFL) {
1939 ALOGI("cannot represent public exponent as a long value");
1940 return ::SYSTEM_ERROR;
1941 }
1942 rsa_params.public_exponent = pubExp;
1943 }
1944 }
1945
1946 rc = device->generate_keypair(device, TYPE_RSA, &rsa_params, &data, &dataLength);
1947 } else {
1948 ALOGW("Unsupported key type %d", keyType);
1949 rc = -1;
1950 }
1951
Kenny Root07438c82012-11-02 15:41:02 -07001952 if (rc) {
1953 return ::SYSTEM_ERROR;
1954 }
1955
Kenny Root655b9582013-04-04 08:37:42 -07001956 String8 name8(name);
1957 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07001958
1959 Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1960 free(data);
1961
Kenny Rootee8068b2013-10-07 09:49:15 -07001962 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
Kenny Root17208e02013-09-04 13:56:03 -07001963 keyBlob.setFallback(isFallback);
1964
Kenny Root655b9582013-04-04 08:37:42 -07001965 return mKeyStore->put(filename.string(), &keyBlob, callingUid);
Kenny Root70e3a862012-02-15 17:20:23 -08001966 }
1967
Kenny Rootf9119d62013-04-03 09:22:15 -07001968 int32_t import(const String16& name, const uint8_t* data, size_t length, int targetUid,
1969 int32_t flags) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001970 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001971 pid_t spid = IPCThreadState::self()->getCallingPid();
1972 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001973 ALOGW("permission denied for %d: import", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001974 return ::PERMISSION_DENIED;
1975 }
Kenny Root07438c82012-11-02 15:41:02 -07001976
Kenny Root49468902013-03-19 13:41:33 -07001977 if (targetUid == -1) {
1978 targetUid = callingUid;
1979 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001980 return ::PERMISSION_DENIED;
1981 }
1982
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001983 State state = mKeyStore->getState(targetUid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001984 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07001985 ALOGD("calling import in state: %d", state);
1986 return state;
1987 }
1988
1989 String8 name8(name);
Kenny Root60898892013-04-16 18:08:03 -07001990 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07001991
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001992 return mKeyStore->importKey(data, length, filename.string(), targetUid, flags);
Kenny Root70e3a862012-02-15 17:20:23 -08001993 }
1994
Kenny Root07438c82012-11-02 15:41:02 -07001995 int32_t sign(const String16& name, const uint8_t* data, size_t length, uint8_t** out,
1996 size_t* outLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001997 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001998 pid_t spid = IPCThreadState::self()->getCallingPid();
1999 if (!has_permission(callingUid, P_SIGN, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002000 ALOGW("permission denied for %d: saw", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002001 return ::PERMISSION_DENIED;
2002 }
Kenny Root07438c82012-11-02 15:41:02 -07002003
Kenny Root07438c82012-11-02 15:41:02 -07002004 Blob keyBlob;
2005 String8 name8(name);
2006
Kenny Rootd38a0b02013-02-13 12:59:14 -08002007 ALOGV("sign %s from uid %d", name8.string(), callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002008 int rc;
2009
Kenny Root655b9582013-04-04 08:37:42 -07002010 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Rootd38a0b02013-02-13 12:59:14 -08002011 ::TYPE_KEY_PAIR);
Kenny Root07438c82012-11-02 15:41:02 -07002012 if (responseCode != ::NO_ERROR) {
2013 return responseCode;
2014 }
2015
2016 const keymaster_device_t* device = mKeyStore->getDevice();
2017 if (device == NULL) {
2018 ALOGE("no keymaster device; cannot sign");
2019 return ::SYSTEM_ERROR;
2020 }
2021
2022 if (device->sign_data == NULL) {
2023 ALOGE("device doesn't implement signing");
2024 return ::SYSTEM_ERROR;
2025 }
2026
2027 keymaster_rsa_sign_params_t params;
2028 params.digest_type = DIGEST_NONE;
2029 params.padding_type = PADDING_NONE;
2030
Kenny Root17208e02013-09-04 13:56:03 -07002031 if (keyBlob.isFallback()) {
2032 rc = openssl_sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2033 length, out, outLength);
2034 } else {
2035 rc = device->sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2036 length, out, outLength);
2037 }
Kenny Root07438c82012-11-02 15:41:02 -07002038 if (rc) {
2039 ALOGW("device couldn't sign data");
2040 return ::SYSTEM_ERROR;
2041 }
2042
2043 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08002044 }
2045
Kenny Root07438c82012-11-02 15:41:02 -07002046 int32_t verify(const String16& name, const uint8_t* data, size_t dataLength,
2047 const uint8_t* signature, size_t signatureLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002048 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002049 pid_t spid = IPCThreadState::self()->getCallingPid();
2050 if (!has_permission(callingUid, P_VERIFY, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002051 ALOGW("permission denied for %d: verify", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002052 return ::PERMISSION_DENIED;
2053 }
Kenny Root70e3a862012-02-15 17:20:23 -08002054
Kenny Root655b9582013-04-04 08:37:42 -07002055 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002056 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002057 ALOGD("calling verify in state: %d", state);
2058 return state;
2059 }
Kenny Root70e3a862012-02-15 17:20:23 -08002060
Kenny Root07438c82012-11-02 15:41:02 -07002061 Blob keyBlob;
2062 String8 name8(name);
2063 int rc;
Kenny Root70e3a862012-02-15 17:20:23 -08002064
Kenny Root655b9582013-04-04 08:37:42 -07002065 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root49468902013-03-19 13:41:33 -07002066 TYPE_KEY_PAIR);
Kenny Root07438c82012-11-02 15:41:02 -07002067 if (responseCode != ::NO_ERROR) {
2068 return responseCode;
2069 }
Kenny Root70e3a862012-02-15 17:20:23 -08002070
Kenny Root07438c82012-11-02 15:41:02 -07002071 const keymaster_device_t* device = mKeyStore->getDevice();
2072 if (device == NULL) {
2073 return ::SYSTEM_ERROR;
2074 }
Kenny Root70e3a862012-02-15 17:20:23 -08002075
Kenny Root07438c82012-11-02 15:41:02 -07002076 if (device->verify_data == NULL) {
2077 return ::SYSTEM_ERROR;
2078 }
Kenny Root70e3a862012-02-15 17:20:23 -08002079
Kenny Root07438c82012-11-02 15:41:02 -07002080 keymaster_rsa_sign_params_t params;
2081 params.digest_type = DIGEST_NONE;
2082 params.padding_type = PADDING_NONE;
Kenny Root344e0bc2012-08-15 10:44:03 -07002083
Kenny Root17208e02013-09-04 13:56:03 -07002084 if (keyBlob.isFallback()) {
2085 rc = openssl_verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2086 dataLength, signature, signatureLength);
2087 } else {
2088 rc = device->verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2089 dataLength, signature, signatureLength);
2090 }
Kenny Root07438c82012-11-02 15:41:02 -07002091 if (rc) {
2092 return ::SYSTEM_ERROR;
2093 } else {
2094 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -08002095 }
2096 }
Kenny Root07438c82012-11-02 15:41:02 -07002097
2098 /*
2099 * TODO: The abstraction between things stored in hardware and regular blobs
2100 * of data stored on the filesystem should be moved down to keystore itself.
2101 * Unfortunately the Java code that calls this has naming conventions that it
2102 * knows about. Ideally keystore shouldn't be used to store random blobs of
2103 * data.
2104 *
2105 * Until that happens, it's necessary to have a separate "get_pubkey" and
2106 * "del_key" since the Java code doesn't really communicate what it's
2107 * intentions are.
2108 */
2109 int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002110 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002111 pid_t spid = IPCThreadState::self()->getCallingPid();
2112 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002113 ALOGW("permission denied for %d: get_pubkey", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002114 return ::PERMISSION_DENIED;
2115 }
Kenny Root07438c82012-11-02 15:41:02 -07002116
Kenny Root07438c82012-11-02 15:41:02 -07002117 Blob keyBlob;
2118 String8 name8(name);
2119
Kenny Rootd38a0b02013-02-13 12:59:14 -08002120 ALOGV("get_pubkey '%s' from uid %d", name8.string(), callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002121
Kenny Root655b9582013-04-04 08:37:42 -07002122 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root07438c82012-11-02 15:41:02 -07002123 TYPE_KEY_PAIR);
2124 if (responseCode != ::NO_ERROR) {
2125 return responseCode;
2126 }
2127
2128 const keymaster_device_t* device = mKeyStore->getDevice();
2129 if (device == NULL) {
2130 return ::SYSTEM_ERROR;
2131 }
2132
2133 if (device->get_keypair_public == NULL) {
2134 ALOGE("device has no get_keypair_public implementation!");
2135 return ::SYSTEM_ERROR;
2136 }
2137
Kenny Root17208e02013-09-04 13:56:03 -07002138 int rc;
2139 if (keyBlob.isFallback()) {
2140 rc = openssl_get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2141 pubkeyLength);
2142 } else {
2143 rc = device->get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2144 pubkeyLength);
2145 }
Kenny Root07438c82012-11-02 15:41:02 -07002146 if (rc) {
2147 return ::SYSTEM_ERROR;
2148 }
2149
2150 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -08002151 }
Kenny Root07438c82012-11-02 15:41:02 -07002152
Kenny Root49468902013-03-19 13:41:33 -07002153 int32_t del_key(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002154 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002155 pid_t spid = IPCThreadState::self()->getCallingPid();
2156 if (!has_permission(callingUid, P_DELETE, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002157 ALOGW("permission denied for %d: del_key", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002158 return ::PERMISSION_DENIED;
2159 }
Kenny Root07438c82012-11-02 15:41:02 -07002160
Kenny Root49468902013-03-19 13:41:33 -07002161 if (targetUid == -1) {
2162 targetUid = callingUid;
2163 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08002164 return ::PERMISSION_DENIED;
2165 }
2166
Kenny Root07438c82012-11-02 15:41:02 -07002167 String8 name8(name);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002168 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Robin Lee4b84fdc2014-09-24 11:56:57 +01002169 return mKeyStore->del(filename.string(), ::TYPE_KEY_PAIR, targetUid);
Kenny Root07438c82012-11-02 15:41:02 -07002170 }
2171
2172 int32_t grant(const String16& name, int32_t granteeUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002173 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002174 pid_t spid = IPCThreadState::self()->getCallingPid();
2175 if (!has_permission(callingUid, P_GRANT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002176 ALOGW("permission denied for %d: grant", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002177 return ::PERMISSION_DENIED;
2178 }
Kenny Root07438c82012-11-02 15:41:02 -07002179
Kenny Root655b9582013-04-04 08:37:42 -07002180 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002181 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002182 ALOGD("calling grant in state: %d", state);
2183 return state;
2184 }
2185
2186 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002187 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002188
Kenny Root655b9582013-04-04 08:37:42 -07002189 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07002190 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
2191 }
2192
Kenny Root655b9582013-04-04 08:37:42 -07002193 mKeyStore->addGrant(filename.string(), granteeUid);
Kenny Root07438c82012-11-02 15:41:02 -07002194 return ::NO_ERROR;
2195 }
2196
2197 int32_t ungrant(const String16& name, int32_t granteeUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002198 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002199 pid_t spid = IPCThreadState::self()->getCallingPid();
2200 if (!has_permission(callingUid, P_GRANT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002201 ALOGW("permission denied for %d: ungrant", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002202 return ::PERMISSION_DENIED;
2203 }
Kenny Root07438c82012-11-02 15:41:02 -07002204
Kenny Root655b9582013-04-04 08:37:42 -07002205 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002206 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002207 ALOGD("calling ungrant in state: %d", state);
2208 return state;
2209 }
2210
2211 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002212 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002213
Kenny Root655b9582013-04-04 08:37:42 -07002214 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07002215 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
2216 }
2217
Kenny Root655b9582013-04-04 08:37:42 -07002218 return mKeyStore->removeGrant(filename.string(), granteeUid) ? ::NO_ERROR : ::KEY_NOT_FOUND;
Kenny Root07438c82012-11-02 15:41:02 -07002219 }
2220
2221 int64_t getmtime(const String16& name) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002222 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002223 pid_t spid = IPCThreadState::self()->getCallingPid();
2224 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002225 ALOGW("permission denied for %d: getmtime", callingUid);
Kenny Root36a9e232013-02-04 14:24:15 -08002226 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002227 }
Kenny Root07438c82012-11-02 15:41:02 -07002228
2229 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002230 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002231
Kenny Root655b9582013-04-04 08:37:42 -07002232 if (access(filename.string(), R_OK) == -1) {
2233 ALOGW("could not access %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002234 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002235 }
2236
Kenny Root655b9582013-04-04 08:37:42 -07002237 int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
Kenny Root07438c82012-11-02 15:41:02 -07002238 if (fd < 0) {
Kenny Root655b9582013-04-04 08:37:42 -07002239 ALOGW("could not open %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002240 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002241 }
2242
2243 struct stat s;
2244 int ret = fstat(fd, &s);
2245 close(fd);
2246 if (ret == -1) {
Kenny Root655b9582013-04-04 08:37:42 -07002247 ALOGW("could not stat %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002248 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002249 }
2250
Kenny Root36a9e232013-02-04 14:24:15 -08002251 return static_cast<int64_t>(s.st_mtime);
Kenny Root07438c82012-11-02 15:41:02 -07002252 }
2253
Kenny Rootd53bc922013-03-21 14:10:15 -07002254 int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
2255 int32_t destUid) {
Kenny Root02254072013-03-20 11:48:19 -07002256 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002257 pid_t spid = IPCThreadState::self()->getCallingPid();
2258 if (!has_permission(callingUid, P_DUPLICATE, spid)) {
Kenny Rootd53bc922013-03-21 14:10:15 -07002259 ALOGW("permission denied for %d: duplicate", callingUid);
Kenny Root02254072013-03-20 11:48:19 -07002260 return -1L;
2261 }
2262
Kenny Root655b9582013-04-04 08:37:42 -07002263 State state = mKeyStore->getState(callingUid);
Kenny Root02254072013-03-20 11:48:19 -07002264 if (!isKeystoreUnlocked(state)) {
Kenny Rootd53bc922013-03-21 14:10:15 -07002265 ALOGD("calling duplicate in state: %d", state);
Kenny Root02254072013-03-20 11:48:19 -07002266 return state;
2267 }
2268
Kenny Rootd53bc922013-03-21 14:10:15 -07002269 if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
2270 srcUid = callingUid;
2271 } else if (!is_granted_to(callingUid, srcUid)) {
2272 ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
Kenny Root02254072013-03-20 11:48:19 -07002273 return ::PERMISSION_DENIED;
2274 }
2275
Kenny Rootd53bc922013-03-21 14:10:15 -07002276 if (destUid == -1) {
2277 destUid = callingUid;
2278 }
2279
2280 if (srcUid != destUid) {
2281 if (static_cast<uid_t>(srcUid) != callingUid) {
2282 ALOGD("can only duplicate from caller to other or to same uid: "
2283 "calling=%d, srcUid=%d, destUid=%d", callingUid, srcUid, destUid);
2284 return ::PERMISSION_DENIED;
2285 }
2286
2287 if (!is_granted_to(callingUid, destUid)) {
2288 ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
2289 return ::PERMISSION_DENIED;
2290 }
2291 }
2292
2293 String8 source8(srcKey);
Kenny Root655b9582013-04-04 08:37:42 -07002294 String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid));
Kenny Root02254072013-03-20 11:48:19 -07002295
Kenny Rootd53bc922013-03-21 14:10:15 -07002296 String8 target8(destKey);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002297 String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, destUid));
Kenny Root02254072013-03-20 11:48:19 -07002298
Kenny Root655b9582013-04-04 08:37:42 -07002299 if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
2300 ALOGD("destination already exists: %s", targetFile.string());
Kenny Root02254072013-03-20 11:48:19 -07002301 return ::SYSTEM_ERROR;
2302 }
2303
Kenny Rootd53bc922013-03-21 14:10:15 -07002304 Blob keyBlob;
Kenny Root655b9582013-04-04 08:37:42 -07002305 ResponseCode responseCode = mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY,
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002306 srcUid);
Kenny Rootd53bc922013-03-21 14:10:15 -07002307 if (responseCode != ::NO_ERROR) {
2308 return responseCode;
Kenny Root02254072013-03-20 11:48:19 -07002309 }
Kenny Rootd53bc922013-03-21 14:10:15 -07002310
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002311 return mKeyStore->put(targetFile.string(), &keyBlob, destUid);
Kenny Root02254072013-03-20 11:48:19 -07002312 }
2313
Kenny Root1b0e3932013-09-05 13:06:32 -07002314 int32_t is_hardware_backed(const String16& keyType) {
2315 return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
Kenny Root8ddf35a2013-03-29 11:15:50 -07002316 }
2317
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002318 int32_t clear_uid(int64_t targetUid64) {
2319 uid_t targetUid = static_cast<uid_t>(targetUid64);
Kenny Roota9bb5492013-04-01 16:29:11 -07002320 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002321 pid_t spid = IPCThreadState::self()->getCallingPid();
2322 if (!has_permission(callingUid, P_CLEAR_UID, spid)) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002323 ALOGW("permission denied for %d: clear_uid", callingUid);
2324 return ::PERMISSION_DENIED;
2325 }
2326
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002327 if (targetUid64 == -1) {
2328 targetUid = callingUid;
Kenny Root007cb232014-07-30 16:59:42 -07002329 } else if (!is_self_or_system(callingUid, targetUid)) {
2330 ALOGW("permission denied for %d: clear_uid %d", callingUid, targetUid);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002331 return ::PERMISSION_DENIED;
2332 }
2333
Kenny Roota9bb5492013-04-01 16:29:11 -07002334 const keymaster_device_t* device = mKeyStore->getDevice();
2335 if (device == NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07002336 ALOGW("can't get keymaster device");
Kenny Roota9bb5492013-04-01 16:29:11 -07002337 return ::SYSTEM_ERROR;
2338 }
2339
Robin Lee4b84fdc2014-09-24 11:56:57 +01002340 String8 prefix = String8::format("%u_", targetUid);
2341 Vector<String16> aliases;
2342 if (mKeyStore->saw(prefix, &aliases, targetUid) != ::NO_ERROR) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002343 return ::SYSTEM_ERROR;
2344 }
2345
Robin Lee4b84fdc2014-09-24 11:56:57 +01002346 for (uint32_t i = 0; i < aliases.size(); i++) {
2347 String8 name8(aliases[i]);
2348 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
2349 mKeyStore->del(filename.string(), ::TYPE_ANY, targetUid);
Kenny Roota9bb5492013-04-01 16:29:11 -07002350 }
Robin Lee4b84fdc2014-09-24 11:56:57 +01002351 return ::NO_ERROR;
Kenny Roota9bb5492013-04-01 16:29:11 -07002352 }
2353
Robin Lee4b84fdc2014-09-24 11:56:57 +01002354 int32_t reset_uid(int32_t targetUid) {
Robin Lee4e865752014-08-19 17:37:55 +01002355 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2356 pid_t spid = IPCThreadState::self()->getCallingPid();
Robin Lee4b84fdc2014-09-24 11:56:57 +01002357
Robin Lee4e865752014-08-19 17:37:55 +01002358 if (!has_permission(callingUid, P_RESET_UID, spid)) {
Robin Lee4b84fdc2014-09-24 11:56:57 +01002359 ALOGW("permission denied for %d: reset_uid %d", callingUid, targetUid);
Robin Lee4e865752014-08-19 17:37:55 +01002360 return ::PERMISSION_DENIED;
2361 }
Robin Lee4b84fdc2014-09-24 11:56:57 +01002362 if (!is_self_or_system(callingUid, targetUid)) {
2363 ALOGW("permission denied for %d: reset_uid %d", callingUid, targetUid);
Robin Lee4e865752014-08-19 17:37:55 +01002364 return ::PERMISSION_DENIED;
2365 }
2366
Robin Lee4b84fdc2014-09-24 11:56:57 +01002367 return mKeyStore->reset(targetUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
Robin Lee4e865752014-08-19 17:37:55 +01002368 }
2369
2370 int32_t sync_uid(int32_t sourceUid, int32_t targetUid) {
2371 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2372 pid_t spid = IPCThreadState::self()->getCallingPid();
2373 if (!has_permission(callingUid, P_SYNC_UID, spid)) {
2374 ALOGW("permission denied for %d: sync_uid %d -> %d", callingUid, sourceUid, targetUid);
2375 return ::PERMISSION_DENIED;
2376 }
2377 if (callingUid != AID_SYSTEM) {
2378 ALOGW("permission denied for %d: sync_uid %d -> %d", callingUid, sourceUid, targetUid);
2379 return ::PERMISSION_DENIED;
2380 }
2381 if (sourceUid == targetUid) {
2382 return ::SYSTEM_ERROR;
2383 }
2384
2385 // Initialise user keystore with existing master key held in-memory
2386 return mKeyStore->copyMasterKey(sourceUid, targetUid);
2387 }
2388
2389 int32_t password_uid(const String16& pw, int32_t targetUid) {
2390 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2391 pid_t spid = IPCThreadState::self()->getCallingPid();
2392 if (!has_permission(callingUid, P_PASSWORD_UID, spid)) {
2393 ALOGW("permission denied for %d: password_uid %d", callingUid, targetUid);
2394 return ::PERMISSION_DENIED;
2395 }
2396 if (callingUid != AID_SYSTEM) {
2397 ALOGW("permission denied for %d: password_uid %d", callingUid, targetUid);
2398 return ::PERMISSION_DENIED;
2399 }
2400
2401 const String8 password8(pw);
2402
2403 switch (mKeyStore->getState(targetUid)) {
2404 case ::STATE_UNINITIALIZED: {
2405 // generate master key, encrypt with password, write to file, initialize mMasterKey*.
2406 return mKeyStore->initializeUser(password8, targetUid);
2407 }
2408 case ::STATE_NO_ERROR: {
2409 // rewrite master key with new password.
2410 return mKeyStore->writeMasterKey(password8, targetUid);
2411 }
2412 case ::STATE_LOCKED: {
2413 // read master key, decrypt with password, initialize mMasterKey*.
2414 return mKeyStore->readMasterKey(password8, targetUid);
2415 }
2416 }
2417 return ::SYSTEM_ERROR;
2418 }
2419
Kenny Root07438c82012-11-02 15:41:02 -07002420private:
Kenny Root9d45d1c2013-02-14 10:32:30 -08002421 inline bool isKeystoreUnlocked(State state) {
2422 switch (state) {
2423 case ::STATE_NO_ERROR:
2424 return true;
2425 case ::STATE_UNINITIALIZED:
2426 case ::STATE_LOCKED:
2427 return false;
2428 }
2429 return false;
Kenny Root07438c82012-11-02 15:41:02 -07002430 }
2431
Kenny Root1d448c02013-11-21 10:36:53 -08002432 bool isKeyTypeSupported(const keymaster_device_t* device, keymaster_keypair_t keyType) {
2433 const int32_t device_api = device->common.module->module_api_version;
2434 if (device_api == KEYMASTER_MODULE_API_VERSION_0_2) {
2435 switch (keyType) {
2436 case TYPE_RSA:
2437 case TYPE_DSA:
2438 case TYPE_EC:
2439 return true;
2440 default:
2441 return false;
2442 }
2443 } else if (device_api >= KEYMASTER_MODULE_API_VERSION_0_3) {
2444 switch (keyType) {
2445 case TYPE_RSA:
2446 return true;
2447 case TYPE_DSA:
2448 return device->flags & KEYMASTER_SUPPORTS_DSA;
2449 case TYPE_EC:
2450 return device->flags & KEYMASTER_SUPPORTS_EC;
2451 default:
2452 return false;
2453 }
2454 } else {
2455 return keyType == TYPE_RSA;
2456 }
2457 }
2458
Kenny Root07438c82012-11-02 15:41:02 -07002459 ::KeyStore* mKeyStore;
2460};
2461
2462}; // namespace android
Kenny Roota91203b2012-02-15 15:00:46 -08002463
2464int main(int argc, char* argv[]) {
Kenny Roota91203b2012-02-15 15:00:46 -08002465 if (argc < 2) {
2466 ALOGE("A directory must be specified!");
2467 return 1;
2468 }
2469 if (chdir(argv[1]) == -1) {
2470 ALOGE("chdir: %s: %s", argv[1], strerror(errno));
2471 return 1;
2472 }
2473
2474 Entropy entropy;
2475 if (!entropy.open()) {
2476 return 1;
2477 }
Kenny Root70e3a862012-02-15 17:20:23 -08002478
2479 keymaster_device_t* dev;
2480 if (keymaster_device_initialize(&dev)) {
2481 ALOGE("keystore keymaster could not be initialized; exiting");
2482 return 1;
2483 }
2484
Riley Spahneaabae92014-06-30 12:39:52 -07002485 ks_is_selinux_enabled = is_selinux_enabled();
2486 if (ks_is_selinux_enabled) {
2487 union selinux_callback cb;
2488 cb.func_log = selinux_log_callback;
2489 selinux_set_callback(SELINUX_CB_LOG, cb);
2490 if (getcon(&tctx) != 0) {
2491 ALOGE("SELinux: Could not acquire target context. Aborting keystore.\n");
2492 return -1;
2493 }
2494 } else {
2495 ALOGI("SELinux: Keystore SELinux is disabled.\n");
2496 }
2497
Kenny Root70e3a862012-02-15 17:20:23 -08002498 KeyStore keyStore(&entropy, dev);
Kenny Root655b9582013-04-04 08:37:42 -07002499 keyStore.initialize();
Kenny Root07438c82012-11-02 15:41:02 -07002500 android::sp<android::IServiceManager> sm = android::defaultServiceManager();
2501 android::sp<android::KeyStoreProxy> proxy = new android::KeyStoreProxy(&keyStore);
2502 android::status_t ret = sm->addService(android::String16("android.security.keystore"), proxy);
2503 if (ret != android::OK) {
2504 ALOGE("Couldn't register binder service!");
2505 return -1;
Kenny Roota91203b2012-02-15 15:00:46 -08002506 }
Kenny Root07438c82012-11-02 15:41:02 -07002507
2508 /*
2509 * We're the only thread in existence, so we're just going to process
2510 * Binder transaction as a single-threaded program.
2511 */
2512 android::IPCThreadState::self()->joinThreadPool();
Kenny Root70e3a862012-02-15 17:20:23 -08002513
2514 keymaster_device_release(dev);
Kenny Roota91203b2012-02-15 15:00:46 -08002515 return 1;
2516}