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_KEYMASTER_TAGS_H_ 18b10f3b26af1e3b382d9ef361b3eb5279d16a9c05Shawn Willden#define SYSTEM_KEYMASTER_KEYMASTER_TAGS_H_ 195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/** 215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * This header contains various definitions that make working with keymaster tags safer and easier. 225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * It makes use of a fair amount of template metaprogramming, which is genarally a bad idea for 235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * maintainability, but in this case all of the metaprogramming serves the purpose of making it 245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * impossible to make certain classes of mistakes when operating on keymaster authorizations. For 255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * example, it's an error to create a keymaster_param_t with tag == KM_TAG_PURPOSE and then to 265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * assign KM_ALGORITHM_RSA to the enumerated element of its union, but because "enumerated" is a 275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * uint32_t, there's no way for the compiler, ordinarily, to diagnose it. Also, generic functions 285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * to manipulate authorizations of multiple types can't be written, because they need to know which 295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * union parameter to modify. 305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * The machinery in this header solves these problems. The core elements are two templated classes, 325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * TypedTag and TypedEnumTag. These classes are templated on a tag type and a tag value, and in the 335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * case of TypedEnumTag, an enumeration type as well. Specializations are created for each 345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * keymaster tag, associating the tag type with the tag, and an instance of each specialization is 355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * created, and named the same as the keymaster tag, but with the KM_ prefix omitted. Because the 365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * classes include a conversion operator to keymaster_tag_t, they can be used anywhere a 375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * keymaster_tag_t is expected. 385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * They also define a "value_type" typedef, which specifies the type of values associated with that 405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * particular tag. This enables template functions to be written that check that the correct 415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * parameter type is used for a given tag, and that use the correct union entry for the tag type. A 425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * very useful example is the overloaded "Authorization" function defined below, which takes tag and 435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * value arguments and correctly constructs a keyamster_param_t struct. 445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * 455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Because the classes have no data members and all of their methods are inline, they have ZERO 465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * run-time cost in and of themselves. The one way in which they can create code bloat is when 475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * template functions using them are expanded multiple times. The standard method of creating 485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * trivial, inlined template functions which call non-templated functions which are compact but not 495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * type-safe, allows the program to have both the type-safety of the templates and the compactness 505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * of the non-templated functions, at the same time. 515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 53eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden#include <hardware/hw_auth_token.h> 54b9d584d3dacc8041e5502cd0d036e21895eb6dc6Shawn Willden#include <hardware/keymaster_defs.h> 555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster { 575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 58520df837dbef534246e1616ade59fd15d24c7d03Shawn Willden// The following create the numeric values that KM_TAG_PADDING and KM_TAG_DIGEST used to have. We 59520df837dbef534246e1616ade59fd15d24c7d03Shawn Willden// need these old values to be able to support old keys that use them. 60520df837dbef534246e1616ade59fd15d24c7d03Shawn Willdenstatic const keymaster_tag_t KM_TAG_DIGEST_OLD = static_cast<keymaster_tag_t>(KM_ENUM | 5); 61520df837dbef534246e1616ade59fd15d24c7d03Shawn Willdenstatic const keymaster_tag_t KM_TAG_PADDING_OLD = static_cast<keymaster_tag_t>(KM_ENUM | 7); 62520df837dbef534246e1616ade59fd15d24c7d03Shawn Willden 635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// Until we have C++11, fake std::static_assert. 645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <bool b> struct StaticAssert {}; 655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct StaticAssert<true> { 665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden static void check() {} 675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}; 685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// An unusable type that we can associate with tag types that don't have a simple value type. 705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// That will prevent the associated type from being used inadvertently. 715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdenclass Void { 725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Void(); 735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ~Void(); 745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}; 755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/** 775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * A template that defines the association between non-enumerated tag types and their value 785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * types. For each tag type we define a specialized struct that contains a typedef "value_type". 795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_type_t tag_type> struct TagValueType {}; 81c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdentemplate <> struct TagValueType<KM_ULONG> { typedef uint64_t value_type; }; 82c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdentemplate <> struct TagValueType<KM_ULONG_REP> { typedef uint64_t value_type; }; 835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct TagValueType<KM_DATE> { typedef uint64_t value_type; }; 84c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdentemplate <> struct TagValueType<KM_UINT> { typedef uint32_t value_type; }; 85c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdentemplate <> struct TagValueType<KM_UINT_REP> { typedef uint32_t value_type; }; 865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct TagValueType<KM_INVALID> { typedef Void value_type; }; 875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct TagValueType<KM_BOOL> { typedef bool value_type; }; 885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct TagValueType<KM_BYTES> { typedef keymaster_blob_t value_type; }; 895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <> struct TagValueType<KM_BIGNUM> { typedef keymaster_blob_t value_type; }; 905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/** 925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * TypedTag is a templatized version of keymaster_tag_t, which provides compile-time checking of 935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * keymaster tag types. Instances are convertible to keymaster_tag_t, so they can be used wherever 945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * keymaster_tag_t is expected, and because they encode the tag type it's possible to create 955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * function overloadings that only operate on tags with a particular type. 965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */ 975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_type_t tag_type, keymaster_tag_t tag> class TypedTag { 985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden public: 995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden typedef typename TagValueType<tag_type>::value_type value_type; 1005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline TypedTag() { 1025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Ensure that it's impossible to create a TypedTag instance whose 'tag' doesn't have type 1035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 'tag_type'. Attempting to instantiate a tag with the wrong type will result in a compile 1045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // error (no match for template specialization StaticAssert<false>), with no run-time cost. 1055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden StaticAssert<(tag & tag_type) == tag_type>::check(); 1065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden StaticAssert<(tag_type != KM_ENUM) && (tag_type != KM_ENUM_REP)>::check(); 1075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline operator keymaster_tag_t() { return tag; } 10978c5d8796c560deb2a0194f581f13a833437f012Shawn Willden inline long masked_tag() { return static_cast<long>(keymaster_tag_mask_type(tag)); } 1105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}; 1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_type_t tag_type, keymaster_tag_t tag, typename KeymasterEnum> 1135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdenclass TypedEnumTag { 1145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden public: 1155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden typedef KeymasterEnum value_type; 1165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline TypedEnumTag() { 1185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Ensure that it's impossible to create a TypedTag instance whose 'tag' doesn't have type 1195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 'tag_type'. Attempting to instantiate a tag with the wrong type will result in a compile 1205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // error (no match for template specialization StaticAssert<false>), with no run-time cost. 1215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden StaticAssert<(tag & tag_type) == tag_type>::check(); 1225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden StaticAssert<(tag_type == KM_ENUM) || (tag_type == KM_ENUM_REP)>::check(); 1235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden inline operator keymaster_tag_t() { return tag; } 12578c5d8796c560deb2a0194f581f13a833437f012Shawn Willden inline long masked_tag() { return static_cast<long>(keymaster_tag_mask_type(tag)); } 1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}; 1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#ifdef KEYMASTER_NAME_TAGS 12978c5d8796c560deb2a0194f581f13a833437f012Shawn Willdenconst char* StringifyTag(keymaster_tag_t tag); 1305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#endif 1315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 13278c5d8796c560deb2a0194f581f13a833437f012Shawn Willden// DECLARE_KEYMASTER_TAG is used to declare TypedTag instances for each non-enum keymaster tag. 13378c5d8796c560deb2a0194f581f13a833437f012Shawn Willden#define DECLARE_KEYMASTER_TAG(type, name) extern TypedTag<type, KM_##name> name 13478c5d8796c560deb2a0194f581f13a833437f012Shawn Willden 13578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_INVALID, TAG_INVALID); 13678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_KEY_SIZE); 13778c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_MAC_LENGTH); 13878c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_CALLER_NONCE); 13978c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_MIN_MAC_LENGTH); 14078c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_ULONG, TAG_RSA_PUBLIC_EXPONENT); 14178c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_ECIES_SINGLE_HASH_MODE); 14278c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_INCLUDE_UNIQUE_ID); 14378c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_DATE, TAG_ACTIVE_DATETIME); 14478c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_DATE, TAG_ORIGINATION_EXPIRE_DATETIME); 14578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_DATE, TAG_USAGE_EXPIRE_DATETIME); 14678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_MIN_SECONDS_BETWEEN_OPS); 14778c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_MAX_USES_PER_BOOT); 14878c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_USERS); 14978c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_USER_ID); 15078c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_ULONG_REP, TAG_USER_SECURE_ID); 15178c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_NO_AUTH_REQUIRED); 15278c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_AUTH_TIMEOUT); 153b1e6758e2ff9ae632dfe327027e201326831538fShawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_ALLOW_WHILE_ON_BODY); 15478c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_APPLICATIONS); 15578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_ID); 15678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_DATA); 15778c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_DATE, TAG_CREATION_DATETIME); 15878c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_ROLLBACK_RESISTANT); 15978c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ROOT_OF_TRUST); 16078c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ASSOCIATED_DATA); 16178c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_NONCE); 16278c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_AUTH_TOKEN); 16378c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_BOOTLOADER_ONLY); 16478c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_OS_VERSION); 16578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_UINT, TAG_OS_PATCHLEVEL); 16678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_UNIQUE_ID); 16722dcdb75fc2d1aa9a25b9aadb65d4dcb31e8c647Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_CHALLENGE); 168676da6ddbf0ca27b63b92bfbd1341ff2e0f76f08Shawn WilldenDECLARE_KEYMASTER_TAG(KM_BOOL, TAG_RESET_SINCE_ID_ROTATION); 16978c5d8796c560deb2a0194f581f13a833437f012Shawn Willden 17078c5d8796c560deb2a0194f581f13a833437f012Shawn Willden// DECLARE_KEYMASTER_ENUM_TAG is used to declare TypedEnumTag instances for each enum keymaster tag. 17178c5d8796c560deb2a0194f581f13a833437f012Shawn Willden#define DECLARE_KEYMASTER_ENUM_TAG(type, name, enumtype) \ 17278c5d8796c560deb2a0194f581f13a833437f012Shawn Willden extern TypedEnumTag<type, KM_##name, enumtype> name 17378c5d8796c560deb2a0194f581f13a833437f012Shawn Willden 17478c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PURPOSE, keymaster_purpose_t); 17578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ALGORITHM, keymaster_algorithm_t); 17678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_BLOCK_MODE, keymaster_block_mode_t); 17778c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_DIGEST, keymaster_digest_t); 17878c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_DIGEST_OLD, keymaster_digest_t); 17978c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PADDING, keymaster_padding_t); 18078c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_PADDING_OLD, keymaster_padding_t); 18178c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_BLOB_USAGE_REQUIREMENTS, 18278c5d8796c560deb2a0194f581f13a833437f012Shawn Willden keymaster_key_blob_usage_requirements_t); 18378c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ORIGIN, keymaster_key_origin_t); 18478c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_USER_AUTH_TYPE, hw_authenticator_type_t); 18578c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_KDF, keymaster_kdf_t); 18678c5d8796c560deb2a0194f581f13a833437f012Shawn WilldenDECLARE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_EC_CURVE, keymaster_ec_curve_t); 1875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// 1895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// Overloaded function "Authorization" to create keymaster_key_param_t objects for all of tags. 1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden// 1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_BOOL, Tag> tag) { 1945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_bool(tag); 1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 198c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_UINT, Tag> tag, uint32_t value) { 1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_int(tag, value); 2005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 203c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_UINT_REP, Tag> tag, uint32_t value) { 2045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_int(tag, value); 2055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 208c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_ULONG, Tag> tag, uint64_t value) { 2095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_long(tag, value); 2105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 213c3ac84f04c4d6d74fa36abfd1cc2e5ac763a8af3Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_ULONG_REP, Tag> tag, uint64_t value) { 214eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden return keymaster_param_long(tag, value); 215eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden} 216eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden 217eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willdentemplate <keymaster_tag_t Tag> 2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_DATE, Tag> tag, uint64_t value) { 2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_date(tag, value); 2205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag> 2235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_BYTES, Tag> tag, const void* bytes, 2245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t bytes_len) { 2255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_blob(tag, reinterpret_cast<const uint8_t*>(bytes), bytes_len); 2265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 22828e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdentemplate <keymaster_tag_t Tag> 22928e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_BYTES, Tag> tag, 23028e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden const keymaster_blob_t& blob) { 23128e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden return keymaster_param_blob(tag, blob.data, blob.data_length); 23228e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden} 23328e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden 23428e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdentemplate <keymaster_tag_t Tag> 23528e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_BIGNUM, Tag> tag, const void* bytes, 23628e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden size_t bytes_len) { 23728e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden return keymaster_param_blob(tag, reinterpret_cast<const uint8_t*>(bytes), bytes_len); 23828e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden} 23928e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden 24028e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdentemplate <keymaster_tag_t Tag> 24128e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willdeninline keymaster_key_param_t Authorization(TypedTag<KM_BIGNUM, Tag> tag, 24228e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden const keymaster_blob_t& blob) { 24328e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden return keymaster_param_blob(tag, blob.data, blob.data_length); 24428e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden} 24528e41475a2559824a0f3f2c850ed92a65c586f95Shawn Willden 2465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag, typename KeymasterEnum> 2475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdeninline keymaster_key_param_t Authorization(TypedEnumTag<KM_ENUM, Tag, KeymasterEnum> tag, 2485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden KeymasterEnum value) { 2495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_enum(tag, value); 2505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdentemplate <keymaster_tag_t Tag, typename KeymasterEnum> 2535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdeninline keymaster_key_param_t Authorization(TypedEnumTag<KM_ENUM_REP, Tag, KeymasterEnum> tag, 2545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden KeymasterEnum value) { 2555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return keymaster_param_enum(tag, value); 2565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace keymaster 2595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 260b10f3b26af1e3b382d9ef361b3eb5279d16a9c05Shawn Willden#endif // SYSTEM_KEYMASTER_KEYMASTER_TAGS_H_ 261