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_OPS_H
22*4d7e907cSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_IDENTITY_EIC_OPS_H
23*4d7e907cSAndroid Build Coastguard Worker
24*4d7e907cSAndroid Build Coastguard Worker #include <stdarg.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <stdbool.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <stddef.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <stdlib.h>
28*4d7e907cSAndroid Build Coastguard Worker
29*4d7e907cSAndroid Build Coastguard Worker // Uncomment or define if debug messages are needed.
30*4d7e907cSAndroid Build Coastguard Worker //
31*4d7e907cSAndroid Build Coastguard Worker //#define EIC_DEBUG
32*4d7e907cSAndroid Build Coastguard Worker
33*4d7e907cSAndroid Build Coastguard Worker #ifdef __cplusplus
34*4d7e907cSAndroid Build Coastguard Worker extern "C" {
35*4d7e907cSAndroid Build Coastguard Worker #endif
36*4d7e907cSAndroid Build Coastguard Worker
37*4d7e907cSAndroid Build Coastguard Worker // The following defines must be set to something appropriate
38*4d7e907cSAndroid Build Coastguard Worker //
39*4d7e907cSAndroid Build Coastguard Worker // EIC_SHA256_CONTEXT_SIZE - the size of EicSha256Ctx
40*4d7e907cSAndroid Build Coastguard Worker // EIC_HMAC_SHA256_CONTEXT_SIZE - the size of EicHmacSha256Ctx
41*4d7e907cSAndroid Build Coastguard Worker //
42*4d7e907cSAndroid Build Coastguard Worker // For example, if EicSha256Ctx is implemented using BoringSSL this would be defined
43*4d7e907cSAndroid Build Coastguard Worker // as sizeof(SHA256_CTX).
44*4d7e907cSAndroid Build Coastguard Worker //
45*4d7e907cSAndroid Build Coastguard Worker // We expect the implementation to provide a header file with the name
46*4d7e907cSAndroid Build Coastguard Worker // EicOpsImpl.h to do all this.
47*4d7e907cSAndroid Build Coastguard Worker //
48*4d7e907cSAndroid Build Coastguard Worker #include "EicOpsImpl.h"
49*4d7e907cSAndroid Build Coastguard Worker
50*4d7e907cSAndroid Build Coastguard Worker #define EIC_SHA256_DIGEST_SIZE 32
51*4d7e907cSAndroid Build Coastguard Worker
52*4d7e907cSAndroid Build Coastguard Worker // The size of a P-256 private key.
53*4d7e907cSAndroid Build Coastguard Worker //
54*4d7e907cSAndroid Build Coastguard Worker #define EIC_P256_PRIV_KEY_SIZE 32
55*4d7e907cSAndroid Build Coastguard Worker
56*4d7e907cSAndroid Build Coastguard Worker // The size of a P-256 public key in uncompressed form.
57*4d7e907cSAndroid Build Coastguard Worker //
58*4d7e907cSAndroid Build Coastguard Worker // The public key is stored in uncompressed form, first the X coordinate, then
59*4d7e907cSAndroid Build Coastguard Worker // the Y coordinate.
60*4d7e907cSAndroid Build Coastguard Worker //
61*4d7e907cSAndroid Build Coastguard Worker #define EIC_P256_PUB_KEY_SIZE 64
62*4d7e907cSAndroid Build Coastguard Worker
63*4d7e907cSAndroid Build Coastguard Worker // Size of one of the coordinates in a curve-point.
64*4d7e907cSAndroid Build Coastguard Worker //
65*4d7e907cSAndroid Build Coastguard Worker #define EIC_P256_COORDINATE_SIZE 32
66*4d7e907cSAndroid Build Coastguard Worker
67*4d7e907cSAndroid Build Coastguard Worker // The size of an ECSDA signature using P-256.
68*4d7e907cSAndroid Build Coastguard Worker //
69*4d7e907cSAndroid Build Coastguard Worker // The R and S values are stored here, first R then S.
70*4d7e907cSAndroid Build Coastguard Worker //
71*4d7e907cSAndroid Build Coastguard Worker #define EIC_ECDSA_P256_SIGNATURE_SIZE 64
72*4d7e907cSAndroid Build Coastguard Worker
73*4d7e907cSAndroid Build Coastguard Worker #define EIC_AES_128_KEY_SIZE 16
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker // The following are definitions of implementation functions the
76*4d7e907cSAndroid Build Coastguard Worker // underlying platform must provide.
77*4d7e907cSAndroid Build Coastguard Worker //
78*4d7e907cSAndroid Build Coastguard Worker
79*4d7e907cSAndroid Build Coastguard Worker struct EicSha256Ctx {
80*4d7e907cSAndroid Build Coastguard Worker uint8_t reserved[EIC_SHA256_CONTEXT_SIZE];
81*4d7e907cSAndroid Build Coastguard Worker };
82*4d7e907cSAndroid Build Coastguard Worker typedef struct EicSha256Ctx EicSha256Ctx;
83*4d7e907cSAndroid Build Coastguard Worker
84*4d7e907cSAndroid Build Coastguard Worker struct EicHmacSha256Ctx {
85*4d7e907cSAndroid Build Coastguard Worker uint8_t reserved[EIC_HMAC_SHA256_CONTEXT_SIZE];
86*4d7e907cSAndroid Build Coastguard Worker };
87*4d7e907cSAndroid Build Coastguard Worker typedef struct EicHmacSha256Ctx EicHmacSha256Ctx;
88*4d7e907cSAndroid Build Coastguard Worker
89*4d7e907cSAndroid Build Coastguard Worker #ifdef EIC_DEBUG
90*4d7e907cSAndroid Build Coastguard Worker // Debug macro. Don't include a new-line in message.
91*4d7e907cSAndroid Build Coastguard Worker //
92*4d7e907cSAndroid Build Coastguard Worker #define eicDebug(...) \
93*4d7e907cSAndroid Build Coastguard Worker do { \
94*4d7e907cSAndroid Build Coastguard Worker eicPrint("%s:%d: ", __FILE__, __LINE__); \
95*4d7e907cSAndroid Build Coastguard Worker eicPrint(__VA_ARGS__); \
96*4d7e907cSAndroid Build Coastguard Worker eicPrint("\n"); \
97*4d7e907cSAndroid Build Coastguard Worker } while (0)
98*4d7e907cSAndroid Build Coastguard Worker #else
99*4d7e907cSAndroid Build Coastguard Worker #define eicDebug(...) \
100*4d7e907cSAndroid Build Coastguard Worker do { \
101*4d7e907cSAndroid Build Coastguard Worker } while (0)
102*4d7e907cSAndroid Build Coastguard Worker #endif
103*4d7e907cSAndroid Build Coastguard Worker
104*4d7e907cSAndroid Build Coastguard Worker // Prints message which should include new-line character. Can be no-op.
105*4d7e907cSAndroid Build Coastguard Worker //
106*4d7e907cSAndroid Build Coastguard Worker // Don't use this from code, use eicDebug() instead.
107*4d7e907cSAndroid Build Coastguard Worker //
108*4d7e907cSAndroid Build Coastguard Worker #ifdef EIC_DEBUG
109*4d7e907cSAndroid Build Coastguard Worker void eicPrint(const char* format, ...);
110*4d7e907cSAndroid Build Coastguard Worker #else
eicPrint(const char *,...)111*4d7e907cSAndroid Build Coastguard Worker inline void eicPrint(const char*, ...) {}
112*4d7e907cSAndroid Build Coastguard Worker #endif
113*4d7e907cSAndroid Build Coastguard Worker
114*4d7e907cSAndroid Build Coastguard Worker // Dumps data as pretty-printed hex. Can be no-op.
115*4d7e907cSAndroid Build Coastguard Worker //
116*4d7e907cSAndroid Build Coastguard Worker #ifdef EIC_DEBUG
117*4d7e907cSAndroid Build Coastguard Worker void eicHexdump(const char* message, const uint8_t* data, size_t dataSize);
118*4d7e907cSAndroid Build Coastguard Worker #else
eicHexdump(const char *,const uint8_t *,size_t)119*4d7e907cSAndroid Build Coastguard Worker inline void eicHexdump(const char*, const uint8_t*, size_t) {}
120*4d7e907cSAndroid Build Coastguard Worker #endif
121*4d7e907cSAndroid Build Coastguard Worker
122*4d7e907cSAndroid Build Coastguard Worker // Pretty-prints encoded CBOR. Can be no-op.
123*4d7e907cSAndroid Build Coastguard Worker //
124*4d7e907cSAndroid Build Coastguard Worker // If a byte-string is larger than |maxBStrSize| its contents will not be
125*4d7e907cSAndroid Build Coastguard Worker // printed, instead the value of the form "<bstr size=1099016
126*4d7e907cSAndroid Build Coastguard Worker // sha1=ef549cca331f73dfae2090e6a37c04c23f84b07b>" will be printed. Pass zero
127*4d7e907cSAndroid Build Coastguard Worker // for |maxBStrSize| to disable this.
128*4d7e907cSAndroid Build Coastguard Worker //
129*4d7e907cSAndroid Build Coastguard Worker #ifdef EIC_DEBUG
130*4d7e907cSAndroid Build Coastguard Worker void eicCborPrettyPrint(const uint8_t* cborData, size_t cborDataSize, size_t maxBStrSize);
131*4d7e907cSAndroid Build Coastguard Worker #else
eicCborPrettyPrint(const uint8_t *,size_t,size_t)132*4d7e907cSAndroid Build Coastguard Worker inline void eicCborPrettyPrint(const uint8_t*, size_t, size_t) {}
133*4d7e907cSAndroid Build Coastguard Worker #endif
134*4d7e907cSAndroid Build Coastguard Worker
135*4d7e907cSAndroid Build Coastguard Worker // Memory setting, see memset(3).
136*4d7e907cSAndroid Build Coastguard Worker void* eicMemSet(void* s, int c, size_t n);
137*4d7e907cSAndroid Build Coastguard Worker
138*4d7e907cSAndroid Build Coastguard Worker // Memory copying, see memcpy(3).
139*4d7e907cSAndroid Build Coastguard Worker void* eicMemCpy(void* dest, const void* src, size_t n);
140*4d7e907cSAndroid Build Coastguard Worker
141*4d7e907cSAndroid Build Coastguard Worker // String length, see strlen(3).
142*4d7e907cSAndroid Build Coastguard Worker size_t eicStrLen(const char* s);
143*4d7e907cSAndroid Build Coastguard Worker
144*4d7e907cSAndroid Build Coastguard Worker // Locate a substring, see memmem(3)
145*4d7e907cSAndroid Build Coastguard Worker void* eicMemMem(const uint8_t* haystack, size_t haystackLen, const uint8_t* needle,
146*4d7e907cSAndroid Build Coastguard Worker size_t needleLen);
147*4d7e907cSAndroid Build Coastguard Worker
148*4d7e907cSAndroid Build Coastguard Worker // Memory compare, see CRYPTO_memcmp(3SSL)
149*4d7e907cSAndroid Build Coastguard Worker //
150*4d7e907cSAndroid Build Coastguard Worker // It takes an amount of time dependent on len, but independent of the contents of the
151*4d7e907cSAndroid Build Coastguard Worker // memory regions pointed to by s1 and s2.
152*4d7e907cSAndroid Build Coastguard Worker //
153*4d7e907cSAndroid Build Coastguard Worker int eicCryptoMemCmp(const void* s1, const void* s2, size_t n);
154*4d7e907cSAndroid Build Coastguard Worker
155*4d7e907cSAndroid Build Coastguard Worker // Random number generation.
156*4d7e907cSAndroid Build Coastguard Worker bool eicOpsRandom(uint8_t* buf, size_t numBytes);
157*4d7e907cSAndroid Build Coastguard Worker
158*4d7e907cSAndroid Build Coastguard Worker // Creates a new non-zero identifier in |id|.
159*4d7e907cSAndroid Build Coastguard Worker //
160*4d7e907cSAndroid Build Coastguard Worker // Is guaranteed to be non-zero and different than what is already in |id|.
161*4d7e907cSAndroid Build Coastguard Worker //
162*4d7e907cSAndroid Build Coastguard Worker bool eicNextId(uint32_t* id);
163*4d7e907cSAndroid Build Coastguard Worker
164*4d7e907cSAndroid Build Coastguard Worker // If |testCredential| is true, returns the 128-bit AES Hardware-Bound Key (16 bytes).
165*4d7e907cSAndroid Build Coastguard Worker //
166*4d7e907cSAndroid Build Coastguard Worker // Otherwise returns all zeroes (16 bytes).
167*4d7e907cSAndroid Build Coastguard Worker //
168*4d7e907cSAndroid Build Coastguard Worker const uint8_t* eicOpsGetHardwareBoundKey(bool testCredential);
169*4d7e907cSAndroid Build Coastguard Worker
170*4d7e907cSAndroid Build Coastguard Worker // Encrypts |data| with |key| and |additionalAuthenticatedData| using |nonce|,
171*4d7e907cSAndroid Build Coastguard Worker // returns the resulting (nonce || ciphertext || tag) in |encryptedData| which
172*4d7e907cSAndroid Build Coastguard Worker // must be of size |dataSize| + 28.
173*4d7e907cSAndroid Build Coastguard Worker bool eicOpsEncryptAes128Gcm(
174*4d7e907cSAndroid Build Coastguard Worker const uint8_t* key, // Must be 16 bytes
175*4d7e907cSAndroid Build Coastguard Worker const uint8_t* nonce, // Must be 12 bytes
176*4d7e907cSAndroid Build Coastguard Worker const uint8_t* data, // May be NULL if size is 0
177*4d7e907cSAndroid Build Coastguard Worker size_t dataSize,
178*4d7e907cSAndroid Build Coastguard Worker const uint8_t* additionalAuthenticationData, // May be NULL if size is 0
179*4d7e907cSAndroid Build Coastguard Worker size_t additionalAuthenticationDataSize, uint8_t* encryptedData);
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Worker // Decrypts |encryptedData| using |key| and |additionalAuthenticatedData|,
182*4d7e907cSAndroid Build Coastguard Worker // returns resulting plaintext in |data| must be of size |encryptedDataSize| - 28.
183*4d7e907cSAndroid Build Coastguard Worker //
184*4d7e907cSAndroid Build Coastguard Worker // The format of |encryptedData| must be as specified in the
185*4d7e907cSAndroid Build Coastguard Worker // encryptAes128Gcm() function.
186*4d7e907cSAndroid Build Coastguard Worker bool eicOpsDecryptAes128Gcm(const uint8_t* key, // Must be 16 bytes
187*4d7e907cSAndroid Build Coastguard Worker const uint8_t* encryptedData, size_t encryptedDataSize,
188*4d7e907cSAndroid Build Coastguard Worker const uint8_t* additionalAuthenticationData,
189*4d7e907cSAndroid Build Coastguard Worker size_t additionalAuthenticationDataSize, uint8_t* data);
190*4d7e907cSAndroid Build Coastguard Worker
191*4d7e907cSAndroid Build Coastguard Worker // Creates an EC key using the P-256 curve. The private key is written to
192*4d7e907cSAndroid Build Coastguard Worker // |privateKey|. The public key is written to |publicKey|.
193*4d7e907cSAndroid Build Coastguard Worker //
194*4d7e907cSAndroid Build Coastguard Worker bool eicOpsCreateEcKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
195*4d7e907cSAndroid Build Coastguard Worker uint8_t publicKey[EIC_P256_PUB_KEY_SIZE]);
196*4d7e907cSAndroid Build Coastguard Worker
197*4d7e907cSAndroid Build Coastguard Worker // Generates CredentialKey plus an attestation certificate.
198*4d7e907cSAndroid Build Coastguard Worker //
199*4d7e907cSAndroid Build Coastguard Worker // If |attestationKeyBlob| is non-NULL, the certificate must be signed by the
200*4d7e907cSAndroid Build Coastguard Worker // the provided attestation key. Else, the certificate must be signed by the
201*4d7e907cSAndroid Build Coastguard Worker // attestation key that the secure area has been factory provisioned with. The
202*4d7e907cSAndroid Build Coastguard Worker // given |challenge|, |applicationId|, and |testCredential| must be signed
203*4d7e907cSAndroid Build Coastguard Worker // into the attestation.
204*4d7e907cSAndroid Build Coastguard Worker //
205*4d7e907cSAndroid Build Coastguard Worker // When |attestationKeyBlob| is non-NULL, then |attestationKeyCert| must
206*4d7e907cSAndroid Build Coastguard Worker // also be passed so that the underlying implementation can properly chain up
207*4d7e907cSAndroid Build Coastguard Worker // the newly-generated certificate to the existing chain.
208*4d7e907cSAndroid Build Coastguard Worker //
209*4d7e907cSAndroid Build Coastguard Worker // The generated certificate must be in X.509 format and returned in |cert|
210*4d7e907cSAndroid Build Coastguard Worker // and |certSize| must be set to the size of this array. This function must
211*4d7e907cSAndroid Build Coastguard Worker // set |certSize| to the size of the certification chain on successfully return.
212*4d7e907cSAndroid Build Coastguard Worker //
213*4d7e907cSAndroid Build Coastguard Worker // This may return either a single certificate or an entire certificate
214*4d7e907cSAndroid Build Coastguard Worker // chain. If it returns only a single certificate, the implementation of
215*4d7e907cSAndroid Build Coastguard Worker // SecureHardwareProvisioningProxy::createCredentialKey() should amend the
216*4d7e907cSAndroid Build Coastguard Worker // remainder of the certificate chain on the HAL side.
217*4d7e907cSAndroid Build Coastguard Worker //
218*4d7e907cSAndroid Build Coastguard Worker bool eicOpsCreateCredentialKey(uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE], const uint8_t* challenge,
219*4d7e907cSAndroid Build Coastguard Worker size_t challengeSize, const uint8_t* applicationId,
220*4d7e907cSAndroid Build Coastguard Worker size_t applicationIdSize, bool testCredential,
221*4d7e907cSAndroid Build Coastguard Worker const uint8_t* attestationKeyBlob, size_t attestationKeyBlobSize,
222*4d7e907cSAndroid Build Coastguard Worker const uint8_t* attestationKeyCert, size_t attestationKeyCertSize,
223*4d7e907cSAndroid Build Coastguard Worker uint8_t* /*out*/ cert, size_t* /*inout*/ certSize);
224*4d7e907cSAndroid Build Coastguard Worker
225*4d7e907cSAndroid Build Coastguard Worker // Generate an X.509 certificate for the key identified by |publicKey| which
226*4d7e907cSAndroid Build Coastguard Worker // must be of the form returned by eicOpsCreateEcKey().
227*4d7e907cSAndroid Build Coastguard Worker //
228*4d7e907cSAndroid Build Coastguard Worker // If proofOfBinding is not NULL, it will be included as an OCTET_STRING
229*4d7e907cSAndroid Build Coastguard Worker // X.509 extension at OID 1.3.6.1.4.1.11129.2.1.26.
230*4d7e907cSAndroid Build Coastguard Worker //
231*4d7e907cSAndroid Build Coastguard Worker // The certificate will be signed by the key identified by |signingKey| which
232*4d7e907cSAndroid Build Coastguard Worker // must be of the form returned by eicOpsCreateEcKey().
233*4d7e907cSAndroid Build Coastguard Worker //
234*4d7e907cSAndroid Build Coastguard Worker bool eicOpsSignEcKey(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
235*4d7e907cSAndroid Build Coastguard Worker const uint8_t signingKey[EIC_P256_PRIV_KEY_SIZE], unsigned int serial,
236*4d7e907cSAndroid Build Coastguard Worker const char* issuerName, const char* subjectName, time_t validityNotBefore,
237*4d7e907cSAndroid Build Coastguard Worker time_t validityNotAfter, const uint8_t* proofOfBinding,
238*4d7e907cSAndroid Build Coastguard Worker size_t proofOfBindingSize, uint8_t* cert, size_t* certSize); // inout
239*4d7e907cSAndroid Build Coastguard Worker
240*4d7e907cSAndroid Build Coastguard Worker // Uses |privateKey| to create an ECDSA signature of some data (the SHA-256 must
241*4d7e907cSAndroid Build Coastguard Worker // be given by |digestOfData|). Returns the signature in |signature|.
242*4d7e907cSAndroid Build Coastguard Worker //
243*4d7e907cSAndroid Build Coastguard Worker bool eicOpsEcDsa(const uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
244*4d7e907cSAndroid Build Coastguard Worker const uint8_t digestOfData[EIC_SHA256_DIGEST_SIZE],
245*4d7e907cSAndroid Build Coastguard Worker uint8_t signature[EIC_ECDSA_P256_SIGNATURE_SIZE]);
246*4d7e907cSAndroid Build Coastguard Worker
247*4d7e907cSAndroid Build Coastguard Worker // Performs Elliptic Curve Diffie-Helman.
248*4d7e907cSAndroid Build Coastguard Worker //
249*4d7e907cSAndroid Build Coastguard Worker bool eicOpsEcdh(const uint8_t publicKey[EIC_P256_PUB_KEY_SIZE],
250*4d7e907cSAndroid Build Coastguard Worker const uint8_t privateKey[EIC_P256_PRIV_KEY_SIZE],
251*4d7e907cSAndroid Build Coastguard Worker uint8_t sharedSecret[EIC_P256_COORDINATE_SIZE]);
252*4d7e907cSAndroid Build Coastguard Worker
253*4d7e907cSAndroid Build Coastguard Worker // Performs HKDF.
254*4d7e907cSAndroid Build Coastguard Worker //
255*4d7e907cSAndroid Build Coastguard Worker bool eicOpsHkdf(const uint8_t* sharedSecret, size_t sharedSecretSize, const uint8_t* salt,
256*4d7e907cSAndroid Build Coastguard Worker size_t saltSize, const uint8_t* info, size_t infoSize, uint8_t* output,
257*4d7e907cSAndroid Build Coastguard Worker size_t outputSize);
258*4d7e907cSAndroid Build Coastguard Worker
259*4d7e907cSAndroid Build Coastguard Worker // SHA-256 functions.
260*4d7e907cSAndroid Build Coastguard Worker void eicOpsSha256Init(EicSha256Ctx* ctx);
261*4d7e907cSAndroid Build Coastguard Worker void eicOpsSha256Update(EicSha256Ctx* ctx, const uint8_t* data, size_t len);
262*4d7e907cSAndroid Build Coastguard Worker void eicOpsSha256Final(EicSha256Ctx* ctx, uint8_t digest[EIC_SHA256_DIGEST_SIZE]);
263*4d7e907cSAndroid Build Coastguard Worker
264*4d7e907cSAndroid Build Coastguard Worker // HMAC SHA-256 functions.
265*4d7e907cSAndroid Build Coastguard Worker void eicOpsHmacSha256Init(EicHmacSha256Ctx* ctx, const uint8_t* key, size_t keySize);
266*4d7e907cSAndroid Build Coastguard Worker void eicOpsHmacSha256Update(EicHmacSha256Ctx* ctx, const uint8_t* data, size_t len);
267*4d7e907cSAndroid Build Coastguard Worker void eicOpsHmacSha256Final(EicHmacSha256Ctx* ctx, uint8_t digest[EIC_SHA256_DIGEST_SIZE]);
268*4d7e907cSAndroid Build Coastguard Worker
269*4d7e907cSAndroid Build Coastguard Worker // Extracts the public key in the given X.509 certificate.
270*4d7e907cSAndroid Build Coastguard Worker //
271*4d7e907cSAndroid Build Coastguard Worker // If the key is not an EC key, this function fails.
272*4d7e907cSAndroid Build Coastguard Worker //
273*4d7e907cSAndroid Build Coastguard Worker // Otherwise the public key is stored in uncompressed form in |publicKey| which
274*4d7e907cSAndroid Build Coastguard Worker // size should be set in |publicKeySize|. On successful return |publicKeySize|
275*4d7e907cSAndroid Build Coastguard Worker // is set to the length of the key. If there is not enough space, the function
276*4d7e907cSAndroid Build Coastguard Worker // fails.
277*4d7e907cSAndroid Build Coastguard Worker //
278*4d7e907cSAndroid Build Coastguard Worker // (The public key returned is not necessarily a P-256 key, even if it is note
279*4d7e907cSAndroid Build Coastguard Worker // that its size is not EIC_P256_PUBLIC_KEY_SIZE because of the leading 0x04.)
280*4d7e907cSAndroid Build Coastguard Worker //
281*4d7e907cSAndroid Build Coastguard Worker bool eicOpsX509GetPublicKey(const uint8_t* x509Cert, size_t x509CertSize, uint8_t* publicKey,
282*4d7e907cSAndroid Build Coastguard Worker size_t* publicKeySize);
283*4d7e907cSAndroid Build Coastguard Worker
284*4d7e907cSAndroid Build Coastguard Worker // Checks that the X.509 certificate given by |x509Cert| is signed by the public
285*4d7e907cSAndroid Build Coastguard Worker // key given by |publicKey| which must be an EC key in uncompressed form (e.g.
286*4d7e907cSAndroid Build Coastguard Worker // same formatt as returned by eicOpsX509GetPublicKey()).
287*4d7e907cSAndroid Build Coastguard Worker //
288*4d7e907cSAndroid Build Coastguard Worker bool eicOpsX509CertSignedByPublicKey(const uint8_t* x509Cert, size_t x509CertSize,
289*4d7e907cSAndroid Build Coastguard Worker const uint8_t* publicKey, size_t publicKeySize);
290*4d7e907cSAndroid Build Coastguard Worker
291*4d7e907cSAndroid Build Coastguard Worker // Checks that |signature| is a signature of some data (given by |digest|),
292*4d7e907cSAndroid Build Coastguard Worker // signed by the public key given by |publicKey|.
293*4d7e907cSAndroid Build Coastguard Worker //
294*4d7e907cSAndroid Build Coastguard Worker // The key must be an EC key in uncompressed form (e.g. same format as returned
295*4d7e907cSAndroid Build Coastguard Worker // by eicOpsX509GetPublicKey()).
296*4d7e907cSAndroid Build Coastguard Worker //
297*4d7e907cSAndroid Build Coastguard Worker // The format of the signature is the same encoding as the 'signature' field of
298*4d7e907cSAndroid Build Coastguard Worker // COSE_Sign1 - that is, it's the R and S integers both with the same length as
299*4d7e907cSAndroid Build Coastguard Worker // the key-size.
300*4d7e907cSAndroid Build Coastguard Worker //
301*4d7e907cSAndroid Build Coastguard Worker // The size of digest must match the size of the key.
302*4d7e907cSAndroid Build Coastguard Worker //
303*4d7e907cSAndroid Build Coastguard Worker bool eicOpsEcDsaVerifyWithPublicKey(const uint8_t* digest, size_t digestSize,
304*4d7e907cSAndroid Build Coastguard Worker const uint8_t* signature, size_t signatureSize,
305*4d7e907cSAndroid Build Coastguard Worker const uint8_t* publicKey, size_t publicKeySize);
306*4d7e907cSAndroid Build Coastguard Worker
307*4d7e907cSAndroid Build Coastguard Worker // Validates that the passed in data constitutes a valid auth- and verification tokens.
308*4d7e907cSAndroid Build Coastguard Worker //
309*4d7e907cSAndroid Build Coastguard Worker bool eicOpsValidateAuthToken(uint64_t challenge, uint64_t secureUserId, uint64_t authenticatorId,
310*4d7e907cSAndroid Build Coastguard Worker int hardwareAuthenticatorType, uint64_t timeStamp, const uint8_t* mac,
311*4d7e907cSAndroid Build Coastguard Worker size_t macSize, uint64_t verificationTokenChallenge,
312*4d7e907cSAndroid Build Coastguard Worker uint64_t verificationTokenTimeStamp,
313*4d7e907cSAndroid Build Coastguard Worker int verificationTokenSecurityLevel,
314*4d7e907cSAndroid Build Coastguard Worker const uint8_t* verificationTokenMac, size_t verificationTokenMacSize);
315*4d7e907cSAndroid Build Coastguard Worker
316*4d7e907cSAndroid Build Coastguard Worker // Also see eicOpsLookupActiveSessionFromId() defined in EicSession.h
317*4d7e907cSAndroid Build Coastguard Worker
318*4d7e907cSAndroid Build Coastguard Worker #ifdef __cplusplus
319*4d7e907cSAndroid Build Coastguard Worker }
320*4d7e907cSAndroid Build Coastguard Worker #endif
321*4d7e907cSAndroid Build Coastguard Worker
322*4d7e907cSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_IDENTITY_EIC_OPS_H
323