Browse Source

Merge pull request #18 from iden3/feature/fix32bits

Fix compat with 32 bit arch
feature/goff-0-2-0 c0
arnau 4 years ago
committed by GitHub
parent
commit
eb41fe0757
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 6 deletions
  1. +7
    -0
      .travis.yml
  2. +34
    -6
      ff/element.go

+ 7
- 0
.travis.yml

@ -4,5 +4,12 @@ language: go
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

+ 34
- 6
ff/element.go

@ -513,15 +513,33 @@ func (z *Element) String() string {
// 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 @@ func (z *Element) SetBigInt(v *big.Int) *Element {
}
// 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()
}

Loading…
Cancel
Save