Back to index

lightning-sunbird  0.9+nobinonly
Functions
ecp_aff.c File Reference
#include "ecp.h"
#include "mplogic.h"
#include <stdlib.h>

Go to the source code of this file.

Functions

mp_err ec_GFp_pt_is_inf_aff (const mp_int *px, const mp_int *py)
mp_err ec_GFp_pt_set_inf_aff (mp_int *px, mp_int *py)
mp_err ec_GFp_pt_add_aff (const mp_int *px, const mp_int *py, const mp_int *qx, const mp_int *qy, mp_int *rx, mp_int *ry, const ECGroup *group)
mp_err ec_GFp_pt_sub_aff (const mp_int *px, const mp_int *py, const mp_int *qx, const mp_int *qy, mp_int *rx, mp_int *ry, const ECGroup *group)
mp_err ec_GFp_pt_dbl_aff (const mp_int *px, const mp_int *py, mp_int *rx, mp_int *ry, const ECGroup *group)
mp_err ec_GFp_validate_point (const mp_int *px, const mp_int *py, const ECGroup *group)

Function Documentation

mp_err ec_GFp_pt_add_aff ( const mp_int px,
const mp_int py,
const mp_int qx,
const mp_int qy,
mp_int rx,
mp_int ry,
const ECGroup *  group 
)

Definition at line 75 of file ecp_aff.c.

{
       mp_err res = MP_OKAY;
       mp_int lambda, temp, tempx, tempy;

       MP_DIGITS(&lambda) = 0;
       MP_DIGITS(&temp) = 0;
       MP_DIGITS(&tempx) = 0;
       MP_DIGITS(&tempy) = 0;
       MP_CHECKOK(mp_init(&lambda));
       MP_CHECKOK(mp_init(&temp));
       MP_CHECKOK(mp_init(&tempx));
       MP_CHECKOK(mp_init(&tempy));
       /* if P = inf, then R = Q */
       if (ec_GFp_pt_is_inf_aff(px, py) == 0) {
              MP_CHECKOK(mp_copy(qx, rx));
              MP_CHECKOK(mp_copy(qy, ry));
              res = MP_OKAY;
              goto CLEANUP;
       }
       /* if Q = inf, then R = P */
       if (ec_GFp_pt_is_inf_aff(qx, qy) == 0) {
              MP_CHECKOK(mp_copy(px, rx));
              MP_CHECKOK(mp_copy(py, ry));
              res = MP_OKAY;
              goto CLEANUP;
       }
       /* if px != qx, then lambda = (py-qy) / (px-qx) */
       if (mp_cmp(px, qx) != 0) {
              MP_CHECKOK(group->meth->field_sub(py, qy, &tempy, group->meth));
              MP_CHECKOK(group->meth->field_sub(px, qx, &tempx, group->meth));
              MP_CHECKOK(group->meth->
                               field_div(&tempy, &tempx, &lambda, group->meth));
       } else {
              /* if py != qy or qy = 0, then R = inf */
              if (((mp_cmp(py, qy) != 0)) || (mp_cmp_z(qy) == 0)) {
                     mp_zero(rx);
                     mp_zero(ry);
                     res = MP_OKAY;
                     goto CLEANUP;
              }
              /* lambda = (3qx^2+a) / (2qy) */
              MP_CHECKOK(group->meth->field_sqr(qx, &tempx, group->meth));
              MP_CHECKOK(mp_set_int(&temp, 3));
              if (group->meth->field_enc) {
                     MP_CHECKOK(group->meth->field_enc(&temp, &temp, group->meth));
              }
              MP_CHECKOK(group->meth->
                               field_mul(&tempx, &temp, &tempx, group->meth));
              MP_CHECKOK(group->meth->
                               field_add(&tempx, &group->curvea, &tempx, group->meth));
              MP_CHECKOK(mp_set_int(&temp, 2));
              if (group->meth->field_enc) {
                     MP_CHECKOK(group->meth->field_enc(&temp, &temp, group->meth));
              }
              MP_CHECKOK(group->meth->field_mul(qy, &temp, &tempy, group->meth));
              MP_CHECKOK(group->meth->
                               field_div(&tempx, &tempy, &lambda, group->meth));
       }
       /* rx = lambda^2 - px - qx */
       MP_CHECKOK(group->meth->field_sqr(&lambda, &tempx, group->meth));
       MP_CHECKOK(group->meth->field_sub(&tempx, px, &tempx, group->meth));
       MP_CHECKOK(group->meth->field_sub(&tempx, qx, &tempx, group->meth));
       /* ry = (x1-x2) * lambda - y1 */
       MP_CHECKOK(group->meth->field_sub(qx, &tempx, &tempy, group->meth));
       MP_CHECKOK(group->meth->
                        field_mul(&tempy, &lambda, &tempy, group->meth));
       MP_CHECKOK(group->meth->field_sub(&tempy, qy, &tempy, group->meth));
       MP_CHECKOK(mp_copy(&tempx, rx));
       MP_CHECKOK(mp_copy(&tempy, ry));

  CLEANUP:
       mp_clear(&lambda);
       mp_clear(&temp);
       mp_clear(&tempx);
       mp_clear(&tempy);
       return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

mp_err ec_GFp_pt_dbl_aff ( const mp_int px,
const mp_int py,
mp_int rx,
mp_int ry,
const ECGroup *  group 
)

Definition at line 182 of file ecp_aff.c.

{
       return ec_GFp_pt_add_aff(px, py, px, py, rx, ry, group);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 50 of file ecp_aff.c.

{

       if ((mp_cmp_z(px) == 0) && (mp_cmp_z(py) == 0)) {
              return MP_YES;
       } else {
              return MP_NO;
       }

}

Here is the call graph for this function:

Here is the caller graph for this function:

mp_err ec_GFp_pt_set_inf_aff ( mp_int px,
mp_int py 
)

Definition at line 63 of file ecp_aff.c.

{
       mp_zero(px);
       mp_zero(py);
       return MP_OKAY;
}

Here is the call graph for this function:

Here is the caller graph for this function:

mp_err ec_GFp_pt_sub_aff ( const mp_int px,
const mp_int py,
const mp_int qx,
const mp_int qy,
mp_int rx,
mp_int ry,
const ECGroup *  group 
)

Definition at line 161 of file ecp_aff.c.

{
       mp_err res = MP_OKAY;
       mp_int nqy;

       MP_DIGITS(&nqy) = 0;
       MP_CHECKOK(mp_init(&nqy));
       /* nqy = -qy */
       MP_CHECKOK(group->meth->field_neg(qy, &nqy, group->meth));
       res = group->point_add(px, py, qx, &nqy, rx, ry, group);
  CLEANUP:
       mp_clear(&nqy);
       return res;
}

Here is the call graph for this function:

Here is the caller graph for this function:

mp_err ec_GFp_validate_point ( const mp_int px,
const mp_int py,
const ECGroup *  group 
)

Definition at line 288 of file ecp_aff.c.

{
       mp_err res = MP_NO;
       mp_int accl, accr, tmp, pxt, pyt;

       MP_DIGITS(&accl) = 0;
       MP_DIGITS(&accr) = 0;
       MP_DIGITS(&tmp) = 0;
       MP_DIGITS(&pxt) = 0;
       MP_DIGITS(&pyt) = 0;
       MP_CHECKOK(mp_init(&accl));
       MP_CHECKOK(mp_init(&accr));
       MP_CHECKOK(mp_init(&tmp));
       MP_CHECKOK(mp_init(&pxt));
       MP_CHECKOK(mp_init(&pyt));

    /* 1: Verify that publicValue is not the point at infinity */
       if (ec_GFp_pt_is_inf_aff(px, py) == MP_YES) {
              res = MP_NO;
              goto CLEANUP;
       }
    /* 2: Verify that the coordinates of publicValue are elements 
     *    of the field.
     */
       if ((MP_SIGN(px) == MP_NEG) || (mp_cmp(px, &group->meth->irr) >= 0) || 
              (MP_SIGN(py) == MP_NEG) || (mp_cmp(py, &group->meth->irr) >= 0)) {
              res = MP_NO;
              goto CLEANUP;
       }
    /* 3: Verify that publicValue is on the curve. */
       if (group->meth->field_enc) {
              group->meth->field_enc(px, &pxt, group->meth);
              group->meth->field_enc(py, &pyt, group->meth);
       } else {
              mp_copy(px, &pxt);
              mp_copy(py, &pyt);
       }
       /* left-hand side: y^2  */
       MP_CHECKOK( group->meth->field_sqr(&pyt, &accl, group->meth) );
       /* right-hand side: x^3 + a*x + b */
       MP_CHECKOK( group->meth->field_sqr(&pxt, &tmp, group->meth) );
       MP_CHECKOK( group->meth->field_mul(&pxt, &tmp, &accr, group->meth) );
       MP_CHECKOK( group->meth->field_mul(&group->curvea, &pxt, &tmp, group->meth) );
       MP_CHECKOK( group->meth->field_add(&tmp, &accr, &accr, group->meth) );
       MP_CHECKOK( group->meth->field_add(&accr, &group->curveb, &accr, group->meth) );
       /* check LHS - RHS == 0 */
       MP_CHECKOK( group->meth->field_sub(&accl, &accr, &accr, group->meth) );
       if (mp_cmp_z(&accr) != 0) {
              res = MP_NO;
              goto CLEANUP;
       }
    /* 4: Verify that the order of the curve times the publicValue
     *    is the point at infinity.
     */
       MP_CHECKOK( ECPoint_mul(group, &group->order, px, py, &pxt, &pyt) );
       if (ec_GFp_pt_is_inf_aff(&pxt, &pyt) != MP_YES) {
              res = MP_NO;
              goto CLEANUP;
       }

       res = MP_YES;

CLEANUP:
       mp_clear(&accl);
       mp_clear(&accr);
       mp_clear(&tmp);
       mp_clear(&pxt);
       mp_clear(&pyt);
       return res;
}

Here is the call graph for this function:

Here is the caller graph for this function: