blob: 5764b5d62817c6eb2326c94061c12a7d6d52259a [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 Rosenberg65f99c92018-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 Crowleycfe39722018-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
Satya Tangiralae8de4ff2021-02-28 22:32:07 -080032#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 Chae3cf32332020-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>
Logan Chiend557d762018-05-02 11:36:45 +080046#include <logwrap/logwrap.h>
47#include <openssl/evp.h>
48#include <openssl/sha.h>
Jeff Vander Stoepdf725752016-01-29 15:34:43 -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 Chae3cf32332020-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
Wei Wang4375f1b2017-02-24 17:43:01 -080074extern "C" {
75#include <crypto_scrypt.h>
76}
Mark Salyzyn3e971272014-01-21 13:27:04 -080077
Eric Biggersed45ec32019-01-25 10:47:55 -080078using android::base::ParseUint;
Greg Kaiserab1e84a2018-12-11 12:40:51 -080079using android::base::StringPrintf;
Tom Cherry4c5bde22019-01-29 14:34:01 -080080using android::fs_mgr::GetEntryForMountPoint;
Paul Crowley220567c2020-02-07 12:45:20 -080081using android::vold::CryptoType;
Paul Crowley3d98f5d2020-02-07 11:49:09 -080082using android::vold::KeyBuffer;
Paul Crowleyb3d018a2020-02-12 11:04:05 -080083using android::vold::KeyGeneration;
Satya Tangiralae8de4ff2021-02-28 22:32:07 -080084using namespace android::vold;
David Andersonb9224732019-05-13 13:02:54 -070085using namespace android::dm;
Paul Crowleycfe39722018-10-30 15:59:24 -070086using namespace std::chrono_literals;
87
Paul Crowley73be12d2020-02-03 12:22:03 -080088/* The current cryptfs version */
89#define CURRENT_MAJOR_VERSION 1
90#define CURRENT_MINOR_VERSION 3
91
92#define CRYPT_FOOTER_TO_PERSIST_OFFSET 0x1000
93#define CRYPT_PERSIST_DATA_SIZE 0x1000
94
Eric Biggersf038c5f2020-11-03 14:11:02 -080095#define CRYPT_SECTOR_SIZE 512
96
Paul Crowley73be12d2020-02-03 12:22:03 -080097#define MAX_CRYPTO_TYPE_NAME_LEN 64
98
99#define MAX_KEY_LEN 48
100#define SALT_LEN 16
101#define SCRYPT_LEN 32
102
103/* definitions of flags in the structure below */
104#define CRYPT_MNT_KEY_UNENCRYPTED 0x1 /* The key for the partition is not encrypted. */
Eric Biggersc01995e2020-11-03 14:11:00 -0800105#define CRYPT_ENCRYPTION_IN_PROGRESS 0x2 /* no longer used */
Paul Crowley73be12d2020-02-03 12:22:03 -0800106#define CRYPT_INCONSISTENT_STATE \
107 0x4 /* Set when starting encryption, clear when \
108 exit cleanly, either through success or \
109 correctly marked partial encryption */
110#define CRYPT_DATA_CORRUPT \
111 0x8 /* Set when encryption is fine, but the \
112 underlying volume is corrupt */
113#define CRYPT_FORCE_ENCRYPTION \
114 0x10 /* Set when it is time to encrypt this \
115 volume on boot. Everything in this \
116 structure is set up correctly as \
117 though device is encrypted except \
118 that the master key is encrypted with the \
119 default password. */
120#define CRYPT_FORCE_COMPLETE \
121 0x20 /* Set when the above encryption cycle is \
122 complete. On next cryptkeeper entry, match \
123 the password. If it matches fix the master \
124 key and remove this flag. */
125
126/* Allowed values for type in the structure below */
127#define CRYPT_TYPE_PASSWORD \
128 0 /* master_key is encrypted with a password \
129 * Must be zero to be compatible with pre-L \
130 * devices where type is always password.*/
131#define CRYPT_TYPE_DEFAULT \
132 1 /* master_key is encrypted with default \
133 * password */
134#define CRYPT_TYPE_PATTERN 2 /* master_key is encrypted with a pattern */
135#define CRYPT_TYPE_PIN 3 /* master_key is encrypted with a pin */
136#define CRYPT_TYPE_MAX_TYPE 3 /* type cannot be larger than this value */
137
138#define CRYPT_MNT_MAGIC 0xD0B5B1C4
139#define PERSIST_DATA_MAGIC 0xE950CD44
140
141/* Key Derivation Function algorithms */
142#define KDF_PBKDF2 1
143#define KDF_SCRYPT 2
144/* Algorithms 3 & 4 deprecated before shipping outside of google, so removed */
145#define KDF_SCRYPT_KEYMASTER 5
146
147/* Maximum allowed keymaster blob size. */
148#define KEYMASTER_BLOB_SIZE 2048
149
150/* __le32 and __le16 defined in system/extras/ext4_utils/ext4_utils.h */
151#define __le8 unsigned char
152
153#if !defined(SHA256_DIGEST_LENGTH)
154#define SHA256_DIGEST_LENGTH 32
155#endif
156
157/* This structure starts 16,384 bytes before the end of a hardware
158 * partition that is encrypted, or in a separate partition. It's location
159 * is specified by a property set in init.<device>.rc.
160 * The structure allocates 48 bytes for a key, but the real key size is
161 * specified in the struct. Currently, the code is hardcoded to use 128
162 * bit keys.
163 * The fields after salt are only valid in rev 1.1 and later stuctures.
164 * Obviously, the filesystem does not include the last 16 kbytes
165 * of the partition if the crypt_mnt_ftr lives at the end of the
166 * partition.
167 */
168
169struct crypt_mnt_ftr {
170 __le32 magic; /* See above */
171 __le16 major_version;
172 __le16 minor_version;
173 __le32 ftr_size; /* in bytes, not including key following */
174 __le32 flags; /* See above */
175 __le32 keysize; /* in bytes */
176 __le32 crypt_type; /* how master_key is encrypted. Must be a
177 * CRYPT_TYPE_XXX value */
178 __le64 fs_size; /* Size of the encrypted fs, in 512 byte sectors */
179 __le32 failed_decrypt_count; /* count of # of failed attempts to decrypt and
180 mount, set to 0 on successful mount */
181 unsigned char crypto_type_name[MAX_CRYPTO_TYPE_NAME_LEN]; /* The type of encryption
182 needed to decrypt this
183 partition, null terminated */
184 __le32 spare2; /* ignored */
185 unsigned char master_key[MAX_KEY_LEN]; /* The encrypted key for decrypting the filesystem */
186 unsigned char salt[SALT_LEN]; /* The salt used for this encryption */
187 __le64 persist_data_offset[2]; /* Absolute offset to both copies of crypt_persist_data
188 * on device with that info, either the footer of the
189 * real_blkdevice or the metadata partition. */
190
191 __le32 persist_data_size; /* The number of bytes allocated to each copy of the
192 * persistent data table*/
193
194 __le8 kdf_type; /* The key derivation function used. */
195
196 /* scrypt parameters. See www.tarsnap.com/scrypt/scrypt.pdf */
197 __le8 N_factor; /* (1 << N) */
198 __le8 r_factor; /* (1 << r) */
199 __le8 p_factor; /* (1 << p) */
Eric Biggersc01995e2020-11-03 14:11:00 -0800200 __le64 encrypted_upto; /* no longer used */
201 __le8 hash_first_block[SHA256_DIGEST_LENGTH]; /* no longer used */
Paul Crowley73be12d2020-02-03 12:22:03 -0800202
203 /* key_master key, used to sign the derived key which is then used to generate
204 * the intermediate key
205 * This key should be used for no other purposes! We use this key to sign unpadded
206 * data, which is acceptable but only if the key is not reused elsewhere. */
207 __le8 keymaster_blob[KEYMASTER_BLOB_SIZE];
208 __le32 keymaster_blob_size;
209
210 /* Store scrypt of salted intermediate key. When decryption fails, we can
211 check if this matches, and if it does, we know that the problem is with the
212 drive, and there is no point in asking the user for more passwords.
213
214 Note that if any part of this structure is corrupt, this will not match and
215 we will continue to believe the user entered the wrong password. In that
216 case the only solution is for the user to enter a password enough times to
217 force a wipe.
218
219 Note also that there is no need to worry about migration. If this data is
220 wrong, we simply won't recognise a right password, and will continue to
221 prompt. On the first password change, this value will be populated and
222 then we will be OK.
223 */
224 unsigned char scrypted_intermediate_key[SCRYPT_LEN];
225
226 /* sha of this structure with this element set to zero
227 Used when encrypting on reboot to validate structure before doing something
228 fatal
229 */
230 unsigned char sha256[SHA256_DIGEST_LENGTH];
231};
232
233/* Persistant data that should be available before decryption.
234 * Things like airplane mode, locale and timezone are kept
235 * here and can be retrieved by the CryptKeeper UI to properly
236 * configure the phone before asking for the password
237 * This is only valid if the major and minor version above
238 * is set to 1.1 or higher.
239 *
240 * This is a 4K structure. There are 2 copies, and the code alternates
241 * writing one and then clearing the previous one. The reading
242 * code reads the first valid copy it finds, based on the magic number.
243 * The absolute offset to the first of the two copies is kept in rev 1.1
244 * and higher crypt_mnt_ftr structures.
245 */
246struct crypt_persist_entry {
247 char key[PROPERTY_KEY_MAX];
248 char val[PROPERTY_VALUE_MAX];
249};
250
251/* Should be exactly 4K in size */
252struct crypt_persist_data {
253 __le32 persist_magic;
254 __le32 persist_valid_entries;
255 __le32 persist_spare[30];
256 struct crypt_persist_entry persist_entry[0];
257};
258
259static int wait_and_unmount(const char* mountpoint, bool kill);
260
261typedef int (*kdf_func)(const char* passwd, const unsigned char* salt, unsigned char* ikey,
262 void* params);
263
Mark Salyzyn5eecc442014-02-12 14:16:14 -0800264#define UNUSED __attribute__((unused))
265
Jason parks70a4b3f2011-01-28 10:10:47 -0600266#define HASH_COUNT 2000
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800267
268constexpr size_t INTERMEDIATE_KEY_LEN_BYTES = 16;
269constexpr size_t INTERMEDIATE_IV_LEN_BYTES = 16;
Paul Crowley14c8c072018-09-18 13:30:21 -0700270constexpr size_t INTERMEDIATE_BUF_SIZE = (INTERMEDIATE_KEY_LEN_BYTES + INTERMEDIATE_IV_LEN_BYTES);
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800271
272// SCRYPT_LEN is used by struct crypt_mnt_ftr for its intermediate key.
Paul Crowley14c8c072018-09-18 13:30:21 -0700273static_assert(INTERMEDIATE_BUF_SIZE == SCRYPT_LEN, "Mismatch of intermediate key sizes");
Jason parks70a4b3f2011-01-28 10:10:47 -0600274
Paul Crowley14c8c072018-09-18 13:30:21 -0700275#define KEY_IN_FOOTER "footer"
Ken Sumrall29d8da82011-05-18 17:20:07 -0700276
Paul Lawrence3bd36d52015-06-09 13:37:44 -0700277#define DEFAULT_PASSWORD "default_password"
Paul Lawrencef4faa572014-01-29 13:31:03 -0800278
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800279#define CRYPTO_BLOCK_DEVICE "userdata"
280
281#define BREADCRUMB_FILE "/data/misc/vold/convert_fde"
282
Ken Sumrall29d8da82011-05-18 17:20:07 -0700283#define EXT4_FS 1
JP Abgrall62c7af32014-06-16 13:01:23 -0700284#define F2FS_FS 2
Ken Sumrall29d8da82011-05-18 17:20:07 -0700285
Ken Sumralle919efe2012-09-29 17:07:41 -0700286#define TABLE_LOAD_RETRIES 10
287
Shawn Willden47ba10d2014-09-03 17:07:06 -0600288#define RSA_KEY_SIZE 2048
289#define RSA_KEY_SIZE_BYTES (RSA_KEY_SIZE / 8)
290#define RSA_EXPONENT 0x10001
Shawn Willdenda6e8992015-06-03 09:40:45 -0600291#define KEYMASTER_CRYPTFS_RATE_LIMIT 1 // Maximum one try per second
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700292
Paul Lawrence8e3f4512014-09-08 10:11:17 -0700293#define RETRY_MOUNT_ATTEMPTS 10
294#define RETRY_MOUNT_DELAY_SECONDS 1
295
Paul Crowley5afbc622017-11-27 09:42:17 -0800296#define CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE (1)
297
Paul Crowley73473332017-11-21 15:43:51 -0800298static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr);
299
Greg Kaiser59ad0182018-02-16 13:01:36 -0800300static unsigned char saved_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -0700301static char* saved_mount_point;
302static int master_key_saved = 0;
303static struct crypt_persist_data* persist_data = NULL;
Ken Sumrall56ad03c2013-02-13 13:00:19 -0800304
Paul Crowley220567c2020-02-07 12:45:20 -0800305constexpr CryptoType aes_128_cbc = CryptoType()
306 .set_config_name("AES-128-CBC")
307 .set_kernel_name("aes-cbc-essiv:sha256")
308 .set_keysize(16);
309
310constexpr CryptoType supported_crypto_types[] = {aes_128_cbc, android::vold::adiantum};
311
312static_assert(validateSupportedCryptoTypes(MAX_KEY_LEN, supported_crypto_types,
313 array_length(supported_crypto_types)),
314 "We have a CryptoType with keysize > MAX_KEY_LEN or which was "
315 "incompletely constructed.");
316
317static const CryptoType& get_crypto_type() {
318 // We only want to parse this read-only property once. But we need to wait
319 // until the system is initialized before we can read it. So we use a static
320 // scoped within this function to get it only once.
321 static CryptoType crypto_type =
322 lookup_crypto_algorithm(supported_crypto_types, array_length(supported_crypto_types),
323 aes_128_cbc, "ro.crypto.fde_algorithm");
324 return crypto_type;
325}
326
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800327const KeyGeneration cryptfs_get_keygen() {
Paul Crowley249c2fb2020-02-07 12:51:56 -0800328 return KeyGeneration{get_crypto_type().get_keysize(), true, false};
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800329}
330
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800331static bool write_string_to_buf(const std::string& towrite, uint8_t* buffer, uint32_t buffer_size,
332 uint32_t* out_size) {
333 if (!buffer || !out_size) {
334 LOG(ERROR) << "Missing target pointers";
335 return false;
336 }
337 *out_size = towrite.size();
338 if (buffer_size < towrite.size()) {
339 LOG(ERROR) << "Buffer too small " << buffer_size << " < " << towrite.size();
340 return false;
341 }
342 memset(buffer, '\0', buffer_size);
343 std::copy(towrite.begin(), towrite.end(), buffer);
344 return true;
345}
346
347static int keymaster_create_key_for_cryptfs_scrypt(uint32_t rsa_key_size, uint64_t rsa_exponent,
348 uint32_t ratelimit, uint8_t* key_buffer,
349 uint32_t key_buffer_size,
350 uint32_t* key_out_size) {
351 if (key_out_size) {
352 *key_out_size = 0;
353 }
354 Keymaster dev;
355 if (!dev) {
356 LOG(ERROR) << "Failed to initiate keymaster session";
357 return -1;
358 }
359 auto keyParams = km::AuthorizationSetBuilder()
360 .RsaSigningKey(rsa_key_size, rsa_exponent)
361 .NoDigestOrPadding()
362 .Authorization(km::TAG_NO_AUTH_REQUIRED)
363 .Authorization(km::TAG_MIN_SECONDS_BETWEEN_OPS, ratelimit);
364 std::string key;
365 if (!dev.generateKey(keyParams, &key)) return -1;
366 if (!write_string_to_buf(key, key_buffer, key_buffer_size, key_out_size)) return -1;
367 return 0;
368}
369
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700370/* Create a new keymaster key and store it in this footer */
Paul Crowley14c8c072018-09-18 13:30:21 -0700371static int keymaster_create_key(struct crypt_mnt_ftr* ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800372 if (ftr->keymaster_blob_size) {
373 SLOGI("Already have key");
374 return 0;
375 }
376
Paul Crowley14c8c072018-09-18 13:30:21 -0700377 int rc = keymaster_create_key_for_cryptfs_scrypt(
378 RSA_KEY_SIZE, RSA_EXPONENT, KEYMASTER_CRYPTFS_RATE_LIMIT, ftr->keymaster_blob,
379 KEYMASTER_BLOB_SIZE, &ftr->keymaster_blob_size);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000380 if (rc) {
381 if (ftr->keymaster_blob_size > KEYMASTER_BLOB_SIZE) {
Paul Crowley73473332017-11-21 15:43:51 -0800382 SLOGE("Keymaster key blob too large");
Janis Danisevskis015ec302017-01-31 11:31:08 +0000383 ftr->keymaster_blob_size = 0;
384 }
385 SLOGE("Failed to generate keypair");
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700386 return -1;
387 }
Janis Danisevskis015ec302017-01-31 11:31:08 +0000388 return 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700389}
390
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800391static int keymaster_sign_object_for_cryptfs_scrypt(struct crypt_mnt_ftr* ftr, uint32_t ratelimit,
392 const uint8_t* object, const size_t object_size,
393 uint8_t** signature_buffer,
394 size_t* signature_buffer_size) {
395 if (!object || !signature_buffer || !signature_buffer_size) {
396 LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument";
397 return -1;
398 }
399
400 Keymaster dev;
401 if (!dev) {
402 LOG(ERROR) << "Failed to initiate keymaster session";
403 return -1;
404 }
405
406 km::AuthorizationSet outParams;
407 std::string key(reinterpret_cast<const char*>(ftr->keymaster_blob), ftr->keymaster_blob_size);
408 std::string input(reinterpret_cast<const char*>(object), object_size);
409 std::string output;
410 KeymasterOperation op;
411
412 auto paramBuilder = km::AuthorizationSetBuilder().NoDigestOrPadding().Authorization(
413 km::TAG_PURPOSE, km::KeyPurpose::SIGN);
414 while (true) {
415 op = dev.begin(key, paramBuilder, &outParams);
416 if (op.getErrorCode() == km::ErrorCode::KEY_RATE_LIMIT_EXCEEDED) {
417 sleep(ratelimit);
418 continue;
419 } else
420 break;
421 }
422
423 if (!op) {
424 LOG(ERROR) << "Error starting keymaster signature transaction: "
425 << int32_t(op.getErrorCode());
426 return -1;
427 }
428
429 if (op.getUpgradedBlob()) {
430 write_string_to_buf(*op.getUpgradedBlob(), ftr->keymaster_blob, KEYMASTER_BLOB_SIZE,
431 &ftr->keymaster_blob_size);
432
433 SLOGD("Upgrading key");
434 if (put_crypt_ftr_and_key(ftr) != 0) {
435 SLOGE("Failed to write upgraded key to disk");
436 return -1;
437 }
438 SLOGD("Key upgraded successfully");
439 }
440
441 if (!op.updateCompletely(input, &output)) {
442 LOG(ERROR) << "Error sending data to keymaster signature transaction: "
443 << int32_t(op.getErrorCode());
444 return -1;
445 }
446
447 if (!op.finish(&output)) {
448 LOG(ERROR) << "Error finalizing keymaster signature transaction: "
449 << int32_t(op.getErrorCode());
450 return -1;
451 }
452
453 *signature_buffer = reinterpret_cast<uint8_t*>(malloc(output.size()));
454 if (*signature_buffer == nullptr) {
455 LOG(ERROR) << "Error allocation buffer for keymaster signature";
456 return -1;
457 }
458 *signature_buffer_size = output.size();
459 std::copy(output.data(), output.data() + output.size(), *signature_buffer);
460
461 return 0;
462}
463
Shawn Willdene17a9c42014-09-08 13:04:08 -0600464/* This signs the given object using the keymaster key. */
Paul Crowley14c8c072018-09-18 13:30:21 -0700465static int keymaster_sign_object(struct crypt_mnt_ftr* ftr, const unsigned char* object,
466 const size_t object_size, unsigned char** signature,
467 size_t* signature_size) {
Shawn Willden47ba10d2014-09-03 17:07:06 -0600468 unsigned char to_sign[RSA_KEY_SIZE_BYTES];
Shawn Willdene17a9c42014-09-08 13:04:08 -0600469 size_t to_sign_size = sizeof(to_sign);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600470 memset(to_sign, 0, RSA_KEY_SIZE_BYTES);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600471
Shawn Willdene17a9c42014-09-08 13:04:08 -0600472 // To sign a message with RSA, the message must satisfy two
473 // constraints:
474 //
475 // 1. The message, when interpreted as a big-endian numeric value, must
476 // be strictly less than the public modulus of the RSA key. Note
477 // that because the most significant bit of the public modulus is
478 // guaranteed to be 1 (else it's an (n-1)-bit key, not an n-bit
479 // key), an n-bit message with most significant bit 0 always
480 // satisfies this requirement.
481 //
482 // 2. The message must have the same length in bits as the public
483 // modulus of the RSA key. This requirement isn't mathematically
484 // necessary, but is necessary to ensure consistency in
485 // implementations.
486 switch (ftr->kdf_type) {
Shawn Willdene17a9c42014-09-08 13:04:08 -0600487 case KDF_SCRYPT_KEYMASTER:
488 // This ensures the most significant byte of the signed message
489 // is zero. We could have zero-padded to the left instead, but
490 // this approach is slightly more robust against changes in
491 // object size. However, it's still broken (but not unusably
Shawn Willdenda6e8992015-06-03 09:40:45 -0600492 // so) because we really should be using a proper deterministic
493 // RSA padding function, such as PKCS1.
Wei Wang4375f1b2017-02-24 17:43:01 -0800494 memcpy(to_sign + 1, object, std::min((size_t)RSA_KEY_SIZE_BYTES - 1, object_size));
Shawn Willdene17a9c42014-09-08 13:04:08 -0600495 SLOGI("Signing safely-padded object");
496 break;
497 default:
498 SLOGE("Unknown KDF type %d", ftr->kdf_type);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000499 return -1;
Shawn Willdene17a9c42014-09-08 13:04:08 -0600500 }
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800501 return keymaster_sign_object_for_cryptfs_scrypt(ftr, KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign,
502 to_sign_size, signature, signature_size);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600503}
504
Paul Lawrence399317e2014-03-10 13:20:50 -0700505/* Store password when userdata is successfully decrypted and mounted.
506 * Cleared by cryptfs_clear_password
507 *
508 * To avoid a double prompt at boot, we need to store the CryptKeeper
509 * password and pass it to KeyGuard, which uses it to unlock KeyStore.
510 * Since the entire framework is torn down and rebuilt after encryption,
511 * we have to use a daemon or similar to store the password. Since vold
512 * is secured against IPC except from system processes, it seems a reasonable
513 * place to store this.
514 *
515 * password should be cleared once it has been used.
516 *
517 * password is aged out after password_max_age_seconds seconds.
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800518 */
Paul Lawrence399317e2014-03-10 13:20:50 -0700519static char* password = 0;
520static int password_expiry_time = 0;
521static const int password_max_age_seconds = 60;
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800522
Paul Crowley14c8c072018-09-18 13:30:21 -0700523enum class RebootType { reboot, recovery, shutdown };
524static void cryptfs_reboot(RebootType rt) {
525 switch (rt) {
526 case RebootType::reboot:
527 property_set(ANDROID_RB_PROPERTY, "reboot");
528 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800529
Paul Crowley14c8c072018-09-18 13:30:21 -0700530 case RebootType::recovery:
531 property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
532 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800533
Paul Crowley14c8c072018-09-18 13:30:21 -0700534 case RebootType::shutdown:
535 property_set(ANDROID_RB_PROPERTY, "shutdown");
536 break;
Ken Sumralladfba362013-06-04 16:37:52 -0700537 }
Paul Lawrence87999172014-02-20 12:21:31 -0800538
Ken Sumralladfba362013-06-04 16:37:52 -0700539 sleep(20);
540
541 /* Shouldn't get here, reboot should happen before sleep times out */
542 return;
543}
544
Kenny Rootc4c70f12013-06-14 12:11:38 -0700545/**
546 * Gets the default device scrypt parameters for key derivation time tuning.
547 * The parameters should lead to about one second derivation time for the
548 * given device.
549 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700550static void get_device_scrypt_params(struct crypt_mnt_ftr* ftr) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700551 char paramstr[PROPERTY_VALUE_MAX];
Paul Crowley63c18d32016-02-10 14:02:47 +0000552 int Nf, rf, pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700553
Paul Crowley63c18d32016-02-10 14:02:47 +0000554 property_get(SCRYPT_PROP, paramstr, SCRYPT_DEFAULTS);
555 if (!parse_scrypt_parameters(paramstr, &Nf, &rf, &pf)) {
556 SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
557 parse_scrypt_parameters(SCRYPT_DEFAULTS, &Nf, &rf, &pf);
Kenny Rootc4c70f12013-06-14 12:11:38 -0700558 }
Paul Crowley63c18d32016-02-10 14:02:47 +0000559 ftr->N_factor = Nf;
560 ftr->r_factor = rf;
561 ftr->p_factor = pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700562}
563
Tom Cherry4c5bde22019-01-29 14:34:01 -0800564static uint64_t get_fs_size(const char* dev) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800565 int fd, block_size;
566 struct ext4_super_block sb;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200567 uint64_t len;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800568
Paul Crowley14c8c072018-09-18 13:30:21 -0700569 if ((fd = open(dev, O_RDONLY | O_CLOEXEC)) < 0) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800570 SLOGE("Cannot open device to get filesystem size ");
571 return 0;
572 }
573
574 if (lseek64(fd, 1024, SEEK_SET) < 0) {
575 SLOGE("Cannot seek to superblock");
576 return 0;
577 }
578
579 if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
580 SLOGE("Cannot read superblock");
581 return 0;
582 }
583
584 close(fd);
585
Daniel Rosenberge82df162014-08-15 22:19:23 +0000586 if (le32_to_cpu(sb.s_magic) != EXT4_SUPER_MAGIC) {
587 SLOGE("Not a valid ext4 superblock");
588 return 0;
589 }
Ken Sumrall3ed82362011-01-28 23:31:16 -0800590 block_size = 1024 << sb.s_log_block_size;
591 /* compute length in bytes */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200592 len = (((uint64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800593
594 /* return length in sectors */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200595 return len / 512;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800596}
597
Tom Cherry4c5bde22019-01-29 14:34:01 -0800598static void get_crypt_info(std::string* key_loc, std::string* real_blk_device) {
599 for (const auto& entry : fstab_default) {
600 if (!entry.fs_mgr_flags.vold_managed &&
601 (entry.fs_mgr_flags.crypt || entry.fs_mgr_flags.force_crypt ||
602 entry.fs_mgr_flags.force_fde_or_fbe || entry.fs_mgr_flags.file_encryption)) {
603 if (key_loc != nullptr) {
604 *key_loc = entry.key_loc;
605 }
606 if (real_blk_device != nullptr) {
607 *real_blk_device = entry.blk_device;
608 }
609 return;
610 }
611 }
612}
613
Paul Crowley14c8c072018-09-18 13:30:21 -0700614static int get_crypt_ftr_info(char** metadata_fname, off64_t* off) {
615 static int cached_data = 0;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200616 static uint64_t cached_off = 0;
Paul Crowley14c8c072018-09-18 13:30:21 -0700617 static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
Paul Crowley14c8c072018-09-18 13:30:21 -0700618 char key_loc[PROPERTY_VALUE_MAX];
619 char real_blkdev[PROPERTY_VALUE_MAX];
620 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700621
Paul Crowley14c8c072018-09-18 13:30:21 -0700622 if (!cached_data) {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800623 std::string key_loc;
624 std::string real_blkdev;
625 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700626
Tom Cherry4c5bde22019-01-29 14:34:01 -0800627 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200628 if (android::vold::GetBlockDevSize(real_blkdev, &cached_off) == android::OK) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700629 /* If it's an encrypted Android partition, the last 16 Kbytes contain the
630 * encryption info footer and key, and plenty of bytes to spare for future
631 * growth.
632 */
Tom Cherry4c5bde22019-01-29 14:34:01 -0800633 strlcpy(cached_metadata_fname, real_blkdev.c_str(), sizeof(cached_metadata_fname));
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200634 cached_off -= CRYPT_FOOTER_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -0700635 cached_data = 1;
636 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800637 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -0700638 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700639 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800640 strlcpy(cached_metadata_fname, key_loc.c_str(), sizeof(cached_metadata_fname));
Paul Crowley14c8c072018-09-18 13:30:21 -0700641 cached_off = 0;
642 cached_data = 1;
643 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700644 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700645
Paul Crowley14c8c072018-09-18 13:30:21 -0700646 if (cached_data) {
647 if (metadata_fname) {
648 *metadata_fname = cached_metadata_fname;
649 }
650 if (off) {
651 *off = cached_off;
652 }
653 rc = 0;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700654 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700655
Paul Crowley14c8c072018-09-18 13:30:21 -0700656 return rc;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700657}
658
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800659/* Set sha256 checksum in structure */
Paul Crowley14c8c072018-09-18 13:30:21 -0700660static void set_ftr_sha(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800661 SHA256_CTX c;
662 SHA256_Init(&c);
663 memset(crypt_ftr->sha256, 0, sizeof(crypt_ftr->sha256));
664 SHA256_Update(&c, crypt_ftr, sizeof(*crypt_ftr));
665 SHA256_Final(crypt_ftr->sha256, &c);
666}
667
Ken Sumralle8744072011-01-18 22:01:55 -0800668/* key or salt can be NULL, in which case just skip writing that value. Useful to
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800669 * update the failed mount count but not change the key.
670 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700671static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
672 int fd;
673 unsigned int cnt;
674 /* starting_off is set to the SEEK_SET offset
675 * where the crypto structure starts
676 */
677 off64_t starting_off;
678 int rc = -1;
679 char* fname = NULL;
680 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800681
Paul Crowley14c8c072018-09-18 13:30:21 -0700682 set_ftr_sha(crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800683
Paul Crowley14c8c072018-09-18 13:30:21 -0700684 if (get_crypt_ftr_info(&fname, &starting_off)) {
685 SLOGE("Unable to get crypt_ftr_info\n");
686 return -1;
Ken Sumralle8744072011-01-18 22:01:55 -0800687 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700688 if (fname[0] != '/') {
689 SLOGE("Unexpected value for crypto key location\n");
690 return -1;
691 }
692 if ((fd = open(fname, O_RDWR | O_CREAT | O_CLOEXEC, 0600)) < 0) {
693 SLOGE("Cannot open footer file %s for put\n", fname);
694 return -1;
695 }
Ken Sumralle8744072011-01-18 22:01:55 -0800696
Paul Crowley14c8c072018-09-18 13:30:21 -0700697 /* Seek to the start of the crypt footer */
698 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
699 SLOGE("Cannot seek to real block device footer\n");
700 goto errout;
701 }
702
703 if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
704 SLOGE("Cannot write real block device footer\n");
705 goto errout;
706 }
707
708 fstat(fd, &statbuf);
709 /* If the keys are kept on a raw block device, do not try to truncate it. */
710 if (S_ISREG(statbuf.st_mode)) {
711 if (ftruncate(fd, 0x4000)) {
712 SLOGE("Cannot set footer file size\n");
713 goto errout;
714 }
715 }
716
717 /* Success! */
718 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800719
720errout:
Paul Crowley14c8c072018-09-18 13:30:21 -0700721 close(fd);
722 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800723}
724
Paul Crowley14c8c072018-09-18 13:30:21 -0700725static bool check_ftr_sha(const struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800726 struct crypt_mnt_ftr copy;
727 memcpy(&copy, crypt_ftr, sizeof(copy));
728 set_ftr_sha(&copy);
729 return memcmp(copy.sha256, crypt_ftr->sha256, sizeof(copy.sha256)) == 0;
730}
731
Paul Crowley14c8c072018-09-18 13:30:21 -0700732static inline int unix_read(int fd, void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700733 return TEMP_FAILURE_RETRY(read(fd, buff, len));
734}
735
Paul Crowley14c8c072018-09-18 13:30:21 -0700736static inline int unix_write(int fd, const void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700737 return TEMP_FAILURE_RETRY(write(fd, buff, len));
738}
739
Paul Crowley14c8c072018-09-18 13:30:21 -0700740static void init_empty_persist_data(struct crypt_persist_data* pdata, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700741 memset(pdata, 0, len);
742 pdata->persist_magic = PERSIST_DATA_MAGIC;
743 pdata->persist_valid_entries = 0;
744}
745
746/* A routine to update the passed in crypt_ftr to the lastest version.
747 * fd is open read/write on the device that holds the crypto footer and persistent
748 * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
749 * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
750 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700751static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr* crypt_ftr, off64_t offset) {
Kenny Root7434b312013-06-14 11:29:53 -0700752 int orig_major = crypt_ftr->major_version;
753 int orig_minor = crypt_ftr->minor_version;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700754
Kenny Root7434b312013-06-14 11:29:53 -0700755 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700756 struct crypt_persist_data* pdata;
Kenny Root7434b312013-06-14 11:29:53 -0700757 off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700758
Kenny Rootc4c70f12013-06-14 12:11:38 -0700759 SLOGW("upgrading crypto footer to 1.1");
760
Paul Crowley14c8c072018-09-18 13:30:21 -0700761 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Kenny Root7434b312013-06-14 11:29:53 -0700762 if (pdata == NULL) {
763 SLOGE("Cannot allocate persisent data\n");
764 return;
765 }
766 memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
767
768 /* Need to initialize the persistent data area */
769 if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
770 SLOGE("Cannot seek to persisent data offset\n");
Henrik Baard91064632015-02-05 15:09:17 +0100771 free(pdata);
Kenny Root7434b312013-06-14 11:29:53 -0700772 return;
773 }
774 /* Write all zeros to the first copy, making it invalid */
775 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
776
777 /* Write a valid but empty structure to the second copy */
778 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
779 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
780
781 /* Update the footer */
782 crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
783 crypt_ftr->persist_data_offset[0] = pdata_offset;
784 crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
785 crypt_ftr->minor_version = 1;
Henrik Baard91064632015-02-05 15:09:17 +0100786 free(pdata);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700787 }
788
Paul Lawrencef4faa572014-01-29 13:31:03 -0800789 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 1)) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700790 SLOGW("upgrading crypto footer to 1.2");
JP Abgrall7bdfa522013-11-15 13:42:56 -0800791 /* But keep the old kdf_type.
792 * It will get updated later to KDF_SCRYPT after the password has been verified.
793 */
Kenny Rootc4c70f12013-06-14 12:11:38 -0700794 crypt_ftr->kdf_type = KDF_PBKDF2;
795 get_device_scrypt_params(crypt_ftr);
796 crypt_ftr->minor_version = 2;
797 }
798
Paul Lawrencef4faa572014-01-29 13:31:03 -0800799 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 2)) {
800 SLOGW("upgrading crypto footer to 1.3");
801 crypt_ftr->crypt_type = CRYPT_TYPE_PASSWORD;
802 crypt_ftr->minor_version = 3;
803 }
804
Kenny Root7434b312013-06-14 11:29:53 -0700805 if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
806 if (lseek64(fd, offset, SEEK_SET) == -1) {
807 SLOGE("Cannot seek to crypt footer\n");
808 return;
809 }
810 unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700811 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700812}
813
Paul Crowley14c8c072018-09-18 13:30:21 -0700814static int get_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
815 int fd;
816 unsigned int cnt;
817 off64_t starting_off;
818 int rc = -1;
819 char* fname = NULL;
820 struct stat statbuf;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700821
Paul Crowley14c8c072018-09-18 13:30:21 -0700822 if (get_crypt_ftr_info(&fname, &starting_off)) {
823 SLOGE("Unable to get crypt_ftr_info\n");
824 return -1;
825 }
826 if (fname[0] != '/') {
827 SLOGE("Unexpected value for crypto key location\n");
828 return -1;
829 }
830 if ((fd = open(fname, O_RDWR | O_CLOEXEC)) < 0) {
831 SLOGE("Cannot open footer file %s for get\n", fname);
832 return -1;
833 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800834
Paul Crowley14c8c072018-09-18 13:30:21 -0700835 /* Make sure it's 16 Kbytes in length */
836 fstat(fd, &statbuf);
837 if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
838 SLOGE("footer file %s is not the expected size!\n", fname);
839 goto errout;
840 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700841
Paul Crowley14c8c072018-09-18 13:30:21 -0700842 /* Seek to the start of the crypt footer */
843 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
844 SLOGE("Cannot seek to real block device footer\n");
845 goto errout;
846 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700847
Paul Crowley14c8c072018-09-18 13:30:21 -0700848 if ((cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
849 SLOGE("Cannot read real block device footer\n");
850 goto errout;
851 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800852
Paul Crowley14c8c072018-09-18 13:30:21 -0700853 if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
854 SLOGE("Bad magic for real block device %s\n", fname);
855 goto errout;
856 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800857
Paul Crowley14c8c072018-09-18 13:30:21 -0700858 if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
859 SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
860 crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
861 goto errout;
862 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800863
Paul Crowley14c8c072018-09-18 13:30:21 -0700864 // We risk buffer overflows with oversized keys, so we just reject them.
865 // 0-sized keys are problematic (essentially by-passing encryption), and
866 // AES-CBC key wrapping only works for multiples of 16 bytes.
867 if ((crypt_ftr->keysize == 0) || ((crypt_ftr->keysize % 16) != 0) ||
868 (crypt_ftr->keysize > MAX_KEY_LEN)) {
869 SLOGE(
870 "Invalid keysize (%u) for block device %s; Must be non-zero, "
871 "divisible by 16, and <= %d\n",
872 crypt_ftr->keysize, fname, MAX_KEY_LEN);
873 goto errout;
874 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800875
Paul Crowley14c8c072018-09-18 13:30:21 -0700876 if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
877 SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
878 crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
879 }
Greg Kaiser59ad0182018-02-16 13:01:36 -0800880
Paul Crowley14c8c072018-09-18 13:30:21 -0700881 /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
882 * copy on disk before returning.
883 */
884 if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
885 upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
886 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800887
Paul Crowley14c8c072018-09-18 13:30:21 -0700888 /* Success! */
889 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800890
891errout:
Paul Crowley14c8c072018-09-18 13:30:21 -0700892 close(fd);
893 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800894}
895
Paul Crowley14c8c072018-09-18 13:30:21 -0700896static int validate_persistent_data_storage(struct crypt_mnt_ftr* crypt_ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700897 if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
898 crypt_ftr->persist_data_offset[1]) {
899 SLOGE("Crypt_ftr persist data regions overlap");
900 return -1;
901 }
902
903 if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
904 SLOGE("Crypt_ftr persist data region 0 starts after region 1");
905 return -1;
906 }
907
908 if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
Paul Crowley14c8c072018-09-18 13:30:21 -0700909 (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
Ken Sumrall160b4d62013-04-22 12:15:39 -0700910 CRYPT_FOOTER_OFFSET) {
911 SLOGE("Persistent data extends past crypto footer");
912 return -1;
913 }
914
915 return 0;
916}
917
Paul Crowley14c8c072018-09-18 13:30:21 -0700918static int load_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700919 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -0700920 struct crypt_persist_data* pdata = NULL;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700921 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -0700922 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700923 int found = 0;
924 int fd;
925 int ret;
926 int i;
927
928 if (persist_data) {
929 /* Nothing to do, we've already loaded or initialized it */
930 return 0;
931 }
932
Ken Sumrall160b4d62013-04-22 12:15:39 -0700933 /* If not encrypted, just allocate an empty table and initialize it */
934 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -0700935 if (strcmp(encrypted_state, "encrypted")) {
Wei Wang4375f1b2017-02-24 17:43:01 -0800936 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700937 if (pdata) {
938 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
939 persist_data = pdata;
940 return 0;
941 }
942 return -1;
943 }
944
Paul Crowley14c8c072018-09-18 13:30:21 -0700945 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700946 return -1;
947 }
948
Paul Crowley14c8c072018-09-18 13:30:21 -0700949 if ((crypt_ftr.major_version < 1) ||
950 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700951 SLOGE("Crypt_ftr version doesn't support persistent data");
952 return -1;
953 }
954
955 if (get_crypt_ftr_info(&fname, NULL)) {
956 return -1;
957 }
958
959 ret = validate_persistent_data_storage(&crypt_ftr);
960 if (ret) {
961 return -1;
962 }
963
Paul Crowley14c8c072018-09-18 13:30:21 -0700964 fd = open(fname, O_RDONLY | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700965 if (fd < 0) {
966 SLOGE("Cannot open %s metadata file", fname);
967 return -1;
968 }
969
Wei Wang4375f1b2017-02-24 17:43:01 -0800970 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Paul Lawrence300dae72016-03-11 11:02:52 -0800971 if (pdata == NULL) {
972 SLOGE("Cannot allocate memory for persistent data");
973 goto err;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700974 }
975
976 for (i = 0; i < 2; i++) {
977 if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
978 SLOGE("Cannot seek to read persistent data on %s", fname);
979 goto err2;
980 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700981 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700982 SLOGE("Error reading persistent data on iteration %d", i);
983 goto err2;
984 }
985 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
986 found = 1;
987 break;
988 }
989 }
990
991 if (!found) {
992 SLOGI("Could not find valid persistent data, creating");
993 init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
994 }
995
996 /* Success */
997 persist_data = pdata;
998 close(fd);
999 return 0;
1000
1001err2:
1002 free(pdata);
1003
1004err:
1005 close(fd);
1006 return -1;
1007}
1008
Paul Crowley14c8c072018-09-18 13:30:21 -07001009static int save_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001010 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07001011 struct crypt_persist_data* pdata;
1012 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001013 off64_t write_offset;
1014 off64_t erase_offset;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001015 int fd;
1016 int ret;
1017
1018 if (persist_data == NULL) {
1019 SLOGE("No persistent data to save");
1020 return -1;
1021 }
1022
Paul Crowley14c8c072018-09-18 13:30:21 -07001023 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001024 return -1;
1025 }
1026
Paul Crowley14c8c072018-09-18 13:30:21 -07001027 if ((crypt_ftr.major_version < 1) ||
1028 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001029 SLOGE("Crypt_ftr version doesn't support persistent data");
1030 return -1;
1031 }
1032
1033 ret = validate_persistent_data_storage(&crypt_ftr);
1034 if (ret) {
1035 return -1;
1036 }
1037
1038 if (get_crypt_ftr_info(&fname, NULL)) {
1039 return -1;
1040 }
1041
Paul Crowley14c8c072018-09-18 13:30:21 -07001042 fd = open(fname, O_RDWR | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001043 if (fd < 0) {
1044 SLOGE("Cannot open %s metadata file", fname);
1045 return -1;
1046 }
1047
Wei Wang4375f1b2017-02-24 17:43:01 -08001048 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001049 if (pdata == NULL) {
1050 SLOGE("Cannot allocate persistant data");
1051 goto err;
1052 }
1053
1054 if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
1055 SLOGE("Cannot seek to read persistent data on %s", fname);
1056 goto err2;
1057 }
1058
1059 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001060 SLOGE("Error reading persistent data before save");
1061 goto err2;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001062 }
1063
1064 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
1065 /* The first copy is the curent valid copy, so write to
1066 * the second copy and erase this one */
Paul Crowley14c8c072018-09-18 13:30:21 -07001067 write_offset = crypt_ftr.persist_data_offset[1];
1068 erase_offset = crypt_ftr.persist_data_offset[0];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001069 } else {
1070 /* The second copy must be the valid copy, so write to
1071 * the first copy, and erase the second */
Paul Crowley14c8c072018-09-18 13:30:21 -07001072 write_offset = crypt_ftr.persist_data_offset[0];
1073 erase_offset = crypt_ftr.persist_data_offset[1];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001074 }
1075
1076 /* Write the new copy first, if successful, then erase the old copy */
Björn Landström96dbee72015-01-20 12:43:56 +01001077 if (lseek64(fd, write_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001078 SLOGE("Cannot seek to write persistent data");
1079 goto err2;
1080 }
1081 if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
Paul Crowley14c8c072018-09-18 13:30:21 -07001082 (int)crypt_ftr.persist_data_size) {
Björn Landström96dbee72015-01-20 12:43:56 +01001083 if (lseek64(fd, erase_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001084 SLOGE("Cannot seek to erase previous persistent data");
1085 goto err2;
1086 }
1087 fsync(fd);
1088 memset(pdata, 0, crypt_ftr.persist_data_size);
Paul Crowley14c8c072018-09-18 13:30:21 -07001089 if (unix_write(fd, pdata, crypt_ftr.persist_data_size) != (int)crypt_ftr.persist_data_size) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001090 SLOGE("Cannot write to erase previous persistent data");
1091 goto err2;
1092 }
1093 fsync(fd);
1094 } else {
1095 SLOGE("Cannot write to save persistent data");
1096 goto err2;
1097 }
1098
1099 /* Success */
1100 free(pdata);
1101 close(fd);
1102 return 0;
1103
1104err2:
1105 free(pdata);
1106err:
1107 close(fd);
1108 return -1;
1109}
1110
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001111/* Convert a binary key of specified length into an ascii hex string equivalent,
1112 * without the leading 0x and with null termination
1113 */
Paul Crowley14c8c072018-09-18 13:30:21 -07001114static void convert_key_to_hex_ascii(const unsigned char* master_key, unsigned int keysize,
1115 char* master_key_ascii) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001116 unsigned int i, a;
1117 unsigned char nibble;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001118
Paul Crowley14c8c072018-09-18 13:30:21 -07001119 for (i = 0, a = 0; i < keysize; i++, a += 2) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001120 /* For each byte, write out two ascii hex digits */
1121 nibble = (master_key[i] >> 4) & 0xf;
1122 master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001123
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001124 nibble = master_key[i] & 0xf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001125 master_key_ascii[a + 1] = nibble + (nibble > 9 ? 0x37 : 0x30);
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001126 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001127
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001128 /* Add the null termination */
1129 master_key_ascii[a] = '\0';
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001130}
1131
Eric Biggersed45ec32019-01-25 10:47:55 -08001132/*
1133 * If the ro.crypto.fde_sector_size system property is set, append the
1134 * parameters to make dm-crypt use the specified crypto sector size and round
1135 * the crypto device size down to a crypto sector boundary.
1136 */
David Andersonb9224732019-05-13 13:02:54 -07001137static int add_sector_size_param(DmTargetCrypt* target, struct crypt_mnt_ftr* ftr) {
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001138 constexpr char DM_CRYPT_SECTOR_SIZE[] = "ro.crypto.fde_sector_size";
Eric Biggersed45ec32019-01-25 10:47:55 -08001139 char value[PROPERTY_VALUE_MAX];
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001140
Eric Biggersed45ec32019-01-25 10:47:55 -08001141 if (property_get(DM_CRYPT_SECTOR_SIZE, value, "") > 0) {
1142 unsigned int sector_size;
1143
1144 if (!ParseUint(value, &sector_size) || sector_size < 512 || sector_size > 4096 ||
1145 (sector_size & (sector_size - 1)) != 0) {
1146 SLOGE("Invalid value for %s: %s. Must be >= 512, <= 4096, and a power of 2\n",
1147 DM_CRYPT_SECTOR_SIZE, value);
1148 return -1;
1149 }
1150
David Andersonb9224732019-05-13 13:02:54 -07001151 target->SetSectorSize(sector_size);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001152
1153 // With this option, IVs will match the sector numbering, instead
1154 // of being hard-coded to being based on 512-byte sectors.
David Andersonb9224732019-05-13 13:02:54 -07001155 target->SetIvLargeSectors();
Eric Biggersed45ec32019-01-25 10:47:55 -08001156
1157 // Round the crypto device size down to a crypto sector boundary.
1158 ftr->fs_size &= ~((sector_size / 512) - 1);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001159 }
Eric Biggersed45ec32019-01-25 10:47:55 -08001160 return 0;
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001161}
1162
Paul Crowley5afbc622017-11-27 09:42:17 -08001163static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key,
Paul Crowley81796e92020-02-07 11:27:49 -08001164 const char* real_blk_name, std::string* crypto_blk_name,
1165 const char* name, uint32_t flags) {
David Andersonb9224732019-05-13 13:02:54 -07001166 auto& dm = DeviceMapper::Instance();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001167
David Andersonb9224732019-05-13 13:02:54 -07001168 // We need two ASCII characters to represent each byte, and need space for
1169 // the '\0' terminator.
1170 char master_key_ascii[MAX_KEY_LEN * 2 + 1];
1171 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001172
David Andersonb9224732019-05-13 13:02:54 -07001173 auto target = std::make_unique<DmTargetCrypt>(0, crypt_ftr->fs_size,
1174 (const char*)crypt_ftr->crypto_type_name,
1175 master_key_ascii, 0, real_blk_name, 0);
1176 target->AllowDiscards();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001177
Paul Crowley5afbc622017-11-27 09:42:17 -08001178 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE) {
David Andersonb9224732019-05-13 13:02:54 -07001179 target->AllowEncryptOverride();
Paul Crowley5afbc622017-11-27 09:42:17 -08001180 }
David Andersonb9224732019-05-13 13:02:54 -07001181 if (add_sector_size_param(target.get(), crypt_ftr)) {
Eric Biggersed45ec32019-01-25 10:47:55 -08001182 SLOGE("Error processing dm-crypt sector size param\n");
David Andersonb9224732019-05-13 13:02:54 -07001183 return -1;
Eric Biggersed45ec32019-01-25 10:47:55 -08001184 }
David Andersonb9224732019-05-13 13:02:54 -07001185
1186 DmTable table;
1187 table.AddTarget(std::move(target));
1188
1189 int load_count = 1;
1190 while (load_count < TABLE_LOAD_RETRIES) {
1191 if (dm.CreateDevice(name, table)) {
1192 break;
1193 }
1194 load_count++;
1195 }
1196
1197 if (load_count >= TABLE_LOAD_RETRIES) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001198 SLOGE("Cannot load dm-crypt mapping table.\n");
David Andersonb9224732019-05-13 13:02:54 -07001199 return -1;
1200 }
1201 if (load_count > 1) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001202 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
1203 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001204
Paul Crowley81796e92020-02-07 11:27:49 -08001205 if (!dm.GetDmDevicePathByName(name, crypto_blk_name)) {
David Andersonb9224732019-05-13 13:02:54 -07001206 SLOGE("Cannot determine dm-crypt path for %s.\n", name);
1207 return -1;
Paul Crowley5afbc622017-11-27 09:42:17 -08001208 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001209
Paul Crowleycfe39722018-10-30 15:59:24 -07001210 /* Ensure the dm device has been created before returning. */
Paul Crowley81796e92020-02-07 11:27:49 -08001211 if (android::vold::WaitForFile(crypto_blk_name->c_str(), 1s) < 0) {
Paul Crowleycfe39722018-10-30 15:59:24 -07001212 // WaitForFile generates a suitable log message
David Andersonb9224732019-05-13 13:02:54 -07001213 return -1;
Paul Crowleycfe39722018-10-30 15:59:24 -07001214 }
David Andersonb9224732019-05-13 13:02:54 -07001215 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001216}
1217
David Andersonb9224732019-05-13 13:02:54 -07001218static int delete_crypto_blk_dev(const std::string& name) {
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001219 bool ret;
David Andersonb9224732019-05-13 13:02:54 -07001220 auto& dm = DeviceMapper::Instance();
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001221 // TODO(b/149396179) there appears to be a race somewhere in the system where trying
1222 // to delete the device fails with EBUSY; for now, work around this by retrying.
1223 int tries = 5;
1224 while (tries-- > 0) {
1225 ret = dm.DeleteDevice(name);
1226 if (ret || errno != EBUSY) {
1227 break;
1228 }
1229 SLOGW("DM_DEV Cannot remove dm-crypt device %s: %s, retrying...\n", name.c_str(),
1230 strerror(errno));
1231 std::this_thread::sleep_for(std::chrono::milliseconds(100));
1232 }
1233 if (!ret) {
1234 SLOGE("DM_DEV Cannot remove dm-crypt device %s: %s\n", name.c_str(), strerror(errno));
David Andersonb9224732019-05-13 13:02:54 -07001235 return -1;
Paul Crowley14c8c072018-09-18 13:30:21 -07001236 }
David Andersonb9224732019-05-13 13:02:54 -07001237 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001238}
1239
Paul Crowley14c8c072018-09-18 13:30:21 -07001240static int pbkdf2(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1241 void* params UNUSED) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001242 SLOGI("Using pbkdf2 for cryptfs KDF");
1243
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001244 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001245 return PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN, HASH_COUNT,
1246 INTERMEDIATE_BUF_SIZE, ikey) != 1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001247}
1248
Paul Crowley14c8c072018-09-18 13:30:21 -07001249static int scrypt(const char* passwd, const unsigned char* salt, unsigned char* ikey, void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001250 SLOGI("Using scrypt for cryptfs KDF");
1251
Paul Crowley14c8c072018-09-18 13:30:21 -07001252 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001253
1254 int N = 1 << ftr->N_factor;
1255 int r = 1 << ftr->r_factor;
1256 int p = 1 << ftr->p_factor;
1257
1258 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001259 crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001260 INTERMEDIATE_BUF_SIZE);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001261
Paul Crowley14c8c072018-09-18 13:30:21 -07001262 return 0;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001263}
1264
Paul Crowley14c8c072018-09-18 13:30:21 -07001265static int scrypt_keymaster(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1266 void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001267 SLOGI("Using scrypt with keymaster for cryptfs KDF");
1268
1269 int rc;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001270 size_t signature_size;
1271 unsigned char* signature;
Paul Crowley14c8c072018-09-18 13:30:21 -07001272 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001273
1274 int N = 1 << ftr->N_factor;
1275 int r = 1 << ftr->r_factor;
1276 int p = 1 << ftr->p_factor;
1277
Paul Crowley14c8c072018-09-18 13:30:21 -07001278 rc = crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001279 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001280
1281 if (rc) {
1282 SLOGE("scrypt failed");
1283 return -1;
1284 }
1285
Paul Crowley14c8c072018-09-18 13:30:21 -07001286 if (keymaster_sign_object(ftr, ikey, INTERMEDIATE_BUF_SIZE, &signature, &signature_size)) {
Shawn Willdene17a9c42014-09-08 13:04:08 -06001287 SLOGE("Signing failed");
1288 return -1;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001289 }
1290
Paul Crowley14c8c072018-09-18 13:30:21 -07001291 rc = crypto_scrypt(signature, signature_size, salt, SALT_LEN, N, r, p, ikey,
1292 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001293 free(signature);
1294
1295 if (rc) {
1296 SLOGE("scrypt failed");
1297 return -1;
1298 }
1299
1300 return 0;
1301}
1302
Paul Crowley14c8c072018-09-18 13:30:21 -07001303static int encrypt_master_key(const char* passwd, const unsigned char* salt,
1304 const unsigned char* decrypted_master_key,
1305 unsigned char* encrypted_master_key, struct crypt_mnt_ftr* crypt_ftr) {
1306 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001307 EVP_CIPHER_CTX e_ctx;
1308 int encrypted_len, final_len;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001309 int rc = 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001310
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001311 /* Turn the password into an intermediate key and IV that can decrypt the master key */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001312 get_device_scrypt_params(crypt_ftr);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001313
1314 switch (crypt_ftr->kdf_type) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001315 case KDF_SCRYPT_KEYMASTER:
1316 if (keymaster_create_key(crypt_ftr)) {
1317 SLOGE("keymaster_create_key failed");
1318 return -1;
1319 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001320
Paul Crowley14c8c072018-09-18 13:30:21 -07001321 if (scrypt_keymaster(passwd, salt, ikey, crypt_ftr)) {
1322 SLOGE("scrypt failed");
1323 return -1;
1324 }
1325 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001326
Paul Crowley14c8c072018-09-18 13:30:21 -07001327 case KDF_SCRYPT:
1328 if (scrypt(passwd, salt, ikey, crypt_ftr)) {
1329 SLOGE("scrypt failed");
1330 return -1;
1331 }
1332 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001333
Paul Crowley14c8c072018-09-18 13:30:21 -07001334 default:
1335 SLOGE("Invalid kdf_type");
1336 return -1;
Paul Lawrencef4faa572014-01-29 13:31:03 -08001337 }
Kenny Rootc4c70f12013-06-14 12:11:38 -07001338
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001339 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001340 EVP_CIPHER_CTX_init(&e_ctx);
Paul Crowley14c8c072018-09-18 13:30:21 -07001341 if (!EVP_EncryptInit_ex(&e_ctx, EVP_aes_128_cbc(), NULL, ikey,
1342 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001343 SLOGE("EVP_EncryptInit failed\n");
1344 return -1;
1345 }
1346 EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001347
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001348 /* Encrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001349 if (!EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len, decrypted_master_key,
1350 crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001351 SLOGE("EVP_EncryptUpdate failed\n");
1352 return -1;
1353 }
Paul Crowley14c8c072018-09-18 13:30:21 -07001354 if (!EVP_EncryptFinal_ex(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001355 SLOGE("EVP_EncryptFinal failed\n");
1356 return -1;
1357 }
1358
Greg Kaiser59ad0182018-02-16 13:01:36 -08001359 if (encrypted_len + final_len != static_cast<int>(crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001360 SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
1361 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001362 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001363
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001364 /* Store the scrypt of the intermediate key, so we can validate if it's a
1365 password error or mount error when things go wrong.
1366 Note there's no need to check for errors, since if this is incorrect, we
1367 simply won't wipe userdata, which is the correct default behavior
1368 */
1369 int N = 1 << crypt_ftr->N_factor;
1370 int r = 1 << crypt_ftr->r_factor;
1371 int p = 1 << crypt_ftr->p_factor;
1372
Paul Crowley14c8c072018-09-18 13:30:21 -07001373 rc = crypto_scrypt(ikey, INTERMEDIATE_KEY_LEN_BYTES, crypt_ftr->salt, sizeof(crypt_ftr->salt),
1374 N, r, p, crypt_ftr->scrypted_intermediate_key,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001375 sizeof(crypt_ftr->scrypted_intermediate_key));
1376
1377 if (rc) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001378 SLOGE("encrypt_master_key: crypto_scrypt failed");
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001379 }
1380
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001381 EVP_CIPHER_CTX_cleanup(&e_ctx);
1382
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001383 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001384}
1385
Paul Crowley14c8c072018-09-18 13:30:21 -07001386static int decrypt_master_key_aux(const char* passwd, unsigned char* salt,
1387 const unsigned char* encrypted_master_key, size_t keysize,
1388 unsigned char* decrypted_master_key, kdf_func kdf,
1389 void* kdf_params, unsigned char** intermediate_key,
1390 size_t* intermediate_key_size) {
1391 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
1392 EVP_CIPHER_CTX d_ctx;
1393 int decrypted_len, final_len;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001394
Paul Crowley14c8c072018-09-18 13:30:21 -07001395 /* Turn the password into an intermediate key and IV that can decrypt the
1396 master key */
1397 if (kdf(passwd, salt, ikey, kdf_params)) {
1398 SLOGE("kdf failed");
1399 return -1;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001400 }
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001401
Paul Crowley14c8c072018-09-18 13:30:21 -07001402 /* Initialize the decryption engine */
1403 EVP_CIPHER_CTX_init(&d_ctx);
1404 if (!EVP_DecryptInit_ex(&d_ctx, EVP_aes_128_cbc(), NULL, ikey,
1405 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
1406 return -1;
1407 }
1408 EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
1409 /* Decrypt the master key */
1410 if (!EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len, encrypted_master_key,
1411 keysize)) {
1412 return -1;
1413 }
1414 if (!EVP_DecryptFinal_ex(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
1415 return -1;
1416 }
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001417
Paul Crowley14c8c072018-09-18 13:30:21 -07001418 if (decrypted_len + final_len != static_cast<int>(keysize)) {
1419 return -1;
1420 }
1421
1422 /* Copy intermediate key if needed by params */
1423 if (intermediate_key && intermediate_key_size) {
1424 *intermediate_key = (unsigned char*)malloc(INTERMEDIATE_KEY_LEN_BYTES);
1425 if (*intermediate_key) {
1426 memcpy(*intermediate_key, ikey, INTERMEDIATE_KEY_LEN_BYTES);
1427 *intermediate_key_size = INTERMEDIATE_KEY_LEN_BYTES;
1428 }
1429 }
1430
1431 EVP_CIPHER_CTX_cleanup(&d_ctx);
1432
1433 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001434}
1435
Paul Crowley14c8c072018-09-18 13:30:21 -07001436static void get_kdf_func(struct crypt_mnt_ftr* ftr, kdf_func* kdf, void** kdf_params) {
Paul Lawrencedb3730c2015-02-03 13:08:10 -08001437 if (ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001438 *kdf = scrypt_keymaster;
1439 *kdf_params = ftr;
1440 } else if (ftr->kdf_type == KDF_SCRYPT) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001441 *kdf = scrypt;
1442 *kdf_params = ftr;
1443 } else {
1444 *kdf = pbkdf2;
1445 *kdf_params = NULL;
1446 }
1447}
1448
Paul Crowley14c8c072018-09-18 13:30:21 -07001449static int decrypt_master_key(const char* passwd, unsigned char* decrypted_master_key,
1450 struct crypt_mnt_ftr* crypt_ftr, unsigned char** intermediate_key,
1451 size_t* intermediate_key_size) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001452 kdf_func kdf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001453 void* kdf_params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001454 int ret;
1455
1456 get_kdf_func(crypt_ftr, &kdf, &kdf_params);
Paul Crowley14c8c072018-09-18 13:30:21 -07001457 ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key, crypt_ftr->keysize,
1458 decrypted_master_key, kdf, kdf_params, intermediate_key,
1459 intermediate_key_size);
Kenny Rootc4c70f12013-06-14 12:11:38 -07001460 if (ret != 0) {
1461 SLOGW("failure decrypting master key");
Kenny Rootc4c70f12013-06-14 12:11:38 -07001462 }
1463
1464 return ret;
1465}
1466
Paul Crowley14c8c072018-09-18 13:30:21 -07001467static int create_encrypted_random_key(const char* passwd, unsigned char* master_key,
1468 unsigned char* salt, struct crypt_mnt_ftr* crypt_ftr) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08001469 unsigned char key_buf[MAX_KEY_LEN];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001470
Eric Biggers3a2f7db2019-01-16 13:05:34 -08001471 /* Get some random bits for a key and salt */
1472 if (android::vold::ReadRandomBytes(sizeof(key_buf), reinterpret_cast<char*>(key_buf)) != 0) {
1473 return -1;
1474 }
1475 if (android::vold::ReadRandomBytes(SALT_LEN, reinterpret_cast<char*>(salt)) != 0) {
1476 return -1;
1477 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001478
1479 /* Now encrypt it with the password */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001480 return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001481}
1482
Hyangseok Chae3cf32332020-02-27 18:21:50 +09001483static void ensure_subdirectory_unmounted(const char *prefix) {
1484 std::vector<std::string> umount_points;
1485 std::unique_ptr<FILE, int (*)(FILE*)> mnts(setmntent("/proc/mounts", "r"), endmntent);
1486 if (!mnts) {
1487 SLOGW("could not read mount files");
1488 return;
1489 }
1490
1491 //Find sudirectory mount point
1492 mntent* mentry;
1493 std::string top_directory(prefix);
1494 if (!android::base::EndsWith(prefix, "/")) {
1495 top_directory = top_directory + "/";
1496 }
1497 while ((mentry = getmntent(mnts.get())) != nullptr) {
1498 if (strcmp(mentry->mnt_dir, top_directory.c_str()) == 0) {
1499 continue;
1500 }
1501
1502 if (android::base::StartsWith(mentry->mnt_dir, top_directory)) {
1503 SLOGW("found sub-directory mount %s - %s\n", prefix, mentry->mnt_dir);
1504 umount_points.push_back(mentry->mnt_dir);
1505 }
1506 }
1507
1508 //Sort by path length to umount longest path first
1509 std::sort(std::begin(umount_points), std::end(umount_points),
1510 [](const std::string& s1, const std::string& s2) {return s1.length() > s2.length(); });
1511
1512 for (std::string& mount_point : umount_points) {
1513 umount(mount_point.c_str());
1514 SLOGW("umount sub-directory mount %s\n", mount_point.c_str());
1515 }
1516}
1517
Paul Crowley73be12d2020-02-03 12:22:03 -08001518static int wait_and_unmount(const char* mountpoint, bool kill) {
Greg Hackmann955653e2014-09-24 14:55:20 -07001519 int i, err, rc;
Hyangseok Chae3cf32332020-02-27 18:21:50 +09001520
1521 // Subdirectory mount will cause a failure of umount.
1522 ensure_subdirectory_unmounted(mountpoint);
Ken Sumrall2eaf7132011-01-14 12:45:48 -08001523#define WAIT_UNMOUNT_COUNT 20
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001524
1525 /* Now umount the tmpfs filesystem */
Paul Crowley14c8c072018-09-18 13:30:21 -07001526 for (i = 0; i < WAIT_UNMOUNT_COUNT; i++) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001527 if (umount(mountpoint) == 0) {
1528 break;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001529 }
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001530
1531 if (errno == EINVAL) {
1532 /* EINVAL is returned if the directory is not a mountpoint,
1533 * i.e. there is no filesystem mounted there. So just get out.
1534 */
1535 break;
1536 }
1537
1538 err = errno;
1539
1540 /* If allowed, be increasingly aggressive before the last two retries */
1541 if (kill) {
1542 if (i == (WAIT_UNMOUNT_COUNT - 3)) {
1543 SLOGW("sending SIGHUP to processes with open files\n");
Jeff Sharkey3472e522017-10-06 18:02:53 -06001544 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGTERM);
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001545 } else if (i == (WAIT_UNMOUNT_COUNT - 2)) {
1546 SLOGW("sending SIGKILL to processes with open files\n");
Jeff Sharkey3472e522017-10-06 18:02:53 -06001547 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGKILL);
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001548 }
1549 }
1550
1551 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001552 }
1553
1554 if (i < WAIT_UNMOUNT_COUNT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001555 SLOGD("unmounting %s succeeded\n", mountpoint);
1556 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001557 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07001558 android::vold::KillProcessesWithOpenFiles(mountpoint, 0);
1559 SLOGE("unmounting %s failed: %s\n", mountpoint, strerror(err));
1560 rc = -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001561 }
1562
1563 return rc;
1564}
1565
Paul Crowley14c8c072018-09-18 13:30:21 -07001566static void prep_data_fs(void) {
Jeff Sharkey47695b22016-02-01 17:02:29 -07001567 // NOTE: post_fs_data results in init calling back around to vold, so all
1568 // callers to this method must be async
1569
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001570 /* Do the prep of the /data filesystem */
1571 property_set("vold.post_fs_data_done", "0");
1572 property_set("vold.decrypt", "trigger_post_fs_data");
Wei Wang42e38102017-06-07 10:46:12 -07001573 SLOGD("Just triggered post_fs_data");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001574
Ken Sumrallc5872692013-05-14 15:26:31 -07001575 /* Wait a max of 50 seconds, hopefully it takes much less */
Paul Crowley14c8c072018-09-18 13:30:21 -07001576 while (!android::base::WaitForProperty("vold.post_fs_data_done", "1", std::chrono::seconds(15))) {
Wei Wang42e38102017-06-07 10:46:12 -07001577 /* We timed out to prep /data in time. Continue wait. */
1578 SLOGE("waited 15s for vold.post_fs_data_done, still waiting...");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001579 }
Wei Wang42e38102017-06-07 10:46:12 -07001580 SLOGD("post_fs_data done");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001581}
1582
Paul Crowley14c8c072018-09-18 13:30:21 -07001583static void cryptfs_set_corrupt() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001584 // Mark the footer as bad
1585 struct crypt_mnt_ftr crypt_ftr;
1586 if (get_crypt_ftr_and_key(&crypt_ftr)) {
1587 SLOGE("Failed to get crypto footer - panic");
1588 return;
1589 }
1590
1591 crypt_ftr.flags |= CRYPT_DATA_CORRUPT;
1592 if (put_crypt_ftr_and_key(&crypt_ftr)) {
1593 SLOGE("Failed to set crypto footer - panic");
1594 return;
1595 }
1596}
1597
Paul Crowley14c8c072018-09-18 13:30:21 -07001598static void cryptfs_trigger_restart_min_framework() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001599 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001600 SLOGE("Failed to mount tmpfs on data - panic");
1601 return;
Paul Lawrence74f29f12014-08-28 15:54:10 -07001602 }
1603
1604 if (property_set("vold.decrypt", "trigger_post_fs_data")) {
1605 SLOGE("Failed to trigger post fs data - panic");
1606 return;
1607 }
1608
1609 if (property_set("vold.decrypt", "trigger_restart_min_framework")) {
1610 SLOGE("Failed to trigger restart min framework - panic");
1611 return;
1612 }
1613}
1614
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001615/* returns < 0 on failure */
Paul Crowley14c8c072018-09-18 13:30:21 -07001616static int cryptfs_restart_internal(int restart_main) {
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001617 char crypto_blkdev[MAXPATHLEN];
Tim Murray8439dc92014-12-15 11:56:11 -08001618 int rc = -1;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001619 static int restart_successful = 0;
1620
1621 /* Validate that it's OK to call this routine */
Paul Crowley14c8c072018-09-18 13:30:21 -07001622 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08001623 SLOGE("Encrypted filesystem not validated, aborting");
1624 return -1;
1625 }
1626
1627 if (restart_successful) {
1628 SLOGE("System already restarted with encrypted disk, aborting");
1629 return -1;
1630 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001631
Paul Lawrencef4faa572014-01-29 13:31:03 -08001632 if (restart_main) {
1633 /* Here is where we shut down the framework. The init scripts
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001634 * start all services in one of these classes: core, early_hal, hal,
1635 * main and late_start. To get to the minimal UI for PIN entry, we
1636 * need to start core, early_hal, hal and main. When we want to
1637 * shutdown the framework again, we need to stop most of the services in
1638 * these classes, but only those services that were started after
1639 * /data was mounted. This excludes critical services like vold and
1640 * ueventd, which need to keep running. We could possible stop
1641 * even fewer services, but because we want services to pick up APEX
1642 * libraries from the real /data, restarting is better, as it makes
1643 * these devices consistent with FBE devices and lets them use the
1644 * most recent code.
1645 *
1646 * Once these services have stopped, we should be able
Paul Lawrencef4faa572014-01-29 13:31:03 -08001647 * to umount the tmpfs /data, then mount the encrypted /data.
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001648 * We then restart the class core, hal, main, and also the class
1649 * late_start.
1650 *
Paul Lawrencef4faa572014-01-29 13:31:03 -08001651 * At the moment, I've only put a few things in late_start that I know
1652 * are not needed to bring up the framework, and that also cause problems
1653 * with unmounting the tmpfs /data, but I hope to add add more services
1654 * to the late_start class as we optimize this to decrease the delay
1655 * till the user is asked for the password to the filesystem.
1656 */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001657
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001658 /* The init files are setup to stop the right set of services when
1659 * vold.decrypt is set to trigger_shutdown_framework.
Paul Lawrencef4faa572014-01-29 13:31:03 -08001660 */
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001661 property_set("vold.decrypt", "trigger_shutdown_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001662 SLOGD("Just asked init to shut down class main\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001663
Paul Lawrencef4faa572014-01-29 13:31:03 -08001664 /* Ugh, shutting down the framework is not synchronous, so until it
1665 * can be fixed, this horrible hack will wait a moment for it all to
1666 * shut down before proceeding. Without it, some devices cannot
1667 * restart the graphics services.
1668 */
1669 sleep(2);
1670 }
Ken Sumrall9dedfd42012-10-09 14:16:59 -07001671
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001672 /* Now that the framework is shutdown, we should be able to umount()
1673 * the tmpfs filesystem, and mount the real one.
1674 */
1675
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001676 property_get("ro.crypto.fs_crypto_blkdev", crypto_blkdev, "");
1677 if (strlen(crypto_blkdev) == 0) {
1678 SLOGE("fs_crypto_blkdev not set\n");
1679 return -1;
1680 }
1681
Paul Crowley14c8c072018-09-18 13:30:21 -07001682 if (!(rc = wait_and_unmount(DATA_MNT_POINT, true))) {
Doug Zongker6fd57712013-12-17 09:43:23 -08001683 /* If ro.crypto.readonly is set to 1, mount the decrypted
1684 * filesystem readonly. This is used when /data is mounted by
1685 * recovery mode.
1686 */
1687 char ro_prop[PROPERTY_VALUE_MAX];
1688 property_get("ro.crypto.readonly", ro_prop, "");
Jeff Sharkey95440eb2017-09-18 18:19:28 -06001689 if (strlen(ro_prop) > 0 && std::stoi(ro_prop)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08001690 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
1691 if (entry != nullptr) {
1692 entry->flags |= MS_RDONLY;
Luis Hector Chavezbbb512d2018-05-30 15:47:50 -07001693 }
Doug Zongker6fd57712013-12-17 09:43:23 -08001694 }
JP Abgrall62c7af32014-06-16 13:01:23 -07001695
Ken Sumralle5032c42012-04-01 23:58:44 -07001696 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001697 int retries = RETRY_MOUNT_ATTEMPTS;
1698 int mount_rc;
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001699
1700 /*
1701 * fs_mgr_do_mount runs fsck. Use setexeccon to run trusted
1702 * partitions in the fsck domain.
1703 */
LongPing Wei7f3ab952019-01-30 16:03:14 +08001704 if (setexeccon(android::vold::sFsckContext)) {
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001705 SLOGE("Failed to setexeccon");
1706 return -1;
1707 }
Daniel Rosenberg65f99c92018-08-28 01:58:49 -07001708 bool needs_cp = android::vold::cp_needsCheckpoint();
Tom Cherry4c5bde22019-01-29 14:34:01 -08001709 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, crypto_blkdev, 0,
Paul Lawrence3fe93112020-06-12 08:12:48 -07001710 needs_cp, false)) != 0) {
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001711 if (mount_rc == FS_MGR_DOMNT_BUSY) {
1712 /* TODO: invoke something similar to
1713 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
1714 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
Paul Crowley14c8c072018-09-18 13:30:21 -07001715 SLOGI("Failed to mount %s because it is busy - waiting", crypto_blkdev);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001716 if (--retries) {
1717 sleep(RETRY_MOUNT_DELAY_SECONDS);
1718 } else {
1719 /* Let's hope that a reboot clears away whatever is keeping
1720 the mount busy */
Josh Gaofec44372017-08-28 13:22:55 -07001721 cryptfs_reboot(RebootType::reboot);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001722 }
1723 } else {
1724 SLOGE("Failed to mount decrypted data");
1725 cryptfs_set_corrupt();
1726 cryptfs_trigger_restart_min_framework();
1727 SLOGI("Started framework to offer wipe");
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001728 if (setexeccon(NULL)) {
1729 SLOGE("Failed to setexeccon");
1730 }
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001731 return -1;
1732 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001733 }
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001734 if (setexeccon(NULL)) {
1735 SLOGE("Failed to setexeccon");
1736 return -1;
1737 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001738
Ken Sumralle5032c42012-04-01 23:58:44 -07001739 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07001740 prep_data_fs();
Seigo Nonakae2ef0c02016-06-20 17:05:40 +09001741 property_set("vold.decrypt", "trigger_load_persist_props");
Ken Sumralle5032c42012-04-01 23:58:44 -07001742
1743 /* startup service classes main and late_start */
1744 property_set("vold.decrypt", "trigger_restart_framework");
1745 SLOGD("Just triggered restart_framework\n");
1746
1747 /* Give it a few moments to get started */
1748 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001749 }
1750
Ken Sumrall0cc16632011-01-18 20:32:26 -08001751 if (rc == 0) {
1752 restart_successful = 1;
1753 }
1754
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001755 return rc;
1756}
1757
Paul Crowley14c8c072018-09-18 13:30:21 -07001758int cryptfs_restart(void) {
Paul Lawrence05335c32015-03-05 09:46:23 -08001759 SLOGI("cryptfs_restart");
Eric Biggersa701c452018-10-23 13:06:55 -07001760 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08001761 SLOGE("cryptfs_restart not valid for file encryption:");
1762 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08001763 }
1764
Paul Lawrencef4faa572014-01-29 13:31:03 -08001765 /* Call internal implementation forcing a restart of main service group */
1766 return cryptfs_restart_internal(1);
1767}
1768
Paul Crowley14c8c072018-09-18 13:30:21 -07001769static int do_crypto_complete(const char* mount_point) {
1770 struct crypt_mnt_ftr crypt_ftr;
1771 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001772
Paul Crowley14c8c072018-09-18 13:30:21 -07001773 property_get("ro.crypto.state", encrypted_state, "");
1774 if (strcmp(encrypted_state, "encrypted")) {
1775 SLOGE("not running with encryption, aborting");
1776 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08001777 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001778
Paul Crowley14c8c072018-09-18 13:30:21 -07001779 // crypto_complete is full disk encrypted status
Eric Biggersa701c452018-10-23 13:06:55 -07001780 if (fscrypt_is_native()) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001781 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
1782 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001783
Paul Crowley14c8c072018-09-18 13:30:21 -07001784 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08001785 std::string key_loc;
1786 get_crypt_info(&key_loc, nullptr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07001787
Paul Crowley14c8c072018-09-18 13:30:21 -07001788 /*
1789 * Only report this error if key_loc is a file and it exists.
1790 * If the device was never encrypted, and /data is not mountable for
1791 * some reason, returning 1 should prevent the UI from presenting the
1792 * a "enter password" screen, or worse, a "press button to wipe the
1793 * device" screen.
1794 */
Tom Cherry4c5bde22019-01-29 14:34:01 -08001795 if (!key_loc.empty() && key_loc[0] == '/' && (access("key_loc", F_OK) == -1)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001796 SLOGE("master key file does not exist, aborting");
1797 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
1798 } else {
1799 SLOGE("Error getting crypt footer and key\n");
1800 return CRYPTO_COMPLETE_BAD_METADATA;
1801 }
1802 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001803
Paul Crowley14c8c072018-09-18 13:30:21 -07001804 // Test for possible error flags
1805 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
1806 SLOGE("Encryption process is partway completed\n");
1807 return CRYPTO_COMPLETE_PARTIAL;
1808 }
1809
1810 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
1811 SLOGE("Encryption process was interrupted but cannot continue\n");
1812 return CRYPTO_COMPLETE_INCONSISTENT;
1813 }
1814
1815 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT) {
1816 SLOGE("Encryption is successful but data is corrupt\n");
1817 return CRYPTO_COMPLETE_CORRUPT;
1818 }
1819
1820 /* We passed the test! We shall diminish, and return to the west */
1821 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001822}
1823
Paul Crowley14c8c072018-09-18 13:30:21 -07001824static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, const char* passwd,
1825 const char* mount_point, const char* label) {
1826 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley81796e92020-02-07 11:27:49 -08001827 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08001828 std::string real_blkdev;
Paul Crowley14c8c072018-09-18 13:30:21 -07001829 char tmp_mount_point[64];
1830 unsigned int orig_failed_decrypt_count;
1831 int rc;
Paul Crowley14c8c072018-09-18 13:30:21 -07001832 int upgrade = 0;
1833 unsigned char* intermediate_key = 0;
1834 size_t intermediate_key_size = 0;
1835 int N = 1 << crypt_ftr->N_factor;
1836 int r = 1 << crypt_ftr->r_factor;
1837 int p = 1 << crypt_ftr->p_factor;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001838
Paul Crowley14c8c072018-09-18 13:30:21 -07001839 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
1840 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001841
Paul Crowley14c8c072018-09-18 13:30:21 -07001842 if (!(crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED)) {
1843 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr, &intermediate_key,
1844 &intermediate_key_size)) {
1845 SLOGE("Failed to decrypt master key\n");
1846 rc = -1;
1847 goto errout;
1848 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08001849 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001850
Tom Cherry4c5bde22019-01-29 14:34:01 -08001851 get_crypt_info(nullptr, &real_blkdev);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001852
Paul Crowley14c8c072018-09-18 13:30:21 -07001853 // Create crypto block device - all (non fatal) code paths
1854 // need it
Paul Crowley81796e92020-02-07 11:27:49 -08001855 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
Tom Cherry4c5bde22019-01-29 14:34:01 -08001856 label, 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001857 SLOGE("Error creating decrypted block device\n");
1858 rc = -1;
1859 goto errout;
1860 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001861
Paul Crowley14c8c072018-09-18 13:30:21 -07001862 /* Work out if the problem is the password or the data */
1863 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->scrypted_intermediate_key)];
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001864
Paul Crowley14c8c072018-09-18 13:30:21 -07001865 rc = crypto_scrypt(intermediate_key, intermediate_key_size, crypt_ftr->salt,
1866 sizeof(crypt_ftr->salt), N, r, p, scrypted_intermediate_key,
1867 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001868
Paul Crowley14c8c072018-09-18 13:30:21 -07001869 // Does the key match the crypto footer?
1870 if (rc == 0 && memcmp(scrypted_intermediate_key, crypt_ftr->scrypted_intermediate_key,
1871 sizeof(scrypted_intermediate_key)) == 0) {
1872 SLOGI("Password matches");
1873 rc = 0;
Paul Lawrence74f29f12014-08-28 15:54:10 -07001874 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07001875 /* Try mounting the file system anyway, just in case the problem's with
1876 * the footer, not the key. */
1877 snprintf(tmp_mount_point, sizeof(tmp_mount_point), "%s/tmp_mnt", mount_point);
1878 mkdir(tmp_mount_point, 0755);
Paul Crowley81796e92020-02-07 11:27:49 -08001879 if (fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT,
1880 const_cast<char*>(crypto_blkdev.c_str()), tmp_mount_point)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001881 SLOGE("Error temp mounting decrypted block device\n");
1882 delete_crypto_blk_dev(label);
Paul Lawrence74f29f12014-08-28 15:54:10 -07001883
Paul Crowley14c8c072018-09-18 13:30:21 -07001884 rc = ++crypt_ftr->failed_decrypt_count;
1885 put_crypt_ftr_and_key(crypt_ftr);
1886 } else {
1887 /* Success! */
1888 SLOGI("Password did not match but decrypted drive mounted - continue");
1889 umount(tmp_mount_point);
1890 rc = 0;
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07001891 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08001892 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001893
Paul Crowley14c8c072018-09-18 13:30:21 -07001894 if (rc == 0) {
1895 crypt_ftr->failed_decrypt_count = 0;
1896 if (orig_failed_decrypt_count != 0) {
1897 put_crypt_ftr_and_key(crypt_ftr);
1898 }
1899
1900 /* Save the name of the crypto block device
1901 * so we can mount it when restarting the framework. */
Paul Crowley81796e92020-02-07 11:27:49 -08001902 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -07001903
1904 /* Also save a the master key so we can reencrypted the key
1905 * the key when we want to change the password on it. */
1906 memcpy(saved_master_key, decrypted_master_key, crypt_ftr->keysize);
1907 saved_mount_point = strdup(mount_point);
1908 master_key_saved = 1;
1909 SLOGD("%s(): Master key saved\n", __FUNCTION__);
1910 rc = 0;
1911
1912 // Upgrade if we're not using the latest KDF.
Satya Tangirala23452c12021-03-22 23:29:15 -07001913 if (crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001914 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
1915 upgrade = 1;
Paul Crowley14c8c072018-09-18 13:30:21 -07001916 }
1917
1918 if (upgrade) {
1919 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
1920 crypt_ftr->master_key, crypt_ftr);
1921 if (!rc) {
1922 rc = put_crypt_ftr_and_key(crypt_ftr);
1923 }
1924 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
1925
1926 // Do not fail even if upgrade failed - machine is bootable
1927 // Note that if this code is ever hit, there is a *serious* problem
1928 // since KDFs should never fail. You *must* fix the kdf before
1929 // proceeding!
1930 if (rc) {
1931 SLOGW(
1932 "Upgrade failed with error %d,"
1933 " but continuing with previous state",
1934 rc);
1935 rc = 0;
1936 }
1937 }
1938 }
1939
1940errout:
1941 if (intermediate_key) {
1942 memset(intermediate_key, 0, intermediate_key_size);
1943 free(intermediate_key);
1944 }
1945 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001946}
1947
Ken Sumrall29d8da82011-05-18 17:20:07 -07001948/*
Jeff Sharkey9c484982015-03-31 10:35:33 -07001949 * Called by vold when it's asked to mount an encrypted external
1950 * storage volume. The incoming partition has no crypto header/footer,
Greg Kaiser57f9af62018-02-16 13:13:58 -08001951 * as any metadata is been stored in a separate, small partition. We
1952 * assume it must be using our same crypt type and keysize.
Ken Sumrall29d8da82011-05-18 17:20:07 -07001953 */
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001954int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, const KeyBuffer& key,
Paul Crowley81796e92020-02-07 11:27:49 -08001955 std::string* out_crypto_blkdev) {
Paul Crowley220567c2020-02-07 12:45:20 -08001956 auto crypto_type = get_crypto_type();
1957 if (key.size() != crypto_type.get_keysize()) {
Paul Crowleya661fb62020-02-11 16:21:54 -08001958 SLOGE("Raw keysize %zu does not match crypt keysize %zu", key.size(),
Paul Crowley220567c2020-02-07 12:45:20 -08001959 crypto_type.get_keysize());
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001960 return -1;
1961 }
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02001962 uint64_t nr_sec = 0;
1963 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07001964 SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno));
Ken Sumrall29d8da82011-05-18 17:20:07 -07001965 return -1;
1966 }
1967
Jeff Sharkey9c484982015-03-31 10:35:33 -07001968 struct crypt_mnt_ftr ext_crypt_ftr;
1969 memset(&ext_crypt_ftr, 0, sizeof(ext_crypt_ftr));
1970 ext_crypt_ftr.fs_size = nr_sec;
Paul Crowley220567c2020-02-07 12:45:20 -08001971 ext_crypt_ftr.keysize = crypto_type.get_keysize();
1972 strlcpy((char*)ext_crypt_ftr.crypto_type_name, crypto_type.get_kernel_name(),
Jeff Sharkey32ebb732017-03-27 16:18:50 -06001973 MAX_CRYPTO_TYPE_NAME_LEN);
Paul Crowley385cb8c2018-03-29 13:27:23 -07001974 uint32_t flags = 0;
Eric Biggersa701c452018-10-23 13:06:55 -07001975 if (fscrypt_is_native() &&
Paul Crowley385cb8c2018-03-29 13:27:23 -07001976 android::base::GetBoolProperty("ro.crypto.allow_encrypt_override", false))
1977 flags |= CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07001978
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001979 return create_crypto_blk_dev(&ext_crypt_ftr, reinterpret_cast<const unsigned char*>(key.data()),
1980 real_blkdev, out_crypto_blkdev, label, flags);
Jeff Sharkey9c484982015-03-31 10:35:33 -07001981}
Ken Sumrall29d8da82011-05-18 17:20:07 -07001982
Paul Crowley14c8c072018-09-18 13:30:21 -07001983int cryptfs_crypto_complete(void) {
1984 return do_crypto_complete("/data");
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001985}
1986
Paul Crowley14c8c072018-09-18 13:30:21 -07001987int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08001988 char encrypted_state[PROPERTY_VALUE_MAX];
1989 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07001990 if (master_key_saved || strcmp(encrypted_state, "encrypted")) {
1991 SLOGE(
1992 "encrypted fs already validated or not running with encryption,"
1993 " aborting");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001994 return -1;
1995 }
1996
1997 if (get_crypt_ftr_and_key(crypt_ftr)) {
1998 SLOGE("Error getting crypt footer and key");
1999 return -1;
2000 }
2001
2002 return 0;
2003}
2004
Paul Crowley14c8c072018-09-18 13:30:21 -07002005int cryptfs_check_passwd(const char* passwd) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002006 SLOGI("cryptfs_check_passwd");
Eric Biggersa701c452018-10-23 13:06:55 -07002007 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002008 SLOGE("cryptfs_check_passwd not valid for file encryption");
2009 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002010 }
2011
Paul Lawrencef4faa572014-01-29 13:31:03 -08002012 struct crypt_mnt_ftr crypt_ftr;
2013 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002014
Paul Lawrencef4faa572014-01-29 13:31:03 -08002015 rc = check_unmounted_and_get_ftr(&crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002016 if (rc) {
2017 SLOGE("Could not get footer");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002018 return rc;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002019 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002020
Paul Crowley14c8c072018-09-18 13:30:21 -07002021 rc = test_mount_encrypted_fs(&crypt_ftr, passwd, DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002022 if (rc) {
2023 SLOGE("Password did not match");
2024 return rc;
2025 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002026
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002027 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2028 // Here we have a default actual password but a real password
2029 // we must test against the scrypted value
2030 // First, we must delete the crypto block device that
2031 // test_mount_encrypted_fs leaves behind as a side effect
2032 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Paul Crowley14c8c072018-09-18 13:30:21 -07002033 rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD, DATA_MNT_POINT,
2034 CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002035 if (rc) {
2036 SLOGE("Default password did not match on reboot encryption");
2037 return rc;
2038 }
2039
2040 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2041 put_crypt_ftr_and_key(&crypt_ftr);
2042 rc = cryptfs_changepw(crypt_ftr.crypt_type, passwd);
2043 if (rc) {
2044 SLOGE("Could not change password on reboot encryption");
2045 return rc;
2046 }
2047 }
2048
2049 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002050 cryptfs_clear_password();
2051 password = strdup(passwd);
2052 struct timespec now;
2053 clock_gettime(CLOCK_BOOTTIME, &now);
2054 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002055 }
2056
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002057 return rc;
2058}
2059
Paul Crowley14c8c072018-09-18 13:30:21 -07002060int cryptfs_verify_passwd(const char* passwd) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002061 struct crypt_mnt_ftr crypt_ftr;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002062 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002063 char encrypted_state[PROPERTY_VALUE_MAX];
2064 int rc;
2065
2066 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002067 if (strcmp(encrypted_state, "encrypted")) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002068 SLOGE("device not encrypted, aborting");
2069 return -2;
2070 }
2071
2072 if (!master_key_saved) {
2073 SLOGE("encrypted fs not yet mounted, aborting");
2074 return -1;
2075 }
2076
2077 if (!saved_mount_point) {
2078 SLOGE("encrypted fs failed to save mount point, aborting");
2079 return -1;
2080 }
2081
Ken Sumrall160b4d62013-04-22 12:15:39 -07002082 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002083 SLOGE("Error getting crypt footer and key\n");
2084 return -1;
2085 }
2086
2087 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2088 /* If the device has no password, then just say the password is valid */
2089 rc = 0;
2090 } else {
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002091 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002092 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2093 /* They match, the password is correct */
2094 rc = 0;
2095 } else {
2096 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2097 sleep(1);
2098 rc = 1;
2099 }
2100 }
2101
2102 return rc;
2103}
2104
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002105/* Initialize a crypt_mnt_ftr structure. The keysize is
Paul Crowley220567c2020-02-07 12:45:20 -08002106 * defaulted to get_crypto_type().get_keysize() bytes, and the filesystem size to 0.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002107 * Presumably, at a minimum, the caller will update the
2108 * filesystem size and crypto_type_name after calling this function.
2109 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002110static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr* ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002111 off64_t off;
2112
2113 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002114 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002115 ftr->major_version = CURRENT_MAJOR_VERSION;
2116 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002117 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Paul Crowley220567c2020-02-07 12:45:20 -08002118 ftr->keysize = get_crypto_type().get_keysize();
Satya Tangirala23452c12021-03-22 23:29:15 -07002119 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002120
Kenny Rootc4c70f12013-06-14 12:11:38 -07002121 get_device_scrypt_params(ftr);
2122
Ken Sumrall160b4d62013-04-22 12:15:39 -07002123 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2124 if (get_crypt_ftr_info(NULL, &off) == 0) {
2125 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -07002126 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET + ftr->persist_data_size;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002127 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002128
2129 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002130}
2131
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002132#define FRAMEWORK_BOOT_WAIT 60
2133
Paul Crowleyb64933a2017-10-31 08:25:55 -07002134static int vold_unmountAll(void) {
2135 VolumeManager* vm = VolumeManager::Instance();
2136 return vm->unmountAll();
2137}
2138
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002139int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) {
Paul Crowley81796e92020-02-07 11:27:49 -08002140 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002141 std::string real_blkdev;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002142 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -07002143 int rc = -1, i;
Paul Lawrence87999172014-02-20 12:21:31 -08002144 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07002145 struct crypt_persist_data* pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002146 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -07002147 char lockid[32] = {0};
Tom Cherry4c5bde22019-01-29 14:34:01 -08002148 std::string key_loc;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002149 int num_vols;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002150 bool rebootEncryption = false;
Wei Wang4375f1b2017-02-24 17:43:01 -08002151 bool onlyCreateHeader = false;
Kalesh Singh98062dc2021-02-22 15:10:45 -05002152
2153 /* Get a wakelock as this may take a while, and we don't want the
2154 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2155 * wants to keep the screen on, it can grab a full wakelock.
2156 */
2157 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int)getpid());
2158 auto wl = android::wakelock::WakeLock::tryGet(lockid);
2159 if (!wl.has_value()) {
2160 return android::UNEXPECTED_NULL;
2161 }
Ken Sumrall29d8da82011-05-18 17:20:07 -07002162
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002163 if (get_crypt_ftr_and_key(&crypt_ftr) == 0) {
Eric Biggersc01995e2020-11-03 14:11:00 -08002164 if (crypt_ftr.flags & CRYPT_FORCE_ENCRYPTION) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002165 if (!check_ftr_sha(&crypt_ftr)) {
2166 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
2167 put_crypt_ftr_and_key(&crypt_ftr);
2168 goto error_unencrypted;
2169 }
2170
2171 /* Doing a reboot-encryption*/
2172 crypt_ftr.flags &= ~CRYPT_FORCE_ENCRYPTION;
2173 crypt_ftr.flags |= CRYPT_FORCE_COMPLETE;
2174 rebootEncryption = true;
2175 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08002176 } else {
2177 // We don't want to accidentally reference invalid data.
2178 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
Paul Lawrence87999172014-02-20 12:21:31 -08002179 }
2180
2181 property_get("ro.crypto.state", encrypted_state, "");
Eric Biggersc01995e2020-11-03 14:11:00 -08002182 if (!strcmp(encrypted_state, "encrypted")) {
Paul Lawrence87999172014-02-20 12:21:31 -08002183 SLOGE("Device is already running encrypted, aborting");
2184 goto error_unencrypted;
2185 }
2186
Tom Cherry4c5bde22019-01-29 14:34:01 -08002187 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002188
Ken Sumrall3ed82362011-01-28 23:31:16 -08002189 /* Get the size of the real block device */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002190 uint64_t nr_sec;
2191 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002192 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Ken Sumrall3ed82362011-01-28 23:31:16 -08002193 goto error_unencrypted;
2194 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002195
2196 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002197 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002198 uint64_t fs_size_sec, max_fs_size_sec;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002199 fs_size_sec = get_fs_size(real_blkdev.c_str());
2200 if (fs_size_sec == 0) fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev.data());
Daniel Rosenberge82df162014-08-15 22:19:23 +00002201
Paul Lawrence87999172014-02-20 12:21:31 -08002202 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002203
2204 if (fs_size_sec > max_fs_size_sec) {
2205 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2206 goto error_unencrypted;
2207 }
2208 }
2209
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002210 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002211 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002212 */
2213 property_set("vold.decrypt", "trigger_shutdown_framework");
2214 SLOGD("Just asked init to shut down class main\n");
2215
Jeff Sharkey9c484982015-03-31 10:35:33 -07002216 /* Ask vold to unmount all devices that it manages */
2217 if (vold_unmountAll()) {
2218 SLOGE("Failed to unmount all vold managed devices");
Ken Sumrall2eaf7132011-01-14 12:45:48 -08002219 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002220
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002221 /* no_ui means we are being called from init, not settings.
2222 Now we always reboot from settings, so !no_ui means reboot
2223 */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002224 if (!no_ui) {
2225 /* Try fallback, which is to reboot and try there */
2226 onlyCreateHeader = true;
2227 FILE* breadcrumb = fopen(BREADCRUMB_FILE, "we");
2228 if (breadcrumb == 0) {
2229 SLOGE("Failed to create breadcrumb file");
2230 goto error_shutting_down;
2231 }
2232 fclose(breadcrumb);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002233 }
2234
2235 /* Do extra work for a better UX when doing the long inplace encryption */
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002236 if (!onlyCreateHeader) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002237 /* Now that /data is unmounted, we need to mount a tmpfs
2238 * /data, set a property saying we're doing inplace encryption,
2239 * and restart the framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002240 */
xzj7e38a3a2018-10-12 10:17:11 +08002241 wait_and_unmount(DATA_MNT_POINT, true);
Ken Sumralle5032c42012-04-01 23:58:44 -07002242 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002243 goto error_shutting_down;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002244 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002245 /* Tells the framework that inplace encryption is starting */
Ken Sumrall7df84122011-01-18 14:04:08 -08002246 property_set("vold.encrypt_progress", "0");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002247
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002248 /* restart the framework. */
2249 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07002250 prep_data_fs();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002251
Ken Sumrall92736ef2012-10-17 20:57:14 -07002252 /* Ugh, shutting down the framework is not synchronous, so until it
2253 * can be fixed, this horrible hack will wait a moment for it all to
2254 * shut down before proceeding. Without it, some devices cannot
2255 * restart the graphics services.
2256 */
2257 sleep(2);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002258 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002259
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002260 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002261 /* Initialize a crypt_mnt_ftr for the partition */
Eric Biggersc01995e2020-11-03 14:11:00 -08002262 if (!rebootEncryption) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002263 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
2264 goto error_shutting_down;
2265 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002266
Tom Cherry4c5bde22019-01-29 14:34:01 -08002267 if (key_loc == KEY_IN_FOOTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002268 crypt_ftr.fs_size = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Paul Lawrence87999172014-02-20 12:21:31 -08002269 } else {
2270 crypt_ftr.fs_size = nr_sec;
2271 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07002272 /* At this point, we are in an inconsistent state. Until we successfully
2273 complete encryption, a reboot will leave us broken. So mark the
2274 encryption failed in case that happens.
2275 On successfully completing encryption, remove this flag */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002276 if (onlyCreateHeader) {
2277 crypt_ftr.flags |= CRYPT_FORCE_ENCRYPTION;
2278 } else {
2279 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2280 }
Paul Lawrence87999172014-02-20 12:21:31 -08002281 crypt_ftr.crypt_type = crypt_type;
Paul Crowley220567c2020-02-07 12:45:20 -08002282 strlcpy((char*)crypt_ftr.crypto_type_name, get_crypto_type().get_kernel_name(),
Paul Crowley14c8c072018-09-18 13:30:21 -07002283 MAX_CRYPTO_TYPE_NAME_LEN);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002284
Paul Lawrence87999172014-02-20 12:21:31 -08002285 /* Make an encrypted master key */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002286 if (create_encrypted_random_key(onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2287 crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
Paul Lawrence87999172014-02-20 12:21:31 -08002288 SLOGE("Cannot create encrypted master key\n");
2289 goto error_shutting_down;
2290 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002291
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002292 /* Replace scrypted intermediate key if we are preparing for a reboot */
2293 if (onlyCreateHeader) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08002294 unsigned char fake_master_key[MAX_KEY_LEN];
2295 unsigned char encrypted_fake_master_key[MAX_KEY_LEN];
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002296 memset(fake_master_key, 0, sizeof(fake_master_key));
Paul Crowley14c8c072018-09-18 13:30:21 -07002297 encrypt_master_key(passwd, crypt_ftr.salt, fake_master_key, encrypted_fake_master_key,
2298 &crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002299 }
2300
Paul Lawrence87999172014-02-20 12:21:31 -08002301 /* Write the key to the end of the partition */
2302 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002303
Paul Lawrence87999172014-02-20 12:21:31 -08002304 /* If any persistent data has been remembered, save it.
2305 * If none, create a valid empty table and save that.
2306 */
2307 if (!persist_data) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002308 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
2309 if (pdata) {
2310 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
2311 persist_data = pdata;
2312 }
Paul Lawrence87999172014-02-20 12:21:31 -08002313 }
2314 if (persist_data) {
2315 save_persistent_data();
2316 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002317 }
2318
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002319 if (onlyCreateHeader) {
2320 sleep(2);
Josh Gaofec44372017-08-28 13:22:55 -07002321 cryptfs_reboot(RebootType::reboot);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002322 }
2323
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002324 if (!no_ui || rebootEncryption) {
Ajay Dudani87701e22014-09-17 21:02:52 -07002325 /* startup service classes main and late_start */
2326 property_set("vold.decrypt", "trigger_restart_min_framework");
2327 SLOGD("Just triggered restart_min_framework\n");
2328
2329 /* OK, the framework is restarted and will soon be showing a
2330 * progress bar. Time to setup an encrypted mapping, and
2331 * either write a new filesystem, or encrypt in place updating
2332 * the progress bar as we work.
2333 */
2334 }
2335
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002336 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Eric Biggers88f993b2020-11-03 14:11:00 -08002337 rc = create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(),
2338 &crypto_blkdev, CRYPTO_BLOCK_DEVICE, 0);
2339 if (!rc) {
Eric Biggersf038c5f2020-11-03 14:11:02 -08002340 if (encrypt_inplace(crypto_blkdev, real_blkdev, crypt_ftr.fs_size, true)) {
2341 crypt_ftr.encrypted_upto = crypt_ftr.fs_size;
2342 rc = 0;
2343 } else {
2344 rc = -1;
2345 }
Eric Biggers88f993b2020-11-03 14:11:00 -08002346 /* Undo the dm-crypt mapping whether we succeed or not */
2347 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
2348 }
Ken Sumrall29d8da82011-05-18 17:20:07 -07002349
Paul Crowley14c8c072018-09-18 13:30:21 -07002350 if (!rc) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002351 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002352 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002353
Paul Lawrence6bfed202014-07-28 12:47:22 -07002354 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08002355
Eric Biggersc01995e2020-11-03 14:11:00 -08002356 char value[PROPERTY_VALUE_MAX];
2357 property_get("ro.crypto.state", value, "");
2358 if (!strcmp(value, "")) {
2359 /* default encryption - continue first boot sequence */
2360 property_set("ro.crypto.state", "encrypted");
2361 property_set("ro.crypto.type", "block");
Kalesh Singh98062dc2021-02-22 15:10:45 -05002362 wl.reset();
Eric Biggersc01995e2020-11-03 14:11:00 -08002363 if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2364 // Bring up cryptkeeper that will check the password and set it
2365 property_set("vold.decrypt", "trigger_shutdown_framework");
2366 sleep(2);
2367 property_set("vold.encrypt_progress", "");
2368 cryptfs_trigger_restart_min_framework();
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002369 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002370 cryptfs_check_passwd(DEFAULT_PASSWORD);
2371 cryptfs_restart_internal(1);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002372 }
Eric Biggersc01995e2020-11-03 14:11:00 -08002373 return 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002374 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002375 sleep(2); /* Give the UI a chance to show 100% progress */
2376 cryptfs_reboot(RebootType::reboot);
Paul Lawrence87999172014-02-20 12:21:31 -08002377 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002378 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002379 char value[PROPERTY_VALUE_MAX];
2380
Ken Sumrall319369a2012-06-27 16:30:18 -07002381 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002382 if (!strcmp(value, "1")) {
2383 /* wipe data if encryption failed */
2384 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
Wei Wang4375f1b2017-02-24 17:43:01 -08002385 std::string err;
2386 const std::vector<std::string> options = {
Paul Crowley14c8c072018-09-18 13:30:21 -07002387 "--wipe_data\n--reason=cryptfs_enable_internal\n"};
Wei Wang4375f1b2017-02-24 17:43:01 -08002388 if (!write_bootloader_message(options, &err)) {
2389 SLOGE("could not write bootloader message: %s", err.c_str());
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002390 }
Josh Gaofec44372017-08-28 13:22:55 -07002391 cryptfs_reboot(RebootType::recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002392 } else {
2393 /* set property to trigger dialog */
2394 property_set("vold.encrypt_progress", "error_partially_encrypted");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002395 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002396 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002397 }
2398
Ken Sumrall3ed82362011-01-28 23:31:16 -08002399 /* hrm, the encrypt step claims success, but the reboot failed.
2400 * This should not happen.
2401 * Set the property and return. Hope the framework can deal with it.
2402 */
2403 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002404 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08002405
2406error_unencrypted:
2407 property_set("vold.encrypt_progress", "error_not_encrypted");
2408 return -1;
2409
2410error_shutting_down:
2411 /* we failed, and have not encrypted anthing, so the users's data is still intact,
2412 * but the framework is stopped and not restarted to show the error, so it's up to
2413 * vold to restart the system.
2414 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002415 SLOGE(
2416 "Error enabling encryption after framework is shutdown, no data changed, restarting "
2417 "system");
Josh Gaofec44372017-08-28 13:22:55 -07002418 cryptfs_reboot(RebootType::reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002419
2420 /* shouldn't get here */
2421 property_set("vold.encrypt_progress", "error_shutting_down");
2422 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002423}
2424
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002425int cryptfs_enable(int type, const char* passwd, int no_ui) {
2426 return cryptfs_enable_internal(type, passwd, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002427}
2428
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002429int cryptfs_enable_default(int no_ui) {
2430 return cryptfs_enable_internal(CRYPT_TYPE_DEFAULT, DEFAULT_PASSWORD, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002431}
2432
Paul Crowley14c8c072018-09-18 13:30:21 -07002433int cryptfs_changepw(int crypt_type, const char* newpw) {
Eric Biggersa701c452018-10-23 13:06:55 -07002434 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002435 SLOGE("cryptfs_changepw not valid for file encryption");
2436 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002437 }
2438
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002439 struct crypt_mnt_ftr crypt_ftr;
JP Abgrall933216c2015-02-11 13:44:32 -08002440 int rc;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002441
2442 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08002443 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08002444 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002445 return -1;
2446 }
2447
Paul Lawrencef4faa572014-01-29 13:31:03 -08002448 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
2449 SLOGE("Invalid crypt_type %d", crypt_type);
2450 return -1;
2451 }
2452
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002453 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07002454 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002455 SLOGE("Error getting crypt footer and key");
2456 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002457 }
2458
Paul Lawrencef4faa572014-01-29 13:31:03 -08002459 crypt_ftr.crypt_type = crypt_type;
2460
Paul Crowley14c8c072018-09-18 13:30:21 -07002461 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw,
2462 crypt_ftr.salt, saved_master_key, crypt_ftr.master_key, &crypt_ftr);
JP Abgrall933216c2015-02-11 13:44:32 -08002463 if (rc) {
2464 SLOGE("Encrypt master key failed: %d", rc);
2465 return -1;
2466 }
Jason parks70a4b3f2011-01-28 10:10:47 -06002467 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07002468 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002469
2470 return 0;
2471}
Ken Sumrall160b4d62013-04-22 12:15:39 -07002472
Rubin Xu85c01f92014-10-13 12:49:54 +01002473static unsigned int persist_get_max_entries(int encrypted) {
2474 struct crypt_mnt_ftr crypt_ftr;
2475 unsigned int dsize;
Rubin Xu85c01f92014-10-13 12:49:54 +01002476
2477 /* If encrypted, use the values from the crypt_ftr, otherwise
2478 * use the values for the current spec.
2479 */
2480 if (encrypted) {
2481 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Rubin Xuf83cc612018-10-09 16:13:38 +01002482 /* Something is wrong, assume no space for entries */
2483 return 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01002484 }
2485 dsize = crypt_ftr.persist_data_size;
2486 } else {
2487 dsize = CRYPT_PERSIST_DATA_SIZE;
2488 }
2489
Rubin Xuf83cc612018-10-09 16:13:38 +01002490 if (dsize > sizeof(struct crypt_persist_data)) {
2491 return (dsize - sizeof(struct crypt_persist_data)) / sizeof(struct crypt_persist_entry);
2492 } else {
2493 return 0;
2494 }
Rubin Xu85c01f92014-10-13 12:49:54 +01002495}
2496
Paul Crowley14c8c072018-09-18 13:30:21 -07002497static int persist_get_key(const char* fieldname, char* value) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002498 unsigned int i;
2499
2500 if (persist_data == NULL) {
2501 return -1;
2502 }
2503 for (i = 0; i < persist_data->persist_valid_entries; i++) {
2504 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
2505 /* We found it! */
2506 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
2507 return 0;
2508 }
2509 }
2510
2511 return -1;
2512}
2513
Paul Crowley14c8c072018-09-18 13:30:21 -07002514static int persist_set_key(const char* fieldname, const char* value, int encrypted) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002515 unsigned int i;
2516 unsigned int num;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002517 unsigned int max_persistent_entries;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002518
2519 if (persist_data == NULL) {
2520 return -1;
2521 }
2522
Rubin Xu85c01f92014-10-13 12:49:54 +01002523 max_persistent_entries = persist_get_max_entries(encrypted);
Ken Sumrall160b4d62013-04-22 12:15:39 -07002524
2525 num = persist_data->persist_valid_entries;
2526
2527 for (i = 0; i < num; i++) {
2528 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
2529 /* We found an existing entry, update it! */
2530 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
2531 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
2532 return 0;
2533 }
2534 }
2535
2536 /* We didn't find it, add it to the end, if there is room */
2537 if (persist_data->persist_valid_entries < max_persistent_entries) {
2538 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
2539 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
2540 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
2541 persist_data->persist_valid_entries++;
2542 return 0;
2543 }
2544
2545 return -1;
2546}
2547
Rubin Xu85c01f92014-10-13 12:49:54 +01002548/**
2549 * Test if key is part of the multi-entry (field, index) sequence. Return non-zero if key is in the
2550 * sequence and its index is greater than or equal to index. Return 0 otherwise.
2551 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002552int match_multi_entry(const char* key, const char* field, unsigned index) {
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002553 std::string key_ = key;
2554 std::string field_ = field;
Rubin Xu85c01f92014-10-13 12:49:54 +01002555
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002556 std::string parsed_field;
2557 unsigned parsed_index;
2558
2559 std::string::size_type split = key_.find_last_of('_');
2560 if (split == std::string::npos) {
2561 parsed_field = key_;
2562 parsed_index = 0;
2563 } else {
2564 parsed_field = key_.substr(0, split);
2565 parsed_index = std::stoi(key_.substr(split + 1));
Rubin Xu85c01f92014-10-13 12:49:54 +01002566 }
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002567
2568 return parsed_field == field_ && parsed_index >= index;
Rubin Xu85c01f92014-10-13 12:49:54 +01002569}
2570
2571/*
2572 * Delete entry/entries from persist_data. If the entries are part of a multi-segment field, all
2573 * remaining entries starting from index will be deleted.
2574 * returns PERSIST_DEL_KEY_OK if deletion succeeds,
2575 * PERSIST_DEL_KEY_ERROR_NO_FIELD if the field does not exist,
2576 * and PERSIST_DEL_KEY_ERROR_OTHER if error occurs.
2577 *
2578 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002579static int persist_del_keys(const char* fieldname, unsigned index) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002580 unsigned int i;
2581 unsigned int j;
2582 unsigned int num;
2583
2584 if (persist_data == NULL) {
2585 return PERSIST_DEL_KEY_ERROR_OTHER;
2586 }
2587
2588 num = persist_data->persist_valid_entries;
2589
Paul Crowley14c8c072018-09-18 13:30:21 -07002590 j = 0; // points to the end of non-deleted entries.
Rubin Xu85c01f92014-10-13 12:49:54 +01002591 // Filter out to-be-deleted entries in place.
2592 for (i = 0; i < num; i++) {
2593 if (!match_multi_entry(persist_data->persist_entry[i].key, fieldname, index)) {
2594 persist_data->persist_entry[j] = persist_data->persist_entry[i];
2595 j++;
2596 }
2597 }
2598
2599 if (j < num) {
2600 persist_data->persist_valid_entries = j;
2601 // Zeroise the remaining entries
2602 memset(&persist_data->persist_entry[j], 0, (num - j) * sizeof(struct crypt_persist_entry));
2603 return PERSIST_DEL_KEY_OK;
2604 } else {
2605 // Did not find an entry matching the given fieldname
2606 return PERSIST_DEL_KEY_ERROR_NO_FIELD;
2607 }
2608}
2609
Paul Crowley14c8c072018-09-18 13:30:21 -07002610static int persist_count_keys(const char* fieldname) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002611 unsigned int i;
2612 unsigned int count;
2613
2614 if (persist_data == NULL) {
2615 return -1;
2616 }
2617
2618 count = 0;
2619 for (i = 0; i < persist_data->persist_valid_entries; i++) {
2620 if (match_multi_entry(persist_data->persist_entry[i].key, fieldname, 0)) {
2621 count++;
2622 }
2623 }
2624
2625 return count;
2626}
2627
Ken Sumrall160b4d62013-04-22 12:15:39 -07002628/* Return the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07002629int cryptfs_getfield(const char* fieldname, char* value, int len) {
Eric Biggersa701c452018-10-23 13:06:55 -07002630 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08002631 SLOGE("Cannot get field when file encrypted");
2632 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07002633 }
2634
Ken Sumrall160b4d62013-04-22 12:15:39 -07002635 char temp_value[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01002636 /* CRYPTO_GETFIELD_OK is success,
2637 * CRYPTO_GETFIELD_ERROR_NO_FIELD is value not set,
2638 * CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL is buffer (as given by len) too small,
2639 * CRYPTO_GETFIELD_ERROR_OTHER is any other error
Ken Sumrall160b4d62013-04-22 12:15:39 -07002640 */
Rubin Xu85c01f92014-10-13 12:49:54 +01002641 int rc = CRYPTO_GETFIELD_ERROR_OTHER;
2642 int i;
2643 char temp_field[PROPERTY_KEY_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -07002644
2645 if (persist_data == NULL) {
2646 load_persistent_data();
2647 if (persist_data == NULL) {
2648 SLOGE("Getfield error, cannot load persistent data");
2649 goto out;
2650 }
2651 }
2652
Rubin Xu85c01f92014-10-13 12:49:54 +01002653 // Read value from persistent entries. If the original value is split into multiple entries,
2654 // stitch them back together.
Ken Sumrall160b4d62013-04-22 12:15:39 -07002655 if (!persist_get_key(fieldname, temp_value)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002656 // 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 -07002657 if (strlcpy(value, temp_value, len) >= (unsigned)len) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002658 // value too small
2659 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
2660 goto out;
2661 }
2662 rc = CRYPTO_GETFIELD_OK;
2663
2664 for (i = 1; /* break explicitly */; i++) {
2665 if (snprintf(temp_field, sizeof(temp_field), "%s_%d", fieldname, i) >=
Paul Crowley14c8c072018-09-18 13:30:21 -07002666 (int)sizeof(temp_field)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002667 // If the fieldname is very long, we stop as soon as it begins to overflow the
2668 // maximum field length. At this point we have in fact fully read out the original
2669 // value because cryptfs_setfield would not allow fields with longer names to be
2670 // written in the first place.
2671 break;
2672 }
2673 if (!persist_get_key(temp_field, temp_value)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002674 if (strlcat(value, temp_value, len) >= (unsigned)len) {
2675 // value too small.
2676 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
2677 goto out;
2678 }
Rubin Xu85c01f92014-10-13 12:49:54 +01002679 } else {
2680 // Exhaust all entries.
2681 break;
2682 }
2683 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002684 } else {
2685 /* Sadness, it's not there. Return the error */
Rubin Xu85c01f92014-10-13 12:49:54 +01002686 rc = CRYPTO_GETFIELD_ERROR_NO_FIELD;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002687 }
2688
2689out:
2690 return rc;
2691}
2692
2693/* Set the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07002694int cryptfs_setfield(const char* fieldname, const char* value) {
Eric Biggersa701c452018-10-23 13:06:55 -07002695 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08002696 SLOGE("Cannot set field when file encrypted");
2697 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07002698 }
2699
Ken Sumrall160b4d62013-04-22 12:15:39 -07002700 char encrypted_state[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01002701 /* 0 is success, negative values are error */
2702 int rc = CRYPTO_SETFIELD_ERROR_OTHER;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002703 int encrypted = 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01002704 unsigned int field_id;
2705 char temp_field[PROPERTY_KEY_MAX];
2706 unsigned int num_entries;
2707 unsigned int max_keylen;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002708
2709 if (persist_data == NULL) {
2710 load_persistent_data();
2711 if (persist_data == NULL) {
2712 SLOGE("Setfield error, cannot load persistent data");
2713 goto out;
2714 }
2715 }
2716
2717 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002718 if (!strcmp(encrypted_state, "encrypted")) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002719 encrypted = 1;
2720 }
2721
Rubin Xu85c01f92014-10-13 12:49:54 +01002722 // Compute the number of entries required to store value, each entry can store up to
2723 // (PROPERTY_VALUE_MAX - 1) chars
2724 if (strlen(value) == 0) {
2725 // Empty value also needs one entry to store.
2726 num_entries = 1;
2727 } else {
2728 num_entries = (strlen(value) + (PROPERTY_VALUE_MAX - 1) - 1) / (PROPERTY_VALUE_MAX - 1);
2729 }
2730
2731 max_keylen = strlen(fieldname);
2732 if (num_entries > 1) {
2733 // Need an extra "_%d" suffix.
2734 max_keylen += 1 + log10(num_entries);
2735 }
2736 if (max_keylen > PROPERTY_KEY_MAX - 1) {
2737 rc = CRYPTO_SETFIELD_ERROR_FIELD_TOO_LONG;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002738 goto out;
2739 }
2740
Rubin Xu85c01f92014-10-13 12:49:54 +01002741 // Make sure we have enough space to write the new value
2742 if (persist_data->persist_valid_entries + num_entries - persist_count_keys(fieldname) >
2743 persist_get_max_entries(encrypted)) {
2744 rc = CRYPTO_SETFIELD_ERROR_VALUE_TOO_LONG;
2745 goto out;
2746 }
2747
2748 // Now that we know persist_data has enough space for value, let's delete the old field first
2749 // to make up space.
2750 persist_del_keys(fieldname, 0);
2751
2752 if (persist_set_key(fieldname, value, encrypted)) {
2753 // fail to set key, should not happen as we have already checked the available space
2754 SLOGE("persist_set_key() error during setfield()");
2755 goto out;
2756 }
2757
2758 for (field_id = 1; field_id < num_entries; field_id++) {
Greg Kaiserb610e772018-02-09 09:19:54 -08002759 snprintf(temp_field, sizeof(temp_field), "%s_%u", fieldname, field_id);
Rubin Xu85c01f92014-10-13 12:49:54 +01002760
2761 if (persist_set_key(temp_field, value + field_id * (PROPERTY_VALUE_MAX - 1), encrypted)) {
2762 // fail to set key, should not happen as we have already checked the available space.
2763 SLOGE("persist_set_key() error during setfield()");
2764 goto out;
2765 }
2766 }
2767
Ken Sumrall160b4d62013-04-22 12:15:39 -07002768 /* If we are running encrypted, save the persistent data now */
2769 if (encrypted) {
2770 if (save_persistent_data()) {
2771 SLOGE("Setfield error, cannot save persistent data");
2772 goto out;
2773 }
2774 }
2775
Rubin Xu85c01f92014-10-13 12:49:54 +01002776 rc = CRYPTO_SETFIELD_OK;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002777
2778out:
2779 return rc;
2780}
Paul Lawrencef4faa572014-01-29 13:31:03 -08002781
2782/* Checks userdata. Attempt to mount the volume if default-
2783 * encrypted.
2784 * On success trigger next init phase and return 0.
2785 * Currently do not handle failure - see TODO below.
2786 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002787int cryptfs_mount_default_encrypted(void) {
Paul Lawrence84274cc2016-04-15 15:41:33 -07002788 int crypt_type = cryptfs_get_password_type();
2789 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
2790 SLOGE("Bad crypt type - error");
2791 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002792 SLOGD(
2793 "Password is not default - "
2794 "starting min framework to prompt");
Paul Lawrence84274cc2016-04-15 15:41:33 -07002795 property_set("vold.decrypt", "trigger_restart_min_framework");
2796 return 0;
2797 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
2798 SLOGD("Password is default - restarting filesystem");
2799 cryptfs_restart_internal(0);
2800 return 0;
Paul Lawrencef4faa572014-01-29 13:31:03 -08002801 } else {
Paul Lawrence84274cc2016-04-15 15:41:33 -07002802 SLOGE("Encrypted, default crypt type but can't decrypt");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002803 }
2804
Paul Lawrence6bfed202014-07-28 12:47:22 -07002805 /** Corrupt. Allow us to boot into framework, which will detect bad
2806 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08002807 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002808 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002809 return 0;
2810}
2811
2812/* Returns type of the password, default, pattern, pin or password.
2813 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002814int cryptfs_get_password_type(void) {
Eric Biggersa701c452018-10-23 13:06:55 -07002815 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002816 SLOGE("cryptfs_get_password_type not valid for file encryption");
2817 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002818 }
2819
Paul Lawrencef4faa572014-01-29 13:31:03 -08002820 struct crypt_mnt_ftr crypt_ftr;
2821
2822 if (get_crypt_ftr_and_key(&crypt_ftr)) {
2823 SLOGE("Error getting crypt footer and key\n");
2824 return -1;
2825 }
2826
Paul Lawrence6bfed202014-07-28 12:47:22 -07002827 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
2828 return -1;
2829 }
2830
Paul Lawrencef4faa572014-01-29 13:31:03 -08002831 return crypt_ftr.crypt_type;
2832}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002833
Paul Crowley14c8c072018-09-18 13:30:21 -07002834const char* cryptfs_get_password() {
Eric Biggersa701c452018-10-23 13:06:55 -07002835 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002836 SLOGE("cryptfs_get_password not valid for file encryption");
2837 return 0;
Paul Lawrence05335c32015-03-05 09:46:23 -08002838 }
2839
Paul Lawrence399317e2014-03-10 13:20:50 -07002840 struct timespec now;
Paul Lawrenceef2b5be2014-11-11 12:47:03 -08002841 clock_gettime(CLOCK_BOOTTIME, &now);
Paul Lawrence399317e2014-03-10 13:20:50 -07002842 if (now.tv_sec < password_expiry_time) {
2843 return password;
2844 } else {
2845 cryptfs_clear_password();
2846 return 0;
2847 }
2848}
2849
Paul Crowley14c8c072018-09-18 13:30:21 -07002850void cryptfs_clear_password() {
Paul Lawrence399317e2014-03-10 13:20:50 -07002851 if (password) {
2852 size_t len = strlen(password);
2853 memset(password, 0, len);
2854 free(password);
2855 password = 0;
2856 password_expiry_time = 0;
2857 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002858}
Paul Lawrence731a7a22015-04-28 22:14:15 +00002859
Paul Crowley14c8c072018-09-18 13:30:21 -07002860int cryptfs_isConvertibleToFBE() {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002861 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
2862 return entry && entry->fs_mgr_flags.force_fde_or_fbe;
Paul Lawrence0c247462015-10-29 10:30:57 -07002863}