Implement FromUniformBytes

This commit is contained in:
Filippo Valsorda 2019-01-21 23:39:45 -05:00
parent dcc5867ec2
commit a3540ec35a
2 changed files with 75 additions and 5 deletions

8
fe.go
View File

@ -73,8 +73,8 @@ func fePow22523(out, z *FieldElement) {
FeMul(out, &t0, z)
}
func FeSqrtRatio(u, v *FieldElement) (int, *FieldElement) {
var a, b, c FieldElement
func feSqrtRatio(out, u, v *FieldElement) int {
var a, b FieldElement
// v^3, v^7
v3, v7 := &a, &b
@ -85,7 +85,7 @@ func FeSqrtRatio(u, v *FieldElement) (int, *FieldElement) {
FeMul(v7, v7, v) // v^7 = v^6 * v
// r = (u * v3) * (u * v7)^((p-5)/8)
r := &c
r := out
uv3, uv7 := v3, v7 // alias
FeMul(uv3, u, v3) // (u * v3)
FeMul(uv7, u, v7) // (u * v7)
@ -119,7 +119,7 @@ func FeSqrtRatio(u, v *FieldElement) (int, *FieldElement) {
FeAbs(r, r)
was_square := correct_sign_sqrt | flipped_sign_sqrt
return was_square, r
return was_square
}
func fieldElementFromDecimal(s string) *FieldElement {

View File

@ -54,5 +54,75 @@ func (e *Element) FromUniformBytes(b []byte) {
panic("ristretto255: FromUniformBytes: input is not 64 bytes long")
}
panic("ristretto255: FromUniformBytes: unimplemented")
var buf [32]byte
f := &radix51.FieldElement{}
copy(buf[:], b[:32])
radix51.FeFromBytes(f, &buf)
p1 := &group.ExtendedGroupElement{}
mapToPoint(p1, f)
copy(buf[:], b[32:])
radix51.FeFromBytes(f, &buf)
p2 := &group.ExtendedGroupElement{}
mapToPoint(p2, f)
e.r.Add(p1, p2)
}
func mapToPoint(out *group.ExtendedGroupElement, t *radix51.FieldElement) {
r := &radix51.FieldElement{}
radix51.FeSquare(r, t)
radix51.FeMul(r, r, sqrtM1)
one := &radix51.FieldElement{}
radix51.FeOne(one)
minusOne := &radix51.FieldElement{}
radix51.FeNeg(minusOne, one)
u := &radix51.FieldElement{}
radix51.FeAdd(u, r, one)
radix51.FeMul(u, u, oneMinusDSQ)
rPlusD := &radix51.FieldElement{}
radix51.FeAdd(rPlusD, r, &group.D)
v := &radix51.FieldElement{}
radix51.FeMul(v, r, &group.D)
radix51.FeSub(v, minusOne, v)
radix51.FeMul(v, v, rPlusD)
s := &radix51.FieldElement{}
wasSquare := feSqrtRatio(s, u, v)
sPrime := &radix51.FieldElement{}
radix51.FeMul(sPrime, s, t)
radix51.FeAbs(sPrime, sPrime)
radix51.FeNeg(sPrime, sPrime)
c := &radix51.FieldElement{}
radix51.FeSelect(s, s, sPrime, wasSquare)
radix51.FeSelect(c, minusOne, r, wasSquare)
N := &radix51.FieldElement{}
radix51.FeSub(N, r, one)
radix51.FeMul(N, N, c)
radix51.FeMul(N, N, dMinusOneSQ)
radix51.FeSub(N, N, v)
sSquare := &radix51.FieldElement{}
radix51.FeSquare(sSquare, s)
w0 := &radix51.FieldElement{}
radix51.FeMul(w0, s, v)
radix51.FeAdd(w0, w0, w0)
w1 := &radix51.FieldElement{}
radix51.FeMul(w1, N, sqrtADMinusOne)
w2 := &radix51.FieldElement{}
radix51.FeSub(w2, one, sSquare)
w3 := &radix51.FieldElement{}
radix51.FeAdd(w3, one, sSquare)
radix51.FeMul(&out.X, w0, w3)
radix51.FeMul(&out.Y, w2, w1)
radix51.FeMul(&out.Z, w1, w3)
radix51.FeMul(&out.T, w0, w2)
}