http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/ROM64.go
----------------------------------------------------------------------
diff --git a/version22/go/ROM64.go b/version22/go/ROM64.go
new file mode 100644
index 0000000..438c99f
--- /dev/null
+++ b/version22/go/ROM64.go
@@ -0,0 +1,826 @@
+/*
+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.
+*/
+
+/* Fixed Data in ROM - Field and Curve parameters */
+
+package main
+
+type Chunk int64
+
+
+/* First the 32/64-bit dependent BIG code */
+/* Note that because of the lack of a 128-bit integer, 32 and 64-bit code 
needs to be done differently */
+
+func pexceed(a *BIG,b *BIG) bool {
+       ea:=EXCESS(a)
+       eb:=EXCESS(b)
+       if (ea+1)>FEXCESS/(eb+1) {return true}
+       return false
+}
+
+func sexceed(a *BIG) bool {
+       ea:=EXCESS(a)
+       if (ea+1)>FEXCESS/(ea+1) {return true}
+       return false
+}
+
+func ff_pexceed(a *BIG,b *BIG) bool {
+       ea:=FF_EXCESS(a)
+       eb:=FF_EXCESS(b)
+       if (ea+1)>P_FEXCESS/(eb+1) {return true}
+       return false
+}
+
+func ff_sexceed(a *BIG) bool {
+       ea:=FF_EXCESS(a)
+       if (ea+1)>P_FEXCESS/(ea+1) {return true}
+       return false
+}
+
+/* return a*b as DBIG */
+func mul(a *BIG,b *BIG) *DBIG {
+       c:=NewDBIG()
+       carry:= Chunk(0)
+//     a.norm()
+//     b.norm()
+
+       for i:=0;i<NLEN;i++ {
+               carry=0
+               for j:=0;j<NLEN;j++ {
+                       carry,c.w[i+j]=muladd(a.w[i],b.w[j],carry,c.w[i+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()
+       carry:= Chunk(0)
+//     a.norm()
+       for i:=0;i<NLEN;i++ {
+               carry=0;
+               for j:=i+1;j<NLEN;j++ {
+                       carry,c.w[i+j]=muladd(2*a.w[i],a.w[j],carry,c.w[i+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++ {
+               top,bot:=muladd(a.w[i],a.w[i],0,c.w[2*i])
+               c.w[2*i]=bot
+               c.w[2*i+1]+=top
+               //c.w[2*i+1]+=c.muladd(a.w[i],a.w[i],0,2*i)
+
+       }
+       c.norm()
+       return c
+}
+
+func monty(md* BIG, mc Chunk,d* DBIG) *BIG {
+       carry:=Chunk(0)
+       m:=Chunk(0)
+       for i:=0;i<NLEN;i++ {
+               if (mc==-1) { 
+                       m=(-d.w[i])&BMASK
+               } else {
+                       if (mc==1) {
+                               m=d.w[i]
+                       } else {m=(mc*d.w[i])&BMASK}
+               }
+
+               carry=0
+               for j:=0;j<NLEN;j++ {
+                       carry,d.w[i+j]=muladd(m,md.w[j],carry,d.w[i+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                
+}
+
+/* set this[i]+=x*y+c, and return high part */
+func muladd(a Chunk,b Chunk,c Chunk,r Chunk) (Chunk,Chunk) {
+       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 
+       top+=x1;
+       carry:=bot>>BASEBITS
+       bot&=BMASK
+       top+=carry
+       return top,bot
+}
+
+
+/********************************************/
+
+/* Set Curve */
+/* Don't Modify from here... */
+
+const CHUNK int=64     /* Set word size */
+
+const NOT_SPECIAL int=0
+const PSEUDO_MERSENNE int=1
+const MONTGOMERY_FRIENDLY int=2
+const GENERALISED_MERSENNE int=3
+const WEIERSTRASS int=0
+const EDWARDS int=1
+const MONTGOMERY int=2
+const BN_CURVE int=0
+const BLS_CURVE int=1
+
+/* ...to here */
+
+
+/*** Enter Some Field details here  ***/
+// Curve 25519
+//  const MODBITS uint=255
+//  const MOD8 uint=5
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// NIST256 or Brainpool
+//  const MODBITS uint=256
+//  const MOD8 uint=7 
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// MF254 
+//  const MODBITS uint=254
+//  const MOD8 uint=7 
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// MS255
+//  const MODBITS uint= 255
+//  const MOD8 uint= 3
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// MF256
+//  const MODBITS uint=256 
+//  const MOD8 uint=7 
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// MS256
+//  const MODBITS uint= 256
+//  const MOD8 uint= 3
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// ANSSI
+//  const MODBITS uint= 256
+//  const MOD8 uint= 3
+//  const BASEBITS uint=56
+//  const AES_S uint= 0
+
+// BN254 Curve
+//const MODBITS uint=254 /* Number of bits in Modulus */
+//const MOD8 uint=3  /* Modulus mod 8 */
+//const BASEBITS uint=56
+//const AES_S uint= 0
+
+// BN454 Curve
+//const MODBITS uint=454 /* Number of bits in Modulus */
+//const MOD8 uint=3  /* Modulus mod 8 */
+//const BASEBITS uint=60
+//const AES_S uint= 128
+
+// BLS383 Curve
+const MODBITS uint=383 /* Number of bits in Modulus */
+const MOD8 uint=3  /* Modulus mod 8 */
+const BASEBITS uint=56
+const AES_S uint= 0
+
+// BLS455 Curve
+//const MODBITS uint=455 /* Number of bits in Modulus */
+//const MOD8 uint=3  /* Modulus mod 8 */
+//const BASEBITS uint=60
+//const AES_S uint= 128
+
+// HIFIVE Curve
+//  const MODBITS uint=336
+//  const MOD8 uint=5 
+//  const BASEBITS uint=60
+//  const AES_S uint= 128
+
+// GOLDILOCKS
+//  const MODBITS uint=448
+//  const MOD8 uint=7
+//  const BASEBITS uint=60
+//  const AES_S uint= 0
+
+// NIST384
+//  const MODBITS uint=384
+//  const MOD8 uint=7
+//  const BASEBITS uint=60
+//  const AES_S uint= 0
+
+// C41417
+//  const MODBITS uint=414
+//  const MOD8 uint=7
+//  const BASEBITS uint=60     
+//  const AES_S uint= 0
+
+// NIST521
+//  const MODBITS uint=521
+//  const MOD8 uint=7
+//  const BASEBITS uint=60
+//  const AES_S uint= 0
+
+// BN646 Curve
+//  const MODBITS uint=646
+//  const MOD8 uint=3
+//  const BASEBITS uint=60
+//  const AES_S uint= 192
+
+/* RSA/DH modulus length as multiple of BIGBITS */
+const FFLEN int=4
+
+/* Don't Modify from here... */
+const NLEN int=int((1+((MODBITS-1)/BASEBITS)))
+const DNLEN int=2*NLEN
+const BMASK Chunk= ((Chunk(1)<<BASEBITS)-1)
+const MODBYTES uint=(1+(MODBITS-1)/8)
+const HBITS uint=(BASEBITS/2)
+const HMASK Chunk= ((Chunk(1)<<HBITS)-1)
+const NEXCESS int=(1<<(uint(CHUNK)-BASEBITS-1));
+const FEXCESS Chunk=(Chunk(1)<<(BASEBITS*uint(NLEN)-MODBITS))
+const OMASK Chunk= ((Chunk(-1))<<(MODBITS%BASEBITS))
+const TBITS uint=MODBITS%BASEBITS // Number of active bits in top word 
+const TMASK Chunk=(Chunk(1)<<TBITS)-1
+const BIGBITS int=int(MODBYTES*8)
+
+/* Finite field support - for RSA, DH etc. */
+const FF_BITS int=(BIGBITS*FFLEN) /* Finite Field Size in bits - must be 
256.2^n */
+const HFLEN int=(FFLEN/2)  /* Useful for half-size RSA private key operations 
*/
+
+const P_MBITS uint=MODBYTES*8
+const P_MB uint=(P_MBITS%BASEBITS)
+const P_OMASK Chunk=(Chunk(-1)<<(P_MBITS%BASEBITS))
+const P_FEXCESS Chunk=(Chunk(1)<<(BASEBITS*uint(NLEN)-P_MBITS))
+const P_TBITS uint=(P_MBITS%BASEBITS)
+
+/* ...to here */
+
+
+// START SPECIFY FIELD DETAILS HERE
+//*********************************************************************************
+// Curve25519 Modulus 
+//  const MODTYPE int=PSEUDO_MERSENNE
+//  var Modulus = [...]Chunk 
{0xFFFFFFFFFFFFED,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF}
+//  const MConst Chunk=0x13
+
+// NIST-256 Curve 
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus = [...]Chunk 
{0xFFFFFFFFFFFFFF,0xFFFFFFFFFF,0x0,0x1000000,0xFFFFFFFF}
+//  const MConst Chunk=0x1
+
+// MF254 Modulus
+//  const MODTYPE int=MONTGOMERY_FRIENDLY
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x3F80FFFF}
+//  const MConst Chunk=0x3F810000
+
+// MS255 Modulus
+//  const MODTYPE int= 1
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFD03,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF}
+//  const MConst Chunk=0x2FD
+
+// MF256 Modulus
+//  const MODTYPE int= 2
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFA7FFFF}
+//  const MConst Chunk=0xFFA80000
+
+// MS256 Modulus
+//  const MODTYPE int= 1
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFF43,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFF}
+//  const MConst Chunk=0xBD
+
+// Brainpool
+//  const MODTYPE int= NOT_SPECIAL
+//  var Modulus= [...]Chunk 
{0x13481D1F6E5377,0xF623D526202820,0x909D838D726E3B,0xA1EEA9BC3E660A,0xA9FB57DB}
+//  const MConst Chunk =0xA75590CEFD89B9
+
+// ANSSI
+//const MODTYPE int= 0
+//  var Modulus= 
[...]Chunk{0xFCF353D86E9C03,0xADBCABC8CA6DE8,0xE8CE42435B3961,0xB3AD58F10126D,0xF1FD178C}
+//  const MConst Chunk=0x97483A164E1155
+
+// BNCX Curve Modulus
+//const MODTYPE int=NOT_SPECIAL
+//var Modulus= [...]Chunk 
{0x6623EF5C1B55B3,0xD6EE18093EE1BE,0x647A6366D3243F,0x8702A0DB0BDDF,0x24000000}
+//const MConst Chunk=0x4E205BF9789E85
+
+// HIFIVE Curve
+//  const MODTYPE int=PSEUDO_MERSENNE
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFFD,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFF}
+//  const MConst Chunk=0x3
+
+//GOLDILOCKS
+//  const MODTYPE int=GENERALISED_MERSENNE
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFEFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFF}
+//  const MConst Chunk=0x1
+
+// NIST384 Curve Modulus
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk 
{0xFFFFFFFF,0xFFFFFF000000000,0xFFFFFFFFFFFFEFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFF}
+//  const MConst Chunk=0x100000001
+
+// C41417 Curve Modulus
+//  const MODTYPE int=PSEUDO_MERSENNE
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFEF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x3FFFFFFFFFFFFF}
+//  const MConst Chunk=0x11
+
+// NIST521
+//  const MODTYPE int=PSEUDO_MERSENNE
+//  var Modulus= [...]Chunk 
{0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x1FFFFFFFFFF}
+//  const MConst Chunk=0x1
+
+// BN646
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk 
{0x2406C08404E013,0x240510420138000,0xE01920840000000,0x601B00000901441,0x400000006C0A206,0xD814423414402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000}
+//  const MConst Chunk=0xCE50F5CF5F615E5       
+
+
+// BN254 Curve
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk  
{0x13,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482}
+//  const MConst Chunk=0x435E50D79435E5
+
+// BN454 Curve
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk  
{0x4E00000013,0x4E006C4E0000840,0x800014508002508,0x888401D5080091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900}
+//  const MConst Chunk=0xF33C46ED79435E5
+
+// BLS383 Curve
+  const MODTYPE int=NOT_SPECIAL
+  var Modulus= [...]Chunk  
{0xACAAB52AAD556B,0x1BB01475F75D7A,0xCF73083D5D7520,0x531820F99EB16,0x2C01355A68EA32,0x5C6105C552A785,0x7AC52080A9F7}
+  const MConst Chunk=0xA59AB3B123D0BD
+
+// BLS455 Curve
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk  
{0xAA00001800002AB,0xC589556B2AA956A,0xB9994ACE86D1BA6,0x3954FCB314B8B3D,0xE3A5B1D56234BD9,0x95B49203003F665,0x57955572AA00E0F,0x555559555}
+//  const MConst Chunk=0xB3EF8137F4017FD
+
+
+// BNT Curve
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk 
{0x9DBBFEEEB4A713,0x555614F464BABE,0x3696F8D5F06E8A,0x6517014EFA0BAB,0x240120DB}
+//  const MConst Chunk=0xC5A872D914C4E5
+
+// BNT2 Curve
+//  const MODTYPE int=NOT_SPECIAL
+//  var Modulus= [...]Chunk 
{0xB2DC2BB460A48B,0x93E428F0D651E8,0xF3B89D00081CF,0x410F5AADB74E20,0x24000482}
+//  const MConst Chunk=0xFE6A47A6505CDD
+
+// START SPECIFY CURVE DETAILS HERE
+//*********************************************************************************
+
+// Ed25519 Curve 
+//  const CURVETYPE int=EDWARDS
+//  const CURVE_A int = -1
+//  var CURVE_B = [...]Chunk 
{0xEB4DCA135978A3,0xA4D4141D8AB75,0x797779E8980070,0x2B6FFE738CC740,0x52036CEE}
+//  var CURVE_Order = [...]Chunk 
{0x12631A5CF5D3ED,0xF9DEA2F79CD658,0x14DE,0x0,0x10000000}
+//  var CURVE_Gx = [...]Chunk 
{0x562D608F25D51A,0xC7609525A7B2C9,0x31FDD6DC5C692C,0xCD6E53FEC0A4E2,0x216936D3}
+//  var CURVE_Gy = [...]Chunk 
{0x66666666666658,0x66666666666666,0x66666666666666,0x66666666666666,0x66666666}
+
+// NIST-256 Curve
+//  const CURVETYPE int=WEIERSTRASS
+//  const CURVE_A int = -3
+//  var CURVE_B = [...]Chunk 
{0xCE3C3E27D2604B,0x6B0CC53B0F63B,0x55769886BC651D,0xAA3A93E7B3EBBD,0x5AC635D8}
+//  var CURVE_Order = [...]Chunk 
{0xB9CAC2FC632551,0xFAADA7179E84F3,0xFFFFFFFFFFBCE6,0xFFFFFF,0xFFFFFFFF}
+//  var CURVE_Gx =[...]Chunk 
{0xA13945D898C296,0x7D812DEB33A0F4,0xE563A440F27703,0xE12C4247F8BCE6,0x6B17D1F2}
+//  var CURVE_Gy =[...]Chunk 
{0xB6406837BF51F5,0x33576B315ECECB,0x4A7C0F9E162BCE,0xFE1A7F9B8EE7EB,0x4FE342E2}
+
+// MF254 Modulus, Weierstrass Curve w-254-mont
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int = -3
+//  var CURVE_B = [...]Chunk 
{0xFFFFFFFFFFD08D,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x3F80FFFF}
+//  var CURVE_Order=[...]Chunk 
{0xA419C4AF8DF83F,0x8BEA0DA375C06F,0xFFFFFFFFFFEB81,0xFFFFFFFFFFFFFF,0x3F80FFFF}
+//  var CURVE_Gx =[...]Chunk {0x2,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0x65DF37F90D4EBC,0x38E3F8511931AD,0x75BD778AEBDFB7,0x3B2E56014AE15A,0x140E3FD3}
+
+// MF254 Modulus, Edwards Curve ed-254-mont
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= -1
+//  var CURVE_B = [...]Chunk {0x367B,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0xF3D3FEC46E98C7,0x306C8BD62FB0EA,0xFFFFFFFFFFEB95,0xFFFFFFFFFFFFFF,0xFE03FFF}
+//  var CURVE_Gx =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0x52D0FDAF2701E5,0x9A840E3212187C,0xD502363F4E3632,0xD6A4C335951D00,0x19F0E690}
+
+// MF254 Modulus, Montgomery Curve
+//  const CURVETYPE int=MONTGOMERY
+//  const CURVE_A int= -55790
+//  var CURVE_B = [...]Chunk {0x0,0x0,0x0,0x0,0x0} // not used
+//  var CURVE_Order=[...]Chunk 
{0xF3D3FEC46E98C7,0x306C8BD62FB0EA,0xFFFFFFFFFFEB95,0xFFFFFFFFFFFFFF,0xFE03FFF}
+//  var CURVE_Gx =[...]Chunk {0x3,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk {0x0,0x0,0x0,0x0,0x0} // not used
+
+// MS255 Modulus, Weierstrass Curve
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk 
{0xFFFFFFFFFFAB46,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF}
+//  var CURVE_Order=[...]Chunk 
{0x8FAC983C594AEB,0x38283AD2B3DFAB,0xFFFFFFFFFF864A,0xFFFFFFFFFFFFFF,0x7FFFFFFF}
+//  var CURVE_Gx =[...]Chunk {0x1,0x0,0x0,0x0,0x0};
+//  var CURVE_Gy =[...]Chunk 
{0x33FF6769CB44BA,0xC78CDDFDA60D17,0xF9B2FF7D177DB6,0xEDBA7833921EBF,0x6F7A6AC0}
+
+// MS255 Modulus, Edwards Curve
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= -1
+//  var CURVE_B = [...]Chunk{0xEA97,0x0,0x0,0x0,0x0}
+//  var 
CURVE_Order=[...]Chunk{0x49D1ED0436EB75,0xA785EDA6832EAC,0xFFFFFFFFFFDCF1,0xFFFFFFFFFFFFFF,0x1FFFFFFF}
+//  var CURVE_Gx =[...]Chunk{0x4,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy 
=[...]Chunk{0x2A255BD08736A0,0x4B8AED445A45BA,0xDD8E0C47E55291,0x4A7BB545EC254C,0x26CB7853}
+
+// MS255 Modulus, Montgomery Curve
+//  const CURVETYPE int=MONTGOMERY
+//  const CURVE_A int=-240222
+//  var CURVE_B = [...]Chunk {0x0,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0x49D1ED0436EB75,0xA785EDA6832EAC,0xFFFFFFFFFFDCF1,0xFFFFFFFFFFFFFF,0x1FFFFFFF}
+//  var CURVE_Gx =[...]Chunk {0x4,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk {0x0,0x0,0x0,0x0,0x0};
+
+// MF256 Modulus, Weierstrass Curve
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk {0x14E6A,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0x10C5E1A79857EB,0x7513E6E5074B9D,0xFFFFFFFFFFFC51,0xFFFFFFFFFFFFFF,0xFFA7FFFF}
+//  var CURVE_Gx =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0x7954C2B724D2A,0x47EB8D94DC6610,0x26123DAE289569,0xBE1808CE7BABBA,0x20887C87}
+
+// MF256, Edwards Curve
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= -1
+//  var CURVE_B = [...]Chunk {0x350A,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0xD92EDED8EC7BAB,0xBBAFB86733C966,0xFFFFFFFFFFB154,0xFFFFFFFFFFFFFF,0x3FE9FFFF}
+//  var CURVE_Gx =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0xEAA722F2F3C908,0x5E648DFEA68D7D,0xF3DB2C1AACA0C0,0xF8CC4D5AEAEBEE,0xDAD8D4F8}
+
+// MF256 Modulus, Montgomery Curve
+//  const CURVETYPE int=MONTGOMERY
+//  const CURVE_A int= -54314
+//  var CURVE_B = [...]Chunk {0x0,0x0,0x0,0x0,0x0} // not used
+//  var CURVE_Order=[...]Chunk 
{0xD92EDED8EC7BAB,0xBBAFB86733C966,0xFFFFFFFFFFB154,0xFFFFFFFFFFFFFF,0x3FE9FFFF}
+//  var CURVE_Gx =[...]Chunk {0x8,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk {0x0,0x0,0x0,0x0,0x0} // not used
+
+// MS256, Weierstrass Curve
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk {0x25581,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0xAB20294751A825,0x8275EA265C6020,0xFFFFFFFFFFE43C,0xFFFFFFFFFFFFFF,0xFFFFFFFF}
+//  var CURVE_Gx =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0xF46306C2B56C77,0x2F9375894EC10B,0x6CCEEEDD6BD02C,0xC1E466D7FC82C9,0x696F1853}
+
+// MS256, Edwards Curve
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= -1
+//  var CURVE_B = [...]Chunk {0x3BEE,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk 
{0xB84E6F1122B4AD,0xA55AD0A6BC64E5,0xFFFFFFFFFFBE6A,0xFFFFFFFFFFFFFF,0x3FFFFFFF}
+//  var CURVE_Gx =[...]Chunk {0xD,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk 
{0x7F6FB5331CADBA,0x6D63824D303F70,0xB39FA046BFBE2A,0x2A1276DBA3D330,0x7D0AB41E}
+
+// MS256 Modulus, Montgomery Curve
+//  const CURVETYPE int=MONTGOMERY
+//  const CURVE_A int=-61370
+//  var CURVE_B = [...]Chunk  {0x0,0x0,0x0,0x0,0x0} // not used
+//  var CURVE_Order= [...]Chunk 
{0xB84E6F1122B4AD,0xA55AD0A6BC64E5,0xFFFFFFFFFFBE6A,0xFFFFFFFFFFFFFF,0x3FFFFFFF}
+//  var CURVE_Gx = [...]Chunk {0xb,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy = [...]Chunk {0x0,0x0,0x0,0x0,0x0} // not used
+
+// Brainpool
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk  
{0xE58101FEE92B04,0xEBC4AF2F49256A,0x733D0B76B7BF93,0x30D84EA4FE66A7,0x662C61C4}
+//  var CURVE_Order= [...]Chunk 
{0x1E0E82974856A7,0x7AA3B561A6F790,0x909D838D718C39,0xA1EEA9BC3E660A,0xA9FB57DB}
+//  var CURVE_Gx = [...]Chunk 
{0xA191562E1305F4,0x42C47AAFBC2B79,0xB23A656149AFA1,0xC1CFE7B7732213,0xA3E8EB3C}
+//  var CURVE_Gy = [...]Chunk 
{0xABE8F35B25C9BE,0xB6DE39D027001D,0xE14644417E69BC,0x3439C56D7F7B22,0x2D996C82}
+
+// ANSSI
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk  
{0x75ED967B7BB73F,0xC9AE4B1A18030,0x754A44C00FDFEC,0x5428A9300D4ABA,0xEE353FCA}
+//  var CURVE_Order=[...]Chunk  
{0xFDD459C6D655E1,0x67E140D2BF941F,0xE8CE42435B53DC,0xB3AD58F10126D,0xF1FD178C}
+//  var CURVE_Gx =[...]Chunk  
{0xC97A2DD98F5CFF,0xD2DCAF98B70164,0x4749D423958C27,0x56C139EB31183D,0xB6B3D4C3}
+//  var CURVE_Gy =[...]Chunk  
{0x115A1554062CFB,0xC307E8E4C9E183,0xF0F3ECEF8C2701,0xC8B204911F9271,0x6142E0F7}
+
+// HIFIVE
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= 1
+//  var CURVE_B = [...]Chunk  {0x2B67,0x0,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk  
{0xB2F95973E9FA805,0xC0BD6B87F93BAA7,0x71415FA9850,0x0,0x0,0x200000000}
+//  var CURVE_Gx =[...]Chunk  {0xC,0x0,0x0,0x0,0x0,0x0}
+//  var CURVE_Gy =[...]Chunk  
{0x2BEC68505FE8632,0x5D5650CA0365DB1,0x3811C7EF435B6DB,0x7853D1B14B46C,0x56502E18E1C161D,0xC0DC616B}
+
+// GOLDILOCKS
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= 1
+//  var CURVE_B = [...]Chunk  
{0xFFFFFFFFFFF6756,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFEFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFF}
+//  var CURVE_Order=[...]Chunk  
{0x378C292AB5844F3,0x6CC2728DC58F552,0xEDB49AED6369021,0xFFFF7CCA23E9C44,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x3FFFFFF}
+//  var CURVE_Gx =[...]Chunk  
{0x555555555555555,0x555555555555555,0x555555555555555,0xAAA955555555555,0xAAAAAAAAAAAAAAA,0xAAAAAAAAAAAAAAA,0xAAAAAAAAAAAAAAA,0xAAAAAAA}
+//  var CURVE_Gy =[...]Chunk  
{0xAEAFBCDEA9386ED,0xBCB2BED1CDA06BD,0x565833A2A3098BB,0x6D728AD8C4B80D6,0x7A035884DD7B7E3,0x205086C2B0036ED,0x34AD7048DB359D6,0xAE05E96}
+
+// NIST384
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk  
{0xA85C8EDD3EC2AEF,0x56398D8A2ED19D2,0x4088F5013875AC6,0x9C6EFE814112031,0x56BE3F82D19181D,0xA7E23EE7E4988E0,0xB3312F}
+//  var CURVE_Order=[...]Chunk  
{0xCEC196ACCC52973,0x1A0DB248B0A77AE,0x34D81F4372DDF58,0xFFFFFFFFFFFFC76,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFF}
+//  var CURVE_Gx =[...]Chunk  
{0xA545E3872760AB7,0x2F25DBF55296C3,0x741E082542A3855,0x3B628BA79B9859F,0x71EF320AD746E1D,0x22BE8B05378EB1C,0xAA87CA}
+//  var CURVE_Gy =[...]Chunk  
{0xA431D7C90EA0E5F,0x60B1CE1D7E819D7,0xA3113B5F0B8C00A,0x1DBD289A147CE9D,0x8BF9292DC29F8F4,0x4A96262C6F5D9E9,0x3617DE}
+
+// C41417
+//  const CURVETYPE int= EDWARDS
+//  const CURVE_A int= 1
+//  var CURVE_B = [...]Chunk  {0xE21,0x0,0x0,0x0,0x0,0x0,0x0}
+//  var CURVE_Order=[...]Chunk  
{0xB0E71A5E106AF79,0x1C0338AD63CF181,0x414CF706022B36F,0xFFFFFFFFEB3CC92,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x7FFFFFFFFFFFF}
+//  var CURVE_Gx =[...]Chunk  
{0x4FD3812F3CBC595,0x1A73FAA8537C64C,0x4AB4D6D6BA11130,0x3EC7F57FF35498A,0xE5FCD46369F44C0,0x300218C0631C326,0x1A334905141443}
+//  var CURVE_Gy =[...]Chunk  {0x22,0x0,0x0,0x0,0x0,0x0,0x0}
+
+// NIST521
+//  const CURVETYPE int= WEIERSTRASS
+//  const CURVE_A int= -3
+//  var CURVE_B = [...]Chunk  
{0xF451FD46B503F00,0x73DF883D2C34F1E,0x2C0BD3BB1BF0735,0x3951EC7E937B165,0x9918EF109E15619,0x5B99B315F3B8B48,0xB68540EEA2DA72,0x8E1C9A1F929A21A,0x51953EB961}
+//  var CURVE_Order=[...]Chunk  
{0xB6FB71E91386409,0xB5C9B8899C47AEB,0xC0148F709A5D03B,0x8783BF2F966B7FC,0xFFFFFFFFFFA5186,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x1FFFFFFFFFF}
+//  var CURVE_Gx =[...]Chunk  
{0x97E7E31C2E5BD66,0x48B3C1856A429BF,0xDC127A2FFA8DE33,0x5E77EFE75928FE1,0xF606B4D3DBAA14B,0x39053FB521F828A,0x62395B4429C6481,0x404E9CD9E3ECB6,0xC6858E06B7}
+//  var CURVE_Gy =[...]Chunk  
{0x8BE94769FD16650,0x3C7086A272C2408,0xB9013FAD076135,0x72995EF42640C55,0xD17273E662C97EE,0x49579B446817AFB,0x42C7D1BD998F544,0x9A3BC0045C8A5FB,0x11839296A78}
+
+
+// BN646 Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+
+var CURVE_Order=[...]Chunk 
{0x2406C07E04200D,0x2405103F0108000,0xD418607E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000}
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
+var CURVE_Gx =[...]Chunk 
{0x2406C08404E012,0x240510420138000,0xE01920840000000,0x601B00000901441,0x400000006C0A206,0xD814423414402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000}
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
+
+var CURVE_Bnx=[...]Chunk 
{0x1001,0x4000,0x10000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}
+var CURVE_Cru=[...]Chunk 
{0x1202401B007,0xD812006C000,0x480510240000000,0x200480000000360,0x1B01,0x3602403600,0xD800000000,0x0,0x12,0x0,0x0}
+var CURVE_Fra=[...]Chunk 
{0x76EAD944929A14,0xB7E0A0BE10CDF74,0x4FB8A8A2B93166B,0xECDFC4B0F037D9,0xC27307962815598,0xCF5EF558D2135D8,0x8CE651FD85AF9C3,0x80AF6D02A45219F,0x69B8147979A41A4,0x9577C152A374C5B,0x9FF28B3A478}
+var CURVE_Frb=[...]Chunk 
{0xFAD1BE73F7245FF,0x6C246F83F06A08B,0x906077E146CE994,0x514D03B4F9FDC68,0x7D8CF86A43F4C6E,0x31791EE96200E29,0x79D9FF04BA5063C,0x8CD092FD5BADE60,0x9647EB8686EBEC7,0x6A883EAD5ECB3A4,0x1A00D74C5B87}
+var CURVE_Pxa=[...]Chunk 
{0x4233F273CCC5E10,0x6408117FB1B1FFA,0xA7978AC166486AA,0xDA6417BDCFDC1D0,0xDCE981D68FA7F5C,0x4169ED790F45048,0xBA06CCE894F26BE,0xB0C98247FD18141,0x30CE35212F353A6,0xFF9A1B9162B0B9E,0xFD835F078BF}
+var CURVE_Pxb=[...]Chunk 
{0x837F879267F4BC0,0x443F1581FA770ED,0x8FBA0763CB82027,0xA8F7E5DE4945F11,0x780AAE5D219F786,0xF3BB745205342E9,0xCC0A34FF057013C,0xA6DFAF3E689709E,0xD69FBD8D12B6B79,0x6A1715D9469215D,0x1764FA509C41}
+var CURVE_Pya=[...]Chunk 
{0xC570D1DCC3FB414,0xD0ABFE7F36161E4,0xABA2F61496C849A,0x4E4A05030CD4F3F,0x70F7CECD5CEF83,0x9D4711CBF491613,0xDF8011EA770418E,0x56548E514EC94EC,0xC9E853DFF35EE42,0x5481ABBAAD13633,0x78D8A63783F}
+var CURVE_Pyb=[...]Chunk 
{0xAFE3E3DB33908AD,0x7CD4290A506594C,0xFA043D85973EC3F,0xFAC7A642BB5E628,0x71A36A52DA82EE2,0x12C2231EDAE0C76,0x994DF2771091B48,0xCFFF7637B76831C,0xD463BD03DA14916,0x1074F23C580C40,0x12188D99546B}
+var CURVE_W=[2][NLEN]Chunk 
{{0x6008003,0x30020000,0xC0080060000000,0x300000000000000,0x0,0x600000,0x0,0x0,0x0,0x0,0x0},{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}
+var CURVE_SB=[2][2][NLEN]Chunk 
{{{0x600A004,0x30028000,0xC00A0060000000,0x300000000000000,0x0,0x600000,0x0,0x0,0x0,0x0,0x0},{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2406C07803A00A,0x2405103C00E8000,0xC817E0780000000,0x1B00000901441,0x400000006C0A206,0xD814422814402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000}}}
+var CURVE_WB=[4][NLEN]Chunk 
{{0x2001000,0x10004000,0x40010020000000,0x100000000000000,0x0,0x200000,0x0,0x0,0x0,0x0,0x0},{0xC01C015005,0x900E0054000,0x3803901C0000000,0xE00300000000240,0x1200,0x2401C02400,0x9000000000,0x0,0xC,0x0,0x0},{0x600E00B003,0x4807002C000,0x1C01D00E0000000,0x700180000000120,0x900,0x1200E01200,0x4800000000,0x0,0x6,0x0,0x0},{0x2003001,0x1000C000,0x40030020000000,0x100000000000000,0x0,0x200000,0x0,0x0,0x0,0x0,0x0}}
+var CURVE_BB=[4][4][NLEN]Chunk 
{{{0x2406C07E04100D,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000},{0x2406C07E04100C,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000},{0x2406C07E04100C,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000},{0x2002,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2406C07E04100C,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000},{0x2406C07E04100D,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006
 
C,0x240000,0x240000000000},{0x2406C07E04100C,0x2405103F0104000,0xD418507E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000}},{{0x2002,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2001,0x8000,0x20000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x1002,0x4000,0x10000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x4002,0x10000,0x40000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x2406C07E04000A,0x2405103F0100000,0xD418407E0000000,0x301B00000901441,0x400000006C0A206,0xD814422E14402,0x6C051024000000,0xD8000000000000,0x9006C,0x240000,0x240000000000},{0x1002,0x4000,0x10000000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}}
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=false
+*/
+// BNCX Curve 
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0}
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0}
+
+var CURVE_Order=[...]Chunk 
{0x11C0A636EB1F6D,0xD6EE0CC906CEBE,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000}
+var CURVE_Bnx=[...]Chunk {0x3C012B1,0x40,0x0,0x0,0x0}
+var CURVE_Cru=[...]Chunk 
{0xE0931794235C97,0xDF6471EF875631,0xCA83F1440BD,0x480000,0x0}
+var CURVE_Fra=[...]Chunk 
{0xD9083355C80EA3,0x7326F173F8215B,0x8AACA718986867,0xA63A0164AFE18B,0x1359082F}
+var CURVE_Frb=[...]Chunk 
{0x8D1BBC06534710,0x63C7269546C062,0xD9CDBC4E3ABBD8,0x623628A900DC53,0x10A6F7D0}
+var CURVE_Pxa=[...]Chunk 
{0x851CEEE4D2EC74,0x85BFA03E2726C0,0xF5C34BBB907C,0x7053B256358B25,0x19682D2C}
+var CURVE_Pxb=[...]Chunk 
{0xA58E8B2E29CFE1,0x97B0C209C30F47,0x37A8E99743F81B,0x3E19F64AA011C9,0x1466B9EC}
+var CURVE_Pya=[...]Chunk 
{0xFBFCEBCF0BE09F,0xB33D847EC1B30C,0x157DAEE2096361,0x72332B8DD81E22,0xA79EDD9}
+var CURVE_Pyb=[...]Chunk 
{0x904B228898EE9D,0x4EA569D2EDEBED,0x512D8D3461C286,0xECC4C09035C6E4,0x6160C39}
+var CURVE_Gx =[...]Chunk 
{0x6623EF5C1B55B2,0xD6EE18093EE1BE,0x647A6366D3243F,0x8702A0DB0BDDF,0x24000000}
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var 
CURVE_W=[2][5]Chunk{{0x546349162FEB83,0xB40381200,0x6000,0x0,0x0},{0x7802561,0x80,0x0,0x0,0x0}}
+var CURVE_SB=[2][2][5]Chunk 
{{{0x5463491DB010E4,0xB40381280,0x6000,0x0,0x0},{0x7802561,0x80,0x0,0x0,0x0}},{{0x7802561,0x80,0x0,0x0,0x0},{0xBD5D5D20BB33EA,0xD6EE0188CEBCBD,0x647A6366D2643F,0x8702A0DB0BDDF,0x24000000}}}
+var CURVE_WB=[4][5]Chunk 
{{0x1C2118567A84B0,0x3C012B040,0x2000,0x0,0x0},{0xCDF995BE220475,0x94EDA8CA7F9A36,0x8702A0DC07E,0x300000,0x0},{0x66FCCAE0F10B93,0x4A76D4653FCD3B,0x4381506E03F,0x180000,0x0},{0x1C21185DFAAA11,0x3C012B0C0,0x2000,0x0,0x0}}
+var CURVE_BB=[4][4][5]Chunk 
{{{0x11C0A6332B0CBD,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x11C0A6332B0CBC,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x11C0A6332B0CBC,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x7802562,0x80,0x0,0x0,0x0}},{{0x7802561,0x80,0x0,0x0,0x0},{0x11C0A6332B0CBC,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x11C0A6332B0CBD,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x11C0A6332B0CBC,0xD6EE0CC906CE7E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000}},{{0x7802562,0x80,0x0,0x0,0x0},{0x7802561,0x80,0x0,0x0,0x0},{0x7802561,0x80,0x0,0x0,0x0},{0x7802561,0x80,0x0,0x0,0x0}},{{0x3C012B2,0x40,0x0,0x0,0x0},{0xF004AC2,0x100,0x0,0x0,0x0},{0x11C0A62F6AFA0A,0xD6EE0CC906CE3E,0x647A6366D2C43F,0x8702A0DB0BDDF,0x24000000},{0x3C012B2,0x40,0x0,0x0,0x0}}}
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=true
+
+*/
+// BN254 Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0}
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var CURVE_Order=[...]Chunk 
{0xD,0x800000000010A1,0x8000000007FF9F,0x40000001BA344D,0x25236482}
+var CURVE_Bnx=[...]Chunk {0x80000000000001,0x40,0x0,0x0,0x0}
+var CURVE_Cru=[...]Chunk {0x80000000000007,0x6CD,0x40000000024909,0x49B362,0x0}
+var CURVE_Fra=[...]Chunk 
{0x7DE6C06F2A6DE9,0x74924D3F77C2E1,0x50A846953F8509,0x212E7C8CB6499B,0x1B377619}
+var CURVE_Frb=[...]Chunk 
{0x82193F90D5922A,0x8B6DB2C08850C5,0x2F57B96AC8DC17,0x1ED1837503EAB2,0x9EBEE69}
+var CURVE_Pxa=[...]Chunk 
{0xEE4224C803FB2B,0x8BBB4898BF0D91,0x7E8C61EDB6A464,0x519EB62FEB8D8C,0x61A10BB}
+var CURVE_Pxb=[...]Chunk 
{0x8C34C1E7D54CF3,0x746BAE3784B70D,0x8C5982AA5B1F4D,0xBA737833310AA7,0x516AAF9}
+var CURVE_Pya=[...]Chunk 
{0xF0E07891CD2B9A,0xAE6BDBE09BD19,0x96698C822329BD,0x6BAF93439A90E0,0x21897A0}
+var CURVE_Pyb=[...]Chunk 
{0x2D1AEC6B3ACE9B,0x6FFD739C9578A,0x56F5F38D37B090,0x7C8B15268F6D44,0xEBB2B0E}
+var CURVE_Gx =[...]Chunk 
{0x12,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482}
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var CURVE_W=[2][5]Chunk 
{{0x3,0x80000000000204,0x6181,0x0,0x0},{0x1,0x81,0x0,0x0,0x0}}
+var CURVE_SB=[2][2][5]Chunk 
{{{0x4,0x80000000000285,0x6181,0x0,0x0},{0x1,0x81,0x0,0x0,0x0}},{{0x1,0x81,0x0,0x0,0x0},{0xA,0xE9D,0x80000000079E1E,0x40000001BA344D,0x25236482}}}
+var CURVE_WB=[4][5]Chunk 
{{0x80000000000000,0x80000000000040,0x2080,0x0,0x0},{0x80000000000005,0x54A,0x8000000001C707,0x312241,0x0},{0x80000000000003,0x800000000002C5,0xC000000000E383,0x189120,0x0},{0x80000000000001,0x800000000000C1,0x2080,0x0,0x0}}
+var CURVE_BB=[4][4][5]Chunk 
{{{0x8000000000000D,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x8000000000000C,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x8000000000000C,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x2,0x81,0x0,0x0,0x0}},{{0x1,0x81,0x0,0x0,0x0},{0x8000000000000C,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x8000000000000D,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x8000000000000C,0x80000000001060,0x8000000007FF9F,0x40000001BA344D,0x25236482}},{{0x2,0x81,0x0,0x0,0x0},{0x1,0x81,0x0,0x0,0x0},{0x1,0x81,0x0,0x0,0x0},{0x1,0x81,0x0,0x0,0x0}},{{0x80000000000002,0x40,0x0,0x0,0x0},{0x2,0x102,0x0,0x0,0x0},{0xA,0x80000000001020,0x8000000007FF9F,0x40000001BA344D,0x25236482},{0x80000000000002,0x40,0x0,0x0,0x0}}}
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=false
+*/
+// BN454 Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+
+var CURVE_Order=[...]Chunk 
{0x420000000D,0x42006C4200007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900};
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Gx =[...]Chunk 
{0x4E00000012,0x4E006C4E0000840,0x800014508002508,0x888401D5080091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900};
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+
+var CURVE_Bnx=[...]Chunk 
{0x100000001,0x10000010000000,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cru=[...]Chunk 
{0x1B00000007,0x1B00121B0000240,0xA00003648000048,0x6C2400364800005,0x36000012360000,0x12000036000,0x0,0x0};
+var CURVE_Fra=[...]Chunk 
{0x302DC9FD573B0EC,0x7AEEE6C3A90B9B8,0xD06B734A02B17EC,0xDBD9562D6A87D,0x929326ECAFCB5A2,0x32139C5D6DDCE26,0x7A687EBE1CCD92B,0x12E79EC72};
+var CURVE_Frb=[...]Chunk 
{0xCFD23AE2A8C4F27,0xD311858A56F4E87,0xAF94A1067D50D1B,0x87A8287EDA9609E,0x8F2CD9352474B38,0xF39CCFA443671E2,0x85A50141EC3B6D4,0x111861C8D};
+var CURVE_Pxa=[...]Chunk 
{0xFBA3BAC20F02B14,0x6BC30BEF0CC2BB1,0xFE2DA6B5FCEFFF3,0x3682EDFC1FE1E7E,0xAD66CC979483454,0xE163BB5D98CBBA1,0xD55083668F14AAF,0x1403D4F80};
+var CURVE_Pxb=[...]Chunk 
{0x9C06D0EC45BF266,0x365ACBB7823C36E,0xD2E4624790DBC52,0xE0803BE6F2F769F,0x7BA9E2AA951971D,0x25841737EBE5665,0x142E8014B1E40D5,0x15952D69E};
+var CURVE_Pya=[...]Chunk 
{0x939AB6BBE1B15C7,0xDF26024555C6CB4,0x671C46519474FB5,0xBAA277A8FC5DD54,0xB00871EE82F2FAA,0xFE0A26E1C64C3A,0x7ABC6DB12C5287A,0x1D67A4004};
+var CURVE_Pyb=[...]Chunk 
{0xC10E6FB60571D60,0xE9271847B128D8E,0xBE70ED2753A65C7,0x75C2604B7433768,0x4F0B46811003851,0xD91F0CA48ABC5EA,0x842C9ADF53F903E,0x976E2360};
+var CURVE_W=[2][8]Chunk 
{{0x800000003,0x80000080000060,0x60000000C00000C,0x600000C00000,0x0,0x0,0x0,0x0},{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0}};
+var CURVE_SB=[2][2][8]Chunk 
{{{0xA00000004,0xA00000A0000060,0x60000000C00000C,0x600000C00000,0x0,0x0,0x0,0x0},{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x3A0000000A,0x3A006C3A0000780,0xC000144F00024F0,0x887801D4F00091B,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900}}};
+var CURVE_WB=[4][8]Chunk 
{{0x100000000,0x10000010000020,0x200000004000004,0x200000400000,0x0,0x0,0x0,0x0},{0x1500000005,0x15000C1500001C0,0x2438000038,0x481C00243800004,0x2400000C240000,0xC000024000,0x0,0x0},{0xB00000003,0xB00060B00000E0,0x121C00001C,0x240E00121C00002,0x12000006120000,0x6000012000,0x0,0x0},{0x300000001,0x30000030000020,0x200000004000004,0x200000400000,0x0,0x0,0x0,0x0}};
+var CURVE_BB=[4][4][8]Chunk 
{{{0x410000000D,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x410000000C,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x410000000C,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x200000002,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x410000000C,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x410000000D,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x410000000C,0x41006C4100007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900}},{{0x200000002,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x200
 
000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x200000001,0x20000020000000,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x100000002,0x10000010000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x400000002,0x40000040000000,0x0,0x0,0x0,0x0,0x0,0x0},{0x400000000A,0x40006C4000007E0,0x2000144FC0024FC,0x887E01D4FC0091C,0x21C00021D4400DA,0x25B06C01B144009,0xD80000909000,0x240000900},{0x100000002,0x10000010000000,0x0,0x0,0x0,0x0,0x0,0x0}}};
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=false
+*/
+
+
+// BLS383 Curve
+
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BLS_CURVE
+const CURVE_A int= 0
+
+var CURVE_Order=[...]Chunk 
{0xFFF80000FFF001,0xBFDE0070FE7800,0x3000049C5EDF1C,0xC40007F910007A,0x14641004C,0x0,0x0};
+var CURVE_B = [...]Chunk {0x9,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cof = [...]Chunk 
{0x2A00000052B,0x5560AAAAAB2CA0,0x6055,0x0,0x0,0x0,0x0};
+var CURVE_Gx =[...]Chunk 
{0xD59B348D10786B,0x3477C0E3F54AD0,0xBF25B734578B9B,0x4F6AC007BB6F65,0xEFD5830FF57E9C,0xADB9F88FB6EC02,0xB08CEE4BC98};
+var CURVE_Gy =[...]Chunk 
{0x5DA023D145DDB,0x13F518C5FEF7CC,0x56EC3462B2A66F,0x96F3019C7A925F,0x9061047981223E,0x4810AD8F5BE59,0x1F3909337671};
+
+var CURVE_Bnx=[...]Chunk {0x1000000040,0x110,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cru=[...]Chunk 
{0xA3AAC4EDA155A9,0xDF2FE8761E5E3D,0xBCDFAADE632625,0x5123128D3035A6,0xDBF3A2BBEAD683,0x5C5FAB20424190,0x7AC52080A9F7};
+var CURVE_Fra=[...]Chunk 
{0x2BA59A92B4508B,0x63DB7A06EEF343,0x40341CB1DFBC74,0x1639E9D32D55D3,0xB19B3F05CC36D4,0xF323EE4D86AB98,0x5A5FB198672};
+var CURVE_Frb=[...]Chunk 
{0x81051A97F904E0,0xB7D49A6F086A37,0x8F3EEB8B7DB8AB,0xEEF7983C6C9543,0x7A65F6549CB35D,0x693D1777CBFBEC,0x751F25672384};
+var CURVE_Pxa=[...]Chunk 
{0x6059885BAC9472,0x7C4D31DE2DC36D,0xBDC90C308C88A7,0x29F01971C688FC,0x3693539C43F167,0xD81E5A561EB8BF,0x4D50722B56BF};
+var CURVE_Pxb=[...]Chunk 
{0x9B4BD7A272AB23,0x7AF19D4F44DCE8,0x3F6F7B93206A34,0x571DD3E2A819FB,0x3A2BA3B635D7EE,0xAC28C780C1A126,0xEE3617C3E5B};
+var CURVE_Pya=[...]Chunk 
{0x81D230977BD4FD,0xB660720DFDFC6,0x41FC9590C89A0C,0x2E1FBCF878287A,0x11C23014EEE65,0x28878816BB325E,0x8F40859A05C};
+var CURVE_Pyb=[...]Chunk 
{0xA5E20A252C4CE6,0x5907A74AFF40C8,0x41760A42448EF3,0xFFEF82B0FDA199,0xA0F29A18D4EA49,0xAC7F7B86E4997B,0x1DCABBA88C12};
+
+// Not used
+var CURVE_W=[2][7]Chunk 
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+var CURVE_SB=[2][2][7]Chunk 
{{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}}};
+var CURVE_WB=[4][7]Chunk 
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+var CURVE_BB=[4][4][7]Chunk 
{{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0}}};
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=false
+
+// BLS455 Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BLS_CURVE
+const CURVE_A int= 0
+
+var CURVE_Order=[...]Chunk 
{0x7FFFFC00001,0xA00000400001C,0x25E000750001D10,0xE0000F10004F000,0x80000380002,0x10,0x0,0x0};
+var CURVE_B = [...]Chunk {0xA,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cof = [...]Chunk 
{0xA9557FFAABFFAAB,0xAAB15555B54AAB6,0x555556AA,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Gx =[...]Chunk 
{0x6D4C5DDFDFCEDD1,0x35C6F43B3A034FB,0x7F05B56A579C725,0xB1F2B8ECE11B321,0x9F342AB0CFE8392,0xA5911EE32767994,0x3005E40CC56ABED,0x18855F3B};
+var CURVE_Gy =[...]Chunk 
{0x404FD79A6619B9B,0x69D80A5D6FA0286,0xEE722322D91A493,0xB1EE58431C1E968,0xCA9BC8953801F5F,0xDFAFD40FE9E388E,0x9F8985FC3DEB0D6,0x19A8DB77E};
+
+var CURVE_Bnx=[...]Chunk {0x20000080000800,0x10000,0x0,0x0,0x0,0x0,0x0,0x0};
+var CURVE_Cru=[...]Chunk 
{0x9202FFC00000AA9,0xFA5190F4A3762A,0x8B2B9BDD548FEC9,0xD7B469DB33A586A,0xC91731354CAFD99,0xF5B48D02FFFE695,0x57955572A900E0E,0x555559555};
+var CURVE_Fra=[...]Chunk 
{0x9CCFBDCA2EBF21,0x572F54A73379964,0x72819F887545498,0x22BBC1CAD1F8534,0xA82CD7D435944F0,0x4594F818D030F7B,0xEDCBE3ADC0016A7,0x397EA4973};
+var CURVE_Frb=[...]Chunk 
{0xA033043B5D1438A,0x6E5A00C3F72FC06,0x4717AB46118C70E,0x16993AE842C0609,0x3B78DA012CA06E9,0x501F99EA300E6EA,0x69C971C4E9FF768,0x1BD6B4BE1};
+var CURVE_Pxa=[...]Chunk 
{0x475F20F0C1F542,0x65D6070F8567E10,0xD780698BB33D776,0x71F685ED1531721,0x303D3FEC5B6A49C,0x8DEF064FF553CEB,0xC0E9A31B4C463,0x2ECB12FA8};
+var CURVE_Pxb=[...]Chunk 
{0x99086EE6749F03D,0xE89A55A5AC5EF2E,0x7B41AECD88EA016,0x622450FE6163E06,0x755066E1C8E296F,0xA80F219487326E8,0x66DBFBB0BEAEE59,0xECFFCE0};
+var CURVE_Pya=[...]Chunk 
{0x83235A4581A77F4,0x9F0F367B7A7E10A,0x8FA0C4A66D55B9D,0xEF03F65E0D6EC4C,0x9C7DC299C1A9EC2,0x32453CA21CFA5AC,0x6C3DCD5ABB9C544,0x22471D90A};
+var CURVE_Pyb=[...]Chunk 
{0xF413B6D9E1FDBA2,0xA7E630913DA0356,0xFBC913D9AC488E2,0x72E7CF61B401585,0x656D801B21C89ED,0xF9E921EEE0558F9,0x3D2B7B03CFC8698,0x33503CA8};
+
+// Not used
+var CURVE_W=[2][8]Chunk 
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+var CURVE_SB=[2][2][8]Chunk 
{{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}};
+var CURVE_WB=[4][8]Chunk 
{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+var CURVE_BB=[4][4][8]Chunk 
{{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}},{{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}}};
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=false
+*/
+// BNT Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0}
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var CURVE_Order=[...]Chunk 
{0x75777E8D30210D,0xD43492B2CB363A,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB}
+var CURVE_Bnx=[...]Chunk {0x806000004081,0x40,0x0,0x0,0x0}
+var CURVE_Cru=[...]Chunk 
{0xEB53D5AB4FCD87,0x82A5F2BAB11FAD,0x47651504C9764C,0x4801B1,0x0}
+var CURVE_Fra=[...]Chunk 
{0xF5D14EADC80022,0x4904D6FACCE359,0xF190A13211BE6C,0xC9BBC4394F6509,0x1328A292}
+var CURVE_Frb=[...]Chunk 
{0xA7EAB040ECA6F1,0xC513DF997D764,0x450657A3DEB01E,0x9B5B3D15AAA6A1,0x10D87E48}
+var CURVE_Pxa=[...]Chunk 
{0x8987E2288E65BB,0xAD1CAA6313BE,0x325041548B7CCC,0x4C1339EBCC055,0x14483FCD}
+var CURVE_Pxb=[...]Chunk 
{0x67888808DBE2C0,0x7FE1F81E34853A,0xA631A51B57B95,0x384EC302DA3FC5,0x87F46B3}
+var CURVE_Pya=[...]Chunk 
{0x202C47E020CA1D,0xB4167E8399F36C,0xC6E5439F72C94C,0x102B0BD74A2C69,0x14E8C29C}
+var CURVE_Pyb=[...]Chunk 
{0xD8437C716628F2,0x27E167BCB7DC6B,0xA82C7572681D0A,0x62454BD1EDEC18,0x17AFE2A4}
+var CURVE_Gx =[...]Chunk 
{0x9DBBFEEEB4A712,0x555614F464BABE,0x3696F8D5F06E8A,0x6517014EFA0BAB,0x240120DB}
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var 
CURVE_W=[2][5]Chunk{{0x26430061838403,0x81218241998384,0x6001,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0}}
+var CURVE_SB=[2][2][5]Chunk 
{{{0x2743C061840504,0x81218241998404,0x6001,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0}},{{0x100C000008101,0x80,0x0,0x0,0x0},{0x4F347E2BAC9D0A,0x5313107131B2B6,0x3696F8D5EFAE87,0x6517014EFA0BAB,0x240120DB}}}
+var CURVE_WB=[4][5]Chunk 
{{0x6140602080C080,0x806080C08880C1,0x2000,0x0,0x0},{0xB53904088C4A85,0xAD2FA352DC6C36,0xDA436358868EDE,0x300120,0x0},{0x5ADCB204464583,0x5697D1A96E363B,0x6D21B1AC43476F,0x180090,0x0},{0x62412020814181,0x806080C0888141,0x2000,0x0,0x0}}
+var CURVE_BB=[4][4][5]Chunk 
{{{0x74F71E8D2FE08D,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x74F71E8D2FE08C,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x74F71E8D2FE08C,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x100C000008102,0x80,0x0,0x0,0x0}},{{0x100C000008101,0x80,0x0,0x0,0x0},{0x74F71E8D2FE08C,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x74F71E8D2FE08D,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x74F71E8D2FE08C,0xD43492B2CB35FA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB}},{{0x100C000008102,0x80,0x0,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0}},{{0x806000004082,0x40,0x0,0x0,0x0},{0x2018000010202,0x100,0x0,0x0,0x0},{0x7476BE8D2FA00A,0xD43492B2CB35BA,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB},{0x806000004082,0x40,0x0,0x0,0x0}}}
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=true
+
+*/
+
+// BNT2 Curve
+/*
+const CURVETYPE int=WEIERSTRASS
+const CURVE_PAIRING_TYPE int=BN_CURVE
+const CURVE_A int= 0
+var CURVE_B = [...]Chunk {0x2,0x0,0x0,0x0,0x0}
+var CURVE_Cof = [...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var CURVE_Order=[...]Chunk 
{0xFB71A511AA2BF5,0x8DE127B73833D7,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482}
+var CURVE_Bnx=[...]Chunk {0x20100608205,0x40,0x0,0x0,0x0}
+var CURVE_Cru=[...]Chunk 
{0x5027444866BD33,0x5B773016470EFB,0xC3617BECF23675,0x480006,0x0}
+var CURVE_Fra=[...]Chunk 
{0xB268C973AEF062,0xC69B33C3BCE492,0xF67FA37F195BBC,0x29E8CAB6BD0A41,0x124E0B8D}
+var CURVE_Frb=[...]Chunk 
{0x736240B1B429,0xCD48F52D196D56,0x18BBE650E72612,0x17268FF6FA43DE,0x11B1F8F5}
+var CURVE_Pxa=[...]Chunk 
{0xCC92399F40A3C8,0xCDA4E96611784A,0x7B056961706B35,0x9693C6318279D7,0x16FC17CF}
+var CURVE_Pxb=[...]Chunk 
{0x557A8AD8549540,0x6F7BE6F6510610,0x565907A95D17DB,0xBD5975909C8188,0x1EB5B500}
+var CURVE_Pya=[...]Chunk 
{0x7BECC514220513,0x4A78860E737B14,0x51B83935F12684,0x761422AA9D4DFA,0x1E8EE498}
+var CURVE_Pyb=[...]Chunk 
{0xB9328F577CE78E,0xB746E26FA5781F,0xA93DBC1FB8E27E,0xBAE33BDBA29D76,0x23CEF4CD}
+var CURVE_Gx =[...]Chunk 
{0xB2DC2BB460A48A,0x93E428F0D651E8,0xF3B89D00081CF,0x410F5AADB74E20,0x24000482}
+var CURVE_Gy =[...]Chunk {0x1,0x0,0x0,0x0,0x0}
+var CURVE_W=[2][5]Chunk 
{{0xB76282A1347083,0x60301399E1D10,0x6000,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0}}
+var CURVE_SB=[2][2][5]Chunk 
{{{0xB76684A1F5748C,0x60301399E1D90,0x6000,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0}},{{0x40200C10409,0x80,0x0,0x0,0x0},{0x440F227075BB72,0x87DE267D9A16C7,0xF3B89CFFFC1CF,0x410F5AADB74E20,0x24000482}}}
+var CURVE_WB=[4][5]Chunk 
{{0x9272D48A70A224,0x20100688A0945,0x2000,0x0,0x0},{0x5A572CF030EF19,0x9651763543721D,0x8240FD48A1B9A3,0x300004,0x0},{0xAD2C96F848B88F,0xCB28BB1AA1B92E,0x41207EA450DCD1,0x180002,0x0},{0x9276D68B31A62D,0x20100688A09C5,0x2000,0x0,0x0}}
+var CURVE_BB=[4][4][5]Chunk 
{{{0xFB6FA41149A9F1,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0xFB6FA41149A9F0,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0xFB6FA41149A9F0,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0x40200C1040A,0x80,0x0,0x0,0x0}},{{0x40200C10409,0x80,0x0,0x0,0x0},{0xFB6FA41149A9F0,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0xFB6FA41149A9F1,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0xFB6FA41149A9F0,0x8DE127B7383397,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482}},{{0x40200C1040A,0x80,0x0,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0}},{{0x20100608206,0x40,0x0,0x0,0x0},{0x80401820812,0x100,0x0,0x0,0x0},{0xFB6DA310E927EA,0x8DE127B7383357,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482},{0x20100608206,0x40,0x0,0x0,0x0}}}
+
+const USE_GLV bool=true
+const USE_GS_G2 bool=true
+const USE_GS_GT bool=true      
+const GT_STRONG bool=true
+
+*/
+
+

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/RSA.go
----------------------------------------------------------------------
diff --git a/version22/go/RSA.go b/version22/go/RSA.go
new file mode 100644
index 0000000..b8f22fa
--- /dev/null
+++ b/version22/go/RSA.go
@@ -0,0 +1,363 @@
+/*
+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.
+*/
+
+/* RSA API high-level functions  */
+
+package main
+
+//import "fmt"
+
+const RSA_RFS int=int(MODBYTES)*FFLEN
+const RSA_SHA256 int=32
+const RSA_SHA384 int=48
+const RSA_SHA512 int=64
+
+const RSA_HASH_TYPE int=RSA_SHA256
+
+
+type rsa_private_key struct {
+       p,q,dp,dq,c *FF
+}
+
+func New_rsa_private_key(n int) *rsa_private_key {
+       SK:=new(rsa_private_key)
+       SK.p=NewFFint(n)
+       SK.q=NewFFint(n)
+       SK.dp=NewFFint(n)
+       SK.dq=NewFFint(n)
+       SK.c=NewFFint(n)
+       return SK
+}
+
+type rsa_public_key struct {
+       e int
+       n *FF
+}
+
+func New_rsa_public_key(m int) *rsa_public_key{
+       PK:=new(rsa_public_key)
+       PK.e=0
+       PK.n=NewFFint(m)
+       return PK
+}
+
+func hashit(sha int,A []byte,n int) []byte {
+       var R []byte
+       if sha==RSA_SHA256 {
+               H:=NewHASH256()
+               if A!=nil {H.Process_array(A)}
+               if n>=0 {H.Process_num(int32(n))}
+               R=H.Hash()
+       }
+       if sha==RSA_SHA384 {
+               H:=NewHASH384()
+               if A!=nil {H.Process_array(A)}
+               if n>=0 {H.Process_num(int32(n))}
+               R=H.Hash()
+       }
+       if sha==RSA_SHA512 {
+               H:=NewHASH512()
+               if A!=nil {H.Process_array(A)}
+               if n>=0 {H.Process_num(int32(n))}
+               R=H.Hash()
+       }
+       return R
+}
+
+func RSA_KEY_PAIR(rng *RAND,e int,PRIV *rsa_private_key,PUB *rsa_public_key) { 
/* IEEE1363 A16.11/A16.12 more or less */
+       n:=PUB.n.getlen()/2
+       t:=NewFFint(n)
+       p1:=NewFFint(n)
+       q1:=NewFFint(n)
+
+       for true {
+               PRIV.p.random(rng)
+               for PRIV.p.lastbits(2)!=3 {PRIV.p.inc(1)}       
+               for !prime(PRIV.p,rng) {
+                       PRIV.p.inc(4)
+               }
+                       
+               p1.copy(PRIV.p)
+               p1.dec(1)
+
+               if p1.cfactor(e) {continue}
+               break;
+       }
+
+       for true {
+               PRIV.q.random(rng);
+               for PRIV.q.lastbits(2)!=3 {PRIV.q.inc(1)}
+               for !prime(PRIV.q,rng) {
+                       PRIV.q.inc(4)
+               }
+                       
+               q1.copy(PRIV.q);
+               q1.dec(1);
+
+               if q1.cfactor(e) {continue}
+
+               break;
+       }
+       
+       PUB.n=ff_mul(PRIV.p,PRIV.q);
+       PUB.e=e;
+
+       t.copy(p1)
+       t.shr()
+       PRIV.dp.set(e)
+       PRIV.dp.invmodp(t)
+       if PRIV.dp.parity()==0 {PRIV.dp.add(t)}
+       PRIV.dp.norm();
+
+       t.copy(q1)
+       t.shr()
+       PRIV.dq.set(e)
+       PRIV.dq.invmodp(t)
+       if PRIV.dq.parity()==0 {PRIV.dq.add(t)}
+       PRIV.dq.norm()
+
+       PRIV.c.copy(PRIV.p)
+       PRIV.c.invmodp(PRIV.q)
+
+}
+
+/* Mask Generation Function */
+
+func RSA_MGF1(sha int,Z []byte,olen int,K []byte) {
+       hlen:=sha
+
+       var k int=0
+       for i:=0;i<len(K);i++ {K[i]=0}
+
+       cthreshold:=olen/hlen 
+       if olen%hlen!=0 {cthreshold++}
+       for counter:=0;counter<cthreshold;counter++ {
+               B:=hashit(sha,Z,counter)
+
+               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++}
+               }
+       }       
+}
+
+/* SHAXXX identifier strings */
+var SHA256ID= [...]byte 
{0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20}
+var SHA384ID= [...]byte 
{0x30,0x41,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02,0x05,0x00,0x04,0x30};
+var SHA512ID= [...]byte 
{0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0x04,0x40};
+
+func PKCS15(sha int,m []byte,w []byte) bool {
+       olen:=FF_BITS/8
+       hlen:=sha
+       idlen:=19
+
+       if olen<idlen+hlen+10 {return false}
+       H:=hashit(sha,m,-1)
+
+       for i:=0;i<len(w);i++ {w[i]=0}
+       i:=0
+       w[i]=0; i++
+       w[i]=1; i++
+       for j:=0;j<olen-idlen-hlen-3;j++ {w[i]=0xff; i++}
+       w[i]=0; i++
+
+       if hlen==RSA_SHA256 {
+               for j:=0;j<idlen;j++ {w[i]=SHA256ID[j]; i++}
+       }
+       if hlen==RSA_SHA384 {
+               for j:=0;j<idlen;j++ {w[i]=SHA384ID[j]; i++}
+       }
+       if hlen==RSA_SHA512 {
+               for j:=0;j<idlen;j++ {w[i]=SHA512ID[j]; i++}
+       }
+       for j:=0;j<hlen;j++ {w[i]=H[j]; i++}
+
+       return true
+}
+
+
+/* OAEP Message Encoding for Encryption */
+func RSA_OAEP_ENCODE(sha int,m []byte,rng *RAND,p []byte) []byte { 
+       olen:=RSA_RFS-1
+       mlen:=len(m)
+       var f [RSA_RFS]byte
+
+       hlen:=sha
+
+       SEED:=make([]byte,hlen);
+
+       seedlen:=hlen
+       if (mlen>olen-hlen-seedlen-1) {return nil} 
+
+       DBMASK:=make([]byte,olen-seedlen)
+
+       h:=hashit(sha,p,-1);
+
+       for i:=0;i<hlen;i++ {f[i]=h[i]}
+
+       slen:=olen-mlen-hlen-seedlen-1      
+
+       for i:=0;i<slen;i++ {f[hlen+i]=0}
+       f[hlen+slen]=1
+       for i:=0;i<mlen;i++ {f[hlen+slen+1+i]=m[i]}
+
+       for i:=0;i<seedlen;i++ {SEED[i]=rng.GetByte()}
+       RSA_MGF1(sha,SEED,olen-seedlen,DBMASK)
+
+       for i:=0;i<olen-seedlen;i++ {DBMASK[i]^=f[i]}
+
+       RSA_MGF1(sha,DBMASK,seedlen,f[:])
+
+       for i:=0;i<seedlen;i++ {f[i]^=SEED[i]}
+
+       for i:=0;i<olen-seedlen;i++ {f[i+seedlen]=DBMASK[i]}
+
+       /* pad to length RFS */
+       d:=1
+       for i:=RSA_RFS-1;i>=d;i-- {
+               f[i]=f[i-d]
+       }
+       for i:=d-1;i>=0;i-- {
+               f[i]=0
+       }
+       return f[:]
+}
+
+/* OAEP Message Decoding for Decryption */
+func RSA_OAEP_DECODE(sha int,p []byte,f []byte) [] byte {
+       olen:=RSA_RFS-1
+
+       hlen:=sha
+       SEED:=make([]byte,hlen)
+       seedlen:=hlen;
+       CHASH:=make([]byte,hlen)
+       
+       if olen<seedlen+hlen+1 {return nil}
+       DBMASK:=make([]byte,olen-seedlen)
+       for i:=0;i<olen-seedlen;i++ {DBMASK[i]=0}
+
+       if len(f)<RSA_RFS {
+               d:=RSA_RFS-len(f)
+               for i:=RSA_RFS-1;i>=d;i-- {
+                       f[i]=f[i-d]
+               }
+               for i:=d-1;i>=0;i-- {
+                       f[i]=0
+               }
+       }
+
+       h:=hashit(sha,p,-1)
+       for i:=0;i<hlen;i++ {CHASH[i]=h[i]}
+
+       x:=f[0]
+
+       for i:=seedlen;i<olen;i++ {
+               DBMASK[i-seedlen]=f[i+1]
+       }
+
+       RSA_MGF1(sha,DBMASK,seedlen,SEED)
+       for i:=0;i<seedlen;i++ {SEED[i]^=f[i+1]}
+       RSA_MGF1(sha,SEED,olen-seedlen,f)
+       for i:=0;i<olen-seedlen;i++ {DBMASK[i]^=f[i]}
+
+       comp:=true
+       for i:=0;i<hlen;i++ {
+               if CHASH[i]!=DBMASK[i] {comp=false}
+       }
+
+       for i:=0;i<olen-seedlen-hlen;i++ {
+               DBMASK[i]=DBMASK[i+hlen]
+       }
+
+       for i:=0;i<hlen;i++ {
+               SEED[i]=0; CHASH[i]=0
+       }
+               
+       var k int
+       for k=0;;k++ {
+               if k>=olen-seedlen-hlen {return nil}
+               if DBMASK[k]!=0 {break}
+       }
+
+       t:=DBMASK[k]
+       if (!comp || x!=0 || t!=0x01) {
+               for i:=0;i<olen-seedlen;i++ {DBMASK[i]=0}
+               return nil
+       }
+
+       var r = make([]byte,olen-seedlen-hlen-k-1)
+
+       for i:=0;i<olen-seedlen-hlen-k-1;i++ {
+               r[i]=DBMASK[i+k+1]
+       }
+       
+       for i:=0;i<olen-seedlen;i++  {DBMASK[i]=0}
+
+       return r
+}
+
+/* destroy the Private Key structure */
+func RSA_PRIVATE_KEY_KILL(PRIV *rsa_private_key) {
+       PRIV.p.zero();
+       PRIV.q.zero();
+       PRIV.dp.zero();
+       PRIV.dq.zero();
+       PRIV.c.zero();
+}
+
+/* RSA encryption with the public key */
+func RSA_ENCRYPT(PUB *rsa_public_key,F []byte,G []byte) {
+       n:=PUB.n.getlen()
+       f:=NewFFint(n)
+
+       ff_fromBytes(f,F)
+       f.power(PUB.e,PUB.n)
+       f.toBytes(G)
+}
+
+/* RSA decryption with the private key */
+func RSA_DECRYPT(PRIV *rsa_private_key,G []byte,F []byte) {
+       n:=PRIV.p.getlen()
+       g:=NewFFint(2*n)
+
+       ff_fromBytes(g,G);
+       jp:=g.dmod(PRIV.p)
+       jq:=g.dmod(PRIV.q)
+
+       jp.skpow(PRIV.dp,PRIV.p)
+       jq.skpow(PRIV.dq,PRIV.q)
+
+       g.zero()
+       g.dscopy(jp)
+       jp.mod(PRIV.q)
+       if ff_comp(jp,jq)>0 {jq.add(PRIV.q)}
+       jq.sub(jp)
+       jq.norm()
+
+       t:=ff_mul(PRIV.c,jq)
+       jq=t.dmod(PRIV.q)
+
+       t=ff_mul(jq,PRIV.p)
+       g.add(t)
+       g.norm()
+
+       g.toBytes(F)
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/TestECDH.go
----------------------------------------------------------------------
diff --git a/version22/go/TestECDH.go b/version22/go/TestECDH.go
new file mode 100644
index 0000000..c3fbf87
--- /dev/null
+++ b/version22/go/TestECDH.go
@@ -0,0 +1,164 @@
+/*
+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.
+*/
+
+/* test driver and function exerciser for ECDH/ECIES/ECDSA API Functions */
+
+package main
+
+import "fmt"
+
+func ECDH_printBinary(array []byte) {
+       for i:=0;i<len(array);i++ {
+               fmt.Printf("%02x", array[i])
+       }
+       fmt.Printf("\n")
+}  
+
+func main() {
+
+//     j:=0
+       pp:="M0ng00se"
+       res:=0
+
+       var sha=ECDH_HASH_TYPE
+
+       var S1 [ECDH_EGS]byte
+       var W0 [2*ECDH_EFS+1]byte
+       var W1 [2*ECDH_EFS+1]byte
+       var Z0 [ECDH_EFS]byte
+       var Z1 [ECDH_EFS]byte
+       var RAW [100]byte
+       var SALT [8]byte
+       var P1 [3]byte
+       var P2 [4]byte
+       var V [2*ECDH_EFS+1]byte
+       var M [17]byte
+       var T [12]byte
+       var CS [ECDH_EGS]byte
+       var DS [ECDH_EGS]byte
+
+       rng:=NewRAND()
+
+       rng.Clean();
+       for i:=0;i<100;i++ {RAW[i]=byte(i)}
+
+       rng.Seed(100,RAW[:])
+
+//for j:=0;j<100;j++ {
+
+       for i:=0;i<8;i++ {SALT[i]=byte(i+1)}  // set Salt
+
+       fmt.Printf("Alice's Passphrase= "+pp)
+       fmt.Printf("\n");
+       PW:=[]byte(pp)
+
+/* private key S0 of size EGS bytes derived from Password and Salt */
+
+       S0:=PBKDF2(sha,PW,SALT[:],1000,ECDH_EGS)
+
+       fmt.Printf("Alice's private key= 0x")
+       ECDH_printBinary(S0)
+
+/* Generate Key pair S/W */
+       ECDH_KEY_PAIR_GENERATE(nil,S0,W0[:])
+
+       fmt.Printf("Alice's public key= 0x")
+       ECDH_printBinary(W0[:]);
+
+       res=ECDH_PUBLIC_KEY_VALIDATE(true,W0[:])
+       if res!=0 {
+               fmt.Printf("ECP Public Key is invalid!\n")
+               return
+       }
+
+/* Random private key for other party */
+       ECDH_KEY_PAIR_GENERATE(rng,S1[:],W1[:])
+
+       fmt.Printf("Servers private key= 0x");
+       ECDH_printBinary(S1[:])
+
+       fmt.Printf("Servers public key= 0x")
+       ECDH_printBinary(W1[:])
+
+
+       res=ECDH_PUBLIC_KEY_VALIDATE(true,W1[:])
+       if res!=0 {
+               fmt.Printf("ECP Public Key is invalid!\n")
+               return
+       }
+/* Calculate common key using DH - IEEE 1363 method */
+
+       ECPSVDP_DH(S0,W1[:],Z0[:])
+       ECPSVDP_DH(S1[:],W0[:],Z1[:])
+
+       same:=true
+       for i:=0;i<ECDH_EFS;i++ {
+               if Z0[i]!=Z1[i] {same=false}
+       }
+
+       if !same {
+               fmt.Printf("*** ECPSVDP-DH Failed\n");
+               return
+       }
+
+       KEY:=KDF2(sha,Z0[:],nil,ECDH_EAS);
+
+       fmt.Printf("Alice's DH Key=  0x"); ECDH_printBinary(KEY)
+       fmt.Printf("Servers DH Key=  0x"); ECDH_printBinary(KEY)
+       
+       if CURVETYPE!=MONTGOMERY {
+               fmt.Printf("Testing ECIES\n");
+
+               P1[0]=0x0; P1[1]=0x1; P1[2]=0x2
+               P2[0]=0x0; P2[1]=0x1; P2[2]=0x2; P2[3]=0x3
+
+               for i:=0;i<=16;i++ {M[i]=byte(i)} 
+
+               C:=ECIES_ENCRYPT(sha,P1[:],P2[:],rng,W1[:],M[:],V[:],T[:])
+
+               fmt.Printf("Ciphertext= \n")
+               fmt.Printf("V= 0x"); ECDH_printBinary(V[:])
+               fmt.Printf("C= 0x"); ECDH_printBinary(C)
+               fmt.Printf("T= 0x"); ECDH_printBinary(T[:])
+
+
+               RM:=ECIES_DECRYPT(sha,P1[:],P2[:],V[:],C,T[:],S1[:])
+               if RM==nil {
+                       fmt.Printf("*** ECIES Decryption Failed\n")
+                       return
+               } else {fmt.Printf("Decryption succeeded\n")}
+
+               fmt.Printf("Message is 0x"); ECDH_printBinary(RM)
+
+               fmt.Printf("Testing ECDSA\n");
+
+               if ECPSP_DSA(sha,rng,S0,M[:],CS[:],DS[:])!=0 {
+                       fmt.Printf("***ECDSA Signature Failed\n")
+                       return
+               }
+               fmt.Printf("Signature= \n")
+               fmt.Printf("C= 0x"); ECDH_printBinary(CS[:])
+               fmt.Printf("D= 0x"); ECDH_printBinary(DS[:])
+
+               if ECPVP_DSA(sha,W0[:],M[:],CS[:],DS[:])!=0 {
+                       fmt.Printf("***ECDSA Verification Failed\n")
+                       return
+               } else {fmt.Printf("ECDSA Signature/Verification succeeded \n")}
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/TestMPIN.go
----------------------------------------------------------------------
diff --git a/version22/go/TestMPIN.go b/version22/go/TestMPIN.go
new file mode 100644
index 0000000..60ca3de
--- /dev/null
+++ b/version22/go/TestMPIN.go
@@ -0,0 +1,241 @@
+/*
+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.
+*/
+
+/* test driver and function exerciser for MPIN API Functions */
+
+package main
+
+import "fmt"
+
+func MPIN_printBinary(array []byte) {
+       for i:=0;i<len(array);i++ {
+               fmt.Printf("%02x", array[i])
+       }
+       fmt.Printf("\n")
+} 
+
+func main() {
+
+
+       rng:=NewRAND()
+       var raw [100]byte
+       for i:=0;i<100;i++ {raw[i]=byte(i+1)}
+       rng.Seed(100,raw[:])
+
+       var sha=MPIN_HASH_TYPE
+
+       const EGS=MPIN_EGS
+       const EFS=MPIN_EFS
+       const G1S=2*EFS+1 /* Group 1 Size */
+       const G2S=4*EFS; /* Group 2 Size */
+       const EAS int=16
+
+       var S [EGS]byte
+       var SST [G2S]byte
+       var TOKEN [G1S]byte
+       var PERMIT [G1S]byte
+       var SEC [G1S]byte
+       var xID [G1S]byte
+       var xCID [G1S]byte
+       var X [EGS]byte
+       var Y [EGS]byte
+       var E [12*EFS]byte
+       var F [12*EFS]byte
+       var HID [G1S]byte
+       var HTID [G1S]byte
+
+       var G1 [12*EFS]byte
+       var G2 [12*EFS]byte
+       var R [EGS]byte
+       var Z [G1S]byte
+       var W [EGS]byte
+       var T [G1S]byte
+       var CK [EAS]byte
+       var SK [EAS]byte
+
+       var HSID []byte
+
+
+/* Trusted Authority set-up */
+
+       MPIN_RANDOM_GENERATE(rng,S[:])
+       fmt.Printf("Master Secret s: 0x");  MPIN_printBinary(S[:])
+
+ /* Create Client Identity */
+       IDstr:= "[email protected]"
+       CLIENT_ID:=[]byte(IDstr)
+
+       HCID:=MPIN_HASH_ID(sha,CLIENT_ID)  /* Either Client or TA calculates 
Hash(ID) - you decide! */
+               
+       fmt.Printf("Client ID= "); MPIN_printBinary(CLIENT_ID)
+       fmt.Printf("\n")
+
+/* Client and Server are issued secrets by DTA */
+       MPIN_GET_SERVER_SECRET(S[:],SST[:])
+       fmt.Printf("Server Secret SS: 0x");  MPIN_printBinary(SST[:])
+
+       MPIN_GET_CLIENT_SECRET(S[:],HCID,TOKEN[:])
+       fmt.Printf("Client Secret CS: 0x");        
+       MPIN_printBinary(TOKEN[:])
+
+/* Client extracts PIN from secret to create Token */
+       pin:=1234
+       fmt.Printf("Client extracts PIN= %d",pin)
+       fmt.Printf("\n")
+       rtn:=MPIN_EXTRACT_PIN(sha,CLIENT_ID,pin,TOKEN[:])
+       if rtn != 0 {
+               fmt.Printf("FAILURE: EXTRACT_PIN rtn: %d",rtn);
+               fmt.Printf("\n")
+       }
+
+       fmt.Printf("Client Token TK: 0x")       
+       MPIN_printBinary(TOKEN[:]); 
+
+       if FULL {
+               MPIN_PRECOMPUTE(TOKEN[:],HCID,G1[:],G2[:])
+       }
+
+       date:=0
+       if PERMITS {
+               date=MPIN_today()
+/* Client gets "Time Token" permit from DTA */ 
+               MPIN_GET_CLIENT_PERMIT(sha,date,S[:],HCID,PERMIT[:])
+               fmt.Printf("Time Permit TP: 0x");  MPIN_printBinary(PERMIT[:])
+
+/* This encoding makes Time permit look random - Elligator squared */
+               MPIN_ENCODING(rng,PERMIT[:])
+               fmt.Printf("Encoded Time Permit TP: 0x");  
MPIN_printBinary(PERMIT[:])
+               MPIN_DECODING(PERMIT[:])
+               fmt.Printf("Decoded Time Permit TP: 0x");  
MPIN_printBinary(PERMIT[:])
+       }
+
+       pin=0
+       fmt.Printf("\nPIN= ")
+       fmt.Scanf("%d",&pin)
+
+       pxID:=xID[:]
+       pxCID:=xCID[:]
+       pHID:=HID[:]
+       pHTID:=HTID[:]
+       pE:=E[:]
+       pF:=F[:]
+       pPERMIT:=PERMIT[:]
+       var prHID []byte
+
+       if date!=0 {
+               prHID=pHTID;
+               if !PINERROR {
+                       pxID=nil
+                       // pHID=nil
+               }
+       } else {
+               prHID=pHID
+               pPERMIT=nil
+               pxCID=nil
+               pHTID=nil
+       }
+       if !PINERROR {
+               pE=nil
+               pF=nil
+       }
+
+       if SINGLE_PASS {
+               fmt.Printf("MPIN Single Pass\n")
+               timeValue:= MPIN_GET_TIME()
+               
rtn=MPIN_CLIENT(sha,date,CLIENT_ID,rng,X[:],pin,TOKEN[:],SEC[:],pxID,pxCID,pPERMIT,timeValue,Y[:])
+               if rtn != 0 {
+                       fmt.Printf("FAILURE: CLIENT rtn: %d\n",rtn)
+               }
+
+               if FULL {
+                       HCID=MPIN_HASH_ID(sha,CLIENT_ID)
+                       MPIN_GET_G1_MULTIPLE(rng,1,R[:],HCID,Z[:])  /* Also 
Send Z=r.ID to Server, remember random r */
+               }
+
+               
rtn=MPIN_SERVER(sha,date,pHID,pHTID,Y[:],SST[:],pxID,pxCID,SEC[:],pE,pF,CLIENT_ID,timeValue)
+               if rtn != 0 {
+                   fmt.Printf("FAILURE: SERVER rtn: %d\n",rtn)
+               }
+
+               if FULL {
+                       HSID=MPIN_HASH_ID(sha,CLIENT_ID);
+                       MPIN_GET_G1_MULTIPLE(rng,0,W[:],prHID,T[:]);  /* Also 
send T=w.ID to client, remember random w  */
+               }
+       } else {
+               fmt.Printf("MPIN Multi Pass\n")
+        /* Send U=x.ID to server, and recreate secret from token and pin */
+               
rtn=MPIN_CLIENT_1(sha,date,CLIENT_ID,rng,X[:],pin,TOKEN[:],SEC[:],pxID,pxCID,pPERMIT);
+               if rtn != 0 {
+                       fmt.Printf("FAILURE: CLIENT_1 rtn: %d\n",rtn)
+               }
+  
+               if FULL {
+                       HCID=MPIN_HASH_ID(sha,CLIENT_ID)
+                       MPIN_GET_G1_MULTIPLE(rng,1,R[:],HCID,Z[:])  /* Also 
Send Z=r.ID to Server, remember random r */
+               }
+  
+        /* Server calculates H(ID) and H(T|H(ID)) (if time permits enabled), 
and maps them to points on the curve HID and HTID resp. */
+               MPIN_SERVER_1(sha,date,CLIENT_ID,pHID,pHTID)
+  
+        /* Server generates Random number Y and sends it to Client */
+               MPIN_RANDOM_GENERATE(rng,Y[:]);
+  
+               if FULL {
+                       HSID=MPIN_HASH_ID(sha,CLIENT_ID);
+                       MPIN_GET_G1_MULTIPLE(rng,0,W[:],prHID,T[:])  /* Also 
send T=w.ID to client, remember random w  */
+               }
+  
+       /* Client Second Pass: Inputs Client secret SEC, x and y. Outputs 
-(x+y)*SEC */
+               rtn=MPIN_CLIENT_2(X[:],Y[:],SEC[:])
+               if rtn != 0 {
+                       fmt.Printf("FAILURE: CLIENT_2 rtn: %d\n",rtn)
+               }
+  
+       /* Server Second pass. Inputs hashed client id, random Y, -(x+y)*SEC, 
xID and xCID and Server secret SST. E and F help kangaroos to find error. */
+       /* If PIN error not required, set E and F = null */
+  
+               
rtn=MPIN_SERVER_2(date,pHID,pHTID,Y[:],SST[:],pxID,pxCID,SEC[:],pE,pF)
+  
+               if rtn!=0 {
+                       fmt.Printf("FAILURE: SERVER_1 rtn: %d\n",rtn)
+               }
+  
+               if rtn == MPIN_BAD_PIN {
+                       fmt.Printf("Server says - Bad Pin. I don't know you. 
Feck off.\n")
+                       if PINERROR {
+                               err:=MPIN_KANGAROO(E[:],F[:])
+                               if err!=0 {fmt.Printf("(Client PIN is out by 
%d)\n",err)}
+                       }
+                       return
+               } else {
+                       fmt.Printf("Server says - PIN is good! You really are 
"+IDstr)
+                       fmt.Printf("\n")
+               }
+
+               if  FULL {
+                       
H:=MPIN_HASH_ALL(sha,HCID[:],pxID,pxCID,SEC[:],Y[:],Z[:],T[:]);
+                       
MPIN_CLIENT_KEY(sha,G1[:],G2[:],pin,R[:],X[:],H[:],T[:],CK[:])
+                       fmt.Printf("Client Key =  0x");  MPIN_printBinary(CK[:])
+
+                       
H=MPIN_HASH_ALL(sha,HSID[:],pxID,pxCID,SEC[:],Y[:],Z[:],T[:]);                  
+                       
MPIN_SERVER_KEY(sha,Z[:],SST[:],W[:],H[:],pHID,pxID,pxCID,SK[:])
+                       fmt.Printf("Server Key =  0x");  MPIN_printBinary(SK[:])
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/TestRSA.go
----------------------------------------------------------------------
diff --git a/version22/go/TestRSA.go b/version22/go/TestRSA.go
new file mode 100644
index 0000000..652fd9a
--- /dev/null
+++ b/version22/go/TestRSA.go
@@ -0,0 +1,98 @@
+/*
+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.
+*/
+
+/* test driver and function exerciser for RSA API Functions */
+
+package main
+
+import "fmt"
+
+func RSA_printBinary(array []byte) {
+       for i:=0;i<len(array);i++ {
+               fmt.Printf("%02x", array[i])
+       }
+       fmt.Printf("\n")
+}  
+
+func main() {
+
+       var sha=RSA_HASH_TYPE
+       message:="Hello World\n"
+
+       pub:=New_rsa_public_key(FFLEN)
+       priv:=New_rsa_private_key(HFLEN)
+
+       var ML [RSA_RFS]byte
+       var C [RSA_RFS]byte
+       var S [RSA_RFS]byte
+       var RAW [100]byte
+       
+       rng:=NewRAND()
+
+       rng.Clean();
+       for i:=0;i<100;i++ {RAW[i]=byte(i)}
+
+       rng.Seed(100,RAW[:]);
+//for (i=0;i<10;i++)
+//{
+       fmt.Printf("Generating public/private key pair\n")
+       RSA_KEY_PAIR(rng,65537,priv,pub)
+
+       M:=[]byte(message)
+
+       fmt.Printf("Encrypting test string\n")
+       E:=RSA_OAEP_ENCODE(sha,M,rng,nil) /* OAEP encode message M to E  */
+
+       RSA_ENCRYPT(pub,E,C[:])    /* encrypt encoded message */
+       fmt.Printf("Ciphertext= 0x"); RSA_printBinary(C[:])
+
+       fmt.Printf("Decrypting test string\n");
+       RSA_DECRYPT(priv,C[:],ML[:])
+       MS:=RSA_OAEP_DECODE(sha,nil,ML[:]) /* OAEP decode message  */
+
+       message=string(MS)
+       fmt.Printf(message)
+
+       fmt.Printf("Signing message\n")
+       PKCS15(sha,M,C[:]); 
+
+       RSA_DECRYPT(priv,C[:],S[:])  /* create signature in S */ 
+
+       fmt.Printf("Signature= 0x"); RSA_printBinary(S[:])
+
+       RSA_ENCRYPT(pub,S[:],ML[:])
+
+       cmp:=true
+       if len(C)!=len(ML) {
+               cmp=false
+       } else {
+               for j:=0;j<len(C);j++ {
+                       if C[j]!=ML[j] {cmp=false}
+               }
+       }
+       if cmp {
+               fmt.Printf("Signature is valid")
+       } else {
+               fmt.Printf("Signature is INVALID")
+       }
+
+
+//}
+       RSA_PRIVATE_KEY_KILL(priv)
+}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/go/readme.txt
----------------------------------------------------------------------
diff --git a/version22/go/readme.txt b/version22/go/readme.txt
new file mode 100644
index 0000000..054048c
--- /dev/null
+++ b/version22/go/readme.txt
@@ -0,0 +1,50 @@
+AMCL is very simple to build for Go.
+
+This version supports both 32-bit and 64-bit builds.
+If your processor and operating system are both 64-bit, a 64-bit build 
+will probably be best. Otherwise use a 32-bit build.
+
+Next - decide the modulus and curve type you want to use. Edit ROM32.go 
+or ROM64.go where indicated. You will probably want to use one of the curves 
whose 
+details are already in there.
+
+Three example API files are provided, TestMPIN.go which 
+supports our M-Pin (tm) protocol, TestECDH.go which supports elliptic 
+curve key exchange, digital signature and public key crypto, and TestRSA.go
+which supports the RSA method.
+
+In the ROM32.go/ROM64.go file you must provide the curve constants. 
+Several examples are provided there, if you are willing to use one of these.
+
+Use ROM32.go for a 32-bit build
+Use ROM64.go for a 64-bit build
+
+To help generate the ROM constants for your own curve some MIRACL helper 
+programs are included. The programs bngen.cpp and blsgen.cpp generate ROM 
+data for a BN and BLS pairing friendly curves, and the program ecgen.cpp 
+generates ROM data for regular EC curves.
+
+The MIRACL based program check.cpp helps choose the best number base for
+big number representation, given the word-length and the size of the modulus.
+
+The program bigtobig.cpp converts a big number to the AMCL 
+BIG format.
+
+
+For a quick jumpstart:-
+
+go run TestMPIN.go MPIN.go PAIR.go FP12.go FP4.go FP2.go FP.go BIG.go DBIG.go 
ECP.go ECP2.go HASH256.go HASH384.go HASH512.go AES.go RAND.go ROM64.go
+
+or 
+
+go run TestECDH.go ECDH.go FP.go BIG.go DBIG.go ECP.go HASH256.go HASH384.go 
HASH512.go AES.go RAND.go ROM64.go
+
+or
+
+go run TestRSA.go RSA.go FF.go BIG.go DBIG.go HASH256.go HASH384.go HASH512.go 
AES.go RAND.go ROM64.go
+
+also
+
+go run BenchtestEC.go RSA.go FF.go FP.go BIG.go DBIG.go ECP.go HASH256.go 
HASH384.go HASH512.go AES.go RAND.go ROM64.go
+
+go run BenchtestPAIR.go PAIR.go FP12.go FP4.go FP2.go FP.go BIG.go DBIG.go 
ECP.go ECP2.go HASH256.go HASH384.go HASH512.go AES.go RAND.go ROM64.go
\ No newline at end of file

Reply via email to