blob: a29053b0669f08999af1e14dd280fe8e816e8d78 [file] [log] [blame]
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* TO DO:
18 * 1. Perhaps keep several copies of the encrypted key, in case something
19 * goes horribly wrong?
20 *
21 */
22
23#include <sys/types.h>
Ken Sumralle550f782013-08-20 13:48:23 -070024#include <sys/wait.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080025#include <sys/stat.h>
Paul Lawrencef4faa572014-01-29 13:31:03 -080026#include <ctype.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080027#include <fcntl.h>
Elliott Hughes73737162014-06-25 17:27:42 -070028#include <inttypes.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080029#include <unistd.h>
30#include <stdio.h>
31#include <sys/ioctl.h>
32#include <linux/dm-ioctl.h>
33#include <libgen.h>
34#include <stdlib.h>
35#include <sys/param.h>
36#include <string.h>
37#include <sys/mount.h>
38#include <openssl/evp.h>
39#include <errno.h>
Ken Sumrall3ed82362011-01-28 23:31:16 -080040#include <ext4.h>
Ken Sumrall29d8da82011-05-18 17:20:07 -070041#include <linux/kdev_t.h>
Ken Sumralle5032c42012-04-01 23:58:44 -070042#include <fs_mgr.h>
Paul Lawrence9c58a872014-09-30 09:12:51 -070043#include <time.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080044#include "cryptfs.h"
45#define LOG_TAG "Cryptfs"
46#include "cutils/log.h"
47#include "cutils/properties.h"
Ken Sumralladfba362013-06-04 16:37:52 -070048#include "cutils/android_reboot.h"
Ken Sumrall5d4c68e2011-01-30 19:06:03 -080049#include "hardware_legacy/power.h"
Ken Sumralle550f782013-08-20 13:48:23 -070050#include <logwrap/logwrap.h>
Ken Sumrall29d8da82011-05-18 17:20:07 -070051#include "VolumeManager.h"
Ken Sumrall9caab762013-06-11 19:10:20 -070052#include "VoldUtil.h"
Kenny Rootc4c70f12013-06-14 12:11:38 -070053#include "crypto_scrypt.h"
Paul Lawrenceae59fe62014-01-21 08:23:27 -080054#include "ext4_utils.h"
Daniel Rosenberge82df162014-08-15 22:19:23 +000055#include "f2fs_sparseblock.h"
Paul Lawrence87999172014-02-20 12:21:31 -080056#include "CheckBattery.h"
jessica_yu3f14fe42014-09-22 15:57:40 +080057#include "Process.h"
Ken Sumrall8f869aa2010-12-03 03:47:09 -080058
Paul Lawrence69f4ebd2014-04-14 12:17:14 -070059#include <hardware/keymaster.h>
60
Mark Salyzyn3e971272014-01-21 13:27:04 -080061#define UNUSED __attribute__((unused))
62
Mark Salyzyn5eecc442014-02-12 14:16:14 -080063#define UNUSED __attribute__((unused))
64
Ken Sumrall8f869aa2010-12-03 03:47:09 -080065#define DM_CRYPT_BUF_SIZE 4096
66
Jason parks70a4b3f2011-01-28 10:10:47 -060067#define HASH_COUNT 2000
68#define KEY_LEN_BYTES 16
69#define IV_LEN_BYTES 16
70
Ken Sumrall29d8da82011-05-18 17:20:07 -070071#define KEY_IN_FOOTER "footer"
72
Paul Lawrencef4faa572014-01-29 13:31:03 -080073// "default_password" encoded into hex (d=0x64 etc)
74#define DEFAULT_PASSWORD "64656661756c745f70617373776f7264"
75
Ken Sumrall29d8da82011-05-18 17:20:07 -070076#define EXT4_FS 1
JP Abgrall62c7af32014-06-16 13:01:23 -070077#define F2FS_FS 2
Ken Sumrall29d8da82011-05-18 17:20:07 -070078
Ken Sumralle919efe2012-09-29 17:07:41 -070079#define TABLE_LOAD_RETRIES 10
80
Shawn Willden47ba10d2014-09-03 17:07:06 -060081#define RSA_KEY_SIZE 2048
82#define RSA_KEY_SIZE_BYTES (RSA_KEY_SIZE / 8)
83#define RSA_EXPONENT 0x10001
Paul Lawrence69f4ebd2014-04-14 12:17:14 -070084
Paul Lawrence8e3f4512014-09-08 10:11:17 -070085#define RETRY_MOUNT_ATTEMPTS 10
86#define RETRY_MOUNT_DELAY_SECONDS 1
87
Ken Sumrall8f869aa2010-12-03 03:47:09 -080088char *me = "cryptfs";
89
Jason parks70a4b3f2011-01-28 10:10:47 -060090static unsigned char saved_master_key[KEY_LEN_BYTES];
Ken Sumrall3ad90722011-10-04 20:38:29 -070091static char *saved_mount_point;
Jason parks70a4b3f2011-01-28 10:10:47 -060092static int master_key_saved = 0;
Ken Sumrall160b4d62013-04-22 12:15:39 -070093static struct crypt_persist_data *persist_data = NULL;
Ken Sumrall56ad03c2013-02-13 13:00:19 -080094
Paul Lawrence69f4ebd2014-04-14 12:17:14 -070095static int keymaster_init(keymaster_device_t **keymaster_dev)
96{
97 int rc;
98
99 const hw_module_t* mod;
100 rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
101 if (rc) {
102 ALOGE("could not find any keystore module");
103 goto out;
104 }
105
106 rc = keymaster_open(mod, keymaster_dev);
107 if (rc) {
108 ALOGE("could not open keymaster device in %s (%s)",
109 KEYSTORE_HARDWARE_MODULE_ID, strerror(-rc));
110 goto out;
111 }
112
113 return 0;
114
115out:
116 *keymaster_dev = NULL;
117 return rc;
118}
119
120/* Should we use keymaster? */
121static int keymaster_check_compatibility()
122{
123 keymaster_device_t *keymaster_dev = 0;
124 int rc = 0;
125
126 if (keymaster_init(&keymaster_dev)) {
127 SLOGE("Failed to init keymaster");
128 rc = -1;
129 goto out;
130 }
131
Paul Lawrence8c008392014-05-06 14:02:48 -0700132 SLOGI("keymaster version is %d", keymaster_dev->common.module->module_api_version);
133
134 if (keymaster_dev->common.module->module_api_version
135 < KEYMASTER_MODULE_API_VERSION_0_3) {
136 rc = 0;
137 goto out;
138 }
139
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700140 if (keymaster_dev->flags & KEYMASTER_BLOBS_ARE_STANDALONE) {
141 rc = 1;
142 }
143
144out:
145 keymaster_close(keymaster_dev);
146 return rc;
147}
148
149/* Create a new keymaster key and store it in this footer */
150static int keymaster_create_key(struct crypt_mnt_ftr *ftr)
151{
152 uint8_t* key = 0;
153 keymaster_device_t *keymaster_dev = 0;
154
155 if (keymaster_init(&keymaster_dev)) {
156 SLOGE("Failed to init keymaster");
157 return -1;
158 }
159
160 int rc = 0;
161
162 keymaster_rsa_keygen_params_t params;
163 memset(&params, '\0', sizeof(params));
Shawn Willden47ba10d2014-09-03 17:07:06 -0600164 params.public_exponent = RSA_EXPONENT;
165 params.modulus_size = RSA_KEY_SIZE;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700166
167 size_t key_size;
168 if (keymaster_dev->generate_keypair(keymaster_dev, TYPE_RSA, &params,
169 &key, &key_size)) {
170 SLOGE("Failed to generate keypair");
171 rc = -1;
172 goto out;
173 }
174
175 if (key_size > KEYMASTER_BLOB_SIZE) {
176 SLOGE("Keymaster key too large for crypto footer");
177 rc = -1;
178 goto out;
179 }
180
181 memcpy(ftr->keymaster_blob, key, key_size);
182 ftr->keymaster_blob_size = key_size;
183
184out:
185 keymaster_close(keymaster_dev);
186 free(key);
187 return rc;
188}
189
Shawn Willdene17a9c42014-09-08 13:04:08 -0600190/* This signs the given object using the keymaster key. */
191static int keymaster_sign_object(struct crypt_mnt_ftr *ftr,
Shawn Willden47ba10d2014-09-03 17:07:06 -0600192 const unsigned char *object,
193 const size_t object_size,
194 unsigned char **signature,
195 size_t *signature_size)
196{
197 int rc = 0;
198 keymaster_device_t *keymaster_dev = 0;
199 if (keymaster_init(&keymaster_dev)) {
200 SLOGE("Failed to init keymaster");
201 return -1;
202 }
203
204 /* We currently set the digest type to DIGEST_NONE because it's the
205 * only supported value for keymaster. A similar issue exists with
206 * PADDING_NONE. Long term both of these should likely change.
207 */
208 keymaster_rsa_sign_params_t params;
209 params.digest_type = DIGEST_NONE;
210 params.padding_type = PADDING_NONE;
211
212 unsigned char to_sign[RSA_KEY_SIZE_BYTES];
Shawn Willdene17a9c42014-09-08 13:04:08 -0600213 size_t to_sign_size = sizeof(to_sign);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600214 memset(to_sign, 0, RSA_KEY_SIZE_BYTES);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600215
Shawn Willdene17a9c42014-09-08 13:04:08 -0600216 // To sign a message with RSA, the message must satisfy two
217 // constraints:
218 //
219 // 1. The message, when interpreted as a big-endian numeric value, must
220 // be strictly less than the public modulus of the RSA key. Note
221 // that because the most significant bit of the public modulus is
222 // guaranteed to be 1 (else it's an (n-1)-bit key, not an n-bit
223 // key), an n-bit message with most significant bit 0 always
224 // satisfies this requirement.
225 //
226 // 2. The message must have the same length in bits as the public
227 // modulus of the RSA key. This requirement isn't mathematically
228 // necessary, but is necessary to ensure consistency in
229 // implementations.
230 switch (ftr->kdf_type) {
231 case KDF_SCRYPT_KEYMASTER_UNPADDED:
232 // This is broken: It produces a message which is shorter than
233 // the public modulus, failing criterion 2.
234 memcpy(to_sign, object, object_size);
235 to_sign_size = object_size;
236 SLOGI("Signing unpadded object");
237 break;
238 case KDF_SCRYPT_KEYMASTER_BADLY_PADDED:
239 // This is broken: Since the value of object is uniformly
240 // distributed, it produces a message that is larger than the
241 // public modulus with probability 0.25.
242 memcpy(to_sign, object, min(RSA_KEY_SIZE_BYTES, object_size));
243 SLOGI("Signing end-padded object");
244 break;
245 case KDF_SCRYPT_KEYMASTER:
246 // This ensures the most significant byte of the signed message
247 // is zero. We could have zero-padded to the left instead, but
248 // this approach is slightly more robust against changes in
249 // object size. However, it's still broken (but not unusably
250 // so) because we really should be using a proper RSA padding
251 // function, such as OAEP.
252 //
253 // TODO(paullawrence): When keymaster 0.4 is available, change
254 // this to use the padding options it provides.
255 memcpy(to_sign + 1, object, min(RSA_KEY_SIZE_BYTES - 1, object_size));
256 SLOGI("Signing safely-padded object");
257 break;
258 default:
259 SLOGE("Unknown KDF type %d", ftr->kdf_type);
260 return -1;
261 }
262
Shawn Willden47ba10d2014-09-03 17:07:06 -0600263 rc = keymaster_dev->sign_data(keymaster_dev,
264 &params,
265 ftr->keymaster_blob,
266 ftr->keymaster_blob_size,
267 to_sign,
Shawn Willdene17a9c42014-09-08 13:04:08 -0600268 to_sign_size,
Shawn Willden47ba10d2014-09-03 17:07:06 -0600269 signature,
270 signature_size);
271
272 keymaster_close(keymaster_dev);
273 return rc;
274}
275
Paul Lawrence399317e2014-03-10 13:20:50 -0700276/* Store password when userdata is successfully decrypted and mounted.
277 * Cleared by cryptfs_clear_password
278 *
279 * To avoid a double prompt at boot, we need to store the CryptKeeper
280 * password and pass it to KeyGuard, which uses it to unlock KeyStore.
281 * Since the entire framework is torn down and rebuilt after encryption,
282 * we have to use a daemon or similar to store the password. Since vold
283 * is secured against IPC except from system processes, it seems a reasonable
284 * place to store this.
285 *
286 * password should be cleared once it has been used.
287 *
288 * password is aged out after password_max_age_seconds seconds.
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800289 */
Paul Lawrence399317e2014-03-10 13:20:50 -0700290static char* password = 0;
291static int password_expiry_time = 0;
292static const int password_max_age_seconds = 60;
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800293
Ken Sumrall56ad03c2013-02-13 13:00:19 -0800294extern struct fstab *fstab;
Ken Sumrall8ddbe402011-01-17 15:26:29 -0800295
Paul Lawrence87999172014-02-20 12:21:31 -0800296enum RebootType {reboot, recovery, shutdown};
297static void cryptfs_reboot(enum RebootType rt)
Ken Sumralladfba362013-06-04 16:37:52 -0700298{
Paul Lawrence87999172014-02-20 12:21:31 -0800299 switch(rt) {
300 case reboot:
301 property_set(ANDROID_RB_PROPERTY, "reboot");
302 break;
303
304 case recovery:
305 property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
306 break;
307
308 case shutdown:
309 property_set(ANDROID_RB_PROPERTY, "shutdown");
310 break;
Ken Sumralladfba362013-06-04 16:37:52 -0700311 }
Paul Lawrence87999172014-02-20 12:21:31 -0800312
Ken Sumralladfba362013-06-04 16:37:52 -0700313 sleep(20);
314
315 /* Shouldn't get here, reboot should happen before sleep times out */
316 return;
317}
318
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800319static void ioctl_init(struct dm_ioctl *io, size_t dataSize, const char *name, unsigned flags)
320{
321 memset(io, 0, dataSize);
322 io->data_size = dataSize;
323 io->data_start = sizeof(struct dm_ioctl);
324 io->version[0] = 4;
325 io->version[1] = 0;
326 io->version[2] = 0;
327 io->flags = flags;
328 if (name) {
329 strncpy(io->name, name, sizeof(io->name));
330 }
331}
332
Kenny Rootc4c70f12013-06-14 12:11:38 -0700333/**
334 * Gets the default device scrypt parameters for key derivation time tuning.
335 * The parameters should lead to about one second derivation time for the
336 * given device.
337 */
338static void get_device_scrypt_params(struct crypt_mnt_ftr *ftr) {
339 const int default_params[] = SCRYPT_DEFAULTS;
340 int params[] = SCRYPT_DEFAULTS;
341 char paramstr[PROPERTY_VALUE_MAX];
342 char *token;
343 char *saveptr;
344 int i;
345
346 property_get(SCRYPT_PROP, paramstr, "");
347 if (paramstr[0] != '\0') {
348 /*
349 * The token we're looking for should be three integers separated by
350 * colons (e.g., "12:8:1"). Scan the property to make sure it matches.
351 */
Kenny Root2947e342013-08-14 15:54:49 -0700352 for (i = 0, token = strtok_r(paramstr, ":", &saveptr);
353 token != NULL && i < 3;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700354 i++, token = strtok_r(NULL, ":", &saveptr)) {
355 char *endptr;
356 params[i] = strtol(token, &endptr, 10);
357
358 /*
359 * Check that there was a valid number and it's 8-bit. If not,
360 * break out and the end check will take the default values.
361 */
362 if ((*token == '\0') || (*endptr != '\0') || params[i] < 0 || params[i] > 255) {
363 break;
364 }
365 }
366
367 /*
368 * If there were not enough tokens or a token was malformed (not an
369 * integer), it will end up here and the default parameters can be
370 * taken.
371 */
372 if ((i != 3) || (token != NULL)) {
373 SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
374 memcpy(params, default_params, sizeof(params));
375 }
376 }
377
378 ftr->N_factor = params[0];
379 ftr->r_factor = params[1];
380 ftr->p_factor = params[2];
381}
382
Ken Sumrall3ed82362011-01-28 23:31:16 -0800383static unsigned int get_fs_size(char *dev)
384{
385 int fd, block_size;
386 struct ext4_super_block sb;
387 off64_t len;
388
389 if ((fd = open(dev, O_RDONLY)) < 0) {
390 SLOGE("Cannot open device to get filesystem size ");
391 return 0;
392 }
393
394 if (lseek64(fd, 1024, SEEK_SET) < 0) {
395 SLOGE("Cannot seek to superblock");
396 return 0;
397 }
398
399 if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
400 SLOGE("Cannot read superblock");
401 return 0;
402 }
403
404 close(fd);
405
Daniel Rosenberge82df162014-08-15 22:19:23 +0000406 if (le32_to_cpu(sb.s_magic) != EXT4_SUPER_MAGIC) {
407 SLOGE("Not a valid ext4 superblock");
408 return 0;
409 }
Ken Sumrall3ed82362011-01-28 23:31:16 -0800410 block_size = 1024 << sb.s_log_block_size;
411 /* compute length in bytes */
412 len = ( ((off64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
413
414 /* return length in sectors */
415 return (unsigned int) (len / 512);
416}
417
Ken Sumrall160b4d62013-04-22 12:15:39 -0700418static int get_crypt_ftr_info(char **metadata_fname, off64_t *off)
419{
420 static int cached_data = 0;
421 static off64_t cached_off = 0;
422 static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
423 int fd;
424 char key_loc[PROPERTY_VALUE_MAX];
425 char real_blkdev[PROPERTY_VALUE_MAX];
426 unsigned int nr_sec;
427 int rc = -1;
428
429 if (!cached_data) {
430 fs_mgr_get_crypt_info(fstab, key_loc, real_blkdev, sizeof(key_loc));
431
432 if (!strcmp(key_loc, KEY_IN_FOOTER)) {
433 if ( (fd = open(real_blkdev, O_RDWR)) < 0) {
434 SLOGE("Cannot open real block device %s\n", real_blkdev);
435 return -1;
436 }
437
438 if ((nr_sec = get_blkdev_size(fd))) {
439 /* If it's an encrypted Android partition, the last 16 Kbytes contain the
440 * encryption info footer and key, and plenty of bytes to spare for future
441 * growth.
442 */
443 strlcpy(cached_metadata_fname, real_blkdev, sizeof(cached_metadata_fname));
444 cached_off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET;
445 cached_data = 1;
446 } else {
447 SLOGE("Cannot get size of block device %s\n", real_blkdev);
448 }
449 close(fd);
450 } else {
451 strlcpy(cached_metadata_fname, key_loc, sizeof(cached_metadata_fname));
452 cached_off = 0;
453 cached_data = 1;
454 }
455 }
456
457 if (cached_data) {
458 if (metadata_fname) {
459 *metadata_fname = cached_metadata_fname;
460 }
461 if (off) {
462 *off = cached_off;
463 }
464 rc = 0;
465 }
466
467 return rc;
468}
469
Ken Sumralle8744072011-01-18 22:01:55 -0800470/* key or salt can be NULL, in which case just skip writing that value. Useful to
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800471 * update the failed mount count but not change the key.
472 */
Ken Sumrall160b4d62013-04-22 12:15:39 -0700473static int put_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800474{
475 int fd;
476 unsigned int nr_sec, cnt;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700477 /* starting_off is set to the SEEK_SET offset
478 * where the crypto structure starts
479 */
480 off64_t starting_off;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800481 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700482 char *fname = NULL;
Ken Sumrall3be890f2011-09-14 16:53:46 -0700483 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800484
Ken Sumrall160b4d62013-04-22 12:15:39 -0700485 if (get_crypt_ftr_info(&fname, &starting_off)) {
486 SLOGE("Unable to get crypt_ftr_info\n");
487 return -1;
488 }
489 if (fname[0] != '/') {
Ken Sumralle5032c42012-04-01 23:58:44 -0700490 SLOGE("Unexpected value for crypto key location\n");
Ken Sumrall160b4d62013-04-22 12:15:39 -0700491 return -1;
492 }
Ken Sumralle550f782013-08-20 13:48:23 -0700493 if ( (fd = open(fname, O_RDWR | O_CREAT, 0600)) < 0) {
494 SLOGE("Cannot open footer file %s for put\n", fname);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700495 return -1;
496 }
497
498 /* Seek to the start of the crypt footer */
499 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
500 SLOGE("Cannot seek to real block device footer\n");
501 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800502 }
503
504 if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
505 SLOGE("Cannot write real block device footer\n");
506 goto errout;
507 }
508
Ken Sumrall3be890f2011-09-14 16:53:46 -0700509 fstat(fd, &statbuf);
510 /* If the keys are kept on a raw block device, do not try to truncate it. */
Ken Sumralle550f782013-08-20 13:48:23 -0700511 if (S_ISREG(statbuf.st_mode)) {
Ken Sumrall29d8da82011-05-18 17:20:07 -0700512 if (ftruncate(fd, 0x4000)) {
Colin Cross59846b62014-02-06 20:34:29 -0800513 SLOGE("Cannot set footer file size\n");
Ken Sumralle8744072011-01-18 22:01:55 -0800514 goto errout;
515 }
516 }
517
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800518 /* Success! */
519 rc = 0;
520
521errout:
522 close(fd);
523 return rc;
524
525}
526
Ken Sumrall160b4d62013-04-22 12:15:39 -0700527static inline int unix_read(int fd, void* buff, int len)
528{
529 return TEMP_FAILURE_RETRY(read(fd, buff, len));
530}
531
532static inline int unix_write(int fd, const void* buff, int len)
533{
534 return TEMP_FAILURE_RETRY(write(fd, buff, len));
535}
536
537static void init_empty_persist_data(struct crypt_persist_data *pdata, int len)
538{
539 memset(pdata, 0, len);
540 pdata->persist_magic = PERSIST_DATA_MAGIC;
541 pdata->persist_valid_entries = 0;
542}
543
544/* A routine to update the passed in crypt_ftr to the lastest version.
545 * fd is open read/write on the device that holds the crypto footer and persistent
546 * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
547 * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
548 */
549static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr *crypt_ftr, off64_t offset)
550{
Kenny Root7434b312013-06-14 11:29:53 -0700551 int orig_major = crypt_ftr->major_version;
552 int orig_minor = crypt_ftr->minor_version;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700553
Kenny Root7434b312013-06-14 11:29:53 -0700554 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
555 struct crypt_persist_data *pdata;
556 off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700557
Kenny Rootc4c70f12013-06-14 12:11:38 -0700558 SLOGW("upgrading crypto footer to 1.1");
559
Kenny Root7434b312013-06-14 11:29:53 -0700560 pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
561 if (pdata == NULL) {
562 SLOGE("Cannot allocate persisent data\n");
563 return;
564 }
565 memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
566
567 /* Need to initialize the persistent data area */
568 if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
569 SLOGE("Cannot seek to persisent data offset\n");
570 return;
571 }
572 /* Write all zeros to the first copy, making it invalid */
573 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
574
575 /* Write a valid but empty structure to the second copy */
576 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
577 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
578
579 /* Update the footer */
580 crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
581 crypt_ftr->persist_data_offset[0] = pdata_offset;
582 crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
583 crypt_ftr->minor_version = 1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700584 }
585
Paul Lawrencef4faa572014-01-29 13:31:03 -0800586 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 1)) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700587 SLOGW("upgrading crypto footer to 1.2");
JP Abgrall7bdfa522013-11-15 13:42:56 -0800588 /* But keep the old kdf_type.
589 * It will get updated later to KDF_SCRYPT after the password has been verified.
590 */
Kenny Rootc4c70f12013-06-14 12:11:38 -0700591 crypt_ftr->kdf_type = KDF_PBKDF2;
592 get_device_scrypt_params(crypt_ftr);
593 crypt_ftr->minor_version = 2;
594 }
595
Paul Lawrencef4faa572014-01-29 13:31:03 -0800596 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 2)) {
597 SLOGW("upgrading crypto footer to 1.3");
598 crypt_ftr->crypt_type = CRYPT_TYPE_PASSWORD;
599 crypt_ftr->minor_version = 3;
600 }
601
Kenny Root7434b312013-06-14 11:29:53 -0700602 if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
603 if (lseek64(fd, offset, SEEK_SET) == -1) {
604 SLOGE("Cannot seek to crypt footer\n");
605 return;
606 }
607 unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700608 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700609}
610
611
612static int get_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800613{
614 int fd;
615 unsigned int nr_sec, cnt;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700616 off64_t starting_off;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800617 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700618 char *fname = NULL;
Ken Sumrall29d8da82011-05-18 17:20:07 -0700619 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800620
Ken Sumrall160b4d62013-04-22 12:15:39 -0700621 if (get_crypt_ftr_info(&fname, &starting_off)) {
622 SLOGE("Unable to get crypt_ftr_info\n");
623 return -1;
624 }
625 if (fname[0] != '/') {
Ken Sumralle5032c42012-04-01 23:58:44 -0700626 SLOGE("Unexpected value for crypto key location\n");
Ken Sumrall160b4d62013-04-22 12:15:39 -0700627 return -1;
628 }
629 if ( (fd = open(fname, O_RDWR)) < 0) {
Ken Sumralle550f782013-08-20 13:48:23 -0700630 SLOGE("Cannot open footer file %s for get\n", fname);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700631 return -1;
632 }
633
634 /* Make sure it's 16 Kbytes in length */
635 fstat(fd, &statbuf);
636 if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
637 SLOGE("footer file %s is not the expected size!\n", fname);
638 goto errout;
639 }
640
641 /* Seek to the start of the crypt footer */
642 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
643 SLOGE("Cannot seek to real block device footer\n");
644 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800645 }
646
647 if ( (cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
648 SLOGE("Cannot read real block device footer\n");
649 goto errout;
650 }
651
652 if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
Ken Sumrall29d8da82011-05-18 17:20:07 -0700653 SLOGE("Bad magic for real block device %s\n", fname);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800654 goto errout;
655 }
656
Kenny Rootc96a5f82013-06-14 12:08:28 -0700657 if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
658 SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
659 crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800660 goto errout;
661 }
662
Kenny Rootc96a5f82013-06-14 12:08:28 -0700663 if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
664 SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
665 crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800666 }
667
Ken Sumrall160b4d62013-04-22 12:15:39 -0700668 /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
669 * copy on disk before returning.
670 */
Kenny Rootc96a5f82013-06-14 12:08:28 -0700671 if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700672 upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
Ken Sumralle8744072011-01-18 22:01:55 -0800673 }
674
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800675 /* Success! */
676 rc = 0;
677
678errout:
679 close(fd);
680 return rc;
681}
682
Ken Sumrall160b4d62013-04-22 12:15:39 -0700683static int validate_persistent_data_storage(struct crypt_mnt_ftr *crypt_ftr)
684{
685 if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
686 crypt_ftr->persist_data_offset[1]) {
687 SLOGE("Crypt_ftr persist data regions overlap");
688 return -1;
689 }
690
691 if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
692 SLOGE("Crypt_ftr persist data region 0 starts after region 1");
693 return -1;
694 }
695
696 if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
697 (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
698 CRYPT_FOOTER_OFFSET) {
699 SLOGE("Persistent data extends past crypto footer");
700 return -1;
701 }
702
703 return 0;
704}
705
706static int load_persistent_data(void)
707{
708 struct crypt_mnt_ftr crypt_ftr;
709 struct crypt_persist_data *pdata = NULL;
710 char encrypted_state[PROPERTY_VALUE_MAX];
711 char *fname;
712 int found = 0;
713 int fd;
714 int ret;
715 int i;
716
717 if (persist_data) {
718 /* Nothing to do, we've already loaded or initialized it */
719 return 0;
720 }
721
722
723 /* If not encrypted, just allocate an empty table and initialize it */
724 property_get("ro.crypto.state", encrypted_state, "");
725 if (strcmp(encrypted_state, "encrypted") ) {
726 pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
727 if (pdata) {
728 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
729 persist_data = pdata;
730 return 0;
731 }
732 return -1;
733 }
734
735 if(get_crypt_ftr_and_key(&crypt_ftr)) {
736 return -1;
737 }
738
Paul Lawrence8561b5c2014-03-17 14:10:51 -0700739 if ((crypt_ftr.major_version < 1)
740 || (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700741 SLOGE("Crypt_ftr version doesn't support persistent data");
742 return -1;
743 }
744
745 if (get_crypt_ftr_info(&fname, NULL)) {
746 return -1;
747 }
748
749 ret = validate_persistent_data_storage(&crypt_ftr);
750 if (ret) {
751 return -1;
752 }
753
754 fd = open(fname, O_RDONLY);
755 if (fd < 0) {
756 SLOGE("Cannot open %s metadata file", fname);
757 return -1;
758 }
759
760 if (persist_data == NULL) {
761 pdata = malloc(crypt_ftr.persist_data_size);
762 if (pdata == NULL) {
763 SLOGE("Cannot allocate memory for persistent data");
764 goto err;
765 }
766 }
767
768 for (i = 0; i < 2; i++) {
769 if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
770 SLOGE("Cannot seek to read persistent data on %s", fname);
771 goto err2;
772 }
773 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0){
774 SLOGE("Error reading persistent data on iteration %d", i);
775 goto err2;
776 }
777 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
778 found = 1;
779 break;
780 }
781 }
782
783 if (!found) {
784 SLOGI("Could not find valid persistent data, creating");
785 init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
786 }
787
788 /* Success */
789 persist_data = pdata;
790 close(fd);
791 return 0;
792
793err2:
794 free(pdata);
795
796err:
797 close(fd);
798 return -1;
799}
800
801static int save_persistent_data(void)
802{
803 struct crypt_mnt_ftr crypt_ftr;
804 struct crypt_persist_data *pdata;
805 char *fname;
806 off64_t write_offset;
807 off64_t erase_offset;
808 int found = 0;
809 int fd;
810 int ret;
811
812 if (persist_data == NULL) {
813 SLOGE("No persistent data to save");
814 return -1;
815 }
816
817 if(get_crypt_ftr_and_key(&crypt_ftr)) {
818 return -1;
819 }
820
Paul Lawrence8561b5c2014-03-17 14:10:51 -0700821 if ((crypt_ftr.major_version < 1)
822 || (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700823 SLOGE("Crypt_ftr version doesn't support persistent data");
824 return -1;
825 }
826
827 ret = validate_persistent_data_storage(&crypt_ftr);
828 if (ret) {
829 return -1;
830 }
831
832 if (get_crypt_ftr_info(&fname, NULL)) {
833 return -1;
834 }
835
836 fd = open(fname, O_RDWR);
837 if (fd < 0) {
838 SLOGE("Cannot open %s metadata file", fname);
839 return -1;
840 }
841
842 pdata = malloc(crypt_ftr.persist_data_size);
843 if (pdata == NULL) {
844 SLOGE("Cannot allocate persistant data");
845 goto err;
846 }
847
848 if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
849 SLOGE("Cannot seek to read persistent data on %s", fname);
850 goto err2;
851 }
852
853 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
854 SLOGE("Error reading persistent data before save");
855 goto err2;
856 }
857
858 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
859 /* The first copy is the curent valid copy, so write to
860 * the second copy and erase this one */
861 write_offset = crypt_ftr.persist_data_offset[1];
862 erase_offset = crypt_ftr.persist_data_offset[0];
863 } else {
864 /* The second copy must be the valid copy, so write to
865 * the first copy, and erase the second */
866 write_offset = crypt_ftr.persist_data_offset[0];
867 erase_offset = crypt_ftr.persist_data_offset[1];
868 }
869
870 /* Write the new copy first, if successful, then erase the old copy */
871 if (lseek(fd, write_offset, SEEK_SET) < 0) {
872 SLOGE("Cannot seek to write persistent data");
873 goto err2;
874 }
875 if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
876 (int) crypt_ftr.persist_data_size) {
877 if (lseek(fd, erase_offset, SEEK_SET) < 0) {
878 SLOGE("Cannot seek to erase previous persistent data");
879 goto err2;
880 }
881 fsync(fd);
882 memset(pdata, 0, crypt_ftr.persist_data_size);
883 if (unix_write(fd, pdata, crypt_ftr.persist_data_size) !=
884 (int) crypt_ftr.persist_data_size) {
885 SLOGE("Cannot write to erase previous persistent data");
886 goto err2;
887 }
888 fsync(fd);
889 } else {
890 SLOGE("Cannot write to save persistent data");
891 goto err2;
892 }
893
894 /* Success */
895 free(pdata);
896 close(fd);
897 return 0;
898
899err2:
900 free(pdata);
901err:
902 close(fd);
903 return -1;
904}
905
Paul Lawrencef4faa572014-01-29 13:31:03 -0800906static int hexdigit (char c)
907{
908 if (c >= '0' && c <= '9') return c - '0';
909 c = tolower(c);
910 if (c >= 'a' && c <= 'f') return c - 'a' + 10;
911 return -1;
912}
913
914static unsigned char* convert_hex_ascii_to_key(const char* master_key_ascii,
915 unsigned int* out_keysize)
916{
917 unsigned int i;
918 *out_keysize = 0;
919
920 size_t size = strlen (master_key_ascii);
921 if (size % 2) {
922 SLOGE("Trying to convert ascii string of odd length");
923 return NULL;
924 }
925
926 unsigned char* master_key = (unsigned char*) malloc(size / 2);
927 if (master_key == 0) {
928 SLOGE("Cannot allocate");
929 return NULL;
930 }
931
932 for (i = 0; i < size; i += 2) {
933 int high_nibble = hexdigit (master_key_ascii[i]);
934 int low_nibble = hexdigit (master_key_ascii[i + 1]);
935
936 if(high_nibble < 0 || low_nibble < 0) {
937 SLOGE("Invalid hex string");
938 free (master_key);
939 return NULL;
940 }
941
942 master_key[*out_keysize] = high_nibble * 16 + low_nibble;
943 (*out_keysize)++;
944 }
945
946 return master_key;
947}
948
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800949/* Convert a binary key of specified length into an ascii hex string equivalent,
950 * without the leading 0x and with null termination
951 */
Paul Lawrencef4faa572014-01-29 13:31:03 -0800952static void convert_key_to_hex_ascii(unsigned char *master_key, unsigned int keysize,
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800953 char *master_key_ascii)
954{
955 unsigned int i, a;
956 unsigned char nibble;
957
958 for (i=0, a=0; i<keysize; i++, a+=2) {
959 /* For each byte, write out two ascii hex digits */
960 nibble = (master_key[i] >> 4) & 0xf;
961 master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
962
963 nibble = master_key[i] & 0xf;
964 master_key_ascii[a+1] = nibble + (nibble > 9 ? 0x37 : 0x30);
965 }
966
967 /* Add the null termination */
968 master_key_ascii[a] = '\0';
969
970}
971
Ken Sumralldb5e0262013-02-05 17:39:48 -0800972static int load_crypto_mapping_table(struct crypt_mnt_ftr *crypt_ftr, unsigned char *master_key,
973 char *real_blk_name, const char *name, int fd,
974 char *extra_params)
975{
976 char buffer[DM_CRYPT_BUF_SIZE];
977 struct dm_ioctl *io;
978 struct dm_target_spec *tgt;
979 char *crypt_params;
980 char master_key_ascii[129]; /* Large enough to hold 512 bit key and null */
981 int i;
982
983 io = (struct dm_ioctl *) buffer;
984
985 /* Load the mapping table for this device */
986 tgt = (struct dm_target_spec *) &buffer[sizeof(struct dm_ioctl)];
987
988 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
989 io->target_count = 1;
990 tgt->status = 0;
991 tgt->sector_start = 0;
992 tgt->length = crypt_ftr->fs_size;
993 strcpy(tgt->target_type, "crypt");
994
995 crypt_params = buffer + sizeof(struct dm_ioctl) + sizeof(struct dm_target_spec);
996 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
997 sprintf(crypt_params, "%s %s 0 %s 0 %s", crypt_ftr->crypto_type_name,
998 master_key_ascii, real_blk_name, extra_params);
999 crypt_params += strlen(crypt_params) + 1;
1000 crypt_params = (char *) (((unsigned long)crypt_params + 7) & ~8); /* Align to an 8 byte boundary */
1001 tgt->next = crypt_params - buffer;
1002
1003 for (i = 0; i < TABLE_LOAD_RETRIES; i++) {
1004 if (! ioctl(fd, DM_TABLE_LOAD, io)) {
1005 break;
1006 }
1007 usleep(500000);
1008 }
1009
1010 if (i == TABLE_LOAD_RETRIES) {
1011 /* We failed to load the table, return an error */
1012 return -1;
1013 } else {
1014 return i + 1;
1015 }
1016}
1017
1018
1019static int get_dm_crypt_version(int fd, const char *name, int *version)
1020{
1021 char buffer[DM_CRYPT_BUF_SIZE];
1022 struct dm_ioctl *io;
1023 struct dm_target_versions *v;
1024 int i;
1025
1026 io = (struct dm_ioctl *) buffer;
1027
1028 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1029
1030 if (ioctl(fd, DM_LIST_VERSIONS, io)) {
1031 return -1;
1032 }
1033
1034 /* Iterate over the returned versions, looking for name of "crypt".
1035 * When found, get and return the version.
1036 */
1037 v = (struct dm_target_versions *) &buffer[sizeof(struct dm_ioctl)];
1038 while (v->next) {
1039 if (! strcmp(v->name, "crypt")) {
1040 /* We found the crypt driver, return the version, and get out */
1041 version[0] = v->version[0];
1042 version[1] = v->version[1];
1043 version[2] = v->version[2];
1044 return 0;
1045 }
1046 v = (struct dm_target_versions *)(((char *)v) + v->next);
1047 }
1048
1049 return -1;
1050}
1051
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001052static int create_crypto_blk_dev(struct crypt_mnt_ftr *crypt_ftr, unsigned char *master_key,
Ken Sumrall29d8da82011-05-18 17:20:07 -07001053 char *real_blk_name, char *crypto_blk_name, const char *name)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001054{
1055 char buffer[DM_CRYPT_BUF_SIZE];
1056 char master_key_ascii[129]; /* Large enough to hold 512 bit key and null */
1057 char *crypt_params;
1058 struct dm_ioctl *io;
1059 struct dm_target_spec *tgt;
1060 unsigned int minor;
1061 int fd;
Ken Sumralle919efe2012-09-29 17:07:41 -07001062 int i;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001063 int retval = -1;
Ken Sumralldb5e0262013-02-05 17:39:48 -08001064 int version[3];
1065 char *extra_params;
1066 int load_count;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001067
1068 if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
1069 SLOGE("Cannot open device-mapper\n");
1070 goto errout;
1071 }
1072
1073 io = (struct dm_ioctl *) buffer;
1074
1075 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1076 if (ioctl(fd, DM_DEV_CREATE, io)) {
1077 SLOGE("Cannot create dm-crypt device\n");
1078 goto errout;
1079 }
1080
1081 /* Get the device status, in particular, the name of it's device file */
1082 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1083 if (ioctl(fd, DM_DEV_STATUS, io)) {
1084 SLOGE("Cannot retrieve dm-crypt device status\n");
1085 goto errout;
1086 }
1087 minor = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00);
1088 snprintf(crypto_blk_name, MAXPATHLEN, "/dev/block/dm-%u", minor);
1089
Ken Sumralldb5e0262013-02-05 17:39:48 -08001090 extra_params = "";
1091 if (! get_dm_crypt_version(fd, name, version)) {
1092 /* Support for allow_discards was added in version 1.11.0 */
1093 if ((version[0] >= 2) ||
1094 ((version[0] == 1) && (version[1] >= 11))) {
1095 extra_params = "1 allow_discards";
1096 SLOGI("Enabling support for allow_discards in dmcrypt.\n");
1097 }
Ken Sumralle919efe2012-09-29 17:07:41 -07001098 }
1099
Ken Sumralldb5e0262013-02-05 17:39:48 -08001100 load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name,
1101 fd, extra_params);
1102 if (load_count < 0) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001103 SLOGE("Cannot load dm-crypt mapping table.\n");
1104 goto errout;
Ken Sumralldb5e0262013-02-05 17:39:48 -08001105 } else if (load_count > 1) {
1106 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001107 }
1108
1109 /* Resume this device to activate it */
Ken Sumralldb5e0262013-02-05 17:39:48 -08001110 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001111
1112 if (ioctl(fd, DM_DEV_SUSPEND, io)) {
1113 SLOGE("Cannot resume the dm-crypt device\n");
1114 goto errout;
1115 }
1116
1117 /* We made it here with no errors. Woot! */
1118 retval = 0;
1119
1120errout:
1121 close(fd); /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
1122
1123 return retval;
1124}
1125
Ken Sumrall29d8da82011-05-18 17:20:07 -07001126static int delete_crypto_blk_dev(char *name)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001127{
1128 int fd;
1129 char buffer[DM_CRYPT_BUF_SIZE];
1130 struct dm_ioctl *io;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001131 int retval = -1;
1132
1133 if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
1134 SLOGE("Cannot open device-mapper\n");
1135 goto errout;
1136 }
1137
1138 io = (struct dm_ioctl *) buffer;
1139
1140 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1141 if (ioctl(fd, DM_DEV_REMOVE, io)) {
1142 SLOGE("Cannot remove dm-crypt device\n");
1143 goto errout;
1144 }
1145
1146 /* We made it here with no errors. Woot! */
1147 retval = 0;
1148
1149errout:
1150 close(fd); /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
1151
1152 return retval;
1153
1154}
1155
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001156static int pbkdf2(const char *passwd, const unsigned char *salt,
Paul Lawrencef4faa572014-01-29 13:31:03 -08001157 unsigned char *ikey, void *params UNUSED)
1158{
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001159 SLOGI("Using pbkdf2 for cryptfs KDF");
1160
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001161 /* Turn the password into a key and IV that can decrypt the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001162 unsigned int keysize;
1163 char* master_key = (char*)convert_hex_ascii_to_key(passwd, &keysize);
1164 if (!master_key) return -1;
1165 PKCS5_PBKDF2_HMAC_SHA1(master_key, keysize, salt, SALT_LEN,
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001166 HASH_COUNT, KEY_LEN_BYTES+IV_LEN_BYTES, ikey);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001167
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001168 memset(master_key, 0, keysize);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001169 free (master_key);
1170 return 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001171}
1172
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001173static int scrypt(const char *passwd, const unsigned char *salt,
Paul Lawrencef4faa572014-01-29 13:31:03 -08001174 unsigned char *ikey, void *params)
1175{
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001176 SLOGI("Using scrypt for cryptfs KDF");
1177
Kenny Rootc4c70f12013-06-14 12:11:38 -07001178 struct crypt_mnt_ftr *ftr = (struct crypt_mnt_ftr *) params;
1179
1180 int N = 1 << ftr->N_factor;
1181 int r = 1 << ftr->r_factor;
1182 int p = 1 << ftr->p_factor;
1183
1184 /* Turn the password into a key and IV that can decrypt the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001185 unsigned int keysize;
1186 unsigned char* master_key = convert_hex_ascii_to_key(passwd, &keysize);
1187 if (!master_key) return -1;
1188 crypto_scrypt(master_key, keysize, salt, SALT_LEN, N, r, p, ikey,
Kenny Rootc4c70f12013-06-14 12:11:38 -07001189 KEY_LEN_BYTES + IV_LEN_BYTES);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001190
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001191 memset(master_key, 0, keysize);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001192 free (master_key);
1193 return 0;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001194}
1195
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001196static int scrypt_keymaster(const char *passwd, const unsigned char *salt,
1197 unsigned char *ikey, void *params)
1198{
1199 SLOGI("Using scrypt with keymaster for cryptfs KDF");
1200
1201 int rc;
1202 unsigned int key_size;
1203 size_t signature_size;
1204 unsigned char* signature;
1205 struct crypt_mnt_ftr *ftr = (struct crypt_mnt_ftr *) params;
1206
1207 int N = 1 << ftr->N_factor;
1208 int r = 1 << ftr->r_factor;
1209 int p = 1 << ftr->p_factor;
1210
1211 unsigned char* master_key = convert_hex_ascii_to_key(passwd, &key_size);
1212 if (!master_key) {
1213 SLOGE("Failed to convert passwd from hex");
1214 return -1;
1215 }
1216
1217 rc = crypto_scrypt(master_key, key_size, salt, SALT_LEN,
1218 N, r, p, ikey, KEY_LEN_BYTES + IV_LEN_BYTES);
1219 memset(master_key, 0, key_size);
1220 free(master_key);
1221
1222 if (rc) {
1223 SLOGE("scrypt failed");
1224 return -1;
1225 }
1226
Shawn Willdene17a9c42014-09-08 13:04:08 -06001227 if (keymaster_sign_object(ftr, ikey, KEY_LEN_BYTES + IV_LEN_BYTES,
1228 &signature, &signature_size)) {
1229 SLOGE("Signing failed");
1230 return -1;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001231 }
1232
1233 rc = crypto_scrypt(signature, signature_size, salt, SALT_LEN,
1234 N, r, p, ikey, KEY_LEN_BYTES + IV_LEN_BYTES);
1235 free(signature);
1236
1237 if (rc) {
1238 SLOGE("scrypt failed");
1239 return -1;
1240 }
1241
1242 return 0;
1243}
1244
1245static int encrypt_master_key(const char *passwd, const unsigned char *salt,
1246 const unsigned char *decrypted_master_key,
Kenny Rootc4c70f12013-06-14 12:11:38 -07001247 unsigned char *encrypted_master_key,
1248 struct crypt_mnt_ftr *crypt_ftr)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001249{
1250 unsigned char ikey[32+32] = { 0 }; /* Big enough to hold a 256 bit key and 256 bit IV */
1251 EVP_CIPHER_CTX e_ctx;
1252 int encrypted_len, final_len;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001253 int rc = 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001254
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001255 /* Turn the password into an intermediate key and IV that can decrypt the master key */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001256 get_device_scrypt_params(crypt_ftr);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001257
1258 switch (crypt_ftr->kdf_type) {
Shawn Willdene17a9c42014-09-08 13:04:08 -06001259 case KDF_SCRYPT_KEYMASTER_UNPADDED:
1260 case KDF_SCRYPT_KEYMASTER_BADLY_PADDED:
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001261 case KDF_SCRYPT_KEYMASTER:
1262 if (keymaster_create_key(crypt_ftr)) {
1263 SLOGE("keymaster_create_key failed");
1264 return -1;
1265 }
1266
1267 if (scrypt_keymaster(passwd, salt, ikey, crypt_ftr)) {
1268 SLOGE("scrypt failed");
1269 return -1;
1270 }
1271 break;
1272
1273 case KDF_SCRYPT:
1274 if (scrypt(passwd, salt, ikey, crypt_ftr)) {
1275 SLOGE("scrypt failed");
1276 return -1;
1277 }
1278 break;
1279
1280 default:
1281 SLOGE("Invalid kdf_type");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001282 return -1;
1283 }
Kenny Rootc4c70f12013-06-14 12:11:38 -07001284
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001285 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001286 EVP_CIPHER_CTX_init(&e_ctx);
1287 if (! EVP_EncryptInit_ex(&e_ctx, EVP_aes_128_cbc(), NULL, ikey, ikey+KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001288 SLOGE("EVP_EncryptInit failed\n");
1289 return -1;
1290 }
1291 EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001292
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001293 /* Encrypt the master key */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001294 if (! EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len,
1295 decrypted_master_key, KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001296 SLOGE("EVP_EncryptUpdate failed\n");
1297 return -1;
1298 }
Adam Langley889c4f12014-09-03 14:23:13 -07001299 if (! EVP_EncryptFinal_ex(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001300 SLOGE("EVP_EncryptFinal failed\n");
1301 return -1;
1302 }
1303
1304 if (encrypted_len + final_len != KEY_LEN_BYTES) {
1305 SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
1306 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001307 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001308
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001309 /* Store the scrypt of the intermediate key, so we can validate if it's a
1310 password error or mount error when things go wrong.
1311 Note there's no need to check for errors, since if this is incorrect, we
1312 simply won't wipe userdata, which is the correct default behavior
1313 */
1314 int N = 1 << crypt_ftr->N_factor;
1315 int r = 1 << crypt_ftr->r_factor;
1316 int p = 1 << crypt_ftr->p_factor;
1317
1318 rc = crypto_scrypt(ikey, KEY_LEN_BYTES,
1319 crypt_ftr->salt, sizeof(crypt_ftr->salt), N, r, p,
1320 crypt_ftr->scrypted_intermediate_key,
1321 sizeof(crypt_ftr->scrypted_intermediate_key));
1322
1323 if (rc) {
1324 SLOGE("encrypt_master_key: crypto_scrypt failed");
1325 }
1326
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001327 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001328}
1329
JP Abgrall7bdfa522013-11-15 13:42:56 -08001330static int decrypt_master_key_aux(char *passwd, unsigned char *salt,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001331 unsigned char *encrypted_master_key,
1332 unsigned char *decrypted_master_key,
1333 kdf_func kdf, void *kdf_params,
1334 unsigned char** intermediate_key,
1335 size_t* intermediate_key_size)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001336{
1337 unsigned char ikey[32+32] = { 0 }; /* Big enough to hold a 256 bit key and 256 bit IV */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001338 EVP_CIPHER_CTX d_ctx;
1339 int decrypted_len, final_len;
1340
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001341 /* Turn the password into an intermediate key and IV that can decrypt the
1342 master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001343 if (kdf(passwd, salt, ikey, kdf_params)) {
1344 SLOGE("kdf failed");
1345 return -1;
1346 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001347
1348 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001349 EVP_CIPHER_CTX_init(&d_ctx);
1350 if (! EVP_DecryptInit_ex(&d_ctx, EVP_aes_128_cbc(), NULL, ikey, ikey+KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001351 return -1;
1352 }
1353 EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
1354 /* Decrypt the master key */
1355 if (! EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len,
1356 encrypted_master_key, KEY_LEN_BYTES)) {
1357 return -1;
1358 }
Adam Langley889c4f12014-09-03 14:23:13 -07001359 if (! EVP_DecryptFinal_ex(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001360 return -1;
1361 }
1362
1363 if (decrypted_len + final_len != KEY_LEN_BYTES) {
1364 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001365 }
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001366
1367 /* Copy intermediate key if needed by params */
1368 if (intermediate_key && intermediate_key_size) {
1369 *intermediate_key = (unsigned char*) malloc(KEY_LEN_BYTES);
1370 if (intermediate_key) {
1371 memcpy(*intermediate_key, ikey, KEY_LEN_BYTES);
1372 *intermediate_key_size = KEY_LEN_BYTES;
1373 }
1374 }
1375
1376 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001377}
1378
Kenny Rootc4c70f12013-06-14 12:11:38 -07001379static void get_kdf_func(struct crypt_mnt_ftr *ftr, kdf_func *kdf, void** kdf_params)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001380{
Shawn Willdene17a9c42014-09-08 13:04:08 -06001381 if (ftr->kdf_type == KDF_SCRYPT_KEYMASTER_UNPADDED ||
1382 ftr->kdf_type == KDF_SCRYPT_KEYMASTER_BADLY_PADDED ||
1383 ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001384 *kdf = scrypt_keymaster;
1385 *kdf_params = ftr;
1386 } else if (ftr->kdf_type == KDF_SCRYPT) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001387 *kdf = scrypt;
1388 *kdf_params = ftr;
1389 } else {
1390 *kdf = pbkdf2;
1391 *kdf_params = NULL;
1392 }
1393}
1394
JP Abgrall7bdfa522013-11-15 13:42:56 -08001395static int decrypt_master_key(char *passwd, unsigned char *decrypted_master_key,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001396 struct crypt_mnt_ftr *crypt_ftr,
1397 unsigned char** intermediate_key,
1398 size_t* intermediate_key_size)
Kenny Rootc4c70f12013-06-14 12:11:38 -07001399{
1400 kdf_func kdf;
1401 void *kdf_params;
1402 int ret;
1403
1404 get_kdf_func(crypt_ftr, &kdf, &kdf_params);
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001405 ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key,
1406 decrypted_master_key, kdf, kdf_params,
1407 intermediate_key, intermediate_key_size);
Kenny Rootc4c70f12013-06-14 12:11:38 -07001408 if (ret != 0) {
1409 SLOGW("failure decrypting master key");
Kenny Rootc4c70f12013-06-14 12:11:38 -07001410 }
1411
1412 return ret;
1413}
1414
1415static int create_encrypted_random_key(char *passwd, unsigned char *master_key, unsigned char *salt,
1416 struct crypt_mnt_ftr *crypt_ftr) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001417 int fd;
Ken Sumralle8744072011-01-18 22:01:55 -08001418 unsigned char key_buf[KEY_LEN_BYTES];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001419 EVP_CIPHER_CTX e_ctx;
1420 int encrypted_len, final_len;
1421
1422 /* Get some random bits for a key */
1423 fd = open("/dev/urandom", O_RDONLY);
Ken Sumralle8744072011-01-18 22:01:55 -08001424 read(fd, key_buf, sizeof(key_buf));
1425 read(fd, salt, SALT_LEN);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001426 close(fd);
1427
1428 /* Now encrypt it with the password */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001429 return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001430}
1431
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001432static int wait_and_unmount(char *mountpoint, bool kill)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001433{
Greg Hackmann955653e2014-09-24 14:55:20 -07001434 int i, err, rc;
Ken Sumrall2eaf7132011-01-14 12:45:48 -08001435#define WAIT_UNMOUNT_COUNT 20
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001436
1437 /* Now umount the tmpfs filesystem */
1438 for (i=0; i<WAIT_UNMOUNT_COUNT; i++) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001439 if (umount(mountpoint) == 0) {
1440 break;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001441 }
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001442
1443 if (errno == EINVAL) {
1444 /* EINVAL is returned if the directory is not a mountpoint,
1445 * i.e. there is no filesystem mounted there. So just get out.
1446 */
1447 break;
1448 }
1449
1450 err = errno;
1451
1452 /* If allowed, be increasingly aggressive before the last two retries */
1453 if (kill) {
1454 if (i == (WAIT_UNMOUNT_COUNT - 3)) {
1455 SLOGW("sending SIGHUP to processes with open files\n");
1456 vold_killProcessesWithOpenFiles(mountpoint, 1);
1457 } else if (i == (WAIT_UNMOUNT_COUNT - 2)) {
1458 SLOGW("sending SIGKILL to processes with open files\n");
1459 vold_killProcessesWithOpenFiles(mountpoint, 2);
1460 }
1461 }
1462
1463 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001464 }
1465
1466 if (i < WAIT_UNMOUNT_COUNT) {
1467 SLOGD("unmounting %s succeeded\n", mountpoint);
1468 rc = 0;
1469 } else {
jessica_yu3f14fe42014-09-22 15:57:40 +08001470 vold_killProcessesWithOpenFiles(mountpoint, 0);
Greg Hackmann955653e2014-09-24 14:55:20 -07001471 SLOGE("unmounting %s failed: %s\n", mountpoint, strerror(err));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001472 rc = -1;
1473 }
1474
1475 return rc;
1476}
1477
Ken Sumrallc5872692013-05-14 15:26:31 -07001478#define DATA_PREP_TIMEOUT 200
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001479static int prep_data_fs(void)
1480{
1481 int i;
1482
1483 /* Do the prep of the /data filesystem */
1484 property_set("vold.post_fs_data_done", "0");
1485 property_set("vold.decrypt", "trigger_post_fs_data");
1486 SLOGD("Just triggered post_fs_data\n");
1487
Ken Sumrallc5872692013-05-14 15:26:31 -07001488 /* Wait a max of 50 seconds, hopefully it takes much less */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001489 for (i=0; i<DATA_PREP_TIMEOUT; i++) {
Ken Sumrall29d8da82011-05-18 17:20:07 -07001490 char p[PROPERTY_VALUE_MAX];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001491
1492 property_get("vold.post_fs_data_done", p, "0");
1493 if (*p == '1') {
1494 break;
1495 } else {
1496 usleep(250000);
1497 }
1498 }
1499 if (i == DATA_PREP_TIMEOUT) {
1500 /* Ugh, we failed to prep /data in time. Bail. */
Ken Sumrallc5872692013-05-14 15:26:31 -07001501 SLOGE("post_fs_data timed out!\n");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001502 return -1;
1503 } else {
1504 SLOGD("post_fs_data done\n");
1505 return 0;
1506 }
1507}
1508
Paul Lawrence74f29f12014-08-28 15:54:10 -07001509static void cryptfs_set_corrupt()
1510{
1511 // Mark the footer as bad
1512 struct crypt_mnt_ftr crypt_ftr;
1513 if (get_crypt_ftr_and_key(&crypt_ftr)) {
1514 SLOGE("Failed to get crypto footer - panic");
1515 return;
1516 }
1517
1518 crypt_ftr.flags |= CRYPT_DATA_CORRUPT;
1519 if (put_crypt_ftr_and_key(&crypt_ftr)) {
1520 SLOGE("Failed to set crypto footer - panic");
1521 return;
1522 }
1523}
1524
1525static void cryptfs_trigger_restart_min_framework()
1526{
1527 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
1528 SLOGE("Failed to mount tmpfs on data - panic");
1529 return;
1530 }
1531
1532 if (property_set("vold.decrypt", "trigger_post_fs_data")) {
1533 SLOGE("Failed to trigger post fs data - panic");
1534 return;
1535 }
1536
1537 if (property_set("vold.decrypt", "trigger_restart_min_framework")) {
1538 SLOGE("Failed to trigger restart min framework - panic");
1539 return;
1540 }
1541}
1542
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001543/* returns < 0 on failure */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001544static int cryptfs_restart_internal(int restart_main)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001545{
1546 char fs_type[32];
1547 char real_blkdev[MAXPATHLEN];
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001548 char crypto_blkdev[MAXPATHLEN];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001549 char fs_options[256];
1550 unsigned long mnt_flags;
1551 struct stat statbuf;
1552 int rc = -1, i;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001553 static int restart_successful = 0;
1554
1555 /* Validate that it's OK to call this routine */
Jason parks70a4b3f2011-01-28 10:10:47 -06001556 if (! master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08001557 SLOGE("Encrypted filesystem not validated, aborting");
1558 return -1;
1559 }
1560
1561 if (restart_successful) {
1562 SLOGE("System already restarted with encrypted disk, aborting");
1563 return -1;
1564 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001565
Paul Lawrencef4faa572014-01-29 13:31:03 -08001566 if (restart_main) {
1567 /* Here is where we shut down the framework. The init scripts
1568 * start all services in one of three classes: core, main or late_start.
1569 * On boot, we start core and main. Now, we stop main, but not core,
1570 * as core includes vold and a few other really important things that
1571 * we need to keep running. Once main has stopped, we should be able
1572 * to umount the tmpfs /data, then mount the encrypted /data.
1573 * We then restart the class main, and also the class late_start.
1574 * At the moment, I've only put a few things in late_start that I know
1575 * are not needed to bring up the framework, and that also cause problems
1576 * with unmounting the tmpfs /data, but I hope to add add more services
1577 * to the late_start class as we optimize this to decrease the delay
1578 * till the user is asked for the password to the filesystem.
1579 */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001580
Paul Lawrencef4faa572014-01-29 13:31:03 -08001581 /* The init files are setup to stop the class main when vold.decrypt is
1582 * set to trigger_reset_main.
1583 */
1584 property_set("vold.decrypt", "trigger_reset_main");
1585 SLOGD("Just asked init to shut down class main\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001586
Paul Lawrencef4faa572014-01-29 13:31:03 -08001587 /* Ugh, shutting down the framework is not synchronous, so until it
1588 * can be fixed, this horrible hack will wait a moment for it all to
1589 * shut down before proceeding. Without it, some devices cannot
1590 * restart the graphics services.
1591 */
1592 sleep(2);
1593 }
Ken Sumrall9dedfd42012-10-09 14:16:59 -07001594
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001595 /* Now that the framework is shutdown, we should be able to umount()
1596 * the tmpfs filesystem, and mount the real one.
1597 */
1598
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001599 property_get("ro.crypto.fs_crypto_blkdev", crypto_blkdev, "");
1600 if (strlen(crypto_blkdev) == 0) {
1601 SLOGE("fs_crypto_blkdev not set\n");
1602 return -1;
1603 }
1604
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001605 if (! (rc = wait_and_unmount(DATA_MNT_POINT, true)) ) {
Doug Zongker6fd57712013-12-17 09:43:23 -08001606 /* If ro.crypto.readonly is set to 1, mount the decrypted
1607 * filesystem readonly. This is used when /data is mounted by
1608 * recovery mode.
1609 */
1610 char ro_prop[PROPERTY_VALUE_MAX];
1611 property_get("ro.crypto.readonly", ro_prop, "");
1612 if (strlen(ro_prop) > 0 && atoi(ro_prop)) {
1613 struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab, DATA_MNT_POINT);
1614 rec->flags |= MS_RDONLY;
1615 }
JP Abgrall62c7af32014-06-16 13:01:23 -07001616
Ken Sumralle5032c42012-04-01 23:58:44 -07001617 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001618 int retries = RETRY_MOUNT_ATTEMPTS;
1619 int mount_rc;
1620 while ((mount_rc = fs_mgr_do_mount(fstab, DATA_MNT_POINT,
1621 crypto_blkdev, 0))
1622 != 0) {
1623 if (mount_rc == FS_MGR_DOMNT_BUSY) {
1624 /* TODO: invoke something similar to
1625 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
1626 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
1627 SLOGI("Failed to mount %s because it is busy - waiting",
1628 crypto_blkdev);
1629 if (--retries) {
1630 sleep(RETRY_MOUNT_DELAY_SECONDS);
1631 } else {
1632 /* Let's hope that a reboot clears away whatever is keeping
1633 the mount busy */
1634 cryptfs_reboot(reboot);
1635 }
1636 } else {
1637 SLOGE("Failed to mount decrypted data");
1638 cryptfs_set_corrupt();
1639 cryptfs_trigger_restart_min_framework();
1640 SLOGI("Started framework to offer wipe");
1641 return -1;
1642 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001643 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001644
Ken Sumralle5032c42012-04-01 23:58:44 -07001645 property_set("vold.decrypt", "trigger_load_persist_props");
1646 /* Create necessary paths on /data */
1647 if (prep_data_fs()) {
1648 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001649 }
Ken Sumralle5032c42012-04-01 23:58:44 -07001650
1651 /* startup service classes main and late_start */
1652 property_set("vold.decrypt", "trigger_restart_framework");
1653 SLOGD("Just triggered restart_framework\n");
1654
1655 /* Give it a few moments to get started */
1656 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001657 }
1658
Ken Sumrall0cc16632011-01-18 20:32:26 -08001659 if (rc == 0) {
1660 restart_successful = 1;
1661 }
1662
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001663 return rc;
1664}
1665
Paul Lawrencef4faa572014-01-29 13:31:03 -08001666int cryptfs_restart(void)
1667{
1668 /* Call internal implementation forcing a restart of main service group */
1669 return cryptfs_restart_internal(1);
1670}
1671
Mark Salyzyn3e971272014-01-21 13:27:04 -08001672static int do_crypto_complete(char *mount_point UNUSED)
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001673{
1674 struct crypt_mnt_ftr crypt_ftr;
Ken Sumrall29d8da82011-05-18 17:20:07 -07001675 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumralle1a45852011-12-14 21:24:27 -08001676 char key_loc[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001677
1678 property_get("ro.crypto.state", encrypted_state, "");
1679 if (strcmp(encrypted_state, "encrypted") ) {
1680 SLOGE("not running with encryption, aborting");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001681 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001682 }
1683
Ken Sumrall160b4d62013-04-22 12:15:39 -07001684 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall56ad03c2013-02-13 13:00:19 -08001685 fs_mgr_get_crypt_info(fstab, key_loc, 0, sizeof(key_loc));
Ken Sumralle5032c42012-04-01 23:58:44 -07001686
Ken Sumralle1a45852011-12-14 21:24:27 -08001687 /*
1688 * Only report this error if key_loc is a file and it exists.
1689 * If the device was never encrypted, and /data is not mountable for
1690 * some reason, returning 1 should prevent the UI from presenting the
1691 * a "enter password" screen, or worse, a "press button to wipe the
1692 * device" screen.
1693 */
1694 if ((key_loc[0] == '/') && (access("key_loc", F_OK) == -1)) {
1695 SLOGE("master key file does not exist, aborting");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001696 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08001697 } else {
1698 SLOGE("Error getting crypt footer and key\n");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001699 return CRYPTO_COMPLETE_BAD_METADATA;
Ken Sumralle1a45852011-12-14 21:24:27 -08001700 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001701 }
1702
Paul Lawrence74f29f12014-08-28 15:54:10 -07001703 // Test for possible error flags
1704 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS){
1705 SLOGE("Encryption process is partway completed\n");
1706 return CRYPTO_COMPLETE_PARTIAL;
1707 }
1708
1709 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE){
1710 SLOGE("Encryption process was interrupted but cannot continue\n");
1711 return CRYPTO_COMPLETE_INCONSISTENT;
1712 }
1713
1714 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT){
1715 SLOGE("Encryption is successful but data is corrupt\n");
1716 return CRYPTO_COMPLETE_CORRUPT;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001717 }
1718
1719 /* We passed the test! We shall diminish, and return to the west */
Paul Lawrence74f29f12014-08-28 15:54:10 -07001720 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001721}
1722
Paul Lawrencef4faa572014-01-29 13:31:03 -08001723static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
1724 char *passwd, char *mount_point, char *label)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001725{
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001726 /* Allocate enough space for a 256 bit key, but we may use less */
Ken Sumrall160b4d62013-04-22 12:15:39 -07001727 unsigned char decrypted_master_key[32];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001728 char crypto_blkdev[MAXPATHLEN];
1729 char real_blkdev[MAXPATHLEN];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001730 char tmp_mount_point[64];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001731 unsigned int orig_failed_decrypt_count;
1732 int rc;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001733 kdf_func kdf;
1734 void *kdf_params;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001735 int use_keymaster = 0;
1736 int upgrade = 0;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001737 unsigned char* intermediate_key = 0;
1738 size_t intermediate_key_size = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001739
Paul Lawrencef4faa572014-01-29 13:31:03 -08001740 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
1741 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001742
Paul Lawrencef4faa572014-01-29 13:31:03 -08001743 if (! (crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED) ) {
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001744 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr,
1745 &intermediate_key, &intermediate_key_size)) {
JP Abgrall7bdfa522013-11-15 13:42:56 -08001746 SLOGE("Failed to decrypt master key\n");
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001747 rc = -1;
1748 goto errout;
JP Abgrall7bdfa522013-11-15 13:42:56 -08001749 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001750 }
1751
Paul Lawrencef4faa572014-01-29 13:31:03 -08001752 fs_mgr_get_crypt_info(fstab, 0, real_blkdev, sizeof(real_blkdev));
1753
Paul Lawrence74f29f12014-08-28 15:54:10 -07001754 // Create crypto block device - all (non fatal) code paths
1755 // need it
Paul Lawrencef4faa572014-01-29 13:31:03 -08001756 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key,
1757 real_blkdev, crypto_blkdev, label)) {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001758 SLOGE("Error creating decrypted block device\n");
1759 rc = -1;
1760 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001761 }
1762
Paul Lawrence74f29f12014-08-28 15:54:10 -07001763 /* Work out if the problem is the password or the data */
1764 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->
1765 scrypted_intermediate_key)];
1766 int N = 1 << crypt_ftr->N_factor;
1767 int r = 1 << crypt_ftr->r_factor;
1768 int p = 1 << crypt_ftr->p_factor;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001769
Paul Lawrence74f29f12014-08-28 15:54:10 -07001770 rc = crypto_scrypt(intermediate_key, intermediate_key_size,
1771 crypt_ftr->salt, sizeof(crypt_ftr->salt),
1772 N, r, p, scrypted_intermediate_key,
1773 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001774
Paul Lawrence74f29f12014-08-28 15:54:10 -07001775 // Does the key match the crypto footer?
1776 if (rc == 0 && memcmp(scrypted_intermediate_key,
1777 crypt_ftr->scrypted_intermediate_key,
1778 sizeof(scrypted_intermediate_key)) == 0) {
1779 SLOGI("Password matches");
1780 rc = 0;
1781 } else {
1782 /* Try mounting the file system anyway, just in case the problem's with
1783 * the footer, not the key. */
1784 sprintf(tmp_mount_point, "%s/tmp_mnt", mount_point);
1785 mkdir(tmp_mount_point, 0755);
1786 if (fs_mgr_do_mount(fstab, DATA_MNT_POINT, crypto_blkdev, tmp_mount_point)) {
1787 SLOGE("Error temp mounting decrypted block device\n");
1788 delete_crypto_blk_dev(label);
1789
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001790 rc = ++crypt_ftr->failed_decrypt_count;
1791 put_crypt_ftr_and_key(crypt_ftr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07001792 } else {
1793 /* Success! */
1794 SLOGI("Password did not match but decrypted drive mounted - continue");
1795 umount(tmp_mount_point);
1796 rc = 0;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001797 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001798 }
1799
1800 if (rc == 0) {
1801 crypt_ftr->failed_decrypt_count = 0;
Paul Lawrence72b8b822014-10-05 12:57:37 -07001802 if (orig_failed_decrypt_count != 0) {
1803 put_crypt_ftr_and_key(crypt_ftr);
1804 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001805
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001806 /* Save the name of the crypto block device
Paul Lawrence74f29f12014-08-28 15:54:10 -07001807 * so we can mount it when restarting the framework. */
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001808 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev);
Jason parks70a4b3f2011-01-28 10:10:47 -06001809
1810 /* Also save a the master key so we can reencrypted the key
Paul Lawrence74f29f12014-08-28 15:54:10 -07001811 * the key when we want to change the password on it. */
Jason parks70a4b3f2011-01-28 10:10:47 -06001812 memcpy(saved_master_key, decrypted_master_key, KEY_LEN_BYTES);
Ken Sumrall3ad90722011-10-04 20:38:29 -07001813 saved_mount_point = strdup(mount_point);
Jason parks70a4b3f2011-01-28 10:10:47 -06001814 master_key_saved = 1;
JP Abgrall7bdfa522013-11-15 13:42:56 -08001815 SLOGD("%s(): Master key saved\n", __FUNCTION__);
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001816 rc = 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001817
Paul Lawrence74f29f12014-08-28 15:54:10 -07001818 // Upgrade if we're not using the latest KDF.
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001819 use_keymaster = keymaster_check_compatibility();
1820 if (crypt_ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Shawn Willden47ba10d2014-09-03 17:07:06 -06001821 // Don't allow downgrade
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001822 } else if (use_keymaster == 1 && crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
1823 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
1824 upgrade = 1;
1825 } else if (use_keymaster == 0 && crypt_ftr->kdf_type != KDF_SCRYPT) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08001826 crypt_ftr->kdf_type = KDF_SCRYPT;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001827 upgrade = 1;
1828 }
1829
1830 if (upgrade) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08001831 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
1832 crypt_ftr->master_key, crypt_ftr);
JP Abgrall7bdfa522013-11-15 13:42:56 -08001833 if (!rc) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08001834 rc = put_crypt_ftr_and_key(crypt_ftr);
JP Abgrall7bdfa522013-11-15 13:42:56 -08001835 }
1836 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07001837
1838 // Do not fail even if upgrade failed - machine is bootable
1839 // Note that if this code is ever hit, there is a *serious* problem
1840 // since KDFs should never fail. You *must* fix the kdf before
1841 // proceeding!
1842 if (rc) {
1843 SLOGW("Upgrade failed with error %d,"
1844 " but continuing with previous state",
1845 rc);
1846 rc = 0;
1847 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08001848 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001849 }
1850
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001851 errout:
1852 if (intermediate_key) {
1853 memset(intermediate_key, 0, intermediate_key_size);
1854 free(intermediate_key);
1855 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001856 return rc;
1857}
1858
Ken Sumrall0b8b5972011-08-31 16:14:23 -07001859/* Called by vold when it wants to undo the crypto mapping of a volume it
1860 * manages. This is usually in response to a factory reset, when we want
1861 * to undo the crypto mapping so the volume is formatted in the clear.
1862 */
1863int cryptfs_revert_volume(const char *label)
1864{
1865 return delete_crypto_blk_dev((char *)label);
1866}
1867
Ken Sumrall29d8da82011-05-18 17:20:07 -07001868/*
1869 * Called by vold when it's asked to mount an encrypted, nonremovable volume.
1870 * Setup a dm-crypt mapping, use the saved master key from
1871 * setting up the /data mapping, and return the new device path.
1872 */
1873int cryptfs_setup_volume(const char *label, int major, int minor,
1874 char *crypto_sys_path, unsigned int max_path,
1875 int *new_major, int *new_minor)
1876{
1877 char real_blkdev[MAXPATHLEN], crypto_blkdev[MAXPATHLEN];
1878 struct crypt_mnt_ftr sd_crypt_ftr;
Ken Sumrall29d8da82011-05-18 17:20:07 -07001879 struct stat statbuf;
1880 int nr_sec, fd;
1881
1882 sprintf(real_blkdev, "/dev/block/vold/%d:%d", major, minor);
1883
Ken Sumrall160b4d62013-04-22 12:15:39 -07001884 get_crypt_ftr_and_key(&sd_crypt_ftr);
Ken Sumrall29d8da82011-05-18 17:20:07 -07001885
1886 /* Update the fs_size field to be the size of the volume */
1887 fd = open(real_blkdev, O_RDONLY);
1888 nr_sec = get_blkdev_size(fd);
1889 close(fd);
1890 if (nr_sec == 0) {
1891 SLOGE("Cannot get size of volume %s\n", real_blkdev);
1892 return -1;
1893 }
1894
1895 sd_crypt_ftr.fs_size = nr_sec;
1896 create_crypto_blk_dev(&sd_crypt_ftr, saved_master_key, real_blkdev,
1897 crypto_blkdev, label);
1898
1899 stat(crypto_blkdev, &statbuf);
1900 *new_major = MAJOR(statbuf.st_rdev);
1901 *new_minor = MINOR(statbuf.st_rdev);
1902
1903 /* Create path to sys entry for this block device */
1904 snprintf(crypto_sys_path, max_path, "/devices/virtual/block/%s", strrchr(crypto_blkdev, '/')+1);
1905
1906 return 0;
1907}
1908
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001909int cryptfs_crypto_complete(void)
1910{
1911 return do_crypto_complete("/data");
1912}
1913
Paul Lawrencef4faa572014-01-29 13:31:03 -08001914int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr)
1915{
1916 char encrypted_state[PROPERTY_VALUE_MAX];
1917 property_get("ro.crypto.state", encrypted_state, "");
1918 if ( master_key_saved || strcmp(encrypted_state, "encrypted") ) {
1919 SLOGE("encrypted fs already validated or not running with encryption,"
1920 " aborting");
1921 return -1;
1922 }
1923
1924 if (get_crypt_ftr_and_key(crypt_ftr)) {
1925 SLOGE("Error getting crypt footer and key");
1926 return -1;
1927 }
1928
1929 return 0;
1930}
1931
Paul Lawrencefc615042014-10-04 15:32:29 -07001932/*
1933 * TODO - transition patterns to new format in calling code
1934 * and remove this vile hack, and the use of hex in
1935 * the password passing code.
1936 *
1937 * Patterns are passed in zero based (i.e. the top left dot
1938 * is represented by zero, the top middle one etc), but we want
1939 * to store them '1' based.
1940 * This is to allow us to migrate the calling code to use this
1941 * convention. It also solves a nasty problem whereby scrypt ignores
1942 * trailing zeros, so patterns ending at the top left could be
1943 * truncated, and similarly, you could add the top left to any
1944 * pattern and still match.
1945 * adjust_passwd is a hack function that returns the alternate representation
1946 * if the password appears to be a pattern (hex numbers all less than 09)
1947 * If it succeeds we need to try both, and in particular try the alternate
1948 * first. If the original matches, then we need to update the footer
1949 * with the alternate.
1950 * All code that accepts passwords must adjust them first. Since
1951 * cryptfs_check_passwd is always the first function called after a migration
1952 * (and indeed on any boot) we only need to do the double try in this
1953 * function.
1954 */
1955char* adjust_passwd(const char* passwd)
1956{
1957 size_t index, length;
1958
1959 if (!passwd) {
1960 return 0;
1961 }
1962
1963 // Check even length. Hex encoded passwords are always
1964 // an even length, since each character encodes to two characters.
1965 length = strlen(passwd);
1966 if (length % 2) {
1967 SLOGW("Password not correctly hex encoded.");
1968 return 0;
1969 }
1970
1971 // Check password is old-style pattern - a collection of hex
1972 // encoded bytes less than 9 (00 through 08)
1973 for (index = 0; index < length; index +=2) {
1974 if (passwd[index] != '0'
1975 || passwd[index + 1] < '0' || passwd[index + 1] > '8') {
1976 return 0;
1977 }
1978 }
1979
1980 // Allocate room for adjusted passwd and null terminate
1981 char* adjusted = malloc(length + 1);
1982 adjusted[length] = 0;
1983
1984 // Add 0x31 ('1') to each character
1985 for (index = 0; index < length; index += 2) {
1986 // output is 31 through 39 so set first byte to three, second to src + 1
1987 adjusted[index] = '3';
1988 adjusted[index + 1] = passwd[index + 1] + 1;
1989 }
1990
1991 return adjusted;
1992}
1993
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001994int cryptfs_check_passwd(char *passwd)
1995{
Paul Lawrencef4faa572014-01-29 13:31:03 -08001996 struct crypt_mnt_ftr crypt_ftr;
1997 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001998
Paul Lawrencef4faa572014-01-29 13:31:03 -08001999 rc = check_unmounted_and_get_ftr(&crypt_ftr);
2000 if (rc)
2001 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002002
Paul Lawrencefc615042014-10-04 15:32:29 -07002003 char* adjusted_passwd = adjust_passwd(passwd);
2004 if (adjusted_passwd) {
2005 int failed_decrypt_count = crypt_ftr.failed_decrypt_count;
2006 rc = test_mount_encrypted_fs(&crypt_ftr, adjusted_passwd,
2007 DATA_MNT_POINT, "userdata");
2008
2009 // Maybe the original one still works?
2010 if (rc) {
2011 // Don't double count this failure
2012 crypt_ftr.failed_decrypt_count = failed_decrypt_count;
2013 rc = test_mount_encrypted_fs(&crypt_ftr, passwd,
2014 DATA_MNT_POINT, "userdata");
2015 if (!rc) {
2016 // cryptfs_changepw also adjusts so pass original
2017 // Note that adjust_passwd only recognises patterns
2018 // so we can safely use CRYPT_TYPE_PATTERN
2019 SLOGI("Updating pattern to new format");
2020 cryptfs_changepw(CRYPT_TYPE_PATTERN, passwd);
2021 }
2022 }
2023 free(adjusted_passwd);
2024 } else {
2025 rc = test_mount_encrypted_fs(&crypt_ftr, passwd,
2026 DATA_MNT_POINT, "userdata");
2027 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002028
2029 if (rc == 0 && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002030 cryptfs_clear_password();
2031 password = strdup(passwd);
2032 struct timespec now;
2033 clock_gettime(CLOCK_BOOTTIME, &now);
2034 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002035 }
2036
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002037 return rc;
2038}
2039
Ken Sumrall3ad90722011-10-04 20:38:29 -07002040int cryptfs_verify_passwd(char *passwd)
2041{
2042 struct crypt_mnt_ftr crypt_ftr;
2043 /* Allocate enough space for a 256 bit key, but we may use less */
Ken Sumrall160b4d62013-04-22 12:15:39 -07002044 unsigned char decrypted_master_key[32];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002045 char encrypted_state[PROPERTY_VALUE_MAX];
2046 int rc;
2047
2048 property_get("ro.crypto.state", encrypted_state, "");
2049 if (strcmp(encrypted_state, "encrypted") ) {
2050 SLOGE("device not encrypted, aborting");
2051 return -2;
2052 }
2053
2054 if (!master_key_saved) {
2055 SLOGE("encrypted fs not yet mounted, aborting");
2056 return -1;
2057 }
2058
2059 if (!saved_mount_point) {
2060 SLOGE("encrypted fs failed to save mount point, aborting");
2061 return -1;
2062 }
2063
Ken Sumrall160b4d62013-04-22 12:15:39 -07002064 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002065 SLOGE("Error getting crypt footer and key\n");
2066 return -1;
2067 }
2068
2069 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2070 /* If the device has no password, then just say the password is valid */
2071 rc = 0;
2072 } else {
Paul Lawrencefc615042014-10-04 15:32:29 -07002073 char* adjusted_passwd = adjust_passwd(passwd);
2074 if (adjusted_passwd) {
2075 passwd = adjusted_passwd;
2076 }
2077
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002078 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002079 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2080 /* They match, the password is correct */
2081 rc = 0;
2082 } else {
2083 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2084 sleep(1);
2085 rc = 1;
2086 }
Paul Lawrencefc615042014-10-04 15:32:29 -07002087
2088 free(adjusted_passwd);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002089 }
2090
2091 return rc;
2092}
2093
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002094/* Initialize a crypt_mnt_ftr structure. The keysize is
2095 * defaulted to 16 bytes, and the filesystem size to 0.
2096 * Presumably, at a minimum, the caller will update the
2097 * filesystem size and crypto_type_name after calling this function.
2098 */
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002099static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr *ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002100{
Ken Sumrall160b4d62013-04-22 12:15:39 -07002101 off64_t off;
2102
2103 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002104 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002105 ftr->major_version = CURRENT_MAJOR_VERSION;
2106 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002107 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Jason parks70a4b3f2011-01-28 10:10:47 -06002108 ftr->keysize = KEY_LEN_BYTES;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002109
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002110 switch (keymaster_check_compatibility()) {
2111 case 1:
2112 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
2113 break;
2114
2115 case 0:
2116 ftr->kdf_type = KDF_SCRYPT;
2117 break;
2118
2119 default:
2120 SLOGE("keymaster_check_compatibility failed");
2121 return -1;
2122 }
2123
Kenny Rootc4c70f12013-06-14 12:11:38 -07002124 get_device_scrypt_params(ftr);
2125
Ken Sumrall160b4d62013-04-22 12:15:39 -07002126 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2127 if (get_crypt_ftr_info(NULL, &off) == 0) {
2128 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
2129 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET +
2130 ftr->persist_data_size;
2131 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002132
2133 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002134}
2135
Ken Sumrall29d8da82011-05-18 17:20:07 -07002136static int cryptfs_enable_wipe(char *crypto_blkdev, off64_t size, int type)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002137{
Ken Sumralle550f782013-08-20 13:48:23 -07002138 const char *args[10];
2139 char size_str[32]; /* Must be large enough to hold a %lld and null byte */
2140 int num_args;
2141 int status;
2142 int tmp;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002143 int rc = -1;
2144
Ken Sumrall29d8da82011-05-18 17:20:07 -07002145 if (type == EXT4_FS) {
Ken Sumralle550f782013-08-20 13:48:23 -07002146 args[0] = "/system/bin/make_ext4fs";
2147 args[1] = "-a";
2148 args[2] = "/data";
2149 args[3] = "-l";
Elliott Hughes73737162014-06-25 17:27:42 -07002150 snprintf(size_str, sizeof(size_str), "%" PRId64, size * 512);
Ken Sumralle550f782013-08-20 13:48:23 -07002151 args[4] = size_str;
2152 args[5] = crypto_blkdev;
2153 num_args = 6;
2154 SLOGI("Making empty filesystem with command %s %s %s %s %s %s\n",
2155 args[0], args[1], args[2], args[3], args[4], args[5]);
JP Abgrall62c7af32014-06-16 13:01:23 -07002156 } else if (type == F2FS_FS) {
2157 args[0] = "/system/bin/mkfs.f2fs";
2158 args[1] = "-t";
2159 args[2] = "-d1";
2160 args[3] = crypto_blkdev;
Elliott Hughes73737162014-06-25 17:27:42 -07002161 snprintf(size_str, sizeof(size_str), "%" PRId64, size);
JP Abgrall62c7af32014-06-16 13:01:23 -07002162 args[4] = size_str;
2163 num_args = 5;
2164 SLOGI("Making empty filesystem with command %s %s %s %s %s\n",
2165 args[0], args[1], args[2], args[3], args[4]);
Ken Sumrall29d8da82011-05-18 17:20:07 -07002166 } else {
2167 SLOGE("cryptfs_enable_wipe(): unknown filesystem type %d\n", type);
2168 return -1;
2169 }
2170
Ken Sumralle550f782013-08-20 13:48:23 -07002171 tmp = android_fork_execvp(num_args, (char **)args, &status, false, true);
2172
2173 if (tmp != 0) {
2174 SLOGE("Error creating empty filesystem on %s due to logwrap error\n", crypto_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002175 } else {
Ken Sumralle550f782013-08-20 13:48:23 -07002176 if (WIFEXITED(status)) {
2177 if (WEXITSTATUS(status)) {
2178 SLOGE("Error creating filesystem on %s, exit status %d ",
2179 crypto_blkdev, WEXITSTATUS(status));
2180 } else {
2181 SLOGD("Successfully created filesystem on %s\n", crypto_blkdev);
2182 rc = 0;
2183 }
2184 } else {
2185 SLOGE("Error creating filesystem on %s, did not exit normally\n", crypto_blkdev);
2186 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002187 }
2188
2189 return rc;
2190}
2191
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002192#define CRYPT_INPLACE_BUFSIZE 4096
Paul Lawrence87999172014-02-20 12:21:31 -08002193#define CRYPT_SECTORS_PER_BUFSIZE (CRYPT_INPLACE_BUFSIZE / CRYPT_SECTOR_SIZE)
2194#define CRYPT_SECTOR_SIZE 512
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002195
2196/* aligned 32K writes tends to make flash happy.
2197 * SD card association recommends it.
2198 */
2199#define BLOCKS_AT_A_TIME 8
2200
2201struct encryptGroupsData
2202{
2203 int realfd;
2204 int cryptofd;
2205 off64_t numblocks;
2206 off64_t one_pct, cur_pct, new_pct;
2207 off64_t blocks_already_done, tot_numblocks;
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002208 off64_t used_blocks_already_done, tot_used_blocks;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002209 char* real_blkdev, * crypto_blkdev;
2210 int count;
2211 off64_t offset;
2212 char* buffer;
Paul Lawrence87999172014-02-20 12:21:31 -08002213 off64_t last_written_sector;
2214 int completed;
Paul Lawrencea96d9c92014-06-04 14:05:01 -07002215 time_t time_started;
2216 int remaining_time;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002217};
2218
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002219static void update_progress(struct encryptGroupsData* data, int is_used)
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002220{
2221 data->blocks_already_done++;
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002222
2223 if (is_used) {
2224 data->used_blocks_already_done++;
2225 }
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002226 if (data->tot_used_blocks) {
2227 data->new_pct = data->used_blocks_already_done / data->one_pct;
2228 } else {
2229 data->new_pct = data->blocks_already_done / data->one_pct;
2230 }
2231
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002232 if (data->new_pct > data->cur_pct) {
2233 char buf[8];
2234 data->cur_pct = data->new_pct;
Elliott Hughescb33f572014-06-25 18:25:11 -07002235 snprintf(buf, sizeof(buf), "%" PRId64, data->cur_pct);
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002236 property_set("vold.encrypt_progress", buf);
2237 }
Paul Lawrencea96d9c92014-06-04 14:05:01 -07002238
2239 if (data->cur_pct >= 5) {
Paul Lawrence9c58a872014-09-30 09:12:51 -07002240 struct timespec time_now;
2241 if (clock_gettime(CLOCK_MONOTONIC, &time_now)) {
2242 SLOGW("Error getting time");
2243 } else {
2244 double elapsed_time = difftime(time_now.tv_sec, data->time_started);
2245 off64_t remaining_blocks = data->tot_used_blocks
2246 - data->used_blocks_already_done;
2247 int remaining_time = (int)(elapsed_time * remaining_blocks
2248 / data->used_blocks_already_done);
Paul Lawrence71577502014-08-13 14:55:55 -07002249
Paul Lawrence9c58a872014-09-30 09:12:51 -07002250 // Change time only if not yet set, lower, or a lot higher for
2251 // best user experience
2252 if (data->remaining_time == -1
2253 || remaining_time < data->remaining_time
2254 || remaining_time > data->remaining_time + 60) {
2255 char buf[8];
2256 snprintf(buf, sizeof(buf), "%d", remaining_time);
2257 property_set("vold.encrypt_time_remaining", buf);
2258 data->remaining_time = remaining_time;
2259 }
Paul Lawrencea96d9c92014-06-04 14:05:01 -07002260 }
2261 }
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002262}
2263
Paul Lawrence3846be12014-09-22 11:33:54 -07002264static void log_progress(struct encryptGroupsData const* data, bool completed)
2265{
2266 // Precondition - if completed data = 0 else data != 0
2267
2268 // Track progress so we can skip logging blocks
2269 static off64_t offset = -1;
2270
2271 // Need to close existing 'Encrypting from' log?
2272 if (completed || (offset != -1 && data->offset != offset)) {
2273 SLOGI("Encrypted to sector %" PRId64,
2274 offset / info.block_size * CRYPT_SECTOR_SIZE);
2275 offset = -1;
2276 }
2277
2278 // Need to start new 'Encrypting from' log?
2279 if (!completed && offset != data->offset) {
2280 SLOGI("Encrypting from sector %" PRId64,
2281 data->offset / info.block_size * CRYPT_SECTOR_SIZE);
2282 }
2283
2284 // Update offset
2285 if (!completed) {
2286 offset = data->offset + (off64_t)data->count * info.block_size;
2287 }
2288}
2289
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002290static int flush_outstanding_data(struct encryptGroupsData* data)
2291{
2292 if (data->count == 0) {
2293 return 0;
2294 }
2295
Elliott Hughes231bdba2014-06-25 18:36:19 -07002296 SLOGV("Copying %d blocks at offset %" PRIx64, data->count, data->offset);
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002297
2298 if (pread64(data->realfd, data->buffer,
2299 info.block_size * data->count, data->offset)
2300 <= 0) {
2301 SLOGE("Error reading real_blkdev %s for inplace encrypt",
2302 data->real_blkdev);
2303 return -1;
2304 }
2305
2306 if (pwrite64(data->cryptofd, data->buffer,
2307 info.block_size * data->count, data->offset)
2308 <= 0) {
2309 SLOGE("Error writing crypto_blkdev %s for inplace encrypt",
2310 data->crypto_blkdev);
2311 return -1;
Paul Lawrence87999172014-02-20 12:21:31 -08002312 } else {
Paul Lawrence3846be12014-09-22 11:33:54 -07002313 log_progress(data, false);
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002314 }
2315
2316 data->count = 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002317 data->last_written_sector = (data->offset + data->count)
2318 / info.block_size * CRYPT_SECTOR_SIZE - 1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002319 return 0;
2320}
2321
2322static int encrypt_groups(struct encryptGroupsData* data)
2323{
2324 unsigned int i;
2325 u8 *block_bitmap = 0;
2326 unsigned int block;
2327 off64_t ret;
2328 int rc = -1;
2329
2330 data->buffer = malloc(info.block_size * BLOCKS_AT_A_TIME);
2331 if (!data->buffer) {
2332 SLOGE("Failed to allocate crypto buffer");
2333 goto errout;
2334 }
2335
2336 block_bitmap = malloc(info.block_size);
2337 if (!block_bitmap) {
2338 SLOGE("failed to allocate block bitmap");
2339 goto errout;
2340 }
2341
2342 for (i = 0; i < aux_info.groups; ++i) {
2343 SLOGI("Encrypting group %d", i);
2344
2345 u32 first_block = aux_info.first_data_block + i * info.blocks_per_group;
2346 u32 block_count = min(info.blocks_per_group,
2347 aux_info.len_blocks - first_block);
2348
2349 off64_t offset = (u64)info.block_size
2350 * aux_info.bg_desc[i].bg_block_bitmap;
2351
2352 ret = pread64(data->realfd, block_bitmap, info.block_size, offset);
2353 if (ret != (int)info.block_size) {
2354 SLOGE("failed to read all of block group bitmap %d", i);
2355 goto errout;
2356 }
2357
2358 offset = (u64)info.block_size * first_block;
2359
2360 data->count = 0;
2361
2362 for (block = 0; block < block_count; block++) {
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002363 int used = bitmap_get_bit(block_bitmap, block);
2364 update_progress(data, used);
2365 if (used) {
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002366 if (data->count == 0) {
2367 data->offset = offset;
2368 }
2369 data->count++;
2370 } else {
2371 if (flush_outstanding_data(data)) {
2372 goto errout;
2373 }
2374 }
2375
2376 offset += info.block_size;
2377
2378 /* Write data if we are aligned or buffer size reached */
2379 if (offset % (info.block_size * BLOCKS_AT_A_TIME) == 0
2380 || data->count == BLOCKS_AT_A_TIME) {
2381 if (flush_outstanding_data(data)) {
2382 goto errout;
2383 }
2384 }
Paul Lawrence87999172014-02-20 12:21:31 -08002385
Paul Lawrence73d7a022014-06-09 14:10:09 -07002386 if (!is_battery_ok_to_continue()) {
Paul Lawrence87999172014-02-20 12:21:31 -08002387 SLOGE("Stopping encryption due to low battery");
2388 rc = 0;
2389 goto errout;
2390 }
2391
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002392 }
2393 if (flush_outstanding_data(data)) {
2394 goto errout;
2395 }
2396 }
2397
Paul Lawrence87999172014-02-20 12:21:31 -08002398 data->completed = 1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002399 rc = 0;
2400
2401errout:
Paul Lawrence3846be12014-09-22 11:33:54 -07002402 log_progress(0, true);
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002403 free(data->buffer);
2404 free(block_bitmap);
2405 return rc;
2406}
2407
2408static int cryptfs_enable_inplace_ext4(char *crypto_blkdev,
2409 char *real_blkdev,
2410 off64_t size,
2411 off64_t *size_already_done,
Paul Lawrence87999172014-02-20 12:21:31 -08002412 off64_t tot_size,
2413 off64_t previously_encrypted_upto)
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002414{
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002415 u32 i;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002416 struct encryptGroupsData data;
Paul Lawrence74f29f12014-08-28 15:54:10 -07002417 int rc; // Can't initialize without causing warning -Wclobbered
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002418
Paul Lawrence87999172014-02-20 12:21:31 -08002419 if (previously_encrypted_upto > *size_already_done) {
2420 SLOGD("Not fast encrypting since resuming part way through");
2421 return -1;
2422 }
2423
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002424 memset(&data, 0, sizeof(data));
2425 data.real_blkdev = real_blkdev;
2426 data.crypto_blkdev = crypto_blkdev;
2427
2428 if ( (data.realfd = open(real_blkdev, O_RDWR)) < 0) {
JP Abgrall77768712014-10-10 15:52:11 -07002429 SLOGE("Error opening real_blkdev %s for inplace encrypt. err=%d(%s)\n",
2430 real_blkdev, errno, strerror(errno));
Paul Lawrence74f29f12014-08-28 15:54:10 -07002431 rc = -1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002432 goto errout;
2433 }
2434
2435 if ( (data.cryptofd = open(crypto_blkdev, O_WRONLY)) < 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002436 SLOGE("Error opening crypto_blkdev %s for ext4 inplace encrypt. err=%d(%s)\n",
JP Abgrall77768712014-10-10 15:52:11 -07002437 crypto_blkdev, errno, strerror(errno));
JP Abgrall512f0d52014-10-10 18:43:41 -07002438 rc = ENABLE_INPLACE_ERR_DEV;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002439 goto errout;
2440 }
2441
2442 if (setjmp(setjmp_env)) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002443 SLOGE("Reading ext4 extent caused an exception\n");
Paul Lawrence74f29f12014-08-28 15:54:10 -07002444 rc = -1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002445 goto errout;
2446 }
2447
2448 if (read_ext(data.realfd, 0) != 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002449 SLOGE("Failed to read ext4 extent\n");
Paul Lawrence74f29f12014-08-28 15:54:10 -07002450 rc = -1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002451 goto errout;
2452 }
2453
2454 data.numblocks = size / CRYPT_SECTORS_PER_BUFSIZE;
2455 data.tot_numblocks = tot_size / CRYPT_SECTORS_PER_BUFSIZE;
2456 data.blocks_already_done = *size_already_done / CRYPT_SECTORS_PER_BUFSIZE;
2457
JP Abgrall512f0d52014-10-10 18:43:41 -07002458 SLOGI("Encrypting ext4 filesystem in place...");
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002459
Paul Lawrence58c58cf2014-06-04 13:12:21 -07002460 data.tot_used_blocks = data.numblocks;
2461 for (i = 0; i < aux_info.groups; ++i) {
2462 data.tot_used_blocks -= aux_info.bg_desc[i].bg_free_blocks_count;
2463 }
2464
2465 data.one_pct = data.tot_used_blocks / 100;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002466 data.cur_pct = 0;
Paul Lawrence9c58a872014-09-30 09:12:51 -07002467
2468 struct timespec time_started = {0};
2469 if (clock_gettime(CLOCK_MONOTONIC, &time_started)) {
2470 SLOGW("Error getting time at start");
2471 // Note - continue anyway - we'll run with 0
2472 }
2473 data.time_started = time_started.tv_sec;
Paul Lawrencea96d9c92014-06-04 14:05:01 -07002474 data.remaining_time = -1;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002475
2476 rc = encrypt_groups(&data);
2477 if (rc) {
2478 SLOGE("Error encrypting groups");
2479 goto errout;
2480 }
2481
Paul Lawrence87999172014-02-20 12:21:31 -08002482 *size_already_done += data.completed ? size : data.last_written_sector;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002483 rc = 0;
2484
2485errout:
2486 close(data.realfd);
2487 close(data.cryptofd);
2488
2489 return rc;
2490}
2491
Paul Lawrence3846be12014-09-22 11:33:54 -07002492static void log_progress_f2fs(u64 block, bool completed)
2493{
2494 // Precondition - if completed data = 0 else data != 0
2495
2496 // Track progress so we can skip logging blocks
2497 static u64 last_block = (u64)-1;
2498
2499 // Need to close existing 'Encrypting from' log?
2500 if (completed || (last_block != (u64)-1 && block != last_block + 1)) {
2501 SLOGI("Encrypted to block %" PRId64, last_block);
2502 last_block = -1;
2503 }
2504
2505 // Need to start new 'Encrypting from' log?
2506 if (!completed && (last_block == (u64)-1 || block != last_block + 1)) {
2507 SLOGI("Encrypting from block %" PRId64, block);
2508 }
2509
2510 // Update offset
2511 if (!completed) {
2512 last_block = block;
2513 }
2514}
2515
Daniel Rosenberge82df162014-08-15 22:19:23 +00002516static int encrypt_one_block_f2fs(u64 pos, void *data)
2517{
2518 struct encryptGroupsData *priv_dat = (struct encryptGroupsData *)data;
2519
2520 priv_dat->blocks_already_done = pos - 1;
2521 update_progress(priv_dat, 1);
2522
2523 off64_t offset = pos * CRYPT_INPLACE_BUFSIZE;
2524
2525 if (pread64(priv_dat->realfd, priv_dat->buffer, CRYPT_INPLACE_BUFSIZE, offset) <= 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002526 SLOGE("Error reading real_blkdev %s for f2fs inplace encrypt", priv_dat->crypto_blkdev);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002527 return -1;
2528 }
2529
2530 if (pwrite64(priv_dat->cryptofd, priv_dat->buffer, CRYPT_INPLACE_BUFSIZE, offset) <= 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002531 SLOGE("Error writing crypto_blkdev %s for f2fs inplace encrypt", priv_dat->crypto_blkdev);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002532 return -1;
2533 } else {
Paul Lawrence3846be12014-09-22 11:33:54 -07002534 log_progress_f2fs(pos, false);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002535 }
2536
2537 return 0;
2538}
2539
2540static int cryptfs_enable_inplace_f2fs(char *crypto_blkdev,
2541 char *real_blkdev,
2542 off64_t size,
2543 off64_t *size_already_done,
2544 off64_t tot_size,
2545 off64_t previously_encrypted_upto)
2546{
2547 u32 i;
2548 struct encryptGroupsData data;
2549 struct f2fs_info *f2fs_info = NULL;
JP Abgrall512f0d52014-10-10 18:43:41 -07002550 int rc = ENABLE_INPLACE_ERR_OTHER;
Daniel Rosenberge82df162014-08-15 22:19:23 +00002551 if (previously_encrypted_upto > *size_already_done) {
2552 SLOGD("Not fast encrypting since resuming part way through");
JP Abgrall512f0d52014-10-10 18:43:41 -07002553 return ENABLE_INPLACE_ERR_OTHER;
Daniel Rosenberge82df162014-08-15 22:19:23 +00002554 }
2555 memset(&data, 0, sizeof(data));
2556 data.real_blkdev = real_blkdev;
2557 data.crypto_blkdev = crypto_blkdev;
2558 data.realfd = -1;
2559 data.cryptofd = -1;
2560 if ( (data.realfd = open64(real_blkdev, O_RDWR)) < 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002561 SLOGE("Error opening real_blkdev %s for f2fs inplace encrypt\n",
Daniel Rosenberge82df162014-08-15 22:19:23 +00002562 real_blkdev);
2563 goto errout;
2564 }
2565 if ( (data.cryptofd = open64(crypto_blkdev, O_WRONLY)) < 0) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002566 SLOGE("Error opening crypto_blkdev %s for f2fs inplace encrypt. err=%d(%s)\n",
JP Abgrall77768712014-10-10 15:52:11 -07002567 crypto_blkdev, errno, strerror(errno));
JP Abgrall512f0d52014-10-10 18:43:41 -07002568 rc = ENABLE_INPLACE_ERR_DEV;
Daniel Rosenberge82df162014-08-15 22:19:23 +00002569 goto errout;
2570 }
2571
2572 f2fs_info = generate_f2fs_info(data.realfd);
2573 if (!f2fs_info)
2574 goto errout;
2575
2576 data.numblocks = size / CRYPT_SECTORS_PER_BUFSIZE;
2577 data.tot_numblocks = tot_size / CRYPT_SECTORS_PER_BUFSIZE;
2578 data.blocks_already_done = *size_already_done / CRYPT_SECTORS_PER_BUFSIZE;
2579
2580 data.tot_used_blocks = get_num_blocks_used(f2fs_info);
2581
2582 data.one_pct = data.tot_used_blocks / 100;
2583 data.cur_pct = 0;
2584 data.time_started = time(NULL);
2585 data.remaining_time = -1;
2586
2587 data.buffer = malloc(f2fs_info->block_size);
2588 if (!data.buffer) {
2589 SLOGE("Failed to allocate crypto buffer");
2590 goto errout;
2591 }
2592
2593 data.count = 0;
2594
2595 /* Currently, this either runs to completion, or hits a nonrecoverable error */
2596 rc = run_on_used_blocks(data.blocks_already_done, f2fs_info, &encrypt_one_block_f2fs, &data);
2597
2598 if (rc) {
JP Abgrall512f0d52014-10-10 18:43:41 -07002599 SLOGE("Error in running over f2fs blocks");
2600 rc = ENABLE_INPLACE_ERR_OTHER;
Daniel Rosenberge82df162014-08-15 22:19:23 +00002601 goto errout;
2602 }
2603
2604 *size_already_done += size;
2605 rc = 0;
2606
2607errout:
2608 if (rc)
2609 SLOGE("Failed to encrypt f2fs filesystem on %s", real_blkdev);
2610
Paul Lawrence3846be12014-09-22 11:33:54 -07002611 log_progress_f2fs(0, true);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002612 free(f2fs_info);
2613 free(data.buffer);
2614 close(data.realfd);
2615 close(data.cryptofd);
2616
2617 return rc;
2618}
2619
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002620static int cryptfs_enable_inplace_full(char *crypto_blkdev, char *real_blkdev,
2621 off64_t size, off64_t *size_already_done,
Paul Lawrence87999172014-02-20 12:21:31 -08002622 off64_t tot_size,
2623 off64_t previously_encrypted_upto)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002624{
2625 int realfd, cryptofd;
2626 char *buf[CRYPT_INPLACE_BUFSIZE];
JP Abgrall512f0d52014-10-10 18:43:41 -07002627 int rc = ENABLE_INPLACE_ERR_OTHER;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002628 off64_t numblocks, i, remainder;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002629 off64_t one_pct, cur_pct, new_pct;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002630 off64_t blocks_already_done, tot_numblocks;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002631
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002632 if ( (realfd = open(real_blkdev, O_RDONLY)) < 0) {
2633 SLOGE("Error opening real_blkdev %s for inplace encrypt\n", real_blkdev);
JP Abgrall512f0d52014-10-10 18:43:41 -07002634 return ENABLE_INPLACE_ERR_OTHER;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002635 }
2636
2637 if ( (cryptofd = open(crypto_blkdev, O_WRONLY)) < 0) {
JP Abgrall77768712014-10-10 15:52:11 -07002638 SLOGE("Error opening crypto_blkdev %s for inplace encrypt. err=%d(%s)\n",
2639 crypto_blkdev, errno, strerror(errno));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002640 close(realfd);
JP Abgrall512f0d52014-10-10 18:43:41 -07002641 return ENABLE_INPLACE_ERR_DEV;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002642 }
2643
2644 /* This is pretty much a simple loop of reading 4K, and writing 4K.
2645 * The size passed in is the number of 512 byte sectors in the filesystem.
2646 * So compute the number of whole 4K blocks we should read/write,
2647 * and the remainder.
2648 */
2649 numblocks = size / CRYPT_SECTORS_PER_BUFSIZE;
2650 remainder = size % CRYPT_SECTORS_PER_BUFSIZE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002651 tot_numblocks = tot_size / CRYPT_SECTORS_PER_BUFSIZE;
2652 blocks_already_done = *size_already_done / CRYPT_SECTORS_PER_BUFSIZE;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002653
2654 SLOGE("Encrypting filesystem in place...");
2655
Paul Lawrence87999172014-02-20 12:21:31 -08002656 i = previously_encrypted_upto + 1 - *size_already_done;
2657
2658 if (lseek64(realfd, i * CRYPT_SECTOR_SIZE, SEEK_SET) < 0) {
2659 SLOGE("Cannot seek to previously encrypted point on %s", real_blkdev);
2660 goto errout;
2661 }
2662
2663 if (lseek64(cryptofd, i * CRYPT_SECTOR_SIZE, SEEK_SET) < 0) {
2664 SLOGE("Cannot seek to previously encrypted point on %s", crypto_blkdev);
2665 goto errout;
2666 }
2667
2668 for (;i < size && i % CRYPT_SECTORS_PER_BUFSIZE != 0; ++i) {
2669 if (unix_read(realfd, buf, CRYPT_SECTOR_SIZE) <= 0) {
2670 SLOGE("Error reading initial sectors from real_blkdev %s for "
2671 "inplace encrypt\n", crypto_blkdev);
2672 goto errout;
2673 }
2674 if (unix_write(cryptofd, buf, CRYPT_SECTOR_SIZE) <= 0) {
2675 SLOGE("Error writing initial sectors to crypto_blkdev %s for "
2676 "inplace encrypt\n", crypto_blkdev);
2677 goto errout;
2678 } else {
Elliott Hughescb33f572014-06-25 18:25:11 -07002679 SLOGI("Encrypted 1 block at %" PRId64, i);
Paul Lawrence87999172014-02-20 12:21:31 -08002680 }
2681 }
2682
Ken Sumrall29d8da82011-05-18 17:20:07 -07002683 one_pct = tot_numblocks / 100;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002684 cur_pct = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002685 /* process the majority of the filesystem in blocks */
Paul Lawrence87999172014-02-20 12:21:31 -08002686 for (i/=CRYPT_SECTORS_PER_BUFSIZE; i<numblocks; i++) {
Ken Sumrall29d8da82011-05-18 17:20:07 -07002687 new_pct = (i + blocks_already_done) / one_pct;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002688 if (new_pct > cur_pct) {
2689 char buf[8];
2690
2691 cur_pct = new_pct;
Elliott Hughes73737162014-06-25 17:27:42 -07002692 snprintf(buf, sizeof(buf), "%" PRId64, cur_pct);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002693 property_set("vold.encrypt_progress", buf);
2694 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002695 if (unix_read(realfd, buf, CRYPT_INPLACE_BUFSIZE) <= 0) {
Paul Lawrence87999172014-02-20 12:21:31 -08002696 SLOGE("Error reading real_blkdev %s for inplace encrypt", crypto_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002697 goto errout;
2698 }
2699 if (unix_write(cryptofd, buf, CRYPT_INPLACE_BUFSIZE) <= 0) {
Paul Lawrence87999172014-02-20 12:21:31 -08002700 SLOGE("Error writing crypto_blkdev %s for inplace encrypt", crypto_blkdev);
2701 goto errout;
2702 } else {
Elliott Hughescb33f572014-06-25 18:25:11 -07002703 SLOGD("Encrypted %d block at %" PRId64,
Paul Lawrence87999172014-02-20 12:21:31 -08002704 CRYPT_SECTORS_PER_BUFSIZE,
2705 i * CRYPT_SECTORS_PER_BUFSIZE);
2706 }
2707
Paul Lawrence73d7a022014-06-09 14:10:09 -07002708 if (!is_battery_ok_to_continue()) {
Paul Lawrence87999172014-02-20 12:21:31 -08002709 SLOGE("Stopping encryption due to low battery");
2710 *size_already_done += (i + 1) * CRYPT_SECTORS_PER_BUFSIZE - 1;
2711 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002712 goto errout;
2713 }
2714 }
2715
2716 /* Do any remaining sectors */
2717 for (i=0; i<remainder; i++) {
Paul Lawrence87999172014-02-20 12:21:31 -08002718 if (unix_read(realfd, buf, CRYPT_SECTOR_SIZE) <= 0) {
2719 SLOGE("Error reading final sectors from real_blkdev %s for inplace encrypt", crypto_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002720 goto errout;
2721 }
Paul Lawrence87999172014-02-20 12:21:31 -08002722 if (unix_write(cryptofd, buf, CRYPT_SECTOR_SIZE) <= 0) {
2723 SLOGE("Error writing final sectors to crypto_blkdev %s for inplace encrypt", crypto_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002724 goto errout;
Paul Lawrence87999172014-02-20 12:21:31 -08002725 } else {
2726 SLOGI("Encrypted 1 block at next location");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002727 }
2728 }
2729
Ken Sumrall29d8da82011-05-18 17:20:07 -07002730 *size_already_done += size;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002731 rc = 0;
2732
2733errout:
2734 close(realfd);
2735 close(cryptofd);
2736
2737 return rc;
2738}
2739
JP Abgrall512f0d52014-10-10 18:43:41 -07002740/* returns on of the ENABLE_INPLACE_* return codes */
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002741static int cryptfs_enable_inplace(char *crypto_blkdev, char *real_blkdev,
2742 off64_t size, off64_t *size_already_done,
Paul Lawrence87999172014-02-20 12:21:31 -08002743 off64_t tot_size,
2744 off64_t previously_encrypted_upto)
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002745{
JP Abgrall512f0d52014-10-10 18:43:41 -07002746 int rc_ext4, rc_f2fs, rc_full;
Paul Lawrence87999172014-02-20 12:21:31 -08002747 if (previously_encrypted_upto) {
Elliott Hughescb33f572014-06-25 18:25:11 -07002748 SLOGD("Continuing encryption from %" PRId64, previously_encrypted_upto);
Paul Lawrence87999172014-02-20 12:21:31 -08002749 }
2750
2751 if (*size_already_done + size < previously_encrypted_upto) {
2752 *size_already_done += size;
2753 return 0;
2754 }
2755
Daniel Rosenberge82df162014-08-15 22:19:23 +00002756 /* TODO: identify filesystem type.
2757 * As is, cryptfs_enable_inplace_ext4 will fail on an f2fs partition, and
2758 * then we will drop down to cryptfs_enable_inplace_f2fs.
2759 * */
JP Abgrall512f0d52014-10-10 18:43:41 -07002760 if ((rc_ext4 = cryptfs_enable_inplace_ext4(crypto_blkdev, real_blkdev,
Daniel Rosenberge82df162014-08-15 22:19:23 +00002761 size, size_already_done,
JP Abgrall512f0d52014-10-10 18:43:41 -07002762 tot_size, previously_encrypted_upto)) == 0) {
Daniel Rosenberge82df162014-08-15 22:19:23 +00002763 return 0;
2764 }
JP Abgrall512f0d52014-10-10 18:43:41 -07002765 SLOGD("cryptfs_enable_inplace_ext4()=%d\n", rc_ext4);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002766
JP Abgrall512f0d52014-10-10 18:43:41 -07002767 if ((rc_f2fs = cryptfs_enable_inplace_f2fs(crypto_blkdev, real_blkdev,
Daniel Rosenberge82df162014-08-15 22:19:23 +00002768 size, size_already_done,
JP Abgrall512f0d52014-10-10 18:43:41 -07002769 tot_size, previously_encrypted_upto)) == 0) {
Daniel Rosenberge82df162014-08-15 22:19:23 +00002770 return 0;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002771 }
JP Abgrall512f0d52014-10-10 18:43:41 -07002772 SLOGD("cryptfs_enable_inplace_f2fs()=%d\n", rc_f2fs);
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002773
JP Abgrall512f0d52014-10-10 18:43:41 -07002774 rc_full = cryptfs_enable_inplace_full(crypto_blkdev, real_blkdev,
Paul Lawrence87999172014-02-20 12:21:31 -08002775 size, size_already_done, tot_size,
2776 previously_encrypted_upto);
JP Abgrall512f0d52014-10-10 18:43:41 -07002777 SLOGD("cryptfs_enable_inplace_full()=%d\n", rc_full);
2778
2779 /* Hack for b/17898962, the following is the symptom... */
2780 if (rc_ext4 == ENABLE_INPLACE_ERR_DEV
2781 && rc_f2fs == ENABLE_INPLACE_ERR_DEV
2782 && rc_full == ENABLE_INPLACE_ERR_DEV) {
2783 return ENABLE_INPLACE_ERR_DEV;
2784 }
2785 return rc_full;
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002786}
2787
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002788#define CRYPTO_ENABLE_WIPE 1
2789#define CRYPTO_ENABLE_INPLACE 2
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002790
2791#define FRAMEWORK_BOOT_WAIT 60
2792
Ken Sumrall29d8da82011-05-18 17:20:07 -07002793static inline int should_encrypt(struct volume_info *volume)
2794{
Paul Lawrenceae59fe62014-01-21 08:23:27 -08002795 return (volume->flags & (VOL_ENCRYPTABLE | VOL_NONREMOVABLE)) ==
Ken Sumrall29d8da82011-05-18 17:20:07 -07002796 (VOL_ENCRYPTABLE | VOL_NONREMOVABLE);
2797}
2798
Paul Lawrence87999172014-02-20 12:21:31 -08002799static int cryptfs_SHA256_fileblock(const char* filename, __le8* buf)
2800{
2801 int fd = open(filename, O_RDONLY);
2802 if (fd == -1) {
2803 SLOGE("Error opening file %s", filename);
2804 return -1;
2805 }
2806
2807 char block[CRYPT_INPLACE_BUFSIZE];
2808 memset(block, 0, sizeof(block));
2809 if (unix_read(fd, block, sizeof(block)) < 0) {
2810 SLOGE("Error reading file %s", filename);
2811 close(fd);
2812 return -1;
2813 }
2814
2815 close(fd);
2816
2817 SHA256_CTX c;
2818 SHA256_Init(&c);
2819 SHA256_Update(&c, block, sizeof(block));
2820 SHA256_Final(buf, &c);
2821
2822 return 0;
2823}
2824
JP Abgrall62c7af32014-06-16 13:01:23 -07002825static int get_fs_type(struct fstab_rec *rec)
2826{
2827 if (!strcmp(rec->fs_type, "ext4")) {
2828 return EXT4_FS;
2829 } else if (!strcmp(rec->fs_type, "f2fs")) {
2830 return F2FS_FS;
2831 } else {
2832 return -1;
2833 }
2834}
2835
Paul Lawrence87999172014-02-20 12:21:31 -08002836static int cryptfs_enable_all_volumes(struct crypt_mnt_ftr *crypt_ftr, int how,
2837 char *crypto_blkdev, char *real_blkdev,
2838 int previously_encrypted_upto)
2839{
2840 off64_t cur_encryption_done=0, tot_encryption_size=0;
2841 int i, rc = -1;
2842
Paul Lawrence73d7a022014-06-09 14:10:09 -07002843 if (!is_battery_ok_to_start()) {
2844 SLOGW("Not starting encryption due to low battery");
Paul Lawrence87999172014-02-20 12:21:31 -08002845 return 0;
2846 }
2847
2848 /* The size of the userdata partition, and add in the vold volumes below */
2849 tot_encryption_size = crypt_ftr->fs_size;
2850
2851 if (how == CRYPTO_ENABLE_WIPE) {
JP Abgrall62c7af32014-06-16 13:01:23 -07002852 struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab, DATA_MNT_POINT);
2853 int fs_type = get_fs_type(rec);
2854 if (fs_type < 0) {
2855 SLOGE("cryptfs_enable: unsupported fs type %s\n", rec->fs_type);
2856 return -1;
2857 }
2858 rc = cryptfs_enable_wipe(crypto_blkdev, crypt_ftr->fs_size, fs_type);
Paul Lawrence87999172014-02-20 12:21:31 -08002859 } else if (how == CRYPTO_ENABLE_INPLACE) {
2860 rc = cryptfs_enable_inplace(crypto_blkdev, real_blkdev,
2861 crypt_ftr->fs_size, &cur_encryption_done,
2862 tot_encryption_size,
2863 previously_encrypted_upto);
2864
JP Abgrall512f0d52014-10-10 18:43:41 -07002865 if (rc == ENABLE_INPLACE_ERR_DEV) {
2866 /* Hack for b/17898962 */
2867 SLOGE("cryptfs_enable: crypto block dev failure. Must reboot...\n");
2868 cryptfs_reboot(reboot);
2869 }
2870
Paul Lawrence73d7a022014-06-09 14:10:09 -07002871 if (!rc) {
Paul Lawrence87999172014-02-20 12:21:31 -08002872 crypt_ftr->encrypted_upto = cur_encryption_done;
2873 }
2874
Paul Lawrence73d7a022014-06-09 14:10:09 -07002875 if (!rc && crypt_ftr->encrypted_upto == crypt_ftr->fs_size) {
Paul Lawrence87999172014-02-20 12:21:31 -08002876 /* The inplace routine never actually sets the progress to 100% due
2877 * to the round down nature of integer division, so set it here */
2878 property_set("vold.encrypt_progress", "100");
2879 }
2880 } else {
2881 /* Shouldn't happen */
2882 SLOGE("cryptfs_enable: internal error, unknown option\n");
2883 rc = -1;
2884 }
2885
2886 return rc;
2887}
2888
Paul Lawrence13486032014-02-03 13:28:11 -08002889int cryptfs_enable_internal(char *howarg, int crypt_type, char *passwd,
2890 int allow_reboot)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002891{
2892 int how = 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002893 char crypto_blkdev[MAXPATHLEN], real_blkdev[MAXPATHLEN];
Ken Sumralle5032c42012-04-01 23:58:44 -07002894 unsigned long nr_sec;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002895 unsigned char decrypted_master_key[KEY_LEN_BYTES];
Ken Sumrall319b1042011-06-14 14:01:55 -07002896 int rc=-1, fd, i, ret;
Paul Lawrence87999172014-02-20 12:21:31 -08002897 struct crypt_mnt_ftr crypt_ftr;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002898 struct crypt_persist_data *pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002899 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002900 char lockid[32] = { 0 };
Ken Sumrall29d8da82011-05-18 17:20:07 -07002901 char key_loc[PROPERTY_VALUE_MAX];
2902 char fuse_sdcard[PROPERTY_VALUE_MAX];
2903 char *sd_mnt_point;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002904 int num_vols;
2905 struct volume_info *vol_list = 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002906 off64_t previously_encrypted_upto = 0;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002907
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002908 if (!strcmp(howarg, "wipe")) {
2909 how = CRYPTO_ENABLE_WIPE;
2910 } else if (! strcmp(howarg, "inplace")) {
2911 how = CRYPTO_ENABLE_INPLACE;
2912 } else {
2913 /* Shouldn't happen, as CommandListener vets the args */
Ken Sumrall3ed82362011-01-28 23:31:16 -08002914 goto error_unencrypted;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002915 }
2916
Paul Lawrence87999172014-02-20 12:21:31 -08002917 /* See if an encryption was underway and interrupted */
2918 if (how == CRYPTO_ENABLE_INPLACE
2919 && get_crypt_ftr_and_key(&crypt_ftr) == 0
2920 && (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS)) {
2921 previously_encrypted_upto = crypt_ftr.encrypted_upto;
2922 crypt_ftr.encrypted_upto = 0;
Paul Lawrence6bfed202014-07-28 12:47:22 -07002923 crypt_ftr.flags &= ~CRYPT_ENCRYPTION_IN_PROGRESS;
2924
2925 /* At this point, we are in an inconsistent state. Until we successfully
2926 complete encryption, a reboot will leave us broken. So mark the
2927 encryption failed in case that happens.
2928 On successfully completing encryption, remove this flag */
2929 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2930
2931 put_crypt_ftr_and_key(&crypt_ftr);
Paul Lawrence87999172014-02-20 12:21:31 -08002932 }
2933
2934 property_get("ro.crypto.state", encrypted_state, "");
2935 if (!strcmp(encrypted_state, "encrypted") && !previously_encrypted_upto) {
2936 SLOGE("Device is already running encrypted, aborting");
2937 goto error_unencrypted;
2938 }
2939
2940 // TODO refactor fs_mgr_get_crypt_info to get both in one call
2941 fs_mgr_get_crypt_info(fstab, key_loc, 0, sizeof(key_loc));
Ken Sumrall56ad03c2013-02-13 13:00:19 -08002942 fs_mgr_get_crypt_info(fstab, 0, real_blkdev, sizeof(real_blkdev));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002943
Ken Sumrall3ed82362011-01-28 23:31:16 -08002944 /* Get the size of the real block device */
2945 fd = open(real_blkdev, O_RDONLY);
2946 if ( (nr_sec = get_blkdev_size(fd)) == 0) {
2947 SLOGE("Cannot get size of block device %s\n", real_blkdev);
2948 goto error_unencrypted;
2949 }
2950 close(fd);
2951
2952 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Ken Sumrall29d8da82011-05-18 17:20:07 -07002953 if ((how == CRYPTO_ENABLE_INPLACE) && (!strcmp(key_loc, KEY_IN_FOOTER))) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002954 unsigned int fs_size_sec, max_fs_size_sec;
Jim Millera70abc62014-08-15 02:00:45 +00002955 fs_size_sec = get_fs_size(real_blkdev);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002956 if (fs_size_sec == 0)
2957 fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev);
2958
Paul Lawrence87999172014-02-20 12:21:31 -08002959 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002960
2961 if (fs_size_sec > max_fs_size_sec) {
2962 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2963 goto error_unencrypted;
2964 }
2965 }
2966
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002967 /* Get a wakelock as this may take a while, and we don't want the
2968 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2969 * wants to keep the screen on, it can grab a full wakelock.
2970 */
Ken Sumrall29d8da82011-05-18 17:20:07 -07002971 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int) getpid());
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002972 acquire_wake_lock(PARTIAL_WAKE_LOCK, lockid);
2973
Jeff Sharkey7382f812012-08-23 14:08:59 -07002974 /* Get the sdcard mount point */
Jeff Sharkeyb77bc462012-10-01 14:36:26 -07002975 sd_mnt_point = getenv("EMULATED_STORAGE_SOURCE");
Jeff Sharkey7382f812012-08-23 14:08:59 -07002976 if (!sd_mnt_point) {
2977 sd_mnt_point = getenv("EXTERNAL_STORAGE");
2978 }
2979 if (!sd_mnt_point) {
2980 sd_mnt_point = "/mnt/sdcard";
2981 }
Ken Sumrall29d8da82011-05-18 17:20:07 -07002982
Paul Lawrence87999172014-02-20 12:21:31 -08002983 /* TODO
2984 * Currently do not have test devices with multiple encryptable volumes.
2985 * When we acquire some, re-add support.
2986 */
Ken Sumrall29d8da82011-05-18 17:20:07 -07002987 num_vols=vold_getNumDirectVolumes();
2988 vol_list = malloc(sizeof(struct volume_info) * num_vols);
2989 vold_getDirectVolumeList(vol_list);
2990
2991 for (i=0; i<num_vols; i++) {
2992 if (should_encrypt(&vol_list[i])) {
Paul Lawrence87999172014-02-20 12:21:31 -08002993 SLOGE("Cannot encrypt if there are multiple encryptable volumes"
2994 "%s\n", vol_list[i].label);
2995 goto error_unencrypted;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002996 }
2997 }
2998
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002999 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003000 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003001 */
3002 property_set("vold.decrypt", "trigger_shutdown_framework");
3003 SLOGD("Just asked init to shut down class main\n");
3004
Ken Sumrall425524d2012-06-14 20:55:28 -07003005 if (vold_unmountAllAsecs()) {
3006 /* Just report the error. If any are left mounted,
3007 * umounting /data below will fail and handle the error.
3008 */
3009 SLOGE("Error unmounting internal asecs");
3010 }
3011
Ken Sumrall29d8da82011-05-18 17:20:07 -07003012 property_get("ro.crypto.fuse_sdcard", fuse_sdcard, "");
3013 if (!strcmp(fuse_sdcard, "true")) {
3014 /* This is a device using the fuse layer to emulate the sdcard semantics
3015 * on top of the userdata partition. vold does not manage it, it is managed
3016 * by the sdcard service. The sdcard service was killed by the property trigger
3017 * above, so just unmount it now. We must do this _AFTER_ killing the framework,
3018 * unlike the case for vold managed devices above.
3019 */
Greg Hackmann6e8440f2014-10-02 17:18:20 -07003020 if (wait_and_unmount(sd_mnt_point, false)) {
Ken Sumrall29d8da82011-05-18 17:20:07 -07003021 goto error_shutting_down;
3022 }
Ken Sumrall2eaf7132011-01-14 12:45:48 -08003023 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003024
3025 /* Now unmount the /data partition. */
Greg Hackmann6e8440f2014-10-02 17:18:20 -07003026 if (wait_and_unmount(DATA_MNT_POINT, false)) {
JP Abgrall502dc742013-11-01 13:06:20 -07003027 if (allow_reboot) {
3028 goto error_shutting_down;
3029 } else {
3030 goto error_unencrypted;
3031 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003032 }
3033
3034 /* Do extra work for a better UX when doing the long inplace encryption */
3035 if (how == CRYPTO_ENABLE_INPLACE) {
3036 /* Now that /data is unmounted, we need to mount a tmpfs
3037 * /data, set a property saying we're doing inplace encryption,
3038 * and restart the framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003039 */
Ken Sumralle5032c42012-04-01 23:58:44 -07003040 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08003041 goto error_shutting_down;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003042 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003043 /* Tells the framework that inplace encryption is starting */
Ken Sumrall7df84122011-01-18 14:04:08 -08003044 property_set("vold.encrypt_progress", "0");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003045
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003046 /* restart the framework. */
3047 /* Create necessary paths on /data */
3048 if (prep_data_fs()) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08003049 goto error_shutting_down;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003050 }
3051
Ken Sumrall92736ef2012-10-17 20:57:14 -07003052 /* Ugh, shutting down the framework is not synchronous, so until it
3053 * can be fixed, this horrible hack will wait a moment for it all to
3054 * shut down before proceeding. Without it, some devices cannot
3055 * restart the graphics services.
3056 */
3057 sleep(2);
3058
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003059 /* startup service classes main and late_start */
3060 property_set("vold.decrypt", "trigger_restart_min_framework");
3061 SLOGD("Just triggered restart_min_framework\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003062
Ken Sumrall7df84122011-01-18 14:04:08 -08003063 /* OK, the framework is restarted and will soon be showing a
3064 * progress bar. Time to setup an encrypted mapping, and
3065 * either write a new filesystem, or encrypt in place updating
3066 * the progress bar as we work.
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003067 */
3068 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003069
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003070 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003071 /* Initialize a crypt_mnt_ftr for the partition */
Paul Lawrence87999172014-02-20 12:21:31 -08003072 if (previously_encrypted_upto == 0) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07003073 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
3074 goto error_shutting_down;
3075 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07003076
Paul Lawrence87999172014-02-20 12:21:31 -08003077 if (!strcmp(key_loc, KEY_IN_FOOTER)) {
3078 crypt_ftr.fs_size = nr_sec
3079 - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
3080 } else {
3081 crypt_ftr.fs_size = nr_sec;
3082 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07003083 /* At this point, we are in an inconsistent state. Until we successfully
3084 complete encryption, a reboot will leave us broken. So mark the
3085 encryption failed in case that happens.
3086 On successfully completing encryption, remove this flag */
3087 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
Paul Lawrence87999172014-02-20 12:21:31 -08003088 crypt_ftr.crypt_type = crypt_type;
3089 strcpy((char *)crypt_ftr.crypto_type_name, "aes-cbc-essiv:sha256");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003090
Paul Lawrence87999172014-02-20 12:21:31 -08003091 /* Make an encrypted master key */
3092 if (create_encrypted_random_key(passwd, crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
3093 SLOGE("Cannot create encrypted master key\n");
3094 goto error_shutting_down;
3095 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003096
Paul Lawrence87999172014-02-20 12:21:31 -08003097 /* Write the key to the end of the partition */
3098 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003099
Paul Lawrence87999172014-02-20 12:21:31 -08003100 /* If any persistent data has been remembered, save it.
3101 * If none, create a valid empty table and save that.
3102 */
3103 if (!persist_data) {
3104 pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
3105 if (pdata) {
3106 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
3107 persist_data = pdata;
3108 }
3109 }
3110 if (persist_data) {
3111 save_persistent_data();
3112 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07003113 }
3114
Paul Lawrenced0c7b172014-08-08 14:28:10 -07003115 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall29d8da82011-05-18 17:20:07 -07003116 create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev,
3117 "userdata");
3118
Paul Lawrence87999172014-02-20 12:21:31 -08003119 /* If we are continuing, check checksums match */
3120 rc = 0;
3121 if (previously_encrypted_upto) {
3122 __le8 hash_first_block[SHA256_DIGEST_LENGTH];
3123 rc = cryptfs_SHA256_fileblock(crypto_blkdev, hash_first_block);
Ken Sumrall128626f2011-06-28 18:45:14 -07003124
Paul Lawrence87999172014-02-20 12:21:31 -08003125 if (!rc && memcmp(hash_first_block, crypt_ftr.hash_first_block,
3126 sizeof(hash_first_block)) != 0) {
3127 SLOGE("Checksums do not match - trigger wipe");
3128 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07003129 }
3130 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003131
Paul Lawrence87999172014-02-20 12:21:31 -08003132 if (!rc) {
3133 rc = cryptfs_enable_all_volumes(&crypt_ftr, how,
3134 crypto_blkdev, real_blkdev,
3135 previously_encrypted_upto);
3136 }
3137
3138 /* Calculate checksum if we are not finished */
Paul Lawrence73d7a022014-06-09 14:10:09 -07003139 if (!rc && crypt_ftr.encrypted_upto != crypt_ftr.fs_size) {
Paul Lawrence87999172014-02-20 12:21:31 -08003140 rc = cryptfs_SHA256_fileblock(crypto_blkdev,
3141 crypt_ftr.hash_first_block);
Paul Lawrence73d7a022014-06-09 14:10:09 -07003142 if (rc) {
Paul Lawrence87999172014-02-20 12:21:31 -08003143 SLOGE("Error calculating checksum for continuing encryption");
3144 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07003145 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003146 }
3147
3148 /* Undo the dm-crypt mapping whether we succeed or not */
Ken Sumrall29d8da82011-05-18 17:20:07 -07003149 delete_crypto_blk_dev("userdata");
Ken Sumrall29d8da82011-05-18 17:20:07 -07003150
3151 free(vol_list);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003152
3153 if (! rc) {
3154 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07003155 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08003156
Paul Lawrence6bfed202014-07-28 12:47:22 -07003157 if (crypt_ftr.encrypted_upto != crypt_ftr.fs_size) {
Paul Lawrence87999172014-02-20 12:21:31 -08003158 SLOGD("Encrypted up to sector %lld - will continue after reboot",
3159 crypt_ftr.encrypted_upto);
Paul Lawrence6bfed202014-07-28 12:47:22 -07003160 crypt_ftr.flags |= CRYPT_ENCRYPTION_IN_PROGRESS;
Paul Lawrence87999172014-02-20 12:21:31 -08003161 }
Paul Lawrence73d7a022014-06-09 14:10:09 -07003162
Paul Lawrence6bfed202014-07-28 12:47:22 -07003163 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08003164
Paul Lawrence73d7a022014-06-09 14:10:09 -07003165 if (crypt_ftr.encrypted_upto == crypt_ftr.fs_size) {
Paul Lawrenceb6672e12014-08-15 07:37:28 -07003166 char value[PROPERTY_VALUE_MAX];
3167 property_get("ro.crypto.state", value, "");
3168 if (!strcmp(value, "")) {
3169 /* default encryption - continue first boot sequence */
3170 property_set("ro.crypto.state", "encrypted");
3171 release_wake_lock(lockid);
3172 cryptfs_check_passwd(DEFAULT_PASSWORD);
3173 cryptfs_restart_internal(1);
3174 return 0;
3175 } else {
3176 sleep(2); /* Give the UI a chance to show 100% progress */
Paul Lawrence87999172014-02-20 12:21:31 -08003177 cryptfs_reboot(reboot);
Paul Lawrenceb6672e12014-08-15 07:37:28 -07003178 }
Paul Lawrence87999172014-02-20 12:21:31 -08003179 } else {
Paul Lawrenceb6672e12014-08-15 07:37:28 -07003180 sleep(2); /* Partially encrypted, ensure writes flushed to ssd */
Paul Lawrence87999172014-02-20 12:21:31 -08003181 cryptfs_reboot(shutdown);
3182 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08003183 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08003184 char value[PROPERTY_VALUE_MAX];
3185
Ken Sumrall319369a2012-06-27 16:30:18 -07003186 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08003187 if (!strcmp(value, "1")) {
3188 /* wipe data if encryption failed */
3189 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
3190 mkdir("/cache/recovery", 0700);
Nick Kralevich4684e582012-06-26 15:07:03 -07003191 int fd = open("/cache/recovery/command", O_RDWR|O_CREAT|O_TRUNC, 0600);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08003192 if (fd >= 0) {
Jeff Sharkeydd1a8042014-09-24 11:46:51 -07003193 write(fd, "--wipe_data\n", strlen("--wipe_data\n") + 1);
3194 write(fd, "--reason=cryptfs_enable_internal\n", strlen("--reason=cryptfs_enable_internal\n") + 1);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08003195 close(fd);
3196 } else {
3197 SLOGE("could not open /cache/recovery/command\n");
3198 }
Paul Lawrence87999172014-02-20 12:21:31 -08003199 cryptfs_reboot(recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08003200 } else {
3201 /* set property to trigger dialog */
3202 property_set("vold.encrypt_progress", "error_partially_encrypted");
3203 release_wake_lock(lockid);
3204 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08003205 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003206 }
3207
Ken Sumrall3ed82362011-01-28 23:31:16 -08003208 /* hrm, the encrypt step claims success, but the reboot failed.
3209 * This should not happen.
3210 * Set the property and return. Hope the framework can deal with it.
3211 */
3212 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08003213 release_wake_lock(lockid);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003214 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08003215
3216error_unencrypted:
Ken Sumrall29d8da82011-05-18 17:20:07 -07003217 free(vol_list);
Ken Sumrall3ed82362011-01-28 23:31:16 -08003218 property_set("vold.encrypt_progress", "error_not_encrypted");
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08003219 if (lockid[0]) {
3220 release_wake_lock(lockid);
3221 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08003222 return -1;
3223
3224error_shutting_down:
3225 /* we failed, and have not encrypted anthing, so the users's data is still intact,
3226 * but the framework is stopped and not restarted to show the error, so it's up to
3227 * vold to restart the system.
3228 */
3229 SLOGE("Error enabling encryption after framework is shutdown, no data changed, restarting system");
Paul Lawrence87999172014-02-20 12:21:31 -08003230 cryptfs_reboot(reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08003231
3232 /* shouldn't get here */
3233 property_set("vold.encrypt_progress", "error_shutting_down");
Ken Sumrall29d8da82011-05-18 17:20:07 -07003234 free(vol_list);
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08003235 if (lockid[0]) {
3236 release_wake_lock(lockid);
3237 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08003238 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003239}
3240
Paul Lawrence45f10532014-04-04 18:11:56 +00003241int cryptfs_enable(char *howarg, int type, char *passwd, int allow_reboot)
Paul Lawrence13486032014-02-03 13:28:11 -08003242{
Paul Lawrencefc615042014-10-04 15:32:29 -07003243 char* adjusted_passwd = adjust_passwd(passwd);
3244 if (adjusted_passwd) {
3245 passwd = adjusted_passwd;
3246 }
3247
3248 int rc = cryptfs_enable_internal(howarg, type, passwd, allow_reboot);
3249
3250 free(adjusted_passwd);
3251 return rc;
Paul Lawrence13486032014-02-03 13:28:11 -08003252}
3253
3254int cryptfs_enable_default(char *howarg, int allow_reboot)
3255{
3256 return cryptfs_enable_internal(howarg, CRYPT_TYPE_DEFAULT,
3257 DEFAULT_PASSWORD, allow_reboot);
3258}
3259
3260int cryptfs_changepw(int crypt_type, const char *newpw)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003261{
3262 struct crypt_mnt_ftr crypt_ftr;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003263 unsigned char decrypted_master_key[KEY_LEN_BYTES];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003264
3265 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08003266 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08003267 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003268 return -1;
3269 }
3270
Paul Lawrencef4faa572014-01-29 13:31:03 -08003271 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3272 SLOGE("Invalid crypt_type %d", crypt_type);
3273 return -1;
3274 }
3275
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003276 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003277 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08003278 SLOGE("Error getting crypt footer and key");
3279 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003280 }
3281
Paul Lawrencef4faa572014-01-29 13:31:03 -08003282 crypt_ftr.crypt_type = crypt_type;
3283
Paul Lawrencefc615042014-10-04 15:32:29 -07003284 char* adjusted_passwd = adjust_passwd(newpw);
3285 if (adjusted_passwd) {
3286 newpw = adjusted_passwd;
3287 }
3288
Paul Lawrencef4faa572014-01-29 13:31:03 -08003289 encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD
3290 : newpw,
3291 crypt_ftr.salt,
3292 saved_master_key,
3293 crypt_ftr.master_key,
3294 &crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003295
Jason parks70a4b3f2011-01-28 10:10:47 -06003296 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003297 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003298
Paul Lawrencefc615042014-10-04 15:32:29 -07003299 free(adjusted_passwd);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003300 return 0;
3301}
Ken Sumrall160b4d62013-04-22 12:15:39 -07003302
3303static int persist_get_key(char *fieldname, char *value)
3304{
3305 unsigned int i;
3306
3307 if (persist_data == NULL) {
3308 return -1;
3309 }
3310 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3311 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3312 /* We found it! */
3313 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
3314 return 0;
3315 }
3316 }
3317
3318 return -1;
3319}
3320
3321static int persist_set_key(char *fieldname, char *value, int encrypted)
3322{
3323 unsigned int i;
3324 unsigned int num;
3325 struct crypt_mnt_ftr crypt_ftr;
3326 unsigned int max_persistent_entries;
3327 unsigned int dsize;
3328
3329 if (persist_data == NULL) {
3330 return -1;
3331 }
3332
3333 /* If encrypted, use the values from the crypt_ftr, otherwise
3334 * use the values for the current spec.
3335 */
3336 if (encrypted) {
3337 if(get_crypt_ftr_and_key(&crypt_ftr)) {
3338 return -1;
3339 }
3340 dsize = crypt_ftr.persist_data_size;
3341 } else {
3342 dsize = CRYPT_PERSIST_DATA_SIZE;
3343 }
3344 max_persistent_entries = (dsize - sizeof(struct crypt_persist_data)) /
3345 sizeof(struct crypt_persist_entry);
3346
3347 num = persist_data->persist_valid_entries;
3348
3349 for (i = 0; i < num; i++) {
3350 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3351 /* We found an existing entry, update it! */
3352 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
3353 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
3354 return 0;
3355 }
3356 }
3357
3358 /* We didn't find it, add it to the end, if there is room */
3359 if (persist_data->persist_valid_entries < max_persistent_entries) {
3360 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
3361 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
3362 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
3363 persist_data->persist_valid_entries++;
3364 return 0;
3365 }
3366
3367 return -1;
3368}
3369
3370/* Return the value of the specified field. */
3371int cryptfs_getfield(char *fieldname, char *value, int len)
3372{
3373 char temp_value[PROPERTY_VALUE_MAX];
3374 char real_blkdev[MAXPATHLEN];
3375 /* 0 is success, 1 is not encrypted,
3376 * -1 is value not set, -2 is any other error
3377 */
3378 int rc = -2;
3379
3380 if (persist_data == NULL) {
3381 load_persistent_data();
3382 if (persist_data == NULL) {
3383 SLOGE("Getfield error, cannot load persistent data");
3384 goto out;
3385 }
3386 }
3387
3388 if (!persist_get_key(fieldname, temp_value)) {
3389 /* We found it, copy it to the caller's buffer and return */
3390 strlcpy(value, temp_value, len);
3391 rc = 0;
3392 } else {
3393 /* Sadness, it's not there. Return the error */
3394 rc = -1;
3395 }
3396
3397out:
3398 return rc;
3399}
3400
3401/* Set the value of the specified field. */
3402int cryptfs_setfield(char *fieldname, char *value)
3403{
3404 struct crypt_persist_data stored_pdata;
3405 struct crypt_persist_data *pdata_p;
3406 struct crypt_mnt_ftr crypt_ftr;
3407 char encrypted_state[PROPERTY_VALUE_MAX];
3408 /* 0 is success, -1 is an error */
3409 int rc = -1;
3410 int encrypted = 0;
3411
3412 if (persist_data == NULL) {
3413 load_persistent_data();
3414 if (persist_data == NULL) {
3415 SLOGE("Setfield error, cannot load persistent data");
3416 goto out;
3417 }
3418 }
3419
3420 property_get("ro.crypto.state", encrypted_state, "");
3421 if (!strcmp(encrypted_state, "encrypted") ) {
3422 encrypted = 1;
3423 }
3424
3425 if (persist_set_key(fieldname, value, encrypted)) {
3426 goto out;
3427 }
3428
3429 /* If we are running encrypted, save the persistent data now */
3430 if (encrypted) {
3431 if (save_persistent_data()) {
3432 SLOGE("Setfield error, cannot save persistent data");
3433 goto out;
3434 }
3435 }
3436
3437 rc = 0;
3438
3439out:
3440 return rc;
3441}
Paul Lawrencef4faa572014-01-29 13:31:03 -08003442
3443/* Checks userdata. Attempt to mount the volume if default-
3444 * encrypted.
3445 * On success trigger next init phase and return 0.
3446 * Currently do not handle failure - see TODO below.
3447 */
3448int cryptfs_mount_default_encrypted(void)
3449{
3450 char decrypt_state[PROPERTY_VALUE_MAX];
3451 property_get("vold.decrypt", decrypt_state, "0");
3452 if (!strcmp(decrypt_state, "0")) {
3453 SLOGE("Not encrypted - should not call here");
3454 } else {
3455 int crypt_type = cryptfs_get_password_type();
3456 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3457 SLOGE("Bad crypt type - error");
3458 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
3459 SLOGD("Password is not default - "
3460 "starting min framework to prompt");
3461 property_set("vold.decrypt", "trigger_restart_min_framework");
3462 return 0;
3463 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
3464 SLOGD("Password is default - restarting filesystem");
3465 cryptfs_restart_internal(0);
3466 return 0;
3467 } else {
3468 SLOGE("Encrypted, default crypt type but can't decrypt");
3469 }
3470 }
3471
Paul Lawrence6bfed202014-07-28 12:47:22 -07003472 /** Corrupt. Allow us to boot into framework, which will detect bad
3473 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08003474 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07003475 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003476 return 0;
3477}
3478
3479/* Returns type of the password, default, pattern, pin or password.
3480 */
3481int cryptfs_get_password_type(void)
3482{
3483 struct crypt_mnt_ftr crypt_ftr;
3484
3485 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3486 SLOGE("Error getting crypt footer and key\n");
3487 return -1;
3488 }
3489
Paul Lawrence6bfed202014-07-28 12:47:22 -07003490 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
3491 return -1;
3492 }
3493
Paul Lawrencef4faa572014-01-29 13:31:03 -08003494 return crypt_ftr.crypt_type;
3495}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003496
Paul Lawrence399317e2014-03-10 13:20:50 -07003497char* cryptfs_get_password()
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003498{
Paul Lawrence399317e2014-03-10 13:20:50 -07003499 struct timespec now;
3500 clock_gettime(CLOCK_MONOTONIC, &now);
3501 if (now.tv_sec < password_expiry_time) {
3502 return password;
3503 } else {
3504 cryptfs_clear_password();
3505 return 0;
3506 }
3507}
3508
3509void cryptfs_clear_password()
3510{
3511 if (password) {
3512 size_t len = strlen(password);
3513 memset(password, 0, len);
3514 free(password);
3515 password = 0;
3516 password_expiry_time = 0;
3517 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003518}