1 /* 2 * Copyright 2014 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 <keymaster/keymaster_tags.h> 18 19 namespace keymaster { 20 21 #ifdef KEYMASTER_NAME_TAGS 22 const char* StringifyTag(keymaster_tag_t tag) { 23 switch (tag) { 24 case KM_TAG_INVALID: 25 return "KM_TAG_INVALID"; 26 case KM_TAG_PURPOSE: 27 return "KM_TAG_PURPOSE"; 28 case KM_TAG_ALGORITHM: 29 return "KM_TAG_ALGORITHM"; 30 case KM_TAG_KEY_SIZE: 31 return "KM_TAG_KEY_SIZE"; 32 case KM_TAG_BLOCK_MODE: 33 return "KM_TAG_BLOCK_MODE"; 34 case KM_TAG_DIGEST: 35 return "KM_TAG_DIGEST"; 36 case KM_TAG_PADDING: 37 return "KM_TAG_PADDING"; 38 case KM_TAG_CALLER_NONCE: 39 return "KM_TAG_CALLER_NONCE"; 40 case KM_TAG_MIN_MAC_LENGTH: 41 return "KM_TAG_MIN_MAC_LENGTH"; 42 case KM_TAG_RSA_PUBLIC_EXPONENT: 43 return "KM_TAG_RSA_PUBLIC_EXPONENT"; 44 case KM_TAG_BLOB_USAGE_REQUIREMENTS: 45 return "KM_TAG_BLOB_USAGE_REQUIREMENTS"; 46 case KM_TAG_BOOTLOADER_ONLY: 47 return "KM_TAG_BOOTLOADER_ONLY"; 48 case KM_TAG_ACTIVE_DATETIME: 49 return "KM_TAG_ACTIVE_DATETIME"; 50 case KM_TAG_ORIGINATION_EXPIRE_DATETIME: 51 return "KM_TAG_ORIGINATION_EXPIRE_DATETIME"; 52 case KM_TAG_USAGE_EXPIRE_DATETIME: 53 return "KM_TAG_USAGE_EXPIRE_DATETIME"; 54 case KM_TAG_MIN_SECONDS_BETWEEN_OPS: 55 return "KM_TAG_MIN_SECONDS_BETWEEN_OPS"; 56 case KM_TAG_MAX_USES_PER_BOOT: 57 return "KM_TAG_MAX_USES_PER_BOOT"; 58 case KM_TAG_ALL_USERS: 59 return "KM_TAG_ALL_USERS"; 60 case KM_TAG_USER_ID: 61 return "KM_TAG_USER_ID"; 62 case KM_TAG_USER_SECURE_ID: 63 return "KM_TAG_USER_SECURE_ID"; 64 case KM_TAG_NO_AUTH_REQUIRED: 65 return "KM_TAG_NO_AUTH_REQUIRED"; 66 case KM_TAG_USER_AUTH_TYPE: 67 return "KM_TAG_USER_AUTH_TYPE"; 68 case KM_TAG_AUTH_TIMEOUT: 69 return "KM_TAG_AUTH_TIMEOUT"; 70 case KM_TAG_ALL_APPLICATIONS: 71 return "KM_TAG_ALL_APPLICATIONS"; 72 case KM_TAG_APPLICATION_ID: 73 return "KM_TAG_APPLICATION_ID"; 74 case KM_TAG_APPLICATION_DATA: 75 return "KM_TAG_APPLICATION_DATA"; 76 case KM_TAG_CREATION_DATETIME: 77 return "KM_TAG_CREATION_DATETIME"; 78 case KM_TAG_ORIGIN: 79 return "KM_TAG_ORIGIN"; 80 case KM_TAG_ROLLBACK_RESISTANT: 81 return "KM_TAG_ROLLBACK_RESISTANT"; 82 case KM_TAG_ROOT_OF_TRUST: 83 return "KM_TAG_ROOT_OF_TRUST"; 84 case KM_TAG_ASSOCIATED_DATA: 85 return "KM_TAG_ASSOCIATED_DATA"; 86 case KM_TAG_NONCE: 87 return "KM_TAG_NONCE"; 88 case KM_TAG_AUTH_TOKEN: 89 return "KM_TAG_AUTH_TOKEN"; 90 case KM_TAG_MAC_LENGTH: 91 return "KM_TAG_MAC_LENGTH"; 92 case KM_TAG_KDF: 93 return "KM_TAG_KDF"; 94 case KM_TAG_EC_CURVE: 95 return "KM_TAG_EC_CURVE"; 96 case KM_TAG_ECIES_SINGLE_HASH_MODE: 97 return "KM_TAG_ECIES_SINGLE_HASH_MODE"; 98 case KM_TAG_OS_VERSION: 99 return "KM_TAG_OS_VERSION"; 100 case KM_TAG_OS_PATCHLEVEL: 101 return "KM_TAG_OS_PATCHLEVEL"; 102 case KM_TAG_EXPORTABLE: 103 return "KM_TAG_EXPORTABLE"; 104 case KM_TAG_UNIQUE_ID: 105 return "KM_TAG_UNIQUE_ID"; 106 case KM_TAG_INCLUDE_UNIQUE_ID: 107 return "KM_TAG_INCLUDE_UNIQUE_ID"; 108 case KM_TAG_RESET_SINCE_ID_ROTATION: 109 return "KM_TAG_RESET_SINCE_ID_ROTATION"; 110 case KM_TAG_ALLOW_WHILE_ON_BODY: 111 return "KM_TAG_ALLOW_WHILE_ON_BODY"; 112 case KM_TAG_ATTESTATION_CHALLENGE: 113 return "KM_TAG_ATTESTATION_CHALLENGE"; 114 } 115 return "<Unknown>"; 116 } 117 #endif // KEYMASTER_NAME_TAGS 118 119 // DEFINE_KEYMASTER_TAG is used to create TypedTag instances for each non-enum keymaster tag. 120 #define DEFINE_KEYMASTER_TAG(type, name) TypedTag<type, KM_##name> name 121 122 DEFINE_KEYMASTER_TAG(KM_INVALID, TAG_INVALID); 123 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_KEY_SIZE); 124 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MAC_LENGTH); 125 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_CALLER_NONCE); 126 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MIN_MAC_LENGTH); 127 DEFINE_KEYMASTER_TAG(KM_ULONG, TAG_RSA_PUBLIC_EXPONENT); 128 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ECIES_SINGLE_HASH_MODE); 129 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_INCLUDE_UNIQUE_ID); 130 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_ACTIVE_DATETIME); 131 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_ORIGINATION_EXPIRE_DATETIME); 132 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_USAGE_EXPIRE_DATETIME); 133 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MIN_SECONDS_BETWEEN_OPS); 134 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MAX_USES_PER_BOOT); 135 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_USERS); 136 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_USER_ID); 137 DEFINE_KEYMASTER_TAG(KM_ULONG_REP, TAG_USER_SECURE_ID); 138 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_NO_AUTH_REQUIRED); 139 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_AUTH_TIMEOUT); 140 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALLOW_WHILE_ON_BODY); 141 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_APPLICATIONS); 142 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_ID); 143 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_DATA); 144 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_CREATION_DATETIME); 145 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ROLLBACK_RESISTANT); 146 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ROOT_OF_TRUST); 147 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ASSOCIATED_DATA); 148 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_NONCE); 149 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_AUTH_TOKEN); 150 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_BOOTLOADER_ONLY); 151 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_OS_VERSION); 152 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_OS_PATCHLEVEL); 153 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_UNIQUE_ID); 154 155 // DEFINE_KEYMASTER_ENUM_TAG is used to create TypedEnumTag instances for each enum keymaster tag. 156 157 #define DEFINE_KEYMASTER_ENUM_TAG(type, name, enumtype) TypedEnumTag<type, KM_##name, enumtype> name 158 159 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PURPOSE, keymaster_purpose_t); 160 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ALGORITHM, keymaster_algorithm_t); 161 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_BLOCK_MODE, keymaster_block_mode_t); 162 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_DIGEST, keymaster_digest_t); 163 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_DIGEST_OLD, keymaster_digest_t); 164 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PADDING, keymaster_padding_t); 165 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_PADDING_OLD, keymaster_padding_t); 166 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_BLOB_USAGE_REQUIREMENTS, 167 keymaster_key_blob_usage_requirements_t); 168 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ORIGIN, keymaster_key_origin_t); 169 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_USER_AUTH_TYPE, hw_authenticator_type_t); 170 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_KDF, keymaster_kdf_t); 171 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_EC_CURVE, keymaster_ec_curve_t); 172 173 } // namespace keymaster 174