Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java
package org.bitcoin; | package org.bitcoin; | ||||
import static org.bitcoin.NativeSecp256k1Util.*; | import static org.bitcoin.NativeSecp256k1Util.*; | ||||
/** | /** | ||||
* This class holds test cases defined for testing this library. | * This class holds test cases defined for testing this library. | ||||
*/ | */ | ||||
public class NativeSecp256k1Test { | public class NativeSecp256k1Test { | ||||
private NativeSecp256k1 nativeSecp256k1; | |||||
public NativeSecp256k1Test(NativeSecp256k1 n) { | |||||
nativeSecp256k1 = n; | |||||
} | |||||
private static byte[] hexStringToByteArray(String s) { | private static byte[] hexStringToByteArray(String s) { | ||||
int len = s.length(); | int len = s.length(); | ||||
assert len % 2 == 0 : "The hex string length should be even !"; | assert len % 2 == 0 : "The hex string length should be even !"; | ||||
byte[] byteArray = new byte[len / 2]; | byte[] byteArray = new byte[len / 2]; | ||||
for (int i = 0; i < len; i += 2) { | for (int i = 0; i < len; i += 2) { | ||||
byteArray[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4) + | byteArray[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4) + | ||||
Character.digit(s.charAt(i + 1), 16)); | Character.digit(s.charAt(i + 1), 16)); | ||||
} | } | ||||
return byteArray; | return byteArray; | ||||
} | } | ||||
private static String byteArrayToHexString(byte[] byteArray) { | private static String byteArrayToHexString(byte[] byteArray) { | ||||
StringBuilder stringBuilder = new StringBuilder(byteArray.length * 2); | StringBuilder stringBuilder = new StringBuilder(byteArray.length * 2); | ||||
for(byte b: byteArray) { | for(byte b: byteArray) { | ||||
stringBuilder.append(String.format("%02X", b)); | stringBuilder.append(String.format("%02X", b)); | ||||
} | } | ||||
return stringBuilder.toString(); | return stringBuilder.toString(); | ||||
} | } | ||||
//TODO improve comments/add more tests | |||||
/** | /** | ||||
* This tests verify() for a valid signature. | * This tests verify() for a valid signature. | ||||
*/ | */ | ||||
public static void testVerifyPos() throws AssertFailException{ | public void testVerifyPos() throws AssertFailException{ | ||||
boolean result = false; | boolean result = false; | ||||
// sha256hash of "testing" | // sha256hash of "testing" | ||||
byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | ||||
byte[] sig = hexStringToByteArray("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589"); | byte[] sig = hexStringToByteArray("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589"); | ||||
byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | ||||
result = NativeSecp256k1.verify(data, sig, pub); | result = nativeSecp256k1.verify(data, sig, pub); | ||||
assertEquals(result, true, "testVerifyPos"); | assertEquals(result, true, "testVerifyPos"); | ||||
} | } | ||||
/** | /** | ||||
* This tests verify() for a non-valid signature. | * This tests verify() for a non-valid signature. | ||||
*/ | */ | ||||
public static void testVerifyNeg() throws AssertFailException{ | public void testVerifyNeg() throws AssertFailException{ | ||||
boolean result = false; | boolean result = false; | ||||
// sha256hash of "testing" | // sha256hash of "testing" | ||||
byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91"); | byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91"); | ||||
byte[] sig = hexStringToByteArray("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589"); | byte[] sig = hexStringToByteArray("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589"); | ||||
byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | ||||
result = NativeSecp256k1.verify(data, sig, pub); | result = nativeSecp256k1.verify(data, sig, pub); | ||||
assertEquals(result, false, "testVerifyNeg"); | assertEquals(result, false, "testVerifyNeg"); | ||||
} | } | ||||
/** | /** | ||||
* This tests secret key verify() for a valid secretkey. | * This tests secret key verify() for a valid secretkey. | ||||
*/ | */ | ||||
public static void testSecKeyVerifyPos() throws AssertFailException{ | public void testSecKeyVerifyPos() throws AssertFailException{ | ||||
boolean result = false; | boolean result = false; | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
result = NativeSecp256k1.secKeyVerify(sec); | result = nativeSecp256k1.secKeyVerify(sec); | ||||
assertEquals(result, true, "testSecKeyVerifyPos"); | assertEquals(result, true, "testSecKeyVerifyPos"); | ||||
} | } | ||||
/** | /** | ||||
* This tests secret key verify() for an invalid secretkey. | * This tests secret key verify() for an invalid secretkey. | ||||
*/ | */ | ||||
public static void testSecKeyVerifyNeg() throws AssertFailException{ | public void testSecKeyVerifyNeg() throws AssertFailException{ | ||||
boolean result = false; | boolean result = false; | ||||
byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | ||||
result = NativeSecp256k1.secKeyVerify(sec); | result = nativeSecp256k1.secKeyVerify(sec); | ||||
assertEquals(result, false, "testSecKeyVerifyNeg"); | assertEquals(result, false, "testSecKeyVerifyNeg"); | ||||
} | } | ||||
/** | /** | ||||
* This tests public key create() for a valid secretkey. | * This tests public key create() for a valid secretkey. | ||||
*/ | */ | ||||
public static void testPubKeyCreatePos() throws AssertFailException{ | public void testPubKeyCreatePos() throws AssertFailException{ | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
byte[] resultArr = NativeSecp256k1.computePubkey(sec); | byte[] resultArr = nativeSecp256k1.computePubkey(sec); | ||||
String pubkeyString = byteArrayToHexString(resultArr); | String pubkeyString = byteArrayToHexString(resultArr); | ||||
assertEquals(pubkeyString, "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6", "testPubKeyCreatePos"); | assertEquals(pubkeyString, "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6", "testPubKeyCreatePos"); | ||||
} | } | ||||
/** | /** | ||||
* This tests public key create() for a invalid secretkey. | * This tests public key create() for a invalid secretkey. | ||||
*/ | */ | ||||
public static void testPubKeyCreateNeg() throws AssertFailException{ | public void testPubKeyCreateNeg() throws AssertFailException{ | ||||
byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | ||||
byte[] resultArr = NativeSecp256k1.computePubkey(sec); | byte[] resultArr = nativeSecp256k1.computePubkey(sec); | ||||
String pubkeyString = byteArrayToHexString(resultArr); | String pubkeyString = byteArrayToHexString(resultArr); | ||||
assertEquals(pubkeyString, "", "testPubKeyCreateNeg"); | assertEquals(pubkeyString, "", "testPubKeyCreateNeg"); | ||||
} | } | ||||
/** | /** | ||||
* This tests sign() for a valid secretkey. | * This tests sign() for a valid secretkey. | ||||
*/ | */ | ||||
public static void testSignPos() throws AssertFailException{ | public void testSignPos() throws AssertFailException{ | ||||
// sha256hash of "testing" | // sha256hash of "testing" | ||||
byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
byte[] resultArr = NativeSecp256k1.sign(data, sec); | byte[] resultArr = nativeSecp256k1.sign(data, sec); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "3045022100F51D069AA46EDB4E2E77773FE364AA2AF6818AF733EA542CFC4D546640A58D8802204F1C442AC9F26F232451A0C3EE99F6875353FC73902C68055C19E31624F687CC", "testSignPos"); | assertEquals(sigString, "3045022100F51D069AA46EDB4E2E77773FE364AA2AF6818AF733EA542CFC4D546640A58D8802204F1C442AC9F26F232451A0C3EE99F6875353FC73902C68055C19E31624F687CC", "testSignPos"); | ||||
} | } | ||||
/** | /** | ||||
* This tests sign() for a invalid secretkey. | * This tests sign() for a invalid secretkey. | ||||
*/ | */ | ||||
public static void testSignNeg() throws AssertFailException{ | public void testSignNeg() throws AssertFailException{ | ||||
// sha256hash of "testing" | // sha256hash of "testing" | ||||
byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | byte[] data = hexStringToByteArray("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90"); | ||||
byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | byte[] sec = hexStringToByteArray("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); | ||||
byte[] resultArr = NativeSecp256k1.sign(data, sec); | byte[] resultArr = nativeSecp256k1.sign(data, sec); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "", "testSignNeg"); | assertEquals(sigString, "", "testSignNeg"); | ||||
} | } | ||||
/** | /** | ||||
* This tests private key tweak-add. | * This tests private key tweak-add. | ||||
*/ | */ | ||||
public static void testPrivKeyTweakAdd_1() throws AssertFailException { | public void testPrivKeyTweakAdd_1() throws AssertFailException { | ||||
// sha256hash of "tweak" | // sha256hash of "tweak" | ||||
byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
byte[] resultArr = NativeSecp256k1.privKeyTweakAdd(sec, data); | byte[] resultArr = nativeSecp256k1.privKeyTweakAdd(sec, data); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3", "testPrivKeyAdd_1"); | assertEquals(sigString, "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3", "testPrivKeyAdd_1"); | ||||
} | } | ||||
/** | /** | ||||
* This tests private key tweak-mul. | * This tests private key tweak-mul. | ||||
*/ | */ | ||||
public static void testPrivKeyTweakMul_1() throws AssertFailException { | public void testPrivKeyTweakMul_1() throws AssertFailException { | ||||
// sha256hash of "tweak" | // sha256hash of "tweak" | ||||
byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
byte[] resultArr = NativeSecp256k1.privKeyTweakMul(sec, data); | byte[] resultArr = nativeSecp256k1.privKeyTweakMul(sec, data); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC", "testPrivKeyMul_1"); | assertEquals(sigString, "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC", "testPrivKeyMul_1"); | ||||
} | } | ||||
/** | /** | ||||
* This tests private key tweak-add uncompressed. | * This tests private key tweak-add uncompressed. | ||||
*/ | */ | ||||
public static void testPrivKeyTweakAdd_2() throws AssertFailException { | public void testPrivKeyTweakAdd_2() throws AssertFailException { | ||||
// sha256hash of "tweak" | // sha256hash of "tweak" | ||||
byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | ||||
byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | ||||
byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd(pub ,data); | byte[] resultArr = nativeSecp256k1.pubKeyTweakAdd(pub ,data); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF", "testPrivKeyAdd_2"); | assertEquals(sigString, "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF", "testPrivKeyAdd_2"); | ||||
} | } | ||||
/** | /** | ||||
* This tests private key tweak-mul uncompressed. | * This tests private key tweak-mul uncompressed. | ||||
*/ | */ | ||||
public static void testPrivKeyTweakMul_2() throws AssertFailException { | public void testPrivKeyTweakMul_2() throws AssertFailException { | ||||
// sha256hash of "tweak" | // sha256hash of "tweak" | ||||
byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | byte[] data = hexStringToByteArray("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3"); | ||||
byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | ||||
byte[] resultArr = NativeSecp256k1.pubKeyTweakMul(pub, data); | byte[] resultArr = nativeSecp256k1.pubKeyTweakMul(pub, data); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589", "testPrivKeyMul_2"); | assertEquals(sigString, "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589", "testPrivKeyMul_2"); | ||||
} | } | ||||
/** | /** | ||||
* This tests seed randomization. | * This tests seed randomization. | ||||
*/ | */ | ||||
public static void testRandomize() throws AssertFailException { | public void testRandomize() throws AssertFailException { | ||||
// sha256hash of "random" | // sha256hash of "random" | ||||
byte[] seed = hexStringToByteArray("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11"); | byte[] seed = hexStringToByteArray("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11"); | ||||
boolean result = NativeSecp256k1.randomize(seed); | boolean result = nativeSecp256k1.randomize(seed); | ||||
assertEquals(result, true, "testRandomize"); | assertEquals(result, true, "testRandomize"); | ||||
} | } | ||||
private static class SchnorrTestVector { | private static class SchnorrTestVector { | ||||
String data; | String data; | ||||
String sig; | String sig; | ||||
String pubKey; | String pubKey; | ||||
boolean expected; | boolean expected; | ||||
String comment; | String comment; | ||||
SchnorrTestVector(String d, String s, String p, boolean e, String c) { | SchnorrTestVector(String d, String s, String p, boolean e, String c) { | ||||
data = d; | data = d; | ||||
sig = s; | sig = s; | ||||
pubKey = p; | pubKey = p; | ||||
expected = e; | expected = e; | ||||
comment = c; | comment = c; | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* This tests schnorrVerify() for a valid signature. | * This tests schnorrVerify() for a valid signature. | ||||
* It tests the following test vectors: | * It tests the following test vectors: | ||||
* https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr/test-vectors.csv | * https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr/test-vectors.csv | ||||
*/ | */ | ||||
public static void testSchnorrVerify() throws AssertFailException{ | public void testSchnorrVerify() throws AssertFailException{ | ||||
SchnorrTestVector[] tests = new SchnorrTestVector[]{ | SchnorrTestVector[] tests = new SchnorrTestVector[]{ | ||||
new SchnorrTestVector( | new SchnorrTestVector( | ||||
"0000000000000000000000000000000000000000000000000000000000000000", | "0000000000000000000000000000000000000000000000000000000000000000", | ||||
"787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF67031A98831859DC34DFFEEDDA86831842CCD0079E1F92AF177F7F22CC1DCED05", | "787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF67031A98831859DC34DFFEEDDA86831842CCD0079E1F92AF177F7F22CC1DCED05", | ||||
"0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", | "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", | ||||
true, | true, | ||||
"success" | "success" | ||||
), | ), | ||||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | public void testSchnorrVerify() throws AssertFailException{ | ||||
) | ) | ||||
}; | }; | ||||
int i = 0; | int i = 0; | ||||
for(SchnorrTestVector test : tests) { | for(SchnorrTestVector test : tests) { | ||||
boolean expected = test.expected; | boolean expected = test.expected; | ||||
byte[] data = hexStringToByteArray(test.data); | byte[] data = hexStringToByteArray(test.data); | ||||
byte[] sig = hexStringToByteArray(test.sig); | byte[] sig = hexStringToByteArray(test.sig); | ||||
byte[] pub = hexStringToByteArray(test.pubKey); | byte[] pub = hexStringToByteArray(test.pubKey); | ||||
boolean result = NativeSecp256k1.schnorrVerify(data, sig, pub); | boolean result = nativeSecp256k1.schnorrVerify(data, sig, pub); | ||||
String testMsg = String.join(" ", "testSchnorrVerify", String.valueOf(i++), String.valueOf(expected), test.comment); | String testMsg = String.join(" ", "testSchnorrVerify", String.valueOf(i++), String.valueOf(expected), test.comment); | ||||
assertEquals(result, expected, testMsg); | assertEquals(result, expected, testMsg); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* This tests signSchnorr() for a valid secretkey. | * This tests signSchnorr() for a valid secretkey. | ||||
*/ | */ | ||||
public static void testSchnorrSign() throws AssertFailException{ | public void testSchnorrSign() throws AssertFailException{ | ||||
// sha256(sha256("Very deterministic message")) | // sha256(sha256("Very deterministic message")) | ||||
byte[] data = hexStringToByteArray("5255683DA567900BFD3E786ED8836A4E7763C221BF1AC20ECE2A5171B9199E8A"); | byte[] data = hexStringToByteArray("5255683DA567900BFD3E786ED8836A4E7763C221BF1AC20ECE2A5171B9199E8A"); | ||||
byte[] sec = hexStringToByteArray("12B004FFF7F4B69EF8650E767F18F11EDE158148B425660723B9F9A66E61F747"); | byte[] sec = hexStringToByteArray("12B004FFF7F4B69EF8650E767F18F11EDE158148B425660723B9F9A66E61F747"); | ||||
byte[] resultArr = NativeSecp256k1.schnorrSign(data, sec); | byte[] resultArr = nativeSecp256k1.schnorrSign(data, sec); | ||||
String sigString = byteArrayToHexString(resultArr); | String sigString = byteArrayToHexString(resultArr); | ||||
assertEquals(sigString, "2C56731AC2F7A7E7F11518FC7722A166B02438924CA9D8B4D111347B81D0717571846DE67AD3D913A8FDF9D8F3F73161A4C48AE81CB183B214765FEB86E255CE", "testSchnorrSign"); | assertEquals(sigString, "2C56731AC2F7A7E7F11518FC7722A166B02438924CA9D8B4D111347B81D0717571846DE67AD3D913A8FDF9D8F3F73161A4C48AE81CB183B214765FEB86E255CE", "testSchnorrSign"); | ||||
} | } | ||||
public static void testCreateECDHSecret() throws AssertFailException{ | public void testCreateECDHSecret() throws AssertFailException{ | ||||
byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | byte[] sec = hexStringToByteArray("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530"); | ||||
byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | byte[] pub = hexStringToByteArray("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40"); | ||||
byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); | byte[] resultArr = nativeSecp256k1.createECDHSecret(sec, pub); | ||||
String ecdhString = byteArrayToHexString(resultArr); | String ecdhString = byteArrayToHexString(resultArr); | ||||
assertEquals(ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043", "testCreateECDHSecret"); | assertEquals(ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043", "testCreateECDHSecret"); | ||||
} | } | ||||
public static void main(String[] args) throws AssertFailException{ | private void testManualClose() throws AssertFailException { | ||||
System.out.println("\nlibsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); | try { | ||||
nativeSecp256k1.close(); | |||||
} catch (Exception e) { | |||||
throw new AssertFailException("FAIL: " + e.getMessage()); | |||||
} | |||||
assertEquals(nativeSecp256k1.isValid(), false, "testManualClose"); | |||||
} | |||||
assertEquals(Secp256k1Context.isEnabled(), true, "isEnabled"); | |||||
public static void main(String[] args) throws Exception { | |||||
// try-resource calls close() when exiting the try | |||||
try (NativeSecp256k1 n = new NativeSecp256k1()) { | |||||
NativeSecp256k1Test test = new NativeSecp256k1Test(n); | |||||
System.out.println("\nlibsecp256k1 enabled: " + n.isEnabled() + "\n"); | |||||
assertEquals(n.isEnabled(), true, "isEnabled"); | |||||
// Test verify() success/fail | // Test verify() success/fail | ||||
testVerifyPos(); | test.testVerifyPos(); | ||||
testVerifyNeg(); | test.testVerifyNeg(); | ||||
// Test secKeyVerify() success/fail | // Test secKeyVerify() success/fail | ||||
testSecKeyVerifyPos(); | test.testSecKeyVerifyPos(); | ||||
testSecKeyVerifyNeg(); | test.testSecKeyVerifyNeg(); | ||||
// Test computePubkey() success/fail | // Test computePubkey() success/fail | ||||
testPubKeyCreatePos(); | test.testPubKeyCreatePos(); | ||||
testPubKeyCreateNeg(); | test.testPubKeyCreateNeg(); | ||||
// Test sign() success/fail | // Test sign() success/fail | ||||
testSignPos(); | test.testSignPos(); | ||||
testSignNeg(); | test.testSignNeg(); | ||||
// Test privKeyTweakAdd() 1 | // Test privKeyTweakAdd() 1 | ||||
testPrivKeyTweakAdd_1(); | test.testPrivKeyTweakAdd_1(); | ||||
// Test privKeyTweakMul() 2 | // Test privKeyTweakMul() 2 | ||||
testPrivKeyTweakMul_1(); | test.testPrivKeyTweakMul_1(); | ||||
// Test privKeyTweakAdd() 3 | // Test privKeyTweakAdd() 3 | ||||
testPrivKeyTweakAdd_2(); | test.testPrivKeyTweakAdd_2(); | ||||
// Test privKeyTweakMul() 4 | // Test privKeyTweakMul() 4 | ||||
testPrivKeyTweakMul_2(); | test.testPrivKeyTweakMul_2(); | ||||
// Test randomize() | // Test randomize() | ||||
testRandomize(); | test.testRandomize(); | ||||
// Test verifySchnorr() success/fail | // Test verifySchnorr() success/fail | ||||
testSchnorrVerify(); | test.testSchnorrVerify(); | ||||
// Test schnorrSign() | // Test schnorrSign() | ||||
testSchnorrSign(); | test.testSchnorrSign(); | ||||
// Test ECDH | // Test ECDH | ||||
testCreateECDHSecret(); | test.testCreateECDHSecret(); | ||||
} | |||||
NativeSecp256k1.cleanup(); | // Test manual close | ||||
NativeSecp256k1Test test = new NativeSecp256k1Test(new NativeSecp256k1()); | |||||
test.testManualClose(); | |||||
System.out.println("All tests passed."); | System.out.println("All tests passed."); | ||||
} | } | ||||
} | } |