1*60b67249SAndroid Build Coastguard Worker // Copyright 2021 Google LLC 2*60b67249SAndroid Build Coastguard Worker // 3*60b67249SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*60b67249SAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*60b67249SAndroid Build Coastguard Worker // the License at 6*60b67249SAndroid Build Coastguard Worker // 7*60b67249SAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*60b67249SAndroid Build Coastguard Worker // 9*60b67249SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*60b67249SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*60b67249SAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*60b67249SAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*60b67249SAndroid Build Coastguard Worker // the License. 14*60b67249SAndroid Build Coastguard Worker 15*60b67249SAndroid Build Coastguard Worker #ifndef DICE_OPS_H_ 16*60b67249SAndroid Build Coastguard Worker #define DICE_OPS_H_ 17*60b67249SAndroid Build Coastguard Worker 18*60b67249SAndroid Build Coastguard Worker #include <dice/config.h> 19*60b67249SAndroid Build Coastguard Worker #include <dice/dice.h> 20*60b67249SAndroid Build Coastguard Worker #include <dice/ops/clear_memory.h> 21*60b67249SAndroid Build Coastguard Worker 22*60b67249SAndroid Build Coastguard Worker // These are the set of functions that implement various operations that the 23*60b67249SAndroid Build Coastguard Worker // main DICE functions depend on. They are provided as part of an integration 24*60b67249SAndroid Build Coastguard Worker // and resolved at link time. 25*60b67249SAndroid Build Coastguard Worker 26*60b67249SAndroid Build Coastguard Worker #ifdef __cplusplus 27*60b67249SAndroid Build Coastguard Worker extern "C" { 28*60b67249SAndroid Build Coastguard Worker #endif 29*60b67249SAndroid Build Coastguard Worker 30*60b67249SAndroid Build Coastguard Worker // Retrieves the DICE key parameters based on the key pair generation 31*60b67249SAndroid Build Coastguard Worker // algorithm set up at compile time or in the |context| parameter at runtime. 32*60b67249SAndroid Build Coastguard Worker DiceResult DiceGetKeyParam(void* context, DicePrincipal principal, 33*60b67249SAndroid Build Coastguard Worker DiceKeyParam* key_param); 34*60b67249SAndroid Build Coastguard Worker 35*60b67249SAndroid Build Coastguard Worker // An implementation of SHA-512, or an alternative hash. Hashes |input_size| 36*60b67249SAndroid Build Coastguard Worker // bytes of |input| and populates |output| on success. 37*60b67249SAndroid Build Coastguard Worker DiceResult DiceHash(void* context, const uint8_t* input, size_t input_size, 38*60b67249SAndroid Build Coastguard Worker uint8_t output[DICE_HASH_SIZE]); 39*60b67249SAndroid Build Coastguard Worker 40*60b67249SAndroid Build Coastguard Worker // An implementation of HKDF-SHA512, or an alternative KDF. Derives |length| 41*60b67249SAndroid Build Coastguard Worker // bytes from |ikm|, |salt|, and |info| and populates |output| on success. 42*60b67249SAndroid Build Coastguard Worker // |Output| must point to a buffer of at least |length| bytes. 43*60b67249SAndroid Build Coastguard Worker DiceResult DiceKdf(void* context, size_t length, const uint8_t* ikm, 44*60b67249SAndroid Build Coastguard Worker size_t ikm_size, const uint8_t* salt, size_t salt_size, 45*60b67249SAndroid Build Coastguard Worker const uint8_t* info, size_t info_size, uint8_t* output); 46*60b67249SAndroid Build Coastguard Worker 47*60b67249SAndroid Build Coastguard Worker // Deterministically generates a public and private key pair from |seed|. 48*60b67249SAndroid Build Coastguard Worker // Since this is deterministic, |seed| is as sensitive as a private key and can 49*60b67249SAndroid Build Coastguard Worker // be used directly as the private key. The |private_key| may use an 50*60b67249SAndroid Build Coastguard Worker // implementation defined format so may only be passed to the |sign| operation. 51*60b67249SAndroid Build Coastguard Worker DiceResult DiceKeypairFromSeed( 52*60b67249SAndroid Build Coastguard Worker void* context, DicePrincipal principal, 53*60b67249SAndroid Build Coastguard Worker const uint8_t seed[DICE_PRIVATE_KEY_SEED_SIZE], 54*60b67249SAndroid Build Coastguard Worker uint8_t public_key[DICE_PUBLIC_KEY_BUFFER_SIZE], 55*60b67249SAndroid Build Coastguard Worker uint8_t private_key[DICE_PRIVATE_KEY_BUFFER_SIZE]); 56*60b67249SAndroid Build Coastguard Worker 57*60b67249SAndroid Build Coastguard Worker // Calculates a signature of |message_size| bytes from |message| using 58*60b67249SAndroid Build Coastguard Worker // |private_key|. |private_key| was generated by |keypair_from_seed| to allow 59*60b67249SAndroid Build Coastguard Worker // an implementation to use their own private key format. |signature| points to 60*60b67249SAndroid Build Coastguard Worker // the buffer where the calculated signature is written. 61*60b67249SAndroid Build Coastguard Worker DiceResult DiceSign(void* context, const uint8_t* message, size_t message_size, 62*60b67249SAndroid Build Coastguard Worker const uint8_t private_key[DICE_PRIVATE_KEY_BUFFER_SIZE], 63*60b67249SAndroid Build Coastguard Worker uint8_t signature[DICE_SIGNATURE_BUFFER_SIZE]); 64*60b67249SAndroid Build Coastguard Worker 65*60b67249SAndroid Build Coastguard Worker // Verifies, using |public_key|, that |signature| covers |message_size| bytes 66*60b67249SAndroid Build Coastguard Worker // from |message|. 67*60b67249SAndroid Build Coastguard Worker DiceResult DiceVerify(void* context, const uint8_t* message, 68*60b67249SAndroid Build Coastguard Worker size_t message_size, 69*60b67249SAndroid Build Coastguard Worker const uint8_t signature[DICE_SIGNATURE_BUFFER_SIZE], 70*60b67249SAndroid Build Coastguard Worker const uint8_t public_key[DICE_PUBLIC_KEY_BUFFER_SIZE]); 71*60b67249SAndroid Build Coastguard Worker 72*60b67249SAndroid Build Coastguard Worker // Generates an X.509 certificate, or an alternative certificate format, from 73*60b67249SAndroid Build Coastguard Worker // the given |subject_private_key_seed| and |input_values|, and signed by 74*60b67249SAndroid Build Coastguard Worker // |authority_private_key_seed|. The subject private key seed is supplied here 75*60b67249SAndroid Build Coastguard Worker // so the implementation can choose between asymmetric mechanisms, for example 76*60b67249SAndroid Build Coastguard Worker // ECDSA vs Ed25519. 77*60b67249SAndroid Build Coastguard Worker DiceResult DiceGenerateCertificate( 78*60b67249SAndroid Build Coastguard Worker void* context, 79*60b67249SAndroid Build Coastguard Worker const uint8_t subject_private_key_seed[DICE_PRIVATE_KEY_SEED_SIZE], 80*60b67249SAndroid Build Coastguard Worker const uint8_t authority_private_key_seed[DICE_PRIVATE_KEY_SEED_SIZE], 81*60b67249SAndroid Build Coastguard Worker const DiceInputValues* input_values, size_t certificate_buffer_size, 82*60b67249SAndroid Build Coastguard Worker uint8_t* certificate, size_t* certificate_actual_size); 83*60b67249SAndroid Build Coastguard Worker 84*60b67249SAndroid Build Coastguard Worker #ifdef __cplusplus 85*60b67249SAndroid Build Coastguard Worker } // extern "C" 86*60b67249SAndroid Build Coastguard Worker #endif 87*60b67249SAndroid Build Coastguard Worker 88*60b67249SAndroid Build Coastguard Worker #endif // DICE_OPS_H_ 89