|
|
|
@ -219,9 +219,66 @@ namespace bn256 { |
|
|
|
|
BN256_G1_mul(z, y, x); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
[StructLayout(LayoutKind.Sequential)] |
|
|
|
|
public class G2 { |
|
|
|
|
private ulong v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11; |
|
|
|
|
private ulong v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23; |
|
|
|
|
public void Clear() |
|
|
|
|
{ |
|
|
|
|
BN256_G2_clear(this); |
|
|
|
|
} |
|
|
|
|
public void setStr(String s) |
|
|
|
|
{ |
|
|
|
|
if (BN256_G2_setStr(this, s) != 0) { |
|
|
|
|
throw new ArgumentException("BN256_G2_setStr", s); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public bool IsValid() |
|
|
|
|
{ |
|
|
|
|
return BN256_G2_isValid(this) == 1; |
|
|
|
|
} |
|
|
|
|
public bool Equals(G2 rhs) |
|
|
|
|
{ |
|
|
|
|
return BN256_G2_isSame(this, rhs) == 1; |
|
|
|
|
} |
|
|
|
|
public bool IsZero() |
|
|
|
|
{ |
|
|
|
|
return BN256_G2_isZero(this) == 1; |
|
|
|
|
} |
|
|
|
|
public void HashAndMapTo(String s) |
|
|
|
|
{ |
|
|
|
|
if (BN256_G2_hashAndMapTo(this, s) != 0) { |
|
|
|
|
throw new ArgumentException("BN256_G2_hashAndMapTo", s); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
public override string ToString() |
|
|
|
|
{ |
|
|
|
|
StringBuilder sb = new StringBuilder(1024); |
|
|
|
|
if (BN256_G2_getStr(sb, sb.Capacity + 1, this) != 0) { |
|
|
|
|
throw new ArgumentException("BN256_G2_getStr"); |
|
|
|
|
} |
|
|
|
|
return sb.ToString(); |
|
|
|
|
} |
|
|
|
|
public static void Neg(G2 y, G2 x) |
|
|
|
|
{ |
|
|
|
|
BN256_G2_neg(y, x); |
|
|
|
|
} |
|
|
|
|
public static void Dbl(G2 y, G2 x) |
|
|
|
|
{ |
|
|
|
|
BN256_G2_dbl(y, x); |
|
|
|
|
} |
|
|
|
|
public static void Add(G2 z, G2 y, G2 x) |
|
|
|
|
{ |
|
|
|
|
BN256_G2_add(z, y, x); |
|
|
|
|
} |
|
|
|
|
public static void Sub(G2 z, G2 y, G2 x) |
|
|
|
|
{ |
|
|
|
|
BN256_G2_sub(z, y, x); |
|
|
|
|
} |
|
|
|
|
public static void Mul(G2 z, G2 y, Fr x) |
|
|
|
|
{ |
|
|
|
|
BN256_G2_mul(z, y, x); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void Main(string[] args) |
|
|
|
@ -235,12 +292,14 @@ namespace bn256 { |
|
|
|
|
Console.WriteLine("ret= {0}", ret); |
|
|
|
|
TestFr(); |
|
|
|
|
TestG1(); |
|
|
|
|
TestG2(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
Console.WriteLine("ERR={0}", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
static void TestFr() |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("TestFr"); |
|
|
|
|
Fr x = new Fr(); |
|
|
|
|
x.Clear(); |
|
|
|
|
Console.WriteLine("x = {0}", x); |
|
|
|
@ -272,6 +331,7 @@ namespace bn256 { |
|
|
|
|
} |
|
|
|
|
static void TestG1() |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("TestG1"); |
|
|
|
|
G1 P = new G1(); |
|
|
|
|
P.Clear(); |
|
|
|
|
Console.WriteLine("P = {0}", P); |
|
|
|
@ -300,5 +360,36 @@ namespace bn256 { |
|
|
|
|
G1.Mul(Q, P, x); |
|
|
|
|
Console.WriteLine("Q == R {0}", Q.Equals(R)); |
|
|
|
|
} |
|
|
|
|
static void TestG2() |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("TestG2"); |
|
|
|
|
G2 P = new G2(); |
|
|
|
|
P.Clear(); |
|
|
|
|
Console.WriteLine("P = {0}", P); |
|
|
|
|
Console.WriteLine("P is valid {0}", P.IsValid()); |
|
|
|
|
Console.WriteLine("P is zero {0}", P.IsZero()); |
|
|
|
|
P.HashAndMapTo("abc"); |
|
|
|
|
Console.WriteLine("P = {0}", P); |
|
|
|
|
Console.WriteLine("P is valid {0}", P.IsValid()); |
|
|
|
|
Console.WriteLine("P is zero {0}", P.IsZero()); |
|
|
|
|
G2 Q = new G2(); |
|
|
|
|
G2.Neg(Q, P); |
|
|
|
|
Console.WriteLine("Q = {0}", Q); |
|
|
|
|
G2.Add(Q, Q, P); |
|
|
|
|
Console.WriteLine("Q = {0}", Q); |
|
|
|
|
G2.Dbl(Q, P); |
|
|
|
|
G2 R = new G2(); |
|
|
|
|
G2.Add(R, P, P); |
|
|
|
|
Console.WriteLine("P == R {0}", P.Equals(P)); |
|
|
|
|
Console.WriteLine("P == R {0}", P.Equals(R)); |
|
|
|
|
Console.WriteLine("Q == R {0}", Q.Equals(R)); |
|
|
|
|
Console.WriteLine("Q = {0}", Q); |
|
|
|
|
Console.WriteLine("R = {0}", R); |
|
|
|
|
Fr x = new Fr(); |
|
|
|
|
x.SetInt(3); |
|
|
|
|
G2.Add(R, R, P); |
|
|
|
|
G2.Mul(Q, P, x); |
|
|
|
|
Console.WriteLine("Q == R {0}", Q.Equals(R)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|