http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/BIG.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/BIG.go 
b/go/src/github.com/miracl/amcl-go/BIG.go
deleted file mode 100644
index a1c5184..0000000
--- a/go/src/github.com/miracl/amcl-go/BIG.go
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* AMCL BIG number class */
-
-package amcl
-
-import "strconv"
-
-//import "fmt"
-
-type BIG struct {
-       w [NLEN]int64
-}
-
-func NewBIG() *BIG {
-       b := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               b.w[i] = 0
-       }
-       return b
-}
-
-func NewBIGint(x int) *BIG {
-       b := new(BIG)
-       b.w[0] = int64(x)
-       for i := 1; i < NLEN; i++ {
-               b.w[i] = 0
-       }
-       return b
-}
-
-func NewBIGcopy(x *BIG) *BIG {
-       b := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               b.w[i] = x.w[i]
-       }
-       return b
-}
-
-func NewBIGdcopy(x *DBIG) *BIG {
-       b := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               b.w[i] = x.w[i]
-       }
-       return b
-}
-
-func NewBIGints(x [NLEN]int64) *BIG {
-       b := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               b.w[i] = x[i]
-       }
-       return b
-}
-
-func (r *BIG) get(i int) int64 {
-       return r.w[i]
-}
-
-func (r *BIG) set(i int, x int64) {
-       r.w[i] = x
-}
-
-func (r *BIG) xortop(x int64) {
-       r.w[NLEN-1] ^= x
-}
-
-func (r *BIG) ortop(x int64) {
-       r.w[NLEN-1] |= x
-}
-
-/* test for zero */
-func (r *BIG) iszilch() bool {
-       for i := 0; i < NLEN; i++ {
-               if r.w[i] != 0 {
-                       return false
-               }
-       }
-       return true
-}
-
-/* set to zero */
-func (r *BIG) zero() {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* Test for equal to one */
-func (r *BIG) isunity() bool {
-       for i := 1; i < NLEN; i++ {
-               if r.w[i] != 0 {
-                       return false
-               }
-       }
-       if r.w[0] != 1 {
-               return false
-       }
-       return true
-}
-
-/* set to one */
-func (r *BIG) one() {
-       r.w[0] = 1
-       for i := 1; i < NLEN; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* Copy from another BIG */
-func (r *BIG) copy(x *BIG) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = x.w[i]
-       }
-}
-
-/* Copy from another DBIG */
-func (r *BIG) dcopy(x *DBIG) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = x.w[i]
-       }
-}
-
-/* calculate Field Excess */
-func EXCESS(a *BIG) int64 {
-       return ((a.w[NLEN-1] & OMASK) >> (MODBITS % BASEBITS))
-}
-
-/* normalise BIG - force all digits < 2^BASEBITS */
-func (r *BIG) norm() int64 {
-       var carry int64 = 0
-       for i := 0; i < NLEN-1; i++ {
-               d := r.w[i] + carry
-               r.w[i] = d & MASK
-               carry = d >> BASEBITS
-       }
-       r.w[NLEN-1] = (r.w[NLEN-1] + carry)
-
-       return (r.w[NLEN-1] >> ((8 * MODBYTES) % BASEBITS))
-}
-
-/* Conditional swap of two bigs depending on d using XOR - no branches */
-func (r *BIG) cswap(b *BIG, d int32) {
-       var c = int64(d)
-       c = ^(c - 1)
-
-       for i := 0; i < NLEN; i++ {
-               t := c & (r.w[i] ^ b.w[i])
-               r.w[i] ^= t
-               b.w[i] ^= t
-       }
-}
-
-func (r *BIG) cmove(g *BIG, d int32) {
-       var b = int64(-d)
-
-       for i := 0; i < NLEN; i++ {
-               r.w[i] ^= (r.w[i] ^ g.w[i]) & b
-       }
-}
-
-/* Shift right by less than a word */
-func (r *BIG) fshr(k uint) int64 {
-       w := r.w[0] & ((int64(1) << k) - 1) /* shifted out part */
-       for i := 0; i < NLEN-1; i++ {
-               r.w[i] = (r.w[i] >> k) | ((r.w[i+1] << (BASEBITS - k)) & MASK)
-       }
-       r.w[NLEN-1] = r.w[NLEN-1] >> k
-       return w
-}
-
-/* general shift right */
-func (r *BIG) shr(k uint) {
-       n := (k % BASEBITS)
-       m := int(k / BASEBITS)
-       for i := 0; i < NLEN-m-1; i++ {
-               r.w[i] = (r.w[m+i] >> n) | ((r.w[m+i+1] << (BASEBITS - n)) & 
MASK)
-       }
-       r.w[NLEN-m-1] = r.w[NLEN-1] >> n
-       for i := NLEN - m; i < NLEN; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* Shift right by less than a word */
-func (r *BIG) fshl(k uint) int64 {
-       r.w[NLEN-1] = (r.w[NLEN-1] << k) | (r.w[NLEN-2] >> (BASEBITS - k))
-       for i := NLEN - 2; i > 0; i-- {
-               r.w[i] = ((r.w[i] << k) & MASK) | (r.w[i-1] >> (BASEBITS - k))
-       }
-       r.w[0] = (r.w[0] << k) & MASK
-       return (r.w[NLEN-1] >> ((8 * MODBYTES) % BASEBITS)) /* return excess - 
only used in ff.c */
-}
-
-/* general shift left */
-func (r *BIG) shl(k uint) {
-       n := k % BASEBITS
-       m := int(k / BASEBITS)
-
-       r.w[NLEN-1] = (r.w[NLEN-1-m] << n) | (r.w[NLEN-m-2] >> (BASEBITS - n))
-       for i := NLEN - 2; i > m; i-- {
-               r.w[i] = ((r.w[i-m] << n) & MASK) | (r.w[i-m-1] >> (BASEBITS - 
n))
-       }
-       r.w[m] = (r.w[0] << n) & MASK
-       for i := 0; i < m; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* return number of bits */
-func (r *BIG) nbits() int {
-       k := NLEN - 1
-       r.norm()
-       for k >= 0 && r.w[k] == 0 {
-               k--
-       }
-       if k < 0 {
-               return 0
-       }
-       bts := int(BASEBITS) * k
-       c := r.w[k]
-       for c != 0 {
-               c /= 2
-               bts++
-       }
-       return bts
-}
-
-/* Convert to Hex String */
-func (r *BIG) toString() string {
-       s := ""
-       len := r.nbits()
-
-       if len%4 == 0 {
-               len /= 4
-       } else {
-               len /= 4
-               len++
-
-       }
-       MB := int(MODBYTES * 2)
-       if len < MB {
-               len = MB
-       }
-
-       for i := len - 1; i >= 0; i-- {
-               b := NewBIGcopy(r)
-
-               b.shr(uint(i * 4))
-               s += strconv.FormatInt(b.w[0]&15, 16)
-       }
-       return s
-}
-
-func (r *BIG) add(x *BIG) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = r.w[i] + x.w[i]
-       }
-}
-
-/* return this+x */
-func (r *BIG) plus(x *BIG) *BIG {
-       s := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               s.w[i] = r.w[i] + x.w[i]
-       }
-       return s
-}
-
-/* this+=x, where x is int */
-func (r *BIG) inc(x int) {
-       r.norm()
-       r.w[0] += int64(x)
-}
-
-/* return this-x */
-func (r *BIG) minus(x *BIG) *BIG {
-       d := new(BIG)
-       for i := 0; i < NLEN; i++ {
-               d.w[i] = r.w[i] - x.w[i]
-       }
-       return d
-}
-
-/* this-=x */
-func (r *BIG) sub(x *BIG) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = r.w[i] - x.w[i]
-       }
-}
-
-/* reverse subtract this=x-this */
-func (r *BIG) rsub(x *BIG) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] = x.w[i] - r.w[i]
-       }
-}
-
-/* this-=x, where x is int */
-func (r *BIG) dec(x int) {
-       r.norm()
-       r.w[0] -= int64(x)
-}
-
-/* this*=x, where x is small int<NEXCESS */
-func (r *BIG) imul(c int) {
-       for i := 0; i < NLEN; i++ {
-               r.w[i] *= int64(c)
-       }
-}
-
-/* convert this BIG to byte array */
-func (r *BIG) tobytearray(b []byte, n int) {
-       r.norm()
-       c := NewBIGcopy(r)
-
-       for i := int(MODBYTES) - 1; i >= 0; i-- {
-               b[i+n] = byte(c.w[0])
-               c.fshr(8)
-       }
-}
-
-/* convert from byte array to BIG */
-func frombytearray(b []byte, n int) *BIG {
-       m := NewBIG()
-       for i := 0; i < int(MODBYTES); i++ {
-               m.fshl(8)
-               m.w[0] += int64(b[i+n] & 0xff)
-       }
-       return m
-}
-
-func (r *BIG) toBytes(b []byte) {
-       r.tobytearray(b, 0)
-}
-
-func fromBytes(b []byte) *BIG {
-       return frombytearray(b, 0)
-}
-
-/* set this[i]+=x*y+c, and return high part */
-
-func (r *BIG) muladd(a int64, b int64, c int64, i int) int64 {
-       x0 := a & HMASK
-       x1 := (a >> HBITS)
-       y0 := b & HMASK
-       y1 := (b >> HBITS)
-       bot := x0 * y0
-       top := x1 * y1
-       mid := x0*y1 + x1*y0
-       x0 = mid & HMASK
-       x1 = (mid >> HBITS)
-       bot += x0 << HBITS
-       bot += c
-       bot += r.w[i]
-       top += x1
-       carry := bot >> BASEBITS
-       bot &= MASK
-       top += carry
-       r.w[i] = bot
-       return top
-}
-
-/* this*=x, where x is >NEXCESS */
-func (r *BIG) pmul(c int) int64 {
-       var carry int64 = 0
-       r.norm()
-       for i := 0; i < NLEN; i++ {
-               ak := r.w[i]
-               r.w[i] = 0
-               carry = r.muladd(ak, int64(c), carry, i)
-       }
-       return carry
-}
-
-/* this*=c and catch overflow in DBIG */
-func (r *BIG) pxmul(c int) *DBIG {
-       m := NewDBIG()
-       var carry int64 = 0
-       for j := 0; j < NLEN; j++ {
-               carry = m.muladd(r.w[j], int64(c), carry, j)
-       }
-       m.w[NLEN] = carry
-       return m
-}
-
-/* divide by 3 */
-func (r *BIG) div3() int {
-       var carry int64 = 0
-       r.norm()
-       base := (int64(1) << BASEBITS)
-       for i := NLEN - 1; i >= 0; i-- {
-               ak := (carry*base + r.w[i])
-               r.w[i] = ak / 3
-               carry = ak % 3
-       }
-       return int(carry)
-}
-
-/* return a*b where result fits in a BIG */
-func smul(a *BIG, b *BIG) *BIG {
-       var carry int64
-       c := NewBIG()
-       for i := 0; i < NLEN; i++ {
-               carry = 0
-               for j := 0; j < NLEN; j++ {
-                       if i+j < NLEN {
-                               carry = c.muladd(a.w[i], b.w[j], carry, i+j)
-                       }
-               }
-       }
-       return c
-}
-
-/* Compare a and b, return 0 if a==b, -1 if a<b, +1 if a>b. Inputs must be 
normalised */
-func comp(a *BIG, b *BIG) int {
-       for i := NLEN - 1; i >= 0; i-- {
-               if a.w[i] == b.w[i] {
-                       continue
-               }
-               if a.w[i] > b.w[i] {
-                       return 1
-               } else {
-                       return -1
-               }
-       }
-       return 0
-}
-
-/* return parity */
-func (r *BIG) parity() int {
-       return int(r.w[0] % 2)
-}
-
-/* return n-th bit */
-func (r *BIG) bit(n int) int {
-       if (r.w[n/int(BASEBITS)] & (int64(1) << (uint(n) % BASEBITS))) > 0 {
-               return 1
-       }
-       return 0
-}
-
-/* return n last bits */
-func (r *BIG) lastbits(n int) int {
-       msk := (1 << uint(n)) - 1
-       r.norm()
-       return (int(r.w[0])) & msk
-}
-
-/* set x = x mod 2^m */
-func (r *BIG) mod2m(m uint) {
-       wd := int(m / BASEBITS)
-       bt := m % BASEBITS
-       msk := (int64(1) << bt) - 1
-       r.w[wd] &= msk
-       for i := wd + 1; i < NLEN; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* Arazi and Qi inversion mod 256 */
-func invmod256(a int) int {
-       var t1 int = 0
-       c := (a >> 1) & 1
-       t1 += c
-       t1 &= 1
-       t1 = 2 - t1
-       t1 <<= 1
-       U := t1 + 1
-
-       // i=2
-       b := a & 3
-       t1 = U * b
-       t1 >>= 2
-       c = (a >> 2) & 3
-       t2 := (U * c) & 3
-       t1 += t2
-       t1 *= U
-       t1 &= 3
-       t1 = 4 - t1
-       t1 <<= 2
-       U += t1
-
-       // i=4
-       b = a & 15
-       t1 = U * b
-       t1 >>= 4
-       c = (a >> 4) & 15
-       t2 = (U * c) & 15
-       t1 += t2
-       t1 *= U
-       t1 &= 15
-       t1 = 16 - t1
-       t1 <<= 4
-       U += t1
-
-       return U
-}
-
-/* a=1/a mod 2^256. This is very fast! */
-func (r *BIG) invmod2m() {
-       U := NewBIG()
-       b := NewBIG()
-       c := NewBIG()
-
-       U.inc(invmod256(r.lastbits(8)))
-
-       for i := 8; i < 256; i <<= 1 {
-               ui := uint(i)
-               b.copy(r)
-               b.mod2m(ui)
-               t1 := smul(U, b)
-               t1.shr(ui)
-               c.copy(r)
-               c.shr(ui)
-               c.mod2m(ui)
-
-               t2 := smul(U, c)
-               t2.mod2m(ui)
-               t1.add(t2)
-               b = smul(t1, U)
-               t1.copy(b)
-               t1.mod2m(ui)
-
-               t2.one()
-               t2.shl(ui)
-               t1.rsub(t2)
-               t1.norm()
-               t1.shl(ui)
-               U.add(t1)
-       }
-       r.copy(U)
-}
-
-/* reduce this mod m */
-func (r *BIG) mod(m *BIG) {
-       r.norm()
-       if comp(r, m) < 0 {
-               return
-       }
-
-       m.fshl(1)
-       k := 1
-
-       for comp(r, m) >= 0 {
-               m.fshl(1)
-               k++
-       }
-
-       for k > 0 {
-               m.fshr(1)
-               if comp(r, m) >= 0 {
-                       r.sub(m)
-                       r.norm()
-               }
-               k--
-       }
-}
-
-/* divide this by m */
-func (r *BIG) div(m *BIG) {
-       k := 0
-       r.norm()
-       e := NewBIGint(1)
-       b := NewBIGcopy(r)
-       r.zero()
-
-       for comp(b, m) >= 0 {
-               e.fshl(1)
-               m.fshl(1)
-               k++
-       }
-
-       for k > 0 {
-               m.fshr(1)
-               e.fshr(1)
-               if comp(b, m) >= 0 {
-                       r.add(e)
-                       r.norm()
-                       b.sub(m)
-                       b.norm()
-               }
-               k--
-       }
-}
-
-/* get 8*MODBYTES size random number */
-func random(rng *RAND) *BIG {
-       m := NewBIG()
-       var j int = 0
-       var r byte = 0
-       /* generate random BIG */
-       for i := 0; i < 8*int(MODBYTES); i++ {
-               if j == 0 {
-                       r = rng.GetByte()
-               } else {
-                       r >>= 1
-               }
-
-               b := int64(r & 1)
-               m.shl(1)
-               m.w[0] += b // m.inc(b)
-               j++
-               j &= 7
-       }
-       return m
-}
-
-/* Create random BIG in portable way, one bit at a time */
-func randomnum(q *BIG, rng *RAND) *BIG {
-       d := NewDBIG()
-       var j int = 0
-       var r byte = 0
-       for i := 0; i < 2*int(MODBITS); i++ {
-               if j == 0 {
-                       r = rng.GetByte()
-               } else {
-                       r >>= 1
-               }
-
-               b := int64(r & 1)
-               d.shl(1)
-               d.w[0] += b // m.inc(b);
-               j++
-               j &= 7
-       }
-       m := d.mod(q)
-       return m
-}
-
-/* return NAF value as +/- 1, 3 or 5. x and x3 should be normed.
-nbs is number of bits processed, and nzs is number of trailing 0s detected */
-func nafbits(x *BIG, x3 *BIG, i int) [3]int {
-       var n [3]int
-       var j int
-       nb := x3.bit(i) - x.bit(i)
-
-       n[1] = 1
-       n[0] = 0
-       if nb == 0 {
-               n[0] = 0
-               return n
-       }
-       if i == 0 {
-               n[0] = nb
-               return n
-       }
-       if nb > 0 {
-               n[0] = 1
-       } else {
-               n[0] = (-1)
-       }
-
-       for j = i - 1; j > 0; j-- {
-               n[1]++
-               n[0] *= 2
-               nb = x3.bit(j) - x.bit(j)
-               if nb > 0 {
-                       n[0] += 1
-               }
-               if nb < 0 {
-                       n[0] -= 1
-               }
-               if n[0] > 5 || n[0] < -5 {
-                       break
-               }
-       }
-
-       if n[0]%2 != 0 && j != 0 { /* backtrack */
-               if nb > 0 {
-                       n[0] = (n[0] - 1) / 2
-               }
-               if nb < 0 {
-                       n[0] = (n[0] + 1) / 2
-               }
-               n[1]--
-       }
-       for n[0]%2 == 0 { /* remove trailing zeros */
-               n[0] /= 2
-               n[2]++
-               n[1]--
-       }
-       return n
-}
-
-/* return a*b as DBIG */
-func mul(a *BIG, b *BIG) *DBIG {
-       c := NewDBIG()
-       var carry int64
-       a.norm()
-       b.norm()
-
-       for i := 0; i < NLEN; i++ {
-               carry = 0
-               for j := 0; j < NLEN; j++ {
-                       carry = c.muladd(a.w[i], b.w[j], carry, i+j)
-               }
-               c.w[NLEN+i] = carry
-       }
-
-       return c
-}
-
-/* return a^2 as DBIG */
-func sqr(a *BIG) *DBIG {
-       c := NewDBIG()
-       var carry int64
-       a.norm()
-       for i := 0; i < NLEN; i++ {
-               carry = 0
-               for j := i + 1; j < NLEN; j++ {
-                       carry = c.muladd(2*a.w[i], a.w[j], carry, i+j)
-               }
-               c.w[NLEN+i] = carry
-       }
-
-       for i := 0; i < NLEN; i++ {
-               c.w[2*i+1] += c.muladd(a.w[i], a.w[i], 0, 2*i)
-       }
-       c.norm()
-       return c
-}
-
-/* reduce a DBIG to a BIG using the appropriate form of the modulus */
-func mod(d *DBIG) *BIG {
-       var b *BIG
-       if MODTYPE == PSEUDO_MERSENNE {
-               t := d.split(MODBITS)
-               b = NewBIGdcopy(d)
-
-               v := t.pmul(int(MConst))
-               tw := t.w[NLEN-1]
-               t.w[NLEN-1] &= TMASK
-               t.w[0] += (MConst * ((tw >> TBITS) + (v << (BASEBITS - TBITS))))
-
-               b.add(t)
-       }
-       if MODTYPE == MONTGOMERY_FRIENDLY {
-               for i := 0; i < NLEN; i++ {
-                       d.w[NLEN+i] += d.muladd(d.w[i], MConst-1, d.w[i], 
NLEN+i-1)
-               }
-               b = NewBIG()
-
-               for i := 0; i < NLEN; i++ {
-                       b.w[i] = d.w[NLEN+i]
-               }
-       }
-
-       if MODTYPE == NOT_SPECIAL {
-               md := NewBIGints(Modulus)
-               var carry, m int64
-               for i := 0; i < NLEN; i++ {
-                       if MConst == -1 {
-                               m = (-d.w[i]) & MASK
-                       } else {
-                               if MConst == 1 {
-                                       m = d.w[i]
-                               } else {
-                                       m = (MConst * d.w[i]) & MASK
-                               }
-                       }
-
-                       carry = 0
-                       for j := 0; j < NLEN; j++ {
-                               carry = d.muladd(m, md.w[j], carry, i+j)
-                       }
-                       d.w[NLEN+i] += carry
-               }
-
-               b = NewBIG()
-               for i := 0; i < NLEN; i++ {
-                       b.w[i] = d.w[NLEN+i]
-               }
-
-       }
-       b.norm()
-       return b
-}
-
-/* return a*b mod m */
-func modmul(a, b, m *BIG) *BIG {
-       a.mod(m)
-       b.mod(m)
-       d := mul(a, b)
-       return d.mod(m)
-}
-
-/* return a^2 mod m */
-func modsqr(a, m *BIG) *BIG {
-       a.mod(m)
-       d := sqr(a)
-       return d.mod(m)
-}
-
-/* return -a mod m */
-func modneg(a, m *BIG) *BIG {
-       a.mod(m)
-       return m.minus(a)
-}
-
-/* return this^e mod m */
-func (r *BIG) powmod(e *BIG, m *BIG) *BIG {
-       r.norm()
-       e.norm()
-       a := NewBIGint(1)
-       z := NewBIGcopy(e)
-       s := NewBIGcopy(r)
-       for true {
-               bt := z.parity()
-               z.fshr(1)
-               if bt == 1 {
-                       a = modmul(a, s, m)
-               }
-               if z.iszilch() {
-                       break
-               }
-               s = modsqr(s, m)
-       }
-       return a
-}
-
-/* Jacobi Symbol (this/p). Returns 0, 1 or -1 */
-func (r *BIG) jacobi(p *BIG) int {
-       m := 0
-       t := NewBIGint(0)
-       x := NewBIGint(0)
-       n := NewBIGint(0)
-       zilch := NewBIGint(0)
-       one := NewBIGint(1)
-       if p.parity() == 0 || comp(r, zilch) == 0 || comp(p, one) <= 0 {
-               return 0
-       }
-       r.norm()
-       x.copy(r)
-       n.copy(p)
-       x.mod(p)
-
-       for comp(n, one) > 0 {
-               if comp(x, zilch) == 0 {
-                       return 0
-               }
-               n8 := n.lastbits(3)
-               k := 0
-               for x.parity() == 0 {
-                       k++
-                       x.shr(1)
-               }
-               if k%2 == 1 {
-                       m += (n8*n8 - 1) / 8
-               }
-               m += (n8 - 1) * (x.lastbits(2) - 1) / 4
-               t.copy(n)
-               t.mod(x)
-               n.copy(x)
-               x.copy(t)
-               m %= 2
-
-       }
-       if m == 0 {
-               return 1
-       }
-       return -1
-}
-
-/* this=1/this mod p. Binary method */
-func (r *BIG) invmodp(p *BIG) {
-       r.mod(p)
-       u := NewBIGcopy(r)
-
-       v := NewBIGcopy(p)
-       x1 := NewBIGint(1)
-       x2 := NewBIGint(0)
-       t := NewBIGint(0)
-       one := NewBIGint(1)
-       for comp(u, one) != 0 && comp(v, one) != 0 {
-               for u.parity() == 0 {
-                       u.shr(1)
-                       if x1.parity() != 0 {
-                               x1.add(p)
-                               x1.norm()
-                       }
-                       x1.shr(1)
-               }
-               for v.parity() == 0 {
-                       v.shr(1)
-                       if x2.parity() != 0 {
-                               x2.add(p)
-                               x2.norm()
-                       }
-                       x2.shr(1)
-               }
-               if comp(u, v) >= 0 {
-                       u.sub(v)
-                       u.norm()
-                       if comp(x1, x2) >= 0 {
-                               x1.sub(x2)
-                       } else {
-                               t.copy(p)
-                               t.sub(x2)
-                               x1.add(t)
-                       }
-                       x1.norm()
-               } else {
-                       v.sub(u)
-                       v.norm()
-                       if comp(x2, x1) >= 0 {
-                               x2.sub(x1)
-                       } else {
-                               t.copy(p)
-                               t.sub(x1)
-                               x2.add(t)
-                       }
-                       x2.norm()
-               }
-       }
-       if comp(u, one) == 0 {
-               r.copy(x1)
-       } else {
-               r.copy(x2)
-       }
-}
-
-/*
-func main() {
-       a := NewBIGint(3)
-       m := NewBIGints(Modulus)
-
-       fmt.Printf("Modulus= "+m.toString())
-       fmt.Printf("\n")
-
-
-       e := NewBIGcopy(m);
-       e.dec(7); e.norm();
-       fmt.Printf("Exponent= "+e.toString())
-       fmt.Printf("\n")
-       a=a.powmod(e,m);
-       fmt.Printf("Result= "+a.toString())
-}
-*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/DBIG.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/DBIG.go 
b/go/src/github.com/miracl/amcl-go/DBIG.go
deleted file mode 100644
index 98314b6..0000000
--- a/go/src/github.com/miracl/amcl-go/DBIG.go
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* AMCL double length DBIG number class */
-
-package amcl
-
-import "strconv"
-
-type DBIG struct {
-       w [2 * NLEN]int64
-}
-
-func NewDBIG() *DBIG {
-       b := new(DBIG)
-       for i := 0; i < DNLEN; i++ {
-               b.w[i] = 0
-       }
-       return b
-}
-
-func NewDBIGcopy(x *DBIG) *DBIG {
-       b := new(DBIG)
-       for i := 0; i < DNLEN; i++ {
-               b.w[i] = x.w[i]
-       }
-       return b
-}
-
-func NewDBIGscopy(x *BIG) *DBIG {
-       b := new(DBIG)
-       for i := 0; i < NLEN-1; i++ {
-               b.w[i] = x.w[i]
-       }
-       b.w[NLEN-1] = x.get(NLEN-1) & MASK /* top word normalized */
-       b.w[NLEN] = x.get(NLEN-1) >> BASEBITS
-
-       for i := NLEN + 1; i < DNLEN; i++ {
-               b.w[i] = 0
-       }
-       return b
-}
-
-/* set this[i]+=x*y+c, and return high part */
-
-func (r *DBIG) muladd(a int64, b int64, c int64, i int) int64 {
-       x0 := a & HMASK
-       x1 := (a >> HBITS)
-       y0 := b & HMASK
-       y1 := (b >> HBITS)
-       bot := x0 * y0
-       top := x1 * y1
-       mid := x0*y1 + x1*y0
-       x0 = mid & HMASK
-       x1 = (mid >> HBITS)
-       bot += x0 << HBITS
-       bot += c
-       bot += r.w[i]
-       top += x1
-       carry := bot >> BASEBITS
-       bot &= MASK
-       top += carry
-       r.w[i] = bot
-       return top
-}
-
-/* normalise this */
-func (r *DBIG) norm() {
-       var carry int64 = 0
-       for i := 0; i < DNLEN-1; i++ {
-               d := r.w[i] + carry
-               r.w[i] = d & MASK
-               carry = d >> BASEBITS
-       }
-       r.w[DNLEN-1] = (r.w[DNLEN-1] + carry)
-}
-
-/* split DBIG at position n, return higher half, keep lower half */
-func (r *DBIG) split(n uint) *BIG {
-       t := NewBIG()
-       m := n % BASEBITS
-       carry := r.w[DNLEN-1] << (BASEBITS - m)
-
-       for i := DNLEN - 2; i >= NLEN-1; i-- {
-               nw := (r.w[i] >> m) | carry
-               carry = (r.w[i] << (BASEBITS - m)) & MASK
-               t.set(i-NLEN+1, nw)
-       }
-       r.w[NLEN-1] &= ((int64(1) << m) - 1)
-       return t
-}
-
-/* Compare a and b, return 0 if a==b, -1 if a<b, +1 if a>b. Inputs must be 
normalised */
-func dcomp(a *DBIG, b *DBIG) int {
-       for i := DNLEN - 1; i >= 0; i-- {
-               if a.w[i] == b.w[i] {
-                       continue
-               }
-               if a.w[i] > b.w[i] {
-                       return 1
-               } else {
-                       return -1
-               }
-       }
-       return 0
-}
-
-func (r *DBIG) add(x *DBIG) {
-       for i := 0; i < DNLEN; i++ {
-               r.w[i] = r.w[i] + x.w[i]
-       }
-}
-
-/* this-=x */
-func (r *DBIG) sub(x *DBIG) {
-       for i := 0; i < DNLEN; i++ {
-               r.w[i] = r.w[i] - x.w[i]
-       }
-}
-
-/* general shift left */
-func (r *DBIG) shl(k uint) {
-       n := k % BASEBITS
-       m := int(k / BASEBITS)
-
-       r.w[DNLEN-1] = (r.w[DNLEN-1-m] << n) | (r.w[DNLEN-m-2] >> (BASEBITS - 
n))
-       for i := DNLEN - 2; i > m; i-- {
-               r.w[i] = ((r.w[i-m] << n) & MASK) | (r.w[i-m-1] >> (BASEBITS - 
n))
-       }
-       r.w[m] = (r.w[0] << n) & MASK
-       for i := 0; i < m; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* general shift right */
-func (r *DBIG) shr(k uint) {
-       n := (k % BASEBITS)
-       m := int(k / BASEBITS)
-       for i := 0; i < DNLEN-m-1; i++ {
-               r.w[i] = (r.w[m+i] >> n) | ((r.w[m+i+1] << (BASEBITS - n)) & 
MASK)
-       }
-       r.w[DNLEN-m-1] = r.w[DNLEN-1] >> n
-       for i := DNLEN - m; i < DNLEN; i++ {
-               r.w[i] = 0
-       }
-}
-
-/* reduces this DBIG mod a BIG, and returns the BIG */
-func (r *DBIG) mod(c *BIG) *BIG {
-       r.norm()
-       m := NewDBIGscopy(c)
-
-       if dcomp(r, m) < 0 {
-               return NewBIGdcopy(r)
-       }
-
-       m.shl(1)
-       k := 1
-
-       for dcomp(r, m) >= 0 {
-               m.shl(1)
-               k++
-       }
-
-       for k > 0 {
-               m.shr(1)
-               if dcomp(r, m) >= 0 {
-                       r.sub(m)
-                       r.norm()
-               }
-               k--
-       }
-       return NewBIGdcopy(r)
-}
-
-/* return this/c */
-func (r *DBIG) div(c *BIG) *BIG {
-       k := 0
-       m := NewDBIGscopy(c)
-       a := NewBIGint(0)
-       e := NewBIGint(1)
-       r.norm()
-
-       for dcomp(r, m) >= 0 {
-               e.fshl(1)
-               m.shl(1)
-               k++
-       }
-
-       for k > 0 {
-               m.shr(1)
-               e.shr(1)
-               if dcomp(r, m) > 0 {
-                       a.add(e)
-                       a.norm()
-                       r.sub(m)
-                       r.norm()
-               }
-               k--
-       }
-       return a
-}
-
-/* Convert to Hex String */
-func (r *DBIG) toString() string {
-       s := ""
-       len := r.nbits()
-
-       if len%4 == 0 {
-               len /= 4
-       } else {
-               len /= 4
-               len++
-
-       }
-
-       for i := len - 1; i >= 0; i-- {
-               b := NewDBIGcopy(r)
-
-               b.shr(uint(i * 4))
-               s += strconv.FormatInt(b.w[0]&15, 16)
-       }
-       return s
-}
-
-/* return number of bits */
-func (r *DBIG) nbits() int {
-       k := DNLEN - 1
-       r.norm()
-       for k >= 0 && r.w[k] == 0 {
-               k--
-       }
-       if k < 0 {
-               return 0
-       }
-       bts := int(BASEBITS) * k
-       c := r.w[k]
-       for c != 0 {
-               c /= 2
-               bts++
-       }
-       return bts
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/ECDH.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/ECDH.go 
b/go/src/github.com/miracl/amcl-go/ECDH.go
deleted file mode 100644
index 20718eb..0000000
--- a/go/src/github.com/miracl/amcl-go/ECDH.go
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* Elliptic Curve API high-level functions  */
-
-package amcl
-
-import "fmt"
-
-const ECDH_INVALID_PUBLIC_KEY int = -2
-const ECDH_ERROR int = -3
-const ECDH_INVALID int = -4
-const ECDH_EFS int = int(MODBYTES)
-const ECDH_EGS int = int(MODBYTES)
-const ECDH_EAS int = 16
-const ECDH_EBS int = 16
-
-/* Convert Integer to n-byte array */
-func inttoBytes(n int, len int) []byte {
-       var b []byte
-       var i int
-       for i = 0; i < len; i++ {
-               b = append(b, 0)
-       }
-       i = len
-       for n > 0 && i > 0 {
-               i--
-               b[i] = byte(n & 0xff)
-               n /= 256
-       }
-       return b
-}
-
-/* Key Derivation Functions */
-/* Input octet Z */
-/* Output key of length olen */
-func KDF1(Z []byte, olen int) []byte {
-       /* NOTE: the parameter olen is the length of the output K in bytes */
-       H := NewHASH()
-       hlen := 32
-       var K []byte
-       k := 0
-
-       for i := 0; i < olen; i++ {
-               K = append(K, 0)
-       }
-
-       cthreshold := olen / hlen
-       if olen%hlen != 0 {
-               cthreshold++
-       }
-
-       for counter := 0; counter < cthreshold; counter++ {
-               H.Process_array(Z)
-               if counter > 0 {
-                       H.Process_num(int32(counter))
-               }
-               B := H.Hash()
-               if k+hlen > olen {
-                       for i := 0; i < olen%hlen; i++ {
-                               K[k] = B[i]
-                               k++
-                       }
-               } else {
-                       for i := 0; i < hlen; i++ {
-                               K[k] = B[i]
-                               k++
-                       }
-               }
-       }
-       return K
-}
-
-func KDF2(Z []byte, P []byte, olen int) []byte {
-       /* NOTE: the parameter olen is the length of the output k in bytes */
-       H := NewHASH()
-       hlen := 32
-       var K []byte
-
-       k := 0
-
-       for i := 0; i < olen; i++ {
-               K = append(K, 0)
-       }
-
-       cthreshold := olen / hlen
-       if olen%hlen != 0 {
-               cthreshold++
-       }
-
-       for counter := 1; counter <= cthreshold; counter++ {
-               H.Process_array(Z)
-               H.Process_num(int32(counter))
-               H.Process_array(P)
-               B := H.Hash()
-               if k+hlen > olen {
-                       for i := 0; i < olen%hlen; i++ {
-                               K[k] = B[i]
-                               k++
-                       }
-               } else {
-                       for i := 0; i < hlen; i++ {
-                               K[k] = B[i]
-                               k++
-                       }
-               }
-       }
-       return K
-}
-
-/* Password based Key Derivation Function */
-/* Input password p, salt s, and repeat count */
-/* Output key of length olen */
-func PBKDF2(Pass []byte, Salt []byte, rep int, olen int) []byte {
-       d := olen / 32
-       if olen%32 != 0 {
-               d++
-       }
-       var F [ECDH_EFS]byte
-       var U [ECDH_EFS]byte
-
-       var S []byte
-
-       //byte[] S=new byte[Salt.length+4];
-
-       var K []byte
-       //byte[] K=new byte[d*EFS];
-       //opt:=0
-
-       for i := 1; i <= d; i++ {
-               for j := 0; j < len(Salt); j++ {
-                       S = append(S, Salt[j])
-               }
-               N := inttoBytes(i, 4)
-               for j := 0; j < 4; j++ {
-                       S = append(S, N[j])
-               }
-
-               HMAC(S, Pass, F[:])
-
-               for j := 0; j < ECDH_EFS; j++ {
-                       U[j] = F[j]
-               }
-               for j := 2; j <= rep; j++ {
-                       HMAC(U[:], Pass, U[:])
-                       for k := 0; k < ECDH_EFS; k++ {
-                               F[k] ^= U[k]
-                       }
-               }
-               for j := 0; j < ECDH_EFS; j++ {
-                       K = append(K, F[j])
-               }
-       }
-       var key []byte
-       for i := 0; i < olen; i++ {
-               key = append(key, K[i])
-       }
-       return key
-}
-
-/* Calculate HMAC of m using key k. HMAC is tag of length olen */
-func HMAC(M []byte, K []byte, tag []byte) int {
-       /* Input is from an octet m        *
-       * olen is requested output length in bytes. k is the key  *
-       * The output is the calculated tag */
-       var B [32]byte
-       var K0 [64]byte
-       olen := len(tag)
-
-       b := len(K0)
-       if olen < 4 || olen > 32 {
-               return 0
-       }
-
-       for i := 0; i < b; i++ {
-               K0[i] = 0
-       }
-
-       H := NewHASH()
-
-       if len(K) > b {
-               H.Process_array(K)
-               B = H.Hash()
-               for i := 0; i < 32; i++ {
-                       K0[i] = B[i]
-               }
-       } else {
-               for i := 0; i < len(K); i++ {
-                       K0[i] = K[i]
-               }
-       }
-
-       for i := 0; i < b; i++ {
-               K0[i] ^= 0x36
-       }
-       H.Process_array(K0[:])
-       H.Process_array(M)
-       B = H.Hash()
-
-       for i := 0; i < b; i++ {
-               K0[i] ^= 0x6a
-       }
-       H.Process_array(K0[:])
-       H.Process_array(B[:])
-       B = H.Hash()
-
-       for i := 0; i < olen; i++ {
-               tag[i] = B[i]
-       }
-
-       return 1
-}
-
-/* AES encryption/decryption. Encrypt byte array M using key K and returns 
ciphertext */
-func AES_CBC_IV0_ENCRYPT(K []byte, M []byte) []byte { /* AES CBC encryption, 
with Null IV and key K */
-       /* Input is from an octet string M, output is to an octet string C */
-       /* Input is padded as necessary to make up a full final block */
-       a := NewAES()
-       fin := false
-
-       var buff [16]byte
-       var C []byte
-
-       a.Init(aes_CBC, K, nil)
-
-       ipt := 0 //opt:=0
-       var i int
-       for true {
-               for i = 0; i < 16; i++ {
-                       if ipt < len(M) {
-                               buff[i] = M[ipt]
-                               ipt++
-                       } else {
-                               fin = true
-                               break
-                       }
-               }
-               if fin {
-                       break
-               }
-               a.Encrypt(buff[:])
-               for i = 0; i < 16; i++ {
-                       C = append(C, buff[i])
-               }
-       }
-
-       /* last block, filled up to i-th index */
-
-       padlen := 16 - i
-       for j := i; j < 16; j++ {
-               buff[j] = byte(padlen)
-       }
-
-       a.Encrypt(buff[:])
-
-       for i = 0; i < 16; i++ {
-               C = append(C, buff[i])
-       }
-       a.End()
-       return C
-}
-
-/* returns plaintext if all consistent, else returns null string */
-func AES_CBC_IV0_DECRYPT(K []byte, C []byte) []byte { /* padding is removed */
-       a := NewAES()
-       var buff [16]byte
-       var MM []byte
-       var M []byte
-
-       var i int
-       ipt := 0
-       opt := 0
-
-       a.Init(aes_CBC, K, nil)
-
-       if len(C) == 0 {
-               return nil
-       }
-       ch := C[ipt]
-       ipt++
-
-       fin := false
-
-       for true {
-               for i = 0; i < 16; i++ {
-                       buff[i] = ch
-                       if ipt >= len(C) {
-                               fin = true
-                               break
-                       } else {
-                               ch = C[ipt]
-                               ipt++
-                       }
-               }
-               a.Decrypt(buff[:])
-               if fin {
-                       break
-               }
-               for i = 0; i < 16; i++ {
-                       MM = append(MM, buff[i])
-                       opt++
-               }
-       }
-
-       a.End()
-       bad := false
-       padlen := int(buff[15])
-       if i != 15 || padlen < 1 || padlen > 16 {
-               bad = true
-       }
-       if padlen >= 2 && padlen <= 16 {
-               for i = 16 - padlen; i < 16; i++ {
-                       if buff[i] != byte(padlen) {
-                               bad = true
-                       }
-               }
-       }
-
-       if !bad {
-               for i = 0; i < 16-padlen; i++ {
-                       MM = append(MM, buff[i])
-                       opt++
-               }
-       }
-
-       if bad {
-               return nil
-       }
-
-       for i = 0; i < opt; i++ {
-               M = append(M, MM[i])
-       }
-
-       return M
-}
-
-/* Calculate a public/private EC GF(p) key pair W,S where W=S.G mod EC(p),
- * where S is the secret key and W is the public key
- * and G is fixed generator.
- * If RNG is NULL then the private key is provided externally in S
- * otherwise it is generated randomly internally */
-func ECDH_KEY_PAIR_GENERATE(RNG *RAND, S []byte, W []byte) int {
-       res := 0
-       var T [ECDH_EFS]byte
-       var s *BIG
-       var G *ECP
-
-       gx := NewBIGints(CURVE_Gx)
-       if CURVETYPE != MONTGOMERY {
-               gy := NewBIGints(CURVE_Gy)
-               G = NewECPbigs(gx, gy)
-       } else {
-               G = NewECPbig(gx)
-       }
-
-       r := NewBIGints(CURVE_Order)
-
-       if RNG == nil {
-               s = fromBytes(S)
-       } else {
-               s = randomnum(r, RNG)
-
-               s.toBytes(T[:])
-               for i := 0; i < ECDH_EGS; i++ {
-                       S[i] = T[i]
-               }
-       }
-
-       WP := G.mul(s)
-
-       WP.toBytes(W)
-
-       return res
-}
-
-/* validate public key. Set full=true for fuller check */
-func ECDH_PUBLIC_KEY_VALIDATE(full bool, W []byte) int {
-       WP := ECP_fromBytes(W)
-       res := 0
-
-       r := NewBIGints(CURVE_Order)
-
-       if WP.is_infinity() {
-               res = ECDH_INVALID_PUBLIC_KEY
-       }
-       if res == 0 && full {
-               WP = WP.mul(r)
-               if !WP.is_infinity() {
-                       res = ECDH_INVALID_PUBLIC_KEY
-               }
-       }
-       return res
-}
-
-/* IEEE-1363 Diffie-Hellman online calculation Z=S.WD */
-func ECPSVDP_DH(S []byte, WD []byte, Z []byte) int {
-       res := 0
-       var T [ECDH_EFS]byte
-
-       s := fromBytes(S)
-
-       W := ECP_fromBytes(WD)
-       if W.is_infinity() {
-               res = ECDH_ERROR
-       }
-
-       if res == 0 {
-               r := NewBIGints(CURVE_Order)
-               s.mod(r)
-               W = W.mul(s)
-               if W.is_infinity() {
-                       res = ECDH_ERROR
-               } else {
-                       W.getX().toBytes(T[:])
-                       for i := 0; i < ECDH_EFS; i++ {
-                               Z[i] = T[i]
-                       }
-               }
-       }
-       return res
-}
-
-/* IEEE ECDSA Signature, C and D are signature on F using private key S */
-func ECPSP_DSA(RNG *RAND, S []byte, F []byte, C []byte, D []byte) int {
-       var T [ECDH_EFS]byte
-
-       H := NewHASH()
-       H.Process_array(F)
-       B := H.Hash()
-
-       gx := NewBIGints(CURVE_Gx)
-       gy := NewBIGints(CURVE_Gy)
-
-       G := NewECPbigs(gx, gy)
-       r := NewBIGints(CURVE_Order)
-
-       s := fromBytes(S)
-       f := fromBytes(B[:])
-
-       c := NewBIGint(0)
-       d := NewBIGint(0)
-       V := NewECP()
-
-       for d.iszilch() {
-               u := randomnum(r, RNG)
-
-               V.copy(G)
-               V = V.mul(u)
-               vx := V.getX()
-               c.copy(vx)
-               c.mod(r)
-               if c.iszilch() {
-                       continue
-               }
-               u.invmodp(r)
-               d.copy(modmul(s, c, r))
-               d.add(f)
-               d.copy(modmul(u, d, r))
-       }
-
-       c.toBytes(T[:])
-       for i := 0; i < ECDH_EFS; i++ {
-               C[i] = T[i]
-       }
-       d.toBytes(T[:])
-       for i := 0; i < ECDH_EFS; i++ {
-               D[i] = T[i]
-       }
-       return 0
-}
-
-/* IEEE1363 ECDSA Signature Verification. Signature C and D on F is verified 
using public key W */
-func ECPVP_DSA(W []byte, F []byte, C []byte, D []byte) int {
-       res := 0
-
-       H := NewHASH()
-       H.Process_array(F)
-       B := H.Hash()
-
-       gx := NewBIGints(CURVE_Gx)
-       gy := NewBIGints(CURVE_Gy)
-
-       G := NewECPbigs(gx, gy)
-       r := NewBIGints(CURVE_Order)
-
-       c := fromBytes(C)
-       d := fromBytes(D)
-       f := fromBytes(B[:])
-
-       if c.iszilch() || comp(c, r) >= 0 || d.iszilch() || comp(d, r) >= 0 {
-               res = ECDH_INVALID
-       }
-
-       if res == 0 {
-               d.invmodp(r)
-               f.copy(modmul(f, d, r))
-               h2 := modmul(c, d, r)
-
-               WP := ECP_fromBytes(W)
-               if WP.is_infinity() {
-                       res = ECDH_ERROR
-               } else {
-                       P := NewECP()
-                       P.copy(WP)
-
-                       P = P.mul2(h2, G, f)
-
-                       if P.is_infinity() {
-                               res = ECDH_INVALID
-                       } else {
-                               d = P.getX()
-                               d.mod(r)
-
-                               if comp(d, c) != 0 {
-                                       res = ECDH_INVALID
-                               }
-                       }
-               }
-       }
-
-       return res
-}
-
-/* IEEE1363 ECIES encryption. Encryption of plaintext M uses public key W and 
produces ciphertext V,C,T */
-func ECIES_ENCRYPT(P1 []byte, P2 []byte, RNG *RAND, W []byte, M []byte, V 
[]byte, T []byte) []byte {
-       var Z [ECDH_EFS]byte
-       var VZ [3*ECDH_EFS + 1]byte
-       var K1 [ECDH_EAS]byte
-       var K2 [ECDH_EAS]byte
-       var U [ECDH_EGS]byte
-
-       if ECDH_KEY_PAIR_GENERATE(RNG, U[:], V) != 0 {
-               return nil
-       }
-       if ECPSVDP_DH(U[:], W, Z[:]) != 0 {
-               return nil
-       }
-
-       for i := 0; i < 2*ECDH_EFS+1; i++ {
-               VZ[i] = V[i]
-       }
-       for i := 0; i < ECDH_EFS; i++ {
-               VZ[2*ECDH_EFS+1+i] = Z[i]
-       }
-
-       K := KDF2(VZ[:], P1, ECDH_EFS)
-
-       for i := 0; i < ECDH_EAS; i++ {
-               K1[i] = K[i]
-               K2[i] = K[ECDH_EAS+i]
-       }
-
-       C := AES_CBC_IV0_ENCRYPT(K1[:], M)
-
-       L2 := inttoBytes(len(P2), 8)
-
-       var AC []byte
-
-       for i := 0; i < len(C); i++ {
-               AC = append(AC, C[i])
-       }
-       for i := 0; i < len(P2); i++ {
-               AC = append(AC, P2[i])
-       }
-       for i := 0; i < 8; i++ {
-               AC = append(AC, L2[i])
-       }
-
-       HMAC(AC, K2[:], T)
-
-       return C
-}
-
-/* IEEE1363 ECIES decryption. Decryption of ciphertext V,C,T using private key 
U outputs plaintext M */
-func ECIES_DECRYPT(P1 []byte, P2 []byte, V []byte, C []byte, T []byte, U 
[]byte) []byte {
-       var Z [ECDH_EFS]byte
-       var VZ [3*ECDH_EFS + 1]byte
-       var K1 [ECDH_EAS]byte
-       var K2 [ECDH_EAS]byte
-
-       var TAG []byte = T[:]
-
-       if ECPSVDP_DH(U, V, Z[:]) != 0 {
-               return nil
-       }
-
-       for i := 0; i < 2*ECDH_EFS+1; i++ {
-               VZ[i] = V[i]
-       }
-       for i := 0; i < ECDH_EFS; i++ {
-               VZ[2*ECDH_EFS+1+i] = Z[i]
-       }
-
-       K := KDF2(VZ[:], P1, ECDH_EFS)
-
-       for i := 0; i < ECDH_EAS; i++ {
-               K1[i] = K[i]
-               K2[i] = K[ECDH_EAS+i]
-       }
-
-       M := AES_CBC_IV0_DECRYPT(K1[:], C)
-
-       if M == nil {
-               return nil
-       }
-
-       L2 := inttoBytes(len(P2), 8)
-
-       var AC []byte
-
-       for i := 0; i < len(C); i++ {
-               AC = append(AC, C[i])
-       }
-       for i := 0; i < len(P2); i++ {
-               AC = append(AC, P2[i])
-       }
-       for i := 0; i < 8; i++ {
-               AC = append(AC, L2[i])
-       }
-
-       HMAC(AC, K2[:], TAG)
-
-       same := true
-       for i := 0; i < len(T); i++ {
-               if T[i] != TAG[i] {
-                       same = false
-               }
-       }
-       if !same {
-               return nil
-       }
-
-       return M
-}
-
-func ECDH_printBinary(array []byte) {
-       for i := 0; i < len(array); i++ {
-               fmt.Printf("%02x", array[i])
-       }
-       fmt.Printf("\n")
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/ECP.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/ECP.go 
b/go/src/github.com/miracl/amcl-go/ECP.go
deleted file mode 100644
index 3ed1d04..0000000
--- a/go/src/github.com/miracl/amcl-go/ECP.go
+++ /dev/null
@@ -1,1076 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package amcl
-
-//import "fmt"
-
-/* Elliptic Curve Point Structure */
-
-type ECP struct {
-       x   *FP
-       y   *FP
-       z   *FP
-       INF bool
-}
-
-/* Constructors */
-func NewECP() *ECP {
-       E := new(ECP)
-       E.x = NewFPint(0)
-       E.y = NewFPint(0)
-       E.z = NewFPint(0)
-       E.INF = true
-       return E
-}
-
-/* set (x,y) from two BIGs */
-func NewECPbigs(ix *BIG, iy *BIG) *ECP {
-       E := new(ECP)
-       E.x = NewFPbig(ix)
-       E.y = NewFPbig(iy)
-       E.z = NewFPint(1)
-       rhs := RHS(E.x)
-
-       if CURVETYPE == MONTGOMERY {
-               if rhs.jacobi() == 1 {
-                       E.INF = false
-               } else {
-                       E.inf()
-               }
-       } else {
-               y2 := NewFPcopy(E.y)
-               y2.sqr()
-               if y2.equals(rhs) {
-                       E.INF = false
-               } else {
-                       E.inf()
-               }
-       }
-       return E
-}
-
-/* set (x,y) from BIG and a bit */
-func NewECPbigint(ix *BIG, s int) *ECP {
-       E := new(ECP)
-       E.x = NewFPbig(ix)
-       E.y = NewFPint(0)
-       rhs := RHS(E.x)
-       E.z = NewFPint(1)
-       if rhs.jacobi() == 1 {
-               ny := rhs.sqrt()
-               if ny.redc().parity() != s {
-                       ny.neg()
-               }
-               E.y.copy(ny)
-               E.INF = false
-       } else {
-               E.inf()
-       }
-       return E
-}
-
-/* set from x - calculate y from curve equation */
-func NewECPbig(ix *BIG) *ECP {
-       E := new(ECP)
-       E.x = NewFPbig(ix)
-       E.y = NewFPint(0)
-       rhs := RHS(E.x)
-       E.z = NewFPint(1)
-       if rhs.jacobi() == 1 {
-               if CURVETYPE != MONTGOMERY {
-                       E.y.copy(rhs.sqrt())
-               }
-               E.INF = false
-       } else {
-               E.INF = true
-       }
-       return E
-}
-
-/* test for O point-at-infinity */
-func (E *ECP) is_infinity() bool {
-       if CURVETYPE == EDWARDS {
-               E.x.reduce()
-               E.y.reduce()
-               E.z.reduce()
-               return (E.x.iszilch() && E.y.equals(E.z))
-       } else {
-               return E.INF
-       }
-}
-
-/* Conditional swap of P and Q dependant on d */
-func (E *ECP) cswap(Q *ECP, d int32) {
-       E.x.cswap(Q.x, d)
-       if CURVETYPE != MONTGOMERY {
-               E.y.cswap(Q.y, d)
-       }
-       E.z.cswap(Q.z, d)
-       if CURVETYPE != EDWARDS {
-               bd := true
-               if d == 0 {
-                       bd = false
-               }
-               bd = bd && (E.INF != Q.INF)
-               E.INF = (bd != E.INF)
-               Q.INF = (bd != Q.INF)
-       }
-}
-
-/* Conditional move of Q to P dependant on d */
-func (E *ECP) cmove(Q *ECP, d int32) {
-       E.x.cmove(Q.x, d)
-       if CURVETYPE != MONTGOMERY {
-               E.y.cmove(Q.y, d)
-       }
-       E.z.cmove(Q.z, d)
-       if CURVETYPE != EDWARDS {
-               bd := true
-               if d == 0 {
-                       bd = false
-               }
-               E.INF = (E.INF != ((E.INF != Q.INF) && bd))
-       }
-}
-
-/* return 1 if b==c, no branching */
-func teq(b int32, c int32) int32 {
-       x := b ^ c
-       x -= 1 // if x=0, x now -1
-       return ((x >> 31) & 1)
-}
-
-/* this=P */
-func (E *ECP) copy(P *ECP) {
-       E.x.copy(P.x)
-       if CURVETYPE != MONTGOMERY {
-               E.y.copy(P.y)
-       }
-       E.z.copy(P.z)
-       E.INF = P.INF
-}
-
-/* this=-this */
-func (E *ECP) neg() {
-       if E.is_infinity() {
-               return
-       }
-       if CURVETYPE == WEIERSTRASS {
-               E.y.neg()
-               E.y.reduce()
-       }
-       if CURVETYPE == EDWARDS {
-               E.x.neg()
-               E.x.reduce()
-       }
-       return
-}
-
-/* Constant time select from pre-computed table */
-func (E *ECP) selector(W []*ECP, b int32) {
-       MP := NewECP()
-       m := b >> 31
-       babs := (b ^ m) - m
-
-       babs = (babs - 1) / 2
-
-       E.cmove(W[0], teq(babs, 0)) // conditional move
-       E.cmove(W[1], teq(babs, 1))
-       E.cmove(W[2], teq(babs, 2))
-       E.cmove(W[3], teq(babs, 3))
-       E.cmove(W[4], teq(babs, 4))
-       E.cmove(W[5], teq(babs, 5))
-       E.cmove(W[6], teq(babs, 6))
-       E.cmove(W[7], teq(babs, 7))
-
-       MP.copy(E)
-       MP.neg()
-       E.cmove(MP, (m & 1))
-}
-
-/* set this=O */
-func (E *ECP) inf() {
-       E.INF = true
-       E.x.zero()
-       E.y.one()
-       E.z.one()
-}
-
-/* Test P == Q */
-func (E *ECP) equals(Q *ECP) bool {
-       if E.is_infinity() && Q.is_infinity() {
-               return true
-       }
-       if E.is_infinity() || Q.is_infinity() {
-               return false
-       }
-       if CURVETYPE == WEIERSTRASS {
-               zs2 := NewFPcopy(E.z)
-               zs2.sqr()
-               zo2 := NewFPcopy(Q.z)
-               zo2.sqr()
-               zs3 := NewFPcopy(zs2)
-               zs3.mul(E.z)
-               zo3 := NewFPcopy(zo2)
-               zo3.mul(Q.z)
-               zs2.mul(Q.x)
-               zo2.mul(E.x)
-               if !zs2.equals(zo2) {
-                       return false
-               }
-               zs3.mul(Q.y)
-               zo3.mul(E.y)
-               if !zs3.equals(zo3) {
-                       return false
-               }
-       } else {
-               a := NewFPint(0)
-               b := NewFPint(0)
-               a.copy(E.x)
-               a.mul(Q.z)
-               a.reduce()
-               b.copy(Q.x)
-               b.mul(E.z)
-               b.reduce()
-               if !a.equals(b) {
-                       return false
-               }
-               if CURVETYPE == EDWARDS {
-                       a.copy(E.y)
-                       a.mul(Q.z)
-                       a.reduce()
-                       b.copy(Q.y)
-                       b.mul(E.z)
-                       b.reduce()
-                       if !a.equals(b) {
-                               return false
-                       }
-               }
-       }
-       return true
-}
-
-/* Calculate RHS of curve equation */
-func RHS(x *FP) *FP {
-       x.norm()
-       r := NewFPcopy(x)
-       r.sqr()
-
-       if CURVETYPE == WEIERSTRASS { // x^3+Ax+B
-               b := NewFPbig(NewBIGints(CURVE_B))
-               r.mul(x)
-               if CURVE_A == -3 {
-                       cx := NewFPcopy(x)
-                       cx.imul(3)
-                       cx.neg()
-                       cx.norm()
-                       r.add(cx)
-               }
-               r.add(b)
-       }
-       if CURVETYPE == EDWARDS { // (Ax^2-1)/(Bx^2-1)
-               b := NewFPbig(NewBIGints(CURVE_B))
-
-               one := NewFPint(1)
-               b.mul(r)
-               b.sub(one)
-               if CURVE_A == -1 {
-                       r.neg()
-               }
-               r.sub(one)
-               b.inverse()
-               r.mul(b)
-       }
-       if CURVETYPE == MONTGOMERY { // x^3+Ax^2+x
-               x3 := NewFPint(0)
-               x3.copy(r)
-               x3.mul(x)
-               r.imul(CURVE_A)
-               r.add(x3)
-               r.add(x)
-       }
-       r.reduce()
-       return r
-}
-
-/* set to affine - from (x,y,z) to (x,y) */
-func (E *ECP) affine() {
-       if E.is_infinity() {
-               return
-       }
-       one := NewFPint(1)
-       if E.z.equals(one) {
-               return
-       }
-       E.z.inverse()
-       if CURVETYPE == WEIERSTRASS {
-               z2 := NewFPcopy(E.z)
-               z2.sqr()
-               E.x.mul(z2)
-               E.x.reduce()
-               E.y.mul(z2)
-               E.y.mul(E.z)
-               E.y.reduce()
-       }
-       if CURVETYPE == EDWARDS {
-               E.x.mul(E.z)
-               E.x.reduce()
-               E.y.mul(E.z)
-               E.y.reduce()
-       }
-       if CURVETYPE == MONTGOMERY {
-               E.x.mul(E.z)
-               E.x.reduce()
-       }
-       E.z.one()
-}
-
-/* extract x as a BIG */
-func (E *ECP) getX() *BIG {
-       E.affine()
-       return E.x.redc()
-}
-
-/* extract y as a BIG */
-func (E *ECP) getY() *BIG {
-       E.affine()
-       return E.y.redc()
-}
-
-/* get sign of Y */
-func (E *ECP) getS() int {
-       E.affine()
-       y := E.getY()
-       return y.parity()
-}
-
-/* extract x as an FP */
-func (E *ECP) getx() *FP {
-       return E.x
-}
-
-/* extract y as an FP */
-func (E *ECP) gety() *FP {
-       return E.y
-}
-
-/* extract z as an FP */
-func (E *ECP) getz() *FP {
-       return E.z
-}
-
-/* convert to byte array */
-func (E *ECP) toBytes(b []byte) {
-       var t [int(MODBYTES)]byte
-       MB := int(MODBYTES)
-       if CURVETYPE != MONTGOMERY {
-               b[0] = 0x04
-       } else {
-               b[0] = 0x02
-       }
-
-       E.affine()
-       E.x.redc().toBytes(t[:])
-       for i := 0; i < MB; i++ {
-               b[i+1] = t[i]
-       }
-       if CURVETYPE != MONTGOMERY {
-               E.y.redc().toBytes(t[:])
-               for i := 0; i < MB; i++ {
-                       b[i+MB+1] = t[i]
-               }
-       }
-}
-
-/* convert from byte array to point */
-func ECP_fromBytes(b []byte) *ECP {
-       var t [int(MODBYTES)]byte
-       MB := int(MODBYTES)
-       p := NewBIGints(Modulus)
-
-       for i := 0; i < MB; i++ {
-               t[i] = b[i+1]
-       }
-       px := fromBytes(t[:])
-       if comp(px, p) >= 0 {
-               return NewECP()
-       }
-
-       if b[0] == 0x04 {
-               for i := 0; i < MB; i++ {
-                       t[i] = b[i+MB+1]
-               }
-               py := fromBytes(t[:])
-               if comp(py, p) >= 0 {
-                       return NewECP()
-               }
-               return NewECPbigs(px, py)
-       } else {
-               return NewECPbig(px)
-       }
-}
-
-/* convert to hex string */
-func (E *ECP) toString() string {
-       if E.is_infinity() {
-               return "infinity"
-       }
-       E.affine()
-       if CURVETYPE == MONTGOMERY {
-               return "(" + E.x.redc().toString() + ")"
-       } else {
-               return "(" + E.x.redc().toString() + "," + 
E.y.redc().toString() + ")"
-       }
-}
-
-/* this*=2 */
-func (E *ECP) dbl() {
-       if CURVETYPE == WEIERSTRASS {
-               if E.INF {
-                       return
-               }
-               if E.y.iszilch() {
-                       E.inf()
-                       return
-               }
-
-               w1 := NewFPcopy(E.x)
-               w6 := NewFPcopy(E.z)
-               w2 := NewFPint(0)
-               w3 := NewFPcopy(E.x)
-               w8 := NewFPcopy(E.x)
-
-               if CURVE_A == -3 {
-                       w6.sqr()
-                       w1.copy(w6)
-                       w1.neg()
-                       w3.add(w1)
-
-                       w8.add(w6)
-
-                       w3.mul(w8)
-                       w8.copy(w3)
-                       w8.imul(3)
-               } else {
-                       w1.sqr()
-                       w8.copy(w1)
-                       w8.imul(3)
-               }
-
-               w2.copy(E.y)
-               w2.sqr()
-               w3.copy(E.x)
-               w3.mul(w2)
-               w3.imul(4)
-               w1.copy(w3)
-               w1.neg()
-               //              w1.norm();
-
-               E.x.copy(w8)
-               E.x.sqr()
-               E.x.add(w1)
-               E.x.add(w1)
-               //              x.reduce();
-               E.x.norm()
-
-               E.z.mul(E.y)
-               E.z.add(E.z)
-
-               w2.add(w2)
-               w2.sqr()
-               w2.add(w2)
-               w3.sub(E.x)
-               E.y.copy(w8)
-               E.y.mul(w3)
-               //              w2.norm();
-               E.y.sub(w2)
-               //              y.reduce();
-               //              z.reduce();
-               E.y.norm()
-               E.z.norm()
-
-       }
-       if CURVETYPE == EDWARDS {
-               C := NewFPcopy(E.x)
-               D := NewFPcopy(E.y)
-               H := NewFPcopy(E.z)
-               J := NewFPint(0)
-
-               E.x.mul(E.y)
-               E.x.add(E.x)
-               C.sqr()
-               D.sqr()
-               if CURVE_A == -1 {
-                       C.neg()
-               }
-               E.y.copy(C)
-               E.y.add(D)
-               //              y.norm();
-               H.sqr()
-               H.add(H)
-               E.z.copy(E.y)
-               J.copy(E.y)
-               J.sub(H)
-               E.x.mul(J)
-               C.sub(D)
-               E.y.mul(C)
-               E.z.mul(J)
-
-               E.x.norm()
-               E.y.norm()
-               E.z.norm()
-       }
-       if CURVETYPE == MONTGOMERY {
-               A := NewFPcopy(E.x)
-               B := NewFPcopy(E.x)
-               AA := NewFPint(0)
-               BB := NewFPint(0)
-               C := NewFPint(0)
-
-               if E.INF {
-                       return
-               }
-
-               A.add(E.z)
-               AA.copy(A)
-               AA.sqr()
-               B.sub(E.z)
-               BB.copy(B)
-               BB.sqr()
-               C.copy(AA)
-               C.sub(BB)
-               //              C.norm();
-
-               E.x.copy(AA)
-               E.x.mul(BB)
-
-               A.copy(C)
-               A.imul((CURVE_A + 2) / 4)
-
-               BB.add(A)
-               E.z.copy(BB)
-               E.z.mul(C)
-               //              x.reduce();
-               //              z.reduce();
-               E.x.norm()
-               E.z.norm()
-       }
-       return
-}
-
-/* this+=Q */
-func (E *ECP) add(Q *ECP) {
-       if CURVETYPE == WEIERSTRASS {
-               if E.INF {
-                       E.copy(Q)
-                       return
-               }
-               if Q.INF {
-                       return
-               }
-
-               aff := false
-
-               one := NewFPint(1)
-               if Q.z.equals(one) {
-                       aff = true
-               }
-
-               var A, C *FP
-               B := NewFPcopy(E.z)
-               D := NewFPcopy(E.z)
-               if !aff {
-                       A = NewFPcopy(Q.z)
-                       C = NewFPcopy(Q.z)
-
-                       A.sqr()
-                       B.sqr()
-                       C.mul(A)
-                       D.mul(B)
-
-                       A.mul(E.x)
-                       C.mul(E.y)
-               } else {
-                       A = NewFPcopy(E.x)
-                       C = NewFPcopy(E.y)
-
-                       B.sqr()
-                       D.mul(B)
-               }
-
-               B.mul(Q.x)
-               B.sub(A)
-               D.mul(Q.y)
-               D.sub(C)
-
-               if B.iszilch() {
-                       if D.iszilch() {
-                               E.dbl()
-                               return
-                       } else {
-                               E.INF = true
-                               return
-                       }
-               }
-
-               if !aff {
-                       E.z.mul(Q.z)
-               }
-               E.z.mul(B)
-
-               e := NewFPcopy(B)
-               e.sqr()
-               B.mul(e)
-               A.mul(e)
-
-               e.copy(A)
-               e.add(A)
-               e.add(B)
-               E.x.copy(D)
-               E.x.sqr()
-               E.x.sub(e)
-
-               A.sub(E.x)
-               E.y.copy(A)
-               E.y.mul(D)
-               C.mul(B)
-               E.y.sub(C)
-
-               //      x.reduce();
-               //      y.reduce();
-               //      z.reduce();
-               E.x.norm()
-               E.y.norm()
-               E.z.norm()
-       }
-       if CURVETYPE == EDWARDS {
-               b := NewFPbig(NewBIGints(CURVE_B))
-               A := NewFPcopy(E.z)
-               B := NewFPint(0)
-               C := NewFPcopy(E.x)
-               D := NewFPcopy(E.y)
-               EE := NewFPint(0)
-               F := NewFPint(0)
-               G := NewFPint(0)
-               //H:=NewFPint(0)
-               //I:=NewFPint(0)
-
-               A.mul(Q.z)
-               B.copy(A)
-               B.sqr()
-               C.mul(Q.x)
-               D.mul(Q.y)
-
-               EE.copy(C)
-               EE.mul(D)
-               EE.mul(b)
-               F.copy(B)
-               F.sub(EE)
-               G.copy(B)
-               G.add(EE)
-               C.add(D)
-
-               if CURVE_A == 1 {
-                       EE.copy(D)
-                       D.sub(C)
-               }
-
-               B.copy(E.x)
-               B.add(E.y)
-               D.copy(Q.x)
-               D.add(Q.y)
-               B.mul(D)
-               B.sub(C)
-               B.mul(F)
-               E.x.copy(A)
-               E.x.mul(B)
-
-               if CURVE_A == 1 {
-                       C.copy(EE)
-                       C.mul(G)
-               }
-               if CURVE_A == -1 {
-                       C.mul(G)
-               }
-               E.y.copy(A)
-               E.y.mul(C)
-               E.z.copy(F)
-               E.z.mul(G)
-               //      x.reduce(); y.reduce(); z.reduce();
-               E.x.norm()
-               E.y.norm()
-               E.z.norm()
-       }
-       return
-}
-
-/* Differential Add for Montgomery curves. this+=Q where W is this-Q and is 
affine. */
-func (E *ECP) dadd(Q *ECP, W *ECP) {
-       A := NewFPcopy(E.x)
-       B := NewFPcopy(E.x)
-       C := NewFPcopy(Q.x)
-       D := NewFPcopy(Q.x)
-       DA := NewFPint(0)
-       CB := NewFPint(0)
-
-       A.add(E.z)
-       B.sub(E.z)
-
-       C.add(Q.z)
-       D.sub(Q.z)
-
-       DA.copy(D)
-       DA.mul(A)
-       CB.copy(C)
-       CB.mul(B)
-
-       A.copy(DA)
-       A.add(CB)
-       A.sqr()
-       B.copy(DA)
-       B.sub(CB)
-       B.sqr()
-
-       E.x.copy(A)
-       E.z.copy(W.x)
-       E.z.mul(B)
-
-       if E.z.iszilch() {
-               E.inf()
-       } else {
-               E.INF = false
-       }
-
-       //      x.reduce();
-       E.x.norm()
-}
-
-/* this-=Q */
-func (E *ECP) sub(Q *ECP) {
-       Q.neg()
-       E.add(Q)
-       Q.neg()
-}
-
-func multiaffine(m int, P []*ECP) {
-       t1 := NewFPint(0)
-       t2 := NewFPint(0)
-
-       var work []*FP
-
-       for i := 0; i < m; i++ {
-               work = append(work, NewFPint(0))
-       }
-
-       work[0].one()
-       work[1].copy(P[0].z)
-
-       for i := 2; i < m; i++ {
-               work[i].copy(work[i-1])
-               work[i].mul(P[i-1].z)
-       }
-
-       t1.copy(work[m-1])
-       t1.mul(P[m-1].z)
-       t1.inverse()
-       t2.copy(P[m-1].z)
-       work[m-1].mul(t1)
-
-       for i := m - 2; ; i-- {
-               if i == 0 {
-                       work[0].copy(t1)
-                       work[0].mul(t2)
-                       break
-               }
-               work[i].mul(t2)
-               work[i].mul(t1)
-               t2.mul(P[i].z)
-       }
-       /* now work[] contains inverses of all Z coordinates */
-
-       for i := 0; i < m; i++ {
-               P[i].z.one()
-               t1.copy(work[i])
-               t1.sqr()
-               P[i].x.mul(t1)
-               t1.mul(work[i])
-               P[i].y.mul(t1)
-       }
-}
-
-/* constant time multiply by small integer of length bts - use ladder */
-func (E *ECP) pinmul(e int32, bts int32) *ECP {
-       if CURVETYPE == MONTGOMERY {
-               return E.mul(NewBIGint(int(e)))
-       } else {
-               P := NewECP()
-               R0 := NewECP()
-               R1 := NewECP()
-               R1.copy(E)
-
-               for i := bts - 1; i >= 0; i-- {
-                       b := (e >> uint32(i)) & 1
-                       P.copy(R1)
-                       P.add(R0)
-                       R0.cswap(R1, b)
-                       R1.copy(P)
-                       R0.dbl()
-                       R0.cswap(R1, b)
-               }
-               P.copy(R0)
-               P.affine()
-               return P
-       }
-}
-
-/* return e.this */
-
-func (E *ECP) mul(e *BIG) *ECP {
-       if e.iszilch() || E.is_infinity() {
-               return NewECP()
-       }
-       P := NewECP()
-       if CURVETYPE == MONTGOMERY {
-               /* use Ladder */
-               D := NewECP()
-               R0 := NewECP()
-               R0.copy(E)
-               R1 := NewECP()
-               R1.copy(E)
-               R1.dbl()
-               D.copy(E)
-               D.affine()
-               nb := e.nbits()
-               for i := nb - 2; i >= 0; i-- {
-                       b := int32(e.bit(i))
-                       P.copy(R1)
-                       P.dadd(R0, D)
-                       R0.cswap(R1, b)
-                       R1.copy(P)
-                       R0.dbl()
-                       R0.cswap(R1, b)
-               }
-               P.copy(R0)
-       } else {
-               // fixed size windows
-               mt := NewBIG()
-               t := NewBIG()
-               Q := NewECP()
-               C := NewECP()
-
-               var W []*ECP
-               var w [1 + (NLEN*int(BASEBITS)+3)/4]int8
-
-               E.affine()
-
-               Q.copy(E)
-               Q.dbl()
-
-               W = append(W, NewECP())
-               W[0].copy(E)
-
-               for i := 1; i < 8; i++ {
-                       W = append(W, NewECP())
-                       W[i].copy(W[i-1])
-                       W[i].add(Q)
-               }
-
-               // convert the table to affine
-               if CURVETYPE == WEIERSTRASS {
-                       multiaffine(8, W[:])
-               }
-
-               // make exponent odd - add 2P if even, P if odd
-               t.copy(e)
-               s := int32(t.parity())
-               t.inc(1)
-               t.norm()
-               ns := int32(t.parity())
-               mt.copy(t)
-               mt.inc(1)
-               mt.norm()
-               t.cmove(mt, s)
-               Q.cmove(E, ns)
-               C.copy(Q)
-
-               nb := 1 + (t.nbits()+3)/4
-
-               // convert exponent to signed 4-bit window
-               for i := 0; i < nb; i++ {
-                       w[i] = int8(t.lastbits(5) - 16)
-                       t.dec(int(w[i]))
-                       t.norm()
-                       t.fshr(4)
-               }
-               w[nb] = int8(t.lastbits(5))
-
-               P.copy(W[(int(w[nb])-1)/2])
-               for i := nb - 1; i >= 0; i-- {
-                       Q.selector(W, int32(w[i]))
-                       P.dbl()
-                       P.dbl()
-                       P.dbl()
-                       P.dbl()
-                       P.add(Q)
-               }
-               P.sub(C) /* apply correction */
-       }
-       P.affine()
-       return P
-}
-
-/* Return e.this+f.Q */
-
-func (E *ECP) mul2(e *BIG, Q *ECP, f *BIG) *ECP {
-       te := NewBIG()
-       tf := NewBIG()
-       mt := NewBIG()
-       S := NewECP()
-       T := NewECP()
-       C := NewECP()
-       var W []*ECP
-       //ECP[] W=new ECP[8];
-       var w [1 + (NLEN*int(BASEBITS)+1)/2]int8
-
-       E.affine()
-       Q.affine()
-
-       te.copy(e)
-       tf.copy(f)
-
-       // precompute table
-       for i := 0; i < 8; i++ {
-               W = append(W, NewECP())
-       }
-       W[1].copy(E)
-       W[1].sub(Q)
-       W[2].copy(E)
-       W[2].add(Q)
-       S.copy(Q)
-       S.dbl()
-       W[0].copy(W[1])
-       W[0].sub(S)
-       W[3].copy(W[2])
-       W[3].add(S)
-       T.copy(E)
-       T.dbl()
-       W[5].copy(W[1])
-       W[5].add(T)
-       W[6].copy(W[2])
-       W[6].add(T)
-       W[4].copy(W[5])
-       W[4].sub(S)
-       W[7].copy(W[6])
-       W[7].add(S)
-
-       // convert the table to affine
-       if CURVETYPE == WEIERSTRASS {
-               multiaffine(8, W)
-       }
-
-       // if multiplier is odd, add 2, else add 1 to multiplier, and add 2P or 
P to correction
-
-       s := int32(te.parity())
-       te.inc(1)
-       te.norm()
-       ns := int32(te.parity())
-       mt.copy(te)
-       mt.inc(1)
-       mt.norm()
-       te.cmove(mt, s)
-       T.cmove(E, ns)
-       C.copy(T)
-
-       s = int32(tf.parity())
-       tf.inc(1)
-       tf.norm()
-       ns = int32(tf.parity())
-       mt.copy(tf)
-       mt.inc(1)
-       mt.norm()
-       tf.cmove(mt, s)
-       S.cmove(Q, ns)
-       C.add(S)
-
-       mt.copy(te)
-       mt.add(tf)
-       mt.norm()
-       nb := 1 + (mt.nbits()+1)/2
-
-       // convert exponent to signed 2-bit window
-       for i := 0; i < nb; i++ {
-               a := (te.lastbits(3) - 4)
-               te.dec(int(a))
-               te.norm()
-               te.fshr(2)
-               b := (tf.lastbits(3) - 4)
-               tf.dec(int(b))
-               tf.norm()
-               tf.fshr(2)
-               w[i] = int8(4*a + b)
-       }
-       w[nb] = int8(4*te.lastbits(3) + tf.lastbits(3))
-       S.copy(W[(w[nb]-1)/2])
-
-       for i := nb - 1; i >= 0; i-- {
-               T.selector(W, int32(w[i]))
-               S.dbl()
-               S.dbl()
-               S.add(T)
-       }
-       S.sub(C) /* apply correction */
-       S.affine()
-       return S
-}
-
-/*
-func main() {
-       Gx:=NewBIGints(CURVE_Gx);
-       var Gy *BIG
-       var P *ECP
-
-       if CURVETYPE!=MONTGOMERY {Gy=NewBIGints(CURVE_Gy)}
-       r:=NewBIGints(CURVE_Order)
-
-       //r.dec(7);
-
-       fmt.Printf("Gx= "+Gx.toString())
-       fmt.Printf("\n")
-
-       if CURVETYPE!=MONTGOMERY {
-               fmt.Printf("Gy= "+Gy.toString())
-               fmt.Printf("\n")
-       }
-
-       if CURVETYPE!=MONTGOMERY {
-               P=NewECPbigs(Gx,Gy)
-       } else  {P=NewECPbig(Gx)}
-
-       fmt.Printf("P= "+P.toString());
-       fmt.Printf("\n")
-
-       R:=P.mul(r);
-               //for (int i=0;i<10000;i++)
-               //      R=P.mul(r);
-
-       fmt.Printf("R= "+R.toString())
-       fmt.Printf("\n")
-}
-*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/ECP2.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/ECP2.go 
b/go/src/github.com/miracl/amcl-go/ECP2.go
deleted file mode 100644
index 6770378..0000000
--- a/go/src/github.com/miracl/amcl-go/ECP2.go
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* AMCL Weierstrass elliptic curve functions over FP2 */
-
-package amcl
-
-//import "fmt"
-
-type ECP2 struct {
-       x   *FP2
-       y   *FP2
-       z   *FP2
-       INF bool
-}
-
-func NewECP2() *ECP2 {
-       E := new(ECP2)
-       E.x = NewFP2int(0)
-       E.y = NewFP2int(1)
-       E.z = NewFP2int(1)
-       E.INF = true
-       return E
-}
-
-/* Test this=O? */
-func (E *ECP2) is_infinity() bool {
-       return E.INF
-}
-
-/* copy this=P */
-func (E *ECP2) copy(P *ECP2) {
-       E.x.copy(P.x)
-       E.y.copy(P.y)
-       E.z.copy(P.z)
-       E.INF = P.INF
-}
-
-/* set this=O */
-func (E *ECP2) inf() {
-       E.INF = true
-       E.x.zero()
-       E.y.zero()
-       E.z.zero()
-}
-
-/* set this=-this */
-func (E *ECP2) neg() {
-       if E.is_infinity() {
-               return
-       }
-       E.y.neg()
-       E.y.reduce()
-}
-
-/* Conditional move of Q to P dependant on d */
-func (E *ECP2) cmove(Q *ECP2, d int32) {
-       E.x.cmove(Q.x, d)
-       E.y.cmove(Q.y, d)
-       E.z.cmove(Q.z, d)
-
-       var bd bool
-       if d == 0 {
-               bd = false
-       } else {
-               bd = true
-       }
-       E.INF = (E.INF != (E.INF != Q.INF) && bd)
-}
-
-/* Constant time select from pre-computed table */
-func (E *ECP2) selector(W []*ECP2, b int32) {
-       MP := NewECP2()
-       m := b >> 31
-       babs := (b ^ m) - m
-
-       babs = (babs - 1) / 2
-
-       E.cmove(W[0], teq(babs, 0)) // conditional move
-       E.cmove(W[1], teq(babs, 1))
-       E.cmove(W[2], teq(babs, 2))
-       E.cmove(W[3], teq(babs, 3))
-       E.cmove(W[4], teq(babs, 4))
-       E.cmove(W[5], teq(babs, 5))
-       E.cmove(W[6], teq(babs, 6))
-       E.cmove(W[7], teq(babs, 7))
-
-       MP.copy(E)
-       MP.neg()
-       E.cmove(MP, (m & 1))
-}
-
-/* Test if P == Q */
-func (E *ECP2) equals(Q *ECP2) bool {
-       if E.is_infinity() && Q.is_infinity() {
-               return true
-       }
-       if E.is_infinity() || Q.is_infinity() {
-               return false
-       }
-
-       zs2 := NewFP2copy(E.z)
-       zs2.sqr()
-       zo2 := NewFP2copy(Q.z)
-       zo2.sqr()
-       zs3 := NewFP2copy(zs2)
-       zs3.mul(E.z)
-       zo3 := NewFP2copy(zo2)
-       zo3.mul(Q.z)
-       zs2.mul(Q.x)
-       zo2.mul(E.x)
-       if !zs2.equals(zo2) {
-               return false
-       }
-       zs3.mul(Q.y)
-       zo3.mul(E.y)
-       if !zs3.equals(zo3) {
-               return false
-       }
-
-       return true
-}
-
-/* set to Affine - (x,y,z) to (x,y) */
-func (E *ECP2) affine() {
-       if E.is_infinity() {
-               return
-       }
-       one := NewFP2int(1)
-       if E.z.equals(one) {
-               return
-       }
-       E.z.inverse()
-
-       z2 := NewFP2copy(E.z)
-       z2.sqr()
-       E.x.mul(z2)
-       E.x.reduce()
-       E.y.mul(z2)
-       E.y.mul(E.z)
-       E.y.reduce()
-       E.z.copy(one)
-}
-
-/* extract affine x as FP2 */
-func (E *ECP2) getX() *FP2 {
-       E.affine()
-       return E.x
-}
-
-/* extract affine y as FP2 */
-func (E *ECP2) getY() *FP2 {
-       E.affine()
-       return E.y
-}
-
-/* extract projective x */
-func (E *ECP2) getx() *FP2 {
-       return E.x
-}
-
-/* extract projective y */
-func (E *ECP2) gety() *FP2 {
-       return E.y
-}
-
-/* extract projective z */
-func (E *ECP2) getz() *FP2 {
-       return E.z
-}
-
-/* convert to byte array */
-func (E *ECP2) toBytes(b []byte) {
-       var t [int(MODBYTES)]byte
-       MB := int(MODBYTES)
-
-       E.affine()
-       E.x.getA().toBytes(t[:])
-       for i := 0; i < MB; i++ {
-               b[i] = t[i]
-       }
-       E.x.getB().toBytes(t[:])
-       for i := 0; i < MB; i++ {
-               b[i+MB] = t[i]
-       }
-
-       E.y.getA().toBytes(t[:])
-       for i := 0; i < MB; i++ {
-               b[i+2*MB] = t[i]
-       }
-       E.y.getB().toBytes(t[:])
-       for i := 0; i < MB; i++ {
-               b[i+3*MB] = t[i]
-       }
-}
-
-/* convert from byte array to point */
-func ECP2_fromBytes(b []byte) *ECP2 {
-       var t [int(MODBYTES)]byte
-       MB := int(MODBYTES)
-
-       for i := 0; i < MB; i++ {
-               t[i] = b[i]
-       }
-       ra := fromBytes(t[:])
-       for i := 0; i < MB; i++ {
-               t[i] = b[i+MB]
-       }
-       rb := fromBytes(t[:])
-       rx := NewFP2bigs(ra, rb)
-
-       for i := 0; i < MB; i++ {
-               t[i] = b[i+2*MB]
-       }
-       ra = fromBytes(t[:])
-       for i := 0; i < MB; i++ {
-               t[i] = b[i+3*MB]
-       }
-       rb = fromBytes(t[:])
-       ry := NewFP2bigs(ra, rb)
-
-       return NewECP2fp2s(rx, ry)
-}
-
-/* convert this to hex string */
-func (E *ECP2) toString() string {
-       if E.is_infinity() {
-               return "infinity"
-       }
-       E.affine()
-       return "(" + E.x.toString() + "," + E.y.toString() + ")"
-}
-
-/* Calculate RHS of twisted curve equation x^3+B/i */
-func RHS2(x *FP2) *FP2 {
-       x.norm()
-       r := NewFP2copy(x)
-       r.sqr()
-       b := NewFP2big(NewBIGints(CURVE_B))
-       b.div_ip()
-       r.mul(x)
-       r.add(b)
-
-       r.reduce()
-       return r
-}
-
-/* construct this from (x,y) - but set to O if not on curve */
-func NewECP2fp2s(ix *FP2, iy *FP2) *ECP2 {
-       E := new(ECP2)
-       E.x = NewFP2copy(ix)
-       E.y = NewFP2copy(iy)
-       E.z = NewFP2int(1)
-       rhs := RHS2(E.x)
-       y2 := NewFP2copy(E.y)
-       y2.sqr()
-       if y2.equals(rhs) {
-               E.INF = false
-       } else {
-               E.x.zero()
-               E.INF = true
-       }
-       return E
-}
-
-/* construct this from x - but set to O if not on curve */
-func NewECP2fp2(ix *FP2) *ECP2 {
-       E := new(ECP2)
-       E.x = NewFP2copy(ix)
-       E.y = NewFP2int(1)
-       E.z = NewFP2int(1)
-       rhs := RHS2(E.x)
-       if rhs.sqrt() {
-               E.y.copy(rhs)
-               E.INF = false
-       } else {
-               E.x.zero()
-               E.INF = true
-       }
-       return E
-}
-
-/* this+=this */
-func (E *ECP2) dbl() int {
-       if E.INF {
-               return -1
-       }
-       if E.y.iszilch() {
-               E.inf()
-               return -1
-       }
-
-       w1 := NewFP2copy(E.x)
-       w2 := NewFP2int(0)
-       w3 := NewFP2copy(E.x)
-       w8 := NewFP2copy(E.x)
-
-       w1.sqr()
-       w8.copy(w1)
-       w8.imul(3)
-
-       w2.copy(E.y)
-       w2.sqr()
-       w3.copy(E.x)
-       w3.mul(w2)
-       w3.imul(4)
-       w1.copy(w3)
-       w1.neg()
-       //      w1.norm();
-
-       E.x.copy(w8)
-       E.x.sqr()
-       E.x.add(w1)
-       E.x.add(w1)
-       E.x.norm()
-
-       E.z.mul(E.y)
-       E.z.add(E.z)
-
-       w2.add(w2)
-       w2.sqr()
-       w2.add(w2)
-       w3.sub(E.x)
-       E.y.copy(w8)
-       E.y.mul(w3)
-       //      w2.norm();
-       E.y.sub(w2)
-
-       E.y.norm()
-       E.z.norm()
-
-       return 1
-}
-
-/* this+=Q - return 0 for add, 1 for double, -1 for O */
-func (E *ECP2) add(Q *ECP2) int {
-       if E.INF {
-               E.copy(Q)
-               return -1
-       }
-       if Q.INF {
-               return -1
-       }
-
-       aff := false
-
-       if Q.z.isunity() {
-               aff = true
-       }
-
-       var A, C *FP2
-       B := NewFP2copy(E.z)
-       D := NewFP2copy(E.z)
-       if !aff {
-               A = NewFP2copy(Q.z)
-               C = NewFP2copy(Q.z)
-
-               A.sqr()
-               B.sqr()
-               C.mul(A)
-               D.mul(B)
-
-               A.mul(E.x)
-               C.mul(E.y)
-       } else {
-               A = NewFP2copy(E.x)
-               C = NewFP2copy(E.y)
-
-               B.sqr()
-               D.mul(B)
-       }
-
-       B.mul(Q.x)
-       B.sub(A)
-       D.mul(Q.y)
-       D.sub(C)
-
-       if B.iszilch() {
-               if D.iszilch() {
-                       E.dbl()
-                       return 1
-               } else {
-                       E.INF = true
-                       return -1
-               }
-       }
-
-       if !aff {
-               E.z.mul(Q.z)
-       }
-       E.z.mul(B)
-
-       e := NewFP2copy(B)
-       e.sqr()
-       B.mul(e)
-       A.mul(e)
-
-       e.copy(A)
-       e.add(A)
-       e.add(B)
-       E.x.copy(D)
-       E.x.sqr()
-       E.x.sub(e)
-
-       A.sub(E.x)
-       E.y.copy(A)
-       E.y.mul(D)
-       C.mul(B)
-       E.y.sub(C)
-
-       E.x.norm()
-       E.y.norm()
-       E.z.norm()
-
-       return 0
-}
-
-/* set this-=Q */
-func (E *ECP2) sub(Q *ECP2) int {
-       Q.neg()
-       D := E.add(Q)
-       Q.neg()
-       return D
-}
-
-/* set this*=q, where q is Modulus, using Frobenius */
-func (E *ECP2) frob(X *FP2) {
-       if E.INF {
-               return
-       }
-       X2 := NewFP2copy(X)
-       X2.sqr()
-       E.x.conj()
-       E.y.conj()
-       E.z.conj()
-       E.z.reduce()
-       E.x.mul(X2)
-       E.y.mul(X2)
-       E.y.mul(X)
-}
-
-/* normalises m-array of ECP2 points. Requires work vector of m FP2s */
-
-func multiaffine2(m int, P []*ECP2) {
-       t1 := NewFP2int(0)
-       t2 := NewFP2int(0)
-
-       var work []*FP2
-
-       for i := 0; i < m; i++ {
-               work = append(work, NewFP2int(0))
-       }
-
-       work[0].one()
-       work[1].copy(P[0].z)
-
-       for i := 2; i < m; i++ {
-               work[i].copy(work[i-1])
-               work[i].mul(P[i-1].z)
-       }
-
-       t1.copy(work[m-1])
-       t1.mul(P[m-1].z)
-
-       t1.inverse()
-
-       t2.copy(P[m-1].z)
-       work[m-1].mul(t1)
-
-       for i := m - 2; ; i-- {
-               if i == 0 {
-                       work[0].copy(t1)
-                       work[0].mul(t2)
-                       break
-               }
-               work[i].mul(t2)
-               work[i].mul(t1)
-               t2.mul(P[i].z)
-       }
-       /* now work[] contains inverses of all Z coordinates */
-
-       for i := 0; i < m; i++ {
-               P[i].z.one()
-               t1.copy(work[i])
-               t1.sqr()
-               P[i].x.mul(t1)
-               t1.mul(work[i])
-               P[i].y.mul(t1)
-       }
-}
-
-/* P*=e */
-func (E *ECP2) mul(e *BIG) *ECP2 {
-       /* fixed size windows */
-       mt := NewBIG()
-       t := NewBIG()
-       P := NewECP2()
-       Q := NewECP2()
-       C := NewECP2()
-
-       if E.is_infinity() {
-               return NewECP2()
-       }
-
-       var W []*ECP2
-       var w [1 + (NLEN*int(BASEBITS)+3)/4]int8
-
-       E.affine()
-
-       /* precompute table */
-       Q.copy(E)
-       Q.dbl()
-
-       W = append(W, NewECP2())
-       W[0].copy(E)
-
-       for i := 1; i < 8; i++ {
-               W = append(W, NewECP2())
-               W[i].copy(W[i-1])
-               W[i].add(Q)
-       }
-
-       /* convert the table to affine */
-
-       multiaffine2(8, W[:])
-
-       /* make exponent odd - add 2P if even, P if odd */
-       t.copy(e)
-       s := int32(t.parity())
-       t.inc(1)
-       t.norm()
-       ns := int32(t.parity())
-       mt.copy(t)
-       mt.inc(1)
-       mt.norm()
-       t.cmove(mt, s)
-       Q.cmove(E, ns)
-       C.copy(Q)
-
-       nb := 1 + (t.nbits()+3)/4
-       /* convert exponent to signed 4-bit window */
-       for i := 0; i < nb; i++ {
-               w[i] = int8(t.lastbits(5) - 16)
-               t.dec(int(w[i]))
-               t.norm()
-               t.fshr(4)
-       }
-       w[nb] = int8(t.lastbits(5))
-
-       P.copy(W[(w[nb]-1)/2])
-       for i := nb - 1; i >= 0; i-- {
-               Q.selector(W, int32(w[i]))
-               P.dbl()
-               P.dbl()
-               P.dbl()
-               P.dbl()
-               P.add(Q)
-       }
-       P.sub(C)
-       P.affine()
-       return P
-}
-
-/* P=u0.Q0+u1*Q1+u2*Q2+u3*Q3 */
-func mul4(Q []*ECP2, u []*BIG) *ECP2 {
-       var a [4]int8
-       T := NewECP2()
-       C := NewECP2()
-       P := NewECP2()
-
-       var W []*ECP2
-
-       mt := NewBIG()
-       var t []*BIG
-
-       var w [NLEN*int(BASEBITS) + 1]int8
-
-       for i := 0; i < 4; i++ {
-               t = append(t, NewBIGcopy(u[i]))
-               Q[i].affine()
-       }
-
-       /* precompute table */
-
-       W = append(W, NewECP2())
-       W[0].copy(Q[0])
-       W[0].sub(Q[1])
-       W = append(W, NewECP2())
-       W[1].copy(W[0])
-       W = append(W, NewECP2())
-       W[2].copy(W[0])
-       W = append(W, NewECP2())
-       W[3].copy(W[0])
-       W = append(W, NewECP2())
-       W[4].copy(Q[0])
-       W[4].add(Q[1])
-       W = append(W, NewECP2())
-       W[5].copy(W[4])
-       W = append(W, NewECP2())
-       W[6].copy(W[4])
-       W = append(W, NewECP2())
-       W[7].copy(W[4])
-
-       T.copy(Q[2])
-       T.sub(Q[3])
-       W[1].sub(T)
-       W[2].add(T)
-       W[5].sub(T)
-       W[6].add(T)
-       T.copy(Q[2])
-       T.add(Q[3])
-       W[0].sub(T)
-       W[3].add(T)
-       W[4].sub(T)
-       W[7].add(T)
-
-       multiaffine2(8, W[:])
-
-       /* if multiplier is even add 1 to multiplier, and add P to correction */
-       mt.zero()
-       C.inf()
-       for i := 0; i < 4; i++ {
-               if t[i].parity() == 0 {
-                       t[i].inc(1)
-                       t[i].norm()
-                       C.add(Q[i])
-               }
-               mt.add(t[i])
-               mt.norm()
-       }
-
-       nb := 1 + mt.nbits()
-
-       /* convert exponent to signed 1-bit window */
-       for j := 0; j < nb; j++ {
-               for i := 0; i < 4; i++ {
-                       a[i] = int8(t[i].lastbits(2) - 2)
-                       t[i].dec(int(a[i]))
-                       t[i].norm()
-                       t[i].fshr(1)
-               }
-               w[j] = (8*a[0] + 4*a[1] + 2*a[2] + a[3])
-       }
-       w[nb] = int8(8*t[0].lastbits(2) + 4*t[1].lastbits(2) + 
2*t[2].lastbits(2) + t[3].lastbits(2))
-
-       P.copy(W[(w[nb]-1)/2])
-       for i := nb - 1; i >= 0; i-- {
-               T.selector(W, int32(w[i]))
-               P.dbl()
-               P.add(T)
-       }
-       P.sub(C) /* apply correction */
-
-       P.affine()
-       return P
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/FF.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/FF.go 
b/go/src/github.com/miracl/amcl-go/FF.go
deleted file mode 100644
index 9e6e68c..0000000
--- a/go/src/github.com/miracl/amcl-go/FF.go
+++ /dev/null
@@ -1,926 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package amcl
-
-//import "fmt"
-
-const P_MBITS uint = MODBYTES * 8
-const P_MB uint = (P_MBITS % BASEBITS)
-const P_OMASK int64 = (int64(-1) << (P_MBITS % BASEBITS))
-const P_FEXCESS int64 = (int64(1) << (BASEBITS*uint(NLEN) - P_MBITS))
-const P_TBITS uint = (P_MBITS % BASEBITS)
-
-type FF struct {
-       length int
-       v      []*BIG
-}
-
-func (F *FF) P_EXCESS() int64 {
-       return ((F.v[F.length-1].get(NLEN-1) & P_OMASK) >> (P_MB))
-}
-
-/* Constructors */
-func NewFFint(n int) *FF {
-       F := new(FF)
-       for i := 0; i < n; i++ {
-               F.v = append(F.v, NewBIG())
-       }
-       F.length = n
-       return F
-}
-
-func NewFFints(x [][5]int64, n int) *FF {
-       F := new(FF)
-       for i := 0; i < n; i++ {
-               F.v = append(F.v, NewBIGints(x[i]))
-       }
-       F.length = n
-       return F
-}
-
-/* set to zero */
-func (F *FF) zero() {
-       for i := 0; i < F.length; i++ {
-               F.v[i].zero()
-       }
-}
-
-func (F *FF) getlen() int {
-       return F.length
-}
-
-/* set to integer */
-func (F *FF) set(m int) {
-       F.zero()
-       F.v[0].set(0, int64(m))
-}
-
-/* copy from FF b */
-func (F *FF) copy(b *FF) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].copy(b.v[i])
-       }
-}
-
-/* x=y<<n */
-func (F *FF) dsucopy(b *FF) {
-       for i := 0; i < b.length; i++ {
-               F.v[b.length+i].copy(b.v[i])
-               F.v[i].zero()
-       }
-}
-
-/* x=y */
-func (F *FF) dscopy(b *FF) {
-       for i := 0; i < b.length; i++ {
-               F.v[i].copy(b.v[i])
-               F.v[b.length+i].zero()
-       }
-}
-
-/* x=y>>n */
-func (F *FF) sducopy(b *FF) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].copy(b.v[F.length+i])
-       }
-}
-
-func (F *FF) one() {
-       F.v[0].one()
-       for i := 1; i < F.length; i++ {
-               F.v[i].zero()
-       }
-}
-
-/* test equals 0 */
-func (F *FF) iszilch() bool {
-       for i := 0; i < F.length; i++ {
-               if !F.v[i].iszilch() {
-                       return false
-               }
-       }
-       return true
-}
-
-/* shift right by 256-bit words */
-func (F *FF) shrw(n int) {
-       for i := 0; i < n; i++ {
-               F.v[i].copy(F.v[i+n])
-               F.v[i+n].zero()
-       }
-}
-
-/* shift left by 256-bit words */
-func (F *FF) shlw(n int) {
-       for i := 0; i < n; i++ {
-               F.v[n+i].copy(F.v[i])
-               F.v[i].zero()
-       }
-}
-
-/* extract last bit */
-func (F *FF) parity() int {
-       return F.v[0].parity()
-}
-
-func (F *FF) lastbits(m int) int {
-       return F.v[0].lastbits(m)
-}
-
-/* compare x and y - must be normalised, and of same length */
-func ff_comp(a *FF, b *FF) int {
-       for i := a.length - 1; i >= 0; i-- {
-               j := comp(a.v[i], b.v[i])
-               if j != 0 {
-                       return j
-               }
-       }
-       return 0
-}
-
-/* recursive add */
-func (F *FF) radd(vp int, x *FF, xp int, y *FF, yp int, n int) {
-       for i := 0; i < n; i++ {
-               F.v[vp+i].copy(x.v[xp+i])
-               F.v[vp+i].add(y.v[yp+i])
-       }
-}
-
-/* recursive inc */
-func (F *FF) rinc(vp int, y *FF, yp int, n int) {
-       for i := 0; i < n; i++ {
-               F.v[vp+i].add(y.v[yp+i])
-       }
-}
-
-/* recursive sub */
-func (F *FF) rsub(vp int, x *FF, xp int, y *FF, yp int, n int) {
-       for i := 0; i < n; i++ {
-               F.v[vp+i].copy(x.v[xp+i])
-               F.v[vp+i].sub(y.v[yp+i])
-       }
-}
-
-/* recursive dec */
-func (F *FF) rdec(vp int, y *FF, yp int, n int) {
-       for i := 0; i < n; i++ {
-               F.v[vp+i].sub(y.v[yp+i])
-       }
-}
-
-/* simple add */
-func (F *FF) add(b *FF) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].add(b.v[i])
-       }
-}
-
-/* simple sub */
-func (F *FF) sub(b *FF) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].sub(b.v[i])
-       }
-}
-
-/* reverse sub */
-func (F *FF) revsub(b *FF) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].rsub(b.v[i])
-       }
-}
-
-/* normalise - but hold any overflow in top part unless n<0 */
-func (F *FF) rnorm(vp int, n int) {
-       trunc := false
-       var carry int64
-       if n < 0 { /* -v n signals to do truncation */
-               n = -n
-               trunc = true
-       }
-       for i := 0; i < n-1; i++ {
-               carry = F.v[vp+i].norm()
-               F.v[vp+i].xortop(carry << P_TBITS)
-               F.v[vp+i+1].inc(int(carry))
-       }
-       carry = F.v[vp+n-1].norm()
-       if trunc {
-               F.v[vp+n-1].xortop(carry << P_TBITS)
-       }
-
-}
-
-func (F *FF) norm() {
-       F.rnorm(0, F.length)
-}
-
-/* increment/decrement by a small integer */
-func (F *FF) inc(m int) {
-       F.v[0].inc(m)
-       F.norm()
-}
-
-func (F *FF) dec(m int) {
-       F.v[0].dec(m)
-       F.norm()
-}
-
-/* shift left by one bit */
-func (F *FF) shl() {
-       var delay_carry int = 0
-       for i := 0; i < F.length-1; i++ {
-               carry := F.v[i].fshl(1)
-               F.v[i].inc(delay_carry)
-               F.v[i].xortop(carry << P_TBITS)
-               delay_carry = int(carry)
-       }
-       F.v[F.length-1].fshl(1)
-       F.v[F.length-1].inc(delay_carry)
-}
-
-/* shift right by one bit */
-
-func (F *FF) shr() {
-       for i := F.length - 1; i > 0; i-- {
-               carry := F.v[i].fshr(1)
-               F.v[i-1].ortop(carry << P_TBITS)
-       }
-       F.v[0].fshr(1)
-}
-
-/* Convert to Hex String */
-func (F *FF) toString() string {
-       F.norm()
-       s := ""
-       for i := F.length - 1; i >= 0; i-- {
-               s += F.v[i].toString()
-       }
-       return s
-}
-
-/* Convert FFs to/from byte arrays */
-func (F *FF) toBytes(b []byte) {
-       for i := 0; i < F.length; i++ {
-               F.v[i].tobytearray(b, (F.length-i-1)*int(MODBYTES))
-       }
-}
-
-func ff_fromBytes(x *FF, b []byte) {
-       for i := 0; i < x.length; i++ {
-               x.v[i] = frombytearray(b, (x.length-i-1)*int(MODBYTES))
-       }
-}
-
-/* in-place swapping using xor - side channel resistant - lengths must be the 
same */
-func ff_cswap(a *FF, b *FF, d int32) {
-       for i := 0; i < a.length; i++ {
-               a.v[i].cswap(b.v[i], d)
-       }
-}
-
-/* z=x*y, t is workspace */
-func (F *FF) karmul(vp int, x *FF, xp int, y *FF, yp int, t *FF, tp int, n 
int) {
-       if n == 1 {
-               d := mul(x.v[xp], y.v[yp])
-               F.v[vp+1] = d.split(8 * MODBYTES)
-               F.v[vp].dcopy(d)
-               return
-       }
-       nd2 := n / 2
-       F.radd(vp, x, xp, x, xp+nd2, nd2)
-       F.radd(vp+nd2, y, yp, y, yp+nd2, nd2)
-       t.karmul(tp, F, vp, F, vp+nd2, t, tp+n, nd2)
-       F.karmul(vp, x, xp, y, yp, t, tp+n, nd2)
-       F.karmul(vp+n, x, xp+nd2, y, yp+nd2, t, tp+n, nd2)
-       t.rdec(tp, F, vp, n)
-       t.rdec(tp, F, vp+n, n)
-       F.rinc(vp+nd2, t, tp, n)
-       F.rnorm(vp, 2*n)
-}
-
-func (F *FF) karsqr(vp int, x *FF, xp int, t *FF, tp int, n int) {
-       if n == 1 {
-               d := sqr(x.v[xp])
-               F.v[vp+1].copy(d.split(8 * MODBYTES))
-               F.v[vp].dcopy(d)
-               return
-       }
-
-       nd2 := n / 2
-       F.karsqr(vp, x, xp, t, tp+n, nd2)
-       F.karsqr(vp+n, x, xp+nd2, t, tp+n, nd2)
-       t.karmul(tp, x, xp, x, xp+nd2, t, tp+n, nd2)
-       F.rinc(vp+nd2, t, tp, n)
-       F.rinc(vp+nd2, t, tp, n)
-       F.rnorm(vp+nd2, n)
-}
-
-/* Calculates Least Significant bottom half of x*y */
-func (F *FF) karmul_lower(vp int, x *FF, xp int, y *FF, yp int, t *FF, tp int, 
n int) {
-       if n == 1 { /* only calculate bottom half of product */
-               F.v[vp].copy(smul(x.v[xp], y.v[yp]))
-               return
-       }
-       nd2 := n / 2
-
-       F.karmul(vp, x, xp, y, yp, t, tp+n, nd2)
-       t.karmul_lower(tp, x, xp+nd2, y, yp, t, tp+n, nd2)
-       F.rinc(vp+nd2, t, tp, nd2)
-       t.karmul_lower(tp, x, xp, y, yp+nd2, t, tp+n, nd2)
-       F.rinc(vp+nd2, t, tp, nd2)
-       F.rnorm(vp+nd2, -nd2) /* truncate it */
-}
-
-/* Calculates Most Significant upper half of x*y, given lower part */
-func (F *FF) karmul_upper(x *FF, y *FF, t *FF, n int) {
-       nd2 := n / 2
-       F.radd(n, x, 0, x, nd2, nd2)
-       F.radd(n+nd2, y, 0, y, nd2, nd2)
-
-       t.karmul(0, F, n+nd2, F, n, t, n, nd2) /* t = (a0+a1)(b0+b1) */
-       F.karmul(n, x, nd2, y, nd2, t, n, nd2) /* z[n]= a1*b1 */
-       /* z[0-nd2]=l(a0b0) z[nd2-n]= h(a0b0)+l(t)-l(a0b0)-l(a1b1) */
-       t.rdec(0, F, n, n)     /* t=t-a1b1  */
-       F.rinc(nd2, F, 0, nd2) /* z[nd2-n]+=l(a0b0) = h(a0b0)+l(t)-l(a1b1)  */
-       F.rdec(nd2, t, 0, nd2) /* 
z[nd2-n]=h(a0b0)+l(t)-l(a1b1)-l(t-a1b1)=h(a0b0) */
-       F.rnorm(0, -n)         /* a0b0 now in z - truncate it */
-       t.rdec(0, F, 0, n)     /* (a0+a1)(b0+b1) - a0b0 */
-       F.rinc(nd2, t, 0, n)
-
-       F.rnorm(nd2, n)
-}
-
-/* z=x*y. Assumes x and y are of same length. */
-func ff_mul(x *FF, y *FF) *FF {
-       n := x.length
-       z := NewFFint(2 * n)
-       t := NewFFint(2 * n)
-       z.karmul(0, x, 0, y, 0, t, 0, n)
-       return z
-}
-
-/* return low part of product this*y */
-func (F *FF) lmul(y *FF) {
-       n := F.length
-       t := NewFFint(2 * n)
-       x := NewFFint(n)
-       x.copy(F)
-       F.karmul_lower(0, x, 0, y, 0, t, 0, n)
-}
-
-/* Set b=b mod c */
-func (F *FF) mod(c *FF) {
-       var k int = 1
-
-       F.norm()
-       if ff_comp(F, c) < 0 {
-               return
-       }
-
-       c.shl()
-       for ff_comp(F, c) >= 0 {
-               c.shl()
-               k++
-       }
-
-       for k > 0 {
-               c.shr()
-               if ff_comp(F, c) >= 0 {
-                       F.sub(c)
-                       F.norm()
-               }
-               k--
-       }
-}
-
-/* z=x^2 */
-func ff_sqr(x *FF) *FF {
-       n := x.length
-       z := NewFFint(2 * n)
-       t := NewFFint(2 * n)
-       z.karsqr(0, x, 0, t, 0, n)
-       return z
-}
-
-/* return This mod modulus, N is modulus, ND is Montgomery Constant */
-func (F *FF) reduce(N *FF, ND *FF) *FF { /* fast karatsuba Montgomery 
reduction */
-       n := N.length
-       t := NewFFint(2 * n)
-       r := NewFFint(n)
-       m := NewFFint(n)
-
-       r.sducopy(F)
-       m.karmul_lower(0, F, 0, ND, 0, t, 0, n)
-       F.karmul_upper(N, m, t, n)
-       m.sducopy(F)
-
-       r.add(N)
-       r.sub(m)
-       r.norm()
-
-       return r
-
-}
-
-/* Set r=this mod b */
-/* this is of length - 2*n */
-/* r,b is of length - n */
-func (F *FF) dmod(b *FF) *FF {
-       n := b.length
-       m := NewFFint(2 * n)
-       x := NewFFint(2 * n)
-       r := NewFFint(n)
-
-       x.copy(F)
-       x.norm()
-       m.dsucopy(b)
-       k := 256 * n
-
-       for k > 0 {
-               m.shr()
-
-               if ff_comp(x, m) >= 0 {
-                       x.sub(m)
-                       x.norm()
-               }
-               k--
-       }
-
-       r.copy(x)
-       r.mod(b)
-       return r
-}
-
-/* Set return=1/this mod p. Binary method - a<p on entry */
-
-func (F *FF) invmodp(p *FF) {
-       n := p.length
-
-       u := NewFFint(n)
-       v := NewFFint(n)
-       x1 := NewFFint(n)
-       x2 := NewFFint(n)
-       t := NewFFint(n)
-       one := NewFFint(n)
-
-       one.one()
-       u.copy(F)
-       v.copy(p)
-       x1.copy(one)
-       x2.zero()
-
-       // reduce n in here as well!
-       for ff_comp(u, one) != 0 && ff_comp(v, one) != 0 {
-               for u.parity() == 0 {
-                       u.shr()
-                       if x1.parity() != 0 {
-                               x1.add(p)
-                               x1.norm()
-                       }
-                       x1.shr()
-               }
-               for v.parity() == 0 {
-                       v.shr()
-                       if x2.parity() != 0 {
-                               x2.add(p)
-                               x2.norm()
-                       }
-                       x2.shr()
-               }
-               if ff_comp(u, v) >= 0 {
-                       u.sub(v)
-                       u.norm()
-                       if ff_comp(x1, x2) >= 0 {
-                               x1.sub(x2)
-                       } else {
-                               t.copy(p)
-                               t.sub(x2)
-                               x1.add(t)
-                       }
-                       x1.norm()
-               } else {
-                       v.sub(u)
-                       v.norm()
-                       if ff_comp(x2, x1) >= 0 {
-                               x2.sub(x1)
-                       } else {
-                               t.copy(p)
-                               t.sub(x1)
-                               x2.add(t)
-                       }
-                       x2.norm()
-               }
-       }
-       if ff_comp(u, one) == 0 {
-               F.copy(x1)
-       } else {
-               F.copy(x2)
-       }
-}
-
-/* nresidue mod m */
-func (F *FF) nres(m *FF) {
-       n := m.length
-       d := NewFFint(2 * n)
-       d.dsucopy(F)
-       F.copy(d.dmod(m))
-}
-
-func (F *FF) redc(m *FF, ND *FF) {
-       n := m.length
-       d := NewFFint(2 * n)
-       F.mod(m)
-       d.dscopy(F)
-       F.copy(d.reduce(m, ND))
-       F.mod(m)
-}
-
-func (F *FF) mod2m(m int) {
-       for i := m; i < F.length; i++ {
-               F.v[i].zero()
-       }
-}
-
-/* U=1/a mod 2^m - Arazi & Qi */
-func (F *FF) invmod2m() *FF {
-       n := F.length
-
-       b := NewFFint(n)
-       c := NewFFint(n)
-       U := NewFFint(n)
-
-       U.zero()
-       U.v[0].copy(F.v[0])
-       U.v[0].invmod2m()
-
-       for i := 1; i < n; i <<= 1 {
-               b.copy(F)
-               b.mod2m(i)
-               t := ff_mul(U, b)
-               t.shrw(i)
-               b.copy(t)
-               c.copy(F)
-               c.shrw(i)
-               c.mod2m(i)
-               c.lmul(U)
-               c.mod2m(i)
-
-               b.add(c)
-               b.norm()
-               b.lmul(U)
-               b.mod2m(i)
-
-               c.one()
-               c.shlw(i)
-               b.revsub(c)
-               b.norm()
-               b.shlw(i)
-               U.add(b)
-       }
-       U.norm()
-       return U
-}
-
-func (F *FF) random(rng *RAND) {
-       n := F.length
-       for i := 0; i < n; i++ {
-               F.v[i].copy(random(rng))
-       }
-       /* make sure top bit is 1 */
-       for F.v[n-1].nbits() < int(MODBYTES*8) {
-               F.v[n-1].copy(random(rng))
-       }
-}
-
-/* generate random x less than p */
-func (F *FF) randomnum(p *FF, rng *RAND) {
-       n := F.length
-       d := NewFFint(2 * n)
-
-       for i := 0; i < 2*n; i++ {
-               d.v[i].copy(random(rng))
-       }
-       F.copy(d.dmod(p))
-}
-
-/* this*=y mod p */
-func (F *FF) modmul(y *FF, p *FF, nd *FF) {
-       ex := F.P_EXCESS()
-       ey := y.P_EXCESS()
-       if (ex+1)*(ey+1)+1 >= P_FEXCESS {
-               F.mod(p)
-       }
-       d := ff_mul(F, y)
-       F.copy(d.reduce(p, nd))
-}
-
-/* this*=y mod p */
-func (F *FF) modsqr(p *FF, nd *FF) {
-       ex := F.P_EXCESS()
-       if (ex+1)*(ex+1)+1 >= P_FEXCESS {
-               F.mod(p)
-       }
-       d := ff_sqr(F)
-       F.copy(d.reduce(p, nd))
-}
-
-/* this=this^e mod p using side-channel resistant Montgomery Ladder, for large 
e */
-func (F *FF) skpow(e *FF, p *FF) {
-       n := p.length
-       R0 := NewFFint(n)
-       R1 := NewFFint(n)
-       ND := p.invmod2m()
-
-       F.mod(p)
-       R0.one()
-       R1.copy(F)
-       R0.nres(p)
-       R1.nres(p)
-
-       for i := int(8*MODBYTES)*n - 1; i >= 0; i-- {
-               b := int32(e.v[i/256].bit(i % 256))
-               F.copy(R0)
-               F.modmul(R1, p, ND)
-
-               ff_cswap(R0, R1, b)
-               R0.modsqr(p, ND)
-
-               R1.copy(F)
-               ff_cswap(R0, R1, b)
-       }
-       F.copy(R0)
-       F.redc(p, ND)
-}
-
-/* this =this^e mod p using side-channel resistant Montgomery Ladder, for 
short e */
-func (F *FF) skpows(e *BIG, p *FF) {
-       n := p.length
-       R0 := NewFFint(n)
-       R1 := NewFFint(n)
-       ND := p.invmod2m()
-
-       F.mod(p)
-       R0.one()
-       R1.copy(F)
-       R0.nres(p)
-       R1.nres(p)
-
-       for i := int(8*MODBYTES) - 1; i >= 0; i-- {
-               b := int32(e.bit(i))
-               F.copy(R0)
-               F.modmul(R1, p, ND)
-
-               ff_cswap(R0, R1, b)
-               R0.modsqr(p, ND)
-
-               R1.copy(F)
-               ff_cswap(R0, R1, b)
-       }
-       F.copy(R0)
-       F.redc(p, ND)
-}
-
-/* raise to an integer power - right-to-left method */
-func (F *FF) power(e int, p *FF) {
-       n := p.length
-       w := NewFFint(n)
-       ND := p.invmod2m()
-       f := true
-
-       w.copy(F)
-       w.nres(p)
-
-       if e == 2 {
-               F.copy(w)
-               F.modsqr(p, ND)
-       } else {
-               for true {
-                       if e%2 == 1 {
-                               if f {
-                                       F.copy(w)
-                               } else {
-                                       F.modmul(w, p, ND)
-                               }
-                               f = false
-                       }
-                       e >>= 1
-                       if e == 0 {
-                               break
-                       }
-                       w.modsqr(p, ND)
-               }
-       }
-       F.redc(p, ND)
-}
-
-/* this=this^e mod p, faster but not side channel resistant */
-func (F *FF) pow(e *FF, p *FF) {
-       n := p.length
-       w := NewFFint(n)
-       ND := p.invmod2m()
-
-       w.copy(F)
-       F.one()
-       F.nres(p)
-       w.nres(p)
-       for i := int(8*MODBYTES)*n - 1; i >= 0; i-- {
-               F.modsqr(p, ND)
-               b := e.v[i/256].bit(i % 256)
-               if b == 1 {
-                       F.modmul(w, p, ND)
-               }
-       }
-       F.redc(p, ND)
-}
-
-/* double exponentiation r=x^e.y^f mod p */
-func (F *FF) pow2(e *BIG, y *FF, f *BIG, p *FF) {
-       n := p.length
-       xn := NewFFint(n)
-       yn := NewFFint(n)
-       xy := NewFFint(n)
-       ND := p.invmod2m()
-
-       xn.copy(F)
-       yn.copy(y)
-       xn.nres(p)
-       yn.nres(p)
-       xy.copy(xn)
-       xy.modmul(yn, p, ND)
-       F.one()
-       F.nres(p)
-
-       for i := int(8*MODBYTES) - 1; i >= 0; i-- {
-               eb := e.bit(i)
-               fb := f.bit(i)
-               F.modsqr(p, ND)
-               if eb == 1 {
-                       if fb == 1 {
-                               F.modmul(xy, p, ND)
-                       } else {
-                               F.modmul(xn, p, ND)
-                       }
-               } else {
-                       if fb == 1 {
-                               F.modmul(yn, p, ND)
-                       }
-               }
-       }
-       F.redc(p, ND)
-}
-
-func igcd(x int, y int) int { /* integer GCD, returns GCD of x and y */
-       var r int
-       if y == 0 {
-               return x
-       }
-       for true {
-               r = x % y
-               if r == 0 {
-                       break
-               }
-               x = y
-               y = r
-       }
-       return y
-}
-
-/* quick and dirty check for common factor with n */
-func (F *FF) cfactor(s int) bool {
-       n := F.length
-
-       x := NewFFint(n)
-       y := NewFFint(n)
-
-       y.set(s)
-       x.copy(F)
-       x.norm()
-
-       x.sub(y)
-       x.norm()
-
-       for !x.iszilch() && x.parity() == 0 {
-               x.shr()
-       }
-
-       for ff_comp(x, y) > 0 {
-               x.sub(y)
-               x.norm()
-               for !x.iszilch() && x.parity() == 0 {
-                       x.shr()
-               }
-       }
-
-       g := int(x.v[0].get(0))
-       r := igcd(s, g)
-       if r > 1 {
-               return true
-       }
-       return false
-}
-
-/* Miller-Rabin test for primality. Slow. */
-func prime(p *FF, rng *RAND) bool {
-       s := 0
-       n := p.length
-       d := NewFFint(n)
-       x := NewFFint(n)
-       unity := NewFFint(n)
-       nm1 := NewFFint(n)
-
-       sf := 4849845 /* 3*5*.. *19 */
-       p.norm()
-
-       if p.cfactor(sf) {
-               return false
-       }
-       unity.one()
-       nm1.copy(p)
-       nm1.sub(unity)
-       nm1.norm()
-       d.copy(nm1)
-
-       for d.parity() == 0 {
-               d.shr()
-               s++
-       }
-       if s == 0 {
-               return false
-       }
-       for i := 0; i < 10; i++ {
-               x.randomnum(p, rng)
-               x.pow(d, p)
-               if ff_comp(x, unity) == 0 || ff_comp(x, nm1) == 0 {
-                       continue
-               }
-               loop := false
-               for j := 1; j < s; j++ {
-                       x.power(2, p)
-                       if ff_comp(x, unity) == 0 {
-                               return false
-                       }
-                       if ff_comp(x, nm1) == 0 {
-                               loop = true
-                               break
-                       }
-               }
-               if loop {
-                       continue
-               }
-               return false
-       }
-       return true
-}
-
-/*
-func main() {
-
-       var P = [4][5]int64 
{{0xAD19A781670957,0x76A79C00965796,0xDEFCC5FC9A9717,0xF02F2940E20E9,0xBF59E34F},{0x6894F31844C908,0x8DADA70E82C79F,0xFD29F3836046F6,0x8C1D874D314DD0,0x46D077B},{0x3C515217813331,0x56680FD1CE935B,0xE55C53EEA8838E,0x92C2F7E14A4A95,0xD945E5B1},{0xACF673E919F5EF,0x6723E7E7DAB446,0x6B6FA69B36EB1B,0xF7D13920ECA300,0xB5FC2165}}
-
-       fmt.Printf("Testing FF\n")
-       var raw [100]byte
-       rng:=NewRAND()
-
-       rng.Clean()
-       for i:=0;i<100;i++ {
-               raw[i]=byte(i)
-       }
-
-       rng.Seed(100,raw[:])
-
-       n:=4
-
-       x:=NewFFint(n)
-       x.set(3)
-
-       p:=NewFFints(P[:],n)
-
-       if prime(p,rng) {fmt.Printf("p is a prime\n"); fmt.Printf("\n")}
-
-       e:=NewFFint(n)
-       e.copy(p)
-       e.dec(1); e.norm()
-
-       fmt.Printf("e= "+e.toString())
-       fmt.Printf("\n")
-       x.skpow(e,p)
-       fmt.Printf("x= "+x.toString())
-       fmt.Printf("\n")
-}
-*/

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/FP.go
----------------------------------------------------------------------
diff --git a/go/src/github.com/miracl/amcl-go/FP.go 
b/go/src/github.com/miracl/amcl-go/FP.go
deleted file mode 100644
index c8a4d62..0000000
--- a/go/src/github.com/miracl/amcl-go/FP.go
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* Finite Field arithmetic */
-/* CLINT mod p functions */
-
-package amcl
-
-//import "fmt"
-
-var p BIG = BIG{w: [NLEN]int64(Modulus)}
-
-type FP struct {
-       x *BIG
-}
-
-/* Constructors */
-func NewFPint(a int) *FP {
-       F := new(FP)
-       F.x = NewBIGint(a)
-       F.nres()
-       return F
-}
-
-func NewFPbig(a *BIG) *FP {
-       F := new(FP)
-       F.x = NewBIGcopy(a)
-       F.nres()
-       return F
-}
-
-func NewFPcopy(a *FP) *FP {
-       F := new(FP)
-       F.x = NewBIGcopy(a.x)
-       return F
-}
-
-func (F *FP) toString() string {
-       return F.redc().toString()
-}
-
-/* convert to Montgomery n-residue form */
-func (F *FP) nres() {
-       if MODTYPE != PSEUDO_MERSENNE {
-               d := NewDBIGscopy(F.x)
-               d.shl(uint(NLEN) * BASEBITS)
-               F.x.copy(d.mod(&p))
-       }
-}
-
-/* convert back to regular form */
-func (F *FP) redc() *BIG {
-       if MODTYPE != PSEUDO_MERSENNE {
-               d := NewDBIGscopy(F.x)
-               return mod(d)
-       } else {
-               r := NewBIGcopy(F.x)
-               return r
-       }
-}
-
-/* reduce this mod Modulus */
-func (F *FP) reduce() {
-       F.x.mod(&p)
-}
-
-/* test this=0? */
-func (F *FP) iszilch() bool {
-       F.reduce()
-       return F.x.iszilch()
-}
-
-/* copy from FP b */
-func (F *FP) copy(b *FP) {
-       F.x.copy(b.x)
-}
-
-/* set this=0 */
-func (F *FP) zero() {
-       F.x.zero()
-}
-
-/* set this=1 */
-func (F *FP) one() {
-       F.x.one()
-       F.nres()
-}
-
-/* normalise this */
-func (F *FP) norm() {
-       F.x.norm()
-}
-
-/* swap FPs depending on d */
-func (F *FP) cswap(b *FP, d int32) {
-       F.x.cswap(b.x, d)
-}
-
-/* copy FPs depending on d */
-func (F *FP) cmove(b *FP, d int32) {
-       F.x.cmove(b.x, d)
-}
-
-/* this*=b mod Modulus */
-func (F *FP) mul(b *FP) {
-       ea := EXCESS(F.x)
-       eb := EXCESS(b.x)
-
-       if (ea+1)*(eb+1)+1 >= FEXCESS {
-               F.reduce()
-       }
-
-       d := mul(F.x, b.x)
-       F.x.copy(mod(d))
-}
-
-/* this = -this mod Modulus */
-func (F *FP) neg() {
-       m := NewBIGcopy(&p)
-
-       F.norm()
-
-       ov := EXCESS(F.x)
-       sb := uint(1)
-       for ov != 0 {
-               sb++
-               ov >>= 1
-       }
-
-       m.fshl(sb)
-       F.x.rsub(m)
-
-       if EXCESS(F.x) >= FEXCESS {
-               F.reduce()
-       }
-}
-
-/* this*=c mod Modulus, where c is a small int */
-func (F *FP) imul(c int) {
-       F.norm()
-       s := false
-       if c < 0 {
-               c = -c
-               s = true
-       }
-       afx := (EXCESS(F.x)+1)*(int64(c)+1) + 1
-       if c < NEXCESS && afx < FEXCESS {
-               F.x.imul(c)
-       } else {
-               if afx < FEXCESS {
-                       F.x.pmul(c)
-               } else {
-                       d := F.x.pxmul(c)
-                       F.x.copy(d.mod(&p))
-               }
-       }
-       if s {
-               F.neg()
-       }
-       F.norm()
-}
-
-/* this*=this mod Modulus */
-func (F *FP) sqr() {
-       ea := EXCESS(F.x)
-       if (ea+1)*(ea+1)+1 >= FEXCESS {
-               F.reduce()
-       }
-
-       d := sqr(F.x)
-
-       F.x.copy(mod(d))
-}
-
-/* this+=b */
-func (F *FP) add(b *FP) {
-       F.x.add(b.x)
-       if EXCESS(F.x)+2 >= FEXCESS {
-               F.reduce()
-       }
-}
-
-/* this-=b */
-func (F *FP) sub(b *FP) {
-       n := NewFPcopy(b)
-       n.neg()
-       F.add(n)
-}
-
-/* this/=2 mod Modulus */
-func (F *FP) div2() {
-       F.x.norm()
-       if F.x.parity() == 0 {
-               F.x.fshr(1)
-       } else {
-               F.x.add(&p)
-               F.x.norm()
-               F.x.fshr(1)
-       }
-}
-
-/* this=1/this mod Modulus */
-func (F *FP) inverse() {
-       r := F.redc()
-       r.invmodp(&p)
-       F.x.copy(r)
-       F.nres()
-}
-
-/* return TRUE if this==a */
-func (F *FP) equals(a *FP) bool {
-       a.reduce()
-       F.reduce()
-       if comp(a.x, F.x) == 0 {
-               return true
-       }
-       return false
-}
-
-/* return this^e mod Modulus */
-func (F *FP) pow(e *BIG) *FP {
-       r := NewFPint(1)
-       e.norm()
-       F.x.norm()
-       m := NewFPcopy(F)
-       for true {
-               bt := e.parity()
-               e.fshr(1)
-               if bt == 1 {
-                       r.mul(m)
-               }
-               if e.iszilch() {
-                       break
-               }
-               m.sqr()
-       }
-       r.x.mod(&p)
-       return r
-}
-
-/* return sqrt(this) mod Modulus */
-func (F *FP) sqrt() *FP {
-       F.reduce()
-       b := NewBIGcopy(&p)
-       if MOD8 == 5 {
-               b.dec(5)
-               b.norm()
-               b.shr(3)
-               i := NewFPcopy(F)
-               i.x.shl(1)
-               v := i.pow(b)
-               i.mul(v)
-               i.mul(v)
-               i.x.dec(1)
-               r := NewFPcopy(F)
-               r.mul(v)
-               r.mul(i)
-               r.reduce()
-               return r
-       } else {
-               b.inc(1)
-               b.norm()
-               b.shr(2)
-               return F.pow(b)
-       }
-}
-
-/* return jacobi symbol (this/Modulus) */
-func (F *FP) jacobi() int {
-       w := F.redc()
-       return w.jacobi(&p)
-}


Reply via email to