blob: a303fa905e66ced8b73b001049ddeabb4722f803 [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);
Phanindra Babu Pabba569698a2021-06-04 10:01:59 +05301839#define WAIT_UNMOUNT_COUNT 20
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);
Phanindra Babu Pabba569698a2021-06-04 10:01:59 +05301863 if (i == 2) {
Eric Biggersb4faeb82021-05-10 17:44:34 -07001864 SLOGW("sending SIGTERM to processes with open files\n");
1865 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGTERM);
Phanindra Babu Pabba569698a2021-06-04 10:01:59 +05301866 } else if (i >= 3) {
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 }
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302014 if (!(rc = wait_and_unmount(DATA_MNT_POINT))) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302015#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 }
Phanindra Babu Pabba569698a2021-06-04 10:01:59 +05302022 if (!(rc = wait_and_unmount(DATA_MNT_POINT))) {
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302023#endif
Doug Zongker6fd57712013-12-17 09:43:23 -08002024 /* If ro.crypto.readonly is set to 1, mount the decrypted
2025 * filesystem readonly. This is used when /data is mounted by
2026 * recovery mode.
2027 */
2028 char ro_prop[PROPERTY_VALUE_MAX];
2029 property_get("ro.crypto.readonly", ro_prop, "");
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002030 if (strlen(ro_prop) > 0 && std::stoi(ro_prop)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002031 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
2032 if (entry != nullptr) {
2033 entry->flags |= MS_RDONLY;
Luis Hector Chavezf86566f2018-05-30 15:47:50 -07002034 }
Doug Zongker6fd57712013-12-17 09:43:23 -08002035 }
JP Abgrall62c7af32014-06-16 13:01:23 -07002036
Ken Sumralle5032c42012-04-01 23:58:44 -07002037 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002038 int retries = RETRY_MOUNT_ATTEMPTS;
2039 int mount_rc;
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002040
2041 /*
2042 * fs_mgr_do_mount runs fsck. Use setexeccon to run trusted
2043 * partitions in the fsck domain.
2044 */
LongPing Wei7f3ab952019-01-30 16:03:14 +08002045 if (setexeccon(android::vold::sFsckContext)) {
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002046 SLOGE("Failed to setexeccon");
2047 return -1;
2048 }
Daniel Rosenberg4f684712018-08-28 01:58:49 -07002049 bool needs_cp = android::vold::cp_needsCheckpoint();
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302050#ifdef CONFIG_HW_DISK_ENCRYPTION
Yifan Hong804afe12019-02-07 12:56:47 -08002051 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, blkdev.data(), 0,
Paul Lawrence67f90442020-06-12 08:12:48 -07002052 needs_cp, false)) != 0) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302053#else
Yifan Hong804afe12019-02-07 12:56:47 -08002054 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, crypto_blkdev.data(), 0,
Steven Laver60b2b8d2020-06-19 08:37:05 -07002055 needs_cp, false)) != 0) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302056#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002057 if (mount_rc == FS_MGR_DOMNT_BUSY) {
2058 /* TODO: invoke something similar to
2059 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
2060 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302061#ifdef CONFIG_HW_DISK_ENCRYPTION
Yifan Hong804afe12019-02-07 12:56:47 -08002062 SLOGI("Failed to mount %s because it is busy - waiting", blkdev.c_str());
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302063#else
Yifan Hong804afe12019-02-07 12:56:47 -08002064 SLOGI("Failed to mount %s because it is busy - waiting", crypto_blkdev.c_str());
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302065#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002066 if (--retries) {
2067 sleep(RETRY_MOUNT_DELAY_SECONDS);
2068 } else {
2069 /* Let's hope that a reboot clears away whatever is keeping
2070 the mount busy */
Josh Gaofec44372017-08-28 13:22:55 -07002071 cryptfs_reboot(RebootType::reboot);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002072 }
2073 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302074#ifdef CONFIG_HW_DISK_ENCRYPTION
2075 if (--retries) {
2076 sleep(RETRY_MOUNT_DELAY_SECONDS);
2077 } else {
2078 SLOGE("Failed to mount decrypted data");
2079 cryptfs_set_corrupt();
2080 cryptfs_trigger_restart_min_framework();
2081 SLOGI("Started framework to offer wipe");
2082 return -1;
2083 }
2084#else
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002085 SLOGE("Failed to mount decrypted data");
2086 cryptfs_set_corrupt();
2087 cryptfs_trigger_restart_min_framework();
2088 SLOGI("Started framework to offer wipe");
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002089 if (setexeccon(NULL)) {
2090 SLOGE("Failed to setexeccon");
2091 }
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002092 return -1;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302093#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07002094 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07002095 }
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08002096 if (setexeccon(NULL)) {
2097 SLOGE("Failed to setexeccon");
2098 return -1;
2099 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002100
Ken Sumralle5032c42012-04-01 23:58:44 -07002101 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07002102 prep_data_fs();
Seigo Nonakae2ef0c02016-06-20 17:05:40 +09002103 property_set("vold.decrypt", "trigger_load_persist_props");
Ken Sumralle5032c42012-04-01 23:58:44 -07002104
2105 /* startup service classes main and late_start */
2106 property_set("vold.decrypt", "trigger_restart_framework");
2107 SLOGD("Just triggered restart_framework\n");
2108
2109 /* Give it a few moments to get started */
2110 sleep(1);
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302111#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002112 }
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302113#endif
Ken Sumrall0cc16632011-01-18 20:32:26 -08002114 if (rc == 0) {
2115 restart_successful = 1;
2116 }
2117
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002118 return rc;
2119}
2120
Paul Crowley14c8c072018-09-18 13:30:21 -07002121int cryptfs_restart(void) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002122 SLOGI("cryptfs_restart");
Eric Biggersa701c452018-10-23 13:06:55 -07002123 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002124 SLOGE("cryptfs_restart not valid for file encryption:");
2125 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002126 }
2127
Paul Lawrencef4faa572014-01-29 13:31:03 -08002128 /* Call internal implementation forcing a restart of main service group */
2129 return cryptfs_restart_internal(1);
2130}
2131
Paul Crowley14c8c072018-09-18 13:30:21 -07002132static int do_crypto_complete(const char* mount_point) {
2133 struct crypt_mnt_ftr crypt_ftr;
2134 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002135
Paul Crowley14c8c072018-09-18 13:30:21 -07002136 property_get("ro.crypto.state", encrypted_state, "");
2137 if (strcmp(encrypted_state, "encrypted")) {
2138 SLOGE("not running with encryption, aborting");
2139 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08002140 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002141
Paul Crowley14c8c072018-09-18 13:30:21 -07002142 // crypto_complete is full disk encrypted status
Eric Biggersa701c452018-10-23 13:06:55 -07002143 if (fscrypt_is_native()) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002144 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
2145 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07002146
Paul Crowley14c8c072018-09-18 13:30:21 -07002147 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002148 std::string key_loc;
2149 get_crypt_info(&key_loc, nullptr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002150
Paul Crowley14c8c072018-09-18 13:30:21 -07002151 /*
2152 * Only report this error if key_loc is a file and it exists.
2153 * If the device was never encrypted, and /data is not mountable for
2154 * some reason, returning 1 should prevent the UI from presenting the
2155 * a "enter password" screen, or worse, a "press button to wipe the
2156 * device" screen.
2157 */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002158 if (!key_loc.empty() && key_loc[0] == '/' && (access("key_loc", F_OK) == -1)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002159 SLOGE("master key file does not exist, aborting");
2160 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
2161 } else {
2162 SLOGE("Error getting crypt footer and key\n");
2163 return CRYPTO_COMPLETE_BAD_METADATA;
2164 }
2165 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002166
Paul Crowley14c8c072018-09-18 13:30:21 -07002167 // Test for possible error flags
2168 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
2169 SLOGE("Encryption process is partway completed\n");
2170 return CRYPTO_COMPLETE_PARTIAL;
2171 }
2172
2173 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
2174 SLOGE("Encryption process was interrupted but cannot continue\n");
2175 return CRYPTO_COMPLETE_INCONSISTENT;
2176 }
2177
2178 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT) {
2179 SLOGE("Encryption is successful but data is corrupt\n");
2180 return CRYPTO_COMPLETE_CORRUPT;
2181 }
2182
2183 /* We passed the test! We shall diminish, and return to the west */
2184 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002185}
2186
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302187#ifdef CONFIG_HW_DISK_ENCRYPTION
2188static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
2189 const char *passwd, const char *mount_point, const char *label)
2190{
Bill Peckham0db11972018-10-10 10:25:42 -07002191 /* Allocate enough space for a 256 bit key, but we may use less */
2192 unsigned char decrypted_master_key[32];
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302193 std::string crypto_blkdev_hw;
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002194 std::string crypto_blkdev;
Yifan Hong804afe12019-02-07 12:56:47 -08002195 std::string real_blkdev;
Bill Peckham0db11972018-10-10 10:25:42 -07002196 unsigned int orig_failed_decrypt_count;
2197 int rc = 0;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302198
Bill Peckham0db11972018-10-10 10:25:42 -07002199 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2200 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302201
Yifan Hong804afe12019-02-07 12:56:47 -08002202 get_crypt_info(nullptr, &real_blkdev);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302203
Bill Peckham0db11972018-10-10 10:25:42 -07002204 int key_index = 0;
2205 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
2206 key_index = verify_and_update_hw_fde_passwd(passwd, crypt_ftr);
2207 if (key_index < 0) {
2208 rc = crypt_ftr->failed_decrypt_count;
2209 goto errout;
2210 }
2211 else {
2212 if (is_ice_enabled()) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302213#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
Neeraj Soni73b46952019-09-12 16:47:27 +05302214 if (create_crypto_blk_dev_hw(crypt_ftr, (unsigned char*)&key_index,
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302215 real_blkdev.c_str(), &crypto_blkdev_hw, label, 0)) {
Bill Peckham0db11972018-10-10 10:25:42 -07002216 SLOGE("Error creating decrypted block device");
2217 rc = -1;
2218 goto errout;
2219 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302220#endif
Bill Peckham0db11972018-10-10 10:25:42 -07002221 } else {
2222 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key,
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002223 real_blkdev.c_str(), &crypto_blkdev, label, 0)) {
Bill Peckham0db11972018-10-10 10:25:42 -07002224 SLOGE("Error creating decrypted block device");
2225 rc = -1;
2226 goto errout;
2227 }
2228 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302229 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302230 }
2231
Bill Peckham0db11972018-10-10 10:25:42 -07002232 if (rc == 0) {
2233 crypt_ftr->failed_decrypt_count = 0;
2234 if (orig_failed_decrypt_count != 0) {
2235 put_crypt_ftr_and_key(crypt_ftr);
2236 }
2237
2238 /* Save the name of the crypto block device
2239 * so we can mount it when restarting the framework. */
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302240 if (is_ice_enabled()) {
2241#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
2242 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev_hw.c_str());
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002243#endif
Phanindra Babu Pabba4c4b58e2020-12-07 16:29:26 +05302244 } else {
2245 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
2246 }
Bill Peckham0db11972018-10-10 10:25:42 -07002247 master_key_saved = 1;
2248 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302249
Bill Peckham0db11972018-10-10 10:25:42 -07002250 errout:
2251 return rc;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302252}
2253#endif
2254
Paul Crowley14c8c072018-09-18 13:30:21 -07002255static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, const char* passwd,
2256 const char* mount_point, const char* label) {
2257 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley81796e92020-02-07 11:27:49 -08002258 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002259 std::string real_blkdev;
Paul Crowley14c8c072018-09-18 13:30:21 -07002260 char tmp_mount_point[64];
2261 unsigned int orig_failed_decrypt_count;
2262 int rc;
Paul Crowley14c8c072018-09-18 13:30:21 -07002263 int upgrade = 0;
2264 unsigned char* intermediate_key = 0;
2265 size_t intermediate_key_size = 0;
2266 int N = 1 << crypt_ftr->N_factor;
2267 int r = 1 << crypt_ftr->r_factor;
2268 int p = 1 << crypt_ftr->p_factor;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302269
Paul Crowley14c8c072018-09-18 13:30:21 -07002270 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2271 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002272
Paul Crowley14c8c072018-09-18 13:30:21 -07002273 if (!(crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED)) {
2274 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr, &intermediate_key,
2275 &intermediate_key_size)) {
2276 SLOGE("Failed to decrypt master key\n");
2277 rc = -1;
2278 goto errout;
2279 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08002280 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002281
Tom Cherry4c5bde22019-01-29 14:34:01 -08002282 get_crypt_info(nullptr, &real_blkdev);
Paul Lawrencef4faa572014-01-29 13:31:03 -08002283
Paul Crowley14c8c072018-09-18 13:30:21 -07002284 // Create crypto block device - all (non fatal) code paths
2285 // need it
Paul Crowley81796e92020-02-07 11:27:49 -08002286 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
Tom Cherry4c5bde22019-01-29 14:34:01 -08002287 label, 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002288 SLOGE("Error creating decrypted block device\n");
2289 rc = -1;
2290 goto errout;
2291 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002292
Paul Crowley14c8c072018-09-18 13:30:21 -07002293 /* Work out if the problem is the password or the data */
2294 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->scrypted_intermediate_key)];
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002295
Paul Crowley14c8c072018-09-18 13:30:21 -07002296 rc = crypto_scrypt(intermediate_key, intermediate_key_size, crypt_ftr->salt,
2297 sizeof(crypt_ftr->salt), N, r, p, scrypted_intermediate_key,
2298 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002299
Paul Crowley14c8c072018-09-18 13:30:21 -07002300 // Does the key match the crypto footer?
2301 if (rc == 0 && memcmp(scrypted_intermediate_key, crypt_ftr->scrypted_intermediate_key,
2302 sizeof(scrypted_intermediate_key)) == 0) {
2303 SLOGI("Password matches");
2304 rc = 0;
Paul Lawrence74f29f12014-08-28 15:54:10 -07002305 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07002306 /* Try mounting the file system anyway, just in case the problem's with
2307 * the footer, not the key. */
2308 snprintf(tmp_mount_point, sizeof(tmp_mount_point), "%s/tmp_mnt", mount_point);
2309 mkdir(tmp_mount_point, 0755);
Paul Crowley81796e92020-02-07 11:27:49 -08002310 if (fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT,
2311 const_cast<char*>(crypto_blkdev.c_str()), tmp_mount_point)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002312 SLOGE("Error temp mounting decrypted block device\n");
2313 delete_crypto_blk_dev(label);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002314
Paul Crowley14c8c072018-09-18 13:30:21 -07002315 rc = ++crypt_ftr->failed_decrypt_count;
2316 put_crypt_ftr_and_key(crypt_ftr);
2317 } else {
2318 /* Success! */
2319 SLOGI("Password did not match but decrypted drive mounted - continue");
2320 umount(tmp_mount_point);
2321 rc = 0;
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07002322 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08002323 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002324
Paul Crowley14c8c072018-09-18 13:30:21 -07002325 if (rc == 0) {
2326 crypt_ftr->failed_decrypt_count = 0;
2327 if (orig_failed_decrypt_count != 0) {
2328 put_crypt_ftr_and_key(crypt_ftr);
2329 }
2330
2331 /* Save the name of the crypto block device
2332 * so we can mount it when restarting the framework. */
Paul Crowley81796e92020-02-07 11:27:49 -08002333 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -07002334
2335 /* Also save a the master key so we can reencrypted the key
2336 * the key when we want to change the password on it. */
2337 memcpy(saved_master_key, decrypted_master_key, crypt_ftr->keysize);
2338 saved_mount_point = strdup(mount_point);
2339 master_key_saved = 1;
2340 SLOGD("%s(): Master key saved\n", __FUNCTION__);
2341 rc = 0;
2342
2343 // Upgrade if we're not using the latest KDF.
Satya Tangirala23452c12021-03-22 23:29:15 -07002344 if (crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002345 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
2346 upgrade = 1;
Paul Crowley14c8c072018-09-18 13:30:21 -07002347 }
2348
2349 if (upgrade) {
2350 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
Bill Peckham0db11972018-10-10 10:25:42 -07002351 crypt_ftr->master_key, crypt_ftr, true);
Paul Crowley14c8c072018-09-18 13:30:21 -07002352 if (!rc) {
2353 rc = put_crypt_ftr_and_key(crypt_ftr);
2354 }
2355 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
2356
2357 // Do not fail even if upgrade failed - machine is bootable
2358 // Note that if this code is ever hit, there is a *serious* problem
2359 // since KDFs should never fail. You *must* fix the kdf before
2360 // proceeding!
2361 if (rc) {
2362 SLOGW(
2363 "Upgrade failed with error %d,"
2364 " but continuing with previous state",
2365 rc);
2366 rc = 0;
2367 }
2368 }
2369 }
2370
2371errout:
2372 if (intermediate_key) {
2373 memset(intermediate_key, 0, intermediate_key_size);
2374 free(intermediate_key);
2375 }
2376 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002377}
2378
Ken Sumrall29d8da82011-05-18 17:20:07 -07002379/*
Jeff Sharkey9c484982015-03-31 10:35:33 -07002380 * Called by vold when it's asked to mount an encrypted external
2381 * storage volume. The incoming partition has no crypto header/footer,
Greg Kaiser57f9af62018-02-16 13:13:58 -08002382 * as any metadata is been stored in a separate, small partition. We
2383 * assume it must be using our same crypt type and keysize.
Ken Sumrall29d8da82011-05-18 17:20:07 -07002384 */
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002385int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, const KeyBuffer& key,
Paul Crowley81796e92020-02-07 11:27:49 -08002386 std::string* out_crypto_blkdev) {
Paul Crowley220567c2020-02-07 12:45:20 -08002387 auto crypto_type = get_crypto_type();
2388 if (key.size() != crypto_type.get_keysize()) {
Paul Crowleya661fb62020-02-11 16:21:54 -08002389 SLOGE("Raw keysize %zu does not match crypt keysize %zu", key.size(),
Paul Crowley220567c2020-02-07 12:45:20 -08002390 crypto_type.get_keysize());
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002391 return -1;
2392 }
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002393 uint64_t nr_sec = 0;
2394 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07002395 SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno));
Ken Sumrall29d8da82011-05-18 17:20:07 -07002396 return -1;
2397 }
2398
Jeff Sharkey9c484982015-03-31 10:35:33 -07002399 struct crypt_mnt_ftr ext_crypt_ftr;
2400 memset(&ext_crypt_ftr, 0, sizeof(ext_crypt_ftr));
2401 ext_crypt_ftr.fs_size = nr_sec;
Paul Crowley220567c2020-02-07 12:45:20 -08002402 ext_crypt_ftr.keysize = crypto_type.get_keysize();
2403 strlcpy((char*)ext_crypt_ftr.crypto_type_name, crypto_type.get_kernel_name(),
Jeff Sharkey32ebb732017-03-27 16:18:50 -06002404 MAX_CRYPTO_TYPE_NAME_LEN);
Paul Crowley385cb8c2018-03-29 13:27:23 -07002405 uint32_t flags = 0;
Eric Biggersa701c452018-10-23 13:06:55 -07002406 if (fscrypt_is_native() &&
Paul Crowley385cb8c2018-03-29 13:27:23 -07002407 android::base::GetBoolProperty("ro.crypto.allow_encrypt_override", false))
2408 flags |= CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002409
Paul Crowley3d98f5d2020-02-07 11:49:09 -08002410 return create_crypto_blk_dev(&ext_crypt_ftr, reinterpret_cast<const unsigned char*>(key.data()),
2411 real_blkdev, out_crypto_blkdev, label, flags);
Ken Sumrall29d8da82011-05-18 17:20:07 -07002412}
2413
Paul Crowley14c8c072018-09-18 13:30:21 -07002414int cryptfs_crypto_complete(void) {
2415 return do_crypto_complete("/data");
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002416}
2417
Paul Crowley14c8c072018-09-18 13:30:21 -07002418int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002419 char encrypted_state[PROPERTY_VALUE_MAX];
2420 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002421 if (master_key_saved || strcmp(encrypted_state, "encrypted")) {
2422 SLOGE(
2423 "encrypted fs already validated or not running with encryption,"
2424 " aborting");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002425 return -1;
2426 }
2427
2428 if (get_crypt_ftr_and_key(crypt_ftr)) {
2429 SLOGE("Error getting crypt footer and key");
2430 return -1;
2431 }
2432
2433 return 0;
2434}
2435
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302436#ifdef CONFIG_HW_DISK_ENCRYPTION
2437int cryptfs_check_passwd_hw(const char* passwd)
2438{
2439 struct crypt_mnt_ftr crypt_ftr;
2440 int rc;
2441 unsigned char master_key[KEY_LEN_BYTES];
2442
2443 /* get key */
2444 if (get_crypt_ftr_and_key(&crypt_ftr)) {
2445 SLOGE("Error getting crypt footer and key");
2446 return -1;
2447 }
2448
2449 /*
2450 * in case of manual encryption (from GUI), the encryption is done with
2451 * default password
2452 */
2453 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2454 /* compare scrypted_intermediate_key with stored scrypted_intermediate_key
2455 * which was created with actual password before reboot.
2456 */
2457 rc = cryptfs_get_master_key(&crypt_ftr, passwd, master_key);
2458 if (rc) {
2459 SLOGE("password doesn't match");
2460 rc = ++crypt_ftr.failed_decrypt_count;
2461 put_crypt_ftr_and_key(&crypt_ftr);
2462 return rc;
2463 }
2464
2465 rc = test_mount_hw_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD,
2466 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2467
2468 if (rc) {
2469 SLOGE("Default password did not match on reboot encryption");
2470 return rc;
2471 }
2472
2473 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2474 put_crypt_ftr_and_key(&crypt_ftr);
2475 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
2476 if (rc) {
2477 SLOGE("Could not change password on reboot encryption");
2478 return rc;
2479 }
2480 } else
2481 rc = test_mount_hw_encrypted_fs(&crypt_ftr, passwd,
2482 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2483
2484 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2485 cryptfs_clear_password();
2486 password = strdup(passwd);
2487 struct timespec now;
2488 clock_gettime(CLOCK_BOOTTIME, &now);
2489 password_expiry_time = now.tv_sec + password_max_age_seconds;
2490 }
2491
2492 return rc;
2493}
2494#endif
2495
Paul Crowley14c8c072018-09-18 13:30:21 -07002496int cryptfs_check_passwd(const char* passwd) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002497 SLOGI("cryptfs_check_passwd");
Eric Biggersa701c452018-10-23 13:06:55 -07002498 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002499 SLOGE("cryptfs_check_passwd not valid for file encryption");
2500 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002501 }
2502
Paul Lawrencef4faa572014-01-29 13:31:03 -08002503 struct crypt_mnt_ftr crypt_ftr;
2504 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002505
Paul Lawrencef4faa572014-01-29 13:31:03 -08002506 rc = check_unmounted_and_get_ftr(&crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002507 if (rc) {
2508 SLOGE("Could not get footer");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002509 return rc;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002510 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002511
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302512#ifdef CONFIG_HW_DISK_ENCRYPTION
2513 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
2514 return cryptfs_check_passwd_hw(passwd);
2515#endif
2516
Paul Crowley14c8c072018-09-18 13:30:21 -07002517 rc = test_mount_encrypted_fs(&crypt_ftr, passwd, DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002518 if (rc) {
2519 SLOGE("Password did not match");
2520 return rc;
2521 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002522
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002523 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2524 // Here we have a default actual password but a real password
2525 // we must test against the scrypted value
2526 // First, we must delete the crypto block device that
2527 // test_mount_encrypted_fs leaves behind as a side effect
2528 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Paul Crowley14c8c072018-09-18 13:30:21 -07002529 rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD, DATA_MNT_POINT,
2530 CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002531 if (rc) {
2532 SLOGE("Default password did not match on reboot encryption");
2533 return rc;
2534 }
2535
2536 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2537 put_crypt_ftr_and_key(&crypt_ftr);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302538 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002539 if (rc) {
2540 SLOGE("Could not change password on reboot encryption");
2541 return rc;
2542 }
2543 }
2544
2545 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002546 cryptfs_clear_password();
2547 password = strdup(passwd);
2548 struct timespec now;
2549 clock_gettime(CLOCK_BOOTTIME, &now);
2550 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002551 }
2552
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002553 return rc;
2554}
2555
Paul Crowley14c8c072018-09-18 13:30:21 -07002556int cryptfs_verify_passwd(const char* passwd) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002557 struct crypt_mnt_ftr crypt_ftr;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002558 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002559 char encrypted_state[PROPERTY_VALUE_MAX];
2560 int rc;
2561
2562 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002563 if (strcmp(encrypted_state, "encrypted")) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002564 SLOGE("device not encrypted, aborting");
2565 return -2;
2566 }
2567
2568 if (!master_key_saved) {
2569 SLOGE("encrypted fs not yet mounted, aborting");
2570 return -1;
2571 }
2572
2573 if (!saved_mount_point) {
2574 SLOGE("encrypted fs failed to save mount point, aborting");
2575 return -1;
2576 }
2577
Ken Sumrall160b4d62013-04-22 12:15:39 -07002578 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002579 SLOGE("Error getting crypt footer and key\n");
2580 return -1;
2581 }
2582
2583 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2584 /* If the device has no password, then just say the password is valid */
2585 rc = 0;
2586 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302587#ifdef CONFIG_HW_DISK_ENCRYPTION
2588 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
2589 if (verify_hw_fde_passwd(passwd, &crypt_ftr) >= 0)
2590 rc = 0;
2591 else
2592 rc = -1;
2593 } else {
2594 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
2595 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2596 /* They match, the password is correct */
2597 rc = 0;
2598 } else {
2599 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2600 sleep(1);
2601 rc = 1;
2602 }
2603 }
2604#else
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002605 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002606 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2607 /* They match, the password is correct */
2608 rc = 0;
2609 } else {
2610 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2611 sleep(1);
2612 rc = 1;
2613 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302614#endif
Ken Sumrall3ad90722011-10-04 20:38:29 -07002615 }
2616
2617 return rc;
2618}
2619
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002620/* Initialize a crypt_mnt_ftr structure. The keysize is
Paul Crowley220567c2020-02-07 12:45:20 -08002621 * defaulted to get_crypto_type().get_keysize() bytes, and the filesystem size to 0.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002622 * Presumably, at a minimum, the caller will update the
2623 * filesystem size and crypto_type_name after calling this function.
2624 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002625static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr* ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002626 off64_t off;
2627
2628 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002629 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002630 ftr->major_version = CURRENT_MAJOR_VERSION;
2631 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002632 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Paul Crowley220567c2020-02-07 12:45:20 -08002633 ftr->keysize = get_crypto_type().get_keysize();
Satya Tangirala23452c12021-03-22 23:29:15 -07002634 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002635
Kenny Rootc4c70f12013-06-14 12:11:38 -07002636 get_device_scrypt_params(ftr);
2637
Ken Sumrall160b4d62013-04-22 12:15:39 -07002638 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2639 if (get_crypt_ftr_info(NULL, &off) == 0) {
2640 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -07002641 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET + ftr->persist_data_size;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002642 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002643
2644 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002645}
2646
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002647#define FRAMEWORK_BOOT_WAIT 60
2648
Paul Crowleyb64933a2017-10-31 08:25:55 -07002649static int vold_unmountAll(void) {
2650 VolumeManager* vm = VolumeManager::Instance();
2651 return vm->unmountAll();
2652}
2653
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002654int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) {
Paul Crowley81796e92020-02-07 11:27:49 -08002655 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002656 std::string real_blkdev;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002657 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -07002658 int rc = -1, i;
Paul Lawrence87999172014-02-20 12:21:31 -08002659 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07002660 struct crypt_persist_data* pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002661 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -07002662 char lockid[32] = {0};
Tom Cherry4c5bde22019-01-29 14:34:01 -08002663 std::string key_loc;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002664 int num_vols;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002665 bool rebootEncryption = false;
Wei Wang4375f1b2017-02-24 17:43:01 -08002666 bool onlyCreateHeader = false;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302667#ifdef CONFIG_HW_DISK_ENCRYPTION
2668 unsigned char newpw[32];
2669 int key_index = 0;
2670#endif
2671 int index = 0;
Kalesh Singh98062dc2021-02-22 15:10:45 -05002672
2673 /* Get a wakelock as this may take a while, and we don't want the
2674 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2675 * wants to keep the screen on, it can grab a full wakelock.
2676 */
2677 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int)getpid());
2678 auto wl = android::wakelock::WakeLock::tryGet(lockid);
2679 if (!wl.has_value()) {
2680 return android::UNEXPECTED_NULL;
2681 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302682
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002683 if (get_crypt_ftr_and_key(&crypt_ftr) == 0) {
Eric Biggersc01995e2020-11-03 14:11:00 -08002684 if (crypt_ftr.flags & CRYPT_FORCE_ENCRYPTION) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002685 if (!check_ftr_sha(&crypt_ftr)) {
2686 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
2687 put_crypt_ftr_and_key(&crypt_ftr);
2688 goto error_unencrypted;
2689 }
2690
2691 /* Doing a reboot-encryption*/
2692 crypt_ftr.flags &= ~CRYPT_FORCE_ENCRYPTION;
2693 crypt_ftr.flags |= CRYPT_FORCE_COMPLETE;
2694 rebootEncryption = true;
2695 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08002696 } else {
2697 // We don't want to accidentally reference invalid data.
2698 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
Paul Lawrence87999172014-02-20 12:21:31 -08002699 }
2700
2701 property_get("ro.crypto.state", encrypted_state, "");
Eric Biggersc01995e2020-11-03 14:11:00 -08002702 if (!strcmp(encrypted_state, "encrypted")) {
Paul Lawrence87999172014-02-20 12:21:31 -08002703 SLOGE("Device is already running encrypted, aborting");
2704 goto error_unencrypted;
2705 }
2706
Tom Cherry4c5bde22019-01-29 14:34:01 -08002707 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002708
Ken Sumrall3ed82362011-01-28 23:31:16 -08002709 /* Get the size of the real block device */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002710 uint64_t nr_sec;
2711 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002712 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Ken Sumrall3ed82362011-01-28 23:31:16 -08002713 goto error_unencrypted;
2714 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002715
2716 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002717 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002718 uint64_t fs_size_sec, max_fs_size_sec;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002719 fs_size_sec = get_fs_size(real_blkdev.c_str());
2720 if (fs_size_sec == 0) fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev.data());
Daniel Rosenberge82df162014-08-15 22:19:23 +00002721
Paul Lawrence87999172014-02-20 12:21:31 -08002722 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002723
2724 if (fs_size_sec > max_fs_size_sec) {
2725 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2726 goto error_unencrypted;
2727 }
2728 }
2729
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002730 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002731 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002732 */
2733 property_set("vold.decrypt", "trigger_shutdown_framework");
2734 SLOGD("Just asked init to shut down class main\n");
2735
Jeff Sharkey9c484982015-03-31 10:35:33 -07002736 /* Ask vold to unmount all devices that it manages */
2737 if (vold_unmountAll()) {
2738 SLOGE("Failed to unmount all vold managed devices");
Ken Sumrall2eaf7132011-01-14 12:45:48 -08002739 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002740
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002741 /* no_ui means we are being called from init, not settings.
2742 Now we always reboot from settings, so !no_ui means reboot
2743 */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002744 if (!no_ui) {
2745 /* Try fallback, which is to reboot and try there */
2746 onlyCreateHeader = true;
2747 FILE* breadcrumb = fopen(BREADCRUMB_FILE, "we");
2748 if (breadcrumb == 0) {
2749 SLOGE("Failed to create breadcrumb file");
2750 goto error_shutting_down;
2751 }
2752 fclose(breadcrumb);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002753 }
2754
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002755 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002756 /* Initialize a crypt_mnt_ftr for the partition */
Eric Biggersc01995e2020-11-03 14:11:00 -08002757 if (!rebootEncryption) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002758 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
2759 goto error_shutting_down;
2760 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002761
Tom Cherry4c5bde22019-01-29 14:34:01 -08002762 if (key_loc == KEY_IN_FOOTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002763 crypt_ftr.fs_size = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Paul Lawrence87999172014-02-20 12:21:31 -08002764 } else {
2765 crypt_ftr.fs_size = nr_sec;
2766 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07002767 /* At this point, we are in an inconsistent state. Until we successfully
2768 complete encryption, a reboot will leave us broken. So mark the
2769 encryption failed in case that happens.
2770 On successfully completing encryption, remove this flag */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002771 if (onlyCreateHeader) {
2772 crypt_ftr.flags |= CRYPT_FORCE_ENCRYPTION;
2773 } else {
2774 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2775 }
Paul Lawrence87999172014-02-20 12:21:31 -08002776 crypt_ftr.crypt_type = crypt_type;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302777#ifdef CONFIG_HW_DISK_ENCRYPTION
Bill Peckham0db11972018-10-10 10:25:42 -07002778 strlcpy((char*)crypt_ftr.crypto_type_name, "aes-xts",
2779 MAX_CRYPTO_TYPE_NAME_LEN);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302780#else
Paul Crowley220567c2020-02-07 12:45:20 -08002781 strlcpy((char*)crypt_ftr.crypto_type_name, get_crypto_type().get_kernel_name(),
Paul Crowley14c8c072018-09-18 13:30:21 -07002782 MAX_CRYPTO_TYPE_NAME_LEN);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302783#endif
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002784
Paul Lawrence87999172014-02-20 12:21:31 -08002785 /* Make an encrypted master key */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002786 if (create_encrypted_random_key(onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2787 crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
Paul Lawrence87999172014-02-20 12:21:31 -08002788 SLOGE("Cannot create encrypted master key\n");
2789 goto error_shutting_down;
2790 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002791
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002792 /* Replace scrypted intermediate key if we are preparing for a reboot */
2793 if (onlyCreateHeader) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08002794 unsigned char fake_master_key[MAX_KEY_LEN];
2795 unsigned char encrypted_fake_master_key[MAX_KEY_LEN];
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002796 memset(fake_master_key, 0, sizeof(fake_master_key));
Paul Crowley14c8c072018-09-18 13:30:21 -07002797 encrypt_master_key(passwd, crypt_ftr.salt, fake_master_key, encrypted_fake_master_key,
Bill Peckham0db11972018-10-10 10:25:42 -07002798 &crypt_ftr, true);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002799 }
2800
Paul Lawrence87999172014-02-20 12:21:31 -08002801 /* Write the key to the end of the partition */
2802 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002803
Paul Lawrence87999172014-02-20 12:21:31 -08002804 /* If any persistent data has been remembered, save it.
2805 * If none, create a valid empty table and save that.
2806 */
2807 if (!persist_data) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002808 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
2809 if (pdata) {
2810 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
2811 persist_data = pdata;
2812 }
Paul Lawrence87999172014-02-20 12:21:31 -08002813 }
2814 if (persist_data) {
2815 save_persistent_data();
2816 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002817 }
2818
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302819 /* When encryption triggered from settings, encryption starts after reboot.
2820 So set the encryption key when the actual encryption starts.
2821 */
2822#ifdef CONFIG_HW_DISK_ENCRYPTION
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002823 if (!rebootEncryption)
2824 clear_hw_device_encryption_key();
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302825
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002826 if (get_keymaster_hw_fde_passwd(
2827 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2828 newpw, crypt_ftr.salt, &crypt_ftr))
2829 key_index = set_hw_device_encryption_key(
2830 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2831 (char*)crypt_ftr.crypto_type_name);
2832 else
2833 key_index = set_hw_device_encryption_key((const char*)newpw,
2834 (char*) crypt_ftr.crypto_type_name);
2835 if (key_index < 0)
2836 goto error_shutting_down;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302837
Scott Lobdell7e4cbd72020-11-05 18:29:14 -08002838 crypt_ftr.flags |= CRYPT_ASCII_PASSWORD_UPDATED;
2839 put_crypt_ftr_and_key(&crypt_ftr);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302840#endif
2841
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002842 if (onlyCreateHeader) {
2843 sleep(2);
Josh Gaofec44372017-08-28 13:22:55 -07002844 cryptfs_reboot(RebootType::reboot);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302845 } else {
2846 /* Do extra work for a better UX when doing the long inplace encryption */
2847 /* Now that /data is unmounted, we need to mount a tmpfs
2848 * /data, set a property saying we're doing inplace encryption,
2849 * and restart the framework.
2850 */
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302851 wait_and_unmount(DATA_MNT_POINT);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302852 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
2853 goto error_shutting_down;
2854 }
2855 /* Tells the framework that inplace encryption is starting */
2856 property_set("vold.encrypt_progress", "0");
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002857
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302858 /* restart the framework. */
2859 /* Create necessary paths on /data */
2860 prep_data_fs();
2861
2862 /* Ugh, shutting down the framework is not synchronous, so until it
2863 * can be fixed, this horrible hack will wait a moment for it all to
2864 * shut down before proceeding. Without it, some devices cannot
2865 * restart the graphics services.
2866 */
2867 sleep(2);
2868
Ajay Dudani87701e22014-09-17 21:02:52 -07002869 /* startup service classes main and late_start */
2870 property_set("vold.decrypt", "trigger_restart_min_framework");
2871 SLOGD("Just triggered restart_min_framework\n");
2872
2873 /* OK, the framework is restarted and will soon be showing a
2874 * progress bar. Time to setup an encrypted mapping, and
2875 * either write a new filesystem, or encrypt in place updating
2876 * the progress bar as we work.
2877 */
2878 }
2879
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002880 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302881#ifdef CONFIG_HW_DISK_ENCRYPTION
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302882 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name) && is_ice_enabled()) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302883#ifdef CONFIG_HW_DISK_ENCRYPT_PERF
Steven Laver7fe4cdb2020-02-14 13:18:26 -08002884 crypto_blkdev = real_blkdev;
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302885 rc = 0;
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302886#else
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302887 rc = create_crypto_blk_dev_hw(&crypt_ftr, (unsigned char*)&key_index, real_blkdev.c_str(),
2888 &crypto_blkdev, CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302889#endif
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302890 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302891 else
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302892 rc = create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(),
2893 &crypto_blkdev, CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302894#else
Vaibhav Agrawale682cb82021-11-01 14:35:05 +05302895 rc = create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(),
2896 &crypto_blkdev, CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302897#endif
Ken Sumrall29d8da82011-05-18 17:20:07 -07002898
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302899#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2900 if (set_ice_param(START_ENC)) {
2901 SLOGE("Failed to set ICE data");
2902 goto error_shutting_down;
2903 }
2904#endif
Paul Lawrence87999172014-02-20 12:21:31 -08002905 if (!rc) {
Eric Biggersf038c5f2020-11-03 14:11:02 -08002906 if (encrypt_inplace(crypto_blkdev, real_blkdev, crypt_ftr.fs_size, true)) {
2907 crypt_ftr.encrypted_upto = crypt_ftr.fs_size;
2908 rc = 0;
2909 } else {
Paul Lawrence87999172014-02-20 12:21:31 -08002910 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002911 }
Eric Biggers88f993b2020-11-03 14:11:00 -08002912 /* Undo the dm-crypt mapping whether we succeed or not */
2913 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002914 }
2915
Paul Crowley14c8c072018-09-18 13:30:21 -07002916 if (!rc) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002917 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002918 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002919
Paul Lawrence6bfed202014-07-28 12:47:22 -07002920 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08002921
Eric Biggersc01995e2020-11-03 14:11:00 -08002922 char value[PROPERTY_VALUE_MAX];
2923 property_get("ro.crypto.state", value, "");
2924 if (!strcmp(value, "")) {
2925 /* default encryption - continue first boot sequence */
2926 property_set("ro.crypto.state", "encrypted");
2927 property_set("ro.crypto.type", "block");
Kalesh Singh98062dc2021-02-22 15:10:45 -05002928 wl.reset();
Eric Biggersc01995e2020-11-03 14:11:00 -08002929 if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2930 // Bring up cryptkeeper that will check the password and set it
2931 property_set("vold.decrypt", "trigger_shutdown_framework");
2932 sleep(2);
2933 property_set("vold.encrypt_progress", "");
2934 cryptfs_trigger_restart_min_framework();
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002935 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002936 cryptfs_check_passwd(DEFAULT_PASSWORD);
2937 cryptfs_restart_internal(1);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002938 }
Eric Biggersc01995e2020-11-03 14:11:00 -08002939 return 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002940 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002941 sleep(2); /* Give the UI a chance to show 100% progress */
2942 cryptfs_reboot(RebootType::reboot);
Paul Lawrence87999172014-02-20 12:21:31 -08002943 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002944 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002945 char value[PROPERTY_VALUE_MAX];
2946
Ken Sumrall319369a2012-06-27 16:30:18 -07002947 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002948 if (!strcmp(value, "1")) {
2949 /* wipe data if encryption failed */
2950 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
Wei Wang4375f1b2017-02-24 17:43:01 -08002951 std::string err;
2952 const std::vector<std::string> options = {
Paul Crowley14c8c072018-09-18 13:30:21 -07002953 "--wipe_data\n--reason=cryptfs_enable_internal\n"};
Wei Wang4375f1b2017-02-24 17:43:01 -08002954 if (!write_bootloader_message(options, &err)) {
2955 SLOGE("could not write bootloader message: %s", err.c_str());
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002956 }
Josh Gaofec44372017-08-28 13:22:55 -07002957 cryptfs_reboot(RebootType::recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002958 } else {
2959 /* set property to trigger dialog */
2960 property_set("vold.encrypt_progress", "error_partially_encrypted");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002961 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002962 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002963 }
2964
Ken Sumrall3ed82362011-01-28 23:31:16 -08002965 /* hrm, the encrypt step claims success, but the reboot failed.
2966 * This should not happen.
2967 * Set the property and return. Hope the framework can deal with it.
2968 */
2969 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002970 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08002971
2972error_unencrypted:
2973 property_set("vold.encrypt_progress", "error_not_encrypted");
2974 return -1;
2975
2976error_shutting_down:
2977 /* we failed, and have not encrypted anthing, so the users's data is still intact,
2978 * but the framework is stopped and not restarted to show the error, so it's up to
2979 * vold to restart the system.
2980 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002981 SLOGE(
2982 "Error enabling encryption after framework is shutdown, no data changed, restarting "
2983 "system");
Josh Gaofec44372017-08-28 13:22:55 -07002984 cryptfs_reboot(RebootType::reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002985
2986 /* shouldn't get here */
2987 property_set("vold.encrypt_progress", "error_shutting_down");
2988 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002989}
2990
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002991int cryptfs_enable(int type, const char* passwd, int no_ui) {
2992 return cryptfs_enable_internal(type, passwd, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002993}
2994
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002995int cryptfs_enable_default(int no_ui) {
2996 return cryptfs_enable_internal(CRYPT_TYPE_DEFAULT, DEFAULT_PASSWORD, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002997}
2998
Bill Peckham0db11972018-10-10 10:25:42 -07002999int cryptfs_changepw(int crypt_type, const char* currentpw, const char* newpw) {
Eric Biggersa701c452018-10-23 13:06:55 -07003000 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003001 SLOGE("cryptfs_changepw not valid for file encryption");
3002 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08003003 }
3004
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003005 struct crypt_mnt_ftr crypt_ftr;
JP Abgrall933216c2015-02-11 13:44:32 -08003006 int rc;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003007
3008 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08003009 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08003010 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003011 return -1;
3012 }
3013
Paul Lawrencef4faa572014-01-29 13:31:03 -08003014 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3015 SLOGE("Invalid crypt_type %d", crypt_type);
3016 return -1;
3017 }
3018
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003019 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003020 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08003021 SLOGE("Error getting crypt footer and key");
3022 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003023 }
3024
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303025#ifdef CONFIG_HW_DISK_ENCRYPTION
3026 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
3027 return cryptfs_changepw_hw_fde(crypt_type, currentpw, newpw);
3028 else {
3029 crypt_ftr.crypt_type = crypt_type;
3030
3031 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ?
3032 DEFAULT_PASSWORD : newpw,
3033 crypt_ftr.salt,
3034 saved_master_key,
3035 crypt_ftr.master_key,
3036 &crypt_ftr, false);
3037 if (rc) {
3038 SLOGE("Encrypt master key failed: %d", rc);
3039 return -1;
3040 }
3041 /* save the key */
3042 put_crypt_ftr_and_key(&crypt_ftr);
3043
3044 return 0;
3045 }
3046#else
Paul Lawrencef4faa572014-01-29 13:31:03 -08003047 crypt_ftr.crypt_type = crypt_type;
3048
Paul Crowley14c8c072018-09-18 13:30:21 -07003049 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw,
Bill Peckham0db11972018-10-10 10:25:42 -07003050 crypt_ftr.salt, saved_master_key, crypt_ftr.master_key, &crypt_ftr,
3051 false);
JP Abgrall933216c2015-02-11 13:44:32 -08003052 if (rc) {
3053 SLOGE("Encrypt master key failed: %d", rc);
3054 return -1;
3055 }
Jason parks70a4b3f2011-01-28 10:10:47 -06003056 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003057 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003058
3059 return 0;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303060#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003061}
Ken Sumrall160b4d62013-04-22 12:15:39 -07003062
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303063#ifdef CONFIG_HW_DISK_ENCRYPTION
3064int cryptfs_changepw_hw_fde(int crypt_type, const char *currentpw, const char *newpw)
3065{
3066 struct crypt_mnt_ftr crypt_ftr;
3067 int rc;
3068 int previous_type;
3069
3070 /* get key */
3071 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3072 SLOGE("Error getting crypt footer and key");
3073 return -1;
3074 }
3075
3076 previous_type = crypt_ftr.crypt_type;
3077 int rc1;
3078 unsigned char tmp_curpw[32] = {0};
3079 rc1 = get_keymaster_hw_fde_passwd(crypt_ftr.crypt_type == CRYPT_TYPE_DEFAULT ?
3080 DEFAULT_PASSWORD : currentpw, tmp_curpw,
3081 crypt_ftr.salt, &crypt_ftr);
3082
3083 crypt_ftr.crypt_type = crypt_type;
3084
3085 int ret, rc2;
3086 unsigned char tmp_newpw[32] = {0};
3087
3088 rc2 = get_keymaster_hw_fde_passwd(crypt_type == CRYPT_TYPE_DEFAULT ?
3089 DEFAULT_PASSWORD : newpw , tmp_newpw,
3090 crypt_ftr.salt, &crypt_ftr);
3091
3092 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
3093 ret = update_hw_device_encryption_key(
3094 rc1 ? (previous_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : currentpw) : (const char*)tmp_curpw,
3095 rc2 ? (crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw): (const char*)tmp_newpw,
3096 (char*)crypt_ftr.crypto_type_name);
3097 if (ret) {
3098 SLOGE("Error updating device encryption hardware key ret %d", ret);
3099 return -1;
3100 } else {
3101 SLOGI("Encryption hardware key updated");
3102 }
3103 }
3104
3105 /* save the key */
3106 put_crypt_ftr_and_key(&crypt_ftr);
3107 return 0;
3108}
3109#endif
3110
Rubin Xu85c01f92014-10-13 12:49:54 +01003111static unsigned int persist_get_max_entries(int encrypted) {
3112 struct crypt_mnt_ftr crypt_ftr;
3113 unsigned int dsize;
Rubin Xu85c01f92014-10-13 12:49:54 +01003114
3115 /* If encrypted, use the values from the crypt_ftr, otherwise
3116 * use the values for the current spec.
3117 */
3118 if (encrypted) {
3119 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Rubin Xud78181b2018-10-09 16:13:38 +01003120 /* Something is wrong, assume no space for entries */
3121 return 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01003122 }
3123 dsize = crypt_ftr.persist_data_size;
3124 } else {
3125 dsize = CRYPT_PERSIST_DATA_SIZE;
3126 }
3127
Rubin Xud78181b2018-10-09 16:13:38 +01003128 if (dsize > sizeof(struct crypt_persist_data)) {
3129 return (dsize - sizeof(struct crypt_persist_data)) / sizeof(struct crypt_persist_entry);
3130 } else {
3131 return 0;
3132 }
Rubin Xu85c01f92014-10-13 12:49:54 +01003133}
3134
Paul Crowley14c8c072018-09-18 13:30:21 -07003135static int persist_get_key(const char* fieldname, char* value) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003136 unsigned int i;
3137
3138 if (persist_data == NULL) {
3139 return -1;
3140 }
3141 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3142 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3143 /* We found it! */
3144 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
3145 return 0;
3146 }
3147 }
3148
3149 return -1;
3150}
3151
Paul Crowley14c8c072018-09-18 13:30:21 -07003152static int persist_set_key(const char* fieldname, const char* value, int encrypted) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003153 unsigned int i;
3154 unsigned int num;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003155 unsigned int max_persistent_entries;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003156
3157 if (persist_data == NULL) {
3158 return -1;
3159 }
3160
Rubin Xu85c01f92014-10-13 12:49:54 +01003161 max_persistent_entries = persist_get_max_entries(encrypted);
Ken Sumrall160b4d62013-04-22 12:15:39 -07003162
3163 num = persist_data->persist_valid_entries;
3164
3165 for (i = 0; i < num; i++) {
3166 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3167 /* We found an existing entry, update it! */
3168 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
3169 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
3170 return 0;
3171 }
3172 }
3173
3174 /* We didn't find it, add it to the end, if there is room */
3175 if (persist_data->persist_valid_entries < max_persistent_entries) {
3176 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
3177 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
3178 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
3179 persist_data->persist_valid_entries++;
3180 return 0;
3181 }
3182
3183 return -1;
3184}
3185
Rubin Xu85c01f92014-10-13 12:49:54 +01003186/**
3187 * Test if key is part of the multi-entry (field, index) sequence. Return non-zero if key is in the
3188 * sequence and its index is greater than or equal to index. Return 0 otherwise.
3189 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003190int match_multi_entry(const char* key, const char* field, unsigned index) {
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003191 std::string key_ = key;
3192 std::string field_ = field;
Rubin Xu85c01f92014-10-13 12:49:54 +01003193
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003194 std::string parsed_field;
3195 unsigned parsed_index;
3196
3197 std::string::size_type split = key_.find_last_of('_');
3198 if (split == std::string::npos) {
3199 parsed_field = key_;
3200 parsed_index = 0;
3201 } else {
3202 parsed_field = key_.substr(0, split);
3203 parsed_index = std::stoi(key_.substr(split + 1));
Rubin Xu85c01f92014-10-13 12:49:54 +01003204 }
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003205
3206 return parsed_field == field_ && parsed_index >= index;
Rubin Xu85c01f92014-10-13 12:49:54 +01003207}
3208
3209/*
3210 * Delete entry/entries from persist_data. If the entries are part of a multi-segment field, all
3211 * remaining entries starting from index will be deleted.
3212 * returns PERSIST_DEL_KEY_OK if deletion succeeds,
3213 * PERSIST_DEL_KEY_ERROR_NO_FIELD if the field does not exist,
3214 * and PERSIST_DEL_KEY_ERROR_OTHER if error occurs.
3215 *
3216 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003217static int persist_del_keys(const char* fieldname, unsigned index) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003218 unsigned int i;
3219 unsigned int j;
3220 unsigned int num;
3221
3222 if (persist_data == NULL) {
3223 return PERSIST_DEL_KEY_ERROR_OTHER;
3224 }
3225
3226 num = persist_data->persist_valid_entries;
3227
Paul Crowley14c8c072018-09-18 13:30:21 -07003228 j = 0; // points to the end of non-deleted entries.
Rubin Xu85c01f92014-10-13 12:49:54 +01003229 // Filter out to-be-deleted entries in place.
3230 for (i = 0; i < num; i++) {
3231 if (!match_multi_entry(persist_data->persist_entry[i].key, fieldname, index)) {
3232 persist_data->persist_entry[j] = persist_data->persist_entry[i];
3233 j++;
3234 }
3235 }
3236
3237 if (j < num) {
3238 persist_data->persist_valid_entries = j;
3239 // Zeroise the remaining entries
3240 memset(&persist_data->persist_entry[j], 0, (num - j) * sizeof(struct crypt_persist_entry));
3241 return PERSIST_DEL_KEY_OK;
3242 } else {
3243 // Did not find an entry matching the given fieldname
3244 return PERSIST_DEL_KEY_ERROR_NO_FIELD;
3245 }
3246}
3247
Paul Crowley14c8c072018-09-18 13:30:21 -07003248static int persist_count_keys(const char* fieldname) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003249 unsigned int i;
3250 unsigned int count;
3251
3252 if (persist_data == NULL) {
3253 return -1;
3254 }
3255
3256 count = 0;
3257 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3258 if (match_multi_entry(persist_data->persist_entry[i].key, fieldname, 0)) {
3259 count++;
3260 }
3261 }
3262
3263 return count;
3264}
3265
Ken Sumrall160b4d62013-04-22 12:15:39 -07003266/* Return the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07003267int cryptfs_getfield(const char* fieldname, char* value, int len) {
Eric Biggersa701c452018-10-23 13:06:55 -07003268 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003269 SLOGE("Cannot get field when file encrypted");
3270 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003271 }
3272
Ken Sumrall160b4d62013-04-22 12:15:39 -07003273 char temp_value[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003274 /* CRYPTO_GETFIELD_OK is success,
3275 * CRYPTO_GETFIELD_ERROR_NO_FIELD is value not set,
3276 * CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL is buffer (as given by len) too small,
3277 * CRYPTO_GETFIELD_ERROR_OTHER is any other error
Ken Sumrall160b4d62013-04-22 12:15:39 -07003278 */
Rubin Xu85c01f92014-10-13 12:49:54 +01003279 int rc = CRYPTO_GETFIELD_ERROR_OTHER;
3280 int i;
3281 char temp_field[PROPERTY_KEY_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -07003282
3283 if (persist_data == NULL) {
3284 load_persistent_data();
3285 if (persist_data == NULL) {
3286 SLOGE("Getfield error, cannot load persistent data");
3287 goto out;
3288 }
3289 }
3290
Rubin Xu85c01f92014-10-13 12:49:54 +01003291 // Read value from persistent entries. If the original value is split into multiple entries,
3292 // stitch them back together.
Ken Sumrall160b4d62013-04-22 12:15:39 -07003293 if (!persist_get_key(fieldname, temp_value)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003294 // 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 -07003295 if (strlcpy(value, temp_value, len) >= (unsigned)len) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003296 // value too small
3297 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3298 goto out;
3299 }
3300 rc = CRYPTO_GETFIELD_OK;
3301
3302 for (i = 1; /* break explicitly */; i++) {
3303 if (snprintf(temp_field, sizeof(temp_field), "%s_%d", fieldname, i) >=
Paul Crowley14c8c072018-09-18 13:30:21 -07003304 (int)sizeof(temp_field)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003305 // If the fieldname is very long, we stop as soon as it begins to overflow the
3306 // maximum field length. At this point we have in fact fully read out the original
3307 // value because cryptfs_setfield would not allow fields with longer names to be
3308 // written in the first place.
3309 break;
3310 }
3311 if (!persist_get_key(temp_field, temp_value)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07003312 if (strlcat(value, temp_value, len) >= (unsigned)len) {
3313 // value too small.
3314 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3315 goto out;
3316 }
Rubin Xu85c01f92014-10-13 12:49:54 +01003317 } else {
3318 // Exhaust all entries.
3319 break;
3320 }
3321 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07003322 } else {
3323 /* Sadness, it's not there. Return the error */
Rubin Xu85c01f92014-10-13 12:49:54 +01003324 rc = CRYPTO_GETFIELD_ERROR_NO_FIELD;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003325 }
3326
3327out:
3328 return rc;
3329}
3330
3331/* Set the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07003332int cryptfs_setfield(const char* fieldname, const char* value) {
Eric Biggersa701c452018-10-23 13:06:55 -07003333 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003334 SLOGE("Cannot set field when file encrypted");
3335 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003336 }
3337
Ken Sumrall160b4d62013-04-22 12:15:39 -07003338 char encrypted_state[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003339 /* 0 is success, negative values are error */
3340 int rc = CRYPTO_SETFIELD_ERROR_OTHER;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003341 int encrypted = 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01003342 unsigned int field_id;
3343 char temp_field[PROPERTY_KEY_MAX];
3344 unsigned int num_entries;
3345 unsigned int max_keylen;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003346
3347 if (persist_data == NULL) {
3348 load_persistent_data();
3349 if (persist_data == NULL) {
3350 SLOGE("Setfield error, cannot load persistent data");
3351 goto out;
3352 }
3353 }
3354
3355 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07003356 if (!strcmp(encrypted_state, "encrypted")) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07003357 encrypted = 1;
3358 }
3359
Rubin Xu85c01f92014-10-13 12:49:54 +01003360 // Compute the number of entries required to store value, each entry can store up to
3361 // (PROPERTY_VALUE_MAX - 1) chars
3362 if (strlen(value) == 0) {
3363 // Empty value also needs one entry to store.
3364 num_entries = 1;
3365 } else {
3366 num_entries = (strlen(value) + (PROPERTY_VALUE_MAX - 1) - 1) / (PROPERTY_VALUE_MAX - 1);
3367 }
3368
3369 max_keylen = strlen(fieldname);
3370 if (num_entries > 1) {
3371 // Need an extra "_%d" suffix.
3372 max_keylen += 1 + log10(num_entries);
3373 }
3374 if (max_keylen > PROPERTY_KEY_MAX - 1) {
3375 rc = CRYPTO_SETFIELD_ERROR_FIELD_TOO_LONG;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003376 goto out;
3377 }
3378
Rubin Xu85c01f92014-10-13 12:49:54 +01003379 // Make sure we have enough space to write the new value
3380 if (persist_data->persist_valid_entries + num_entries - persist_count_keys(fieldname) >
3381 persist_get_max_entries(encrypted)) {
3382 rc = CRYPTO_SETFIELD_ERROR_VALUE_TOO_LONG;
3383 goto out;
3384 }
3385
3386 // Now that we know persist_data has enough space for value, let's delete the old field first
3387 // to make up space.
3388 persist_del_keys(fieldname, 0);
3389
3390 if (persist_set_key(fieldname, value, encrypted)) {
3391 // fail to set key, should not happen as we have already checked the available space
3392 SLOGE("persist_set_key() error during setfield()");
3393 goto out;
3394 }
3395
3396 for (field_id = 1; field_id < num_entries; field_id++) {
Greg Kaiserb610e772018-02-09 09:19:54 -08003397 snprintf(temp_field, sizeof(temp_field), "%s_%u", fieldname, field_id);
Rubin Xu85c01f92014-10-13 12:49:54 +01003398
3399 if (persist_set_key(temp_field, value + field_id * (PROPERTY_VALUE_MAX - 1), encrypted)) {
3400 // fail to set key, should not happen as we have already checked the available space.
3401 SLOGE("persist_set_key() error during setfield()");
3402 goto out;
3403 }
3404 }
3405
Ken Sumrall160b4d62013-04-22 12:15:39 -07003406 /* If we are running encrypted, save the persistent data now */
3407 if (encrypted) {
3408 if (save_persistent_data()) {
3409 SLOGE("Setfield error, cannot save persistent data");
3410 goto out;
3411 }
3412 }
3413
Rubin Xu85c01f92014-10-13 12:49:54 +01003414 rc = CRYPTO_SETFIELD_OK;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003415
3416out:
3417 return rc;
3418}
Paul Lawrencef4faa572014-01-29 13:31:03 -08003419
3420/* Checks userdata. Attempt to mount the volume if default-
3421 * encrypted.
3422 * On success trigger next init phase and return 0.
3423 * Currently do not handle failure - see TODO below.
3424 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003425int cryptfs_mount_default_encrypted(void) {
Paul Lawrence84274cc2016-04-15 15:41:33 -07003426 int crypt_type = cryptfs_get_password_type();
3427 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3428 SLOGE("Bad crypt type - error");
3429 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07003430 SLOGD(
3431 "Password is not default - "
3432 "starting min framework to prompt");
Paul Lawrence84274cc2016-04-15 15:41:33 -07003433 property_set("vold.decrypt", "trigger_restart_min_framework");
3434 return 0;
3435 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
3436 SLOGD("Password is default - restarting filesystem");
3437 cryptfs_restart_internal(0);
3438 return 0;
Paul Lawrencef4faa572014-01-29 13:31:03 -08003439 } else {
Paul Lawrence84274cc2016-04-15 15:41:33 -07003440 SLOGE("Encrypted, default crypt type but can't decrypt");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003441 }
3442
Paul Lawrence6bfed202014-07-28 12:47:22 -07003443 /** Corrupt. Allow us to boot into framework, which will detect bad
3444 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08003445 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07003446 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003447 return 0;
3448}
3449
3450/* Returns type of the password, default, pattern, pin or password.
3451 */
Paul Crowley14c8c072018-09-18 13:30:21 -07003452int cryptfs_get_password_type(void) {
Eric Biggersa701c452018-10-23 13:06:55 -07003453 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003454 SLOGE("cryptfs_get_password_type not valid for file encryption");
3455 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08003456 }
3457
Paul Lawrencef4faa572014-01-29 13:31:03 -08003458 struct crypt_mnt_ftr crypt_ftr;
3459
3460 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3461 SLOGE("Error getting crypt footer and key\n");
3462 return -1;
3463 }
3464
Paul Lawrence6bfed202014-07-28 12:47:22 -07003465 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
3466 return -1;
3467 }
3468
Paul Lawrencef4faa572014-01-29 13:31:03 -08003469 return crypt_ftr.crypt_type;
3470}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003471
Paul Crowley14c8c072018-09-18 13:30:21 -07003472const char* cryptfs_get_password() {
Eric Biggersa701c452018-10-23 13:06:55 -07003473 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003474 SLOGE("cryptfs_get_password not valid for file encryption");
3475 return 0;
Paul Lawrence05335c32015-03-05 09:46:23 -08003476 }
3477
Paul Lawrence399317e2014-03-10 13:20:50 -07003478 struct timespec now;
Paul Lawrenceef2b5be2014-11-11 12:47:03 -08003479 clock_gettime(CLOCK_BOOTTIME, &now);
Paul Lawrence399317e2014-03-10 13:20:50 -07003480 if (now.tv_sec < password_expiry_time) {
3481 return password;
3482 } else {
3483 cryptfs_clear_password();
3484 return 0;
3485 }
3486}
3487
Paul Crowley14c8c072018-09-18 13:30:21 -07003488void cryptfs_clear_password() {
Paul Lawrence399317e2014-03-10 13:20:50 -07003489 if (password) {
3490 size_t len = strlen(password);
3491 memset(password, 0, len);
3492 free(password);
3493 password = 0;
3494 password_expiry_time = 0;
3495 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003496}
Paul Lawrence731a7a22015-04-28 22:14:15 +00003497
Paul Crowley14c8c072018-09-18 13:30:21 -07003498int cryptfs_isConvertibleToFBE() {
Tom Cherry4c5bde22019-01-29 14:34:01 -08003499 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
3500 return entry && entry->fs_mgr_flags.force_fde_or_fbe;
Paul Lawrence0c247462015-10-29 10:30:57 -07003501}
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303502
3503int cryptfs_create_default_ftr(struct crypt_mnt_ftr* crypt_ftr, __attribute__((unused))int key_length)
3504{
3505 if (cryptfs_init_crypt_mnt_ftr(crypt_ftr)) {
3506 SLOGE("Failed to initialize crypt_ftr");
3507 return -1;
3508 }
3509
3510 if (create_encrypted_random_key(DEFAULT_PASSWORD, crypt_ftr->master_key,
3511 crypt_ftr->salt, crypt_ftr)) {
3512 SLOGE("Cannot create encrypted master key\n");
3513 return -1;
3514 }
3515
3516 //crypt_ftr->keysize = key_length / 8;
3517 return 0;
3518}
3519
3520int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password,
3521 unsigned char* master_key)
3522{
3523 int rc;
3524
3525 unsigned char* intermediate_key = 0;
3526 size_t intermediate_key_size = 0;
3527
3528 if (password == 0 || *password == 0) {
3529 password = DEFAULT_PASSWORD;
3530 }
3531
3532 rc = decrypt_master_key(password, master_key, ftr, &intermediate_key,
3533 &intermediate_key_size);
3534
3535 if (rc) {
3536 SLOGE("Can't calculate intermediate key");
3537 return rc;
3538 }
3539
3540 int N = 1 << ftr->N_factor;
3541 int r = 1 << ftr->r_factor;
3542 int p = 1 << ftr->p_factor;
3543
3544 unsigned char scrypted_intermediate_key[sizeof(ftr->scrypted_intermediate_key)];
3545
3546 rc = crypto_scrypt(intermediate_key, intermediate_key_size,
3547 ftr->salt, sizeof(ftr->salt), N, r, p,
3548 scrypted_intermediate_key,
3549 sizeof(scrypted_intermediate_key));
3550
3551 free(intermediate_key);
3552
3553 if (rc) {
3554 SLOGE("Can't scrypt intermediate key");
3555 return rc;
3556 }
3557
3558 return memcmp(scrypted_intermediate_key, ftr->scrypted_intermediate_key,
3559 intermediate_key_size);
3560}