Home | History | Annotate | Download | only in android_keymaster
      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_UNLOCKED_DEVICE_REQUIRED:
    113         return "KM_TAG_UNLOCKED_DEVICE_REQUIRED";
    114     case KM_TAG_ATTESTATION_CHALLENGE:
    115         return "KM_TAG_ATTESTATION_CHALLENGE";
    116     case KM_TAG_ATTESTATION_APPLICATION_ID:
    117         return "KM_TAG_ATTESTATION_APPLICATION_ID";
    118     case KM_TAG_ATTESTATION_ID_BRAND:
    119         return "KM_TAG_ATTESTATION_ID_BRAND";
    120     case KM_TAG_ATTESTATION_ID_DEVICE:
    121         return "KM_TAG_ATTESTATION_ID_DEVICE";
    122     case KM_TAG_ATTESTATION_ID_PRODUCT:
    123         return "KM_TAG_ATTESTATION_ID_PRODUCT";
    124     case KM_TAG_ATTESTATION_ID_SERIAL:
    125         return "KM_TAG_ATTESTATION_ID_SERIAL";
    126     case KM_TAG_ATTESTATION_ID_IMEI:
    127         return "KM_TAG_ATTESTATION_ID_IMEI";
    128     case KM_TAG_ATTESTATION_ID_MEID:
    129         return "KM_TAG_ATTESTATION_ID_MEID";
    130     case KM_TAG_ATTESTATION_ID_MANUFACTURER:
    131         return "KM_TAG_ATTESTATION_ID_MANUFACTURER";
    132     case KM_TAG_ATTESTATION_ID_MODEL:
    133         return "KM_TAG_ATTESTATION_ID_MODEL";
    134     }
    135     return "<Unknown>";
    136 }
    137 #endif  // KEYMASTER_NAME_TAGS
    138 
    139 // DEFINE_KEYMASTER_TAG is used to create TypedTag instances for each non-enum keymaster tag.
    140 #define DEFINE_KEYMASTER_TAG(type, name) TypedTag<type, KM_##name> name
    141 
    142 DEFINE_KEYMASTER_TAG(KM_INVALID, TAG_INVALID);
    143 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_KEY_SIZE);
    144 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MAC_LENGTH);
    145 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_CALLER_NONCE);
    146 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MIN_MAC_LENGTH);
    147 DEFINE_KEYMASTER_TAG(KM_ULONG, TAG_RSA_PUBLIC_EXPONENT);
    148 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ECIES_SINGLE_HASH_MODE);
    149 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_INCLUDE_UNIQUE_ID);
    150 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_ACTIVE_DATETIME);
    151 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_ORIGINATION_EXPIRE_DATETIME);
    152 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_USAGE_EXPIRE_DATETIME);
    153 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MIN_SECONDS_BETWEEN_OPS);
    154 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_MAX_USES_PER_BOOT);
    155 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_USERS);
    156 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_USER_ID);
    157 DEFINE_KEYMASTER_TAG(KM_ULONG_REP, TAG_USER_SECURE_ID);
    158 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_NO_AUTH_REQUIRED);
    159 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_AUTH_TIMEOUT);
    160 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALLOW_WHILE_ON_BODY);
    161 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ALL_APPLICATIONS);
    162 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_ID);
    163 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_APPLICATION_DATA);
    164 DEFINE_KEYMASTER_TAG(KM_DATE, TAG_CREATION_DATETIME);
    165 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_ROLLBACK_RESISTANT);
    166 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ROOT_OF_TRUST);
    167 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ASSOCIATED_DATA);
    168 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_NONCE);
    169 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_AUTH_TOKEN);
    170 DEFINE_KEYMASTER_TAG(KM_BOOL, TAG_BOOTLOADER_ONLY);
    171 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_OS_VERSION);
    172 DEFINE_KEYMASTER_TAG(KM_UINT, TAG_OS_PATCHLEVEL);
    173 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_UNIQUE_ID);
    174 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_APPLICATION_ID);
    175 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_BRAND);
    176 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_DEVICE);
    177 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_PRODUCT);
    178 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_SERIAL);
    179 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_IMEI);
    180 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MEID);
    181 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MANUFACTURER);
    182 DEFINE_KEYMASTER_TAG(KM_BYTES, TAG_ATTESTATION_ID_MODEL);
    183 
    184 // DEFINE_KEYMASTER_ENUM_TAG is used to create TypedEnumTag instances for each enum keymaster tag.
    185 
    186 #define DEFINE_KEYMASTER_ENUM_TAG(type, name, enumtype) TypedEnumTag<type, KM_##name, enumtype> name
    187 
    188 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PURPOSE, keymaster_purpose_t);
    189 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ALGORITHM, keymaster_algorithm_t);
    190 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_BLOCK_MODE, keymaster_block_mode_t);
    191 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_DIGEST, keymaster_digest_t);
    192 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_DIGEST_OLD, keymaster_digest_t);
    193 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_PADDING, keymaster_padding_t);
    194 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_PADDING_OLD, keymaster_padding_t);
    195 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_BLOB_USAGE_REQUIREMENTS,
    196                           keymaster_key_blob_usage_requirements_t);
    197 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_ORIGIN, keymaster_key_origin_t);
    198 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_USER_AUTH_TYPE, hw_authenticator_type_t);
    199 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM_REP, TAG_KDF, keymaster_kdf_t);
    200 DEFINE_KEYMASTER_ENUM_TAG(KM_ENUM, TAG_EC_CURVE, keymaster_ec_curve_t);
    201 
    202 }  // namespace keymaster
    203