| ... | ... | @@ -13,9 +13,8 @@ pub const Ristretto255 = struct { |
| 13 | 13 | p: Curve = undefined, |
| 14 | 14 | |
| 15 | 15 | fn sqrtRatioM1(u: Fe, v: Fe) !Fe { |
| 16 | | const v3 = v.sq().mul(v); // v3 = v^3 |
| 17 | | var x = v3.sq().mul(u).mul(v). // x = uv^7 |
| 18 | | pow2523().mul(v3).mul(u); // x = uv^3(uv^7)^((q-5)/8) |
| 16 | const v3 = v.sq().mul(v); // v^3 |
| 17 | var x = v3.sq().mul(u).mul(v).pow2523().mul(v3).mul(u); // uv^3(uv^7)^((q-5)/8) |
| 19 | 18 | const vxx = x.sq().mul(v); // vx^2 |
| 20 | 19 | const m_root_check = vxx.sub(u); // vx^2-u |
| 21 | 20 | const p_root_check = vxx.add(u); // vx^2+u |
| ... | ... | @@ -77,7 +76,7 @@ pub const Ristretto255 = struct { |
| 77 | 76 | .z = Fe.one(), |
| 78 | 77 | .t = t, |
| 79 | 78 | }; |
| 80 | | return @as(Ristretto255, .{ .p = p }); |
| 79 | return Ristretto255 { .p = p }; |
| 81 | 80 | } |
| 82 | 81 | |
| 83 | 82 | /// Encode to a Ristretto255 representative. |
| ... | ... | @@ -87,25 +86,20 @@ pub const Ristretto255 = struct { |
| 87 | 86 | const zmy = p.z.sub(p.y); // Z-Y |
| 88 | 87 | u1_ = u1_.mul(zmy); // (Z+Y)*(Z-Y) |
| 89 | 88 | const u2_ = p.x.mul(p.y); // X*Y |
| 90 | | |
| 91 | 89 | const u1_u2u2 = u2_.sq().mul(u1_); // u1*u2^2 |
| 92 | | |
| 93 | 90 | const inv_sqrt = sqrtRatioM1(Fe.one(), u1_u2u2) catch unreachable; |
| 94 | 91 | const den1 = inv_sqrt.mul(u1_); |
| 95 | 92 | const den2 = inv_sqrt.mul(u2_); |
| 96 | 93 | const z_inv = den1.mul(den2).mul(p.t); // den1*den2*T |
| 97 | | |
| 98 | 94 | const ix = p.x.mul(Fe.sqrtm1()); // X*sqrt(-1) |
| 99 | 95 | const iy = p.y.mul(Fe.sqrtm1()); // Y*sqrt(-1) |
| 100 | 96 | const eden = den1.mul(Fe.edwards25519sqrtamd()); // den1/sqrt(a-d) |
| 101 | | |
| 102 | 97 | const t_z_inv = p.t.mul(z_inv); // T*z_inv |
| 103 | | const rotate = @boolToInt(t_z_inv.isNegative()); |
| 104 | 98 | |
| 99 | const rotate = @boolToInt(t_z_inv.isNegative()); |
| 105 | 100 | var x = p.x; |
| 106 | 101 | var y = p.y; |
| 107 | 102 | var den_inv = den2; |
| 108 | | |
| 109 | 103 | x.cMov(iy, rotate); |
| 110 | 104 | y.cMov(ix, rotate); |
| 111 | 105 | den_inv.cMov(eden, rotate); |
| ... | ... | @@ -131,7 +125,7 @@ pub const Ristretto255 = struct { |
| 131 | 125 | /// Return error.WeakPublicKey if the resulting element is |
| 132 | 126 | /// the identity element. |
| 133 | 127 | pub inline fn mul(p: Ristretto255, s: [32]u8) !Ristretto255 { |
| 134 | | return @as(Ristretto255, .{ .p = try p.p.mul(s) }); |
| 128 | return Ristretto255 { .p = try p.p.mul(s) }; |
| 135 | 129 | } |
| 136 | 130 | }; |
| 137 | 131 | |