arnaucube
arnaucube/go-iden3-cryptoPublic Self-hosted repository
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
commit

eb41fe07578ac13aa5366bd25860bfbed958f584

parent

ee467c62155ae47a85b7acc117aa9e700992b640

2 files changed, 41 insertions(+), 6 deletions(-)

jump to
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() }