// This file was extracted from the TCG Published
// Trusted Platform Module Library
// Part 3: Commands
// Family "2.0"
// Level 00 Revision 01.16
// October 30, 2014

#include "InternalRoutines.h"
#include "ECDH_ZGen_fp.h"
#ifdef TPM_ALG_ECC
//
//
//     Error Returns                     Meaning
//
//     TPM_RC_ATTRIBUTES                 key referenced by keyA is restricted or not a decrypt key
//     TPM_RC_KEY                        key referenced by keyA is not an ECC key
//     TPM_RC_NO_RESULT                  multiplying inPoint resulted in a point at infinity
//     TPM_RC_SCHEME                     the scheme of the key referenced by keyA is not TPM_ALG_NULL,
//                                       TPM_ALG_ECDH,
//
TPM_RC
TPM2_ECDH_ZGen(
   ECDH_ZGen_In      *in,                  // IN: input parameter list
   ECDH_ZGen_Out     *out                  // OUT: output parameter list
   )
{
   TPM_RC                     result;
   OBJECT                    *eccKey;

// Input Validation

   eccKey = ObjectGet(in->keyHandle);

   // Input key must be a non-restricted, decrypt ECC key
   if(   eccKey->publicArea.type != TPM_ALG_ECC)
       return TPM_RC_KEY + RC_ECDH_ZGen_keyHandle;

   if(     eccKey->publicArea.objectAttributes.restricted == SET
      ||   eccKey->publicArea.objectAttributes.decrypt != SET
     )
       return TPM_RC_ATTRIBUTES + RC_ECDH_ZGen_keyHandle;

   // Make sure the scheme allows this use
   if(     eccKey->publicArea.parameters.eccDetail.scheme.scheme != TPM_ALG_ECDH
       && eccKey->publicArea.parameters.eccDetail.scheme.scheme != TPM_ALG_NULL)
       return TPM_RC_SCHEME + RC_ECDH_ZGen_keyHandle;

// Command Output

   // Compute Z. TPM_RC_ECC_POINT or TPM_RC_NO_RESULT may be returned here.
   result = CryptEccPointMultiply(&out->outPoint.t.point,
                                  eccKey->publicArea.parameters.eccDetail.curveID,
                                  &eccKey->sensitive.sensitive.ecc,
                                  &in->inPoint.t.point);
   if(result != TPM_RC_SUCCESS)
       return RcSafeAddToResult(result, RC_ECDH_ZGen_inPoint);

   out->outPoint.t.size = TPMS_ECC_POINT_Marshal(&out->outPoint.t.point,
                                                 NULL, NULL);

   return TPM_RC_SUCCESS;
}
#endif
