Merge pull request #18 from iden3/feature/fix32bits Fix compat with 32 bit arch
arnau 17317030+arnaucube@users.noreply.github.com
Wed, 18 Mar 2020 11:55:56 +0100
2 files changed,
41 insertions(+),
6 deletions(-)
M
.travis.yml
→
.travis.yml
@@ -4,5 +4,12 @@
go: - "1.12" +jobs: + include: + - name: "Unit Tests 64 bit arch" + env: GOARCH="amd64" + - name: "Unit Test 32 bit arch" + env: GOARCH="386" + env: - GO111MODULE=on
M
ff/element.go
→
ff/element.go
@@ -513,15 +513,33 @@ }
// ToBigInt returns z as a big.Int in Montgomery form func (z *Element) ToBigInt(res *big.Int) *big.Int { - bits := (*[4]big.Word)(unsafe.Pointer(z)) - return res.SetBits(bits[:]) + if bits.UintSize == 64 { + bits := (*[4]big.Word)(unsafe.Pointer(z)) + return res.SetBits(bits[:]) + } else { + var bits [8]big.Word + for i := 0; i < len(z); i++ { + bits[i*2] = big.Word(z[i]) + bits[i*2+1] = big.Word(z[i] >> 32) + } + return res.SetBits(bits[:]) + } } // ToBigIntRegular returns z as a big.Int in regular form func (z Element) ToBigIntRegular(res *big.Int) *big.Int { z.FromMont() - bits := (*[4]big.Word)(unsafe.Pointer(&z)) - return res.SetBits(bits[:]) + if bits.UintSize == 64 { + bits := (*[4]big.Word)(unsafe.Pointer(&z)) + return res.SetBits(bits[:]) + } else { + var bits [8]big.Word + for i := 0; i < len(z); i++ { + bits[i*2] = big.Word(z[i]) + bits[i*2+1] = big.Word(z[i] >> 32) + } + return res.SetBits(bits[:]) + } } // SetBigInt sets z to v (regular form) and returns z in Montgomery form@@ -548,8 +566,18 @@ return z
} // v should vBits := vv.Bits() - for i := 0; i < len(vBits); i++ { - z[i] = uint64(vBits[i]) + if bits.UintSize == 64 { + for i := 0; i < len(vBits); i++ { + z[i] = uint64(vBits[i]) + } + } else { + for i := 0; i < len(vBits); i++ { + if i%2 == 0 { + z[i/2] = uint64(vBits[i]) + } else { + z[i/2] |= uint64(vBits[i]) << 32 + } + } } return z.ToMont() }