blob: 91235d24f3a1a19cd8241ac4c578bcadbee36744 [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
Paul Crowley73be12d2020-02-03 12:22:03 -0800259typedef int (*kdf_func)(const char* passwd, const unsigned char* salt, unsigned char* ikey,
260 void* params);
261
Mark Salyzyn5eecc442014-02-12 14:16:14 -0800262#define UNUSED __attribute__((unused))
263
Jason parks70a4b3f2011-01-28 10:10:47 -0600264#define HASH_COUNT 2000
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800265
266constexpr size_t INTERMEDIATE_KEY_LEN_BYTES = 16;
267constexpr size_t INTERMEDIATE_IV_LEN_BYTES = 16;
Paul Crowley14c8c072018-09-18 13:30:21 -0700268constexpr size_t INTERMEDIATE_BUF_SIZE = (INTERMEDIATE_KEY_LEN_BYTES + INTERMEDIATE_IV_LEN_BYTES);
Greg Kaiserc0de9c72018-02-14 20:05:54 -0800269
270// SCRYPT_LEN is used by struct crypt_mnt_ftr for its intermediate key.
Paul Crowley14c8c072018-09-18 13:30:21 -0700271static_assert(INTERMEDIATE_BUF_SIZE == SCRYPT_LEN, "Mismatch of intermediate key sizes");
Jason parks70a4b3f2011-01-28 10:10:47 -0600272
Paul Crowley14c8c072018-09-18 13:30:21 -0700273#define KEY_IN_FOOTER "footer"
Ken Sumrall29d8da82011-05-18 17:20:07 -0700274
Paul Lawrence3bd36d52015-06-09 13:37:44 -0700275#define DEFAULT_PASSWORD "default_password"
Paul Lawrencef4faa572014-01-29 13:31:03 -0800276
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800277#define CRYPTO_BLOCK_DEVICE "userdata"
278
279#define BREADCRUMB_FILE "/data/misc/vold/convert_fde"
280
Ken Sumrall29d8da82011-05-18 17:20:07 -0700281#define EXT4_FS 1
JP Abgrall62c7af32014-06-16 13:01:23 -0700282#define F2FS_FS 2
Ken Sumrall29d8da82011-05-18 17:20:07 -0700283
Ken Sumralle919efe2012-09-29 17:07:41 -0700284#define TABLE_LOAD_RETRIES 10
285
Shawn Willden47ba10d2014-09-03 17:07:06 -0600286#define RSA_KEY_SIZE 2048
287#define RSA_KEY_SIZE_BYTES (RSA_KEY_SIZE / 8)
288#define RSA_EXPONENT 0x10001
Shawn Willdenda6e8992015-06-03 09:40:45 -0600289#define KEYMASTER_CRYPTFS_RATE_LIMIT 1 // Maximum one try per second
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700290
Paul Lawrence8e3f4512014-09-08 10:11:17 -0700291#define RETRY_MOUNT_ATTEMPTS 10
292#define RETRY_MOUNT_DELAY_SECONDS 1
293
Paul Crowley5afbc622017-11-27 09:42:17 -0800294#define CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE (1)
295
Paul Crowley73473332017-11-21 15:43:51 -0800296static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr);
297
Greg Kaiser59ad0182018-02-16 13:01:36 -0800298static unsigned char saved_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -0700299static char* saved_mount_point;
300static int master_key_saved = 0;
301static struct crypt_persist_data* persist_data = NULL;
Ken Sumrall56ad03c2013-02-13 13:00:19 -0800302
Paul Crowley220567c2020-02-07 12:45:20 -0800303constexpr CryptoType aes_128_cbc = CryptoType()
304 .set_config_name("AES-128-CBC")
305 .set_kernel_name("aes-cbc-essiv:sha256")
306 .set_keysize(16);
307
308constexpr CryptoType supported_crypto_types[] = {aes_128_cbc, android::vold::adiantum};
309
310static_assert(validateSupportedCryptoTypes(MAX_KEY_LEN, supported_crypto_types,
311 array_length(supported_crypto_types)),
312 "We have a CryptoType with keysize > MAX_KEY_LEN or which was "
313 "incompletely constructed.");
314
315static const CryptoType& get_crypto_type() {
316 // We only want to parse this read-only property once. But we need to wait
317 // until the system is initialized before we can read it. So we use a static
318 // scoped within this function to get it only once.
319 static CryptoType crypto_type =
320 lookup_crypto_algorithm(supported_crypto_types, array_length(supported_crypto_types),
321 aes_128_cbc, "ro.crypto.fde_algorithm");
322 return crypto_type;
323}
324
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800325const KeyGeneration cryptfs_get_keygen() {
Paul Crowley249c2fb2020-02-07 12:51:56 -0800326 return KeyGeneration{get_crypto_type().get_keysize(), true, false};
Paul Crowleyb3d018a2020-02-12 11:04:05 -0800327}
328
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800329static bool write_string_to_buf(const std::string& towrite, uint8_t* buffer, uint32_t buffer_size,
330 uint32_t* out_size) {
331 if (!buffer || !out_size) {
332 LOG(ERROR) << "Missing target pointers";
333 return false;
334 }
335 *out_size = towrite.size();
336 if (buffer_size < towrite.size()) {
337 LOG(ERROR) << "Buffer too small " << buffer_size << " < " << towrite.size();
338 return false;
339 }
340 memset(buffer, '\0', buffer_size);
341 std::copy(towrite.begin(), towrite.end(), buffer);
342 return true;
343}
344
345static int keymaster_create_key_for_cryptfs_scrypt(uint32_t rsa_key_size, uint64_t rsa_exponent,
346 uint32_t ratelimit, uint8_t* key_buffer,
347 uint32_t key_buffer_size,
348 uint32_t* key_out_size) {
349 if (key_out_size) {
350 *key_out_size = 0;
351 }
352 Keymaster dev;
353 if (!dev) {
354 LOG(ERROR) << "Failed to initiate keymaster session";
355 return -1;
356 }
357 auto keyParams = km::AuthorizationSetBuilder()
358 .RsaSigningKey(rsa_key_size, rsa_exponent)
359 .NoDigestOrPadding()
360 .Authorization(km::TAG_NO_AUTH_REQUIRED)
361 .Authorization(km::TAG_MIN_SECONDS_BETWEEN_OPS, ratelimit);
362 std::string key;
363 if (!dev.generateKey(keyParams, &key)) return -1;
364 if (!write_string_to_buf(key, key_buffer, key_buffer_size, key_out_size)) return -1;
365 return 0;
366}
367
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700368/* Create a new keymaster key and store it in this footer */
Paul Crowley14c8c072018-09-18 13:30:21 -0700369static int keymaster_create_key(struct crypt_mnt_ftr* ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800370 if (ftr->keymaster_blob_size) {
371 SLOGI("Already have key");
372 return 0;
373 }
374
Paul Crowley14c8c072018-09-18 13:30:21 -0700375 int rc = keymaster_create_key_for_cryptfs_scrypt(
376 RSA_KEY_SIZE, RSA_EXPONENT, KEYMASTER_CRYPTFS_RATE_LIMIT, ftr->keymaster_blob,
377 KEYMASTER_BLOB_SIZE, &ftr->keymaster_blob_size);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000378 if (rc) {
379 if (ftr->keymaster_blob_size > KEYMASTER_BLOB_SIZE) {
Paul Crowley73473332017-11-21 15:43:51 -0800380 SLOGE("Keymaster key blob too large");
Janis Danisevskis015ec302017-01-31 11:31:08 +0000381 ftr->keymaster_blob_size = 0;
382 }
383 SLOGE("Failed to generate keypair");
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700384 return -1;
385 }
Janis Danisevskis015ec302017-01-31 11:31:08 +0000386 return 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700387}
388
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800389static int keymaster_sign_object_for_cryptfs_scrypt(struct crypt_mnt_ftr* ftr, uint32_t ratelimit,
390 const uint8_t* object, const size_t object_size,
391 uint8_t** signature_buffer,
392 size_t* signature_buffer_size) {
393 if (!object || !signature_buffer || !signature_buffer_size) {
394 LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument";
395 return -1;
396 }
397
398 Keymaster dev;
399 if (!dev) {
400 LOG(ERROR) << "Failed to initiate keymaster session";
401 return -1;
402 }
403
404 km::AuthorizationSet outParams;
405 std::string key(reinterpret_cast<const char*>(ftr->keymaster_blob), ftr->keymaster_blob_size);
406 std::string input(reinterpret_cast<const char*>(object), object_size);
407 std::string output;
408 KeymasterOperation op;
409
410 auto paramBuilder = km::AuthorizationSetBuilder().NoDigestOrPadding().Authorization(
411 km::TAG_PURPOSE, km::KeyPurpose::SIGN);
412 while (true) {
413 op = dev.begin(key, paramBuilder, &outParams);
414 if (op.getErrorCode() == km::ErrorCode::KEY_RATE_LIMIT_EXCEEDED) {
415 sleep(ratelimit);
416 continue;
417 } else
418 break;
419 }
420
421 if (!op) {
422 LOG(ERROR) << "Error starting keymaster signature transaction: "
423 << int32_t(op.getErrorCode());
424 return -1;
425 }
426
427 if (op.getUpgradedBlob()) {
428 write_string_to_buf(*op.getUpgradedBlob(), ftr->keymaster_blob, KEYMASTER_BLOB_SIZE,
429 &ftr->keymaster_blob_size);
430
431 SLOGD("Upgrading key");
432 if (put_crypt_ftr_and_key(ftr) != 0) {
433 SLOGE("Failed to write upgraded key to disk");
434 return -1;
435 }
436 SLOGD("Key upgraded successfully");
437 }
438
439 if (!op.updateCompletely(input, &output)) {
440 LOG(ERROR) << "Error sending data to keymaster signature transaction: "
441 << int32_t(op.getErrorCode());
442 return -1;
443 }
444
445 if (!op.finish(&output)) {
446 LOG(ERROR) << "Error finalizing keymaster signature transaction: "
447 << int32_t(op.getErrorCode());
448 return -1;
449 }
450
451 *signature_buffer = reinterpret_cast<uint8_t*>(malloc(output.size()));
452 if (*signature_buffer == nullptr) {
453 LOG(ERROR) << "Error allocation buffer for keymaster signature";
454 return -1;
455 }
456 *signature_buffer_size = output.size();
457 std::copy(output.data(), output.data() + output.size(), *signature_buffer);
458
459 return 0;
460}
461
Shawn Willdene17a9c42014-09-08 13:04:08 -0600462/* This signs the given object using the keymaster key. */
Paul Crowley14c8c072018-09-18 13:30:21 -0700463static int keymaster_sign_object(struct crypt_mnt_ftr* ftr, const unsigned char* object,
464 const size_t object_size, unsigned char** signature,
465 size_t* signature_size) {
Shawn Willden47ba10d2014-09-03 17:07:06 -0600466 unsigned char to_sign[RSA_KEY_SIZE_BYTES];
Shawn Willdene17a9c42014-09-08 13:04:08 -0600467 size_t to_sign_size = sizeof(to_sign);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600468 memset(to_sign, 0, RSA_KEY_SIZE_BYTES);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600469
Shawn Willdene17a9c42014-09-08 13:04:08 -0600470 // To sign a message with RSA, the message must satisfy two
471 // constraints:
472 //
473 // 1. The message, when interpreted as a big-endian numeric value, must
474 // be strictly less than the public modulus of the RSA key. Note
475 // that because the most significant bit of the public modulus is
476 // guaranteed to be 1 (else it's an (n-1)-bit key, not an n-bit
477 // key), an n-bit message with most significant bit 0 always
478 // satisfies this requirement.
479 //
480 // 2. The message must have the same length in bits as the public
481 // modulus of the RSA key. This requirement isn't mathematically
482 // necessary, but is necessary to ensure consistency in
483 // implementations.
484 switch (ftr->kdf_type) {
Shawn Willdene17a9c42014-09-08 13:04:08 -0600485 case KDF_SCRYPT_KEYMASTER:
486 // This ensures the most significant byte of the signed message
487 // is zero. We could have zero-padded to the left instead, but
488 // this approach is slightly more robust against changes in
489 // object size. However, it's still broken (but not unusably
Shawn Willdenda6e8992015-06-03 09:40:45 -0600490 // so) because we really should be using a proper deterministic
491 // RSA padding function, such as PKCS1.
Wei Wang4375f1b2017-02-24 17:43:01 -0800492 memcpy(to_sign + 1, object, std::min((size_t)RSA_KEY_SIZE_BYTES - 1, object_size));
Shawn Willdene17a9c42014-09-08 13:04:08 -0600493 SLOGI("Signing safely-padded object");
494 break;
495 default:
496 SLOGE("Unknown KDF type %d", ftr->kdf_type);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000497 return -1;
Shawn Willdene17a9c42014-09-08 13:04:08 -0600498 }
Satya Tangiralae8de4ff2021-02-28 22:32:07 -0800499 return keymaster_sign_object_for_cryptfs_scrypt(ftr, KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign,
500 to_sign_size, signature, signature_size);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600501}
502
Paul Lawrence399317e2014-03-10 13:20:50 -0700503/* Store password when userdata is successfully decrypted and mounted.
504 * Cleared by cryptfs_clear_password
505 *
506 * To avoid a double prompt at boot, we need to store the CryptKeeper
507 * password and pass it to KeyGuard, which uses it to unlock KeyStore.
508 * Since the entire framework is torn down and rebuilt after encryption,
509 * we have to use a daemon or similar to store the password. Since vold
510 * is secured against IPC except from system processes, it seems a reasonable
511 * place to store this.
512 *
513 * password should be cleared once it has been used.
514 *
515 * password is aged out after password_max_age_seconds seconds.
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800516 */
Paul Lawrence399317e2014-03-10 13:20:50 -0700517static char* password = 0;
518static int password_expiry_time = 0;
519static const int password_max_age_seconds = 60;
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800520
Paul Crowley14c8c072018-09-18 13:30:21 -0700521enum class RebootType { reboot, recovery, shutdown };
522static void cryptfs_reboot(RebootType rt) {
523 switch (rt) {
524 case RebootType::reboot:
525 property_set(ANDROID_RB_PROPERTY, "reboot");
526 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800527
Paul Crowley14c8c072018-09-18 13:30:21 -0700528 case RebootType::recovery:
529 property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
530 break;
Paul Lawrence87999172014-02-20 12:21:31 -0800531
Paul Crowley14c8c072018-09-18 13:30:21 -0700532 case RebootType::shutdown:
533 property_set(ANDROID_RB_PROPERTY, "shutdown");
534 break;
Ken Sumralladfba362013-06-04 16:37:52 -0700535 }
Paul Lawrence87999172014-02-20 12:21:31 -0800536
Ken Sumralladfba362013-06-04 16:37:52 -0700537 sleep(20);
538
539 /* Shouldn't get here, reboot should happen before sleep times out */
540 return;
541}
542
Kenny Rootc4c70f12013-06-14 12:11:38 -0700543/**
544 * Gets the default device scrypt parameters for key derivation time tuning.
545 * The parameters should lead to about one second derivation time for the
546 * given device.
547 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700548static void get_device_scrypt_params(struct crypt_mnt_ftr* ftr) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700549 char paramstr[PROPERTY_VALUE_MAX];
Paul Crowley63c18d32016-02-10 14:02:47 +0000550 int Nf, rf, pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700551
Paul Crowley63c18d32016-02-10 14:02:47 +0000552 property_get(SCRYPT_PROP, paramstr, SCRYPT_DEFAULTS);
553 if (!parse_scrypt_parameters(paramstr, &Nf, &rf, &pf)) {
554 SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
555 parse_scrypt_parameters(SCRYPT_DEFAULTS, &Nf, &rf, &pf);
Kenny Rootc4c70f12013-06-14 12:11:38 -0700556 }
Paul Crowley63c18d32016-02-10 14:02:47 +0000557 ftr->N_factor = Nf;
558 ftr->r_factor = rf;
559 ftr->p_factor = pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700560}
561
Tom Cherry4c5bde22019-01-29 14:34:01 -0800562static uint64_t get_fs_size(const char* dev) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800563 int fd, block_size;
564 struct ext4_super_block sb;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200565 uint64_t len;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800566
Paul Crowley14c8c072018-09-18 13:30:21 -0700567 if ((fd = open(dev, O_RDONLY | O_CLOEXEC)) < 0) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800568 SLOGE("Cannot open device to get filesystem size ");
569 return 0;
570 }
571
572 if (lseek64(fd, 1024, SEEK_SET) < 0) {
573 SLOGE("Cannot seek to superblock");
574 return 0;
575 }
576
577 if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
578 SLOGE("Cannot read superblock");
579 return 0;
580 }
581
582 close(fd);
583
Daniel Rosenberge82df162014-08-15 22:19:23 +0000584 if (le32_to_cpu(sb.s_magic) != EXT4_SUPER_MAGIC) {
585 SLOGE("Not a valid ext4 superblock");
586 return 0;
587 }
Ken Sumrall3ed82362011-01-28 23:31:16 -0800588 block_size = 1024 << sb.s_log_block_size;
589 /* compute length in bytes */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200590 len = (((uint64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800591
592 /* return length in sectors */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200593 return len / 512;
Ken Sumrall3ed82362011-01-28 23:31:16 -0800594}
595
Tom Cherry4c5bde22019-01-29 14:34:01 -0800596static void get_crypt_info(std::string* key_loc, std::string* real_blk_device) {
597 for (const auto& entry : fstab_default) {
598 if (!entry.fs_mgr_flags.vold_managed &&
599 (entry.fs_mgr_flags.crypt || entry.fs_mgr_flags.force_crypt ||
600 entry.fs_mgr_flags.force_fde_or_fbe || entry.fs_mgr_flags.file_encryption)) {
601 if (key_loc != nullptr) {
602 *key_loc = entry.key_loc;
603 }
604 if (real_blk_device != nullptr) {
605 *real_blk_device = entry.blk_device;
606 }
607 return;
608 }
609 }
610}
611
Paul Crowley14c8c072018-09-18 13:30:21 -0700612static int get_crypt_ftr_info(char** metadata_fname, off64_t* off) {
613 static int cached_data = 0;
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200614 static uint64_t cached_off = 0;
Paul Crowley14c8c072018-09-18 13:30:21 -0700615 static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
Paul Crowley14c8c072018-09-18 13:30:21 -0700616 char key_loc[PROPERTY_VALUE_MAX];
617 char real_blkdev[PROPERTY_VALUE_MAX];
618 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700619
Paul Crowley14c8c072018-09-18 13:30:21 -0700620 if (!cached_data) {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800621 std::string key_loc;
622 std::string real_blkdev;
623 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700624
Tom Cherry4c5bde22019-01-29 14:34:01 -0800625 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200626 if (android::vold::GetBlockDevSize(real_blkdev, &cached_off) == android::OK) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700627 /* If it's an encrypted Android partition, the last 16 Kbytes contain the
628 * encryption info footer and key, and plenty of bytes to spare for future
629 * growth.
630 */
Tom Cherry4c5bde22019-01-29 14:34:01 -0800631 strlcpy(cached_metadata_fname, real_blkdev.c_str(), sizeof(cached_metadata_fname));
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +0200632 cached_off -= CRYPT_FOOTER_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -0700633 cached_data = 1;
634 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800635 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -0700636 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700637 } else {
Tom Cherry4c5bde22019-01-29 14:34:01 -0800638 strlcpy(cached_metadata_fname, key_loc.c_str(), sizeof(cached_metadata_fname));
Paul Crowley14c8c072018-09-18 13:30:21 -0700639 cached_off = 0;
640 cached_data = 1;
641 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700642 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700643
Paul Crowley14c8c072018-09-18 13:30:21 -0700644 if (cached_data) {
645 if (metadata_fname) {
646 *metadata_fname = cached_metadata_fname;
647 }
648 if (off) {
649 *off = cached_off;
650 }
651 rc = 0;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700652 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700653
Paul Crowley14c8c072018-09-18 13:30:21 -0700654 return rc;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700655}
656
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800657/* Set sha256 checksum in structure */
Paul Crowley14c8c072018-09-18 13:30:21 -0700658static void set_ftr_sha(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800659 SHA256_CTX c;
660 SHA256_Init(&c);
661 memset(crypt_ftr->sha256, 0, sizeof(crypt_ftr->sha256));
662 SHA256_Update(&c, crypt_ftr, sizeof(*crypt_ftr));
663 SHA256_Final(crypt_ftr->sha256, &c);
664}
665
Ken Sumralle8744072011-01-18 22:01:55 -0800666/* key or salt can be NULL, in which case just skip writing that value. Useful to
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800667 * update the failed mount count but not change the key.
668 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700669static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
670 int fd;
671 unsigned int cnt;
672 /* starting_off is set to the SEEK_SET offset
673 * where the crypto structure starts
674 */
675 off64_t starting_off;
676 int rc = -1;
677 char* fname = NULL;
678 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800679
Paul Crowley14c8c072018-09-18 13:30:21 -0700680 set_ftr_sha(crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800681
Paul Crowley14c8c072018-09-18 13:30:21 -0700682 if (get_crypt_ftr_info(&fname, &starting_off)) {
683 SLOGE("Unable to get crypt_ftr_info\n");
684 return -1;
Ken Sumralle8744072011-01-18 22:01:55 -0800685 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700686 if (fname[0] != '/') {
687 SLOGE("Unexpected value for crypto key location\n");
688 return -1;
689 }
690 if ((fd = open(fname, O_RDWR | O_CREAT | O_CLOEXEC, 0600)) < 0) {
691 SLOGE("Cannot open footer file %s for put\n", fname);
692 return -1;
693 }
Ken Sumralle8744072011-01-18 22:01:55 -0800694
Paul Crowley14c8c072018-09-18 13:30:21 -0700695 /* Seek to the start of the crypt footer */
696 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
697 SLOGE("Cannot seek to real block device footer\n");
698 goto errout;
699 }
700
701 if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
702 SLOGE("Cannot write real block device footer\n");
703 goto errout;
704 }
705
706 fstat(fd, &statbuf);
707 /* If the keys are kept on a raw block device, do not try to truncate it. */
708 if (S_ISREG(statbuf.st_mode)) {
709 if (ftruncate(fd, 0x4000)) {
710 SLOGE("Cannot set footer file size\n");
711 goto errout;
712 }
713 }
714
715 /* Success! */
716 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800717
718errout:
Paul Crowley14c8c072018-09-18 13:30:21 -0700719 close(fd);
720 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800721}
722
Paul Crowley14c8c072018-09-18 13:30:21 -0700723static bool check_ftr_sha(const struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800724 struct crypt_mnt_ftr copy;
725 memcpy(&copy, crypt_ftr, sizeof(copy));
726 set_ftr_sha(&copy);
727 return memcmp(copy.sha256, crypt_ftr->sha256, sizeof(copy.sha256)) == 0;
728}
729
Paul Crowley14c8c072018-09-18 13:30:21 -0700730static inline int unix_read(int fd, void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700731 return TEMP_FAILURE_RETRY(read(fd, buff, len));
732}
733
Paul Crowley14c8c072018-09-18 13:30:21 -0700734static inline int unix_write(int fd, const void* buff, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700735 return TEMP_FAILURE_RETRY(write(fd, buff, len));
736}
737
Paul Crowley14c8c072018-09-18 13:30:21 -0700738static void init_empty_persist_data(struct crypt_persist_data* pdata, int len) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700739 memset(pdata, 0, len);
740 pdata->persist_magic = PERSIST_DATA_MAGIC;
741 pdata->persist_valid_entries = 0;
742}
743
744/* A routine to update the passed in crypt_ftr to the lastest version.
745 * fd is open read/write on the device that holds the crypto footer and persistent
746 * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
747 * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
748 */
Paul Crowley14c8c072018-09-18 13:30:21 -0700749static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr* crypt_ftr, off64_t offset) {
Kenny Root7434b312013-06-14 11:29:53 -0700750 int orig_major = crypt_ftr->major_version;
751 int orig_minor = crypt_ftr->minor_version;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700752
Kenny Root7434b312013-06-14 11:29:53 -0700753 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -0700754 struct crypt_persist_data* pdata;
Kenny Root7434b312013-06-14 11:29:53 -0700755 off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700756
Kenny Rootc4c70f12013-06-14 12:11:38 -0700757 SLOGW("upgrading crypto footer to 1.1");
758
Paul Crowley14c8c072018-09-18 13:30:21 -0700759 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Kenny Root7434b312013-06-14 11:29:53 -0700760 if (pdata == NULL) {
761 SLOGE("Cannot allocate persisent data\n");
762 return;
763 }
764 memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
765
766 /* Need to initialize the persistent data area */
767 if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
768 SLOGE("Cannot seek to persisent data offset\n");
Henrik Baard91064632015-02-05 15:09:17 +0100769 free(pdata);
Kenny Root7434b312013-06-14 11:29:53 -0700770 return;
771 }
772 /* Write all zeros to the first copy, making it invalid */
773 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
774
775 /* Write a valid but empty structure to the second copy */
776 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
777 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
778
779 /* Update the footer */
780 crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
781 crypt_ftr->persist_data_offset[0] = pdata_offset;
782 crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
783 crypt_ftr->minor_version = 1;
Henrik Baard91064632015-02-05 15:09:17 +0100784 free(pdata);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700785 }
786
Paul Lawrencef4faa572014-01-29 13:31:03 -0800787 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 1)) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700788 SLOGW("upgrading crypto footer to 1.2");
JP Abgrall7bdfa522013-11-15 13:42:56 -0800789 /* But keep the old kdf_type.
790 * It will get updated later to KDF_SCRYPT after the password has been verified.
791 */
Kenny Rootc4c70f12013-06-14 12:11:38 -0700792 crypt_ftr->kdf_type = KDF_PBKDF2;
793 get_device_scrypt_params(crypt_ftr);
794 crypt_ftr->minor_version = 2;
795 }
796
Paul Lawrencef4faa572014-01-29 13:31:03 -0800797 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 2)) {
798 SLOGW("upgrading crypto footer to 1.3");
799 crypt_ftr->crypt_type = CRYPT_TYPE_PASSWORD;
800 crypt_ftr->minor_version = 3;
801 }
802
Kenny Root7434b312013-06-14 11:29:53 -0700803 if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
804 if (lseek64(fd, offset, SEEK_SET) == -1) {
805 SLOGE("Cannot seek to crypt footer\n");
806 return;
807 }
808 unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700809 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700810}
811
Paul Crowley14c8c072018-09-18 13:30:21 -0700812static int get_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr) {
813 int fd;
814 unsigned int cnt;
815 off64_t starting_off;
816 int rc = -1;
817 char* fname = NULL;
818 struct stat statbuf;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700819
Paul Crowley14c8c072018-09-18 13:30:21 -0700820 if (get_crypt_ftr_info(&fname, &starting_off)) {
821 SLOGE("Unable to get crypt_ftr_info\n");
822 return -1;
823 }
824 if (fname[0] != '/') {
825 SLOGE("Unexpected value for crypto key location\n");
826 return -1;
827 }
828 if ((fd = open(fname, O_RDWR | O_CLOEXEC)) < 0) {
829 SLOGE("Cannot open footer file %s for get\n", fname);
830 return -1;
831 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800832
Paul Crowley14c8c072018-09-18 13:30:21 -0700833 /* Make sure it's 16 Kbytes in length */
834 fstat(fd, &statbuf);
835 if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
836 SLOGE("footer file %s is not the expected size!\n", fname);
837 goto errout;
838 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700839
Paul Crowley14c8c072018-09-18 13:30:21 -0700840 /* Seek to the start of the crypt footer */
841 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
842 SLOGE("Cannot seek to real block device footer\n");
843 goto errout;
844 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700845
Paul Crowley14c8c072018-09-18 13:30:21 -0700846 if ((cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
847 SLOGE("Cannot read real block device footer\n");
848 goto errout;
849 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800850
Paul Crowley14c8c072018-09-18 13:30:21 -0700851 if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
852 SLOGE("Bad magic for real block device %s\n", fname);
853 goto errout;
854 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800855
Paul Crowley14c8c072018-09-18 13:30:21 -0700856 if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
857 SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
858 crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
859 goto errout;
860 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800861
Paul Crowley14c8c072018-09-18 13:30:21 -0700862 // We risk buffer overflows with oversized keys, so we just reject them.
863 // 0-sized keys are problematic (essentially by-passing encryption), and
864 // AES-CBC key wrapping only works for multiples of 16 bytes.
865 if ((crypt_ftr->keysize == 0) || ((crypt_ftr->keysize % 16) != 0) ||
866 (crypt_ftr->keysize > MAX_KEY_LEN)) {
867 SLOGE(
868 "Invalid keysize (%u) for block device %s; Must be non-zero, "
869 "divisible by 16, and <= %d\n",
870 crypt_ftr->keysize, fname, MAX_KEY_LEN);
871 goto errout;
872 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800873
Paul Crowley14c8c072018-09-18 13:30:21 -0700874 if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
875 SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
876 crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
877 }
Greg Kaiser59ad0182018-02-16 13:01:36 -0800878
Paul Crowley14c8c072018-09-18 13:30:21 -0700879 /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
880 * copy on disk before returning.
881 */
882 if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
883 upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
884 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800885
Paul Crowley14c8c072018-09-18 13:30:21 -0700886 /* Success! */
887 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800888
889errout:
Paul Crowley14c8c072018-09-18 13:30:21 -0700890 close(fd);
891 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800892}
893
Paul Crowley14c8c072018-09-18 13:30:21 -0700894static int validate_persistent_data_storage(struct crypt_mnt_ftr* crypt_ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700895 if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
896 crypt_ftr->persist_data_offset[1]) {
897 SLOGE("Crypt_ftr persist data regions overlap");
898 return -1;
899 }
900
901 if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
902 SLOGE("Crypt_ftr persist data region 0 starts after region 1");
903 return -1;
904 }
905
906 if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
Paul Crowley14c8c072018-09-18 13:30:21 -0700907 (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
Ken Sumrall160b4d62013-04-22 12:15:39 -0700908 CRYPT_FOOTER_OFFSET) {
909 SLOGE("Persistent data extends past crypto footer");
910 return -1;
911 }
912
913 return 0;
914}
915
Paul Crowley14c8c072018-09-18 13:30:21 -0700916static int load_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700917 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -0700918 struct crypt_persist_data* pdata = NULL;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700919 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -0700920 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700921 int found = 0;
922 int fd;
923 int ret;
924 int i;
925
926 if (persist_data) {
927 /* Nothing to do, we've already loaded or initialized it */
928 return 0;
929 }
930
Ken Sumrall160b4d62013-04-22 12:15:39 -0700931 /* If not encrypted, just allocate an empty table and initialize it */
932 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -0700933 if (strcmp(encrypted_state, "encrypted")) {
Wei Wang4375f1b2017-02-24 17:43:01 -0800934 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700935 if (pdata) {
936 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
937 persist_data = pdata;
938 return 0;
939 }
940 return -1;
941 }
942
Paul Crowley14c8c072018-09-18 13:30:21 -0700943 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700944 return -1;
945 }
946
Paul Crowley14c8c072018-09-18 13:30:21 -0700947 if ((crypt_ftr.major_version < 1) ||
948 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700949 SLOGE("Crypt_ftr version doesn't support persistent data");
950 return -1;
951 }
952
953 if (get_crypt_ftr_info(&fname, NULL)) {
954 return -1;
955 }
956
957 ret = validate_persistent_data_storage(&crypt_ftr);
958 if (ret) {
959 return -1;
960 }
961
Paul Crowley14c8c072018-09-18 13:30:21 -0700962 fd = open(fname, O_RDONLY | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700963 if (fd < 0) {
964 SLOGE("Cannot open %s metadata file", fname);
965 return -1;
966 }
967
Wei Wang4375f1b2017-02-24 17:43:01 -0800968 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Paul Lawrence300dae72016-03-11 11:02:52 -0800969 if (pdata == NULL) {
970 SLOGE("Cannot allocate memory for persistent data");
971 goto err;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700972 }
973
974 for (i = 0; i < 2; i++) {
975 if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
976 SLOGE("Cannot seek to read persistent data on %s", fname);
977 goto err2;
978 }
Paul Crowley14c8c072018-09-18 13:30:21 -0700979 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700980 SLOGE("Error reading persistent data on iteration %d", i);
981 goto err2;
982 }
983 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
984 found = 1;
985 break;
986 }
987 }
988
989 if (!found) {
990 SLOGI("Could not find valid persistent data, creating");
991 init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
992 }
993
994 /* Success */
995 persist_data = pdata;
996 close(fd);
997 return 0;
998
999err2:
1000 free(pdata);
1001
1002err:
1003 close(fd);
1004 return -1;
1005}
1006
Paul Crowley14c8c072018-09-18 13:30:21 -07001007static int save_persistent_data(void) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001008 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07001009 struct crypt_persist_data* pdata;
1010 char* fname;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001011 off64_t write_offset;
1012 off64_t erase_offset;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001013 int fd;
1014 int ret;
1015
1016 if (persist_data == NULL) {
1017 SLOGE("No persistent data to save");
1018 return -1;
1019 }
1020
Paul Crowley14c8c072018-09-18 13:30:21 -07001021 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001022 return -1;
1023 }
1024
Paul Crowley14c8c072018-09-18 13:30:21 -07001025 if ((crypt_ftr.major_version < 1) ||
1026 (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001027 SLOGE("Crypt_ftr version doesn't support persistent data");
1028 return -1;
1029 }
1030
1031 ret = validate_persistent_data_storage(&crypt_ftr);
1032 if (ret) {
1033 return -1;
1034 }
1035
1036 if (get_crypt_ftr_info(&fname, NULL)) {
1037 return -1;
1038 }
1039
Paul Crowley14c8c072018-09-18 13:30:21 -07001040 fd = open(fname, O_RDWR | O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001041 if (fd < 0) {
1042 SLOGE("Cannot open %s metadata file", fname);
1043 return -1;
1044 }
1045
Wei Wang4375f1b2017-02-24 17:43:01 -08001046 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001047 if (pdata == NULL) {
1048 SLOGE("Cannot allocate persistant data");
1049 goto err;
1050 }
1051
1052 if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
1053 SLOGE("Cannot seek to read persistent data on %s", fname);
1054 goto err2;
1055 }
1056
1057 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001058 SLOGE("Error reading persistent data before save");
1059 goto err2;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001060 }
1061
1062 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
1063 /* The first copy is the curent valid copy, so write to
1064 * the second copy and erase this one */
Paul Crowley14c8c072018-09-18 13:30:21 -07001065 write_offset = crypt_ftr.persist_data_offset[1];
1066 erase_offset = crypt_ftr.persist_data_offset[0];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001067 } else {
1068 /* The second copy must be the valid copy, so write to
1069 * the first copy, and erase the second */
Paul Crowley14c8c072018-09-18 13:30:21 -07001070 write_offset = crypt_ftr.persist_data_offset[0];
1071 erase_offset = crypt_ftr.persist_data_offset[1];
Ken Sumrall160b4d62013-04-22 12:15:39 -07001072 }
1073
1074 /* Write the new copy first, if successful, then erase the old copy */
Björn Landström96dbee72015-01-20 12:43:56 +01001075 if (lseek64(fd, write_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001076 SLOGE("Cannot seek to write persistent data");
1077 goto err2;
1078 }
1079 if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
Paul Crowley14c8c072018-09-18 13:30:21 -07001080 (int)crypt_ftr.persist_data_size) {
Björn Landström96dbee72015-01-20 12:43:56 +01001081 if (lseek64(fd, erase_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001082 SLOGE("Cannot seek to erase previous persistent data");
1083 goto err2;
1084 }
1085 fsync(fd);
1086 memset(pdata, 0, crypt_ftr.persist_data_size);
Paul Crowley14c8c072018-09-18 13:30:21 -07001087 if (unix_write(fd, pdata, crypt_ftr.persist_data_size) != (int)crypt_ftr.persist_data_size) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001088 SLOGE("Cannot write to erase previous persistent data");
1089 goto err2;
1090 }
1091 fsync(fd);
1092 } else {
1093 SLOGE("Cannot write to save persistent data");
1094 goto err2;
1095 }
1096
1097 /* Success */
1098 free(pdata);
1099 close(fd);
1100 return 0;
1101
1102err2:
1103 free(pdata);
1104err:
1105 close(fd);
1106 return -1;
1107}
1108
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001109/* Convert a binary key of specified length into an ascii hex string equivalent,
1110 * without the leading 0x and with null termination
1111 */
Paul Crowley14c8c072018-09-18 13:30:21 -07001112static void convert_key_to_hex_ascii(const unsigned char* master_key, unsigned int keysize,
1113 char* master_key_ascii) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001114 unsigned int i, a;
1115 unsigned char nibble;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001116
Paul Crowley14c8c072018-09-18 13:30:21 -07001117 for (i = 0, a = 0; i < keysize; i++, a += 2) {
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001118 /* For each byte, write out two ascii hex digits */
1119 nibble = (master_key[i] >> 4) & 0xf;
1120 master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001121
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001122 nibble = master_key[i] & 0xf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001123 master_key_ascii[a + 1] = nibble + (nibble > 9 ? 0x37 : 0x30);
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001124 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001125
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001126 /* Add the null termination */
1127 master_key_ascii[a] = '\0';
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001128}
1129
Eric Biggersed45ec32019-01-25 10:47:55 -08001130/*
1131 * If the ro.crypto.fde_sector_size system property is set, append the
1132 * parameters to make dm-crypt use the specified crypto sector size and round
1133 * the crypto device size down to a crypto sector boundary.
1134 */
David Andersonb9224732019-05-13 13:02:54 -07001135static int add_sector_size_param(DmTargetCrypt* target, struct crypt_mnt_ftr* ftr) {
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001136 constexpr char DM_CRYPT_SECTOR_SIZE[] = "ro.crypto.fde_sector_size";
Eric Biggersed45ec32019-01-25 10:47:55 -08001137 char value[PROPERTY_VALUE_MAX];
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001138
Eric Biggersed45ec32019-01-25 10:47:55 -08001139 if (property_get(DM_CRYPT_SECTOR_SIZE, value, "") > 0) {
1140 unsigned int sector_size;
1141
1142 if (!ParseUint(value, &sector_size) || sector_size < 512 || sector_size > 4096 ||
1143 (sector_size & (sector_size - 1)) != 0) {
1144 SLOGE("Invalid value for %s: %s. Must be >= 512, <= 4096, and a power of 2\n",
1145 DM_CRYPT_SECTOR_SIZE, value);
1146 return -1;
1147 }
1148
David Andersonb9224732019-05-13 13:02:54 -07001149 target->SetSectorSize(sector_size);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001150
1151 // With this option, IVs will match the sector numbering, instead
1152 // of being hard-coded to being based on 512-byte sectors.
David Andersonb9224732019-05-13 13:02:54 -07001153 target->SetIvLargeSectors();
Eric Biggersed45ec32019-01-25 10:47:55 -08001154
1155 // Round the crypto device size down to a crypto sector boundary.
1156 ftr->fs_size &= ~((sector_size / 512) - 1);
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001157 }
Eric Biggersed45ec32019-01-25 10:47:55 -08001158 return 0;
Greg Kaiserab1e84a2018-12-11 12:40:51 -08001159}
1160
Paul Crowley5afbc622017-11-27 09:42:17 -08001161static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key,
Paul Crowley81796e92020-02-07 11:27:49 -08001162 const char* real_blk_name, std::string* crypto_blk_name,
1163 const char* name, uint32_t flags) {
David Andersonb9224732019-05-13 13:02:54 -07001164 auto& dm = DeviceMapper::Instance();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001165
David Andersonb9224732019-05-13 13:02:54 -07001166 // We need two ASCII characters to represent each byte, and need space for
1167 // the '\0' terminator.
1168 char master_key_ascii[MAX_KEY_LEN * 2 + 1];
1169 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001170
David Andersonb9224732019-05-13 13:02:54 -07001171 auto target = std::make_unique<DmTargetCrypt>(0, crypt_ftr->fs_size,
1172 (const char*)crypt_ftr->crypto_type_name,
1173 master_key_ascii, 0, real_blk_name, 0);
1174 target->AllowDiscards();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001175
Paul Crowley5afbc622017-11-27 09:42:17 -08001176 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE) {
David Andersonb9224732019-05-13 13:02:54 -07001177 target->AllowEncryptOverride();
Paul Crowley5afbc622017-11-27 09:42:17 -08001178 }
David Andersonb9224732019-05-13 13:02:54 -07001179 if (add_sector_size_param(target.get(), crypt_ftr)) {
Eric Biggersed45ec32019-01-25 10:47:55 -08001180 SLOGE("Error processing dm-crypt sector size param\n");
David Andersonb9224732019-05-13 13:02:54 -07001181 return -1;
Eric Biggersed45ec32019-01-25 10:47:55 -08001182 }
David Andersonb9224732019-05-13 13:02:54 -07001183
1184 DmTable table;
1185 table.AddTarget(std::move(target));
1186
1187 int load_count = 1;
1188 while (load_count < TABLE_LOAD_RETRIES) {
1189 if (dm.CreateDevice(name, table)) {
1190 break;
1191 }
1192 load_count++;
1193 }
1194
1195 if (load_count >= TABLE_LOAD_RETRIES) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001196 SLOGE("Cannot load dm-crypt mapping table.\n");
David Andersonb9224732019-05-13 13:02:54 -07001197 return -1;
1198 }
1199 if (load_count > 1) {
Paul Crowley5afbc622017-11-27 09:42:17 -08001200 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
1201 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001202
Paul Crowley81796e92020-02-07 11:27:49 -08001203 if (!dm.GetDmDevicePathByName(name, crypto_blk_name)) {
David Andersonb9224732019-05-13 13:02:54 -07001204 SLOGE("Cannot determine dm-crypt path for %s.\n", name);
1205 return -1;
Paul Crowley5afbc622017-11-27 09:42:17 -08001206 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001207
Paul Crowleycfe39722018-10-30 15:59:24 -07001208 /* Ensure the dm device has been created before returning. */
Paul Crowley81796e92020-02-07 11:27:49 -08001209 if (android::vold::WaitForFile(crypto_blk_name->c_str(), 1s) < 0) {
Paul Crowleycfe39722018-10-30 15:59:24 -07001210 // WaitForFile generates a suitable log message
David Andersonb9224732019-05-13 13:02:54 -07001211 return -1;
Paul Crowleycfe39722018-10-30 15:59:24 -07001212 }
David Andersonb9224732019-05-13 13:02:54 -07001213 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001214}
1215
David Andersonb9224732019-05-13 13:02:54 -07001216static int delete_crypto_blk_dev(const std::string& name) {
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001217 bool ret;
David Andersonb9224732019-05-13 13:02:54 -07001218 auto& dm = DeviceMapper::Instance();
Martijn Coenen26ad7b32020-02-13 16:20:52 +01001219 // TODO(b/149396179) there appears to be a race somewhere in the system where trying
1220 // to delete the device fails with EBUSY; for now, work around this by retrying.
1221 int tries = 5;
1222 while (tries-- > 0) {
1223 ret = dm.DeleteDevice(name);
1224 if (ret || errno != EBUSY) {
1225 break;
1226 }
1227 SLOGW("DM_DEV Cannot remove dm-crypt device %s: %s, retrying...\n", name.c_str(),
1228 strerror(errno));
1229 std::this_thread::sleep_for(std::chrono::milliseconds(100));
1230 }
1231 if (!ret) {
1232 SLOGE("DM_DEV Cannot remove dm-crypt device %s: %s\n", name.c_str(), strerror(errno));
David Andersonb9224732019-05-13 13:02:54 -07001233 return -1;
Paul Crowley14c8c072018-09-18 13:30:21 -07001234 }
David Andersonb9224732019-05-13 13:02:54 -07001235 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001236}
1237
Paul Crowley14c8c072018-09-18 13:30:21 -07001238static int pbkdf2(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1239 void* params UNUSED) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001240 SLOGI("Using pbkdf2 for cryptfs KDF");
1241
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001242 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001243 return PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN, HASH_COUNT,
1244 INTERMEDIATE_BUF_SIZE, ikey) != 1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001245}
1246
Paul Crowley14c8c072018-09-18 13:30:21 -07001247static int scrypt(const char* passwd, const unsigned char* salt, unsigned char* ikey, void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001248 SLOGI("Using scrypt for cryptfs KDF");
1249
Paul Crowley14c8c072018-09-18 13:30:21 -07001250 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001251
1252 int N = 1 << ftr->N_factor;
1253 int r = 1 << ftr->r_factor;
1254 int p = 1 << ftr->p_factor;
1255
1256 /* Turn the password into a key and IV that can decrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001257 crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001258 INTERMEDIATE_BUF_SIZE);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001259
Paul Crowley14c8c072018-09-18 13:30:21 -07001260 return 0;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001261}
1262
Paul Crowley14c8c072018-09-18 13:30:21 -07001263static int scrypt_keymaster(const char* passwd, const unsigned char* salt, unsigned char* ikey,
1264 void* params) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001265 SLOGI("Using scrypt with keymaster for cryptfs KDF");
1266
1267 int rc;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001268 size_t signature_size;
1269 unsigned char* signature;
Paul Crowley14c8c072018-09-18 13:30:21 -07001270 struct crypt_mnt_ftr* ftr = (struct crypt_mnt_ftr*)params;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001271
1272 int N = 1 << ftr->N_factor;
1273 int r = 1 << ftr->r_factor;
1274 int p = 1 << ftr->p_factor;
1275
Paul Crowley14c8c072018-09-18 13:30:21 -07001276 rc = crypto_scrypt((const uint8_t*)passwd, strlen(passwd), salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001277 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001278
1279 if (rc) {
1280 SLOGE("scrypt failed");
1281 return -1;
1282 }
1283
Paul Crowley14c8c072018-09-18 13:30:21 -07001284 if (keymaster_sign_object(ftr, ikey, INTERMEDIATE_BUF_SIZE, &signature, &signature_size)) {
Shawn Willdene17a9c42014-09-08 13:04:08 -06001285 SLOGE("Signing failed");
1286 return -1;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001287 }
1288
Paul Crowley14c8c072018-09-18 13:30:21 -07001289 rc = crypto_scrypt(signature, signature_size, salt, SALT_LEN, N, r, p, ikey,
1290 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001291 free(signature);
1292
1293 if (rc) {
1294 SLOGE("scrypt failed");
1295 return -1;
1296 }
1297
1298 return 0;
1299}
1300
Paul Crowley14c8c072018-09-18 13:30:21 -07001301static int encrypt_master_key(const char* passwd, const unsigned char* salt,
1302 const unsigned char* decrypted_master_key,
1303 unsigned char* encrypted_master_key, struct crypt_mnt_ftr* crypt_ftr) {
1304 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001305 EVP_CIPHER_CTX e_ctx;
1306 int encrypted_len, final_len;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001307 int rc = 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001308
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001309 /* Turn the password into an intermediate key and IV that can decrypt the master key */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001310 get_device_scrypt_params(crypt_ftr);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001311
1312 switch (crypt_ftr->kdf_type) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001313 case KDF_SCRYPT_KEYMASTER:
1314 if (keymaster_create_key(crypt_ftr)) {
1315 SLOGE("keymaster_create_key failed");
1316 return -1;
1317 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001318
Paul Crowley14c8c072018-09-18 13:30:21 -07001319 if (scrypt_keymaster(passwd, salt, ikey, crypt_ftr)) {
1320 SLOGE("scrypt failed");
1321 return -1;
1322 }
1323 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001324
Paul Crowley14c8c072018-09-18 13:30:21 -07001325 case KDF_SCRYPT:
1326 if (scrypt(passwd, salt, ikey, crypt_ftr)) {
1327 SLOGE("scrypt failed");
1328 return -1;
1329 }
1330 break;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001331
Paul Crowley14c8c072018-09-18 13:30:21 -07001332 default:
1333 SLOGE("Invalid kdf_type");
1334 return -1;
Paul Lawrencef4faa572014-01-29 13:31:03 -08001335 }
Kenny Rootc4c70f12013-06-14 12:11:38 -07001336
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001337 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001338 EVP_CIPHER_CTX_init(&e_ctx);
Paul Crowley14c8c072018-09-18 13:30:21 -07001339 if (!EVP_EncryptInit_ex(&e_ctx, EVP_aes_128_cbc(), NULL, ikey,
1340 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001341 SLOGE("EVP_EncryptInit failed\n");
1342 return -1;
1343 }
1344 EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001345
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001346 /* Encrypt the master key */
Paul Crowley14c8c072018-09-18 13:30:21 -07001347 if (!EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len, decrypted_master_key,
1348 crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001349 SLOGE("EVP_EncryptUpdate failed\n");
1350 return -1;
1351 }
Paul Crowley14c8c072018-09-18 13:30:21 -07001352 if (!EVP_EncryptFinal_ex(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001353 SLOGE("EVP_EncryptFinal failed\n");
1354 return -1;
1355 }
1356
Greg Kaiser59ad0182018-02-16 13:01:36 -08001357 if (encrypted_len + final_len != static_cast<int>(crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001358 SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
1359 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001360 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001361
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001362 /* Store the scrypt of the intermediate key, so we can validate if it's a
1363 password error or mount error when things go wrong.
1364 Note there's no need to check for errors, since if this is incorrect, we
1365 simply won't wipe userdata, which is the correct default behavior
1366 */
1367 int N = 1 << crypt_ftr->N_factor;
1368 int r = 1 << crypt_ftr->r_factor;
1369 int p = 1 << crypt_ftr->p_factor;
1370
Paul Crowley14c8c072018-09-18 13:30:21 -07001371 rc = crypto_scrypt(ikey, INTERMEDIATE_KEY_LEN_BYTES, crypt_ftr->salt, sizeof(crypt_ftr->salt),
1372 N, r, p, crypt_ftr->scrypted_intermediate_key,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001373 sizeof(crypt_ftr->scrypted_intermediate_key));
1374
1375 if (rc) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001376 SLOGE("encrypt_master_key: crypto_scrypt failed");
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001377 }
1378
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001379 EVP_CIPHER_CTX_cleanup(&e_ctx);
1380
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001381 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001382}
1383
Paul Crowley14c8c072018-09-18 13:30:21 -07001384static int decrypt_master_key_aux(const char* passwd, unsigned char* salt,
1385 const unsigned char* encrypted_master_key, size_t keysize,
1386 unsigned char* decrypted_master_key, kdf_func kdf,
1387 void* kdf_params, unsigned char** intermediate_key,
1388 size_t* intermediate_key_size) {
1389 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = {0};
1390 EVP_CIPHER_CTX d_ctx;
1391 int decrypted_len, final_len;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001392
Paul Crowley14c8c072018-09-18 13:30:21 -07001393 /* Turn the password into an intermediate key and IV that can decrypt the
1394 master key */
1395 if (kdf(passwd, salt, ikey, kdf_params)) {
1396 SLOGE("kdf failed");
1397 return -1;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001398 }
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001399
Paul Crowley14c8c072018-09-18 13:30:21 -07001400 /* Initialize the decryption engine */
1401 EVP_CIPHER_CTX_init(&d_ctx);
1402 if (!EVP_DecryptInit_ex(&d_ctx, EVP_aes_128_cbc(), NULL, ikey,
1403 ikey + INTERMEDIATE_KEY_LEN_BYTES)) {
1404 return -1;
1405 }
1406 EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
1407 /* Decrypt the master key */
1408 if (!EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len, encrypted_master_key,
1409 keysize)) {
1410 return -1;
1411 }
1412 if (!EVP_DecryptFinal_ex(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
1413 return -1;
1414 }
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001415
Paul Crowley14c8c072018-09-18 13:30:21 -07001416 if (decrypted_len + final_len != static_cast<int>(keysize)) {
1417 return -1;
1418 }
1419
1420 /* Copy intermediate key if needed by params */
1421 if (intermediate_key && intermediate_key_size) {
1422 *intermediate_key = (unsigned char*)malloc(INTERMEDIATE_KEY_LEN_BYTES);
1423 if (*intermediate_key) {
1424 memcpy(*intermediate_key, ikey, INTERMEDIATE_KEY_LEN_BYTES);
1425 *intermediate_key_size = INTERMEDIATE_KEY_LEN_BYTES;
1426 }
1427 }
1428
1429 EVP_CIPHER_CTX_cleanup(&d_ctx);
1430
1431 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001432}
1433
Paul Crowley14c8c072018-09-18 13:30:21 -07001434static void get_kdf_func(struct crypt_mnt_ftr* ftr, kdf_func* kdf, void** kdf_params) {
Paul Lawrencedb3730c2015-02-03 13:08:10 -08001435 if (ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001436 *kdf = scrypt_keymaster;
1437 *kdf_params = ftr;
1438 } else if (ftr->kdf_type == KDF_SCRYPT) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001439 *kdf = scrypt;
1440 *kdf_params = ftr;
1441 } else {
1442 *kdf = pbkdf2;
1443 *kdf_params = NULL;
1444 }
1445}
1446
Paul Crowley14c8c072018-09-18 13:30:21 -07001447static int decrypt_master_key(const char* passwd, unsigned char* decrypted_master_key,
1448 struct crypt_mnt_ftr* crypt_ftr, unsigned char** intermediate_key,
1449 size_t* intermediate_key_size) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001450 kdf_func kdf;
Paul Crowley14c8c072018-09-18 13:30:21 -07001451 void* kdf_params;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001452 int ret;
1453
1454 get_kdf_func(crypt_ftr, &kdf, &kdf_params);
Paul Crowley14c8c072018-09-18 13:30:21 -07001455 ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key, crypt_ftr->keysize,
1456 decrypted_master_key, kdf, kdf_params, intermediate_key,
1457 intermediate_key_size);
Kenny Rootc4c70f12013-06-14 12:11:38 -07001458 if (ret != 0) {
1459 SLOGW("failure decrypting master key");
Kenny Rootc4c70f12013-06-14 12:11:38 -07001460 }
1461
1462 return ret;
1463}
1464
Paul Crowley14c8c072018-09-18 13:30:21 -07001465static int create_encrypted_random_key(const char* passwd, unsigned char* master_key,
1466 unsigned char* salt, struct crypt_mnt_ftr* crypt_ftr) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08001467 unsigned char key_buf[MAX_KEY_LEN];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001468
Eric Biggers3a2f7db2019-01-16 13:05:34 -08001469 /* Get some random bits for a key and salt */
1470 if (android::vold::ReadRandomBytes(sizeof(key_buf), reinterpret_cast<char*>(key_buf)) != 0) {
1471 return -1;
1472 }
1473 if (android::vold::ReadRandomBytes(SALT_LEN, reinterpret_cast<char*>(salt)) != 0) {
1474 return -1;
1475 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001476
1477 /* Now encrypt it with the password */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001478 return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001479}
1480
Hyangseok Chae3cf32332020-02-27 18:21:50 +09001481static void ensure_subdirectory_unmounted(const char *prefix) {
1482 std::vector<std::string> umount_points;
1483 std::unique_ptr<FILE, int (*)(FILE*)> mnts(setmntent("/proc/mounts", "r"), endmntent);
1484 if (!mnts) {
1485 SLOGW("could not read mount files");
1486 return;
1487 }
1488
1489 //Find sudirectory mount point
1490 mntent* mentry;
1491 std::string top_directory(prefix);
1492 if (!android::base::EndsWith(prefix, "/")) {
1493 top_directory = top_directory + "/";
1494 }
1495 while ((mentry = getmntent(mnts.get())) != nullptr) {
1496 if (strcmp(mentry->mnt_dir, top_directory.c_str()) == 0) {
1497 continue;
1498 }
1499
1500 if (android::base::StartsWith(mentry->mnt_dir, top_directory)) {
1501 SLOGW("found sub-directory mount %s - %s\n", prefix, mentry->mnt_dir);
1502 umount_points.push_back(mentry->mnt_dir);
1503 }
1504 }
1505
1506 //Sort by path length to umount longest path first
1507 std::sort(std::begin(umount_points), std::end(umount_points),
1508 [](const std::string& s1, const std::string& s2) {return s1.length() > s2.length(); });
1509
1510 for (std::string& mount_point : umount_points) {
1511 umount(mount_point.c_str());
1512 SLOGW("umount sub-directory mount %s\n", mount_point.c_str());
1513 }
1514}
1515
Eric Biggersb4faeb82021-05-10 17:44:34 -07001516static int wait_and_unmount(const char* mountpoint) {
Greg Hackmann955653e2014-09-24 14:55:20 -07001517 int i, err, rc;
Hyangseok Chae3cf32332020-02-27 18:21:50 +09001518
1519 // Subdirectory mount will cause a failure of umount.
1520 ensure_subdirectory_unmounted(mountpoint);
Ken Sumrall2eaf7132011-01-14 12:45:48 -08001521#define WAIT_UNMOUNT_COUNT 20
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001522
1523 /* Now umount the tmpfs filesystem */
Paul Crowley14c8c072018-09-18 13:30:21 -07001524 for (i = 0; i < WAIT_UNMOUNT_COUNT; i++) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001525 if (umount(mountpoint) == 0) {
1526 break;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001527 }
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001528
1529 if (errno == EINVAL) {
1530 /* EINVAL is returned if the directory is not a mountpoint,
1531 * i.e. there is no filesystem mounted there. So just get out.
1532 */
1533 break;
1534 }
1535
1536 err = errno;
1537
Eric Biggersb4faeb82021-05-10 17:44:34 -07001538 // If it's taking too long, kill the processes with open files.
1539 //
1540 // Originally this logic was only a fail-safe, but now it's relied on to
1541 // kill certain processes that aren't stopped by init because they
1542 // aren't in the main or late_start classes. So to avoid waiting for
1543 // too long, we now are fairly aggressive in starting to kill processes.
1544 static_assert(WAIT_UNMOUNT_COUNT >= 4);
1545 if (i == 2) {
1546 SLOGW("sending SIGTERM to processes with open files\n");
1547 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGTERM);
1548 } else if (i >= 3) {
1549 SLOGW("sending SIGKILL to processes with open files\n");
1550 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGKILL);
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001551 }
1552
1553 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001554 }
1555
1556 if (i < WAIT_UNMOUNT_COUNT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001557 SLOGD("unmounting %s succeeded\n", mountpoint);
1558 rc = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001559 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07001560 android::vold::KillProcessesWithOpenFiles(mountpoint, 0);
1561 SLOGE("unmounting %s failed: %s\n", mountpoint, strerror(err));
1562 rc = -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001563 }
1564
1565 return rc;
1566}
1567
Paul Crowley14c8c072018-09-18 13:30:21 -07001568static void prep_data_fs(void) {
Jeff Sharkey47695b22016-02-01 17:02:29 -07001569 // NOTE: post_fs_data results in init calling back around to vold, so all
1570 // callers to this method must be async
1571
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001572 /* Do the prep of the /data filesystem */
1573 property_set("vold.post_fs_data_done", "0");
1574 property_set("vold.decrypt", "trigger_post_fs_data");
Wei Wang42e38102017-06-07 10:46:12 -07001575 SLOGD("Just triggered post_fs_data");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001576
Ken Sumrallc5872692013-05-14 15:26:31 -07001577 /* Wait a max of 50 seconds, hopefully it takes much less */
Paul Crowley14c8c072018-09-18 13:30:21 -07001578 while (!android::base::WaitForProperty("vold.post_fs_data_done", "1", std::chrono::seconds(15))) {
Wei Wang42e38102017-06-07 10:46:12 -07001579 /* We timed out to prep /data in time. Continue wait. */
1580 SLOGE("waited 15s for vold.post_fs_data_done, still waiting...");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001581 }
Wei Wang42e38102017-06-07 10:46:12 -07001582 SLOGD("post_fs_data done");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001583}
1584
Paul Crowley14c8c072018-09-18 13:30:21 -07001585static void cryptfs_set_corrupt() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001586 // Mark the footer as bad
1587 struct crypt_mnt_ftr crypt_ftr;
1588 if (get_crypt_ftr_and_key(&crypt_ftr)) {
1589 SLOGE("Failed to get crypto footer - panic");
1590 return;
1591 }
1592
1593 crypt_ftr.flags |= CRYPT_DATA_CORRUPT;
1594 if (put_crypt_ftr_and_key(&crypt_ftr)) {
1595 SLOGE("Failed to set crypto footer - panic");
1596 return;
1597 }
1598}
1599
Paul Crowley14c8c072018-09-18 13:30:21 -07001600static void cryptfs_trigger_restart_min_framework() {
Paul Lawrence74f29f12014-08-28 15:54:10 -07001601 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001602 SLOGE("Failed to mount tmpfs on data - panic");
1603 return;
Paul Lawrence74f29f12014-08-28 15:54:10 -07001604 }
1605
1606 if (property_set("vold.decrypt", "trigger_post_fs_data")) {
1607 SLOGE("Failed to trigger post fs data - panic");
1608 return;
1609 }
1610
1611 if (property_set("vold.decrypt", "trigger_restart_min_framework")) {
1612 SLOGE("Failed to trigger restart min framework - panic");
1613 return;
1614 }
1615}
1616
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001617/* returns < 0 on failure */
Paul Crowley14c8c072018-09-18 13:30:21 -07001618static int cryptfs_restart_internal(int restart_main) {
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001619 char crypto_blkdev[MAXPATHLEN];
Tim Murray8439dc92014-12-15 11:56:11 -08001620 int rc = -1;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001621 static int restart_successful = 0;
1622
1623 /* Validate that it's OK to call this routine */
Paul Crowley14c8c072018-09-18 13:30:21 -07001624 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08001625 SLOGE("Encrypted filesystem not validated, aborting");
1626 return -1;
1627 }
1628
1629 if (restart_successful) {
1630 SLOGE("System already restarted with encrypted disk, aborting");
1631 return -1;
1632 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001633
Paul Lawrencef4faa572014-01-29 13:31:03 -08001634 if (restart_main) {
1635 /* Here is where we shut down the framework. The init scripts
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001636 * start all services in one of these classes: core, early_hal, hal,
1637 * main and late_start. To get to the minimal UI for PIN entry, we
1638 * need to start core, early_hal, hal and main. When we want to
1639 * shutdown the framework again, we need to stop most of the services in
1640 * these classes, but only those services that were started after
1641 * /data was mounted. This excludes critical services like vold and
1642 * ueventd, which need to keep running. We could possible stop
1643 * even fewer services, but because we want services to pick up APEX
1644 * libraries from the real /data, restarting is better, as it makes
1645 * these devices consistent with FBE devices and lets them use the
1646 * most recent code.
1647 *
1648 * Once these services have stopped, we should be able
Paul Lawrencef4faa572014-01-29 13:31:03 -08001649 * to umount the tmpfs /data, then mount the encrypted /data.
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001650 * We then restart the class core, hal, main, and also the class
1651 * late_start.
1652 *
Paul Lawrencef4faa572014-01-29 13:31:03 -08001653 * At the moment, I've only put a few things in late_start that I know
1654 * are not needed to bring up the framework, and that also cause problems
1655 * with unmounting the tmpfs /data, but I hope to add add more services
1656 * to the late_start class as we optimize this to decrease the delay
1657 * till the user is asked for the password to the filesystem.
1658 */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001659
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001660 /* The init files are setup to stop the right set of services when
1661 * vold.decrypt is set to trigger_shutdown_framework.
Paul Lawrencef4faa572014-01-29 13:31:03 -08001662 */
Martijn Coenenaec7a0a2019-04-24 10:41:11 +02001663 property_set("vold.decrypt", "trigger_shutdown_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001664 SLOGD("Just asked init to shut down class main\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001665
Paul Lawrencef4faa572014-01-29 13:31:03 -08001666 /* Ugh, shutting down the framework is not synchronous, so until it
1667 * can be fixed, this horrible hack will wait a moment for it all to
1668 * shut down before proceeding. Without it, some devices cannot
1669 * restart the graphics services.
1670 */
1671 sleep(2);
1672 }
Ken Sumrall9dedfd42012-10-09 14:16:59 -07001673
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001674 /* Now that the framework is shutdown, we should be able to umount()
1675 * the tmpfs filesystem, and mount the real one.
1676 */
1677
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001678 property_get("ro.crypto.fs_crypto_blkdev", crypto_blkdev, "");
1679 if (strlen(crypto_blkdev) == 0) {
1680 SLOGE("fs_crypto_blkdev not set\n");
1681 return -1;
1682 }
1683
Eric Biggersb4faeb82021-05-10 17:44:34 -07001684 if (!(rc = wait_and_unmount(DATA_MNT_POINT))) {
Doug Zongker6fd57712013-12-17 09:43:23 -08001685 /* If ro.crypto.readonly is set to 1, mount the decrypted
1686 * filesystem readonly. This is used when /data is mounted by
1687 * recovery mode.
1688 */
1689 char ro_prop[PROPERTY_VALUE_MAX];
1690 property_get("ro.crypto.readonly", ro_prop, "");
Jeff Sharkey95440eb2017-09-18 18:19:28 -06001691 if (strlen(ro_prop) > 0 && std::stoi(ro_prop)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08001692 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
1693 if (entry != nullptr) {
1694 entry->flags |= MS_RDONLY;
Luis Hector Chavezbbb512d2018-05-30 15:47:50 -07001695 }
Doug Zongker6fd57712013-12-17 09:43:23 -08001696 }
JP Abgrall62c7af32014-06-16 13:01:23 -07001697
Ken Sumralle5032c42012-04-01 23:58:44 -07001698 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001699 int retries = RETRY_MOUNT_ATTEMPTS;
1700 int mount_rc;
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001701
1702 /*
1703 * fs_mgr_do_mount runs fsck. Use setexeccon to run trusted
1704 * partitions in the fsck domain.
1705 */
LongPing Wei7f3ab952019-01-30 16:03:14 +08001706 if (setexeccon(android::vold::sFsckContext)) {
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001707 SLOGE("Failed to setexeccon");
1708 return -1;
1709 }
Daniel Rosenberg65f99c92018-08-28 01:58:49 -07001710 bool needs_cp = android::vold::cp_needsCheckpoint();
Tom Cherry4c5bde22019-01-29 14:34:01 -08001711 while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, crypto_blkdev, 0,
Paul Lawrence3fe93112020-06-12 08:12:48 -07001712 needs_cp, false)) != 0) {
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001713 if (mount_rc == FS_MGR_DOMNT_BUSY) {
1714 /* TODO: invoke something similar to
1715 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
1716 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
Paul Crowley14c8c072018-09-18 13:30:21 -07001717 SLOGI("Failed to mount %s because it is busy - waiting", crypto_blkdev);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001718 if (--retries) {
1719 sleep(RETRY_MOUNT_DELAY_SECONDS);
1720 } else {
1721 /* Let's hope that a reboot clears away whatever is keeping
1722 the mount busy */
Josh Gaofec44372017-08-28 13:22:55 -07001723 cryptfs_reboot(RebootType::reboot);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001724 }
1725 } else {
1726 SLOGE("Failed to mount decrypted data");
1727 cryptfs_set_corrupt();
1728 cryptfs_trigger_restart_min_framework();
1729 SLOGI("Started framework to offer wipe");
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001730 if (setexeccon(NULL)) {
1731 SLOGE("Failed to setexeccon");
1732 }
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001733 return -1;
1734 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001735 }
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001736 if (setexeccon(NULL)) {
1737 SLOGE("Failed to setexeccon");
1738 return -1;
1739 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001740
Ken Sumralle5032c42012-04-01 23:58:44 -07001741 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07001742 prep_data_fs();
Seigo Nonakae2ef0c02016-06-20 17:05:40 +09001743 property_set("vold.decrypt", "trigger_load_persist_props");
Ken Sumralle5032c42012-04-01 23:58:44 -07001744
1745 /* startup service classes main and late_start */
1746 property_set("vold.decrypt", "trigger_restart_framework");
1747 SLOGD("Just triggered restart_framework\n");
1748
1749 /* Give it a few moments to get started */
1750 sleep(1);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001751 }
1752
Ken Sumrall0cc16632011-01-18 20:32:26 -08001753 if (rc == 0) {
1754 restart_successful = 1;
1755 }
1756
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001757 return rc;
1758}
1759
Paul Crowley14c8c072018-09-18 13:30:21 -07001760int cryptfs_restart(void) {
Paul Lawrence05335c32015-03-05 09:46:23 -08001761 SLOGI("cryptfs_restart");
Eric Biggersa701c452018-10-23 13:06:55 -07001762 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08001763 SLOGE("cryptfs_restart not valid for file encryption:");
1764 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08001765 }
1766
Paul Lawrencef4faa572014-01-29 13:31:03 -08001767 /* Call internal implementation forcing a restart of main service group */
1768 return cryptfs_restart_internal(1);
1769}
1770
Paul Crowley14c8c072018-09-18 13:30:21 -07001771static int do_crypto_complete(const char* mount_point) {
1772 struct crypt_mnt_ftr crypt_ftr;
1773 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001774
Paul Crowley14c8c072018-09-18 13:30:21 -07001775 property_get("ro.crypto.state", encrypted_state, "");
1776 if (strcmp(encrypted_state, "encrypted")) {
1777 SLOGE("not running with encryption, aborting");
1778 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08001779 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001780
Paul Crowley14c8c072018-09-18 13:30:21 -07001781 // crypto_complete is full disk encrypted status
Eric Biggersa701c452018-10-23 13:06:55 -07001782 if (fscrypt_is_native()) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001783 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
1784 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001785
Paul Crowley14c8c072018-09-18 13:30:21 -07001786 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08001787 std::string key_loc;
1788 get_crypt_info(&key_loc, nullptr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07001789
Paul Crowley14c8c072018-09-18 13:30:21 -07001790 /*
1791 * Only report this error if key_loc is a file and it exists.
1792 * If the device was never encrypted, and /data is not mountable for
1793 * some reason, returning 1 should prevent the UI from presenting the
1794 * a "enter password" screen, or worse, a "press button to wipe the
1795 * device" screen.
1796 */
Tom Cherry4c5bde22019-01-29 14:34:01 -08001797 if (!key_loc.empty() && key_loc[0] == '/' && (access("key_loc", F_OK) == -1)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001798 SLOGE("master key file does not exist, aborting");
1799 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
1800 } else {
1801 SLOGE("Error getting crypt footer and key\n");
1802 return CRYPTO_COMPLETE_BAD_METADATA;
1803 }
1804 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001805
Paul Crowley14c8c072018-09-18 13:30:21 -07001806 // Test for possible error flags
1807 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
1808 SLOGE("Encryption process is partway completed\n");
1809 return CRYPTO_COMPLETE_PARTIAL;
1810 }
1811
1812 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
1813 SLOGE("Encryption process was interrupted but cannot continue\n");
1814 return CRYPTO_COMPLETE_INCONSISTENT;
1815 }
1816
1817 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT) {
1818 SLOGE("Encryption is successful but data is corrupt\n");
1819 return CRYPTO_COMPLETE_CORRUPT;
1820 }
1821
1822 /* We passed the test! We shall diminish, and return to the west */
1823 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001824}
1825
Paul Crowley14c8c072018-09-18 13:30:21 -07001826static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, const char* passwd,
1827 const char* mount_point, const char* label) {
1828 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley81796e92020-02-07 11:27:49 -08001829 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08001830 std::string real_blkdev;
Paul Crowley14c8c072018-09-18 13:30:21 -07001831 char tmp_mount_point[64];
1832 unsigned int orig_failed_decrypt_count;
1833 int rc;
Paul Crowley14c8c072018-09-18 13:30:21 -07001834 int upgrade = 0;
1835 unsigned char* intermediate_key = 0;
1836 size_t intermediate_key_size = 0;
1837 int N = 1 << crypt_ftr->N_factor;
1838 int r = 1 << crypt_ftr->r_factor;
1839 int p = 1 << crypt_ftr->p_factor;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001840
Paul Crowley14c8c072018-09-18 13:30:21 -07001841 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
1842 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001843
Paul Crowley14c8c072018-09-18 13:30:21 -07001844 if (!(crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED)) {
1845 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr, &intermediate_key,
1846 &intermediate_key_size)) {
1847 SLOGE("Failed to decrypt master key\n");
1848 rc = -1;
1849 goto errout;
1850 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08001851 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001852
Tom Cherry4c5bde22019-01-29 14:34:01 -08001853 get_crypt_info(nullptr, &real_blkdev);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001854
Paul Crowley14c8c072018-09-18 13:30:21 -07001855 // Create crypto block device - all (non fatal) code paths
1856 // need it
Paul Crowley81796e92020-02-07 11:27:49 -08001857 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev.c_str(), &crypto_blkdev,
Tom Cherry4c5bde22019-01-29 14:34:01 -08001858 label, 0)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001859 SLOGE("Error creating decrypted block device\n");
1860 rc = -1;
1861 goto errout;
1862 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001863
Paul Crowley14c8c072018-09-18 13:30:21 -07001864 /* Work out if the problem is the password or the data */
1865 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->scrypted_intermediate_key)];
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001866
Paul Crowley14c8c072018-09-18 13:30:21 -07001867 rc = crypto_scrypt(intermediate_key, intermediate_key_size, crypt_ftr->salt,
1868 sizeof(crypt_ftr->salt), N, r, p, scrypted_intermediate_key,
1869 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001870
Paul Crowley14c8c072018-09-18 13:30:21 -07001871 // Does the key match the crypto footer?
1872 if (rc == 0 && memcmp(scrypted_intermediate_key, crypt_ftr->scrypted_intermediate_key,
1873 sizeof(scrypted_intermediate_key)) == 0) {
1874 SLOGI("Password matches");
1875 rc = 0;
Paul Lawrence74f29f12014-08-28 15:54:10 -07001876 } else {
Paul Crowley14c8c072018-09-18 13:30:21 -07001877 /* Try mounting the file system anyway, just in case the problem's with
1878 * the footer, not the key. */
1879 snprintf(tmp_mount_point, sizeof(tmp_mount_point), "%s/tmp_mnt", mount_point);
1880 mkdir(tmp_mount_point, 0755);
Paul Crowley81796e92020-02-07 11:27:49 -08001881 if (fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT,
1882 const_cast<char*>(crypto_blkdev.c_str()), tmp_mount_point)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001883 SLOGE("Error temp mounting decrypted block device\n");
1884 delete_crypto_blk_dev(label);
Paul Lawrence74f29f12014-08-28 15:54:10 -07001885
Paul Crowley14c8c072018-09-18 13:30:21 -07001886 rc = ++crypt_ftr->failed_decrypt_count;
1887 put_crypt_ftr_and_key(crypt_ftr);
1888 } else {
1889 /* Success! */
1890 SLOGI("Password did not match but decrypted drive mounted - continue");
1891 umount(tmp_mount_point);
1892 rc = 0;
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07001893 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08001894 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001895
Paul Crowley14c8c072018-09-18 13:30:21 -07001896 if (rc == 0) {
1897 crypt_ftr->failed_decrypt_count = 0;
1898 if (orig_failed_decrypt_count != 0) {
1899 put_crypt_ftr_and_key(crypt_ftr);
1900 }
1901
1902 /* Save the name of the crypto block device
1903 * so we can mount it when restarting the framework. */
Paul Crowley81796e92020-02-07 11:27:49 -08001904 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev.c_str());
Paul Crowley14c8c072018-09-18 13:30:21 -07001905
1906 /* Also save a the master key so we can reencrypted the key
1907 * the key when we want to change the password on it. */
1908 memcpy(saved_master_key, decrypted_master_key, crypt_ftr->keysize);
1909 saved_mount_point = strdup(mount_point);
1910 master_key_saved = 1;
1911 SLOGD("%s(): Master key saved\n", __FUNCTION__);
1912 rc = 0;
1913
1914 // Upgrade if we're not using the latest KDF.
Satya Tangirala23452c12021-03-22 23:29:15 -07001915 if (crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07001916 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
1917 upgrade = 1;
Paul Crowley14c8c072018-09-18 13:30:21 -07001918 }
1919
1920 if (upgrade) {
1921 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
1922 crypt_ftr->master_key, crypt_ftr);
1923 if (!rc) {
1924 rc = put_crypt_ftr_and_key(crypt_ftr);
1925 }
1926 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
1927
1928 // Do not fail even if upgrade failed - machine is bootable
1929 // Note that if this code is ever hit, there is a *serious* problem
1930 // since KDFs should never fail. You *must* fix the kdf before
1931 // proceeding!
1932 if (rc) {
1933 SLOGW(
1934 "Upgrade failed with error %d,"
1935 " but continuing with previous state",
1936 rc);
1937 rc = 0;
1938 }
1939 }
1940 }
1941
1942errout:
1943 if (intermediate_key) {
1944 memset(intermediate_key, 0, intermediate_key_size);
1945 free(intermediate_key);
1946 }
1947 return rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001948}
1949
Ken Sumrall29d8da82011-05-18 17:20:07 -07001950/*
Jeff Sharkey9c484982015-03-31 10:35:33 -07001951 * Called by vold when it's asked to mount an encrypted external
1952 * storage volume. The incoming partition has no crypto header/footer,
Greg Kaiser57f9af62018-02-16 13:13:58 -08001953 * as any metadata is been stored in a separate, small partition. We
1954 * assume it must be using our same crypt type and keysize.
Ken Sumrall29d8da82011-05-18 17:20:07 -07001955 */
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001956int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, const KeyBuffer& key,
Paul Crowley81796e92020-02-07 11:27:49 -08001957 std::string* out_crypto_blkdev) {
Paul Crowley220567c2020-02-07 12:45:20 -08001958 auto crypto_type = get_crypto_type();
1959 if (key.size() != crypto_type.get_keysize()) {
Paul Crowleya661fb62020-02-11 16:21:54 -08001960 SLOGE("Raw keysize %zu does not match crypt keysize %zu", key.size(),
Paul Crowley220567c2020-02-07 12:45:20 -08001961 crypto_type.get_keysize());
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001962 return -1;
1963 }
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02001964 uint64_t nr_sec = 0;
1965 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07001966 SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno));
Ken Sumrall29d8da82011-05-18 17:20:07 -07001967 return -1;
1968 }
1969
Jeff Sharkey9c484982015-03-31 10:35:33 -07001970 struct crypt_mnt_ftr ext_crypt_ftr;
1971 memset(&ext_crypt_ftr, 0, sizeof(ext_crypt_ftr));
1972 ext_crypt_ftr.fs_size = nr_sec;
Paul Crowley220567c2020-02-07 12:45:20 -08001973 ext_crypt_ftr.keysize = crypto_type.get_keysize();
1974 strlcpy((char*)ext_crypt_ftr.crypto_type_name, crypto_type.get_kernel_name(),
Jeff Sharkey32ebb732017-03-27 16:18:50 -06001975 MAX_CRYPTO_TYPE_NAME_LEN);
Paul Crowley385cb8c2018-03-29 13:27:23 -07001976 uint32_t flags = 0;
Eric Biggersa701c452018-10-23 13:06:55 -07001977 if (fscrypt_is_native() &&
Paul Crowley385cb8c2018-03-29 13:27:23 -07001978 android::base::GetBoolProperty("ro.crypto.allow_encrypt_override", false))
1979 flags |= CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07001980
Paul Crowley3d98f5d2020-02-07 11:49:09 -08001981 return create_crypto_blk_dev(&ext_crypt_ftr, reinterpret_cast<const unsigned char*>(key.data()),
1982 real_blkdev, out_crypto_blkdev, label, flags);
Jeff Sharkey9c484982015-03-31 10:35:33 -07001983}
Ken Sumrall29d8da82011-05-18 17:20:07 -07001984
Paul Crowley14c8c072018-09-18 13:30:21 -07001985int cryptfs_crypto_complete(void) {
1986 return do_crypto_complete("/data");
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001987}
1988
Paul Crowley14c8c072018-09-18 13:30:21 -07001989int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08001990 char encrypted_state[PROPERTY_VALUE_MAX];
1991 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07001992 if (master_key_saved || strcmp(encrypted_state, "encrypted")) {
1993 SLOGE(
1994 "encrypted fs already validated or not running with encryption,"
1995 " aborting");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001996 return -1;
1997 }
1998
1999 if (get_crypt_ftr_and_key(crypt_ftr)) {
2000 SLOGE("Error getting crypt footer and key");
2001 return -1;
2002 }
2003
2004 return 0;
2005}
2006
Paul Crowley14c8c072018-09-18 13:30:21 -07002007int cryptfs_check_passwd(const char* passwd) {
Paul Lawrence05335c32015-03-05 09:46:23 -08002008 SLOGI("cryptfs_check_passwd");
Eric Biggersa701c452018-10-23 13:06:55 -07002009 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002010 SLOGE("cryptfs_check_passwd not valid for file encryption");
2011 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002012 }
2013
Paul Lawrencef4faa572014-01-29 13:31:03 -08002014 struct crypt_mnt_ftr crypt_ftr;
2015 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002016
Paul Lawrencef4faa572014-01-29 13:31:03 -08002017 rc = check_unmounted_and_get_ftr(&crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002018 if (rc) {
2019 SLOGE("Could not get footer");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002020 return rc;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002021 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002022
Paul Crowley14c8c072018-09-18 13:30:21 -07002023 rc = test_mount_encrypted_fs(&crypt_ftr, passwd, DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002024 if (rc) {
2025 SLOGE("Password did not match");
2026 return rc;
2027 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002028
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002029 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2030 // Here we have a default actual password but a real password
2031 // we must test against the scrypted value
2032 // First, we must delete the crypto block device that
2033 // test_mount_encrypted_fs leaves behind as a side effect
2034 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
Paul Crowley14c8c072018-09-18 13:30:21 -07002035 rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD, DATA_MNT_POINT,
2036 CRYPTO_BLOCK_DEVICE);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002037 if (rc) {
2038 SLOGE("Default password did not match on reboot encryption");
2039 return rc;
2040 }
2041
2042 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2043 put_crypt_ftr_and_key(&crypt_ftr);
2044 rc = cryptfs_changepw(crypt_ftr.crypt_type, passwd);
2045 if (rc) {
2046 SLOGE("Could not change password on reboot encryption");
2047 return rc;
2048 }
2049 }
2050
2051 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002052 cryptfs_clear_password();
2053 password = strdup(passwd);
2054 struct timespec now;
2055 clock_gettime(CLOCK_BOOTTIME, &now);
2056 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002057 }
2058
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002059 return rc;
2060}
2061
Paul Crowley14c8c072018-09-18 13:30:21 -07002062int cryptfs_verify_passwd(const char* passwd) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002063 struct crypt_mnt_ftr crypt_ftr;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002064 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002065 char encrypted_state[PROPERTY_VALUE_MAX];
2066 int rc;
2067
2068 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002069 if (strcmp(encrypted_state, "encrypted")) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002070 SLOGE("device not encrypted, aborting");
2071 return -2;
2072 }
2073
2074 if (!master_key_saved) {
2075 SLOGE("encrypted fs not yet mounted, aborting");
2076 return -1;
2077 }
2078
2079 if (!saved_mount_point) {
2080 SLOGE("encrypted fs failed to save mount point, aborting");
2081 return -1;
2082 }
2083
Ken Sumrall160b4d62013-04-22 12:15:39 -07002084 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002085 SLOGE("Error getting crypt footer and key\n");
2086 return -1;
2087 }
2088
2089 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2090 /* If the device has no password, then just say the password is valid */
2091 rc = 0;
2092 } else {
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002093 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002094 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2095 /* They match, the password is correct */
2096 rc = 0;
2097 } else {
2098 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2099 sleep(1);
2100 rc = 1;
2101 }
2102 }
2103
2104 return rc;
2105}
2106
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002107/* Initialize a crypt_mnt_ftr structure. The keysize is
Paul Crowley220567c2020-02-07 12:45:20 -08002108 * defaulted to get_crypto_type().get_keysize() bytes, and the filesystem size to 0.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002109 * Presumably, at a minimum, the caller will update the
2110 * filesystem size and crypto_type_name after calling this function.
2111 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002112static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr* ftr) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002113 off64_t off;
2114
2115 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002116 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002117 ftr->major_version = CURRENT_MAJOR_VERSION;
2118 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002119 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Paul Crowley220567c2020-02-07 12:45:20 -08002120 ftr->keysize = get_crypto_type().get_keysize();
Satya Tangirala23452c12021-03-22 23:29:15 -07002121 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002122
Kenny Rootc4c70f12013-06-14 12:11:38 -07002123 get_device_scrypt_params(ftr);
2124
Ken Sumrall160b4d62013-04-22 12:15:39 -07002125 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2126 if (get_crypt_ftr_info(NULL, &off) == 0) {
2127 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Paul Crowley14c8c072018-09-18 13:30:21 -07002128 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET + ftr->persist_data_size;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002129 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002130
2131 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002132}
2133
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002134#define FRAMEWORK_BOOT_WAIT 60
2135
Paul Crowleyb64933a2017-10-31 08:25:55 -07002136static int vold_unmountAll(void) {
2137 VolumeManager* vm = VolumeManager::Instance();
2138 return vm->unmountAll();
2139}
2140
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002141int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) {
Paul Crowley81796e92020-02-07 11:27:49 -08002142 std::string crypto_blkdev;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002143 std::string real_blkdev;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002144 unsigned char decrypted_master_key[MAX_KEY_LEN];
Paul Crowley14c8c072018-09-18 13:30:21 -07002145 int rc = -1, i;
Paul Lawrence87999172014-02-20 12:21:31 -08002146 struct crypt_mnt_ftr crypt_ftr;
Paul Crowley14c8c072018-09-18 13:30:21 -07002147 struct crypt_persist_data* pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002148 char encrypted_state[PROPERTY_VALUE_MAX];
Paul Crowley14c8c072018-09-18 13:30:21 -07002149 char lockid[32] = {0};
Tom Cherry4c5bde22019-01-29 14:34:01 -08002150 std::string key_loc;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002151 int num_vols;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002152 bool rebootEncryption = false;
Wei Wang4375f1b2017-02-24 17:43:01 -08002153 bool onlyCreateHeader = false;
Kalesh Singh98062dc2021-02-22 15:10:45 -05002154
2155 /* Get a wakelock as this may take a while, and we don't want the
2156 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2157 * wants to keep the screen on, it can grab a full wakelock.
2158 */
2159 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int)getpid());
2160 auto wl = android::wakelock::WakeLock::tryGet(lockid);
2161 if (!wl.has_value()) {
2162 return android::UNEXPECTED_NULL;
2163 }
Ken Sumrall29d8da82011-05-18 17:20:07 -07002164
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002165 if (get_crypt_ftr_and_key(&crypt_ftr) == 0) {
Eric Biggersc01995e2020-11-03 14:11:00 -08002166 if (crypt_ftr.flags & CRYPT_FORCE_ENCRYPTION) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002167 if (!check_ftr_sha(&crypt_ftr)) {
2168 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
2169 put_crypt_ftr_and_key(&crypt_ftr);
2170 goto error_unencrypted;
2171 }
2172
2173 /* Doing a reboot-encryption*/
2174 crypt_ftr.flags &= ~CRYPT_FORCE_ENCRYPTION;
2175 crypt_ftr.flags |= CRYPT_FORCE_COMPLETE;
2176 rebootEncryption = true;
2177 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08002178 } else {
2179 // We don't want to accidentally reference invalid data.
2180 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
Paul Lawrence87999172014-02-20 12:21:31 -08002181 }
2182
2183 property_get("ro.crypto.state", encrypted_state, "");
Eric Biggersc01995e2020-11-03 14:11:00 -08002184 if (!strcmp(encrypted_state, "encrypted")) {
Paul Lawrence87999172014-02-20 12:21:31 -08002185 SLOGE("Device is already running encrypted, aborting");
2186 goto error_unencrypted;
2187 }
2188
Tom Cherry4c5bde22019-01-29 14:34:01 -08002189 get_crypt_info(&key_loc, &real_blkdev);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002190
Ken Sumrall3ed82362011-01-28 23:31:16 -08002191 /* Get the size of the real block device */
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002192 uint64_t nr_sec;
2193 if (android::vold::GetBlockDev512Sectors(real_blkdev, &nr_sec) != android::OK) {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002194 SLOGE("Cannot get size of block device %s\n", real_blkdev.c_str());
Ken Sumrall3ed82362011-01-28 23:31:16 -08002195 goto error_unencrypted;
2196 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002197
2198 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Tom Cherry4c5bde22019-01-29 14:34:01 -08002199 if (key_loc == KEY_IN_FOOTER) {
Oleksiy Avramchenko625dc782018-05-23 10:50:46 +02002200 uint64_t fs_size_sec, max_fs_size_sec;
Tom Cherry4c5bde22019-01-29 14:34:01 -08002201 fs_size_sec = get_fs_size(real_blkdev.c_str());
2202 if (fs_size_sec == 0) fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev.data());
Daniel Rosenberge82df162014-08-15 22:19:23 +00002203
Paul Lawrence87999172014-02-20 12:21:31 -08002204 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002205
2206 if (fs_size_sec > max_fs_size_sec) {
2207 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2208 goto error_unencrypted;
2209 }
2210 }
2211
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002212 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002213 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002214 */
2215 property_set("vold.decrypt", "trigger_shutdown_framework");
2216 SLOGD("Just asked init to shut down class main\n");
2217
Jeff Sharkey9c484982015-03-31 10:35:33 -07002218 /* Ask vold to unmount all devices that it manages */
2219 if (vold_unmountAll()) {
2220 SLOGE("Failed to unmount all vold managed devices");
Ken Sumrall2eaf7132011-01-14 12:45:48 -08002221 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002222
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002223 /* no_ui means we are being called from init, not settings.
2224 Now we always reboot from settings, so !no_ui means reboot
2225 */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002226 if (!no_ui) {
2227 /* Try fallback, which is to reboot and try there */
2228 onlyCreateHeader = true;
2229 FILE* breadcrumb = fopen(BREADCRUMB_FILE, "we");
2230 if (breadcrumb == 0) {
2231 SLOGE("Failed to create breadcrumb file");
2232 goto error_shutting_down;
2233 }
2234 fclose(breadcrumb);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002235 }
2236
2237 /* Do extra work for a better UX when doing the long inplace encryption */
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002238 if (!onlyCreateHeader) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002239 /* Now that /data is unmounted, we need to mount a tmpfs
2240 * /data, set a property saying we're doing inplace encryption,
2241 * and restart the framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002242 */
Eric Biggersb4faeb82021-05-10 17:44:34 -07002243 wait_and_unmount(DATA_MNT_POINT);
Ken Sumralle5032c42012-04-01 23:58:44 -07002244 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002245 goto error_shutting_down;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002246 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002247 /* Tells the framework that inplace encryption is starting */
Ken Sumrall7df84122011-01-18 14:04:08 -08002248 property_set("vold.encrypt_progress", "0");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002249
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002250 /* restart the framework. */
2251 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07002252 prep_data_fs();
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002253
Ken Sumrall92736ef2012-10-17 20:57:14 -07002254 /* Ugh, shutting down the framework is not synchronous, so until it
2255 * can be fixed, this horrible hack will wait a moment for it all to
2256 * shut down before proceeding. Without it, some devices cannot
2257 * restart the graphics services.
2258 */
2259 sleep(2);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002260 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002261
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002262 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002263 /* Initialize a crypt_mnt_ftr for the partition */
Eric Biggersc01995e2020-11-03 14:11:00 -08002264 if (!rebootEncryption) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002265 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
2266 goto error_shutting_down;
2267 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002268
Tom Cherry4c5bde22019-01-29 14:34:01 -08002269 if (key_loc == KEY_IN_FOOTER) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002270 crypt_ftr.fs_size = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Paul Lawrence87999172014-02-20 12:21:31 -08002271 } else {
2272 crypt_ftr.fs_size = nr_sec;
2273 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07002274 /* At this point, we are in an inconsistent state. Until we successfully
2275 complete encryption, a reboot will leave us broken. So mark the
2276 encryption failed in case that happens.
2277 On successfully completing encryption, remove this flag */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002278 if (onlyCreateHeader) {
2279 crypt_ftr.flags |= CRYPT_FORCE_ENCRYPTION;
2280 } else {
2281 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2282 }
Paul Lawrence87999172014-02-20 12:21:31 -08002283 crypt_ftr.crypt_type = crypt_type;
Paul Crowley220567c2020-02-07 12:45:20 -08002284 strlcpy((char*)crypt_ftr.crypto_type_name, get_crypto_type().get_kernel_name(),
Paul Crowley14c8c072018-09-18 13:30:21 -07002285 MAX_CRYPTO_TYPE_NAME_LEN);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002286
Paul Lawrence87999172014-02-20 12:21:31 -08002287 /* Make an encrypted master key */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002288 if (create_encrypted_random_key(onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2289 crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
Paul Lawrence87999172014-02-20 12:21:31 -08002290 SLOGE("Cannot create encrypted master key\n");
2291 goto error_shutting_down;
2292 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002293
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002294 /* Replace scrypted intermediate key if we are preparing for a reboot */
2295 if (onlyCreateHeader) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08002296 unsigned char fake_master_key[MAX_KEY_LEN];
2297 unsigned char encrypted_fake_master_key[MAX_KEY_LEN];
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002298 memset(fake_master_key, 0, sizeof(fake_master_key));
Paul Crowley14c8c072018-09-18 13:30:21 -07002299 encrypt_master_key(passwd, crypt_ftr.salt, fake_master_key, encrypted_fake_master_key,
2300 &crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002301 }
2302
Paul Lawrence87999172014-02-20 12:21:31 -08002303 /* Write the key to the end of the partition */
2304 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002305
Paul Lawrence87999172014-02-20 12:21:31 -08002306 /* If any persistent data has been remembered, save it.
2307 * If none, create a valid empty table and save that.
2308 */
2309 if (!persist_data) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002310 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
2311 if (pdata) {
2312 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
2313 persist_data = pdata;
2314 }
Paul Lawrence87999172014-02-20 12:21:31 -08002315 }
2316 if (persist_data) {
2317 save_persistent_data();
2318 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002319 }
2320
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002321 if (onlyCreateHeader) {
2322 sleep(2);
Josh Gaofec44372017-08-28 13:22:55 -07002323 cryptfs_reboot(RebootType::reboot);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002324 }
2325
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002326 if (!no_ui || rebootEncryption) {
Ajay Dudani87701e22014-09-17 21:02:52 -07002327 /* startup service classes main and late_start */
2328 property_set("vold.decrypt", "trigger_restart_min_framework");
2329 SLOGD("Just triggered restart_min_framework\n");
2330
2331 /* OK, the framework is restarted and will soon be showing a
2332 * progress bar. Time to setup an encrypted mapping, and
2333 * either write a new filesystem, or encrypt in place updating
2334 * the progress bar as we work.
2335 */
2336 }
2337
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002338 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Eric Biggers88f993b2020-11-03 14:11:00 -08002339 rc = create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev.c_str(),
2340 &crypto_blkdev, CRYPTO_BLOCK_DEVICE, 0);
2341 if (!rc) {
Eric Biggersf038c5f2020-11-03 14:11:02 -08002342 if (encrypt_inplace(crypto_blkdev, real_blkdev, crypt_ftr.fs_size, true)) {
2343 crypt_ftr.encrypted_upto = crypt_ftr.fs_size;
2344 rc = 0;
2345 } else {
2346 rc = -1;
2347 }
Eric Biggers88f993b2020-11-03 14:11:00 -08002348 /* Undo the dm-crypt mapping whether we succeed or not */
2349 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
2350 }
Ken Sumrall29d8da82011-05-18 17:20:07 -07002351
Paul Crowley14c8c072018-09-18 13:30:21 -07002352 if (!rc) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002353 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002354 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002355
Paul Lawrence6bfed202014-07-28 12:47:22 -07002356 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08002357
Eric Biggersc01995e2020-11-03 14:11:00 -08002358 char value[PROPERTY_VALUE_MAX];
2359 property_get("ro.crypto.state", value, "");
2360 if (!strcmp(value, "")) {
2361 /* default encryption - continue first boot sequence */
2362 property_set("ro.crypto.state", "encrypted");
2363 property_set("ro.crypto.type", "block");
Kalesh Singh98062dc2021-02-22 15:10:45 -05002364 wl.reset();
Eric Biggersc01995e2020-11-03 14:11:00 -08002365 if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2366 // Bring up cryptkeeper that will check the password and set it
2367 property_set("vold.decrypt", "trigger_shutdown_framework");
2368 sleep(2);
2369 property_set("vold.encrypt_progress", "");
2370 cryptfs_trigger_restart_min_framework();
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002371 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002372 cryptfs_check_passwd(DEFAULT_PASSWORD);
2373 cryptfs_restart_internal(1);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002374 }
Eric Biggersc01995e2020-11-03 14:11:00 -08002375 return 0;
Paul Lawrence87999172014-02-20 12:21:31 -08002376 } else {
Eric Biggersc01995e2020-11-03 14:11:00 -08002377 sleep(2); /* Give the UI a chance to show 100% progress */
2378 cryptfs_reboot(RebootType::reboot);
Paul Lawrence87999172014-02-20 12:21:31 -08002379 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002380 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002381 char value[PROPERTY_VALUE_MAX];
2382
Ken Sumrall319369a2012-06-27 16:30:18 -07002383 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002384 if (!strcmp(value, "1")) {
2385 /* wipe data if encryption failed */
2386 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
Wei Wang4375f1b2017-02-24 17:43:01 -08002387 std::string err;
2388 const std::vector<std::string> options = {
Paul Crowley14c8c072018-09-18 13:30:21 -07002389 "--wipe_data\n--reason=cryptfs_enable_internal\n"};
Wei Wang4375f1b2017-02-24 17:43:01 -08002390 if (!write_bootloader_message(options, &err)) {
2391 SLOGE("could not write bootloader message: %s", err.c_str());
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002392 }
Josh Gaofec44372017-08-28 13:22:55 -07002393 cryptfs_reboot(RebootType::recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002394 } else {
2395 /* set property to trigger dialog */
2396 property_set("vold.encrypt_progress", "error_partially_encrypted");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002397 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002398 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002399 }
2400
Ken Sumrall3ed82362011-01-28 23:31:16 -08002401 /* hrm, the encrypt step claims success, but the reboot failed.
2402 * This should not happen.
2403 * Set the property and return. Hope the framework can deal with it.
2404 */
2405 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002406 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08002407
2408error_unencrypted:
2409 property_set("vold.encrypt_progress", "error_not_encrypted");
2410 return -1;
2411
2412error_shutting_down:
2413 /* we failed, and have not encrypted anthing, so the users's data is still intact,
2414 * but the framework is stopped and not restarted to show the error, so it's up to
2415 * vold to restart the system.
2416 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002417 SLOGE(
2418 "Error enabling encryption after framework is shutdown, no data changed, restarting "
2419 "system");
Josh Gaofec44372017-08-28 13:22:55 -07002420 cryptfs_reboot(RebootType::reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002421
2422 /* shouldn't get here */
2423 property_set("vold.encrypt_progress", "error_shutting_down");
2424 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002425}
2426
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002427int cryptfs_enable(int type, const char* passwd, int no_ui) {
2428 return cryptfs_enable_internal(type, passwd, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002429}
2430
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002431int cryptfs_enable_default(int no_ui) {
2432 return cryptfs_enable_internal(CRYPT_TYPE_DEFAULT, DEFAULT_PASSWORD, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002433}
2434
Paul Crowley14c8c072018-09-18 13:30:21 -07002435int cryptfs_changepw(int crypt_type, const char* newpw) {
Eric Biggersa701c452018-10-23 13:06:55 -07002436 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002437 SLOGE("cryptfs_changepw not valid for file encryption");
2438 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002439 }
2440
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002441 struct crypt_mnt_ftr crypt_ftr;
JP Abgrall933216c2015-02-11 13:44:32 -08002442 int rc;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002443
2444 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08002445 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08002446 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002447 return -1;
2448 }
2449
Paul Lawrencef4faa572014-01-29 13:31:03 -08002450 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
2451 SLOGE("Invalid crypt_type %d", crypt_type);
2452 return -1;
2453 }
2454
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002455 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07002456 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002457 SLOGE("Error getting crypt footer and key");
2458 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002459 }
2460
Paul Lawrencef4faa572014-01-29 13:31:03 -08002461 crypt_ftr.crypt_type = crypt_type;
2462
Paul Crowley14c8c072018-09-18 13:30:21 -07002463 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw,
2464 crypt_ftr.salt, saved_master_key, crypt_ftr.master_key, &crypt_ftr);
JP Abgrall933216c2015-02-11 13:44:32 -08002465 if (rc) {
2466 SLOGE("Encrypt master key failed: %d", rc);
2467 return -1;
2468 }
Jason parks70a4b3f2011-01-28 10:10:47 -06002469 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07002470 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002471
2472 return 0;
2473}
Ken Sumrall160b4d62013-04-22 12:15:39 -07002474
Rubin Xu85c01f92014-10-13 12:49:54 +01002475static unsigned int persist_get_max_entries(int encrypted) {
2476 struct crypt_mnt_ftr crypt_ftr;
2477 unsigned int dsize;
Rubin Xu85c01f92014-10-13 12:49:54 +01002478
2479 /* If encrypted, use the values from the crypt_ftr, otherwise
2480 * use the values for the current spec.
2481 */
2482 if (encrypted) {
2483 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Rubin Xuf83cc612018-10-09 16:13:38 +01002484 /* Something is wrong, assume no space for entries */
2485 return 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01002486 }
2487 dsize = crypt_ftr.persist_data_size;
2488 } else {
2489 dsize = CRYPT_PERSIST_DATA_SIZE;
2490 }
2491
Rubin Xuf83cc612018-10-09 16:13:38 +01002492 if (dsize > sizeof(struct crypt_persist_data)) {
2493 return (dsize - sizeof(struct crypt_persist_data)) / sizeof(struct crypt_persist_entry);
2494 } else {
2495 return 0;
2496 }
Rubin Xu85c01f92014-10-13 12:49:54 +01002497}
2498
Paul Crowley14c8c072018-09-18 13:30:21 -07002499static int persist_get_key(const char* fieldname, char* value) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002500 unsigned int i;
2501
2502 if (persist_data == NULL) {
2503 return -1;
2504 }
2505 for (i = 0; i < persist_data->persist_valid_entries; i++) {
2506 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
2507 /* We found it! */
2508 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
2509 return 0;
2510 }
2511 }
2512
2513 return -1;
2514}
2515
Paul Crowley14c8c072018-09-18 13:30:21 -07002516static int persist_set_key(const char* fieldname, const char* value, int encrypted) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002517 unsigned int i;
2518 unsigned int num;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002519 unsigned int max_persistent_entries;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002520
2521 if (persist_data == NULL) {
2522 return -1;
2523 }
2524
Rubin Xu85c01f92014-10-13 12:49:54 +01002525 max_persistent_entries = persist_get_max_entries(encrypted);
Ken Sumrall160b4d62013-04-22 12:15:39 -07002526
2527 num = persist_data->persist_valid_entries;
2528
2529 for (i = 0; i < num; i++) {
2530 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
2531 /* We found an existing entry, update it! */
2532 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
2533 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
2534 return 0;
2535 }
2536 }
2537
2538 /* We didn't find it, add it to the end, if there is room */
2539 if (persist_data->persist_valid_entries < max_persistent_entries) {
2540 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
2541 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
2542 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
2543 persist_data->persist_valid_entries++;
2544 return 0;
2545 }
2546
2547 return -1;
2548}
2549
Rubin Xu85c01f92014-10-13 12:49:54 +01002550/**
2551 * Test if key is part of the multi-entry (field, index) sequence. Return non-zero if key is in the
2552 * sequence and its index is greater than or equal to index. Return 0 otherwise.
2553 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002554int match_multi_entry(const char* key, const char* field, unsigned index) {
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002555 std::string key_ = key;
2556 std::string field_ = field;
Rubin Xu85c01f92014-10-13 12:49:54 +01002557
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002558 std::string parsed_field;
2559 unsigned parsed_index;
2560
2561 std::string::size_type split = key_.find_last_of('_');
2562 if (split == std::string::npos) {
2563 parsed_field = key_;
2564 parsed_index = 0;
2565 } else {
2566 parsed_field = key_.substr(0, split);
2567 parsed_index = std::stoi(key_.substr(split + 1));
Rubin Xu85c01f92014-10-13 12:49:54 +01002568 }
Jeff Sharkey95440eb2017-09-18 18:19:28 -06002569
2570 return parsed_field == field_ && parsed_index >= index;
Rubin Xu85c01f92014-10-13 12:49:54 +01002571}
2572
2573/*
2574 * Delete entry/entries from persist_data. If the entries are part of a multi-segment field, all
2575 * remaining entries starting from index will be deleted.
2576 * returns PERSIST_DEL_KEY_OK if deletion succeeds,
2577 * PERSIST_DEL_KEY_ERROR_NO_FIELD if the field does not exist,
2578 * and PERSIST_DEL_KEY_ERROR_OTHER if error occurs.
2579 *
2580 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002581static int persist_del_keys(const char* fieldname, unsigned index) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002582 unsigned int i;
2583 unsigned int j;
2584 unsigned int num;
2585
2586 if (persist_data == NULL) {
2587 return PERSIST_DEL_KEY_ERROR_OTHER;
2588 }
2589
2590 num = persist_data->persist_valid_entries;
2591
Paul Crowley14c8c072018-09-18 13:30:21 -07002592 j = 0; // points to the end of non-deleted entries.
Rubin Xu85c01f92014-10-13 12:49:54 +01002593 // Filter out to-be-deleted entries in place.
2594 for (i = 0; i < num; i++) {
2595 if (!match_multi_entry(persist_data->persist_entry[i].key, fieldname, index)) {
2596 persist_data->persist_entry[j] = persist_data->persist_entry[i];
2597 j++;
2598 }
2599 }
2600
2601 if (j < num) {
2602 persist_data->persist_valid_entries = j;
2603 // Zeroise the remaining entries
2604 memset(&persist_data->persist_entry[j], 0, (num - j) * sizeof(struct crypt_persist_entry));
2605 return PERSIST_DEL_KEY_OK;
2606 } else {
2607 // Did not find an entry matching the given fieldname
2608 return PERSIST_DEL_KEY_ERROR_NO_FIELD;
2609 }
2610}
2611
Paul Crowley14c8c072018-09-18 13:30:21 -07002612static int persist_count_keys(const char* fieldname) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002613 unsigned int i;
2614 unsigned int count;
2615
2616 if (persist_data == NULL) {
2617 return -1;
2618 }
2619
2620 count = 0;
2621 for (i = 0; i < persist_data->persist_valid_entries; i++) {
2622 if (match_multi_entry(persist_data->persist_entry[i].key, fieldname, 0)) {
2623 count++;
2624 }
2625 }
2626
2627 return count;
2628}
2629
Ken Sumrall160b4d62013-04-22 12:15:39 -07002630/* Return the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07002631int cryptfs_getfield(const char* fieldname, char* value, int len) {
Eric Biggersa701c452018-10-23 13:06:55 -07002632 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08002633 SLOGE("Cannot get field when file encrypted");
2634 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07002635 }
2636
Ken Sumrall160b4d62013-04-22 12:15:39 -07002637 char temp_value[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01002638 /* CRYPTO_GETFIELD_OK is success,
2639 * CRYPTO_GETFIELD_ERROR_NO_FIELD is value not set,
2640 * CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL is buffer (as given by len) too small,
2641 * CRYPTO_GETFIELD_ERROR_OTHER is any other error
Ken Sumrall160b4d62013-04-22 12:15:39 -07002642 */
Rubin Xu85c01f92014-10-13 12:49:54 +01002643 int rc = CRYPTO_GETFIELD_ERROR_OTHER;
2644 int i;
2645 char temp_field[PROPERTY_KEY_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -07002646
2647 if (persist_data == NULL) {
2648 load_persistent_data();
2649 if (persist_data == NULL) {
2650 SLOGE("Getfield error, cannot load persistent data");
2651 goto out;
2652 }
2653 }
2654
Rubin Xu85c01f92014-10-13 12:49:54 +01002655 // Read value from persistent entries. If the original value is split into multiple entries,
2656 // stitch them back together.
Ken Sumrall160b4d62013-04-22 12:15:39 -07002657 if (!persist_get_key(fieldname, temp_value)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002658 // 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 -07002659 if (strlcpy(value, temp_value, len) >= (unsigned)len) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002660 // value too small
2661 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
2662 goto out;
2663 }
2664 rc = CRYPTO_GETFIELD_OK;
2665
2666 for (i = 1; /* break explicitly */; i++) {
2667 if (snprintf(temp_field, sizeof(temp_field), "%s_%d", fieldname, i) >=
Paul Crowley14c8c072018-09-18 13:30:21 -07002668 (int)sizeof(temp_field)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01002669 // If the fieldname is very long, we stop as soon as it begins to overflow the
2670 // maximum field length. At this point we have in fact fully read out the original
2671 // value because cryptfs_setfield would not allow fields with longer names to be
2672 // written in the first place.
2673 break;
2674 }
2675 if (!persist_get_key(temp_field, temp_value)) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002676 if (strlcat(value, temp_value, len) >= (unsigned)len) {
2677 // value too small.
2678 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
2679 goto out;
2680 }
Rubin Xu85c01f92014-10-13 12:49:54 +01002681 } else {
2682 // Exhaust all entries.
2683 break;
2684 }
2685 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002686 } else {
2687 /* Sadness, it's not there. Return the error */
Rubin Xu85c01f92014-10-13 12:49:54 +01002688 rc = CRYPTO_GETFIELD_ERROR_NO_FIELD;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002689 }
2690
2691out:
2692 return rc;
2693}
2694
2695/* Set the value of the specified field. */
Paul Crowley14c8c072018-09-18 13:30:21 -07002696int cryptfs_setfield(const char* fieldname, const char* value) {
Eric Biggersa701c452018-10-23 13:06:55 -07002697 if (fscrypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08002698 SLOGE("Cannot set field when file encrypted");
2699 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07002700 }
2701
Ken Sumrall160b4d62013-04-22 12:15:39 -07002702 char encrypted_state[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01002703 /* 0 is success, negative values are error */
2704 int rc = CRYPTO_SETFIELD_ERROR_OTHER;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002705 int encrypted = 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01002706 unsigned int field_id;
2707 char temp_field[PROPERTY_KEY_MAX];
2708 unsigned int num_entries;
2709 unsigned int max_keylen;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002710
2711 if (persist_data == NULL) {
2712 load_persistent_data();
2713 if (persist_data == NULL) {
2714 SLOGE("Setfield error, cannot load persistent data");
2715 goto out;
2716 }
2717 }
2718
2719 property_get("ro.crypto.state", encrypted_state, "");
Paul Crowley14c8c072018-09-18 13:30:21 -07002720 if (!strcmp(encrypted_state, "encrypted")) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07002721 encrypted = 1;
2722 }
2723
Rubin Xu85c01f92014-10-13 12:49:54 +01002724 // Compute the number of entries required to store value, each entry can store up to
2725 // (PROPERTY_VALUE_MAX - 1) chars
2726 if (strlen(value) == 0) {
2727 // Empty value also needs one entry to store.
2728 num_entries = 1;
2729 } else {
2730 num_entries = (strlen(value) + (PROPERTY_VALUE_MAX - 1) - 1) / (PROPERTY_VALUE_MAX - 1);
2731 }
2732
2733 max_keylen = strlen(fieldname);
2734 if (num_entries > 1) {
2735 // Need an extra "_%d" suffix.
2736 max_keylen += 1 + log10(num_entries);
2737 }
2738 if (max_keylen > PROPERTY_KEY_MAX - 1) {
2739 rc = CRYPTO_SETFIELD_ERROR_FIELD_TOO_LONG;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002740 goto out;
2741 }
2742
Rubin Xu85c01f92014-10-13 12:49:54 +01002743 // Make sure we have enough space to write the new value
2744 if (persist_data->persist_valid_entries + num_entries - persist_count_keys(fieldname) >
2745 persist_get_max_entries(encrypted)) {
2746 rc = CRYPTO_SETFIELD_ERROR_VALUE_TOO_LONG;
2747 goto out;
2748 }
2749
2750 // Now that we know persist_data has enough space for value, let's delete the old field first
2751 // to make up space.
2752 persist_del_keys(fieldname, 0);
2753
2754 if (persist_set_key(fieldname, value, encrypted)) {
2755 // fail to set key, should not happen as we have already checked the available space
2756 SLOGE("persist_set_key() error during setfield()");
2757 goto out;
2758 }
2759
2760 for (field_id = 1; field_id < num_entries; field_id++) {
Greg Kaiserb610e772018-02-09 09:19:54 -08002761 snprintf(temp_field, sizeof(temp_field), "%s_%u", fieldname, field_id);
Rubin Xu85c01f92014-10-13 12:49:54 +01002762
2763 if (persist_set_key(temp_field, value + field_id * (PROPERTY_VALUE_MAX - 1), encrypted)) {
2764 // fail to set key, should not happen as we have already checked the available space.
2765 SLOGE("persist_set_key() error during setfield()");
2766 goto out;
2767 }
2768 }
2769
Ken Sumrall160b4d62013-04-22 12:15:39 -07002770 /* If we are running encrypted, save the persistent data now */
2771 if (encrypted) {
2772 if (save_persistent_data()) {
2773 SLOGE("Setfield error, cannot save persistent data");
2774 goto out;
2775 }
2776 }
2777
Rubin Xu85c01f92014-10-13 12:49:54 +01002778 rc = CRYPTO_SETFIELD_OK;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002779
2780out:
2781 return rc;
2782}
Paul Lawrencef4faa572014-01-29 13:31:03 -08002783
2784/* Checks userdata. Attempt to mount the volume if default-
2785 * encrypted.
2786 * On success trigger next init phase and return 0.
2787 * Currently do not handle failure - see TODO below.
2788 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002789int cryptfs_mount_default_encrypted(void) {
Paul Lawrence84274cc2016-04-15 15:41:33 -07002790 int crypt_type = cryptfs_get_password_type();
2791 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
2792 SLOGE("Bad crypt type - error");
2793 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Crowley14c8c072018-09-18 13:30:21 -07002794 SLOGD(
2795 "Password is not default - "
2796 "starting min framework to prompt");
Paul Lawrence84274cc2016-04-15 15:41:33 -07002797 property_set("vold.decrypt", "trigger_restart_min_framework");
2798 return 0;
2799 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
2800 SLOGD("Password is default - restarting filesystem");
2801 cryptfs_restart_internal(0);
2802 return 0;
Paul Lawrencef4faa572014-01-29 13:31:03 -08002803 } else {
Paul Lawrence84274cc2016-04-15 15:41:33 -07002804 SLOGE("Encrypted, default crypt type but can't decrypt");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002805 }
2806
Paul Lawrence6bfed202014-07-28 12:47:22 -07002807 /** Corrupt. Allow us to boot into framework, which will detect bad
2808 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08002809 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002810 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002811 return 0;
2812}
2813
2814/* Returns type of the password, default, pattern, pin or password.
2815 */
Paul Crowley14c8c072018-09-18 13:30:21 -07002816int cryptfs_get_password_type(void) {
Eric Biggersa701c452018-10-23 13:06:55 -07002817 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002818 SLOGE("cryptfs_get_password_type not valid for file encryption");
2819 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002820 }
2821
Paul Lawrencef4faa572014-01-29 13:31:03 -08002822 struct crypt_mnt_ftr crypt_ftr;
2823
2824 if (get_crypt_ftr_and_key(&crypt_ftr)) {
2825 SLOGE("Error getting crypt footer and key\n");
2826 return -1;
2827 }
2828
Paul Lawrence6bfed202014-07-28 12:47:22 -07002829 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
2830 return -1;
2831 }
2832
Paul Lawrencef4faa572014-01-29 13:31:03 -08002833 return crypt_ftr.crypt_type;
2834}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002835
Paul Crowley14c8c072018-09-18 13:30:21 -07002836const char* cryptfs_get_password() {
Eric Biggersa701c452018-10-23 13:06:55 -07002837 if (fscrypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002838 SLOGE("cryptfs_get_password not valid for file encryption");
2839 return 0;
Paul Lawrence05335c32015-03-05 09:46:23 -08002840 }
2841
Paul Lawrence399317e2014-03-10 13:20:50 -07002842 struct timespec now;
Paul Lawrenceef2b5be2014-11-11 12:47:03 -08002843 clock_gettime(CLOCK_BOOTTIME, &now);
Paul Lawrence399317e2014-03-10 13:20:50 -07002844 if (now.tv_sec < password_expiry_time) {
2845 return password;
2846 } else {
2847 cryptfs_clear_password();
2848 return 0;
2849 }
2850}
2851
Paul Crowley14c8c072018-09-18 13:30:21 -07002852void cryptfs_clear_password() {
Paul Lawrence399317e2014-03-10 13:20:50 -07002853 if (password) {
2854 size_t len = strlen(password);
2855 memset(password, 0, len);
2856 free(password);
2857 password = 0;
2858 password_expiry_time = 0;
2859 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002860}
Paul Lawrence731a7a22015-04-28 22:14:15 +00002861
Paul Crowley14c8c072018-09-18 13:30:21 -07002862int cryptfs_isConvertibleToFBE() {
Tom Cherry4c5bde22019-01-29 14:34:01 -08002863 auto entry = GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT);
2864 return entry && entry->fs_mgr_flags.force_fde_or_fbe;
Paul Lawrence0c247462015-10-29 10:30:57 -07002865}