Bitcoin Core  0.20.99
P2P Digital Currency
NativeSecp256k1Test.java
Go to the documentation of this file.
1 package org.bitcoin;
2 
3 import com.google.common.io.BaseEncoding;
4 import java.util.Arrays;
5 import java.math.BigInteger;
6 import javax.xml.bind.DatatypeConverter;
7 import static org.bitcoin.NativeSecp256k1Util.*;
8 
12 public class NativeSecp256k1Test {
13 
14  //TODO improve comments/add more tests
18  public static void testVerifyPos() throws AssertFailException{
19  boolean result = false;
20  byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
21  byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
22  byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
23 
24  result = NativeSecp256k1.verify( data, sig, pub);
25  assertEquals( result, true , "testVerifyPos");
26  }
27 
31  public static void testVerifyNeg() throws AssertFailException{
32  boolean result = false;
33  byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing"
34  byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase());
35  byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
36 
37  result = NativeSecp256k1.verify( data, sig, pub);
38  //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
39  assertEquals( result, false , "testVerifyNeg");
40  }
41 
45  public static void testSecKeyVerifyPos() throws AssertFailException{
46  boolean result = false;
47  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
48 
49  result = NativeSecp256k1.secKeyVerify( sec );
50  //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
51  assertEquals( result, true , "testSecKeyVerifyPos");
52  }
53 
57  public static void testSecKeyVerifyNeg() throws AssertFailException{
58  boolean result = false;
59  byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
60 
61  result = NativeSecp256k1.secKeyVerify( sec );
62  //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16));
63  assertEquals( result, false , "testSecKeyVerifyNeg");
64  }
65 
69  public static void testPubKeyCreatePos() throws AssertFailException{
70  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
71 
72  byte[] resultArr = NativeSecp256k1.computePubkey( sec);
73  String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
74  assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos");
75  }
76 
80  public static void testPubKeyCreateNeg() throws AssertFailException{
81  byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
82 
83  byte[] resultArr = NativeSecp256k1.computePubkey( sec);
84  String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
85  assertEquals( pubkeyString, "" , "testPubKeyCreateNeg");
86  }
87 
91  public static void testSignPos() throws AssertFailException{
92 
93  byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
94  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
95 
96  byte[] resultArr = NativeSecp256k1.sign(data, sec);
97  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
98  assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos");
99  }
100 
104  public static void testSignNeg() throws AssertFailException{
105  byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing"
106  byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase());
107 
108  byte[] resultArr = NativeSecp256k1.sign(data, sec);
109  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
110  assertEquals( sigString, "" , "testSignNeg");
111  }
112 
116  public static void testPrivKeyTweakAdd_1() throws AssertFailException {
117  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
118  byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
119 
120  byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data );
121  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
122  assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1");
123  }
124 
128  public static void testPrivKeyTweakMul_1() throws AssertFailException {
129  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
130  byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
131 
132  byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data );
133  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
134  assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1");
135  }
136 
140  public static void testPrivKeyTweakAdd_2() throws AssertFailException {
141  byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
142  byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
143 
144  byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data );
145  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
146  assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2");
147  }
148 
152  public static void testPrivKeyTweakMul_2() throws AssertFailException {
153  byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
154  byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak"
155 
156  byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data );
157  String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
158  assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2");
159  }
160 
164  public static void testRandomize() throws AssertFailException {
165  byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random"
166  boolean result = NativeSecp256k1.randomize(seed);
167  assertEquals( result, true, "testRandomize");
168  }
169 
170  public static void testCreateECDHSecret() throws AssertFailException{
171 
172  byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase());
173  byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase());
174 
175  byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub);
176  String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);
177  assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret");
178  }
179 
180  public static void main(String[] args) throws AssertFailException{
181 
182 
183  System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n");
184 
185  assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" );
186 
187  //Test verify() success/fail
188  testVerifyPos();
189  testVerifyNeg();
190 
191  //Test secKeyVerify() success/fail
194 
195  //Test computePubkey() success/fail
198 
199  //Test sign() success/fail
200  testSignPos();
201  testSignNeg();
202 
203  //Test privKeyTweakAdd() 1
205 
206  //Test privKeyTweakMul() 2
208 
209  //Test privKeyTweakAdd() 3
211 
212  //Test privKeyTweakMul() 4
214 
215  //Test randomize()
216  testRandomize();
217 
218  //Test ECDH
220 
222 
223  System.out.println(" All tests passed." );
224 
225  }
226 }
static byte [] privKeyTweakAdd(byte[] privkey, byte[] tweak)
libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it
static void testSignNeg()
This tests sign() for a invalid secretkey.
static void testVerifyNeg()
This tests verify() for a non-valid signature.
static void testPubKeyCreatePos()
This tests public key create() for a valid secretkey.
This class holds test cases defined for testing this library.
static void testPrivKeyTweakAdd_2()
This tests private key tweak-add uncompressed.
static void main(String[] args)
static byte [] privKeyTweakMul(byte[] privkey, byte[] tweak)
libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it
static byte [] sign(byte[] data, byte[] sec)
libsecp256k1 Create an ECDSA signature.
static synchronized void cleanup()
libsecp256k1 Cleanup - This destroys the secp256k1 context object This should be called at the end of...
static void testSignPos()
This tests sign() for a valid secretkey.
static void testVerifyPos()
This tests verify() for a valid signature.
static byte [] pubKeyTweakAdd(byte[] pubkey, byte[] tweak)
libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it
static void testRandomize()
This tests seed randomization.
static byte [] computePubkey(byte[] seckey)
libsecp256k1 Compute Pubkey - computes public key from secret key
static synchronized boolean randomize(byte[] seed)
libsecp256k1 randomize - updates the context randomization
static void testPrivKeyTweakMul_2()
This tests private key tweak-mul uncompressed.
static void testPubKeyCreateNeg()
This tests public key create() for a invalid secretkey.
static void testPrivKeyTweakAdd_1()
This tests private key tweak-add.
static boolean verify(byte[] data, byte[] signature, byte[] pub)
Verifies the given secp256k1 signature in native code.
static boolean secKeyVerify(byte[] seckey)
libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid
This class holds the context reference used in native methods to handle ECDSA operations.
static void testSecKeyVerifyNeg()
This tests secret key verify() for an invalid secretkey.
static void testSecKeyVerifyPos()
This tests secret key verify() for a valid secretkey.
static byte [] pubKeyTweakMul(byte[] pubkey, byte[] tweak)
libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it
static void testPrivKeyTweakMul_1()
This tests private key tweak-mul.
static byte [] createECDHSecret(byte[] seckey, byte[] pubkey)
libsecp256k1 create ECDH secret - constant time ECDH calculation