keystore.h revision 715d023c9294cf4860f73c8d83e82c5aa699add6
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_KEYSTORE_H_
186507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#define KEYSTORE_KEYSTORE_H_
196507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
206507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include "user_state.h"
216507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
22715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden#include <hardware/keymaster2.h>
236507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
246507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include <utils/Vector.h>
256507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
266507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#include "blob.h"
276507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
286507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willdentypedef struct {
296507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    uint32_t uid;
306507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    const uint8_t* filename;
316507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden} grant_t;
326507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
336507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willdenclass KeyStore {
346507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden  public:
35715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    KeyStore(Entropy* entropy, keymaster2_device_t* device, keymaster2_device_t* fallback);
366507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ~KeyStore();
376507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
38715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    keymaster2_device_t* getDevice() const { return mDevice; }
396507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
40715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    keymaster2_device_t* getFallbackDevice() const { return mFallbackDevice; }
416507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
42715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    keymaster2_device_t* getDeviceForBlob(const Blob& blob) const {
436507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden        return blob.isFallback() ? mFallbackDevice : mDevice;
446507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    }
456507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
466507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode initialize();
476507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
486507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    State getState(uid_t userId) { return getUserState(userId)->getState(); }
496507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
506507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode initializeUser(const android::String8& pw, uid_t userId);
516507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
526507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode copyMasterKey(uid_t srcUser, uid_t dstUser);
536507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode writeMasterKey(const android::String8& pw, uid_t userId);
546507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode readMasterKey(const android::String8& pw, uid_t userId);
556507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
566507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    android::String8 getKeyName(const android::String8& keyName);
576507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid);
586507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid);
596507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
606507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /*
616507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Delete entries owned by userId. If keepUnencryptedEntries is true
626507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * then only encrypted entries will be removed, otherwise all entries will
636507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * be removed.
646507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
656507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    void resetUser(uid_t userId, bool keepUnenryptedEntries);
666507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool isEmpty(uid_t userId) const;
676507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
686507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    void lock(uid_t userId);
696507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
706507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t userId);
716507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode put(const char* filename, Blob* keyBlob, uid_t userId);
726507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode del(const char* filename, const BlobType type, uid_t userId);
736507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode list(const android::String8& prefix, android::Vector<android::String16>* matches,
746507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden                      uid_t userId);
756507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
766507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    void addGrant(const char* filename, uid_t granteeUid);
776507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool removeGrant(const char* filename, uid_t granteeUid);
786507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool hasGrant(const char* filename, const uid_t uid) const {
796507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden        return getGrant(filename, uid) != NULL;
806507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    }
816507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
826507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t userId,
836507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden                           int32_t flags);
846507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
856507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool isHardwareBacked(const android::String16& keyType) const;
866507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
876507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
886507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden                               const BlobType type);
896507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
906507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
916507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Returns any existing UserState or creates it if it doesn't exist.
926507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
936507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    UserState* getUserState(uid_t userId);
946507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
956507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
966507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Returns any existing UserState or creates it if it doesn't exist.
976507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
986507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    UserState* getUserStateByUid(uid_t uid);
996507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1006507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
1016507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Returns NULL if the UserState doesn't already exist.
1026507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
1036507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    const UserState* getUserState(uid_t userId) const;
1046507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1056507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
1066507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Returns NULL if the UserState doesn't already exist.
1076507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
1086507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    const UserState* getUserStateByUid(uid_t uid) const;
1096507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1106507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden  private:
1116507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    static const char* sOldMasterKey;
1126507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    static const char* sMetaDataFile;
1136507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    static const android::String16 sRSAKeyType;
1146507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    static const android::String16 sECKeyType;
1156507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    Entropy* mEntropy;
1166507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
117715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    keymaster2_device_t* mDevice;
118715d023c9294cf4860f73c8d83e82c5aa699add6Shawn Willden    keymaster2_device_t* mFallbackDevice;
1196507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1206507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    android::Vector<UserState*> mMasterKeys;
1216507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1226507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    android::Vector<grant_t*> mGrants;
1236507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1246507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    typedef struct { uint32_t version; } keystore_metadata_t;
1256507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1266507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    keystore_metadata_t mMetaData;
1276507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1286507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    const grant_t* getGrant(const char* filename, uid_t uid) const;
1296507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1306507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
1316507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Upgrade the key from the current version to whatever is newest.
1326507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
1336507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
1346507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden                     const BlobType type, uid_t uid);
1356507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1366507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    /**
1376507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * Takes a blob that is an PEM-encoded RSA key as a byte array and converts it to a DER-encoded
1386507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * PKCS#8 for import into a keymaster.  Then it overwrites the original blob with the new blob
1396507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     * format that is returned from the keymaster.
1406507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden     */
1416507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid);
1426507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1436507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    void readMetaData();
1446507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    void writeMetaData();
1456507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1466507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden    bool upgradeKeystore();
1476507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden};
1486507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden
1496507c27ab7ea34dd150d7ef9fda41878ed32547cShawn Willden#endif  // KEYSTORE_KEYSTORE_H_
150