1 /*
2  * Copyright 2015 The Chromium OS Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6 
7 #ifndef __SOURCE_CRYPTUTIL_FP_H
8 #define __SOURCE_CRYPTUTIL_FP_H
9 
10 BOOL CryptAreKeySizesConsistent(
11     TPMT_PUBLIC *publicArea  // IN: the public area to check
12     );
13 TPMI_YES_NO CryptCapGetECCCurve(
14     TPM_ECC_CURVE curveID,     // IN: the starting ECC curve
15     UINT32 maxCount,           // IN: count of returned curve
16     TPML_ECC_CURVE *curveList  // OUT: ECC curve list
17     );
18 UINT32 CryptCapGetEccCurveNumber(void);
19 UINT16 CryptCommit(void);
20 LIB_EXPORT int CryptCompare(const UINT32 aSize,  //   IN:   size of a
21                             const BYTE *a,       //   IN:   a buffer
22                             const UINT32 bSize,  //   IN:   size of b
23                             const BYTE *b        //   IN:   b buffer
24                             );
25 TPM_RC CryptCommitCompute(
26     TPMS_ECC_POINT *K,       //   OUT: [d]B
27     TPMS_ECC_POINT *L,       //   OUT: [r]B
28     TPMS_ECC_POINT *E,       //   OUT: [r]M
29     TPM_ECC_CURVE curveID,   //   IN: The curve for the computation
30     TPMS_ECC_POINT *M,       //   IN: M (P1)
31     TPMS_ECC_POINT *B,       //   IN: B (x2, y2)
32     TPM2B_ECC_PARAMETER *d,  //   IN: the private scalar
33     TPM2B_ECC_PARAMETER *r   //   IN: the computed r value
34     );
35 int CryptCompareSigned(UINT32 aSize,  //   IN:   size of a
36                        BYTE *a,       //   IN:   a buffer
37                        UINT32 bSize,  //   IN:   size of b
38                        BYTE *b        //   IN:   b buffer
39                        );
40 void CryptComputeSymmetricUnique(
41     TPMI_ALG_HASH nameAlg,      // IN: object name algorithm
42     TPMT_SENSITIVE *sensitive,  // IN: sensitive area
43     TPM2B_DIGEST *unique        // OUT: unique buffer
44     );
45 LIB_EXPORT UINT16
46 CryptCompleteHMAC2B(HMAC_STATE *hmacState,  // IN: the state of HMAC stack
47                     TPM2B *digest           // OUT: HMAC
48                     );
49 LIB_EXPORT UINT16
50 CryptCompleteHash(void *state,        // IN: the state of hash stack
51                   UINT16 digestSize,  // IN: size of digest buffer
52                   BYTE *digest        // OUT: hash digest
53                   );
54 UINT16 CryptCompleteHash2B(
55     void *state,   // IN: the state of hash stack
56     TPM2B *digest  // IN: the size of the buffer Out: requested number of byte
57     );
58 TPM_RC CryptCreateObject(
59     TPM_HANDLE parentHandle,  //   IN/OUT: indication of the seed source
60     TPMT_PUBLIC *publicArea,  //   IN/OUT: public area
61     TPMS_SENSITIVE_CREATE *sensitiveCreate,  //   IN: sensitive creation
62     TPMT_SENSITIVE *sensitive                //   OUT: sensitive area
63     );
64 void CryptDrbgGetPutState(GET_PUT direction  // IN: Get from or put to DRBG
65                           );
66 TPM_RC CryptDecryptRSA(
67     UINT16 *dataOutSize,       // OUT: size of plain text in byte
68     BYTE *dataOut,             //   OUT: plain text
69     OBJECT *rsaKey,            //   IN: internal RSA key
70     TPMT_RSA_DECRYPT *scheme,  //   IN: selects the padding scheme
71     UINT16 cipherInSize,       //   IN: size of cipher text in byte
72     BYTE *cipherIn,            //   IN: cipher text
73     const char *label          //   IN: a label, when needed
74     );
75 TPM_RC CryptDivide(
76     TPM2B *numerator,    //   IN: numerator
77     TPM2B *denominator,  //   IN: denominator
78     TPM2B *quotient,     //   OUT: quotient = numerator / denominator.
79     TPM2B *remainder     //   OUT: numerator mod denominator.
80     );
81 void CryptDrbgGetPutState(GET_PUT direction  // IN: Get from or put to DRBG
82                           );
83 //
84 //
85 //      10.2.6.3    CryptEccGetKeySizeBytes()
86 //
87 //  This macro returns the size of the ECC key in bytes. It uses
88 //  CryptEccGetKeySizeInBits().
89 //
90 #define CryptEccGetKeySizeInBytes(curve) \
91   ((CryptEccGetKeySizeInBits(curve) + 7) / 8)
92 
93 TPM_RC CryptEcc2PhaseKeyExchange(
94     TPMS_ECC_POINT *outZ1,     //   OUT: the computed point
95     TPMS_ECC_POINT *outZ2,     //   OUT: optional second point
96     TPM_ALG_ID scheme,         //   IN: the key exchange scheme
97     TPM_ECC_CURVE curveId,     //   IN: the curve for the computation
98     TPM2B_ECC_PARAMETER *dsA,  //   IN: static private TPM key
99     TPM2B_ECC_PARAMETER *deA,  //   IN: ephemeral private TPM key
100     TPMS_ECC_POINT *QsB,       //   IN: static public party B key
101     TPMS_ECC_POINT *QeB        //   IN: ephemeral public party B key
102     );
103 TPM_RC CryptEncryptRSA(
104     UINT16 *cipherOutSize,     //   OUT: size of cipher text in byte
105     BYTE *cipherOut,           //   OUT: cipher text
106     OBJECT *rsaKey,            //   IN: internal RSA key
107     TPMT_RSA_DECRYPT *scheme,  //   IN: selects the padding scheme
108     UINT16 dataInSize,         //   IN: size of plain text in byte
109     BYTE *dataIn,              //   IN: plain text
110     const char *label          //   IN: an optional label
111     );
112 TPM_ALG_ID CryptGetContextAlg(void *state  // IN: the context to check
113                               );
114 LIB_EXPORT TPM_ALG_ID CryptGetHashAlgByIndex(UINT32 index  // IN: the index
115                                              );
116 LIB_EXPORT UINT16
117 CryptGetHashDigestSize(TPM_ALG_ID hashAlg  // IN: hash algorithm
118                        );
119 LIB_EXPORT const TPM2B *CryptEccGetParameter(
120     char p,                // IN: the parameter selector
121     TPM_ECC_CURVE curveId  // IN: the curve id
122     );
123 BOOL CryptEccGetParameters(
124     TPM_ECC_CURVE curveId,                 // IN: ECC curve ID
125     TPMS_ALGORITHM_DETAIL_ECC *parameters  // OUT: ECC parameter
126     );
127 TPM_RC CryptEccPointMultiply(TPMS_ECC_POINT *pOut,      //   OUT: output point
128                              TPM_ECC_CURVE curveId,     //   IN: curve selector
129                              TPM2B_ECC_PARAMETER *dIn,  //   IN: public scalar
130                              TPMS_ECC_POINT *pIn        //   IN: optional point
131                              );
132 BOOL CryptEccIsPointOnCurve(TPM_ECC_CURVE curveID,  // IN: ECC curve ID
133                             TPMS_ECC_POINT *Q       // IN: ECC point
134                             );
135 void CryptEndCommit(UINT16 c  // IN: the counter value of the commitment
136                     );
137 BOOL CryptGenerateR(
138     TPM2B_ECC_PARAMETER *r,  //   OUT: the generated random value
139     UINT16 *c,               //   IN/OUT: count value.
140     TPMI_ECC_CURVE curveID,  //   IN: the curve for the value
141     TPM2B_NAME *name  //   IN: optional name of a key to associate with 'r'
142     );
143 UINT16 CryptGenerateRandom(UINT16 randomSize,  // IN: size of random number
144                            BYTE *buffer        // OUT: buffer of random number
145                            );
146 void CryptGenerateNewSymmetric(
147     TPMS_SENSITIVE_CREATE *sensitiveCreate,  //   IN: sensitive creation data
148     TPMT_SENSITIVE *sensitive,               //   OUT: sensitive area
149     TPM_ALG_ID hashAlg,                      //   IN: hash algorithm for the KDF
150     TPM2B_SEED *seed,                        //   IN: seed used in creation
151     TPM2B_NAME *name                         //   IN: name of the object
152     );
153 const TPMT_ECC_SCHEME *CryptGetCurveSignScheme(
154     TPM_ECC_CURVE curveId  // IN: The curve selector
155     );
156 LIB_EXPORT UINT16
157 CryptGetHashDigestSize(TPM_ALG_ID hashAlg  // IN: hash algorithm
158                        );
159 TPMI_ALG_HASH CryptGetSignHashAlg(TPMT_SIGNATURE *auth  // IN: signature
160                                   );
161 INT16 CryptGetSymmetricBlockSize(
162     TPMI_ALG_SYM algorithm,  // IN: symmetric algorithm
163     UINT16 keySize           // IN: key size in bit
164     );
165 TPM_RC CryptGetTestResult(TPM2B_MAX_BUFFER *outData  // OUT: test result data
166                           );
167 LIB_EXPORT UINT16
168 CryptHashBlock(TPM_ALG_ID algId,  //   IN: the hash algorithm to use
169                UINT16 blockSize,  //   IN: size of the data block
170                BYTE *block,       //   IN: address of the block to hash
171                UINT16 retSize,    //   IN: size of the return buffer
172                BYTE *ret          //   OUT: address of the buffer
173                );
174 //
175 //
176 //
177 //      10.2.4.23 CryptKDFa()
178 //
179 // This function generates a key using the KDFa() formulation in Part 1 of the
180 // TPM specification. In this implementation, this is a macro invocation of
181 // _cpri__KDFa() in the hash module of the CryptoEngine(). This macro sets
182 // once to FALSE so that KDFa() will iterate as many times as necessary to
183 // generate sizeInBits number of bits.
184 //
185 #define CryptKDFa(hashAlg, key, label, contextU, contextV, sizeInBits,        \
186                   keyStream, counterInOut)                                    \
187   TEST_HASH(hashAlg);                                                         \
188   _cpri__KDFa(((TPM_ALG_ID)hashAlg), ((TPM2B *)key), ((const char *)label),   \
189               ((TPM2B *)contextU), ((TPM2B *)contextV), ((UINT32)sizeInBits), \
190               ((BYTE *)keyStream), ((UINT32 *)counterInOut), ((BOOL)FALSE))
191 
192 //
193 //
194 //      10.2.4.24 CryptKDFaOnce()
195 //
196 // This function generates a key using the KDFa() formulation in Part 1 of the
197 // TPM specification. In this implementation, this is a macro invocation of
198 // _cpri__KDFa() in the hash module of the CryptoEngine(). This macro will
199 // call _cpri__KDFa() with once TRUE so that only one iteration is performed,
200 // regardless of sizeInBits.
201 //
202 #define CryptKDFaOnce(hashAlg, key, label, contextU, contextV, sizeInBits,    \
203                       keyStream, counterInOut)                                \
204   TEST_HASH(hashAlg);                                                         \
205   _cpri__KDFa(((TPM_ALG_ID)hashAlg), ((TPM2B *)key), ((const char *)label),   \
206               ((TPM2B *)contextU), ((TPM2B *)contextV), ((UINT32)sizeInBits), \
207               ((BYTE *)keyStream), ((UINT32 *)counterInOut), ((BOOL)TRUE))
208 
209 //
210 //
211 //    10.2.4.26 CryptKDFe()
212 //
213 //  This function generates a key using the KDFa() formulation in Part 1 of
214 //  the TPM specification. In this implementation, this is a macro invocation
215 //  of _cpri__KDFe() in the hash module of the CryptoEngine().
216 //
217 #define CryptKDFe(hashAlg, Z, label, partyUInfo, partyVInfo, sizeInBits,  \
218                   keyStream)                                              \
219   TEST_HASH(hashAlg);                                                     \
220   _cpri__KDFe(((TPM_ALG_ID)hashAlg), ((TPM2B *)Z), ((const char *)label), \
221               ((TPM2B *)partyUInfo), ((TPM2B *)partyVInfo),               \
222               ((UINT32)sizeInBits), ((BYTE *)keyStream))
223 
224 void CryptHashStateImportExport(
225     HASH_STATE *internalFmt,  // IN: state to LIB_EXPORT
226     HASH_STATE *externalFmt,  // OUT: exported state
227     IMPORT_EXPORT direction);
228 void CryptInitUnits(void);
229 BOOL CryptIsAsymAlgorithm(TPM_ALG_ID algID  // IN: algorithm ID
230                           );
231 BOOL CryptIsDecryptScheme(TPMI_ALG_ASYM_SCHEME scheme);
232 BOOL CryptIsSchemeAnonymous(
233     TPM_ALG_ID scheme  // IN: the scheme algorithm to test
234     );
235 BOOL CryptIsSignScheme(TPMI_ALG_ASYM_SCHEME scheme);
236 BOOL CryptIsSplitSign(TPM_ALG_ID scheme  // IN: the algorithm selector
237                       );
238 TPM_RC CryptNewEccKey(TPM_ECC_CURVE curveID,          // IN: ECC curve
239                       TPMS_ECC_POINT *publicPoint,    // OUT: public point
240                       TPM2B_ECC_PARAMETER *sensitive  // OUT: private area
241                       );
242 BOOL CryptObjectIsPublicConsistent(TPMT_PUBLIC *publicArea  // IN: public area
243                                    );
244 TPM_RC CryptObjectPublicPrivateMatch(OBJECT *object  // IN: the object to check
245                                      );
246 TPM_RC CryptParameterDecryption(
247     TPM_HANDLE handle,   //   IN: encrypted session handle
248     TPM2B *nonceCaller,  //   IN: nonce caller
249     UINT32 bufferSize,   //   IN: size of parameter buffer
250     UINT16
251         leadingSizeInByte,  //   IN: the size of the leading size field in byte
252     TPM2B_AUTH *extraKey,   //   IN: the authValue
253     BYTE *buffer            //   IN/OUT: parameter buffer to be decrypted
254     );
255 void CryptParameterEncryption(
256     TPM_HANDLE handle,         // IN: encrypt session handle
257     TPM2B *nonceCaller,        // IN: nonce caller
258     UINT16 leadingSizeInByte,  // IN: the size of the leading size field in byte
259     TPM2B_AUTH *
260         extraKey,  // IN: additional key material other than session auth
261     BYTE *buffer   // IN/OUT: parameter buffer to be encrypted
262     );
263 TPM_RC CryptSecretDecrypt(
264     TPM_HANDLE tpmKey,         // IN: decrypt key
265     TPM2B_NONCE *nonceCaller,  // IN: nonceCaller. It is needed for symmetric
266                                // decryption. For asymmetric decryption, this
267                                // parameter is NULL
268     const char *label,         // IN: a null-terminated string as L
269     TPM2B_ENCRYPTED_SECRET *secret,  // IN: input secret
270     TPM2B_DATA *data                 // OUT: decrypted secret value
271     );
272 TPM_RC CryptSecretEncrypt(
273     TPMI_DH_OBJECT keyHandle,       //   IN: encryption key handle
274     const char *label,              //   IN: a null-terminated string as L
275     TPM2B_DATA *data,               //   OUT: secret value
276     TPM2B_ENCRYPTED_SECRET *secret  //   OUT: secret structure
277     );
278 TPMT_RSA_DECRYPT *CryptSelectRSAScheme(
279     TPMI_DH_OBJECT rsaHandle,  // IN: handle of sign key
280     TPMT_RSA_DECRYPT *scheme   // IN: a sign or decrypt scheme
281     );
282 TPM_RC CryptSelectSignScheme(
283     TPMI_DH_OBJECT signHandle,  // IN: handle of signing key
284     TPMT_SIG_SCHEME *scheme     // IN/OUT: signing scheme
285     );
286 TPM_RC CryptSign(TPMI_DH_OBJECT signHandle,    //   IN: The handle of sign key
287                  TPMT_SIG_SCHEME *signScheme,  //   IN: sign scheme.
288                  TPM2B_DIGEST *digest,         //   IN: The digest being signed
289                  TPMT_SIGNATURE *signature     //   OUT: signature
290                  );
291 LIB_EXPORT UINT16
292 CryptStartHMAC2B(TPMI_ALG_HASH hashAlg,  // IN: hash algorithm
293                  TPM2B *key,             // IN: HMAC key
294                  HMAC_STATE *hmacState  // OUT: the state of HMAC stack. It will
295                                         // be used in HMAC update and completion
296                  );
297 UINT16 CryptStartHMACSequence2B(TPMI_ALG_HASH hashAlg,  // IN: hash algorithm
298                                 TPM2B *key,             // IN: HMAC key
299                                 HMAC_STATE *hmacState  // OUT: the state of HMAC
300                                                        // stack. It will be used
301                                                        // in HMAC update and
302                                                        // completion
303                                 );
304 UINT16 CryptStartHashSequence(TPMI_ALG_HASH hashAlg,  // IN: hash algorithm
305                               HASH_STATE *hashState   // OUT: the state of hash
306                                                       // stack. It will be used
307                                                       // in hash update and
308                                                       // completion
309                               );
310 void CryptStirRandom(UINT32 entropySize,  // IN: size of entropy buffer
311                      BYTE *buffer         // IN: entropy buffer
312                      );
313 void CryptStopUnits(void);
314 void CryptSymmetricDecrypt(
315     BYTE *decrypted,
316     TPM_ALG_ID algorithm,    //   IN: algorithm for encryption
317     UINT16 keySizeInBits,    //   IN: key size in bit
318     TPMI_ALG_SYM_MODE mode,  //   IN: symmetric encryption mode
319     BYTE *key,               //   IN: encryption key
320     TPM2B_IV *ivIn,          //   IN/OUT: IV for next block
321     UINT32 dataSize,         //   IN: data size in byte
322     BYTE *data               //   IN/OUT: data buffer
323     );
324 void CryptSymmetricEncrypt(
325     BYTE *encrypted,         //   OUT: the encrypted data
326     TPM_ALG_ID algorithm,    //   IN: algorithm for encryption
327     UINT16 keySizeInBits,    //   IN: key size in bit
328     TPMI_ALG_SYM_MODE mode,  //   IN: symmetric encryption mode
329     BYTE *key,               //   IN: encryption key
330     TPM2B_IV *ivIn,   //   IN/OUT: Input IV and output chaining value for the
331                       //   next block
332     UINT32 dataSize,  //   IN: data size in byte
333     BYTE *data        //   IN/OUT: data buffer
334     );
335 UINT16 CryptStartHash(TPMI_ALG_HASH hashAlg,  // IN: hash algorithm
336                       HASH_STATE *hashState  // OUT: the state of hash stack. It
337                                              // will be used in hash update and
338                                              // completion
339                       );
340 void CryptUpdateDigest(void *digestState,  // IN: the state of hash stack
341                        UINT32 dataSize,    // IN: the size of data
342                        BYTE *data          // IN: data to be hashed
343                        );
344 LIB_EXPORT void CryptUpdateDigest2B(void *digestState,  // IN: the digest state
345                                     TPM2B *bIn  // IN: 2B containing the data
346                                     );
347 void CryptUpdateDigestInt(void *state,     // IN: the state of hash stack
348                           UINT32 intSize,  // IN: the size of 'intValue' in byte
349                           void *intValue   // IN: integer value to be hashed
350                           );
351 BOOL CryptUtilStartup(STARTUP_TYPE type  // IN: the startup type
352                       );
353 TPM_RC CryptVerifySignature(
354     TPMI_DH_OBJECT keyHandle,  // IN: The handle of sign key
355     TPM2B_DIGEST *digest,      // IN: The digest being validated
356     TPMT_SIGNATURE *signature  // IN: signature
357     );
358 void KDFa(TPM_ALG_ID hash,      //   IN: hash algorithm used in HMAC
359           TPM2B *key,           //   IN: HMAC key
360           const char *label,    //   IN: a null-terminated label for KDF
361           TPM2B *contextU,      //   IN: context U
362           TPM2B *contextV,      //   IN: context V
363           UINT32 sizeInBits,    //   IN: size of generated key in bit
364           BYTE *keyStream,      //   OUT: key buffer
365           UINT32 *counterInOut  //   IN/OUT: caller may provide the iteration
366                                 //   counter for incremental operations to avoid
367                                 //   large intermediate buffers.
368           );
369 
370 #endif  // __SOURCE_CRYPTUTIL_FP_H
371