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