You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I am trying to use this library to assert the following: X + X = X * 2
where X is a point on the elliptic curve and adding it to itself should equal the result of scalar multiplication of the point with '2'. For the addition I've written the following method:
/* uECC_addition() function
Perform point addition for two valid points on the curve.
This function is only optimized for uECC_VLI_NATIVE_LITTLE_ENDIAN.
Usage: Compute the sum of two points on the curve. R = P + Q
Inputs:
result - The address where resulting point should be written to
P - The point P
Q - The point Q
Returns 1 if the sum point is valid, 0 if it is invalid.
*/
int uECC_addition(uint8_t * result, uint8_t * P, uint8_t * Q, uECC_Curve curve)
{
const wordcount_t num_bytes = curve->num_bytes;
const wordcount_t num_words = curve->num_words;
// Allocate proper memory for the two points and output result in native type
uECC_word_t _p[uECC_MAX_WORDS * 2];
uECC_word_t _q[uECC_MAX_WORDS * 2];
uECC_word_t _result[uECC_MAX_WORDS * 2];
uECC_word_t X1[uECC_MAX_WORDS], Y1[uECC_MAX_WORDS], X2[uECC_MAX_WORDS], Y2[uECC_MAX_WORDS];
uECC_word_t z[uECC_MAX_WORDS];
// Convert points from uint8_t format to native format to check if valid points
uECC_vli_bytesToNative(_p, P, num_bytes);
uECC_vli_bytesToNative(_p + num_words, P + num_bytes, num_bytes);
uECC_vli_bytesToNative(_q, Q, num_bytes);
uECC_vli_bytesToNative(_q + num_words, Q + num_bytes, num_bytes);
// Make sure receiving points are valid
if (!uECC_valid_point(_p, curve) || !uECC_valid_point(_q, curve)) {
return 5;
}
// convert points to projective coordinates
uECC_vli_bytesToNative(X1, P, num_bytes);
uECC_vli_bytesToNative(Y1, P + num_bytes, num_bytes);
uECC_vli_bytesToNative(X2, Q, num_bytes);
uECC_vli_bytesToNative(Y2, Q + num_bytes, num_bytes);
uECC_vli_modSub(z, X2, X1, curve->p, num_words);
XYcZ_add(X1, Y1, X2, Y2, curve);
uECC_vli_modInv(z, z, curve->p, num_words);
// Apply Z coordinate to the result
apply_z(X2, Y2, z, curve);
uECC_vli_set(_result, X2, num_words);
uECC_vli_set(_result + num_words, Y2, num_words);
// Check if the resulting point is on the curve
if (!uECC_valid_point(_result, curve)) {
return 0;
}
// Convert resulting point to uint8_t format
uECC_vli_nativeToBytes(result, num_bytes, _q);
uECC_vli_nativeToBytes(result + num_bytes, num_bytes, _q + num_words);
return 1;
}
However, this does not return a valid point when input of P and Q is the same. Can you tell me if there is a bug in the code or if there seems to be something else going wrong? I'd appreciate the help!
The text was updated successfully, but these errors were encountered:
I am trying to use this library to assert the following:
X + X = X * 2
where X is a point on the elliptic curve and adding it to itself should equal the result of scalar multiplication of the point with '2'. For the addition I've written the following method:
However, this does not return a valid point when input of P and Q is the same. Can you tell me if there is a bug in the code or if there seems to be something else going wrong? I'd appreciate the help!
The text was updated successfully, but these errors were encountered: