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