You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by br...@apache.org on 2018/11/07 23:50:17 UTC

[40/51] [partial] incubator-milagro-crypto git commit: update code

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/70e3a3a3/cs/DBIG.cs
----------------------------------------------------------------------
diff --git a/cs/DBIG.cs b/cs/DBIG.cs
deleted file mode 100644
index 935fc52..0000000
--- a/cs/DBIG.cs
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* AMCL double length DBIG number class */
-
-public class DBIG
-{
-	protected internal long[] w = new long[ROM.DNLEN];
-
-/* Constructors */
-	public DBIG(int x)
-	{
-		w[0] = x;
-		for (int i = 1;i < ROM.DNLEN;i++)
-		{
-			w[i] = 0;
-		}
-	}
-
-	public DBIG(DBIG x)
-	{
-		for (int i = 0;i < ROM.DNLEN;i++)
-		{
-			w[i] = x.w[i];
-		}
-	}
-
-	public DBIG(BIG x)
-	{
-		for (int i = 0;i < ROM.NLEN - 1;i++)
-		{
-			w[i] = x.get(i);
-		}
-
-		w[ROM.NLEN - 1] = x.get(ROM.NLEN - 1) & ROM.MASK; // top word normalized
-		w[ROM.NLEN] = x.get(ROM.NLEN - 1) >> ROM.BASEBITS;
-
-		for (int i = ROM.NLEN + 1;i < ROM.DNLEN;i++)
-		{
-			w[i] = 0;
-		}
-	}
-
-/* get and set digits of this */
-	public virtual long get(int i)
-	{
-		return w[i];
-	}
-
-	public virtual void set(int i, long x)
-	{
-		w[i] = x;
-	}
-
-	public virtual void inc(int i, long x)
-	{
-		w[i] += x;
-	}
-
-/* test this=0? */
-	public virtual bool iszilch()
-	{
-		for (int i = 0;i < ROM.DNLEN;i++)
-		{
-			if (w[i] != 0)
-			{
-				return false;
-			}
-		}
-		return true;
-	}
-
-/* normalise this */
-	public virtual void norm()
-	{
-		long d , carry = 0;
-		for (int i = 0;i < ROM.DNLEN - 1;i++)
-		{
-			d = w[i] + carry;
-			w[i] = d & ROM.MASK;
-			carry = d >> ROM.BASEBITS;
-		}
-		w[ROM.DNLEN - 1] = (w[ROM.DNLEN - 1] + carry);
-	}
-
-/* shift this right by k bits */
-	public virtual void shr(int k)
-	{
-		int n = k % ROM.BASEBITS;
-		int m = k / ROM.BASEBITS;
-		for (int i = 0;i < ROM.DNLEN - m - 1;i++)
-		{
-			w[i] = (w[m + i] >> n) | ((w[m + i + 1] << (ROM.BASEBITS - n)) & ROM.MASK);
-		}
-		w[ROM.DNLEN - m - 1] = w[ROM.DNLEN - 1] >> n;
-		for (int i = ROM.DNLEN - m;i < ROM.DNLEN;i++)
-		{
-			w[i] = 0;
-		}
-	}
-
-/* shift this left by k bits */
-	public virtual void shl(int k)
-	{
-		int n = k % ROM.BASEBITS;
-		int m = k / ROM.BASEBITS;
-
-		w[ROM.DNLEN - 1] = ((w[ROM.DNLEN - 1 - m] << n)) | (w[ROM.DNLEN - m - 2]>>(ROM.BASEBITS - n));
-		for (int i = ROM.DNLEN - 2;i > m;i--)
-		{
-			w[i] = ((w[i - m] << n) & ROM.MASK) | (w[i - m - 1]>>(ROM.BASEBITS - n));
-		}
-		w[m] = (w[0] << n) & ROM.MASK;
-		for (int i = 0;i < m;i++)
-		{
-			w[i] = 0;
-		}
-	}
-
-/* return number of bits in this */
-	public virtual int nbits()
-	{
-		int bts , k = ROM.DNLEN - 1;
-		long c;
-		norm();
-		while (w[k] == 0 && k >= 0)
-		{
-			k--;
-		}
-		if (k < 0)
-		{
-			return 0;
-		}
-		bts = ROM.BASEBITS * k;
-		c = w[k];
-		while (c != 0)
-		{
-			c /= 2;
-			bts++;
-		}
-		return bts;
-	}
-
-/* convert this to string */
-	public override string ToString()
-	{
-		DBIG b;
-		string s = "";
-		int len = nbits();
-		if (len % 4 == 0)
-		{
-			len >>= 2; //len/=4;
-		}
-		else
-		{
-			len >>= 2;
-			len++;
-		}
-
-		for (int i = len - 1;i >= 0;i--)
-		{
-			b = new DBIG(this);
-			b.shr(i * 4);
-			s += (b.w[0] & 15).ToString("x");
-		}
-		return s;
-	}
-
-/* return this+x */
-/*
-	public DBIG plus(DBIG x) {
-		DBIG s=new DBIG(0);
-		for (int i=0;i<ROM.DNLEN;i++)
-			s.w[i]=w[i]+x.w[i];
-		return s;
-	}
-*/
-/* return this-x */
-/*
-	public DBIG minus(DBIG x) {
-		DBIG d=new DBIG(0);
-		for (int i=0;i<ROM.DNLEN;i++)
-			d.w[i]=w[i]-x.w[i];
-		return d;
-	}
-*/
-/* this+=x */
-	public virtual void add(DBIG x)
-	{
-		for (int i = 0;i < ROM.DNLEN;i++)
-		{
-			w[i] += x.w[i];
-		}
-	}
-
-/* this-=x */
-	public virtual void sub(DBIG x)
-	{
-		for (int i = 0;i < ROM.DNLEN;i++)
-		{
-			w[i] -= x.w[i];
-		}
-	}
-
-/* set this[i]+=x*y+c, and return high part */
-/* This is time critical */
-/* What if you knew the bottom half in advance ?? */
-	public virtual long muladd(long a, long b, long c, int i)
-	{
-		long x0, x1, y0, y1;
-		x0 = a & ROM.HMASK;
-		x1 = (a >> ROM.HBITS);
-		y0 = b & ROM.HMASK;
-		y1 = (b >> ROM.HBITS);
-		long bot = x0 * y0;
-		long top = x1 * y1;
-		long mid = x0 * y1 + x1 * y0;
-		x0 = mid & ROM.HMASK;
-		x1 = (mid >> ROM.HBITS);
-		bot += x0 << ROM.HBITS;
-		bot += c;
-		bot += w[i];
-		top += x1;
-		long carry = bot >> ROM.BASEBITS;
-		bot &= ROM.MASK;
-		top += carry;
-		w[i] = bot;
-		return top;
-	}
-
-/* Compare a and b, return 0 if a==b, -1 if a<b, +1 if a>b. Inputs must be normalised */
-	public static int comp(DBIG a, DBIG b)
-	{
-		for (int i = ROM.DNLEN - 1;i >= 0;i--)
-		{
-			if (a.w[i] == b.w[i])
-			{
-				continue;
-			}
-			if (a.w[i] > b.w[i])
-			{
-				return 1;
-			}
-			else
-			{
-				return -1;
-			}
-		}
-		return 0;
-	}
-
-/* reduces this DBIG mod a BIG, and returns the BIG */
-	public virtual BIG mod(BIG c)
-	{
-		int k = 0;
-		norm();
-		DBIG m = new DBIG(c);
-
-		if (comp(this,m) < 0)
-		{
-			return new BIG(this);
-		}
-
-		do
-		{
-			m.shl(1);
-			k++;
-		} while (comp(this,m) >= 0);
-
-		while (k > 0)
-		{
-			m.shr(1);
-			if (comp(this,m) >= 0)
-			{
-				sub(m);
-				norm();
-			}
-			k--;
-		}
-		return new BIG(this);
-	}
-
-/* reduces this DBIG mod a DBIG in place */
-/*	public void mod(DBIG m)
-	{
-		int k=0;
-		if (comp(this,m)<0) return;
-
-		do
-		{
-			m.shl(1);
-			k++;
-		}
-		while (comp(this,m)>=0);
-
-		while (k>0)
-		{
-			m.shr(1);
-			if (comp(this,m)>=0)
-			{
-				sub(m);
-				norm();
-			}
-			k--;
-		}
-		return;
-
-	}*/
-
-/* return this/c */
-	public virtual BIG div(BIG c)
-	{
-		int k = 0;
-		DBIG m = new DBIG(c);
-		BIG a = new BIG(0);
-		BIG e = new BIG(1);
-		norm();
-
-		while (comp(this,m) >= 0)
-		{
-			e.fshl(1);
-			m.shl(1);
-			k++;
-		}
-
-		while (k > 0)
-		{
-			m.shr(1);
-			e.shr(1);
-			if (comp(this,m) > 0)
-			{
-				a.add(e);
-				a.norm();
-				sub(m);
-				norm();
-			}
-			k--;
-		}
-		return a;
-	}
-
-/* split DBIG at position n, return higher half, keep lower half */
-	public virtual BIG Split(int n)
-	{
-		BIG t = new BIG(0);
-		int m = n % ROM.BASEBITS;
-		long nw , carry = w[ROM.DNLEN - 1] << (ROM.BASEBITS - m);
-
-		for (int i = ROM.DNLEN - 2;i >= ROM.NLEN - 1;i--)
-		{
-			nw = (w[i] >> m) | carry;
-			carry = (w[i] << (ROM.BASEBITS - m)) & ROM.MASK;
-			t.set(i - ROM.NLEN + 1,nw);
-		}
-		w[ROM.NLEN - 1] &= (((long)1 << m) - 1);
-		return t;
-	}
-}

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

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

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/70e3a3a3/cs/ECP2.cs
----------------------------------------------------------------------
diff --git a/cs/ECP2.cs b/cs/ECP2.cs
deleted file mode 100644
index 28f9295..0000000
--- a/cs/ECP2.cs
+++ /dev/null
@@ -1,771 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* AMCL Weierstrass elliptic curve functions over FP2 */
-
-public sealed class ECP2
-{
-	private FP2 x;
-	private FP2 y;
-	private FP2 z;
-	private bool INF;
-
-/* Constructor - set this=O */
-	public ECP2()
-	{
-		INF = true;
-		x = new FP2(0);
-		y = new FP2(1);
-		z = new FP2(1);
-	}
-
-/* Test this=O? */
-	public bool is_infinity()
-	{
-		return INF;
-	}
-/* copy this=P */
-	public void copy(ECP2 P)
-	{
-		x.copy(P.x);
-		y.copy(P.y);
-		z.copy(P.z);
-		INF = P.INF;
-	}
-/* set this=O */
-	public void inf()
-	{
-		INF = true;
-		x.zero();
-		y.zero();
-		z.zero();
-	}
-
-/* Conditional move of Q to P dependant on d */
-	public void cmove(ECP2 Q, int d)
-	{
-		x.cmove(Q.x,d);
-		y.cmove(Q.y,d);
-		z.cmove(Q.z,d);
-
-		bool bd;
-		if (d == 0)
-		{
-			bd = false;
-		}
-		else
-		{
-			bd = true;
-		}
-		INF ^= (INF ^ Q.INF) & bd;
-	}
-
-/* return 1 if b==c, no branching */
-	public static int teq(int b, int c)
-	{
-		int x = b ^ c;
-		x -= 1; // if x=0, x now -1
-		return ((x >> 31) & 1);
-	}
-
-/* Constant time select from pre-computed table */
-	public void select(ECP2[] W, int b)
-	{
-		ECP2 MP = new ECP2();
-		int m = b >> 31;
-		int babs = (b ^ m) - m;
-
-		babs = (babs - 1) / 2;
-
-		cmove(W[0],teq(babs,0)); // conditional move
-		cmove(W[1],teq(babs,1));
-		cmove(W[2],teq(babs,2));
-		cmove(W[3],teq(babs,3));
-		cmove(W[4],teq(babs,4));
-		cmove(W[5],teq(babs,5));
-		cmove(W[6],teq(babs,6));
-		cmove(W[7],teq(babs,7));
-
-		MP.copy(this);
-		MP.neg();
-		cmove(MP,(int)(m & 1));
-	}
-
-
-/* Test if P == Q */
-	public bool Equals(ECP2 Q)
-	{
-		if (is_infinity() && Q.is_infinity())
-		{
-			return true;
-		}
-		if (is_infinity() || Q.is_infinity())
-		{
-			return false;
-		}
-
-		FP2 zs2 = new FP2(z);
-		zs2.sqr();
-		FP2 zo2 = new FP2(Q.z);
-		zo2.sqr();
-		FP2 zs3 = new FP2(zs2);
-		zs3.mul(z);
-		FP2 zo3 = new FP2(zo2);
-		zo3.mul(Q.z);
-		zs2.mul(Q.x);
-		zo2.mul(x);
-		if (!zs2.Equals(zo2))
-		{
-			return false;
-		}
-		zs3.mul(Q.y);
-		zo3.mul(y);
-		if (!zs3.Equals(zo3))
-		{
-			return false;
-		}
-
-		return true;
-	}
-/* set this=-this */
-	public void neg()
-	{
-		if (is_infinity())
-		{
-			return;
-		}
-		y.neg();
-		y.reduce();
-		return;
-	}
-/* set to Affine - (x,y,z) to (x,y) */
-	public void affine()
-	{
-		if (is_infinity())
-		{
-			return;
-		}
-		FP2 one = new FP2(1);
-		if (z.Equals(one))
-		{
-			return;
-		}
-		z.inverse();
-
-		FP2 z2 = new FP2(z);
-		z2.sqr();
-		x.mul(z2);
-		x.reduce();
-		y.mul(z2);
-		y.mul(z);
-		y.reduce();
-		z.copy(one);
-	}
-/* extract affine x as FP2 */
-	public FP2 X
-	{
-		get
-		{
-			affine();
-			return x;
-		}
-	}
-/* extract affine y as FP2 */
-	public FP2 Y
-	{
-		get
-		{
-			affine();
-			return y;
-		}
-	}
-/* extract projective x */
-	public FP2 getx()
-	{
-		return x;
-	}
-/* extract projective y */
-	public FP2 gety()
-	{
-		return y;
-	}
-/* extract projective z */
-	public FP2 getz()
-	{
-		return z;
-	}
-/* convert to byte array */
-	public void toBytes(sbyte[] b)
-	{
-		sbyte[] t = new sbyte[ROM.MODBYTES];
-		affine();
-		x.A.toBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			b[i] = t[i];
-		}
-		x.B.toBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			b[i + ROM.MODBYTES] = t[i];
-		}
-
-		y.A.toBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			b[i + 2 * ROM.MODBYTES] = t[i];
-		}
-		y.B.toBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			b[i + 3 * ROM.MODBYTES] = t[i];
-		}
-	}
-/* convert from byte array to point */
-	public static ECP2 fromBytes(sbyte[] b)
-	{
-		sbyte[] t = new sbyte[ROM.MODBYTES];
-		BIG ra;
-		BIG rb;
-
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			t[i] = b[i];
-		}
-		ra = BIG.fromBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			t[i] = b[i + ROM.MODBYTES];
-		}
-		rb = BIG.fromBytes(t);
-		FP2 rx = new FP2(ra,rb);
-
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			t[i] = b[i + 2 * ROM.MODBYTES];
-		}
-		ra = BIG.fromBytes(t);
-		for (int i = 0;i < ROM.MODBYTES;i++)
-		{
-			t[i] = b[i + 3 * ROM.MODBYTES];
-		}
-		rb = BIG.fromBytes(t);
-		FP2 ry = new FP2(ra,rb);
-
-		return new ECP2(rx,ry);
-	}
-/* convert this to hex string */
-	public override string ToString()
-	{
-		if (is_infinity())
-		{
-			return "infinity";
-		}
-		affine();
-		return "(" + x.ToString() + "," + y.ToString() + ")";
-	}
-
-/* Calculate RHS of twisted curve equation x^3+B/i */
-	public static FP2 RHS(FP2 x)
-	{
-		x.norm();
-		FP2 r = new FP2(x);
-		r.sqr();
-		FP2 b = new FP2(new BIG(ROM.CURVE_B));
-		b.div_ip();
-		r.mul(x);
-		r.add(b);
-
-		r.reduce();
-		return r;
-	}
-/* construct this from (x,y) - but set to O if not on curve */
-	public ECP2(FP2 ix, FP2 iy)
-	{
-		x = new FP2(ix);
-		y = new FP2(iy);
-		z = new FP2(1);
-		FP2 rhs = RHS(x);
-		FP2 y2 = new FP2(y);
-		y2.sqr();
-		if (y2.Equals(rhs))
-		{
-			INF = false;
-		}
-		else
-		{
-			x.zero();
-			INF = true;
-		}
-	}
-
-/* construct this from x - but set to O if not on curve */
-	public ECP2(FP2 ix)
-	{
-		x = new FP2(ix);
-		y = new FP2(1);
-		z = new FP2(1);
-		FP2 rhs = RHS(x);
-		if (rhs.sqrt())
-		{
-			y.copy(rhs);
-			INF = false;
-		}
-		else
-		{
-			x.zero();
-			INF = true;
-		}
-	}
-
-/* this+=this */
-	public int dbl()
-	{
-		if (INF)
-		{
-			return -1;
-		}
-		if (y.iszilch())
-		{
-			inf();
-			return -1;
-		}
-
-		FP2 w1 = new FP2(x);
-		FP2 w2 = new FP2(0);
-		FP2 w3 = new FP2(x);
-		FP2 w8 = new FP2(x);
-
-		w1.sqr();
-		w8.copy(w1);
-		w8.imul(3);
-
-		w2.copy(y);
-		w2.sqr();
-		w3.copy(x);
-		w3.mul(w2);
-		w3.imul(4);
-		w1.copy(w3);
-		w1.neg();
-	//	w1.norm();
-
-		x.copy(w8);
-		x.sqr();
-		x.add(w1);
-		x.add(w1);
-		x.norm();
-
-		z.mul(y);
-		z.add(z);
-
-		w2.add(w2);
-		w2.sqr();
-		w2.add(w2);
-		w3.sub(x);
-		y.copy(w8);
-		y.mul(w3);
-	//	w2.norm();
-		y.sub(w2);
-
-		y.norm();
-		z.norm();
-
-		return 1;
-	}
-/* this+=Q - return 0 for add, 1 for double, -1 for O */
-	public int add(ECP2 Q)
-	{
-		if (INF)
-		{
-			copy(Q);
-			return -1;
-		}
-		if (Q.INF)
-		{
-			return -1;
-		}
-
-		bool aff = false;
-
-		if (Q.z.isunity())
-		{
-			aff = true;
-		}
-
-		FP2 A, C;
-		FP2 B = new FP2(z);
-		FP2 D = new FP2(z);
-		if (!aff)
-		{
-			A = new FP2(Q.z);
-			C = new FP2(Q.z);
-
-			A.sqr();
-			B.sqr();
-			C.mul(A);
-			D.mul(B);
-
-			A.mul(x);
-			C.mul(y);
-		}
-		else
-		{
-			A = new FP2(x);
-			C = new FP2(y);
-
-			B.sqr();
-			D.mul(B);
-		}
-
-		B.mul(Q.x);
-		B.sub(A);
-		D.mul(Q.y);
-		D.sub(C);
-
-		if (B.iszilch())
-		{
-			if (D.iszilch())
-			{
-				dbl();
-				return 1;
-			}
-			else
-			{
-				INF = true;
-				return -1;
-			}
-		}
-
-		if (!aff)
-		{
-			z.mul(Q.z);
-		}
-		z.mul(B);
-
-		FP2 e = new FP2(B);
-		e.sqr();
-		B.mul(e);
-		A.mul(e);
-
-		e.copy(A);
-		e.add(A);
-		e.add(B);
-		x.copy(D);
-		x.sqr();
-		x.sub(e);
-
-		A.sub(x);
-		y.copy(A);
-		y.mul(D);
-		C.mul(B);
-		y.sub(C);
-
-		x.norm();
-		y.norm();
-		z.norm();
-
-		return 0;
-	}
-
-/* set this-=Q */
-	public int sub(ECP2 Q)
-	{
-		Q.neg();
-		int D = add(Q);
-		Q.neg();
-		return D;
-	}
-/* set this*=q, where q is Modulus, using Frobenius */
-	public void frob(FP2 X)
-	{
-		if (INF)
-		{
-			return;
-		}
-		FP2 X2 = new FP2(X);
-		X2.sqr();
-		x.conj();
-		y.conj();
-		z.conj();
-		z.reduce();
-		x.mul(X2);
-		y.mul(X2);
-		y.mul(X);
-	}
-
-/* normalises m-array of ECP2 points. Requires work vector of m FP2s */
-
-	public static void multiaffine(int m, ECP2[] P)
-	{
-		int i;
-		FP2 t1 = new FP2(0);
-		FP2 t2 = new FP2(0);
-
-		FP2[] work = new FP2[m];
-		work[0] = new FP2(1);
-		work[1] = new FP2(P[0].z);
-		for (i = 2;i < m;i++)
-		{
-			work[i] = new FP2(work[i - 1]);
-			work[i].mul(P[i - 1].z);
-		}
-
-		t1.copy(work[m - 1]);
-		t1.mul(P[m - 1].z);
-
-		t1.inverse();
-
-		t2.copy(P[m - 1].z);
-		work[m - 1].mul(t1);
-
-		for (i = m - 2;;i--)
-		{
-			if (i == 0)
-			{
-				work[0].copy(t1);
-				work[0].mul(t2);
-				break;
-			}
-			work[i].mul(t2);
-			work[i].mul(t1);
-			t2.mul(P[i].z);
-		}
-/* now work[] contains inverses of all Z coordinates */
-
-		for (i = 0;i < m;i++)
-		{
-			P[i].z.one();
-			t1.copy(work[i]);
-			t1.sqr();
-			P[i].x.mul(t1);
-			t1.mul(work[i]);
-			P[i].y.mul(t1);
-		}
-	}
-
-/* P*=e */
-	public ECP2 mul(BIG e)
-	{
-/* fixed size windows */
-		int i, b, nb, m, s, ns;
-		BIG mt = new BIG();
-		BIG t = new BIG();
-		ECP2 P = new ECP2();
-		ECP2 Q = new ECP2();
-		ECP2 C = new ECP2();
-		ECP2[] W = new ECP2[8];
-		sbyte[] w = new sbyte[1 + (ROM.NLEN * ROM.BASEBITS + 3) / 4];
-
-		if (is_infinity())
-		{
-			return new ECP2();
-		}
-
-		affine();
-
-/* precompute table */
-		Q.copy(this);
-		Q.dbl();
-		W[0] = new ECP2();
-		W[0].copy(this);
-
-		for (i = 1;i < 8;i++)
-		{
-			W[i] = new ECP2();
-			W[i].copy(W[i - 1]);
-			W[i].add(Q);
-		}
-
-/* convert the table to affine */
-
-		multiaffine(8,W);
-
-/* make exponent odd - add 2P if even, P if odd */
-		t.copy(e);
-		s = t.parity();
-		t.inc(1);
-		t.norm();
-		ns = t.parity();
-		mt.copy(t);
-		mt.inc(1);
-		mt.norm();
-		t.cmove(mt,s);
-		Q.cmove(this,ns);
-		C.copy(Q);
-
-		nb = 1 + (t.nbits() + 3) / 4;
-/* convert exponent to signed 4-bit window */
-		for (i = 0;i < nb;i++)
-		{
-			w[i] = (sbyte)(t.lastbits(5) - 16);
-			t.dec(w[i]);
-			t.norm();
-			t.fshr(4);
-		}
-		w[nb] = (sbyte)t.lastbits(5);
-
-		P.copy(W[(w[nb] - 1) / 2]);
-		for (i = nb - 1;i >= 0;i--)
-		{
-			Q.select(W,w[i]);
-			P.dbl();
-			P.dbl();
-			P.dbl();
-			P.dbl();
-			P.add(Q);
-		}
-		P.sub(C);
-		P.affine();
-		return P;
-	}
-
-/* P=u0.Q0+u1*Q1+u2*Q2+u3*Q3 */
-	public static ECP2 mul4(ECP2[] Q, BIG[] u)
-	{
-		int i, j, nb;
-		int[] a = new int[4];
-		ECP2 T = new ECP2();
-		ECP2 C = new ECP2();
-		ECP2 P = new ECP2();
-		ECP2[] W = new ECP2[8];
-
-		BIG mt = new BIG();
-		BIG[] t = new BIG[4];
-
-		sbyte[] w = new sbyte[ROM.NLEN * ROM.BASEBITS + 1];
-
-		for (i = 0;i < 4;i++)
-		{
-			t[i] = new BIG(u[i]);
-			Q[i].affine();
-		}
-
-/* precompute table */
-
-		W[0] = new ECP2();
-		W[0].copy(Q[0]);
-		W[0].sub(Q[1]);
-		W[1] = new ECP2();
-		W[1].copy(W[0]);
-		W[2] = new ECP2();
-		W[2].copy(W[0]);
-		W[3] = new ECP2();
-		W[3].copy(W[0]);
-		W[4] = new ECP2();
-		W[4].copy(Q[0]);
-		W[4].add(Q[1]);
-		W[5] = new ECP2();
-		W[5].copy(W[4]);
-		W[6] = new ECP2();
-		W[6].copy(W[4]);
-		W[7] = new ECP2();
-		W[7].copy(W[4]);
-		T.copy(Q[2]);
-		T.sub(Q[3]);
-		W[1].sub(T);
-		W[2].add(T);
-		W[5].sub(T);
-		W[6].add(T);
-		T.copy(Q[2]);
-		T.add(Q[3]);
-		W[0].sub(T);
-		W[3].add(T);
-		W[4].sub(T);
-		W[7].add(T);
-
-		multiaffine(8,W);
-
-/* if multiplier is even add 1 to multiplier, and add P to correction */
-		mt.zero();
-		C.inf();
-		for (i = 0;i < 4;i++)
-		{
-			if (t[i].parity() == 0)
-			{
-				t[i].inc(1);
-				t[i].norm();
-				C.add(Q[i]);
-			}
-			mt.add(t[i]);
-			mt.norm();
-		}
-
-		nb = 1 + mt.nbits();
-
-/* convert exponent to signed 1-bit window */
-		for (j = 0;j < nb;j++)
-		{
-			for (i = 0;i < 4;i++)
-			{
-				a[i] = (sbyte)(t[i].lastbits(2) - 2);
-				t[i].dec(a[i]);
-				t[i].norm();
-				t[i].fshr(1);
-			}
-			w[j] = (sbyte)(8 * a[0] + 4 * a[1] + 2 * a[2] + a[3]);
-		}
-		w[nb] = (sbyte)(8 * t[0].lastbits(2) + 4 * t[1].lastbits(2) + 2 * t[2].lastbits(2) + t[3].lastbits(2));
-
-		P.copy(W[(w[nb] - 1) / 2]);
-		for (i = nb - 1;i >= 0;i--)
-		{
-			T.select(W,w[i]);
-			P.dbl();
-			P.add(T);
-		}
-		P.sub(C); // apply correction
-
-		P.affine();
-		return P;
-	}
-
-
-/*
-	public static void main(String[] args) {
-		BIG r=new BIG(ROM.Modulus);
-
-		BIG Pxa=new BIG(ROM.CURVE_Pxa);
-		BIG Pxb=new BIG(ROM.CURVE_Pxb);
-		BIG Pya=new BIG(ROM.CURVE_Pya);
-		BIG Pyb=new BIG(ROM.CURVE_Pyb);
-
-		BIG Fra=new BIG(ROM.CURVE_Fra);
-		BIG Frb=new BIG(ROM.CURVE_Frb);
-
-		FP2 f=new FP2(Fra,Frb);
-
-		FP2 Px=new FP2(Pxa,Pxb);
-		FP2 Py=new FP2(Pya,Pyb);
-
-		ECP2 P=new ECP2(Px,Py);
-
-		System.out.println("P= "+P.toString());
-
-		P=P.mul(r);
-		System.out.println("P= "+P.toString());
-
-		ECP2 Q=new ECP2(Px,Py);
-		Q.frob(f);
-		System.out.println("Q= "+Q.toString());
-
-
-	} */
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/70e3a3a3/cs/FF.cs
----------------------------------------------------------------------
diff --git a/cs/FF.cs b/cs/FF.cs
deleted file mode 100644
index ed27844..0000000
--- a/cs/FF.cs
+++ /dev/null
@@ -1,1084 +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.
-*/
-
-/* Large Finite Field arithmetic */
-/* AMCL mod p functions */
-
-public sealed class FF
-{
-	private readonly BIG[] v;
-	private readonly int length;
-
-	private static readonly int P_MBITS = ROM.MODBYTES * 8;
-	private static readonly int P_MB = (P_MBITS % ROM.BASEBITS);
-	private static readonly long P_OMASK = ((long)(-1) << (P_MBITS % ROM.BASEBITS));
-	private static readonly long P_FEXCESS = ((long)1 << (ROM.BASEBITS * ROM.NLEN - P_MBITS));
-	private static readonly int P_TBITS = (P_MBITS % ROM.BASEBITS);
-
-	public long P_EXCESS()
-	{
-		return ((v[length - 1].get(ROM.NLEN - 1) & P_OMASK) >> (P_MB));
-	}
-
-/* Constructors */
-	public FF(int n)
-	{
-		v = new BIG[n];
-		for (int i = 0;i < n;i++)
-		{
-			v[i] = new BIG(0);
-		}
-		length = n;
-	}
-
-	public FF(long[][] x, int n)
-	{
-		v = new BIG[n];
-		for (int i = 0;i < n;i++)
-		{
-			v[i] = new BIG(x[i]);
-		}
-		length = n;
-	}
-
-	public int getlen()
-	{
-		return length;
-	}
-
-/* set to integer */
-	public void set(int m)
-	{
-		zero();
-		v[0].set(0,(long)m);
-	}
-
-/* copy from FF b */
-	public void copy(FF b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].copy(b.v[i]);
-		}
-	}
-
-/* x=y<<n */
-	public void dsucopy(FF b)
-	{
-		for (int i = 0;i < b.length;i++)
-		{
-			v[b.length + i].copy(b.v[i]);
-			v[i].zero();
-		}
-	}
-
-/* x=y */
-	public void dscopy(FF b)
-	{
-		for (int i = 0;i < b.length;i++)
-		{
-			v[i].copy(b.v[i]);
-			v[b.length + i].zero();
-		}
-	}
-
-/* x=y>>n */
-	public void sducopy(FF b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].copy(b.v[length + i]);
-		}
-	}
-
-/* set to zero */
-	public void zero()
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].zero();
-		}
-	}
-
-	public void one()
-	{
-		v[0].one();
-		for (int i = 1;i < length;i++)
-		{
-			v[i].zero();
-		}
-	}
-
-/* test equals 0 */
-	public bool iszilch()
-	{
-		for (int i = 0;i < length;i++)
-		{
-			if (!v[i].iszilch())
-			{
-				return false;
-			}
-		}
-		return true;
-	}
-
-/* shift right by 256-bit words */
-	public void shrw(int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[i].copy(v[i + n]);
-			v[i + n].zero();
-		}
-	}
-
-/* shift left by 256-bit words */
-	public void shlw(int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[n + i].copy(v[i]);
-			v[i].zero();
-		}
-	}
-
-/* extract last bit */
-	public int parity()
-	{
-		return v[0].parity();
-	}
-
-	public int lastbits(int m)
-	{
-		return v[0].lastbits(m);
-	}
-
-/* compare x and y - must be normalised, and of same length */
-	public static int comp(FF a, FF b)
-	{
-		int i, j;
-		for (i = a.length - 1;i >= 0;i--)
-		{
-			j = BIG.comp(a.v[i],b.v[i]);
-			if (j != 0)
-			{
-				return j;
-			}
-		}
-		return 0;
-	}
-
-/* recursive add */
-	public void radd(int vp, FF x, int xp, FF y, int yp, int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[vp + i].copy(x.v[xp + i]);
-			v[vp + i].add(y.v[yp + i]);
-		}
-	}
-
-/* recursive inc */
-	public void rinc(int vp, FF y, int yp, int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[vp + i].add(y.v[yp + i]);
-		}
-	}
-
-/* recursive sub */
-	public void rsub(int vp, FF x, int xp, FF y, int yp, int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[vp + i].copy(x.v[xp + i]);
-			v[vp + i].sub(y.v[yp + i]);
-		}
-	}
-
-/* recursive dec */
-	public void rdec(int vp, FF y, int yp, int n)
-	{
-		for (int i = 0;i < n;i++)
-		{
-			v[vp + i].sub(y.v[yp + i]);
-		}
-	}
-
-/* simple add */
-	public void add(FF b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].add(b.v[i]);
-		}
-	}
-
-/* simple sub */
-	public void sub(FF b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].sub(b.v[i]);
-		}
-	}
-
-/* reverse sub */
-	public void revsub(FF b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].rsub(b.v[i]);
-		}
-	}
-
-/* increment/decrement by a small integer */
-	public void inc(int m)
-	{
-		v[0].inc(m);
-		norm();
-	}
-
-	public void dec(int m)
-	{
-		v[0].dec(m);
-		norm();
-	}
-
-	/* normalise - but hold any overflow in top part unless n<0 */
-	private void rnorm(int vp, int n)
-	{
-		bool trunc = false;
-		int i;
-		long carry;
-		if (n < 0)
-		{ // -v n signals to do truncation
-			n = -n;
-			trunc = true;
-		}
-		for (i = 0;i < n - 1;i++)
-		{
-			carry = v[vp + i].norm();
-			v[vp + i].xortop(carry << P_TBITS);
-			v[vp + i + 1].inc((int)carry);
-		}
-		carry = v[vp + n - 1].norm();
-		if (trunc)
-		{
-			v[vp + n - 1].xortop(carry << P_TBITS);
-		}
-
-	}
-
-	public void norm()
-	{
-		rnorm(0,length);
-	}
-
-/* shift left by one bit */
-	public void shl()
-	{
-		int i , delay_carry = 0;
-		long carry;
-		for (i = 0;i < length - 1;i++)
-		{
-			carry = v[i].fshl(1);
-			v[i].inc(delay_carry);
-			v[i].xortop(carry << P_TBITS);
-			delay_carry = (int)carry;
-		}
-		v[length - 1].fshl(1);
-		v[length - 1].inc(delay_carry);
-	}
-
-/* shift right by one bit */
-
-	public void shr()
-	{
-		int i;
-		long carry;
-		for (i = length - 1;i > 0;i--)
-		{
-			carry = v[i].fshr(1);
-			v[i - 1].ortop(carry << P_TBITS);
-		}
-		v[0].fshr(1);
-	}
-
-/* Convert to Hex String */
-	public override string ToString()
-	{
-		norm();
-		string s = "";
-		for (int i = length - 1;i >= 0;i--)
-		{
-			s += v[i].ToString();
-		}
-		return s;
-	}
-
-/* Convert FFs to/from byte arrays */
-	public void toBytes(sbyte[] b)
-	{
-		for (int i = 0;i < length;i++)
-		{
-			v[i].tobytearray(b,(length - i - 1) * ROM.MODBYTES);
-		}
-	}
-
-	public static void fromBytes(FF x, sbyte[] b)
-	{
-		for (int i = 0;i < x.length;i++)
-		{
-			x.v[i] = BIG.frombytearray(b,(x.length - i - 1) * ROM.MODBYTES);
-		}
-	}
-
-/* in-place swapping using xor - side channel resistant - lengths must be the same */
-	private static void cswap(FF a, FF b, int d)
-	{
-		for (int i = 0;i < a.length;i++)
-		{
-		//	BIG.cswap(a.v[i],b.v[i],d);
-			a.v[i].cswap(b.v[i],d);
-		}
-	}
-
-/* z=x*y, t is workspace */
-	private void karmul(int vp, FF x, int xp, FF y, int yp, FF t, int tp, int n)
-	{
-		int nd2;
-		if (n == 1)
-		{
-			DBIG d = BIG.mul(x.v[xp],y.v[yp]);
-			v[vp + 1] = d.Split(8 * ROM.MODBYTES);
-			v[vp].copy(d);
-			return;
-		}
-		nd2 = n / 2;
-		radd(vp,x,xp,x,xp + nd2,nd2);
-		//rnorm(vp,nd2);
-		radd(vp + nd2,y,yp,y,yp + nd2,nd2);
-		//rnorm(vp+nd2,nd2);
-		t.karmul(tp,this,vp,this,vp + nd2,t,tp + n,nd2);
-		karmul(vp,x,xp,y,yp,t,tp + n,nd2);
-		karmul(vp + n,x,xp + nd2,y,yp + nd2,t,tp + n,nd2);
-		t.rdec(tp,this,vp,n);
-		t.rdec(tp,this,vp + n,n);
-		rinc(vp + nd2,t,tp,n);
-		rnorm(vp,2 * n);
-	}
-
-	private void karsqr(int vp, FF x, int xp, FF t, int tp, int n)
-	{
-		int nd2;
-		if (n == 1)
-		{
-			DBIG d = BIG.sqr(x.v[xp]);
-			v[vp + 1].copy(d.Split(8 * ROM.MODBYTES));
-			v[vp].copy(d);
-			return;
-		}
-
-		nd2 = n / 2;
-		karsqr(vp,x,xp,t,tp + n,nd2);
-		karsqr(vp + n,x,xp + nd2,t,tp + n,nd2);
-		t.karmul(tp,x,xp,x,xp + nd2,t,tp + n,nd2);
-		rinc(vp + nd2,t,tp,n);
-		rinc(vp + nd2,t,tp,n);
-		rnorm(vp + nd2,n);
-	}
-
-
-	private void karmul_lower(int vp, FF x, int xp, FF y, int yp, FF t, int tp, int n)
-	{ // Calculates Least Significant bottom half of x*y
-		int nd2;
-		if (n == 1)
-		{ // only calculate bottom half of product
-			v[vp].copy(BIG.smul(x.v[xp],y.v[yp]));
-			return;
-		}
-		nd2 = n / 2;
-
-		karmul(vp,x,xp,y,yp,t,tp + n,nd2);
-		t.karmul_lower(tp,x,xp + nd2,y,yp,t,tp + n,nd2);
-		rinc(vp + nd2,t,tp,nd2);
-		t.karmul_lower(tp,x,xp,y,yp + nd2,t,tp + n,nd2);
-		rinc(vp + nd2,t,tp,nd2);
-		rnorm(vp + nd2,-nd2); // truncate it
-	}
-
-	private void karmul_upper(FF x, FF y, FF t, int n)
-	{ // Calculates Most Significant upper half of x*y, given lower part
-		int nd2;
-
-		nd2 = n / 2;
-		radd(n,x,0,x,nd2,nd2);
-		radd(n + nd2,y,0,y,nd2,nd2);
-
-		t.karmul(0,this,n + nd2,this,n,t,n,nd2); // t = (a0+a1)(b0+b1)
-		karmul(n,x,nd2,y,nd2,t,n,nd2); // z[n]= a1*b1
-									/* z[0-nd2]=l(a0b0) z[nd2-n]= h(a0b0)+l(t)-l(a0b0)-l(a1b1) */
-		t.rdec(0,this,n,n); // t=t-a1b1
-		rinc(nd2,this,0,nd2); // z[nd2-n]+=l(a0b0) = h(a0b0)+l(t)-l(a1b1)
-		rdec(nd2,t,0,nd2); // z[nd2-n]=h(a0b0)+l(t)-l(a1b1)-l(t-a1b1)=h(a0b0)
-		rnorm(0,-n); // a0b0 now in z - truncate it
-		t.rdec(0,this,0,n); // (a0+a1)(b0+b1) - a0b0
-		rinc(nd2,t,0,n);
-
-		rnorm(nd2,n);
-	}
-
-	/* z=x*y. Assumes x and y are of same length. */
-	public static FF mul(FF x, FF y)
-	{
-		int n = x.length;
-		FF z = new FF(2 * n);
-		FF t = new FF(2 * n);
-		z.karmul(0,x,0,y,0,t,0,n);
-		return z;
-	}
-
-/* return low part of product this*y */
-	public void lmul(FF y)
-	{
-		int n = length;
-		FF t = new FF(2 * n);
-		FF x = new FF(n);
-		x.copy(this);
-		karmul_lower(0,x,0,y,0,t,0,n);
-	}
-
-/* Set b=b mod c */
-	public void mod(FF c)
-	{
-		int k = 0;
-
-		norm();
-		if (comp(this,c) < 0)
-		{
-			return;
-		}
-		do
-		{
-			c.shl();
-			k++;
-		} while (comp(this,c) >= 0);
-
-		while (k > 0)
-		{
-			c.shr();
-			if (comp(this,c) >= 0)
-			{
-				sub(c);
-				norm();
-			}
-			k--;
-		}
-	}
-
-	/* z=x^2 */
-	public static FF sqr(FF x)
-	{
-		int n = x.length;
-		FF z = new FF(2 * n);
-		FF t = new FF(2 * n);
-		z.karsqr(0,x,0,t,0,n);
-		return z;
-	}
-
-/* return This mod modulus, N is modulus, ND is Montgomery Constant */
-	public FF reduce(FF N, FF ND)
-	{ // fast karatsuba Montgomery reduction
-		int n = N.length;
-		FF t = new FF(2 * n);
-		FF r = new FF(n);
-		FF m = new FF(n);
-
-		r.sducopy(this);
-		m.karmul_lower(0,this,0,ND,0,t,0,n);
-		karmul_upper(N,m,t,n);
-		m.sducopy(this);
-
-		r.add(N);
-		r.sub(m);
-		r.norm();
-
-		return r;
-
-	}
-
-/* Set r=this mod b */
-/* this is of length - 2*n */
-/* r,b is of length - n */
-	public FF dmod(FF b)
-	{
-		int k , n = b.length;
-		FF m = new FF(2 * n);
-		FF x = new FF(2 * n);
-		FF r = new FF(n);
-
-		x.copy(this);
-		x.norm();
-		m.dsucopy(b);
-		k = 256 * n;
-
-		while (k > 0)
-		{
-			m.shr();
-
-			if (comp(x,m) >= 0)
-			{
-				x.sub(m);
-				x.norm();
-			}
-			k--;
-		}
-
-		r.copy(x);
-		r.mod(b);
-		return r;
-	}
-
-/* Set return=1/this mod p. Binary method - a<p on entry */
-
-	public void invmodp(FF p)
-	{
-		int n = p.length;
-
-		FF u = new FF(n);
-		FF v = new FF(n);
-		FF x1 = new FF(n);
-		FF x2 = new FF(n);
-		FF t = new FF(n);
-		FF one = new FF(n);
-
-		one.one();
-		u.copy(this);
-		v.copy(p);
-		x1.copy(one);
-		x2.zero();
-
-	// reduce n in here as well!
-		while (comp(u,one) != 0 && comp(v,one) != 0)
-		{
-			while (u.parity() == 0)
-			{
-				u.shr();
-				if (x1.parity() != 0)
-				{
-					x1.add(p);
-					x1.norm();
-				}
-				x1.shr();
-			}
-			while (v.parity() == 0)
-			{
-				v.shr();
-				if (x2.parity() != 0)
-				{
-					x2.add(p);
-					x2.norm();
-				}
-				x2.shr();
-			}
-			if (comp(u,v) >= 0)
-			{
-
-				u.sub(v);
-				u.norm();
-				if (comp(x1,x2) >= 0)
-				{
-					x1.sub(x2);
-				}
-				else
-				{
-					t.copy(p);
-					t.sub(x2);
-					x1.add(t);
-				}
-				x1.norm();
-			}
-			else
-			{
-				v.sub(u);
-				v.norm();
-				if (comp(x2,x1) >= 0)
-				{
-					x2.sub(x1);
-				}
-				else
-				{
-					t.copy(p);
-					t.sub(x1);
-					x2.add(t);
-				}
-				x2.norm();
-			}
-		}
-		if (comp(u,one) == 0)
-		{
-			copy(x1);
-		}
-		else
-		{
-			copy(x2);
-		}
-	}
-
-/* nresidue mod m */
-	public void nres(FF m)
-	{
-		int n = m.length;
-		FF d = new FF(2 * n);
-		d.dsucopy(this);
-		copy(d.dmod(m));
-	}
-
-	public void redc(FF m, FF ND)
-	{
-		int n = m.length;
-		FF d = new FF(2 * n);
-		mod(m);
-		d.dscopy(this);
-		copy(d.reduce(m,ND));
-		mod(m);
-	}
-
-	private void mod2m(int m)
-	{
-		for (int i = m;i < length;i++)
-		{
-			v[i].zero();
-		}
-	}
-
-	/* U=1/a mod 2^m - Arazi & Qi */
-	private FF invmod2m()
-	{
-		int i , n = length;
-
-		FF b = new FF(n);
-		FF c = new FF(n);
-		FF U = new FF(n);
-
-		FF t;
-
-		U.zero();
-		U.v[0].copy(v[0]);
-		U.v[0].invmod2m();
-
-		for (i = 1;i < n;i <<= 1)
-		{
-			b.copy(this);
-			b.mod2m(i);
-			t = mul(U,b);
-			t.shrw(i);
-			b.copy(t);
-			c.copy(this);
-			c.shrw(i);
-			c.mod2m(i);
-			c.lmul(U);
-			c.mod2m(i);
-
-			b.add(c);
-			b.norm();
-			b.lmul(U);
-			b.mod2m(i);
-
-			c.one();
-			c.shlw(i);
-			b.revsub(c);
-			b.norm();
-			b.shlw(i);
-			U.add(b);
-		}
-		U.norm();
-		return U;
-	}
-
-	public void random(RAND rng)
-	{
-		int n = length;
-		for (int i = 0;i < n;i++)
-		{
-			v[i].copy(BIG.random(rng));
-		}
-	/* make sure top bit is 1 */
-		while (v[n - 1].nbits() < ROM.MODBYTES * 8)
-		{
-			v[n - 1].copy(BIG.random(rng));
-		}
-	}
-
-	/* generate random x */
-	public void randomnum(FF p, RAND rng)
-	{
-		int n = length;
-		FF d = new FF(2 * n);
-
-		for (int i = 0;i < 2 * n;i++)
-		{
-			d.v[i].copy(BIG.random(rng));
-		}
-		copy(d.dmod(p));
-	}
-
-	/* this*=y mod p */
-	public void modmul(FF y, FF p, FF nd)
-	{
-		//FF d=new FF(2*p.length);
-		long ex = P_EXCESS();
-		long ey = y.P_EXCESS();
-		if ((ex + 1) * (ey + 1) + 1 >= P_FEXCESS)
-		{
-			mod(p);
-		}
-		FF d = mul(this,y);
-		copy(d.reduce(p,nd));
-	}
-
-	/* this*=y mod p */
-	public void modsqr(FF p, FF nd)
-	{
-		//FF d=new FF(2*p.length);
-		long ex = P_EXCESS();
-		if ((ex + 1) * (ex + 1) + 1 >= P_FEXCESS)
-		{
-			mod(p);
-		}
-		FF d = sqr(this);
-		copy(d.reduce(p,nd));
-	}
-
-	/* this=this^e mod p using side-channel resistant Montgomery Ladder, for large e */
-	public void skpow(FF e, FF p)
-	{
-		int i , b , n = p.length;
-		FF R0 = new FF(n);
-		FF R1 = new FF(n);
-		FF ND = p.invmod2m();
-
-		mod(p);
-		R0.one();
-		R1.copy(this);
-		R0.nres(p);
-		R1.nres(p);
-
-		for (i = 8 * ROM.MODBYTES * n - 1;i >= 0;i--)
-		{
-			b = e.v[i / 256].bit(i % 256);
-			copy(R0);
-			modmul(R1,p,ND);
-
-			cswap(R0,R1,b);
-			R0.modsqr(p,ND);
-
-			R1.copy(this);
-			cswap(R0,R1,b);
-		}
-		copy(R0);
-		redc(p,ND);
-	}
-
-	/* this =this^e mod p using side-channel resistant Montgomery Ladder, for short e */
-	public void skpow(BIG e, FF p)
-	{
-		int i , b , n = p.length;
-		FF R0 = new FF(n);
-		FF R1 = new FF(n);
-		FF ND = p.invmod2m();
-
-		mod(p);
-		R0.one();
-		R1.copy(this);
-		R0.nres(p);
-		R1.nres(p);
-
-		for (i = 8 * ROM.MODBYTES - 1;i >= 0;i--)
-		{
-			b = e.bit(i);
-			copy(R0);
-			modmul(R1,p,ND);
-
-			cswap(R0,R1,b);
-			R0.modsqr(p,ND);
-
-			R1.copy(this);
-			cswap(R0,R1,b);
-		}
-		copy(R0);
-		redc(p,ND);
-	}
-
-	/* raise to an integer power - right-to-left method */
-	public void power(int e, FF p)
-	{
-		int n = p.length;
-		FF w = new FF(n);
-		FF ND = p.invmod2m();
-		bool f = true;
-
-		w.copy(this);
-		w.nres(p);
-
-		if (e == 2)
-		{
-			copy(w);
-			modsqr(p,ND);
-		}
-		else
-		{
-			for (; ;)
-			{
-			if (e % 2 == 1)
-			{
-				if (f)
-				{
-					copy(w);
-				}
-				else
-				{
-					modmul(w,p,ND);
-				}
-				f = false;
-			}
-			e >>= 1;
-			if (e == 0)
-			{
-				break;
-			}
-			w.modsqr(p,ND);
-			}
-		}
-		redc(p,ND);
-	}
-
-	/* this=this^e mod p, faster but not side channel resistant */
-	public void pow(FF e, FF p)
-	{
-		int i , b , n = p.length;
-		FF w = new FF(n);
-		FF ND = p.invmod2m();
-
-		w.copy(this);
-		one();
-		nres(p);
-		w.nres(p);
-		for (i = 8 * ROM.MODBYTES * n - 1;i >= 0;i--)
-		{
-			modsqr(p,ND);
-			b = e.v[i / 256].bit(i % 256);
-			if (b == 1)
-			{
-				modmul(w,p,ND);
-			}
-		}
-		redc(p,ND);
-	}
-
-	/* double exponentiation r=x^e.y^f mod p */
-	public void pow2(BIG e, FF y, BIG f, FF p)
-	{
-		int i , eb , fb , n = p.length;
-		FF xn = new FF(n);
-		FF yn = new FF(n);
-		FF xy = new FF(n);
-		FF ND = p.invmod2m();
-
-		xn.copy(this);
-		yn.copy(y);
-		xn.nres(p);
-		yn.nres(p);
-		xy.copy(xn);
-		xy.modmul(yn,p,ND);
-		one();
-		nres(p);
-
-		for (i = 8 * ROM.MODBYTES - 1;i >= 0;i--)
-		{
-			eb = e.bit(i);
-			fb = f.bit(i);
-			modsqr(p,ND);
-			if (eb == 1)
-			{
-				if (fb == 1)
-				{
-					modmul(xy,p,ND);
-				}
-				else
-				{
-					modmul(xn,p,ND);
-				}
-			}
-			else
-			{
-				if (fb == 1)
-				{
-					modmul(yn,p,ND);
-				}
-			}
-		}
-		redc(p,ND);
-	}
-
-	private static int igcd(int x, int y)
-	{ // integer GCD, returns GCD of x and y
-		int r;
-		if (y == 0)
-		{
-			return x;
-		}
-		while ((r = x % y) != 0)
-		{
-				x = y;
-				y = r;
-		}
-		return y;
-	}
-
-	/* quick and dirty check for common factor with n */
-	public bool cfactor(int s)
-	{
-		int r , n = length;
-		int g;
-
-		FF x = new FF(n);
-		FF y = new FF(n);
-
-		y.set(s);
-		x.copy(this);
-		x.norm();
-
-		do
-		{
-			x.sub(y);
-			x.norm();
-			while (!x.iszilch() && x.parity() == 0)
-			{
-				x.shr();
-			}
-		} while (comp(x,y) > 0);
-
-		g = (int)x.v[0].get(0);
-		r = igcd(s,g);
-		if (r > 1)
-		{
-			return true;
-		}
-		return false;
-	}
-
-	/* Miller-Rabin test for primality. Slow. */
-	public static bool prime(FF p, RAND rng)
-	{
-		int i , j , s = 0, n = p.length;
-		bool loop;
-		FF d = new FF(n);
-		FF x = new FF(n);
-		FF unity = new FF(n);
-		FF nm1 = new FF(n);
-
-		int sf = 4849845; // 3*5*.. *19
-		p.norm();
-
-		if (p.cfactor(sf))
-		{
-			return false;
-		}
-		unity.one();
-		nm1.copy(p);
-		nm1.sub(unity);
-		nm1.norm();
-		d.copy(nm1);
-
-		while (d.parity() == 0)
-		{
-			d.shr();
-			s++;
-		}
-		if (s == 0)
-		{
-			return false;
-		}
-		for (i = 0;i < 10;i++)
-		{
-			x.randomnum(p,rng);
-			x.pow(d,p);
-			if (comp(x,unity) == 0 || comp(x,nm1) == 0)
-			{
-				continue;
-			}
-			loop = false;
-			for (j = 1;j < s;j++)
-			{
-				x.power(2,p);
-				if (comp(x,unity) == 0)
-				{
-					return false;
-				}
-				if (comp(x,nm1) == 0)
-				{
-					loop = true;
-					break;
-				}
-			}
-			if (loop)
-			{
-				continue;
-			}
-			return false;
-		}
-		return true;
-	}
-
-/*
-	public static final long[][] P ={{0xAD19A781670957L,0x76A79C00965796L,0xDEFCC5FC9A9717L,0xF02F2940E20E9L,0xBF59E34FL},{0x6894F31844C908L,0x8DADA70E82C79FL,0xFD29F3836046F6L,0x8C1D874D314DD0L,0x46D077BL},{0x3C515217813331L,0x56680FD1CE935BL,0xE55C53EEA8838EL,0x92C2F7E14A4A95L,0xD945E5B1L},{0xACF673E919F5EFL,0x6723E7E7DAB446L,0x6B6FA69B36EB1BL,0xF7D13920ECA300L,0xB5FC2165L}};
-
-	public static void main(String[] args) {
-		byte[] raw=new byte[100];
-		RAND rng=new RAND();
-
-		rng.clean();
-		for (int i=0;i<100;i++) raw[i]=(byte)i;
-
-		rng.seed(100,raw);
-
-		int n=4;
-
-		FF x=new FF(n);
-		x.set(3);
-
-		FF p=new FF(P,n);
-
-		if (prime(p,rng)) System.out.println("p is a prime");
-
-		FF e=new FF(n);
-		e.copy(p);
-		e.dec(1); e.norm();
-
-		System.out.println("e= "+e.toString());
-
-		x.skpow(e,p);
-		System.out.println("x= "+x.toString());
-
-    } */
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-milagro-crypto/blob/70e3a3a3/cs/FP.cs
----------------------------------------------------------------------
diff --git a/cs/FP.cs b/cs/FP.cs
deleted file mode 100644
index 4e7b74e..0000000
--- a/cs/FP.cs
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/* Finite Field arithmetic */
-/* AMCL mod p functions */
-
-public sealed class FP
-{
-	private readonly BIG x;
-	private static BIG p = new BIG(ROM.Modulus);
-
-/* Constructors */
-	public FP(int a)
-	{
-		x = new BIG(a);
-		nres();
-	}
-
-	public FP(BIG a)
-	{
-		x = new BIG(a);
-		nres();
-	}
-
-	public FP(FP a)
-	{
-		x = new BIG(a.x);
-	}
-
-/* convert to string */
-	public override string ToString()
-	{
-		string s = redc().ToString();
-		return s;
-	}
-
-	public string toRawString()
-	{
-		string s = x.toRawString();
-		return s;
-	}
-
-/* convert to Montgomery n-residue form */
-	public void nres()
-	{
-		if (ROM.MODTYPE != ROM.PSEUDO_MERSENNE)
-		{
-			DBIG d = new DBIG(x);
-			d.shl(ROM.NLEN * ROM.BASEBITS);
-			x.copy(d.mod(p));
-		}
-	}
-
-/* convert back to regular form */
-	public BIG redc()
-	{
-		if (ROM.MODTYPE != ROM.PSEUDO_MERSENNE)
-		{
-			DBIG d = new DBIG(x);
-			return BIG.mod(d);
-		}
-		else
-		{
-			BIG r = new BIG(x);
-			return r;
-		}
-	}
-
-/* test this=0? */
-	public bool iszilch()
-	{
-		reduce();
-		return x.iszilch();
-	}
-
-/* copy from FP b */
-	public void copy(FP b)
-	{
-		x.copy(b.x);
-	}
-
-/* set this=0 */
-	public void zero()
-	{
-		x.zero();
-	}
-
-/* set this=1 */
-	public void one()
-	{
-		x.one();
-		nres();
-	}
-
-/* normalise this */
-	public void norm()
-	{
-		x.norm();
-	}
-
-/* swap FPs depending on d */
-	public void cswap(FP b, int d)
-	{
-		x.cswap(b.x,d);
-	}
-
-/* copy FPs depending on d */
-	public void cmove(FP b, int d)
-	{
-		x.cmove(b.x,d);
-	}
-
-/* this*=b mod Modulus */
-	public void mul(FP b)
-	{
-		long ea = BIG.EXCESS(x);
-		long eb = BIG.EXCESS(b.x);
-
-		if ((ea + 1) * (eb + 1) + 1 >= ROM.FEXCESS)
-		{
-			reduce();
-		}
-
-		DBIG d = BIG.mul(x,b.x);
-		x.copy(BIG.mod(d));
-	}
-
-/* this*=c mod Modulus, where c is a small int */
-	public void imul(int c)
-	{
-		norm();
-		bool s = false;
-		if (c < 0)
-		{
-			c = -c;
-			s = true;
-		}
-		long afx = (BIG.EXCESS(x) + 1) * (c + 1) + 1;
-		if (c < ROM.NEXCESS && afx < ROM.FEXCESS)
-		{
-			x.imul(c);
-		}
-		else
-		{
-			if (afx < ROM.FEXCESS)
-			{
-				x.pmul(c);
-			}
-			else
-			{
-				DBIG d = x.pxmul(c);
-				x.copy(d.mod(p));
-			}
-		}
-		if (s)
-		{
-			neg();
-		}
-		norm();
-	}
-
-
-/* this*=this mod Modulus */
-	public void sqr()
-	{
-		DBIG d;
-		long ea = BIG.EXCESS(x);
-		if ((ea + 1) * (ea + 1) + 1 >= ROM.FEXCESS)
-		{
-			reduce();
-		}
-
-		d = BIG.sqr(x);
-		x.copy(BIG.mod(d));
-	}
-
-/* this+=b */
-	public void add(FP b)
-	{
-		x.add(b.x);
-		if (BIG.EXCESS(x) + 2 >= ROM.FEXCESS)
-		{
-			reduce();
-		}
-	}
-
-/* this = -this mod Modulus */
-	public void neg()
-	{
-		int sb;
-		long ov;
-		BIG m = new BIG(p);
-
-		norm();
-
-		ov = BIG.EXCESS(x);
-		sb = 1;
-		while (ov != 0)
-		{
-			sb++;
-			ov >>= 1;
-		}
-
-		m.fshl(sb);
-		x.rsub(m);
-
-		if (BIG.EXCESS(x) >= ROM.FEXCESS)
-		{
-			reduce();
-		}
-	}
-
-/* this-=b */
-	public void sub(FP b)
-	{
-		FP n = new FP(b);
-		n.neg();
-		this.add(n);
-	}
-
-/* this/=2 mod Modulus */
-	public void div2()
-	{
-		x.norm();
-		if (x.parity() == 0)
-		{
-			x.fshr(1);
-		}
-		else
-		{
-			x.add(p);
-			x.norm();
-			x.fshr(1);
-		}
-	}
-
-/* this=1/this mod Modulus */
-	public void inverse()
-	{
-		BIG r = redc();
-		r.invmodp(p);
-		x.copy(r);
-		nres();
-	}
-
-/* return TRUE if this==a */
-	public bool Equals(FP a)
-	{
-		a.reduce();
-		reduce();
-		if (BIG.comp(a.x,x) == 0)
-		{
-			return true;
-		}
-		return false;
-	}
-
-/* reduce this mod Modulus */
-	public void reduce()
-	{
-		x.mod(p);
-	}
-
-/* return this^e mod Modulus */
-	public FP pow(BIG e)
-	{
-		int bt;
-		FP r = new FP(1);
-		e.norm();
-		x.norm();
-		FP m = new FP(this);
-		while (true)
-		{
-			bt = e.parity();
-			e.fshr(1);
-			if (bt == 1)
-			{
-				r.mul(m);
-			}
-			if (e.iszilch())
-			{
-				break;
-			}
-			m.sqr();
-		}
-		r.x.mod(p);
-		return r;
-	}
-
-/* return sqrt(this) mod Modulus */
-	public FP sqrt()
-	{
-		reduce();
-		BIG b = new BIG(p);
-		if (ROM.MOD8 == 5)
-		{
-			b.dec(5);
-			b.norm();
-			b.shr(3);
-			FP i = new FP(this);
-			i.x.shl(1);
-			FP v = i.pow(b);
-			i.mul(v);
-			i.mul(v);
-			i.x.dec(1);
-			FP r = new FP(this);
-			r.mul(v);
-			r.mul(i);
-			r.reduce();
-			return r;
-		}
-		else
-		{
-			b.inc(1);
-			b.norm();
-			b.shr(2);
-			return pow(b);
-		}
-	}
-
-/* return jacobi symbol (this/Modulus) */
-	public int jacobi()
-	{
-		BIG w = redc();
-		return w.jacobi(p);
-	}
-/*
-	public static void main(String[] args) {
-		BIG m=new BIG(ROM.Modulus);
-		BIG x=new BIG(3);
-		BIG e=new BIG(m);
-		e.dec(1);
-
-		System.out.println("m= "+m.nbits());
-
-
-		BIG r=x.powmod(e,m);
-
-		System.out.println("m= "+m.toString());
-		System.out.println("r= "+r.toString());
-
-		BIG.cswap(m,r,0);
-
-		System.out.println("m= "+m.toString());
-		System.out.println("r= "+r.toString());
-
-//		FP y=new FP(3);
-//		FP s=y.pow(e);
-//		System.out.println("s= "+s.toString());
-
-	} */
-}