authorization_set.h revision 941d1c4ad4422a796d90010191c11aef0580295e
15ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/* 25ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Copyright 2014 The Android Open Source Project 35ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 45ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 55ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * you may not use this file except in compliance with the License. 65ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * You may obtain a copy of the License at 75ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 85ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * http://www.apache.org/licenses/LICENSE-2.0 95ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Unless required by applicable law or agreed to in writing, software 115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * See the License for the specific language governing permissions and 145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * limitations under the License. 155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 17b10f3b26af1e3b382d9ef361b3eb5279d16a9c05Shawn Willden#ifndef SYSTEM_KEYMASTER_AUTHORIZATION_SET_H_ 18b10f3b26af1e3b382d9ef361b3eb5279d16a9c05Shawn Willden#define SYSTEM_KEYMASTER_AUTHORIZATION_SET_H_ 195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include <UniquePtr.h> 215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 22b9d584d3dacc8041e5502cd0d036e21895eb6dc6Shawn Willden#include <hardware/keymaster_defs.h> 2398d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/keymaster_tags.h> 2498d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/serializable.h> 255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster { 275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/** 295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * A container that manages a set of keymaster_key_param_t objects, providing serialization, 305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * de-serialization and accessors. 315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdenclass AuthorizationSet : public Serializable { 335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden public: 345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Construct an empty, dynamically-allocated, growable AuthorizationSet. Does not actually 365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * allocate any storage until elements are added, so there is no cost to creating an 375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * AuthorizationSet with this constructor and then reinitializing it to point at pre-allocated 385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * buffers, with \p Reinitialize. 395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet() 415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden : elems_(NULL), elems_size_(0), elems_capacity_(0), indirect_data_(NULL), 42172f8c9be706e27f43022063bbc7f4b0177583acShawn Willden indirect_data_size_(0), indirect_data_capacity_(0), error_(OK) {} 435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Construct an AuthorizationSet from the provided array. The AuthorizationSet copies the data 465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * from the provided array (and the data referenced by its embedded pointers, if any) into 475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * dynamically-allocated storage. If allocation of the needed storage fails, \p is_valid() will 485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * return ALLOCATION_FAILURE. It is the responsibility of the caller to check before using the 495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * set, if allocations might fail. 505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 5158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden AuthorizationSet(const keymaster_key_param_t* elems, size_t count) 5258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden : elems_(NULL), indirect_data_(NULL) { 535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Reinitialize(elems, count); 545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden AuthorizationSet(const uint8_t* serialized_set, size_t serialized_size) 5758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden : elems_(NULL), indirect_data_(NULL) { 5858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden Deserialize(&serialized_set, serialized_set + serialized_size); 595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden // Copy constructor. 6258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden AuthorizationSet(const AuthorizationSet&); 6358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden 645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 65941d1c4ad4422a796d90010191c11aef0580295eShawn Willden * Clear existing authorization set data 66941d1c4ad4422a796d90010191c11aef0580295eShawn Willden */ 67941d1c4ad4422a796d90010191c11aef0580295eShawn Willden void Clear(); 68941d1c4ad4422a796d90010191c11aef0580295eShawn Willden 69941d1c4ad4422a796d90010191c11aef0580295eShawn Willden /** 705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Reinitialize an AuthorizationSet as a dynamically-allocated, growable copy of the data in the 715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * provided array (and the data referenced by its embedded pointers, if any). If the allocation 725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * of the needed storage fails this method will return false and \p is_valid() will return 735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * ALLOCATION_FAILURE. 745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool Reinitialize(const keymaster_key_param_t* elems, size_t count); 765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 777636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden bool Reinitialize(const AuthorizationSet& set) { 787636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden return Reinitialize(set.elems_, set.elems_size_); 797636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden } 807636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden 8158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden ~AuthorizationSet(); 825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden enum Error { 8458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden OK, 855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ALLOCATION_FAILURE, 865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden MALFORMED_DATA, 875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 89172f8c9be706e27f43022063bbc7f4b0177583acShawn Willden Error is_valid() const { return error_; } 905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Returns the size of the set. 935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 94172f8c9be706e27f43022063bbc7f4b0177583acShawn Willden size_t size() const { return elems_size_; } 957636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden 967636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden /** 97370121346777e13437c275fbe7a975d899cc325cShawn Willden * Returns the total size of all indirect data referenced by set elements. 98370121346777e13437c275fbe7a975d899cc325cShawn Willden */ 99370121346777e13437c275fbe7a975d899cc325cShawn Willden size_t indirect_size() const { return indirect_data_size_; } 100370121346777e13437c275fbe7a975d899cc325cShawn Willden 101370121346777e13437c275fbe7a975d899cc325cShawn Willden /** 1027636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden * Returns the data in the set, directly. Be careful with this. 1037636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden */ 1047636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden const keymaster_key_param_t* data() const; 1055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Returns the offset of the next entry that matches \p tag, starting from the element after \p 1085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * begin. If not found, returns -1. 1095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int find(keymaster_tag_t tag, int begin = -1) const; 1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Returns the nth element of the set. 1145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t operator[](int n) const; 1165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified integer-typed \p tag exists, places its value in \p val and returns true. 1195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If \p tag is not present, leaves \p val unmodified and returns false. 1205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t T> 1225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline bool GetTagValue(TypedTag<KM_INT, T> tag, uint32_t* val) const { 1235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueInt(tag, val); 1245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified instance of the specified integer-typed \p tag exists, places its value 1285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * in \p val and returns true. If \p tag is not present, leaves \p val unmodified and returns 1295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * false. 1305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag> 1325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedTag<KM_INT_REP, Tag> tag, size_t instance, uint32_t* val) const { 1335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueIntRep(tag, instance, val); 1345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified long-typed \p tag exists, places its value in \p val and returns true. 1385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If \p tag is not present, leaves \p val unmodified and returns false. 1395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t T> 1415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline bool GetTagValue(TypedTag<KM_LONG, T> tag, uint64_t* val) const { 1425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueLong(tag, val); 1435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified enumeration-typed \p tag exists, places its value in \p val and returns 1475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * true. If \p tag is not present, leaves \p val unmodified and returns false. 1485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, typename T> 1505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedEnumTag<KM_ENUM, Tag, T> tag, T* val) const { 1515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueEnum(tag, reinterpret_cast<uint32_t*>(val)); 1525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified instance of the specified enumeration-typed \p tag exists, places its value 1565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * in \p val and returns true. If \p tag is not present, leaves \p val unmodified and returns 1575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * false. 1585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, typename T> 1605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedEnumTag<KM_ENUM_REP, Tag, T> tag, size_t instance, T* val) const { 1615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueEnumRep(tag, instance, reinterpret_cast<uint32_t*>(val)); 1625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified date-typed \p tag exists, places its value in \p val and returns 1665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * true. If \p tag is not present, leaves \p val unmodified and returns false. 1675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag> 1695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedTag<KM_INT_REP, Tag> tag, size_t instance, 1705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden typename TypedTag<KM_INT_REP, Tag>::value_type* val) const { 1715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueIntRep(tag, instance, val); 1725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified bytes-typed \p tag exists, places its value in \p val and returns 1765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * true. If \p tag is not present, leaves \p val unmodified and returns false. 1775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag> 1795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedTag<KM_BYTES, Tag> tag, keymaster_blob_t* val) const { 1805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueBlob(tag, val); 1815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified bignum-typed \p tag exists, places its value in \p val and returns 1855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * true. If \p tag is not present, leaves \p val unmodified and returns false. 1865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag> 1885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedTag<KM_BIGNUM, Tag> tag, keymaster_blob_t* val) const { 18928e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden return GetTagValueBlob(tag, val); 1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden /** 1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * If the specified \p tag exists, places its value in \p val and returns true. If \p tag is 1945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * not present, leaves \p val unmodified and returns false. 1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, keymaster_tag_type_t Type> 1975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValue(TypedTag<Type, Tag> tag, typename TagValueType<Type>::value_type* val) const { 1985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return GetTagValueLong(tag, val); 1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool push_back(keymaster_key_param_t elem); 2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 203370121346777e13437c275fbe7a975d899cc325cShawn Willden /** 204370121346777e13437c275fbe7a975d899cc325cShawn Willden * Grow the elements array to ensure it can contain \p count entries. Preserves any existing 205370121346777e13437c275fbe7a975d899cc325cShawn Willden * entries. 206370121346777e13437c275fbe7a975d899cc325cShawn Willden */ 207370121346777e13437c275fbe7a975d899cc325cShawn Willden bool reserve_elems(size_t count); 208370121346777e13437c275fbe7a975d899cc325cShawn Willden 209370121346777e13437c275fbe7a975d899cc325cShawn Willden /** 210370121346777e13437c275fbe7a975d899cc325cShawn Willden * Grow the indirect data array to ensure it can contain \p length bytes. Preserves any 211370121346777e13437c275fbe7a975d899cc325cShawn Willden * existing indirect data. 212370121346777e13437c275fbe7a975d899cc325cShawn Willden */ 213370121346777e13437c275fbe7a975d899cc325cShawn Willden bool reserve_indirect(size_t length); 214370121346777e13437c275fbe7a975d899cc325cShawn Willden 215370121346777e13437c275fbe7a975d899cc325cShawn Willden bool push_back(const AuthorizationSet& set); 216370121346777e13437c275fbe7a975d899cc325cShawn Willden 2175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, keymaster_tag_type_t Type, typename KeymasterEnum> 2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool push_back(TypedEnumTag<Type, Tag, KeymasterEnum> tag, KeymasterEnum val) { 2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return push_back(Authorization(tag, val)); 2205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag> bool push_back(TypedTag<KM_BOOL, Tag> tag) { 2235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return push_back(Authorization(tag)); 2245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2267636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden template <keymaster_tag_t Tag> 2277636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden bool push_back(TypedTag<KM_BYTES, Tag> tag, const void* bytes, size_t bytes_len) { 2287636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden return push_back(keymaster_param_blob(tag, static_cast<const uint8_t*>(bytes), bytes_len)); 2297636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden } 2307636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden 2317636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden template <keymaster_tag_t Tag> 2327636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden bool push_back(TypedTag<KM_BIGNUM, Tag> tag, const void* bytes, size_t bytes_len) { 2337636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden return push_back(keymaster_param_blob(tag, static_cast<const uint8_t*>(bytes), bytes_len)); 2347636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden } 2357636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden 2365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, keymaster_tag_type_t Type> 2375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool push_back(TypedTag<Type, Tag> tag, typename TypedTag<Type, Tag>::value_type val) { 2385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return push_back(Authorization(tag, val)); 2395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden template <keymaster_tag_t Tag, keymaster_tag_type_t Type> 2425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool push_back(TypedTag<Type, Tag> tag, const void* bytes, size_t bytes_len) { 2435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return push_back(Authorization(tag, bytes, bytes_len)); 2445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 24658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden /* Virtual methods from Serializable */ 24758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden size_t SerializedSize() const; 24858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden uint8_t* Serialize(uint8_t* serialized_set, const uint8_t* end) const; 249172f8c9be706e27f43022063bbc7f4b0177583acShawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 2505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2518d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden size_t SerializedSizeOfElements() const; 2528d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 2535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden private: 25458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden // Disallow assignment 25558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden void operator=(const AuthorizationSet&); 25658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden 2575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden void FreeData(); 2585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden void set_invalid(Error err); 2595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden static size_t ComputeIndirectDataSize(const keymaster_key_param_t* elems, size_t count); 2615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden void CopyIndirectData(); 2628d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden bool CheckIndirectData(); 2635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 264370121346777e13437c275fbe7a975d899cc325cShawn Willden bool DeserializeIndirectData(const uint8_t** buf_ptr, const uint8_t* end); 265370121346777e13437c275fbe7a975d899cc325cShawn Willden bool DeserializeElementsData(const uint8_t** buf_ptr, const uint8_t* end); 266370121346777e13437c275fbe7a975d899cc325cShawn Willden 2675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueEnum(keymaster_tag_t tag, uint32_t* val) const; 2685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueEnumRep(keymaster_tag_t tag, size_t instance, uint32_t* val) const; 2695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueInt(keymaster_tag_t tag, uint32_t* val) const; 2705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueIntRep(keymaster_tag_t tag, size_t instance, uint32_t* val) const; 2715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueLong(keymaster_tag_t tag, uint64_t* val) const; 2725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueDate(keymaster_tag_t tag, uint64_t* val) const; 2735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden bool GetTagValueBlob(keymaster_tag_t tag, keymaster_blob_t* val) const; 2745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t* elems_; 2765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t elems_size_; 2775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t elems_capacity_; 2785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t* indirect_data_; 2795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t indirect_data_size_; 2805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t indirect_data_capacity_; 2815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Error error_; 2825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}; 2835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace keymaster 2855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 286b10f3b26af1e3b382d9ef361b3eb5279d16a9c05Shawn Willden#endif // SYSTEM_KEYMASTER_KEY_AUTHORIZATION_SET_H_ 287