blob: 3f7cd3afdf5b245a591ff00026936cc3195cc6b4 [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;
David Zeuthenab3e5652019-10-28 13:32:48 -040040using ::std::string;
41using ::std::tuple;
42using ::std::vector;
43
44struct EntryData {
45 EntryData() {}
46
47 uint64_t size = 0;
David Zeuthena6f9fba2020-02-11 22:08:27 -050048 vector<int32_t> accessControlProfileIds;
David Zeuthenab3e5652019-10-28 13:32:48 -040049 vector<vector<uint8_t>> encryptedChunks;
50};
51
52struct AuthKeyData {
53 AuthKeyData() {}
54
55 vector<uint8_t> certificate;
56 vector<uint8_t> keyBlob;
David Zeuthen27407a52021-03-04 16:32:43 -050057 int64_t expirationDateMillisSinceEpoch = 0;
David Zeuthenab3e5652019-10-28 13:32:48 -040058 vector<uint8_t> staticAuthenticationData;
59 vector<uint8_t> pendingCertificate;
60 vector<uint8_t> pendingKeyBlob;
61 int useCount = 0;
62};
63
64class CredentialData : public RefBase {
65 public:
66 CredentialData(const string& dataPath, uid_t ownerUid, const string& name);
67
68 static string calculateCredentialFileName(const string& dataPath, uid_t ownerUid,
69 const string& name);
70
71 static optional<bool> credentialExists(const string& dataPath, uid_t ownerUid,
72 const string& name);
73
74 void setSecureUserId(int64_t secureUserId);
75
76 void setCredentialData(const vector<uint8_t>& credentialData);
77
78 void setAttestationCertificate(const vector<uint8_t>& attestationCertificate);
79
80 void
81 addSecureAccessControlProfile(const SecureAccessControlProfile& secureAccessControlProfile);
82
83 void addEntryData(const string& namespaceName, const string& entryName, const EntryData& data);
84
85 bool saveToDisk() const;
86
87 bool loadFromDisk();
88
89 bool deleteCredential();
90
David Zeuthenc239db42022-11-14 15:22:24 -050091 void setAvailableAuthenticationKeys(int keyCount, int maxUsesPerKey,
92 int64_t minValidTimeMillis);
David Zeuthenab3e5652019-10-28 13:32:48 -040093
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 Zeuthenc239db42022-11-14 15:22:24 -0500110 tuple<int /* keyCount */, int /*maxUsersPerKey */, int64_t /* minValidTimeMillis */>
111 getAvailableAuthenticationKeys() const;
David Zeuthen472e6c82020-10-16 11:50:13 -0400112
David Zeuthenab3e5652019-10-28 13:32:48 -0400113 // Returns |nullptr| if a suitable key cannot be found. Otherwise returns
114 // the authentication and increases its use-count.
David Zeuthen045a2c82021-09-11 13:52:17 -0400115 const AuthKeyData* selectAuthKey(bool allowUsingExhaustedKeys, bool allowUsingExpiredKeys,
116 bool incrementUsageCount);
David Zeuthenab3e5652019-10-28 13:32:48 -0400117
David Zeuthena6f9fba2020-02-11 22:08:27 -0500118 optional<vector<vector<uint8_t>>>
119 getAuthKeysNeedingCertification(const sp<IIdentityCredential>& halBinder);
David Zeuthenab3e5652019-10-28 13:32:48 -0400120
121 bool storeStaticAuthenticationData(const vector<uint8_t>& authenticationKey,
David Zeuthen472e6c82020-10-16 11:50:13 -0400122 int64_t expirationDateMillisSinceEpoch,
David Zeuthenab3e5652019-10-28 13:32:48 -0400123 const vector<uint8_t>& staticAuthData);
124
125 private:
David Zeuthen472e6c82020-10-16 11:50:13 -0400126 AuthKeyData* findAuthKey_(bool allowUsingExhaustedKeys, bool allowUsingExpiredKeys);
127
David Zeuthenab3e5652019-10-28 13:32:48 -0400128 // Set by constructor.
129 //
130 string dataPath_;
131 uid_t ownerUid_;
132 string name_;
133
134 // Calculated at construction time, from |dataPath_|, |ownerUid_|, |name_|.
135 string fileName_;
136
137 // Data serialized in CBOR from here:
138 //
139 int64_t secureUserId_;
140 vector<uint8_t> credentialData_;
141 vector<uint8_t> attestationCertificate_;
142 vector<SecureAccessControlProfile> secureAccessControlProfiles_;
143 map<string, EntryData> idToEncryptedChunks_;
144
145 int keyCount_ = 0;
146 int maxUsesPerKey_ = 1;
David Zeuthenc239db42022-11-14 15:22:24 -0500147 int64_t minValidTimeMillis_ = 0;
David Zeuthenab3e5652019-10-28 13:32:48 -0400148 vector<AuthKeyData> authKeyDatas_; // Always |keyCount_| long.
149};
150
151} // namespace identity
152} // namespace security
153} // namespace android
154
155#endif // SYSTEM_SECURITY_CREDENTIAL_DATA_H_