diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2019-10-03 17:56:12 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-10-03 17:56:12 +0000 |
commit | 946f1d11c034b8ad5aa385c7c946c623f419404d (patch) | |
tree | 57a7aeff73b5fe880ab1e49e45ea66a47e6a36fc | |
parent | a28f0d8c6317d23dacc339aad8e884a0fdfdbf6d (diff) | |
parent | 17b8709c67af1340146f1e42bbd03a4a7913f9d0 (diff) | |
download | security-946f1d11c034b8ad5aa385c7c946c623f419404d.tar.gz |
Merge "Fix handling of user password changes."
-rw-r--r-- | keystore/blob.h | 1 | ||||
-rw-r--r-- | keystore/user_state.cpp | 13 | ||||
-rw-r--r-- | keystore/user_state.h | 12 |
3 files changed, 15 insertions, 11 deletions
diff --git a/keystore/blob.h b/keystore/blob.h index ce488ec9..e0bd1469 100644 --- a/keystore/blob.h +++ b/keystore/blob.h @@ -37,6 +37,7 @@ constexpr size_t kAesKeySize = 128 / 8; constexpr size_t kGcmTagLength = 128 / 8; constexpr size_t kGcmIvLength = 96 / 8; constexpr size_t kAes128KeySizeBytes = 128 / 8; +constexpr size_t kAes256KeySizeBytes = 256 / 8; /* Here is the file format. There are two parts in blob.value, the secret and * the description. The secret is stored in ciphertext, and its original size diff --git a/keystore/user_state.cpp b/keystore/user_state.cpp index bc3f6d9a..8d993e23 100644 --- a/keystore/user_state.cpp +++ b/keystore/user_state.cpp @@ -140,10 +140,13 @@ ResponseCode UserState::copyMasterKeyFile(LockedUserState<UserState>* src) { } ResponseCode UserState::writeMasterKey(const android::String8& pw) { - std::vector<uint8_t> passwordKey(MASTER_KEY_SIZE_BYTES); + std::vector<uint8_t> passwordKey(mMasterKey.size()); generateKeyFromPassword(passwordKey, pw, mSalt); - Blob masterKeyBlob(mMasterKey.data(), mMasterKey.size(), mSalt, sizeof(mSalt), - TYPE_MASTER_KEY_AES256); + auto blobType = TYPE_MASTER_KEY_AES256; + if (mMasterKey.size() == kAes128KeySizeBytes) { + blobType = TYPE_MASTER_KEY; + } + Blob masterKeyBlob(mMasterKey.data(), mMasterKey.size(), mSalt, sizeof(mSalt), blobType); auto lockedEntry = LockedKeyBlobEntry::get(mMasterKeyEntry); return lockedEntry.writeBlobs(masterKeyBlob, {}, passwordKey, STATE_NO_ERROR); } @@ -174,7 +177,7 @@ ResponseCode UserState::readMasterKey(const android::String8& pw) { size_t masterKeySize = MASTER_KEY_SIZE_BYTES; if (rawBlob.type == TYPE_MASTER_KEY) { - masterKeySize = SHA1_DIGEST_SIZE_BYTES; + masterKeySize = kAes128KeySizeBytes; } std::vector<uint8_t> passwordKey(masterKeySize); @@ -263,7 +266,7 @@ void UserState::generateKeyFromPassword(std::vector<uint8_t>& key, const android const EVP_MD* digest = EVP_sha256(); // SHA1 was used prior to increasing the key size - if (key.size() == SHA1_DIGEST_SIZE_BYTES) { + if (key.size() == kAes128KeySizeBytes) { digest = EVP_sha1(); } diff --git a/keystore/user_state.h b/keystore/user_state.h index b0671e39..620aaa5f 100644 --- a/keystore/user_state.h +++ b/keystore/user_state.h @@ -75,14 +75,14 @@ class UserState { bool operator<(uid_t userId) const; private: - static const int SHA1_DIGEST_SIZE_BYTES = 16; - static const int SHA256_DIGEST_SIZE_BYTES = 32; + static constexpr int SHA1_DIGEST_SIZE_BYTES = 16; + static constexpr int SHA256_DIGEST_SIZE_BYTES = 32; - static const int MASTER_KEY_SIZE_BYTES = SHA256_DIGEST_SIZE_BYTES; - static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8; + static constexpr int MASTER_KEY_SIZE_BYTES = kAes256KeySizeBytes; + static constexpr int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8; - static const int MAX_RETRY = 4; - static const size_t SALT_SIZE = 16; + static constexpr int MAX_RETRY = 4; + static constexpr size_t SALT_SIZE = 16; void generateKeyFromPassword(std::vector<uint8_t>& key, const android::String8& pw, uint8_t* salt); |