blob: e240e4731adcac74f4a4d89eb913a0240971b8a8 [file] [log] [blame]
David Zeuthenab3e5652019-10-28 13:32:48 -04001/*
2 * Copyright (c) 2019, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef SYSTEM_SECURITY_CREDENTIAL_DATA_H_
18#define SYSTEM_SECURITY_CREDENTIAL_DATA_H_
19
20#include <sys/types.h>
21#include <unistd.h>
22
23#include <map>
24#include <string>
25#include <utility>
26#include <vector>
27
David Zeuthena6f9fba2020-02-11 22:08:27 -050028#include <android/hardware/identity/IIdentityCredential.h>
29#include <android/hardware/identity/SecureAccessControlProfile.h>
David Zeuthenab3e5652019-10-28 13:32:48 -040030
31namespace android {
32namespace security {
33namespace identity {
34
David Zeuthena6f9fba2020-02-11 22:08:27 -050035using ::android::hardware::identity::Certificate;
36using ::android::hardware::identity::IIdentityCredential;
37using ::android::hardware::identity::SecureAccessControlProfile;
David Zeuthenab3e5652019-10-28 13:32:48 -040038using ::std::map;
39using ::std::optional;
40using ::std::pair;
41using ::std::string;
42using ::std::tuple;
43using ::std::vector;
44
45struct EntryData {
46 EntryData() {}
47
48 uint64_t size = 0;
David Zeuthena6f9fba2020-02-11 22:08:27 -050049 vector<int32_t> accessControlProfileIds;
David Zeuthenab3e5652019-10-28 13:32:48 -040050 vector<vector<uint8_t>> encryptedChunks;
51};
52
53struct AuthKeyData {
54 AuthKeyData() {}
55
56 vector<uint8_t> certificate;
57 vector<uint8_t> keyBlob;
David Zeuthen27407a52021-03-04 16:32:43 -050058 int64_t expirationDateMillisSinceEpoch = 0;
David Zeuthenab3e5652019-10-28 13:32:48 -040059 vector<uint8_t> staticAuthenticationData;
60 vector<uint8_t> pendingCertificate;
61 vector<uint8_t> pendingKeyBlob;
62 int useCount = 0;
63};
64
65class CredentialData : public RefBase {
66 public:
67 CredentialData(const string& dataPath, uid_t ownerUid, const string& name);
68
69 static string calculateCredentialFileName(const string& dataPath, uid_t ownerUid,
70 const string& name);
71
72 static optional<bool> credentialExists(const string& dataPath, uid_t ownerUid,
73 const string& name);
74
75 void setSecureUserId(int64_t secureUserId);
76
77 void setCredentialData(const vector<uint8_t>& credentialData);
78
79 void setAttestationCertificate(const vector<uint8_t>& attestationCertificate);
80
81 void
82 addSecureAccessControlProfile(const SecureAccessControlProfile& secureAccessControlProfile);
83
84 void addEntryData(const string& namespaceName, const string& entryName, const EntryData& data);
85
86 bool saveToDisk() const;
87
88 bool loadFromDisk();
89
90 bool deleteCredential();
91
92 void setAvailableAuthenticationKeys(int keyCount, int maxUsesPerKey);
93
94 // Getters
95
96 int64_t getSecureUserId();
97
98 const vector<uint8_t>& getCredentialData() const;
99
100 const vector<uint8_t>& getAttestationCertificate() const;
101
102 const vector<SecureAccessControlProfile>& getSecureAccessControlProfiles() const;
103
104 bool hasEntryData(const string& namespaceName, const string& entryName) const;
105
106 optional<EntryData> getEntryData(const string& namespaceName, const string& entryName) const;
107
108 const vector<AuthKeyData>& getAuthKeyDatas() const;
109
David Zeuthen472e6c82020-10-16 11:50:13 -0400110 pair<int /* keyCount */, int /*maxUsersPerKey */> getAvailableAuthenticationKeys();
111
David Zeuthenab3e5652019-10-28 13:32:48 -0400112 // Returns |nullptr| if a suitable key cannot be found. Otherwise returns
113 // the authentication and increases its use-count.
David Zeuthen045a2c82021-09-11 13:52:17 -0400114 const AuthKeyData* selectAuthKey(bool allowUsingExhaustedKeys, bool allowUsingExpiredKeys,
115 bool incrementUsageCount);
David Zeuthenab3e5652019-10-28 13:32:48 -0400116
David Zeuthena6f9fba2020-02-11 22:08:27 -0500117 optional<vector<vector<uint8_t>>>
118 getAuthKeysNeedingCertification(const sp<IIdentityCredential>& halBinder);
David Zeuthenab3e5652019-10-28 13:32:48 -0400119
120 bool storeStaticAuthenticationData(const vector<uint8_t>& authenticationKey,
David Zeuthen472e6c82020-10-16 11:50:13 -0400121 int64_t expirationDateMillisSinceEpoch,
David Zeuthenab3e5652019-10-28 13:32:48 -0400122 const vector<uint8_t>& staticAuthData);
123
124 private:
David Zeuthen472e6c82020-10-16 11:50:13 -0400125 AuthKeyData* findAuthKey_(bool allowUsingExhaustedKeys, bool allowUsingExpiredKeys);
126
David Zeuthenab3e5652019-10-28 13:32:48 -0400127 // Set by constructor.
128 //
129 string dataPath_;
130 uid_t ownerUid_;
131 string name_;
132
133 // Calculated at construction time, from |dataPath_|, |ownerUid_|, |name_|.
134 string fileName_;
135
136 // Data serialized in CBOR from here:
137 //
138 int64_t secureUserId_;
139 vector<uint8_t> credentialData_;
140 vector<uint8_t> attestationCertificate_;
141 vector<SecureAccessControlProfile> secureAccessControlProfiles_;
142 map<string, EntryData> idToEncryptedChunks_;
143
144 int keyCount_ = 0;
145 int maxUsesPerKey_ = 1;
146 vector<AuthKeyData> authKeyDatas_; // Always |keyCount_| long.
147};
148
149} // namespace identity
150} // namespace security
151} // namespace android
152
153#endif // SYSTEM_SECURITY_CREDENTIAL_DATA_H_