toBytes method
Overrides the 'toBytes' method to convert the RistrettoPoint to a byte array.
This method converts the RistrettoPoint to a byte array by computing its coordinates and encoding them according to the default Ristretto encoding rules. The resulting byte array represents the RistrettoPoint in a format suitable for serialization and other data storage or transmission purposes.
Returns:
List<int>
: A byte array representing the RistrettoPoint.
Details:
- The method calculates intermediate values and applies encoding-specific transformations to the point's coordinates in accordance with Ristretto encoding rules. The result is a compact byte array representation.
Implementation
@override
List<int> toBytes([EncodeType encodeType = EncodeType.comprossed]) {
final primeP = Curves.curveEd25519.p;
final pointCoords = getCoords();
BigInt x = pointCoords[0];
BigInt y = pointCoords[1];
final BigInt z = pointCoords[2];
final BigInt t = pointCoords[3];
final u1 = RistrettoUtils.positiveMod(
RistrettoUtils.positiveMod(z + y, primeP) *
RistrettoUtils.positiveMod(z - y, primeP),
primeP);
final u2 = RistrettoUtils.positiveMod(x * y, primeP);
final u2Squared = RistrettoUtils.positiveMod(u2 * u2, primeP);
final invSqrt = RistrettoUtils.sqrtUV(
BigInt.one, RistrettoUtils.positiveMod(u1 * u2Squared, primeP))
.item2;
final d1 = RistrettoUtils.positiveMod(invSqrt * u1, primeP);
final d2 = RistrettoUtils.positiveMod(invSqrt * u2, primeP);
final zInverse = RistrettoUtils.positiveMod(d1 * d2 * t, primeP);
BigInt D;
if (RistrettoUtils.isOdd(t * zInverse, primeP)) {
final x2 = RistrettoUtils.positiveMod(y * RistrettoUtils.sqrtM1, primeP);
final y2 = RistrettoUtils.positiveMod(x * RistrettoUtils.sqrtM1, primeP);
x = x2;
y = y2;
D = RistrettoUtils.positiveMod(d1 * RistrettoUtils.invSqrt, primeP);
} else {
D = d2;
}
if (RistrettoUtils.isOdd(x * zInverse, primeP)) {
y = RistrettoUtils.positiveMod(-y, primeP);
}
BigInt s = RistrettoUtils.positiveMod((z - y) * D, primeP);
if (RistrettoUtils.isOdd(s, primeP)) {
s = RistrettoUtils.positiveMod(-s, primeP);
}
return BigintUtils.toBytes(s, order: Endian.little, length: 32);
}