Home | History | Annotate | Download | only in vold
      1 /*
      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>
     24 #include <sys/wait.h>
     25 #include <sys/stat.h>
     26 #include <fcntl.h>
     27 #include <unistd.h>
     28 #include <stdio.h>
     29 #include <sys/ioctl.h>
     30 #include <linux/dm-ioctl.h>
     31 #include <libgen.h>
     32 #include <stdlib.h>
     33 #include <sys/param.h>
     34 #include <string.h>
     35 #include <sys/mount.h>
     36 #include <openssl/evp.h>
     37 #include <openssl/sha.h>
     38 #include <errno.h>
     39 #include <ext4.h>
     40 #include <linux/kdev_t.h>
     41 #include <fs_mgr.h>
     42 #include "cryptfs.h"
     43 #define LOG_TAG "Cryptfs"
     44 #include "cutils/log.h"
     45 #include "cutils/properties.h"
     46 #include "cutils/android_reboot.h"
     47 #include "hardware_legacy/power.h"
     48 #include <logwrap/logwrap.h>
     49 #include "VolumeManager.h"
     50 #include "VoldUtil.h"
     51 #include "crypto_scrypt.h"
     52 
     53 #define DM_CRYPT_BUF_SIZE 4096
     54 #define DATA_MNT_POINT "/data"
     55 
     56 #define HASH_COUNT 2000
     57 #define KEY_LEN_BYTES 16
     58 #define IV_LEN_BYTES 16
     59 
     60 #define KEY_IN_FOOTER  "footer"
     61 
     62 #define EXT4_FS 1
     63 #define FAT_FS 2
     64 
     65 #define TABLE_LOAD_RETRIES 10
     66 
     67 char *me = "cryptfs";
     68 
     69 static unsigned char saved_master_key[KEY_LEN_BYTES];
     70 static char *saved_mount_point;
     71 static int  master_key_saved = 0;
     72 static struct crypt_persist_data *persist_data = NULL;
     73 
     74 extern struct fstab *fstab;
     75 
     76 static void cryptfs_reboot(int recovery)
     77 {
     78     if (recovery) {
     79         property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
     80     } else {
     81         property_set(ANDROID_RB_PROPERTY, "reboot");
     82     }
     83     sleep(20);
     84 
     85     /* Shouldn't get here, reboot should happen before sleep times out */
     86     return;
     87 }
     88 
     89 static void ioctl_init(struct dm_ioctl *io, size_t dataSize, const char *name, unsigned flags)
     90 {
     91     memset(io, 0, dataSize);
     92     io->data_size = dataSize;
     93     io->data_start = sizeof(struct dm_ioctl);
     94     io->version[0] = 4;
     95     io->version[1] = 0;
     96     io->version[2] = 0;
     97     io->flags = flags;
     98     if (name) {
     99         strncpy(io->name, name, sizeof(io->name));
    100     }
    101 }
    102 
    103 /**
    104  * Gets the default device scrypt parameters for key derivation time tuning.
    105  * The parameters should lead to about one second derivation time for the
    106  * given device.
    107  */
    108 static void get_device_scrypt_params(struct crypt_mnt_ftr *ftr) {
    109     const int default_params[] = SCRYPT_DEFAULTS;
    110     int params[] = SCRYPT_DEFAULTS;
    111     char paramstr[PROPERTY_VALUE_MAX];
    112     char *token;
    113     char *saveptr;
    114     int i;
    115 
    116     property_get(SCRYPT_PROP, paramstr, "");
    117     if (paramstr[0] != '\0') {
    118         /*
    119          * The token we're looking for should be three integers separated by
    120          * colons (e.g., "12:8:1"). Scan the property to make sure it matches.
    121          */
    122         for (i = 0, token = strtok_r(paramstr, ":", &saveptr);
    123                 token != NULL && i < 3;
    124                 i++, token = strtok_r(NULL, ":", &saveptr)) {
    125             char *endptr;
    126             params[i] = strtol(token, &endptr, 10);
    127 
    128             /*
    129              * Check that there was a valid number and it's 8-bit. If not,
    130              * break out and the end check will take the default values.
    131              */
    132             if ((*token == '\0') || (*endptr != '\0') || params[i] < 0 || params[i] > 255) {
    133                 break;
    134             }
    135         }
    136 
    137         /*
    138          * If there were not enough tokens or a token was malformed (not an
    139          * integer), it will end up here and the default parameters can be
    140          * taken.
    141          */
    142         if ((i != 3) || (token != NULL)) {
    143             SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
    144             memcpy(params, default_params, sizeof(params));
    145         }
    146     }
    147 
    148     ftr->N_factor = params[0];
    149     ftr->r_factor = params[1];
    150     ftr->p_factor = params[2];
    151 }
    152 
    153 static unsigned int get_fs_size(char *dev)
    154 {
    155     int fd, block_size;
    156     struct ext4_super_block sb;
    157     off64_t len;
    158 
    159     if ((fd = open(dev, O_RDONLY)) < 0) {
    160         SLOGE("Cannot open device to get filesystem size ");
    161         return 0;
    162     }
    163 
    164     if (lseek64(fd, 1024, SEEK_SET) < 0) {
    165         SLOGE("Cannot seek to superblock");
    166         return 0;
    167     }
    168 
    169     if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
    170         SLOGE("Cannot read superblock");
    171         return 0;
    172     }
    173 
    174     close(fd);
    175 
    176     block_size = 1024 << sb.s_log_block_size;
    177     /* compute length in bytes */
    178     len = ( ((off64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
    179 
    180     /* return length in sectors */
    181     return (unsigned int) (len / 512);
    182 }
    183 
    184 static int get_crypt_ftr_info(char **metadata_fname, off64_t *off)
    185 {
    186   static int cached_data = 0;
    187   static off64_t cached_off = 0;
    188   static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
    189   int fd;
    190   char key_loc[PROPERTY_VALUE_MAX];
    191   char real_blkdev[PROPERTY_VALUE_MAX];
    192   unsigned int nr_sec;
    193   int rc = -1;
    194 
    195   if (!cached_data) {
    196     fs_mgr_get_crypt_info(fstab, key_loc, real_blkdev, sizeof(key_loc));
    197 
    198     if (!strcmp(key_loc, KEY_IN_FOOTER)) {
    199       if ( (fd = open(real_blkdev, O_RDWR)) < 0) {
    200         SLOGE("Cannot open real block device %s\n", real_blkdev);
    201         return -1;
    202       }
    203 
    204       if ((nr_sec = get_blkdev_size(fd))) {
    205         /* If it's an encrypted Android partition, the last 16 Kbytes contain the
    206          * encryption info footer and key, and plenty of bytes to spare for future
    207          * growth.
    208          */
    209         strlcpy(cached_metadata_fname, real_blkdev, sizeof(cached_metadata_fname));
    210         cached_off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET;
    211         cached_data = 1;
    212       } else {
    213         SLOGE("Cannot get size of block device %s\n", real_blkdev);
    214       }
    215       close(fd);
    216     } else {
    217       strlcpy(cached_metadata_fname, key_loc, sizeof(cached_metadata_fname));
    218       cached_off = 0;
    219       cached_data = 1;
    220     }
    221   }
    222 
    223   if (cached_data) {
    224     if (metadata_fname) {
    225         *metadata_fname = cached_metadata_fname;
    226     }
    227     if (off) {
    228         *off = cached_off;
    229     }
    230     rc = 0;
    231   }
    232 
    233   return rc;
    234 }
    235 
    236 /* key or salt can be NULL, in which case just skip writing that value.  Useful to
    237  * update the failed mount count but not change the key.
    238  */
    239 static int put_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
    240 {
    241   int fd;
    242   unsigned int nr_sec, cnt;
    243   /* starting_off is set to the SEEK_SET offset
    244    * where the crypto structure starts
    245    */
    246   off64_t starting_off;
    247   int rc = -1;
    248   char *fname = NULL;
    249   struct stat statbuf;
    250 
    251   if (get_crypt_ftr_info(&fname, &starting_off)) {
    252     SLOGE("Unable to get crypt_ftr_info\n");
    253     return -1;
    254   }
    255   if (fname[0] != '/') {
    256     SLOGE("Unexpected value for crypto key location\n");
    257     return -1;
    258   }
    259   if ( (fd = open(fname, O_RDWR | O_CREAT, 0600)) < 0) {
    260     SLOGE("Cannot open footer file %s for put\n", fname);
    261     return -1;
    262   }
    263 
    264   /* Seek to the start of the crypt footer */
    265   if (lseek64(fd, starting_off, SEEK_SET) == -1) {
    266     SLOGE("Cannot seek to real block device footer\n");
    267     goto errout;
    268   }
    269 
    270   if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
    271     SLOGE("Cannot write real block device footer\n");
    272     goto errout;
    273   }
    274 
    275   fstat(fd, &statbuf);
    276   /* If the keys are kept on a raw block device, do not try to truncate it. */
    277   if (S_ISREG(statbuf.st_mode)) {
    278     if (ftruncate(fd, 0x4000)) {
    279       SLOGE("Cannot set footer file size\n", fname);
    280       goto errout;
    281     }
    282   }
    283 
    284   /* Success! */
    285   rc = 0;
    286 
    287 errout:
    288   close(fd);
    289   return rc;
    290 
    291 }
    292 
    293 static inline int unix_read(int  fd, void*  buff, int  len)
    294 {
    295     return TEMP_FAILURE_RETRY(read(fd, buff, len));
    296 }
    297 
    298 static inline int unix_write(int  fd, const void*  buff, int  len)
    299 {
    300     return TEMP_FAILURE_RETRY(write(fd, buff, len));
    301 }
    302 
    303 static void init_empty_persist_data(struct crypt_persist_data *pdata, int len)
    304 {
    305     memset(pdata, 0, len);
    306     pdata->persist_magic = PERSIST_DATA_MAGIC;
    307     pdata->persist_valid_entries = 0;
    308 }
    309 
    310 /* A routine to update the passed in crypt_ftr to the lastest version.
    311  * fd is open read/write on the device that holds the crypto footer and persistent
    312  * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
    313  * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
    314  */
    315 static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr *crypt_ftr, off64_t offset)
    316 {
    317     int orig_major = crypt_ftr->major_version;
    318     int orig_minor = crypt_ftr->minor_version;
    319 
    320     if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
    321         struct crypt_persist_data *pdata;
    322         off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
    323 
    324         SLOGW("upgrading crypto footer to 1.1");
    325 
    326         pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
    327         if (pdata == NULL) {
    328             SLOGE("Cannot allocate persisent data\n");
    329             return;
    330         }
    331         memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
    332 
    333         /* Need to initialize the persistent data area */
    334         if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
    335             SLOGE("Cannot seek to persisent data offset\n");
    336             return;
    337         }
    338         /* Write all zeros to the first copy, making it invalid */
    339         unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
    340 
    341         /* Write a valid but empty structure to the second copy */
    342         init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
    343         unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
    344 
    345         /* Update the footer */
    346         crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
    347         crypt_ftr->persist_data_offset[0] = pdata_offset;
    348         crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
    349         crypt_ftr->minor_version = 1;
    350     }
    351 
    352     if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version)) {
    353         SLOGW("upgrading crypto footer to 1.2");
    354         /* But keep the old kdf_type.
    355          * It will get updated later to KDF_SCRYPT after the password has been verified.
    356          */
    357         crypt_ftr->kdf_type = KDF_PBKDF2;
    358         get_device_scrypt_params(crypt_ftr);
    359         crypt_ftr->minor_version = 2;
    360     }
    361 
    362     if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
    363         if (lseek64(fd, offset, SEEK_SET) == -1) {
    364             SLOGE("Cannot seek to crypt footer\n");
    365             return;
    366         }
    367         unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
    368     }
    369 }
    370 
    371 
    372 static int get_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
    373 {
    374   int fd;
    375   unsigned int nr_sec, cnt;
    376   off64_t starting_off;
    377   int rc = -1;
    378   char *fname = NULL;
    379   struct stat statbuf;
    380 
    381   if (get_crypt_ftr_info(&fname, &starting_off)) {
    382     SLOGE("Unable to get crypt_ftr_info\n");
    383     return -1;
    384   }
    385   if (fname[0] != '/') {
    386     SLOGE("Unexpected value for crypto key location\n");
    387     return -1;
    388   }
    389   if ( (fd = open(fname, O_RDWR)) < 0) {
    390     SLOGE("Cannot open footer file %s for get\n", fname);
    391     return -1;
    392   }
    393 
    394   /* Make sure it's 16 Kbytes in length */
    395   fstat(fd, &statbuf);
    396   if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
    397     SLOGE("footer file %s is not the expected size!\n", fname);
    398     goto errout;
    399   }
    400 
    401   /* Seek to the start of the crypt footer */
    402   if (lseek64(fd, starting_off, SEEK_SET) == -1) {
    403     SLOGE("Cannot seek to real block device footer\n");
    404     goto errout;
    405   }
    406 
    407   if ( (cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
    408     SLOGE("Cannot read real block device footer\n");
    409     goto errout;
    410   }
    411 
    412   if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
    413     SLOGE("Bad magic for real block device %s\n", fname);
    414     goto errout;
    415   }
    416 
    417   if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
    418     SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
    419           crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
    420     goto errout;
    421   }
    422 
    423   if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
    424     SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
    425           crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
    426   }
    427 
    428   /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
    429    * copy on disk before returning.
    430    */
    431   if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
    432     upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
    433   }
    434 
    435   /* Success! */
    436   rc = 0;
    437 
    438 errout:
    439   close(fd);
    440   return rc;
    441 }
    442 
    443 static int validate_persistent_data_storage(struct crypt_mnt_ftr *crypt_ftr)
    444 {
    445     if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
    446         crypt_ftr->persist_data_offset[1]) {
    447         SLOGE("Crypt_ftr persist data regions overlap");
    448         return -1;
    449     }
    450 
    451     if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
    452         SLOGE("Crypt_ftr persist data region 0 starts after region 1");
    453         return -1;
    454     }
    455 
    456     if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
    457         (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
    458         CRYPT_FOOTER_OFFSET) {
    459         SLOGE("Persistent data extends past crypto footer");
    460         return -1;
    461     }
    462 
    463     return 0;
    464 }
    465 
    466 static int load_persistent_data(void)
    467 {
    468     struct crypt_mnt_ftr crypt_ftr;
    469     struct crypt_persist_data *pdata = NULL;
    470     char encrypted_state[PROPERTY_VALUE_MAX];
    471     char *fname;
    472     int found = 0;
    473     int fd;
    474     int ret;
    475     int i;
    476 
    477     if (persist_data) {
    478         /* Nothing to do, we've already loaded or initialized it */
    479         return 0;
    480     }
    481 
    482 
    483     /* If not encrypted, just allocate an empty table and initialize it */
    484     property_get("ro.crypto.state", encrypted_state, "");
    485     if (strcmp(encrypted_state, "encrypted") ) {
    486         pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
    487         if (pdata) {
    488             init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
    489             persist_data = pdata;
    490             return 0;
    491         }
    492         return -1;
    493     }
    494 
    495     if(get_crypt_ftr_and_key(&crypt_ftr)) {
    496         return -1;
    497     }
    498 
    499     if ((crypt_ftr.major_version != 1) || (crypt_ftr.minor_version != 1)) {
    500         SLOGE("Crypt_ftr version doesn't support persistent data");
    501         return -1;
    502     }
    503 
    504     if (get_crypt_ftr_info(&fname, NULL)) {
    505         return -1;
    506     }
    507 
    508     ret = validate_persistent_data_storage(&crypt_ftr);
    509     if (ret) {
    510         return -1;
    511     }
    512 
    513     fd = open(fname, O_RDONLY);
    514     if (fd < 0) {
    515         SLOGE("Cannot open %s metadata file", fname);
    516         return -1;
    517     }
    518 
    519     if (persist_data == NULL) {
    520         pdata = malloc(crypt_ftr.persist_data_size);
    521         if (pdata == NULL) {
    522             SLOGE("Cannot allocate memory for persistent data");
    523             goto err;
    524         }
    525     }
    526 
    527     for (i = 0; i < 2; i++) {
    528         if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
    529             SLOGE("Cannot seek to read persistent data on %s", fname);
    530             goto err2;
    531         }
    532         if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0){
    533             SLOGE("Error reading persistent data on iteration %d", i);
    534             goto err2;
    535         }
    536         if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
    537             found = 1;
    538             break;
    539         }
    540     }
    541 
    542     if (!found) {
    543         SLOGI("Could not find valid persistent data, creating");
    544         init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
    545     }
    546 
    547     /* Success */
    548     persist_data = pdata;
    549     close(fd);
    550     return 0;
    551 
    552 err2:
    553     free(pdata);
    554 
    555 err:
    556     close(fd);
    557     return -1;
    558 }
    559 
    560 static int save_persistent_data(void)
    561 {
    562     struct crypt_mnt_ftr crypt_ftr;
    563     struct crypt_persist_data *pdata;
    564     char *fname;
    565     off64_t write_offset;
    566     off64_t erase_offset;
    567     int found = 0;
    568     int fd;
    569     int ret;
    570 
    571     if (persist_data == NULL) {
    572         SLOGE("No persistent data to save");
    573         return -1;
    574     }
    575 
    576     if(get_crypt_ftr_and_key(&crypt_ftr)) {
    577         return -1;
    578     }
    579 
    580     if ((crypt_ftr.major_version != 1) || (crypt_ftr.minor_version != 1)) {
    581         SLOGE("Crypt_ftr version doesn't support persistent data");
    582         return -1;
    583     }
    584 
    585     ret = validate_persistent_data_storage(&crypt_ftr);
    586     if (ret) {
    587         return -1;
    588     }
    589 
    590     if (get_crypt_ftr_info(&fname, NULL)) {
    591         return -1;
    592     }
    593 
    594     fd = open(fname, O_RDWR);
    595     if (fd < 0) {
    596         SLOGE("Cannot open %s metadata file", fname);
    597         return -1;
    598     }
    599 
    600     pdata = malloc(crypt_ftr.persist_data_size);
    601     if (pdata == NULL) {
    602         SLOGE("Cannot allocate persistant data");
    603         goto err;
    604     }
    605 
    606     if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
    607         SLOGE("Cannot seek to read persistent data on %s", fname);
    608         goto err2;
    609     }
    610 
    611     if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
    612             SLOGE("Error reading persistent data before save");
    613             goto err2;
    614     }
    615 
    616     if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
    617         /* The first copy is the curent valid copy, so write to
    618          * the second copy and erase this one */
    619        write_offset = crypt_ftr.persist_data_offset[1];
    620        erase_offset = crypt_ftr.persist_data_offset[0];
    621     } else {
    622         /* The second copy must be the valid copy, so write to
    623          * the first copy, and erase the second */
    624        write_offset = crypt_ftr.persist_data_offset[0];
    625        erase_offset = crypt_ftr.persist_data_offset[1];
    626     }
    627 
    628     /* Write the new copy first, if successful, then erase the old copy */
    629     if (lseek(fd, write_offset, SEEK_SET) < 0) {
    630         SLOGE("Cannot seek to write persistent data");
    631         goto err2;
    632     }
    633     if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
    634         (int) crypt_ftr.persist_data_size) {
    635         if (lseek(fd, erase_offset, SEEK_SET) < 0) {
    636             SLOGE("Cannot seek to erase previous persistent data");
    637             goto err2;
    638         }
    639         fsync(fd);
    640         memset(pdata, 0, crypt_ftr.persist_data_size);
    641         if (unix_write(fd, pdata, crypt_ftr.persist_data_size) !=
    642             (int) crypt_ftr.persist_data_size) {
    643             SLOGE("Cannot write to erase previous persistent data");
    644             goto err2;
    645         }
    646         fsync(fd);
    647     } else {
    648         SLOGE("Cannot write to save persistent data");
    649         goto err2;
    650     }
    651 
    652     /* Success */
    653     free(pdata);
    654     close(fd);
    655     return 0;
    656 
    657 err2:
    658     free(pdata);
    659 err:
    660     close(fd);
    661     return -1;
    662 }
    663 
    664 /* Convert a binary key of specified length into an ascii hex string equivalent,
    665  * without the leading 0x and with null termination
    666  */
    667 void convert_key_to_hex_ascii(unsigned char *master_key, unsigned int keysize,
    668                               char *master_key_ascii)
    669 {
    670   unsigned int i, a;
    671   unsigned char nibble;
    672 
    673   for (i=0, a=0; i<keysize; i++, a+=2) {
    674     /* For each byte, write out two ascii hex digits */
    675     nibble = (master_key[i] >> 4) & 0xf;
    676     master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
    677 
    678     nibble = master_key[i] & 0xf;
    679     master_key_ascii[a+1] = nibble + (nibble > 9 ? 0x37 : 0x30);
    680   }
    681 
    682   /* Add the null termination */
    683   master_key_ascii[a] = '\0';
    684 
    685 }
    686 
    687 static int load_crypto_mapping_table(struct crypt_mnt_ftr *crypt_ftr, unsigned char *master_key,
    688                                      char *real_blk_name, const char *name, int fd,
    689                                      char *extra_params)
    690 {
    691   char buffer[DM_CRYPT_BUF_SIZE];
    692   struct dm_ioctl *io;
    693   struct dm_target_spec *tgt;
    694   char *crypt_params;
    695   char master_key_ascii[129]; /* Large enough to hold 512 bit key and null */
    696   int i;
    697 
    698   io = (struct dm_ioctl *) buffer;
    699 
    700   /* Load the mapping table for this device */
    701   tgt = (struct dm_target_spec *) &buffer[sizeof(struct dm_ioctl)];
    702 
    703   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    704   io->target_count = 1;
    705   tgt->status = 0;
    706   tgt->sector_start = 0;
    707   tgt->length = crypt_ftr->fs_size;
    708   strcpy(tgt->target_type, "crypt");
    709 
    710   crypt_params = buffer + sizeof(struct dm_ioctl) + sizeof(struct dm_target_spec);
    711   convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
    712   sprintf(crypt_params, "%s %s 0 %s 0 %s", crypt_ftr->crypto_type_name,
    713           master_key_ascii, real_blk_name, extra_params);
    714   crypt_params += strlen(crypt_params) + 1;
    715   crypt_params = (char *) (((unsigned long)crypt_params + 7) & ~8); /* Align to an 8 byte boundary */
    716   tgt->next = crypt_params - buffer;
    717 
    718   for (i = 0; i < TABLE_LOAD_RETRIES; i++) {
    719     if (! ioctl(fd, DM_TABLE_LOAD, io)) {
    720       break;
    721     }
    722     usleep(500000);
    723   }
    724 
    725   if (i == TABLE_LOAD_RETRIES) {
    726     /* We failed to load the table, return an error */
    727     return -1;
    728   } else {
    729     return i + 1;
    730   }
    731 }
    732 
    733 
    734 static int get_dm_crypt_version(int fd, const char *name,  int *version)
    735 {
    736     char buffer[DM_CRYPT_BUF_SIZE];
    737     struct dm_ioctl *io;
    738     struct dm_target_versions *v;
    739     int i;
    740 
    741     io = (struct dm_ioctl *) buffer;
    742 
    743     ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    744 
    745     if (ioctl(fd, DM_LIST_VERSIONS, io)) {
    746         return -1;
    747     }
    748 
    749     /* Iterate over the returned versions, looking for name of "crypt".
    750      * When found, get and return the version.
    751      */
    752     v = (struct dm_target_versions *) &buffer[sizeof(struct dm_ioctl)];
    753     while (v->next) {
    754         if (! strcmp(v->name, "crypt")) {
    755             /* We found the crypt driver, return the version, and get out */
    756             version[0] = v->version[0];
    757             version[1] = v->version[1];
    758             version[2] = v->version[2];
    759             return 0;
    760         }
    761         v = (struct dm_target_versions *)(((char *)v) + v->next);
    762     }
    763 
    764     return -1;
    765 }
    766 
    767 static int create_crypto_blk_dev(struct crypt_mnt_ftr *crypt_ftr, unsigned char *master_key,
    768                                     char *real_blk_name, char *crypto_blk_name, const char *name)
    769 {
    770   char buffer[DM_CRYPT_BUF_SIZE];
    771   char master_key_ascii[129]; /* Large enough to hold 512 bit key and null */
    772   char *crypt_params;
    773   struct dm_ioctl *io;
    774   struct dm_target_spec *tgt;
    775   unsigned int minor;
    776   int fd;
    777   int i;
    778   int retval = -1;
    779   int version[3];
    780   char *extra_params;
    781   int load_count;
    782 
    783   if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
    784     SLOGE("Cannot open device-mapper\n");
    785     goto errout;
    786   }
    787 
    788   io = (struct dm_ioctl *) buffer;
    789 
    790   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    791   if (ioctl(fd, DM_DEV_CREATE, io)) {
    792     SLOGE("Cannot create dm-crypt device\n");
    793     goto errout;
    794   }
    795 
    796   /* Get the device status, in particular, the name of it's device file */
    797   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    798   if (ioctl(fd, DM_DEV_STATUS, io)) {
    799     SLOGE("Cannot retrieve dm-crypt device status\n");
    800     goto errout;
    801   }
    802   minor = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00);
    803   snprintf(crypto_blk_name, MAXPATHLEN, "/dev/block/dm-%u", minor);
    804 
    805   extra_params = "";
    806   if (! get_dm_crypt_version(fd, name, version)) {
    807       /* Support for allow_discards was added in version 1.11.0 */
    808       if ((version[0] >= 2) ||
    809           ((version[0] == 1) && (version[1] >= 11))) {
    810           extra_params = "1 allow_discards";
    811           SLOGI("Enabling support for allow_discards in dmcrypt.\n");
    812       }
    813   }
    814 
    815   load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name,
    816                                          fd, extra_params);
    817   if (load_count < 0) {
    818       SLOGE("Cannot load dm-crypt mapping table.\n");
    819       goto errout;
    820   } else if (load_count > 1) {
    821       SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
    822   }
    823 
    824   /* Resume this device to activate it */
    825   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    826 
    827   if (ioctl(fd, DM_DEV_SUSPEND, io)) {
    828     SLOGE("Cannot resume the dm-crypt device\n");
    829     goto errout;
    830   }
    831 
    832   /* We made it here with no errors.  Woot! */
    833   retval = 0;
    834 
    835 errout:
    836   close(fd);   /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
    837 
    838   return retval;
    839 }
    840 
    841 static int delete_crypto_blk_dev(char *name)
    842 {
    843   int fd;
    844   char buffer[DM_CRYPT_BUF_SIZE];
    845   struct dm_ioctl *io;
    846   int retval = -1;
    847 
    848   if ((fd = open("/dev/device-mapper", O_RDWR)) < 0 ) {
    849     SLOGE("Cannot open device-mapper\n");
    850     goto errout;
    851   }
    852 
    853   io = (struct dm_ioctl *) buffer;
    854 
    855   ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
    856   if (ioctl(fd, DM_DEV_REMOVE, io)) {
    857     SLOGE("Cannot remove dm-crypt device\n");
    858     goto errout;
    859   }
    860 
    861   /* We made it here with no errors.  Woot! */
    862   retval = 0;
    863 
    864 errout:
    865   close(fd);    /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
    866 
    867   return retval;
    868 
    869 }
    870 
    871 static void pbkdf2(char *passwd, unsigned char *salt, unsigned char *ikey, void *params) {
    872     /* Turn the password into a key and IV that can decrypt the master key */
    873     PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN,
    874                            HASH_COUNT, KEY_LEN_BYTES+IV_LEN_BYTES, ikey);
    875 }
    876 
    877 static void scrypt(char *passwd, unsigned char *salt, unsigned char *ikey, void *params) {
    878     struct crypt_mnt_ftr *ftr = (struct crypt_mnt_ftr *) params;
    879 
    880     int N = 1 << ftr->N_factor;
    881     int r = 1 << ftr->r_factor;
    882     int p = 1 << ftr->p_factor;
    883 
    884     /* Turn the password into a key and IV that can decrypt the master key */
    885     crypto_scrypt((unsigned char *) passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
    886             KEY_LEN_BYTES + IV_LEN_BYTES);
    887 }
    888 
    889 static int encrypt_master_key(char *passwd, unsigned char *salt,
    890                               unsigned char *decrypted_master_key,
    891                               unsigned char *encrypted_master_key,
    892                               struct crypt_mnt_ftr *crypt_ftr)
    893 {
    894     unsigned char ikey[32+32] = { 0 }; /* Big enough to hold a 256 bit key and 256 bit IV */
    895     EVP_CIPHER_CTX e_ctx;
    896     int encrypted_len, final_len;
    897 
    898     /* Turn the password into a key and IV that can decrypt the master key */
    899     get_device_scrypt_params(crypt_ftr);
    900     scrypt(passwd, salt, ikey, crypt_ftr);
    901 
    902     /* Initialize the decryption engine */
    903     if (! EVP_EncryptInit(&e_ctx, EVP_aes_128_cbc(), ikey, ikey+KEY_LEN_BYTES)) {
    904         SLOGE("EVP_EncryptInit failed\n");
    905         return -1;
    906     }
    907     EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
    908 
    909     /* Encrypt the master key */
    910     if (! EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len,
    911                               decrypted_master_key, KEY_LEN_BYTES)) {
    912         SLOGE("EVP_EncryptUpdate failed\n");
    913         return -1;
    914     }
    915     if (! EVP_EncryptFinal(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
    916         SLOGE("EVP_EncryptFinal failed\n");
    917         return -1;
    918     }
    919 
    920     if (encrypted_len + final_len != KEY_LEN_BYTES) {
    921         SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
    922         return -1;
    923     } else {
    924         return 0;
    925     }
    926 }
    927 
    928 static int decrypt_master_key_aux(char *passwd, unsigned char *salt,
    929                               unsigned char *encrypted_master_key,
    930                               unsigned char *decrypted_master_key,
    931                               kdf_func kdf, void *kdf_params)
    932 {
    933   unsigned char ikey[32+32] = { 0 }; /* Big enough to hold a 256 bit key and 256 bit IV */
    934   EVP_CIPHER_CTX d_ctx;
    935   int decrypted_len, final_len;
    936 
    937   /* Turn the password into a key and IV that can decrypt the master key */
    938   kdf(passwd, salt, ikey, kdf_params);
    939 
    940   /* Initialize the decryption engine */
    941   if (! EVP_DecryptInit(&d_ctx, EVP_aes_128_cbc(), ikey, ikey+KEY_LEN_BYTES)) {
    942     return -1;
    943   }
    944   EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
    945   /* Decrypt the master key */
    946   if (! EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len,
    947                             encrypted_master_key, KEY_LEN_BYTES)) {
    948     return -1;
    949   }
    950   if (! EVP_DecryptFinal(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
    951     return -1;
    952   }
    953 
    954   if (decrypted_len + final_len != KEY_LEN_BYTES) {
    955     return -1;
    956   } else {
    957     return 0;
    958   }
    959 }
    960 
    961 static void get_kdf_func(struct crypt_mnt_ftr *ftr, kdf_func *kdf, void** kdf_params)
    962 {
    963     if (ftr->kdf_type == KDF_SCRYPT) {
    964         *kdf = scrypt;
    965         *kdf_params = ftr;
    966     } else {
    967         *kdf = pbkdf2;
    968         *kdf_params = NULL;
    969     }
    970 }
    971 
    972 static int decrypt_master_key(char *passwd, unsigned char *decrypted_master_key,
    973         struct crypt_mnt_ftr *crypt_ftr)
    974 {
    975     kdf_func kdf;
    976     void *kdf_params;
    977     int ret;
    978 
    979     get_kdf_func(crypt_ftr, &kdf, &kdf_params);
    980     ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key, decrypted_master_key, kdf,
    981             kdf_params);
    982     if (ret != 0) {
    983         SLOGW("failure decrypting master key");
    984     }
    985 
    986     return ret;
    987 }
    988 
    989 static int create_encrypted_random_key(char *passwd, unsigned char *master_key, unsigned char *salt,
    990         struct crypt_mnt_ftr *crypt_ftr) {
    991     int fd;
    992     unsigned char key_buf[KEY_LEN_BYTES];
    993     EVP_CIPHER_CTX e_ctx;
    994     int encrypted_len, final_len;
    995 
    996     /* Get some random bits for a key */
    997     fd = open("/dev/urandom", O_RDONLY);
    998     read(fd, key_buf, sizeof(key_buf));
    999     read(fd, salt, SALT_LEN);
   1000     close(fd);
   1001 
   1002     /* Now encrypt it with the password */
   1003     return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr);
   1004 }
   1005 
   1006 static int wait_and_unmount(char *mountpoint)
   1007 {
   1008     int i, rc;
   1009 #define WAIT_UNMOUNT_COUNT 20
   1010 
   1011     /*  Now umount the tmpfs filesystem */
   1012     for (i=0; i<WAIT_UNMOUNT_COUNT; i++) {
   1013         if (umount(mountpoint)) {
   1014             if (errno == EINVAL) {
   1015                 /* EINVAL is returned if the directory is not a mountpoint,
   1016                  * i.e. there is no filesystem mounted there.  So just get out.
   1017                  */
   1018                 break;
   1019             }
   1020             sleep(1);
   1021             i++;
   1022         } else {
   1023           break;
   1024         }
   1025     }
   1026 
   1027     if (i < WAIT_UNMOUNT_COUNT) {
   1028       SLOGD("unmounting %s succeeded\n", mountpoint);
   1029       rc = 0;
   1030     } else {
   1031       SLOGE("unmounting %s failed\n", mountpoint);
   1032       rc = -1;
   1033     }
   1034 
   1035     return rc;
   1036 }
   1037 
   1038 #define DATA_PREP_TIMEOUT 200
   1039 static int prep_data_fs(void)
   1040 {
   1041     int i;
   1042 
   1043     /* Do the prep of the /data filesystem */
   1044     property_set("vold.post_fs_data_done", "0");
   1045     property_set("vold.decrypt", "trigger_post_fs_data");
   1046     SLOGD("Just triggered post_fs_data\n");
   1047 
   1048     /* Wait a max of 50 seconds, hopefully it takes much less */
   1049     for (i=0; i<DATA_PREP_TIMEOUT; i++) {
   1050         char p[PROPERTY_VALUE_MAX];
   1051 
   1052         property_get("vold.post_fs_data_done", p, "0");
   1053         if (*p == '1') {
   1054             break;
   1055         } else {
   1056             usleep(250000);
   1057         }
   1058     }
   1059     if (i == DATA_PREP_TIMEOUT) {
   1060         /* Ugh, we failed to prep /data in time.  Bail. */
   1061         SLOGE("post_fs_data timed out!\n");
   1062         return -1;
   1063     } else {
   1064         SLOGD("post_fs_data done\n");
   1065         return 0;
   1066     }
   1067 }
   1068 
   1069 int cryptfs_restart(void)
   1070 {
   1071     char fs_type[32];
   1072     char real_blkdev[MAXPATHLEN];
   1073     char crypto_blkdev[MAXPATHLEN];
   1074     char fs_options[256];
   1075     unsigned long mnt_flags;
   1076     struct stat statbuf;
   1077     int rc = -1, i;
   1078     static int restart_successful = 0;
   1079 
   1080     /* Validate that it's OK to call this routine */
   1081     if (! master_key_saved) {
   1082         SLOGE("Encrypted filesystem not validated, aborting");
   1083         return -1;
   1084     }
   1085 
   1086     if (restart_successful) {
   1087         SLOGE("System already restarted with encrypted disk, aborting");
   1088         return -1;
   1089     }
   1090 
   1091     /* Here is where we shut down the framework.  The init scripts
   1092      * start all services in one of three classes: core, main or late_start.
   1093      * On boot, we start core and main.  Now, we stop main, but not core,
   1094      * as core includes vold and a few other really important things that
   1095      * we need to keep running.  Once main has stopped, we should be able
   1096      * to umount the tmpfs /data, then mount the encrypted /data.
   1097      * We then restart the class main, and also the class late_start.
   1098      * At the moment, I've only put a few things in late_start that I know
   1099      * are not needed to bring up the framework, and that also cause problems
   1100      * with unmounting the tmpfs /data, but I hope to add add more services
   1101      * to the late_start class as we optimize this to decrease the delay
   1102      * till the user is asked for the password to the filesystem.
   1103      */
   1104 
   1105     /* The init files are setup to stop the class main when vold.decrypt is
   1106      * set to trigger_reset_main.
   1107      */
   1108     property_set("vold.decrypt", "trigger_reset_main");
   1109     SLOGD("Just asked init to shut down class main\n");
   1110 
   1111     /* Ugh, shutting down the framework is not synchronous, so until it
   1112      * can be fixed, this horrible hack will wait a moment for it all to
   1113      * shut down before proceeding.  Without it, some devices cannot
   1114      * restart the graphics services.
   1115      */
   1116     sleep(2);
   1117 
   1118     /* Now that the framework is shutdown, we should be able to umount()
   1119      * the tmpfs filesystem, and mount the real one.
   1120      */
   1121 
   1122     property_get("ro.crypto.fs_crypto_blkdev", crypto_blkdev, "");
   1123     if (strlen(crypto_blkdev) == 0) {
   1124         SLOGE("fs_crypto_blkdev not set\n");
   1125         return -1;
   1126     }
   1127 
   1128     if (! (rc = wait_and_unmount(DATA_MNT_POINT)) ) {
   1129         /* If that succeeded, then mount the decrypted filesystem */
   1130         fs_mgr_do_mount(fstab, DATA_MNT_POINT, crypto_blkdev, 0);
   1131 
   1132         property_set("vold.decrypt", "trigger_load_persist_props");
   1133         /* Create necessary paths on /data */
   1134         if (prep_data_fs()) {
   1135             return -1;
   1136         }
   1137 
   1138         /* startup service classes main and late_start */
   1139         property_set("vold.decrypt", "trigger_restart_framework");
   1140         SLOGD("Just triggered restart_framework\n");
   1141 
   1142         /* Give it a few moments to get started */
   1143         sleep(1);
   1144     }
   1145 
   1146     if (rc == 0) {
   1147         restart_successful = 1;
   1148     }
   1149 
   1150     return rc;
   1151 }
   1152 
   1153 static int do_crypto_complete(char *mount_point)
   1154 {
   1155   struct crypt_mnt_ftr crypt_ftr;
   1156   char encrypted_state[PROPERTY_VALUE_MAX];
   1157   char key_loc[PROPERTY_VALUE_MAX];
   1158 
   1159   property_get("ro.crypto.state", encrypted_state, "");
   1160   if (strcmp(encrypted_state, "encrypted") ) {
   1161     SLOGE("not running with encryption, aborting");
   1162     return 1;
   1163   }
   1164 
   1165   if (get_crypt_ftr_and_key(&crypt_ftr)) {
   1166     fs_mgr_get_crypt_info(fstab, key_loc, 0, sizeof(key_loc));
   1167 
   1168     /*
   1169      * Only report this error if key_loc is a file and it exists.
   1170      * If the device was never encrypted, and /data is not mountable for
   1171      * some reason, returning 1 should prevent the UI from presenting the
   1172      * a "enter password" screen, or worse, a "press button to wipe the
   1173      * device" screen.
   1174      */
   1175     if ((key_loc[0] == '/') && (access("key_loc", F_OK) == -1)) {
   1176       SLOGE("master key file does not exist, aborting");
   1177       return 1;
   1178     } else {
   1179       SLOGE("Error getting crypt footer and key\n");
   1180       return -1;
   1181     }
   1182   }
   1183 
   1184   if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
   1185     SLOGE("Encryption process didn't finish successfully\n");
   1186     return -2;  /* -2 is the clue to the UI that there is no usable data on the disk,
   1187                  * and give the user an option to wipe the disk */
   1188   }
   1189 
   1190   /* We passed the test! We shall diminish, and return to the west */
   1191   return 0;
   1192 }
   1193 
   1194 static int test_mount_encrypted_fs(char *passwd, char *mount_point, char *label)
   1195 {
   1196   struct crypt_mnt_ftr crypt_ftr;
   1197   /* Allocate enough space for a 256 bit key, but we may use less */
   1198   unsigned char decrypted_master_key[32];
   1199   char crypto_blkdev[MAXPATHLEN];
   1200   char real_blkdev[MAXPATHLEN];
   1201   char tmp_mount_point[64];
   1202   unsigned int orig_failed_decrypt_count;
   1203   char encrypted_state[PROPERTY_VALUE_MAX];
   1204   int rc;
   1205   kdf_func kdf;
   1206   void *kdf_params;
   1207 
   1208   property_get("ro.crypto.state", encrypted_state, "");
   1209   if ( master_key_saved || strcmp(encrypted_state, "encrypted") ) {
   1210     SLOGE("encrypted fs already validated or not running with encryption, aborting");
   1211     return -1;
   1212   }
   1213 
   1214   fs_mgr_get_crypt_info(fstab, 0, real_blkdev, sizeof(real_blkdev));
   1215 
   1216   if (get_crypt_ftr_and_key(&crypt_ftr)) {
   1217     SLOGE("Error getting crypt footer and key\n");
   1218     return -1;
   1219   }
   1220 
   1221   SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr.fs_size);
   1222   orig_failed_decrypt_count = crypt_ftr.failed_decrypt_count;
   1223 
   1224   if (! (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) ) {
   1225     if (decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr)) {
   1226       SLOGE("Failed to decrypt master key\n");
   1227       return -1;
   1228     }
   1229   }
   1230 
   1231   if (create_crypto_blk_dev(&crypt_ftr, decrypted_master_key,
   1232                                real_blkdev, crypto_blkdev, label)) {
   1233     SLOGE("Error creating decrypted block device\n");
   1234     return -1;
   1235   }
   1236 
   1237   /* If init detects an encrypted filesystem, it writes a file for each such
   1238    * encrypted fs into the tmpfs /data filesystem, and then the framework finds those
   1239    * files and passes that data to me */
   1240   /* Create a tmp mount point to try mounting the decryptd fs
   1241    * Since we're here, the mount_point should be a tmpfs filesystem, so make
   1242    * a directory in it to test mount the decrypted filesystem.
   1243    */
   1244   sprintf(tmp_mount_point, "%s/tmp_mnt", mount_point);
   1245   mkdir(tmp_mount_point, 0755);
   1246   if (fs_mgr_do_mount(fstab, DATA_MNT_POINT, crypto_blkdev, tmp_mount_point)) {
   1247     SLOGE("Error temp mounting decrypted block device\n");
   1248     delete_crypto_blk_dev(label);
   1249     crypt_ftr.failed_decrypt_count++;
   1250   } else {
   1251     /* Success, so just umount and we'll mount it properly when we restart
   1252      * the framework.
   1253      */
   1254     umount(tmp_mount_point);
   1255     crypt_ftr.failed_decrypt_count  = 0;
   1256   }
   1257 
   1258   if (orig_failed_decrypt_count != crypt_ftr.failed_decrypt_count) {
   1259     put_crypt_ftr_and_key(&crypt_ftr);
   1260   }
   1261 
   1262   if (crypt_ftr.failed_decrypt_count) {
   1263     /* We failed to mount the device, so return an error */
   1264     rc = crypt_ftr.failed_decrypt_count;
   1265 
   1266   } else {
   1267     /* Woot!  Success!  Save the name of the crypto block device
   1268      * so we can mount it when restarting the framework.
   1269      */
   1270     property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev);
   1271 
   1272     /* Also save a the master key so we can reencrypted the key
   1273      * the key when we want to change the password on it.
   1274      */
   1275     memcpy(saved_master_key, decrypted_master_key, KEY_LEN_BYTES);
   1276     saved_mount_point = strdup(mount_point);
   1277     master_key_saved = 1;
   1278     SLOGD("%s(): Master key saved\n", __FUNCTION__);
   1279     rc = 0;
   1280     /*
   1281      * Upgrade if we're not using the latest KDF.
   1282      */
   1283     if (crypt_ftr.kdf_type != KDF_SCRYPT) {
   1284         crypt_ftr.kdf_type = KDF_SCRYPT;
   1285         rc = encrypt_master_key(passwd, crypt_ftr.salt, saved_master_key, crypt_ftr.master_key,
   1286                 &crypt_ftr);
   1287         if (!rc) {
   1288             rc = put_crypt_ftr_and_key(&crypt_ftr);
   1289         }
   1290         SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
   1291     }
   1292   }
   1293 
   1294   return rc;
   1295 }
   1296 
   1297 /* Called by vold when it wants to undo the crypto mapping of a volume it
   1298  * manages.  This is usually in response to a factory reset, when we want
   1299  * to undo the crypto mapping so the volume is formatted in the clear.
   1300  */
   1301 int cryptfs_revert_volume(const char *label)
   1302 {
   1303     return delete_crypto_blk_dev((char *)label);
   1304 }
   1305 
   1306 /*
   1307  * Called by vold when it's asked to mount an encrypted, nonremovable volume.
   1308  * Setup a dm-crypt mapping, use the saved master key from
   1309  * setting up the /data mapping, and return the new device path.
   1310  */
   1311 int cryptfs_setup_volume(const char *label, int major, int minor,
   1312                          char *crypto_sys_path, unsigned int max_path,
   1313                          int *new_major, int *new_minor)
   1314 {
   1315     char real_blkdev[MAXPATHLEN], crypto_blkdev[MAXPATHLEN];
   1316     struct crypt_mnt_ftr sd_crypt_ftr;
   1317     struct stat statbuf;
   1318     int nr_sec, fd;
   1319 
   1320     sprintf(real_blkdev, "/dev/block/vold/%d:%d", major, minor);
   1321 
   1322     get_crypt_ftr_and_key(&sd_crypt_ftr);
   1323 
   1324     /* Update the fs_size field to be the size of the volume */
   1325     fd = open(real_blkdev, O_RDONLY);
   1326     nr_sec = get_blkdev_size(fd);
   1327     close(fd);
   1328     if (nr_sec == 0) {
   1329         SLOGE("Cannot get size of volume %s\n", real_blkdev);
   1330         return -1;
   1331     }
   1332 
   1333     sd_crypt_ftr.fs_size = nr_sec;
   1334     create_crypto_blk_dev(&sd_crypt_ftr, saved_master_key, real_blkdev,
   1335                           crypto_blkdev, label);
   1336 
   1337     stat(crypto_blkdev, &statbuf);
   1338     *new_major = MAJOR(statbuf.st_rdev);
   1339     *new_minor = MINOR(statbuf.st_rdev);
   1340 
   1341     /* Create path to sys entry for this block device */
   1342     snprintf(crypto_sys_path, max_path, "/devices/virtual/block/%s", strrchr(crypto_blkdev, '/')+1);
   1343 
   1344     return 0;
   1345 }
   1346 
   1347 int cryptfs_crypto_complete(void)
   1348 {
   1349   return do_crypto_complete("/data");
   1350 }
   1351 
   1352 int cryptfs_check_passwd(char *passwd)
   1353 {
   1354     int rc = -1;
   1355 
   1356     rc = test_mount_encrypted_fs(passwd, DATA_MNT_POINT, "userdata");
   1357 
   1358     return rc;
   1359 }
   1360 
   1361 int cryptfs_verify_passwd(char *passwd)
   1362 {
   1363     struct crypt_mnt_ftr crypt_ftr;
   1364     /* Allocate enough space for a 256 bit key, but we may use less */
   1365     unsigned char decrypted_master_key[32];
   1366     char encrypted_state[PROPERTY_VALUE_MAX];
   1367     int rc;
   1368 
   1369     property_get("ro.crypto.state", encrypted_state, "");
   1370     if (strcmp(encrypted_state, "encrypted") ) {
   1371         SLOGE("device not encrypted, aborting");
   1372         return -2;
   1373     }
   1374 
   1375     if (!master_key_saved) {
   1376         SLOGE("encrypted fs not yet mounted, aborting");
   1377         return -1;
   1378     }
   1379 
   1380     if (!saved_mount_point) {
   1381         SLOGE("encrypted fs failed to save mount point, aborting");
   1382         return -1;
   1383     }
   1384 
   1385     if (get_crypt_ftr_and_key(&crypt_ftr)) {
   1386         SLOGE("Error getting crypt footer and key\n");
   1387         return -1;
   1388     }
   1389 
   1390     if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
   1391         /* If the device has no password, then just say the password is valid */
   1392         rc = 0;
   1393     } else {
   1394         decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr);
   1395         if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
   1396             /* They match, the password is correct */
   1397             rc = 0;
   1398         } else {
   1399             /* If incorrect, sleep for a bit to prevent dictionary attacks */
   1400             sleep(1);
   1401             rc = 1;
   1402         }
   1403     }
   1404 
   1405     return rc;
   1406 }
   1407 
   1408 /* Initialize a crypt_mnt_ftr structure.  The keysize is
   1409  * defaulted to 16 bytes, and the filesystem size to 0.
   1410  * Presumably, at a minimum, the caller will update the
   1411  * filesystem size and crypto_type_name after calling this function.
   1412  */
   1413 static void cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr *ftr)
   1414 {
   1415     off64_t off;
   1416 
   1417     memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
   1418     ftr->magic = CRYPT_MNT_MAGIC;
   1419     ftr->major_version = CURRENT_MAJOR_VERSION;
   1420     ftr->minor_version = CURRENT_MINOR_VERSION;
   1421     ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
   1422     ftr->keysize = KEY_LEN_BYTES;
   1423 
   1424     ftr->kdf_type = KDF_SCRYPT;
   1425     get_device_scrypt_params(ftr);
   1426 
   1427     ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
   1428     if (get_crypt_ftr_info(NULL, &off) == 0) {
   1429         ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
   1430         ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET +
   1431                                     ftr->persist_data_size;
   1432     }
   1433 }
   1434 
   1435 static int cryptfs_enable_wipe(char *crypto_blkdev, off64_t size, int type)
   1436 {
   1437     const char *args[10];
   1438     char size_str[32]; /* Must be large enough to hold a %lld and null byte */
   1439     int num_args;
   1440     int status;
   1441     int tmp;
   1442     int rc = -1;
   1443 
   1444     if (type == EXT4_FS) {
   1445         args[0] = "/system/bin/make_ext4fs";
   1446         args[1] = "-a";
   1447         args[2] = "/data";
   1448         args[3] = "-l";
   1449         snprintf(size_str, sizeof(size_str), "%lld", size * 512);
   1450         args[4] = size_str;
   1451         args[5] = crypto_blkdev;
   1452         num_args = 6;
   1453         SLOGI("Making empty filesystem with command %s %s %s %s %s %s\n",
   1454               args[0], args[1], args[2], args[3], args[4], args[5]);
   1455     } else if (type== FAT_FS) {
   1456         args[0] = "/system/bin/newfs_msdos";
   1457         args[1] = "-F";
   1458         args[2] = "32";
   1459         args[3] = "-O";
   1460         args[4] = "android";
   1461         args[5] = "-c";
   1462         args[6] = "8";
   1463         args[7] = "-s";
   1464         snprintf(size_str, sizeof(size_str), "%lld", size);
   1465         args[8] = size_str;
   1466         args[9] = crypto_blkdev;
   1467         num_args = 10;
   1468         SLOGI("Making empty filesystem with command %s %s %s %s %s %s %s %s %s %s\n",
   1469               args[0], args[1], args[2], args[3], args[4], args[5],
   1470               args[6], args[7], args[8], args[9]);
   1471     } else {
   1472         SLOGE("cryptfs_enable_wipe(): unknown filesystem type %d\n", type);
   1473         return -1;
   1474     }
   1475 
   1476     tmp = android_fork_execvp(num_args, (char **)args, &status, false, true);
   1477 
   1478     if (tmp != 0) {
   1479       SLOGE("Error creating empty filesystem on %s due to logwrap error\n", crypto_blkdev);
   1480     } else {
   1481         if (WIFEXITED(status)) {
   1482             if (WEXITSTATUS(status)) {
   1483                 SLOGE("Error creating filesystem on %s, exit status %d ",
   1484                       crypto_blkdev, WEXITSTATUS(status));
   1485             } else {
   1486                 SLOGD("Successfully created filesystem on %s\n", crypto_blkdev);
   1487                 rc = 0;
   1488             }
   1489         } else {
   1490             SLOGE("Error creating filesystem on %s, did not exit normally\n", crypto_blkdev);
   1491        }
   1492     }
   1493 
   1494     return rc;
   1495 }
   1496 
   1497 #define CRYPT_INPLACE_BUFSIZE 4096
   1498 #define CRYPT_SECTORS_PER_BUFSIZE (CRYPT_INPLACE_BUFSIZE / 512)
   1499 static int cryptfs_enable_inplace(char *crypto_blkdev, char *real_blkdev, off64_t size,
   1500                                   off64_t *size_already_done, off64_t tot_size)
   1501 {
   1502     int realfd, cryptofd;
   1503     char *buf[CRYPT_INPLACE_BUFSIZE];
   1504     int rc = -1;
   1505     off64_t numblocks, i, remainder;
   1506     off64_t one_pct, cur_pct, new_pct;
   1507     off64_t blocks_already_done, tot_numblocks;
   1508 
   1509     if ( (realfd = open(real_blkdev, O_RDONLY)) < 0) {
   1510         SLOGE("Error opening real_blkdev %s for inplace encrypt\n", real_blkdev);
   1511         return -1;
   1512     }
   1513 
   1514     if ( (cryptofd = open(crypto_blkdev, O_WRONLY)) < 0) {
   1515         SLOGE("Error opening crypto_blkdev %s for inplace encrypt\n", crypto_blkdev);
   1516         close(realfd);
   1517         return -1;
   1518     }
   1519 
   1520     /* This is pretty much a simple loop of reading 4K, and writing 4K.
   1521      * The size passed in is the number of 512 byte sectors in the filesystem.
   1522      * So compute the number of whole 4K blocks we should read/write,
   1523      * and the remainder.
   1524      */
   1525     numblocks = size / CRYPT_SECTORS_PER_BUFSIZE;
   1526     remainder = size % CRYPT_SECTORS_PER_BUFSIZE;
   1527     tot_numblocks = tot_size / CRYPT_SECTORS_PER_BUFSIZE;
   1528     blocks_already_done = *size_already_done / CRYPT_SECTORS_PER_BUFSIZE;
   1529 
   1530     SLOGE("Encrypting filesystem in place...");
   1531 
   1532     one_pct = tot_numblocks / 100;
   1533     cur_pct = 0;
   1534     /* process the majority of the filesystem in blocks */
   1535     for (i=0; i<numblocks; i++) {
   1536         new_pct = (i + blocks_already_done) / one_pct;
   1537         if (new_pct > cur_pct) {
   1538             char buf[8];
   1539 
   1540             cur_pct = new_pct;
   1541             snprintf(buf, sizeof(buf), "%lld", cur_pct);
   1542             property_set("vold.encrypt_progress", buf);
   1543         }
   1544         if (unix_read(realfd, buf, CRYPT_INPLACE_BUFSIZE) <= 0) {
   1545             SLOGE("Error reading real_blkdev %s for inplace encrypt\n", crypto_blkdev);
   1546             goto errout;
   1547         }
   1548         if (unix_write(cryptofd, buf, CRYPT_INPLACE_BUFSIZE) <= 0) {
   1549             SLOGE("Error writing crypto_blkdev %s for inplace encrypt\n", crypto_blkdev);
   1550             goto errout;
   1551         }
   1552     }
   1553 
   1554     /* Do any remaining sectors */
   1555     for (i=0; i<remainder; i++) {
   1556         if (unix_read(realfd, buf, 512) <= 0) {
   1557             SLOGE("Error reading rival sectors from real_blkdev %s for inplace encrypt\n", crypto_blkdev);
   1558             goto errout;
   1559         }
   1560         if (unix_write(cryptofd, buf, 512) <= 0) {
   1561             SLOGE("Error writing final sectors to crypto_blkdev %s for inplace encrypt\n", crypto_blkdev);
   1562             goto errout;
   1563         }
   1564     }
   1565 
   1566     *size_already_done += size;
   1567     rc = 0;
   1568 
   1569 errout:
   1570     close(realfd);
   1571     close(cryptofd);
   1572 
   1573     return rc;
   1574 }
   1575 
   1576 #define CRYPTO_ENABLE_WIPE 1
   1577 #define CRYPTO_ENABLE_INPLACE 2
   1578 
   1579 #define FRAMEWORK_BOOT_WAIT 60
   1580 
   1581 static inline int should_encrypt(struct volume_info *volume)
   1582 {
   1583     return (volume->flags & (VOL_ENCRYPTABLE | VOL_NONREMOVABLE)) ==
   1584             (VOL_ENCRYPTABLE | VOL_NONREMOVABLE);
   1585 }
   1586 
   1587 int cryptfs_enable(char *howarg, char *passwd)
   1588 {
   1589     int how = 0;
   1590     char crypto_blkdev[MAXPATHLEN], real_blkdev[MAXPATHLEN], sd_crypto_blkdev[MAXPATHLEN];
   1591     unsigned long nr_sec;
   1592     unsigned char decrypted_master_key[KEY_LEN_BYTES];
   1593     int rc=-1, fd, i, ret;
   1594     struct crypt_mnt_ftr crypt_ftr, sd_crypt_ftr;;
   1595     struct crypt_persist_data *pdata;
   1596     char tmpfs_options[PROPERTY_VALUE_MAX];
   1597     char encrypted_state[PROPERTY_VALUE_MAX];
   1598     char lockid[32] = { 0 };
   1599     char key_loc[PROPERTY_VALUE_MAX];
   1600     char fuse_sdcard[PROPERTY_VALUE_MAX];
   1601     char *sd_mnt_point;
   1602     char sd_blk_dev[256] = { 0 };
   1603     int num_vols;
   1604     struct volume_info *vol_list = 0;
   1605     off64_t cur_encryption_done=0, tot_encryption_size=0;
   1606 
   1607     property_get("ro.crypto.state", encrypted_state, "");
   1608     if (strcmp(encrypted_state, "unencrypted")) {
   1609         SLOGE("Device is already running encrypted, aborting");
   1610         goto error_unencrypted;
   1611     }
   1612 
   1613     fs_mgr_get_crypt_info(fstab, key_loc, 0, sizeof(key_loc));
   1614 
   1615     if (!strcmp(howarg, "wipe")) {
   1616       how = CRYPTO_ENABLE_WIPE;
   1617     } else if (! strcmp(howarg, "inplace")) {
   1618       how = CRYPTO_ENABLE_INPLACE;
   1619     } else {
   1620       /* Shouldn't happen, as CommandListener vets the args */
   1621       goto error_unencrypted;
   1622     }
   1623 
   1624     fs_mgr_get_crypt_info(fstab, 0, real_blkdev, sizeof(real_blkdev));
   1625 
   1626     /* Get the size of the real block device */
   1627     fd = open(real_blkdev, O_RDONLY);
   1628     if ( (nr_sec = get_blkdev_size(fd)) == 0) {
   1629         SLOGE("Cannot get size of block device %s\n", real_blkdev);
   1630         goto error_unencrypted;
   1631     }
   1632     close(fd);
   1633 
   1634     /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
   1635     if ((how == CRYPTO_ENABLE_INPLACE) && (!strcmp(key_loc, KEY_IN_FOOTER))) {
   1636         unsigned int fs_size_sec, max_fs_size_sec;
   1637 
   1638         fs_size_sec = get_fs_size(real_blkdev);
   1639         max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / 512);
   1640 
   1641         if (fs_size_sec > max_fs_size_sec) {
   1642             SLOGE("Orig filesystem overlaps crypto footer region.  Cannot encrypt in place.");
   1643             goto error_unencrypted;
   1644         }
   1645     }
   1646 
   1647     /* Get a wakelock as this may take a while, and we don't want the
   1648      * device to sleep on us.  We'll grab a partial wakelock, and if the UI
   1649      * wants to keep the screen on, it can grab a full wakelock.
   1650      */
   1651     snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int) getpid());
   1652     acquire_wake_lock(PARTIAL_WAKE_LOCK, lockid);
   1653 
   1654     /* Get the sdcard mount point */
   1655     sd_mnt_point = getenv("EMULATED_STORAGE_SOURCE");
   1656     if (!sd_mnt_point) {
   1657        sd_mnt_point = getenv("EXTERNAL_STORAGE");
   1658     }
   1659     if (!sd_mnt_point) {
   1660         sd_mnt_point = "/mnt/sdcard";
   1661     }
   1662 
   1663     num_vols=vold_getNumDirectVolumes();
   1664     vol_list = malloc(sizeof(struct volume_info) * num_vols);
   1665     vold_getDirectVolumeList(vol_list);
   1666 
   1667     for (i=0; i<num_vols; i++) {
   1668         if (should_encrypt(&vol_list[i])) {
   1669             fd = open(vol_list[i].blk_dev, O_RDONLY);
   1670             if ( (vol_list[i].size = get_blkdev_size(fd)) == 0) {
   1671                 SLOGE("Cannot get size of block device %s\n", vol_list[i].blk_dev);
   1672                 goto error_unencrypted;
   1673             }
   1674             close(fd);
   1675 
   1676             ret=vold_disableVol(vol_list[i].label);
   1677             if ((ret < 0) && (ret != UNMOUNT_NOT_MOUNTED_ERR)) {
   1678                 /* -2 is returned when the device exists but is not currently mounted.
   1679                  * ignore the error and continue. */
   1680                 SLOGE("Failed to unmount volume %s\n", vol_list[i].label);
   1681                 goto error_unencrypted;
   1682             }
   1683         }
   1684     }
   1685 
   1686     /* The init files are setup to stop the class main and late start when
   1687      * vold sets trigger_shutdown_framework.
   1688      */
   1689     property_set("vold.decrypt", "trigger_shutdown_framework");
   1690     SLOGD("Just asked init to shut down class main\n");
   1691 
   1692     if (vold_unmountAllAsecs()) {
   1693         /* Just report the error.  If any are left mounted,
   1694          * umounting /data below will fail and handle the error.
   1695          */
   1696         SLOGE("Error unmounting internal asecs");
   1697     }
   1698 
   1699     property_get("ro.crypto.fuse_sdcard", fuse_sdcard, "");
   1700     if (!strcmp(fuse_sdcard, "true")) {
   1701         /* This is a device using the fuse layer to emulate the sdcard semantics
   1702          * on top of the userdata partition.  vold does not manage it, it is managed
   1703          * by the sdcard service.  The sdcard service was killed by the property trigger
   1704          * above, so just unmount it now.  We must do this _AFTER_ killing the framework,
   1705          * unlike the case for vold managed devices above.
   1706          */
   1707         if (wait_and_unmount(sd_mnt_point)) {
   1708             goto error_shutting_down;
   1709         }
   1710     }
   1711 
   1712     /* Now unmount the /data partition. */
   1713     if (wait_and_unmount(DATA_MNT_POINT)) {
   1714         goto error_shutting_down;
   1715     }
   1716 
   1717     /* Do extra work for a better UX when doing the long inplace encryption */
   1718     if (how == CRYPTO_ENABLE_INPLACE) {
   1719         /* Now that /data is unmounted, we need to mount a tmpfs
   1720          * /data, set a property saying we're doing inplace encryption,
   1721          * and restart the framework.
   1722          */
   1723         if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
   1724             goto error_shutting_down;
   1725         }
   1726         /* Tells the framework that inplace encryption is starting */
   1727         property_set("vold.encrypt_progress", "0");
   1728 
   1729         /* restart the framework. */
   1730         /* Create necessary paths on /data */
   1731         if (prep_data_fs()) {
   1732             goto error_shutting_down;
   1733         }
   1734 
   1735         /* Ugh, shutting down the framework is not synchronous, so until it
   1736          * can be fixed, this horrible hack will wait a moment for it all to
   1737          * shut down before proceeding.  Without it, some devices cannot
   1738          * restart the graphics services.
   1739          */
   1740         sleep(2);
   1741 
   1742         /* startup service classes main and late_start */
   1743         property_set("vold.decrypt", "trigger_restart_min_framework");
   1744         SLOGD("Just triggered restart_min_framework\n");
   1745 
   1746         /* OK, the framework is restarted and will soon be showing a
   1747          * progress bar.  Time to setup an encrypted mapping, and
   1748          * either write a new filesystem, or encrypt in place updating
   1749          * the progress bar as we work.
   1750          */
   1751     }
   1752 
   1753     /* Start the actual work of making an encrypted filesystem */
   1754     /* Initialize a crypt_mnt_ftr for the partition */
   1755     cryptfs_init_crypt_mnt_ftr(&crypt_ftr);
   1756 
   1757     if (!strcmp(key_loc, KEY_IN_FOOTER)) {
   1758         crypt_ftr.fs_size = nr_sec - (CRYPT_FOOTER_OFFSET / 512);
   1759     } else {
   1760         crypt_ftr.fs_size = nr_sec;
   1761     }
   1762     crypt_ftr.flags |= CRYPT_ENCRYPTION_IN_PROGRESS;
   1763     strcpy((char *)crypt_ftr.crypto_type_name, "aes-cbc-essiv:sha256");
   1764 
   1765     /* Make an encrypted master key */
   1766     if (create_encrypted_random_key(passwd, crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
   1767         SLOGE("Cannot create encrypted master key\n");
   1768         goto error_unencrypted;
   1769     }
   1770 
   1771     /* Write the key to the end of the partition */
   1772     put_crypt_ftr_and_key(&crypt_ftr);
   1773 
   1774     /* If any persistent data has been remembered, save it.
   1775      * If none, create a valid empty table and save that.
   1776      */
   1777     if (!persist_data) {
   1778        pdata = malloc(CRYPT_PERSIST_DATA_SIZE);
   1779        if (pdata) {
   1780            init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
   1781            persist_data = pdata;
   1782        }
   1783     }
   1784     if (persist_data) {
   1785         save_persistent_data();
   1786     }
   1787 
   1788     decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr);
   1789     create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev,
   1790                           "userdata");
   1791 
   1792     /* The size of the userdata partition, and add in the vold volumes below */
   1793     tot_encryption_size = crypt_ftr.fs_size;
   1794 
   1795     /* setup crypto mapping for all encryptable volumes handled by vold */
   1796     for (i=0; i<num_vols; i++) {
   1797         if (should_encrypt(&vol_list[i])) {
   1798             vol_list[i].crypt_ftr = crypt_ftr; /* gotta love struct assign */
   1799             vol_list[i].crypt_ftr.fs_size = vol_list[i].size;
   1800             create_crypto_blk_dev(&vol_list[i].crypt_ftr, decrypted_master_key,
   1801                                   vol_list[i].blk_dev, vol_list[i].crypto_blkdev,
   1802                                   vol_list[i].label);
   1803             tot_encryption_size += vol_list[i].size;
   1804         }
   1805     }
   1806 
   1807     if (how == CRYPTO_ENABLE_WIPE) {
   1808         rc = cryptfs_enable_wipe(crypto_blkdev, crypt_ftr.fs_size, EXT4_FS);
   1809         /* Encrypt all encryptable volumes handled by vold */
   1810         if (!rc) {
   1811             for (i=0; i<num_vols; i++) {
   1812                 if (should_encrypt(&vol_list[i])) {
   1813                     rc = cryptfs_enable_wipe(vol_list[i].crypto_blkdev,
   1814                                              vol_list[i].crypt_ftr.fs_size, FAT_FS);
   1815                 }
   1816             }
   1817         }
   1818     } else if (how == CRYPTO_ENABLE_INPLACE) {
   1819         rc = cryptfs_enable_inplace(crypto_blkdev, real_blkdev, crypt_ftr.fs_size,
   1820                                     &cur_encryption_done, tot_encryption_size);
   1821         /* Encrypt all encryptable volumes handled by vold */
   1822         if (!rc) {
   1823             for (i=0; i<num_vols; i++) {
   1824                 if (should_encrypt(&vol_list[i])) {
   1825                     rc = cryptfs_enable_inplace(vol_list[i].crypto_blkdev,
   1826                                                 vol_list[i].blk_dev,
   1827                                                 vol_list[i].crypt_ftr.fs_size,
   1828                                                 &cur_encryption_done, tot_encryption_size);
   1829                 }
   1830             }
   1831         }
   1832         if (!rc) {
   1833             /* The inplace routine never actually sets the progress to 100%
   1834              * due to the round down nature of integer division, so set it here */
   1835             property_set("vold.encrypt_progress", "100");
   1836         }
   1837     } else {
   1838         /* Shouldn't happen */
   1839         SLOGE("cryptfs_enable: internal error, unknown option\n");
   1840         goto error_unencrypted;
   1841     }
   1842 
   1843     /* Undo the dm-crypt mapping whether we succeed or not */
   1844     delete_crypto_blk_dev("userdata");
   1845     for (i=0; i<num_vols; i++) {
   1846         if (should_encrypt(&vol_list[i])) {
   1847             delete_crypto_blk_dev(vol_list[i].label);
   1848         }
   1849     }
   1850 
   1851     free(vol_list);
   1852 
   1853     if (! rc) {
   1854         /* Success */
   1855 
   1856         /* Clear the encryption in progres flag in the footer */
   1857         crypt_ftr.flags &= ~CRYPT_ENCRYPTION_IN_PROGRESS;
   1858         put_crypt_ftr_and_key(&crypt_ftr);
   1859 
   1860         sleep(2); /* Give the UI a chance to show 100% progress */
   1861         cryptfs_reboot(0);
   1862     } else {
   1863         char value[PROPERTY_VALUE_MAX];
   1864 
   1865         property_get("ro.vold.wipe_on_crypt_fail", value, "0");
   1866         if (!strcmp(value, "1")) {
   1867             /* wipe data if encryption failed */
   1868             SLOGE("encryption failed - rebooting into recovery to wipe data\n");
   1869             mkdir("/cache/recovery", 0700);
   1870             int fd = open("/cache/recovery/command", O_RDWR|O_CREAT|O_TRUNC, 0600);
   1871             if (fd >= 0) {
   1872                 write(fd, "--wipe_data", strlen("--wipe_data") + 1);
   1873                 close(fd);
   1874             } else {
   1875                 SLOGE("could not open /cache/recovery/command\n");
   1876             }
   1877             cryptfs_reboot(1);
   1878         } else {
   1879             /* set property to trigger dialog */
   1880             property_set("vold.encrypt_progress", "error_partially_encrypted");
   1881             release_wake_lock(lockid);
   1882         }
   1883         return -1;
   1884     }
   1885 
   1886     /* hrm, the encrypt step claims success, but the reboot failed.
   1887      * This should not happen.
   1888      * Set the property and return.  Hope the framework can deal with it.
   1889      */
   1890     property_set("vold.encrypt_progress", "error_reboot_failed");
   1891     release_wake_lock(lockid);
   1892     return rc;
   1893 
   1894 error_unencrypted:
   1895     free(vol_list);
   1896     property_set("vold.encrypt_progress", "error_not_encrypted");
   1897     if (lockid[0]) {
   1898         release_wake_lock(lockid);
   1899     }
   1900     return -1;
   1901 
   1902 error_shutting_down:
   1903     /* we failed, and have not encrypted anthing, so the users's data is still intact,
   1904      * but the framework is stopped and not restarted to show the error, so it's up to
   1905      * vold to restart the system.
   1906      */
   1907     SLOGE("Error enabling encryption after framework is shutdown, no data changed, restarting system");
   1908     cryptfs_reboot(0);
   1909 
   1910     /* shouldn't get here */
   1911     property_set("vold.encrypt_progress", "error_shutting_down");
   1912     free(vol_list);
   1913     if (lockid[0]) {
   1914         release_wake_lock(lockid);
   1915     }
   1916     return -1;
   1917 }
   1918 
   1919 int cryptfs_changepw(char *newpw)
   1920 {
   1921     struct crypt_mnt_ftr crypt_ftr;
   1922     unsigned char decrypted_master_key[KEY_LEN_BYTES];
   1923 
   1924     /* This is only allowed after we've successfully decrypted the master key */
   1925     if (! master_key_saved) {
   1926         SLOGE("Key not saved, aborting");
   1927         return -1;
   1928     }
   1929 
   1930     /* get key */
   1931     if (get_crypt_ftr_and_key(&crypt_ftr)) {
   1932       SLOGE("Error getting crypt footer and key");
   1933       return -1;
   1934     }
   1935 
   1936     encrypt_master_key(newpw, crypt_ftr.salt, saved_master_key, crypt_ftr.master_key, &crypt_ftr);
   1937 
   1938     /* save the key */
   1939     put_crypt_ftr_and_key(&crypt_ftr);
   1940 
   1941     return 0;
   1942 }
   1943 
   1944 static int persist_get_key(char *fieldname, char *value)
   1945 {
   1946     unsigned int i;
   1947 
   1948     if (persist_data == NULL) {
   1949         return -1;
   1950     }
   1951     for (i = 0; i < persist_data->persist_valid_entries; i++) {
   1952         if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
   1953             /* We found it! */
   1954             strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
   1955             return 0;
   1956         }
   1957     }
   1958 
   1959     return -1;
   1960 }
   1961 
   1962 static int persist_set_key(char *fieldname, char *value, int encrypted)
   1963 {
   1964     unsigned int i;
   1965     unsigned int num;
   1966     struct crypt_mnt_ftr crypt_ftr;
   1967     unsigned int max_persistent_entries;
   1968     unsigned int dsize;
   1969 
   1970     if (persist_data == NULL) {
   1971         return -1;
   1972     }
   1973 
   1974     /* If encrypted, use the values from the crypt_ftr, otherwise
   1975      * use the values for the current spec.
   1976      */
   1977     if (encrypted) {
   1978         if(get_crypt_ftr_and_key(&crypt_ftr)) {
   1979             return -1;
   1980         }
   1981         dsize = crypt_ftr.persist_data_size;
   1982     } else {
   1983         dsize = CRYPT_PERSIST_DATA_SIZE;
   1984     }
   1985     max_persistent_entries = (dsize - sizeof(struct crypt_persist_data)) /
   1986                              sizeof(struct crypt_persist_entry);
   1987 
   1988     num = persist_data->persist_valid_entries;
   1989 
   1990     for (i = 0; i < num; i++) {
   1991         if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
   1992             /* We found an existing entry, update it! */
   1993             memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
   1994             strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
   1995             return 0;
   1996         }
   1997     }
   1998 
   1999     /* We didn't find it, add it to the end, if there is room */
   2000     if (persist_data->persist_valid_entries < max_persistent_entries) {
   2001         memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
   2002         strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
   2003         strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
   2004         persist_data->persist_valid_entries++;
   2005         return 0;
   2006     }
   2007 
   2008     return -1;
   2009 }
   2010 
   2011 /* Return the value of the specified field. */
   2012 int cryptfs_getfield(char *fieldname, char *value, int len)
   2013 {
   2014     char temp_value[PROPERTY_VALUE_MAX];
   2015     char real_blkdev[MAXPATHLEN];
   2016     /* 0 is success, 1 is not encrypted,
   2017      * -1 is value not set, -2 is any other error
   2018      */
   2019     int rc = -2;
   2020 
   2021     if (persist_data == NULL) {
   2022         load_persistent_data();
   2023         if (persist_data == NULL) {
   2024             SLOGE("Getfield error, cannot load persistent data");
   2025             goto out;
   2026         }
   2027     }
   2028 
   2029     if (!persist_get_key(fieldname, temp_value)) {
   2030         /* We found it, copy it to the caller's buffer and return */
   2031         strlcpy(value, temp_value, len);
   2032         rc = 0;
   2033     } else {
   2034         /* Sadness, it's not there.  Return the error */
   2035         rc = -1;
   2036     }
   2037 
   2038 out:
   2039     return rc;
   2040 }
   2041 
   2042 /* Set the value of the specified field. */
   2043 int cryptfs_setfield(char *fieldname, char *value)
   2044 {
   2045     struct crypt_persist_data stored_pdata;
   2046     struct crypt_persist_data *pdata_p;
   2047     struct crypt_mnt_ftr crypt_ftr;
   2048     char encrypted_state[PROPERTY_VALUE_MAX];
   2049     /* 0 is success, -1 is an error */
   2050     int rc = -1;
   2051     int encrypted = 0;
   2052 
   2053     if (persist_data == NULL) {
   2054         load_persistent_data();
   2055         if (persist_data == NULL) {
   2056             SLOGE("Setfield error, cannot load persistent data");
   2057             goto out;
   2058         }
   2059     }
   2060 
   2061     property_get("ro.crypto.state", encrypted_state, "");
   2062     if (!strcmp(encrypted_state, "encrypted") ) {
   2063         encrypted = 1;
   2064     }
   2065 
   2066     if (persist_set_key(fieldname, value, encrypted)) {
   2067         goto out;
   2068     }
   2069 
   2070     /* If we are running encrypted, save the persistent data now */
   2071     if (encrypted) {
   2072         if (save_persistent_data()) {
   2073             SLOGE("Setfield error, cannot save persistent data");
   2074             goto out;
   2075         }
   2076     }
   2077 
   2078     rc = 0;
   2079 
   2080 out:
   2081     return rc;
   2082 }
   2083