using System; namespace mcl { using static BLS256; class BLS256Test { static int err = 0; static void assert(string msg, bool b) { if (b) return; Console.WriteLine("ERR {0}", msg); err++; } static void TestId() { Console.WriteLine("TestId"); Id id = new Id(); id.SetStr("255", 10); assert("GetStr(10)", id.GetStr(10) == "255"); assert("GetStr(16)", id.GetStr(16) == "ff"); id.SetArray(new ulong[] { 1, 2, 3, 4 }); assert("GetStr(16)", id.GetStr(16) == "4000000000000000300000000000000020000000000000001"); } static void TestSecretKey() { Console.WriteLine("TestSecretKey"); SecretKey sec = new SecretKey(); sec.SetStr("255", 10); assert("GetStr(10)", sec.GetStr(10) == "255"); assert("GetStr(16)", sec.GetStr(16) == "ff"); sec.SetArray(new ulong[] { 1, 2, 3, 4 }); assert("GetStr(16)", sec.GetStr(16) == "4000000000000000300000000000000020000000000000001"); { SecretKey sec2 = new SecretKey(); sec.SetStr("321", 10); sec2.SetStr("4000", 10); sec.Add(sec2); assert("sec.Add", sec.GetStr(10) == "4321"); sec.Init(); Console.WriteLine("sec.Init={0}", sec); } } static void TestPublicKey() { Console.WriteLine("TestPublicKey"); SecretKey sec = new SecretKey(); sec.Init(); PublicKey pub = sec.GetPublicKey(); String sign = pub.ToString(); Console.WriteLine("pub={0}", sign); PublicKey pub2 = new PublicKey(); pub2.SetStr(sign); assert("pub.SetStr", pub.IsSame(pub2)); } static void TestSign() { Console.WriteLine("TestSign"); SecretKey sec = new SecretKey(); sec.Init(); PublicKey pub = sec.GetPublicKey(); String m = "abc"; Sign sign = sec.Sign(m); assert("verify", pub.Verify(sign, m)); assert("not verify", !pub.Verify(sign, m + "a")); } static void TestSharing() { Console.WriteLine("TestSharing"); int k = 5; SecretKey[] msk = new SecretKey[k]; PublicKey[] mpk = new PublicKey[k]; // make master secretkey for (int i = 0; i < k; i++) { msk[i].Init(); mpk[i] = msk[i].GetPublicKey(); } int n = 30; Id[] ids = new Id[n]; SecretKey[] secs = new SecretKey[n]; PublicKey[] pubs = new PublicKey[n]; for (int i = 0; i < n; i++) { ids[i].SetInt(i * i + 123); secs[i] = ShareSecretKey(msk, ids[i]); pubs[i] = SharePublicKey(mpk, ids[i]); assert("share publicKey", secs[i].GetPublicKey().IsSame(pubs[i])); } string m = "doremi"; for (int i = 0; i < n; i++) { Sign sign = secs[i].Sign(m); assert("sign.Verify", pubs[i].Verify(sign, m)); } { int[] idxTbl = { 0, 2, 5, 8, 10 }; assert("idxTbl.Length=k", idxTbl.Length == k); Id[] subIds = new Id[k]; SecretKey[] subSecs = new SecretKey[k]; PublicKey[] subPubs = new PublicKey[k]; Sign[] subSigns = new Sign[k]; for (int i = 0; i < k; i++) { int idx = idxTbl[i]; subIds[i] = ids[idx]; subSecs[i] = secs[idx]; subPubs[i] = pubs[idx]; subSigns[i] = secs[idx].Sign(m); } SecretKey sec = RecoverSecretKey(subSecs, subIds); PublicKey pub = RecoverPublicKey(subPubs, subIds); assert("check pub", pub.IsSame(sec.GetPublicKey())); Sign sign = RecoverSign(subSigns, subIds); assert("sign.verify", pub.Verify(sign, m)); } } static void Main(string[] args) { try { Init(); TestId(); TestSecretKey(); TestPublicKey(); TestSign(); TestSharing(); if (err == 0) { Console.WriteLine("all tests succeed"); } else { Console.WriteLine("err={0}", err); } } catch (Exception e) { Console.WriteLine("ERR={0}", e); } } } }