blob: 0d1ceec31075d250627a5ced66eaf57fad762fef [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
Logan Chiend557d762018-05-02 11:36:45 +080017#define LOG_TAG "Cryptfs"
18
19#include "cryptfs.h"
20
Daniel Rosenberg4f684712018-08-28 01:58:49 -070021#include "Checkpoint.h"
Paul Crowley220567c2020-02-07 12:45:20 -080022#include "CryptoType.h"
Logan Chiend557d762018-05-02 11:36:45 +080023#include "EncryptInplace.h"
Eric Biggersa701c452018-10-23 13:06:55 -070024#include "FsCrypt.h"
Logan Chiend557d762018-05-02 11:36:45 +080025#include "Keymaster.h"
26#include "Process.h"
27#include "ScryptParameters.h"
Paul Crowley298fa322018-10-30 15:59:24 -070028#include "Utils.h"
Logan Chiend557d762018-05-02 11:36:45 +080029#include "VoldUtil.h"
30#include "VolumeManager.h"
Logan Chiend557d762018-05-02 11:36:45 +080031
Daniel Normanbe0137a2021-04-28 12:37:42 -070032#include <android-base/logging.h>
Eric Biggersed45ec32019-01-25 10:47:55 -080033#include <android-base/parseint.h>
Logan Chien3f2b1222018-05-02 11:39:03 +080034#include <android-base/properties.h>
Greg Kaiserab1e84a2018-12-11 12:40:51 -080035#include <android-base/stringprintf.h>
Hyangseok Chae79b03ff2020-02-27 18:21:50 +090036#include <android-base/strings.h>
Logan Chiend557d762018-05-02 11:36:45 +080037#include <bootloader_message/bootloader_message.h>
Logan Chien3f2b1222018-05-02 11:39:03 +080038#include <cutils/android_reboot.h>
Logan Chien3f2b1222018-05-02 11:39:03 +080039#include <cutils/properties.h>
Tao Bao5a95ddb2016-10-05 18:01:19 -070040#include <ext4_utils/ext4_utils.h>
Logan Chien3f2b1222018-05-02 11:39:03 +080041#include <f2fs_sparseblock.h>
Ken Sumralle5032c42012-04-01 23:58:44 -070042#include <fs_mgr.h>
Eric Biggersa701c452018-10-23 13:06:55 -070043#include <fscrypt/fscrypt.h>
David Andersonb9224732019-05-13 13:02:54 -070044#include <libdm/dm.h>
Logan Chien188b0ab2018-04-23 13:37:39 +080045#include <log/log.h>
Ken Sumralle550f782013-08-20 13:48:23 -070046#include <logwrap/logwrap.h>
Logan Chiend557d762018-05-02 11:36:45 +080047#include <openssl/evp.h>
48#include <openssl/sha.h>
Ken Sumrallc290eaf2011-03-07 23:40:35 -080049#include <selinux/selinux.h>
Tri Vo15bbe222019-06-21 12:21:48 -070050#include <wakelock/wakelock.h>
Logan Chiend557d762018-05-02 11:36:45 +080051
52#include <ctype.h>
53#include <errno.h>
54#include <fcntl.h>
55#include <inttypes.h>
56#include <libgen.h>
Logan Chiend557d762018-05-02 11:36:45 +080057#include <linux/kdev_t.h>
58#include <math.h>
Hyangseok Chae79b03ff2020-02-27 18:21:50 +090059#include <mntent.h>
Logan Chiend557d762018-05-02 11:36:45 +080060#include <stdio.h>
61#include <stdlib.h>
62#include <string.h>
Logan Chiend557d762018-05-02 11:36:45 +080063#include <sys/mount.h>
64#include <sys/param.h>
65#include <sys/stat.h>
66#include <sys/types.h>
67#include <sys/wait.h>
68#include <time.h>
69#include <unistd.h>
70
Martijn Coenen26ad7b32020-02-13 16:20:52 +010071#include <chrono>
72#include <thread>
73
AnilKumar Chimata98dc8352018-05-11 00:25:09 +053074#ifdef CONFIG_HW_DISK_ENCRYPTION
Neeraj Soni73b46952019-09-12 16:47:27 +053075#include <linux/dm-ioctl.h>
76#include <sys/ioctl.h>
AnilKumar Chimata98dc8352018-05-11 00:25:09 +053077#include <cryptfs_hw.h>
78#endif
Wei Wang4375f1b2017-02-24 17:43:01 -080079extern "C" {
80#include <crypto_scrypt.h>
81}
Mark Salyzyn3e971272014-01-21 13:27:04 -080082
Eric Biggersed45ec32019-01-25 10:47:55 -080083using android::base::ParseUint;
Greg Kaiserab1e84a2018-12-11 12:40:51 -080084using android::base::StringPrintf;
Tom Cherry4c5bde22019-01-29 14:34:01 -080085using android::fs_mgr::GetEntryForMountPoint;
Paul Crowley220567c2020-02-07 12:45:20 -080086using android::vold::CryptoType;
Paul Crowley3d98f5d2020-02-07 11:49:09 -080087using android::vold::KeyBuffer;
Paul Crowleyb3d018a2020-02-12 11:04:05 -080088using android::vold::KeyGeneration;
Daniel Normanbe0137a2021-04-28 12:37:42 -070089using namespace android::vold;
David Andersonb9224732019-05-13 13:02:54 -070090using namespace android::dm;
Paul Crowley298fa322018-10-30 15:59:24 -070091using namespace std::chrono_literals;
92
Paul Crowley73be12d2020-02-03 12:22:03 -080093/* The current cryptfs version */
94#define CURRENT_MAJOR_VERSION 1
95#define CURRENT_MINOR_VERSION 3
96
97#define CRYPT_FOOTER_TO_PERSIST_OFFSET 0x1000
98#define CRYPT_PERSIST_DATA_SIZE 0x1000
99
Eric Biggersf038c5f2020-11-03 14:11:02 -0800100#define CRYPT_SECTOR_SIZE 512
101
Paul Crowley73be12d2020-02-03 12:22:03 -0800102#define MAX_CRYPTO_TYPE_NAME_LEN 64
103
104#define MAX_KEY_LEN 48
105#define SALT_LEN 16
106#define SCRYPT_LEN 32
107
108/* definitions of flags in the structure below */
109#define CRYPT_MNT_KEY_UNENCRYPTED 0x1 /* The key for the partition is not encrypted. */
Eric Biggersc01995e2020-11-03 14:11:00 -0800110#define CRYPT_ENCRYPTION_IN_PROGRESS 0x2 /* no longer used */
Paul Crowley73be12d2020-02-03 12:22:03 -0800111#define CRYPT_INCONSISTENT_STATE \
112 0x4 /* Set when starting encryption, clear when \
113 exit cleanly, either through success or \
114 correctly marked partial encryption */
115#define CRYPT_DATA_CORRUPT \
116 0x8 /* Set when encryption is fine, but the \
117 underlying volume is corrupt */
118#define CRYPT_FORCE_ENCRYPTION \
119 0x10 /* Set when it is time to encrypt this \
120 volume on boot. Everything in this \
121 structure is set up correctly as \
122 though device is encrypted except \
123 that the master key is encrypted with the \
124 default password. */
125#define CRYPT_FORCE_COMPLETE \
126 0x20 /* Set when the above encryption cycle is \
127 complete. On next cryptkeeper entry, match \
128 the password. If it matches fix the master \
129 key and remove this flag. */
130
131/* Allowed values for type in the structure below */
132#define CRYPT_TYPE_PASSWORD \
133 0 /* master_key is encrypted with a password \
134 * Must be zero to be compatible with pre-L \
135 * devices where type is always password.*/
136#define CRYPT_TYPE_DEFAULT \
137 1 /* master_key is encrypted with default \
138 * password */
139#define CRYPT_TYPE_PATTERN 2 /* master_key is encrypted with a pattern */
140#define CRYPT_TYPE_PIN 3 /* master_key is encrypted with a pin */
141#define CRYPT_TYPE_MAX_TYPE 3 /* type cannot be larger than this value */
142
143#define CRYPT_MNT_MAGIC 0xD0B5B1C4
144#define PERSIST_DATA_MAGIC 0xE950CD44
145
146/* Key Derivation Function algorithms */
147#define KDF_PBKDF2 1
148#define KDF_SCRYPT 2
149/* Algorithms 3 & 4 deprecated before shipping outside of google, so removed */
150#define KDF_SCRYPT_KEYMASTER 5
151
152/* Maximum allowed keymaster blob size. */
153#define KEYMASTER_BLOB_SIZE 2048
154
155/* __le32 and __le16 defined in system/extras/ext4_utils/ext4_utils.h */
156#define __le8 unsigned char
157
158#if !defined(SHA256_DIGEST_LENGTH)
159#define SHA256_DIGEST_LENGTH 32
160#endif
161
162/* This structure starts 16,384 bytes before the end of a hardware
163 * partition that is encrypted, or in a separate partition. It's location
164 * is specified by a property set in init.<device>.rc.
165 * The structure allocates 48 bytes for a key, but the real key size is
166 * specified in the struct. Currently, the code is hardcoded to use 128
167 * bit keys.
168 * The fields after salt are only valid in rev 1.1 and later stuctures.
169 * Obviously, the filesystem does not include the last 16 kbytes
170 * of the partition if the crypt_mnt_ftr lives at the end of the
171 * partition.
172 */
173
174struct crypt_mnt_ftr {
175 __le32 magic; /* See above */
176 __le16 major_version;
177 __le16 minor_version;
178 __le32 ftr_size; /* in bytes, not including key following */
179 __le32 flags; /* See above */
180 __le32 keysize; /* in bytes */
181 __le32 crypt_type; /* how master_key is encrypted. Must be a
182 * CRYPT_TYPE_XXX value */
183 __le64 fs_size; /* Size of the encrypted fs, in 512 byte sectors */
184 __le32 failed_decrypt_count; /* count of # of failed attempts to decrypt and
185 mount, set to 0 on successful mount */
186 unsigned char crypto_type_name[MAX_CRYPTO_TYPE_NAME_LEN]; /* The type of encryption
187 needed to decrypt this
188 partition, null terminated */
189 __le32 spare2; /* ignored */
190 unsigned char master_key[MAX_KEY_LEN]; /* The encrypted key for decrypting the filesystem */
191 unsigned char salt[SALT_LEN]; /* The salt used for this encryption */
192 __le64 persist_data_offset[2]; /* Absolute offset to both copies of crypt_persist_data
193 * on device with that info, either the footer of the
194 * real_blkdevice or the metadata partition. */
195
196 __le32 persist_data_size; /* The number of bytes allocated to each copy of the
197 * persistent data table*/
198
199 __le8 kdf_type; /* The key derivation function used. */
200
201 /* scrypt parameters. See www.tarsnap.com/scrypt/scrypt.pdf */
202 __le8 N_factor; /* (1 << N) */
203 __le8 r_factor; /* (1 << r) */
204 __le8 p_factor; /* (1 << p) */
Eric Biggersc01995e2020-11-03 14:11:00 -0800205 __le64 encrypted_upto; /* no longer used */
206 __le8 hash_first_block[SHA256_DIGEST_LENGTH]; /* no longer used */
Paul Crowley73be12d2020-02-03 12:22:03 -0800207
208 /* key_master key, used to sign the derived key which is then used to generate
209 * the intermediate key
210 * This key should be used for no other purposes! We use this key to sign unpadded
211 * data, which is acceptable but only if the key is not reused elsewhere. */
212 __le8 keymaster_blob[KEYMASTER_BLOB_SIZE];
213 __le32 keymaster_blob_size;
214
215 /* Store scrypt of salted intermediate key. When decryption fails, we can
216 check if this matches, and if it does, we know that the problem is with the
217 drive, and there is no point in asking the user for more passwords.
218
219 Note that if any part of this structure is corrupt, this will not match and
220 we will continue to believe the user entered the wrong password. In that
221 case the only solution is for the user to enter a password enough times to
222 force a wipe.
223
224 Note also that there is no need to worry about migration. If this data is
225 wrong, we simply won't recognise a right password, and will continue to
226 prompt. On the first password change, this value will be populated and
227 then we will be OK.
228 */
229 unsigned char scrypted_intermediate_key[SCRYPT_LEN];
230
231 /* sha of this structure with this element set to zero
232 Used when encrypting on reboot to validate structure before doing something
233 fatal
234 */
235 unsigned char sha256[SHA256_DIGEST_LENGTH];
236};
237
238/* Persistant data that should be available before decryption.
239 * Things like airplane mode, locale and timezone are kept
240 * here and can be retrieved by the CryptKeeper UI to properly
241 * configure the phone before asking for the password
242 * This is only valid if the major and minor version above
243 * is set to 1.1 or higher.
244 *
245 * This is a 4K structure. There are 2 copies, and the code alternates
246 * writing one and then clearing the previous one. The reading
247 * code reads the first valid copy it finds, based on the magic number.
248 * The absolute offset to the first of the two copies is kept in rev 1.1
249 * and higher crypt_mnt_ftr structures.
250 */
251struct crypt_persist_entry {
252 char key[PROPERTY_KEY_MAX];
253 char val[PROPERTY_VALUE_MAX];
254};
255
256/* Should be exactly 4K in size */
257struct crypt_persist_data {
258 __le32 persist_magic;
259 __le32 persist_valid_entries;
260 __le32 persist_spare[30];
261 struct crypt_persist_entry persist_entry[0];
262};
263
Paul Crowley73be12d2020-02-03 12:22:03 -0800264typedef int (*kdf_func)(const char* passwd, const unsigned char* salt, unsigned char* ikey,
265 void* params);
266
Mark Salyzyn5eecc442014-02-12 14:16:14 -0800267#define UNUSED __attribute__((unused))
268
Jason parks70a4b3f2011-01-28 10:10:47 -0600269#define HASH_COUNT 2000
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800270
271constexpr size_t INTERMEDIATE_KEY_LEN_BYTES = 16;
272constexpr size_t INTERMEDIATE_IV_LEN_BYTES = 16;
Paul Crowley14c8c072018-09-18 13:30:21 -0700273constexpr size_t INTERMEDIATE_BUF_SIZE = (INTERMEDIATE_KEY_LEN_BYTES + INTERMEDIATE_IV_LEN_BYTES);
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800274
275// SCRYPT_LEN is used by struct crypt_mnt_ftr for its intermediate key.
Paul Crowley14c8c072018-09-18 13:30:21 -0700276static_assert(INTERMEDIATE_BUF_SIZE == SCRYPT_LEN, "Mismatch of intermediate key sizes");
Jason parks70a4b3f2011-01-28 10:10:47 -0600277
Paul Crowley14c8c072018-09-18 13:30:21 -0700278#define KEY_IN_FOOTER "footer"
Ken Sumrall29d8da82011-05-18 17:20:07 -0700279
AnilKumar Chimata98dc8352018-05-11 00:25:09 +0530280#define DEFAULT_HEX_PASSWORD "64656661756c745f70617373776f7264"
Paul Lawrence3bd36d52015-06-09 13:37:44 -0700281#define DEFAULT_PASSWORD "default_password"
Paul Lawrencef4faa572014-01-29 13:31:03 -0800282
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800283#define CRYPTO_BLOCK_DEVICE "userdata"
284
285#define BREADCRUMB_FILE "/data/misc/vold/convert_fde"
286
Ken Sumrall29d8da82011-05-18 17:20:07 -0700287#define EXT4_FS 1
JP Abgrall62c7af32014-06-16 13:01:23 -0700288#define F2FS_FS 2
Ken Sumrall29d8da82011-05-18 17:20:07 -0700289
Ken Sumralle919efe2012-09-29 17:07:41 -0700290#define TABLE_LOAD_RETRIES 10
291
Shawn Willden47ba10d2014-09-03 17:07:06 -0600292#define RSA_KEY_SIZE 2048
293#define RSA_KEY_SIZE_BYTES (RSA_KEY_SIZE / 8)
294#define RSA_EXPONENT 0x10001
Shawn Willdenda6e8992015-06-03 09:40:45 -0600295#define KEYMASTER_CRYPTFS_RATE_LIMIT 1 // Maximum one try per second
AnilKumar Chimata98dc8352018-05-11 00:25:09 +0530296#define KEY_LEN_BYTES 16
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700297
Paul Lawrence8e3f4512014-09-08 10:11:17 -0700298#define RETRY_MOUNT_ATTEMPTS 10
299#define RETRY_MOUNT_DELAY_SECONDS 1
300
Paul Crowley5afbc622017-11-27 09:42:17 -0800301#define CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE (1)
302
Paul Crowley73473332017-11-21 15:43:51 -0800303static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr);
304
Greg Kaiser59ad0182018-02-16 13:01:36 -0800305static unsigned char saved_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -0700306static char* saved_mount_point;
307static int master_key_saved = 0;
308static struct crypt_persist_data* persist_data = NULL;
Ken Sumrall56ad03c2013-02-13 13:00:19 -0800309
AnilKumar Chimata98dc8352018-05-11 00:25:09 +0530310static int previous_type;
311
312#ifdef CONFIG_HW_DISK_ENCRYPTION
313static int scrypt_keymaster(const char *passwd, const unsigned char *salt,
314 unsigned char *ikey, void *params);
315static void convert_key_to_hex_ascii(const unsigned char *master_key,
316 unsigned int keysize, char *master_key_ascii);
317static int put_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr);
318static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
319 const char *passwd, const char *mount_point, const char *label);
320int cryptfs_changepw_hw_fde(int crypt_type, const char *currentpw,
321 const char *newpw);
322int cryptfs_check_passwd_hw(char *passwd);
323int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password,
324 unsigned char* master_key);
325
326static void convert_key_to_hex_ascii_for_upgrade(const unsigned char *master_key,
327 unsigned int keysize, char *master_key_ascii)
328{
329 unsigned int i, a;
330 unsigned char nibble;
331
332 for (i = 0, a = 0; i < keysize; i++, a += 2) {
333 /* For each byte, write out two ascii hex digits */
334 nibble = (master_key[i] >> 4) & 0xf;
335 master_key_ascii[a] = nibble + (nibble > 9 ? 0x57 : 0x30);
336
337 nibble = master_key[i] & 0xf;
338 master_key_ascii[a + 1] = nibble + (nibble > 9 ? 0x57 : 0x30);
339 }
340
341 /* Add the null termination */
342 master_key_ascii[a] = '\0';
343}
344
345static int get_keymaster_hw_fde_passwd(const char* passwd, unsigned char* newpw,
346 unsigned char* salt,
347 const struct crypt_mnt_ftr *ftr)
348{
349 /* if newpw updated, return 0
350 * if newpw not updated return -1
351 */
352 int rc = -1;
353
354 if (should_use_keymaster()) {
355 if (scrypt_keymaster(passwd, salt, newpw, (void*)ftr)) {
356 SLOGE("scrypt failed");
357 } else {
358 rc = 0;
359 }
360 }
361
362 return rc;
363}
364
365static int verify_hw_fde_passwd(const char *passwd, struct crypt_mnt_ftr* crypt_ftr)
366{
367 unsigned char newpw[32] = {0};
368 int key_index;
369 if (get_keymaster_hw_fde_passwd(passwd, newpw, crypt_ftr->salt, crypt_ftr))
370 key_index = set_hw_device_encryption_key(passwd,
371 (char*) crypt_ftr->crypto_type_name);
372 else
373 key_index = set_hw_device_encryption_key((const char*)newpw,
374 (char*) crypt_ftr->crypto_type_name);
375 return key_index;
376}
377
378static int verify_and_update_hw_fde_passwd(const char *passwd,
379 struct crypt_mnt_ftr* crypt_ftr)
380{
381 char* new_passwd = NULL;
382 unsigned char newpw[32] = {0};
383 int key_index = -1;
384 int passwd_updated = -1;
385 int ascii_passwd_updated = (crypt_ftr->flags & CRYPT_ASCII_PASSWORD_UPDATED);
386
387 key_index = verify_hw_fde_passwd(passwd, crypt_ftr);
388 if (key_index < 0) {
389 ++crypt_ftr->failed_decrypt_count;
390
391 if (ascii_passwd_updated) {
392 SLOGI("Ascii password was updated");
393 } else {
394 /* Code in else part would execute only once:
395 * When device is upgraded from L->M release.
396 * Once upgraded, code flow should never come here.
397 * L release passed actual password in hex, so try with hex
398 * Each nible of passwd was encoded as a byte, so allocate memory
399 * twice of password len plus one more byte for null termination
400 */
401 if (crypt_ftr->crypt_type == CRYPT_TYPE_DEFAULT) {
402 new_passwd = (char*)malloc(strlen(DEFAULT_HEX_PASSWORD) + 1);
403 if (new_passwd == NULL) {
404 SLOGE("System out of memory. Password verification incomplete");
405 goto out;
406 }
407 strlcpy(new_passwd, DEFAULT_HEX_PASSWORD, strlen(DEFAULT_HEX_PASSWORD) + 1);
408 } else {
409 new_passwd = (char*)malloc(strlen(passwd) * 2 + 1);
410 if (new_passwd == NULL) {
411 SLOGE("System out of memory. Password verification incomplete");
412 goto out;
413 }
414 convert_key_to_hex_ascii_for_upgrade((const unsigned char*)passwd,
415 strlen(passwd), new_passwd);
416 }
417 key_index = set_hw_device_encryption_key((const char*)new_passwd,
418 (char*) crypt_ftr->crypto_type_name);
419 if (key_index >=0) {
420 crypt_ftr->failed_decrypt_count = 0;
421 SLOGI("Hex password verified...will try to update with Ascii value");
422 /* Before updating password, tie that with keymaster to tie with ROT */
423
424 if (get_keymaster_hw_fde_passwd(passwd, newpw,
425 crypt_ftr->salt, crypt_ftr)) {
426 passwd_updated = update_hw_device_encryption_key(new_passwd,
427 passwd, (char*)crypt_ftr->crypto_type_name);
428 } else {
429 passwd_updated = update_hw_device_encryption_key(new_passwd,
430 (const char*)newpw, (char*)crypt_ftr->crypto_type_name);
431 }
432
433 if (passwd_updated >= 0) {
434 crypt_ftr->flags |= CRYPT_ASCII_PASSWORD_UPDATED;
435 SLOGI("Ascii password recorded and updated");
436 } else {
437 SLOGI("Passwd verified, could not update...Will try next time");
438 }
439 } else {
440 ++crypt_ftr->failed_decrypt_count;
441 }
442 free(new_passwd);
443 }
444 } else {
445 if (!ascii_passwd_updated)
446 crypt_ftr->flags |= CRYPT_ASCII_PASSWORD_UPDATED;
447 }
448out:
449 // update footer before leaving
450 put_crypt_ftr_and_key(crypt_ftr);
451 return key_index;
452}
453#endif
454
Paul Crowley220567c2020-02-07 12:45:20 -0800455constexpr CryptoType aes_128_cbc = CryptoType()
456 .set_config_name("AES-128-CBC")
457 .set_kernel_name("aes-cbc-essiv:sha256")
458 .set_keysize(16);
459
460constexpr CryptoType supported_crypto_types[] = {aes_128_cbc, android::vold::adiantum};
461
462static_assert(validateSupportedCryptoTypes(MAX_KEY_LEN, supported_crypto_types,
463 array_length(supported_crypto_types)),
464 "We have a CryptoType with keysize > MAX_KEY_LEN or which was "
465 "incompletely constructed.");
466
467static const CryptoType& get_crypto_type() {
468 // We only want to parse this read-only property once. But we need to wait
469 // until the system is initialized before we can read it. So we use a static
470 // scoped within this function to get it only once.
471 static CryptoType crypto_type =
472 lookup_crypto_algorithm(supported_crypto_types, array_length(supported_crypto_types),
473 aes_128_cbc, "ro.crypto.fde_algorithm");
474 return crypto_type;
475}
476
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800477const KeyGeneration cryptfs_get_keygen() {
Paul Crowley249c2fb2020-02-07 12:51:56 -0800478 return KeyGeneration{get_crypto_type().get_keysize(), true, false};
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800479}
480
Daniel Normanbe0137a2021-04-28 12:37:42 -0700481static bool write_string_to_buf(const std::string& towrite, uint8_t* buffer, uint32_t buffer_size,
482 uint32_t* out_size) {
483 if (!buffer || !out_size) {
484 LOG(ERROR) << "Missing target pointers";
485 return false;
486 }
487 *out_size = towrite.size();
488 if (buffer_size < towrite.size()) {
489 LOG(ERROR) << "Buffer too small " << buffer_size << " < " << towrite.size();
490 return false;
491 }
492 memset(buffer, '\0', buffer_size);
493 std::copy(towrite.begin(), towrite.end(), buffer);
494 return true;
495}
496
497static int keymaster_create_key_for_cryptfs_scrypt(uint32_t rsa_key_size, uint64_t rsa_exponent,
498 uint32_t ratelimit, uint8_t* key_buffer,
499 uint32_t key_buffer_size,
500 uint32_t* key_out_size) {
501 if (key_out_size) {
502 *key_out_size = 0;
503 }
504 Keymaster dev;
505 if (!dev) {
506 LOG(ERROR) << "Failed to initiate keymaster session";
507 return -1;
508 }
509 auto keyParams = km::AuthorizationSetBuilder()
510 .RsaSigningKey(rsa_key_size, rsa_exponent)
511 .NoDigestOrPadding()
512 .Authorization(km::TAG_NO_AUTH_REQUIRED)
513 .Authorization(km::TAG_MIN_SECONDS_BETWEEN_OPS, ratelimit);
514 std::string key;
515 if (!dev.generateKey(keyParams, &key)) return -1;
516 if (!write_string_to_buf(key, key_buffer, key_buffer_size, key_out_size)) return -1;
517 return 0;
518}
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700519
520/* Create a new keymaster key and store it in this footer */
Paul Crowley14c8c072018-09-18 13:30:21 -0700521static int keymaster_create_key(struct crypt_mnt_ftr* ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800522 if (ftr->keymaster_blob_size) {
523 SLOGI("Already have key");
524 return 0;
525 }
526
Paul Crowley14c8c072018-09-18 13:30:21 -0700527 int rc = keymaster_create_key_for_cryptfs_scrypt(
528 RSA_KEY_SIZE, RSA_EXPONENT, KEYMASTER_CRYPTFS_RATE_LIMIT, ftr->keymaster_blob,
529 KEYMASTER_BLOB_SIZE, &ftr->keymaster_blob_size);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000530 if (rc) {
531 if (ftr->keymaster_blob_size > KEYMASTER_BLOB_SIZE) {
Paul Crowley73473332017-11-21 15:43:51 -0800532 SLOGE("Keymaster key blob too large");
Janis Danisevskis015ec302017-01-31 11:31:08 +0000533 ftr->keymaster_blob_size = 0;
534 }
535 SLOGE("Failed to generate keypair");
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700536 return -1;
537 }
Janis Danisevskis015ec302017-01-31 11:31:08 +0000538 return 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700539}
540
Daniel Normanbe0137a2021-04-28 12:37:42 -0700541static int keymaster_sign_object_for_cryptfs_scrypt(struct crypt_mnt_ftr* ftr, uint32_t ratelimit,
542 const uint8_t* object, const size_t object_size,
543 uint8_t** signature_buffer,
544 size_t* signature_buffer_size) {
545 if (!object || !signature_buffer || !signature_buffer_size) {
546 LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument";
547 return -1;
548 }
549
550 Keymaster dev;
551 if (!dev) {
552 LOG(ERROR) << "Failed to initiate keymaster session";
553 return -1;
554 }
555
556 km::AuthorizationSet outParams;
557 std::string key(reinterpret_cast<const char*>(ftr->keymaster_blob), ftr->keymaster_blob_size);
558 std::string input(reinterpret_cast<const char*>(object), object_size);
559 std::string output;
560 KeymasterOperation op;
561
562 auto paramBuilder = km::AuthorizationSetBuilder().NoDigestOrPadding().Authorization(
563 km::TAG_PURPOSE, km::KeyPurpose::SIGN);
564 while (true) {
565 op = dev.begin(key, paramBuilder, &outParams);
566 if (op.getErrorCode() == km::ErrorCode::KEY_RATE_LIMIT_EXCEEDED) {
567 sleep(ratelimit);
568 continue;
569 } else
570 break;
571 }
572
573 if (!op) {
574 LOG(ERROR) << "Error starting keymaster signature transaction: "
575 << int32_t(op.getErrorCode());
576 return -1;
577 }
578
579 if (op.getUpgradedBlob()) {
580 write_string_to_buf(*op.getUpgradedBlob(), ftr->keymaster_blob, KEYMASTER_BLOB_SIZE,
581 &ftr->keymaster_blob_size);
582
583 SLOGD("Upgrading key");
584 if (put_crypt_ftr_and_key(ftr) != 0) {
585 SLOGE("Failed to write upgraded key to disk");
586 return -1;
587 }
588 SLOGD("Key upgraded successfully");
589 }
590
591 if (!op.updateCompletely(input, &output)) {
592 LOG(ERROR) << "Error sending data to keymaster signature transaction: "
593 << int32_t(op.getErrorCode());
594 return -1;
595 }
596
597 if (!op.finish(&output)) {
598 LOG(ERROR) << "Error finalizing keymaster signature transaction: "
599 << int32_t(op.getErrorCode());
600 return -1;
601 }
602
603 *signature_buffer = reinterpret_cast<uint8_t*>(malloc(output.size()));
604 if (*signature_buffer == nullptr) {
605 LOG(ERROR) << "Error allocation buffer for keymaster signature";
606 return -1;
607 }
608 *signature_buffer_size = output.size();
609 std::copy(output.data(), output.data() + output.size(), *signature_buffer);
610
611 return 0;
612}
613
Shawn Willdene17a9c42014-09-08 13:04:08 -0600614/* This signs the given object using the keymaster key. */
Paul Crowley14c8c072018-09-18 13:30:21 -0700615static int keymaster_sign_object(struct crypt_mnt_ftr* ftr, const unsigned char* object,
616 const size_t object_size, unsigned char** signature,
617 size_t* signature_size) {
Shawn Willden47ba10d2014-09-03 17:07:06 -0600618 unsigned char to_sign[RSA_KEY_SIZE_BYTES];
Shawn Willdene17a9c42014-09-08 13:04:08 -0600619 size_t to_sign_size = sizeof(to_sign);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600620 memset(to_sign, 0, RSA_KEY_SIZE_BYTES);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600621
Shawn Willdene17a9c42014-09-08 13:04:08 -0600622 // To sign a message with RSA, the message must satisfy two
623 // constraints:
624 //
625 // 1. The message, when interpreted as a big-endian numeric value, must
626 // be strictly less than the public modulus of the RSA key. Note
627 // that because the most significant bit of the public modulus is
628 // guaranteed to be 1 (else it's an (n-1)-bit key, not an n-bit
629 // key), an n-bit message with most significant bit 0 always
630 // satisfies this requirement.
631 //
632 // 2. The message must have the same length in bits as the public
633 // modulus of the RSA key. This requirement isn't mathematically
634 // necessary, but is necessary to ensure consistency in
635 // implementations.
636 switch (ftr->kdf_type) {
Shawn Willdene17a9c42014-09-08 13:04:08 -0600637 case KDF_SCRYPT_KEYMASTER:
638 // This ensures the most significant byte of the signed message
639 // is zero. We could have zero-padded to the left instead, but
640 // this approach is slightly more robust against changes in
641 // object size. However, it's still broken (but not unusably
Shawn Willdenda6e8992015-06-03 09:40:45 -0600642 // so) because we really should be using a proper deterministic
643 // RSA padding function, such as PKCS1.
Wei Wang4375f1b2017-02-24 17:43:01 -0800644 memcpy(to_sign + 1, object, std::min((size_t)RSA_KEY_SIZE_BYTES - 1, object_size));
Shawn Willdene17a9c42014-09-08 13:04:08 -0600645 SLOGI("Signing safely-padded object");
646 break;
647 default:
648 SLOGE("Unknown KDF type %d", ftr->kdf_type);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000649 return -1;
Shawn Willdene17a9c42014-09-08 13:04:08 -0600650 }
Daniel Normanbe0137a2021-04-28 12:37:42 -0700651 return keymaster_sign_object_for_cryptfs_scrypt(ftr, KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign,
652 to_sign_size, signature, signature_size);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600653}
654
Paul Lawrence399317e2014-03-10 13:20:50 -0700655/* Store password when userdata is successfully decrypted and mounted.
656 * Cleared by cryptfs_clear_password
657 *
658 * To avoid a double prompt at boot, we need to store the CryptKeeper
659 * password and pass it to KeyGuard, which uses it to unlock KeyStore.
660 * Since the entire framework is torn down and rebuilt after encryption,
661 * we have to use a daemon or similar to store the password. Since vold
662 * is secured against IPC except from system processes, it seems a reasonable
663 * place to store this.
664 *
665 * password should be cleared once it has been used.
666 *
667 * password is aged out after password_max_age_seconds seconds.
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800668 */
Paul Lawrence399317e2014-03-10 13:20:50 -0700669static char* password = 0;
670static int password_expiry_time = 0;
671static const int password_max_age_seconds = 60;
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800672
Paul Crowley14c8c072018-09-18 13:30:21 -0700673enum class RebootType { reboot, recovery, shutdown };
674static void cryptfs_reboot(RebootType rt) {
675 switch (rt) {
676 case RebootType::reboot:
677 property_set(ANDROID_RB_PROPERTY, "reboot");
678 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800679
Paul Crowley14c8c072018-09-18 13:30:21 -0700680 case RebootType::recovery:
681 property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
682 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800683
Paul Crowley14c8c072018-09-18 13:30:21 -0700684 case RebootType::shutdown:
685 property_set(ANDROID_RB_PROPERTY, "shutdown");
686 break;
Ken Sumralladfba362013-06-04 16:37:52 -0700687 }
Paul Lawrence87999172014-02-20 12:21:31 -0800688
Ken Sumralladfba362013-06-04 16:37:52 -0700689 sleep(20);
690
691 /* Shouldn't get here, reboot should happen before sleep times out */
692 return;
693}
694
Kenny Rootc4c70f12013-06-14 12:11:38 -0700695/**
696 * Gets the default device scrypt parameters for key derivation time tuning.
697 * The parameters should lead to about one second derivation time for the
698 * given device.
699 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700700static void get_device_scrypt_params(struct crypt_mnt_ftr* ftr) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700701 char paramstr[PROPERTY_VALUE_MAX];
Paul Crowley63c18d32016-02-10 14:02:47 +0000702 int Nf, rf, pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700703
Paul Crowley63c18d32016-02-10 14:02:47 +0000704 property_get(SCRYPT_PROP, paramstr, SCRYPT_DEFAULTS);
705 if (!parse_scrypt_parameters(paramstr, &Nf, &rf, &pf)) {
706 SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
707 parse_scrypt_parameters(SCRYPT_DEFAULTS, &Nf, &rf, &pf);
Kenny Rootc4c70f12013-06-14 12:11:38 -0700708 }
Paul Crowley63c18d32016-02-10 14:02:47 +0000709 ftr->N_factor = Nf;
710 ftr->r_factor = rf;
711 ftr->p_factor = pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700712}
713
Tom Cherry4c5bde22019-01-29 14:34:01 -0800714static uint64_t get_fs_size(const char* dev) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800715 int fd, block_size;
716 struct ext4_super_block sb;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200717 uint64_t len;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800718
Paul Crowley14c8c072018-09-18 13:30:21 -0700719 if ((fd = open(dev, O_RDONLY | O_CLOEXEC)) < 0) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800720 SLOGE("Cannot open device to get filesystem size ");
721 return 0;
722 }
723
724 if (lseek64(fd, 1024, SEEK_SET) < 0) {
725 SLOGE("Cannot seek to superblock");
726 return 0;
727 }
728
729 if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
730 SLOGE("Cannot read superblock");
731 return 0;
732 }
733
734 close(fd);
735
Daniel Rosenberge82df162014-08-15 22:19:23 +0000736 if (le32_to_cpu(sb.s_magic) != EXT4_SUPER_MAGIC) {
737 SLOGE("Not a valid ext4 superblock");
738 return 0;
739 }
Ken Sumrall3ed82362011-01-28 23:31:16 -0800740 block_size = 1024 << sb.s_log_block_size;
741 /* compute length in bytes */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200742 len = (((uint64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800743
744 /* return length in sectors */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200745 return len / 512;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800746}
747
Tom Cherry4c5bde22019-01-29 14:34:01 -0800748static void get_crypt_info(std::string* key_loc, std::string* real_blk_device) {
749 for (const auto& entry : fstab_default) {
750 if (!entry.fs_mgr_flags.vold_managed &&
751 (entry.fs_mgr_flags.crypt || entry.fs_mgr_flags.force_crypt ||
752 entry.fs_mgr_flags.force_fde_or_fbe || entry.fs_mgr_flags.file_encryption)) {
753 if (key_loc != nullptr) {
754 *key_loc = entry.key_loc;
755 }
756 if (real_blk_device != nullptr) {
757 *real_blk_device = entry.blk_device;
758 }
759 return;
760 }
761 }
762}
763
Paul Crowley14c8c072018-09-18 13:30:21 -0700764static int get_crypt_ftr_info(char** metadata_fname, off64_t* off) {
765 static int cached_data = 0;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200766 static uint64_t cached_off = 0;
Paul Crowley14c8c072018-09-18 13:30:21 -0700767 static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
Paul Crowley14c8c072018-09-18 13:30:21 -0700768 char key_loc[PROPERTY_VALUE_MAX];
769 char real_blkdev[PROPERTY_VALUE_MAX];
770 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700771
Paul Crowley14c8c072018-09-18 13:30:21 -0700772 if (!cached_data) {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800773 std::string key_loc;
774 std::string real_blkdev;
775 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700776
Tom Cherry4c5bde22019-01-29 14:34:01 -0800777 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200778 if (android::vold::GetBlockDevSize(real_blkdev, &cached_off) == android::OK) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700779 /* If it's an encrypted Android partition, the last 16 Kbytes contain the
780 * encryption info footer and key, and plenty of bytes to spare for future
781 * growth.
782 */
Tom Cherry4c5bde22019-01-29 14:34:01 -0800783 strlcpy(cached_metadata_fname, real_blkdev.c_str(), sizeof(cached_metadata_fname));
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200784 cached_off -= CRYPT_FOOTER_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -0700785 cached_data = 1;
786 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800787 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -0700788 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700789 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800790 strlcpy(cached_metadata_fname, key_loc.c_str(), sizeof(cached_metadata_fname));
Paul Crowley14c8c072018-09-18 13:30:21 -0700791 cached_off = 0;
792 cached_data = 1;
793 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700794 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700795
Paul Crowley14c8c072018-09-18 13:30:21 -0700796 if (cached_data) {
797 if (metadata_fname) {
798 *metadata_fname = cached_metadata_fname;
799 }
800 if (off) {
801 *off = cached_off;
802 }
803 rc = 0;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700804 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700805
Paul Crowley14c8c072018-09-18 13:30:21 -0700806 return rc;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700807}
808
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800809/* Set sha256 checksum in structure */
Paul Crowley14c8c072018-09-18 13:30:21 -0700810static void set_ftr_sha(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800811 SHA256_CTX c;
812 SHA256_Init(&c);
813 memset(crypt_ftr->sha256, 0, sizeof(crypt_ftr->sha256));
814 SHA256_Update(&c, crypt_ftr, sizeof(*crypt_ftr));
815 SHA256_Final(crypt_ftr->sha256, &c);
816}
817
Ken Sumralle8744072011-01-18 22:01:55 -0800818/* key or salt can be NULL, in which case just skip writing that value. Useful to
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800819 * update the failed mount count but not change the key.
820 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700821static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
822 int fd;
823 unsigned int cnt;
824 /* starting_off is set to the SEEK_SET offset
825 * where the crypto structure starts
826 */
827 off64_t starting_off;
828 int rc = -1;
829 char* fname = NULL;
830 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800831
Paul Crowley14c8c072018-09-18 13:30:21 -0700832 set_ftr_sha(crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800833
Paul Crowley14c8c072018-09-18 13:30:21 -0700834 if (get_crypt_ftr_info(&fname, &starting_off)) {
835 SLOGE("Unable to get crypt_ftr_info\n");
836 return -1;
Ken Sumralle8744072011-01-18 22:01:55 -0800837 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700838 if (fname[0] != '/') {
839 SLOGE("Unexpected value for crypto key location\n");
840 return -1;
841 }
842 if ((fd = open(fname, O_RDWR | O_CREAT | O_CLOEXEC, 0600)) < 0) {
843 SLOGE("Cannot open footer file %s for put\n", fname);
844 return -1;
845 }
Ken Sumralle8744072011-01-18 22:01:55 -0800846
Paul Crowley14c8c072018-09-18 13:30:21 -0700847 /* Seek to the start of the crypt footer */
848 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
849 SLOGE("Cannot seek to real block device footer\n");
850 goto errout;
851 }
852
853 if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
854 SLOGE("Cannot write real block device footer\n");
855 goto errout;
856 }
857
858 fstat(fd, &statbuf);
859 /* If the keys are kept on a raw block device, do not try to truncate it. */
860 if (S_ISREG(statbuf.st_mode)) {
861 if (ftruncate(fd, 0x4000)) {
862 SLOGE("Cannot set footer file size\n");
863 goto errout;
864 }
865 }
866
867 /* Success! */
868 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800869
870errout:
Paul Crowley14c8c072018-09-18 13:30:21 -0700871 close(fd);
872 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800873}
874
Paul Crowley14c8c072018-09-18 13:30:21 -0700875static bool check_ftr_sha(const struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800876 struct crypt_mnt_ftr copy;
877 memcpy(&copy, crypt_ftr, sizeof(copy));
878 set_ftr_sha(&copy);
879 return memcmp(copy.sha256, crypt_ftr->sha256, sizeof(copy.sha256)) == 0;
880}
881
Paul Crowley14c8c072018-09-18 13:30:21 -0700882static inline int unix_read(int fd, void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700883 return TEMP_FAILURE_RETRY(read(fd, buff, len));
884}
885
Paul Crowley14c8c072018-09-18 13:30:21 -0700886static inline int unix_write(int fd, const void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700887 return TEMP_FAILURE_RETRY(write(fd, buff, len));
888}
889
Paul Crowley14c8c072018-09-18 13:30:21 -0700890static void init_empty_persist_data(struct crypt_persist_data* pdata, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700891 memset(pdata, 0, len);
892 pdata->persist_magic = PERSIST_DATA_MAGIC;
893 pdata->persist_valid_entries = 0;
894}
895
896/* A routine to update the passed in crypt_ftr to the lastest version.
897 * fd is open read/write on the device that holds the crypto footer and persistent
898 * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
899 * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
900 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700901static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr* crypt_ftr, off64_t offset) {
Kenny Root7434b312013-06-14 11:29:53 -0700902 int orig_major = crypt_ftr->major_version;
903 int orig_minor = crypt_ftr->minor_version;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700904
Kenny Root7434b312013-06-14 11:29:53 -0700905 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700906 struct crypt_persist_data* pdata;
Kenny Root7434b312013-06-14 11:29:53 -0700907 off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700908
Kenny Rootc4c70f12013-06-14 12:11:38 -0700909 SLOGW("upgrading crypto footer to 1.1");
910
Paul Crowley14c8c072018-09-18 13:30:21 -0700911 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Kenny Root7434b312013-06-14 11:29:53 -0700912 if (pdata == NULL) {
913 SLOGE("Cannot allocate persisent data\n");
914 return;
915 }
916 memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
917
918 /* Need to initialize the persistent data area */
919 if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
920 SLOGE("Cannot seek to persisent data offset\n");
Henrik Baard91064632015-02-05 15:09:17 +0100921 free(pdata);
Kenny Root7434b312013-06-14 11:29:53 -0700922 return;
923 }
924 /* Write all zeros to the first copy, making it invalid */
925 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
926
927 /* Write a valid but empty structure to the second copy */
928 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
929 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
930
931 /* Update the footer */
932 crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
933 crypt_ftr->persist_data_offset[0] = pdata_offset;
934 crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
935 crypt_ftr->minor_version = 1;
Henrik Baard91064632015-02-05 15:09:17 +0100936 free(pdata);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700937 }
938
Paul Lawrencef4faa572014-01-29 13:31:03 -0800939 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 1)) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700940 SLOGW("upgrading crypto footer to 1.2");
JP Abgrall7bdfa522013-11-15 13:42:56 -0800941 /* But keep the old kdf_type.
942 * It will get updated later to KDF_SCRYPT after the password has been verified.
943 */
Kenny Rootc4c70f12013-06-14 12:11:38 -0700944 crypt_ftr->kdf_type = KDF_PBKDF2;
945 get_device_scrypt_params(crypt_ftr);
946 crypt_ftr->minor_version = 2;
947 }
948
Paul Lawrencef4faa572014-01-29 13:31:03 -0800949 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 2)) {
950 SLOGW("upgrading crypto footer to 1.3");
951 crypt_ftr->crypt_type = CRYPT_TYPE_PASSWORD;
952 crypt_ftr->minor_version = 3;
953 }
954
Kenny Root7434b312013-06-14 11:29:53 -0700955 if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
956 if (lseek64(fd, offset, SEEK_SET) == -1) {
957 SLOGE("Cannot seek to crypt footer\n");
958 return;
959 }
960 unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700961 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700962}
963
Paul Crowley14c8c072018-09-18 13:30:21 -0700964static int get_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
965 int fd;
966 unsigned int cnt;
967 off64_t starting_off;
968 int rc = -1;
969 char* fname = NULL;
970 struct stat statbuf;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700971
Paul Crowley14c8c072018-09-18 13:30:21 -0700972 if (get_crypt_ftr_info(&fname, &starting_off)) {
973 SLOGE("Unable to get crypt_ftr_info\n");
974 return -1;
975 }
976 if (fname[0] != '/') {
977 SLOGE("Unexpected value for crypto key location\n");
978 return -1;
979 }
980 if ((fd = open(fname, O_RDWR | O_CLOEXEC)) < 0) {
981 SLOGE("Cannot open footer file %s for get\n", fname);
982 return -1;
983 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800984
Paul Crowley14c8c072018-09-18 13:30:21 -0700985 /* Make sure it's 16 Kbytes in length */
986 fstat(fd, &statbuf);
987 if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
988 SLOGE("footer file %s is not the expected size!\n", fname);
989 goto errout;
990 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700991
Paul Crowley14c8c072018-09-18 13:30:21 -0700992 /* Seek to the start of the crypt footer */
993 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
994 SLOGE("Cannot seek to real block device footer\n");
995 goto errout;
996 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700997
Paul Crowley14c8c072018-09-18 13:30:21 -0700998 if ((cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
999 SLOGE("Cannot read real block device footer\n");
1000 goto errout;
1001 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001002
Paul Crowley14c8c072018-09-18 13:30:21 -07001003 if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
1004 SLOGE("Bad magic for real block device %s\n", fname);
1005 goto errout;
1006 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001007
Paul Crowley14c8c072018-09-18 13:30:21 -07001008 if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
1009 SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
1010 crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
1011 goto errout;
1012 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001013
Paul Crowley14c8c072018-09-18 13:30:21 -07001014 // We risk buffer overflows with oversized keys, so we just reject them.
1015 // 0-sized keys are problematic (essentially by-passing encryption), and
1016 // AES-CBC key wrapping only works for multiples of 16 bytes.
1017 if ((crypt_ftr->keysize == 0) || ((crypt_ftr->keysize % 16) != 0) ||
1018 (crypt_ftr->keysize > MAX_KEY_LEN)) {
1019 SLOGE(
1020 "Invalid keysize (%u) for block device %s; Must be non-zero, "
1021 "divisible by 16, and <= %d\n",
1022 crypt_ftr->keysize, fname, MAX_KEY_LEN);
1023 goto errout;
1024 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001025
Paul Crowley14c8c072018-09-18 13:30:21 -07001026 if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
1027 SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
1028 crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
1029 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08001030
Paul Crowley14c8c072018-09-18 13:30:21 -07001031 /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
1032 * copy on disk before returning.
1033 */
1034 if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
1035 upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
1036 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001037
Paul Crowley14c8c072018-09-18 13:30:21 -07001038 /* Success! */
1039 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001040
1041errout:
Paul Crowley14c8c072018-09-18 13:30:21 -07001042 close(fd);
1043 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001044}
1045
Paul Crowley14c8c072018-09-18 13:30:21 -07001046static int validate_persistent_data_storage(struct crypt_mnt_ftr* crypt_ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001047 if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
1048 crypt_ftr->persist_data_offset[1]) {
1049 SLOGE("Crypt_ftr persist data regions overlap");
1050 return -1;
1051 }
1052
1053 if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
1054 SLOGE("Crypt_ftr persist data region 0 starts after region 1");
1055 return -1;
1056 }
1057
1058 if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
Paul Crowley14c8c072018-09-18 13:30:21 -07001059 (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
Ken Sumrall160b4d62013-04-22 12:15:39 -07001060 CRYPT_FOOTER_OFFSET) {
1061 SLOGE("Persistent data extends past crypto footer");
1062 return -1;
1063 }
1064
1065 return 0;
1066}
1067
Paul Crowley14c8c072018-09-18 13:30:21 -07001068static int load_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001069 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07001070 struct crypt_persist_data* pdata = NULL;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001071 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -07001072 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001073 int found = 0;
1074 int fd;
1075 int ret;
1076 int i;
1077
1078 if (persist_data) {
1079 /* Nothing to do, we've already loaded or initialized it */
1080 return 0;
1081 }
1082
Ken Sumrall160b4d62013-04-22 12:15:39 -07001083 /* If not encrypted, just allocate an empty table and initialize it */
1084 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07001085 if (strcmp(encrypted_state, "encrypted")) {
Wei Wang4375f1b2017-02-24 17:43:01 -08001086 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001087 if (pdata) {
1088 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
1089 persist_data = pdata;
1090 return 0;
1091 }
1092 return -1;
1093 }
1094
Paul Crowley14c8c072018-09-18 13:30:21 -07001095 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001096 return -1;
1097 }
1098
Paul Crowley14c8c072018-09-18 13:30:21 -07001099 if ((crypt_ftr.major_version < 1) ||
1100 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001101 SLOGE("Crypt_ftr version doesn't support persistent data");
1102 return -1;
1103 }
1104
1105 if (get_crypt_ftr_info(&fname, NULL)) {
1106 return -1;
1107 }
1108
1109 ret = validate_persistent_data_storage(&crypt_ftr);
1110 if (ret) {
1111 return -1;
1112 }
1113
Paul Crowley14c8c072018-09-18 13:30:21 -07001114 fd = open(fname, O_RDONLY | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001115 if (fd < 0) {
1116 SLOGE("Cannot open %s metadata file", fname);
1117 return -1;
1118 }
1119
Wei Wang4375f1b2017-02-24 17:43:01 -08001120 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Paul Lawrence300dae72016-03-11 11:02:52 -08001121 if (pdata == NULL) {
1122 SLOGE("Cannot allocate memory for persistent data");
1123 goto err;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001124 }
1125
1126 for (i = 0; i < 2; i++) {
1127 if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
1128 SLOGE("Cannot seek to read persistent data on %s", fname);
1129 goto err2;
1130 }
Paul Crowley14c8c072018-09-18 13:30:21 -07001131 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001132 SLOGE("Error reading persistent data on iteration %d", i);
1133 goto err2;
1134 }
1135 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
1136 found = 1;
1137 break;
1138 }
1139 }
1140
1141 if (!found) {
1142 SLOGI("Could not find valid persistent data, creating");
1143 init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
1144 }
1145
1146 /* Success */
1147 persist_data = pdata;
1148 close(fd);
1149 return 0;
1150
1151err2:
1152 free(pdata);
1153
1154err:
1155 close(fd);
1156 return -1;
1157}
1158
Paul Crowley14c8c072018-09-18 13:30:21 -07001159static int save_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001160 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07001161 struct crypt_persist_data* pdata;
1162 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001163 off64_t write_offset;
1164 off64_t erase_offset;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001165 int fd;
1166 int ret;
1167
1168 if (persist_data == NULL) {
1169 SLOGE("No persistent data to save");
1170 return -1;
1171 }
1172
Paul Crowley14c8c072018-09-18 13:30:21 -07001173 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001174 return -1;
1175 }
1176
Paul Crowley14c8c072018-09-18 13:30:21 -07001177 if ((crypt_ftr.major_version < 1) ||
1178 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001179 SLOGE("Crypt_ftr version doesn't support persistent data");
1180 return -1;
1181 }
1182
1183 ret = validate_persistent_data_storage(&crypt_ftr);
1184 if (ret) {
1185 return -1;
1186 }
1187
1188 if (get_crypt_ftr_info(&fname, NULL)) {
1189 return -1;
1190 }
1191
Paul Crowley14c8c072018-09-18 13:30:21 -07001192 fd = open(fname, O_RDWR | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001193 if (fd < 0) {
1194 SLOGE("Cannot open %s metadata file", fname);
1195 return -1;
1196 }
1197
Wei Wang4375f1b2017-02-24 17:43:01 -08001198 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001199 if (pdata == NULL) {
1200 SLOGE("Cannot allocate persistant data");
1201 goto err;
1202 }
1203
1204 if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
1205 SLOGE("Cannot seek to read persistent data on %s", fname);
1206 goto err2;
1207 }
1208
1209 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001210 SLOGE("Error reading persistent data before save");
1211 goto err2;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001212 }
1213
1214 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
1215 /* The first copy is the curent valid copy, so write to
1216 * the second copy and erase this one */
Paul Crowley14c8c072018-09-18 13:30:21 -07001217 write_offset = crypt_ftr.persist_data_offset[1];
1218 erase_offset = crypt_ftr.persist_data_offset[0];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001219 } else {
1220 /* The second copy must be the valid copy, so write to
1221 * the first copy, and erase the second */
Paul Crowley14c8c072018-09-18 13:30:21 -07001222 write_offset = crypt_ftr.persist_data_offset[0];
1223 erase_offset = crypt_ftr.persist_data_offset[1];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001224 }
1225
1226 /* Write the new copy first, if successful, then erase the old copy */
Björn Landström96dbee72015-01-20 12:43:56 +01001227 if (lseek64(fd, write_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001228 SLOGE("Cannot seek to write persistent data");
1229 goto err2;
1230 }
1231 if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
Paul Crowley14c8c072018-09-18 13:30:21 -07001232 (int)crypt_ftr.persist_data_size) {
Björn Landström96dbee72015-01-20 12:43:56 +01001233 if (lseek64(fd, erase_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001234 SLOGE("Cannot seek to erase previous persistent data");
1235 goto err2;
1236 }
1237 fsync(fd);
1238 memset(pdata, 0, crypt_ftr.persist_data_size);
Paul Crowley14c8c072018-09-18 13:30:21 -07001239 if (unix_write(fd, pdata, crypt_ftr.persist_data_size) != (int)crypt_ftr.persist_data_size) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001240 SLOGE("Cannot write to erase previous persistent data");
1241 goto err2;
1242 }
1243 fsync(fd);
1244 } else {
1245 SLOGE("Cannot write to save persistent data");
1246 goto err2;
1247 }
1248
1249 /* Success */
1250 free(pdata);
1251 close(fd);
1252 return 0;
1253
1254err2:
1255 free(pdata);
1256err:
1257 close(fd);
1258 return -1;
1259}
1260
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001261/* Convert a binary key of specified length into an ascii hex string equivalent,
1262 * without the leading 0x and with null termination
1263 */
Paul Crowley14c8c072018-09-18 13:30:21 -07001264static void convert_key_to_hex_ascii(const unsigned char* master_key, unsigned int keysize,
1265 char* master_key_ascii) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001266 unsigned int i, a;
1267 unsigned char nibble;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001268
Paul Crowley14c8c072018-09-18 13:30:21 -07001269 for (i = 0, a = 0; i < keysize; i++, a += 2) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001270 /* For each byte, write out two ascii hex digits */
1271 nibble = (master_key[i] >> 4) & 0xf;
1272 master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001273
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001274 nibble = master_key[i] & 0xf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001275 master_key_ascii[a + 1] = nibble + (nibble > 9 ? 0x37 : 0x30);
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001276 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001277
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001278 /* Add the null termination */
1279 master_key_ascii[a] = '\0';
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001280}
1281
Eric Biggersed45ec32019-01-25 10:47:55 -08001282/*
1283 * If the ro.crypto.fde_sector_size system property is set, append the
1284 * parameters to make dm-crypt use the specified crypto sector size and round
1285 * the crypto device size down to a crypto sector boundary.
1286 */
David Andersonb9224732019-05-13 13:02:54 -07001287static int add_sector_size_param(DmTargetCrypt* target, struct crypt_mnt_ftr* ftr) {
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001288 constexpr char DM_CRYPT_SECTOR_SIZE[] = "ro.crypto.fde_sector_size";
Eric Biggersed45ec32019-01-25 10:47:55 -08001289 char value[PROPERTY_VALUE_MAX];
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001290
Eric Biggersed45ec32019-01-25 10:47:55 -08001291 if (property_get(DM_CRYPT_SECTOR_SIZE, value, "") > 0) {
1292 unsigned int sector_size;
1293
1294 if (!ParseUint(value, &sector_size) || sector_size < 512 || sector_size > 4096 ||
1295 (sector_size & (sector_size - 1)) != 0) {
1296 SLOGE("Invalid value for %s: %s. Must be >= 512, <= 4096, and a power of 2\n",
1297 DM_CRYPT_SECTOR_SIZE, value);
1298 return -1;
1299 }
1300
David Andersonb9224732019-05-13 13:02:54 -07001301 target->SetSectorSize(sector_size);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001302
1303 // With this option, IVs will match the sector numbering, instead
1304 // of being hard-coded to being based on 512-byte sectors.
David Andersonb9224732019-05-13 13:02:54 -07001305 target->SetIvLargeSectors();
Eric Biggersed45ec32019-01-25 10:47:55 -08001306
1307 // Round the crypto device size down to a crypto sector boundary.
1308 ftr->fs_size &= ~((sector_size / 512) - 1);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001309 }
Eric Biggersed45ec32019-01-25 10:47:55 -08001310 return 0;
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001311}
1312
Neeraj Soni73b46952019-09-12 16:47:27 +05301313#if defined(CONFIG_HW_DISK_ENCRYPTION) && !defined(CONFIG_HW_DISK_ENCRYPT_PERF)
1314#define DM_CRYPT_BUF_SIZE 4096
1315
1316static void ioctl_init(struct dm_ioctl* io, size_t dataSize, const char* name, unsigned flags) {
1317 memset(io, 0, dataSize);
1318 io->data_size = dataSize;
1319 io->data_start = sizeof(struct dm_ioctl);
1320 io->version[0] = 4;
1321 io->version[1] = 0;
1322 io->version[2] = 0;
1323 io->flags = flags;
1324 if (name) {
1325 strlcpy(io->name, name, sizeof(io->name));
1326 }
1327}
1328
1329static int load_crypto_mapping_table(struct crypt_mnt_ftr* crypt_ftr,
1330 const unsigned char* master_key, const char* real_blk_name,
1331 const char* name, int fd, const char* extra_params) {
1332 alignas(struct dm_ioctl) char buffer[DM_CRYPT_BUF_SIZE];
1333 struct dm_ioctl* io;
1334 struct dm_target_spec* tgt;
1335 char* crypt_params;
1336 // We need two ASCII characters to represent each byte, and need space for
1337 // the '\0' terminator.
1338 char master_key_ascii[MAX_KEY_LEN * 2 + 1];
1339 size_t buff_offset;
1340 int i;
1341
1342 io = (struct dm_ioctl*)buffer;
1343
1344 /* Load the mapping table for this device */
1345 tgt = (struct dm_target_spec*)&buffer[sizeof(struct dm_ioctl)];
1346
1347 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1348 io->target_count = 1;
1349 tgt->status = 0;
1350 tgt->sector_start = 0;
1351 tgt->length = crypt_ftr->fs_size;
1352 crypt_params = buffer + sizeof(struct dm_ioctl) + sizeof(struct dm_target_spec);
1353 buff_offset = crypt_params - buffer;
1354 SLOGI(
1355 "Creating crypto dev \"%s\"; cipher=%s, keysize=%u, real_dev=%s, len=%llu, params=\"%s\"\n",
1356 name, crypt_ftr->crypto_type_name, crypt_ftr->keysize, real_blk_name, tgt->length * 512,
1357 extra_params);
1358 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
1359 strlcpy(tgt->target_type, "req-crypt",DM_MAX_TYPE_NAME);
1360 if (is_ice_enabled())
1361 convert_key_to_hex_ascii(master_key, sizeof(int), master_key_ascii);
1362 else
1363 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
1364 }
1365 snprintf(crypt_params, sizeof(buffer) - buff_offset, "%s %s 0 %s 0 %s 0",
1366 crypt_ftr->crypto_type_name, master_key_ascii,
1367 real_blk_name, extra_params);
1368
1369 SLOGI("target_type = %s", tgt->target_type);
1370 SLOGI("real_blk_name = %s, extra_params = %s", real_blk_name, extra_params);
1371
1372 crypt_params += strlen(crypt_params) + 1;
1373 crypt_params =
1374 (char*)(((unsigned long)crypt_params + 7) & ~8); /* Align to an 8 byte boundary */
1375 tgt->next = crypt_params - buffer;
1376
1377 for (i = 0; i < TABLE_LOAD_RETRIES; i++) {
1378 if (!ioctl(fd, DM_TABLE_LOAD, io)) {
1379 break;
1380 }
1381 usleep(500000);
1382 }
1383
1384 if (i == TABLE_LOAD_RETRIES) {
1385 /* We failed to load the table, return an error */
1386 return -1;
1387 } else {
1388 return i + 1;
1389 }
1390}
1391
1392static int create_crypto_blk_dev_hw(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key,
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05301393 const char* real_blk_name, std::string* crypto_blk_name,
1394 const char* name, uint32_t flags) {
Neeraj Soni73b46952019-09-12 16:47:27 +05301395 char buffer[DM_CRYPT_BUF_SIZE];
1396 struct dm_ioctl* io;
1397 unsigned int minor;
1398 int fd = 0;
1399 int err;
1400 int retval = -1;
1401 int version[3];
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05301402 int load_count = 0;
Neeraj Soni73b46952019-09-12 16:47:27 +05301403 char encrypted_state[PROPERTY_VALUE_MAX] = {0};
1404 char progress[PROPERTY_VALUE_MAX] = {0};
1405 const char *extra_params;
1406
1407 if ((fd = open("/dev/device-mapper", O_RDWR | O_CLOEXEC)) < 0) {
1408 SLOGE("Cannot open device-mapper\n");
1409 goto errout;
1410 }
1411
1412 io = (struct dm_ioctl*)buffer;
1413
1414 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1415 err = ioctl(fd, DM_DEV_CREATE, io);
1416 if (err) {
1417 SLOGE("Cannot create dm-crypt device %s: %s\n", name, strerror(errno));
1418 goto errout;
1419 }
1420
1421 /* Get the device status, in particular, the name of it's device file */
1422 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1423 if (ioctl(fd, DM_DEV_STATUS, io)) {
1424 SLOGE("Cannot retrieve dm-crypt device status\n");
1425 goto errout;
1426 }
1427 minor = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00);
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05301428 snprintf(crypto_blk_name->data(), MAXPATHLEN, "/dev/block/dm-%u", minor);
Neeraj Soni73b46952019-09-12 16:47:27 +05301429
1430 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
1431 /* Set fde_enabled if either FDE completed or in-progress */
1432 property_get("ro.crypto.state", encrypted_state, ""); /* FDE completed */
1433 property_get("vold.encrypt_progress", progress, ""); /* FDE in progress */
1434 if (!strcmp(encrypted_state, "encrypted") || strcmp(progress, "")) {
1435 if (is_ice_enabled()) {
1436 extra_params = "fde_enabled ice allow_encrypt_override";
1437 } else {
1438 extra_params = "fde_enabled allow_encrypt_override";
1439 }
1440 } else {
1441 extra_params = "fde_enabled allow_encrypt_override";
1442 }
1443 load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name, fd,
1444 extra_params);
1445 }
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08001446
Neeraj Soni73b46952019-09-12 16:47:27 +05301447 if (load_count < 0) {
1448 SLOGE("Cannot load dm-crypt mapping table.\n");
1449 goto errout;
1450 } else if (load_count > 1) {
1451 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
1452 }
1453
1454 /* Resume this device to activate it */
1455 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1456
1457 if (ioctl(fd, DM_DEV_SUSPEND, io)) {
1458 SLOGE("Cannot resume the dm-crypt device\n");
1459 goto errout;
1460 }
1461
1462 /* Ensure the dm device has been created before returning. */
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05301463 if (android::vold::WaitForFile(crypto_blk_name->c_str(), 1s) < 0) {
Neeraj Soni73b46952019-09-12 16:47:27 +05301464 // WaitForFile generates a suitable log message
1465 goto errout;
1466 }
1467
1468 /* We made it here with no errors. Woot! */
1469 retval = 0;
1470
1471errout:
1472 close(fd); /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
1473
1474 return retval;
1475}
1476#endif
1477
Paul Crowley5afbc622017-11-27 09:42:17 -08001478static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key,
Paul Crowley81796e92020-02-07 11:27:49 -08001479 const char* real_blk_name, std::string* crypto_blk_name,
1480 const char* name, uint32_t flags) {
David Andersonb9224732019-05-13 13:02:54 -07001481 auto& dm = DeviceMapper::Instance();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001482
David Andersonb9224732019-05-13 13:02:54 -07001483 // We need two ASCII characters to represent each byte, and need space for
1484 // the '\0' terminator.
1485 char master_key_ascii[MAX_KEY_LEN * 2 + 1];
1486 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001487
David Andersonb9224732019-05-13 13:02:54 -07001488 auto target = std::make_unique<DmTargetCrypt>(0, crypt_ftr->fs_size,
1489 (const char*)crypt_ftr->crypto_type_name,
1490 master_key_ascii, 0, real_blk_name, 0);
1491 target->AllowDiscards();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001492
Paul Crowley5afbc622017-11-27 09:42:17 -08001493 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE) {
David Andersonb9224732019-05-13 13:02:54 -07001494 target->AllowEncryptOverride();
Paul Crowley5afbc622017-11-27 09:42:17 -08001495 }
David Andersonb9224732019-05-13 13:02:54 -07001496 if (add_sector_size_param(target.get(), crypt_ftr)) {
Eric Biggersed45ec32019-01-25 10:47:55 -08001497 SLOGE("Error processing dm-crypt sector size param\n");
David Andersonb9224732019-05-13 13:02:54 -07001498 return -1;
Eric Biggersed45ec32019-01-25 10:47:55 -08001499 }
David Andersonb9224732019-05-13 13:02:54 -07001500
1501 DmTable table;
1502 table.AddTarget(std::move(target));
1503
1504 int load_count = 1;
1505 while (load_count < TABLE_LOAD_RETRIES) {
1506 if (dm.CreateDevice(name, table)) {
1507 break;
1508 }
1509 load_count++;
1510 }
1511
1512 if (load_count >= TABLE_LOAD_RETRIES) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001513 SLOGE("Cannot load dm-crypt mapping table.\n");
David Andersonb9224732019-05-13 13:02:54 -07001514 return -1;
1515 }
1516 if (load_count > 1) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001517 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
1518 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001519
Paul Crowley81796e92020-02-07 11:27:49 -08001520 if (!dm.GetDmDevicePathByName(name, crypto_blk_name)) {
David Andersonb9224732019-05-13 13:02:54 -07001521 SLOGE("Cannot determine dm-crypt path for %s.\n", name);
1522 return -1;
Paul Crowley5afbc622017-11-27 09:42:17 -08001523 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001524
Paul Crowley298fa322018-10-30 15:59:24 -07001525 /* Ensure the dm device has been created before returning. */
Paul Crowley81796e92020-02-07 11:27:49 -08001526 if (android::vold::WaitForFile(crypto_blk_name->c_str(), 1s) < 0) {
Paul Crowley298fa322018-10-30 15:59:24 -07001527 // WaitForFile generates a suitable log message
David Andersonb9224732019-05-13 13:02:54 -07001528 return -1;
Paul Crowley298fa322018-10-30 15:59:24 -07001529 }
David Andersonb9224732019-05-13 13:02:54 -07001530 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001531}
1532
David Andersonb9224732019-05-13 13:02:54 -07001533static int delete_crypto_blk_dev(const std::string& name) {
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001534 bool ret;
David Andersonb9224732019-05-13 13:02:54 -07001535 auto& dm = DeviceMapper::Instance();
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001536 // TODO(b/149396179) there appears to be a race somewhere in the system where trying
1537 // to delete the device fails with EBUSY; for now, work around this by retrying.
1538 int tries = 5;
1539 while (tries-- > 0) {
1540 ret = dm.DeleteDevice(name);
1541 if (ret || errno != EBUSY) {
1542 break;
1543 }
1544 SLOGW("DM_DEV Cannot remove dm-crypt device %s: %s, retrying...\n", name.c_str(),
1545 strerror(errno));
1546 std::this_thread::sleep_for(std::chrono::milliseconds(100));
1547 }
1548 if (!ret) {
1549 SLOGE("DM_DEV Cannot remove dm-crypt device %s: %s\n", name.c_str(), strerror(errno));
David Andersonb9224732019-05-13 13:02:54 -07001550 return -1;
Paul Crowley14c8c072018-09-18 13:30:21 -07001551 }
David Andersonb9224732019-05-13 13:02:54 -07001552 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001553}
1554
Paul Crowley14c8c072018-09-18 13:30:21 -07001555static int pbkdf2(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1556 void* params UNUSED) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001557 SLOGI("Using pbkdf2 for cryptfs KDF");
1558
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001559 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001560 return PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN, HASH_COUNT,
1561 INTERMEDIATE_BUF_SIZE, ikey) != 1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001562}
1563
Paul Crowley14c8c072018-09-18 13:30:21 -07001564static int scrypt(const char* passwd, const unsigned char* salt, unsigned char* ikey, void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001565 SLOGI("Using scrypt for cryptfs KDF");
1566
Paul Crowley14c8c072018-09-18 13:30:21 -07001567 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001568
1569 int N = 1 << ftr->N_factor;
1570 int r = 1 << ftr->r_factor;
1571 int p = 1 << ftr->p_factor;
1572
1573 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001574 crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001575 INTERMEDIATE_BUF_SIZE);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001576
Paul Crowley14c8c072018-09-18 13:30:21 -07001577 return 0;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001578}
1579
Paul Crowley14c8c072018-09-18 13:30:21 -07001580static int scrypt_keymaster(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1581 void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001582 SLOGI("Using scrypt with keymaster for cryptfs KDF");
1583
1584 int rc;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001585 size_t signature_size;
1586 unsigned char* signature;
Paul Crowley14c8c072018-09-18 13:30:21 -07001587 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001588
1589 int N = 1 << ftr->N_factor;
1590 int r = 1 << ftr->r_factor;
1591 int p = 1 << ftr->p_factor;
1592
Paul Crowley14c8c072018-09-18 13:30:21 -07001593 rc = crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001594 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001595
1596 if (rc) {
1597 SLOGE("scrypt failed");
1598 return -1;
1599 }
1600
Paul Crowley14c8c072018-09-18 13:30:21 -07001601 if (keymaster_sign_object(ftr, ikey, INTERMEDIATE_BUF_SIZE, &signature, &signature_size)) {
Shawn Willdene17a9c42014-09-08 13:04:08 -06001602 SLOGE("Signing failed");
1603 return -1;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001604 }
1605
Paul Crowley14c8c072018-09-18 13:30:21 -07001606 rc = crypto_scrypt(signature, signature_size, salt, SALT_LEN, N, r, p, ikey,
1607 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001608 free(signature);
1609
1610 if (rc) {
1611 SLOGE("scrypt failed");
1612 return -1;
1613 }
1614
1615 return 0;
1616}
1617
Paul Crowley14c8c072018-09-18 13:30:21 -07001618static int encrypt_master_key(const char* passwd, const unsigned char* salt,
1619 const unsigned char* decrypted_master_key,
Bill Peckham0db11972018-10-10 10:25:42 -07001620 unsigned char* encrypted_master_key, struct crypt_mnt_ftr* crypt_ftr,
1621 bool create_keymaster_key) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001622 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001623 EVP_CIPHER_CTX e_ctx;
1624 int encrypted_len, final_len;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001625 int rc = 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001626
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001627 /* Turn the password into an intermediate key and IV that can decrypt the master key */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001628 get_device_scrypt_params(crypt_ftr);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001629
1630 switch (crypt_ftr->kdf_type) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001631 case KDF_SCRYPT_KEYMASTER:
Bill Peckham0db11972018-10-10 10:25:42 -07001632 if (create_keymaster_key && keymaster_create_key(crypt_ftr)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001633 SLOGE("keymaster_create_key failed");
1634 return -1;
1635 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001636
Paul Crowley14c8c072018-09-18 13:30:21 -07001637 if (scrypt_keymaster(passwd, salt, ikey, crypt_ftr)) {
1638 SLOGE("scrypt failed");
1639 return -1;
1640 }
1641 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001642
Paul Crowley14c8c072018-09-18 13:30:21 -07001643 case KDF_SCRYPT:
1644 if (scrypt(passwd, salt, ikey, crypt_ftr)) {
1645 SLOGE("scrypt failed");
1646 return -1;
1647 }
1648 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001649
Paul Crowley14c8c072018-09-18 13:30:21 -07001650 default:
1651 SLOGE("Invalid kdf_type");
1652 return -1;
Paul Lawrencef4faa572014-01-29 13:31:03 -08001653 }
Kenny Rootc4c70f12013-06-14 12:11:38 -07001654
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001655 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001656 EVP_CIPHER_CTX_init(&e_ctx);
Paul Crowley14c8c072018-09-18 13:30:21 -07001657 if (!EVP_EncryptInit_ex(&e_ctx, EVP_aes_128_cbc(), NULL, ikey,
1658 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001659 SLOGE("EVP_EncryptInit failed\n");
1660 return -1;
1661 }
1662 EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001663
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001664 /* Encrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001665 if (!EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len, decrypted_master_key,
1666 crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001667 SLOGE("EVP_EncryptUpdate failed\n");
1668 return -1;
1669 }
Paul Crowley14c8c072018-09-18 13:30:21 -07001670 if (!EVP_EncryptFinal_ex(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001671 SLOGE("EVP_EncryptFinal failed\n");
1672 return -1;
1673 }
1674
Greg Kaiser59ad0182018-02-16 13:01:36 -08001675 if (encrypted_len + final_len != static_cast<int>(crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001676 SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
1677 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001678 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001679
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001680 /* Store the scrypt of the intermediate key, so we can validate if it's a
1681 password error or mount error when things go wrong.
1682 Note there's no need to check for errors, since if this is incorrect, we
1683 simply won't wipe userdata, which is the correct default behavior
1684 */
1685 int N = 1 << crypt_ftr->N_factor;
1686 int r = 1 << crypt_ftr->r_factor;
1687 int p = 1 << crypt_ftr->p_factor;
1688
Paul Crowley14c8c072018-09-18 13:30:21 -07001689 rc = crypto_scrypt(ikey, INTERMEDIATE_KEY_LEN_BYTES, crypt_ftr->salt, sizeof(crypt_ftr->salt),
1690 N, r, p, crypt_ftr->scrypted_intermediate_key,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001691 sizeof(crypt_ftr->scrypted_intermediate_key));
1692
1693 if (rc) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001694 SLOGE("encrypt_master_key: crypto_scrypt failed");
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001695 }
1696
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001697 EVP_CIPHER_CTX_cleanup(&e_ctx);
1698
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001699 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001700}
1701
Paul Crowley14c8c072018-09-18 13:30:21 -07001702static int decrypt_master_key_aux(const char* passwd, unsigned char* salt,
1703 const unsigned char* encrypted_master_key, size_t keysize,
1704 unsigned char* decrypted_master_key, kdf_func kdf,
1705 void* kdf_params, unsigned char** intermediate_key,
1706 size_t* intermediate_key_size) {
1707 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
1708 EVP_CIPHER_CTX d_ctx;
1709 int decrypted_len, final_len;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001710
Paul Crowley14c8c072018-09-18 13:30:21 -07001711 /* Turn the password into an intermediate key and IV that can decrypt the
1712 master key */
1713 if (kdf(passwd, salt, ikey, kdf_params)) {
1714 SLOGE("kdf failed");
1715 return -1;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001716 }
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001717
Paul Crowley14c8c072018-09-18 13:30:21 -07001718 /* Initialize the decryption engine */
1719 EVP_CIPHER_CTX_init(&d_ctx);
1720 if (!EVP_DecryptInit_ex(&d_ctx, EVP_aes_128_cbc(), NULL, ikey,
1721 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
1722 return -1;
1723 }
1724 EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
1725 /* Decrypt the master key */
1726 if (!EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len, encrypted_master_key,
1727 keysize)) {
1728 return -1;
1729 }
1730 if (!EVP_DecryptFinal_ex(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
1731 return -1;
1732 }
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001733
Paul Crowley14c8c072018-09-18 13:30:21 -07001734 if (decrypted_len + final_len != static_cast<int>(keysize)) {
1735 return -1;
1736 }
1737
1738 /* Copy intermediate key if needed by params */
1739 if (intermediate_key && intermediate_key_size) {
1740 *intermediate_key = (unsigned char*)malloc(INTERMEDIATE_KEY_LEN_BYTES);
1741 if (*intermediate_key) {
1742 memcpy(*intermediate_key, ikey, INTERMEDIATE_KEY_LEN_BYTES);
1743 *intermediate_key_size = INTERMEDIATE_KEY_LEN_BYTES;
1744 }
1745 }
1746
1747 EVP_CIPHER_CTX_cleanup(&d_ctx);
1748
1749 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001750}
1751
Paul Crowley14c8c072018-09-18 13:30:21 -07001752static void get_kdf_func(struct crypt_mnt_ftr* ftr, kdf_func* kdf, void** kdf_params) {
Paul Lawrencedb3730c2015-02-03 13:08:10 -08001753 if (ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001754 *kdf = scrypt_keymaster;
1755 *kdf_params = ftr;
1756 } else if (ftr->kdf_type == KDF_SCRYPT) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001757 *kdf = scrypt;
1758 *kdf_params = ftr;
1759 } else {
1760 *kdf = pbkdf2;
1761 *kdf_params = NULL;
1762 }
1763}
1764
Paul Crowley14c8c072018-09-18 13:30:21 -07001765static int decrypt_master_key(const char* passwd, unsigned char* decrypted_master_key,
1766 struct crypt_mnt_ftr* crypt_ftr, unsigned char** intermediate_key,
1767 size_t* intermediate_key_size) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001768 kdf_func kdf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001769 void* kdf_params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001770 int ret;
1771
1772 get_kdf_func(crypt_ftr, &kdf, &kdf_params);
Paul Crowley14c8c072018-09-18 13:30:21 -07001773 ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key, crypt_ftr->keysize,
1774 decrypted_master_key, kdf, kdf_params, intermediate_key,
1775 intermediate_key_size);
Kenny Rootc4c70f12013-06-14 12:11:38 -07001776 if (ret != 0) {
1777 SLOGW("failure decrypting master key");
Kenny Rootc4c70f12013-06-14 12:11:38 -07001778 }
1779
1780 return ret;
1781}
1782
Paul Crowley14c8c072018-09-18 13:30:21 -07001783static int create_encrypted_random_key(const char* passwd, unsigned char* master_key,
1784 unsigned char* salt, struct crypt_mnt_ftr* crypt_ftr) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08001785 unsigned char key_buf[MAX_KEY_LEN];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001786
Eric Biggers3a2f7db2019-01-16 13:05:34 -08001787 /* Get some random bits for a key and salt */
1788 if (android::vold::ReadRandomBytes(sizeof(key_buf), reinterpret_cast<char*>(key_buf)) != 0) {
1789 return -1;
1790 }
1791 if (android::vold::ReadRandomBytes(SALT_LEN, reinterpret_cast<char*>(salt)) != 0) {
1792 return -1;
1793 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001794
1795 /* Now encrypt it with the password */
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301796 return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr, true);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001797}
1798
Hyangseok Chae79b03ff2020-02-27 18:21:50 +09001799static void ensure_subdirectory_unmounted(const char *prefix) {
1800 std::vector<std::string> umount_points;
1801 std::unique_ptr<FILE, int (*)(FILE*)> mnts(setmntent("/proc/mounts", "r"), endmntent);
1802 if (!mnts) {
1803 SLOGW("could not read mount files");
1804 return;
1805 }
1806
1807 //Find sudirectory mount point
1808 mntent* mentry;
1809 std::string top_directory(prefix);
1810 if (!android::base::EndsWith(prefix, "/")) {
1811 top_directory = top_directory + "/";
1812 }
1813 while ((mentry = getmntent(mnts.get())) != nullptr) {
1814 if (strcmp(mentry->mnt_dir, top_directory.c_str()) == 0) {
1815 continue;
1816 }
1817
1818 if (android::base::StartsWith(mentry->mnt_dir, top_directory)) {
1819 SLOGW("found sub-directory mount %s - %s\n", prefix, mentry->mnt_dir);
1820 umount_points.push_back(mentry->mnt_dir);
1821 }
1822 }
1823
1824 //Sort by path length to umount longest path first
1825 std::sort(std::begin(umount_points), std::end(umount_points),
1826 [](const std::string& s1, const std::string& s2) {return s1.length() > s2.length(); });
1827
1828 for (std::string& mount_point : umount_points) {
1829 umount(mount_point.c_str());
1830 SLOGW("umount sub-directory mount %s\n", mount_point.c_str());
1831 }
1832}
1833
Eric Biggersb4faeb82021-05-10 17:44:34 -07001834static int wait_and_unmount(const char* mountpoint) {
Greg Hackmann955653e2014-09-24 14:55:20 -07001835 int i, err, rc;
Hyangseok Chae79b03ff2020-02-27 18:21:50 +09001836
1837 // Subdirectory mount will cause a failure of umount.
1838 ensure_subdirectory_unmounted(mountpoint);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301839#define WAIT_UNMOUNT_COUNT 200
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001840
1841 /* Now umount the tmpfs filesystem */
Paul Crowley14c8c072018-09-18 13:30:21 -07001842 for (i = 0; i < WAIT_UNMOUNT_COUNT; i++) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001843 if (umount(mountpoint) == 0) {
1844 break;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001845 }
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001846
1847 if (errno == EINVAL) {
1848 /* EINVAL is returned if the directory is not a mountpoint,
1849 * i.e. there is no filesystem mounted there. So just get out.
1850 */
1851 break;
1852 }
1853
1854 err = errno;
1855
Eric Biggersb4faeb82021-05-10 17:44:34 -07001856 // If it's taking too long, kill the processes with open files.
1857 //
1858 // Originally this logic was only a fail-safe, but now it's relied on to
1859 // kill certain processes that aren't stopped by init because they
1860 // aren't in the main or late_start classes. So to avoid waiting for
1861 // too long, we now are fairly aggressive in starting to kill processes.
1862 static_assert(WAIT_UNMOUNT_COUNT >= 4);
Chris Grossef2b3af2021-05-19 11:39:06 -07001863 if (i == 20) {
Eric Biggersb4faeb82021-05-10 17:44:34 -07001864 SLOGW("sending SIGTERM to processes with open files\n");
1865 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGTERM);
Chris Grossef2b3af2021-05-19 11:39:06 -07001866 } else if (i >= 30) {
Eric Biggersb4faeb82021-05-10 17:44:34 -07001867 SLOGW("sending SIGKILL to processes with open files\n");
1868 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGKILL);
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001869 }
1870
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301871 usleep(100000);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001872 }
1873
1874 if (i < WAIT_UNMOUNT_COUNT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001875 SLOGD("unmounting %s succeeded\n", mountpoint);
1876 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001877 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07001878 android::vold::KillProcessesWithOpenFiles(mountpoint, 0);
1879 SLOGE("unmounting %s failed: %s\n", mountpoint, strerror(err));
1880 rc = -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001881 }
1882
1883 return rc;
1884}
1885
Paul Crowley14c8c072018-09-18 13:30:21 -07001886static void prep_data_fs(void) {
Jeff Sharkey47695b22016-02-01 17:02:29 -07001887 // NOTE: post_fs_data results in init calling back around to vold, so all
1888 // callers to this method must be async
1889
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001890 /* Do the prep of the /data filesystem */
1891 property_set("vold.post_fs_data_done", "0");
1892 property_set("vold.decrypt", "trigger_post_fs_data");
Wei Wang42e38102017-06-07 10:46:12 -07001893 SLOGD("Just triggered post_fs_data");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001894
Ken Sumrallc5872692013-05-14 15:26:31 -07001895 /* Wait a max of 50 seconds, hopefully it takes much less */
Paul Crowley14c8c072018-09-18 13:30:21 -07001896 while (!android::base::WaitForProperty("vold.post_fs_data_done", "1", std::chrono::seconds(15))) {
Wei Wang42e38102017-06-07 10:46:12 -07001897 /* We timed out to prep /data in time. Continue wait. */
1898 SLOGE("waited 15s for vold.post_fs_data_done, still waiting...");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001899 }
Wei Wang42e38102017-06-07 10:46:12 -07001900 SLOGD("post_fs_data done");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001901}
1902
Paul Crowley14c8c072018-09-18 13:30:21 -07001903static void cryptfs_set_corrupt() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001904 // Mark the footer as bad
1905 struct crypt_mnt_ftr crypt_ftr;
1906 if (get_crypt_ftr_and_key(&crypt_ftr)) {
1907 SLOGE("Failed to get crypto footer - panic");
1908 return;
1909 }
1910
1911 crypt_ftr.flags |= CRYPT_DATA_CORRUPT;
1912 if (put_crypt_ftr_and_key(&crypt_ftr)) {
1913 SLOGE("Failed to set crypto footer - panic");
1914 return;
1915 }
1916}
1917
Paul Crowley14c8c072018-09-18 13:30:21 -07001918static void cryptfs_trigger_restart_min_framework() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001919 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001920 SLOGE("Failed to mount tmpfs on data - panic");
1921 return;
Paul Lawrence74f29f12014-08-28 15:54:10 -07001922 }
1923
1924 if (property_set("vold.decrypt", "trigger_post_fs_data")) {
1925 SLOGE("Failed to trigger post fs data - panic");
1926 return;
1927 }
1928
1929 if (property_set("vold.decrypt", "trigger_restart_min_framework")) {
1930 SLOGE("Failed to trigger restart min framework - panic");
1931 return;
1932 }
1933}
1934
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001935/* returns < 0 on failure */
Paul Crowley14c8c072018-09-18 13:30:21 -07001936static int cryptfs_restart_internal(int restart_main) {
Yifan Hong804afe12019-02-07 12:56:47 -08001937 std::string crypto_blkdev;
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301938#ifdef CONFIG_HW_DISK_ENCRYPTION
Yifan Hong804afe12019-02-07 12:56:47 -08001939 std::string blkdev;
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301940#endif
Tim Murray8439dc92014-12-15 11:56:11 -08001941 int rc = -1;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001942 static int restart_successful = 0;
1943
1944 /* Validate that it's OK to call this routine */
Paul Crowley14c8c072018-09-18 13:30:21 -07001945 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08001946 SLOGE("Encrypted filesystem not validated, aborting");
1947 return -1;
1948 }
1949
1950 if (restart_successful) {
1951 SLOGE("System already restarted with encrypted disk, aborting");
1952 return -1;
1953 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001954
Paul Lawrencef4faa572014-01-29 13:31:03 -08001955 if (restart_main) {
1956 /* Here is where we shut down the framework. The init scripts
Martijn Coenenf629b002019-04-24 10:41:11 +02001957 * start all services in one of these classes: core, early_hal, hal,
1958 * main and late_start. To get to the minimal UI for PIN entry, we
1959 * need to start core, early_hal, hal and main. When we want to
1960 * shutdown the framework again, we need to stop most of the services in
1961 * these classes, but only those services that were started after
1962 * /data was mounted. This excludes critical services like vold and
1963 * ueventd, which need to keep running. We could possible stop
1964 * even fewer services, but because we want services to pick up APEX
1965 * libraries from the real /data, restarting is better, as it makes
1966 * these devices consistent with FBE devices and lets them use the
1967 * most recent code.
1968 *
1969 * Once these services have stopped, we should be able
Paul Lawrencef4faa572014-01-29 13:31:03 -08001970 * to umount the tmpfs /data, then mount the encrypted /data.
Martijn Coenenf629b002019-04-24 10:41:11 +02001971 * We then restart the class core, hal, main, and also the class
1972 * late_start.
1973 *
Paul Lawrencef4faa572014-01-29 13:31:03 -08001974 * At the moment, I've only put a few things in late_start that I know
1975 * are not needed to bring up the framework, and that also cause problems
1976 * with unmounting the tmpfs /data, but I hope to add add more services
1977 * to the late_start class as we optimize this to decrease the delay
1978 * till the user is asked for the password to the filesystem.
1979 */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001980
Martijn Coenenf629b002019-04-24 10:41:11 +02001981 /* The init files are setup to stop the right set of services when
1982 * vold.decrypt is set to trigger_shutdown_framework.
Paul Lawrencef4faa572014-01-29 13:31:03 -08001983 */
Martijn Coenenf629b002019-04-24 10:41:11 +02001984 property_set("vold.decrypt", "trigger_shutdown_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001985 SLOGD("Just asked init to shut down class main\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001986
Paul Lawrencef4faa572014-01-29 13:31:03 -08001987 /* Ugh, shutting down the framework is not synchronous, so until it
1988 * can be fixed, this horrible hack will wait a moment for it all to
1989 * shut down before proceeding. Without it, some devices cannot
1990 * restart the graphics services.
1991 */
1992 sleep(2);
1993 }
Ken Sumrall9dedfd42012-10-09 14:16:59 -07001994
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001995 /* Now that the framework is shutdown, we should be able to umount()
1996 * the tmpfs filesystem, and mount the real one.
1997 */
1998
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301999#if defined(CONFIG_HW_DISK_ENCRYPTION)
2000#if defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2001 if (is_ice_enabled()) {
Yifan Hong804afe12019-02-07 12:56:47 -08002002 get_crypt_info(nullptr, &blkdev);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302003 if (set_ice_param(START_ENCDEC)) {
2004 SLOGE("Failed to set ICE data");
2005 return -1;
2006 }
2007 }
2008#else
Yifan Hong804afe12019-02-07 12:56:47 -08002009 blkdev = android::base::GetProperty("ro.crypto.fs_crypto_blkdev", "");
2010 if (blkdev.empty()) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302011 SLOGE("fs_crypto_blkdev not set\n");
2012 return -1;
2013 }
2014 if (!(rc = wait_and_unmount(DATA_MNT_POINT, true))) {
2015#endif
2016#else
Yifan Hong804afe12019-02-07 12:56:47 -08002017 crypto_blkdev = android::base::GetProperty("ro.crypto.fs_crypto_blkdev", "");
2018 if (crypto_blkdev.empty()) {
Ken Sumrall6864b7e2011-01-14 15:20:02 -08002019 SLOGE("fs_crypto_blkdev not set\n");
2020 return -1;
2021 }
2022
Eric Biggersb4faeb82021-05-10 17:44:34 -07002023 if (!(rc = wait_and_unmount(DATA_MNT_POINT))) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302024#endif
Doug Zongker6fd57712013-12-17 09:43:23 -08002025 /* If ro.crypto.readonly is set to 1, mount the decrypted
2026 * filesystem readonly. This is used when /data is mounted by
2027 * recovery mode.
2028 */
2029 char ro_prop[PROPERTY_VALUE_MAX];
2030 property_get("ro.crypto.readonly", ro_prop, "");
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002031 if (strlen(ro_prop) > 0 && std::stoi(ro_prop)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002032 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
2033 if (entry != nullptr) {
2034 entry->flags |= MS_RDONLY;
Luis Hector Chavezf86566f2018-05-30 15:47:50 -07002035 }
Doug Zongker6fd57712013-12-17 09:43:23 -08002036 }
JP Abgrall62c7af32014-06-16 13:01:23 -07002037
Ken Sumralle5032c42012-04-01 23:58:44 -07002038 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002039 int retries = RETRY_MOUNT_ATTEMPTS;
2040 int mount_rc;
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002041
2042 /*
2043 * fs_mgr_do_mount runs fsck. Use setexeccon to run trusted
2044 * partitions in the fsck domain.
2045 */
LongPing Wei7f3ab952019-01-30 16:03:14 +08002046 if (setexeccon(android::vold::sFsckContext)) {
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002047 SLOGE("Failed to setexeccon");
2048 return -1;
2049 }
Daniel Rosenberg4f684712018-08-28 01:58:49 -07002050 bool needs_cp = android::vold::cp_needsCheckpoint();
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302051#ifdef CONFIG_HW_DISK_ENCRYPTION
Yifan Hong804afe12019-02-07 12:56:47 -08002052 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, blkdev.data(), 0,
Paul Lawrence67f90442020-06-12 08:12:48 -07002053 needs_cp, false)) != 0) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302054#else
Yifan Hong804afe12019-02-07 12:56:47 -08002055 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, crypto_blkdev.data(), 0,
Steven Laver60b2b8d2020-06-19 08:37:05 -07002056 needs_cp, false)) != 0) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302057#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002058 if (mount_rc == FS_MGR_DOMNT_BUSY) {
2059 /* TODO: invoke something similar to
2060 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
2061 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302062#ifdef CONFIG_HW_DISK_ENCRYPTION
Yifan Hong804afe12019-02-07 12:56:47 -08002063 SLOGI("Failed to mount %s because it is busy - waiting", blkdev.c_str());
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302064#else
Yifan Hong804afe12019-02-07 12:56:47 -08002065 SLOGI("Failed to mount %s because it is busy - waiting", crypto_blkdev.c_str());
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302066#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002067 if (--retries) {
2068 sleep(RETRY_MOUNT_DELAY_SECONDS);
2069 } else {
2070 /* Let's hope that a reboot clears away whatever is keeping
2071 the mount busy */
Josh Gaofec44372017-08-28 13:22:55 -07002072 cryptfs_reboot(RebootType::reboot);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002073 }
2074 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302075#ifdef CONFIG_HW_DISK_ENCRYPTION
2076 if (--retries) {
2077 sleep(RETRY_MOUNT_DELAY_SECONDS);
2078 } else {
2079 SLOGE("Failed to mount decrypted data");
2080 cryptfs_set_corrupt();
2081 cryptfs_trigger_restart_min_framework();
2082 SLOGI("Started framework to offer wipe");
2083 return -1;
2084 }
2085#else
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002086 SLOGE("Failed to mount decrypted data");
2087 cryptfs_set_corrupt();
2088 cryptfs_trigger_restart_min_framework();
2089 SLOGI("Started framework to offer wipe");
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002090 if (setexeccon(NULL)) {
2091 SLOGE("Failed to setexeccon");
2092 }
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002093 return -1;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302094#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002095 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07002096 }
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002097 if (setexeccon(NULL)) {
2098 SLOGE("Failed to setexeccon");
2099 return -1;
2100 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002101
Ken Sumralle5032c42012-04-01 23:58:44 -07002102 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07002103 prep_data_fs();
Seigo Nonakae2ef0c02016-06-20 17:05:40 +09002104 property_set("vold.decrypt", "trigger_load_persist_props");
Ken Sumralle5032c42012-04-01 23:58:44 -07002105
2106 /* startup service classes main and late_start */
2107 property_set("vold.decrypt", "trigger_restart_framework");
2108 SLOGD("Just triggered restart_framework\n");
2109
2110 /* Give it a few moments to get started */
2111 sleep(1);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302112#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002113 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302114#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002115
Ken Sumrall0cc16632011-01-18 20:32:26 -08002116 if (rc == 0) {
2117 restart_successful = 1;
2118 }
2119
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002120 return rc;
2121}
2122
Paul Crowley14c8c072018-09-18 13:30:21 -07002123int cryptfs_restart(void) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002124 SLOGI("cryptfs_restart");
Eric Biggersa701c452018-10-23 13:06:55 -07002125 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002126 SLOGE("cryptfs_restart not valid for file encryption:");
2127 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002128 }
2129
Paul Lawrencef4faa572014-01-29 13:31:03 -08002130 /* Call internal implementation forcing a restart of main service group */
2131 return cryptfs_restart_internal(1);
2132}
2133
Paul Crowley14c8c072018-09-18 13:30:21 -07002134static int do_crypto_complete(const char* mount_point) {
2135 struct crypt_mnt_ftr crypt_ftr;
2136 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002137
Paul Crowley14c8c072018-09-18 13:30:21 -07002138 property_get("ro.crypto.state", encrypted_state, "");
2139 if (strcmp(encrypted_state, "encrypted")) {
2140 SLOGE("not running with encryption, aborting");
2141 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08002142 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002143
Paul Crowley14c8c072018-09-18 13:30:21 -07002144 // crypto_complete is full disk encrypted status
Eric Biggersa701c452018-10-23 13:06:55 -07002145 if (fscrypt_is_native()) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002146 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
2147 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07002148
Paul Crowley14c8c072018-09-18 13:30:21 -07002149 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002150 std::string key_loc;
2151 get_crypt_info(&key_loc, nullptr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002152
Paul Crowley14c8c072018-09-18 13:30:21 -07002153 /*
2154 * Only report this error if key_loc is a file and it exists.
2155 * If the device was never encrypted, and /data is not mountable for
2156 * some reason, returning 1 should prevent the UI from presenting the
2157 * a "enter password" screen, or worse, a "press button to wipe the
2158 * device" screen.
2159 */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002160 if (!key_loc.empty() && key_loc[0] == '/' && (access("key_loc", F_OK) == -1)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002161 SLOGE("master key file does not exist, aborting");
2162 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
2163 } else {
2164 SLOGE("Error getting crypt footer and key\n");
2165 return CRYPTO_COMPLETE_BAD_METADATA;
2166 }
2167 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002168
Paul Crowley14c8c072018-09-18 13:30:21 -07002169 // Test for possible error flags
2170 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
2171 SLOGE("Encryption process is partway completed\n");
2172 return CRYPTO_COMPLETE_PARTIAL;
2173 }
2174
2175 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
2176 SLOGE("Encryption process was interrupted but cannot continue\n");
2177 return CRYPTO_COMPLETE_INCONSISTENT;
2178 }
2179
2180 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT) {
2181 SLOGE("Encryption is successful but data is corrupt\n");
2182 return CRYPTO_COMPLETE_CORRUPT;
2183 }
2184
2185 /* We passed the test! We shall diminish, and return to the west */
2186 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002187}
2188
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302189#ifdef CONFIG_HW_DISK_ENCRYPTION
2190static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
2191 const char *passwd, const char *mount_point, const char *label)
2192{
Bill Peckham0db11972018-10-10 10:25:42 -07002193 /* Allocate enough space for a 256 bit key, but we may use less */
2194 unsigned char decrypted_master_key[32];
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302195 std::string crypto_blkdev_hw;
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002196 std::string crypto_blkdev;
Yifan Hong804afe12019-02-07 12:56:47 -08002197 std::string real_blkdev;
Bill Peckham0db11972018-10-10 10:25:42 -07002198 unsigned int orig_failed_decrypt_count;
2199 int rc = 0;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302200
Bill Peckham0db11972018-10-10 10:25:42 -07002201 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2202 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302203
Yifan Hong804afe12019-02-07 12:56:47 -08002204 get_crypt_info(nullptr, &real_blkdev);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302205
Bill Peckham0db11972018-10-10 10:25:42 -07002206 int key_index = 0;
2207 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
2208 key_index = verify_and_update_hw_fde_passwd(passwd, crypt_ftr);
2209 if (key_index < 0) {
2210 rc = crypt_ftr->failed_decrypt_count;
2211 goto errout;
2212 }
2213 else {
2214 if (is_ice_enabled()) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302215#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
Neeraj Soni73b46952019-09-12 16:47:27 +05302216 if (create_crypto_blk_dev_hw(crypt_ftr, (unsigned char*)&key_index,
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302217 real_blkdev.c_str(), &crypto_blkdev_hw, label, 0)) {
Bill Peckham0db11972018-10-10 10:25:42 -07002218 SLOGE("Error creating decrypted block device");
2219 rc = -1;
2220 goto errout;
2221 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302222#endif
Bill Peckham0db11972018-10-10 10:25:42 -07002223 } else {
2224 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key,
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002225 real_blkdev.c_str(), &crypto_blkdev, label, 0)) {
Bill Peckham0db11972018-10-10 10:25:42 -07002226 SLOGE("Error creating decrypted block device");
2227 rc = -1;
2228 goto errout;
2229 }
2230 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302231 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302232 }
2233
Bill Peckham0db11972018-10-10 10:25:42 -07002234 if (rc == 0) {
2235 crypt_ftr->failed_decrypt_count = 0;
2236 if (orig_failed_decrypt_count != 0) {
2237 put_crypt_ftr_and_key(crypt_ftr);
2238 }
2239
2240 /* Save the name of the crypto block device
2241 * so we can mount it when restarting the framework. */
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302242 if (is_ice_enabled()) {
2243#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
2244 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev_hw.c_str());
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002245#endif
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302246 } else {
2247 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
2248 }
Bill Peckham0db11972018-10-10 10:25:42 -07002249 master_key_saved = 1;
2250 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302251
Bill Peckham0db11972018-10-10 10:25:42 -07002252 errout:
2253 return rc;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302254}
2255#endif
2256
Paul Crowley14c8c072018-09-18 13:30:21 -07002257static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, const char* passwd,
2258 const char* mount_point, const char* label) {
2259 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley81796e92020-02-07 11:27:49 -08002260 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002261 std::string real_blkdev;
Paul Crowley14c8c072018-09-18 13:30:21 -07002262 char tmp_mount_point[64];
2263 unsigned int orig_failed_decrypt_count;
2264 int rc;
Paul Crowley14c8c072018-09-18 13:30:21 -07002265 int upgrade = 0;
2266 unsigned char* intermediate_key = 0;
2267 size_t intermediate_key_size = 0;
2268 int N = 1 << crypt_ftr->N_factor;
2269 int r = 1 << crypt_ftr->r_factor;
2270 int p = 1 << crypt_ftr->p_factor;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302271
Paul Crowley14c8c072018-09-18 13:30:21 -07002272 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2273 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002274
Paul Crowley14c8c072018-09-18 13:30:21 -07002275 if (!(crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED)) {
2276 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr, &intermediate_key,
2277 &intermediate_key_size)) {
2278 SLOGE("Failed to decrypt master key\n");
2279 rc = -1;
2280 goto errout;
2281 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08002282 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002283
Tom Cherry4c5bde22019-01-29 14:34:01 -08002284 get_crypt_info(nullptr, &real_blkdev);
Paul Lawrencef4faa572014-01-29 13:31:03 -08002285
Paul Crowley14c8c072018-09-18 13:30:21 -07002286 // Create crypto block device - all (non fatal) code paths
2287 // need it
Paul Crowley81796e92020-02-07 11:27:49 -08002288 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
Tom Cherry4c5bde22019-01-29 14:34:01 -08002289 label, 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002290 SLOGE("Error creating decrypted block device\n");
2291 rc = -1;
2292 goto errout;
2293 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002294
Paul Crowley14c8c072018-09-18 13:30:21 -07002295 /* Work out if the problem is the password or the data */
2296 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->scrypted_intermediate_key)];
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002297
Paul Crowley14c8c072018-09-18 13:30:21 -07002298 rc = crypto_scrypt(intermediate_key, intermediate_key_size, crypt_ftr->salt,
2299 sizeof(crypt_ftr->salt), N, r, p, scrypted_intermediate_key,
2300 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002301
Paul Crowley14c8c072018-09-18 13:30:21 -07002302 // Does the key match the crypto footer?
2303 if (rc == 0 && memcmp(scrypted_intermediate_key, crypt_ftr->scrypted_intermediate_key,
2304 sizeof(scrypted_intermediate_key)) == 0) {
2305 SLOGI("Password matches");
2306 rc = 0;
Paul Lawrence74f29f12014-08-28 15:54:10 -07002307 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07002308 /* Try mounting the file system anyway, just in case the problem's with
2309 * the footer, not the key. */
2310 snprintf(tmp_mount_point, sizeof(tmp_mount_point), "%s/tmp_mnt", mount_point);
2311 mkdir(tmp_mount_point, 0755);
Paul Crowley81796e92020-02-07 11:27:49 -08002312 if (fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT,
2313 const_cast<char*>(crypto_blkdev.c_str()), tmp_mount_point)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002314 SLOGE("Error temp mounting decrypted block device\n");
2315 delete_crypto_blk_dev(label);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002316
Paul Crowley14c8c072018-09-18 13:30:21 -07002317 rc = ++crypt_ftr->failed_decrypt_count;
2318 put_crypt_ftr_and_key(crypt_ftr);
2319 } else {
2320 /* Success! */
2321 SLOGI("Password did not match but decrypted drive mounted - continue");
2322 umount(tmp_mount_point);
2323 rc = 0;
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07002324 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08002325 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002326
Paul Crowley14c8c072018-09-18 13:30:21 -07002327 if (rc == 0) {
2328 crypt_ftr->failed_decrypt_count = 0;
2329 if (orig_failed_decrypt_count != 0) {
2330 put_crypt_ftr_and_key(crypt_ftr);
2331 }
2332
2333 /* Save the name of the crypto block device
2334 * so we can mount it when restarting the framework. */
Paul Crowley81796e92020-02-07 11:27:49 -08002335 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -07002336
2337 /* Also save a the master key so we can reencrypted the key
2338 * the key when we want to change the password on it. */
2339 memcpy(saved_master_key, decrypted_master_key, crypt_ftr->keysize);
2340 saved_mount_point = strdup(mount_point);
2341 master_key_saved = 1;
2342 SLOGD("%s(): Master key saved\n", __FUNCTION__);
2343 rc = 0;
2344
2345 // Upgrade if we're not using the latest KDF.
Satya Tangirala23452c12021-03-22 23:29:15 -07002346 if (crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002347 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
2348 upgrade = 1;
Paul Crowley14c8c072018-09-18 13:30:21 -07002349 }
2350
2351 if (upgrade) {
2352 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
Bill Peckham0db11972018-10-10 10:25:42 -07002353 crypt_ftr->master_key, crypt_ftr, true);
Paul Crowley14c8c072018-09-18 13:30:21 -07002354 if (!rc) {
2355 rc = put_crypt_ftr_and_key(crypt_ftr);
2356 }
2357 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
2358
2359 // Do not fail even if upgrade failed - machine is bootable
2360 // Note that if this code is ever hit, there is a *serious* problem
2361 // since KDFs should never fail. You *must* fix the kdf before
2362 // proceeding!
2363 if (rc) {
2364 SLOGW(
2365 "Upgrade failed with error %d,"
2366 " but continuing with previous state",
2367 rc);
2368 rc = 0;
2369 }
2370 }
2371 }
2372
2373errout:
2374 if (intermediate_key) {
2375 memset(intermediate_key, 0, intermediate_key_size);
2376 free(intermediate_key);
2377 }
2378 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002379}
2380
Ken Sumrall29d8da82011-05-18 17:20:07 -07002381/*
Jeff Sharkey9c484982015-03-31 10:35:33 -07002382 * Called by vold when it's asked to mount an encrypted external
2383 * storage volume. The incoming partition has no crypto header/footer,
Greg Kaiser57f9af62018-02-16 13:13:58 -08002384 * as any metadata is been stored in a separate, small partition. We
2385 * assume it must be using our same crypt type and keysize.
Ken Sumrall29d8da82011-05-18 17:20:07 -07002386 */
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002387int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, const KeyBuffer& key,
Paul Crowley81796e92020-02-07 11:27:49 -08002388 std::string* out_crypto_blkdev) {
Paul Crowley220567c2020-02-07 12:45:20 -08002389 auto crypto_type = get_crypto_type();
2390 if (key.size() != crypto_type.get_keysize()) {
Paul Crowleya661fb62020-02-11 16:21:54 -08002391 SLOGE("Raw keysize %zu does not match crypt keysize %zu", key.size(),
Paul Crowley220567c2020-02-07 12:45:20 -08002392 crypto_type.get_keysize());
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002393 return -1;
2394 }
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002395 uint64_t nr_sec = 0;
2396 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07002397 SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno));
Ken Sumrall29d8da82011-05-18 17:20:07 -07002398 return -1;
2399 }
2400
Jeff Sharkey9c484982015-03-31 10:35:33 -07002401 struct crypt_mnt_ftr ext_crypt_ftr;
2402 memset(&ext_crypt_ftr, 0, sizeof(ext_crypt_ftr));
2403 ext_crypt_ftr.fs_size = nr_sec;
Paul Crowley220567c2020-02-07 12:45:20 -08002404 ext_crypt_ftr.keysize = crypto_type.get_keysize();
2405 strlcpy((char*)ext_crypt_ftr.crypto_type_name, crypto_type.get_kernel_name(),
Jeff Sharkey32ebb732017-03-27 16:18:50 -06002406 MAX_CRYPTO_TYPE_NAME_LEN);
Paul Crowley385cb8c2018-03-29 13:27:23 -07002407 uint32_t flags = 0;
Eric Biggersa701c452018-10-23 13:06:55 -07002408 if (fscrypt_is_native() &&
Paul Crowley385cb8c2018-03-29 13:27:23 -07002409 android::base::GetBoolProperty("ro.crypto.allow_encrypt_override", false))
2410 flags |= CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002411
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002412 return create_crypto_blk_dev(&ext_crypt_ftr, reinterpret_cast<const unsigned char*>(key.data()),
2413 real_blkdev, out_crypto_blkdev, label, flags);
Ken Sumrall29d8da82011-05-18 17:20:07 -07002414}
2415
Paul Crowley14c8c072018-09-18 13:30:21 -07002416int cryptfs_crypto_complete(void) {
2417 return do_crypto_complete("/data");
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002418}
2419
Paul Crowley14c8c072018-09-18 13:30:21 -07002420int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002421 char encrypted_state[PROPERTY_VALUE_MAX];
2422 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002423 if (master_key_saved || strcmp(encrypted_state, "encrypted")) {
2424 SLOGE(
2425 "encrypted fs already validated or not running with encryption,"
2426 " aborting");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002427 return -1;
2428 }
2429
2430 if (get_crypt_ftr_and_key(crypt_ftr)) {
2431 SLOGE("Error getting crypt footer and key");
2432 return -1;
2433 }
2434
2435 return 0;
2436}
2437
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302438#ifdef CONFIG_HW_DISK_ENCRYPTION
2439int cryptfs_check_passwd_hw(const char* passwd)
2440{
2441 struct crypt_mnt_ftr crypt_ftr;
2442 int rc;
2443 unsigned char master_key[KEY_LEN_BYTES];
2444
2445 /* get key */
2446 if (get_crypt_ftr_and_key(&crypt_ftr)) {
2447 SLOGE("Error getting crypt footer and key");
2448 return -1;
2449 }
2450
2451 /*
2452 * in case of manual encryption (from GUI), the encryption is done with
2453 * default password
2454 */
2455 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2456 /* compare scrypted_intermediate_key with stored scrypted_intermediate_key
2457 * which was created with actual password before reboot.
2458 */
2459 rc = cryptfs_get_master_key(&crypt_ftr, passwd, master_key);
2460 if (rc) {
2461 SLOGE("password doesn't match");
2462 rc = ++crypt_ftr.failed_decrypt_count;
2463 put_crypt_ftr_and_key(&crypt_ftr);
2464 return rc;
2465 }
2466
2467 rc = test_mount_hw_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD,
2468 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2469
2470 if (rc) {
2471 SLOGE("Default password did not match on reboot encryption");
2472 return rc;
2473 }
2474
2475 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2476 put_crypt_ftr_and_key(&crypt_ftr);
2477 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
2478 if (rc) {
2479 SLOGE("Could not change password on reboot encryption");
2480 return rc;
2481 }
2482 } else
2483 rc = test_mount_hw_encrypted_fs(&crypt_ftr, passwd,
2484 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2485
2486 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2487 cryptfs_clear_password();
2488 password = strdup(passwd);
2489 struct timespec now;
2490 clock_gettime(CLOCK_BOOTTIME, &now);
2491 password_expiry_time = now.tv_sec + password_max_age_seconds;
2492 }
2493
2494 return rc;
2495}
2496#endif
2497
Paul Crowley14c8c072018-09-18 13:30:21 -07002498int cryptfs_check_passwd(const char* passwd) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002499 SLOGI("cryptfs_check_passwd");
Eric Biggersa701c452018-10-23 13:06:55 -07002500 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002501 SLOGE("cryptfs_check_passwd not valid for file encryption");
2502 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002503 }
2504
Paul Lawrencef4faa572014-01-29 13:31:03 -08002505 struct crypt_mnt_ftr crypt_ftr;
2506 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002507
Paul Lawrencef4faa572014-01-29 13:31:03 -08002508 rc = check_unmounted_and_get_ftr(&crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002509 if (rc) {
2510 SLOGE("Could not get footer");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002511 return rc;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002512 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002513
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302514#ifdef CONFIG_HW_DISK_ENCRYPTION
2515 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
2516 return cryptfs_check_passwd_hw(passwd);
2517#endif
2518
Paul Crowley14c8c072018-09-18 13:30:21 -07002519 rc = test_mount_encrypted_fs(&crypt_ftr, passwd, DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002520 if (rc) {
2521 SLOGE("Password did not match");
2522 return rc;
2523 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002524
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002525 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2526 // Here we have a default actual password but a real password
2527 // we must test against the scrypted value
2528 // First, we must delete the crypto block device that
2529 // test_mount_encrypted_fs leaves behind as a side effect
2530 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Paul Crowley14c8c072018-09-18 13:30:21 -07002531 rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD, DATA_MNT_POINT,
2532 CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002533 if (rc) {
2534 SLOGE("Default password did not match on reboot encryption");
2535 return rc;
2536 }
2537
2538 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2539 put_crypt_ftr_and_key(&crypt_ftr);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302540 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002541 if (rc) {
2542 SLOGE("Could not change password on reboot encryption");
2543 return rc;
2544 }
2545 }
2546
2547 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002548 cryptfs_clear_password();
2549 password = strdup(passwd);
2550 struct timespec now;
2551 clock_gettime(CLOCK_BOOTTIME, &now);
2552 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002553 }
2554
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002555 return rc;
2556}
2557
Paul Crowley14c8c072018-09-18 13:30:21 -07002558int cryptfs_verify_passwd(const char* passwd) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002559 struct crypt_mnt_ftr crypt_ftr;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002560 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002561 char encrypted_state[PROPERTY_VALUE_MAX];
2562 int rc;
2563
2564 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002565 if (strcmp(encrypted_state, "encrypted")) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002566 SLOGE("device not encrypted, aborting");
2567 return -2;
2568 }
2569
2570 if (!master_key_saved) {
2571 SLOGE("encrypted fs not yet mounted, aborting");
2572 return -1;
2573 }
2574
2575 if (!saved_mount_point) {
2576 SLOGE("encrypted fs failed to save mount point, aborting");
2577 return -1;
2578 }
2579
Ken Sumrall160b4d62013-04-22 12:15:39 -07002580 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002581 SLOGE("Error getting crypt footer and key\n");
2582 return -1;
2583 }
2584
2585 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2586 /* If the device has no password, then just say the password is valid */
2587 rc = 0;
2588 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302589#ifdef CONFIG_HW_DISK_ENCRYPTION
2590 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
2591 if (verify_hw_fde_passwd(passwd, &crypt_ftr) >= 0)
2592 rc = 0;
2593 else
2594 rc = -1;
2595 } else {
2596 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
2597 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2598 /* They match, the password is correct */
2599 rc = 0;
2600 } else {
2601 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2602 sleep(1);
2603 rc = 1;
2604 }
2605 }
2606#else
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002607 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002608 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2609 /* They match, the password is correct */
2610 rc = 0;
2611 } else {
2612 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2613 sleep(1);
2614 rc = 1;
2615 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302616#endif
Ken Sumrall3ad90722011-10-04 20:38:29 -07002617 }
2618
2619 return rc;
2620}
2621
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002622/* Initialize a crypt_mnt_ftr structure. The keysize is
Paul Crowley220567c2020-02-07 12:45:20 -08002623 * defaulted to get_crypto_type().get_keysize() bytes, and the filesystem size to 0.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002624 * Presumably, at a minimum, the caller will update the
2625 * filesystem size and crypto_type_name after calling this function.
2626 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002627static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr* ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002628 off64_t off;
2629
2630 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002631 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002632 ftr->major_version = CURRENT_MAJOR_VERSION;
2633 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002634 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Paul Crowley220567c2020-02-07 12:45:20 -08002635 ftr->keysize = get_crypto_type().get_keysize();
Satya Tangirala23452c12021-03-22 23:29:15 -07002636 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002637
Kenny Rootc4c70f12013-06-14 12:11:38 -07002638 get_device_scrypt_params(ftr);
2639
Ken Sumrall160b4d62013-04-22 12:15:39 -07002640 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2641 if (get_crypt_ftr_info(NULL, &off) == 0) {
2642 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -07002643 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET + ftr->persist_data_size;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002644 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002645
2646 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002647}
2648
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002649#define FRAMEWORK_BOOT_WAIT 60
2650
Paul Crowleyb64933a2017-10-31 08:25:55 -07002651static int vold_unmountAll(void) {
2652 VolumeManager* vm = VolumeManager::Instance();
2653 return vm->unmountAll();
2654}
2655
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002656int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) {
Paul Crowley81796e92020-02-07 11:27:49 -08002657 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002658 std::string real_blkdev;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002659 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -07002660 int rc = -1, i;
Paul Lawrence87999172014-02-20 12:21:31 -08002661 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07002662 struct crypt_persist_data* pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002663 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -07002664 char lockid[32] = {0};
Tom Cherry4c5bde22019-01-29 14:34:01 -08002665 std::string key_loc;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002666 int num_vols;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002667 bool rebootEncryption = false;
Wei Wang4375f1b2017-02-24 17:43:01 -08002668 bool onlyCreateHeader = false;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302669#ifdef CONFIG_HW_DISK_ENCRYPTION
2670 unsigned char newpw[32];
2671 int key_index = 0;
2672#endif
2673 int index = 0;
Kalesh Singh98062dc2021-02-22 15:10:45 -05002674
2675 /* Get a wakelock as this may take a while, and we don't want the
2676 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2677 * wants to keep the screen on, it can grab a full wakelock.
2678 */
2679 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int)getpid());
2680 auto wl = android::wakelock::WakeLock::tryGet(lockid);
2681 if (!wl.has_value()) {
2682 return android::UNEXPECTED_NULL;
2683 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302684
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002685 if (get_crypt_ftr_and_key(&crypt_ftr) == 0) {
Eric Biggersc01995e2020-11-03 14:11:00 -08002686 if (crypt_ftr.flags & CRYPT_FORCE_ENCRYPTION) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002687 if (!check_ftr_sha(&crypt_ftr)) {
2688 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
2689 put_crypt_ftr_and_key(&crypt_ftr);
2690 goto error_unencrypted;
2691 }
2692
2693 /* Doing a reboot-encryption*/
2694 crypt_ftr.flags &= ~CRYPT_FORCE_ENCRYPTION;
2695 crypt_ftr.flags |= CRYPT_FORCE_COMPLETE;
2696 rebootEncryption = true;
2697 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08002698 } else {
2699 // We don't want to accidentally reference invalid data.
2700 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
Paul Lawrence87999172014-02-20 12:21:31 -08002701 }
2702
2703 property_get("ro.crypto.state", encrypted_state, "");
Eric Biggersc01995e2020-11-03 14:11:00 -08002704 if (!strcmp(encrypted_state, "encrypted")) {
Paul Lawrence87999172014-02-20 12:21:31 -08002705 SLOGE("Device is already running encrypted, aborting");
2706 goto error_unencrypted;
2707 }
2708
Tom Cherry4c5bde22019-01-29 14:34:01 -08002709 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002710
Ken Sumrall3ed82362011-01-28 23:31:16 -08002711 /* Get the size of the real block device */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002712 uint64_t nr_sec;
2713 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002714 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Ken Sumrall3ed82362011-01-28 23:31:16 -08002715 goto error_unencrypted;
2716 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002717
2718 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002719 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002720 uint64_t fs_size_sec, max_fs_size_sec;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002721 fs_size_sec = get_fs_size(real_blkdev.c_str());
2722 if (fs_size_sec == 0) fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev.data());
Daniel Rosenberge82df162014-08-15 22:19:23 +00002723
Paul Lawrence87999172014-02-20 12:21:31 -08002724 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002725
2726 if (fs_size_sec > max_fs_size_sec) {
2727 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2728 goto error_unencrypted;
2729 }
2730 }
2731
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002732 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002733 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002734 */
2735 property_set("vold.decrypt", "trigger_shutdown_framework");
2736 SLOGD("Just asked init to shut down class main\n");
2737
Jeff Sharkey9c484982015-03-31 10:35:33 -07002738 /* Ask vold to unmount all devices that it manages */
2739 if (vold_unmountAll()) {
2740 SLOGE("Failed to unmount all vold managed devices");
Ken Sumrall2eaf7132011-01-14 12:45:48 -08002741 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002742
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002743 /* no_ui means we are being called from init, not settings.
2744 Now we always reboot from settings, so !no_ui means reboot
2745 */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002746 if (!no_ui) {
2747 /* Try fallback, which is to reboot and try there */
2748 onlyCreateHeader = true;
2749 FILE* breadcrumb = fopen(BREADCRUMB_FILE, "we");
2750 if (breadcrumb == 0) {
2751 SLOGE("Failed to create breadcrumb file");
2752 goto error_shutting_down;
2753 }
2754 fclose(breadcrumb);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002755 }
2756
2757 /* Do extra work for a better UX when doing the long inplace encryption */
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002758 if (!onlyCreateHeader) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002759 /* Now that /data is unmounted, we need to mount a tmpfs
2760 * /data, set a property saying we're doing inplace encryption,
2761 * and restart the framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002762 */
Eric Biggersb4faeb82021-05-10 17:44:34 -07002763 wait_and_unmount(DATA_MNT_POINT);
Ken Sumralle5032c42012-04-01 23:58:44 -07002764 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002765 goto error_shutting_down;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002766 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002767 /* Tells the framework that inplace encryption is starting */
Ken Sumrall7df84122011-01-18 14:04:08 -08002768 property_set("vold.encrypt_progress", "0");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002769
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002770 /* restart the framework. */
2771 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07002772 prep_data_fs();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002773
Ken Sumrall92736ef2012-10-17 20:57:14 -07002774 /* Ugh, shutting down the framework is not synchronous, so until it
2775 * can be fixed, this horrible hack will wait a moment for it all to
2776 * shut down before proceeding. Without it, some devices cannot
2777 * restart the graphics services.
2778 */
2779 sleep(2);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002780 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002781
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002782 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002783 /* Initialize a crypt_mnt_ftr for the partition */
Eric Biggersc01995e2020-11-03 14:11:00 -08002784 if (!rebootEncryption) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002785 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
2786 goto error_shutting_down;
2787 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002788
Tom Cherry4c5bde22019-01-29 14:34:01 -08002789 if (key_loc == KEY_IN_FOOTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002790 crypt_ftr.fs_size = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Paul Lawrence87999172014-02-20 12:21:31 -08002791 } else {
2792 crypt_ftr.fs_size = nr_sec;
2793 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07002794 /* At this point, we are in an inconsistent state. Until we successfully
2795 complete encryption, a reboot will leave us broken. So mark the
2796 encryption failed in case that happens.
2797 On successfully completing encryption, remove this flag */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002798 if (onlyCreateHeader) {
2799 crypt_ftr.flags |= CRYPT_FORCE_ENCRYPTION;
2800 } else {
2801 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2802 }
Paul Lawrence87999172014-02-20 12:21:31 -08002803 crypt_ftr.crypt_type = crypt_type;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302804#ifdef CONFIG_HW_DISK_ENCRYPTION
Bill Peckham0db11972018-10-10 10:25:42 -07002805 strlcpy((char*)crypt_ftr.crypto_type_name, "aes-xts",
2806 MAX_CRYPTO_TYPE_NAME_LEN);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302807#else
Paul Crowley220567c2020-02-07 12:45:20 -08002808 strlcpy((char*)crypt_ftr.crypto_type_name, get_crypto_type().get_kernel_name(),
Paul Crowley14c8c072018-09-18 13:30:21 -07002809 MAX_CRYPTO_TYPE_NAME_LEN);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302810#endif
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002811
Paul Lawrence87999172014-02-20 12:21:31 -08002812 /* Make an encrypted master key */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002813 if (create_encrypted_random_key(onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2814 crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
Paul Lawrence87999172014-02-20 12:21:31 -08002815 SLOGE("Cannot create encrypted master key\n");
2816 goto error_shutting_down;
2817 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002818
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002819 /* Replace scrypted intermediate key if we are preparing for a reboot */
2820 if (onlyCreateHeader) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08002821 unsigned char fake_master_key[MAX_KEY_LEN];
2822 unsigned char encrypted_fake_master_key[MAX_KEY_LEN];
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002823 memset(fake_master_key, 0, sizeof(fake_master_key));
Paul Crowley14c8c072018-09-18 13:30:21 -07002824 encrypt_master_key(passwd, crypt_ftr.salt, fake_master_key, encrypted_fake_master_key,
Bill Peckham0db11972018-10-10 10:25:42 -07002825 &crypt_ftr, true);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002826 }
2827
Paul Lawrence87999172014-02-20 12:21:31 -08002828 /* Write the key to the end of the partition */
2829 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002830
Paul Lawrence87999172014-02-20 12:21:31 -08002831 /* If any persistent data has been remembered, save it.
2832 * If none, create a valid empty table and save that.
2833 */
2834 if (!persist_data) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002835 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
2836 if (pdata) {
2837 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
2838 persist_data = pdata;
2839 }
Paul Lawrence87999172014-02-20 12:21:31 -08002840 }
2841 if (persist_data) {
2842 save_persistent_data();
2843 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002844 }
2845
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302846 /* When encryption triggered from settings, encryption starts after reboot.
2847 So set the encryption key when the actual encryption starts.
2848 */
2849#ifdef CONFIG_HW_DISK_ENCRYPTION
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002850 if (!rebootEncryption)
2851 clear_hw_device_encryption_key();
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302852
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002853 if (get_keymaster_hw_fde_passwd(
2854 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2855 newpw, crypt_ftr.salt, &crypt_ftr))
2856 key_index = set_hw_device_encryption_key(
2857 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2858 (char*)crypt_ftr.crypto_type_name);
2859 else
2860 key_index = set_hw_device_encryption_key((const char*)newpw,
2861 (char*) crypt_ftr.crypto_type_name);
2862 if (key_index < 0)
2863 goto error_shutting_down;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302864
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002865 crypt_ftr.flags |= CRYPT_ASCII_PASSWORD_UPDATED;
2866 put_crypt_ftr_and_key(&crypt_ftr);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302867#endif
2868
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002869 if (onlyCreateHeader) {
2870 sleep(2);
Josh Gaofec44372017-08-28 13:22:55 -07002871 cryptfs_reboot(RebootType::reboot);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302872 } else {
2873 /* Do extra work for a better UX when doing the long inplace encryption */
2874 /* Now that /data is unmounted, we need to mount a tmpfs
2875 * /data, set a property saying we're doing inplace encryption,
2876 * and restart the framework.
2877 */
2878 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
2879 goto error_shutting_down;
2880 }
2881 /* Tells the framework that inplace encryption is starting */
2882 property_set("vold.encrypt_progress", "0");
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002883
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302884 /* restart the framework. */
2885 /* Create necessary paths on /data */
2886 prep_data_fs();
2887
2888 /* Ugh, shutting down the framework is not synchronous, so until it
2889 * can be fixed, this horrible hack will wait a moment for it all to
2890 * shut down before proceeding. Without it, some devices cannot
2891 * restart the graphics services.
2892 */
2893 sleep(2);
2894
Ajay Dudani87701e22014-09-17 21:02:52 -07002895 /* startup service classes main and late_start */
2896 property_set("vold.decrypt", "trigger_restart_min_framework");
2897 SLOGD("Just triggered restart_min_framework\n");
2898
2899 /* OK, the framework is restarted and will soon be showing a
2900 * progress bar. Time to setup an encrypted mapping, and
2901 * either write a new filesystem, or encrypt in place updating
2902 * the progress bar as we work.
2903 */
2904 }
2905
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002906 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302907#ifdef CONFIG_HW_DISK_ENCRYPTION
2908 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name) && is_ice_enabled())
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302909#ifdef CONFIG_HW_DISK_ENCRYPT_PERF
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002910 crypto_blkdev = real_blkdev;
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302911#else
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002912 create_crypto_blk_dev_hw(&crypt_ftr, (unsigned char*)&key_index, real_blkdev.c_str(), &crypto_blkdev,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302913 CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302914#endif
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302915 else
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002916 create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302917 CRYPTO_BLOCK_DEVICE, 0);
2918#else
Paul Crowley81796e92020-02-07 11:27:49 -08002919 create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
Paul Crowley5afbc622017-11-27 09:42:17 -08002920 CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302921#endif
Ken Sumrall29d8da82011-05-18 17:20:07 -07002922
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302923#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2924 if (set_ice_param(START_ENC)) {
2925 SLOGE("Failed to set ICE data");
2926 goto error_shutting_down;
2927 }
2928#endif
Paul Lawrence87999172014-02-20 12:21:31 -08002929 if (!rc) {
Eric Biggersf038c5f2020-11-03 14:11:02 -08002930 if (encrypt_inplace(crypto_blkdev, real_blkdev, crypt_ftr.fs_size, true)) {
2931 crypt_ftr.encrypted_upto = crypt_ftr.fs_size;
2932 rc = 0;
2933 } else {
Paul Lawrence87999172014-02-20 12:21:31 -08002934 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002935 }
Eric Biggers88f993b2020-11-03 14:11:00 -08002936 /* Undo the dm-crypt mapping whether we succeed or not */
2937 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002938 }
2939
Paul Crowley14c8c072018-09-18 13:30:21 -07002940 if (!rc) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002941 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002942 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002943
Paul Lawrence6bfed202014-07-28 12:47:22 -07002944 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08002945
Eric Biggersc01995e2020-11-03 14:11:00 -08002946 char value[PROPERTY_VALUE_MAX];
2947 property_get("ro.crypto.state", value, "");
2948 if (!strcmp(value, "")) {
2949 /* default encryption - continue first boot sequence */
2950 property_set("ro.crypto.state", "encrypted");
2951 property_set("ro.crypto.type", "block");
Kalesh Singh98062dc2021-02-22 15:10:45 -05002952 wl.reset();
Eric Biggersc01995e2020-11-03 14:11:00 -08002953 if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2954 // Bring up cryptkeeper that will check the password and set it
2955 property_set("vold.decrypt", "trigger_shutdown_framework");
2956 sleep(2);
2957 property_set("vold.encrypt_progress", "");
2958 cryptfs_trigger_restart_min_framework();
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002959 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002960 cryptfs_check_passwd(DEFAULT_PASSWORD);
2961 cryptfs_restart_internal(1);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002962 }
Eric Biggersc01995e2020-11-03 14:11:00 -08002963 return 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002964 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002965 sleep(2); /* Give the UI a chance to show 100% progress */
2966 cryptfs_reboot(RebootType::reboot);
Paul Lawrence87999172014-02-20 12:21:31 -08002967 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002968 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002969 char value[PROPERTY_VALUE_MAX];
2970
Ken Sumrall319369a2012-06-27 16:30:18 -07002971 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002972 if (!strcmp(value, "1")) {
2973 /* wipe data if encryption failed */
2974 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
Wei Wang4375f1b2017-02-24 17:43:01 -08002975 std::string err;
2976 const std::vector<std::string> options = {
Paul Crowley14c8c072018-09-18 13:30:21 -07002977 "--wipe_data\n--reason=cryptfs_enable_internal\n"};
Wei Wang4375f1b2017-02-24 17:43:01 -08002978 if (!write_bootloader_message(options, &err)) {
2979 SLOGE("could not write bootloader message: %s", err.c_str());
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002980 }
Josh Gaofec44372017-08-28 13:22:55 -07002981 cryptfs_reboot(RebootType::recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002982 } else {
2983 /* set property to trigger dialog */
2984 property_set("vold.encrypt_progress", "error_partially_encrypted");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002985 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002986 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002987 }
2988
Ken Sumrall3ed82362011-01-28 23:31:16 -08002989 /* hrm, the encrypt step claims success, but the reboot failed.
2990 * This should not happen.
2991 * Set the property and return. Hope the framework can deal with it.
2992 */
2993 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002994 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08002995
2996error_unencrypted:
2997 property_set("vold.encrypt_progress", "error_not_encrypted");
2998 return -1;
2999
3000error_shutting_down:
3001 /* we failed, and have not encrypted anthing, so the users's data is still intact,
3002 * but the framework is stopped and not restarted to show the error, so it's up to
3003 * vold to restart the system.
3004 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003005 SLOGE(
3006 "Error enabling encryption after framework is shutdown, no data changed, restarting "
3007 "system");
Josh Gaofec44372017-08-28 13:22:55 -07003008 cryptfs_reboot(RebootType::reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08003009
3010 /* shouldn't get here */
3011 property_set("vold.encrypt_progress", "error_shutting_down");
3012 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003013}
3014
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08003015int cryptfs_enable(int type, const char* passwd, int no_ui) {
3016 return cryptfs_enable_internal(type, passwd, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08003017}
3018
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08003019int cryptfs_enable_default(int no_ui) {
3020 return cryptfs_enable_internal(CRYPT_TYPE_DEFAULT, DEFAULT_PASSWORD, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08003021}
3022
Bill Peckham0db11972018-10-10 10:25:42 -07003023int cryptfs_changepw(int crypt_type, const char* currentpw, const char* newpw) {
Eric Biggersa701c452018-10-23 13:06:55 -07003024 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003025 SLOGE("cryptfs_changepw not valid for file encryption");
3026 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08003027 }
3028
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003029 struct crypt_mnt_ftr crypt_ftr;
JP Abgrall933216c2015-02-11 13:44:32 -08003030 int rc;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003031
3032 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08003033 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08003034 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003035 return -1;
3036 }
3037
Paul Lawrencef4faa572014-01-29 13:31:03 -08003038 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3039 SLOGE("Invalid crypt_type %d", crypt_type);
3040 return -1;
3041 }
3042
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003043 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003044 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08003045 SLOGE("Error getting crypt footer and key");
3046 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003047 }
3048
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303049#ifdef CONFIG_HW_DISK_ENCRYPTION
3050 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
3051 return cryptfs_changepw_hw_fde(crypt_type, currentpw, newpw);
3052 else {
3053 crypt_ftr.crypt_type = crypt_type;
3054
3055 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ?
3056 DEFAULT_PASSWORD : newpw,
3057 crypt_ftr.salt,
3058 saved_master_key,
3059 crypt_ftr.master_key,
3060 &crypt_ftr, false);
3061 if (rc) {
3062 SLOGE("Encrypt master key failed: %d", rc);
3063 return -1;
3064 }
3065 /* save the key */
3066 put_crypt_ftr_and_key(&crypt_ftr);
3067
3068 return 0;
3069 }
3070#else
Paul Lawrencef4faa572014-01-29 13:31:03 -08003071 crypt_ftr.crypt_type = crypt_type;
3072
Paul Crowley14c8c072018-09-18 13:30:21 -07003073 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw,
Bill Peckham0db11972018-10-10 10:25:42 -07003074 crypt_ftr.salt, saved_master_key, crypt_ftr.master_key, &crypt_ftr,
3075 false);
JP Abgrall933216c2015-02-11 13:44:32 -08003076 if (rc) {
3077 SLOGE("Encrypt master key failed: %d", rc);
3078 return -1;
3079 }
Jason parks70a4b3f2011-01-28 10:10:47 -06003080 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003081 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003082
3083 return 0;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303084#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003085}
Ken Sumrall160b4d62013-04-22 12:15:39 -07003086
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303087#ifdef CONFIG_HW_DISK_ENCRYPTION
3088int cryptfs_changepw_hw_fde(int crypt_type, const char *currentpw, const char *newpw)
3089{
3090 struct crypt_mnt_ftr crypt_ftr;
3091 int rc;
3092 int previous_type;
3093
3094 /* get key */
3095 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3096 SLOGE("Error getting crypt footer and key");
3097 return -1;
3098 }
3099
3100 previous_type = crypt_ftr.crypt_type;
3101 int rc1;
3102 unsigned char tmp_curpw[32] = {0};
3103 rc1 = get_keymaster_hw_fde_passwd(crypt_ftr.crypt_type == CRYPT_TYPE_DEFAULT ?
3104 DEFAULT_PASSWORD : currentpw, tmp_curpw,
3105 crypt_ftr.salt, &crypt_ftr);
3106
3107 crypt_ftr.crypt_type = crypt_type;
3108
3109 int ret, rc2;
3110 unsigned char tmp_newpw[32] = {0};
3111
3112 rc2 = get_keymaster_hw_fde_passwd(crypt_type == CRYPT_TYPE_DEFAULT ?
3113 DEFAULT_PASSWORD : newpw , tmp_newpw,
3114 crypt_ftr.salt, &crypt_ftr);
3115
3116 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
3117 ret = update_hw_device_encryption_key(
3118 rc1 ? (previous_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : currentpw) : (const char*)tmp_curpw,
3119 rc2 ? (crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw): (const char*)tmp_newpw,
3120 (char*)crypt_ftr.crypto_type_name);
3121 if (ret) {
3122 SLOGE("Error updating device encryption hardware key ret %d", ret);
3123 return -1;
3124 } else {
3125 SLOGI("Encryption hardware key updated");
3126 }
3127 }
3128
3129 /* save the key */
3130 put_crypt_ftr_and_key(&crypt_ftr);
3131 return 0;
3132}
3133#endif
3134
Rubin Xu85c01f92014-10-13 12:49:54 +01003135static unsigned int persist_get_max_entries(int encrypted) {
3136 struct crypt_mnt_ftr crypt_ftr;
3137 unsigned int dsize;
Rubin Xu85c01f92014-10-13 12:49:54 +01003138
3139 /* If encrypted, use the values from the crypt_ftr, otherwise
3140 * use the values for the current spec.
3141 */
3142 if (encrypted) {
3143 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Rubin Xud78181b2018-10-09 16:13:38 +01003144 /* Something is wrong, assume no space for entries */
3145 return 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01003146 }
3147 dsize = crypt_ftr.persist_data_size;
3148 } else {
3149 dsize = CRYPT_PERSIST_DATA_SIZE;
3150 }
3151
Rubin Xud78181b2018-10-09 16:13:38 +01003152 if (dsize > sizeof(struct crypt_persist_data)) {
3153 return (dsize - sizeof(struct crypt_persist_data)) / sizeof(struct crypt_persist_entry);
3154 } else {
3155 return 0;
3156 }
Rubin Xu85c01f92014-10-13 12:49:54 +01003157}
3158
Paul Crowley14c8c072018-09-18 13:30:21 -07003159static int persist_get_key(const char* fieldname, char* value) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003160 unsigned int i;
3161
3162 if (persist_data == NULL) {
3163 return -1;
3164 }
3165 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3166 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3167 /* We found it! */
3168 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
3169 return 0;
3170 }
3171 }
3172
3173 return -1;
3174}
3175
Paul Crowley14c8c072018-09-18 13:30:21 -07003176static int persist_set_key(const char* fieldname, const char* value, int encrypted) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003177 unsigned int i;
3178 unsigned int num;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003179 unsigned int max_persistent_entries;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003180
3181 if (persist_data == NULL) {
3182 return -1;
3183 }
3184
Rubin Xu85c01f92014-10-13 12:49:54 +01003185 max_persistent_entries = persist_get_max_entries(encrypted);
Ken Sumrall160b4d62013-04-22 12:15:39 -07003186
3187 num = persist_data->persist_valid_entries;
3188
3189 for (i = 0; i < num; i++) {
3190 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3191 /* We found an existing entry, update it! */
3192 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
3193 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
3194 return 0;
3195 }
3196 }
3197
3198 /* We didn't find it, add it to the end, if there is room */
3199 if (persist_data->persist_valid_entries < max_persistent_entries) {
3200 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
3201 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
3202 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
3203 persist_data->persist_valid_entries++;
3204 return 0;
3205 }
3206
3207 return -1;
3208}
3209
Rubin Xu85c01f92014-10-13 12:49:54 +01003210/**
3211 * Test if key is part of the multi-entry (field, index) sequence. Return non-zero if key is in the
3212 * sequence and its index is greater than or equal to index. Return 0 otherwise.
3213 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003214int match_multi_entry(const char* key, const char* field, unsigned index) {
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003215 std::string key_ = key;
3216 std::string field_ = field;
Rubin Xu85c01f92014-10-13 12:49:54 +01003217
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003218 std::string parsed_field;
3219 unsigned parsed_index;
3220
3221 std::string::size_type split = key_.find_last_of('_');
3222 if (split == std::string::npos) {
3223 parsed_field = key_;
3224 parsed_index = 0;
3225 } else {
3226 parsed_field = key_.substr(0, split);
3227 parsed_index = std::stoi(key_.substr(split + 1));
Rubin Xu85c01f92014-10-13 12:49:54 +01003228 }
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003229
3230 return parsed_field == field_ && parsed_index >= index;
Rubin Xu85c01f92014-10-13 12:49:54 +01003231}
3232
3233/*
3234 * Delete entry/entries from persist_data. If the entries are part of a multi-segment field, all
3235 * remaining entries starting from index will be deleted.
3236 * returns PERSIST_DEL_KEY_OK if deletion succeeds,
3237 * PERSIST_DEL_KEY_ERROR_NO_FIELD if the field does not exist,
3238 * and PERSIST_DEL_KEY_ERROR_OTHER if error occurs.
3239 *
3240 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003241static int persist_del_keys(const char* fieldname, unsigned index) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003242 unsigned int i;
3243 unsigned int j;
3244 unsigned int num;
3245
3246 if (persist_data == NULL) {
3247 return PERSIST_DEL_KEY_ERROR_OTHER;
3248 }
3249
3250 num = persist_data->persist_valid_entries;
3251
Paul Crowley14c8c072018-09-18 13:30:21 -07003252 j = 0; // points to the end of non-deleted entries.
Rubin Xu85c01f92014-10-13 12:49:54 +01003253 // Filter out to-be-deleted entries in place.
3254 for (i = 0; i < num; i++) {
3255 if (!match_multi_entry(persist_data->persist_entry[i].key, fieldname, index)) {
3256 persist_data->persist_entry[j] = persist_data->persist_entry[i];
3257 j++;
3258 }
3259 }
3260
3261 if (j < num) {
3262 persist_data->persist_valid_entries = j;
3263 // Zeroise the remaining entries
3264 memset(&persist_data->persist_entry[j], 0, (num - j) * sizeof(struct crypt_persist_entry));
3265 return PERSIST_DEL_KEY_OK;
3266 } else {
3267 // Did not find an entry matching the given fieldname
3268 return PERSIST_DEL_KEY_ERROR_NO_FIELD;
3269 }
3270}
3271
Paul Crowley14c8c072018-09-18 13:30:21 -07003272static int persist_count_keys(const char* fieldname) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003273 unsigned int i;
3274 unsigned int count;
3275
3276 if (persist_data == NULL) {
3277 return -1;
3278 }
3279
3280 count = 0;
3281 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3282 if (match_multi_entry(persist_data->persist_entry[i].key, fieldname, 0)) {
3283 count++;
3284 }
3285 }
3286
3287 return count;
3288}
3289
Ken Sumrall160b4d62013-04-22 12:15:39 -07003290/* Return the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07003291int cryptfs_getfield(const char* fieldname, char* value, int len) {
Eric Biggersa701c452018-10-23 13:06:55 -07003292 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003293 SLOGE("Cannot get field when file encrypted");
3294 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003295 }
3296
Ken Sumrall160b4d62013-04-22 12:15:39 -07003297 char temp_value[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003298 /* CRYPTO_GETFIELD_OK is success,
3299 * CRYPTO_GETFIELD_ERROR_NO_FIELD is value not set,
3300 * CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL is buffer (as given by len) too small,
3301 * CRYPTO_GETFIELD_ERROR_OTHER is any other error
Ken Sumrall160b4d62013-04-22 12:15:39 -07003302 */
Rubin Xu85c01f92014-10-13 12:49:54 +01003303 int rc = CRYPTO_GETFIELD_ERROR_OTHER;
3304 int i;
3305 char temp_field[PROPERTY_KEY_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -07003306
3307 if (persist_data == NULL) {
3308 load_persistent_data();
3309 if (persist_data == NULL) {
3310 SLOGE("Getfield error, cannot load persistent data");
3311 goto out;
3312 }
3313 }
3314
Rubin Xu85c01f92014-10-13 12:49:54 +01003315 // Read value from persistent entries. If the original value is split into multiple entries,
3316 // stitch them back together.
Ken Sumrall160b4d62013-04-22 12:15:39 -07003317 if (!persist_get_key(fieldname, temp_value)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003318 // We found it, copy it to the caller's buffer and keep going until all entries are read.
Paul Crowley14c8c072018-09-18 13:30:21 -07003319 if (strlcpy(value, temp_value, len) >= (unsigned)len) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003320 // value too small
3321 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3322 goto out;
3323 }
3324 rc = CRYPTO_GETFIELD_OK;
3325
3326 for (i = 1; /* break explicitly */; i++) {
3327 if (snprintf(temp_field, sizeof(temp_field), "%s_%d", fieldname, i) >=
Paul Crowley14c8c072018-09-18 13:30:21 -07003328 (int)sizeof(temp_field)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003329 // If the fieldname is very long, we stop as soon as it begins to overflow the
3330 // maximum field length. At this point we have in fact fully read out the original
3331 // value because cryptfs_setfield would not allow fields with longer names to be
3332 // written in the first place.
3333 break;
3334 }
3335 if (!persist_get_key(temp_field, temp_value)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07003336 if (strlcat(value, temp_value, len) >= (unsigned)len) {
3337 // value too small.
3338 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3339 goto out;
3340 }
Rubin Xu85c01f92014-10-13 12:49:54 +01003341 } else {
3342 // Exhaust all entries.
3343 break;
3344 }
3345 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07003346 } else {
3347 /* Sadness, it's not there. Return the error */
Rubin Xu85c01f92014-10-13 12:49:54 +01003348 rc = CRYPTO_GETFIELD_ERROR_NO_FIELD;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003349 }
3350
3351out:
3352 return rc;
3353}
3354
3355/* Set the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07003356int cryptfs_setfield(const char* fieldname, const char* value) {
Eric Biggersa701c452018-10-23 13:06:55 -07003357 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003358 SLOGE("Cannot set field when file encrypted");
3359 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003360 }
3361
Ken Sumrall160b4d62013-04-22 12:15:39 -07003362 char encrypted_state[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003363 /* 0 is success, negative values are error */
3364 int rc = CRYPTO_SETFIELD_ERROR_OTHER;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003365 int encrypted = 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01003366 unsigned int field_id;
3367 char temp_field[PROPERTY_KEY_MAX];
3368 unsigned int num_entries;
3369 unsigned int max_keylen;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003370
3371 if (persist_data == NULL) {
3372 load_persistent_data();
3373 if (persist_data == NULL) {
3374 SLOGE("Setfield error, cannot load persistent data");
3375 goto out;
3376 }
3377 }
3378
3379 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07003380 if (!strcmp(encrypted_state, "encrypted")) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003381 encrypted = 1;
3382 }
3383
Rubin Xu85c01f92014-10-13 12:49:54 +01003384 // Compute the number of entries required to store value, each entry can store up to
3385 // (PROPERTY_VALUE_MAX - 1) chars
3386 if (strlen(value) == 0) {
3387 // Empty value also needs one entry to store.
3388 num_entries = 1;
3389 } else {
3390 num_entries = (strlen(value) + (PROPERTY_VALUE_MAX - 1) - 1) / (PROPERTY_VALUE_MAX - 1);
3391 }
3392
3393 max_keylen = strlen(fieldname);
3394 if (num_entries > 1) {
3395 // Need an extra "_%d" suffix.
3396 max_keylen += 1 + log10(num_entries);
3397 }
3398 if (max_keylen > PROPERTY_KEY_MAX - 1) {
3399 rc = CRYPTO_SETFIELD_ERROR_FIELD_TOO_LONG;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003400 goto out;
3401 }
3402
Rubin Xu85c01f92014-10-13 12:49:54 +01003403 // Make sure we have enough space to write the new value
3404 if (persist_data->persist_valid_entries + num_entries - persist_count_keys(fieldname) >
3405 persist_get_max_entries(encrypted)) {
3406 rc = CRYPTO_SETFIELD_ERROR_VALUE_TOO_LONG;
3407 goto out;
3408 }
3409
3410 // Now that we know persist_data has enough space for value, let's delete the old field first
3411 // to make up space.
3412 persist_del_keys(fieldname, 0);
3413
3414 if (persist_set_key(fieldname, value, encrypted)) {
3415 // fail to set key, should not happen as we have already checked the available space
3416 SLOGE("persist_set_key() error during setfield()");
3417 goto out;
3418 }
3419
3420 for (field_id = 1; field_id < num_entries; field_id++) {
Greg Kaiserb610e772018-02-09 09:19:54 -08003421 snprintf(temp_field, sizeof(temp_field), "%s_%u", fieldname, field_id);
Rubin Xu85c01f92014-10-13 12:49:54 +01003422
3423 if (persist_set_key(temp_field, value + field_id * (PROPERTY_VALUE_MAX - 1), encrypted)) {
3424 // fail to set key, should not happen as we have already checked the available space.
3425 SLOGE("persist_set_key() error during setfield()");
3426 goto out;
3427 }
3428 }
3429
Ken Sumrall160b4d62013-04-22 12:15:39 -07003430 /* If we are running encrypted, save the persistent data now */
3431 if (encrypted) {
3432 if (save_persistent_data()) {
3433 SLOGE("Setfield error, cannot save persistent data");
3434 goto out;
3435 }
3436 }
3437
Rubin Xu85c01f92014-10-13 12:49:54 +01003438 rc = CRYPTO_SETFIELD_OK;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003439
3440out:
3441 return rc;
3442}
Paul Lawrencef4faa572014-01-29 13:31:03 -08003443
3444/* Checks userdata. Attempt to mount the volume if default-
3445 * encrypted.
3446 * On success trigger next init phase and return 0.
3447 * Currently do not handle failure - see TODO below.
3448 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003449int cryptfs_mount_default_encrypted(void) {
Paul Lawrence84274cc2016-04-15 15:41:33 -07003450 int crypt_type = cryptfs_get_password_type();
3451 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3452 SLOGE("Bad crypt type - error");
3453 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07003454 SLOGD(
3455 "Password is not default - "
3456 "starting min framework to prompt");
Paul Lawrence84274cc2016-04-15 15:41:33 -07003457 property_set("vold.decrypt", "trigger_restart_min_framework");
3458 return 0;
3459 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
3460 SLOGD("Password is default - restarting filesystem");
3461 cryptfs_restart_internal(0);
3462 return 0;
Paul Lawrencef4faa572014-01-29 13:31:03 -08003463 } else {
Paul Lawrence84274cc2016-04-15 15:41:33 -07003464 SLOGE("Encrypted, default crypt type but can't decrypt");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003465 }
3466
Paul Lawrence6bfed202014-07-28 12:47:22 -07003467 /** Corrupt. Allow us to boot into framework, which will detect bad
3468 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08003469 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07003470 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003471 return 0;
3472}
3473
3474/* Returns type of the password, default, pattern, pin or password.
3475 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003476int cryptfs_get_password_type(void) {
Eric Biggersa701c452018-10-23 13:06:55 -07003477 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003478 SLOGE("cryptfs_get_password_type not valid for file encryption");
3479 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08003480 }
3481
Paul Lawrencef4faa572014-01-29 13:31:03 -08003482 struct crypt_mnt_ftr crypt_ftr;
3483
3484 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3485 SLOGE("Error getting crypt footer and key\n");
3486 return -1;
3487 }
3488
Paul Lawrence6bfed202014-07-28 12:47:22 -07003489 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
3490 return -1;
3491 }
3492
Paul Lawrencef4faa572014-01-29 13:31:03 -08003493 return crypt_ftr.crypt_type;
3494}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003495
Paul Crowley14c8c072018-09-18 13:30:21 -07003496const char* cryptfs_get_password() {
Eric Biggersa701c452018-10-23 13:06:55 -07003497 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003498 SLOGE("cryptfs_get_password not valid for file encryption");
3499 return 0;
Paul Lawrence05335c32015-03-05 09:46:23 -08003500 }
3501
Paul Lawrence399317e2014-03-10 13:20:50 -07003502 struct timespec now;
Paul Lawrenceef2b5be2014-11-11 12:47:03 -08003503 clock_gettime(CLOCK_BOOTTIME, &now);
Paul Lawrence399317e2014-03-10 13:20:50 -07003504 if (now.tv_sec < password_expiry_time) {
3505 return password;
3506 } else {
3507 cryptfs_clear_password();
3508 return 0;
3509 }
3510}
3511
Paul Crowley14c8c072018-09-18 13:30:21 -07003512void cryptfs_clear_password() {
Paul Lawrence399317e2014-03-10 13:20:50 -07003513 if (password) {
3514 size_t len = strlen(password);
3515 memset(password, 0, len);
3516 free(password);
3517 password = 0;
3518 password_expiry_time = 0;
3519 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003520}
Paul Lawrence731a7a22015-04-28 22:14:15 +00003521
Paul Crowley14c8c072018-09-18 13:30:21 -07003522int cryptfs_isConvertibleToFBE() {
Tom Cherry4c5bde22019-01-29 14:34:01 -08003523 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
3524 return entry && entry->fs_mgr_flags.force_fde_or_fbe;
Paul Lawrence0c247462015-10-29 10:30:57 -07003525}
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303526
3527int cryptfs_create_default_ftr(struct crypt_mnt_ftr* crypt_ftr, __attribute__((unused))int key_length)
3528{
3529 if (cryptfs_init_crypt_mnt_ftr(crypt_ftr)) {
3530 SLOGE("Failed to initialize crypt_ftr");
3531 return -1;
3532 }
3533
3534 if (create_encrypted_random_key(DEFAULT_PASSWORD, crypt_ftr->master_key,
3535 crypt_ftr->salt, crypt_ftr)) {
3536 SLOGE("Cannot create encrypted master key\n");
3537 return -1;
3538 }
3539
3540 //crypt_ftr->keysize = key_length / 8;
3541 return 0;
3542}
3543
3544int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password,
3545 unsigned char* master_key)
3546{
3547 int rc;
3548
3549 unsigned char* intermediate_key = 0;
3550 size_t intermediate_key_size = 0;
3551
3552 if (password == 0 || *password == 0) {
3553 password = DEFAULT_PASSWORD;
3554 }
3555
3556 rc = decrypt_master_key(password, master_key, ftr, &intermediate_key,
3557 &intermediate_key_size);
3558
3559 if (rc) {
3560 SLOGE("Can't calculate intermediate key");
3561 return rc;
3562 }
3563
3564 int N = 1 << ftr->N_factor;
3565 int r = 1 << ftr->r_factor;
3566 int p = 1 << ftr->p_factor;
3567
3568 unsigned char scrypted_intermediate_key[sizeof(ftr->scrypted_intermediate_key)];
3569
3570 rc = crypto_scrypt(intermediate_key, intermediate_key_size,
3571 ftr->salt, sizeof(ftr->salt), N, r, p,
3572 scrypted_intermediate_key,
3573 sizeof(scrypted_intermediate_key));
3574
3575 free(intermediate_key);
3576
3577 if (rc) {
3578 SLOGE("Can't scrypt intermediate key");
3579 return rc;
3580 }
3581
3582 return memcmp(scrypted_intermediate_key, ftr->scrypted_intermediate_key,
3583 intermediate_key_size);
3584}