http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/PAIR.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/PAIR.go b/go/src/github.com/miracl/amcl-go/PAIR.go deleted file mode 100644 index 8a7de9f..0000000 --- a/go/src/github.com/miracl/amcl-go/PAIR.go +++ /dev/null @@ -1,541 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/* AMCL BN Curve Pairing functions */ - -package amcl - -//import "fmt" - -/* Line function */ -func line(A *ECP2, B *ECP2, Qx *FP, Qy *FP) *FP12 { - P := NewECP2() - - P.copy(A) - ZZ := NewFP2copy(P.getz()) - ZZ.sqr() - var D int - if A == B { - D = A.dbl() - } else { - D = A.add(B) - } - - if D < 0 { - return NewFP12int(1) - } - - Z3 := NewFP2copy(A.getz()) - - var a *FP4 - var b *FP4 - c := NewFP4int(0) - - if D == 0 { /* Addition */ - X := NewFP2copy(B.getx()) - Y := NewFP2copy(B.gety()) - T := NewFP2copy(P.getz()) - T.mul(Y) - ZZ.mul(T) - - NY := NewFP2copy(P.gety()) - NY.neg() - ZZ.add(NY) - Z3.pmul(Qy) - T.mul(P.getx()) - X.mul(NY) - T.add(X) - a = NewFP4fp2s(Z3, T) - ZZ.neg() - ZZ.pmul(Qx) - b = NewFP4fp2(ZZ) - } else { /* Doubling */ - X := NewFP2copy(P.getx()) - Y := NewFP2copy(P.gety()) - T := NewFP2copy(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 = NewFP4fp2s(Z3, X) - T.neg() - ZZ.mul(T) - ZZ.pmul(Qx) - b = NewFP4fp2(ZZ) - } - return NewFP12fp4s(a, b, c) -} - -/* Optimal R-ate pairing */ -func ate(P *ECP2, Q *ECP) *FP12 { - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - x := NewBIGints(CURVE_Bnx) - n := NewBIGcopy(x) - K := NewECP2() - var lv *FP12 - n.pmul(6) - n.dec(2) - n.norm() - P.affine() - Q.affine() - Qx := NewFPcopy(Q.getx()) - Qy := NewFPcopy(Q.gety()) - - A := NewECP2() - r := NewFP12int(1) - - A.copy(P) - nb := n.nbits() - - for i := nb - 2; i >= 1; i-- { - lv = line(A, A, Qx, Qy) - r.smul(lv) - - if n.bit(i) == 1 { - lv = line(A, P, Qx, Qy) - r.smul(lv) - } - r.sqr() - } - - lv = line(A, A, Qx, Qy) - r.smul(lv) - - /* R-ate fixup */ - - 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) */ -func ate2(P *ECP2, Q *ECP, R *ECP2, S *ECP) *FP12 { - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - x := NewBIGints(CURVE_Bnx) - n := NewBIGcopy(x) - K := NewECP2() - var lv *FP12 - n.pmul(6) - n.dec(2) - n.norm() - P.affine() - Q.affine() - R.affine() - S.affine() - - Qx := NewFPcopy(Q.getx()) - Qy := NewFPcopy(Q.gety()) - Sx := NewFPcopy(S.getx()) - Sy := NewFPcopy(S.gety()) - - A := NewECP2() - B := NewECP2() - r := NewFP12int(1) - - A.copy(P) - B.copy(R) - nb := n.nbits() - - for 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(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) - - /* R-ate fixup */ - 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 */ -func fexp(m *FP12) *FP12 { - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - x := NewBIGints(CURVE_Bnx) - r := NewFP12copy(m) - - /* Easy part of final exp */ - lv := NewFP12copy(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 */ - lv.copy(r) - lv.frob(f) - x0 := NewFP12copy(lv) - x0.frob(f) - lv.mul(r) - x0.mul(lv) - x0.frob(f) - x1 := NewFP12copy(r) - x1.conj() - x4 := r.pow(x) - - x3 := NewFP12copy(x4) - x3.frob(f) - - x2 := x4.pow(x) - - x5 := NewFP12copy(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() - return r -} - -/* GLV method */ -func glv(e *BIG) []*BIG { - t := NewBIGint(0) - q := NewBIGints(CURVE_Order) - var u []*BIG - var v []*BIG - - for i := 0; i < 2; i++ { - t.copy(NewBIGints(CURVE_W[i])) // why not just t=new BIG(ROM.CURVE_W[i]); - d := mul(t, e) - v = append(v, NewBIGcopy(d.div(q))) - u = append(u, NewBIGint(0)) - } - u[0].copy(e) - for i := 0; i < 2; i++ { - for j := 0; j < 2; j++ { - t.copy(NewBIGints(CURVE_SB[j][i])) - t.copy(modmul(v[j], t, q)) - u[i].add(q) - u[i].sub(t) - u[i].mod(q) - } - } - return u -} - -/* Galbraith & Scott Method */ -func gs(e *BIG) []*BIG { - t := NewBIGint(0) - q := NewBIGints(CURVE_Order) - var u []*BIG - var v []*BIG - for i := 0; i < 4; i++ { - t.copy(NewBIGints(CURVE_WB[i])) - d := mul(t, e) - v = append(v, NewBIGcopy(d.div(q))) - u = append(u, NewBIGint(0)) - } - u[0].copy(e) - for i := 0; i < 4; i++ { - for j := 0; j < 4; j++ { - t.copy(NewBIGints(CURVE_BB[j][i])) - t.copy(modmul(v[j], t, q)) - u[i].add(q) - u[i].sub(t) - u[i].mod(q) - } - } - return u -} - -/* Multiply P by e in group G1 */ -func G1mul(P *ECP, e *BIG) *ECP { - var R *ECP - if USE_GLV { - P.affine() - R = NewECP() - R.copy(P) - Q := NewECP() - Q.copy(P) - q := NewBIGints(CURVE_Order) - cru := NewFPbig(NewBIGints(CURVE_Cru)) - t := NewBIGint(0) - u := glv(e) - Q.getx().mul(cru) - - np := u[0].nbits() - t.copy(modneg(u[0], q)) - nn := t.nbits() - if nn < np { - u[0].copy(t) - R.neg() - } - - np = u[1].nbits() - t.copy(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 */ -func G2mul(P *ECP2, e *BIG) *ECP2 { - var R *ECP2 - if USE_GS_G2 { - var Q []*ECP2 - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - q := NewBIGints(CURVE_Order) - u := gs(e) - - t := NewBIGint(0) - P.affine() - Q = append(Q, NewECP2()) - Q[0].copy(P) - for i := 1; i < 4; i++ { - Q = append(Q, NewECP2()) - Q[i].copy(Q[i-1]) - Q[i].frob(f) - } - for i := 0; i < 4; i++ { - np := u[i].nbits() - t.copy(modneg(u[i], q)) - nn := t.nbits() - if nn < np { - u[i].copy(t) - Q[i].neg() - } - } - R = 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 */ -func GTpow(d *FP12, e *BIG) *FP12 { - var r *FP12 - if USE_GS_GT { - var g []*FP12 - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - q := NewBIGints(CURVE_Order) - t := NewBIGint(0) - - u := gs(e) - - g = append(g, NewFP12copy(d)) - for i := 1; i < 4; i++ { - g = append(g, NewFP12int(0)) - g[i].copy(g[i-1]) - g[i].frob(f) - } - for i := 0; i < 4; i++ { - np := u[i].nbits() - t.copy(modneg(u[i], q)) - nn := t.nbits() - if nn < np { - u[i].copy(t) - g[i].conj() - } - } - r = pow4(g, u) - } else { - r = d.pow(e) - } - return r -} - -/* test group membership */ -/* with GT-Strong curve, now only check that m!=1, conj(m)*m==1, and m.m^{p^4}=m^{p^2} */ -func GTmember(m *FP12) bool { - if m.isunity() { - return false - } - r := NewFP12copy(m) - r.conj() - r.mul(m) - if !r.isunity() { - return false - } - - f := NewFP2bigs(NewBIGints(CURVE_Fra), NewBIGints(CURVE_Frb)) - - r.copy(m) - r.frob(f) - r.frob(f) - w := NewFP12copy(r) - w.frob(f) - w.frob(f) - w.mul(m) - if !GT_STRONG { - if !w.equals(r) { - return false - } - x := NewBIGints(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) -} - -/* -func main() { - - Q:=NewECPbigs(NewBIGints(CURVE_Gx),NewBIGints(CURVE_Gy)) - P:=NewECP2fp2s(NewFP2bigs(NewBIGints(CURVE_Pxa),NewBIGints(CURVE_Pxb)),NewFP2bigs(NewBIGints(CURVE_Pya),NewBIGints(CURVE_Pyb))) - - r:=NewBIGints(CURVE_Order) - xa:=NewBIGints(CURVE_Pxa) - - fmt.Printf("P= "+P.toString()) - fmt.Printf("\n"); - fmt.Printf("Q= "+Q.toString()); - fmt.Printf("\n"); - - //m:=NewBIGint(17) - - e:=ate(P,Q) - fmt.Printf("\ne= "+e.toString()) - fmt.Printf("\n") - - e=fexp(e) - // e=GTpow(e,m); - - fmt.Printf("\ne= "+e.toString()) - fmt.Printf("\n"); - GLV:=glv(r) - - fmt.Printf("GLV[0]= "+GLV[0].toString()) - fmt.Printf("\n") - - fmt.Printf("GLV[0]= "+GLV[1].toString()) - fmt.Printf("\n") - - G:=NewECP(); G.copy(Q) - R:=NewECP2(); R.copy(P) - - - e=ate(R,Q) - e=fexp(e) - - e=GTpow(e,xa) - fmt.Printf("\ne= "+e.toString()); - fmt.Printf("\n") - - R=G2mul(R,xa) - e=ate(R,G) - e=fexp(e) - - fmt.Printf("\ne= "+e.toString()) - fmt.Printf("\n") - - G=G1mul(G,xa) - e=ate(P,G) - e=fexp(e) - fmt.Printf("\ne= "+e.toString()) - fmt.Printf("\n") -} -*/
http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/RAND.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/RAND.go b/go/src/github.com/miracl/amcl-go/RAND.go deleted file mode 100644 index eb92107..0000000 --- a/go/src/github.com/miracl/amcl-go/RAND.go +++ /dev/null @@ -1,187 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/* - * Cryptographic strong random number generator - * - * Unguessable seed -> SHA -> PRNG internal state -> SHA -> random numbers - * Slow - but secure - * - * See ftp://ftp.rsasecurity.com/pub/pdfs/bull-1.pdf for a justification - */ - -/* Marsaglia & Zaman Random number generator constants */ - -package amcl - -import ( - "sync" -) - -//import "fmt" - -const rand_NK int = 21 -const rand_NJ int = 6 -const rand_NV int = 8 - -type RAND struct { - sync.Mutex - ira [rand_NK]uint32 /* random number... */ - rndptr int - borrow uint32 - pool_ptr int - pool [32]byte -} - -/* Terminate and clean up */ -func (R *RAND) Clean() { /* kill internal state */ - R.pool_ptr = 0 - R.rndptr = 0 - for i := 0; i < 32; i++ { - R.pool[i] = 0 - } - for i := 0; i < rand_NK; i++ { - R.ira[i] = 0 - } - R.borrow = 0 -} - -func NewRAND() *RAND { - R := new(RAND) - R.Clean() - return R -} - -func (R *RAND) sbrand() uint32 { /* Marsaglia & Zaman random number generator */ - R.rndptr++ - if R.rndptr < rand_NK { - return R.ira[R.rndptr] - } - R.rndptr = 0 - k := rand_NK - rand_NJ - for i := 0; i < rand_NK; i++ { /* calculate next NK values */ - if k == rand_NK { - k = 0 - } - t := R.ira[k] - pdiff := t - R.ira[i] - R.borrow - if pdiff < t { - R.borrow = 0 - } - if pdiff > t { - R.borrow = 1 - } - R.ira[i] = pdiff - k++ - } - - return R.ira[0] -} - -func (R *RAND) sirand(seed uint32) { - var m uint32 = 1 - R.borrow = 0 - R.rndptr = 0 - R.ira[0] ^= seed - for i := 1; i < rand_NK; i++ { /* fill initialisation vector */ - in := (rand_NV * i) % rand_NK - R.ira[in] ^= m /* note XOR */ - t := m - m = seed - m - seed = t - } - - for i := 0; i < 10000; i++ { - R.sbrand() - } /* "warm-up" & stir the generator */ -} - -func (R *RAND) fill_pool() { - - sh := NewHASH() - for i := 0; i < 128; i++ { - sh.Process(byte(R.sbrand() & 0xff)) - } - R.pool = sh.Hash() - R.pool_ptr = 0 -} - -func pack(b [4]byte) uint32 { /* pack 4 bytes into a 32-bit Word */ - return (((uint32(b[3])) & 0xff) << 24) | ((uint32(b[2]) & 0xff) << 16) | ((uint32(b[1]) & 0xff) << 8) | (uint32(b[0]) & 0xff) -} - -/* Initialize RNG with some real entropy from some external source */ -func (R *RAND) Seed(rawlen int, raw []byte) { /* initialise from at least 128 byte string of raw random entropy */ - var b [4]byte - sh := NewHASH() - R.pool_ptr = 0 - - for i := 0; i < rand_NK; i++ { - R.ira[i] = 0 - } - - if rawlen > 0 { - for i := 0; i < rawlen; i++ { - sh.Process(raw[i]) - } - digest := sh.Hash() - - /* initialise PRNG from distilled randomness */ - - for i := 0; i < 8; i++ { - b[0] = digest[4*i] - b[1] = digest[4*i+1] - b[2] = digest[4*i+2] - b[3] = digest[4*i+3] - R.sirand(pack(b)) - } - } - R.fill_pool() -} - -/* get random byte */ -func (R *RAND) GetByte() byte { - R.Lock() - defer R.Unlock() - - r := R.pool[R.pool_ptr] - R.pool_ptr++ - - if R.pool_ptr >= 32 { - R.fill_pool() - } - return byte(r & 0xff) -} - -/* test main program */ -/* -func main() { - 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<1000;i++ { - fmt.Printf("%03d ",rng.GetByte()) - } -} -*/ http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/ROM.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/ROM.go b/go/src/github.com/miracl/amcl-go/ROM.go deleted file mode 100644 index 0a4ceb9..0000000 --- a/go/src/github.com/miracl/amcl-go/ROM.go +++ /dev/null @@ -1,353 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/* Fixed Data in ROM - Field and Curve parameters */ - -package amcl - -const NOT_SPECIAL int = 0 -const PSEUDO_MERSENNE int = 1 -const MONTGOMERY_FRIENDLY int = 2 -const WEIERSTRASS int = 0 -const EDWARDS int = 1 -const MONTGOMERY int = 2 - -const NLEN int = 5 -const DNLEN int = 2 * NLEN -const CHUNK int = 64 -const MODBYTES uint = 32 - -/*** Enter Some Field details here ***/ -// Curve 25519 -//const MODBITS uint=255 -//const MOD8 uint=5 -// NIST256 or Brainpool -//const MODBITS uint=256 -//const MOD8 uint=7 -// MF254 -//const MODBITS uint=254 -//const MOD8 uint=7 -// MS255 -//const MODBITS uint= 255 -//const MOD8 uint= 3 -// MF256 -//const MODBITS uint=256 -//const MOD8 uint=7 -// MS256 -//const MODBITS uint= 256 -//const MOD8 uint= 3 -// ANSSI -//const MODBITS uint= 256 -//const MOD8 uint= 3 -// BN Curve -const MODBITS uint = 254 /* Number of bits in Modulus */ -const MOD8 uint = 3 /* Modulus mod 8 */ - -/* Don't Modify from here... */ -const MASK int64 = ((int64(1) << BASEBITS) - 1) -const BASEBITS uint = 56 -const OMASK int64 = ((int64(-1)) << (MODBITS % BASEBITS)) -const HBITS uint = (BASEBITS / 2) -const HMASK int64 = ((int64(1) << HBITS) - 1) -const TBITS uint = MODBITS % BASEBITS // Number of active bits in top word -const TMASK int64 = (int64(1) << TBITS) - 1 -const FF_BITS int = 2048 /* Finite Field Size in bits - must be 256.2^n */ -const FFLEN int = (FF_BITS / 256) -const HFLEN int = (FFLEN / 2) /* Useful for half-size RSA private key operations */ - -const NEXCESS int = (1 << (uint(CHUNK) - BASEBITS - 1)) -const FEXCESS int64 = (int64(1) << (BASEBITS*uint(NLEN) - MODBITS)) - -// START SPECIFY FIELD DETAILS HERE -//********************************************************************************* -// Curve25519 Modulus -//const MODTYPE int=PSEUDO_MERSENNE -//var Modulus = [...]int64 {0xFFFFFFFFFFFFED,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF} -//const MConst int64=0x13 -// NIST-256 Curve -//const MODTYPE int=NOT_SPECIAL -//var Modulus = [...]int64 {0xFFFFFFFFFFFFFF,0xFFFFFFFFFF,0x0,0x1000000,0xFFFFFFFF} -//const MConst int64=0x1 -// MF254 Modulus -//const MODTYPE int=MONTGOMERY_FRIENDLY -//var Modulus= [...]int64 {0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x3F80FFFF} -//const MConst int64=0x3F810000 -// MS255 Modulus -//const MODTYPE int= 1 -//var Modulus= [...]int64 {0xFFFFFFFFFFFD03,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF} -//const MConst int64=0x2FD -// MF256 Modulus -//const MODTYPE int= 2 -//var Modulus= [...]int64 {0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFA7FFFF} -//const MConst int64=0xFFA80000 -// MS256 Modulus -//const MODTYPE int= 1 -//var Modulus= [...]int64 {0xFFFFFFFFFFFF43,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFF} -//const MConst int64=0xBD -// Brainpool -//const MODTYPE int= NOT_SPECIAL -//var Modulus= [...]int64 {0x13481D1F6E5377,0xF623D526202820,0x909D838D726E3B,0xA1EEA9BC3E660A,0xA9FB57DB} -//const MConst int64 =0xA75590CEFD89B9 -// ANSSI -//const MODTYPE int= 0 -//var Modulus= [...]int64{0xFCF353D86E9C03,0xADBCABC8CA6DE8,0xE8CE42435B3961,0xB3AD58F10126D,0xF1FD178C} -//const MConst int64=0x97483A164E1155 -// BNCX Curve Modulus -const MODTYPE int = NOT_SPECIAL - -var Modulus = [...]int64{0x6623EF5C1B55B3, 0xD6EE18093EE1BE, 0x647A6366D3243F, 0x8702A0DB0BDDF, 0x24000000} - -const MConst int64 = 0x4E205BF9789E85 - -// BN Curve -//const MODTYPE int=NOT_SPECIAL -//var Modulus= [...]int64 {0x13,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482} -//const MConst int64=0x435E50D79435E5 -// BNT Curve -//const MODTYPE int=NOT_SPECIAL -//var Modulus= [...]int64 {0x9DBBFEEEB4A713,0x555614F464BABE,0x3696F8D5F06E8A,0x6517014EFA0BAB,0x240120DB} -//const MConst int64=0xC5A872D914C4E5 -// BNT2 Curve -//const MODTYPE int=NOT_SPECIAL -//var Modulus= [...]int64 {0xB2DC2BB460A48B,0x93E428F0D651E8,0xF3B89D00081CF,0x410F5AADB74E20,0x24000482} -//const MConst int64=0xFE6A47A6505CDD - -// START SPECIFY CURVE DETAILS HERE -//********************************************************************************* - -// Ed25519 Curve -//const CURVETYPE int=EDWARDS -//const CURVE_A int = -1 -//var CURVE_B = [...]int64 {0xEB4DCA135978A3,0xA4D4141D8AB75,0x797779E8980070,0x2B6FFE738CC740,0x52036CEE} -//var CURVE_Order = [...]int64 {0x12631A5CF5D3ED,0xF9DEA2F79CD658,0x14DE,0x0,0x10000000} -//var CURVE_Gx = [...]int64 {0x562D608F25D51A,0xC7609525A7B2C9,0x31FDD6DC5C692C,0xCD6E53FEC0A4E2,0x216936D3} -//var CURVE_Gy = [...]int64 {0x66666666666658,0x66666666666666,0x66666666666666,0x66666666666666,0x66666666} - -// NIST-256 Curve -//const CURVETYPE int=WEIERSTRASS -//const CURVE_A int = -3 -//var CURVE_B = [...]int64 {0xCE3C3E27D2604B,0x6B0CC53B0F63B,0x55769886BC651D,0xAA3A93E7B3EBBD,0x5AC635D8} -//var CURVE_Order = [...]int64 {0xB9CAC2FC632551,0xFAADA7179E84F3,0xFFFFFFFFFFBCE6,0xFFFFFF,0xFFFFFFFF} -//var CURVE_Gx =[...]int64 {0xA13945D898C296,0x7D812DEB33A0F4,0xE563A440F27703,0xE12C4247F8BCE6,0x6B17D1F2} -//var CURVE_Gy =[...]int64 {0xB6406837BF51F5,0x33576B315ECECB,0x4A7C0F9E162BCE,0xFE1A7F9B8EE7EB,0x4FE342E2} - -// MF254 Modulus, Weierstrass Curve w-254-mont -//const CURVETYPE int= 0 -//const CURVE_A int = -3 -//var CURVE_B = [...]int64 {0xFFFFFFFFFFD08D,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x3F80FFFF} -//var CURVE_Order=[...]int64 {0xA419C4AF8DF83F,0x8BEA0DA375C06F,0xFFFFFFFFFFEB81,0xFFFFFFFFFFFFFF,0x3F80FFFF} -//var CURVE_Gx =[...]int64 {0x2,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x65DF37F90D4EBC,0x38E3F8511931AD,0x75BD778AEBDFB7,0x3B2E56014AE15A,0x140E3FD3} - -// MF254 Modulus, Edwards Curve ed-254-mont -//const CURVETYPE int= 1 -//const CURVE_A int= -1 -//var CURVE_B = [...]int64 {0x367B,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0xF3D3FEC46E98C7,0x306C8BD62FB0EA,0xFFFFFFFFFFEB95,0xFFFFFFFFFFFFFF,0xFE03FFF} -//var CURVE_Gx =[...]int64 {0x1,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x52D0FDAF2701E5,0x9A840E3212187C,0xD502363F4E3632,0xD6A4C335951D00,0x19F0E690} - -// MF254 Modulus, Montgomery Curve -//const CURVETYPE int=MONTGOMERY -//const CURVE_A int= -55790 -//var CURVE_B = [...]int64 {0x0,0x0,0x0,0x0,0x0} // not used -//var CURVE_Order=[...]int64 {0xF3D3FEC46E98C7,0x306C8BD62FB0EA,0xFFFFFFFFFFEB95,0xFFFFFFFFFFFFFF,0xFE03FFF} -//var CURVE_Gx =[...]int64 {0x3,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x0,0x0,0x0,0x0,0x0} // not used - -// MS255 Modulus, Weierstrass Curve -//const CURVETYPE int= 0 -//const CURVE_A int= -3 -//var CURVE_B = [...]int64 {0xFFFFFFFFFFAB46,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFF,0x7FFFFFFF} -//var CURVE_Order=[...]int64 {0x8FAC983C594AEB,0x38283AD2B3DFAB,0xFFFFFFFFFF864A,0xFFFFFFFFFFFFFF,0x7FFFFFFF} -//var CURVE_Gx =[...]int64 {0x1,0x0,0x0,0x0,0x0}; -//var CURVE_Gy =[...]int64 {0x33FF6769CB44BA,0xC78CDDFDA60D17,0xF9B2FF7D177DB6,0xEDBA7833921EBF,0x6F7A6AC0} - -// MS255 Modulus, Edwards Curve -//const CURVETYPE int= 1 -//const CURVE_A int= -1 -//var CURVE_B = [...]int64{0xEA97,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64{0x49D1ED0436EB75,0xA785EDA6832EAC,0xFFFFFFFFFFDCF1,0xFFFFFFFFFFFFFF,0x1FFFFFFF} -//var CURVE_Gx =[...]int64{0x4,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64{0x2A255BD08736A0,0x4B8AED445A45BA,0xDD8E0C47E55291,0x4A7BB545EC254C,0x26CB7853} - -// MS255 Modulus, Montgomery Curve -//const CURVETYPE int=MONTGOMERY -//const CURVE_A int=-240222 -//var CURVE_B = [...]int64 {0x0,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0x49D1ED0436EB75,0xA785EDA6832EAC,0xFFFFFFFFFFDCF1,0xFFFFFFFFFFFFFF,0x1FFFFFFF} -//var CURVE_Gx =[...]int64 {0x4,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x0,0x0,0x0,0x0,0x0}; - -// MF256 Modulus, Weierstrass Curve -//const CURVETYPE int= 0 -//const CURVE_A int= -3 -//var CURVE_B = [...]int64 {0x14E6A,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0x10C5E1A79857EB,0x7513E6E5074B9D,0xFFFFFFFFFFFC51,0xFFFFFFFFFFFFFF,0xFFA7FFFF} -//var CURVE_Gx =[...]int64 {0x1,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x7954C2B724D2A,0x47EB8D94DC6610,0x26123DAE289569,0xBE1808CE7BABBA,0x20887C87} - -// MF256, Edwards Curve -//const CURVETYPE int= 1 -//const CURVE_A int= -1 -//var CURVE_B = [...]int64 {0x350A,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0xD92EDED8EC7BAB,0xBBAFB86733C966,0xFFFFFFFFFFB154,0xFFFFFFFFFFFFFF,0x3FE9FFFF} -//var CURVE_Gx =[...]int64 {0x1,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0xEAA722F2F3C908,0x5E648DFEA68D7D,0xF3DB2C1AACA0C0,0xF8CC4D5AEAEBEE,0xDAD8D4F8} - -// MF256 Modulus, Montgomery Curve -//const CURVETYPE int=MONTGOMERY -//const CURVE_A int= -54314 -//var CURVE_B = [...]int64 {0x0,0x0,0x0,0x0,0x0} // not used -//var CURVE_Order=[...]int64 {0xD92EDED8EC7BAB,0xBBAFB86733C966,0xFFFFFFFFFFB154,0xFFFFFFFFFFFFFF,0x3FE9FFFF} -//var CURVE_Gx =[...]int64 {0x8,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x0,0x0,0x0,0x0,0x0} // not used - -// MS256, Weierstrass Curve -//const CURVETYPE int= 0 -//const CURVE_A int= -3 -//var CURVE_B = [...]int64 {0x25581,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0xAB20294751A825,0x8275EA265C6020,0xFFFFFFFFFFE43C,0xFFFFFFFFFFFFFF,0xFFFFFFFF} -//var CURVE_Gx =[...]int64 {0x1,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0xF46306C2B56C77,0x2F9375894EC10B,0x6CCEEEDD6BD02C,0xC1E466D7FC82C9,0x696F1853} - -// MS256, Edwards Curve -//const CURVETYPE int= 1 -//const CURVE_A int= -1 -//var CURVE_B = [...]int64 {0x3BEE,0x0,0x0,0x0,0x0} -//var CURVE_Order=[...]int64 {0xB84E6F1122B4AD,0xA55AD0A6BC64E5,0xFFFFFFFFFFBE6A,0xFFFFFFFFFFFFFF,0x3FFFFFFF} -//var CURVE_Gx =[...]int64 {0xD,0x0,0x0,0x0,0x0} -//var CURVE_Gy =[...]int64 {0x7F6FB5331CADBA,0x6D63824D303F70,0xB39FA046BFBE2A,0x2A1276DBA3D330,0x7D0AB41E} - -// MS256 Modulus, Montgomery Curve -//const CURVETYPE int=MONTGOMERY -//const CURVE_A int=-61370 -//var CURVE_B = [...]int64 {0x0,0x0,0x0,0x0,0x0} // not used -//var CURVE_Order= [...]int64 {0xB84E6F1122B4AD,0xA55AD0A6BC64E5,0xFFFFFFFFFFBE6A,0xFFFFFFFFFFFFFF,0x3FFFFFFF} -//var CURVE_Gx = [...]int64 {0xb,0x0,0x0,0x0,0x0} -//var CURVE_Gy = [...]int64 {0x0,0x0,0x0,0x0,0x0} // not used - -// Brainpool -//const CURVETYPE int= 0 -//const CURVE_A int= -3 -//var CURVE_B = [...]int64 {0xE58101FEE92B04,0xEBC4AF2F49256A,0x733D0B76B7BF93,0x30D84EA4FE66A7,0x662C61C4} -//var CURVE_Order= [...]int64 {0x1E0E82974856A7,0x7AA3B561A6F790,0x909D838D718C39,0xA1EEA9BC3E660A,0xA9FB57DB} -//var CURVE_Gx = [...]int64 {0xA191562E1305F4,0x42C47AAFBC2B79,0xB23A656149AFA1,0xC1CFE7B7732213,0xA3E8EB3C} -//var CURVE_Gy = [...]int64 {0xABE8F35B25C9BE,0xB6DE39D027001D,0xE14644417E69BC,0x3439C56D7F7B22,0x2D996C82} - -// ANSSI -//const CURVETYPE int= 0 -//const CURVE_A int= -3 -//var CURVE_B = [...]int64 {0x75ED967B7BB73F,0xC9AE4B1A18030,0x754A44C00FDFEC,0x5428A9300D4ABA,0xEE353FCA} -//var CURVE_Order=[...]int64 {0xFDD459C6D655E1,0x67E140D2BF941F,0xE8CE42435B53DC,0xB3AD58F10126D,0xF1FD178C} -//var CURVE_Gx =[...]int64 {0xC97A2DD98F5CFF,0xD2DCAF98B70164,0x4749D423958C27,0x56C139EB31183D,0xB6B3D4C3} -//var CURVE_Gy =[...]int64 {0x115A1554062CFB,0xC307E8E4C9E183,0xF0F3ECEF8C2701,0xC8B204911F9271,0x6142E0F7} - -// BNCX Curve - -const CURVETYPE int = WEIERSTRASS -const CURVE_A int = 0 - -var CURVE_B = [...]int64{0x2, 0x0, 0x0, 0x0, 0x0} -var CURVE_Order = [...]int64{0x11C0A636EB1F6D, 0xD6EE0CC906CEBE, 0x647A6366D2C43F, 0x8702A0DB0BDDF, 0x24000000} -var CURVE_Bnx = [...]int64{0x3C012B1, 0x40, 0x0, 0x0, 0x0} -var CURVE_Cru = [...]int64{0xE0931794235C97, 0xDF6471EF875631, 0xCA83F1440BD, 0x480000, 0x0} -var CURVE_Fra = [...]int64{0xD9083355C80EA3, 0x7326F173F8215B, 0x8AACA718986867, 0xA63A0164AFE18B, 0x1359082F} -var CURVE_Frb = [...]int64{0x8D1BBC06534710, 0x63C7269546C062, 0xD9CDBC4E3ABBD8, 0x623628A900DC53, 0x10A6F7D0} -var CURVE_Pxa = [...]int64{0x851CEEE4D2EC74, 0x85BFA03E2726C0, 0xF5C34BBB907C, 0x7053B256358B25, 0x19682D2C} -var CURVE_Pxb = [...]int64{0xA58E8B2E29CFE1, 0x97B0C209C30F47, 0x37A8E99743F81B, 0x3E19F64AA011C9, 0x1466B9EC} -var CURVE_Pya = [...]int64{0xFBFCEBCF0BE09F, 0xB33D847EC1B30C, 0x157DAEE2096361, 0x72332B8DD81E22, 0xA79EDD9} -var CURVE_Pyb = [...]int64{0x904B228898EE9D, 0x4EA569D2EDEBED, 0x512D8D3461C286, 0xECC4C09035C6E4, 0x6160C39} -var CURVE_Gx = [...]int64{0x6623EF5C1B55B2, 0xD6EE18093EE1BE, 0x647A6366D3243F, 0x8702A0DB0BDDF, 0x24000000} -var CURVE_Gy = [...]int64{0x1, 0x0, 0x0, 0x0, 0x0} -var CURVE_W = [2][5]int64{{0x546349162FEB83, 0xB40381200, 0x6000, 0x0, 0x0}, {0x7802561, 0x80, 0x0, 0x0, 0x0}} -var CURVE_SB = [2][2][5]int64{{{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]int64{{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]int64{{{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}}} - -// BN Curve -/* -const CURVETYPE int=WEIERSTRASS -const CURVE_A int= 0 -var CURVE_B = [...]int64 {0x2,0x0,0x0,0x0,0x0} -var CURVE_Order=[...]int64 {0xD,0x800000000010A1,0x8000000007FF9F,0x40000001BA344D,0x25236482} -var CURVE_Bnx=[...]int64 {0x80000000000001,0x40,0x0,0x0,0x0} -var CURVE_Cru=[...]int64 {0x80000000000007,0x6CD,0x40000000024909,0x49B362,0x0} -var CURVE_Fra=[...]int64 {0x7DE6C06F2A6DE9,0x74924D3F77C2E1,0x50A846953F8509,0x212E7C8CB6499B,0x1B377619} -var CURVE_Frb=[...]int64 {0x82193F90D5922A,0x8B6DB2C08850C5,0x2F57B96AC8DC17,0x1ED1837503EAB2,0x9EBEE69} -var CURVE_Pxa=[...]int64 {0xAB2C7935FD0CB4,0xE319E4FCC57C2B,0x24F6DF763B05A5,0xF55EA7EA335FB7,0x95B04D4} -var CURVE_Pxb=[...]int64 {0xA07D0790962455,0x86BE3D27AA5E38,0x89E05747F39D6D,0xC08347B49D42BF,0x5D4D8A7} -var CURVE_Pya=[...]int64 {0xADCE687A08A46C,0x2B30E98A4191F9,0x4C3784B1F16908,0x25E5313FA16D1C,0xABF2ABF} -var CURVE_Pyb=[...]int64 {0xDF88D405F306EC,0x82076ADD13A0E6,0x1E47819D6A5C04,0xE679DABDB38627,0x18769A87} -var CURVE_Gx =[...]int64 {0x12,0x13A7,0x80000000086121,0x40000001BA344D,0x25236482} -var CURVE_Gy =[...]int64 {0x1,0x0,0x0,0x0,0x0} -var CURVE_W=[2][5]int64{{0x3,0x80000000000204,0x6181,0x0,0x0},{0x1,0x81,0x0,0x0,0x0}} -var CURVE_SB=[2][2][5]int64 {{{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]int64 {{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]int64 {{{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}}} -*/ - -// BNT Curve -/* -const CURVETYPE int=WEIERSTRASS -const CURVE_A int= 0 -var CURVE_B = [...]int64 {0x2,0x0,0x0,0x0,0x0} -var CURVE_Order=[...]int64 {0x75777E8D30210D,0xD43492B2CB363A,0x3696F8D5F00E88,0x6517014EFA0BAB,0x240120DB} -var CURVE_Bnx=[...]int64 {0x806000004081,0x40,0x0,0x0,0x0} -var CURVE_Cru=[...]int64 {0xEB53D5AB4FCD87,0x82A5F2BAB11FAD,0x47651504C9764C,0x4801B1,0x0} -var CURVE_Fra=[...]int64 {0xF5D14EADC80022,0x4904D6FACCE359,0xF190A13211BE6C,0xC9BBC4394F6509,0x1328A292} -var CURVE_Frb=[...]int64 {0xA7EAB040ECA6F1,0xC513DF997D764,0x450657A3DEB01E,0x9B5B3D15AAA6A1,0x10D87E48} -var CURVE_Pxa=[...]int64 {0x8987E2288E65BB,0xAD1CAA6313BE,0x325041548B7CCC,0x4C1339EBCC055,0x14483FCD} -var CURVE_Pxb=[...]int64 {0x67888808DBE2C0,0x7FE1F81E34853A,0xA631A51B57B95,0x384EC302DA3FC5,0x87F46B3} -var CURVE_Pya=[...]int64 {0x202C47E020CA1D,0xB4167E8399F36C,0xC6E5439F72C94C,0x102B0BD74A2C69,0x14E8C29C} -var CURVE_Pyb=[...]int64 {0xD8437C716628F2,0x27E167BCB7DC6B,0xA82C7572681D0A,0x62454BD1EDEC18,0x17AFE2A4} -var CURVE_Gx =[...]int64 {0x9DBBFEEEB4A712,0x555614F464BABE,0x3696F8D5F06E8A,0x6517014EFA0BAB,0x240120DB} -var CURVE_Gy =[...]int64 {0x1,0x0,0x0,0x0,0x0} -var CURVE_W=[2][5]int64{{0x26430061838403,0x81218241998384,0x6001,0x0,0x0},{0x100C000008101,0x80,0x0,0x0,0x0}} -var CURVE_SB=[2][2][5]int64 {{{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]int64 {{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]int64 {{{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}}} -*/ - -// BNT2 Curve -/* -const CURVETYPE int=WEIERSTRASS -const CURVE_A int= 0 -var CURVE_B = [...]int64 {0x2,0x0,0x0,0x0,0x0} -var CURVE_Order=[...]int64 {0xFB71A511AA2BF5,0x8DE127B73833D7,0xF3B89D00021CF,0x410F5AADB74E20,0x24000482} -var CURVE_Bnx=[...]int64 {0x20100608205,0x40,0x0,0x0,0x0} -var CURVE_Cru=[...]int64 {0x5027444866BD33,0x5B773016470EFB,0xC3617BECF23675,0x480006,0x0} -var CURVE_Fra=[...]int64 {0xB268C973AEF062,0xC69B33C3BCE492,0xF67FA37F195BBC,0x29E8CAB6BD0A41,0x124E0B8D} -var CURVE_Frb=[...]int64 {0x736240B1B429,0xCD48F52D196D56,0x18BBE650E72612,0x17268FF6FA43DE,0x11B1F8F5} -var CURVE_Pxa=[...]int64 {0xCC92399F40A3C8,0xCDA4E96611784A,0x7B056961706B35,0x9693C6318279D7,0x16FC17CF} -var CURVE_Pxb=[...]int64 {0x557A8AD8549540,0x6F7BE6F6510610,0x565907A95D17DB,0xBD5975909C8188,0x1EB5B500} -var CURVE_Pya=[...]int64 {0x7BECC514220513,0x4A78860E737B14,0x51B83935F12684,0x761422AA9D4DFA,0x1E8EE498} -var CURVE_Pyb=[...]int64 {0xB9328F577CE78E,0xB746E26FA5781F,0xA93DBC1FB8E27E,0xBAE33BDBA29D76,0x23CEF4CD} -var CURVE_Gx =[...]int64 {0xB2DC2BB460A48A,0x93E428F0D651E8,0xF3B89D00081CF,0x410F5AADB74E20,0x24000482} -var CURVE_Gy =[...]int64 {0x1,0x0,0x0,0x0,0x0} -var CURVE_W=[2][5]int64 {{0xB76282A1347083,0x60301399E1D10,0x6000,0x0,0x0},{0x40200C10409,0x80,0x0,0x0,0x0}} -var CURVE_SB=[2][2][5]int64 {{{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]int64 {{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]int64 {{{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/85fabaa6/go/src/github.com/miracl/amcl-go/RSA.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/RSA.go b/go/src/github.com/miracl/amcl-go/RSA.go deleted file mode 100644 index 5b1cf5b..0000000 --- a/go/src/github.com/miracl/amcl-go/RSA.go +++ /dev/null @@ -1,373 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/* RSA API high-level functions */ - -package amcl - -import "fmt" - -const RSA_RFS int = int(MODBYTES) * FFLEN - -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 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(Z []byte, olen int, K []byte) { - H := NewHASH() - hlen := 32 - - 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++ { - H.Process_array(Z) - H.Process_num(int32(counter)) - B := H.Hash() - - if k+hlen > olen { - for i := 0; i < olen%hlen; i++ { - K[k] = B[i] - k++ - } - } else { - for i := 0; i < hlen; i++ { - K[k] = B[i] - k++ - } - } - } -} - -func RSA_printBinary(array []byte) { - for i := 0; i < len(array); i++ { - fmt.Printf("%02x", array[i]) - } - fmt.Printf("\n") -} - -/* OAEP Message Encoding for Encryption */ -func RSA_OAEP_ENCODE(m []byte, rng *RAND, p []byte) []byte { - olen := RSA_RFS - 1 - mlen := len(m) - var f [RSA_RFS]byte - - H := NewHASH() - hlen := 32 - var SEED [32]byte - seedlen := hlen - if mlen > olen-hlen-seedlen-1 { - return nil - } - - var DBMASK [RSA_RFS - 1 - 32]byte - - if p != nil { - H.Process_array(p) - } - h := H.Hash() - 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(SEED[:], olen-seedlen, DBMASK[:]) - - for i := 0; i < olen-seedlen; i++ { - DBMASK[i] ^= f[i] - } - RSA_MGF1(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(p []byte, f []byte) []byte { - olen := RSA_RFS - 1 - - H := NewHASH() - hlen := 32 - var SEED [32]byte - seedlen := hlen - var CHASH [32]byte - - if olen < seedlen+hlen+1 { - return nil - } - var DBMASK [RSA_RFS - 1 - 32]byte - 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 - } - } - - if p != nil { - H.Process_array(p) - } - h := H.Hash() - 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(DBMASK[:], seedlen, SEED[:]) - for i := 0; i < seedlen; i++ { - SEED[i] ^= f[i+1] - } - RSA_MGF1(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/85fabaa6/go/src/github.com/miracl/amcl-go/UTILS.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/UTILS.go b/go/src/github.com/miracl/amcl-go/UTILS.go deleted file mode 100644 index b9b9ecb..0000000 --- a/go/src/github.com/miracl/amcl-go/UTILS.go +++ /dev/null @@ -1,45 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -package amcl - -// Generate random six digit value -func GENERATE_OTP(rng *RAND) int { - OTP := 0 - mult := 1 - for i := 0; i < 6; i++ { - val := int(rng.GetByte()) - if val < 0 { - val = -val - } - val = val % 10 - OTP = val*mult + OTP - mult = mult * 10 - } - return OTP -} - -// Generate a random byte array -func GENERATE_RANDOM(rng *RAND, randomLen int) []byte { - random := make([]byte, randomLen) - for i := 0; i < randomLen; i++ { - random[i] = rng.GetByte() - } - return random -} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/UTILS_test.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/UTILS_test.go b/go/src/github.com/miracl/amcl-go/UTILS_test.go deleted file mode 100644 index 17058cc..0000000 --- a/go/src/github.com/miracl/amcl-go/UTILS_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -package amcl - -import ( - "encoding/hex" - "fmt" - "testing" -) - -func TestGENERATE_OTP(t *testing.T) { - cases := []int{751847, 625436, 628111, 611804, 148564, 202193, 794783, 631944, 544480, 384313} - - // Seed value for Random Number Generator (RNG) - seedHex := "9e8b4178790cd57a5761c4a6f164ba72" - seed, err := hex.DecodeString(seedHex) - if err != nil { - fmt.Println("Error decoding seed value") - return - } - rng := NewRAND() - rng.Seed(len(seed), seed) - - // Generate the one time passwords - for _, want := range cases { - got := GENERATE_OTP(rng) - if got != want { - t.Errorf("One Time Passord %d != %d", got, want) - } - } -} - -func TestGENERATE_RANDOM(t *testing.T) { - cases := []string{"57d662d39b1b245da469e89c", "155babf8de4204e68a656f42", "727e1980e01f996d977a0a34", "7b6c39221d89546895153f10", "32e40e9ad6f50dab3f5ec63f", "f6962a1fc5add13277900871", "93ae541acd6dc3264c19a12a", "faf196291d0820c611d3fcd4", "ba0602f0f6df1908dbcffe5b", "9e93cf35ccd5141e367cf2fd"} - - // Seed value for Random Number Generator (RNG) - seedHex := "9e8b4178790cd57a5761c4a6f164ba72" - seed, err := hex.DecodeString(seedHex) - if err != nil { - fmt.Println("Error decoding seed value") - return - } - rng := NewRAND() - rng.Seed(len(seed), seed) - - // Generate the one time passwords - for _, want := range cases { - val := GENERATE_RANDOM(rng, 12) - got := hex.EncodeToString(val) - if got != want { - t.Errorf("One Time Passord %s != %s", got, want) - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/85fabaa6/go/src/github.com/miracl/amcl-go/crypto.go ---------------------------------------------------------------------- diff --git a/go/src/github.com/miracl/amcl-go/crypto.go b/go/src/github.com/miracl/amcl-go/crypto.go deleted file mode 100644 index e2b8bbb..0000000 --- a/go/src/github.com/miracl/amcl-go/crypto.go +++ /dev/null @@ -1,222 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -package amcl - -const EAS int = 16 -const EGS int = int(MODBYTES) -const EFS int = int(MODBYTES) -const HASH_BYTES int = 32 -const IVS int = 12 -const G1S = 2*EFS + 1 -const G2S = 4 * EFS -const GTS = 12 * EFS - -/* create random secret S. Use GO RNG */ -func MPIN_RANDOM_GENERATE_WRAP(RNG *RAND) (int, []byte) { - var S [EGS]byte - errorCode := MPIN_RANDOM_GENERATE(RNG, S[:]) - return errorCode, S[:] -} - -/* Extract Server Secret SS=S*Q where Q is fixed generator in G2 and S is master secret */ -func MPIN_GET_SERVER_SECRET_WRAP(S []byte) (int, []byte) { - var SS [G2S]byte - errorCode := MPIN_GET_SERVER_SECRET(S[:], SS[:]) - return errorCode, SS[:] -} - -/* R=R1+R2 in group G1 */ -func MPIN_RECOMBINE_G1_WRAP(R1 []byte, R2 []byte) (int, []byte) { - var R [G1S]byte - errorCode := MPIN_RECOMBINE_G1(R1[:], R2[:], R[:]) - return errorCode, R[:] -} - -/* W=W1+W2 in group G2 */ -func MPIN_RECOMBINE_G2_WRAP(W1 []byte, W2 []byte) (int, []byte) { - var W [G2S]byte - errorCode := MPIN_RECOMBINE_G2(W1[:], W2[:], W[:]) - return errorCode, W[:] -} - -/* Client secret CS=S*H(ID) where ID is client ID and S is master secret */ -/* CID is hashed externally */ -func MPIN_GET_CLIENT_SECRET_WRAP(S []byte, ID []byte) (int, []byte) { - var CS [G1S]byte - errorCode := MPIN_GET_CLIENT_SECRET(S[:], ID[:], CS[:]) - return errorCode, CS[:] -} - -/* Time Permit TP=S*(date|H(ID)) where S is master secret */ -func MPIN_GET_CLIENT_PERMIT_WRAP(date int, S []byte, ID []byte) (int, []byte) { - var TP [G1S]byte - errorCode := MPIN_GET_CLIENT_PERMIT(date, S[:], ID[:], TP[:]) - return errorCode, TP[:] -} - -/* Extract PIN from CS for identity CID to form TOKEN */ -func MPIN_EXTRACT_PIN_WRAP(ID []byte, PIN int, CS []byte) (int, []byte) { - CSIn := make([]byte, G1S) - copy(CSIn, CS) - errorCode := MPIN_EXTRACT_PIN(ID[:], PIN, CSIn[:]) - return errorCode, CSIn[:] -} - -/* One pass MPIN Client. Using GO RNG */ -func MPIN_CLIENT_WRAP(date, TimeValue, PIN int, RNG *RAND, ID, X, TOKEN, TP, MESSAGE []byte) (int, []byte, []byte, []byte, []byte, []byte) { - var Y [EGS]byte - var SEC [G1S]byte - var U [G1S]byte - var UT [G1S]byte - errorCode := MPIN_CLIENT(date, ID, RNG, X[:], PIN, TOKEN[:], SEC[:], U[:], UT[:], TP[:], MESSAGE, TimeValue, Y[:]) - return errorCode, X[:], Y[:], SEC[:], U[:], UT[:] -} - -// Precompute values for use by the client side of M-Pin Full -func MPIN_PRECOMPUTE_WRAP(TOKEN []byte, ID []byte) (int, []byte, []byte) { - var GT1 [GTS]byte - var GT2 [GTS]byte - errorCode := MPIN_PRECOMPUTE(TOKEN[:], ID[:], GT1[:], GT2[:]) - return errorCode, GT1[:], GT2[:] -} - -/* - W=x*H(G); - if RNG == NULL then X is passed in - if RNG != NULL the X is passed out - if typ=0 W=x*G where G is point on the curve, else W=x*M(G), where M(G) is mapping of octet G to point on the curve - Use GO RNG -*/ -func MPIN_GET_G1_MULTIPLE_WRAP(RNG *RAND, typ int, X, G []byte) (int, []byte, []byte) { - var Z [G1S]byte - errorCode := MPIN_GET_G1_MULTIPLE(RNG, typ, X[:], G[:], Z[:]) - return errorCode, X[:], Z[:] -} - -/* One pass MPIN Server */ -func MPIN_SERVER_WRAP(date int, TimeValue int, SS, U, UT, V, ID, MESSAGE []byte) (int, []byte, []byte, []byte, []byte, []byte) { - var HID [G1S]byte - var HTID [G1S]byte - var Y [EGS]byte - var E [GTS]byte - var F [GTS]byte - - errorCode := MPIN_SERVER(date, HID[:], HTID[:], Y[:], SS[:], U[:], UT[:], V[:], E[:], F[:], ID[:], MESSAGE[:], TimeValue) - - return errorCode, HID[:], HTID[:], Y[:], E[:], F[:] -} - -/* calculate common key on server side */ -/* Z=r.A - no time permits involved */ -func MPIN_SERVER_KEY_WRAP(Z, SS, W, U, UT []byte) (int, []byte) { - var SK [EAS]byte - errorCode := MPIN_SERVER_KEY(Z[:], SS[:], W[:], U[:], UT[:], SK[:]) - return errorCode, SK[:] -} - -/* calculate common key on client side */ -/* wCID = w.(A+AT) */ -func MPIN_CLIENT_KEY_WRAP(PIN int, GT1, GT2, R, X, T []byte) (int, []byte) { - var CK [EAS]byte - errorCode := MPIN_CLIENT_KEY(GT1[:], GT2[:], PIN, R[:], X[:], T[:], CK[:]) - return errorCode, CK[:] -} - -/* Extract big type PIN.hash(ID) from CS to form TOKEN */ -func MPIN_EXTRACT_BIG_PIN_WRAP(ID, PIN, CS []byte) (int, []byte) { - TOKEN := make([]byte, G1S) - pin := fromBytes(PIN) - P := ECP_fromBytes(CS) - if P.is_infinity() { - return MPIN_INVALID_POINT, TOKEN[:] - } - h := Hashit(0, ID) - R := mapit(h) - - R = R.mul(pin) - P.sub(R) - - P.toBytes(TOKEN) - - return 0, TOKEN[:] -} - -/* Add big type PIN.hash(ID) to TOKEN for identity ID to form CS */ -func MPIN_ADD_BIG_PIN_WRAP(ID, PIN, TOKEN []byte) (int, []byte) { - CS := make([]byte, G1S) - pin := fromBytes(PIN) - P := ECP_fromBytes(TOKEN) - if P.is_infinity() { - return MPIN_INVALID_POINT, CS[:] - } - h := Hashit(0, ID) - R := mapit(h) - - R = R.mul(pin) - P.add(R) - - P.toBytes(CS) - - return 0, CS[:] -} - -/* dst = a ^ b ^ c */ -func XORBytes(a, b, c []byte) ([]byte, int) { - n := len(a) - dst := make([]byte, n) - if (len(b) != n) || (len(c) != n) { - return dst[:], 1 - } - for i := 0; i < n; i++ { - dst[i] = a[i] ^ b[i] ^ c[i] - } - return dst[:], 0 -} - -/* Outputs H(CID) and H(T|H(CID)) for time permits. If no time permits set HID=HTID */ -func MPIN_SERVER_1_WRAP(date int, ID []byte) ([]byte, []byte) { - var HID [G1S]byte - var HTID [G1S]byte - MPIN_SERVER_1(date, ID, HID[:], HTID[:]) - return HID[:], HTID[:] -} - -/* Implement step 2 of MPin protocol on server side */ -func MPIN_SERVER_2_WRAP(date int, HID []byte, HTID []byte, Y []byte, SS []byte, U []byte, UT []byte, V []byte) (int, []byte, []byte) { - var E [12 * EFS]byte - var F [12 * EFS]byte - errorCode := MPIN_SERVER_2(date, HID[:], HTID[:], Y[:], SS[:], U[:], UT[:], V[:], E[:], F[:]) - return errorCode, E[:], F[:] -} - -/* Implement step 1 on client side of MPin protocol */ -func MPIN_CLIENT_1_WRAP(date int, ID []byte, rng *RAND, X []byte, PIN int, TOKEN []byte, TP []byte) (int, []byte, []byte, []byte, []byte) { - var SEC [G1S]byte - var U [G1S]byte - var UT [G1S]byte - errorCode := MPIN_CLIENT_1(date, ID[:], rng, X[:], PIN, TOKEN[:], SEC[:], U[:], UT[:], TP[:]) - return errorCode, X[:], SEC[:], U[:], UT[:] -} - -/* Implement step 2 on client side of MPin protocol */ -func MPIN_CLIENT_2_WRAP(X []byte, Y []byte, SEC []byte) (int, []byte) { - errorCode := MPIN_CLIENT_2(X[:], Y[:], SEC[:]) - return errorCode, SEC[:] -}
