xref: /aosp_15_r20/hardware/interfaces/identity/aidl/default/libeic/EicPresentation.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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