/* * 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 #include #include #include #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); auto& getEncryptionKey() const { return mMasterKey; } 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]; }; #endif // KEYSTORE_USER_STATE_H_