43.3.7.8 Point is on Elliptic Curve

Purpose

This service is used to test whether the point is on the curve.

How to Use the Service

Description

The operation performed is:

Status = IsPointOnCurve(X, Y, Z);

In this computation, the following parameters need to be provided:

  • The input points filled in projective coordinates (X, Y, Z) (pointed by {nu1PointBase, 3*U2ModLength + 4}). This point can be point at infinity.
  • AParam and BParam are the Elliptic Curve Equation parameters (pointed by {nu1AParam, u2ModLength+ 4} and {nu1BParam, u2ModLength + 4}).
  • Cns the Fast Modular Constant filled (pointed by {nu1CnsBase, u2ModLength + 8})
  • P the modulus filled (pointed by {nu1ModBase, u2ModLength + 8})
  • The workspace not initialized (pointed by {nu1WorkSpace, 4*u2ModLength + 28})

The service name for this operation is GF2NEcPointIsOnCurve.

Important: Before using this service, the constant Cns must have been calculated with the Fast Modular Reduction service.

Parameters Definition

Table 43-106. GF2NEcPointIsOnCurve Service Parameters
ParameterTypeDir.LocationData LengthBefore Executing the ServiceAfter Executing the Service
nu1ModBasenu1ICrypto RAMu2ModLength + 4Base of modulus PBase of modulus P
nu1CnsBasenu1ICrypto RAMu2ModLength + 8Base of CnsBase of Cns
u2ModLengthu2ILength of modulus PLength of modulus P
nu1PointBasenu1ICrypto RAM3*u2ModLength + 12Input pointUnchanged
nu1AParamnu1ICrypto RAMu2ModLength + 4The parameter aUnchanged
nu1BParamnu1ICrypto RAMu2ModLength + 4The parameter bUnchanged
nu1Workspacenu1ICrypto RAM4*u2ModLength + 28N/AWorkspace

Code Example

PUKCL_PARAM PUKCLParam;
PPUKCL_PARAM pvPUKCLParam = &PUKCLParam;

// ! The Random Number Generator must be initialized and started
// ! following the directives given for the RNG on the chip

PUKCL (u2Option) = 0;

// Depending on the option specified, not all fields should be filled
PUKCL _GF2NEcPointIsOnCurve(nu1ModBase) = <Base of the ram location of P>;
PUKCL _GF2NEcPointIsOnCurve(u2ModLength) = <Byte length of P>;
PUKCL _GF2NEcPointIsOnCurve(nu1CnsBase) = <Base of the ram location of Cns>;
PUKCL _GF2NEcPointIsOnCurve(nu1PointABase) = <Base of the A point>;
PUKCL _GF2NEcPointIsOnCurve(nu1AParam) = <Base of the ram location of the parameter a>;
PUKCL _GF2NEcPointIsOnCurve(nu1BParam) = <Base of the ram location of the parameter b>;
PUKCL _GF2NEcPointIsOnCurve(nu1PointBase) = <Base of the ram location of the point>;
PUKCL _GF2NEcPointIsOnCurve(nu1Workspace) = <Base of the ram location of the workspace>;
...

// vPUKCL_Process() is a macro command, which populates the service name
// and then calls the library...
vPUKC L_Process(GF2NEcPointIsOnCurve,
pvPUKCLParam);
if (PUKCL (u2Status) == PUKCL_OK)
            {
            ...
            }
else // Manage the error

Constraints

No overlapping between either input and output are allowed. The following conditions must be avoided to ensure that the service works correctly:

  • nu1ModBase, nu1CnsBase, nu1PointABase, nu1AParam, nu1BParam and nu1Workspace are not aligned on 32-bit boundaries
  • {nu1ModBase, u2ModLength + 4}, {nu1CnsBase, u2ModLength + 8}, {nu1PointABase, 3*u2ModLength + 12}, {nu1AParam, u2ModLength + 4}, {nu1BParam, u2ModLength + 4}, {nu1Workspace, 4*u2ModLength + 28} are not in Crypto RAM
  • u2ModLength is either: < 12, > 0xffc or not a 32-bit length
  • All overlapping between {nu1ModBase, u2ModLength + 4}, {nu1CnsBase, u2ModLength + 8}, {nu1PointABase, 3*u2ModLength + 12}, {nu1AParam, u2ModLength + 4}, {nu1BParam, u2ModLength + 4} and {nu1Workspace, 4*u2ModLength + 28}

Status Returned Values

Table 43-107. GF2NEcPointIsOnCurve Service Return Codes
Returned StatusImportanceMeaning
PUKCL_OKThe point is on the curve.
PUKCL_POINT_IS_NOT_ON_CURVEWarningThe point is not on the curve.
PUKCL_POINT_AT_INFINITYWarningThe input point has its Z equal to zero, so it’s a representation of the infinite point.