/*
 * Copyright 2015 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef __TPM2_CPRIECC_FP_H
#define __TPM2_CPRIECC_FP_H

LIB_EXPORT CRYPT_RESULT _cpri__C_2_2_KeyExchange(
    TPMS_ECC_POINT *outZ1,     //   OUT: a computed point
    TPMS_ECC_POINT *outZ2,     //   OUT: and optional second point
    TPM_ECC_CURVE curveId,     //   IN: the curve for the computations
    TPM_ALG_ID scheme,         //   IN: the key exchange scheme
    TPM2B_ECC_PARAMETER *dsA,  //   IN: static private TPM key
    TPM2B_ECC_PARAMETER *deA,  //   IN: ephemeral private TPM key
    TPMS_ECC_POINT *QsB,       //   IN: static public party B key
    TPMS_ECC_POINT *QeB        //   IN: ephemeral public party B key
    );
LIB_EXPORT CRYPT_RESULT _cpri__C_2_2_KeyExchange(
    TPMS_ECC_POINT *outZ1,     //   OUT: a computed point
    TPMS_ECC_POINT *outZ2,     //   OUT: and optional second point
    TPM_ECC_CURVE curveId,     //   IN: the curve for the computations
    TPM_ALG_ID scheme,         //   IN: the key exchange scheme
    TPM2B_ECC_PARAMETER *dsA,  //   IN: static private TPM key
    TPM2B_ECC_PARAMETER *deA,  //   IN: ephemeral private TPM key
    TPMS_ECC_POINT *QsB,       //   IN: static public party B key
    TPMS_ECC_POINT *QeB        //   IN: ephemeral public party B key
    );
LIB_EXPORT CRYPT_RESULT _cpri__EccCommitCompute(
    TPMS_ECC_POINT *K,       //   OUT: [d]B or [r]Q
    TPMS_ECC_POINT *L,       //   OUT: [r]B
    TPMS_ECC_POINT *E,       //   OUT: [r]M
    TPM_ECC_CURVE curveId,   //   IN: the curve for the computations
    TPMS_ECC_POINT *M,       //   IN: M (optional)
    TPMS_ECC_POINT *B,       //   IN: B (optional)
    TPM2B_ECC_PARAMETER *d,  //   IN: d (required)
    TPM2B_ECC_PARAMETER *r   //   IN: the computed r value (required)
    );
LIB_EXPORT UINT32 _cpri__EccGetCurveCount(void);
LIB_EXPORT const ECC_CURVE *_cpri__EccGetParametersByCurveId(
    TPM_ECC_CURVE curveId  // IN: the curveID
    );
LIB_EXPORT CRYPT_RESULT _cpri__EccPointMultiply(
    TPMS_ECC_POINT *Rout,   //   OUT: the product point R
    TPM_ECC_CURVE curveId,  //   IN: the curve to use
    TPM2B_ECC_PARAMETER *
        dIn,              //   IN: value to multiply against the curve generator
    TPMS_ECC_POINT *Qin,  //   IN: point Q
    TPM2B_ECC_PARAMETER *uIn  //   IN: scalar value for the multiplier of Q
    );
LIB_EXPORT BOOL
_cpri__EccIsPointOnCurve(TPM_ECC_CURVE curveId,  // IN: the curve selector
                         TPMS_ECC_POINT *Q       // IN: the point.
                         );
LIB_EXPORT CRYPT_RESULT _cpri__GenerateKeyEcc(
    TPMS_ECC_POINT *Qout,       //   OUT: the public point
    TPM2B_ECC_PARAMETER *dOut,  //   OUT: the private scalar
    TPM_ECC_CURVE curveId,      //   IN: the curve identifier
    TPM_ALG_ID
        hashAlg,  //   IN: hash algorithm to use in the key generation process
    TPM2B *seed,  //   IN: the seed to use
    const char *label,  //   IN: A label for the generation process.
    TPM2B *extra,       //   IN: Party 1 data for the KDF
    UINT32 *counter     //   IN/OUT: Counter value to allow KDF iteration to be
                        //   propagated across multiple functions
    );
LIB_EXPORT TPM_ECC_CURVE _cpri__GetCurveIdByIndex(UINT16 i);
LIB_EXPORT CRYPT_RESULT
_cpri__GetEphemeralEcc(TPMS_ECC_POINT *Qout,       // OUT: the public point
                       TPM2B_ECC_PARAMETER *dOut,  // OUT: the private scalar
                       TPM_ECC_CURVE curveId       // IN: the curve for the key
                       );
LIB_EXPORT CRYPT_RESULT _cpri__SignEcc(
    TPM2B_ECC_PARAMETER *rOut,  //   OUT: r component of the signature
    TPM2B_ECC_PARAMETER *sOut,  //   OUT: s component of the signature
    TPM_ALG_ID scheme,          //   IN: the scheme selector
    TPM_ALG_ID hashAlg,         //   IN: the hash algorithm if need
    TPM_ECC_CURVE curveId,      //   IN: the curve used in the signature process
    TPM2B_ECC_PARAMETER *dIn,   //   IN: the private key
    TPM2B *digest,              //   IN: the digest to sign
    TPM2B_ECC_PARAMETER *kIn    //   IN: k for input
    );
LIB_EXPORT BOOL _cpri__EccStartup(void);
LIB_EXPORT CRYPT_RESULT _cpri__ValidateSignatureEcc(
    TPM2B_ECC_PARAMETER *rIn,  //   IN: r component of the signature
    TPM2B_ECC_PARAMETER *sIn,  //   IN: s component of the signature
    TPM_ALG_ID scheme,         //   IN: the scheme selector
    TPM_ALG_ID
        hashAlg,  //   IN: the hash algorithm used (not used in all schemes)
    TPM_ECC_CURVE curveId,  //   IN: the curve used in the signature process
    TPMS_ECC_POINT *Qin,    //   IN: the public point of the key
    TPM2B *digest           //   IN: the digest that was signed
    );

#endif  // __TPM2_CPRIECC_FP_H