static void Main(string[] args) { byte[] privKey; if (File.Exists("privkey.hex")) { privKey = File.ReadAllBytes("privkey.hex"); } else { privKey = Oracle.GenerateOneTimeSigningKey(); File.WriteAllBytes("privkey.hex", privKey); } byte[] pubKey = Oracle.PublicKeyFromPrivateKey(privKey); Console.WriteLine("Oracle Public Key: {0}", BitConverter.ToString(pubKey).Replace("-", "")); while (true) { byte[] privPoint = Oracle.GenerateOneTimeSigningKey(); Console.WriteLine("PrivPoint for next publication: {0}", BitConverter.ToString(privPoint).Replace("-", "")); byte[] rPoint = Oracle.PublicKeyFromPrivateKey(privPoint); Console.WriteLine("R-Point for next publication: {0}", BitConverter.ToString(rPoint).Replace("-", "")); Console.Write("Enter number to publish (-1 to exit):"); var input = Console.ReadLine(); long value = 0; if (!long.TryParse(input, out value)) { Console.WriteLine("Couldn't parse input."); continue; } if (value == -1) { break; } byte[] message = Oracle.GenerateNumericMessage(value); Console.WriteLine("Message: {0}", BitConverter.ToString(message).Replace("-", "")); byte[] signature = Oracle.ComputeSignature(privKey, privPoint, message); byte[] sGFromSig = Oracle.PublicKeyFromPrivateKey(signature); byte[] sGFromPubKeysAndMessage = Oracle.ComputeSignaturePubKey(pubKey, rPoint, message); Console.WriteLine("Signature: {0}", BitConverter.ToString(signature).Replace("-", "")); Console.WriteLine("sG from signature: {0}", BitConverter.ToString(sGFromSig).Replace("-", "")); Console.WriteLine("sG from pubkeys : {0}", BitConverter.ToString(sGFromPubKeysAndMessage).Replace("-", "")); } }
static void Main(string[] args) { byte[] privKey = StringToByteArray(File.ReadAllText("testdata/privkey.hex").Trim()); byte[] pubKey = Oracle.PublicKeyFromPrivateKey(privKey); string[] otsKeysHex = File.ReadAllLines("testdata/one-time-signing-keys.hex"); string[] messagesHex = File.ReadAllLines("testdata/messages.hex"); string[] sigsHex = File.ReadAllLines("testdata/signatures.hex"); string[] sGsFromSigHex = File.ReadAllLines("testdata/signature-pubkeys-from-sig.hex"); string[] sGsFromMsgHex = File.ReadAllLines("testdata/signature-pubkeys-from-message.hex"); for (int i = 0; i < otsKeysHex.Length; i++) { byte[] privPoint = StringToByteArray(otsKeysHex[i]); byte[] rPoint = Oracle.PublicKeyFromPrivateKey(privPoint); byte[] message = StringToByteArray(messagesHex[i]); byte[] expectedSig = StringToByteArray(sigsHex[i]); byte[] expectedsG1 = StringToByteArray(sGsFromSigHex[i]); byte[] expectedsG2 = StringToByteArray(sGsFromMsgHex[i]); byte[] calculatedSig = Oracle.ComputeSignature(privKey, privPoint, message); byte[] calculatedsG1 = Oracle.PublicKeyFromPrivateKey(calculatedSig); byte[] calculatedsG2 = Oracle.ComputeSignaturePubKey(pubKey, rPoint, message); Debug.Assert(expectedsG1.SequenceEqual(expectedsG2), "sGs are not equal. This is an issue in the Go code that generated the testset.", string.Format("Failure in record {0}", i)); Debug.Assert(calculatedSig.SequenceEqual(expectedSig), "Signature mismatch", string.Format("Failure in record {0} - Expected {1} - Got {2}", i, ByteArrayToString(expectedSig), ByteArrayToString(calculatedSig))); Debug.Assert(calculatedsG1.SequenceEqual(expectedsG1), "sG from signature is incorrect", string.Format("Failure in record {0} - Expected {1} - Got {2}", i, ByteArrayToString(expectedsG1), ByteArrayToString(calculatedsG1))); Debug.Assert(calculatedsG2.SequenceEqual(expectedsG2), "sG from pubkeys is incorrect", string.Format("Failure in record {0} - Expected {1} - Got {2}", i, ByteArrayToString(expectedsG2), ByteArrayToString(calculatedsG2))); if (i % 100 == 0) { Console.Write("\rChecking signatures: {0}", i); } } Console.WriteLine("\rSuccesfully completed signature checking."); }