| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef KEYSTORE_USER_STATE_H_ |
| #define KEYSTORE_USER_STATE_H_ |
| |
| #include <sys/types.h> |
| |
| #include <openssl/aes.h> |
| |
| #include <utils/String8.h> |
| |
| #include <keystore/keystore.h> |
| |
| #include "entropy.h" |
| |
| class UserState { |
| public: |
| explicit UserState(uid_t userId); |
| ~UserState(); |
| |
| bool initialize(); |
| |
| uid_t getUserId() const { return mUserId; } |
| const char* getUserDirName() const { return mUserDir; } |
| |
| const char* getMasterKeyFileName() const { return mMasterKeyFile; } |
| |
| void setState(State state); |
| State getState() const { return mState; } |
| |
| int8_t getRetry() const { return mRetry; } |
| |
| void zeroizeMasterKeysInMemory(); |
| bool deleteMasterKey(); |
| |
| ResponseCode initialize(const android::String8& pw, Entropy* entropy); |
| |
| ResponseCode copyMasterKey(UserState* src); |
| ResponseCode copyMasterKeyFile(UserState* src); |
| ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy); |
| ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy); |
| |
| AES_KEY* getEncryptionKey() { return &mMasterKeyEncryption; } |
| AES_KEY* getDecryptionKey() { return &mMasterKeyDecryption; } |
| |
| bool reset(); |
| |
| private: |
| static const int MASTER_KEY_SIZE_BYTES = 16; |
| static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8; |
| |
| static const int MAX_RETRY = 4; |
| static const size_t SALT_SIZE = 16; |
| |
| void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw, |
| uint8_t* salt); |
| bool generateSalt(Entropy* entropy); |
| bool generateMasterKey(Entropy* entropy); |
| void setupMasterKeys(); |
| |
| uid_t mUserId; |
| |
| char* mUserDir; |
| char* mMasterKeyFile; |
| |
| State mState; |
| int8_t mRetry; |
| |
| uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES]; |
| uint8_t mSalt[SALT_SIZE]; |
| |
| AES_KEY mMasterKeyEncryption; |
| AES_KEY mMasterKeyDecryption; |
| }; |
| |
| #endif // KEYSTORE_USER_STATE_H_ |