1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright 2020, The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #if !defined(EIC_INSIDE_LIBEIC_H) && !defined(EIC_COMPILATION) 18*4d7e907cSAndroid Build Coastguard Worker #error "Never include this file directly, include libeic.h instead." 19*4d7e907cSAndroid Build Coastguard Worker #endif 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H 22*4d7e907cSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H 23*4d7e907cSAndroid Build Coastguard Worker 24*4d7e907cSAndroid Build Coastguard Worker #ifdef __cplusplus 25*4d7e907cSAndroid Build Coastguard Worker extern "C" { 26*4d7e907cSAndroid Build Coastguard Worker #endif 27*4d7e907cSAndroid Build Coastguard Worker 28*4d7e907cSAndroid Build Coastguard Worker #include "EicCbor.h" 29*4d7e907cSAndroid Build Coastguard Worker 30*4d7e907cSAndroid Build Coastguard Worker // The maximum size we support for public keys in reader certificates. 31*4d7e907cSAndroid Build Coastguard Worker #define EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE 65 32*4d7e907cSAndroid Build Coastguard Worker 33*4d7e907cSAndroid Build Coastguard Worker // Constant used to convey that no session is associated with a presentation. 34*4d7e907cSAndroid Build Coastguard Worker #define EIC_PRESENTATION_ID_UNSET 0 35*4d7e907cSAndroid Build Coastguard Worker 36*4d7e907cSAndroid Build Coastguard Worker typedef struct { 37*4d7e907cSAndroid Build Coastguard Worker // A non-zero number unique for this EicPresentation instance 38*4d7e907cSAndroid Build Coastguard Worker uint32_t id; 39*4d7e907cSAndroid Build Coastguard Worker 40*4d7e907cSAndroid Build Coastguard Worker int featureLevel; 41*4d7e907cSAndroid Build Coastguard Worker 42*4d7e907cSAndroid Build Coastguard Worker uint8_t storageKey[EIC_AES_128_KEY_SIZE]; 43*4d7e907cSAndroid Build Coastguard Worker uint8_t credentialPrivateKey[EIC_P256_PRIV_KEY_SIZE]; 44*4d7e907cSAndroid Build Coastguard Worker 45*4d7e907cSAndroid Build Coastguard Worker uint8_t ephemeralPrivateKey[EIC_P256_PRIV_KEY_SIZE]; 46*4d7e907cSAndroid Build Coastguard Worker 47*4d7e907cSAndroid Build Coastguard Worker // If non-zero (not EIC_PRESENTATION_ID_UNSET), the id of the EicSession object this 48*4d7e907cSAndroid Build Coastguard Worker // presentation object is associated with. 49*4d7e907cSAndroid Build Coastguard Worker uint32_t sessionId; 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker // The challenge generated with eicPresentationCreateAuthChallenge() 52*4d7e907cSAndroid Build Coastguard Worker uint64_t authChallenge; 53*4d7e907cSAndroid Build Coastguard Worker 54*4d7e907cSAndroid Build Coastguard Worker // Set by eicPresentationSetAuthToken() and contains the fields 55*4d7e907cSAndroid Build Coastguard Worker // from the passed in authToken and verificationToken. 56*4d7e907cSAndroid Build Coastguard Worker // 57*4d7e907cSAndroid Build Coastguard Worker uint64_t authTokenChallenge; 58*4d7e907cSAndroid Build Coastguard Worker uint64_t authTokenSecureUserId; 59*4d7e907cSAndroid Build Coastguard Worker uint64_t authTokenTimestamp; 60*4d7e907cSAndroid Build Coastguard Worker uint64_t verificationTokenTimestamp; 61*4d7e907cSAndroid Build Coastguard Worker 62*4d7e907cSAndroid Build Coastguard Worker // The public key for the reader. 63*4d7e907cSAndroid Build Coastguard Worker // 64*4d7e907cSAndroid Build Coastguard Worker // (During the process of pushing reader certificates, this is also used to store 65*4d7e907cSAndroid Build Coastguard Worker // the public key of the previously pushed certificate.) 66*4d7e907cSAndroid Build Coastguard Worker // 67*4d7e907cSAndroid Build Coastguard Worker uint8_t readerPublicKey[EIC_PRESENTATION_MAX_READER_PUBLIC_KEY_SIZE]; 68*4d7e907cSAndroid Build Coastguard Worker size_t readerPublicKeySize; 69*4d7e907cSAndroid Build Coastguard Worker 70*4d7e907cSAndroid Build Coastguard Worker // This is set to true only if eicPresentationValidateRequestMessage() successfully 71*4d7e907cSAndroid Build Coastguard Worker // validated the requestMessage. 72*4d7e907cSAndroid Build Coastguard Worker // 73*4d7e907cSAndroid Build Coastguard Worker // Why even record this? Because there's no requirement the HAL actually calls that 74*4d7e907cSAndroid Build Coastguard Worker // function and we validate ACPs before it's called... so it's possible that a 75*4d7e907cSAndroid Build Coastguard Worker // compromised HAL could trick us into marking ACPs as authorized while they in fact 76*4d7e907cSAndroid Build Coastguard Worker // aren't. 77*4d7e907cSAndroid Build Coastguard Worker bool requestMessageValidated; 78*4d7e907cSAndroid Build Coastguard Worker bool buildCbor; 79*4d7e907cSAndroid Build Coastguard Worker bool buildCborEcdsa; 80*4d7e907cSAndroid Build Coastguard Worker 81*4d7e907cSAndroid Build Coastguard Worker // Set to true initialized as a test credential. 82*4d7e907cSAndroid Build Coastguard Worker bool testCredential; 83*4d7e907cSAndroid Build Coastguard Worker 84*4d7e907cSAndroid Build Coastguard Worker // Set to true if the evaluation of access control checks in 85*4d7e907cSAndroid Build Coastguard Worker // eicPresentationStartRetrieveEntryValue() resulted EIC_ACCESS_CHECK_RESULT_OK 86*4d7e907cSAndroid Build Coastguard Worker bool accessCheckOk; 87*4d7e907cSAndroid Build Coastguard Worker 88*4d7e907cSAndroid Build Coastguard Worker // These are bitmasks indicating which of the possible 32 access control profiles are 89*4d7e907cSAndroid Build Coastguard Worker // authorized. They are built up by eicPresentationValidateAccessControlProfile(). 90*4d7e907cSAndroid Build Coastguard Worker // 91*4d7e907cSAndroid Build Coastguard Worker uint32_t accessControlProfileMaskValidated; // True if the profile was validated. 92*4d7e907cSAndroid Build Coastguard Worker uint32_t accessControlProfileMaskUsesReaderAuth; // True if the ACP is using reader auth 93*4d7e907cSAndroid Build Coastguard Worker uint32_t accessControlProfileMaskFailedReaderAuth; // True if failed reader auth 94*4d7e907cSAndroid Build Coastguard Worker uint32_t accessControlProfileMaskFailedUserAuth; // True if failed user auth 95*4d7e907cSAndroid Build Coastguard Worker 96*4d7e907cSAndroid Build Coastguard Worker // SHA-256 for AdditionalData, updated for each entry. 97*4d7e907cSAndroid Build Coastguard Worker uint8_t additionalDataSha256[EIC_SHA256_DIGEST_SIZE]; 98*4d7e907cSAndroid Build Coastguard Worker 99*4d7e907cSAndroid Build Coastguard Worker // SHA-256 of ProofOfProvisioning. Set to NUL-bytes or initialized from CredentialKeys data 100*4d7e907cSAndroid Build Coastguard Worker // if credential was created with feature version 202101 or later. 101*4d7e907cSAndroid Build Coastguard Worker uint8_t proofOfProvisioningSha256[EIC_SHA256_DIGEST_SIZE]; 102*4d7e907cSAndroid Build Coastguard Worker 103*4d7e907cSAndroid Build Coastguard Worker size_t expectedCborSizeAtEnd; 104*4d7e907cSAndroid Build Coastguard Worker EicCbor cbor; 105*4d7e907cSAndroid Build Coastguard Worker 106*4d7e907cSAndroid Build Coastguard Worker // The selected DeviceKey / AuthKey 107*4d7e907cSAndroid Build Coastguard Worker uint8_t deviceKeyPriv[EIC_P256_PRIV_KEY_SIZE]; 108*4d7e907cSAndroid Build Coastguard Worker 109*4d7e907cSAndroid Build Coastguard Worker EicCbor cborEcdsa; 110*4d7e907cSAndroid Build Coastguard Worker size_t expectedCborEcdsaSizeAtEnd; 111*4d7e907cSAndroid Build Coastguard Worker } EicPresentation; 112*4d7e907cSAndroid Build Coastguard Worker 113*4d7e907cSAndroid Build Coastguard Worker // If sessionId is zero (EIC_PRESENTATION_ID_UNSET), the presentation object is not associated 114*4d7e907cSAndroid Build Coastguard Worker // with a session object. Otherwise it's the id of the session object. 115*4d7e907cSAndroid Build Coastguard Worker // 116*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationInit(EicPresentation* ctx, uint32_t sessionId, bool testCredential, 117*4d7e907cSAndroid Build Coastguard Worker const char* docType, size_t docTypeLength, 118*4d7e907cSAndroid Build Coastguard Worker const uint8_t* encryptedCredentialKeys, 119*4d7e907cSAndroid Build Coastguard Worker size_t encryptedCredentialKeysSize); 120*4d7e907cSAndroid Build Coastguard Worker 121*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationShutdown(EicPresentation* ctx); 122*4d7e907cSAndroid Build Coastguard Worker 123*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationGetId(EicPresentation* ctx, uint32_t* outId); 124*4d7e907cSAndroid Build Coastguard Worker 125*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationGenerateSigningKeyPair(EicPresentation* ctx, const char* docType, 126*4d7e907cSAndroid Build Coastguard Worker size_t docTypeLength, time_t now, 127*4d7e907cSAndroid Build Coastguard Worker uint8_t* publicKeyCert, size_t* publicKeyCertSize, 128*4d7e907cSAndroid Build Coastguard Worker uint8_t signingKeyBlob[60]); 129*4d7e907cSAndroid Build Coastguard Worker 130*4d7e907cSAndroid Build Coastguard Worker // Create an ephemeral key-pair. 131*4d7e907cSAndroid Build Coastguard Worker // 132*4d7e907cSAndroid Build Coastguard Worker // The private key is stored in |ctx->ephemeralPrivateKey| and also returned in 133*4d7e907cSAndroid Build Coastguard Worker // |ephemeralPrivateKey|. 134*4d7e907cSAndroid Build Coastguard Worker // 135*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationCreateEphemeralKeyPair(EicPresentation* ctx, 136*4d7e907cSAndroid Build Coastguard Worker uint8_t ephemeralPrivateKey[EIC_P256_PRIV_KEY_SIZE]); 137*4d7e907cSAndroid Build Coastguard Worker 138*4d7e907cSAndroid Build Coastguard Worker // Returns a non-zero challenge in |authChallenge|. 139*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationCreateAuthChallenge(EicPresentation* ctx, uint64_t* authChallenge); 140*4d7e907cSAndroid Build Coastguard Worker 141*4d7e907cSAndroid Build Coastguard Worker // Starts retrieveing entries. 142*4d7e907cSAndroid Build Coastguard Worker // 143*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationStartRetrieveEntries(EicPresentation* ctx); 144*4d7e907cSAndroid Build Coastguard Worker 145*4d7e907cSAndroid Build Coastguard Worker // Sets the auth-token. 146*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationSetAuthToken(EicPresentation* ctx, uint64_t challenge, uint64_t secureUserId, 147*4d7e907cSAndroid Build Coastguard Worker uint64_t authenticatorId, int hardwareAuthenticatorType, 148*4d7e907cSAndroid Build Coastguard Worker uint64_t timeStamp, const uint8_t* mac, size_t macSize, 149*4d7e907cSAndroid Build Coastguard Worker uint64_t verificationTokenChallenge, 150*4d7e907cSAndroid Build Coastguard Worker uint64_t verificationTokenTimeStamp, 151*4d7e907cSAndroid Build Coastguard Worker int verificationTokenSecurityLevel, 152*4d7e907cSAndroid Build Coastguard Worker const uint8_t* verificationTokenMac, 153*4d7e907cSAndroid Build Coastguard Worker size_t verificationTokenMacSize); 154*4d7e907cSAndroid Build Coastguard Worker 155*4d7e907cSAndroid Build Coastguard Worker // Function to push certificates in the reader certificate chain. 156*4d7e907cSAndroid Build Coastguard Worker // 157*4d7e907cSAndroid Build Coastguard Worker // This should start with the root certificate (e.g. the last in the chain) and 158*4d7e907cSAndroid Build Coastguard Worker // continue up the chain, ending with the certificate for the reader. 159*4d7e907cSAndroid Build Coastguard Worker // 160*4d7e907cSAndroid Build Coastguard Worker // Calls to this function should be interleaved with calls to the 161*4d7e907cSAndroid Build Coastguard Worker // eicPresentationValidateAccessControlProfile() function, see below. 162*4d7e907cSAndroid Build Coastguard Worker // 163*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationPushReaderCert(EicPresentation* ctx, const uint8_t* certX509, 164*4d7e907cSAndroid Build Coastguard Worker size_t certX509Size); 165*4d7e907cSAndroid Build Coastguard Worker 166*4d7e907cSAndroid Build Coastguard Worker // Checks an access control profile. 167*4d7e907cSAndroid Build Coastguard Worker // 168*4d7e907cSAndroid Build Coastguard Worker // Returns false if an error occurred while checking the profile (e.g. MAC doesn't check out). 169*4d7e907cSAndroid Build Coastguard Worker // 170*4d7e907cSAndroid Build Coastguard Worker // Returns in |accessGranted| whether access is granted. 171*4d7e907cSAndroid Build Coastguard Worker // 172*4d7e907cSAndroid Build Coastguard Worker // If |readerCertificate| is non-empty and the public key of one of those 173*4d7e907cSAndroid Build Coastguard Worker // certificates appear in the chain presented by the reader, this function must 174*4d7e907cSAndroid Build Coastguard Worker // be called after pushing that certificate using 175*4d7e907cSAndroid Build Coastguard Worker // eicPresentationPushReaderCert(). 176*4d7e907cSAndroid Build Coastguard Worker // 177*4d7e907cSAndroid Build Coastguard Worker // The scratchSpace should be set to a buffer at least 512 bytes. It's done 178*4d7e907cSAndroid Build Coastguard Worker // this way to avoid allocating stack space. 179*4d7e907cSAndroid Build Coastguard Worker // 180*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationValidateAccessControlProfile(EicPresentation* ctx, int id, 181*4d7e907cSAndroid Build Coastguard Worker const uint8_t* readerCertificate, 182*4d7e907cSAndroid Build Coastguard Worker size_t readerCertificateSize, 183*4d7e907cSAndroid Build Coastguard Worker bool userAuthenticationRequired, int timeoutMillis, 184*4d7e907cSAndroid Build Coastguard Worker uint64_t secureUserId, const uint8_t mac[28], 185*4d7e907cSAndroid Build Coastguard Worker bool* accessGranted, 186*4d7e907cSAndroid Build Coastguard Worker uint8_t* scratchSpace, 187*4d7e907cSAndroid Build Coastguard Worker size_t scratchSpaceSize); 188*4d7e907cSAndroid Build Coastguard Worker 189*4d7e907cSAndroid Build Coastguard Worker // Validates that the given requestMessage is signed by the public key in the 190*4d7e907cSAndroid Build Coastguard Worker // certificate last set with eicPresentationPushReaderCert(). 191*4d7e907cSAndroid Build Coastguard Worker // 192*4d7e907cSAndroid Build Coastguard Worker // The format of the signature is the same encoding as the 'signature' field of 193*4d7e907cSAndroid Build Coastguard Worker // COSE_Sign1 - that is, it's the R and S integers both with the same length as 194*4d7e907cSAndroid Build Coastguard Worker // the key-size. 195*4d7e907cSAndroid Build Coastguard Worker // 196*4d7e907cSAndroid Build Coastguard Worker // Must be called after eicPresentationPushReaderCert() have been used to push 197*4d7e907cSAndroid Build Coastguard Worker // the final certificate. Which is the certificate of the reader itself. 198*4d7e907cSAndroid Build Coastguard Worker // 199*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationValidateRequestMessage(EicPresentation* ctx, const uint8_t* sessionTranscript, 200*4d7e907cSAndroid Build Coastguard Worker size_t sessionTranscriptSize, 201*4d7e907cSAndroid Build Coastguard Worker const uint8_t* requestMessage, size_t requestMessageSize, 202*4d7e907cSAndroid Build Coastguard Worker int coseSignAlg, 203*4d7e907cSAndroid Build Coastguard Worker const uint8_t* readerSignatureOfToBeSigned, 204*4d7e907cSAndroid Build Coastguard Worker size_t readerSignatureOfToBeSignedSize); 205*4d7e907cSAndroid Build Coastguard Worker 206*4d7e907cSAndroid Build Coastguard Worker typedef enum { 207*4d7e907cSAndroid Build Coastguard Worker // Returned if access is granted. 208*4d7e907cSAndroid Build Coastguard Worker EIC_ACCESS_CHECK_RESULT_OK, 209*4d7e907cSAndroid Build Coastguard Worker 210*4d7e907cSAndroid Build Coastguard Worker // Returned if an error occurred checking for access. 211*4d7e907cSAndroid Build Coastguard Worker EIC_ACCESS_CHECK_RESULT_FAILED, 212*4d7e907cSAndroid Build Coastguard Worker 213*4d7e907cSAndroid Build Coastguard Worker // Returned if access was denied because item is configured without any 214*4d7e907cSAndroid Build Coastguard Worker // access control profiles. 215*4d7e907cSAndroid Build Coastguard Worker EIC_ACCESS_CHECK_RESULT_NO_ACCESS_CONTROL_PROFILES, 216*4d7e907cSAndroid Build Coastguard Worker 217*4d7e907cSAndroid Build Coastguard Worker // Returned if access was denied because of user authentication. 218*4d7e907cSAndroid Build Coastguard Worker EIC_ACCESS_CHECK_RESULT_USER_AUTHENTICATION_FAILED, 219*4d7e907cSAndroid Build Coastguard Worker 220*4d7e907cSAndroid Build Coastguard Worker // Returned if access was denied because of reader authentication. 221*4d7e907cSAndroid Build Coastguard Worker EIC_ACCESS_CHECK_RESULT_READER_AUTHENTICATION_FAILED, 222*4d7e907cSAndroid Build Coastguard Worker } EicAccessCheckResult; 223*4d7e907cSAndroid Build Coastguard Worker 224*4d7e907cSAndroid Build Coastguard Worker // Passes enough information to calculate the MACing key and/or prepare ECDSA signing 225*4d7e907cSAndroid Build Coastguard Worker // 226*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationPrepareDeviceAuthentication( 227*4d7e907cSAndroid Build Coastguard Worker EicPresentation* ctx, const uint8_t* sessionTranscript, size_t sessionTranscriptSize, 228*4d7e907cSAndroid Build Coastguard Worker const uint8_t* readerEphemeralPublicKey, size_t readerEphemeralPublicKeySize, 229*4d7e907cSAndroid Build Coastguard Worker const uint8_t signingKeyBlob[60], const char* docType, size_t docTypeLength, 230*4d7e907cSAndroid Build Coastguard Worker unsigned int numNamespacesWithValues, size_t expectedDeviceNamespacesSize); 231*4d7e907cSAndroid Build Coastguard Worker 232*4d7e907cSAndroid Build Coastguard Worker // The scratchSpace should be set to a buffer at least 512 bytes (ideally 1024 233*4d7e907cSAndroid Build Coastguard Worker // bytes, the bigger the better). It's done this way to avoid allocating stack 234*4d7e907cSAndroid Build Coastguard Worker // space. 235*4d7e907cSAndroid Build Coastguard Worker // 236*4d7e907cSAndroid Build Coastguard Worker EicAccessCheckResult eicPresentationStartRetrieveEntryValue( 237*4d7e907cSAndroid Build Coastguard Worker EicPresentation* ctx, const char* nameSpace, size_t nameSpaceLength, 238*4d7e907cSAndroid Build Coastguard Worker const char* name, size_t nameLength, 239*4d7e907cSAndroid Build Coastguard Worker unsigned int newNamespaceNumEntries, int32_t entrySize, 240*4d7e907cSAndroid Build Coastguard Worker const uint8_t* accessControlProfileIds, size_t numAccessControlProfileIds, 241*4d7e907cSAndroid Build Coastguard Worker uint8_t* scratchSpace, size_t scratchSpaceSize); 242*4d7e907cSAndroid Build Coastguard Worker 243*4d7e907cSAndroid Build Coastguard Worker // Note: |content| must be big enough to hold |encryptedContentSize| - 28 bytes. 244*4d7e907cSAndroid Build Coastguard Worker // 245*4d7e907cSAndroid Build Coastguard Worker // The scratchSpace should be set to a buffer at least 512 bytes. It's done this way to 246*4d7e907cSAndroid Build Coastguard Worker // avoid allocating stack space. 247*4d7e907cSAndroid Build Coastguard Worker // 248*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationRetrieveEntryValue(EicPresentation* ctx, const uint8_t* encryptedContent, 249*4d7e907cSAndroid Build Coastguard Worker size_t encryptedContentSize, uint8_t* content, 250*4d7e907cSAndroid Build Coastguard Worker const char* nameSpace, size_t nameSpaceLength, 251*4d7e907cSAndroid Build Coastguard Worker const char* name, size_t nameLength, 252*4d7e907cSAndroid Build Coastguard Worker const uint8_t* accessControlProfileIds, 253*4d7e907cSAndroid Build Coastguard Worker size_t numAccessControlProfileIds, 254*4d7e907cSAndroid Build Coastguard Worker uint8_t* scratchSpace, 255*4d7e907cSAndroid Build Coastguard Worker size_t scratchSpaceSize); 256*4d7e907cSAndroid Build Coastguard Worker 257*4d7e907cSAndroid Build Coastguard Worker // Returns the HMAC-SHA256 of |ToBeMaced| as per RFC 8051 "6.3. How to Compute 258*4d7e907cSAndroid Build Coastguard Worker // and Verify a MAC". 259*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationFinishRetrieval(EicPresentation* ctx, uint8_t* digestToBeMaced, 260*4d7e907cSAndroid Build Coastguard Worker size_t* digestToBeMacedSize); 261*4d7e907cSAndroid Build Coastguard Worker 262*4d7e907cSAndroid Build Coastguard Worker // Like eicPresentationFinishRetrieval() but also returns an ECDSA signature. 263*4d7e907cSAndroid Build Coastguard Worker // 264*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationFinishRetrievalWithSignature(EicPresentation* ctx, uint8_t* digestToBeMaced, 265*4d7e907cSAndroid Build Coastguard Worker size_t* digestToBeMacedSize, 266*4d7e907cSAndroid Build Coastguard Worker uint8_t* signatureOfToBeSigned, 267*4d7e907cSAndroid Build Coastguard Worker size_t* signatureOfToBeSignedSize); 268*4d7e907cSAndroid Build Coastguard Worker 269*4d7e907cSAndroid Build Coastguard Worker // The data returned in |signatureOfToBeSigned| contains the ECDSA signature of 270*4d7e907cSAndroid Build Coastguard Worker // the ToBeSigned CBOR from RFC 8051 "4.4. Signing and Verification Process" 271*4d7e907cSAndroid Build Coastguard Worker // where content is set to the ProofOfDeletion CBOR. 272*4d7e907cSAndroid Build Coastguard Worker // 273*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationDeleteCredential(EicPresentation* ctx, const char* docType, size_t docTypeLength, 274*4d7e907cSAndroid Build Coastguard Worker const uint8_t* challenge, size_t challengeSize, 275*4d7e907cSAndroid Build Coastguard Worker bool includeChallenge, size_t proofOfDeletionCborSize, 276*4d7e907cSAndroid Build Coastguard Worker uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]); 277*4d7e907cSAndroid Build Coastguard Worker 278*4d7e907cSAndroid Build Coastguard Worker // The data returned in |signatureOfToBeSigned| contains the ECDSA signature of 279*4d7e907cSAndroid Build Coastguard Worker // the ToBeSigned CBOR from RFC 8051 "4.4. Signing and Verification Process" 280*4d7e907cSAndroid Build Coastguard Worker // where content is set to the ProofOfOwnership CBOR. 281*4d7e907cSAndroid Build Coastguard Worker // 282*4d7e907cSAndroid Build Coastguard Worker bool eicPresentationProveOwnership(EicPresentation* ctx, const char* docType, size_t docTypeLength, 283*4d7e907cSAndroid Build Coastguard Worker bool testCredential, const uint8_t* challenge, size_t challengeSize, 284*4d7e907cSAndroid Build Coastguard Worker size_t proofOfOwnershipCborSize, 285*4d7e907cSAndroid Build Coastguard Worker uint8_t signatureOfToBeSigned[EIC_ECDSA_P256_SIGNATURE_SIZE]); 286*4d7e907cSAndroid Build Coastguard Worker 287*4d7e907cSAndroid Build Coastguard Worker #ifdef __cplusplus 288*4d7e907cSAndroid Build Coastguard Worker } 289*4d7e907cSAndroid Build Coastguard Worker #endif 290*4d7e907cSAndroid Build Coastguard Worker 291*4d7e907cSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_IDENTITY_EIC_PRESENTATION_H 292