http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/swift/pair.swift
----------------------------------------------------------------------
diff --git a/version22/swift/pair.swift b/version22/swift/pair.swift
new file mode 100644
index 0000000..93d2c20
--- /dev/null
+++ b/version22/swift/pair.swift
@@ -0,0 +1,592 @@
+/*
+       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.
+*/
+
+//
+//  pair.swift
+//
+//  Created by Michael Scott on 07/07/2015.
+//  Copyright (c) 2015 Michael Scott. All rights reserved.
+//
+
+/* AMCL BN Curve Pairing functions */
+
+final class PAIR {
+    
+    // Line function
+    static func line(_ A:ECP2,_ B:ECP2,_ Qx:FP,_ Qy:FP) -> FP12
+    {
+        let P=ECP2()
+        var a:FP4
+        var b:FP4
+        var c:FP4
+        P.copy(A);
+        let ZZ=FP2(P.getz())
+        ZZ.sqr();
+        var D:Int
+        if A===B {D=A.dbl()} // Check this return value in ecp2.c
+        else {D=A.add(B)}
+        if (D<0) {return FP12(1)}
+        let Z3=FP2(A.getz())
+        c=FP4(0)
+        if D==0
+        { /* Addition */
+            let X=FP2(B.getx())
+            let Y=FP2(B.gety())
+            let T=FP2(P.getz())
+            T.mul(Y)
+            ZZ.mul(T)
+    
+            let NY=FP2(P.gety()); NY.neg()
+            ZZ.add(NY)
+            Z3.pmul(Qy)
+            T.mul(P.getx())
+            X.mul(NY)
+            T.add(X)
+            a=FP4(Z3,T)
+            ZZ.neg()
+            ZZ.pmul(Qx)
+            b=FP4(ZZ)
+        }
+        else
+        { // Doubling
+            let X=FP2(P.getx())
+            let Y=FP2(P.gety())
+            let T=FP2(P.getx())
+            T.sqr()
+            T.imul(3)
+    
+            Y.sqr()
+            Y.add(Y)
+            Z3.mul(ZZ)
+            Z3.pmul(Qy)
+    
+            X.mul(T)
+            X.sub(Y)
+            a=FP4(Z3,X)
+            T.neg()
+            ZZ.mul(T)
+            ZZ.pmul(Qx)
+            b=FP4(ZZ)
+        }
+        return FP12(a,b,c)
+    }
+    // Optimal R-ate pairing
+    static func ate(_ P:ECP2,_ Q:ECP) -> FP12
+    {
+        let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb))
+        let x=BIG(ROM.CURVE_Bnx)
+        let n=BIG(x)
+        let K=ECP2()
+        
+        var lv:FP12
+
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               n.pmul(6); n.dec(2)
+       } else {n.copy(x)}
+       
+       n.norm()
+        P.affine()
+        Q.affine()
+        let Qx=FP(Q.getx())
+        let Qy=FP(Q.gety())
+    
+        let A=ECP2()
+        let r=FP12(1)
+    
+        A.copy(P)
+        let nb=n.nbits()
+    
+        for i in (1...nb-2).reversed()
+        //for var i=nb-2;i>=1;i--
+        {
+            lv=line(A,A,Qx,Qy)
+            r.smul(lv)
+    
+            if (n.bit(UInt(i))==1)
+            {
+               lv=line(A,P,Qx,Qy)
+               r.smul(lv)
+            }
+            r.sqr()
+        }
+    
+        lv=line(A,A,Qx,Qy)
+        r.smul(lv)
+       if n.parity()==1 {
+               lv=line(A,P,Qx,Qy)
+               r.smul(lv)
+       }
+    
+    // R-ate fixup required for BN curves
+
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               r.conj()
+               K.copy(P)
+               K.frob(f)
+               A.neg()
+               lv=line(A,K,Qx,Qy)
+               r.smul(lv)
+               K.frob(f)
+               K.neg()
+               lv=line(A,K,Qx,Qy)
+               r.smul(lv)
+       }
+        return r
+    }
+    // Optimal R-ate double pairing e(P,Q).e(R,S)
+    static func ate2(_ P:ECP2,_ Q:ECP,_ R:ECP2,_ S:ECP) -> FP12
+    {
+        let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb))
+        let x=BIG(ROM.CURVE_Bnx)
+        let n=BIG(x)
+        let K=ECP2()
+        var lv:FP12
+
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               n.pmul(6); n.dec(2)
+       } else {n.copy(x)}
+       
+       n.norm()
+        P.affine()
+        Q.affine()
+        R.affine()
+        S.affine()
+    
+        let Qx=FP(Q.getx())
+        let Qy=FP(Q.gety())
+        let Sx=FP(S.getx())
+        let Sy=FP(S.gety())
+    
+        let A=ECP2()
+        let B=ECP2()
+        let r=FP12(1)
+    
+        A.copy(P)
+        B.copy(R)
+        let nb=n.nbits()
+    
+        for i in (1...nb-2).reversed()
+        //for var i=nb-2;i>=1;i--
+        {
+            lv=line(A,A,Qx,Qy)
+            r.smul(lv)
+            lv=line(B,B,Sx,Sy)
+            r.smul(lv)
+            if n.bit(UInt(i))==1
+            {
+               lv=line(A,P,Qx,Qy)
+               r.smul(lv)
+               lv=line(B,R,Sx,Sy)
+               r.smul(lv)
+            }
+            r.sqr()
+        }
+    
+        lv=line(A,A,Qx,Qy)
+        r.smul(lv)
+        lv=line(B,B,Sx,Sy)
+        r.smul(lv)
+       if n.parity()==1 {
+               lv=line(A,P,Qx,Qy)
+               r.smul(lv)
+               lv=line(B,R,Sx,Sy)
+               r.smul(lv)
+       }
+    
+    // R-ate fixup required for BN curves
+
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               r.conj()
+    
+               K.copy(P)
+               K.frob(f)
+               A.neg()
+               lv=line(A,K,Qx,Qy)
+               r.smul(lv)
+               K.frob(f)
+               K.neg()
+               lv=line(A,K,Qx,Qy)
+               r.smul(lv)
+    
+               K.copy(R)
+               K.frob(f)
+               B.neg()
+               lv=line(B,K,Sx,Sy)
+               r.smul(lv)
+               K.frob(f)
+               K.neg()
+               lv=line(B,K,Sx,Sy)
+               r.smul(lv)
+       }
+        return r
+    }
+    
+    // final exponentiation - keep separate for multi-pairings and to avoid 
thrashing stack
+    static func fexp(_ m:FP12) -> FP12
+    {
+        let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb));
+        let x=BIG(ROM.CURVE_Bnx)
+        let r=FP12(m)
+    
+    // Easy part of final exp
+        var lv=FP12(r)
+        lv.inverse()
+        r.conj()
+    
+        r.mul(lv)
+        lv.copy(r)
+        r.frob(f)
+        r.frob(f)
+        r.mul(lv)
+        
+    // Hard part of final exp
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               lv.copy(r)
+               lv.frob(f)
+               let x0=FP12(lv)
+               x0.frob(f)
+               lv.mul(r)
+               x0.mul(lv)
+               x0.frob(f)
+               let x1=FP12(r)
+               x1.conj()
+               let x4=r.pow(x)
+
+               let x3=FP12(x4)
+               x3.frob(f)
+    
+               let x2=x4.pow(x)
+    
+               let x5=FP12(x2); x5.conj()
+               lv=x2.pow(x)
+    
+               x2.frob(f)
+               r.copy(x2); r.conj()
+    
+               x4.mul(r)
+               x2.frob(f)
+    
+               r.copy(lv)
+               r.frob(f)
+               lv.mul(r)
+    
+               lv.usqr()
+               lv.mul(x4)
+               lv.mul(x5)
+               r.copy(x3)
+               r.mul(x5)
+               r.mul(lv)
+               lv.mul(x2)
+               r.usqr()
+               r.mul(lv)
+               r.usqr()
+               lv.copy(r)
+               lv.mul(x1)
+               r.mul(x0)
+               lv.usqr()
+               r.mul(lv)
+               r.reduce()
+       } else {
+               let x0=FP12(r)
+               let x1=FP12(r)
+               lv.copy(r); lv.frob(f)
+               let x3=FP12(lv); x3.conj(); x1.mul(x3)
+               lv.frob(f); lv.frob(f)
+               x1.mul(lv)
+
+               r.copy(r.pow(x))  //r=r.pow(x);
+               x3.copy(r); x3.conj(); x1.mul(x3)
+               lv.copy(r); lv.frob(f)
+               x0.mul(lv)
+               lv.frob(f)
+               x1.mul(lv)
+               lv.frob(f)
+               x3.copy(lv); x3.conj(); x0.mul(x3)
+
+               r.copy(r.pow(x))
+               x0.mul(r)
+               lv.copy(r); lv.frob(f); lv.frob(f)
+               x3.copy(lv); x3.conj(); x0.mul(x3)
+               lv.frob(f)
+               x1.mul(lv)
+
+               r.copy(r.pow(x))
+               lv.copy(r); lv.frob(f)
+               x3.copy(lv); x3.conj(); x0.mul(x3)
+               lv.frob(f)
+               x1.mul(lv)
+
+               r.copy(r.pow(x))
+               x3.copy(r); x3.conj(); x0.mul(x3)
+               lv.copy(r); lv.frob(f)
+               x1.mul(lv)
+
+               r.copy(r.pow(x))
+               x1.mul(r)
+
+               x0.usqr()
+               x0.mul(x1)
+               r.copy(x0)
+               r.reduce()
+       }
+        return r
+    }
+    
+    // GLV method
+    static func glv(_ e:BIG) -> [BIG]
+    {
+       var u=[BIG]();
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               let t=BIG(0)
+               let q=BIG(ROM.CURVE_Order)
+               var v=[BIG]();
+               for _ in 0 ..< 2
+               {
+                       u.append(BIG(0))
+                       v.append(BIG(0))
+               }
+        
+               for i in 0 ..< 2
+               {
+                       t.copy(BIG(ROM.CURVE_W[i]))
+                       let d=BIG.mul(t,e)
+                       v[i].copy(d.div(q))
+               }
+               u[0].copy(e);
+               for i in 0 ..< 2
+               {
+                       for j in 0 ..< 2
+                       {
+                               t.copy(BIG(ROM.CURVE_SB[j][i]))
+                               t.copy(BIG.modmul(v[j],t,q))
+                               u[i].add(q)
+                               u[i].sub(t)
+                               u[i].mod(q)
+                       }
+               }
+       } else { // -(x^2).P = (Beta.x,y)
+               let q=BIG(ROM.CURVE_Order)
+               let x=BIG(ROM.CURVE_Bnx)
+               let x2=BIG.smul(x,x)
+               u.append(BIG(e))
+               u[0].mod(x2)
+               u.append(BIG(e))
+               u[1].div(x2)
+               u[1].rsub(q)
+
+       }
+        return u
+    }
+    // Galbraith & Scott Method
+    static func gs(_ e:BIG) -> [BIG]
+    {
+        var u=[BIG]();
+       if ROM.CURVE_PAIRING_TYPE == ROM.BN_CURVE {
+               let t=BIG(0)
+               let q=BIG(ROM.CURVE_Order)
+               var v=[BIG]();
+               for _ in 0 ..< 4
+               {
+                       u.append(BIG(0))
+                       v.append(BIG(0))
+               }
+        
+               for i in 0 ..< 4
+               {
+                       t.copy(BIG(ROM.CURVE_WB[i]))
+                       let d=BIG.mul(t,e)
+                       v[i].copy(d.div(q))
+               }
+               u[0].copy(e);
+               for i in 0 ..< 4
+               {
+                       for j in 0 ..< 4
+                       {
+                               t.copy(BIG(ROM.CURVE_BB[j][i]))
+                               t.copy(BIG.modmul(v[j],t,q))
+                               u[i].add(q)
+                               u[i].sub(t)
+                               u[i].mod(q)
+                       }
+               }
+       } else {
+               let x=BIG(ROM.CURVE_Bnx)
+               var w=BIG(e)
+               for i in 0 ..< 4
+               {
+                       u.append(BIG(w))
+                       u[i].mod(x)
+                       w.div(x)
+               }
+       }
+        return u
+    }  
+    
+    // Multiply P by e in group G1
+    static func G1mul(_ P:ECP,_ e:BIG) -> ECP
+    {
+        var R:ECP
+        if (ROM.USE_GLV)
+        {
+            P.affine()
+            R=ECP()
+            R.copy(P)
+            let Q=ECP()
+            Q.copy(P)
+            let q=BIG(ROM.CURVE_Order)
+            let cru=FP(BIG(ROM.CURVE_Cru))
+            let t=BIG(0)
+            var u=PAIR.glv(e)
+            Q.getx().mul(cru);
+    
+            var np=u[0].nbits()
+            t.copy(BIG.modneg(u[0],q))
+            var nn=t.nbits()
+            if (nn<np)
+            {
+                               u[0].copy(t)
+                               R.neg()
+            }
+    
+            np=u[1].nbits()
+            t.copy(BIG.modneg(u[1],q))
+            nn=t.nbits()
+            if (nn<np)
+            {
+                               u[1].copy(t)
+                               Q.neg()
+            }
+    
+            R=R.mul2(u[0],Q,u[1])
+        }
+        else
+        {
+            R=P.mul(e)
+        }
+        return R
+    }
+    
+    // Multiply P by e in group G2
+    static func G2mul(_ P:ECP2,_ e:BIG) -> ECP2
+    {
+        var R:ECP2
+        if (ROM.USE_GS_G2)
+        {
+            var Q=[ECP2]()
+            let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb));
+            let q=BIG(ROM.CURVE_Order);
+            var u=PAIR.gs(e);
+    
+            let t=BIG(0);
+            P.affine()
+            Q.append(ECP2())
+            Q[0].copy(P);
+            for i in 1 ..< 4
+            {
+                Q.append(ECP2()); Q[i].copy(Q[i-1]);
+                               Q[i].frob(f);
+            }
+            for i in 0 ..< 4
+            {
+                               let np=u[i].nbits();
+                               t.copy(BIG.modneg(u[i],q));
+                               let nn=t.nbits();
+                               if (nn<np)
+                               {
+                    u[i].copy(t);
+                    Q[i].neg();
+                               }
+            }
+    
+            R=ECP2.mul4(Q,u);
+        }
+        else
+        {
+            R=P.mul(e);
+        }
+        return R;
+    }
+    // f=f^e
+    // Note that this method requires a lot of RAM! Better to use compressed 
XTR method, see FP4.java
+    static func GTpow(_ d:FP12,_ e:BIG) -> FP12
+    {
+        var r:FP12
+        if (ROM.USE_GS_GT)
+        {
+            var g=[FP12]()
+            let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb))
+            let q=BIG(ROM.CURVE_Order)
+            let t=BIG(0)
+        
+            var u=gs(e)
+            g.append(FP12(0))
+            g[0].copy(d);
+            for i in 1 ..< 4
+            {
+                g.append(FP12(0)); g[i].copy(g[i-1])
+                               g[i].frob(f)
+            }
+            for i in 0 ..< 4
+            {
+                               let np=u[i].nbits()
+                               t.copy(BIG.modneg(u[i],q))
+                               let nn=t.nbits()
+                               if (nn<np)
+                               {
+                    u[i].copy(t)
+                    g[i].conj()
+                               }
+            }
+            r=FP12.pow4(g,u)
+        }
+        else
+        {
+            r=d.pow(e)
+        }
+        return r
+    }
+    // test group membership - no longer needed
+    // with GT-Strong curve, now only check that m!=1, conj(m)*m==1, and 
m.m^{p^4}=m^{p^2}
+/*
+    static func GTmember(m:FP12) -> Bool
+    {
+        if m.isunity() {return false}
+        let r=FP12(m)
+        r.conj()
+        r.mul(m)
+        if !r.isunity() {return false}
+    
+        let f=FP2(BIG(ROM.CURVE_Fra),BIG(ROM.CURVE_Frb))
+    
+        r.copy(m); r.frob(f); r.frob(f)
+        var w=FP12(r); w.frob(f); w.frob(f)
+        w.mul(m)
+        if !ROM.GT_STRONG
+        {
+            if !w.equals(r) {return false}
+            let x=BIG(ROM.CURVE_Bnx)
+            r.copy(m); w=r.pow(x); w=w.pow(x)
+            r.copy(w); r.sqr(); r.mul(w); r.sqr()
+            w.copy(m); w.frob(f)
+        }
+        return w.equals(r)
+    }
+*/   
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/swift/rand.swift
----------------------------------------------------------------------
diff --git a/version22/swift/rand.swift b/version22/swift/rand.swift
new file mode 100644
index 0000000..429a0eb
--- /dev/null
+++ b/version22/swift/rand.swift
@@ -0,0 +1,131 @@
+/*
+       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.
+*/
+
+//
+//  rand.swift
+//
+//  Created by Michael Scott on 17/06/2015.
+//  Copyright (c) 2015 Michael Scott. All rights reserved.
+//
+//  Cryptographic strong random number generator
+
+/* Marsaglia & Zaman Random number generator constants */
+final public class RAND {
+    private static let NK:Int=21
+    private static let NJ:Int=6
+    private static let NV:Int=8
+    private var ira=[UInt32](repeating: 0,count: NK)
+    private var rndptr:Int=0
+    private var borrow:UInt32=0
+    private var pool_ptr:Int=0
+    private var pool=[UInt8](repeating: 0,count: 32)
+    
+    public func clean()
+    {
+        pool_ptr=0
+        rndptr=0
+        for i in 0 ..< 32 {pool[i]=0}
+        for i in 0 ..< RAND.NK {ira[i]=0}
+        borrow=0;
+    }
+    
+    public init() {clean()}
+    
+    private func sbrand() -> UInt32
+    { /* Marsaglia & Zaman random number generator */
+        rndptr+=1;
+        if rndptr<RAND.NK {return ira[rndptr]}
+        rndptr=0;
+        var k=RAND.NK-RAND.NJ
+        for i in 0 ..< RAND.NK
+        {
+            if k==RAND.NK {k=0}
+            let t=ira[k];
+            let pdiff=t &- ira[i] &- borrow
+            if pdiff<t {borrow=0}
+            if pdiff>t {borrow=1}
+            ira[i]=pdiff
+            k += 1;
+        }
+        return ira[0]
+    }
+    
+    func sirand(_ seed: UInt32)
+    {
+        var m:UInt32=1
+        var s:UInt32=seed
+        borrow=0;
+        rndptr=0
+        ira[0]^=s
+        for i in 1 ..< RAND.NK
+        { /* fill initialisation vector */
+            let ipn=(RAND.NV*i)%RAND.NK
+            ira[ipn]^=m
+            let t=m
+            m=s &- m
+            s=t
+        }
+        for _ in 0 ..< 10000 {sbrand()}
+    }
+    
+    private func fill_pool()
+    {
+        let sh=HASH256()
+        for _ in 0 ..< 128 {sh.process(UInt8(sbrand()&0xff))}
+        pool=sh.hash()
+        pool_ptr=0
+    }
+    
+    private func pack(_ b: [UInt8]) -> UInt32
+    {
+        return 
(UInt32(b[3])<<24)|(UInt32(b[2])<<16)|(UInt32(b[1])<<8)|(UInt32(b[0]))
+    }
+  
+/* Initialize RNG with some real entropy from some external source */
+    public func seed(_ rawlen: Int,_ raw: [UInt8])
+    { /* initialise from at least 128 byte string of raw random entropy */
+        var digest=[UInt8]()
+        var b=[UInt8](repeating: 0, count: 4)
+        let sh=HASH256()
+        pool_ptr=0
+        for i in 0 ..< RAND.NK {ira[i]=0}
+        if rawlen>0
+        {
+            for i in 0 ..< rawlen {sh.process(raw[i])}
+            digest=sh.hash()
+            
+            for i in 0 ..< 8
+            {
+                b[0]=digest[4*i]; b[1]=digest[4*i+1]; b[2]=digest[4*i+2]; 
b[3]=digest[4*i+3]
+                sirand(pack(b))
+            }
+            
+        }
+        fill_pool()
+    }
+    
+    public func getByte() -> UInt8
+    {
+        let r=pool[pool_ptr]; pool_ptr+=1
+        if pool_ptr>=32 {fill_pool()}
+        return r
+    }
+    
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/swift/readme.txt
----------------------------------------------------------------------
diff --git a/version22/swift/readme.txt b/version22/swift/readme.txt
new file mode 100644
index 0000000..02d78b2
--- /dev/null
+++ b/version22/swift/readme.txt
@@ -0,0 +1,135 @@
+AMCL is very simple to build for Swift.
+
+
+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.
+
+
+First - decide the modulus and curve type you want to use. Edit rom32.swift 
+
+or rom64.swift where indicated. You will probably want to use one of the 
+curves 
+whose details are already in there. You might want to "raid" the 
+rom
+file from the C version of the library for more curves.
+
+Three example API files are provided, mpin.swift which 
+supports our M-Pin (tm) protocol, ecdh.swift which supports elliptic 
+curve key exchange, digital signature and public key crypto, and rsa.swift
+which supports the RSA method. The first  can be tested using the 
+TestMPIN.swift driver programs, the second can be tested using TestECDH.swift, 
+
+and the third with TestRSA.swift
+
+In the rom32.swift/rom64.swift file you must provide the curve constants. 
+
+Several examples are provided there, if you are willing to use one of these.
+
+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:-
+
+
+Copy rom32.swift to rom.swift for a 32-bit build.
+
+
+
+If using Xcode, load all of the swift files into a project. In "Build 
+Options",
+under "Swift Compiler - Custom Flags", set the compilation 
+condition D32. Then 
+build the project. 
+
+
+
+For a 64-bit build copy rom64.swift instead, and set D64 in Xcode. 
+
+Then build 
+and run the program main.swift
+
+
+
+
+Alternatively from a terminal window in a /lib directory create a dynamic 
+
+library using the command
+
+swiftc -DD32 big.swift rom.swift dbig.swift rand.swift hash256.swift 
hash384.swift hash512.swift fp.swift fp2.swift ecp.swift ecp2.swift aes.swift 
gcm.swift fp4.swift fp12.swift ff.swift pair.swift rsa.swift ecdh.swift 
mpin.swift -O -Ounchecked -whole-module-optimization -emit-library -emit-module 
-module-name amcl
+
+This creates the files 
+
+libamcl.dylib
+amcl.swiftmodule
+
+Copy these to a project directory, which contains only the files 
+
+TestECDH.swift
+TestRSA.swift
+TestMPIN.swift
+
+
+Edit these files to uncomment the line
+
+ 
+
+import amcl
+
+ 
+
+at the start of the program, and 
+
+
+
+TestXXXX()
+
+
+
+at the end of the program
+
+
+Finally create and run the projects by issuing the commands
+
+swift -lamcl -I. TestMPIN.swift 
+swift -lamcl -I. TestECDH.swift 
+swift -lamcl -I. TestRSA.swift 
+
+
+
+
+Note that classes and methods that need to be exposed to consuming programs, 
+should be made "public" when and if needed. Here we have done this as needed 
+just for these example programs.
+
+------------------------------------------------
+
+An alternative method to build applications is to use the swiftc compiler 
+directly. For example:-
+
+Edit main.swift to just include a call to BenchtestPAIR()
+
+Copy rom32.swift to rom.swift
+
+Compile directly using swiftc
+
+swiftc -DD32 -O -Ounchecked -whole-module-optimization main.swift 
BenchtestPAIR.swift pair.swift fp12.swift fp4.swift fp2.swift fp.swift 
big.swift dbig.swift ecp.swift ecp2.swift hash256.swift hash384.swift 
hash512.swift aes.swift rand.swift rom.swift -o main 
+
+Run the BenchtestPAIR() program by
+
+./main
+
+For the files needed to build other applications, see go/readme.txt
+
+Change "32" to "64" for a 64-bit build
+

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/swift/rom32.swift
----------------------------------------------------------------------
diff --git a/version22/swift/rom32.swift b/version22/swift/rom32.swift
new file mode 100644
index 0000000..9ac5f11
--- /dev/null
+++ b/version22/swift/rom32.swift
@@ -0,0 +1,645 @@
+/*
+       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.
+*/
+
+//
+//  rom.swift
+//
+//  Created by Michael Scott on 12/06/2015.
+//  Copyright (c) 2015 Michael Scott. All rights reserved.
+//
+
+typealias Chunk = Int32
+typealias DChunk = Int64
+
+final public class ROM{
+    
+    static let CHUNK:Int=32
+    
+    /* Don't Modify from here... */
+    static let NOT_SPECIAL=0
+    static let PSEUDO_MERSENNE=1
+    static let MONTGOMERY_FRIENDLY=2
+    static let GENERALISED_MERSENNE=3
+    static let WEIERSTRASS=0
+    static let EDWARDS=1
+    static let MONTGOMERY=2
+    static let BN_CURVE=0
+    static let BLS_CURVE=1
+
+    /* ...to here */
+    
+/*** Enter Some Field details here  ***/
+// BN254 Curve
+//    static let MODBITS:UInt = 254 /* Number of bits in Modulus */
+//    static let MOD8:UInt = 3   /* Modulus mod 8 */
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+    
+// BN454 Curve
+//    static let MODBITS:UInt = 454 /* Number of bits in Modulus */
+//    static let MOD8:UInt = 3   /* Modulus mod 8 */
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=128
+
+// BLS383 Curve
+  static let MODBITS:UInt = 383
+  static let MOD8:UInt = 3
+  static let BASEBITS:UInt = 28
+  static let AES_S:UInt =  0
+    
+// BLS455 Curve
+//    static let MODBITS:UInt = 455 /* Number of bits in Modulus */
+//    static let MOD8:UInt = 3   /* Modulus mod 8 */
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=128
+       
+// HIFIVE Curve
+//  static let MODBITS:UInt = 336
+//  static let MOD8:UInt = 5
+//  static let BASEBITS:UInt = 29
+//  static let AES_S:UInt=128
+        
+// GOLDILOCKS
+//     static let MODBITS:UInt=448
+//     static let MOD8:UInt=7
+//     static let BASEBITS:UInt=29
+//     static let AES_S:UInt=0
+    
+// NIST384
+//    static let MODBITS:UInt=384
+//    static let MOD8:UInt=7
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+   
+// C41417
+//    static let MODBITS:UInt=414
+//    static let MOD8:UInt=7
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// NIST521
+//    static let MODBITS:UInt=521
+//    static let MOD8:UInt=7
+//    static let BASEBITS:UInt=28
+//    static let AES_S:UInt=0
+
+// BN646
+//    static let MODBITS:UInt=646
+//    static let MOD8:UInt=3
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=192
+
+// Curve 25519
+//    static let MODBITS:UInt=255
+//    static let MOD8:UInt=5
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// NIST256 or Brainpool
+//    static let MODBITS:UInt=256
+//    static let MOD8:UInt=7
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// MF254
+//    static let MODBITS:UInt=254
+//    static let MOD8:UInt=7
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// MS255
+//    static let MODBITS:UInt = 255
+//    static let MOD8:UInt = 3
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// MF256
+//    static let MODBITS:UInt = 256
+//    static let MOD8:UInt = 7
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// MS256
+//    static let MODBITS:UInt = 256
+//    static let MOD8:UInt = 3
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+// ANSSI
+//    static let MODBITS:UInt = 256
+//    static let MOD8:UInt = 3
+//    static let BASEBITS:UInt=29
+//    static let AES_S:UInt=0
+
+    static let FFLEN:UInt=4
+    
+/* Don't Modify from here... */
+    static let NLEN:Int=Int(1+((MODBITS-1)/BASEBITS))
+    static let DNLEN:Int=2*NLEN
+    static let BMASK:Chunk=((1<<Chunk(BASEBITS))-1)
+    static let MODBYTES:UInt=(1+(MODBITS-1)/8)
+    static let NEXCESS:Int = (1<<(CHUNK-Int(BASEBITS)-1))
+    static let FEXCESS:Chunk = (1<<Chunk(BASEBITS*UInt(NLEN)-MODBITS));
+    static let OMASK:Chunk=Chunk(-1)<<Chunk(MODBITS%BASEBITS)
+    static let TBITS:UInt=MODBITS%BASEBITS; // Number of active bits in top 
word
+    static let TMASK:Chunk=(1<<Chunk(TBITS))-1
+    static let BIGBITS:UInt = (MODBYTES*8)
+    static let HBITS = (BASEBITS/2)
+    static let HMASK:Chunk = ((1<<Chunk(HBITS))-1)
+    
+   
+    /* Finite field support - for RSA, DH etc. */
+    static let FF_BITS:UInt=(BIGBITS*FFLEN) /* Finite Field Size in bits - 
must be BIGBITS.2^n */
+    static let HFLEN=(FFLEN/2);  /* Useful for half-size RSA private key 
operations */
+    
+    static let P_MBITS:UInt=ROM.MODBYTES*8
+    static let P_OMASK:Chunk=Chunk(-1)<<Chunk(P_MBITS%BASEBITS)
+    static let P_FEXCESS:Chunk=(1<<Chunk(BASEBITS*UInt(NLEN)-P_MBITS))
+    static let P_TBITS=(P_MBITS%ROM.BASEBITS)
+    
+/* ...to here */
+    
+// START SPECIFY FIELD DETAILS HERE
+//*********************************************************************************
+// Curve25519 Modulus
+//    static let MODTYPE=PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0x1FFFFFED,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7FFFFF]
+//    static let MConst:Chunk=19
+    
+// NIST-256 Modulus
+//    static let MODTYPE=NOT_SPECIAL
+//    static let 
Modulus:[Chunk]=[0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FF,0x0,0x0,0x40000,0x1FE00000,0xFFFFFF]
+//    static let MConst:Chunk=1
+
+// MF254 Modulus
+//    static let MODTYPE=MONTGOMERY_FRIENDLY
+//    static let 
Modulus:[Chunk]=[0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3F80FF]
+//    static let MConst:Chunk=0x3F8100
+// MS255 Modulus
+//    static let MODTYPE = PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0x1FFFFD03,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7FFFFF]
+//    static let MConst:Chunk=0x2FD
+// MF256 Modulus
+//    static let MODTYPE = MONTGOMERY_FRIENDLY
+//    static let 
Modulus:[Chunk]=[0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFFA7FF]
+//    static let MConst:Chunk=0xFFA800
+// MS256 Modulus
+//    static let MODTYPE = PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0x1FFFFF43,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFFFFFF]
+//    static let MConst:Chunk = 0xBD
+// Brainpool Modulus
+//    static let MODTYPE = NOT_SPECIAL
+//    static let 
Modulus:[Chunk]=[0x1F6E5377,0x9A40E8,0x9880A08,0x17EC47AA,0x18D726E3,0x5484EC1,0x6F0F998,0x1B743DD5,0xA9FB57]
+//    static let MConst:Chunk = 0xEFD89B9
+// ANSSI Modulus
+//    static let MODTYPE = NOT_SPECIAL
+//    static let 
Modulus:[Chunk]=[0x186E9C03,0x7E79A9E,0x12329B7A,0x35B7957,0x435B396,0x16F46721,0x163C4049,0x1181675A,0xF1FD17]
+//    static let MConst:Chunk = 0x164E1155
+    
+// HIFIVE Curve Modulus
+//  static let MODTYPE = PSEUDO_MERSENNE
+//  static let 
Modulus:[Chunk]=[0x1FFFFFFD,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFF]
+//  static let MConst:Chunk = 0x3
+    
+// GOLDILOCKS Curve Modulus
+//  static let MODTYPE = GENERALISED_MERSENNE
+//  static let 
Modulus:[Chunk]=[0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FDFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFF]
+//  static let MConst:Chunk = 0x1
+    
+// NIST384 Curve Modulus
+//    static let MODTYPE = NOT_SPECIAL
+//    static let 
Modulus:[Chunk]=[0x1FFFFFFF,0x7,0x0,0x1FFFFE00,0x1FFFEFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7F]
+//    static let MConst:Chunk = 0x1
+   
+// C41417 Curve Modulus
+//    static let MODTYPE = PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0x1FFFFFEF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFF]
+//    static let MConst:Chunk = 0x11
+   
+// NIST521 Curve Modulus
+//    static let MODTYPE = PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0x1FFFF]
+//    static let MConst:Chunk = 0x1
+  
+// BN646 Curve Modulus
+//    static let MODTYPE = NOT_SPECIAL
+//    static let 
Modulus:[Chunk]=[0x404E013,0x1203604,0x4E0000,0x80A2084,0x2,0xC90420,0x4051078,0x3600001,0xA20660,0x36,0x5100900,0x10288468,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90]
+//    static let MConst:Chunk = 0x15F615E5
+    
+// BNCX Curve Modulus
+//   static let MODTYPE = NOT_SPECIAL
+//   static let 
Modulus:[Chunk]=[0x1C1B55B3,0x13311F7A,0x24FB86F,0x1FADDC30,0x166D3243,0xFB23D31,0x836C2F7,0x10E05,0x240000]
+//   static let MConst:Chunk=0x19789E85
+
+// BN254 Curve Modulus
+//   static let MODTYPE = NOT_SPECIAL
+//   static let Modulus:[Chunk] = 
[0x13,0x18000000,0x4E9,0x2000000,0x8612,0x6C00000,0x6E8D1,0x10480000,0x252364]
+//   static let MConst:Chunk=0x179435E5
+    
+// BLS383 Curve
+    static let MODTYPE =  NOT_SPECIAL;
+    static let Modulus:[Chunk] = 
[0xAAD556B,0xACAAB52,0x5F75D7A,0x1BB0147,0xD5D7520,0xCF73083,0xF99EB16,0x531820,0xA68EA32,0x2C01355,0x552A785,0x5C6105C,0x80A9F7,0x7AC52];
+    static let MConst:Chunk=0x123D0BD;
+    
+
+// BN454 Curve Modulus
+//   static let MODTYPE = NOT_SPECIAL
+//   static let Modulus:[Chunk] = 
[0x13,0x270,0x2100,0x1C00D89C,0x25084,0xA284,0x24720,0x10803AA1,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000]
+//   static let MConst:Chunk=0x179435E5
+
+// BLS455 Curve Modulus
+ //  static let MODTYPE = NOT_SPECIAL
+ //  static let Modulus:[Chunk] = 
[0x2AB,0x1500000C,0xAAA55AA,0xB12AAD6,0x6D1BA6C,0xCCA5674,0x12E2CF6E,0xA9F9662,0x34BD939,0x12D8EAB1,0xFD9978E,0x9240600,0xE0F95B,0xAAB9550,0x55555E5,0xAAAAB]
+//   static let MConst:Chunk=0x1F4017FD
+
+    // START SPECIFY CURVE DETAILS HERE
+    
//*********************************************************************************
+    // Original Curve25519
+    //         static let CURVETYPE=MONTGOMERY
+    // static let CURVE_A:Int = 486662
+    // static let CURVE_B:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    // static let 
CURVE_Order:[Chunk]=[0x1CF5D3ED,0x9318D2,0x1DE73596,0x1DF3BD45,0x14D,0x0,0x0,0x0,0x100000]
+    // static let CURVE_Gx:[Chunk]=[0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    // static let CURVE_Gy:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // 
not used
+// Ed25519 Curve
+//    static let CURVETYPE=EDWARDS
+//    static let CURVE_A:Int = -1
+//    static let 
CURVE_B:[Chunk]=[0x135978A3,0xF5A6E50,0x10762ADD,0x149A82,0x1E898007,0x3CBBBC,0x19CE331D,0x1DC56DFF,0x52036C]
+//    static let 
CURVE_Order:[Chunk]=[0x1CF5D3ED,0x9318D2,0x1DE73596,0x1DF3BD45,0x14D,0x0,0x0,0x0,0x100000]
+//    static let 
CURVE_Gx:[Chunk]=[0xF25D51A,0xAB16B04,0x969ECB2,0x198EC12A,0xDC5C692,0x1118FEEB,0xFFB0293,0x1A79ADCA,0x216936]
+//    static let 
CURVE_Gy:[Chunk]=[0x6666658,0x13333333,0x19999999,0xCCCCCCC,0x6666666,0x13333333,0x19999999,0xCCCCCCC,0x666666]
+  
+// HIFIVE Curve
+//     static let CURVETYPE=EDWARDS
+//     static let CURVE_A:Int = 1
+//     static let 
CURVE_Order:[Chunk]=[0x1E9FA805,0x197CACB9,0x1E4EEA9E,0x17AD70F,0x1FA9850C,0x38A0A,0x0,0x0,0x0,0x0,0x0,0x4000]
+//     static let CURVE_B:[Chunk] = 
[0x2B67,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+//     static let CURVE_Gx:[Chunk] = 
[0xC,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+//     static let CURVE_Gy:[Chunk] = 
[0x5FE8632,0x15F63428,0xD976C4,0x1AACA194,0x35B6DB5,0x8E3F7A,0x52D1B0E,0xF0A7A36,0x1C161D00,0x8170C70,0x1185AD59,0x181B]
+ 
+// GOLDILOCKS Curve
+//     static let CURVETYPE=EDWARDS
+//     static let CURVE_A:Int = 1
+//     static let 
CURVE_Order:[Chunk]=[0xB5844F3,0x1BC61495,0x1163D548,0x1984E51B,0x3690216,0xDA4D76B,0xFA7113B,0x1FEF9944,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7FF]
+//     static let CURVE_B:[Chunk] = 
[0x1FFF6756,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FDFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFF]
+//     static let CURVE_Gx:[Chunk] = 
[0x15555555,0xAAAAAAA,0x15555555,0xAAAAAAA,0x15555555,0xAAAAAAA,0x15555555,0x152AAAAA,0xAAAAAAA,0x15555555,0xAAAAAAA,0x15555555,0xAAAAAAA,0x15555555,0xAAAAAAA,0x1555]
+//     static let CURVE_Gy:[Chunk] = 
[0xA9386ED,0x1757DE6F,0x13681AF6,0x19657DA3,0x3098BBB,0x12C19D15,0x12E03595,0xE515B18,0x17B7E36D,0x1AC426E,0xDBB5E8,0x10D8560,0x159D6205,0xB8246D9,0x17A58D2B,0x15C0]
+    
+// NIST384 Curve
+//    static let CURVETYPE=WEIERSTRASS
+//    static let CURVE_A:Int = -3
+//    static let 
CURVE_Order:[Chunk]=[0xCC52973,0x760CB56,0xC29DEBB,0x141B6491,0x12DDF581,0x6C0FA1B,0x1FFF1D8D,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7F]
+//    static let CURVE_B:[Chunk] = 
[0x13EC2AEF,0x142E476E,0xBB4674A,0xC731B14,0x1875AC65,0x447A809,0x4480C50,0xDDFD028,0x19181D9C,0x1F1FC168,0x623815A,0x47DCFC9,0x1312FA7E,0x59]
+//    static let CURVE_Gx:[Chunk] = 
[0x12760AB7,0x12A2F1C3,0x154A5B0E,0x5E4BB7E,0x2A38550,0xF0412A,0xE6167DD,0xC5174F3,0x146E1D3B,0x1799056B,0x3AC71C7,0x1D160A6F,0x87CA22B,0x55]
+//    static let CURVE_Gy:[Chunk] = 
[0x10EA0E5F,0x1218EBE4,0x1FA0675E,0x1639C3A,0xB8C00A6,0x1889DAF8,0x11F3A768,0x17A51342,0x9F8F41D,0x1C9496E1,0x1767A62F,0xC4C58DE,0x17DE4A9,0x1B]
+  
+// C41417 Curve
+//    static let CURVETYPE=EDWARDS
+//    static let CURVE_A:Int = 1
+//    static let 
CURVE_Order:[Chunk]=[0x106AF79,0x18738D2F,0x18F3C606,0x1806715A,0x22B36F1,0xA67B830,0xCF32490,0x1FFFFFFD,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1F]
+//    static let CURVE_B:[Chunk] = 
[0xE21,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+//    static let CURVE_Gx:[Chunk] = 
[0x13CBC595,0x7E9C097,0x14DF1931,0x14E7F550,0x1A111301,0x15A6B6B5,0xD526292,0x18FEAFFE,0x1F44C03E,0x1E6A31B4,0x70C9B97,0x43180C6,0x1443300,0x19A4828A,0x68]
+//    static let CURVE_Gy:[Chunk] = 
[0x22,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+   
+// NIST521 Curve
+//    static let CURVETYPE=WEIERSTRASS
+//    static let CURVE_A:Int = -3
+//    static let 
CURVE_Order:[Chunk]=[0x1386409,0x6FB71E9,0xC47AEBB,0xC9B8899,0x5D03BB5,0x48F709A,0xB7FCC01,0xBF2F966,0x1868783,0xFFFFFA5,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0xFFFFFFF,0x1FFFF]
+//    static let CURVE_B:[Chunk] = 
[0xB503F00,0x451FD46,0xC34F1EF,0xDF883D2,0xF073573,0xBD3BB1B,0xB1652C0,0xEC7E937,0x6193951,0xF109E15,0x489918E,0x15F3B8B,0x25B99B3,0xEEA2DA7,0xB68540,0x929A21A,0xE1C9A1F,0x3EB9618,0x5195]
+//    static let CURVE_Gx:[Chunk] = 
[0x2E5BD66,0x7E7E31C,0xA429BF9,0xB3C1856,0x8DE3348,0x27A2FFA,0x8FE1DC1,0xEFE7592,0x14B5E77,0x4D3DBAA,0x8AF606B,0xB521F82,0x139053F,0x429C648,0x62395B4,0x9E3ECB6,0x404E9CD,0x8E06B70,0xC685]
+//    static let CURVE_Gy:[Chunk] = 
[0xFD16650,0xBE94769,0x2C24088,0x7086A27,0x761353C,0x13FAD0,0xC550B9,0x5EF4264,0x7EE7299,0x3E662C9,0xFBD1727,0x446817A,0x449579B,0xD998F54,0x42C7D1B,0x5C8A5FB,0xA3BC004,0x296A789,0x11839]
+    
+// NIST-256 Curve
+    // static let CURVETYPE=WEIERSTRASS
+    //    static let CURVE_A:Int = -3;
+    //    static let 
CURVE_B:[Chunk]=[0x7D2604B,0x1E71E1F1,0x14EC3D8E,0x1A0D6198,0x86BC651,0x1EAABB4C,0xF9ECFAE,0x1B154752,0x5AC635]
+    //    static let 
CURVE_Order:[Chunk]=[0x1C632551,0x1DCE5617,0x5E7A13C,0xDF55B4E,0x1FFFFBCE,0x1FFFFFFF,0x3FFFF,0x1FE00000,0xFFFFFF]
+    //    static let 
CURVE_Gx:[Chunk]=[0x1898C296,0x509CA2E,0x1ACCE83D,0x6FB025B,0x40F2770,0x1372B1D2,0x91FE2F3,0x1E5C2588,0x6B17D1]
+    //    static let 
CURVE_Gy:[Chunk]=[0x17BF51F5,0x1DB20341,0xC57B3B2,0x1C66AED6,0x19E162BC,0x15A53E07,0x1E6E3B9F,0x1C5FC34F,0x4FE342]
+
+    // MF254 Modulus, Weierstrass Curve w-254-mont
+    //    static let CURVETYPE=WEIERSTRASS
+    //    static let CURVE_A:Int = -3
+    //    static let 
CURVE_B:[Chunk]=[0x1FFFD08D,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3F80FF]
+    //    static let 
CURVE_Order:[Chunk]=[0xF8DF83F,0x1D20CE25,0x8DD701B,0x317D41B,0x1FFFFEB8,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3F80FF]
+    //    static let CURVE_Gx:[Chunk]=[0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //    static let 
CURVE_Gy:[Chunk]=[0x190D4EBC,0xB2EF9BF,0x14464C6B,0xE71C7F0,0x18AEBDFB,0xD3ADEBB,0x18052B85,0x1A6765CA,0x140E3F]
+    
+    // MF254 Modulus, Edwards Curve ed-254-mont
+    //    static let CURVETYPE = EDWARDS
+    //    static let CURVE_A:Int = -1
+    //    static let CURVE_B:[Chunk]=[0x367B,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //    static let 
CURVE_Order:[Chunk]=[0x46E98C7,0x179E9FF6,0x158BEC3A,0xA60D917,0x1FFFFEB9,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFE03F]
+    //    static let CURVE_Gx:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //    static let 
CURVE_Gy:[Chunk]=[0xF2701E5,0x29687ED,0xC84861F,0x535081C,0x3F4E363,0x6A811B,0xCD65474,0x121AD498,0x19F0E6]
+
+    // MF254 Modulus, Montgomery Curve
+    //static let CURVETYPE = MONTGOMERY
+    //static let CURVE_A:Int = -55790;
+    //static let CURVE_B:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    //static let 
CURVE_Order:[Chunk]=[0x46E98C7,0x179E9FF6,0x158BEC3A,0xA60D917,0x1FFFFEB9,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFE03F]
+    //static let CURVE_Gx:[Chunk]=[0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let CURVE_Gy:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+ 
+    // MS255 Modulus, Weierstrass Curve
+    //static let CURVETYPE = WEIERSTRASS
+    //static let CURVE_A:Int = -3
+    //static let 
CURVE_B:[Chunk]=[0x1FFFAB46,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7FFFFF]
+    //static let 
CURVE_Order:[Chunk]=[0x1C594AEB,0x1C7D64C1,0x14ACF7EA,0x14705075,0x1FFFF864,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x7FFFFF]
+    //static let CURVE_Gx:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0x9CB44BA,0x199FFB3B,0x1F698345,0xD8F19BB,0x17D177DB,0x1FFCD97F,0xCE487A,0x181DB74F,0x6F7A6A]
+
+    // MS255 Modulus, Edwards Curve
+    //static let CURVETYPE = EDWARDS
+    //static let CURVE_A:Int = -1
+    //static let CURVE_B:[Chunk]=[0xEA97,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Order:[Chunk]=[0x436EB75,0x24E8F68,0x9A0CBAB,0x34F0BDB,0x1FFFFDCF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFF]
+    //static let CURVE_Gx:[Chunk]=[0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0x108736A0,0x11512ADE,0x1116916E,0x29715DA,0x47E5529,0x66EC706,0x1517B095,0xA694F76,0x26CB78]
+
+    // MS255 Modulus, Montgomery Curve
+    //static let CURVETYPE=MONTGOMERY
+    //static let CURVE_A:Int = -240222
+    //static let CURVE_B:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    //static let 
CURVE_Order:[Chunk]=[0x436EB75,0x24E8F68,0x9A0CBAB,0x34F0BDB,0x1FFFFDCF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFF]
+    //static let CURVE_Gx:[Chunk]=[0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let CURVE_Gy:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    
+    // MF256 Modulus, Weierstrass Curve
+    //static let CURVETYPE = WEIERSTRASS
+    //static let CURVE_A:Int = -3;
+    //static let CURVE_B:[Chunk]=[0x14E6A,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Order:[Chunk]=[0x79857EB,0x8862F0D,0x1941D2E7,0x2EA27CD,0x1FFFFFC5,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFFA7FF]
+    //static let CURVE_Gx:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0xB724D2A,0x3CAA61,0x5371984,0x128FD71B,0x1AE28956,0x1D13091E,0x339EEAE,0x10F7C301,0x20887C]
+    
+    // MF256, Edwards Curve
+    //static let CURVETYPE = EDWARDS
+    //static let CURVE_A:Int = -1
+    //static let CURVE_B:[Chunk]=[0x350A,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Order:[Chunk]=[0x18EC7BAB,0x16C976F6,0x19CCF259,0x9775F70,0x1FFFFB15,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3FE9FF]
+    //static let CURVE_Gx:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0x12F3C908,0xF553917,0x1FA9A35F,0xBCC91B,0x1AACA0C,0x1779ED96,0x156BABAF,0x1F1F1989,0xDAD8D4]
+   
+    // MF256 Modulus, Montgomery Curve
+    //static let CURVETYPE = MONTGOMERY
+    //static let CURVE_A:Int = -54314
+    //static let CURVE_B:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    //static let 
CURVE_Order:[Chunk]=[0x18EC7BAB,0x16C976F6,0x19CCF259,0x9775F70,0x1FFFFB15,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3FE9FF]
+    //static let CURVE_Gx:[Chunk]=[0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let CURVE_Gy:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+
+    // MS256, Weierstrass Curve
+    //static let CURVETYPE  = WEIERSTRASS
+    //static let CURVE_A:Int = -3
+    //static let CURVE_B:[Chunk]=[0x25581,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Order:[Chunk]=[0x751A825,0x559014A,0x9971808,0x1904EBD4,0x1FFFFE43,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0xFFFFFF]
+    //static let CURVE_Gx:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0x2B56C77,0x1FA31836,0x253B042,0x185F26EB,0xDD6BD02,0x4B66777,0x1B5FF20B,0xA783C8C,0x696F18]
+
+    // MS256, Edwards Curve
+    //static let CURVETYPE = EDWARDS
+    //static let CURVE_A:Int = -1;
+    //static let CURVE_B:[Chunk]=[0x3BEE,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Order:[Chunk]=[0x1122B4AD,0xDC27378,0x9AF1939,0x154AB5A1,0x1FFFFBE6,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3FFFFF]
+    //static let CURVE_Gx:[Chunk]=[0xD,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let 
CURVE_Gy:[Chunk]=[0x131CADBA,0x3FB7DA9,0x134C0FDC,0x14DAC704,0x46BFBE2,0x1859CFD0,0x1B6E8F4C,0x3C5424E,0x7D0AB4]
+
+    // MS256 Modulus, Montgomery Curve
+    //static let CURVETYPE = MONTGOMERY
+    //static let CURVE_A:Int = -61370
+    //static let CURVE_B:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    //static let 
CURVE_Order:[Chunk]=[0x1122B4AD,0xDC27378,0x9AF1939,0x154AB5A1,0x1FFFFBE6,0x1FFFFFFF,0x1FFFFFFF,0x1FFFFFFF,0x3FFFFF]
+    //static let CURVE_Gx:[Chunk]=[0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    //static let CURVE_Gy:[Chunk]=[0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0] // not 
used
+    
+    // Brainpool
+    //static let CURVETYPE = WEIERSTRASS
+    //static let CURVE_A:Int = -3
+    //static let 
CURVE_B:[Chunk]=[0x1EE92B04,0x172C080F,0xBD2495A,0x7D7895E,0x176B7BF9,0x13B99E85,0x1A93F99A,0x18861B09,0x662C61]
+    //static let 
CURVE_Order:[Chunk]=[0x174856A7,0xF07414,0x1869BDE4,0x12F5476A,0x18D718C3,0x5484EC1,0x6F0F998,0x1B743DD5,0xA9FB57]
+    //static let 
CURVE_Gx:[Chunk]=[0xE1305F4,0xD0C8AB1,0xBEF0ADE,0x28588F5,0x16149AFA,0x9D91D32,0x1EDDCC88,0x79839FC,0xA3E8EB]
+    //static let 
CURVE_Gy:[Chunk]=[0x1B25C9BE,0xD5F479A,0x1409C007,0x196DBC73,0x417E69B,0x1170A322,0x15B5FDEC,0x10468738,0x2D996C]
+    
+    // ANSSI
+    //static let CURVETYPE = WEIERSTRASS
+    //static let CURVE_A:Int = -3;
+    //static let 
CURVE_B:[Chunk]=[0x1B7BB73F,0x3AF6CB3,0xC68600C,0x181935C9,0xC00FDFE,0x1D3AA522,0x4C0352A,0x194A8515,0xEE353F]
+    //static let 
CURVE_Order:[Chunk]=[0x6D655E1,0x1FEEA2CE,0x14AFE507,0x18CFC281,0x435B53D,0x16F46721,0x163C4049,0x1181675A,0xF1FD17]
+    //static let 
CURVE_Gx:[Chunk]=[0x198F5CFF,0x64BD16E,0x62DC059,0xFA5B95F,0x23958C2,0x1EA3A4EA,0x7ACC460,0x186AD827,0xB6B3D4]
+    //static let 
CURVE_Gy:[Chunk]=[0x14062CFB,0x188AD0AA,0x19327860,0x3860FD1,0xEF8C270,0x18F879F6,0x12447E49,0x1EF91640,0x6142E0]
+
+
+    // BN254 Curve
+/*
+    static let CURVETYPE = WEIERSTRASS
+    static let CURVE_PAIRING_TYPE = BN_CURVE
+    static let CURVE_A:Int = 0
+    static let CURVE_B:[Chunk]=[0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let CURVE_Cof:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Order:[Chunk]=[0xD,0x8000000,0x428,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364]
+    static let CURVE_Bnx:[Chunk]=[0x1,0x4000000,0x10,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cru:[Chunk]=[0x7,0xC000000,0x1B3,0x12000000,0x2490,0x11200000,0x126CD,0x0,0x0]
+    static let 
CURVE_Fra:[Chunk]=[0xF2A6DE9,0xBEF3603,0xFDDF0B8,0x12E9249A,0x953F850,0xDA85423,0x1232D926,0x32425CF,0x1B3776]
+    static let 
CURVE_Frb:[Chunk]=[0x10D5922A,0xC10C9FC,0x10221431,0xF16DB65,0x16AC8DC1,0x1917ABDC,0xDD40FAA,0xD23DA30,0x9EBEE]
+    static let 
CURVE_Pxa:[Chunk]=[0x803FB2B,0xF721126,0x62FC364,0x9177691,0x1EDB6A46,0x63F4630,0x18BFAE36,0x176A33D6,0x61A10]
+    static let 
CURVE_Pxb:[Chunk]=[0x7D54CF3,0xC61A60F,0xDE12DC3,0x1AE8D75C,0xAA5B1F4,0x13C62CC1,0xCCC42A,0x1F374E6F,0x516AA]
+    static let 
CURVE_Pya:[Chunk]=[0x11CD2B9A,0xF8703C4,0xF826F46,0x1A15CD7B,0x822329B,0x104B34C6,0xD0E6A43,0x140D75F2,0x21897]
+    static let 
CURVE_Pyb:[Chunk]=[0xB3ACE9B,0x1168D763,0xE7255E2,0xDFFAE,0x18D37B09,0x22B7AF9,0x149A3DB5,0x1CF9162,0xEBB2B]
+    static let 
CURVE_Gx:[Chunk]=[0x12,0x18000000,0x4E9,0x2000000,0x8612,0x6C00000,0x6E8D1,0x10480000,0x252364]
+    static let CURVE_Gy:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_W:[[Chunk]]=[[0x3,0x0,0x81,0x3000000,0x618,0x0,0x0,0x0,0x0],[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0]]
+    static let 
CURVE_SB:[[[Chunk]]]=[[[0x4,0x8000000,0xA1,0x3000000,0x618,0x0,0x0,0x0,0x0],[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x8000000,0x3A7,0x1C000000,0x79E1,0x6C00000,0x6E8D1,0x10480000,0x252364]]]
+    static let 
CURVE_WB:[[Chunk]]=[[0x0,0x4000000,0x10,0x1000000,0x208,0x0,0x0,0x0,0x0],[0x5,0x14000000,0x152,0xE000000,0x1C70,0xC00000,0xC489,0x0,0x0],[0x3,0xC000000,0xB1,0x7000000,0xE38,0x10600000,0x6244,0x0,0x0],[0x1,0xC000000,0x30,0x1000000,0x208,0x0,0x0,0x0,0x0]]
+    static let 
CURVE_BB:[[[Chunk]]]=[[[0xD,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0xC,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0xC,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0x2,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0xC,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0xD,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0xC,0x4000000,0x418,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364]],[[0x2,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x8000000,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x2,0x4000000,0x10,0x0,0x0,0x0,0x0,0x0,0x0],[0x2,0x10000000,0x40,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x0,0x408,0x1F000000,0x7FF9,0x6C00000,0x6E8D1,0x10480000,0x252364],[0x2,0x4000000,0x10,0x0,0x0,0x0,0x0,0x0,0x0]]]
+
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+*/
+
+    // BLS383 Curve
+    
+    static let CURVETYPE = WEIERSTRASS;
+    static let CURVE_PAIRING_TYPE = BLS_CURVE;
+    static let CURVE_A:Int = 0;
+    
+    static let 
CURVE_Order:[Chunk]=[0xFFF001,0xFFF8000,0xFE7800,0xBFDE007,0xC5EDF1C,0x3000049,0x910007A,0xC40007F,0x641004C,0x14,0x0,0x0,0x0,0x0];
+    static let 
CURVE_B:[Chunk]=[0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Cof:[Chunk]=[0x52B,0x2A00,0xAAB2CA0,0x5560AAA,0x6055,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Gx:[Chunk]=[0xD10786B,0xD59B348,0x3F54AD0,0x3477C0E,0x4578B9B,0xBF25B73,0x7BB6F65,0x4F6AC00,0xFF57E9C,0xEFD5830,0xFB6EC02,0xADB9F88,0xEE4BC98,0xB08C];
+    static let 
CURVE_Gy:[Chunk]=[0xD145DDB,0x5DA023,0x5FEF7CC,0x13F518C,0x2B2A66F,0x56EC346,0xC7A925F,0x96F3019,0x981223E,0x9061047,0x8F5BE59,0x4810AD,0x9337671,0x1F390];
+    
+    static let 
CURVE_Bnx:[Chunk]=[0x40,0x100,0x110,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Cru:[Chunk]=[0xDA155A9,0xA3AAC4E,0x61E5E3D,0xDF2FE87,0xE632625,0xBCDFAAD,0xD3035A6,0x5123128,0xBEAD683,0xDBF3A2B,0x424190,0x5C5FAB2,0x80A9F7,0x7AC52];
+    static let 
CURVE_Fra:[Chunk]=[0x2B4508B,0x2BA59A9,0x6EEF343,0x63DB7A0,0x1DFBC74,0x40341CB,0x32D55D3,0x1639E9D,0x5CC36D4,0xB19B3F0,0xD86AB98,0xF323EE4,0xB198672,0x5A5F];
+    static let 
CURVE_Frb:[Chunk]=[0x7F904E0,0x81051A9,0xF086A37,0xB7D49A6,0xB7DB8AB,0x8F3EEB8,0xC6C9543,0xEEF7983,0x49CB35D,0x7A65F65,0x7CBFBEC,0x693D177,0x5672384,0x751F2];
+    static let 
CURVE_Pxa:[Chunk]=[0xBAC9472,0x6059885,0xE2DC36D,0x7C4D31D,0x8C88A7,0xBDC90C3,0x1C688FC,0x29F0197,0xC43F167,0x3693539,0x61EB8BF,0xD81E5A5,0x22B56BF,0x4D507];
+    static let 
CURVE_Pxb:[Chunk]=[0x272AB23,0x9B4BD7A,0xF44DCE8,0x7AF19D4,0x3206A34,0x3F6F7B9,0x2A819FB,0x571DD3E,0x635D7EE,0x3A2BA3B,0xC1A126,0xAC28C78,0x17C3E5B,0xEE36];
+    static let 
CURVE_Pya:[Chunk]=[0x77BD4FD,0x81D2309,0xDFDFC6,0xB66072,0xC89A0C,0x41FC959,0x878287A,0x2E1FBCF,0x14EEE65,0x11C230,0x6BB325E,0x2887881,0x859A05C,0x8F40];
+    static let 
CURVE_Pyb:[Chunk]=[0x52C4CE6,0xA5E20A2,0xAFF40C8,0x5907A74,0x2448EF3,0x41760A4,0xFDA199,0xFFEF82B,0x8D4EA49,0xA0F29A1,0x6E4997B,0xAC7F7B8,0xBA88C12,0x1DCAB];
+    
+    static let CURVE_W:[[Chunk]]=[[],[]];
+    static let CURVE_SB:[[[Chunk]]]=[[[],[]],[[],[]]];
+    static let CURVE_WB:[[Chunk]]=[[],[],[],[]];
+    static let 
CURVE_BB:[[[Chunk]]]=[[[],[],[],[]],[[],[],[],[]],[[],[],[],[]],[[],[],[],[]]];
+    
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+    
+    // BN454 Curve
+/*
+    static let CURVETYPE = WEIERSTRASS
+    static let CURVE_PAIRING_TYPE = BN_CURVE
+    static let CURVE_A:Int = 0
+
+    static let 
CURVE_Order:[Chunk]=[0xD,0x210,0x1F80,0x400D884,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000]
+    static let 
CURVE_B:[Chunk]=[0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cof:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Gx:[Chunk]=[0x12,0x270,0x2100,0x1C00D89C,0x25084,0xA284,0x24720,0x10803AA1,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000]
+    static let 
CURVE_Gy:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+
+    static let 
CURVE_Bnx:[Chunk]=[0x1,0x8,0x0,0x2000002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cru:[Chunk]=[0x7,0xD8,0x900,0x16002436,0x481,0x1B24,0x168,0x48006C9,0x1600006C,0x10000091,0xD80000D,0x240000,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Fra:[Chunk]=[0x1573B0EC,0x1816E4FE,0xA42E6E0,0x15DDCD87,0x2B17EC7,0x35B9A50,0x15AA1F74,0x1B7B2AC5,0x1CB5A200,0x9937657,0x17389A4A,0x738BADB,0xD92B321,0x3F5F0E6,0x1B1C9E9A,0x25CF3]
+    static let 
CURVE_Frb:[Chunk]=[0xA8C4F27,0x7E91D71,0x15BD3A1F,0x6230B14,0x1D50D1BD,0x1CA50833,0xA5827AB,0x15050FDB,0x74B3887,0x166C9A92,0x19C78A3C,0x199F4886,0x1B6D4F39,0x80A0F61,0x7236169,0x2230C]
+    static let 
CURVE_Pxa:[Chunk]=[0xF02B14,0x1DD1DD61,0x330AEC7,0x178617DE,0x1CEFFF36,0x116D35AF,0x1F879FBF,0x105DBF83,0x8345436,0x13664BCA,0x12EE86B5,0x776BB31,0x14AAFE16,0x41B3478,0x13E03554,0x2807A]
+    static let 
CURVE_Pxb:[Chunk]=[0x45BF266,0xE036876,0x8F0DBA,0xCB5976F,0x10DBC523,0x1723123C,0xBDDA7F4,0x10077CDE,0x11971DE0,0x14F1554A,0x195995EE,0x82E6FD7,0x40D5258,0x1400A58F,0x15A7850B,0x2B2A5]
+    static let 
CURVE_Pya:[Chunk]=[0x1E1B15C7,0x9CD5B5D,0x1571B2D2,0x1E4C048A,0x1474FB5D,0x18E2328C,0x11775519,0x144EF51F,0xF2FAABA,0x438F741,0x1930EAC0,0x144DC38,0x1287A0FE,0x36D8962,0x10011EAF,0x3ACF4]
+    static let 
CURVE_Pyb:[Chunk]=[0x571D60,0x8737DB,0xC4A363B,0x124E308F,0x13A65C7E,0x1387693A,0x10CDDA2F,0x184C096E,0x385175,0x5A34088,0xF17A93C,0x1E194915,0x1903ED91,0x4D6FA9F,0x8D8210B,0x12EDC]
+    static let 
CURVE_W:[[Chunk]]=[[0x3,0x40,0x180,0x10000010,0xC0,0x6,0x10000018,0xC00001,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+    static let 
CURVE_SB:[[[Chunk]]]=[[[0x4,0x50,0x180,0x14000014,0xC0,0x6,0x10000018,0xC00001,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x1D0,0x1E00,0x1400D874,0x24F03,0xA278,0x246F0,0xF003A9E,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000]]]
+    static let 
CURVE_WB:[[Chunk]]=[[0x0,0x8,0x80,0x2000002,0x40,0x2,0x10000008,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x5,0xA8,0x700,0xA00182A,0x381,0x121C,0x100,0x3800487,0x4000048,0x61,0x9000009,0x180000,0x0,0x0,0x0,0x0],[0x3,0x58,0x380,0x16000C16,0x1C0,0x90E,0x10000080,0x1C00243,0x12000024,0x10000030,0x4800004,0xC0000,0x0,0x0,0x0,0x0],[0x1,0x18,0x80,0x6000006,0x40,0x2,0x10000008,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+    static let 
CURVE_BB:[[[Chunk]]]=[[[0xD,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0x2,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xD,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,
 
0xC000048,0x2400003,0x48000]],[[0x2,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x2,0x8,0x0,0x2000002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2,0x20,0x0,0x8000008,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x200,0x1F80,0xD880,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0x2,0x8,0x0,0x2000002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]]
+
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+*/
+    // BLS455 Curve
+/*
+    static let CURVETYPE = WEIERSTRASS
+    static let CURVE_PAIRING_TYPE = BLS_CURVE
+    static let CURVE_A:Int = 0
+
+    static let 
CURVE_Order:[Chunk]=[0x1FC00001,0x3FFF,0x10000070,0x1400000,0x1D100,0xF0003A8,0x13C0009,0x1E200,0x180002E0,0x400001,0x4000,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_B:[Chunk]=[0xA,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cof:[Chunk]=[0xABFFAAB,0x14AABFFD,0xD52AADA,0x1562AAAB,0x15556AAA,0x2A,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Gx:[Chunk]=[0x1DFCEDD1,0x16A62EEF,0xE80D3ED,0xB8DE876,0x179C7253,0x182DAB52,0x46CC85F,0x1E571D9C,0x1E8392B1,0x1A155867,0x19E6527C,0x23DC64E,0xABEDA59,0xF20662B,0x17CECC01,0x310A]
+    static let 
CURVE_Gy:[Chunk]=[0x6619B9B,0x27EBCD,0x1BE80A19,0x13B014BA,0x191A4936,0x13911916,0x107A5A3B,0x1DCB0863,0x1F5FB1,0xDE44A9C,0x18E23B2A,0x1FA81FD3,0xB0D6DFA,0xC2FE1EF,0xDDFA7E2,0x3351B]
+
+    static let 
CURVE_Bnx:[Chunk]=[0x800,0x1000004,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cru:[Chunk]=[0xAA9,0x9017FE0,0x128DD8AA,0x1F4A321E,0x148FEC90,0x195CDEEA,0xE961AA2,0x168D3B66,0xAFD99D7,0xB989AA6,0x1F9A5724,0x91A05FF,0xE0EF5B,0xAAB9548,0x55555E5,0xAAAAB]
+    static let 
CURVE_Fra:[Chunk]=[0xA2EBF21,0x4E67DEE,0xCDE6590,0xE5EA94E,0x15454985,0x140CFC43,0x7E14D1C,0x1778395A,0x1944F022,0x166BEA1A,0xC3DEEA0,0x9F031A0,0x16A7459,0x1F1D6E00,0x125CFB72,0x72FD4]
+    static let 
CURVE_Frb:[Chunk]=[0x15D1438A,0x1019821D,0x1DCBF01A,0x1CB40187,0x118C70E6,0x18BD5A30,0xB018251,0x13275D08,0xA06E916,0x1C6D0096,0x39BA8ED,0x1F33D460,0x1F768501,0xB8E274F,0x12F85A72,0x37AD6]
+    static let 
CURVE_Pxa:[Chunk]=[0x10C1F542,0x23AF907,0x159F840,0xBAC0E1F,0x133D7766,0x1C034C5D,0x14C5C875,0x1ED0BDA2,0x16A49C71,0x1E9FF62D,0x14F3ACC0,0x1E0C9FEA,0xC4638DE,0x74D18DA,0xBEA0030,0x5D962]
+    static let 
CURVE_Pxb:[Chunk]=[0x749F03D,0xC843773,0xB17BCBA,0x1134AB4B,0x8EA016E,0x1A0D766C,0x58F819E,0x48A1FCC,0xE296F62,0x83370E4,0xC9BA1D5,0x1E43290E,0xEE59A80,0x1FDD85F5,0x1F3819B6,0x1D9F]
+    static let 
CURVE_Pya:[Chunk]=[0x181A77F4,0x191AD22,0x1E9F842A,0x1E1E6CF6,0xD55B9D9,0x1D062533,0x15BB1323,0x7ECBC1,0x1A9EC2EF,0x1EE14CE0,0x1E96B271,0xA794439,0x1C544324,0xE6AD5DC,0x16429B0F,0x448E3]
+    static let 
CURVE_Pyb:[Chunk]=[0x1E1FDBA2,0x1A09DB6C,0xF680D5B,0xFCC6122,0xC488E2A,0x1E489ECD,0x1005617E,0x1CF9EC36,0x1C89ED72,0x16C00D90,0x1563E595,0x1243DDC0,0x8698F9E,0x1BD81E7E,0xF2A0F4A,0x66A0]
+
+// Not used
+//    static let 
CURVE_W:[[Chunk]]=[[0x3,0x40,0x180,0x10000010,0xC0,0x6,0x10000018,0xC00001,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+//    static let 
CURVE_SB:[[[Chunk]]]=[[[0x4,0x50,0x180,0x14000014,0xC0,0x6,0x10000018,0xC00001,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x1D0,0x1E00,0x1400D874,0x24F03,0xA278,0x246F0,0xF003A9E,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000]]]
+//    static let 
CURVE_WB:[[Chunk]]=[[0x0,0x8,0x80,0x2000002,0x40,0x2,0x10000008,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x5,0xA8,0x700,0xA00182A,0x381,0x121C,0x100,0x3800487,0x4000048,0x61,0x9000009,0x180000,0x0,0x0,0x0,0x0],[0x3,0x58,0x380,0x16000C16,0x1C0,0x90E,0x10000080,0x1C00243,0x12000024,0x10000030,0x4800004,0xC0000,0x0,0x0,0x0,0x0],[0x1,0x18,0x80,0x6000006,0x40,0x2,0x10000008,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+//    static let 
CURVE_BB:[[[Chunk]]]=[[[0xD,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0x2,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xD,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0xC,0x208,0x1F80,0x200D882,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025
 
B,0xC000048,0x2400003,0x48000]],[[0x2,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1,0x10,0x0,0x4000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x2,0x8,0x0,0x2000002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2,0x20,0x0,0x8000008,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0xA,0x200,0x1F80,0xD880,0x24FC4,0xA27E,0x10024708,0xFC03A9F,0x400DA88,0x10EA,0x11002487,0xD80362,0x900025B,0xC000048,0x2400003,0x48000],[0x2,0x8,0x0,0x2000002,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]]
+
+    static let CURVE_W:[[Chunk]]=[[],[]]
+    static let CURVE_SB:[[[Chunk]]]=[[[],[]],[[],[]]]
+    static let CURVE_WB:[[Chunk]]=[[],[],[],[]]
+    static let 
CURVE_BB:[[[Chunk]]]=[[[],[],[],[]],[[],[],[],[]],[[],[],[],[]],[[],[],[],[]]]
+
+
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+*/
+    // BNCX Curve
+ /*
+    static let CURVETYPE = WEIERSTRASS
+    static let CURVE_PAIRING_TYPE = BN_CURVE
+    static let CURVE_A:Int = 0
+    static let CURVE_B:[Chunk]=[0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let CURVE_Cof:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Order:[Chunk]=[0x16EB1F6D,0x108E0531,0x1241B3AF,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000]
+    static let CURVE_Bnx:[Chunk]=[0x3C012B1,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cru:[Chunk]=[0x14235C97,0xF0498BC,0x1BE1D58C,0x1BBEC8E3,0x3F1440B,0x654,0x12000,0x0,0x0]
+    static let 
CURVE_Fra:[Chunk]=[0x15C80EA3,0x1EC8419A,0x1CFE0856,0xEE64DE2,0x11898686,0x5C55653,0x592BF86,0x5F4C740,0x135908]
+    static let 
CURVE_Frb:[Chunk]=[0x6534710,0x1468DDE0,0x551B018,0x10C78E4D,0x4E3ABBD,0x9ECE6DE,0x2A40371,0x1A0C46C5,0x10A6F7]
+    static let 
CURVE_Pxa:[Chunk]=[0x4D2EC74,0x428E777,0xF89C9B0,0x190B7F40,0x14BBB907,0x12807AE1,0x958D62C,0x58E0A76,0x19682D]
+    static let 
CURVE_Pxb:[Chunk]=[0xE29CFE1,0x1D2C7459,0x270C3D1,0x172F6184,0x19743F81,0x49BD474,0x192A8047,0x1D87C33E,0x1466B9]
+    static let 
CURVE_Pya:[Chunk]=[0xF0BE09F,0x7DFE75E,0x1FB06CC3,0x3667B08,0xE209636,0x110ABED7,0xE376078,0x1B2E4665,0xA79ED]
+    static let 
CURVE_Pyb:[Chunk]=[0x898EE9D,0xC825914,0x14BB7AFB,0xC9D4AD3,0x13461C28,0x122896C6,0x240D71B,0x73D9898,0x6160C]
+    static let 
CURVE_Gx:[Chunk]=[0x1C1B55B2,0x13311F7A,0x24FB86F,0x1FADDC30,0x166D3243,0xFB23D31,0x836C2F7,0x10E05,0x240000]
+    static let CURVE_Gy:[Chunk]=[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_W:[[Chunk]]=[[0x162FEB83,0x2A31A48,0x100E0480,0x16,0x600,0x0,0x0,0x0,0x0],[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0]]
+
+    
+    static let 
CURVE_SB:[[[Chunk]]]=[[[0x1DB010E4,0x2A31A48,0x100E04A0,0x16,0x600,0x0,0x0,0x0,0x0],[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0xBB33EA,0xDEAEAE9,0x233AF2F,0x1FADDC03,0x166D2643,0xFB23D31,0x836C2F7,0x10E05,0x240000]]]
+    
+    static let 
CURVE_WB:[[Chunk]]=[[0x167A84B0,0xE108C2,0x1004AC10,0x7,0x200,0x0,0x0,0x0,0x0],[0x1E220475,0x166FCCAD,0x129FE68D,0x1D29DB51,0x2A0DC07,0x438,0xC000,0x0,0x0],[0xF10B93,0x1B37E657,0x194FF34E,0x1E94EDA8,0x1506E03,0x21C,0x6000,0x0,0x0],[0x1DFAAA11,0xE108C2,0x1004AC30,0x7,0x200,0x0,0x0,0x0,0x0]]
+    
+    static let 
CURVE_BB:[[[Chunk]]]=[[[0x132B0CBD,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x132B0CBC,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x132B0CBC,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x7802562,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x132B0CBC,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x132B0CBD,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x132B0CBC,0x108E0531,0x1241B39F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000]],[[0x7802562,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0],[0x7802561,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x3C012B2,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0],[0xF004AC2,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0],[0xF6AFA0A,0x108E0531,0x1241B
 
38F,0x1FADDC19,0x166D2C43,0xFB23D31,0x836C2F7,0x10E05,0x240000],[0x3C012B2,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0]]]
+    
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = true
+*/
+    
+// BN646 Curve
+/*
+    static let CURVETYPE=WEIERSTRASS
+    static let CURVE_PAIRING_TYPE = BN_CURVE
+    static let CURVE_A:Int = 0
+    static let 
CURVE_Order:[Chunk]=[0x1E04200D,0x1203603,0x420000,0x80A207E,0x2,0xC303F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90]
+    static let CURVE_B:[Chunk] = 
[0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let CURVE_Cof:[Chunk] = 
[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let CURVE_Gx:[Chunk] = 
[0x404E012,0x1203604,0x4E0000,0x80A2084,0x2,0xC90420,0x4051078,0x3600001,0xA20660,0x36,0x5100900,0x10288468,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90]
+    static let CURVE_Gy:[Chunk] = 
[0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    
+    static let 
CURVE_Bnx:[Chunk]=[0x1001,0x0,0x10000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Cru:[Chunk]=[0x401B007,0x901,0x1B0000,0x1B024,0x0,0x288120,0xD812,0x900000,0x1B0120,0x0,0xD80000,0x6C048,0x0,0x6C0000,0x0,0x0,0x120000,0x0,0x0,0x0,0x0,0x0,0x0]
+    static let 
CURVE_Fra:[Chunk]=[0x4929A14,0x3B756CA,0x4337DD0,0xFC1417C,0x193166BB,0x1DC54515,0x1C0DF653,0x19BF8961,0x155980E,0x1983CB14,0x4D76309,0x1DEAB1A4,0xF9C3CF5,0x128FEC2D,0x867E339,0xDA0548A,0x1A480AF,0xA3CBCD2,0x116DA6E0,0x2A546E9,0x789577C,0x1F9459D2,0x27]
+    static let 
CURVE_Frb:[Chunk]=[0x1F7245FF,0x1D68DF39,0x1C1A822F,0x1848DF07,0x6CE9946,0x303BF0A,0x7F71A24,0x9A0769F,0x1F4C6E51,0x67C3521,0x38A5F6,0x123DD2C4,0x1063C317,0xFF825D2,0x17981E76,0x125FAB75,0x1EC78CD0,0x15C34375,0xE92591F,0x1D5ABD96,0x1876A883,0x6BA62D,0x68]
+    static let 
CURVE_Pxa:[Chunk]=[0x1CCC5E10,0x119F939,0xC6C7FE9,0x81022FF,0x6486AA6,0x1CBC560B,0x1F707429,0xC82F7B9,0x1A7F5CDA,0x14C0EB47,0x11412373,0x13DAF21E,0x126BE416,0x166744A7,0x506E81,0x1048FFA3,0x13A6B0C9,0x1A90979A,0xE78C338,0x1722C561,0xBFFF9A1,0xC1AF83C,0x3F]
+    static let 
CURVE_Pxb:[Chunk]=[0x67F4BC0,0x1BFC3C9,0x1E9DC3B6,0x87E2B03,0xB820274,0x1DD03B1E,0x517C463,0x1EFCBBC9,0x19F786A8,0x5572E90,0xD0BA5E0,0x16E8A40A,0x1013CF3B,0x11A7F82B,0x1C27B302,0x15E7CD12,0xB79A6DF,0x1EC6895B,0x5775A7E,0xBB28D24,0x416A171,0x127D284E,0x5D]
+    static let 
CURVE_Pya:[Chunk]=[0xC3FB414,0x2B868EE,0xD858793,0x157FCFE,0x16C849AD,0x1D17B0A4,0x1353CFEA,0x940A061,0x1CEF834E,0x7BE766A,0x4584C1C,0xE2397E9,0x418E9D4,0x8F53B8,0x53B37E0,0x11CA29D9,0xE425654,0x9EFF9AF,0x18CF27A1,0x17755A26,0x3F5481A,0x6C531BC,0x1E]
+    static let 
CURVE_Pyb:[Chunk]=[0x133908AD,0x17F1F1ED,0x14196532,0x19A85214,0x173EC3F7,0x1021EC2C,0xD798A3E,0x18F4C857,0x82EE2FA,0x11B5296D,0x1831D9C6,0x4463DB5,0x11B4812C,0xF93B884,0xC72653,0xEC6F6ED,0x916CFFF,0x1E81ED0A,0x1103518E,0x1E478B01,0x6B01074,0xC46CCAA,0x48]
+ 
+    static let 
CURVE_W:[[Chunk]]=[[0x6008003,0x0,0x80000,0x6,0x0,0x40030,0x3,0x0,0x30,0x0,0x0,0xC,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+    
+    static let 
CURVE_SB:[[[Chunk]]]=[[[0x600A004,0x0,0xA0000,0x6,0x0,0x50030,0x3,0x0,0x30,0x0,0x0,0xC,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1803A00A,0x1203603,0x3A0000,0x80A2078,0x2,0xBF03C0,0x4051072,0x3600001,0xA20600,0x36,0x5100900,0x10288450,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90]]]
+    
+    static let 
CURVE_WB:[[Chunk]]=[[0x2001000,0x0,0x10000,0x2,0x0,0x8010,0x1,0x0,0x10,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1C015005,0x600,0x150000,0x1201C,0x0,0x1C80E0,0x900E,0x600000,0x1200E0,0x0,0x900000,0x48038,0x0,0x480000,0x0,0x0,0xC0000,0x0,0x0,0x0,0x0,0x0,0x0],[0xE00B003,0x300,0xB0000,0x900E,0x0,0xE8070,0x4807,0x300000,0x90070,0x0,0x480000,0x2401C,0x0,0x240000,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0],[0x2003001,0x0,0x30000,0x2,0x0,0x18010,0x1,0x0,0x10,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]
+    
+    static let 
CURVE_BB:[[[Chunk]]]=[[[0x1E04100D,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x1E04100C,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x1E04100C,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x2002,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1E04100C,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x1E04100D,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075
 
,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x1E04100C,0x1203603,0x410000,0x80A207E,0x2,0xC283F0,0x4051075,0x3600001,0xA20630,0x36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90]],[[0x2002,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x2001,0x0,0x20000,0x0,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]],[[0x1002,0x0,0x10000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x4002,0x0,0x40000,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0],[0x1E04000A,0x1203603,0x400000,0x80A207E,0x2,0xC203F0,0x4051075,0x3600001,0xA20630,0x
 
36,0x5100900,0x1028845C,0xD,0x2881200,0x1B0,0x0,0x6C0D80,0x48,0x0,0x480,0x0,0x0,0x90],[0x1002,0x0,0x10000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]]]
+    
+    
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+*/  
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/c25f9e5c/version22/swift/rom64.swift
----------------------------------------------------------------------
diff --git a/version22/swift/rom64.swift b/version22/swift/rom64.swift
new file mode 100644
index 0000000..cc48b20
--- /dev/null
+++ b/version22/swift/rom64.swift
@@ -0,0 +1,258 @@
+/*
+       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.
+*/
+
+//
+//  rom.swift
+//
+//  Created by Michael Scott on 12/06/2015.
+//  Copyright (c) 2015 Michael Scott. All rights reserved.
+//
+
+typealias Chunk = Int64
+
+final public class ROM{
+    
+    static let CHUNK:Int=64
+    
+    /* Don't Modify from here... */
+    static let NOT_SPECIAL=0
+    static let PSEUDO_MERSENNE=1
+    static let MONTGOMERY_FRIENDLY=2
+    static let GENERALISED_MERSENNE=3
+    static let WEIERSTRASS=0
+    static let EDWARDS=1
+    static let MONTGOMERY=2
+    static let BN_CURVE=0
+    static let BLS_CURVE=1
+
+    /* ...to here */
+    
+/*** Enter Some Field details here  ***/
+
+// Curve 25519
+//    static let MODBITS:UInt=255
+//    static let MOD8:UInt=5
+//    static let BASEBITS:UInt=56
+//    static let AES_S:UInt=0
+    
+// GOLDILOCKS
+//  static let MODBITS:UInt=448
+//  static let MOD8:UInt=7
+//  static let BASEBITS:UInt=60
+//  static let AES_S:UInt=0
+
+    
+    
+// BN254 Curve
+//  static let MODBITS:UInt=254
+//  static let MOD8:UInt=3
+//  static let BASEBITS:UInt=56
+//  static let AES_S:UInt=0
+
+// BLS383 Curve
+static let MODBITS:UInt=383
+static let MOD8:UInt=3
+static let BASEBITS:UInt=56
+static let AES_S:UInt=0
+
+    
+// BLS455 Curve
+//  static let MODBITS:UInt=455
+//  static let MOD8:UInt=3
+//  static let BASEBITS:UInt=60
+//  static let AES_S:UInt=128
+    
+
+    static let FFLEN:UInt=4
+    
+/* Don't Modify from here... */
+    static let NLEN:Int=Int(1+((MODBITS-1)/BASEBITS))
+    static let DNLEN:Int=2*NLEN
+    static let BMASK:Chunk=((1<<Chunk(BASEBITS))-1)
+    static let MODBYTES:UInt=(1+(MODBITS-1)/8)
+    static let NEXCESS:Int = (1<<(CHUNK-Int(BASEBITS)-1))
+    static let FEXCESS:Chunk = (1<<Chunk(BASEBITS*UInt(NLEN)-MODBITS));
+    static let OMASK:Chunk=Chunk(-1)<<Chunk(MODBITS%BASEBITS)
+    static let TBITS:UInt=MODBITS%BASEBITS; // Number of active bits in top 
word
+    static let TMASK:Chunk=(1<<Chunk(TBITS))-1
+    static let BIGBITS:UInt = (MODBYTES*8)
+    static let HBITS = (BASEBITS/2)
+    static let HMASK:Chunk = ((1<<Chunk(HBITS))-1)
+    
+   
+    /* Finite field support - for RSA, DH etc. */
+    static let FF_BITS:UInt=(BIGBITS*FFLEN) /* Finite Field Size in bits - 
must be BIGBITS.2^n */
+    static let HFLEN=(FFLEN/2);  /* Useful for half-size RSA private key 
operations */
+    
+    static let P_MBITS:UInt=ROM.MODBYTES*8
+    static let P_OMASK:Chunk=Chunk(-1)<<Chunk(P_MBITS%BASEBITS)
+    static let P_FEXCESS:Chunk=(1<<Chunk(BASEBITS*UInt(NLEN)-P_MBITS))
+    static let P_TBITS=(P_MBITS%ROM.BASEBITS)
+    
+/* ...to here */
+    
+// START SPECIFY FIELD DETAILS HERE
+//*********************************************************************************
+// Curve25519 Modulus
+//    static let MODTYPE=PSEUDO_MERSENNE
+//    static let 
Modulus:[Chunk]=[0xFFFFFFFFFFFFED,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF]
+//    static let MConst:Chunk=19
+  
+//GOLDILOCKS
+//static let MODTYPE=GENERALISED_MERSENNE
+//static let 
Modulus:[Chunk]=[0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFEFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFF]
+//static let MConst:Chunk= 0x1
+    
+// BN254 Curve Modulus
+//static let MODTYPE=NOT_SPECIAL
+//static let 
Modulus:[Chunk]=[0x13,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482]
+//static let MConst:Chunk=0x435E50D79435E5
+   
+// BLS383 Curve
+static let MODTYPE=NOT_SPECIAL
+static let 
Modulus:[Chunk]=[0xACAAB52AAD556B,0x1BB01475F75D7A,0xCF73083D5D7520,0x531820F99EB16,0x2C01355A68EA32,0x5C6105C552A785,0x7AC52080A9F7]
+static let MConst:Chunk=0xA59AB3B123D0BD
+    
+    
+// BLS455 Curve
+//static let MODTYPE=NOT_SPECIAL
+//static let 
Modulus:[Chunk]=[0xAA00001800002AB,0xC589556B2AA956A,0xB9994ACE86D1BA6,0x3954FCB314B8B3D,0xE3A5B1D56234BD9,0x95B49203003F665,0x57955572AA00E0F,0x555559555]
+//static let MConst:Chunk=0xB3EF8137F4017FD
+   
+    
+
+// START SPECIFY CURVE DETAILS HERE
+//*********************************************************************************
+
+// Ed25519 Curve
+//    static let CURVETYPE=EDWARDS
+//    static let CURVE_A:Int = -1
+//    static let 
CURVE_B:[Chunk]=[0xEB4DCA135978A3,0xA4D4141D8AB75,0x797779E8980070,0x2B6FFE738CC740,0x52036CEE]
+//    static let 
CURVE_Order:[Chunk]=[0x12631A5CF5D3ED,0xF9DEA2F79CD658,0x14DE,0x0,0x10000000]
+//    static let 
CURVE_Gx:[Chunk]=[0x562D608F25D51A,0xC7609525A7B2C9,0x31FDD6DC5C692C,0xCD6E53FEC0A4E2,0x216936D3]
+//    static let 
CURVE_Gy:[Chunk]=[0x66666666666658,0x66666666666666,0x66666666666666,0x66666666666666,0x66666666]
+  
+    
+    
+// GOLDILOCKS
+//  static let CURVETYPE= EDWARDS
+//  static let CURVE_A:Int = 1;
+//  static let 
CURVE_B:[Chunk]=[0xFFFFFFFFFFF6756,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFEFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFF];
+//  static let 
CURVE_Order:[Chunk]=[0x378C292AB5844F3,0x6CC2728DC58F552,0xEDB49AED6369021,0xFFFF7CCA23E9C44,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFF,0x3FFFFFF];
+//  static let 
CURVE_Gx:[Chunk]=[0x555555555555555,0x555555555555555,0x555555555555555,0xAAA955555555555,0xAAAAAAAAAAAAAAA,0xAAAAAAAAAAAAAAA,0xAAAAAAAAAAAAAAA,0xAAAAAAA];
+//  static let 
CURVE_Gy:[Chunk]=[0xAEAFBCDEA9386ED,0xBCB2BED1CDA06BD,0x565833A2A3098BB,0x6D728AD8C4B80D6,0x7A035884DD7B7E3,0x205086C2B0036ED,0x34AD7048DB359D6,0xAE05E96];
+    
+    
+// BN254 Curve
+/*
+     static let CURVETYPE= WEIERSTRASS;
+     static let CURVE_PAIRING_TYPE = BN_CURVE;
+     static let CURVE_A:Int = 0;
+     static let CURVE_B:[Chunk]=[0x2,0x0,0x0,0x0,0x0];
+     static let 
CURVE_Order:[Chunk]=[0xD,0x800000000010A1,0x8000000007FF9F,0x40000001BA344D,0x25236482];
+     static let 
CURVE_Gx:[Chunk]=[0x12,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482];
+     static let CURVE_Gy:[Chunk]=[0x1,0x0,0x0,0x0,0x0];
+     
+     static let 
CURVE_Fra:[Chunk]=[0x7DE6C06F2A6DE9,0x74924D3F77C2E1,0x50A846953F8509,0x212E7C8CB6499B,0x1B377619];
+     static let 
CURVE_Frb:[Chunk]=[0x82193F90D5922A,0x8B6DB2C08850C5,0x2F57B96AC8DC17,0x1ED1837503EAB2,0x9EBEE69];
+     static let 
CURVE_Pxa:[Chunk]=[0xEE4224C803FB2B,0x8BBB4898BF0D91,0x7E8C61EDB6A464,0x519EB62FEB8D8C,0x61A10BB];
+     static let 
CURVE_Pxb:[Chunk]=[0x8C34C1E7D54CF3,0x746BAE3784B70D,0x8C5982AA5B1F4D,0xBA737833310AA7,0x516AAF9];
+     static let 
CURVE_Pya:[Chunk]=[0xF0E07891CD2B9A,0xAE6BDBE09BD19,0x96698C822329BD,0x6BAF93439A90E0,0x21897A0];
+     static let 
CURVE_Pyb:[Chunk]=[0x2D1AEC6B3ACE9B,0x6FFD739C9578A,0x56F5F38D37B090,0x7C8B15268F6D44,0xEBB2B0E];
+     static let CURVE_Bnx:[Chunk]=[0x80000000000001,0x40,0x0,0x0,0x0];
+     static let CURVE_Cof:[Chunk]=[0x1,0x0,0x0,0x0,0x0];
+     static let 
CURVE_Cru:[Chunk]=[0x80000000000007,0x6CD,0x40000000024909,0x49B362,0x0];
+     static let 
CURVE_W:[[Chunk]]=[[0x3,0x80000000000204,0x6181,0x0,0x0],[0x1,0x81,0x0,0x0,0x0]];
+     static let 
CURVE_SB:[[[Chunk]]]=[[[0x4,0x80000000000285,0x6181,0x0,0x0],[0x1,0x81,0x0,0x0,0x0]],[[0x1,0x81,0x0,0x0,0x0],[0xA,0xE9D,0x80000000079E1E,0x40000001BA344D,0x25236482]]];
+     static let 
CURVE_WB:[[Chunk]]=[[0x80000000000000,0x80000000000040,0x2080,0x0,0x0],[0x80000000000005,0x54A,0x8000000001C707,0x312241,0x0],[0x80000000000003,0x800000000002C5,0xC000000000E383,0x189120,0x0],[0x80000000000001,0x800000000000C1,0x2080,0x0,0x0]];
+     static let 
CURVE_BB:[[[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]]];
+     
+     static let USE_GLV = true
+     static let USE_GS_G2 = true
+     static let USE_GS_GT = true
+     static let GT_STRONG = false
+     */
+    
+    // BLS383 Curve
+    
+    static let CURVETYPE = WEIERSTRASS;
+    static let CURVE_PAIRING_TYPE = BLS_CURVE;
+    static let CURVE_A:Int = 0;
+    
+    static let 
CURVE_Order:[Chunk]=[0xFFF80000FFF001,0xBFDE0070FE7800,0x3000049C5EDF1C,0xC40007F910007A,0x14641004C,0x0,0x0];
+    static let CURVE_B:[Chunk]=[0x9,0x0,0x0,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Cof:[Chunk]=[0x2A00000052B,0x5560AAAAAB2CA0,0x6055,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Gx:[Chunk]=[0xD59B348D10786B,0x3477C0E3F54AD0,0xBF25B734578B9B,0x4F6AC007BB6F65,0xEFD5830FF57E9C,0xADB9F88FB6EC02,0xB08CEE4BC98];
+    static let 
CURVE_Gy:[Chunk]=[0x5DA023D145DDB,0x13F518C5FEF7CC,0x56EC3462B2A66F,0x96F3019C7A925F,0x9061047981223E,0x4810AD8F5BE59,0x1F3909337671];
+    
+    static let CURVE_Bnx:[Chunk]=[0x1000000040,0x110,0x0,0x0,0x0,0x0,0x0];
+    static let 
CURVE_Cru:[Chunk]=[0xA3AAC4EDA155A9,0xDF2FE8761E5E3D,0xBCDFAADE632625,0x5123128D3035A6,0xDBF3A2BBEAD683,0x5C5FAB20424190,0x7AC52080A9F7];
+    static let 
CURVE_Fra:[Chunk]=[0x2BA59A92B4508B,0x63DB7A06EEF343,0x40341CB1DFBC74,0x1639E9D32D55D3,0xB19B3F05CC36D4,0xF323EE4D86AB98,0x5A5FB198672];
+    static let 
CURVE_Frb:[Chunk]=[0x81051A97F904E0,0xB7D49A6F086A37,0x8F3EEB8B7DB8AB,0xEEF7983C6C9543,0x7A65F6549CB35D,0x693D1777CBFBEC,0x751F25672384];
+    static let 
CURVE_Pxa:[Chunk]=[0x6059885BAC9472,0x7C4D31DE2DC36D,0xBDC90C308C88A7,0x29F01971C688FC,0x3693539C43F167,0xD81E5A561EB8BF,0x4D50722B56BF];
+    static let 
CURVE_Pxb:[Chunk]=[0x9B4BD7A272AB23,0x7AF19D4F44DCE8,0x3F6F7B93206A34,0x571DD3E2A819FB,0x3A2BA3B635D7EE,0xAC28C780C1A126,0xEE3617C3E5B];
+    static let 
CURVE_Pya:[Chunk]=[0x81D230977BD4FD,0xB660720DFDFC6,0x41FC9590C89A0C,0x2E1FBCF878287A,0x11C23014EEE65,0x28878816BB325E,0x8F40859A05C];
+    static let 
CURVE_Pyb:[Chunk]=[0xA5E20A252C4CE6,0x5907A74AFF40C8,0x41760A42448EF3,0xFFEF82B0FDA199,0xA0F29A18D4EA49,0xAC7F7B86E4997B,0x1DCABBA88C12];
+    
+    static let CURVE_W:[[Chunk]]=[[],[]];
+    static let CURVE_SB:[[[Chunk]]]=[[[],[]],[[],[]]];
+    static let CURVE_WB:[[Chunk]]=[[],[],[],[]];
+    static let 
CURVE_BB:[[[Chunk]]]=[[[],[],[],[]],[[],[],[],[]],[[],[],[],[]],[[],[],[],[]]];
+    
+    
+    static let USE_GLV = true
+    static let USE_GS_G2 = true
+    static let USE_GS_GT = true
+    static let GT_STRONG = false
+    
+    
+    // BLS455 Curve
+    /*
+         static let CURVETYPE= WEIERSTRASS;
+     static let CURVE_PAIRING_TYPE = BLS_CURVE;
+     static let CURVE_A:Int =0;
+     
+     static let 
CURVE_Order:[Chunk]=[0x7FFFFC00001,0xA00000400001C,0x25E000750001D10,0xE0000F10004F000,0x80000380002,0x10,0x0,0x0];
+     static let CURVE_B:[Chunk]=[0xA,0x0,0x0,0x0,0x0,0x0,0x0,0x0];
+     static let 
CURVE_Cof:[Chunk]=[0xA9557FFAABFFAAB,0xAAB15555B54AAB6,0x555556AA,0x0,0x0,0x0,0x0,0x0];
+     static let 
CURVE_Gx:[Chunk]=[0x6D4C5DDFDFCEDD1,0x35C6F43B3A034FB,0x7F05B56A579C725,0xB1F2B8ECE11B321,0x9F342AB0CFE8392,0xA5911EE32767994,0x3005E40CC56ABED,0x18855F3B];
+     static let 
CURVE_Gy:[Chunk]=[0x404FD79A6619B9B,0x69D80A5D6FA0286,0xEE722322D91A493,0xB1EE58431C1E968,0xCA9BC8953801F5F,0xDFAFD40FE9E388E,0x9F8985FC3DEB0D6,0x19A8DB77E];
+     
+     static let 
CURVE_Bnx:[Chunk]=[0x20000080000800,0x10000,0x0,0x0,0x0,0x0,0x0,0x0];
+     static let 
CURVE_Cru:[Chunk]=[0x9202FFC00000AA9,0xFA5190F4A3762A,0x8B2B9BDD548FEC9,0xD7B469DB33A586A,0xC91731354CAFD99,0xF5B48D02FFFE695,0x57955572A900E0E,0x555559555];
+     static let 
CURVE_Fra:[Chunk]=[0x9CCFBDCA2EBF21,0x572F54A73379964,0x72819F887545498,0x22BBC1CAD1F8534,0xA82CD7D435944F0,0x4594F818D030F7B,0xEDCBE3ADC0016A7,0x397EA4973];
+     static let 
CURVE_Frb:[Chunk]=[0xA033043B5D1438A,0x6E5A00C3F72FC06,0x4717AB46118C70E,0x16993AE842C0609,0x3B78DA012CA06E9,0x501F99EA300E6EA,0x69C971C4E9FF768,0x1BD6B4BE1];
+     static let 
CURVE_Pxa:[Chunk]=[0x475F20F0C1F542,0x65D6070F8567E10,0xD780698BB33D776,0x71F685ED1531721,0x303D3FEC5B6A49C,0x8DEF064FF553CEB,0xC0E9A31B4C463,0x2ECB12FA8];
+     static let 
CURVE_Pxb:[Chunk]=[0x99086EE6749F03D,0xE89A55A5AC5EF2E,0x7B41AECD88EA016,0x622450FE6163E06,0x755066E1C8E296F,0xA80F219487326E8,0x66DBFBB0BEAEE59,0xECFFCE0];
+     static let 
CURVE_Pya:[Chunk]=[0x83235A4581A77F4,0x9F0F367B7A7E10A,0x8FA0C4A66D55B9D,0xEF03F65E0D6EC4C,0x9C7DC299C1A9EC2,0x32453CA21CFA5AC,0x6C3DCD5ABB9C544,0x22471D90A];
+     static let 
CURVE_Pyb:[Chunk]=[0xF413B6D9E1FDBA2,0xA7E630913DA0356,0xFBC913D9AC488E2,0x72E7CF61B401585,0x656D801B21C89ED,0xF9E921EEE0558F9,0x3D2B7B03CFC8698,0x33503CA8];
+     
+     static let CURVE_W:[[Chunk]]=[[],[]];
+     static let CURVE_SB:[[[Chunk]]]=[[[],[]],[[],[]]];
+     static let CURVE_WB:[[Chunk]]=[[],[],[],[]];
+     static let 
CURVE_BB:[[[Chunk]]]=[[[],[],[],[]],[[],[],[],[]],[[],[],[],[]],[[],[],[],[]]];
+     
+     
+     static let USE_GLV = true
+     static let USE_GS_G2 = true
+     static let USE_GS_GT = true
+     static let GT_STRONG = false
+     */
+}
+

Reply via email to