blob: 9e460d77079d9257c035051b29f2f8058ebc0c55 [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
Robin Lee4e865752014-08-19 17:37:55 +01001001
Kenny Root655b9582013-04-04 08:37:42 -07001002 ResponseCode readMasterKey(const android::String8& pw, uid_t uid) {
Robin Lee50122db2014-08-12 17:31:40 +01001003 UserState* userState = getUserState(uid);
Kenny Root655b9582013-04-04 08:37:42 -07001004 return userState->readMasterKey(pw, mEntropy);
1005 }
1006
1007 android::String8 getKeyName(const android::String8& keyName) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001008 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001009 encode_key(encoded, keyName);
1010 return android::String8(encoded);
1011 }
1012
1013 android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001014 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001015 encode_key(encoded, keyName);
1016 return android::String8::format("%u_%s", uid, encoded);
1017 }
1018
1019 android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid) {
Douglas Leunga77e8092013-06-13 16:34:43 -07001020 char encoded[encode_key_length(keyName) + 1]; // add 1 for null char
Kenny Root655b9582013-04-04 08:37:42 -07001021 encode_key(encoded, keyName);
1022 return android::String8::format("%s/%u_%s", getUserState(uid)->getUserDirName(), uid,
1023 encoded);
1024 }
1025
1026 bool reset(uid_t uid) {
1027 UserState* userState = getUserState(uid);
1028 userState->zeroizeMasterKeysInMemory();
1029 userState->setState(STATE_UNINITIALIZED);
1030 return userState->reset();
1031 }
1032
1033 bool isEmpty(uid_t uid) const {
1034 const UserState* userState = getUserState(uid);
1035 if (userState == NULL) {
1036 return true;
1037 }
1038
1039 DIR* dir = opendir(userState->getUserDirName());
Kenny Roota91203b2012-02-15 15:00:46 -08001040 struct dirent* file;
1041 if (!dir) {
1042 return true;
1043 }
1044 bool result = true;
Kenny Root655b9582013-04-04 08:37:42 -07001045
1046 char filename[NAME_MAX];
1047 int n = snprintf(filename, sizeof(filename), "%u_", uid);
1048
Kenny Roota91203b2012-02-15 15:00:46 -08001049 while ((file = readdir(dir)) != NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07001050 // We only care about files.
1051 if (file->d_type != DT_REG) {
1052 continue;
1053 }
1054
1055 // Skip anything that starts with a "."
1056 if (file->d_name[0] == '.') {
1057 continue;
1058 }
1059
1060 if (!strncmp(file->d_name, filename, n)) {
Kenny Roota91203b2012-02-15 15:00:46 -08001061 result = false;
1062 break;
1063 }
1064 }
1065 closedir(dir);
1066 return result;
1067 }
1068
Kenny Root655b9582013-04-04 08:37:42 -07001069 void lock(uid_t uid) {
1070 UserState* userState = getUserState(uid);
1071 userState->zeroizeMasterKeysInMemory();
1072 userState->setState(STATE_LOCKED);
Kenny Roota91203b2012-02-15 15:00:46 -08001073 }
1074
Kenny Root655b9582013-04-04 08:37:42 -07001075 ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t uid) {
1076 UserState* userState = getUserState(uid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001077 ResponseCode rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1078 userState->getState());
Kenny Root822c3a92012-03-23 16:34:39 -07001079 if (rc != NO_ERROR) {
1080 return rc;
1081 }
1082
1083 const uint8_t version = keyBlob->getVersion();
Kenny Root07438c82012-11-02 15:41:02 -07001084 if (version < CURRENT_BLOB_VERSION) {
Kenny Rootcfeae072013-04-04 08:39:57 -07001085 /* If we upgrade the key, we need to write it to disk again. Then
1086 * it must be read it again since the blob is encrypted each time
1087 * it's written.
1088 */
Kenny Root655b9582013-04-04 08:37:42 -07001089 if (upgradeBlob(filename, keyBlob, version, type, uid)) {
1090 if ((rc = this->put(filename, keyBlob, uid)) != NO_ERROR
Kenny Rootf9119d62013-04-03 09:22:15 -07001091 || (rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1092 userState->getState())) != NO_ERROR) {
Kenny Rootcfeae072013-04-04 08:39:57 -07001093 return rc;
1094 }
1095 }
Kenny Root822c3a92012-03-23 16:34:39 -07001096 }
1097
Kenny Root17208e02013-09-04 13:56:03 -07001098 /*
1099 * This will upgrade software-backed keys to hardware-backed keys when
1100 * the HAL for the device supports the newer key types.
1101 */
1102 if (rc == NO_ERROR && type == TYPE_KEY_PAIR
1103 && mDevice->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2
1104 && keyBlob->isFallback()) {
1105 ResponseCode imported = importKey(keyBlob->getValue(), keyBlob->getLength(), filename,
1106 uid, keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
1107
1108 // The HAL allowed the import, reget the key to have the "fresh"
1109 // version.
1110 if (imported == NO_ERROR) {
1111 rc = get(filename, keyBlob, TYPE_KEY_PAIR, uid);
1112 }
1113 }
1114
Kenny Rootd53bc922013-03-21 14:10:15 -07001115 if (type != TYPE_ANY && keyBlob->getType() != type) {
Kenny Root822c3a92012-03-23 16:34:39 -07001116 ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
1117 return KEY_NOT_FOUND;
1118 }
1119
1120 return rc;
Kenny Roota91203b2012-02-15 15:00:46 -08001121 }
1122
Kenny Root655b9582013-04-04 08:37:42 -07001123 ResponseCode put(const char* filename, Blob* keyBlob, uid_t uid) {
1124 UserState* userState = getUserState(uid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001125 return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
1126 mEntropy);
Kenny Roota91203b2012-02-15 15:00:46 -08001127 }
1128
Kenny Root07438c82012-11-02 15:41:02 -07001129 void addGrant(const char* filename, uid_t granteeUid) {
Kenny Root655b9582013-04-04 08:37:42 -07001130 const grant_t* existing = getGrant(filename, granteeUid);
1131 if (existing == NULL) {
1132 grant_t* grant = new grant_t;
Kenny Root07438c82012-11-02 15:41:02 -07001133 grant->uid = granteeUid;
Brian Carlstroma8c703d2012-07-17 14:43:46 -07001134 grant->filename = reinterpret_cast<const uint8_t*>(strdup(filename));
Kenny Root655b9582013-04-04 08:37:42 -07001135 mGrants.add(grant);
Kenny Root70e3a862012-02-15 17:20:23 -08001136 }
1137 }
1138
Kenny Root07438c82012-11-02 15:41:02 -07001139 bool removeGrant(const char* filename, uid_t granteeUid) {
Kenny Root655b9582013-04-04 08:37:42 -07001140 for (android::Vector<grant_t*>::iterator it(mGrants.begin());
1141 it != mGrants.end(); it++) {
1142 grant_t* grant = *it;
1143 if (grant->uid == granteeUid
1144 && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
1145 mGrants.erase(it);
1146 return true;
1147 }
Kenny Root70e3a862012-02-15 17:20:23 -08001148 }
Kenny Root70e3a862012-02-15 17:20:23 -08001149 return false;
1150 }
1151
Brian Carlstroma8c703d2012-07-17 14:43:46 -07001152 bool hasGrant(const char* filename, const uid_t uid) const {
1153 return getGrant(filename, uid) != NULL;
Kenny Root70e3a862012-02-15 17:20:23 -08001154 }
1155
Kenny Rootf9119d62013-04-03 09:22:15 -07001156 ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t uid,
1157 int32_t flags) {
Kenny Root822c3a92012-03-23 16:34:39 -07001158 uint8_t* data;
1159 size_t dataLength;
1160 int rc;
1161
1162 if (mDevice->import_keypair == NULL) {
1163 ALOGE("Keymaster doesn't support import!");
1164 return SYSTEM_ERROR;
1165 }
1166
Kenny Root17208e02013-09-04 13:56:03 -07001167 bool isFallback = false;
Kenny Root07438c82012-11-02 15:41:02 -07001168 rc = mDevice->import_keypair(mDevice, key, keyLen, &data, &dataLength);
Kenny Root822c3a92012-03-23 16:34:39 -07001169 if (rc) {
Kenny Root17208e02013-09-04 13:56:03 -07001170 // If this is an old device HAL, try to fall back to an old version
1171 if (mDevice->common.module->module_api_version < KEYMASTER_MODULE_API_VERSION_0_2) {
1172 rc = openssl_import_keypair(mDevice, key, keyLen, &data, &dataLength);
1173 isFallback = true;
1174 }
1175
1176 if (rc) {
1177 ALOGE("Error while importing keypair: %d", rc);
1178 return SYSTEM_ERROR;
1179 }
Kenny Root822c3a92012-03-23 16:34:39 -07001180 }
1181
1182 Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1183 free(data);
1184
Kenny Rootf9119d62013-04-03 09:22:15 -07001185 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
Kenny Root17208e02013-09-04 13:56:03 -07001186 keyBlob.setFallback(isFallback);
Kenny Rootf9119d62013-04-03 09:22:15 -07001187
Kenny Root655b9582013-04-04 08:37:42 -07001188 return put(filename, &keyBlob, uid);
Kenny Root822c3a92012-03-23 16:34:39 -07001189 }
1190
Kenny Root1b0e3932013-09-05 13:06:32 -07001191 bool isHardwareBacked(const android::String16& keyType) const {
1192 if (mDevice == NULL) {
1193 ALOGW("can't get keymaster device");
1194 return false;
1195 }
1196
1197 if (sRSAKeyType == keyType) {
1198 return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0;
1199 } else {
1200 return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0
1201 && (mDevice->common.module->module_api_version
1202 >= KEYMASTER_MODULE_API_VERSION_0_2);
1203 }
Kenny Root8ddf35a2013-03-29 11:15:50 -07001204 }
1205
Kenny Root655b9582013-04-04 08:37:42 -07001206 ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
1207 const BlobType type) {
Kenny Root86b16e82013-09-09 11:15:54 -07001208 android::String8 filepath8(getKeyNameForUidWithDir(keyName, uid));
Kenny Root655b9582013-04-04 08:37:42 -07001209
1210 ResponseCode responseCode = get(filepath8.string(), keyBlob, type, uid);
1211 if (responseCode == NO_ERROR) {
1212 return responseCode;
1213 }
1214
1215 // If this is one of the legacy UID->UID mappings, use it.
1216 uid_t euid = get_keystore_euid(uid);
1217 if (euid != uid) {
Kenny Root86b16e82013-09-09 11:15:54 -07001218 filepath8 = getKeyNameForUidWithDir(keyName, euid);
Kenny Root655b9582013-04-04 08:37:42 -07001219 responseCode = get(filepath8.string(), keyBlob, type, uid);
1220 if (responseCode == NO_ERROR) {
1221 return responseCode;
1222 }
1223 }
1224
1225 // They might be using a granted key.
Kenny Root86b16e82013-09-09 11:15:54 -07001226 android::String8 filename8 = getKeyName(keyName);
Kenny Root655b9582013-04-04 08:37:42 -07001227 char* end;
Kenny Root86b16e82013-09-09 11:15:54 -07001228 strtoul(filename8.string(), &end, 10);
Kenny Root655b9582013-04-04 08:37:42 -07001229 if (end[0] != '_' || end[1] == 0) {
1230 return KEY_NOT_FOUND;
1231 }
Kenny Root86b16e82013-09-09 11:15:54 -07001232 filepath8 = android::String8::format("%s/%s", getUserState(uid)->getUserDirName(),
1233 filename8.string());
Kenny Root655b9582013-04-04 08:37:42 -07001234 if (!hasGrant(filepath8.string(), uid)) {
1235 return responseCode;
1236 }
1237
1238 // It is a granted key. Try to load it.
1239 return get(filepath8.string(), keyBlob, type, uid);
1240 }
1241
1242 /**
1243 * Returns any existing UserState or creates it if it doesn't exist.
1244 */
1245 UserState* getUserState(uid_t uid) {
1246 uid_t userId = get_user_id(uid);
1247
1248 for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
1249 it != mMasterKeys.end(); it++) {
1250 UserState* state = *it;
1251 if (state->getUserId() == userId) {
1252 return state;
1253 }
1254 }
1255
1256 UserState* userState = new UserState(userId);
1257 if (!userState->initialize()) {
1258 /* There's not much we can do if initialization fails. Trying to
1259 * unlock the keystore for that user will fail as well, so any
1260 * subsequent request for this user will just return SYSTEM_ERROR.
1261 */
1262 ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
1263 }
1264 mMasterKeys.add(userState);
1265 return userState;
1266 }
1267
1268 /**
1269 * Returns NULL if the UserState doesn't already exist.
1270 */
1271 const UserState* getUserState(uid_t uid) const {
1272 uid_t userId = get_user_id(uid);
1273
1274 for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
1275 it != mMasterKeys.end(); it++) {
1276 UserState* state = *it;
1277 if (state->getUserId() == userId) {
1278 return state;
1279 }
1280 }
1281
1282 return NULL;
1283 }
1284
Kenny Roota91203b2012-02-15 15:00:46 -08001285private:
Kenny Root655b9582013-04-04 08:37:42 -07001286 static const char* sOldMasterKey;
1287 static const char* sMetaDataFile;
Kenny Root1b0e3932013-09-05 13:06:32 -07001288 static const android::String16 sRSAKeyType;
Kenny Roota91203b2012-02-15 15:00:46 -08001289 Entropy* mEntropy;
1290
Kenny Root70e3a862012-02-15 17:20:23 -08001291 keymaster_device_t* mDevice;
1292
Kenny Root655b9582013-04-04 08:37:42 -07001293 android::Vector<UserState*> mMasterKeys;
Kenny Roota91203b2012-02-15 15:00:46 -08001294
Kenny Root655b9582013-04-04 08:37:42 -07001295 android::Vector<grant_t*> mGrants;
Kenny Roota91203b2012-02-15 15:00:46 -08001296
Kenny Root655b9582013-04-04 08:37:42 -07001297 typedef struct {
1298 uint32_t version;
1299 } keystore_metadata_t;
Kenny Roota91203b2012-02-15 15:00:46 -08001300
Kenny Root655b9582013-04-04 08:37:42 -07001301 keystore_metadata_t mMetaData;
Kenny Root70e3a862012-02-15 17:20:23 -08001302
Kenny Root655b9582013-04-04 08:37:42 -07001303 const grant_t* getGrant(const char* filename, uid_t uid) const {
1304 for (android::Vector<grant_t*>::const_iterator it(mGrants.begin());
1305 it != mGrants.end(); it++) {
1306 grant_t* grant = *it;
Kenny Root70e3a862012-02-15 17:20:23 -08001307 if (grant->uid == uid
Kenny Root655b9582013-04-04 08:37:42 -07001308 && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
Kenny Root70e3a862012-02-15 17:20:23 -08001309 return grant;
1310 }
1311 }
Kenny Root70e3a862012-02-15 17:20:23 -08001312 return NULL;
1313 }
1314
Kenny Root822c3a92012-03-23 16:34:39 -07001315 /**
1316 * Upgrade code. This will upgrade the key from the current version
1317 * to whatever is newest.
1318 */
Kenny Root655b9582013-04-04 08:37:42 -07001319 bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
1320 const BlobType type, uid_t uid) {
Kenny Root822c3a92012-03-23 16:34:39 -07001321 bool updated = false;
1322 uint8_t version = oldVersion;
1323
1324 /* From V0 -> V1: All old types were unknown */
1325 if (version == 0) {
1326 ALOGV("upgrading to version 1 and setting type %d", type);
1327
1328 blob->setType(type);
1329 if (type == TYPE_KEY_PAIR) {
Kenny Root655b9582013-04-04 08:37:42 -07001330 importBlobAsKey(blob, filename, uid);
Kenny Root822c3a92012-03-23 16:34:39 -07001331 }
1332 version = 1;
1333 updated = true;
1334 }
1335
Kenny Rootf9119d62013-04-03 09:22:15 -07001336 /* From V1 -> V2: All old keys were encrypted */
1337 if (version == 1) {
1338 ALOGV("upgrading to version 2");
1339
1340 blob->setEncrypted(true);
1341 version = 2;
1342 updated = true;
1343 }
1344
Kenny Root822c3a92012-03-23 16:34:39 -07001345 /*
1346 * If we've updated, set the key blob to the right version
1347 * and write it.
Kenny Rootcfeae072013-04-04 08:39:57 -07001348 */
Kenny Root822c3a92012-03-23 16:34:39 -07001349 if (updated) {
1350 ALOGV("updated and writing file %s", filename);
1351 blob->setVersion(version);
Kenny Root822c3a92012-03-23 16:34:39 -07001352 }
Kenny Rootcfeae072013-04-04 08:39:57 -07001353
1354 return updated;
Kenny Root822c3a92012-03-23 16:34:39 -07001355 }
1356
1357 /**
1358 * Takes a blob that is an PEM-encoded RSA key as a byte array and
1359 * converts it to a DER-encoded PKCS#8 for import into a keymaster.
1360 * Then it overwrites the original blob with the new blob
1361 * format that is returned from the keymaster.
1362 */
Kenny Root655b9582013-04-04 08:37:42 -07001363 ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid) {
Kenny Root822c3a92012-03-23 16:34:39 -07001364 // We won't even write to the blob directly with this BIO, so const_cast is okay.
1365 Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
1366 if (b.get() == NULL) {
1367 ALOGE("Problem instantiating BIO");
1368 return SYSTEM_ERROR;
1369 }
1370
1371 Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
1372 if (pkey.get() == NULL) {
1373 ALOGE("Couldn't read old PEM file");
1374 return SYSTEM_ERROR;
1375 }
1376
1377 Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
1378 int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
1379 if (len < 0) {
1380 ALOGE("Couldn't measure PKCS#8 length");
1381 return SYSTEM_ERROR;
1382 }
1383
Kenny Root70c98892013-02-07 09:10:36 -08001384 UniquePtr<unsigned char[]> pkcs8key(new unsigned char[len]);
1385 uint8_t* tmp = pkcs8key.get();
Kenny Root822c3a92012-03-23 16:34:39 -07001386 if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
1387 ALOGE("Couldn't convert to PKCS#8");
1388 return SYSTEM_ERROR;
1389 }
1390
Kenny Rootf9119d62013-04-03 09:22:15 -07001391 ResponseCode rc = importKey(pkcs8key.get(), len, filename, uid,
1392 blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
Kenny Root822c3a92012-03-23 16:34:39 -07001393 if (rc != NO_ERROR) {
1394 return rc;
1395 }
1396
Kenny Root655b9582013-04-04 08:37:42 -07001397 return get(filename, blob, TYPE_KEY_PAIR, uid);
1398 }
1399
1400 void readMetaData() {
1401 int in = TEMP_FAILURE_RETRY(open(sMetaDataFile, O_RDONLY));
1402 if (in < 0) {
1403 return;
1404 }
1405 size_t fileLength = readFully(in, (uint8_t*) &mMetaData, sizeof(mMetaData));
1406 if (fileLength != sizeof(mMetaData)) {
1407 ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength,
1408 sizeof(mMetaData));
1409 }
1410 close(in);
1411 }
1412
1413 void writeMetaData() {
1414 const char* tmpFileName = ".metadata.tmp";
1415 int out = TEMP_FAILURE_RETRY(open(tmpFileName,
1416 O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
1417 if (out < 0) {
1418 ALOGE("couldn't write metadata file: %s", strerror(errno));
1419 return;
1420 }
1421 size_t fileLength = writeFully(out, (uint8_t*) &mMetaData, sizeof(mMetaData));
1422 if (fileLength != sizeof(mMetaData)) {
1423 ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
1424 sizeof(mMetaData));
1425 }
1426 close(out);
1427 rename(tmpFileName, sMetaDataFile);
1428 }
1429
1430 bool upgradeKeystore() {
1431 bool upgraded = false;
1432
1433 if (mMetaData.version == 0) {
1434 UserState* userState = getUserState(0);
1435
1436 // Initialize first so the directory is made.
1437 userState->initialize();
1438
1439 // Migrate the old .masterkey file to user 0.
1440 if (access(sOldMasterKey, R_OK) == 0) {
1441 if (rename(sOldMasterKey, userState->getMasterKeyFileName()) < 0) {
1442 ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
1443 return false;
1444 }
1445 }
1446
1447 // Initialize again in case we had a key.
1448 userState->initialize();
1449
1450 // Try to migrate existing keys.
1451 DIR* dir = opendir(".");
1452 if (!dir) {
1453 // Give up now; maybe we can upgrade later.
1454 ALOGE("couldn't open keystore's directory; something is wrong");
1455 return false;
1456 }
1457
1458 struct dirent* file;
1459 while ((file = readdir(dir)) != NULL) {
1460 // We only care about files.
1461 if (file->d_type != DT_REG) {
1462 continue;
1463 }
1464
1465 // Skip anything that starts with a "."
1466 if (file->d_name[0] == '.') {
1467 continue;
1468 }
1469
1470 // Find the current file's user.
1471 char* end;
1472 unsigned long thisUid = strtoul(file->d_name, &end, 10);
1473 if (end[0] != '_' || end[1] == 0) {
1474 continue;
1475 }
1476 UserState* otherUser = getUserState(thisUid);
1477 if (otherUser->getUserId() != 0) {
1478 unlinkat(dirfd(dir), file->d_name, 0);
1479 }
1480
1481 // Rename the file into user directory.
1482 DIR* otherdir = opendir(otherUser->getUserDirName());
1483 if (otherdir == NULL) {
1484 ALOGW("couldn't open user directory for rename");
1485 continue;
1486 }
1487 if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
1488 ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
1489 }
1490 closedir(otherdir);
1491 }
1492 closedir(dir);
1493
1494 mMetaData.version = 1;
1495 upgraded = true;
1496 }
1497
1498 return upgraded;
Kenny Root822c3a92012-03-23 16:34:39 -07001499 }
Kenny Roota91203b2012-02-15 15:00:46 -08001500};
1501
Kenny Root655b9582013-04-04 08:37:42 -07001502const char* KeyStore::sOldMasterKey = ".masterkey";
1503const char* KeyStore::sMetaDataFile = ".metadata";
Kenny Root70e3a862012-02-15 17:20:23 -08001504
Kenny Root1b0e3932013-09-05 13:06:32 -07001505const android::String16 KeyStore::sRSAKeyType("RSA");
1506
Kenny Root07438c82012-11-02 15:41:02 -07001507namespace android {
1508class KeyStoreProxy : public BnKeystoreService, public IBinder::DeathRecipient {
1509public:
1510 KeyStoreProxy(KeyStore* keyStore)
1511 : mKeyStore(keyStore)
1512 {
Kenny Roota91203b2012-02-15 15:00:46 -08001513 }
Kenny Roota91203b2012-02-15 15:00:46 -08001514
Kenny Root07438c82012-11-02 15:41:02 -07001515 void binderDied(const wp<IBinder>&) {
1516 ALOGE("binder death detected");
Kenny Root822c3a92012-03-23 16:34:39 -07001517 }
Kenny Roota91203b2012-02-15 15:00:46 -08001518
Kenny Root07438c82012-11-02 15:41:02 -07001519 int32_t test() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001520 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001521 pid_t spid = IPCThreadState::self()->getCallingPid();
1522 if (!has_permission(callingUid, P_TEST, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001523 ALOGW("permission denied for %d: test", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001524 return ::PERMISSION_DENIED;
Kenny Roota91203b2012-02-15 15:00:46 -08001525 }
Kenny Roota91203b2012-02-15 15:00:46 -08001526
Kenny Root655b9582013-04-04 08:37:42 -07001527 return mKeyStore->getState(callingUid);
Kenny Root298e7b12012-03-26 13:54:44 -07001528 }
1529
Kenny Root07438c82012-11-02 15:41:02 -07001530 int32_t get(const String16& name, uint8_t** item, size_t* itemLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001531 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001532 pid_t spid = IPCThreadState::self()->getCallingPid();
1533 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001534 ALOGW("permission denied for %d: get", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001535 return ::PERMISSION_DENIED;
Kenny Roota91203b2012-02-15 15:00:46 -08001536 }
Kenny Root07438c82012-11-02 15:41:02 -07001537
Kenny Root07438c82012-11-02 15:41:02 -07001538 String8 name8(name);
Kenny Root07438c82012-11-02 15:41:02 -07001539 Blob keyBlob;
Nick Kralevich66dbf672014-06-30 17:09:14 +00001540
Kenny Root655b9582013-04-04 08:37:42 -07001541 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root49468902013-03-19 13:41:33 -07001542 TYPE_GENERIC);
Kenny Root07438c82012-11-02 15:41:02 -07001543 if (responseCode != ::NO_ERROR) {
Kenny Root655b9582013-04-04 08:37:42 -07001544 ALOGW("Could not read %s", name8.string());
Kenny Root07438c82012-11-02 15:41:02 -07001545 *item = NULL;
1546 *itemLength = 0;
1547 return responseCode;
Kenny Roota91203b2012-02-15 15:00:46 -08001548 }
Kenny Roota91203b2012-02-15 15:00:46 -08001549
Kenny Root07438c82012-11-02 15:41:02 -07001550 *item = (uint8_t*) malloc(keyBlob.getLength());
1551 memcpy(*item, keyBlob.getValue(), keyBlob.getLength());
1552 *itemLength = keyBlob.getLength();
Kenny Roota91203b2012-02-15 15:00:46 -08001553
Kenny Root07438c82012-11-02 15:41:02 -07001554 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001555 }
1556
Kenny Rootf9119d62013-04-03 09:22:15 -07001557 int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int targetUid,
1558 int32_t flags) {
Riley Spahneaabae92014-06-30 12:39:52 -07001559 pid_t spid = IPCThreadState::self()->getCallingPid();
Kenny Rootd38a0b02013-02-13 12:59:14 -08001560 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001561 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001562 ALOGW("permission denied for %d: insert", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001563 return ::PERMISSION_DENIED;
1564 }
Kenny Root07438c82012-11-02 15:41:02 -07001565
Kenny Rootf9119d62013-04-03 09:22:15 -07001566 State state = mKeyStore->getState(callingUid);
1567 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
1568 ALOGD("calling get in state: %d", state);
1569 return state;
1570 }
1571
Kenny Root49468902013-03-19 13:41:33 -07001572 if (targetUid == -1) {
1573 targetUid = callingUid;
1574 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001575 return ::PERMISSION_DENIED;
1576 }
1577
Kenny Root07438c82012-11-02 15:41:02 -07001578 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001579 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07001580
1581 Blob keyBlob(item, itemLength, NULL, 0, ::TYPE_GENERIC);
Kenny Rootee8068b2013-10-07 09:49:15 -07001582 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
1583
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001584 return mKeyStore->put(filename.string(), &keyBlob, targetUid);
Kenny Root70e3a862012-02-15 17:20:23 -08001585 }
1586
Kenny Root49468902013-03-19 13:41:33 -07001587 int32_t del(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001588 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001589 pid_t spid = IPCThreadState::self()->getCallingPid();
1590 if (!has_permission(callingUid, P_DELETE, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001591 ALOGW("permission denied for %d: del", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001592 return ::PERMISSION_DENIED;
1593 }
Kenny Root70e3a862012-02-15 17:20:23 -08001594
Kenny Root49468902013-03-19 13:41:33 -07001595 if (targetUid == -1) {
1596 targetUid = callingUid;
1597 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001598 return ::PERMISSION_DENIED;
1599 }
1600
Kenny Root07438c82012-11-02 15:41:02 -07001601 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001602 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07001603
1604 Blob keyBlob;
Kenny Root655b9582013-04-04 08:37:42 -07001605 ResponseCode responseCode = mKeyStore->get(filename.string(), &keyBlob, TYPE_GENERIC,
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001606 targetUid);
Kenny Root07438c82012-11-02 15:41:02 -07001607 if (responseCode != ::NO_ERROR) {
1608 return responseCode;
1609 }
1610 return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001611 }
1612
Kenny Root49468902013-03-19 13:41:33 -07001613 int32_t exist(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001614 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001615 pid_t spid = IPCThreadState::self()->getCallingPid();
1616 if (!has_permission(callingUid, P_EXIST, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001617 ALOGW("permission denied for %d: exist", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001618 return ::PERMISSION_DENIED;
1619 }
Kenny Root70e3a862012-02-15 17:20:23 -08001620
Kenny Root49468902013-03-19 13:41:33 -07001621 if (targetUid == -1) {
1622 targetUid = callingUid;
1623 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001624 return ::PERMISSION_DENIED;
1625 }
1626
Kenny Root07438c82012-11-02 15:41:02 -07001627 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07001628 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root70e3a862012-02-15 17:20:23 -08001629
Kenny Root655b9582013-04-04 08:37:42 -07001630 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07001631 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
1632 }
1633 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001634 }
1635
Kenny Root49468902013-03-19 13:41:33 -07001636 int32_t saw(const String16& prefix, int targetUid, Vector<String16>* matches) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001637 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001638 pid_t spid = IPCThreadState::self()->getCallingPid();
1639 if (!has_permission(callingUid, P_SAW, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001640 ALOGW("permission denied for %d: saw", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001641 return ::PERMISSION_DENIED;
1642 }
Kenny Root70e3a862012-02-15 17:20:23 -08001643
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 Root655b9582013-04-04 08:37:42 -07001650 UserState* userState = mKeyStore->getUserState(targetUid);
1651 DIR* dir = opendir(userState->getUserDirName());
Kenny Root07438c82012-11-02 15:41:02 -07001652 if (!dir) {
Kenny Root655b9582013-04-04 08:37:42 -07001653 ALOGW("can't open directory for user: %s", strerror(errno));
Kenny Root07438c82012-11-02 15:41:02 -07001654 return ::SYSTEM_ERROR;
1655 }
Kenny Root70e3a862012-02-15 17:20:23 -08001656
Kenny Root07438c82012-11-02 15:41:02 -07001657 const String8 prefix8(prefix);
Kenny Root655b9582013-04-04 08:37:42 -07001658 String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid));
1659 size_t n = filename.length();
Kenny Root70e3a862012-02-15 17:20:23 -08001660
Kenny Root07438c82012-11-02 15:41:02 -07001661 struct dirent* file;
1662 while ((file = readdir(dir)) != NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07001663 // We only care about files.
1664 if (file->d_type != DT_REG) {
1665 continue;
1666 }
1667
1668 // Skip anything that starts with a "."
1669 if (file->d_name[0] == '.') {
1670 continue;
1671 }
1672
1673 if (!strncmp(filename.string(), file->d_name, n)) {
Kenny Root07438c82012-11-02 15:41:02 -07001674 const char* p = &file->d_name[n];
1675 size_t plen = strlen(p);
Kenny Root70e3a862012-02-15 17:20:23 -08001676
Kenny Root07438c82012-11-02 15:41:02 -07001677 size_t extra = decode_key_length(p, plen);
1678 char *match = (char*) malloc(extra + 1);
1679 if (match != NULL) {
1680 decode_key(match, p, plen);
1681 matches->push(String16(match, extra));
1682 free(match);
1683 } else {
1684 ALOGW("could not allocate match of size %zd", extra);
1685 }
Kenny Root9a53d3e2012-08-14 10:47:54 -07001686 }
1687 }
Kenny Root07438c82012-11-02 15:41:02 -07001688 closedir(dir);
1689
1690 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001691 }
1692
Kenny Root07438c82012-11-02 15:41:02 -07001693 int32_t reset() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001694 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001695 pid_t spid = IPCThreadState::self()->getCallingPid();
1696 if (!has_permission(callingUid, P_RESET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001697 ALOGW("permission denied for %d: reset", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001698 return ::PERMISSION_DENIED;
1699 }
1700
Kenny Root655b9582013-04-04 08:37:42 -07001701 ResponseCode rc = mKeyStore->reset(callingUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
Kenny Root07438c82012-11-02 15:41:02 -07001702
1703 const keymaster_device_t* device = mKeyStore->getDevice();
1704 if (device == NULL) {
1705 ALOGE("No keymaster device!");
1706 return ::SYSTEM_ERROR;
1707 }
1708
1709 if (device->delete_all == NULL) {
1710 ALOGV("keymaster device doesn't implement delete_all");
1711 return rc;
1712 }
1713
1714 if (device->delete_all(device)) {
1715 ALOGE("Problem calling keymaster's delete_all");
1716 return ::SYSTEM_ERROR;
1717 }
1718
Kenny Root9a53d3e2012-08-14 10:47:54 -07001719 return rc;
Kenny Root70e3a862012-02-15 17:20:23 -08001720 }
1721
Kenny Root07438c82012-11-02 15:41:02 -07001722 /*
1723 * Here is the history. To improve the security, the parameters to generate the
1724 * master key has been changed. To make a seamless transition, we update the
1725 * file using the same password when the user unlock it for the first time. If
1726 * any thing goes wrong during the transition, the new file will not overwrite
1727 * the old one. This avoids permanent damages of the existing data.
1728 */
1729 int32_t password(const String16& password) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001730 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001731 pid_t spid = IPCThreadState::self()->getCallingPid();
1732 if (!has_permission(callingUid, P_PASSWORD, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001733 ALOGW("permission denied for %d: password", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001734 return ::PERMISSION_DENIED;
1735 }
Kenny Root70e3a862012-02-15 17:20:23 -08001736
Kenny Root07438c82012-11-02 15:41:02 -07001737 const String8 password8(password);
Kenny Root70e3a862012-02-15 17:20:23 -08001738
Kenny Root655b9582013-04-04 08:37:42 -07001739 switch (mKeyStore->getState(callingUid)) {
Kenny Root07438c82012-11-02 15:41:02 -07001740 case ::STATE_UNINITIALIZED: {
1741 // generate master key, encrypt with password, write to file, initialize mMasterKey*.
Kenny Root655b9582013-04-04 08:37:42 -07001742 return mKeyStore->initializeUser(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001743 }
1744 case ::STATE_NO_ERROR: {
1745 // rewrite master key with new password.
Kenny Root655b9582013-04-04 08:37:42 -07001746 return mKeyStore->writeMasterKey(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001747 }
1748 case ::STATE_LOCKED: {
1749 // read master key, decrypt with password, initialize mMasterKey*.
Kenny Root655b9582013-04-04 08:37:42 -07001750 return mKeyStore->readMasterKey(password8, callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001751 }
1752 }
1753 return ::SYSTEM_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001754 }
1755
Kenny Root07438c82012-11-02 15:41:02 -07001756 int32_t lock() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001757 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001758 pid_t spid = IPCThreadState::self()->getCallingPid();
1759 if (!has_permission(callingUid, P_LOCK, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001760 ALOGW("permission denied for %d: lock", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001761 return ::PERMISSION_DENIED;
1762 }
Kenny Root70e3a862012-02-15 17:20:23 -08001763
Kenny Root655b9582013-04-04 08:37:42 -07001764 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08001765 if (state != ::STATE_NO_ERROR) {
Kenny Root07438c82012-11-02 15:41:02 -07001766 ALOGD("calling lock in state: %d", state);
1767 return state;
1768 }
1769
Kenny Root655b9582013-04-04 08:37:42 -07001770 mKeyStore->lock(callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001771 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001772 }
1773
Kenny Root07438c82012-11-02 15:41:02 -07001774 int32_t unlock(const String16& pw) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001775 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001776 pid_t spid = IPCThreadState::self()->getCallingPid();
1777 if (!has_permission(callingUid, P_UNLOCK, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001778 ALOGW("permission denied for %d: unlock", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001779 return ::PERMISSION_DENIED;
1780 }
1781
Kenny Root655b9582013-04-04 08:37:42 -07001782 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08001783 if (state != ::STATE_LOCKED) {
Kenny Root07438c82012-11-02 15:41:02 -07001784 ALOGD("calling unlock when not locked");
1785 return state;
1786 }
1787
1788 const String8 password8(pw);
1789 return password(pw);
Kenny Root70e3a862012-02-15 17:20:23 -08001790 }
1791
Kenny Root07438c82012-11-02 15:41:02 -07001792 int32_t zero() {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001793 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001794 pid_t spid = IPCThreadState::self()->getCallingPid();
1795 if (!has_permission(callingUid, P_ZERO, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001796 ALOGW("permission denied for %d: zero", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001797 return -1;
1798 }
Kenny Root70e3a862012-02-15 17:20:23 -08001799
Kenny Root655b9582013-04-04 08:37:42 -07001800 return mKeyStore->isEmpty(callingUid) ? ::KEY_NOT_FOUND : ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08001801 }
1802
Kenny Root96427ba2013-08-16 14:02:41 -07001803 int32_t generate(const String16& name, int32_t targetUid, int32_t keyType, int32_t keySize,
1804 int32_t flags, Vector<sp<KeystoreArg> >* args) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001805 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001806 pid_t spid = IPCThreadState::self()->getCallingPid();
1807 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001808 ALOGW("permission denied for %d: generate", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001809 return ::PERMISSION_DENIED;
1810 }
Kenny Root70e3a862012-02-15 17:20:23 -08001811
Kenny Root49468902013-03-19 13:41:33 -07001812 if (targetUid == -1) {
1813 targetUid = callingUid;
1814 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001815 return ::PERMISSION_DENIED;
1816 }
1817
Kenny Root655b9582013-04-04 08:37:42 -07001818 State state = mKeyStore->getState(callingUid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001819 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
1820 ALOGW("calling generate in state: %d", state);
Kenny Root07438c82012-11-02 15:41:02 -07001821 return state;
1822 }
Kenny Root70e3a862012-02-15 17:20:23 -08001823
Kenny Root07438c82012-11-02 15:41:02 -07001824 uint8_t* data;
1825 size_t dataLength;
1826 int rc;
Kenny Root17208e02013-09-04 13:56:03 -07001827 bool isFallback = false;
Kenny Root07438c82012-11-02 15:41:02 -07001828
1829 const keymaster_device_t* device = mKeyStore->getDevice();
1830 if (device == NULL) {
1831 return ::SYSTEM_ERROR;
1832 }
1833
1834 if (device->generate_keypair == NULL) {
1835 return ::SYSTEM_ERROR;
1836 }
1837
Kenny Root17208e02013-09-04 13:56:03 -07001838 if (keyType == EVP_PKEY_DSA) {
Kenny Root96427ba2013-08-16 14:02:41 -07001839 keymaster_dsa_keygen_params_t dsa_params;
1840 memset(&dsa_params, '\0', sizeof(dsa_params));
Kenny Root07438c82012-11-02 15:41:02 -07001841
Kenny Root96427ba2013-08-16 14:02:41 -07001842 if (keySize == -1) {
1843 keySize = DSA_DEFAULT_KEY_SIZE;
1844 } else if ((keySize % 64) != 0 || keySize < DSA_MIN_KEY_SIZE
1845 || keySize > DSA_MAX_KEY_SIZE) {
1846 ALOGI("invalid key size %d", keySize);
1847 return ::SYSTEM_ERROR;
1848 }
1849 dsa_params.key_size = keySize;
1850
1851 if (args->size() == 3) {
1852 sp<KeystoreArg> gArg = args->itemAt(0);
1853 sp<KeystoreArg> pArg = args->itemAt(1);
1854 sp<KeystoreArg> qArg = args->itemAt(2);
1855
1856 if (gArg != NULL && pArg != NULL && qArg != NULL) {
1857 dsa_params.generator = reinterpret_cast<const uint8_t*>(gArg->data());
1858 dsa_params.generator_len = gArg->size();
1859
1860 dsa_params.prime_p = reinterpret_cast<const uint8_t*>(pArg->data());
1861 dsa_params.prime_p_len = pArg->size();
1862
1863 dsa_params.prime_q = reinterpret_cast<const uint8_t*>(qArg->data());
1864 dsa_params.prime_q_len = qArg->size();
1865 } else {
1866 ALOGI("not all DSA parameters were read");
1867 return ::SYSTEM_ERROR;
1868 }
1869 } else if (args->size() != 0) {
1870 ALOGI("DSA args must be 3");
1871 return ::SYSTEM_ERROR;
1872 }
1873
Kenny Root1d448c02013-11-21 10:36:53 -08001874 if (isKeyTypeSupported(device, TYPE_DSA)) {
Kenny Root17208e02013-09-04 13:56:03 -07001875 rc = device->generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
1876 } else {
1877 isFallback = true;
1878 rc = openssl_generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
1879 }
1880 } else if (keyType == EVP_PKEY_EC) {
Kenny Root96427ba2013-08-16 14:02:41 -07001881 keymaster_ec_keygen_params_t ec_params;
1882 memset(&ec_params, '\0', sizeof(ec_params));
1883
1884 if (keySize == -1) {
1885 keySize = EC_DEFAULT_KEY_SIZE;
1886 } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
1887 ALOGI("invalid key size %d", keySize);
1888 return ::SYSTEM_ERROR;
1889 }
1890 ec_params.field_size = keySize;
1891
Kenny Root1d448c02013-11-21 10:36:53 -08001892 if (isKeyTypeSupported(device, TYPE_EC)) {
Kenny Root17208e02013-09-04 13:56:03 -07001893 rc = device->generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
1894 } else {
1895 isFallback = true;
1896 rc = openssl_generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
1897 }
Kenny Root96427ba2013-08-16 14:02:41 -07001898 } else if (keyType == EVP_PKEY_RSA) {
1899 keymaster_rsa_keygen_params_t rsa_params;
1900 memset(&rsa_params, '\0', sizeof(rsa_params));
1901 rsa_params.public_exponent = RSA_DEFAULT_EXPONENT;
1902
1903 if (keySize == -1) {
1904 keySize = RSA_DEFAULT_KEY_SIZE;
1905 } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
1906 ALOGI("invalid key size %d", keySize);
1907 return ::SYSTEM_ERROR;
1908 }
1909 rsa_params.modulus_size = keySize;
1910
1911 if (args->size() > 1) {
Matteo Franchin6489e022013-12-02 14:46:29 +00001912 ALOGI("invalid number of arguments: %zu", args->size());
Kenny Root96427ba2013-08-16 14:02:41 -07001913 return ::SYSTEM_ERROR;
1914 } else if (args->size() == 1) {
1915 sp<KeystoreArg> pubExpBlob = args->itemAt(0);
1916 if (pubExpBlob != NULL) {
1917 Unique_BIGNUM pubExpBn(
1918 BN_bin2bn(reinterpret_cast<const unsigned char*>(pubExpBlob->data()),
1919 pubExpBlob->size(), NULL));
1920 if (pubExpBn.get() == NULL) {
1921 ALOGI("Could not convert public exponent to BN");
1922 return ::SYSTEM_ERROR;
1923 }
1924 unsigned long pubExp = BN_get_word(pubExpBn.get());
1925 if (pubExp == 0xFFFFFFFFL) {
1926 ALOGI("cannot represent public exponent as a long value");
1927 return ::SYSTEM_ERROR;
1928 }
1929 rsa_params.public_exponent = pubExp;
1930 }
1931 }
1932
1933 rc = device->generate_keypair(device, TYPE_RSA, &rsa_params, &data, &dataLength);
1934 } else {
1935 ALOGW("Unsupported key type %d", keyType);
1936 rc = -1;
1937 }
1938
Kenny Root07438c82012-11-02 15:41:02 -07001939 if (rc) {
1940 return ::SYSTEM_ERROR;
1941 }
1942
Kenny Root655b9582013-04-04 08:37:42 -07001943 String8 name8(name);
1944 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07001945
1946 Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1947 free(data);
1948
Kenny Rootee8068b2013-10-07 09:49:15 -07001949 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
Kenny Root17208e02013-09-04 13:56:03 -07001950 keyBlob.setFallback(isFallback);
1951
Kenny Root655b9582013-04-04 08:37:42 -07001952 return mKeyStore->put(filename.string(), &keyBlob, callingUid);
Kenny Root70e3a862012-02-15 17:20:23 -08001953 }
1954
Kenny Rootf9119d62013-04-03 09:22:15 -07001955 int32_t import(const String16& name, const uint8_t* data, size_t length, int targetUid,
1956 int32_t flags) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001957 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001958 pid_t spid = IPCThreadState::self()->getCallingPid();
1959 if (!has_permission(callingUid, P_INSERT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001960 ALOGW("permission denied for %d: import", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001961 return ::PERMISSION_DENIED;
1962 }
Kenny Root07438c82012-11-02 15:41:02 -07001963
Kenny Root49468902013-03-19 13:41:33 -07001964 if (targetUid == -1) {
1965 targetUid = callingUid;
1966 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08001967 return ::PERMISSION_DENIED;
1968 }
1969
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001970 State state = mKeyStore->getState(targetUid);
Kenny Rootf9119d62013-04-03 09:22:15 -07001971 if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07001972 ALOGD("calling import in state: %d", state);
1973 return state;
1974 }
1975
1976 String8 name8(name);
Kenny Root60898892013-04-16 18:08:03 -07001977 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07001978
Kenny Rootfa27d5b2013-10-15 09:01:08 -07001979 return mKeyStore->importKey(data, length, filename.string(), targetUid, flags);
Kenny Root70e3a862012-02-15 17:20:23 -08001980 }
1981
Kenny Root07438c82012-11-02 15:41:02 -07001982 int32_t sign(const String16& name, const uint8_t* data, size_t length, uint8_t** out,
1983 size_t* outLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001984 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07001985 pid_t spid = IPCThreadState::self()->getCallingPid();
1986 if (!has_permission(callingUid, P_SIGN, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08001987 ALOGW("permission denied for %d: saw", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001988 return ::PERMISSION_DENIED;
1989 }
Kenny Root07438c82012-11-02 15:41:02 -07001990
Kenny Root07438c82012-11-02 15:41:02 -07001991 Blob keyBlob;
1992 String8 name8(name);
1993
Kenny Rootd38a0b02013-02-13 12:59:14 -08001994 ALOGV("sign %s from uid %d", name8.string(), callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07001995 int rc;
1996
Kenny Root655b9582013-04-04 08:37:42 -07001997 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Rootd38a0b02013-02-13 12:59:14 -08001998 ::TYPE_KEY_PAIR);
Kenny Root07438c82012-11-02 15:41:02 -07001999 if (responseCode != ::NO_ERROR) {
2000 return responseCode;
2001 }
2002
2003 const keymaster_device_t* device = mKeyStore->getDevice();
2004 if (device == NULL) {
2005 ALOGE("no keymaster device; cannot sign");
2006 return ::SYSTEM_ERROR;
2007 }
2008
2009 if (device->sign_data == NULL) {
2010 ALOGE("device doesn't implement signing");
2011 return ::SYSTEM_ERROR;
2012 }
2013
2014 keymaster_rsa_sign_params_t params;
2015 params.digest_type = DIGEST_NONE;
2016 params.padding_type = PADDING_NONE;
2017
Kenny Root17208e02013-09-04 13:56:03 -07002018 if (keyBlob.isFallback()) {
2019 rc = openssl_sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2020 length, out, outLength);
2021 } else {
2022 rc = device->sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2023 length, out, outLength);
2024 }
Kenny Root07438c82012-11-02 15:41:02 -07002025 if (rc) {
2026 ALOGW("device couldn't sign data");
2027 return ::SYSTEM_ERROR;
2028 }
2029
2030 return ::NO_ERROR;
Kenny Root70e3a862012-02-15 17:20:23 -08002031 }
2032
Kenny Root07438c82012-11-02 15:41:02 -07002033 int32_t verify(const String16& name, const uint8_t* data, size_t dataLength,
2034 const uint8_t* signature, size_t signatureLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002035 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002036 pid_t spid = IPCThreadState::self()->getCallingPid();
2037 if (!has_permission(callingUid, P_VERIFY, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002038 ALOGW("permission denied for %d: verify", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002039 return ::PERMISSION_DENIED;
2040 }
Kenny Root70e3a862012-02-15 17:20:23 -08002041
Kenny Root655b9582013-04-04 08:37:42 -07002042 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002043 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002044 ALOGD("calling verify in state: %d", state);
2045 return state;
2046 }
Kenny Root70e3a862012-02-15 17:20:23 -08002047
Kenny Root07438c82012-11-02 15:41:02 -07002048 Blob keyBlob;
2049 String8 name8(name);
2050 int rc;
Kenny Root70e3a862012-02-15 17:20:23 -08002051
Kenny Root655b9582013-04-04 08:37:42 -07002052 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root49468902013-03-19 13:41:33 -07002053 TYPE_KEY_PAIR);
Kenny Root07438c82012-11-02 15:41:02 -07002054 if (responseCode != ::NO_ERROR) {
2055 return responseCode;
2056 }
Kenny Root70e3a862012-02-15 17:20:23 -08002057
Kenny Root07438c82012-11-02 15:41:02 -07002058 const keymaster_device_t* device = mKeyStore->getDevice();
2059 if (device == NULL) {
2060 return ::SYSTEM_ERROR;
2061 }
Kenny Root70e3a862012-02-15 17:20:23 -08002062
Kenny Root07438c82012-11-02 15:41:02 -07002063 if (device->verify_data == NULL) {
2064 return ::SYSTEM_ERROR;
2065 }
Kenny Root70e3a862012-02-15 17:20:23 -08002066
Kenny Root07438c82012-11-02 15:41:02 -07002067 keymaster_rsa_sign_params_t params;
2068 params.digest_type = DIGEST_NONE;
2069 params.padding_type = PADDING_NONE;
Kenny Root344e0bc2012-08-15 10:44:03 -07002070
Kenny Root17208e02013-09-04 13:56:03 -07002071 if (keyBlob.isFallback()) {
2072 rc = openssl_verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2073 dataLength, signature, signatureLength);
2074 } else {
2075 rc = device->verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2076 dataLength, signature, signatureLength);
2077 }
Kenny Root07438c82012-11-02 15:41:02 -07002078 if (rc) {
2079 return ::SYSTEM_ERROR;
2080 } else {
2081 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -08002082 }
2083 }
Kenny Root07438c82012-11-02 15:41:02 -07002084
2085 /*
2086 * TODO: The abstraction between things stored in hardware and regular blobs
2087 * of data stored on the filesystem should be moved down to keystore itself.
2088 * Unfortunately the Java code that calls this has naming conventions that it
2089 * knows about. Ideally keystore shouldn't be used to store random blobs of
2090 * data.
2091 *
2092 * Until that happens, it's necessary to have a separate "get_pubkey" and
2093 * "del_key" since the Java code doesn't really communicate what it's
2094 * intentions are.
2095 */
2096 int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002097 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002098 pid_t spid = IPCThreadState::self()->getCallingPid();
2099 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002100 ALOGW("permission denied for %d: get_pubkey", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002101 return ::PERMISSION_DENIED;
2102 }
Kenny Root07438c82012-11-02 15:41:02 -07002103
Kenny Root07438c82012-11-02 15:41:02 -07002104 Blob keyBlob;
2105 String8 name8(name);
2106
Kenny Rootd38a0b02013-02-13 12:59:14 -08002107 ALOGV("get_pubkey '%s' from uid %d", name8.string(), callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002108
Kenny Root655b9582013-04-04 08:37:42 -07002109 ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
Kenny Root07438c82012-11-02 15:41:02 -07002110 TYPE_KEY_PAIR);
2111 if (responseCode != ::NO_ERROR) {
2112 return responseCode;
2113 }
2114
2115 const keymaster_device_t* device = mKeyStore->getDevice();
2116 if (device == NULL) {
2117 return ::SYSTEM_ERROR;
2118 }
2119
2120 if (device->get_keypair_public == NULL) {
2121 ALOGE("device has no get_keypair_public implementation!");
2122 return ::SYSTEM_ERROR;
2123 }
2124
Kenny Root17208e02013-09-04 13:56:03 -07002125 int rc;
2126 if (keyBlob.isFallback()) {
2127 rc = openssl_get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2128 pubkeyLength);
2129 } else {
2130 rc = device->get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2131 pubkeyLength);
2132 }
Kenny Root07438c82012-11-02 15:41:02 -07002133 if (rc) {
2134 return ::SYSTEM_ERROR;
2135 }
2136
2137 return ::NO_ERROR;
Kenny Roota91203b2012-02-15 15:00:46 -08002138 }
Kenny Root07438c82012-11-02 15:41:02 -07002139
Kenny Root49468902013-03-19 13:41:33 -07002140 int32_t del_key(const String16& name, int targetUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002141 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002142 pid_t spid = IPCThreadState::self()->getCallingPid();
2143 if (!has_permission(callingUid, P_DELETE, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002144 ALOGW("permission denied for %d: del_key", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002145 return ::PERMISSION_DENIED;
2146 }
Kenny Root07438c82012-11-02 15:41:02 -07002147
Kenny Root49468902013-03-19 13:41:33 -07002148 if (targetUid == -1) {
2149 targetUid = callingUid;
2150 } else if (!is_granted_to(callingUid, targetUid)) {
Kenny Rootb88c3eb2013-02-13 14:43:43 -08002151 return ::PERMISSION_DENIED;
2152 }
2153
Kenny Root07438c82012-11-02 15:41:02 -07002154 String8 name8(name);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002155 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
Kenny Root07438c82012-11-02 15:41:02 -07002156
2157 Blob keyBlob;
Kenny Root655b9582013-04-04 08:37:42 -07002158 ResponseCode responseCode = mKeyStore->get(filename.string(), &keyBlob, ::TYPE_KEY_PAIR,
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002159 targetUid);
Kenny Root07438c82012-11-02 15:41:02 -07002160 if (responseCode != ::NO_ERROR) {
2161 return responseCode;
2162 }
2163
2164 ResponseCode rc = ::NO_ERROR;
2165
2166 const keymaster_device_t* device = mKeyStore->getDevice();
2167 if (device == NULL) {
2168 rc = ::SYSTEM_ERROR;
2169 } else {
2170 // A device doesn't have to implement delete_keypair.
Kenny Root17208e02013-09-04 13:56:03 -07002171 if (device->delete_keypair != NULL && !keyBlob.isFallback()) {
Kenny Root07438c82012-11-02 15:41:02 -07002172 if (device->delete_keypair(device, keyBlob.getValue(), keyBlob.getLength())) {
2173 rc = ::SYSTEM_ERROR;
2174 }
2175 }
2176 }
2177
2178 if (rc != ::NO_ERROR) {
2179 return rc;
2180 }
2181
2182 return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
2183 }
2184
2185 int32_t grant(const String16& name, int32_t granteeUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002186 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002187 pid_t spid = IPCThreadState::self()->getCallingPid();
2188 if (!has_permission(callingUid, P_GRANT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002189 ALOGW("permission denied for %d: grant", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002190 return ::PERMISSION_DENIED;
2191 }
Kenny Root07438c82012-11-02 15:41:02 -07002192
Kenny Root655b9582013-04-04 08:37:42 -07002193 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002194 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002195 ALOGD("calling grant in state: %d", state);
2196 return state;
2197 }
2198
2199 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002200 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002201
Kenny Root655b9582013-04-04 08:37:42 -07002202 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07002203 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
2204 }
2205
Kenny Root655b9582013-04-04 08:37:42 -07002206 mKeyStore->addGrant(filename.string(), granteeUid);
Kenny Root07438c82012-11-02 15:41:02 -07002207 return ::NO_ERROR;
2208 }
2209
2210 int32_t ungrant(const String16& name, int32_t granteeUid) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002211 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002212 pid_t spid = IPCThreadState::self()->getCallingPid();
2213 if (!has_permission(callingUid, P_GRANT, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002214 ALOGW("permission denied for %d: ungrant", callingUid);
Kenny Root07438c82012-11-02 15:41:02 -07002215 return ::PERMISSION_DENIED;
2216 }
Kenny Root07438c82012-11-02 15:41:02 -07002217
Kenny Root655b9582013-04-04 08:37:42 -07002218 State state = mKeyStore->getState(callingUid);
Kenny Root9d45d1c2013-02-14 10:32:30 -08002219 if (!isKeystoreUnlocked(state)) {
Kenny Root07438c82012-11-02 15:41:02 -07002220 ALOGD("calling ungrant in state: %d", state);
2221 return state;
2222 }
2223
2224 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002225 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002226
Kenny Root655b9582013-04-04 08:37:42 -07002227 if (access(filename.string(), R_OK) == -1) {
Kenny Root07438c82012-11-02 15:41:02 -07002228 return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
2229 }
2230
Kenny Root655b9582013-04-04 08:37:42 -07002231 return mKeyStore->removeGrant(filename.string(), granteeUid) ? ::NO_ERROR : ::KEY_NOT_FOUND;
Kenny Root07438c82012-11-02 15:41:02 -07002232 }
2233
2234 int64_t getmtime(const String16& name) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002235 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002236 pid_t spid = IPCThreadState::self()->getCallingPid();
2237 if (!has_permission(callingUid, P_GET, spid)) {
Kenny Rootd38a0b02013-02-13 12:59:14 -08002238 ALOGW("permission denied for %d: getmtime", callingUid);
Kenny Root36a9e232013-02-04 14:24:15 -08002239 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002240 }
Kenny Root07438c82012-11-02 15:41:02 -07002241
2242 String8 name8(name);
Kenny Root655b9582013-04-04 08:37:42 -07002243 String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
Kenny Root07438c82012-11-02 15:41:02 -07002244
Kenny Root655b9582013-04-04 08:37:42 -07002245 if (access(filename.string(), R_OK) == -1) {
2246 ALOGW("could not access %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002247 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002248 }
2249
Kenny Root655b9582013-04-04 08:37:42 -07002250 int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
Kenny Root07438c82012-11-02 15:41:02 -07002251 if (fd < 0) {
Kenny Root655b9582013-04-04 08:37:42 -07002252 ALOGW("could not open %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002253 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002254 }
2255
2256 struct stat s;
2257 int ret = fstat(fd, &s);
2258 close(fd);
2259 if (ret == -1) {
Kenny Root655b9582013-04-04 08:37:42 -07002260 ALOGW("could not stat %s for getmtime", filename.string());
Kenny Root36a9e232013-02-04 14:24:15 -08002261 return -1L;
Kenny Root07438c82012-11-02 15:41:02 -07002262 }
2263
Kenny Root36a9e232013-02-04 14:24:15 -08002264 return static_cast<int64_t>(s.st_mtime);
Kenny Root07438c82012-11-02 15:41:02 -07002265 }
2266
Kenny Rootd53bc922013-03-21 14:10:15 -07002267 int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
2268 int32_t destUid) {
Kenny Root02254072013-03-20 11:48:19 -07002269 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002270 pid_t spid = IPCThreadState::self()->getCallingPid();
2271 if (!has_permission(callingUid, P_DUPLICATE, spid)) {
Kenny Rootd53bc922013-03-21 14:10:15 -07002272 ALOGW("permission denied for %d: duplicate", callingUid);
Kenny Root02254072013-03-20 11:48:19 -07002273 return -1L;
2274 }
2275
Kenny Root655b9582013-04-04 08:37:42 -07002276 State state = mKeyStore->getState(callingUid);
Kenny Root02254072013-03-20 11:48:19 -07002277 if (!isKeystoreUnlocked(state)) {
Kenny Rootd53bc922013-03-21 14:10:15 -07002278 ALOGD("calling duplicate in state: %d", state);
Kenny Root02254072013-03-20 11:48:19 -07002279 return state;
2280 }
2281
Kenny Rootd53bc922013-03-21 14:10:15 -07002282 if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
2283 srcUid = callingUid;
2284 } else if (!is_granted_to(callingUid, srcUid)) {
2285 ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
Kenny Root02254072013-03-20 11:48:19 -07002286 return ::PERMISSION_DENIED;
2287 }
2288
Kenny Rootd53bc922013-03-21 14:10:15 -07002289 if (destUid == -1) {
2290 destUid = callingUid;
2291 }
2292
2293 if (srcUid != destUid) {
2294 if (static_cast<uid_t>(srcUid) != callingUid) {
2295 ALOGD("can only duplicate from caller to other or to same uid: "
2296 "calling=%d, srcUid=%d, destUid=%d", callingUid, srcUid, destUid);
2297 return ::PERMISSION_DENIED;
2298 }
2299
2300 if (!is_granted_to(callingUid, destUid)) {
2301 ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
2302 return ::PERMISSION_DENIED;
2303 }
2304 }
2305
2306 String8 source8(srcKey);
Kenny Root655b9582013-04-04 08:37:42 -07002307 String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid));
Kenny Root02254072013-03-20 11:48:19 -07002308
Kenny Rootd53bc922013-03-21 14:10:15 -07002309 String8 target8(destKey);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002310 String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, destUid));
Kenny Root02254072013-03-20 11:48:19 -07002311
Kenny Root655b9582013-04-04 08:37:42 -07002312 if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
2313 ALOGD("destination already exists: %s", targetFile.string());
Kenny Root02254072013-03-20 11:48:19 -07002314 return ::SYSTEM_ERROR;
2315 }
2316
Kenny Rootd53bc922013-03-21 14:10:15 -07002317 Blob keyBlob;
Kenny Root655b9582013-04-04 08:37:42 -07002318 ResponseCode responseCode = mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY,
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002319 srcUid);
Kenny Rootd53bc922013-03-21 14:10:15 -07002320 if (responseCode != ::NO_ERROR) {
2321 return responseCode;
Kenny Root02254072013-03-20 11:48:19 -07002322 }
Kenny Rootd53bc922013-03-21 14:10:15 -07002323
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002324 return mKeyStore->put(targetFile.string(), &keyBlob, destUid);
Kenny Root02254072013-03-20 11:48:19 -07002325 }
2326
Kenny Root1b0e3932013-09-05 13:06:32 -07002327 int32_t is_hardware_backed(const String16& keyType) {
2328 return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
Kenny Root8ddf35a2013-03-29 11:15:50 -07002329 }
2330
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002331 int32_t clear_uid(int64_t targetUid64) {
2332 uid_t targetUid = static_cast<uid_t>(targetUid64);
Kenny Roota9bb5492013-04-01 16:29:11 -07002333 uid_t callingUid = IPCThreadState::self()->getCallingUid();
Riley Spahneaabae92014-06-30 12:39:52 -07002334 pid_t spid = IPCThreadState::self()->getCallingPid();
2335 if (!has_permission(callingUid, P_CLEAR_UID, spid)) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002336 ALOGW("permission denied for %d: clear_uid", callingUid);
2337 return ::PERMISSION_DENIED;
2338 }
2339
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002340 if (targetUid64 == -1) {
2341 targetUid = callingUid;
Kenny Root007cb232014-07-30 16:59:42 -07002342 } else if (!is_self_or_system(callingUid, targetUid)) {
2343 ALOGW("permission denied for %d: clear_uid %d", callingUid, targetUid);
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002344 return ::PERMISSION_DENIED;
2345 }
2346
Kenny Roota9bb5492013-04-01 16:29:11 -07002347 const keymaster_device_t* device = mKeyStore->getDevice();
2348 if (device == NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07002349 ALOGW("can't get keymaster device");
Kenny Roota9bb5492013-04-01 16:29:11 -07002350 return ::SYSTEM_ERROR;
2351 }
2352
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002353 UserState* userState = mKeyStore->getUserState(targetUid);
Kenny Root655b9582013-04-04 08:37:42 -07002354 DIR* dir = opendir(userState->getUserDirName());
Kenny Roota9bb5492013-04-01 16:29:11 -07002355 if (!dir) {
Kenny Root655b9582013-04-04 08:37:42 -07002356 ALOGW("can't open user directory: %s", strerror(errno));
Kenny Roota9bb5492013-04-01 16:29:11 -07002357 return ::SYSTEM_ERROR;
2358 }
2359
Kenny Root655b9582013-04-04 08:37:42 -07002360 char prefix[NAME_MAX];
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002361 int n = snprintf(prefix, NAME_MAX, "%u_", targetUid);
Kenny Roota9bb5492013-04-01 16:29:11 -07002362
2363 ResponseCode rc = ::NO_ERROR;
2364
2365 struct dirent* file;
2366 while ((file = readdir(dir)) != NULL) {
Kenny Root655b9582013-04-04 08:37:42 -07002367 // We only care about files.
2368 if (file->d_type != DT_REG) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002369 continue;
2370 }
2371
Kenny Root655b9582013-04-04 08:37:42 -07002372 // Skip anything that starts with a "."
2373 if (file->d_name[0] == '.') {
2374 continue;
2375 }
Kenny Roota9bb5492013-04-01 16:29:11 -07002376
Kenny Root655b9582013-04-04 08:37:42 -07002377 if (strncmp(prefix, file->d_name, n)) {
2378 continue;
2379 }
2380
2381 String8 filename(String8::format("%s/%s", userState->getUserDirName(), file->d_name));
Kenny Roota9bb5492013-04-01 16:29:11 -07002382 Blob keyBlob;
Kenny Rootfa27d5b2013-10-15 09:01:08 -07002383 if (mKeyStore->get(filename.string(), &keyBlob, ::TYPE_ANY, targetUid)
Kenny Root655b9582013-04-04 08:37:42 -07002384 != ::NO_ERROR) {
2385 ALOGW("couldn't open %s", filename.string());
Kenny Roota9bb5492013-04-01 16:29:11 -07002386 continue;
2387 }
2388
2389 if (keyBlob.getType() == ::TYPE_KEY_PAIR) {
2390 // A device doesn't have to implement delete_keypair.
Kenny Root17208e02013-09-04 13:56:03 -07002391 if (device->delete_keypair != NULL && !keyBlob.isFallback()) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002392 if (device->delete_keypair(device, keyBlob.getValue(), keyBlob.getLength())) {
2393 rc = ::SYSTEM_ERROR;
Kenny Root655b9582013-04-04 08:37:42 -07002394 ALOGW("device couldn't remove %s", filename.string());
Kenny Roota9bb5492013-04-01 16:29:11 -07002395 }
2396 }
2397 }
2398
Kenny Root5f531242013-04-12 11:31:50 -07002399 if (unlinkat(dirfd(dir), file->d_name, 0) && errno != ENOENT) {
Kenny Roota9bb5492013-04-01 16:29:11 -07002400 rc = ::SYSTEM_ERROR;
Kenny Root655b9582013-04-04 08:37:42 -07002401 ALOGW("couldn't unlink %s", filename.string());
Kenny Roota9bb5492013-04-01 16:29:11 -07002402 }
2403 }
2404 closedir(dir);
2405
2406 return rc;
2407 }
2408
Robin Lee4e865752014-08-19 17:37:55 +01002409 int32_t reset_uid(int32_t uid) {
2410 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2411 pid_t spid = IPCThreadState::self()->getCallingPid();
2412 if (!has_permission(callingUid, P_RESET_UID, spid)) {
2413 ALOGW("permission denied for %d: reset_uid %d", callingUid, uid);
2414 return ::PERMISSION_DENIED;
2415 }
2416 if (callingUid != AID_SYSTEM) {
2417 ALOGW("permission denied for %d: reset_uid %d", callingUid, uid);
2418 return ::PERMISSION_DENIED;
2419 }
2420
2421 return mKeyStore->reset(uid) ? ::NO_ERROR : ::SYSTEM_ERROR;
2422 }
2423
2424 int32_t sync_uid(int32_t sourceUid, int32_t targetUid) {
2425 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2426 pid_t spid = IPCThreadState::self()->getCallingPid();
2427 if (!has_permission(callingUid, P_SYNC_UID, spid)) {
2428 ALOGW("permission denied for %d: sync_uid %d -> %d", callingUid, sourceUid, targetUid);
2429 return ::PERMISSION_DENIED;
2430 }
2431 if (callingUid != AID_SYSTEM) {
2432 ALOGW("permission denied for %d: sync_uid %d -> %d", callingUid, sourceUid, targetUid);
2433 return ::PERMISSION_DENIED;
2434 }
2435 if (sourceUid == targetUid) {
2436 return ::SYSTEM_ERROR;
2437 }
2438
2439 // Initialise user keystore with existing master key held in-memory
2440 return mKeyStore->copyMasterKey(sourceUid, targetUid);
2441 }
2442
2443 int32_t password_uid(const String16& pw, int32_t targetUid) {
2444 uid_t callingUid = IPCThreadState::self()->getCallingUid();
2445 pid_t spid = IPCThreadState::self()->getCallingPid();
2446 if (!has_permission(callingUid, P_PASSWORD_UID, spid)) {
2447 ALOGW("permission denied for %d: password_uid %d", callingUid, targetUid);
2448 return ::PERMISSION_DENIED;
2449 }
2450 if (callingUid != AID_SYSTEM) {
2451 ALOGW("permission denied for %d: password_uid %d", callingUid, targetUid);
2452 return ::PERMISSION_DENIED;
2453 }
2454
2455 const String8 password8(pw);
2456
2457 switch (mKeyStore->getState(targetUid)) {
2458 case ::STATE_UNINITIALIZED: {
2459 // generate master key, encrypt with password, write to file, initialize mMasterKey*.
2460 return mKeyStore->initializeUser(password8, targetUid);
2461 }
2462 case ::STATE_NO_ERROR: {
2463 // rewrite master key with new password.
2464 return mKeyStore->writeMasterKey(password8, targetUid);
2465 }
2466 case ::STATE_LOCKED: {
2467 // read master key, decrypt with password, initialize mMasterKey*.
2468 return mKeyStore->readMasterKey(password8, targetUid);
2469 }
2470 }
2471 return ::SYSTEM_ERROR;
2472 }
2473
Kenny Root07438c82012-11-02 15:41:02 -07002474private:
Kenny Root9d45d1c2013-02-14 10:32:30 -08002475 inline bool isKeystoreUnlocked(State state) {
2476 switch (state) {
2477 case ::STATE_NO_ERROR:
2478 return true;
2479 case ::STATE_UNINITIALIZED:
2480 case ::STATE_LOCKED:
2481 return false;
2482 }
2483 return false;
Kenny Root07438c82012-11-02 15:41:02 -07002484 }
2485
Kenny Root1d448c02013-11-21 10:36:53 -08002486 bool isKeyTypeSupported(const keymaster_device_t* device, keymaster_keypair_t keyType) {
2487 const int32_t device_api = device->common.module->module_api_version;
2488 if (device_api == KEYMASTER_MODULE_API_VERSION_0_2) {
2489 switch (keyType) {
2490 case TYPE_RSA:
2491 case TYPE_DSA:
2492 case TYPE_EC:
2493 return true;
2494 default:
2495 return false;
2496 }
2497 } else if (device_api >= KEYMASTER_MODULE_API_VERSION_0_3) {
2498 switch (keyType) {
2499 case TYPE_RSA:
2500 return true;
2501 case TYPE_DSA:
2502 return device->flags & KEYMASTER_SUPPORTS_DSA;
2503 case TYPE_EC:
2504 return device->flags & KEYMASTER_SUPPORTS_EC;
2505 default:
2506 return false;
2507 }
2508 } else {
2509 return keyType == TYPE_RSA;
2510 }
2511 }
2512
Kenny Root07438c82012-11-02 15:41:02 -07002513 ::KeyStore* mKeyStore;
2514};
2515
2516}; // namespace android
Kenny Roota91203b2012-02-15 15:00:46 -08002517
2518int main(int argc, char* argv[]) {
Kenny Roota91203b2012-02-15 15:00:46 -08002519 if (argc < 2) {
2520 ALOGE("A directory must be specified!");
2521 return 1;
2522 }
2523 if (chdir(argv[1]) == -1) {
2524 ALOGE("chdir: %s: %s", argv[1], strerror(errno));
2525 return 1;
2526 }
2527
2528 Entropy entropy;
2529 if (!entropy.open()) {
2530 return 1;
2531 }
Kenny Root70e3a862012-02-15 17:20:23 -08002532
2533 keymaster_device_t* dev;
2534 if (keymaster_device_initialize(&dev)) {
2535 ALOGE("keystore keymaster could not be initialized; exiting");
2536 return 1;
2537 }
2538
Riley Spahneaabae92014-06-30 12:39:52 -07002539 ks_is_selinux_enabled = is_selinux_enabled();
2540 if (ks_is_selinux_enabled) {
2541 union selinux_callback cb;
2542 cb.func_log = selinux_log_callback;
2543 selinux_set_callback(SELINUX_CB_LOG, cb);
2544 if (getcon(&tctx) != 0) {
2545 ALOGE("SELinux: Could not acquire target context. Aborting keystore.\n");
2546 return -1;
2547 }
2548 } else {
2549 ALOGI("SELinux: Keystore SELinux is disabled.\n");
2550 }
2551
Kenny Root70e3a862012-02-15 17:20:23 -08002552 KeyStore keyStore(&entropy, dev);
Kenny Root655b9582013-04-04 08:37:42 -07002553 keyStore.initialize();
Kenny Root07438c82012-11-02 15:41:02 -07002554 android::sp<android::IServiceManager> sm = android::defaultServiceManager();
2555 android::sp<android::KeyStoreProxy> proxy = new android::KeyStoreProxy(&keyStore);
2556 android::status_t ret = sm->addService(android::String16("android.security.keystore"), proxy);
2557 if (ret != android::OK) {
2558 ALOGE("Couldn't register binder service!");
2559 return -1;
Kenny Roota91203b2012-02-15 15:00:46 -08002560 }
Kenny Root07438c82012-11-02 15:41:02 -07002561
2562 /*
2563 * We're the only thread in existence, so we're just going to process
2564 * Binder transaction as a single-threaded program.
2565 */
2566 android::IPCThreadState::self()->joinThreadPool();
Kenny Root70e3a862012-02-15 17:20:23 -08002567
2568 keymaster_device_release(dev);
Kenny Roota91203b2012-02-15 15:00:46 -08002569 return 1;
2570}