summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShivaprasad Hongal <shongal@codeaurora.org>2017-07-13 17:03:47 -0700
committerMichael Bestas <mkbestas@lineageos.org>2017-12-20 19:05:42 +0200
commitbf2309fce5f5c2e423e7b7fe972c3da1c3f398c2 (patch)
treed86d1e0035143ab2952ed42f93ae32a75729cd60
parentd4d0a7d0b7dadc33ad4f6d75c84d5f650b76ed2b (diff)
downloadandroid_system_vold-bf2309fce5f5c2e423e7b7fe972c3da1c3f398c2.tar.gz
android_system_vold-bf2309fce5f5c2e423e7b7fe972c3da1c3f398c2.tar.bz2
android_system_vold-bf2309fce5f5c2e423e7b7fe972c3da1c3f398c2.zip
keymaster: Add support for upgrade_key for FDE
With KM 2.0 / 3.0, KM HAL would return KM_ERROR_KEY_REQUIRES_UPGRADE, hence adding support in vold for upgrade_key. Change-Id: I7dae9d156ad58ebcf17e0eb23d995eeab73887f8
-rw-r--r--Keymaster.cpp23
-rw-r--r--Keymaster.h5
-rw-r--r--cryptfs.cpp3
3 files changed, 28 insertions, 3 deletions
diff --git a/Keymaster.cpp b/Keymaster.cpp
index eb70b1c..b991418 100644
--- a/Keymaster.cpp
+++ b/Keymaster.cpp
@@ -260,7 +260,10 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob,
const uint8_t* object,
const size_t object_size,
uint8_t** signature_buffer,
- size_t* signature_buffer_size)
+ size_t* signature_buffer_size,
+ uint8_t* key_buffer,
+ uint32_t key_buffer_size,
+ uint32_t* key_out_size)
{
Keymaster dev;
if (!dev) {
@@ -287,6 +290,24 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob,
if (op.errorCode() == ErrorCode::KEY_RATE_LIMIT_EXCEEDED) {
sleep(ratelimit);
continue;
+ } else if (op.errorCode() == ErrorCode::KEY_REQUIRES_UPGRADE) {
+ std::string newKey;
+ bool ret = dev.upgradeKey(key, paramBuilder, &newKey);
+ if(ret == false) {
+ LOG(ERROR) << "Error upgradeKey: ";
+ return -1;
+ }
+
+ if (key_out_size) {
+ *key_out_size = newKey.size();
+ }
+
+ if (key_buffer_size < newKey.size()) {
+ return -1;
+ }
+
+ std::copy(newKey.data(), newKey.data() + newKey.size(), key_buffer);
+ key = newKey;
} else break;
}
diff --git a/Keymaster.h b/Keymaster.h
index f4a30ae..fccf257 100644
--- a/Keymaster.h
+++ b/Keymaster.h
@@ -173,7 +173,10 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob,
const uint8_t* object,
const size_t object_size,
uint8_t** signature_buffer,
- size_t* signature_buffer_size);
+ size_t* signature_buffer_size,
+ uint8_t* key_buffer,
+ uint32_t key_buffer_size,
+ uint32_t* key_out_size);
__END_DECLS
diff --git a/cryptfs.cpp b/cryptfs.cpp
index 313cde2..e2bafc5 100644
--- a/cryptfs.cpp
+++ b/cryptfs.cpp
@@ -329,7 +329,8 @@ static int keymaster_sign_object(struct crypt_mnt_ftr *ftr,
return -1;
}
return keymaster_sign_object_for_cryptfs_scrypt(ftr->keymaster_blob, ftr->keymaster_blob_size,
- KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign, to_sign_size, signature, signature_size);
+ KEYMASTER_CRYPTFS_RATE_LIMIT, to_sign, to_sign_size, signature, signature_size,
+ ftr->keymaster_blob, KEYMASTER_BLOB_SIZE, &ftr->keymaster_blob_size);
#endif
}