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