11package org .arkecosystem .crypto .signature ;
22
3- import static org .hamcrest .CoreMatchers .startsWith ;
4- import static org .hamcrest .MatcherAssert .assertThat ;
5- import static org .hamcrest .Matchers .is ;
63import static org .junit .jupiter .api .Assertions .assertTrue ;
74
85import com .google .gson .internal .LinkedTreeMap ;
9- import java .util .Arrays ;
10- import java .util .List ;
11- import org .arkecosystem .crypto .encoding .Hex ;
126import org .arkecosystem .crypto .identities .PublicKey ;
137import org .arkecosystem .crypto .transactions .Deserializer ;
148import org .arkecosystem .crypto .transactions .FixtureLoader ;
15- import org .arkecosystem .crypto .transactions .Serializer ;
169import org .arkecosystem .crypto .transactions .types .Transaction ;
1710import org .junit .jupiter .params .ParameterizedTest ;
1811import org .junit .jupiter .params .provider .ValueSource ;
1912
2013public class FixtureSignVerificationTest {
2114
22- private final String passphrase = "my super secret passphrase" ;
2315 private final String secondPassphrase = "this is a top secret second passphrase" ;
24- private final String musigPassphrase1 =
25- "album pony urban cheap small blade cannon silent run reveal luxury glad predict excess fire beauty hollow reward solar egg exclude leaf sight degree" ;
26- private final String musigPassphrase2 =
27- "hen slogan retire boss upset blame rocket slender area arch broom bring elder few milk bounce execute page evoke once inmate pear marine deliver" ;
28- private final String musigPassphrase3 =
29- "top visa use bacon sun infant shrimp eye bridge fantasy chair sadness stable simple salad canoe raw hill target connect avoid promote spider category" ;
30-
16+
3117 @ ParameterizedTest
3218 @ ValueSource (
3319 strings = {
3420 "transactions/transfer/transfer-sign" ,
35- "transactions/transfer/transfer-with-vendor-field-sign" ,
36- // "transactions/transfer/transfer-multi-sign",
37-
3821 "transactions/vote/vote-sign" ,
3922 "transactions/vote/unvote-sign" ,
40- // "transactions/vote/vote-multi-sign",
41-
4223 "transactions/validator_registration/validator-registration-sign" ,
43- // "transactions/validator_registration/validator-registration-multi-sign",
44-
4524 "transactions/validator_resignation/validator-resignation-sign" ,
46- // "transactions/validator_resignation/validator-resignation-multi-sign",
47-
4825 "transactions/multi_payment/multi-payment-sign" ,
4926 "transactions/multi_payment/multi-payment-with-vendor-field-sign" ,
50- // "transactions/multi_payment/multi-payment-multi-sign",
51-
5227 "transactions/username_resignation/username-resignation-sign" ,
53- // "transactions/username_resignation/username-resignation-multi-sign",
54-
5528 "transactions/username_registration/username-registration-sign" ,
56- // "transactions/username_registration/username-registration-multi-sign",
57-
5829 "transactions/multi_signature_registration/multi-signature-registration-sign" ,
5930 })
6031 void checkSchnorrSignature (String file ) {
@@ -67,117 +38,10 @@ void checkSchnorrSignature(String file) {
6738 if (actual .secondSignature != null ) {
6839 checkSecondSignature (actual );
6940 }
70-
71- if (actual .signatures != null ) {
72- checkMultiSignature (actual );
73- }
74- }
75-
76- @ ParameterizedTest
77- @ ValueSource (
78- strings = {
79- "transactions/transfer/transfer-sign" ,
80- "transactions/transfer/transfer-with-vendor-field-sign" ,
81- // "transactions/transfer/transfer-multi-sign",
82-
83- "transactions/vote/vote-sign" ,
84- "transactions/vote/unvote-sign" ,
85- // "transactions/vote/vote-multi-sign",
86-
87- "transactions/validator_registration/validator-registration-sign" ,
88- // "transactions/validator_registration/validator-registration-multi-sign",
89-
90- "transactions/validator_resignation/validator-resignation-sign" ,
91- // "transactions/validator_resignation/validator-resignation-multi-sign",
92-
93- "transactions/multi_payment/multi-payment-sign" ,
94- "transactions/multi_payment/multi-payment-with-vendor-field-sign" ,
95- // "transactions/multi_payment/multi-payment-multi-sign",
96-
97- "transactions/username_resignation/username-resignation-sign" ,
98- // "transactions/username_resignation/username-resignation-multi-sign",
99-
100- "transactions/username_registration/username-registration-sign" ,
101- // "transactions/username_registration/username-registration-multi-sign",
102-
103- // "transactions/multi_signature_registration/multi-signature-registration-sign",
104- })
105- void checkSigningAgainProducesSameSignature (String file ) {
106- LinkedTreeMap <String , Object > fixture = FixtureLoader .load (file );
107-
108- Transaction actual = new Deserializer (fixture .get ("serialized" ).toString ()).deserialize ();
109-
110- // Remove the signatures from original transaction
111- Transaction withoutSignatures =
112- new Deserializer (Hex .encode (Serializer .serialize (actual , true , true , true )))
113- .deserialize ();
114-
115- // Ensure only the signatures were removed
116- assertThat (
117- fixture .get ("serialized" ).toString (),
118- startsWith (Hex .encode (Serializer .serialize (withoutSignatures ))));
119-
120- reSignUnsigned (actual , withoutSignatures );
121-
122- if (withoutSignatures .signature != null ) {
123- assertTrue (withoutSignatures .verify ());
124- }
125-
126- if (withoutSignatures .secondSignature != null ) {
127- checkSecondSignature (withoutSignatures );
128- }
129-
130- int signatureLength = 128 ;
131-
132- if (withoutSignatures .signatures != null ) {
133- checkMultiSignature (withoutSignatures );
134-
135- signatureLength = 128 + (withoutSignatures .signatures .size () * 130 );
136- }
137-
138- String serializedWithoutSignatures = Hex .encode (Serializer .serialize (withoutSignatures ));
139- String serializedFixture = fixture .get ("serialized" ).toString ();
140-
141- // Exclude the last 128 characters (signature) for final comparison
142- assertThat (
143- serializedWithoutSignatures .substring (
144- 0 , serializedWithoutSignatures .length () - signatureLength ),
145- is (serializedFixture .substring (0 , serializedFixture .length () - signatureLength )));
146- }
147-
148- private void reSignUnsigned (Transaction actual , Transaction withoutSignatures ) {
149- if (actual .signatures != null ) {
150- int i = 0 ;
151- for (String passphrase :
152- Arrays .asList (musigPassphrase1 , musigPassphrase2 , musigPassphrase3 )) {
153- withoutSignatures .multiSign (passphrase , i ++);
154- }
155- if (actual .signature != null ) {
156- withoutSignatures .sign (musigPassphrase1 );
157- }
158- if (actual .secondSignature != null ) {
159- withoutSignatures .secondSign (secondPassphrase );
160- }
161- } else if (actual .secondSignature != null ) {
162- withoutSignatures .sign (passphrase );
163- withoutSignatures .secondSign (secondPassphrase );
164- } else if (actual .signature != null ) {
165- withoutSignatures .sign (passphrase );
166- }
16741 }
16842
16943 private void checkSecondSignature (Transaction actual ) {
17044 String secondPublicKey = PublicKey .fromPassphrase (secondPassphrase );
17145 assertTrue (actual .secondVerify (secondPublicKey ));
17246 }
173-
174- private void checkMultiSignature (Transaction actual ) {
175- String key1 = PublicKey .fromPassphrase (musigPassphrase1 );
176- String key2 = PublicKey .fromPassphrase (musigPassphrase2 );
177- String key3 = PublicKey .fromPassphrase (musigPassphrase3 );
178-
179- List <String > publicKeys = Arrays .asList (key1 , key2 , key3 );
180-
181- assertTrue (actual .multiVerify (2 , publicKeys ));
182- }
18347}
0 commit comments