16507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden/* 26507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * Copyright (C) 2016 The Android Open Source Project 36507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * 46507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 56507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * you may not use this file except in compliance with the License. 66507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * You may obtain a copy of the License at 76507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * 86507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * http://www.apache.org/licenses/LICENSE-2.0 96507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * 106507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * Unless required by applicable law or agreed to in writing, software 116507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 126507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * See the License for the specific language governing permissions and 146507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden * limitations under the License. 156507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden */ 166507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 176507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#ifndef KEYSTORE_USER_STATE_H_ 186507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#define KEYSTORE_USER_STATE_H_ 196507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 206507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include <sys/types.h> 216507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 226507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include <openssl/aes.h> 236507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 246507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include <utils/String8.h> 256507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 266507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include <keystore/keystore.h> 276507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 286507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include "entropy.h" 296507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 306507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willdenclass UserState { 316507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden public: 32d7791be04b7572dbcb8c683408e66ce7184841f2Chih-Hung Hsieh explicit UserState(uid_t userId); 336507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ~UserState(); 346507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 356507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden bool initialize(); 366507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 376507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden uid_t getUserId() const { return mUserId; } 386507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden const char* getUserDirName() const { return mUserDir; } 396507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 406507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden const char* getMasterKeyFileName() const { return mMasterKeyFile; } 416507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 426507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden void setState(State state); 436507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden State getState() const { return mState; } 446507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 456507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden int8_t getRetry() const { return mRetry; } 466507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 476507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden void zeroizeMasterKeysInMemory(); 486507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden bool deleteMasterKey(); 496507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 506507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ResponseCode initialize(const android::String8& pw, Entropy* entropy); 516507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 526507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ResponseCode copyMasterKey(UserState* src); 536507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ResponseCode copyMasterKeyFile(UserState* src); 546507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy); 556507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy); 566507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 57e9830589dde19b080fbbfad5fdb1ae6e2955df68Shawn Willden auto& getEncryptionKey() const { return mMasterKey; } 586507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 596507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden bool reset(); 606507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 616507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden private: 626507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden static const int MASTER_KEY_SIZE_BYTES = 16; 636507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8; 646507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 656507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden static const int MAX_RETRY = 4; 666507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden static const size_t SALT_SIZE = 16; 676507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 686507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw, 696507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden uint8_t* salt); 706507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden bool generateSalt(Entropy* entropy); 716507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden bool generateMasterKey(Entropy* entropy); 726507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden void setupMasterKeys(); 736507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 746507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden uid_t mUserId; 756507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 766507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden char* mUserDir; 776507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden char* mMasterKeyFile; 786507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 796507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden State mState; 806507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden int8_t mRetry; 816507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 826507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES]; 836507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden uint8_t mSalt[SALT_SIZE]; 846507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden}; 856507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden 866507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#endif // KEYSTORE_USER_STATE_H_ 87