double_point function

void double_point(
  1. Point p1,
  2. BigInt a,
  3. BigInt p
)

Implementation

void double_point(Point p1, BigInt a, BigInt p) {
  BigInt lambda;
  BigInt l1;
  BigInt x1;
  // ignore: unused_local_variable
  BigInt y1;

  // set_huge( &lambda, 0 );
  lambda = BigInt.from(0);
  // set_huge( &x1, 0 );
  x1 = BigInt.from(0);
  // set_huge( &y1, 0 );
  y1 = p1.y;
  // set_huge( &lambda, 2 );     // lambda = 2;
  lambda = BigInt.from(2);
  // multiply( &lambda, &p1->y );  // lambda = 2 * y1
  lambda = lambda * p1.y;
  // inv( &lambda, p );       // lambda = ( 2 * y1 ) ^ -1 (% p)
  lambda = lambda.modInverse(p);

  // set_huge( &l1, 3 );       // l1 = 3
  l1 = BigInt.from(3);
  // multiply( &l1, &p1->x );    // l1 = 3 * x
  l1 = l1 * p1.x;
  // multiply( &l1, &p1->x );    // l1 = 3 * x ^ 2
  l1 = l1 * p1.x;
  // add( &l1, a );         // l1 = ( 3 * x ^ 2 ) + a
  l1 = l1 + a;
  // multiply( &lambda, &l1 );    // lambda = [ ( 3 * x ^ 2 ) + a ] / [ 2 * y1 ] ) % p
  lambda = lambda * l1;
  // copy_huge( &y1, &p1->y );
  y1 = p1.y;
  // // Note - make two copies of x2; this one is for y1 below
  // copy_huge( &p1->y, &p1->x );
  p1.y = p1.x;
  // set_huge( &x1, 2 );
  x1 = BigInt.from(2);
  // multiply( &x1, &p1->x );    // x1 = 2 * x1
  x1 = x1 * p1.x;

  // copy_huge( &p1->x, &lambda );  // x1 = lambda
  p1.x = lambda;
  // multiply( &p1->x, &lambda );  // x1 = ( lambda ^ 2 );
  p1.x = p1.x * lambda;
  // subtract( &p1->x, &x1 );    // x1 = ( lambda ^ 2 ) - ( 2 * x1 )
  p1.x = p1.x - x1;
  // divide( &p1->x, p, NULL );   // [ x1 = ( lambda ^ 2 ) - ( 2 * x1 ) ] % p
  p1.x = p1.x ~/ p;

  // if ( p1->x.sign )
  // {
  //   subtract( &p1->x, p );
  //   p1->x.sign = 0;
  //   subtract( &p1->x, p );
  // }
  // subtract( &p1->y, &p1->x );  // y3 = x3 � x1
  // multiply( &p1->y, &lambda ); // y3 = lambda * ( x3 - x1 );
  // subtract( &p1->y, &y1 );   // y3 = ( lambda * ( x3 - x1 ) ) - y1
  // divide( &p1->y, p, NULL );  // y3 = [ ( lambda * ( x3 - x1 ) ) - y1 ] % p
  // if ( p1->y.sign )
  // {
  //   p1->y.sign = 0;
  //   subtract( &p1->y, p );
  //   p1->y.sign = 0;
  // }

  // free_huge( &lambda );
  // free_huge( &x1 );
  // free_huge( &y1 );
  // free_huge( &l1 );
}