Home | History | Annotate | Download | only in libatap
      1 /*
      2  * Copyright 2017 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 #ifndef ATAP_OPS_H_
     18 #define ATAP_OPS_H_
     19 
     20 #ifdef __cplusplus
     21 extern "C" {
     22 #endif
     23 
     24 #include "atap_sysdeps.h"
     25 #include "atap_types.h"
     26 
     27 /* High-level operations/functions/methods that are platform
     28  * dependent.
     29  */
     30 struct AtapOps {
     31   /* This pointer can be used by the application/TEE and is typically
     32    * used in each operation to get a pointer to platform-specific
     33    * resources. It cannot be used by this library.
     34    */
     35   void* user_data;
     36 
     37   /* Reads the Product Id from permanent attibutes, and outputs
     38    * ATAP_PRODUCT_ID_LEN bytes to |product_id|. On success, returns
     39    * ATAP_RESULT_OK.
     40    */
     41   AtapResult (*read_product_id)(AtapOps* ops,
     42                                 uint8_t product_id[ATAP_PRODUCT_ID_LEN]);
     43 
     44   /* Outputs the type of the authentication key to |key_type|. On success,
     45    * returns ATAP_RESULT_OK.
     46    */
     47   AtapResult (*get_auth_key_type)(AtapOps* ops, AtapKeyType* key_type);
     48 
     49   /* Reads the stored authentication key certificate chain. On success,
     50    * returns ATAP_RESULT_OK and populates |cert_chain|. New memory will be
     51    * allocated for the certificate chain entries, and caller takes
     52    * ownership. Entries for |cert_chain| must be allocated using
     53    * atap_malloc(), and cert_chain->entry_count must be valid.
     54    */
     55   AtapResult (*read_auth_key_cert_chain)(AtapOps* ops,
     56                                          AtapCertChain* cert_chain);
     57 
     58   /* Writes the |key_type| attestation |key| and |cert_chain|. The data
     59    * MUST be stored in a location that cannot be read or written to by
     60    * Android. For certify operations, |key| will be NULL. On success,
     61    * returns ATAP_RESULT_OK.
     62    */
     63   AtapResult (*write_attestation_key)(AtapOps* ops,
     64                                       AtapKeyType key_type,
     65                                       const AtapBlob* key,
     66                                       const AtapCertChain* cert_chain);
     67 
     68   /* Reads an asymmetric public key of type |key_type| to be certified
     69    * for attestation. The keypair to be certified may either be generated
     70    * on the fly or provisioned and securely stored at an earlier stage. On
     71    * success, returns ATAP_RESULT_OK and writes at most ATAP_KEY_LEN_MAX
     72    * bytes to |pubkey|, and the size of the public  key is written to
     73    * |*pubkey_len|.
     74    */
     75   AtapResult (*read_attestation_public_key)(AtapOps* ops,
     76                                             AtapKeyType key_type,
     77                                             uint8_t pubkey[ATAP_KEY_LEN_MAX],
     78                                             uint32_t* pubkey_len);
     79 
     80   /* Reads the SoC global key. If an SoC global key is not supported,
     81    * ATAP_RESULT_ERROR_UNSUPPORTED_OPERATION is returned and nothing is
     82    * written to |global_key|. On success, returns ATAP_RESULT_OK and writes
     83    * ATAP_AES_128_KEY_LEN bytes to |global_key|.
     84    */
     85   AtapResult (*read_soc_global_key)(AtapOps* ops,
     86                                     uint8_t global_key[ATAP_AES_128_KEY_LEN]);
     87 
     88   /* Writes the hex encoded UUID that appears in the subjectName of the
     89    * Product Key Certificate to storage. The UUID will be read by
     90    * invoking a fastboot command. On success, returns ATAP_RESULT_OK.
     91    */
     92   AtapResult (*write_hex_uuid)(AtapOps* ops,
     93                                const uint8_t uuid[ATAP_HEX_UUID_LEN]);
     94 
     95   /* Outputs |buf_size| random bytes to |buf|. Bytes should be
     96    * generated with either a hardware random number generator, or a
     97    * pseudorandom function seeded with hardware entropy.
     98    */
     99   AtapResult (*get_random_bytes)(AtapOps* ops, uint8_t* buf, uint32_t buf_size);
    100 
    101   /* Signs |nonce_len| bytes of |nonce| with the authentication key. On
    102    * success, returns ATAP_RESULT_OK and writes at most
    103    * ATAP_SIGNATURE_LEN_MAX bytes to |signature|, and the size of the
    104    * signature is written to |*signature_len|.
    105    */
    106   AtapResult (*auth_key_sign)(AtapOps* ops,
    107                               const uint8_t* nonce,
    108                               uint32_t nonce_len,
    109                               uint8_t signature[ATAP_SIGNATURE_LEN_MAX],
    110                               uint32_t* signature_len);
    111 
    112   /* Generates a new ECDH keypair using curve |curve|, and writes
    113    * ATAP_ECDH_KEY_LEN bytes of the public key to |pubkey|. Computes the
    114    * ECDH shared secret using |other_pubkey| and the generated private key
    115    * as inputs. Writes |ATAP_ECDH_SHARED_SECRET_LEN| bytes to
    116    * |shared_secret|. The raw private key material is not exposed to the
    117    * caller. On success, returns ATAP_RESULT_OK.
    118    */
    119   AtapResult (*ecdh_shared_secret_compute)(
    120       AtapOps* ops,
    121       AtapCurveType curve,
    122       const uint8_t other_pubkey[ATAP_ECDH_KEY_LEN],
    123       uint8_t pubkey[ATAP_ECDH_KEY_LEN],
    124       uint8_t shared_secret[ATAP_ECDH_SHARED_SECRET_LEN]);
    125 
    126   /* Encrypts |len| bytes of |plaintext| using |key| and |iv|, and outputs
    127    * |len| bytes to |ciphertext| and ATAP_GCM_TAG_LEN bytes to |tag|. On
    128    * success, returns ATAP_RESULT_OK.
    129    */
    130   AtapResult (*aes_gcm_128_encrypt)(AtapOps* ops,
    131                                     const uint8_t* plaintext,
    132                                     uint32_t len,
    133                                     const uint8_t iv[ATAP_GCM_IV_LEN],
    134                                     const uint8_t key[ATAP_AES_128_KEY_LEN],
    135                                     uint8_t* ciphertext,
    136                                     uint8_t tag[ATAP_GCM_TAG_LEN]);
    137 
    138   /* Decrypts |len| bytes of |ciphertext| using |key|, |iv|, and |tag|, and
    139    * outputs |len| bytes to |plaintext|. On success, returns ATAP_RESULT_OK.
    140    */
    141   AtapResult (*aes_gcm_128_decrypt)(AtapOps* ops,
    142                                     const uint8_t* ciphertext,
    143                                     uint32_t len,
    144                                     const uint8_t iv[ATAP_GCM_IV_LEN],
    145                                     const uint8_t key[ATAP_AES_128_KEY_LEN],
    146                                     const uint8_t tag[ATAP_GCM_TAG_LEN],
    147                                     uint8_t* plaintext);
    148 
    149   /* Computes a SHA256 hash of the |input|, and outputs
    150    * ATAP_SHA256_DIGEST_LEN bytes to |HASH|. On success, returns
    151    * ATAP_RESULT_OK.
    152    */
    153   AtapResult (*sha256)(AtapOps* ops,
    154                        const uint8_t* input,
    155                        uint32_t input_len,
    156                        uint8_t hash[ATAP_SHA256_DIGEST_LEN]);
    157 
    158   /* Computes HKDF (as specificed by RFC 5868) of initial keying
    159    * material |ikm| with |salt| and |info| using SHA256 as the digest,
    160    * and outputs |okm_len| bytes to |okm|.
    161    */
    162   AtapResult (*hkdf_sha256)(AtapOps* ops,
    163                             const uint8_t* salt,
    164                             uint32_t salt_len,
    165                             const uint8_t* ikm,
    166                             uint32_t ikm_len,
    167                             const uint8_t* info,
    168                             uint32_t info_len,
    169                             uint8_t* okm,
    170                             uint32_t okm_len);
    171 };
    172 
    173 #ifdef __cplusplus
    174 }
    175 #endif
    176 
    177 #endif /* ATAP_OPS_H_ */
    178