Home | History | Annotate | Download | only in keystore
      1 <html devsite><head>
      2     <title></title>
      3     <meta name="project_path" value="/_project.yaml"/>
      4     <meta name="book_path" value="/_book.yaml"/>
      5   </head>
      6   <body>
      7   <!--
      8       Copyright 2017 The Android Open Source Project
      9 
     10       Licensed under the Apache License, Version 2.0 (the "License");
     11       you may not use this file except in compliance with the License.
     12       You may obtain a copy of the License at
     13 
     14           http://www.apache.org/licenses/LICENSE-2.0
     15 
     16       Unless required by applicable law or agreed to in writing, software
     17       distributed under the License is distributed on an "AS IS" BASIS,
     18       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     19       See the License for the specific language governing permissions and
     20       limitations under the License.
     21   -->
     22 
     23 <p> <a href="index.html">Keymaster</a> HAL  HAL </p>
     24 
     25 <h2 id="authorization_tags"></h2>
     26 
     27 <p></p>
     28 
     29 <h3 id="km_tag_purpose">KM_TAG_PURPOSE</h3>
     30 
     31 <p></p>
     32 
     33 <p></p>
     34 
     35 <pre>
     36 typedef enum {
     37     KM_PURPOSE_ENCRYPT = 0,
     38     KM_PURPOSE_DECRYPT = 1,
     39     KM_PURPOSE_SIGN = 2,
     40     KM_PURPOSE_VERIFY = 3,
     41 } keymaster_purpose_t;
     42 </pre>
     43 
     44 <p> <a href="#begin">begin</a>  <code>KM_ERROR_INCOMPATIBLE_PURPOSE</code></p>
     45 
     46 <h3 id="km_tag_algorithm">KM_TAG_ALGORITHM</h3>
     47 
     48 <p></p>
     49 
     50 <p></p>
     51 
     52 <pre>
     53 typedef enum {
     54     KM_ALGORITHM_RSA = 1,
     55     KM_ALGORITHM_EC = 3,
     56     KM_ALGORITHM_AES = 32,
     57     KM_ALGORITHM_HMAC = 128,
     58 } keymaster_algorithm_t;
     59 </pre>
     60 
     61 <p></p>
     62 
     63 <h3 id="km_tag_key_size">KM_TAG_KEY_SIZE</h3>
     64 
     65 <p> RSA <code>KM_TAG_KEY_SIZE</code>  AES </p>
     66 
     67 <p></p>
     68 
     69 <h3 id="km_tag_block_mode">KM_TAG_BLOCK_MODE</h3>
     70 
     71 <p> AES </p>
     72 
     73 <p></p>
     74 
     75 <pre>
     76 typedef enum {
     77     KM_MODE_ECB = 1,
     78     KM_MODE_CBC = 2,
     79     KM_MODE_CTR = 3,
     80     KM_MODE_GCM = 32,
     81 } keymaster_block_mode_t;
     82 </pre>
     83 
     84 <p> AES  <a href="#begin">begin</a>  <code>additional_params</code>  <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code></p>
     85 
     86 <h3 id="km_tag_digest">KM_TAG_DIGEST</h3>
     87 
     88 <p> RSA ECDSA  HMAC </p>
     89 
     90 <p></p>
     91 
     92 <pre>
     93 typedef enum {
     94     KM_DIGEST_NONE = 0,
     95     KM_DIGEST_MD5 = 1,
     96     KM_DIGEST_SHA1 = 2,
     97     KM_DIGEST_SHA_2_224 = 3,
     98     KM_DIGEST_SHA_2_256 = 4,
     99     KM_DIGEST_SHA_2_384 = 5,
    100     KM_DIGEST_SHA_2_512 = 6,
    101 }
    102 keymaster_digest_t;
    103 </pre>
    104 
    105 <p> <a href="#begin">begin</a>  <code>additional_params</code>  <code>KM_ERROR_INCOMPATIBLE_DIGEST</code></p>
    106 
    107 <h3 id="km_tag_padding">KM_TAG_PADDING</h3>
    108 
    109 <p> RSA  AES </p>
    110 
    111 <p></p>
    112 
    113 <pre>
    114 typedef enum {
    115     KM_PAD_NONE = 1,
    116     KM_PAD_RSA_OAEP = 2,
    117     KM_PAD_RSA_PSS = 3,
    118     KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4,
    119     KM_PAD_RSA_PKCS1_1_5_SIGN = 5,
    120     KM_PAD_PKCS7 = 64,
    121 } keymaster_padding_t;
    122 </pre>
    123 
    124 <p><code>KM_PAD_RSA_OAEP</code>  <code>KM_PAD_RSA_PKCS1_1_5_ENCRYPT</code>  RSA / RSA PKCS#1v2 OAEP  RSA PKCS#1 v1.5 <code>KM_PAD_RSA_PSS</code>  <code>KM_PAD_RSA_PKCS1_1_5_SIGN</code>  RSA / RSA PKCS#1v2 PSS  RSA PKCS#1 v1.5 RSA PSS  <a href="#km_tag_digest">KM_DIGEST_NONE</a> </p>
    125 
    126 <p><code>KM_PAD_NONE</code>  RSA  AES  AES  <code>KM_PAD_NONE</code>  ECB  CBC  AES  finish  <code>KM_ERROR_INVALID_INPUT_LENGTH</code></p>
    127 
    128 <p><code>KM_PAD_PKCS7</code>  AES  ECB  CBC </p>
    129 
    130 <p> <a href="#begin">begin</a>  <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code></p>
    131 
    132 <h3 id="km_tag_caller_nonce">KM_TAG_CALLER_NONCE</h3>
    133 
    134 <p></p>
    135 
    136 <p> true false</p>
    137 
    138 <p> AES  CBCCTR  GCM  <a href="#begin">begin</a>  <a href="#km_tag_nonce">KM_TAG_NONCE</a>  <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code></p>
    139 
    140 <p></p>
    141 
    142 <h3 id="km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</h3>
    143 
    144 <p> GCM  HMAC  AES  MAC </p>
    145 
    146 <p> MAC  8  HMAC  64 GCM  96  128 </p>
    147 
    148 <h3 id="km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</h3>
    149 
    150 <p> RSA  RSA  RSA </p>
    151 
    152 <p> 64  RSA Trustlet  2^16+1  3 <code>KM_ERROR_INVALID_ARGUMENT</code></p>
    153 
    154 <p></p>
    155 
    156 <h3 id="km_tag_blob_usage_requirements">KM_TAG_BLOB_USAGE_REQUIREMENTS</h3>
    157 
    158 <p></p>
    159 
    160 <p></p>
    161 
    162 <pre>
    163 typedef enum {
    164     KM_BLOB_STANDALONE = 0,
    165     KM_BLOB_REQUIRES_FILE_SYSTEM = 1,
    166 } keymaster_key_blob_usage_requirements_t;
    167 </pre>
    168 
    169 <p> <a href="#generate_key">generate_key</a>  <a href="#get_key_characteristics">get_key_characteristics</a> <code>KM_TAG_BLOB_USAGE_REQUIREMENTS</code> <code>KM_BLOB_STANDALONE</code>Trustlet  Blob Keymaster </p>
    170 
    171 <p></p>
    172 
    173 <h3 id="km_tag_bootloader_only">KM_TAG_BOOTLOADER_ONLY</h3>
    174 
    175 <p></p>
    176 
    177 <p> true false</p>
    178 
    179 <p> Android  <code>KM_TAG_BOOTLOADER_ONLY</code>  <code>KM_ERROR_INVALID_KEY_BLOB</code></p>
    180 
    181 <p></p>
    182 
    183 <h3 id="km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</h3>
    184 
    185 <p> <code>KM_ERROR_KEY_NOT_YET_VALID</code></p>
    186 
    187 <p> 64  1970  1  1 </p>
    188 
    189 <p></p>
    190 
    191 <h3 id="km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</h3>
    192 
    193 <p> <a href="#begin">begin</a>  <a href="#km_tag_purpose">KM_PURPOSE_SIGN</a>  <a href="#km_tag_purpose">KM_PURPOSE_ENCRYPT</a> <code>KM_ERROR_KEY_EXPIRED</code></p>
    194 
    195 <p> 64  1970  1  1 </p>
    196 
    197 <p></p>
    198 
    199 <h3 id="km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</h3>
    200 
    201 <p> <a href="#begin">begin</a>  <a href="#km_tag_purpose">KM_PURPOSE_VERIFY</a>  <a href="#km_tag_purpose">KM_PURPOSE DECRYPT</a> <code>KM_ERROR_KEY_EXPIRED</code></p>
    202 
    203 <p> 64  1970  1  1 </p>
    204 
    205 <p></p>
    206 
    207 <h3 id="km_tag_min_seconds_between_ops">KM_TAG_MIN_SECONDS_BETWEEN_OPS</h3>
    208 
    209 <p></p>
    210 
    211 <p> 32 </p>
    212 
    213 <p> <a href="#finish">finish</a>  <a href="#abort">abort</a>  <code>KM_TAG_MIN_SECONDS_BETWEEN_OPS</code>  <a href="#begin">begin</a>  <code>KM_ERROR_KEY_RATE_LIMIT_EXCEEDED</code> Trustlet  Keymaster Keymaster  32 Keymaster  <code>KM_ERROR_TOO_MANY_OPERATIONS</code></p>
    214 
    215 <p></p>
    216 
    217 <h3 id="km_tag_max_uses_per_boot">KM_TAG_MAX_USES_PER_BOOT</h3>
    218 
    219 <p></p>
    220 
    221 <p> 32 </p>
    222 
    223 <p> <a href="#begin">begin</a>  <code>KM_ERROR_MAX_OPS_EXCEEDED</code> Trustlet  Keymaster Keymaster  16 Keymaster  <code>KM_ERROR_TOO_MANY_OPERATIONS</code></p>
    224 
    225 <p></p>
    226 
    227 <h3 id="km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</h3>
    228 
    229 <p> <a href="#km_tag_no_auth_required">KM_TAG_NO_AUTH_REQUIRED</a> </p>
    230 
    231 <p> 64  <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>  <a href="#begin">begin</a>  <a href="#begin">begin</a> </p>
    232 
    233 <p> <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code></p>
    234 
    235 <h3 id="km_tag_no_auth_required">KM_TAG_NO_AUTH_REQUIRED</h3>
    236 
    237 <p> <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> </p>
    238 
    239 <p> true false</p>
    240 
    241 <p></p>
    242 
    243 <h3 id="km_tag_user_auth_type">KM_TAG_USER_AUTH_TYPE</h3>
    244 
    245 <p> Keymaster  Keymaster  <code>authenticator_type</code> <code>(ntoh(token.authenticator_type) &amp;
    246 auth_type_tag_value) != 0</code>  true <code>ntoh</code>  <code>auth_type_tag_value</code> </p>
    247 
    248 <p>32 </p>
    249 
    250 <pre>
    251 typedef enum {
    252     HW_AUTH_NONE = 0,
    253     HW_AUTH_PASSWORD = 1 &lt;&lt; 0,
    254     HW_AUTH_FINGERPRINT = 1 &lt;&lt; 1,
    255     // Additional entries should be powers of 2.
    256     HW_AUTH_ANY = UINT32_MAX,
    257 } hw_authenticator_type_t;
    258 </pre>
    259 
    260 <p></p>
    261 
    262 <h3 id="km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</h3>
    263 
    264 <p> <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>  <a href="#begin">begin</a></p>
    265 
    266 <p> 32  <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a>  <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a> </p>
    267 
    268 <p></p>
    269 
    270 <h3 id="km_tag_all_applications">KM_TAG_ALL_APPLICATIONS</h3>
    271 
    272 <p></p>
    273 
    274 <p></p>
    275 
    276 <h3 id="km_tag_application_id">KM_TAG_APPLICATION_ID</h3>
    277 
    278 <p> <a href="#generate_key">generate_key</a>  <a href="#import_key">import_key</a>  <a href="#export_key">export_key</a>  <a href="#get_key_characteristics">get_key_characteristics</a>  <code>client_id</code>  <a href="#begin">begin</a>  <code>in_params</code>  <code>KM_ERROR_INVALID_KEY_BLOB</code></p>
    279 
    280 <p><i></i></p>
    281 
    282 <p> Blob</p>
    283 
    284 <p></p>
    285 
    286 <h3 id="km_tag_application_data">KM_TAG_APPLICATION_DATA</h3>
    287 
    288 <p> <a href="#generate_key">generate_key</a>  <a href="#import_key">import_key</a>  <a href="#export_key">export_key</a>  <a href="#get_key_characteristics">get_key_characteristics</a>  <code>client_id</code>  <a href="#begin">begin</a>  <code>in_params</code>  <code>KM_ERROR_INVALID_KEY_BLOB</code></p>
    289 
    290 <p><i></i></p>
    291 
    292 <p> Blob</p>
    293 
    294 <p></p>
    295 
    296 <h3 id="km_tag_creation_datetime">KM_TAG_CREATION_DATETIME</h3>
    297 
    298 <p> 1970  1  1 </p>
    299 
    300 <p></p>
    301 
    302 <h3 id="km_tag_origin">KM_TAG_ORIGIN</h3>
    303 
    304 <p> Trustlet </p>
    305 
    306 <p> <code>keymaster_origin_t</code> </p>
    307 
    308 <pre>
    309 typedef enum {
    310     KM_ORIGIN_GENERATED = 0,
    311     KM_ORIGIN_IMPORTED = 2,
    312     KM_ORIGIN_UNKNOWN = 3,
    313 } keymaster_key_origin_t
    314 </pre>
    315 
    316 <p></p>
    317 
    318 <p><code>KM_ORIGIN_GENERATED</code>  Keymaster  SoftKeymaster </p>
    319 
    320 <p><code>KM_ORIGIN_IMPORTED</code>  Keymaster  Keymaster  SoftKeymaster </p>
    321 
    322 <p><code>KM_ORIGIN_UNKNOWN</code>  keymaster0  keymaster1 </p>
    323 
    324 <p></p>
    325 
    326 <h3 id="km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</h3>
    327 
    328 <p> <a href="#delete_key">delete_key</a>  <a href="#delete_all_keys">delete_all_keys</a> </p>
    329 
    330 <p> true false</p>
    331 
    332 <p></p>
    333 
    334 <h3 id="km_tag_root_of_trust">KM_TAG_ROOT_OF_TRUST</h3>
    335 
    336 <p> Keymaster Keymaster </p>
    337 
    338 <h3 id="km_tag_associated_data">KM_TAG_ASSOCIATED_DATA</h3>
    339 
    340 <p> AES-GCM  <a href="#update">update</a> GCM /</p>
    341 
    342 <p> Blob</p>
    343 
    344 <p></p>
    345 
    346 <h3 id="km_tag_nonce">KM_TAG_NONCE</h3>
    347 
    348 <p> AES GCMCBC  CTR / (IV) <a href="#begin">begin</a> <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a>  <a href="#begin">begin</a>Keymaster  IV  begin </p>
    349 
    350 <p> BlobGCM  12 CBC IV  CTR IV  16 </p>
    351 
    352 <p></p>
    353 
    354 <h3 id="km_tag_auth_token">KM_TAG_AUTH_TOKEN</h3>
    355 
    356 <p> <a href="#begin">begin</a><a href="#update">update</a>  <a href="#finish">finish</a>  <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a></p>
    357 
    358 <p> <code>hw_auth_token_t</code>  Blob</p>
    359 
    360 <p></p>
    361 
    362 <h3 id="km_tag_mac_length">KM_TAG_MAC_LENGTH</h3>
    363 
    364 <p> MAC  GCM </p>
    365 
    366 <p> MAC  8  <a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a> </p>
    367 
    368 <h2 id="functions"></h2>
    369 
    370 <h3 id="deprecated_functions"></h3>
    371 
    372 <p> <code>keymaster1_device_t</code>  <code>NULL</code></p>
    373 
    374 <ul>
    375   <li><code>generate_keypair</code>
    376   </li><li><code>import_keypair</code>
    377   </li><li><code>get_keypair_public</code>
    378   </li><li><code>delete_keypair</code>
    379   </li><li><code>delete_all</code>
    380   </li><li><code>sign_data</code>
    381   </li><li><code>verify_data</code>
    382 </li></ul>
    383 
    384 <h3 id="general_implementation_guidelines"></h3>
    385 
    386 <p> API </p>
    387 
    388 <h4 id="input_pointer_parameters"></h4>
    389 
    390 <p> <code>NULL</code> <a href="#begin">begin</a>  <code>in_params</code>  <code>in_params</code>  <code>NULL</code>  Keymaster </p>
    391 
    392 <p> NULLKeymaster  <code>KM_ERROR_UNEXPECTED_NULL_POINTER</code></p>
    393 
    394 <h4 id="output_pointer_parameters"></h4>
    395 
    396 <p> <code>NULL</code> <code>NULL</code> <code>KM_ERROR_OUTPUT_PARAMETER_NULL</code></p>
    397 
    398 <h4 id="api_misuse">API </h4>
    399 
    400 <p>keymaster1  IV </p>
    401 
    402 <p> Android Keystore  Keymaster </p>
    403 
    404 <h3 id="get_supported_algorithms">get_supported_algorithms</h3>
    405 
    406 <p> Keymaster </p>
    407 
    408 <p>keymaster1  RSAECAES  HMAC</p>
    409 
    410 <h3 id="get_supported_block_modes">get_supported_block_modes</h3>
    411 
    412 <p>Keymaster  AES </p>
    413 
    414 <p> RSAEC  HMAC <code>KM_ERROR_INVALID_PURPOSE</code></p>
    415 
    416 <p>keymaster1  ECBCBCCTR  GCM  AES </p>
    417 
    418 <h3 id="get_supported_padding_modes">get_supported_padding_modes</h3>
    419 
    420 <p>Keymaster </p>
    421 
    422 <p>HMAC  EC  <code>KM_ERROR_INVALID_PURPOSE</code></p>
    423 
    424 <p> RSAkeymaster1 </p>
    425 
    426 <ul>
    427   <li>
    428   </li><li>PKCS#1 v1.5 </li><li> 20  PSS</li><li>OAEP</li></ul>
    429 
    430 <p> ECB  CBC  AES keymaster1  PKCS#7 CTR  GCM </p>
    431 
    432 <h3 id="get_supported_digests">get_supported_digests</h3>
    433 
    434 <p>Keymaster </p>
    435 
    436 <p> AES </p>
    437 
    438 <p>keymaster1  SHA-256 keymaster1  MD5SHA1SHA-224SHA-256SHA384  SHA512</p>
    439 
    440 <h3 id="get_supported_import_formats">get_supported_import_formats</h3>
    441 
    442 <p> Keymaster </p>
    443 
    444 <p>keymaster1  PKCS#8  RSA  EC  AES  HMAC </p>
    445 
    446 <h3 id="get_supported_export_formats">get_supported_export_formats</h3>
    447 
    448 <p> Keymaster </p>
    449 
    450 <p>keymaster1  X.509  RSA  EC </p>
    451 
    452 <h3 id="add_rng_entropy">add_rng_entropy</h3>
    453 
    454 <p> keymaster1 IV </p>
    455 
    456 <p>Keymaster1 <strong></strong> <code>add_rng_entropy</code>  </p>
    457 
    458 <p> keymaster1  <code>add_rng_entropy</code> </p>
    459 
    460 <h3 id="generate_key">generate_key</h3>
    461 
    462 <p>keymaster1  <a href="#get_key_characteristics">get_key_characteristics</a>  <code>generate_key</code>  <a href="#get_key_characteristics">get_key_characteristics</a></p>
    463 
    464 <p> <code>generate_key</code> <a href="#km_tag_algorithm">KM_TAG_ALGORITHM</a> </p>
    465 
    466 <h4 id="rsa_keys">RSA </h4>
    467 
    468 <p> RSA </p>
    469 
    470 <ul>
    471   <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  <code>KM_ERROR_UNSUPPORTED_KEY_SIZE</code> 102420483072  4096 8 
    472   </li><li><a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a>  RSA  <code>KM_ERROR_INVALID_ARGUMENT</code> 3  65537 2^64 
    473 </li></ul>
    474 
    475 <p> RSA  RSA <code>generate_key</code> </p>
    476 
    477 <ul>
    478   <li><a href="#km_tag_purpose">KM_TAG_PURPOSE</a>  RSA 
    479   </li><li><a href="#km_tag_digest">KM_TAG_DIGEST</a>  <code>KM_DIGEST_NONE</code> </li><li><a href="#km_tag_padding">KM_TAG_PADDING</a>  <code>KM_PAD_RSA_PSS</code>  <code>KM_PAD_RSA_OAEP</code> 
    480 </li></ul>
    481 
    482 <h4 id="ecdsa_keys">ECDSA </h4>
    483 
    484 <p> <a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  ECDSA  EC  224256384  521 NIST p-224p-256p-384  p521 </p>
    485 
    486 <p> ECDSA  <a href="#km_tag_digest">KM_TAG_DIGEST</a> ECDSA </p>
    487 
    488 <h4 id="aes_keys">AES </h4>
    489 
    490 <p> <a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  AES  <code>KM_ERROR_UNSUPPORTED_KEY_SIZE</code> 128  256 192  AES </p>
    491 
    492 <p> AES  AES </p>
    493 
    494 <ul>
    495   <li><code>KM_TAG_BLOCK_MODE</code> 
    496   </li><li><code>KM_TAG_PADDING</code>  ECB  CBC 
    497 </li></ul>
    498 
    499 <p> GCM  <a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a> <code>KM_ERROR_MISSING_MIN_MAC_LENGTH</code> 8  96  128 </p>
    500 
    501 <h4 id="hmac_keys">HMAC </h4>
    502 
    503 <p> HMAC </p>
    504 
    505 <ul>
    506   <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  64  8  64  512  8 
    507   </li><li><a href="#km_tag_min_mac_length">KM_TAG_MIN_MAC_LENGTH</a>  MAC  8  64
    508   </li><li><a href="#km_tag_digest">KM_TAG_DIGEST</a>  <code>KM_ERROR_UNSUPPORTED_DIGEST</code> Trustlet  <code>KM_ERROR_UNSUPPORTED_DIGEST</code></li></ul>
    509 
    510 <h4 id="key_characteristics"></h4>
    511 
    512 <p> NULL <code>generate_key</code>  <a href="#get_key_characteristics">get_key_characteristics</a><a href="#km_tag_application_id">KM_TAG_APPLICATION_ID</a>  <a href="#km_tag_application_data">KM_TAG_APPLICATION_DATA</a>  Blob  Blob<a href="#km_tag_root_of_trust">KM_TAG_ROOT_OF_TRUST</a> </p>
    513 
    514 <p>Trustlet  <a href="#km_tag_origin">KM_TAG_ORIGIN</a> <code>KM_ORIGIN_GENERATED</code> <a href="#km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</a></p>
    515 
    516 <h4 id="rollback_resistance"></h4>
    517 
    518 <p> <a href="#delete_key">delete_key</a>  <a href="#delete_all_keys">delete_all_keys</a>  Blob Keystore  Blob </p>
    519 
    520 <p> Replay Protected Memory Block (RPMB) <a href="#km_tag_rollback_resistant">KM_TAG_ROLLBACK_RESISTANT</a> </p>
    521 
    522 <h3 id="get_key_characteristics">get_key_characteristics</h3>
    523 
    524 <p> <a href="#generate_key">generate_key</a>  <a href="#import_key">import_key</a> </p>
    525 
    526 <p> <code>KM_TAG_APPLICATION_ID</code> <code>client_id</code>  <code>KM_ERROR_INVALID_KEY_BLOB</code> <code>KM_TAG_APPLICATION_DATA </code> <code>app_data</code> </p>
    527 
    528 <p></p>
    529 
    530 <p></p>
    531 
    532 <ul>
    533   <li><a href="#km_tag_algorithm">KM_TAG_ALGORITHM</a><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  <a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a>  RSA  RSA 
    534   </li><li> <a href="#km_tag_digest">KM_TAG_DIGEST</a> 
    535   </li><li><a href="#km_tag_padding">KM_TAG_PADDING</a>  PSS  OAEP  RSA 
    536   </li><li><a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>  <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> Keymaster Trustlet  Trustlet  HMAC 
    537   </li><li><a href="#km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</a><a href="#km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</a>  <a href="#km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</a> 
    538   </li><li><a href="#km_tag_origin">KM_TAG_ORIGIN</a> 
    539 </li></ul>
    540 
    541 <h3 id="import_key">import_key</h3>
    542 
    543 <p> Keymaster  <code>generate_key</code> </p>
    544 
    545 <ul>
    546   <li><a href="#km_tag_key_size">KM_TAG_KEY_SIZE</a>  <a href="#km_tag_rsa_public_exponent">KM_TAG_RSA_PUBLIC_EXPONENT</a> RSA Trustlet Trustlet  <code>KM_ERROR_IMPORT_PARAMETER_MISMATCH</code></li><li> <a href="#km_tag_origin">KM_TAG_ORIGIN</a>  <code>KM_ORIGIN_IMPORTED</code> </li></ul>
    547 
    548 <h3 id="export_key">export_key</h3>
    549 
    550 <p> Keymaster RSA  EC </p>
    551 
    552 <p> <code>KM_TAG_APPLICATION_ID</code> <code>client_id</code>  <code>KM_ERROR_INVALID_KEY_BLOB</code> <code>KM_TAG_APPLICATION_DATA</code> <code>app_data</code> </p>
    553 
    554 <h3 id="delete_key">delete_key</h3>
    555 
    556 <p> Keymaster </p>
    557 
    558 <h3 id="delete_all_keys">delete_all_keys</h3>
    559 
    560 <p> Keymaster </p>
    561 
    562 <h3 id="begin">begin</h3>
    563 
    564 <p> <a href="#update">update</a>  <a href="#finish">finish</a>  <code>challenge</code> </p>
    565 
    566 <p>Keymaster  16 Keystore  15  vold  Keystore  15  <code>begin</code> <code>finish</code>  <code>abort</code> 16  <code>abort</code> 14  <code>begin</code> 
    567 
    568 </p><p> <a href="#km_tag_application_id">KM_TAG_APPLICATION_ID</a>  <a href="#km_tag_application_data">KM_TAG_APPLICATION_DATA</a> <code>begin</code>  <code>in_params</code> </p>
    569 
    570 <h4 id="authorization_enforcement"></h4>
    571 
    572 <p> Trustlet  RSA  EC  <code>KM_PURPOSE_ENCRYPT</code>  <code>KM_PURPOSE_VERIFY</code></p>
    573 
    574 <ul>
    575   <li><a href="#km_tag_purpose">KM_TAG_PURPOSE</a>  RSA  EC  <code>KM_PURPOSE_ENCRYPT</code>  <code>KM_PURPOSE_VERIFY</code><code>KM_PURPOSE_ENCRYPT</code>  EC begin  <code>KM_ERROR_UNSUPPORTED_PURPOSE</code>
    576   </li><li><a href="#km_tag_active_datetime">KM_TAG_ACTIVE_DATETIME</a>  UTC  <code>KM_ERROR_KEY_NOT_YET_VALID</code></li><li><a href="#km_tag_origination_expire_datetime">KM_TAG_ORIGINATION_EXPIRE_DATETIME</a>  UTC  <code>KM_PURPOSE_ENCRYPT</code>  <code>KM_PURPOSE_SIGN</code> <code>KM_ERROR_KEY_EXPIRED</code></li><li><a href="#km_tag_usage_expire_datetime">KM_TAG_USAGE_EXPIRE_DATETIME</a>  UTC  <code>KM_PURPOSE_DECRYPT</code>  <code>KM_PURPOSE_VERIFY</code> <code>KM_ERROR_KEY_EXPIRED</code></li><li><a href="#km_tag_min_seconds_between_ops">KM_TAG_MIN_SECONDS_BETWEEN_OPS</a>  <code>KM_ERROR_KEY_RATE_LIMIT_EXCEEDED</code>
    577   </li><li><a href="#km_tag_max_uses_per_boot">KM_TAG_MAX_USES_PER_BOOT</a>  <code>KM_ERROR_KEY_MAX_OPS_EXCEEDED</code></li><li> <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a> <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>  <code>in_params</code>  <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>HMAC  <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a>  ID  <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a> <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code></li><li><a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a>  (IV) <a href="#km_tag_nonce">KM_TAG_NONCE</a> <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code>
    578   </li><li><a href="#km_tag_bootloader_only">KM_TAG_BOOTLOADER_ONLY</a>  <code>KM_ERROR_INVALID_KEY_BLOB</code></li></ul>
    579 
    580 <h4 id="rsa_keys">RSA </h4>
    581 
    582 <p> RSA  <code>in_params</code>  <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code></p>
    583 
    584 <p>RSA  OAEP  RSA  <code>in_params</code>  <code>KM_ERROR_UNSUPPORTED_DIGEST</code></p>
    585 
    586 <p><code>KM_PURPOSE_DECYPT</code>  <code>KM_PURPOSE_SIGN</code> <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>  <code>KM_ERROR_INCOMPATIBLE_PADDING</code><code>KM_PURPOSE_ENCRYPT</code>  <code>KM_PURPOSE_VERIFY</code></p>
    587 
    588 <p> <code>KM_PAD_NONE</code>  RSA <code>KM_PAD_RSA_PKCS1_1_5_SIGN</code>  <code>KM_PAD_RSA_PSS</code>  <code>KM_PAD_RSA_PKCS1_1_1_5_ENCRYPT</code>  <code>KM_PAD_RSA_OAEP</code>  <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code></p>
    589 
    590 <p></p>
    591 
    592 <ul>
    593 
    594   <li><code>KM_PAD_NONE</code> RSA  <code>KM_DIGEST_NONE</code> 
    595 
    596   </li><li><code>KM_PAD_RSA_PKCS1_1_5_SIGN</code>  <code>KM_DIGEST_NONE</code>Keymaster  PKCS#1 v1.5  DigestInfo  <code>0x00 || 0x01 || PS || 0x00 || M</code> M PS RSA  11  <code>KM_ERROR_INVALID_INPUT_LENGTH</code></li><li><code>KM_PAD_RSA_PKCS1_1_1_5_ENCRYPT</code> </li><li><code>KM_PAD_RSA_PSS</code>  <code>KM_DIGEST_NONE</code> <code>KM_DIGEST_NONE</code> <code>KM_ERROR_INCOMPATIBLE_DIGEST</code>RSA  22  <code>KM_ERROR_INCOMPATIBLE_DIGEST</code></li><li><code>KM_PAD_RSA_OAEP</code>  <code>KM_DIGEST_NONE</code> <code>KM_DIGEST_NONE</code> <code>KM_ERROR_INCOMPATIBLE_DIGEST</code></li></ul>
    597 
    598 <h4 id="ec_keys">EC </h4>
    599 
    600 <p> EC  <code>in_params</code>  <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code></p>
    601 
    602 <p> (<code>KM_PURPOSE_SIGN</code>)  <code>KM_ERROR_INCOMPATIBLE_DIGEST</code> (<code>KM_PURPOSE_VERIFY</code>) </p>
    603 
    604 <h4 id="aes_keys">AES </h4>
    605 
    606 <p> AES  <code>in_params</code>  <code>KM_ERROR_UNSUPPORTED_BLOCK_MODE</code>  <code>KM_ERROR_UNSUPPORTED_PADDING_MODE</code> <code>KM_ERROR_INCOMPATIBLE_BLOCK_MODE</code>  <code>KM_ERROR_INCOMPATIBLE_PADDING_MODE</code></p>
    607 
    608 <p> <code>KM_MODE_GCM</code> <code>in_params</code>  <code>KM_TAG_MAC_LENGTH</code> 8  128 <code>KM_TAG_MIN_MAC_LENGTH</code>  MAC  128  8  <code>KM_ERROR_UNSUPPORTED_MAC_LENGTH</code> MAC  <code>KM_ERROR_INVALID_MAC_LENGTH</code></p>
    609 
    610 <p> <code>KM_MODE_GCM</code>  <code>KM_MODE_CTR</code> <code>KM_PAD_NONE</code> <code>KM_MODE_ECB</code>  <code>KM_MODE_CBC</code> <code>KM_PAD_NONE</code>  <code>KM_PAD_PKCS7</code> <code>KM_ERROR_INCOMPATIBLE_PADDING_MODE</code></p>
    611 
    612 <p> <code>KM_MODE_CBC</code><code>KM_MODE_CTR</code>  <code>KM_MODE_GCM</code> IV  Keymaster  IV  <code>out_params</code>  <a href="#km_tag_nonce">KM_TAG_NONCE</a> CBC IV  CTR IV  16 GCM  12  <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a> <code>in_params</code>  <a href="#km_tag_nonce">KM_TAG_NONCE</a>  IV/ <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a>  <code>KM_ERROR_CALLER_NONCE_PROHIBITED</code> <a href="#km_tag_caller_nonce">KM_TAG_CALLER_NONCE</a>  IV/</p>
    613 
    614 <h4 id="hmac_keys">HMAC </h4>
    615 
    616 <p> HMAC  <code>in_params</code>  <code>KM_TAG_MAC_LENGTH</code> 8  <code>KM_TAG_MIN_MAC_LENGTH</code>  MAC  8  <code>KM_ERROR_UNSUPPORTED_MAC_LENGTH</code> MAC  <code>KM_ERROR_INVALID_MAC_LENGTH</code></p>
    617 
    618 <h3 id="update">update</h3>
    619 
    620 <p> <a href="#begin">begin</a>  <code>operation_handle</code> </p>
    621 
    622 <p> <code>input_consumed</code> </p>
    623 
    624 <p> update  <a href="#finish">finish</a> </p>
    625 
    626 <h4 id="error_handling"></h4>
    627 
    628 <p> <code>KM_ERROR_OK</code> <a href="#finish">finish</a>  <a href="#abort">abort</a>  <code>KM_ERROR_INVALID_OPERATION_HANDLE</code></p>
    629 
    630 <h4 id="authorization_enforcement"></h4>
    631 
    632 <p> <a href="#begin">begin</a> </p>
    633 
    634 <ul>
    635   <li> <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a></li><li> <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a>
    636 </li></ul>
    637 
    638 <p> update  <code>in_params</code>  <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>HMAC  ID <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a>  <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code></p>
    639 
    640 <p> <a href="#update">update</a>  <a href="#finish">finish</a> </p>
    641 
    642 <h4 id="rsa_keys">RSA </h4>
    643 
    644 <p> <code>KM_DIGEST_NONE</code>  update  update  update  RSA  <code>KM_ERROR_INVALID_INPUT_LENGTH</code></p>
    645 
    646 <h4 id="ecdsa_keys">ECDSA </h4>
    647 
    648 <p> <code>KM_DIGEST_NONE</code>  update </p>
    649 
    650 <p> update  update  RSA </p>
    651 
    652 <h4 id="aes_keys">AES </h4>
    653 
    654 <p>AES GCM  <code>in_params</code>  <a href="#km_tag_associated_data">KM_TAG_ASSOCIATED_DATA</a> update / update  update / update  <code>KM_ERROR_INVALID_TAG</code></p>
    655 
    656 <p> GCM  <a href="#finish">finish</a>  update  <code>KM_TAG_MAC_LENGTH</code>  <a href="#update">update</a>  <a href="#finish">finish</a> </p>
    657 
    658 <h3 id="finish">finish</h3>
    659 
    660 <p> <a href="#begin">begin</a>  <a href="#update">update</a> </p>
    661 
    662 <p></p>
    663 
    664 <p><a href="#update">update</a>  <a href="#abort">abort</a>  <code>KM_ERROR_INVALID_OPERATION_HANDLE</code></p>
    665 
    666 <p> <code>signature</code> </p>
    667 
    668 <h4 id="authorization_enforcement"></h4>
    669 
    670 <p> <a href="#begin">begin</a> </p>
    671 
    672 <ul>
    673   <li> <a href="#km_tag_user_secure_id">KM_TAG_USER_SECURE_ID</a></li><li> <a href="#km_tag_auth_timeout">KM_TAG_AUTH_TIMEOUT</a>
    674 </li></ul>
    675 
    676 <p> update  <code>in_params</code>  <a href="#km_tag_auth_token">KM_TAG_AUTH_TOKEN</a>HMAC  ID <a href="#km_tag_mac_length">KM_TAG_USER_AUTH_TYPE</a>  <code>KM_ERROR_KEY_USER_NOT_AUTHENTICATED</code></p>
    677 
    678 <p> <a href="#update">update</a>  <a href="#finish">finish</a> </p>
    679 
    680 <h4 id="rsa_keys">RSA </h4>
    681 
    682 <p></p>
    683 
    684 <ul>
    685   <li><strong>KM_PAD_NONE</strong>/ <code>KM_ERROR_INVALID_ARGUMENT</code> <code>KM_ERROR_INVALID_INPUT_LENGTH.</code>
    686   </li><li><strong>KM_PAD_RSA_PSS</strong> PSS PSS  20  <a href="#begin">begin</a>  <code>input_params</code>  <a href="#km_tag_digest">KM_TAG_DIGEST</a>  PSS  SHA1  MGF1 
    687   </li><li><strong>KM_PAD_RSA_OAEP</strong> <a href="#begin">begin</a>  <code>input_params</code>  <a href="#km_tag_digest">KM_TAG_DIGEST</a>  OAEP  SHA1  MGF1 
    688 </li></ul>
    689 
    690 <h4 id="ecdsa_keys">ECDSA </h4>
    691 
    692 <p></p>
    693 
    694 <h4 id="aes_keys">AES </h4>
    695 
    696 <p></p>
    697 
    698 <ul>
    699   <li><strong>KM_MODE_ECB</strong>  <strong>KM_MODE_CBC</strong> <code>KM_PAD_NONE</code> AES  <code>KM_ERROR_INVALID_INPUT_LENGTH</code> <code>KM_PAD_PKCS7</code> PKCS#7 PKCS#7 
    700   </li><li><strong>KM_MODE_GCM</strong><a href="#km_tag_mac_length">KM_TAG_MAC_LENGTH</a>  <a href="#km_tag_mac_length">KM_TAG_MAC_LENGTH</a>  <code>KM_ERROR_VERIFICATION_FAILED</code></li></ul>
    701 
    702 <h3 id="abort">abort</h3>
    703 
    704 <p> abort  <a href="#update">update</a><a href="#finish">finish</a>  <a href="#abort">abort</a>  <code>KM_ERROR_INVALID_OPERATION_HANDLE</code></p>
    705 
    706 </body></html>