8225239 Merge #433: Make the libcrypto detection fail the newer API. 12de863 Make the libcrypto detection fail the newer API. 2928420 Merge #427: Remove Schnorr from travis as well 8eecc4a Remove Schnorr from travis as well a8abae7 Merge #310: Add exhaustive test for group functions on a low-order subgroup b4ceedf Add exhaustive test for verification 83836a9 Add exhaustive tests for group arithmetic, signing, and ecmult on a small group 20b8877 Add exhaustive test for group functions on a low-order subgroup 80773a6 Merge #425: Remove Schnorr experiment e06e878 Remove Schnorr experiment 04c8ef3 Merge #407: Modify parameter order of internal functions to match API parameter order 6e06696 Merge #411: Remove guarantees about memcmp-ability 40c8d7e Merge #421: Update scalar_4x64_impl.h a922365 Merge #422: Restructure nonce clearing 3769783 Restructure nonce clearing 0f9e69d Restructure nonce clearing 9d67afa Update scalar_4x64_impl.h 7d15cd7 Merge #413: fix auto-enabled static precompuatation 00c5d2e fix auto-enabled static precompuatation 91219a1 Remove guarantees about memcmp-ability 7a49cac Merge #410: Add string.h include to ecmult_impl 0bbd5d4 Add string.h include to ecmult_impl 353c1bf Fix secp256k1_ge_set_table_gej_var parameter order 541b783 Fix secp256k1_ge_set_all_gej_var parameter order 7d893f4 Fix secp256k1_fe_inv_all_var parameter order c5b32e1 Merge #405: Make secp256k1_fe_sqrt constant time 926836a Make secp256k1_fe_sqrt constant time e2a8e92 Merge #404: Replace 3M + 4S doubling formula with 2M + 5S one 8ec49d8 Add note about 2M + 5S doubling formula 5a91bd7 Merge #400: A couple minor cleanups ac01378 build: add -DSECP256K1_BUILD to benchmark_internal build flags a6c6f99 Remove a bunch of unused stdlib #includes 65285a6 Merge #403: configure: add flag to disable OpenSSL tests a9b2a5d configure: add flag to disable OpenSSL tests b340123 Merge #402: Add support for testing quadratic residues e6e9805 Add function for testing quadratic residue field/group elements. efd953a Add Jacobi symbol test via GMP fa36a0d Merge #401: ecmult_const: unify endomorphism and non-endomorphism skew cases c6191fd ecmult_const: unify endomorphism and non-endomorphism skew cases 0b3e618 Merge #378: .gitignore build-aux cleanup 6042217 Merge #384: JNI: align shared files copyright/comments to bitcoinj's 24ad20f Merge #399: build: verify that the native compiler works for static precomp b3be852 Merge #398: Test whether ECDH and Schnorr are enabled for JNI aa0b1fd build: verify that the native compiler works for static precomp eee808d Test whether ECDH and Schnorr are enabled for JNI 7b0fb18 Merge #366: ARM assembly implementation of field_10x26 inner (rebase of #173) 001f176 ARM assembly implementation of field_10x26 inner 0172be9 Merge #397: Small fixes for sha256 3f8b78e Fix undefs in hash_impl.h 2ab4695 Fix state size in sha256 struct 6875b01 Merge #386: Add some missing `VERIFY_CHECK(ctx != NULL)` 2c52b5d Merge #389: Cast pointers through uintptr_t under JNI 43097a4 Merge #390: Update bitcoin-core GitHub links 31c9c12 Merge #391: JNI: Only call ecdsa_verify if its inputs parsed correctly 1cb2302 Merge #392: Add testcase which hits additional branch in secp256k1_scalar_sqr d2ee340 Merge #388: bench_ecdh: fix call to secp256k1_context_create 093a497 Add testcase which hits additional branch in secp256k1_scalar_sqr a40c701 JNI: Only call ecdsa_verify if its inputs parsed correctly faa2a11 Update bitcoin-core GitHub links 47b9e78 Cast pointers through uintptr_t under JNI f36f9c6 bench_ecdh: fix call to secp256k1_context_create bcc4881 Add some missing `VERIFY_CHECK(ctx != NULL)` for functions that use `ARG_CHECK` 6ceea2c align shared files copyright/comments to bitcoinj's 70141a8 Update .gitignore 7b549b1 Merge #373: build: fix x86_64 asm detection for some compilers bc7c93c Merge #374: Add note about y=0 being possible on one of the sextic twists e457018 Merge #364: JNI rebased 86e2d07 JNI library: cleanup, removed unimplemented code 3093576a JNI library bd2895f Merge pull request #371 e72e93a Add note about y=0 being possible on one of the sextic twists 3f8fdfb build: fix x86_64 asm detection for some compilers e5a9047 [Trivial] Remove double semicolons c18b869 Merge pull request #360 3026daa Merge pull request #302 03d4611 Add sage verification script for the group laws a965937 Merge pull request #361 83221ec Add experimental features to configure 5d4c5a3 Prevent damage_array in the signature test from going out of bounds. 419bf7f Merge pull request #356 03d84a4 Benchmark against OpenSSL verification git-subtree-dir: src/secp256k1 git-subtree-split: 8225239f490f79842a5a3b82ad6cc8aa11d5208e
227 lines
11 KiB
Java
227 lines
11 KiB
Java
package org.bitcoin;
|
|
|
|
import com.google.common.io.BaseEncoding;
|
|
import java.util.Arrays;
|
|
import java.math.BigInteger;
|
|
import javax.xml.bind.DatatypeConverter;
|
|
import static org.bitcoin.NativeSecp256k1Util.*;
|
|
|
|
/**
|
|
* This class holds test cases defined for testing this library.
|
|
*/
|
|
public class NativeSecp256k1Test {
|
|
|
|
//TODO improve comments/add more tests
|
|
/**
|
|
* This tests verify() for a valid signature
|
|
*/
|
|
public static void testVerifyPos() throws AssertFailException{
|
|
boolean result = false;
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
|
|
byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
|
|
byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
|
|
|
|
result = NativeSecp256k1.verify( data, sig, pub);
|
|
assertEquals( result, true , "testVerifyPos");
|
|
}
|
|
|
|
/**
|
|
* This tests verify() for a non-valid signature
|
|
*/
|
|
public static void testVerifyNeg() throws AssertFailException{
|
|
boolean result = false;
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing"
|
|
byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
|
|
byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
|
|
|
|
result = NativeSecp256k1.verify( data, sig, pub);
|
|
//System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
|
|
assertEquals( result, false , "testVerifyNeg");
|
|
}
|
|
|
|
/**
|
|
* This tests secret key verify() for a valid secretkey
|
|
*/
|
|
public static void testSecKeyVerifyPos() throws AssertFailException{
|
|
boolean result = false;
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
|
|
result = NativeSecp256k1.secKeyVerify( sec );
|
|
//System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
|
|
assertEquals( result, true , "testSecKeyVerifyPos");
|
|
}
|
|
|
|
/**
|
|
* This tests secret key verify() for a invalid secretkey
|
|
*/
|
|
public static void testSecKeyVerifyNeg() throws AssertFailException{
|
|
boolean result = false;
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
|
|
|
|
result = NativeSecp256k1.secKeyVerify( sec );
|
|
//System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
|
|
assertEquals( result, false , "testSecKeyVerifyNeg");
|
|
}
|
|
|
|
/**
|
|
* This tests public key create() for a valid secretkey
|
|
*/
|
|
public static void testPubKeyCreatePos() throws AssertFailException{
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
|
|
byte[] resultArr = NativeSecp256k1.computePubkey( sec);
|
|
String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos");
|
|
}
|
|
|
|
/**
|
|
* This tests public key create() for a invalid secretkey
|
|
*/
|
|
public static void testPubKeyCreateNeg() throws AssertFailException{
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
|
|
|
|
byte[] resultArr = NativeSecp256k1.computePubkey( sec);
|
|
String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( pubkeyString, "" , "testPubKeyCreateNeg");
|
|
}
|
|
|
|
/**
|
|
* This tests sign() for a valid secretkey
|
|
*/
|
|
public static void testSignPos() throws AssertFailException{
|
|
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
|
|
byte[] resultArr = NativeSecp256k1.sign(data, sec);
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos");
|
|
}
|
|
|
|
/**
|
|
* This tests sign() for a invalid secretkey
|
|
*/
|
|
public static void testSignNeg() throws AssertFailException{
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
|
|
|
|
byte[] resultArr = NativeSecp256k1.sign(data, sec);
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString, "" , "testSignNeg");
|
|
}
|
|
|
|
/**
|
|
* This tests private key tweak-add
|
|
*/
|
|
public static void testPrivKeyTweakAdd_1() throws AssertFailException {
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
|
|
|
|
byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data );
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1");
|
|
}
|
|
|
|
/**
|
|
* This tests private key tweak-mul
|
|
*/
|
|
public static void testPrivKeyTweakMul_1() throws AssertFailException {
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
|
|
|
|
byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data );
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1");
|
|
}
|
|
|
|
/**
|
|
* This tests private key tweak-add uncompressed
|
|
*/
|
|
public static void testPrivKeyTweakAdd_2() throws AssertFailException {
|
|
byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
|
|
|
|
byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data );
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2");
|
|
}
|
|
|
|
/**
|
|
* This tests private key tweak-mul uncompressed
|
|
*/
|
|
public static void testPrivKeyTweakMul_2() throws AssertFailException {
|
|
byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
|
|
byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
|
|
|
|
byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data );
|
|
String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2");
|
|
}
|
|
|
|
/**
|
|
* This tests seed randomization
|
|
*/
|
|
public static void testRandomize() throws AssertFailException {
|
|
byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random"
|
|
boolean result = NativeSecp256k1.randomize(seed);
|
|
assertEquals( result, true, "testRandomize");
|
|
}
|
|
|
|
public static void testCreateECDHSecret() throws AssertFailException{
|
|
|
|
byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
|
|
byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
|
|
|
|
byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub);
|
|
String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
|
|
assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret");
|
|
}
|
|
|
|
public static void main(String[] args) throws AssertFailException{
|
|
|
|
|
|
System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n");
|
|
|
|
assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" );
|
|
|
|
//Test verify() success/fail
|
|
testVerifyPos();
|
|
testVerifyNeg();
|
|
|
|
//Test secKeyVerify() success/fail
|
|
testSecKeyVerifyPos();
|
|
testSecKeyVerifyNeg();
|
|
|
|
//Test computePubkey() success/fail
|
|
testPubKeyCreatePos();
|
|
testPubKeyCreateNeg();
|
|
|
|
//Test sign() success/fail
|
|
testSignPos();
|
|
testSignNeg();
|
|
|
|
//Test privKeyTweakAdd() 1
|
|
testPrivKeyTweakAdd_1();
|
|
|
|
//Test privKeyTweakMul() 2
|
|
testPrivKeyTweakMul_1();
|
|
|
|
//Test privKeyTweakAdd() 3
|
|
testPrivKeyTweakAdd_2();
|
|
|
|
//Test privKeyTweakMul() 4
|
|
testPrivKeyTweakMul_2();
|
|
|
|
//Test randomize()
|
|
testRandomize();
|
|
|
|
//Test ECDH
|
|
testCreateECDHSecret();
|
|
|
|
NativeSecp256k1.cleanup();
|
|
|
|
System.out.println(" All tests passed." );
|
|
|
|
}
|
|
}
|