• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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 #include <keymint_support/authorization_set.h>
18 
19 #include <aidl/android/hardware/security/keymint/Algorithm.h>
20 #include <aidl/android/hardware/security/keymint/BlockMode.h>
21 #include <aidl/android/hardware/security/keymint/Digest.h>
22 #include <aidl/android/hardware/security/keymint/KeyParameter.h>
23 #include <aidl/android/hardware/security/keymint/KeyPurpose.h>
24 
25 #include <algorithm>
26 
27 namespace aidl::android::hardware::security::keymint {
28 
Sort()29 void AuthorizationSet::Sort() {
30     std::sort(data_.begin(), data_.end());
31 }
32 
Deduplicate()33 void AuthorizationSet::Deduplicate() {
34     if (data_.empty()) return;
35 
36     Sort();
37     std::vector<KeyParameter> result;
38 
39     auto curr = data_.begin();
40     auto prev = curr++;
41     for (; curr != data_.end(); ++prev, ++curr) {
42         if (prev->tag == Tag::INVALID) continue;
43 
44         if (*prev != *curr) {
45             result.push_back(std::move(*prev));
46         }
47     }
48     result.push_back(std::move(*prev));
49 
50     std::swap(data_, result);
51 }
52 
Union(const AuthorizationSet & other)53 void AuthorizationSet::Union(const AuthorizationSet& other) {
54     data_.insert(data_.end(), other.data_.begin(), other.data_.end());
55     Deduplicate();
56 }
57 
Subtract(const AuthorizationSet & other)58 void AuthorizationSet::Subtract(const AuthorizationSet& other) {
59     Deduplicate();
60 
61     auto i = other.begin();
62     while (i != other.end()) {
63         int pos = -1;
64         do {
65             pos = find(i->tag, pos);
66             if (pos != -1 && (*i == data_[pos])) {
67                 data_.erase(data_.begin() + pos);
68                 break;
69             }
70         } while (pos != -1);
71         ++i;
72     }
73 }
74 
operator [](int at)75 KeyParameter& AuthorizationSet::operator[](int at) {
76     return data_[at];
77 }
78 
operator [](int at) const79 const KeyParameter& AuthorizationSet::operator[](int at) const {
80     return data_[at];
81 }
82 
Clear()83 void AuthorizationSet::Clear() {
84     data_.clear();
85 }
86 
GetTagCount(Tag tag) const87 size_t AuthorizationSet::GetTagCount(Tag tag) const {
88     size_t count = 0;
89     for (int pos = -1; (pos = find(tag, pos)) != -1;) ++count;
90     return count;
91 }
92 
find(Tag tag,int begin) const93 int AuthorizationSet::find(Tag tag, int begin) const {
94     auto iter = data_.begin() + (1 + begin);
95 
96     while (iter != data_.end() && iter->tag != tag) ++iter;
97 
98     if (iter != data_.end()) return iter - data_.begin();
99     return -1;
100 }
101 
erase(int index)102 bool AuthorizationSet::erase(int index) {
103     auto pos = data_.begin() + index;
104     if (pos != data_.end()) {
105         data_.erase(pos);
106         return true;
107     }
108     return false;
109 }
110 
GetEntry(Tag tag) const111 std::optional<std::reference_wrapper<const KeyParameter>> AuthorizationSet::GetEntry(
112         Tag tag) const {
113     int pos = find(tag);
114     if (pos == -1) return {};
115     return std::reference_wrapper(data_[pos]);
116 }
117 
RsaKey(uint32_t key_size,uint64_t public_exponent)118 AuthorizationSetBuilder& AuthorizationSetBuilder::RsaKey(uint32_t key_size,
119                                                          uint64_t public_exponent) {
120     Authorization(TAG_ALGORITHM, Algorithm::RSA);
121     Authorization(TAG_KEY_SIZE, key_size);
122     Authorization(TAG_RSA_PUBLIC_EXPONENT, public_exponent);
123     return *this;
124 }
125 
EcdsaKey(uint32_t key_size)126 AuthorizationSetBuilder& AuthorizationSetBuilder::EcdsaKey(uint32_t key_size) {
127     Authorization(TAG_ALGORITHM, Algorithm::EC);
128     Authorization(TAG_KEY_SIZE, key_size);
129     return *this;
130 }
131 
EcdsaKey(EcCurve curve)132 AuthorizationSetBuilder& AuthorizationSetBuilder::EcdsaKey(EcCurve curve) {
133     Authorization(TAG_ALGORITHM, Algorithm::EC);
134     Authorization(TAG_EC_CURVE, curve);
135     return *this;
136 }
137 
AesKey(uint32_t key_size)138 AuthorizationSetBuilder& AuthorizationSetBuilder::AesKey(uint32_t key_size) {
139     Authorization(TAG_ALGORITHM, Algorithm::AES);
140     return Authorization(TAG_KEY_SIZE, key_size);
141 }
142 
TripleDesKey(uint32_t key_size)143 AuthorizationSetBuilder& AuthorizationSetBuilder::TripleDesKey(uint32_t key_size) {
144     Authorization(TAG_ALGORITHM, Algorithm::TRIPLE_DES);
145     return Authorization(TAG_KEY_SIZE, key_size);
146 }
147 
HmacKey(uint32_t key_size)148 AuthorizationSetBuilder& AuthorizationSetBuilder::HmacKey(uint32_t key_size) {
149     Authorization(TAG_ALGORITHM, Algorithm::HMAC);
150     Authorization(TAG_KEY_SIZE, key_size);
151     return SigningKey();
152 }
153 
RsaSigningKey(uint32_t key_size,uint64_t public_exponent)154 AuthorizationSetBuilder& AuthorizationSetBuilder::RsaSigningKey(uint32_t key_size,
155                                                                 uint64_t public_exponent) {
156     RsaKey(key_size, public_exponent);
157     return SigningKey();
158 }
159 
RsaEncryptionKey(uint32_t key_size,uint64_t public_exponent)160 AuthorizationSetBuilder& AuthorizationSetBuilder::RsaEncryptionKey(uint32_t key_size,
161                                                                    uint64_t public_exponent) {
162     RsaKey(key_size, public_exponent);
163     return EncryptionKey();
164 }
165 
EcdsaSigningKey(EcCurve curve)166 AuthorizationSetBuilder& AuthorizationSetBuilder::EcdsaSigningKey(EcCurve curve) {
167     EcdsaKey(curve);
168     return SigningKey();
169 }
170 
AesEncryptionKey(uint32_t key_size)171 AuthorizationSetBuilder& AuthorizationSetBuilder::AesEncryptionKey(uint32_t key_size) {
172     AesKey(key_size);
173     return EncryptionKey();
174 }
175 
TripleDesEncryptionKey(uint32_t key_size)176 AuthorizationSetBuilder& AuthorizationSetBuilder::TripleDesEncryptionKey(uint32_t key_size) {
177     TripleDesKey(key_size);
178     return EncryptionKey();
179 }
180 
SigningKey()181 AuthorizationSetBuilder& AuthorizationSetBuilder::SigningKey() {
182     Authorization(TAG_PURPOSE, KeyPurpose::SIGN);
183     return Authorization(TAG_PURPOSE, KeyPurpose::VERIFY);
184 }
185 
EncryptionKey()186 AuthorizationSetBuilder& AuthorizationSetBuilder::EncryptionKey() {
187     Authorization(TAG_PURPOSE, KeyPurpose::ENCRYPT);
188     return Authorization(TAG_PURPOSE, KeyPurpose::DECRYPT);
189 }
190 
AttestKey()191 AuthorizationSetBuilder& AuthorizationSetBuilder::AttestKey() {
192     return Authorization(TAG_PURPOSE, KeyPurpose::ATTEST_KEY);
193 }
194 
NoDigestOrPadding()195 AuthorizationSetBuilder& AuthorizationSetBuilder::NoDigestOrPadding() {
196     Authorization(TAG_DIGEST, Digest::NONE);
197     return Authorization(TAG_PADDING, PaddingMode::NONE);
198 }
199 
EcbMode()200 AuthorizationSetBuilder& AuthorizationSetBuilder::EcbMode() {
201     return Authorization(TAG_BLOCK_MODE, BlockMode::ECB);
202 }
203 
GcmModeMinMacLen(uint32_t minMacLength)204 AuthorizationSetBuilder& AuthorizationSetBuilder::GcmModeMinMacLen(uint32_t minMacLength) {
205     return BlockMode(BlockMode::GCM)
206             .Padding(PaddingMode::NONE)
207             .Authorization(TAG_MIN_MAC_LENGTH, minMacLength);
208 }
209 
GcmModeMacLen(uint32_t macLength)210 AuthorizationSetBuilder& AuthorizationSetBuilder::GcmModeMacLen(uint32_t macLength) {
211     return BlockMode(BlockMode::GCM)
212             .Padding(PaddingMode::NONE)
213             .Authorization(TAG_MAC_LENGTH, macLength);
214 }
215 
BlockMode(std::initializer_list<aidl::android::hardware::security::keymint::BlockMode> blockModes)216 AuthorizationSetBuilder& AuthorizationSetBuilder::BlockMode(
217         std::initializer_list<aidl::android::hardware::security::keymint::BlockMode> blockModes) {
218     for (auto mode : blockModes) {
219         push_back(TAG_BLOCK_MODE, mode);
220     }
221     return *this;
222 }
223 
Digest(std::vector<keymint::Digest> digests)224 AuthorizationSetBuilder& AuthorizationSetBuilder::Digest(std::vector<keymint::Digest> digests) {
225     for (auto digest : digests) {
226         push_back(TAG_DIGEST, digest);
227     }
228     return *this;
229 }
230 
OaepMGFDigest(const std::vector<android::hardware::security::keymint::Digest> & digests)231 AuthorizationSetBuilder& AuthorizationSetBuilder::OaepMGFDigest(
232         const std::vector<android::hardware::security::keymint::Digest>& digests) {
233     for (auto digest : digests) {
234         push_back(TAG_RSA_OAEP_MGF_DIGEST, digest);
235     }
236     return *this;
237 }
238 
Padding(std::initializer_list<PaddingMode> paddingModes)239 AuthorizationSetBuilder& AuthorizationSetBuilder::Padding(
240         std::initializer_list<PaddingMode> paddingModes) {
241     for (auto paddingMode : paddingModes) {
242         push_back(TAG_PADDING, paddingMode);
243     }
244     return *this;
245 }
246 
SetDefaultValidity()247 AuthorizationSetBuilder& AuthorizationSetBuilder::SetDefaultValidity() {
248     // Per RFC 5280 4.1.2.5, an undefined expiration (not-after) field should be set to
249     // GeneralizedTime 999912312359559, which is 253402300799000 ms from Jan 1, 1970.
250     constexpr uint64_t kUndefinedExpirationDateTime = 253402300799000;
251     Authorization(TAG_CERTIFICATE_NOT_BEFORE, 0);
252     return Authorization(TAG_CERTIFICATE_NOT_AFTER, kUndefinedExpirationDateTime);
253 }
254 
255 }  // namespace aidl::android::hardware::security::keymint
256