ln.crypto.ec/ln.crypto.ec.test/UnitTest1.cs

224 lines
12 KiB
C#

using System;
using System.Security.Cryptography;
using System.Text;
using Crypto.EC;
using ln.crypto.ec.lsag;
using NUnit.Framework;
using System.Numerics;
using System.Globalization;
namespace ln.crypto.ec.test
{
public class Tests
{
[SetUp]
public void Setup()
{
}
[Test]
public void Test_05_BigInteger()
{
foreach (TestVector testVector in vectors)
{
BigInteger bi = BigInteger.Parse(testVector.sx, System.Globalization.NumberStyles.HexNumber);
string si = bi.ToString("X");
BigInteger bi2 = BigInteger.Parse(si, System.Globalization.NumberStyles.HexNumber);
TestContext.Error.WriteLine("BigInteger Test: SRC={0}", bi.ToString("X"));
TestContext.Error.WriteLine("BigInteger Test: DST={0}", bi2.ToString("X"));
Assert.IsTrue(bi == bi2);
}
}
[Test]
public void Test_10_Curve()
{
EllipticCurve secp256k1 = EllipticCurve.createSecp256k1();
/* Minimum check security... TODO: */
Assert.IsFalse(new CurvePoint(secp256k1, 4, 3).isOnCurve());
foreach (TestVector testVector in vectors)
{
TestContext.Error.WriteLine("TestCurve: k={0}", testVector.k);
CurvePoint testPoint = new CurvePoint(secp256k1, testVector.x, testVector.y);
CurvePoint checkPoint = secp256k1.G * testVector.k;
if (!Object.Equals(checkPoint, testPoint))
{
TestContext.Error.WriteLine("TestCurve: modulus: {0}", secp256k1.Fp.FieldModulo.ToString("X"));
TestContext.Error.WriteLine("TestCurve: test x: {0}", testPoint.X.ToString("X"));
TestContext.Error.WriteLine("TestCurve: test y: {0}", testPoint.Y.ToString("X"));
TestContext.Error.WriteLine("TestCurve: check x: {0}", checkPoint.X.ToString("X"));
TestContext.Error.WriteLine("TestCurve: check y: {0}", checkPoint.Y.ToString("X"));
}
Assert.AreEqual(testPoint, checkPoint);
Assert.IsTrue( checkPoint.isOnCurve() );
}
Assert.Pass();
}
[Test]
public void Test_11_Performance_Point_Mul()
{
int testCount = 2000;
BigInteger n = BigInteger.Parse("115792089237316195423570985008687907852837564279074904382605163141518161494317", NumberStyles.HexNumber);
CurvePoint G = EllipticCurve.SECP256K1.G;
CurvePoint result = null;
DateTime start = DateTime.Now;
for (int i=0; i<testCount; i++)
{
result = G * n;
}
DateTime stop = DateTime.Now;
TestContext.Error.WriteLine("Point Multiplication Performance: needed {0}ms ( {1} multiplications / s )", (stop - start).TotalMilliseconds, (testCount * 1000) / (stop - start).TotalMilliseconds);
TestContext.Error.WriteLine("Resulting Point is: {0}", result.toHexString());
}
[Test]
public void Test_15_GenerateKeyPairs()
{
RandomNumberGenerator random = RandomNumberGenerator.Create();
for (int i=0; i< 10; i++)
{
byte[] random32 = new byte[32];
random.GetBytes(random32);
BigInteger privkey = EllipticCurve.SECP256K1.Fp.Fit(new BigInteger(random32));
CurvePoint publicKey = EllipticCurve.SECP256K1.G * privkey;
TestContext.Error.WriteLine("Generated Key-Pair: {0} : {1}", privkey.ToString("X"), publicKey.toHex());
}
}
[Test]
public void Test_20_LSAG()
{
byte[] message = Encoding.UTF8.GetBytes("I am the first and only to be signed text!");
LSAGDoTest(3, 3, message);
LSAGDoTest(10, 5, message);
LSAGDoTest(100, 5, message);
LSAGDoTest(1000, 5, message);
}
public void LSAGDoTest(int ringsize, int testsize, byte[] message)
{
TestContext.Error.WriteLine("LSAGDotest({0})", ringsize);
RandomNumberGenerator random = RandomNumberGenerator.Create();
BigInteger[] privateKeys = new BigInteger[ringsize];
CurvePoint[] publicKeys = new CurvePoint[ringsize];
byte[] random32 = new byte[32];
for (int n=0;n<ringsize;n++)
{
random.GetBytes(random32);
privateKeys[n] = EllipticCurve.SECP256K1.Fp.Fit(new BigInteger(random32));
publicKeys[n] = EllipticCurve.SECP256K1.G * privateKeys[n];
}
LSAG.Signature[] signatures = new LSAG.Signature[ringsize];
DateTime start = DateTime.Now;
for (int n=0;n<testsize;n++)
{
LSAG.Sign(message, EllipticCurve.SECP256K1, privateKeys[n % privateKeys.Length], publicKeys, out signatures[n]);
}
DateTime stop = DateTime.Now;
TestContext.Error.WriteLine("LSAGDotest({0}): needed {1}ms ( {2}ms / sign )", ringsize, (stop - start).TotalMilliseconds,(stop - start).TotalMilliseconds / testsize);
start = DateTime.Now;
for (int n=0;n<testsize;n++)
{
Assert.IsTrue(LSAG.Verify(EllipticCurve.SECP256K1, message, publicKeys, signatures[n]));
}
stop = DateTime.Now;
TestContext.Error.WriteLine("LSAGDotest({0}): needed {1}ms ( {2}ms / verify )", ringsize, (stop - start).TotalMilliseconds,(stop - start).TotalMilliseconds / testsize);
for (int n=0;n<testsize;n++)
{
Assert.IsFalse(LSAG.Verify(EllipticCurve.SECP256K1, message, publicKeys, signatures[n].C0 + 1, signatures[n].s, signatures[n].Y));
}
}
struct TestVector
{
public BigInteger k,x,y;
public string sk,sx,sy;
public TestVector(BigInteger k, BigInteger x, BigInteger y)
{
this.k = k;
this.x = x;
this.y = y;
this.sk = k.ToString();
this.sx = x.ToString();
this.sy = y.ToString();
}
public TestVector(string k, string x, string y)
{
this.k = BigInteger.Parse(k);
this.x = BigInteger.Parse(x, NumberStyles.HexNumber);
this.y = BigInteger.Parse(y, NumberStyles.HexNumber);
this.sk = k;
this.sx = x;
this.sy = y;
}
}
TestVector[] vectors = new TestVector[]{
new TestVector("1","0079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798","00483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"),
new TestVector("2","00C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5","001AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A"),
new TestVector("3","00F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9","00388F7B0F632DE8140FE337E62A37F3566500A99934C2231B6CB9FD7584B8E672"),
new TestVector("4","00E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13","0051ED993EA0D455B75642E2098EA51448D967AE33BFBDFE40CFE97BDC47739922"),
new TestVector("5","002F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4","00D8AC222636E5E3D6D4DBA9DDA6C9C426F788271BAB0D6840DCA87D3AA6AC62D6"),
new TestVector("6","00FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556","00AE12777AACFBB620F3BE96017F45C560DE80F0F6518FE4A03C870C36B075F297"),
new TestVector("7","005CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC","006AEBCA40BA255960A3178D6D861A54DBA813D0B813FDE7B5A5082628087264DA"),
new TestVector("8","002F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01","005C4DA8A741539949293D082A132D13B4C2E213D6BA5B7617B5DA2CB76CBDE904"),
new TestVector("9","00ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE","00CC338921B0A7D9FD64380971763B61E9ADD888A4375F8E0F05CC262AC64F9C37"),
new TestVector("10","00A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7","00893ABA425419BC27A3B6C7E693A24C696F794C2ED877A1593CBEE53B037368D7"),
new TestVector("11","00774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB","00D984A032EB6B5E190243DD56D7B7B365372DB1E2DFF9D6A8301D74C9C953C61B"),
new TestVector("12","00D01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85A","00A9F34FFDC815E0D7A8B64537E17BD81579238C5DD9A86D526B051B13F4062327"),
new TestVector("13","00F28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA8","000AB0902E8D880A89758212EB65CDAF473A1A06DA521FA91F29B5CB52DB03ED81"),
new TestVector("14","00499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4","00CAC2F6C4B54E855190F044E4A7B3D464464279C27A3F95BCC65F40D403A13F5B"),
new TestVector("15","00D7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080E","00581E2872A86C72A683842EC228CC6DEFEA40AF2BD896D3A5C504DC9FF6A26B58"),
new TestVector("16","00E60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0A","00F7E3507399E595929DB99F34F57937101296891E44D23F0BE1F32CCE69616821"),
new TestVector("17","00DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34","004211AB0694635168E997B0EAD2A93DAECED1F4A04A95C0F6CFB199F69E56EB77"),
new TestVector("18","005601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC","00C136C1DC0CBEB930E9E298043589351D81D8E0BC736AE2A1F5192E5E8B061D58"),
new TestVector("19","002B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C","0085E89BC037945D93B343083B5A1C86131A01F60C50269763B570C854E5C09B7A"),
new TestVector("20","004CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97","0012BA26DCB10EC1625DA61FA10A844C676162948271D96967450288EE9233DC3A"),
new TestVector("112233445566778899","00A90CC3D3F3E146DAADFC74CA1372207CB4B725AE708CEF713A98EDD73D99EF29","005A79D6B289610C68BC3B47F3D72F9788A26A06868B4D8E433E1E2AD76FB7DC76"),
new TestVector("112233445566778899112233445566778899","00E5A2636BCFD412EBF36EC45B19BFB68A1BC5F8632E678132B885F7DF99C5E9B3","00736C1CE161AE27B405CAFD2A7520370153C2C861AC51D6C1D5985D9606B45F39"),
new TestVector("28948022309329048855892746252171976963209391069768726095651290785379540373584","00A6B594B38FB3E77C6EDF78161FADE2041F4E09FD8497DB776E546C41567FEB3C","0071444009192228730CD8237A490FEBA2AFE3D27D7CC1136BC97E439D13330D55"),
new TestVector("57896044618658097711785492504343953926418782139537452191302581570759080747168","0000000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C63","003F3979BF72AE8202983DC989AEC7F2FF2ED91BDD69CE02FC0700CA100E59DDF3"),
new TestVector("86844066927987146567678238756515930889628173209306178286953872356138621120752","00E24CE4BEEE294AA6350FAA67512B99D388693AE4E7F53D19882A6EA169FC1CE1","008B71E83545FC2B5872589F99D948C03108D36797C4DE363EBD3FF6A9E1A95B10"),
new TestVector("115792089237316195423570985008687907852837564279074904382605163141518161494317","004CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97","00ED45D9234EF13E9DA259E05EF57BB3989E9D6B7D8E269698BAFD77106DCC1FF5"),
new TestVector("115792089237316195423570985008687907852837564279074904382605163141518161494318","002B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C","007A17643FC86BA26C4CBCF7C4A5E379ECE5FE09F3AFD9689C4A8F37AA1A3F60B5"),
new TestVector("115792089237316195423570985008687907852837564279074904382605163141518161494319","005601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC","003EC93E23F34146CF161D67FBCA76CAE27E271F438C951D5E0AE6D1A074F9DED7"),
new TestVector("115792089237316195423570985008687907852837564279074904382605163141518161494320","00DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34","00BDEE54F96B9CAE9716684F152D56C251312E0B5FB56A3F09304E660861A910B8")
};
}
}