blob: 03d2afedb670f51a767c462bcb0e0e8eda140ced [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
17/* TO DO:
18 * 1. Perhaps keep several copies of the encrypted key, in case something
19 * goes horribly wrong?
20 *
21 */
22
23#include <sys/types.h>
Ken Sumralle550f782013-08-20 13:48:23 -070024#include <sys/wait.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080025#include <sys/stat.h>
Paul Lawrencef4faa572014-01-29 13:31:03 -080026#include <ctype.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080027#include <fcntl.h>
Elliott Hughes73737162014-06-25 17:27:42 -070028#include <inttypes.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080029#include <unistd.h>
30#include <stdio.h>
31#include <sys/ioctl.h>
32#include <linux/dm-ioctl.h>
33#include <libgen.h>
34#include <stdlib.h>
35#include <sys/param.h>
36#include <string.h>
37#include <sys/mount.h>
38#include <openssl/evp.h>
Adam Langley41405bb2015-01-22 16:45:28 -080039#include <openssl/sha.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080040#include <errno.h>
Paul Crowley3b71fc52017-10-09 10:55:21 -070041#include <ext4_utils/ext4_crypt.h>
Tao Bao5a95ddb2016-10-05 18:01:19 -070042#include <ext4_utils/ext4_utils.h>
Ken Sumrall29d8da82011-05-18 17:20:07 -070043#include <linux/kdev_t.h>
Ken Sumralle5032c42012-04-01 23:58:44 -070044#include <fs_mgr.h>
Paul Lawrence9c58a872014-09-30 09:12:51 -070045#include <time.h>
Rubin Xu85c01f92014-10-13 12:49:54 +010046#include <math.h>
Jeff Vander Stoepdf725752016-01-29 15:34:43 -080047#include <selinux/selinux.h>
Ken Sumrall8f869aa2010-12-03 03:47:09 -080048#include "cryptfs.h"
Jeff Vander Stoepdf725752016-01-29 15:34:43 -080049#include "secontext.h"
Ken Sumrall8f869aa2010-12-03 03:47:09 -080050#define LOG_TAG "Cryptfs"
51#include "cutils/log.h"
52#include "cutils/properties.h"
Ken Sumralladfba362013-06-04 16:37:52 -070053#include "cutils/android_reboot.h"
Ken Sumrall5d4c68e2011-01-30 19:06:03 -080054#include "hardware_legacy/power.h"
Ken Sumralle550f782013-08-20 13:48:23 -070055#include <logwrap/logwrap.h>
Paul Crowley63c18d32016-02-10 14:02:47 +000056#include "ScryptParameters.h"
Ken Sumrall29d8da82011-05-18 17:20:07 -070057#include "VolumeManager.h"
Ken Sumrall9caab762013-06-11 19:10:20 -070058#include "VoldUtil.h"
Paul Lawrence731a7a22015-04-28 22:14:15 +000059#include "Ext4Crypt.h"
Daniel Rosenberge82df162014-08-15 22:19:23 +000060#include "f2fs_sparseblock.h"
Paul Crowleyf71ace32016-06-02 11:01:19 -070061#include "EncryptInplace.h"
jessica_yu3f14fe42014-09-22 15:57:40 +080062#include "Process.h"
Janis Danisevskis015ec302017-01-31 11:31:08 +000063#include "Keymaster.h"
Wei Wang4375f1b2017-02-24 17:43:01 -080064#include "android-base/properties.h"
Yabin Cui1fb59662016-06-24 14:48:49 -070065#include <bootloader_message/bootloader_message.h>
AnilKumar Chimata98dc8352018-05-11 00:25:09 +053066#ifdef CONFIG_HW_DISK_ENCRYPTION
67#include <cryptfs_hw.h>
68#endif
Wei Wang4375f1b2017-02-24 17:43:01 -080069extern "C" {
70#include <crypto_scrypt.h>
71}
Mark Salyzyn3e971272014-01-21 13:27:04 -080072
Mark Salyzyn5eecc442014-02-12 14:16:14 -080073#define UNUSED __attribute__((unused))
74
Ken Sumrall8f869aa2010-12-03 03:47:09 -080075#define DM_CRYPT_BUF_SIZE 4096
76
Jason parks70a4b3f2011-01-28 10:10:47 -060077#define HASH_COUNT 2000
Greg Kaiserc0de9c72018-02-14 20:05:54 -080078
79constexpr size_t INTERMEDIATE_KEY_LEN_BYTES = 16;
80constexpr size_t INTERMEDIATE_IV_LEN_BYTES = 16;
81constexpr size_t INTERMEDIATE_BUF_SIZE =
82 (INTERMEDIATE_KEY_LEN_BYTES + INTERMEDIATE_IV_LEN_BYTES);
83
84// SCRYPT_LEN is used by struct crypt_mnt_ftr for its intermediate key.
85static_assert(INTERMEDIATE_BUF_SIZE == SCRYPT_LEN,
86 "Mismatch of intermediate key sizes");
Jason parks70a4b3f2011-01-28 10:10:47 -060087
Ken Sumrall29d8da82011-05-18 17:20:07 -070088#define KEY_IN_FOOTER "footer"
89
AnilKumar Chimata98dc8352018-05-11 00:25:09 +053090#define DEFAULT_HEX_PASSWORD "64656661756c745f70617373776f7264"
Paul Lawrence3bd36d52015-06-09 13:37:44 -070091#define DEFAULT_PASSWORD "default_password"
Paul Lawrencef4faa572014-01-29 13:31:03 -080092
Paul Lawrence3d99eba2015-11-20 07:07:19 -080093#define CRYPTO_BLOCK_DEVICE "userdata"
94
95#define BREADCRUMB_FILE "/data/misc/vold/convert_fde"
96
Ken Sumrall29d8da82011-05-18 17:20:07 -070097#define EXT4_FS 1
JP Abgrall62c7af32014-06-16 13:01:23 -070098#define F2FS_FS 2
Ken Sumrall29d8da82011-05-18 17:20:07 -070099
Ken Sumralle919efe2012-09-29 17:07:41 -0700100#define TABLE_LOAD_RETRIES 10
101
Shawn Willden47ba10d2014-09-03 17:07:06 -0600102#define RSA_KEY_SIZE 2048
103#define RSA_KEY_SIZE_BYTES (RSA_KEY_SIZE / 8)
104#define RSA_EXPONENT 0x10001
Shawn Willdenda6e8992015-06-03 09:40:45 -0600105#define KEYMASTER_CRYPTFS_RATE_LIMIT 1 // Maximum one try per second
AnilKumar Chimata98dc8352018-05-11 00:25:09 +0530106#define KEY_LEN_BYTES 16
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700107
Paul Lawrence8e3f4512014-09-08 10:11:17 -0700108#define RETRY_MOUNT_ATTEMPTS 10
109#define RETRY_MOUNT_DELAY_SECONDS 1
110
Paul Crowley5afbc622017-11-27 09:42:17 -0800111#define CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE (1)
112
Paul Crowley73473332017-11-21 15:43:51 -0800113static int put_crypt_ftr_and_key(struct crypt_mnt_ftr* crypt_ftr);
114
Greg Kaiser59ad0182018-02-16 13:01:36 -0800115static unsigned char saved_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -0700116static char *saved_mount_point;
Jason parks70a4b3f2011-01-28 10:10:47 -0600117static int master_key_saved = 0;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700118static struct crypt_persist_data *persist_data = NULL;
Ken Sumrall56ad03c2013-02-13 13:00:19 -0800119
AnilKumar Chimata98dc8352018-05-11 00:25:09 +0530120static int previous_type;
121
122#ifdef CONFIG_HW_DISK_ENCRYPTION
123static int scrypt_keymaster(const char *passwd, const unsigned char *salt,
124 unsigned char *ikey, void *params);
125static void convert_key_to_hex_ascii(const unsigned char *master_key,
126 unsigned int keysize, char *master_key_ascii);
127static int put_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr);
128static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
129 const char *passwd, const char *mount_point, const char *label);
130int cryptfs_changepw_hw_fde(int crypt_type, const char *currentpw,
131 const char *newpw);
132int cryptfs_check_passwd_hw(char *passwd);
133int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password,
134 unsigned char* master_key);
135
136static void convert_key_to_hex_ascii_for_upgrade(const unsigned char *master_key,
137 unsigned int keysize, char *master_key_ascii)
138{
139 unsigned int i, a;
140 unsigned char nibble;
141
142 for (i = 0, a = 0; i < keysize; i++, a += 2) {
143 /* For each byte, write out two ascii hex digits */
144 nibble = (master_key[i] >> 4) & 0xf;
145 master_key_ascii[a] = nibble + (nibble > 9 ? 0x57 : 0x30);
146
147 nibble = master_key[i] & 0xf;
148 master_key_ascii[a + 1] = nibble + (nibble > 9 ? 0x57 : 0x30);
149 }
150
151 /* Add the null termination */
152 master_key_ascii[a] = '\0';
153}
154
155static int get_keymaster_hw_fde_passwd(const char* passwd, unsigned char* newpw,
156 unsigned char* salt,
157 const struct crypt_mnt_ftr *ftr)
158{
159 /* if newpw updated, return 0
160 * if newpw not updated return -1
161 */
162 int rc = -1;
163
164 if (should_use_keymaster()) {
165 if (scrypt_keymaster(passwd, salt, newpw, (void*)ftr)) {
166 SLOGE("scrypt failed");
167 } else {
168 rc = 0;
169 }
170 }
171
172 return rc;
173}
174
175static int verify_hw_fde_passwd(const char *passwd, struct crypt_mnt_ftr* crypt_ftr)
176{
177 unsigned char newpw[32] = {0};
178 int key_index;
179 if (get_keymaster_hw_fde_passwd(passwd, newpw, crypt_ftr->salt, crypt_ftr))
180 key_index = set_hw_device_encryption_key(passwd,
181 (char*) crypt_ftr->crypto_type_name);
182 else
183 key_index = set_hw_device_encryption_key((const char*)newpw,
184 (char*) crypt_ftr->crypto_type_name);
185 return key_index;
186}
187
188static int verify_and_update_hw_fde_passwd(const char *passwd,
189 struct crypt_mnt_ftr* crypt_ftr)
190{
191 char* new_passwd = NULL;
192 unsigned char newpw[32] = {0};
193 int key_index = -1;
194 int passwd_updated = -1;
195 int ascii_passwd_updated = (crypt_ftr->flags & CRYPT_ASCII_PASSWORD_UPDATED);
196
197 key_index = verify_hw_fde_passwd(passwd, crypt_ftr);
198 if (key_index < 0) {
199 ++crypt_ftr->failed_decrypt_count;
200
201 if (ascii_passwd_updated) {
202 SLOGI("Ascii password was updated");
203 } else {
204 /* Code in else part would execute only once:
205 * When device is upgraded from L->M release.
206 * Once upgraded, code flow should never come here.
207 * L release passed actual password in hex, so try with hex
208 * Each nible of passwd was encoded as a byte, so allocate memory
209 * twice of password len plus one more byte for null termination
210 */
211 if (crypt_ftr->crypt_type == CRYPT_TYPE_DEFAULT) {
212 new_passwd = (char*)malloc(strlen(DEFAULT_HEX_PASSWORD) + 1);
213 if (new_passwd == NULL) {
214 SLOGE("System out of memory. Password verification incomplete");
215 goto out;
216 }
217 strlcpy(new_passwd, DEFAULT_HEX_PASSWORD, strlen(DEFAULT_HEX_PASSWORD) + 1);
218 } else {
219 new_passwd = (char*)malloc(strlen(passwd) * 2 + 1);
220 if (new_passwd == NULL) {
221 SLOGE("System out of memory. Password verification incomplete");
222 goto out;
223 }
224 convert_key_to_hex_ascii_for_upgrade((const unsigned char*)passwd,
225 strlen(passwd), new_passwd);
226 }
227 key_index = set_hw_device_encryption_key((const char*)new_passwd,
228 (char*) crypt_ftr->crypto_type_name);
229 if (key_index >=0) {
230 crypt_ftr->failed_decrypt_count = 0;
231 SLOGI("Hex password verified...will try to update with Ascii value");
232 /* Before updating password, tie that with keymaster to tie with ROT */
233
234 if (get_keymaster_hw_fde_passwd(passwd, newpw,
235 crypt_ftr->salt, crypt_ftr)) {
236 passwd_updated = update_hw_device_encryption_key(new_passwd,
237 passwd, (char*)crypt_ftr->crypto_type_name);
238 } else {
239 passwd_updated = update_hw_device_encryption_key(new_passwd,
240 (const char*)newpw, (char*)crypt_ftr->crypto_type_name);
241 }
242
243 if (passwd_updated >= 0) {
244 crypt_ftr->flags |= CRYPT_ASCII_PASSWORD_UPDATED;
245 SLOGI("Ascii password recorded and updated");
246 } else {
247 SLOGI("Passwd verified, could not update...Will try next time");
248 }
249 } else {
250 ++crypt_ftr->failed_decrypt_count;
251 }
252 free(new_passwd);
253 }
254 } else {
255 if (!ascii_passwd_updated)
256 crypt_ftr->flags |= CRYPT_ASCII_PASSWORD_UPDATED;
257 }
258out:
259 // update footer before leaving
260 put_crypt_ftr_and_key(crypt_ftr);
261 return key_index;
262}
263#endif
264
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700265/* Should we use keymaster? */
266static int keymaster_check_compatibility()
267{
Janis Danisevskis015ec302017-01-31 11:31:08 +0000268 return keymaster_compatibility_cryptfs_scrypt();
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700269}
270
271/* Create a new keymaster key and store it in this footer */
272static int keymaster_create_key(struct crypt_mnt_ftr *ftr)
273{
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800274 if (ftr->keymaster_blob_size) {
275 SLOGI("Already have key");
276 return 0;
277 }
278
Janis Danisevskis015ec302017-01-31 11:31:08 +0000279 int rc = keymaster_create_key_for_cryptfs_scrypt(RSA_KEY_SIZE, RSA_EXPONENT,
280 KEYMASTER_CRYPTFS_RATE_LIMIT, ftr->keymaster_blob, KEYMASTER_BLOB_SIZE,
281 &ftr->keymaster_blob_size);
282 if (rc) {
283 if (ftr->keymaster_blob_size > KEYMASTER_BLOB_SIZE) {
Paul Crowley73473332017-11-21 15:43:51 -0800284 SLOGE("Keymaster key blob too large");
Janis Danisevskis015ec302017-01-31 11:31:08 +0000285 ftr->keymaster_blob_size = 0;
286 }
287 SLOGE("Failed to generate keypair");
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700288 return -1;
289 }
Janis Danisevskis015ec302017-01-31 11:31:08 +0000290 return 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -0700291}
292
Shawn Willdene17a9c42014-09-08 13:04:08 -0600293/* This signs the given object using the keymaster key. */
294static int keymaster_sign_object(struct crypt_mnt_ftr *ftr,
Shawn Willden47ba10d2014-09-03 17:07:06 -0600295 const unsigned char *object,
296 const size_t object_size,
297 unsigned char **signature,
298 size_t *signature_size)
299{
Shawn Willden47ba10d2014-09-03 17:07:06 -0600300 unsigned char to_sign[RSA_KEY_SIZE_BYTES];
Shawn Willdene17a9c42014-09-08 13:04:08 -0600301 size_t to_sign_size = sizeof(to_sign);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600302 memset(to_sign, 0, RSA_KEY_SIZE_BYTES);
Shawn Willden47ba10d2014-09-03 17:07:06 -0600303
Shawn Willdene17a9c42014-09-08 13:04:08 -0600304 // To sign a message with RSA, the message must satisfy two
305 // constraints:
306 //
307 // 1. The message, when interpreted as a big-endian numeric value, must
308 // be strictly less than the public modulus of the RSA key. Note
309 // that because the most significant bit of the public modulus is
310 // guaranteed to be 1 (else it's an (n-1)-bit key, not an n-bit
311 // key), an n-bit message with most significant bit 0 always
312 // satisfies this requirement.
313 //
314 // 2. The message must have the same length in bits as the public
315 // modulus of the RSA key. This requirement isn't mathematically
316 // necessary, but is necessary to ensure consistency in
317 // implementations.
318 switch (ftr->kdf_type) {
Shawn Willdene17a9c42014-09-08 13:04:08 -0600319 case KDF_SCRYPT_KEYMASTER:
320 // This ensures the most significant byte of the signed message
321 // is zero. We could have zero-padded to the left instead, but
322 // this approach is slightly more robust against changes in
323 // object size. However, it's still broken (but not unusably
Shawn Willdenda6e8992015-06-03 09:40:45 -0600324 // so) because we really should be using a proper deterministic
325 // RSA padding function, such as PKCS1.
Wei Wang4375f1b2017-02-24 17:43:01 -0800326 memcpy(to_sign + 1, object, std::min((size_t)RSA_KEY_SIZE_BYTES - 1, object_size));
Shawn Willdene17a9c42014-09-08 13:04:08 -0600327 SLOGI("Signing safely-padded object");
328 break;
329 default:
330 SLOGE("Unknown KDF type %d", ftr->kdf_type);
Janis Danisevskis015ec302017-01-31 11:31:08 +0000331 return -1;
Shawn Willdene17a9c42014-09-08 13:04:08 -0600332 }
Paul Crowley73473332017-11-21 15:43:51 -0800333 for (;;) {
334 auto result = keymaster_sign_object_for_cryptfs_scrypt(
335 ftr->keymaster_blob, ftr->keymaster_blob_size, KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign,
336 to_sign_size, signature, signature_size);
337 switch (result) {
338 case KeymasterSignResult::ok:
339 return 0;
340 case KeymasterSignResult::upgrade:
341 break;
342 default:
343 return -1;
344 }
345 SLOGD("Upgrading key");
346 if (keymaster_upgrade_key_for_cryptfs_scrypt(
347 RSA_KEY_SIZE, RSA_EXPONENT, KEYMASTER_CRYPTFS_RATE_LIMIT, ftr->keymaster_blob,
348 ftr->keymaster_blob_size, ftr->keymaster_blob, KEYMASTER_BLOB_SIZE,
349 &ftr->keymaster_blob_size) != 0) {
350 SLOGE("Failed to upgrade key");
351 return -1;
352 }
353 if (put_crypt_ftr_and_key(ftr) != 0) {
354 SLOGE("Failed to write upgraded key to disk");
355 }
356 SLOGD("Key upgraded successfully");
357 }
Shawn Willden47ba10d2014-09-03 17:07:06 -0600358}
359
Paul Lawrence399317e2014-03-10 13:20:50 -0700360/* Store password when userdata is successfully decrypted and mounted.
361 * Cleared by cryptfs_clear_password
362 *
363 * To avoid a double prompt at boot, we need to store the CryptKeeper
364 * password and pass it to KeyGuard, which uses it to unlock KeyStore.
365 * Since the entire framework is torn down and rebuilt after encryption,
366 * we have to use a daemon or similar to store the password. Since vold
367 * is secured against IPC except from system processes, it seems a reasonable
368 * place to store this.
369 *
370 * password should be cleared once it has been used.
371 *
372 * password is aged out after password_max_age_seconds seconds.
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800373 */
Paul Lawrence399317e2014-03-10 13:20:50 -0700374static char* password = 0;
375static int password_expiry_time = 0;
376static const int password_max_age_seconds = 60;
Paul Lawrence684dbdf2014-02-07 12:07:22 -0800377
Josh Gaofec44372017-08-28 13:22:55 -0700378enum class RebootType {reboot, recovery, shutdown};
379static void cryptfs_reboot(RebootType rt)
Ken Sumralladfba362013-06-04 16:37:52 -0700380{
Josh Gaofec44372017-08-28 13:22:55 -0700381 switch (rt) {
382 case RebootType::reboot:
Paul Lawrence87999172014-02-20 12:21:31 -0800383 property_set(ANDROID_RB_PROPERTY, "reboot");
384 break;
385
Josh Gaofec44372017-08-28 13:22:55 -0700386 case RebootType::recovery:
Paul Lawrence87999172014-02-20 12:21:31 -0800387 property_set(ANDROID_RB_PROPERTY, "reboot,recovery");
388 break;
389
Josh Gaofec44372017-08-28 13:22:55 -0700390 case RebootType::shutdown:
Paul Lawrence87999172014-02-20 12:21:31 -0800391 property_set(ANDROID_RB_PROPERTY, "shutdown");
392 break;
Ken Sumralladfba362013-06-04 16:37:52 -0700393 }
Paul Lawrence87999172014-02-20 12:21:31 -0800394
Ken Sumralladfba362013-06-04 16:37:52 -0700395 sleep(20);
396
397 /* Shouldn't get here, reboot should happen before sleep times out */
398 return;
399}
400
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800401static void ioctl_init(struct dm_ioctl *io, size_t dataSize, const char *name, unsigned flags)
402{
403 memset(io, 0, dataSize);
404 io->data_size = dataSize;
405 io->data_start = sizeof(struct dm_ioctl);
406 io->version[0] = 4;
407 io->version[1] = 0;
408 io->version[2] = 0;
409 io->flags = flags;
410 if (name) {
Marek Pola5e6b9142015-02-05 14:22:34 +0100411 strlcpy(io->name, name, sizeof(io->name));
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800412 }
413}
414
Greg Kaiser38723f22018-02-16 13:35:35 -0800415namespace {
416
417struct CryptoType;
418
419// Use to get the CryptoType in use on this device.
420const CryptoType &get_crypto_type();
421
422struct CryptoType {
423 // We should only be constructing CryptoTypes as part of
424 // supported_crypto_types[]. We do it via this pseudo-builder pattern,
425 // which isn't pure or fully protected as a concession to being able to
426 // do it all at compile time. Add new CryptoTypes in
427 // supported_crypto_types[] below.
428 constexpr CryptoType() : CryptoType(nullptr, nullptr, 0xFFFFFFFF) {}
429 constexpr CryptoType set_keysize(uint32_t size) const {
430 return CryptoType(this->property_name, this->crypto_name, size);
431 }
432 constexpr CryptoType set_property_name(const char *property) const {
433 return CryptoType(property, this->crypto_name, this->keysize);
434 }
435 constexpr CryptoType set_crypto_name(const char *crypto) const {
436 return CryptoType(this->property_name, crypto, this->keysize);
437 }
438
439 constexpr const char *get_property_name() const { return property_name; }
440 constexpr const char *get_crypto_name() const { return crypto_name; }
441 constexpr uint32_t get_keysize() const { return keysize; }
442
443 private:
444 const char *property_name;
445 const char *crypto_name;
446 uint32_t keysize;
447
448 constexpr CryptoType(const char *property, const char *crypto,
449 uint32_t ksize)
450 : property_name(property), crypto_name(crypto), keysize(ksize) {}
451 friend const CryptoType &get_crypto_type();
452 static const CryptoType &get_device_crypto_algorithm();
453};
454
455// We only want to parse this read-only property once. But we need to wait
456// until the system is initialized before we can read it. So we use a static
457// scoped within this function to get it only once.
458const CryptoType &get_crypto_type() {
459 static CryptoType crypto_type = CryptoType::get_device_crypto_algorithm();
460 return crypto_type;
461}
462
463constexpr CryptoType default_crypto_type = CryptoType()
464 .set_property_name("AES-128-CBC")
465 .set_crypto_name("aes-cbc-essiv:sha256")
466 .set_keysize(16);
467
468constexpr CryptoType supported_crypto_types[] = {
469 default_crypto_type,
470 CryptoType()
471 .set_property_name("Speck128/128-XTS")
472 .set_crypto_name("speck128-xts-plain64")
473 .set_keysize(32),
474 // Add new CryptoTypes here. Order is not important.
475};
476
477
478// ---------- START COMPILE-TIME SANITY CHECK BLOCK -------------------------
479// We confirm all supported_crypto_types have a small enough keysize and
480// had both set_property_name() and set_crypto_name() called.
481
482template <typename T, size_t N>
483constexpr size_t array_length(T (&)[N]) { return N; }
484
485constexpr bool indexOutOfBoundsForCryptoTypes(size_t index) {
486 return (index >= array_length(supported_crypto_types));
487}
488
489constexpr bool isValidCryptoType(const CryptoType &crypto_type) {
490 return ((crypto_type.get_property_name() != nullptr) &&
491 (crypto_type.get_crypto_name() != nullptr) &&
492 (crypto_type.get_keysize() <= MAX_KEY_LEN));
493}
494
495// Note in C++11 that constexpr functions can only have a single line.
496// So our code is a bit convoluted (using recursion instead of a loop),
497// but it's asserting at compile time that all of our key lengths are valid.
498constexpr bool validateSupportedCryptoTypes(size_t index) {
499 return indexOutOfBoundsForCryptoTypes(index) ||
500 (isValidCryptoType(supported_crypto_types[index]) &&
501 validateSupportedCryptoTypes(index + 1));
502}
503
504static_assert(validateSupportedCryptoTypes(0),
505 "We have a CryptoType with keysize > MAX_KEY_LEN or which was "
506 "incompletely constructed.");
507// ---------- END COMPILE-TIME SANITY CHECK BLOCK -------------------------
508
509
510// Don't call this directly, use get_crypto_type(), which caches this result.
511const CryptoType &CryptoType::get_device_crypto_algorithm() {
512 constexpr char CRYPT_ALGO_PROP[] = "ro.crypto.fde_algorithm";
513 char paramstr[PROPERTY_VALUE_MAX];
514
515 property_get(CRYPT_ALGO_PROP, paramstr,
516 default_crypto_type.get_property_name());
517 for (auto const &ctype : supported_crypto_types) {
518 if (strcmp(paramstr, ctype.get_property_name()) == 0) {
519 return ctype;
520 }
521 }
522 ALOGE("Invalid name (%s) for %s. Defaulting to %s\n", paramstr,
523 CRYPT_ALGO_PROP, default_crypto_type.get_property_name());
524 return default_crypto_type;
525}
526
527} // namespace
528
529
530
Kenny Rootc4c70f12013-06-14 12:11:38 -0700531/**
532 * Gets the default device scrypt parameters for key derivation time tuning.
533 * The parameters should lead to about one second derivation time for the
534 * given device.
535 */
536static void get_device_scrypt_params(struct crypt_mnt_ftr *ftr) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700537 char paramstr[PROPERTY_VALUE_MAX];
Paul Crowley63c18d32016-02-10 14:02:47 +0000538 int Nf, rf, pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700539
Paul Crowley63c18d32016-02-10 14:02:47 +0000540 property_get(SCRYPT_PROP, paramstr, SCRYPT_DEFAULTS);
541 if (!parse_scrypt_parameters(paramstr, &Nf, &rf, &pf)) {
542 SLOGW("bad scrypt parameters '%s' should be like '12:8:1'; using defaults", paramstr);
543 parse_scrypt_parameters(SCRYPT_DEFAULTS, &Nf, &rf, &pf);
Kenny Rootc4c70f12013-06-14 12:11:38 -0700544 }
Paul Crowley63c18d32016-02-10 14:02:47 +0000545 ftr->N_factor = Nf;
546 ftr->r_factor = rf;
547 ftr->p_factor = pf;
Kenny Rootc4c70f12013-06-14 12:11:38 -0700548}
549
Greg Kaiser57f9af62018-02-16 13:13:58 -0800550uint32_t cryptfs_get_keysize() {
Greg Kaiser38723f22018-02-16 13:35:35 -0800551 return get_crypto_type().get_keysize();
Greg Kaiser57f9af62018-02-16 13:13:58 -0800552}
553
554const char *cryptfs_get_crypto_name() {
Greg Kaiser38723f22018-02-16 13:35:35 -0800555 return get_crypto_type().get_crypto_name();
Greg Kaiser57f9af62018-02-16 13:13:58 -0800556}
557
Ken Sumrall3ed82362011-01-28 23:31:16 -0800558static unsigned int get_fs_size(char *dev)
559{
560 int fd, block_size;
561 struct ext4_super_block sb;
562 off64_t len;
563
Jeff Sharkeyce6a9132015-04-08 21:07:21 -0700564 if ((fd = open(dev, O_RDONLY|O_CLOEXEC)) < 0) {
Ken Sumrall3ed82362011-01-28 23:31:16 -0800565 SLOGE("Cannot open device to get filesystem size ");
566 return 0;
567 }
568
569 if (lseek64(fd, 1024, SEEK_SET) < 0) {
570 SLOGE("Cannot seek to superblock");
571 return 0;
572 }
573
574 if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
575 SLOGE("Cannot read superblock");
576 return 0;
577 }
578
579 close(fd);
580
Daniel Rosenberge82df162014-08-15 22:19:23 +0000581 if (le32_to_cpu(sb.s_magic) != EXT4_SUPER_MAGIC) {
582 SLOGE("Not a valid ext4 superblock");
583 return 0;
584 }
Ken Sumrall3ed82362011-01-28 23:31:16 -0800585 block_size = 1024 << sb.s_log_block_size;
586 /* compute length in bytes */
587 len = ( ((off64_t)sb.s_blocks_count_hi << 32) + sb.s_blocks_count_lo) * block_size;
588
589 /* return length in sectors */
590 return (unsigned int) (len / 512);
591}
592
Ken Sumrall160b4d62013-04-22 12:15:39 -0700593static int get_crypt_ftr_info(char **metadata_fname, off64_t *off)
594{
595 static int cached_data = 0;
596 static off64_t cached_off = 0;
597 static char cached_metadata_fname[PROPERTY_VALUE_MAX] = "";
598 int fd;
599 char key_loc[PROPERTY_VALUE_MAX];
600 char real_blkdev[PROPERTY_VALUE_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -0700601 int rc = -1;
602
603 if (!cached_data) {
Paul Crowleye2ee1522017-09-26 14:05:26 -0700604 fs_mgr_get_crypt_info(fstab_default, key_loc, real_blkdev, sizeof(key_loc));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700605
606 if (!strcmp(key_loc, KEY_IN_FOOTER)) {
Jeff Sharkeyce6a9132015-04-08 21:07:21 -0700607 if ( (fd = open(real_blkdev, O_RDWR|O_CLOEXEC)) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700608 SLOGE("Cannot open real block device %s\n", real_blkdev);
609 return -1;
610 }
611
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +0900612 unsigned long nr_sec = 0;
613 get_blkdev_size(fd, &nr_sec);
614 if (nr_sec != 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700615 /* If it's an encrypted Android partition, the last 16 Kbytes contain the
616 * encryption info footer and key, and plenty of bytes to spare for future
617 * growth.
618 */
619 strlcpy(cached_metadata_fname, real_blkdev, sizeof(cached_metadata_fname));
620 cached_off = ((off64_t)nr_sec * 512) - CRYPT_FOOTER_OFFSET;
621 cached_data = 1;
622 } else {
623 SLOGE("Cannot get size of block device %s\n", real_blkdev);
624 }
625 close(fd);
626 } else {
627 strlcpy(cached_metadata_fname, key_loc, sizeof(cached_metadata_fname));
628 cached_off = 0;
629 cached_data = 1;
630 }
631 }
632
633 if (cached_data) {
634 if (metadata_fname) {
635 *metadata_fname = cached_metadata_fname;
636 }
637 if (off) {
638 *off = cached_off;
639 }
640 rc = 0;
641 }
642
643 return rc;
644}
645
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800646/* Set sha256 checksum in structure */
647static void set_ftr_sha(struct crypt_mnt_ftr *crypt_ftr)
648{
649 SHA256_CTX c;
650 SHA256_Init(&c);
651 memset(crypt_ftr->sha256, 0, sizeof(crypt_ftr->sha256));
652 SHA256_Update(&c, crypt_ftr, sizeof(*crypt_ftr));
653 SHA256_Final(crypt_ftr->sha256, &c);
654}
655
Ken Sumralle8744072011-01-18 22:01:55 -0800656/* key or salt can be NULL, in which case just skip writing that value. Useful to
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800657 * update the failed mount count but not change the key.
658 */
Ken Sumrall160b4d62013-04-22 12:15:39 -0700659static int put_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800660{
661 int fd;
Tim Murray8439dc92014-12-15 11:56:11 -0800662 unsigned int cnt;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700663 /* starting_off is set to the SEEK_SET offset
664 * where the crypto structure starts
665 */
666 off64_t starting_off;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800667 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700668 char *fname = NULL;
Ken Sumrall3be890f2011-09-14 16:53:46 -0700669 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800670
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800671 set_ftr_sha(crypt_ftr);
672
Ken Sumrall160b4d62013-04-22 12:15:39 -0700673 if (get_crypt_ftr_info(&fname, &starting_off)) {
674 SLOGE("Unable to get crypt_ftr_info\n");
675 return -1;
676 }
677 if (fname[0] != '/') {
Ken Sumralle5032c42012-04-01 23:58:44 -0700678 SLOGE("Unexpected value for crypto key location\n");
Ken Sumrall160b4d62013-04-22 12:15:39 -0700679 return -1;
680 }
Jeff Sharkeyce6a9132015-04-08 21:07:21 -0700681 if ( (fd = open(fname, O_RDWR | O_CREAT|O_CLOEXEC, 0600)) < 0) {
Ken Sumralle550f782013-08-20 13:48:23 -0700682 SLOGE("Cannot open footer file %s for put\n", fname);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700683 return -1;
684 }
685
686 /* Seek to the start of the crypt footer */
687 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
688 SLOGE("Cannot seek to real block device footer\n");
689 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800690 }
691
692 if ((cnt = write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
693 SLOGE("Cannot write real block device footer\n");
694 goto errout;
695 }
696
Ken Sumrall3be890f2011-09-14 16:53:46 -0700697 fstat(fd, &statbuf);
698 /* If the keys are kept on a raw block device, do not try to truncate it. */
Ken Sumralle550f782013-08-20 13:48:23 -0700699 if (S_ISREG(statbuf.st_mode)) {
Ken Sumrall29d8da82011-05-18 17:20:07 -0700700 if (ftruncate(fd, 0x4000)) {
Colin Cross59846b62014-02-06 20:34:29 -0800701 SLOGE("Cannot set footer file size\n");
Ken Sumralle8744072011-01-18 22:01:55 -0800702 goto errout;
703 }
704 }
705
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800706 /* Success! */
707 rc = 0;
708
709errout:
710 close(fd);
711 return rc;
712
713}
714
Paul Lawrence3d99eba2015-11-20 07:07:19 -0800715static bool check_ftr_sha(const struct crypt_mnt_ftr *crypt_ftr)
716{
717 struct crypt_mnt_ftr copy;
718 memcpy(&copy, crypt_ftr, sizeof(copy));
719 set_ftr_sha(&copy);
720 return memcmp(copy.sha256, crypt_ftr->sha256, sizeof(copy.sha256)) == 0;
721}
722
Ken Sumrall160b4d62013-04-22 12:15:39 -0700723static inline int unix_read(int fd, void* buff, int len)
724{
725 return TEMP_FAILURE_RETRY(read(fd, buff, len));
726}
727
728static inline int unix_write(int fd, const void* buff, int len)
729{
730 return TEMP_FAILURE_RETRY(write(fd, buff, len));
731}
732
733static void init_empty_persist_data(struct crypt_persist_data *pdata, int len)
734{
735 memset(pdata, 0, len);
736 pdata->persist_magic = PERSIST_DATA_MAGIC;
737 pdata->persist_valid_entries = 0;
738}
739
740/* A routine to update the passed in crypt_ftr to the lastest version.
741 * fd is open read/write on the device that holds the crypto footer and persistent
742 * data, crypt_ftr is a pointer to the struct to be updated, and offset is the
743 * absolute offset to the start of the crypt_mnt_ftr on the passed in fd.
744 */
745static void upgrade_crypt_ftr(int fd, struct crypt_mnt_ftr *crypt_ftr, off64_t offset)
746{
Kenny Root7434b312013-06-14 11:29:53 -0700747 int orig_major = crypt_ftr->major_version;
748 int orig_minor = crypt_ftr->minor_version;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700749
Kenny Root7434b312013-06-14 11:29:53 -0700750 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 0)) {
751 struct crypt_persist_data *pdata;
752 off64_t pdata_offset = offset + CRYPT_FOOTER_TO_PERSIST_OFFSET;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700753
Kenny Rootc4c70f12013-06-14 12:11:38 -0700754 SLOGW("upgrading crypto footer to 1.1");
755
Wei Wang4375f1b2017-02-24 17:43:01 -0800756 pdata = (crypt_persist_data *)malloc(CRYPT_PERSIST_DATA_SIZE);
Kenny Root7434b312013-06-14 11:29:53 -0700757 if (pdata == NULL) {
758 SLOGE("Cannot allocate persisent data\n");
759 return;
760 }
761 memset(pdata, 0, CRYPT_PERSIST_DATA_SIZE);
762
763 /* Need to initialize the persistent data area */
764 if (lseek64(fd, pdata_offset, SEEK_SET) == -1) {
765 SLOGE("Cannot seek to persisent data offset\n");
Henrik Baard91064632015-02-05 15:09:17 +0100766 free(pdata);
Kenny Root7434b312013-06-14 11:29:53 -0700767 return;
768 }
769 /* Write all zeros to the first copy, making it invalid */
770 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
771
772 /* Write a valid but empty structure to the second copy */
773 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
774 unix_write(fd, pdata, CRYPT_PERSIST_DATA_SIZE);
775
776 /* Update the footer */
777 crypt_ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
778 crypt_ftr->persist_data_offset[0] = pdata_offset;
779 crypt_ftr->persist_data_offset[1] = pdata_offset + CRYPT_PERSIST_DATA_SIZE;
780 crypt_ftr->minor_version = 1;
Henrik Baard91064632015-02-05 15:09:17 +0100781 free(pdata);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700782 }
783
Paul Lawrencef4faa572014-01-29 13:31:03 -0800784 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 1)) {
Kenny Rootc4c70f12013-06-14 12:11:38 -0700785 SLOGW("upgrading crypto footer to 1.2");
JP Abgrall7bdfa522013-11-15 13:42:56 -0800786 /* But keep the old kdf_type.
787 * It will get updated later to KDF_SCRYPT after the password has been verified.
788 */
Kenny Rootc4c70f12013-06-14 12:11:38 -0700789 crypt_ftr->kdf_type = KDF_PBKDF2;
790 get_device_scrypt_params(crypt_ftr);
791 crypt_ftr->minor_version = 2;
792 }
793
Paul Lawrencef4faa572014-01-29 13:31:03 -0800794 if ((crypt_ftr->major_version == 1) && (crypt_ftr->minor_version == 2)) {
795 SLOGW("upgrading crypto footer to 1.3");
796 crypt_ftr->crypt_type = CRYPT_TYPE_PASSWORD;
797 crypt_ftr->minor_version = 3;
798 }
799
Kenny Root7434b312013-06-14 11:29:53 -0700800 if ((orig_major != crypt_ftr->major_version) || (orig_minor != crypt_ftr->minor_version)) {
801 if (lseek64(fd, offset, SEEK_SET) == -1) {
802 SLOGE("Cannot seek to crypt footer\n");
803 return;
804 }
805 unix_write(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr));
Ken Sumrall160b4d62013-04-22 12:15:39 -0700806 }
Ken Sumrall160b4d62013-04-22 12:15:39 -0700807}
808
809
810static int get_crypt_ftr_and_key(struct crypt_mnt_ftr *crypt_ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800811{
812 int fd;
Tim Murray8439dc92014-12-15 11:56:11 -0800813 unsigned int cnt;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700814 off64_t starting_off;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800815 int rc = -1;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700816 char *fname = NULL;
Ken Sumrall29d8da82011-05-18 17:20:07 -0700817 struct stat statbuf;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800818
Ken Sumrall160b4d62013-04-22 12:15:39 -0700819 if (get_crypt_ftr_info(&fname, &starting_off)) {
820 SLOGE("Unable to get crypt_ftr_info\n");
821 return -1;
822 }
823 if (fname[0] != '/') {
Ken Sumralle5032c42012-04-01 23:58:44 -0700824 SLOGE("Unexpected value for crypto key location\n");
Ken Sumrall160b4d62013-04-22 12:15:39 -0700825 return -1;
826 }
Jeff Sharkeyce6a9132015-04-08 21:07:21 -0700827 if ( (fd = open(fname, O_RDWR|O_CLOEXEC)) < 0) {
Ken Sumralle550f782013-08-20 13:48:23 -0700828 SLOGE("Cannot open footer file %s for get\n", fname);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700829 return -1;
830 }
831
832 /* Make sure it's 16 Kbytes in length */
833 fstat(fd, &statbuf);
834 if (S_ISREG(statbuf.st_mode) && (statbuf.st_size != 0x4000)) {
835 SLOGE("footer file %s is not the expected size!\n", fname);
836 goto errout;
837 }
838
839 /* Seek to the start of the crypt footer */
840 if (lseek64(fd, starting_off, SEEK_SET) == -1) {
841 SLOGE("Cannot seek to real block device footer\n");
842 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800843 }
844
845 if ( (cnt = read(fd, crypt_ftr, sizeof(struct crypt_mnt_ftr))) != sizeof(struct crypt_mnt_ftr)) {
846 SLOGE("Cannot read real block device footer\n");
847 goto errout;
848 }
849
850 if (crypt_ftr->magic != CRYPT_MNT_MAGIC) {
Ken Sumrall29d8da82011-05-18 17:20:07 -0700851 SLOGE("Bad magic for real block device %s\n", fname);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800852 goto errout;
853 }
854
Kenny Rootc96a5f82013-06-14 12:08:28 -0700855 if (crypt_ftr->major_version != CURRENT_MAJOR_VERSION) {
856 SLOGE("Cannot understand major version %d real block device footer; expected %d\n",
857 crypt_ftr->major_version, CURRENT_MAJOR_VERSION);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800858 goto errout;
859 }
860
Greg Kaiser59ad0182018-02-16 13:01:36 -0800861 // We risk buffer overflows with oversized keys, so we just reject them.
862 // 0-sized keys are problematic (essentially by-passing encryption), and
863 // AES-CBC key wrapping only works for multiples of 16 bytes.
864 if ((crypt_ftr->keysize == 0) || ((crypt_ftr->keysize % 16) != 0) ||
865 (crypt_ftr->keysize > MAX_KEY_LEN)) {
866 SLOGE("Invalid keysize (%u) for block device %s; Must be non-zero, "
867 "divisible by 16, and <= %d\n", crypt_ftr->keysize, fname,
868 MAX_KEY_LEN);
869 goto errout;
870 }
871
Kenny Rootc96a5f82013-06-14 12:08:28 -0700872 if (crypt_ftr->minor_version > CURRENT_MINOR_VERSION) {
873 SLOGW("Warning: crypto footer minor version %d, expected <= %d, continuing...\n",
874 crypt_ftr->minor_version, CURRENT_MINOR_VERSION);
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800875 }
876
Ken Sumrall160b4d62013-04-22 12:15:39 -0700877 /* If this is a verion 1.0 crypt_ftr, make it a 1.1 crypt footer, and update the
878 * copy on disk before returning.
879 */
Kenny Rootc96a5f82013-06-14 12:08:28 -0700880 if (crypt_ftr->minor_version < CURRENT_MINOR_VERSION) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700881 upgrade_crypt_ftr(fd, crypt_ftr, starting_off);
Ken Sumralle8744072011-01-18 22:01:55 -0800882 }
883
Ken Sumrall8f869aa2010-12-03 03:47:09 -0800884 /* Success! */
885 rc = 0;
886
887errout:
888 close(fd);
889 return rc;
890}
891
Ken Sumrall160b4d62013-04-22 12:15:39 -0700892static int validate_persistent_data_storage(struct crypt_mnt_ftr *crypt_ftr)
893{
894 if (crypt_ftr->persist_data_offset[0] + crypt_ftr->persist_data_size >
895 crypt_ftr->persist_data_offset[1]) {
896 SLOGE("Crypt_ftr persist data regions overlap");
897 return -1;
898 }
899
900 if (crypt_ftr->persist_data_offset[0] >= crypt_ftr->persist_data_offset[1]) {
901 SLOGE("Crypt_ftr persist data region 0 starts after region 1");
902 return -1;
903 }
904
905 if (((crypt_ftr->persist_data_offset[1] + crypt_ftr->persist_data_size) -
906 (crypt_ftr->persist_data_offset[0] - CRYPT_FOOTER_TO_PERSIST_OFFSET)) >
907 CRYPT_FOOTER_OFFSET) {
908 SLOGE("Persistent data extends past crypto footer");
909 return -1;
910 }
911
912 return 0;
913}
914
915static int load_persistent_data(void)
916{
917 struct crypt_mnt_ftr crypt_ftr;
918 struct crypt_persist_data *pdata = NULL;
919 char encrypted_state[PROPERTY_VALUE_MAX];
920 char *fname;
921 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
931
932 /* If not encrypted, just allocate an empty table and initialize it */
933 property_get("ro.crypto.state", encrypted_state, "");
934 if (strcmp(encrypted_state, "encrypted") ) {
Wei Wang4375f1b2017-02-24 17:43:01 -0800935 pdata = (crypt_persist_data*)malloc(CRYPT_PERSIST_DATA_SIZE);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700936 if (pdata) {
937 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
938 persist_data = pdata;
939 return 0;
940 }
941 return -1;
942 }
943
944 if(get_crypt_ftr_and_key(&crypt_ftr)) {
945 return -1;
946 }
947
Paul Lawrence8561b5c2014-03-17 14:10:51 -0700948 if ((crypt_ftr.major_version < 1)
949 || (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -0700950 SLOGE("Crypt_ftr version doesn't support persistent data");
951 return -1;
952 }
953
954 if (get_crypt_ftr_info(&fname, NULL)) {
955 return -1;
956 }
957
958 ret = validate_persistent_data_storage(&crypt_ftr);
959 if (ret) {
960 return -1;
961 }
962
Jeff Sharkeyce6a9132015-04-08 21:07:21 -0700963 fd = open(fname, O_RDONLY|O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -0700964 if (fd < 0) {
965 SLOGE("Cannot open %s metadata file", fname);
966 return -1;
967 }
968
Wei Wang4375f1b2017-02-24 17:43:01 -0800969 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Paul Lawrence300dae72016-03-11 11:02:52 -0800970 if (pdata == NULL) {
971 SLOGE("Cannot allocate memory for persistent data");
972 goto err;
Ken Sumrall160b4d62013-04-22 12:15:39 -0700973 }
974
975 for (i = 0; i < 2; i++) {
976 if (lseek64(fd, crypt_ftr.persist_data_offset[i], SEEK_SET) < 0) {
977 SLOGE("Cannot seek to read persistent data on %s", fname);
978 goto err2;
979 }
980 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0){
981 SLOGE("Error reading persistent data on iteration %d", i);
982 goto err2;
983 }
984 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
985 found = 1;
986 break;
987 }
988 }
989
990 if (!found) {
991 SLOGI("Could not find valid persistent data, creating");
992 init_empty_persist_data(pdata, crypt_ftr.persist_data_size);
993 }
994
995 /* Success */
996 persist_data = pdata;
997 close(fd);
998 return 0;
999
1000err2:
1001 free(pdata);
1002
1003err:
1004 close(fd);
1005 return -1;
1006}
1007
1008static int save_persistent_data(void)
1009{
1010 struct crypt_mnt_ftr crypt_ftr;
1011 struct crypt_persist_data *pdata;
1012 char *fname;
1013 off64_t write_offset;
1014 off64_t erase_offset;
Ken Sumrall160b4d62013-04-22 12:15:39 -07001015 int fd;
1016 int ret;
1017
1018 if (persist_data == NULL) {
1019 SLOGE("No persistent data to save");
1020 return -1;
1021 }
1022
1023 if(get_crypt_ftr_and_key(&crypt_ftr)) {
1024 return -1;
1025 }
1026
Paul Lawrence8561b5c2014-03-17 14:10:51 -07001027 if ((crypt_ftr.major_version < 1)
1028 || (crypt_ftr.major_version == 1 && crypt_ftr.minor_version < 1)) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001029 SLOGE("Crypt_ftr version doesn't support persistent data");
1030 return -1;
1031 }
1032
1033 ret = validate_persistent_data_storage(&crypt_ftr);
1034 if (ret) {
1035 return -1;
1036 }
1037
1038 if (get_crypt_ftr_info(&fname, NULL)) {
1039 return -1;
1040 }
1041
Jeff Sharkeyce6a9132015-04-08 21:07:21 -07001042 fd = open(fname, O_RDWR|O_CLOEXEC);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001043 if (fd < 0) {
1044 SLOGE("Cannot open %s metadata file", fname);
1045 return -1;
1046 }
1047
Wei Wang4375f1b2017-02-24 17:43:01 -08001048 pdata = (crypt_persist_data*)malloc(crypt_ftr.persist_data_size);
Ken Sumrall160b4d62013-04-22 12:15:39 -07001049 if (pdata == NULL) {
1050 SLOGE("Cannot allocate persistant data");
1051 goto err;
1052 }
1053
1054 if (lseek64(fd, crypt_ftr.persist_data_offset[0], SEEK_SET) < 0) {
1055 SLOGE("Cannot seek to read persistent data on %s", fname);
1056 goto err2;
1057 }
1058
1059 if (unix_read(fd, pdata, crypt_ftr.persist_data_size) < 0) {
1060 SLOGE("Error reading persistent data before save");
1061 goto err2;
1062 }
1063
1064 if (pdata->persist_magic == PERSIST_DATA_MAGIC) {
1065 /* The first copy is the curent valid copy, so write to
1066 * the second copy and erase this one */
1067 write_offset = crypt_ftr.persist_data_offset[1];
1068 erase_offset = crypt_ftr.persist_data_offset[0];
1069 } else {
1070 /* The second copy must be the valid copy, so write to
1071 * the first copy, and erase the second */
1072 write_offset = crypt_ftr.persist_data_offset[0];
1073 erase_offset = crypt_ftr.persist_data_offset[1];
1074 }
1075
1076 /* Write the new copy first, if successful, then erase the old copy */
Björn Landström96dbee72015-01-20 12:43:56 +01001077 if (lseek64(fd, write_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001078 SLOGE("Cannot seek to write persistent data");
1079 goto err2;
1080 }
1081 if (unix_write(fd, persist_data, crypt_ftr.persist_data_size) ==
1082 (int) crypt_ftr.persist_data_size) {
Björn Landström96dbee72015-01-20 12:43:56 +01001083 if (lseek64(fd, erase_offset, SEEK_SET) < 0) {
Ken Sumrall160b4d62013-04-22 12:15:39 -07001084 SLOGE("Cannot seek to erase previous persistent data");
1085 goto err2;
1086 }
1087 fsync(fd);
1088 memset(pdata, 0, crypt_ftr.persist_data_size);
1089 if (unix_write(fd, pdata, crypt_ftr.persist_data_size) !=
1090 (int) crypt_ftr.persist_data_size) {
1091 SLOGE("Cannot write to erase previous persistent data");
1092 goto err2;
1093 }
1094 fsync(fd);
1095 } else {
1096 SLOGE("Cannot write to save persistent data");
1097 goto err2;
1098 }
1099
1100 /* Success */
1101 free(pdata);
1102 close(fd);
1103 return 0;
1104
1105err2:
1106 free(pdata);
1107err:
1108 close(fd);
1109 return -1;
1110}
1111
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001112/* Convert a binary key of specified length into an ascii hex string equivalent,
1113 * without the leading 0x and with null termination
1114 */
Jeff Sharkey9c484982015-03-31 10:35:33 -07001115static void convert_key_to_hex_ascii(const unsigned char *master_key,
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001116 unsigned int keysize, char *master_key_ascii) {
1117 unsigned int i, a;
1118 unsigned char nibble;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001119
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001120 for (i=0, a=0; i<keysize; i++, a+=2) {
1121 /* For each byte, write out two ascii hex digits */
1122 nibble = (master_key[i] >> 4) & 0xf;
1123 master_key_ascii[a] = nibble + (nibble > 9 ? 0x37 : 0x30);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001124
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001125 nibble = master_key[i] & 0xf;
1126 master_key_ascii[a+1] = nibble + (nibble > 9 ? 0x37 : 0x30);
1127 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001128
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001129 /* Add the null termination */
1130 master_key_ascii[a] = '\0';
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001131
1132}
1133
Jeff Sharkey9c484982015-03-31 10:35:33 -07001134static int load_crypto_mapping_table(struct crypt_mnt_ftr *crypt_ftr,
1135 const unsigned char *master_key, const char *real_blk_name,
1136 const char *name, int fd, const char *extra_params) {
Wei Wang4375f1b2017-02-24 17:43:01 -08001137 alignas(struct dm_ioctl) char buffer[DM_CRYPT_BUF_SIZE];
Ken Sumralldb5e0262013-02-05 17:39:48 -08001138 struct dm_ioctl *io;
1139 struct dm_target_spec *tgt;
1140 char *crypt_params;
Greg Kaiser59ad0182018-02-16 13:01:36 -08001141 // We need two ASCII characters to represent each byte, and need space for
1142 // the '\0' terminator.
1143 char master_key_ascii[MAX_KEY_LEN * 2 + 1];
George Burgess IV605d7ae2016-02-29 13:39:17 -08001144 size_t buff_offset;
Ken Sumralldb5e0262013-02-05 17:39:48 -08001145 int i;
1146
1147 io = (struct dm_ioctl *) buffer;
1148
1149 /* Load the mapping table for this device */
1150 tgt = (struct dm_target_spec *) &buffer[sizeof(struct dm_ioctl)];
1151
1152 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1153 io->target_count = 1;
1154 tgt->status = 0;
1155 tgt->sector_start = 0;
1156 tgt->length = crypt_ftr->fs_size;
Ken Sumralldb5e0262013-02-05 17:39:48 -08001157 crypt_params = buffer + sizeof(struct dm_ioctl) + sizeof(struct dm_target_spec);
George Burgess IV605d7ae2016-02-29 13:39:17 -08001158 buff_offset = crypt_params - buffer;
Paul Crowley5afbc622017-11-27 09:42:17 -08001159 SLOGI("Extra parameters for dm_crypt: %s\n", extra_params);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301160
1161#ifdef CONFIG_HW_DISK_ENCRYPTION
1162 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
1163 strlcpy(tgt->target_type, "req-crypt",DM_MAX_TYPE_NAME);
1164 if (is_ice_enabled())
1165 convert_key_to_hex_ascii(master_key, sizeof(int), master_key_ascii);
1166 else
1167 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
1168 }
1169 else {
1170 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
1171 strlcpy(tgt->target_type, "crypt", DM_MAX_TYPE_NAME);
1172 }
1173 snprintf(crypt_params, sizeof(buffer) - buff_offset, "%s %s 0 %s 0 %s 0",
1174 crypt_ftr->crypto_type_name, master_key_ascii,
1175 real_blk_name, extra_params);
1176
1177 SLOGI("target_type = %s", tgt->target_type);
1178 SLOGI("real_blk_name = %s, extra_params = %s", real_blk_name, extra_params);
1179#else
1180 convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii);
1181 strlcpy(tgt->target_type, "crypt", DM_MAX_TYPE_NAME);
George Burgess IV605d7ae2016-02-29 13:39:17 -08001182 snprintf(crypt_params, sizeof(buffer) - buff_offset, "%s %s 0 %s 0 %s",
1183 crypt_ftr->crypto_type_name, master_key_ascii, real_blk_name,
1184 extra_params);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301185#endif
1186
Ken Sumralldb5e0262013-02-05 17:39:48 -08001187 crypt_params += strlen(crypt_params) + 1;
1188 crypt_params = (char *) (((unsigned long)crypt_params + 7) & ~8); /* Align to an 8 byte boundary */
1189 tgt->next = crypt_params - buffer;
1190
1191 for (i = 0; i < TABLE_LOAD_RETRIES; i++) {
1192 if (! ioctl(fd, DM_TABLE_LOAD, io)) {
1193 break;
1194 }
1195 usleep(500000);
1196 }
1197
1198 if (i == TABLE_LOAD_RETRIES) {
1199 /* We failed to load the table, return an error */
1200 return -1;
1201 } else {
1202 return i + 1;
1203 }
1204}
1205
Ken Sumralldb5e0262013-02-05 17:39:48 -08001206static int get_dm_crypt_version(int fd, const char *name, int *version)
1207{
1208 char buffer[DM_CRYPT_BUF_SIZE];
1209 struct dm_ioctl *io;
1210 struct dm_target_versions *v;
Ken Sumralldb5e0262013-02-05 17:39:48 -08001211
1212 io = (struct dm_ioctl *) buffer;
1213
1214 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1215
1216 if (ioctl(fd, DM_LIST_VERSIONS, io)) {
1217 return -1;
1218 }
1219
1220 /* Iterate over the returned versions, looking for name of "crypt".
1221 * When found, get and return the version.
1222 */
1223 v = (struct dm_target_versions *) &buffer[sizeof(struct dm_ioctl)];
1224 while (v->next) {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301225#ifdef CONFIG_HW_DISK_ENCRYPTION
1226 if (! strcmp(v->name, "crypt") || ! strcmp(v->name, "req-crypt")) {
1227#else
Ken Sumralldb5e0262013-02-05 17:39:48 -08001228 if (! strcmp(v->name, "crypt")) {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301229#endif
Ken Sumralldb5e0262013-02-05 17:39:48 -08001230 /* We found the crypt driver, return the version, and get out */
1231 version[0] = v->version[0];
1232 version[1] = v->version[1];
1233 version[2] = v->version[2];
1234 return 0;
1235 }
1236 v = (struct dm_target_versions *)(((char *)v) + v->next);
1237 }
1238
1239 return -1;
1240}
1241
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301242#ifndef CONFIG_HW_DISK_ENCRYPTION
Paul Crowley5afbc622017-11-27 09:42:17 -08001243static std::string extra_params_as_string(const std::vector<std::string>& extra_params_vec) {
1244 if (extra_params_vec.empty()) return "";
1245 std::string extra_params = std::to_string(extra_params_vec.size());
1246 for (const auto& p : extra_params_vec) {
1247 extra_params.append(" ");
1248 extra_params.append(p);
1249 }
1250 return extra_params;
1251}
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301252#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001253
Paul Crowley5afbc622017-11-27 09:42:17 -08001254static int create_crypto_blk_dev(struct crypt_mnt_ftr* crypt_ftr, const unsigned char* master_key,
1255 const char* real_blk_name, char* crypto_blk_name, const char* name,
1256 uint32_t flags) {
1257 char buffer[DM_CRYPT_BUF_SIZE];
1258 struct dm_ioctl* io;
1259 unsigned int minor;
1260 int fd = 0;
1261 int err;
1262 int retval = -1;
1263 int version[3];
1264 int load_count;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301265#ifdef CONFIG_HW_DISK_ENCRYPTION
1266 char encrypted_state[PROPERTY_VALUE_MAX] = {0};
1267 char progress[PROPERTY_VALUE_MAX] = {0};
1268 const char *extra_params;
1269#else
Paul Crowley5afbc622017-11-27 09:42:17 -08001270 std::vector<std::string> extra_params_vec;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301271#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001272
Paul Crowley5afbc622017-11-27 09:42:17 -08001273 if ((fd = open("/dev/device-mapper", O_RDWR | O_CLOEXEC)) < 0) {
1274 SLOGE("Cannot open device-mapper\n");
1275 goto errout;
1276 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001277
Paul Crowley5afbc622017-11-27 09:42:17 -08001278 io = (struct dm_ioctl*)buffer;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001279
Paul Crowley5afbc622017-11-27 09:42:17 -08001280 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1281 err = ioctl(fd, DM_DEV_CREATE, io);
1282 if (err) {
1283 SLOGE("Cannot create dm-crypt device %s: %s\n", name, strerror(errno));
1284 goto errout;
1285 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001286
Paul Crowley5afbc622017-11-27 09:42:17 -08001287 /* Get the device status, in particular, the name of it's device file */
1288 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1289 if (ioctl(fd, DM_DEV_STATUS, io)) {
1290 SLOGE("Cannot retrieve dm-crypt device status\n");
1291 goto errout;
1292 }
1293 minor = (io->dev & 0xff) | ((io->dev >> 12) & 0xfff00);
1294 snprintf(crypto_blk_name, MAXPATHLEN, "/dev/block/dm-%u", minor);
Ken Sumralle919efe2012-09-29 17:07:41 -07001295
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301296#ifdef CONFIG_HW_DISK_ENCRYPTION
1297 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
1298 /* Set fde_enabled if either FDE completed or in-progress */
1299 property_get("ro.crypto.state", encrypted_state, ""); /* FDE completed */
1300 property_get("vold.encrypt_progress", progress, ""); /* FDE in progress */
1301 if (!strcmp(encrypted_state, "encrypted") || strcmp(progress, "")) {
1302 if (is_ice_enabled()) {
1303 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE)
1304 extra_params = "fde_enabled ice allow_encrypt_override";
1305 else
1306 extra_params = "fde_enabled ice";
1307 } else {
1308 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE)
1309 extra_params = "fde_enabled allow_encrypt_override";
1310 else
1311 extra_params = "fde_enabled";
1312 }
1313 } else {
1314 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE)
1315 extra_params = "fde_enabled allow_encrypt_override";
1316 else
1317 extra_params = "fde_enabled";
1318 }
1319 } else {
1320 extra_params = "";
1321 if (! get_dm_crypt_version(fd, name, version)) {
1322 /* Support for allow_discards was added in version 1.11.0 */
1323 if ((version[0] >= 2) || ((version[0] == 1) && (version[1] >= 11))) {
1324 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE)
1325 extra_params = "2 allow_discards allow_encrypt_override";
1326 else
1327 extra_params = "1 allow_discards";
1328 SLOGI("Enabling support for allow_discards in dmcrypt.\n");
1329 }
1330 }
1331 }
1332 load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name, fd,
1333 extra_params);
1334#else
Paul Crowley5afbc622017-11-27 09:42:17 -08001335 if (!get_dm_crypt_version(fd, name, version)) {
1336 /* Support for allow_discards was added in version 1.11.0 */
1337 if ((version[0] >= 2) || ((version[0] == 1) && (version[1] >= 11))) {
1338 extra_params_vec.emplace_back("allow_discards");
1339 }
1340 }
1341 if (flags & CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE) {
1342 extra_params_vec.emplace_back("allow_encrypt_override");
1343 }
1344 load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name, fd,
1345 extra_params_as_string(extra_params_vec).c_str());
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301346#endif
Paul Crowley5afbc622017-11-27 09:42:17 -08001347 if (load_count < 0) {
1348 SLOGE("Cannot load dm-crypt mapping table.\n");
1349 goto errout;
1350 } else if (load_count > 1) {
1351 SLOGI("Took %d tries to load dmcrypt table.\n", load_count);
1352 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001353
Paul Crowley5afbc622017-11-27 09:42:17 -08001354 /* Resume this device to activate it */
1355 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001356
Paul Crowley5afbc622017-11-27 09:42:17 -08001357 if (ioctl(fd, DM_DEV_SUSPEND, io)) {
1358 SLOGE("Cannot resume the dm-crypt device\n");
1359 goto errout;
1360 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001361
Paul Crowley5afbc622017-11-27 09:42:17 -08001362 /* We made it here with no errors. Woot! */
1363 retval = 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001364
1365errout:
1366 close(fd); /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
1367
1368 return retval;
1369}
1370
Wei Wang4375f1b2017-02-24 17:43:01 -08001371static int delete_crypto_blk_dev(const char *name)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001372{
1373 int fd;
1374 char buffer[DM_CRYPT_BUF_SIZE];
1375 struct dm_ioctl *io;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001376 int retval = -1;
1377
Jeff Sharkeyce6a9132015-04-08 21:07:21 -07001378 if ((fd = open("/dev/device-mapper", O_RDWR|O_CLOEXEC)) < 0 ) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001379 SLOGE("Cannot open device-mapper\n");
1380 goto errout;
1381 }
1382
1383 io = (struct dm_ioctl *) buffer;
1384
1385 ioctl_init(io, DM_CRYPT_BUF_SIZE, name, 0);
1386 if (ioctl(fd, DM_DEV_REMOVE, io)) {
1387 SLOGE("Cannot remove dm-crypt device\n");
1388 goto errout;
1389 }
1390
1391 /* We made it here with no errors. Woot! */
1392 retval = 0;
1393
1394errout:
1395 close(fd); /* If fd is <0 from a failed open call, it's safe to just ignore the close error */
1396
1397 return retval;
1398
1399}
1400
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001401static int pbkdf2(const char *passwd, const unsigned char *salt,
Paul Lawrencef4faa572014-01-29 13:31:03 -08001402 unsigned char *ikey, void *params UNUSED)
1403{
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001404 SLOGI("Using pbkdf2 for cryptfs KDF");
1405
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001406 /* Turn the password into a key and IV that can decrypt the master key */
Adam Langleybf0d9722015-11-04 14:51:39 -08001407 return PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001408 HASH_COUNT, INTERMEDIATE_BUF_SIZE,
Adam Langleybf0d9722015-11-04 14:51:39 -08001409 ikey) != 1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001410}
1411
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001412static int scrypt(const char *passwd, const unsigned char *salt,
Paul Lawrencef4faa572014-01-29 13:31:03 -08001413 unsigned char *ikey, void *params)
1414{
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001415 SLOGI("Using scrypt for cryptfs KDF");
1416
Kenny Rootc4c70f12013-06-14 12:11:38 -07001417 struct crypt_mnt_ftr *ftr = (struct crypt_mnt_ftr *) params;
1418
1419 int N = 1 << ftr->N_factor;
1420 int r = 1 << ftr->r_factor;
1421 int p = 1 << ftr->p_factor;
1422
1423 /* Turn the password into a key and IV that can decrypt the master key */
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001424 crypto_scrypt((const uint8_t*)passwd, strlen(passwd),
1425 salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001426 INTERMEDIATE_BUF_SIZE);
Paul Lawrencef4faa572014-01-29 13:31:03 -08001427
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001428 return 0;
Kenny Rootc4c70f12013-06-14 12:11:38 -07001429}
1430
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001431static int scrypt_keymaster(const char *passwd, const unsigned char *salt,
1432 unsigned char *ikey, void *params)
1433{
1434 SLOGI("Using scrypt with keymaster for cryptfs KDF");
1435
1436 int rc;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001437 size_t signature_size;
1438 unsigned char* signature;
1439 struct crypt_mnt_ftr *ftr = (struct crypt_mnt_ftr *) params;
1440
1441 int N = 1 << ftr->N_factor;
1442 int r = 1 << ftr->r_factor;
1443 int p = 1 << ftr->p_factor;
1444
Paul Lawrence3bd36d52015-06-09 13:37:44 -07001445 rc = crypto_scrypt((const uint8_t*)passwd, strlen(passwd),
1446 salt, SALT_LEN, N, r, p, ikey,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001447 INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001448
1449 if (rc) {
1450 SLOGE("scrypt failed");
1451 return -1;
1452 }
1453
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001454 if (keymaster_sign_object(ftr, ikey, INTERMEDIATE_BUF_SIZE,
Shawn Willdene17a9c42014-09-08 13:04:08 -06001455 &signature, &signature_size)) {
1456 SLOGE("Signing failed");
1457 return -1;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001458 }
1459
1460 rc = crypto_scrypt(signature, signature_size, salt, SALT_LEN,
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001461 N, r, p, ikey, INTERMEDIATE_BUF_SIZE);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001462 free(signature);
1463
1464 if (rc) {
1465 SLOGE("scrypt failed");
1466 return -1;
1467 }
1468
1469 return 0;
1470}
1471
1472static int encrypt_master_key(const char *passwd, const unsigned char *salt,
1473 const unsigned char *decrypted_master_key,
Kenny Rootc4c70f12013-06-14 12:11:38 -07001474 unsigned char *encrypted_master_key,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301475 struct crypt_mnt_ftr *crypt_ftr,
1476 bool create_keymaster_key)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001477{
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001478 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = { 0 };
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001479 EVP_CIPHER_CTX e_ctx;
1480 int encrypted_len, final_len;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001481 int rc = 0;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001482
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001483 /* Turn the password into an intermediate key and IV that can decrypt the master key */
Kenny Rootc4c70f12013-06-14 12:11:38 -07001484 get_device_scrypt_params(crypt_ftr);
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001485
1486 switch (crypt_ftr->kdf_type) {
1487 case KDF_SCRYPT_KEYMASTER:
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301488 if (create_keymaster_key && keymaster_create_key(crypt_ftr)) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001489 SLOGE("keymaster_create_key failed");
1490 return -1;
1491 }
1492
1493 if (scrypt_keymaster(passwd, salt, ikey, crypt_ftr)) {
1494 SLOGE("scrypt failed");
1495 return -1;
1496 }
1497 break;
1498
1499 case KDF_SCRYPT:
1500 if (scrypt(passwd, salt, ikey, crypt_ftr)) {
1501 SLOGE("scrypt failed");
1502 return -1;
1503 }
1504 break;
1505
1506 default:
1507 SLOGE("Invalid kdf_type");
Paul Lawrencef4faa572014-01-29 13:31:03 -08001508 return -1;
1509 }
Kenny Rootc4c70f12013-06-14 12:11:38 -07001510
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001511 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001512 EVP_CIPHER_CTX_init(&e_ctx);
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001513 if (! EVP_EncryptInit_ex(&e_ctx, EVP_aes_128_cbc(), NULL, ikey,
1514 ikey+INTERMEDIATE_KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001515 SLOGE("EVP_EncryptInit failed\n");
1516 return -1;
1517 }
1518 EVP_CIPHER_CTX_set_padding(&e_ctx, 0); /* Turn off padding as our data is block aligned */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001519
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001520 /* Encrypt the master key */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001521 if (! EVP_EncryptUpdate(&e_ctx, encrypted_master_key, &encrypted_len,
Greg Kaiser59ad0182018-02-16 13:01:36 -08001522 decrypted_master_key, crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001523 SLOGE("EVP_EncryptUpdate failed\n");
1524 return -1;
1525 }
Adam Langley889c4f12014-09-03 14:23:13 -07001526 if (! EVP_EncryptFinal_ex(&e_ctx, encrypted_master_key + encrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001527 SLOGE("EVP_EncryptFinal failed\n");
1528 return -1;
1529 }
1530
Greg Kaiser59ad0182018-02-16 13:01:36 -08001531 if (encrypted_len + final_len != static_cast<int>(crypt_ftr->keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001532 SLOGE("EVP_Encryption length check failed with %d, %d bytes\n", encrypted_len, final_len);
1533 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001534 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001535
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001536 /* Store the scrypt of the intermediate key, so we can validate if it's a
1537 password error or mount error when things go wrong.
1538 Note there's no need to check for errors, since if this is incorrect, we
1539 simply won't wipe userdata, which is the correct default behavior
1540 */
1541 int N = 1 << crypt_ftr->N_factor;
1542 int r = 1 << crypt_ftr->r_factor;
1543 int p = 1 << crypt_ftr->p_factor;
1544
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001545 rc = crypto_scrypt(ikey, INTERMEDIATE_KEY_LEN_BYTES,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001546 crypt_ftr->salt, sizeof(crypt_ftr->salt), N, r, p,
1547 crypt_ftr->scrypted_intermediate_key,
1548 sizeof(crypt_ftr->scrypted_intermediate_key));
1549
1550 if (rc) {
1551 SLOGE("encrypt_master_key: crypto_scrypt failed");
1552 }
1553
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001554 EVP_CIPHER_CTX_cleanup(&e_ctx);
1555
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001556 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001557}
1558
Paul Lawrence731a7a22015-04-28 22:14:15 +00001559static int decrypt_master_key_aux(const char *passwd, unsigned char *salt,
Greg Kaiser59ad0182018-02-16 13:01:36 -08001560 const unsigned char *encrypted_master_key,
1561 size_t keysize,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001562 unsigned char *decrypted_master_key,
1563 kdf_func kdf, void *kdf_params,
1564 unsigned char** intermediate_key,
1565 size_t* intermediate_key_size)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001566{
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001567 unsigned char ikey[INTERMEDIATE_BUF_SIZE] = { 0 };
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001568 EVP_CIPHER_CTX d_ctx;
1569 int decrypted_len, final_len;
1570
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001571 /* Turn the password into an intermediate key and IV that can decrypt the
1572 master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001573 if (kdf(passwd, salt, ikey, kdf_params)) {
1574 SLOGE("kdf failed");
1575 return -1;
1576 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001577
1578 /* Initialize the decryption engine */
Adam Langley889c4f12014-09-03 14:23:13 -07001579 EVP_CIPHER_CTX_init(&d_ctx);
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001580 if (! EVP_DecryptInit_ex(&d_ctx, EVP_aes_128_cbc(), NULL, ikey, ikey+INTERMEDIATE_KEY_LEN_BYTES)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001581 return -1;
1582 }
1583 EVP_CIPHER_CTX_set_padding(&d_ctx, 0); /* Turn off padding as our data is block aligned */
1584 /* Decrypt the master key */
1585 if (! EVP_DecryptUpdate(&d_ctx, decrypted_master_key, &decrypted_len,
Greg Kaiser59ad0182018-02-16 13:01:36 -08001586 encrypted_master_key, keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001587 return -1;
1588 }
Adam Langley889c4f12014-09-03 14:23:13 -07001589 if (! EVP_DecryptFinal_ex(&d_ctx, decrypted_master_key + decrypted_len, &final_len)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001590 return -1;
1591 }
1592
Greg Kaiser59ad0182018-02-16 13:01:36 -08001593 if (decrypted_len + final_len != static_cast<int>(keysize)) {
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001594 return -1;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001595 }
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001596
1597 /* Copy intermediate key if needed by params */
1598 if (intermediate_key && intermediate_key_size) {
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001599 *intermediate_key = (unsigned char*) malloc(INTERMEDIATE_KEY_LEN_BYTES);
Greg Kaisere8167af2016-04-20 10:50:15 -07001600 if (*intermediate_key) {
Greg Kaiserc0de9c72018-02-14 20:05:54 -08001601 memcpy(*intermediate_key, ikey, INTERMEDIATE_KEY_LEN_BYTES);
1602 *intermediate_key_size = INTERMEDIATE_KEY_LEN_BYTES;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001603 }
1604 }
1605
Thurston Hou Yeen Dang06dc3112016-07-18 14:16:37 -07001606 EVP_CIPHER_CTX_cleanup(&d_ctx);
1607
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001608 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001609}
1610
Kenny Rootc4c70f12013-06-14 12:11:38 -07001611static void get_kdf_func(struct crypt_mnt_ftr *ftr, kdf_func *kdf, void** kdf_params)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001612{
Paul Lawrencedb3730c2015-02-03 13:08:10 -08001613 if (ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07001614 *kdf = scrypt_keymaster;
1615 *kdf_params = ftr;
1616 } else if (ftr->kdf_type == KDF_SCRYPT) {
Kenny Rootc4c70f12013-06-14 12:11:38 -07001617 *kdf = scrypt;
1618 *kdf_params = ftr;
1619 } else {
1620 *kdf = pbkdf2;
1621 *kdf_params = NULL;
1622 }
1623}
1624
Paul Lawrence731a7a22015-04-28 22:14:15 +00001625static int decrypt_master_key(const char *passwd, unsigned char *decrypted_master_key,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001626 struct crypt_mnt_ftr *crypt_ftr,
1627 unsigned char** intermediate_key,
1628 size_t* intermediate_key_size)
Kenny Rootc4c70f12013-06-14 12:11:38 -07001629{
1630 kdf_func kdf;
1631 void *kdf_params;
1632 int ret;
1633
1634 get_kdf_func(crypt_ftr, &kdf, &kdf_params);
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001635 ret = decrypt_master_key_aux(passwd, crypt_ftr->salt, crypt_ftr->master_key,
Greg Kaiser59ad0182018-02-16 13:01:36 -08001636 crypt_ftr->keysize,
Paul Lawrenced0c7b172014-08-08 14:28:10 -07001637 decrypted_master_key, kdf, kdf_params,
1638 intermediate_key, intermediate_key_size);
Kenny Rootc4c70f12013-06-14 12:11:38 -07001639 if (ret != 0) {
1640 SLOGW("failure decrypting master key");
Kenny Rootc4c70f12013-06-14 12:11:38 -07001641 }
1642
1643 return ret;
1644}
1645
Wei Wang4375f1b2017-02-24 17:43:01 -08001646static int create_encrypted_random_key(const char *passwd, unsigned char *master_key, unsigned char *salt,
Kenny Rootc4c70f12013-06-14 12:11:38 -07001647 struct crypt_mnt_ftr *crypt_ftr) {
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001648 int fd;
Greg Kaiser59ad0182018-02-16 13:01:36 -08001649 unsigned char key_buf[MAX_KEY_LEN];
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001650
1651 /* Get some random bits for a key */
Jeff Sharkeyce6a9132015-04-08 21:07:21 -07001652 fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC);
Ken Sumralle8744072011-01-18 22:01:55 -08001653 read(fd, key_buf, sizeof(key_buf));
1654 read(fd, salt, SALT_LEN);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001655 close(fd);
1656
1657 /* Now encrypt it with the password */
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301658 return encrypt_master_key(passwd, salt, key_buf, master_key, crypt_ftr, true);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001659}
1660
Paul Lawrence2f32cda2015-05-05 14:28:25 -07001661int wait_and_unmount(const char *mountpoint, bool kill)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001662{
Greg Hackmann955653e2014-09-24 14:55:20 -07001663 int i, err, rc;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301664#define WAIT_UNMOUNT_COUNT 200
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001665
1666 /* Now umount the tmpfs filesystem */
1667 for (i=0; i<WAIT_UNMOUNT_COUNT; i++) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001668 if (umount(mountpoint) == 0) {
1669 break;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001670 }
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001671
1672 if (errno == EINVAL) {
1673 /* EINVAL is returned if the directory is not a mountpoint,
1674 * i.e. there is no filesystem mounted there. So just get out.
1675 */
1676 break;
1677 }
1678
1679 err = errno;
1680
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301681 /* If allowed, be increasingly aggressive before the last 2 seconds */
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001682 if (kill) {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301683 if (i == (WAIT_UNMOUNT_COUNT - 30)) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001684 SLOGW("sending SIGHUP to processes with open files\n");
Jeff Sharkey3472e522017-10-06 18:02:53 -06001685 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGTERM);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301686 } else if (i == (WAIT_UNMOUNT_COUNT - 20)) {
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001687 SLOGW("sending SIGKILL to processes with open files\n");
Jeff Sharkey3472e522017-10-06 18:02:53 -06001688 android::vold::KillProcessesWithOpenFiles(mountpoint, SIGKILL);
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001689 }
1690 }
1691
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301692 usleep(100000);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001693 }
1694
1695 if (i < WAIT_UNMOUNT_COUNT) {
1696 SLOGD("unmounting %s succeeded\n", mountpoint);
1697 rc = 0;
1698 } else {
Jeff Sharkey3472e522017-10-06 18:02:53 -06001699 android::vold::KillProcessesWithOpenFiles(mountpoint, 0);
Greg Hackmann955653e2014-09-24 14:55:20 -07001700 SLOGE("unmounting %s failed: %s\n", mountpoint, strerror(err));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001701 rc = -1;
1702 }
1703
1704 return rc;
1705}
1706
Wei Wang42e38102017-06-07 10:46:12 -07001707static void prep_data_fs(void)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001708{
Jeff Sharkey47695b22016-02-01 17:02:29 -07001709 // NOTE: post_fs_data results in init calling back around to vold, so all
1710 // callers to this method must be async
1711
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001712 /* Do the prep of the /data filesystem */
1713 property_set("vold.post_fs_data_done", "0");
1714 property_set("vold.decrypt", "trigger_post_fs_data");
Wei Wang42e38102017-06-07 10:46:12 -07001715 SLOGD("Just triggered post_fs_data");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001716
Ken Sumrallc5872692013-05-14 15:26:31 -07001717 /* Wait a max of 50 seconds, hopefully it takes much less */
Wei Wang42e38102017-06-07 10:46:12 -07001718 while (!android::base::WaitForProperty("vold.post_fs_data_done",
Wei Wang4375f1b2017-02-24 17:43:01 -08001719 "1",
Wei Wang42e38102017-06-07 10:46:12 -07001720 std::chrono::seconds(15))) {
1721 /* We timed out to prep /data in time. Continue wait. */
1722 SLOGE("waited 15s for vold.post_fs_data_done, still waiting...");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001723 }
Wei Wang42e38102017-06-07 10:46:12 -07001724 SLOGD("post_fs_data done");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08001725}
1726
Paul Lawrence74f29f12014-08-28 15:54:10 -07001727static void cryptfs_set_corrupt()
1728{
1729 // Mark the footer as bad
1730 struct crypt_mnt_ftr crypt_ftr;
1731 if (get_crypt_ftr_and_key(&crypt_ftr)) {
1732 SLOGE("Failed to get crypto footer - panic");
1733 return;
1734 }
1735
1736 crypt_ftr.flags |= CRYPT_DATA_CORRUPT;
1737 if (put_crypt_ftr_and_key(&crypt_ftr)) {
1738 SLOGE("Failed to set crypto footer - panic");
1739 return;
1740 }
1741}
1742
1743static void cryptfs_trigger_restart_min_framework()
1744{
1745 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
1746 SLOGE("Failed to mount tmpfs on data - panic");
1747 return;
1748 }
1749
1750 if (property_set("vold.decrypt", "trigger_post_fs_data")) {
1751 SLOGE("Failed to trigger post fs data - panic");
1752 return;
1753 }
1754
1755 if (property_set("vold.decrypt", "trigger_restart_min_framework")) {
1756 SLOGE("Failed to trigger restart min framework - panic");
1757 return;
1758 }
1759}
1760
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001761/* returns < 0 on failure */
Paul Lawrencef4faa572014-01-29 13:31:03 -08001762static int cryptfs_restart_internal(int restart_main)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001763{
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001764 char crypto_blkdev[MAXPATHLEN];
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301765#ifdef CONFIG_HW_DISK_ENCRYPTION
1766 char blkdev[MAXPATHLEN];
1767#endif
Tim Murray8439dc92014-12-15 11:56:11 -08001768 int rc = -1;
Ken Sumrall0cc16632011-01-18 20:32:26 -08001769 static int restart_successful = 0;
1770
1771 /* Validate that it's OK to call this routine */
Jason parks70a4b3f2011-01-28 10:10:47 -06001772 if (! master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08001773 SLOGE("Encrypted filesystem not validated, aborting");
1774 return -1;
1775 }
1776
1777 if (restart_successful) {
1778 SLOGE("System already restarted with encrypted disk, aborting");
1779 return -1;
1780 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001781
Paul Lawrencef4faa572014-01-29 13:31:03 -08001782 if (restart_main) {
1783 /* Here is where we shut down the framework. The init scripts
1784 * start all services in one of three classes: core, main or late_start.
1785 * On boot, we start core and main. Now, we stop main, but not core,
1786 * as core includes vold and a few other really important things that
1787 * we need to keep running. Once main has stopped, we should be able
1788 * to umount the tmpfs /data, then mount the encrypted /data.
1789 * We then restart the class main, and also the class late_start.
1790 * At the moment, I've only put a few things in late_start that I know
1791 * are not needed to bring up the framework, and that also cause problems
1792 * with unmounting the tmpfs /data, but I hope to add add more services
1793 * to the late_start class as we optimize this to decrease the delay
1794 * till the user is asked for the password to the filesystem.
1795 */
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001796
Paul Lawrencef4faa572014-01-29 13:31:03 -08001797 /* The init files are setup to stop the class main when vold.decrypt is
1798 * set to trigger_reset_main.
1799 */
1800 property_set("vold.decrypt", "trigger_reset_main");
1801 SLOGD("Just asked init to shut down class main\n");
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001802
Paul Lawrencef4faa572014-01-29 13:31:03 -08001803 /* Ugh, shutting down the framework is not synchronous, so until it
1804 * can be fixed, this horrible hack will wait a moment for it all to
1805 * shut down before proceeding. Without it, some devices cannot
1806 * restart the graphics services.
1807 */
1808 sleep(2);
1809 }
Ken Sumrall9dedfd42012-10-09 14:16:59 -07001810
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001811 /* Now that the framework is shutdown, we should be able to umount()
1812 * the tmpfs filesystem, and mount the real one.
1813 */
1814
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301815#if defined(CONFIG_HW_DISK_ENCRYPTION)
1816#if defined(CONFIG_HW_DISK_ENCRYPT_PERF)
1817 if (is_ice_enabled()) {
1818 fs_mgr_get_crypt_info(fstab_default, 0, blkdev, sizeof(blkdev));
1819 if (set_ice_param(START_ENCDEC)) {
1820 SLOGE("Failed to set ICE data");
1821 return -1;
1822 }
1823 }
1824#else
1825 property_get("ro.crypto.fs_crypto_blkdev", blkdev, "");
1826 if (strlen(blkdev) == 0) {
1827 SLOGE("fs_crypto_blkdev not set\n");
1828 return -1;
1829 }
1830 if (!(rc = wait_and_unmount(DATA_MNT_POINT, true))) {
1831#endif
1832#else
Ken Sumrall6864b7e2011-01-14 15:20:02 -08001833 property_get("ro.crypto.fs_crypto_blkdev", crypto_blkdev, "");
1834 if (strlen(crypto_blkdev) == 0) {
1835 SLOGE("fs_crypto_blkdev not set\n");
1836 return -1;
1837 }
1838
Greg Hackmann6e8440f2014-10-02 17:18:20 -07001839 if (! (rc = wait_and_unmount(DATA_MNT_POINT, true)) ) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301840#endif
Doug Zongker6fd57712013-12-17 09:43:23 -08001841 /* If ro.crypto.readonly is set to 1, mount the decrypted
1842 * filesystem readonly. This is used when /data is mounted by
1843 * recovery mode.
1844 */
1845 char ro_prop[PROPERTY_VALUE_MAX];
1846 property_get("ro.crypto.readonly", ro_prop, "");
Jeff Sharkey95440eb2017-09-18 18:19:28 -06001847 if (strlen(ro_prop) > 0 && std::stoi(ro_prop)) {
Paul Crowleye2ee1522017-09-26 14:05:26 -07001848 struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab_default, DATA_MNT_POINT);
Doug Zongker6fd57712013-12-17 09:43:23 -08001849 rec->flags |= MS_RDONLY;
1850 }
JP Abgrall62c7af32014-06-16 13:01:23 -07001851
Ken Sumralle5032c42012-04-01 23:58:44 -07001852 /* If that succeeded, then mount the decrypted filesystem */
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001853 int retries = RETRY_MOUNT_ATTEMPTS;
1854 int mount_rc;
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001855
1856 /*
1857 * fs_mgr_do_mount runs fsck. Use setexeccon to run trusted
1858 * partitions in the fsck domain.
1859 */
1860 if (setexeccon(secontextFsck())){
1861 SLOGE("Failed to setexeccon");
1862 return -1;
1863 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301864#ifdef CONFIG_HW_DISK_ENCRYPTION
1865 while ((mount_rc = fs_mgr_do_mount(fstab_default, DATA_MNT_POINT,
1866 blkdev, 0))
1867 != 0) {
1868#else
Paul Crowleye2ee1522017-09-26 14:05:26 -07001869 while ((mount_rc = fs_mgr_do_mount(fstab_default, DATA_MNT_POINT,
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001870 crypto_blkdev, 0))
1871 != 0) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301872#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001873 if (mount_rc == FS_MGR_DOMNT_BUSY) {
1874 /* TODO: invoke something similar to
1875 Process::killProcessWithOpenFiles(DATA_MNT_POINT,
1876 retries > RETRY_MOUNT_ATTEMPT/2 ? 1 : 2 ) */
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301877#ifdef CONFIG_HW_DISK_ENCRYPTION
1878 SLOGI("Failed to mount %s because it is busy - waiting",
1879 blkdev);
1880#else
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001881 SLOGI("Failed to mount %s because it is busy - waiting",
1882 crypto_blkdev);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301883#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001884 if (--retries) {
1885 sleep(RETRY_MOUNT_DELAY_SECONDS);
1886 } else {
1887 /* Let's hope that a reboot clears away whatever is keeping
1888 the mount busy */
Josh Gaofec44372017-08-28 13:22:55 -07001889 cryptfs_reboot(RebootType::reboot);
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001890 }
1891 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301892#ifdef CONFIG_HW_DISK_ENCRYPTION
1893 if (--retries) {
1894 sleep(RETRY_MOUNT_DELAY_SECONDS);
1895 } else {
1896 SLOGE("Failed to mount decrypted data");
1897 cryptfs_set_corrupt();
1898 cryptfs_trigger_restart_min_framework();
1899 SLOGI("Started framework to offer wipe");
1900 return -1;
1901 }
1902#else
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001903 SLOGE("Failed to mount decrypted data");
1904 cryptfs_set_corrupt();
1905 cryptfs_trigger_restart_min_framework();
1906 SLOGI("Started framework to offer wipe");
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001907 if (setexeccon(NULL)) {
1908 SLOGE("Failed to setexeccon");
1909 }
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001910 return -1;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05301911#endif
Paul Lawrence8e3f4512014-09-08 10:11:17 -07001912 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07001913 }
Jeff Vander Stoepdf725752016-01-29 15:34:43 -08001914 if (setexeccon(NULL)) {
1915 SLOGE("Failed to setexeccon");
1916 return -1;
1917 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001918
Ken Sumralle5032c42012-04-01 23:58:44 -07001919 /* Create necessary paths on /data */
Wei Wang42e38102017-06-07 10:46:12 -07001920 prep_data_fs();
Seigo Nonakae2ef0c02016-06-20 17:05:40 +09001921 property_set("vold.decrypt", "trigger_load_persist_props");
Ken Sumralle5032c42012-04-01 23:58:44 -07001922
1923 /* startup service classes main and late_start */
1924 property_set("vold.decrypt", "trigger_restart_framework");
1925 SLOGD("Just triggered restart_framework\n");
1926
1927 /* Give it a few moments to get started */
1928 sleep(1);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301929#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001930 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05301931#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001932
Ken Sumrall0cc16632011-01-18 20:32:26 -08001933 if (rc == 0) {
1934 restart_successful = 1;
1935 }
1936
Ken Sumrall8f869aa2010-12-03 03:47:09 -08001937 return rc;
1938}
1939
Paul Lawrencef4faa572014-01-29 13:31:03 -08001940int cryptfs_restart(void)
1941{
Paul Lawrence05335c32015-03-05 09:46:23 -08001942 SLOGI("cryptfs_restart");
Paul Crowley38132a12016-02-09 09:50:32 +00001943 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08001944 SLOGE("cryptfs_restart not valid for file encryption:");
1945 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08001946 }
1947
Paul Lawrencef4faa572014-01-29 13:31:03 -08001948 /* Call internal implementation forcing a restart of main service group */
1949 return cryptfs_restart_internal(1);
1950}
1951
Wei Wang4375f1b2017-02-24 17:43:01 -08001952static int do_crypto_complete(const char *mount_point)
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001953{
1954 struct crypt_mnt_ftr crypt_ftr;
Ken Sumrall29d8da82011-05-18 17:20:07 -07001955 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumralle1a45852011-12-14 21:24:27 -08001956 char key_loc[PROPERTY_VALUE_MAX];
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001957
1958 property_get("ro.crypto.state", encrypted_state, "");
1959 if (strcmp(encrypted_state, "encrypted") ) {
1960 SLOGE("not running with encryption, aborting");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001961 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001962 }
1963
Paul Lawrence7b6b5652016-02-02 11:14:59 -08001964 // crypto_complete is full disk encrypted status
Paul Crowley38132a12016-02-09 09:50:32 +00001965 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08001966 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Paul Lawrence05335c32015-03-05 09:46:23 -08001967 }
1968
Ken Sumrall160b4d62013-04-22 12:15:39 -07001969 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Crowleye2ee1522017-09-26 14:05:26 -07001970 fs_mgr_get_crypt_info(fstab_default, key_loc, 0, sizeof(key_loc));
Ken Sumralle5032c42012-04-01 23:58:44 -07001971
Ken Sumralle1a45852011-12-14 21:24:27 -08001972 /*
1973 * Only report this error if key_loc is a file and it exists.
1974 * If the device was never encrypted, and /data is not mountable for
1975 * some reason, returning 1 should prevent the UI from presenting the
1976 * a "enter password" screen, or worse, a "press button to wipe the
1977 * device" screen.
1978 */
1979 if ((key_loc[0] == '/') && (access("key_loc", F_OK) == -1)) {
1980 SLOGE("master key file does not exist, aborting");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001981 return CRYPTO_COMPLETE_NOT_ENCRYPTED;
Ken Sumralle1a45852011-12-14 21:24:27 -08001982 } else {
1983 SLOGE("Error getting crypt footer and key\n");
Paul Lawrence74f29f12014-08-28 15:54:10 -07001984 return CRYPTO_COMPLETE_BAD_METADATA;
Ken Sumralle1a45852011-12-14 21:24:27 -08001985 }
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08001986 }
1987
Paul Lawrence74f29f12014-08-28 15:54:10 -07001988 // Test for possible error flags
1989 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS){
1990 SLOGE("Encryption process is partway completed\n");
1991 return CRYPTO_COMPLETE_PARTIAL;
1992 }
1993
1994 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE){
1995 SLOGE("Encryption process was interrupted but cannot continue\n");
1996 return CRYPTO_COMPLETE_INCONSISTENT;
1997 }
1998
1999 if (crypt_ftr.flags & CRYPT_DATA_CORRUPT){
2000 SLOGE("Encryption is successful but data is corrupt\n");
2001 return CRYPTO_COMPLETE_CORRUPT;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002002 }
2003
2004 /* We passed the test! We shall diminish, and return to the west */
Paul Lawrence74f29f12014-08-28 15:54:10 -07002005 return CRYPTO_COMPLETE_ENCRYPTED;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002006}
2007
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302008#ifdef CONFIG_HW_DISK_ENCRYPTION
2009static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
2010 const char *passwd, const char *mount_point, const char *label)
2011{
2012 /* Allocate enough space for a 256 bit key, but we may use less */
2013 unsigned char decrypted_master_key[32];
2014 char crypto_blkdev[MAXPATHLEN];
2015 char real_blkdev[MAXPATHLEN];
2016 unsigned int orig_failed_decrypt_count;
2017 int rc = 0;
2018
2019 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2020 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
2021
2022 fs_mgr_get_crypt_info(fstab_default, 0, real_blkdev, sizeof(real_blkdev));
2023
2024 int key_index = 0;
2025 if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) {
2026 key_index = verify_and_update_hw_fde_passwd(passwd, crypt_ftr);
2027 if (key_index < 0) {
2028 rc = crypt_ftr->failed_decrypt_count;
2029 goto errout;
2030 }
2031 else {
2032 if (is_ice_enabled()) {
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302033#ifndef CONFIG_HW_DISK_ENCRYPT_PERF
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302034 if (create_crypto_blk_dev(crypt_ftr, (unsigned char*)&key_index,
2035 real_blkdev, crypto_blkdev, label, 0)) {
2036 SLOGE("Error creating decrypted block device");
2037 rc = -1;
2038 goto errout;
2039 }
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302040#endif
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302041 } else {
2042 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key,
2043 real_blkdev, crypto_blkdev, label, 0)) {
2044 SLOGE("Error creating decrypted block device");
2045 rc = -1;
2046 goto errout;
2047 }
2048 }
2049 }
2050 }
2051
2052 if (rc == 0) {
2053 crypt_ftr->failed_decrypt_count = 0;
2054 if (orig_failed_decrypt_count != 0) {
2055 put_crypt_ftr_and_key(crypt_ftr);
2056 }
2057
2058 /* Save the name of the crypto block device
2059 * so we can mount it when restarting the framework. */
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302060#ifdef CONFIG_HW_DISK_ENCRYPT_PERF
2061 if (!is_ice_enabled())
2062#endif
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302063 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev);
2064 master_key_saved = 1;
2065 }
2066
2067 errout:
2068 return rc;
2069}
2070#endif
2071
2072
Paul Lawrencef4faa572014-01-29 13:31:03 -08002073static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr,
Wei Wang4375f1b2017-02-24 17:43:01 -08002074 const char *passwd, const char *mount_point, const char *label)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002075{
Greg Kaiser59ad0182018-02-16 13:01:36 -08002076 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002077 char crypto_blkdev[MAXPATHLEN];
2078 char real_blkdev[MAXPATHLEN];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002079 char tmp_mount_point[64];
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002080 unsigned int orig_failed_decrypt_count;
2081 int rc;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002082 int use_keymaster = 0;
2083 int upgrade = 0;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002084 unsigned char* intermediate_key = 0;
2085 size_t intermediate_key_size = 0;
Wei Wang4375f1b2017-02-24 17:43:01 -08002086 int N = 1 << crypt_ftr->N_factor;
2087 int r = 1 << crypt_ftr->r_factor;
2088 int p = 1 << crypt_ftr->p_factor;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002089
Paul Lawrencef4faa572014-01-29 13:31:03 -08002090 SLOGD("crypt_ftr->fs_size = %lld\n", crypt_ftr->fs_size);
2091 orig_failed_decrypt_count = crypt_ftr->failed_decrypt_count;
Ken Sumrall0cc16632011-01-18 20:32:26 -08002092
Paul Lawrencef4faa572014-01-29 13:31:03 -08002093 if (! (crypt_ftr->flags & CRYPT_MNT_KEY_UNENCRYPTED) ) {
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002094 if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr,
2095 &intermediate_key, &intermediate_key_size)) {
JP Abgrall7bdfa522013-11-15 13:42:56 -08002096 SLOGE("Failed to decrypt master key\n");
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002097 rc = -1;
2098 goto errout;
JP Abgrall7bdfa522013-11-15 13:42:56 -08002099 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002100 }
2101
Paul Crowleye2ee1522017-09-26 14:05:26 -07002102 fs_mgr_get_crypt_info(fstab_default, 0, real_blkdev, sizeof(real_blkdev));
Paul Lawrencef4faa572014-01-29 13:31:03 -08002103
Paul Lawrence74f29f12014-08-28 15:54:10 -07002104 // Create crypto block device - all (non fatal) code paths
2105 // need it
Paul Crowley5afbc622017-11-27 09:42:17 -08002106 if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev, label, 0)) {
2107 SLOGE("Error creating decrypted block device\n");
2108 rc = -1;
2109 goto errout;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002110 }
2111
Paul Lawrence74f29f12014-08-28 15:54:10 -07002112 /* Work out if the problem is the password or the data */
2113 unsigned char scrypted_intermediate_key[sizeof(crypt_ftr->
2114 scrypted_intermediate_key)];
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002115
Paul Lawrence74f29f12014-08-28 15:54:10 -07002116 rc = crypto_scrypt(intermediate_key, intermediate_key_size,
2117 crypt_ftr->salt, sizeof(crypt_ftr->salt),
2118 N, r, p, scrypted_intermediate_key,
2119 sizeof(scrypted_intermediate_key));
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002120
Paul Lawrence74f29f12014-08-28 15:54:10 -07002121 // Does the key match the crypto footer?
2122 if (rc == 0 && memcmp(scrypted_intermediate_key,
2123 crypt_ftr->scrypted_intermediate_key,
2124 sizeof(scrypted_intermediate_key)) == 0) {
2125 SLOGI("Password matches");
2126 rc = 0;
2127 } else {
2128 /* Try mounting the file system anyway, just in case the problem's with
2129 * the footer, not the key. */
George Burgess IV605d7ae2016-02-29 13:39:17 -08002130 snprintf(tmp_mount_point, sizeof(tmp_mount_point), "%s/tmp_mnt",
2131 mount_point);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002132 mkdir(tmp_mount_point, 0755);
Paul Crowleye2ee1522017-09-26 14:05:26 -07002133 if (fs_mgr_do_mount(fstab_default, DATA_MNT_POINT, crypto_blkdev, tmp_mount_point)) {
Paul Lawrence74f29f12014-08-28 15:54:10 -07002134 SLOGE("Error temp mounting decrypted block device\n");
2135 delete_crypto_blk_dev(label);
2136
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002137 rc = ++crypt_ftr->failed_decrypt_count;
2138 put_crypt_ftr_and_key(crypt_ftr);
Paul Lawrence74f29f12014-08-28 15:54:10 -07002139 } else {
2140 /* Success! */
2141 SLOGI("Password did not match but decrypted drive mounted - continue");
2142 umount(tmp_mount_point);
2143 rc = 0;
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002144 }
Paul Lawrence74f29f12014-08-28 15:54:10 -07002145 }
2146
2147 if (rc == 0) {
2148 crypt_ftr->failed_decrypt_count = 0;
Paul Lawrence72b8b822014-10-05 12:57:37 -07002149 if (orig_failed_decrypt_count != 0) {
2150 put_crypt_ftr_and_key(crypt_ftr);
2151 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002152
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002153 /* Save the name of the crypto block device
Paul Lawrence74f29f12014-08-28 15:54:10 -07002154 * so we can mount it when restarting the framework. */
Ken Sumrall6864b7e2011-01-14 15:20:02 -08002155 property_set("ro.crypto.fs_crypto_blkdev", crypto_blkdev);
Jason parks70a4b3f2011-01-28 10:10:47 -06002156
2157 /* Also save a the master key so we can reencrypted the key
Paul Lawrence74f29f12014-08-28 15:54:10 -07002158 * the key when we want to change the password on it. */
Greg Kaiser59ad0182018-02-16 13:01:36 -08002159 memcpy(saved_master_key, decrypted_master_key, crypt_ftr->keysize);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002160 saved_mount_point = strdup(mount_point);
Jason parks70a4b3f2011-01-28 10:10:47 -06002161 master_key_saved = 1;
JP Abgrall7bdfa522013-11-15 13:42:56 -08002162 SLOGD("%s(): Master key saved\n", __FUNCTION__);
Ken Sumrall6864b7e2011-01-14 15:20:02 -08002163 rc = 0;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002164
Paul Lawrence74f29f12014-08-28 15:54:10 -07002165 // Upgrade if we're not using the latest KDF.
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002166 use_keymaster = keymaster_check_compatibility();
2167 if (crypt_ftr->kdf_type == KDF_SCRYPT_KEYMASTER) {
Shawn Willden47ba10d2014-09-03 17:07:06 -06002168 // Don't allow downgrade
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002169 } else if (use_keymaster == 1 && crypt_ftr->kdf_type != KDF_SCRYPT_KEYMASTER) {
2170 crypt_ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
2171 upgrade = 1;
2172 } else if (use_keymaster == 0 && crypt_ftr->kdf_type != KDF_SCRYPT) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002173 crypt_ftr->kdf_type = KDF_SCRYPT;
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002174 upgrade = 1;
2175 }
2176
2177 if (upgrade) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002178 rc = encrypt_master_key(passwd, crypt_ftr->salt, saved_master_key,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302179 crypt_ftr->master_key, crypt_ftr, true);
JP Abgrall7bdfa522013-11-15 13:42:56 -08002180 if (!rc) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08002181 rc = put_crypt_ftr_and_key(crypt_ftr);
JP Abgrall7bdfa522013-11-15 13:42:56 -08002182 }
2183 SLOGD("Key Derivation Function upgrade: rc=%d\n", rc);
Paul Lawrenceb2f682b2014-09-08 11:28:19 -07002184
2185 // Do not fail even if upgrade failed - machine is bootable
2186 // Note that if this code is ever hit, there is a *serious* problem
2187 // since KDFs should never fail. You *must* fix the kdf before
2188 // proceeding!
2189 if (rc) {
2190 SLOGW("Upgrade failed with error %d,"
2191 " but continuing with previous state",
2192 rc);
2193 rc = 0;
2194 }
JP Abgrall7bdfa522013-11-15 13:42:56 -08002195 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002196 }
2197
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002198 errout:
2199 if (intermediate_key) {
2200 memset(intermediate_key, 0, intermediate_key_size);
2201 free(intermediate_key);
2202 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002203 return rc;
2204}
2205
Ken Sumrall29d8da82011-05-18 17:20:07 -07002206/*
Jeff Sharkey9c484982015-03-31 10:35:33 -07002207 * Called by vold when it's asked to mount an encrypted external
2208 * storage volume. The incoming partition has no crypto header/footer,
Greg Kaiser57f9af62018-02-16 13:13:58 -08002209 * as any metadata is been stored in a separate, small partition. We
2210 * assume it must be using our same crypt type and keysize.
Jeff Sharkey9c484982015-03-31 10:35:33 -07002211 *
2212 * out_crypto_blkdev must be MAXPATHLEN.
Ken Sumrall29d8da82011-05-18 17:20:07 -07002213 */
Jeff Sharkey9c484982015-03-31 10:35:33 -07002214int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev,
Greg Kaiser57f9af62018-02-16 13:13:58 -08002215 const unsigned char* key, char* out_crypto_blkdev) {
Jeff Sharkeyce6a9132015-04-08 21:07:21 -07002216 int fd = open(real_blkdev, O_RDONLY|O_CLOEXEC);
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +09002217 if (fd == -1) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07002218 SLOGE("Failed to open %s: %s", real_blkdev, strerror(errno));
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +09002219 return -1;
2220 }
2221
2222 unsigned long nr_sec = 0;
2223 get_blkdev_size(fd, &nr_sec);
Ken Sumrall29d8da82011-05-18 17:20:07 -07002224 close(fd);
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +09002225
Ken Sumrall29d8da82011-05-18 17:20:07 -07002226 if (nr_sec == 0) {
Jeff Sharkey9c484982015-03-31 10:35:33 -07002227 SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno));
Ken Sumrall29d8da82011-05-18 17:20:07 -07002228 return -1;
2229 }
2230
Jeff Sharkey9c484982015-03-31 10:35:33 -07002231 struct crypt_mnt_ftr ext_crypt_ftr;
2232 memset(&ext_crypt_ftr, 0, sizeof(ext_crypt_ftr));
2233 ext_crypt_ftr.fs_size = nr_sec;
Greg Kaiser57f9af62018-02-16 13:13:58 -08002234 ext_crypt_ftr.keysize = cryptfs_get_keysize();
2235 strlcpy((char*) ext_crypt_ftr.crypto_type_name, cryptfs_get_crypto_name(),
Jeff Sharkey32ebb732017-03-27 16:18:50 -06002236 MAX_CRYPTO_TYPE_NAME_LEN);
Paul Crowley385cb8c2018-03-29 13:27:23 -07002237 uint32_t flags = 0;
2238 if (e4crypt_is_native() &&
2239 android::base::GetBoolProperty("ro.crypto.allow_encrypt_override", false))
2240 flags |= CREATE_CRYPTO_BLK_DEV_FLAGS_ALLOW_ENCRYPT_OVERRIDE;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002241
Paul Crowley385cb8c2018-03-29 13:27:23 -07002242 return create_crypto_blk_dev(&ext_crypt_ftr, key, real_blkdev, out_crypto_blkdev, label, flags);
Jeff Sharkey9c484982015-03-31 10:35:33 -07002243}
Ken Sumrall29d8da82011-05-18 17:20:07 -07002244
Jeff Sharkey9c484982015-03-31 10:35:33 -07002245/*
2246 * Called by vold when it's asked to unmount an encrypted external
2247 * storage volume.
2248 */
2249int cryptfs_revert_ext_volume(const char* label) {
2250 return delete_crypto_blk_dev((char*) label);
Ken Sumrall29d8da82011-05-18 17:20:07 -07002251}
2252
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002253int cryptfs_crypto_complete(void)
2254{
2255 return do_crypto_complete("/data");
2256}
2257
Paul Lawrencef4faa572014-01-29 13:31:03 -08002258int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr)
2259{
2260 char encrypted_state[PROPERTY_VALUE_MAX];
2261 property_get("ro.crypto.state", encrypted_state, "");
2262 if ( master_key_saved || strcmp(encrypted_state, "encrypted") ) {
2263 SLOGE("encrypted fs already validated or not running with encryption,"
2264 " aborting");
2265 return -1;
2266 }
2267
2268 if (get_crypt_ftr_and_key(crypt_ftr)) {
2269 SLOGE("Error getting crypt footer and key");
2270 return -1;
2271 }
2272
2273 return 0;
2274}
2275
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302276#ifdef CONFIG_HW_DISK_ENCRYPTION
2277int cryptfs_check_passwd_hw(const char* passwd)
2278{
2279 struct crypt_mnt_ftr crypt_ftr;
2280 int rc;
2281 unsigned char master_key[KEY_LEN_BYTES];
2282
2283 /* get key */
2284 if (get_crypt_ftr_and_key(&crypt_ftr)) {
2285 SLOGE("Error getting crypt footer and key");
2286 return -1;
2287 }
2288
2289 /*
2290 * in case of manual encryption (from GUI), the encryption is done with
2291 * default password
2292 */
2293 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2294 /* compare scrypted_intermediate_key with stored scrypted_intermediate_key
2295 * which was created with actual password before reboot.
2296 */
2297 rc = cryptfs_get_master_key(&crypt_ftr, passwd, master_key);
2298 if (rc) {
2299 SLOGE("password doesn't match");
2300 rc = ++crypt_ftr.failed_decrypt_count;
2301 put_crypt_ftr_and_key(&crypt_ftr);
2302 return rc;
2303 }
2304
2305 rc = test_mount_hw_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD,
2306 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2307
2308 if (rc) {
2309 SLOGE("Default password did not match on reboot encryption");
2310 return rc;
2311 }
2312
2313 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2314 put_crypt_ftr_and_key(&crypt_ftr);
2315 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
2316 if (rc) {
2317 SLOGE("Could not change password on reboot encryption");
2318 return rc;
2319 }
2320 } else
2321 rc = test_mount_hw_encrypted_fs(&crypt_ftr, passwd,
2322 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2323
2324 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2325 cryptfs_clear_password();
2326 password = strdup(passwd);
2327 struct timespec now;
2328 clock_gettime(CLOCK_BOOTTIME, &now);
2329 password_expiry_time = now.tv_sec + password_max_age_seconds;
2330 }
2331
2332 return rc;
2333}
2334#endif
2335
Wei Wang4375f1b2017-02-24 17:43:01 -08002336int cryptfs_check_passwd(const char *passwd)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002337{
Paul Lawrence05335c32015-03-05 09:46:23 -08002338 SLOGI("cryptfs_check_passwd");
Paul Crowley38132a12016-02-09 09:50:32 +00002339 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002340 SLOGE("cryptfs_check_passwd not valid for file encryption");
2341 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002342 }
2343
Paul Lawrencef4faa572014-01-29 13:31:03 -08002344 struct crypt_mnt_ftr crypt_ftr;
2345 int rc;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002346
Paul Lawrencef4faa572014-01-29 13:31:03 -08002347 rc = check_unmounted_and_get_ftr(&crypt_ftr);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002348 if (rc) {
2349 SLOGE("Could not get footer");
Paul Lawrencef4faa572014-01-29 13:31:03 -08002350 return rc;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002351 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002352
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302353#ifdef CONFIG_HW_DISK_ENCRYPTION
2354 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
2355 return cryptfs_check_passwd_hw(passwd);
2356#endif
2357
Paul Lawrence3bd36d52015-06-09 13:37:44 -07002358 rc = test_mount_encrypted_fs(&crypt_ftr, passwd,
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002359 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302360
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002361 if (rc) {
2362 SLOGE("Password did not match");
2363 return rc;
2364 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002365
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002366 if (crypt_ftr.flags & CRYPT_FORCE_COMPLETE) {
2367 // Here we have a default actual password but a real password
2368 // we must test against the scrypted value
2369 // First, we must delete the crypto block device that
2370 // test_mount_encrypted_fs leaves behind as a side effect
2371 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
2372 rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD,
2373 DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE);
2374 if (rc) {
2375 SLOGE("Default password did not match on reboot encryption");
2376 return rc;
2377 }
2378
2379 crypt_ftr.flags &= ~CRYPT_FORCE_COMPLETE;
2380 put_crypt_ftr_and_key(&crypt_ftr);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302381 rc = cryptfs_changepw(crypt_ftr.crypt_type, DEFAULT_PASSWORD, passwd);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002382 if (rc) {
2383 SLOGE("Could not change password on reboot encryption");
2384 return rc;
2385 }
2386 }
2387
2388 if (crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
Paul Lawrence399317e2014-03-10 13:20:50 -07002389 cryptfs_clear_password();
2390 password = strdup(passwd);
2391 struct timespec now;
2392 clock_gettime(CLOCK_BOOTTIME, &now);
2393 password_expiry_time = now.tv_sec + password_max_age_seconds;
Paul Lawrence684dbdf2014-02-07 12:07:22 -08002394 }
2395
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002396 return rc;
2397}
2398
Jeff Sharkey83b559c2017-09-12 16:30:52 -06002399int cryptfs_verify_passwd(const char *passwd)
Ken Sumrall3ad90722011-10-04 20:38:29 -07002400{
2401 struct crypt_mnt_ftr crypt_ftr;
Greg Kaiser59ad0182018-02-16 13:01:36 -08002402 unsigned char decrypted_master_key[MAX_KEY_LEN];
Ken Sumrall3ad90722011-10-04 20:38:29 -07002403 char encrypted_state[PROPERTY_VALUE_MAX];
2404 int rc;
2405
2406 property_get("ro.crypto.state", encrypted_state, "");
2407 if (strcmp(encrypted_state, "encrypted") ) {
2408 SLOGE("device not encrypted, aborting");
2409 return -2;
2410 }
2411
2412 if (!master_key_saved) {
2413 SLOGE("encrypted fs not yet mounted, aborting");
2414 return -1;
2415 }
2416
2417 if (!saved_mount_point) {
2418 SLOGE("encrypted fs failed to save mount point, aborting");
2419 return -1;
2420 }
2421
Ken Sumrall160b4d62013-04-22 12:15:39 -07002422 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Ken Sumrall3ad90722011-10-04 20:38:29 -07002423 SLOGE("Error getting crypt footer and key\n");
2424 return -1;
2425 }
2426
2427 if (crypt_ftr.flags & CRYPT_MNT_KEY_UNENCRYPTED) {
2428 /* If the device has no password, then just say the password is valid */
2429 rc = 0;
2430 } else {
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302431#ifdef CONFIG_HW_DISK_ENCRYPTION
2432 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
2433 if (verify_hw_fde_passwd(passwd, &crypt_ftr) >= 0)
2434 rc = 0;
2435 else
2436 rc = -1;
2437 } else {
2438 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
2439 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2440 /* They match, the password is correct */
2441 rc = 0;
2442 } else {
2443 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2444 sleep(1);
2445 rc = 1;
2446 }
2447 }
2448#else
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002449 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
Ken Sumrall3ad90722011-10-04 20:38:29 -07002450 if (!memcmp(decrypted_master_key, saved_master_key, crypt_ftr.keysize)) {
2451 /* They match, the password is correct */
2452 rc = 0;
2453 } else {
2454 /* If incorrect, sleep for a bit to prevent dictionary attacks */
2455 sleep(1);
2456 rc = 1;
2457 }
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302458#endif
Ken Sumrall3ad90722011-10-04 20:38:29 -07002459 }
2460
2461 return rc;
2462}
2463
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002464/* Initialize a crypt_mnt_ftr structure. The keysize is
Greg Kaiser57f9af62018-02-16 13:13:58 -08002465 * defaulted to cryptfs_get_keysize() bytes, and the filesystem size to 0.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002466 * Presumably, at a minimum, the caller will update the
2467 * filesystem size and crypto_type_name after calling this function.
2468 */
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002469static int cryptfs_init_crypt_mnt_ftr(struct crypt_mnt_ftr *ftr)
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002470{
Ken Sumrall160b4d62013-04-22 12:15:39 -07002471 off64_t off;
2472
2473 memset(ftr, 0, sizeof(struct crypt_mnt_ftr));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002474 ftr->magic = CRYPT_MNT_MAGIC;
Kenny Rootc96a5f82013-06-14 12:08:28 -07002475 ftr->major_version = CURRENT_MAJOR_VERSION;
2476 ftr->minor_version = CURRENT_MINOR_VERSION;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002477 ftr->ftr_size = sizeof(struct crypt_mnt_ftr);
Greg Kaiser57f9af62018-02-16 13:13:58 -08002478 ftr->keysize = cryptfs_get_keysize();
Ken Sumrall160b4d62013-04-22 12:15:39 -07002479
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002480 switch (keymaster_check_compatibility()) {
2481 case 1:
2482 ftr->kdf_type = KDF_SCRYPT_KEYMASTER;
2483 break;
2484
2485 case 0:
2486 ftr->kdf_type = KDF_SCRYPT;
2487 break;
2488
2489 default:
2490 SLOGE("keymaster_check_compatibility failed");
2491 return -1;
2492 }
2493
Kenny Rootc4c70f12013-06-14 12:11:38 -07002494 get_device_scrypt_params(ftr);
2495
Ken Sumrall160b4d62013-04-22 12:15:39 -07002496 ftr->persist_data_size = CRYPT_PERSIST_DATA_SIZE;
2497 if (get_crypt_ftr_info(NULL, &off) == 0) {
2498 ftr->persist_data_offset[0] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET;
2499 ftr->persist_data_offset[1] = off + CRYPT_FOOTER_TO_PERSIST_OFFSET +
2500 ftr->persist_data_size;
2501 }
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002502
2503 return 0;
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002504}
2505
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002506#define FRAMEWORK_BOOT_WAIT 60
2507
Paul Lawrence87999172014-02-20 12:21:31 -08002508static int cryptfs_SHA256_fileblock(const char* filename, __le8* buf)
2509{
Jeff Sharkeyce6a9132015-04-08 21:07:21 -07002510 int fd = open(filename, O_RDONLY|O_CLOEXEC);
Paul Lawrence87999172014-02-20 12:21:31 -08002511 if (fd == -1) {
2512 SLOGE("Error opening file %s", filename);
2513 return -1;
2514 }
2515
2516 char block[CRYPT_INPLACE_BUFSIZE];
2517 memset(block, 0, sizeof(block));
2518 if (unix_read(fd, block, sizeof(block)) < 0) {
2519 SLOGE("Error reading file %s", filename);
2520 close(fd);
2521 return -1;
2522 }
2523
2524 close(fd);
2525
2526 SHA256_CTX c;
2527 SHA256_Init(&c);
2528 SHA256_Update(&c, block, sizeof(block));
2529 SHA256_Final(buf, &c);
2530
2531 return 0;
2532}
2533
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002534static int cryptfs_enable_all_volumes(struct crypt_mnt_ftr* crypt_ftr, char* crypto_blkdev,
2535 char* real_blkdev, int previously_encrypted_upto) {
Paul Lawrence87999172014-02-20 12:21:31 -08002536 off64_t cur_encryption_done=0, tot_encryption_size=0;
Tim Murray8439dc92014-12-15 11:56:11 -08002537 int rc = -1;
Paul Lawrence87999172014-02-20 12:21:31 -08002538
Paul Lawrence87999172014-02-20 12:21:31 -08002539 /* The size of the userdata partition, and add in the vold volumes below */
2540 tot_encryption_size = crypt_ftr->fs_size;
2541
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002542 rc = cryptfs_enable_inplace(crypto_blkdev, real_blkdev, crypt_ftr->fs_size, &cur_encryption_done,
Paul Crowley0fd26262018-01-30 09:48:19 -08002543 tot_encryption_size, previously_encrypted_upto, true);
Paul Lawrence87999172014-02-20 12:21:31 -08002544
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002545 if (rc == ENABLE_INPLACE_ERR_DEV) {
2546 /* Hack for b/17898962 */
2547 SLOGE("cryptfs_enable: crypto block dev failure. Must reboot...\n");
2548 cryptfs_reboot(RebootType::reboot);
2549 }
JP Abgrall7fc1de82014-10-10 18:43:41 -07002550
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002551 if (!rc) {
2552 crypt_ftr->encrypted_upto = cur_encryption_done;
2553 }
Paul Lawrence87999172014-02-20 12:21:31 -08002554
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002555 if (!rc && crypt_ftr->encrypted_upto == crypt_ftr->fs_size) {
2556 /* The inplace routine never actually sets the progress to 100% due
2557 * to the round down nature of integer division, so set it here */
2558 property_set("vold.encrypt_progress", "100");
Paul Lawrence87999172014-02-20 12:21:31 -08002559 }
2560
2561 return rc;
2562}
2563
Paul Crowleyb64933a2017-10-31 08:25:55 -07002564static int vold_unmountAll(void) {
2565 VolumeManager* vm = VolumeManager::Instance();
2566 return vm->unmountAll();
2567}
2568
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002569int cryptfs_enable_internal(int crypt_type, const char* passwd, int no_ui) {
Paul Lawrence87999172014-02-20 12:21:31 -08002570 char crypto_blkdev[MAXPATHLEN], real_blkdev[MAXPATHLEN];
Greg Kaiser59ad0182018-02-16 13:01:36 -08002571 unsigned char decrypted_master_key[MAX_KEY_LEN];
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +09002572 int rc=-1, i;
Paul Lawrence87999172014-02-20 12:21:31 -08002573 struct crypt_mnt_ftr crypt_ftr;
Ken Sumrall160b4d62013-04-22 12:15:39 -07002574 struct crypt_persist_data *pdata;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002575 char encrypted_state[PROPERTY_VALUE_MAX];
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002576 char lockid[32] = { 0 };
Ken Sumrall29d8da82011-05-18 17:20:07 -07002577 char key_loc[PROPERTY_VALUE_MAX];
Ken Sumrall29d8da82011-05-18 17:20:07 -07002578 int num_vols;
Paul Lawrence87999172014-02-20 12:21:31 -08002579 off64_t previously_encrypted_upto = 0;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002580 bool rebootEncryption = false;
Wei Wang4375f1b2017-02-24 17:43:01 -08002581 bool onlyCreateHeader = false;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302582#ifdef CONFIG_HW_DISK_ENCRYPTION
2583 unsigned char newpw[32];
2584 int key_index = 0;
2585#endif
2586 int index = 0;
2587
Wei Wang4375f1b2017-02-24 17:43:01 -08002588 int fd = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002589
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002590 if (get_crypt_ftr_and_key(&crypt_ftr) == 0) {
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002591 if (crypt_ftr.flags & CRYPT_ENCRYPTION_IN_PROGRESS) {
2592 /* An encryption was underway and was interrupted */
2593 previously_encrypted_upto = crypt_ftr.encrypted_upto;
2594 crypt_ftr.encrypted_upto = 0;
2595 crypt_ftr.flags &= ~CRYPT_ENCRYPTION_IN_PROGRESS;
Paul Lawrence6bfed202014-07-28 12:47:22 -07002596
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002597 /* At this point, we are in an inconsistent state. Until we successfully
2598 complete encryption, a reboot will leave us broken. So mark the
2599 encryption failed in case that happens.
2600 On successfully completing encryption, remove this flag */
2601 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
Paul Lawrence6bfed202014-07-28 12:47:22 -07002602
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002603 put_crypt_ftr_and_key(&crypt_ftr);
2604 } else if (crypt_ftr.flags & CRYPT_FORCE_ENCRYPTION) {
2605 if (!check_ftr_sha(&crypt_ftr)) {
2606 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
2607 put_crypt_ftr_and_key(&crypt_ftr);
2608 goto error_unencrypted;
2609 }
2610
2611 /* Doing a reboot-encryption*/
2612 crypt_ftr.flags &= ~CRYPT_FORCE_ENCRYPTION;
2613 crypt_ftr.flags |= CRYPT_FORCE_COMPLETE;
2614 rebootEncryption = true;
2615 }
Greg Kaiser59ad0182018-02-16 13:01:36 -08002616 } else {
2617 // We don't want to accidentally reference invalid data.
2618 memset(&crypt_ftr, 0, sizeof(crypt_ftr));
Paul Lawrence87999172014-02-20 12:21:31 -08002619 }
2620
2621 property_get("ro.crypto.state", encrypted_state, "");
2622 if (!strcmp(encrypted_state, "encrypted") && !previously_encrypted_upto) {
2623 SLOGE("Device is already running encrypted, aborting");
2624 goto error_unencrypted;
2625 }
2626
2627 // TODO refactor fs_mgr_get_crypt_info to get both in one call
Paul Crowleye2ee1522017-09-26 14:05:26 -07002628 fs_mgr_get_crypt_info(fstab_default, key_loc, 0, sizeof(key_loc));
2629 fs_mgr_get_crypt_info(fstab_default, 0, real_blkdev, sizeof(real_blkdev));
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002630
Ken Sumrall3ed82362011-01-28 23:31:16 -08002631 /* Get the size of the real block device */
Wei Wang4375f1b2017-02-24 17:43:01 -08002632 fd = open(real_blkdev, O_RDONLY|O_CLOEXEC);
Hiroaki Miyazawa14eab552015-02-04 13:29:15 +09002633 if (fd == -1) {
2634 SLOGE("Cannot open block device %s\n", real_blkdev);
2635 goto error_unencrypted;
2636 }
2637 unsigned long nr_sec;
2638 get_blkdev_size(fd, &nr_sec);
2639 if (nr_sec == 0) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002640 SLOGE("Cannot get size of block device %s\n", real_blkdev);
2641 goto error_unencrypted;
2642 }
2643 close(fd);
2644
2645 /* If doing inplace encryption, make sure the orig fs doesn't include the crypto footer */
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002646 if (!strcmp(key_loc, KEY_IN_FOOTER)) {
Ken Sumrall3ed82362011-01-28 23:31:16 -08002647 unsigned int fs_size_sec, max_fs_size_sec;
Jim Millera70abc62014-08-15 02:00:45 +00002648 fs_size_sec = get_fs_size(real_blkdev);
Daniel Rosenberge82df162014-08-15 22:19:23 +00002649 if (fs_size_sec == 0)
2650 fs_size_sec = get_f2fs_filesystem_size_sec(real_blkdev);
2651
Paul Lawrence87999172014-02-20 12:21:31 -08002652 max_fs_size_sec = nr_sec - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002653
2654 if (fs_size_sec > max_fs_size_sec) {
2655 SLOGE("Orig filesystem overlaps crypto footer region. Cannot encrypt in place.");
2656 goto error_unencrypted;
2657 }
2658 }
2659
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002660 /* Get a wakelock as this may take a while, and we don't want the
2661 * device to sleep on us. We'll grab a partial wakelock, and if the UI
2662 * wants to keep the screen on, it can grab a full wakelock.
2663 */
Ken Sumrall29d8da82011-05-18 17:20:07 -07002664 snprintf(lockid, sizeof(lockid), "enablecrypto%d", (int) getpid());
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002665 acquire_wake_lock(PARTIAL_WAKE_LOCK, lockid);
2666
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002667 /* The init files are setup to stop the class main and late start when
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002668 * vold sets trigger_shutdown_framework.
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002669 */
2670 property_set("vold.decrypt", "trigger_shutdown_framework");
2671 SLOGD("Just asked init to shut down class main\n");
2672
Jeff Sharkey9c484982015-03-31 10:35:33 -07002673 /* Ask vold to unmount all devices that it manages */
2674 if (vold_unmountAll()) {
2675 SLOGE("Failed to unmount all vold managed devices");
Ken Sumrall2eaf7132011-01-14 12:45:48 -08002676 }
Ken Sumrall8f869aa2010-12-03 03:47:09 -08002677
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002678 /* no_ui means we are being called from init, not settings.
2679 Now we always reboot from settings, so !no_ui means reboot
2680 */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002681 if (!no_ui) {
2682 /* Try fallback, which is to reboot and try there */
2683 onlyCreateHeader = true;
2684 FILE* breadcrumb = fopen(BREADCRUMB_FILE, "we");
2685 if (breadcrumb == 0) {
2686 SLOGE("Failed to create breadcrumb file");
2687 goto error_shutting_down;
2688 }
2689 fclose(breadcrumb);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002690 }
2691
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002692 /* Start the actual work of making an encrypted filesystem */
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002693 /* Initialize a crypt_mnt_ftr for the partition */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002694 if (previously_encrypted_upto == 0 && !rebootEncryption) {
Paul Lawrence69f4ebd2014-04-14 12:17:14 -07002695 if (cryptfs_init_crypt_mnt_ftr(&crypt_ftr)) {
2696 goto error_shutting_down;
2697 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002698
Paul Lawrence87999172014-02-20 12:21:31 -08002699 if (!strcmp(key_loc, KEY_IN_FOOTER)) {
2700 crypt_ftr.fs_size = nr_sec
2701 - (CRYPT_FOOTER_OFFSET / CRYPT_SECTOR_SIZE);
2702 } else {
2703 crypt_ftr.fs_size = nr_sec;
2704 }
Paul Lawrence6bfed202014-07-28 12:47:22 -07002705 /* At this point, we are in an inconsistent state. Until we successfully
2706 complete encryption, a reboot will leave us broken. So mark the
2707 encryption failed in case that happens.
2708 On successfully completing encryption, remove this flag */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002709 if (onlyCreateHeader) {
2710 crypt_ftr.flags |= CRYPT_FORCE_ENCRYPTION;
2711 } else {
2712 crypt_ftr.flags |= CRYPT_INCONSISTENT_STATE;
2713 }
Paul Lawrence87999172014-02-20 12:21:31 -08002714 crypt_ftr.crypt_type = crypt_type;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302715#ifdef CONFIG_HW_DISK_ENCRYPTION
2716 strlcpy((char *)crypt_ftr.crypto_type_name, "aes-xts", MAX_CRYPTO_TYPE_NAME_LEN);
2717#else
Greg Kaiser57f9af62018-02-16 13:13:58 -08002718 strlcpy((char *)crypt_ftr.crypto_type_name, cryptfs_get_crypto_name(), MAX_CRYPTO_TYPE_NAME_LEN);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302719#endif
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002720
Paul Lawrence87999172014-02-20 12:21:31 -08002721 /* Make an encrypted master key */
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002722 if (create_encrypted_random_key(onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2723 crypt_ftr.master_key, crypt_ftr.salt, &crypt_ftr)) {
Paul Lawrence87999172014-02-20 12:21:31 -08002724 SLOGE("Cannot create encrypted master key\n");
2725 goto error_shutting_down;
2726 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002727
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002728 /* Replace scrypted intermediate key if we are preparing for a reboot */
2729 if (onlyCreateHeader) {
Greg Kaiser59ad0182018-02-16 13:01:36 -08002730 unsigned char fake_master_key[MAX_KEY_LEN];
2731 unsigned char encrypted_fake_master_key[MAX_KEY_LEN];
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002732 memset(fake_master_key, 0, sizeof(fake_master_key));
2733 encrypt_master_key(passwd, crypt_ftr.salt, fake_master_key,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302734 encrypted_fake_master_key, &crypt_ftr, true);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002735 }
2736
Paul Lawrence87999172014-02-20 12:21:31 -08002737 /* Write the key to the end of the partition */
2738 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002739
Paul Lawrence87999172014-02-20 12:21:31 -08002740 /* If any persistent data has been remembered, save it.
2741 * If none, create a valid empty table and save that.
2742 */
2743 if (!persist_data) {
Wei Wang4375f1b2017-02-24 17:43:01 -08002744 pdata = (crypt_persist_data *)malloc(CRYPT_PERSIST_DATA_SIZE);
Paul Lawrence87999172014-02-20 12:21:31 -08002745 if (pdata) {
2746 init_empty_persist_data(pdata, CRYPT_PERSIST_DATA_SIZE);
2747 persist_data = pdata;
2748 }
2749 }
2750 if (persist_data) {
2751 save_persistent_data();
2752 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07002753 }
2754
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302755 /* When encryption triggered from settings, encryption starts after reboot.
2756 So set the encryption key when the actual encryption starts.
2757 */
2758#ifdef CONFIG_HW_DISK_ENCRYPTION
2759 if (previously_encrypted_upto == 0) {
2760 if (!rebootEncryption)
2761 clear_hw_device_encryption_key();
2762
2763 if (get_keymaster_hw_fde_passwd(
2764 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2765 newpw, crypt_ftr.salt, &crypt_ftr))
2766 key_index = set_hw_device_encryption_key(
2767 onlyCreateHeader ? DEFAULT_PASSWORD : passwd,
2768 (char*)crypt_ftr.crypto_type_name);
2769 else
2770 key_index = set_hw_device_encryption_key((const char*)newpw,
2771 (char*) crypt_ftr.crypto_type_name);
2772 if (key_index < 0)
2773 goto error_shutting_down;
2774
2775 crypt_ftr.flags |= CRYPT_ASCII_PASSWORD_UPDATED;
2776 put_crypt_ftr_and_key(&crypt_ftr);
2777 }
2778#endif
2779
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002780 if (onlyCreateHeader) {
2781 sleep(2);
Josh Gaofec44372017-08-28 13:22:55 -07002782 cryptfs_reboot(RebootType::reboot);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302783 } else {
2784 /* Do extra work for a better UX when doing the long inplace encryption */
2785 /* Now that /data is unmounted, we need to mount a tmpfs
2786 * /data, set a property saying we're doing inplace encryption,
2787 * and restart the framework.
2788 */
2789 if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
2790 goto error_shutting_down;
2791 }
2792 /* Tells the framework that inplace encryption is starting */
2793 property_set("vold.encrypt_progress", "0");
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002794
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302795 /* restart the framework. */
2796 /* Create necessary paths on /data */
2797 prep_data_fs();
2798
2799 /* Ugh, shutting down the framework is not synchronous, so until it
2800 * can be fixed, this horrible hack will wait a moment for it all to
2801 * shut down before proceeding. Without it, some devices cannot
2802 * restart the graphics services.
2803 */
2804 sleep(2);
2805
Ajay Dudani87701e22014-09-17 21:02:52 -07002806 /* startup service classes main and late_start */
2807 property_set("vold.decrypt", "trigger_restart_min_framework");
2808 SLOGD("Just triggered restart_min_framework\n");
2809
2810 /* OK, the framework is restarted and will soon be showing a
2811 * progress bar. Time to setup an encrypted mapping, and
2812 * either write a new filesystem, or encrypt in place updating
2813 * the progress bar as we work.
2814 */
2815 }
2816
Paul Lawrenced0c7b172014-08-08 14:28:10 -07002817 decrypt_master_key(passwd, decrypted_master_key, &crypt_ftr, 0, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302818#ifdef CONFIG_HW_DISK_ENCRYPTION
2819 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name) && is_ice_enabled())
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302820#ifdef CONFIG_HW_DISK_ENCRYPT_PERF
2821 strlcpy(crypto_blkdev, real_blkdev, sizeof(crypto_blkdev));
2822#else
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302823 create_crypto_blk_dev(&crypt_ftr, (unsigned char*)&key_index, real_blkdev, crypto_blkdev,
2824 CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302825#endif
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302826 else
2827 create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev,
2828 CRYPTO_BLOCK_DEVICE, 0);
2829#else
Ken Sumrall29d8da82011-05-18 17:20:07 -07002830 create_crypto_blk_dev(&crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev,
Paul Crowley5afbc622017-11-27 09:42:17 -08002831 CRYPTO_BLOCK_DEVICE, 0);
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302832#endif
Ken Sumrall29d8da82011-05-18 17:20:07 -07002833
Paul Lawrence87999172014-02-20 12:21:31 -08002834 /* If we are continuing, check checksums match */
2835 rc = 0;
2836 if (previously_encrypted_upto) {
2837 __le8 hash_first_block[SHA256_DIGEST_LENGTH];
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302838#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2839 if (set_ice_param(START_ENCDEC)) {
2840 SLOGE("Failed to set ICE data");
2841 goto error_shutting_down;
2842 }
2843#endif
Paul Lawrence87999172014-02-20 12:21:31 -08002844 rc = cryptfs_SHA256_fileblock(crypto_blkdev, hash_first_block);
Ken Sumrall128626f2011-06-28 18:45:14 -07002845
Paul Lawrence87999172014-02-20 12:21:31 -08002846 if (!rc && memcmp(hash_first_block, crypt_ftr.hash_first_block,
2847 sizeof(hash_first_block)) != 0) {
2848 SLOGE("Checksums do not match - trigger wipe");
2849 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002850 }
2851 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002852
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302853#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2854 if (set_ice_param(START_ENC)) {
2855 SLOGE("Failed to set ICE data");
2856 goto error_shutting_down;
2857 }
2858#endif
Paul Lawrence87999172014-02-20 12:21:31 -08002859 if (!rc) {
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002860 rc = cryptfs_enable_all_volumes(&crypt_ftr, crypto_blkdev, real_blkdev,
Paul Lawrence87999172014-02-20 12:21:31 -08002861 previously_encrypted_upto);
2862 }
2863
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302864#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2865 if (set_ice_param(START_ENCDEC)) {
2866 SLOGE("Failed to set ICE data");
2867 goto error_shutting_down;
2868 }
2869#endif
Paul Lawrence87999172014-02-20 12:21:31 -08002870 /* Calculate checksum if we are not finished */
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002871 if (!rc && crypt_ftr.encrypted_upto != crypt_ftr.fs_size) {
Paul Lawrence87999172014-02-20 12:21:31 -08002872 rc = cryptfs_SHA256_fileblock(crypto_blkdev,
2873 crypt_ftr.hash_first_block);
Paul Lawrence73d7a022014-06-09 14:10:09 -07002874 if (rc) {
Paul Lawrence87999172014-02-20 12:21:31 -08002875 SLOGE("Error calculating checksum for continuing encryption");
2876 rc = -1;
Ken Sumrall29d8da82011-05-18 17:20:07 -07002877 }
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002878 }
2879
2880 /* Undo the dm-crypt mapping whether we succeed or not */
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302881#if defined(CONFIG_HW_DISK_ENCRYPTION) && defined(CONFIG_HW_DISK_ENCRYPT_PERF)
2882 if (!is_ice_enabled())
2883 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
2884#else
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002885 delete_crypto_blk_dev(CRYPTO_BLOCK_DEVICE);
AnilKumar Chimatad08106a2018-02-11 17:11:24 +05302886#endif
Ken Sumrall29d8da82011-05-18 17:20:07 -07002887
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002888 if (! rc) {
2889 /* Success */
Paul Lawrence6bfed202014-07-28 12:47:22 -07002890 crypt_ftr.flags &= ~CRYPT_INCONSISTENT_STATE;
Ken Sumrall7f7dbaa2011-02-01 15:46:41 -08002891
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002892 if (crypt_ftr.encrypted_upto != crypt_ftr.fs_size) {
Paul Lawrence87999172014-02-20 12:21:31 -08002893 SLOGD("Encrypted up to sector %lld - will continue after reboot",
2894 crypt_ftr.encrypted_upto);
Paul Lawrence6bfed202014-07-28 12:47:22 -07002895 crypt_ftr.flags |= CRYPT_ENCRYPTION_IN_PROGRESS;
Paul Lawrence87999172014-02-20 12:21:31 -08002896 }
Paul Lawrence73d7a022014-06-09 14:10:09 -07002897
Paul Lawrence6bfed202014-07-28 12:47:22 -07002898 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumralld33d4172011-02-01 00:49:13 -08002899
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002900 if (crypt_ftr.encrypted_upto == crypt_ftr.fs_size) {
2901 char value[PROPERTY_VALUE_MAX];
2902 property_get("ro.crypto.state", value, "");
2903 if (!strcmp(value, "")) {
2904 /* default encryption - continue first boot sequence */
2905 property_set("ro.crypto.state", "encrypted");
2906 property_set("ro.crypto.type", "block");
2907 release_wake_lock(lockid);
2908 if (rebootEncryption && crypt_ftr.crypt_type != CRYPT_TYPE_DEFAULT) {
2909 // Bring up cryptkeeper that will check the password and set it
2910 property_set("vold.decrypt", "trigger_shutdown_framework");
2911 sleep(2);
2912 property_set("vold.encrypt_progress", "");
2913 cryptfs_trigger_restart_min_framework();
2914 } else {
2915 cryptfs_check_passwd(DEFAULT_PASSWORD);
2916 cryptfs_restart_internal(1);
2917 }
2918 return 0;
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002919 } else {
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002920 sleep(2); /* Give the UI a chance to show 100% progress */
2921 cryptfs_reboot(RebootType::reboot);
Paul Lawrence3d99eba2015-11-20 07:07:19 -08002922 }
Paul Lawrence87999172014-02-20 12:21:31 -08002923 } else {
Paul Lawrenceb6672e12014-08-15 07:37:28 -07002924 sleep(2); /* Partially encrypted, ensure writes flushed to ssd */
Josh Gaofec44372017-08-28 13:22:55 -07002925 cryptfs_reboot(RebootType::shutdown);
Paul Lawrence87999172014-02-20 12:21:31 -08002926 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002927 } else {
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002928 char value[PROPERTY_VALUE_MAX];
2929
Ken Sumrall319369a2012-06-27 16:30:18 -07002930 property_get("ro.vold.wipe_on_crypt_fail", value, "0");
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002931 if (!strcmp(value, "1")) {
2932 /* wipe data if encryption failed */
2933 SLOGE("encryption failed - rebooting into recovery to wipe data\n");
Wei Wang4375f1b2017-02-24 17:43:01 -08002934 std::string err;
2935 const std::vector<std::string> options = {
2936 "--wipe_data\n--reason=cryptfs_enable_internal\n"
2937 };
2938 if (!write_bootloader_message(options, &err)) {
2939 SLOGE("could not write bootloader message: %s", err.c_str());
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002940 }
Josh Gaofec44372017-08-28 13:22:55 -07002941 cryptfs_reboot(RebootType::recovery);
Mike Lockwoodee6d8c42012-02-15 13:43:28 -08002942 } else {
2943 /* set property to trigger dialog */
2944 property_set("vold.encrypt_progress", "error_partially_encrypted");
2945 release_wake_lock(lockid);
2946 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002947 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002948 }
2949
Ken Sumrall3ed82362011-01-28 23:31:16 -08002950 /* hrm, the encrypt step claims success, but the reboot failed.
2951 * This should not happen.
2952 * Set the property and return. Hope the framework can deal with it.
2953 */
2954 property_set("vold.encrypt_progress", "error_reboot_failed");
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002955 release_wake_lock(lockid);
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002956 return rc;
Ken Sumrall3ed82362011-01-28 23:31:16 -08002957
2958error_unencrypted:
2959 property_set("vold.encrypt_progress", "error_not_encrypted");
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002960 if (lockid[0]) {
2961 release_wake_lock(lockid);
2962 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002963 return -1;
2964
2965error_shutting_down:
2966 /* we failed, and have not encrypted anthing, so the users's data is still intact,
2967 * but the framework is stopped and not restarted to show the error, so it's up to
2968 * vold to restart the system.
2969 */
2970 SLOGE("Error enabling encryption after framework is shutdown, no data changed, restarting system");
Josh Gaofec44372017-08-28 13:22:55 -07002971 cryptfs_reboot(RebootType::reboot);
Ken Sumrall3ed82362011-01-28 23:31:16 -08002972
2973 /* shouldn't get here */
2974 property_set("vold.encrypt_progress", "error_shutting_down");
Ken Sumrall5d4c68e2011-01-30 19:06:03 -08002975 if (lockid[0]) {
2976 release_wake_lock(lockid);
2977 }
Ken Sumrall3ed82362011-01-28 23:31:16 -08002978 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002979}
2980
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002981int cryptfs_enable(int type, const char* passwd, int no_ui) {
2982 return cryptfs_enable_internal(type, passwd, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002983}
2984
Paul Lawrence7ee87cf2017-12-22 10:12:06 -08002985int cryptfs_enable_default(int no_ui) {
2986 return cryptfs_enable_internal(CRYPT_TYPE_DEFAULT, DEFAULT_PASSWORD, no_ui);
Paul Lawrence13486032014-02-03 13:28:11 -08002987}
2988
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05302989int cryptfs_changepw(int crypt_type, const char *currentpw, const char *newpw)
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002990{
Paul Crowley38132a12016-02-09 09:50:32 +00002991 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08002992 SLOGE("cryptfs_changepw not valid for file encryption");
2993 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08002994 }
2995
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002996 struct crypt_mnt_ftr crypt_ftr;
JP Abgrall933216c2015-02-11 13:44:32 -08002997 int rc;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08002998
2999 /* This is only allowed after we've successfully decrypted the master key */
Paul Lawrencef4faa572014-01-29 13:31:03 -08003000 if (!master_key_saved) {
Ken Sumrall0cc16632011-01-18 20:32:26 -08003001 SLOGE("Key not saved, aborting");
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003002 return -1;
3003 }
3004
Paul Lawrencef4faa572014-01-29 13:31:03 -08003005 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3006 SLOGE("Invalid crypt_type %d", crypt_type);
3007 return -1;
3008 }
3009
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003010 /* get key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003011 if (get_crypt_ftr_and_key(&crypt_ftr)) {
Paul Lawrencef4faa572014-01-29 13:31:03 -08003012 SLOGE("Error getting crypt footer and key");
3013 return -1;
Ken Sumrall8ddbe402011-01-17 15:26:29 -08003014 }
3015
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303016#ifdef CONFIG_HW_DISK_ENCRYPTION
3017 if(is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name))
3018 return cryptfs_changepw_hw_fde(crypt_type, currentpw, newpw);
3019 else {
3020 crypt_ftr.crypt_type = crypt_type;
3021
3022 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ?
3023 DEFAULT_PASSWORD : newpw,
3024 crypt_ftr.salt,
3025 saved_master_key,
3026 crypt_ftr.master_key,
3027 &crypt_ftr, false);
3028 if (rc) {
3029 SLOGE("Encrypt master key failed: %d", rc);
3030 return -1;
3031 }
3032 /* save the key */
3033 put_crypt_ftr_and_key(&crypt_ftr);
3034
3035 return 0;
3036 }
3037#else
Paul Lawrencef4faa572014-01-29 13:31:03 -08003038 crypt_ftr.crypt_type = crypt_type;
3039
JP Abgrall933216c2015-02-11 13:44:32 -08003040 rc = encrypt_master_key(crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD
Paul Lawrencef4faa572014-01-29 13:31:03 -08003041 : newpw,
3042 crypt_ftr.salt,
3043 saved_master_key,
3044 crypt_ftr.master_key,
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303045 &crypt_ftr, false);
JP Abgrall933216c2015-02-11 13:44:32 -08003046 if (rc) {
3047 SLOGE("Encrypt master key failed: %d", rc);
3048 return -1;
3049 }
Jason parks70a4b3f2011-01-28 10:10:47 -06003050 /* save the key */
Ken Sumrall160b4d62013-04-22 12:15:39 -07003051 put_crypt_ftr_and_key(&crypt_ftr);
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003052
3053 return 0;
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303054#endif
Ken Sumrall8f869aa2010-12-03 03:47:09 -08003055}
Ken Sumrall160b4d62013-04-22 12:15:39 -07003056
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303057#ifdef CONFIG_HW_DISK_ENCRYPTION
3058int cryptfs_changepw_hw_fde(int crypt_type, const char *currentpw, const char *newpw)
3059{
3060 struct crypt_mnt_ftr crypt_ftr;
3061 int rc;
3062 int previous_type;
3063
3064 /* get key */
3065 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3066 SLOGE("Error getting crypt footer and key");
3067 return -1;
3068 }
3069
3070 previous_type = crypt_ftr.crypt_type;
3071 int rc1;
3072 unsigned char tmp_curpw[32] = {0};
3073 rc1 = get_keymaster_hw_fde_passwd(crypt_ftr.crypt_type == CRYPT_TYPE_DEFAULT ?
3074 DEFAULT_PASSWORD : currentpw, tmp_curpw,
3075 crypt_ftr.salt, &crypt_ftr);
3076
3077 crypt_ftr.crypt_type = crypt_type;
3078
3079 int ret, rc2;
3080 unsigned char tmp_newpw[32] = {0};
3081
3082 rc2 = get_keymaster_hw_fde_passwd(crypt_type == CRYPT_TYPE_DEFAULT ?
3083 DEFAULT_PASSWORD : newpw , tmp_newpw,
3084 crypt_ftr.salt, &crypt_ftr);
3085
3086 if (is_hw_disk_encryption((char*)crypt_ftr.crypto_type_name)) {
3087 ret = update_hw_device_encryption_key(
3088 rc1 ? (previous_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : currentpw) : (const char*)tmp_curpw,
3089 rc2 ? (crypt_type == CRYPT_TYPE_DEFAULT ? DEFAULT_PASSWORD : newpw): (const char*)tmp_newpw,
3090 (char*)crypt_ftr.crypto_type_name);
3091 if (ret) {
3092 SLOGE("Error updating device encryption hardware key ret %d", ret);
3093 return -1;
3094 } else {
3095 SLOGI("Encryption hardware key updated");
3096 }
3097 }
3098
3099 /* save the key */
3100 put_crypt_ftr_and_key(&crypt_ftr);
3101 return 0;
3102}
3103#endif
3104
Rubin Xu85c01f92014-10-13 12:49:54 +01003105static unsigned int persist_get_max_entries(int encrypted) {
3106 struct crypt_mnt_ftr crypt_ftr;
3107 unsigned int dsize;
3108 unsigned int max_persistent_entries;
3109
3110 /* If encrypted, use the values from the crypt_ftr, otherwise
3111 * use the values for the current spec.
3112 */
3113 if (encrypted) {
3114 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3115 return -1;
3116 }
3117 dsize = crypt_ftr.persist_data_size;
3118 } else {
3119 dsize = CRYPT_PERSIST_DATA_SIZE;
3120 }
3121
3122 max_persistent_entries = (dsize - sizeof(struct crypt_persist_data)) /
3123 sizeof(struct crypt_persist_entry);
3124
3125 return max_persistent_entries;
3126}
3127
3128static int persist_get_key(const char *fieldname, char *value)
Ken Sumrall160b4d62013-04-22 12:15:39 -07003129{
3130 unsigned int i;
3131
3132 if (persist_data == NULL) {
3133 return -1;
3134 }
3135 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3136 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3137 /* We found it! */
3138 strlcpy(value, persist_data->persist_entry[i].val, PROPERTY_VALUE_MAX);
3139 return 0;
3140 }
3141 }
3142
3143 return -1;
3144}
3145
Rubin Xu85c01f92014-10-13 12:49:54 +01003146static int persist_set_key(const char *fieldname, const char *value, int encrypted)
Ken Sumrall160b4d62013-04-22 12:15:39 -07003147{
3148 unsigned int i;
3149 unsigned int num;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003150 unsigned int max_persistent_entries;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003151
3152 if (persist_data == NULL) {
3153 return -1;
3154 }
3155
Rubin Xu85c01f92014-10-13 12:49:54 +01003156 max_persistent_entries = persist_get_max_entries(encrypted);
Ken Sumrall160b4d62013-04-22 12:15:39 -07003157
3158 num = persist_data->persist_valid_entries;
3159
3160 for (i = 0; i < num; i++) {
3161 if (!strncmp(persist_data->persist_entry[i].key, fieldname, PROPERTY_KEY_MAX)) {
3162 /* We found an existing entry, update it! */
3163 memset(persist_data->persist_entry[i].val, 0, PROPERTY_VALUE_MAX);
3164 strlcpy(persist_data->persist_entry[i].val, value, PROPERTY_VALUE_MAX);
3165 return 0;
3166 }
3167 }
3168
3169 /* We didn't find it, add it to the end, if there is room */
3170 if (persist_data->persist_valid_entries < max_persistent_entries) {
3171 memset(&persist_data->persist_entry[num], 0, sizeof(struct crypt_persist_entry));
3172 strlcpy(persist_data->persist_entry[num].key, fieldname, PROPERTY_KEY_MAX);
3173 strlcpy(persist_data->persist_entry[num].val, value, PROPERTY_VALUE_MAX);
3174 persist_data->persist_valid_entries++;
3175 return 0;
3176 }
3177
3178 return -1;
3179}
3180
Rubin Xu85c01f92014-10-13 12:49:54 +01003181/**
3182 * Test if key is part of the multi-entry (field, index) sequence. Return non-zero if key is in the
3183 * sequence and its index is greater than or equal to index. Return 0 otherwise.
3184 */
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003185int match_multi_entry(const char *key, const char *field, unsigned index) {
3186 std::string key_ = key;
3187 std::string field_ = field;
Rubin Xu85c01f92014-10-13 12:49:54 +01003188
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003189 std::string parsed_field;
3190 unsigned parsed_index;
3191
3192 std::string::size_type split = key_.find_last_of('_');
3193 if (split == std::string::npos) {
3194 parsed_field = key_;
3195 parsed_index = 0;
3196 } else {
3197 parsed_field = key_.substr(0, split);
3198 parsed_index = std::stoi(key_.substr(split + 1));
Rubin Xu85c01f92014-10-13 12:49:54 +01003199 }
Jeff Sharkey95440eb2017-09-18 18:19:28 -06003200
3201 return parsed_field == field_ && parsed_index >= index;
Rubin Xu85c01f92014-10-13 12:49:54 +01003202}
3203
3204/*
3205 * Delete entry/entries from persist_data. If the entries are part of a multi-segment field, all
3206 * remaining entries starting from index will be deleted.
3207 * returns PERSIST_DEL_KEY_OK if deletion succeeds,
3208 * PERSIST_DEL_KEY_ERROR_NO_FIELD if the field does not exist,
3209 * and PERSIST_DEL_KEY_ERROR_OTHER if error occurs.
3210 *
3211 */
3212static int persist_del_keys(const char *fieldname, unsigned index)
3213{
3214 unsigned int i;
3215 unsigned int j;
3216 unsigned int num;
3217
3218 if (persist_data == NULL) {
3219 return PERSIST_DEL_KEY_ERROR_OTHER;
3220 }
3221
3222 num = persist_data->persist_valid_entries;
3223
3224 j = 0; // points to the end of non-deleted entries.
3225 // Filter out to-be-deleted entries in place.
3226 for (i = 0; i < num; i++) {
3227 if (!match_multi_entry(persist_data->persist_entry[i].key, fieldname, index)) {
3228 persist_data->persist_entry[j] = persist_data->persist_entry[i];
3229 j++;
3230 }
3231 }
3232
3233 if (j < num) {
3234 persist_data->persist_valid_entries = j;
3235 // Zeroise the remaining entries
3236 memset(&persist_data->persist_entry[j], 0, (num - j) * sizeof(struct crypt_persist_entry));
3237 return PERSIST_DEL_KEY_OK;
3238 } else {
3239 // Did not find an entry matching the given fieldname
3240 return PERSIST_DEL_KEY_ERROR_NO_FIELD;
3241 }
3242}
3243
3244static int persist_count_keys(const char *fieldname)
3245{
3246 unsigned int i;
3247 unsigned int count;
3248
3249 if (persist_data == NULL) {
3250 return -1;
3251 }
3252
3253 count = 0;
3254 for (i = 0; i < persist_data->persist_valid_entries; i++) {
3255 if (match_multi_entry(persist_data->persist_entry[i].key, fieldname, 0)) {
3256 count++;
3257 }
3258 }
3259
3260 return count;
3261}
3262
Ken Sumrall160b4d62013-04-22 12:15:39 -07003263/* Return the value of the specified field. */
Rubin Xu85c01f92014-10-13 12:49:54 +01003264int cryptfs_getfield(const char *fieldname, char *value, int len)
Ken Sumrall160b4d62013-04-22 12:15:39 -07003265{
Paul Crowley38132a12016-02-09 09:50:32 +00003266 if (e4crypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003267 SLOGE("Cannot get field when file encrypted");
3268 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003269 }
3270
Ken Sumrall160b4d62013-04-22 12:15:39 -07003271 char temp_value[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003272 /* CRYPTO_GETFIELD_OK is success,
3273 * CRYPTO_GETFIELD_ERROR_NO_FIELD is value not set,
3274 * CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL is buffer (as given by len) too small,
3275 * CRYPTO_GETFIELD_ERROR_OTHER is any other error
Ken Sumrall160b4d62013-04-22 12:15:39 -07003276 */
Rubin Xu85c01f92014-10-13 12:49:54 +01003277 int rc = CRYPTO_GETFIELD_ERROR_OTHER;
3278 int i;
3279 char temp_field[PROPERTY_KEY_MAX];
Ken Sumrall160b4d62013-04-22 12:15:39 -07003280
3281 if (persist_data == NULL) {
3282 load_persistent_data();
3283 if (persist_data == NULL) {
3284 SLOGE("Getfield error, cannot load persistent data");
3285 goto out;
3286 }
3287 }
3288
Rubin Xu85c01f92014-10-13 12:49:54 +01003289 // Read value from persistent entries. If the original value is split into multiple entries,
3290 // stitch them back together.
Ken Sumrall160b4d62013-04-22 12:15:39 -07003291 if (!persist_get_key(fieldname, temp_value)) {
Rubin Xu85c01f92014-10-13 12:49:54 +01003292 // We found it, copy it to the caller's buffer and keep going until all entries are read.
3293 if (strlcpy(value, temp_value, len) >= (unsigned) len) {
3294 // value too small
3295 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3296 goto out;
3297 }
3298 rc = CRYPTO_GETFIELD_OK;
3299
3300 for (i = 1; /* break explicitly */; i++) {
3301 if (snprintf(temp_field, sizeof(temp_field), "%s_%d", fieldname, i) >=
3302 (int) sizeof(temp_field)) {
3303 // If the fieldname is very long, we stop as soon as it begins to overflow the
3304 // maximum field length. At this point we have in fact fully read out the original
3305 // value because cryptfs_setfield would not allow fields with longer names to be
3306 // written in the first place.
3307 break;
3308 }
3309 if (!persist_get_key(temp_field, temp_value)) {
3310 if (strlcat(value, temp_value, len) >= (unsigned)len) {
3311 // value too small.
3312 rc = CRYPTO_GETFIELD_ERROR_BUF_TOO_SMALL;
3313 goto out;
3314 }
3315 } else {
3316 // Exhaust all entries.
3317 break;
3318 }
3319 }
Ken Sumrall160b4d62013-04-22 12:15:39 -07003320 } else {
3321 /* Sadness, it's not there. Return the error */
Rubin Xu85c01f92014-10-13 12:49:54 +01003322 rc = CRYPTO_GETFIELD_ERROR_NO_FIELD;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003323 }
3324
3325out:
3326 return rc;
3327}
3328
3329/* Set the value of the specified field. */
Rubin Xu85c01f92014-10-13 12:49:54 +01003330int cryptfs_setfield(const char *fieldname, const char *value)
Ken Sumrall160b4d62013-04-22 12:15:39 -07003331{
Paul Crowley38132a12016-02-09 09:50:32 +00003332 if (e4crypt_is_native()) {
Paul Lawrence5a06a642016-02-03 13:39:13 -08003333 SLOGE("Cannot set field when file encrypted");
3334 return -1;
Paul Lawrence368d7942015-04-15 14:12:00 -07003335 }
3336
Ken Sumrall160b4d62013-04-22 12:15:39 -07003337 char encrypted_state[PROPERTY_VALUE_MAX];
Rubin Xu85c01f92014-10-13 12:49:54 +01003338 /* 0 is success, negative values are error */
3339 int rc = CRYPTO_SETFIELD_ERROR_OTHER;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003340 int encrypted = 0;
Rubin Xu85c01f92014-10-13 12:49:54 +01003341 unsigned int field_id;
3342 char temp_field[PROPERTY_KEY_MAX];
3343 unsigned int num_entries;
3344 unsigned int max_keylen;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003345
3346 if (persist_data == NULL) {
3347 load_persistent_data();
3348 if (persist_data == NULL) {
3349 SLOGE("Setfield error, cannot load persistent data");
3350 goto out;
3351 }
3352 }
3353
3354 property_get("ro.crypto.state", encrypted_state, "");
3355 if (!strcmp(encrypted_state, "encrypted") ) {
3356 encrypted = 1;
3357 }
3358
Rubin Xu85c01f92014-10-13 12:49:54 +01003359 // Compute the number of entries required to store value, each entry can store up to
3360 // (PROPERTY_VALUE_MAX - 1) chars
3361 if (strlen(value) == 0) {
3362 // Empty value also needs one entry to store.
3363 num_entries = 1;
3364 } else {
3365 num_entries = (strlen(value) + (PROPERTY_VALUE_MAX - 1) - 1) / (PROPERTY_VALUE_MAX - 1);
3366 }
3367
3368 max_keylen = strlen(fieldname);
3369 if (num_entries > 1) {
3370 // Need an extra "_%d" suffix.
3371 max_keylen += 1 + log10(num_entries);
3372 }
3373 if (max_keylen > PROPERTY_KEY_MAX - 1) {
3374 rc = CRYPTO_SETFIELD_ERROR_FIELD_TOO_LONG;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003375 goto out;
3376 }
3377
Rubin Xu85c01f92014-10-13 12:49:54 +01003378 // Make sure we have enough space to write the new value
3379 if (persist_data->persist_valid_entries + num_entries - persist_count_keys(fieldname) >
3380 persist_get_max_entries(encrypted)) {
3381 rc = CRYPTO_SETFIELD_ERROR_VALUE_TOO_LONG;
3382 goto out;
3383 }
3384
3385 // Now that we know persist_data has enough space for value, let's delete the old field first
3386 // to make up space.
3387 persist_del_keys(fieldname, 0);
3388
3389 if (persist_set_key(fieldname, value, encrypted)) {
3390 // fail to set key, should not happen as we have already checked the available space
3391 SLOGE("persist_set_key() error during setfield()");
3392 goto out;
3393 }
3394
3395 for (field_id = 1; field_id < num_entries; field_id++) {
Greg Kaiserb610e772018-02-09 09:19:54 -08003396 snprintf(temp_field, sizeof(temp_field), "%s_%u", fieldname, field_id);
Rubin Xu85c01f92014-10-13 12:49:54 +01003397
3398 if (persist_set_key(temp_field, value + field_id * (PROPERTY_VALUE_MAX - 1), encrypted)) {
3399 // fail to set key, should not happen as we have already checked the available space.
3400 SLOGE("persist_set_key() error during setfield()");
3401 goto out;
3402 }
3403 }
3404
Ken Sumrall160b4d62013-04-22 12:15:39 -07003405 /* If we are running encrypted, save the persistent data now */
3406 if (encrypted) {
3407 if (save_persistent_data()) {
3408 SLOGE("Setfield error, cannot save persistent data");
3409 goto out;
3410 }
3411 }
3412
Rubin Xu85c01f92014-10-13 12:49:54 +01003413 rc = CRYPTO_SETFIELD_OK;
Ken Sumrall160b4d62013-04-22 12:15:39 -07003414
3415out:
3416 return rc;
3417}
Paul Lawrencef4faa572014-01-29 13:31:03 -08003418
3419/* Checks userdata. Attempt to mount the volume if default-
3420 * encrypted.
3421 * On success trigger next init phase and return 0.
3422 * Currently do not handle failure - see TODO below.
3423 */
3424int cryptfs_mount_default_encrypted(void)
3425{
Paul Lawrence84274cc2016-04-15 15:41:33 -07003426 int crypt_type = cryptfs_get_password_type();
3427 if (crypt_type < 0 || crypt_type > CRYPT_TYPE_MAX_TYPE) {
3428 SLOGE("Bad crypt type - error");
3429 } else if (crypt_type != CRYPT_TYPE_DEFAULT) {
3430 SLOGD("Password is not default - "
3431 "starting min framework to prompt");
3432 property_set("vold.decrypt", "trigger_restart_min_framework");
3433 return 0;
3434 } else if (cryptfs_check_passwd(DEFAULT_PASSWORD) == 0) {
3435 SLOGD("Password is default - restarting filesystem");
3436 cryptfs_restart_internal(0);
3437 return 0;
Paul Lawrencef4faa572014-01-29 13:31:03 -08003438 } else {
Paul Lawrence84274cc2016-04-15 15:41:33 -07003439 SLOGE("Encrypted, default crypt type but can't decrypt");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003440 }
3441
Paul Lawrence6bfed202014-07-28 12:47:22 -07003442 /** Corrupt. Allow us to boot into framework, which will detect bad
3443 crypto when it calls do_crypto_complete, then do a factory reset
Paul Lawrencef4faa572014-01-29 13:31:03 -08003444 */
Paul Lawrence6bfed202014-07-28 12:47:22 -07003445 property_set("vold.decrypt", "trigger_restart_min_framework");
Paul Lawrencef4faa572014-01-29 13:31:03 -08003446 return 0;
3447}
3448
3449/* Returns type of the password, default, pattern, pin or password.
3450 */
3451int cryptfs_get_password_type(void)
3452{
Paul Crowley38132a12016-02-09 09:50:32 +00003453 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003454 SLOGE("cryptfs_get_password_type not valid for file encryption");
3455 return -1;
Paul Lawrence05335c32015-03-05 09:46:23 -08003456 }
3457
Paul Lawrencef4faa572014-01-29 13:31:03 -08003458 struct crypt_mnt_ftr crypt_ftr;
3459
3460 if (get_crypt_ftr_and_key(&crypt_ftr)) {
3461 SLOGE("Error getting crypt footer and key\n");
3462 return -1;
3463 }
3464
Paul Lawrence6bfed202014-07-28 12:47:22 -07003465 if (crypt_ftr.flags & CRYPT_INCONSISTENT_STATE) {
3466 return -1;
3467 }
3468
Paul Lawrencef4faa572014-01-29 13:31:03 -08003469 return crypt_ftr.crypt_type;
3470}
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003471
Paul Lawrence05335c32015-03-05 09:46:23 -08003472const char* cryptfs_get_password()
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003473{
Paul Crowley38132a12016-02-09 09:50:32 +00003474 if (e4crypt_is_native()) {
Paul Lawrence7b6b5652016-02-02 11:14:59 -08003475 SLOGE("cryptfs_get_password not valid for file encryption");
3476 return 0;
Paul Lawrence05335c32015-03-05 09:46:23 -08003477 }
3478
Paul Lawrence399317e2014-03-10 13:20:50 -07003479 struct timespec now;
Paul Lawrenceef2b5be2014-11-11 12:47:03 -08003480 clock_gettime(CLOCK_BOOTTIME, &now);
Paul Lawrence399317e2014-03-10 13:20:50 -07003481 if (now.tv_sec < password_expiry_time) {
3482 return password;
3483 } else {
3484 cryptfs_clear_password();
3485 return 0;
3486 }
3487}
3488
3489void cryptfs_clear_password()
3490{
3491 if (password) {
3492 size_t len = strlen(password);
3493 memset(password, 0, len);
3494 free(password);
3495 password = 0;
3496 password_expiry_time = 0;
3497 }
Paul Lawrence684dbdf2014-02-07 12:07:22 -08003498}
Paul Lawrence731a7a22015-04-28 22:14:15 +00003499
Paul Lawrence0c247462015-10-29 10:30:57 -07003500int cryptfs_isConvertibleToFBE()
3501{
Paul Crowleye2ee1522017-09-26 14:05:26 -07003502 struct fstab_rec* rec = fs_mgr_get_entry_for_mount_point(fstab_default, DATA_MNT_POINT);
Paul Lawrence0c247462015-10-29 10:30:57 -07003503 return fs_mgr_is_convertible_to_fbe(rec) ? 1 : 0;
3504}
AnilKumar Chimata98dc8352018-05-11 00:25:09 +05303505
3506int cryptfs_create_default_ftr(struct crypt_mnt_ftr* crypt_ftr, __attribute__((unused))int key_length)
3507{
3508 if (cryptfs_init_crypt_mnt_ftr(crypt_ftr)) {
3509 SLOGE("Failed to initialize crypt_ftr");
3510 return -1;
3511 }
3512
3513 if (create_encrypted_random_key(DEFAULT_PASSWORD, crypt_ftr->master_key,
3514 crypt_ftr->salt, crypt_ftr)) {
3515 SLOGE("Cannot create encrypted master key\n");
3516 return -1;
3517 }
3518
3519 //crypt_ftr->keysize = key_length / 8;
3520 return 0;
3521}
3522
3523int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password,
3524 unsigned char* master_key)
3525{
3526 int rc;
3527
3528 unsigned char* intermediate_key = 0;
3529 size_t intermediate_key_size = 0;
3530
3531 if (password == 0 || *password == 0) {
3532 password = DEFAULT_PASSWORD;
3533 }
3534
3535 rc = decrypt_master_key(password, master_key, ftr, &intermediate_key,
3536 &intermediate_key_size);
3537
3538 if (rc) {
3539 SLOGE("Can't calculate intermediate key");
3540 return rc;
3541 }
3542
3543 int N = 1 << ftr->N_factor;
3544 int r = 1 << ftr->r_factor;
3545 int p = 1 << ftr->p_factor;
3546
3547 unsigned char scrypted_intermediate_key[sizeof(ftr->scrypted_intermediate_key)];
3548
3549 rc = crypto_scrypt(intermediate_key, intermediate_key_size,
3550 ftr->salt, sizeof(ftr->salt), N, r, p,
3551 scrypted_intermediate_key,
3552 sizeof(scrypted_intermediate_key));
3553
3554 free(intermediate_key);
3555
3556 if (rc) {
3557 SLOGE("Can't scrypt intermediate key");
3558 return rc;
3559 }
3560
3561 return memcmp(scrypted_intermediate_key, ftr->scrypted_intermediate_key,
3562 intermediate_key_size);
3563}