Function fromBytes [src]

Decode a Ristretto255 representative.

Prototype

pub fn fromBytes(s: [encoded_length]u8) (NonCanonicalError || EncodingError)!Ristretto255

Parameters

s: [encoded_length]u8

Source

pub fn fromBytes(s: [encoded_length]u8) (NonCanonicalError || EncodingError)!Ristretto255 { try rejectNonCanonical(s); const s_ = Fe.fromBytes(s); const ss = s_.sq(); // s^2 const u1_ = Fe.one.sub(ss); // (1-s^2) const u1u1 = u1_.sq(); // (1-s^2)^2 const u2_ = Fe.one.add(ss); // (1+s^2) const u2u2 = u2_.sq(); // (1+s^2)^2 const v = Fe.edwards25519d.mul(u1u1).neg().sub(u2u2); // -(d*u1^2)-u2^2 const v_u2u2 = v.mul(u2u2); // v*u2^2 const inv_sqrt = sqrtRatioM1(Fe.one, v_u2u2); var x = inv_sqrt.root.mul(u2_); const y = inv_sqrt.root.mul(x).mul(v).mul(u1_); x = x.mul(s_); x = x.add(x).abs(); const t = x.mul(y); if ((1 - inv_sqrt.ratio_is_square) | @intFromBool(t.isNegative()) | @intFromBool(y.isZero()) != 0) { return error.InvalidEncoding; } const p: Curve = .{ .x = x, .y = y, .z = Fe.one, .t = t, }; return Ristretto255{ .p = p }; }