Cryptography Reference
In-Depth Information
Listing 4-36: “ecc.c” point addition implementation
void add_points( point *p1, point *p2, huge *p )
{
point p3;
huge denominator;
huge numerator;
huge invdenom;
huge lambda;
set_huge( &denominator, 0 );
copy_huge( &denominator, &p2->x ); // denominator = x2
subtract( &denominator, &p1->x ); // denominator = x2 - x1
set_huge( &numerator, 0 );
copy_huge( &numerator, &p2->y ); // numerator = y2
subtract( &numerator, &p1->y ); // numerator = y2 - y1
set_huge( &invdenom, 0 );
copy_huge( &invdenom, &denominator );
inv( &invdenom, p );
set_huge( &lambda, 0 );
copy_huge( &lambda, &numerator );
multiply( &lambda, &invdenom ); // lambda = numerator / denominator
set_huge( &p3.x, 0 );
copy_huge( &p3.x, &lambda ); // x3 = lambda
multiply( &p3.x, &lambda ); // x3 = lambda * lambda
subtract( &p3.x, &p1->x ); // x3 = ( lambda * lambda ) - x1
subtract( &p3.x, &p2->x ); // x3 = ( lambda * lambda ) - x1 - x2
divide( &p3.x, p, NULL ); // x3 = ( ( lamdba * lambda ) - x1 - x2 ) % p
// positive remainder always
if ( p3.x.sign )
{
p3.x.sign = 0;
subtract( &p3.x, p );
p3.x.sign = 0;
}
set_huge( &p3.y, 0 );
copy_huge( &p3.y, &p1->x ); // y3 = x1
subtract( &p3.y, &p3.x ); // y3 = x1 - x3
multiply( &p3.y, &lambda ); // y3 = ( x1 - x3 ) * lambda
subtract( &p3.y, &p1->y ); // y3 = ( ( x1 - x3 ) * lambda ) - y
divide( &p3.y, p, NULL );
// positive remainder always
if ( p3.y.sign )
{
p3.y.sign = 0;
subtract( &p3.y, p );
p3.y.sign = 0;
}
Search WWH ::




Custom Search