rippled
Loading...
Searching...
No Matches
KeyGeneration_test.cpp
1#include <test/jtx/TestSuite.h>
2
3#include <xrpld/rpc/detail/RPCHelpers.h>
4#include <xrpld/rpc/handlers/WalletPropose.h>
5
6#include <xrpl/json/json_value.h>
7#include <xrpl/json/json_writer.h>
8#include <xrpl/protocol/ErrorCodes.h>
9#include <xrpl/protocol/jss.h>
10
11namespace xrpl {
12
13namespace RPC {
14
16{
17 char const* account_id;
18 char const* master_key;
19 char const* master_seed;
20 char const* master_seed_hex;
21 char const* public_key;
22 char const* public_key_hex;
23 char const* secret_key_hex;
24 char const* passphrase;
25 char const* passphrase_warning;
26};
27
28namespace common {
29static char const* passphrase = "REINDEER FLOTILLA";
30static char const* master_key = "SCAT BERN ISLE FOR ROIL BUS SOAK AQUA FREE FOR DRAM BRIG";
31static char const* master_seed = "snMwVWs2hZzfDUF3p2tHZ3EgmyhFs";
32static char const* master_seed_hex = "BE6A670A19B209E112146D0A7ED2AAD7";
33} // namespace common
34
36 "r4Vtj2jrfmTVZGfSP3gH9hQPMqFPQFin8f",
40 "aBQxK2YFNqzmAaXNczYcjqDjfiKkLsJUizsr1UBf44RCF8FHdrmX",
41 "038AAE247B2344B1837FBED8F57389C8C11774510A3F7D784F2A09F0CB6843236C",
42 "1949ECD889EA71324BC7A30C8E81F4E93CB73EE19D59E9082111E78CC3DDABC2",
44 "This wallet was generated using a user-supplied "
45 "passphrase that has low entropy and is vulnerable "
46 "to brute-force attacks.",
47};
48
50 "r4qV6xTXerqaZav3MJfSY79ynmc1BSBev1",
54 "aKEQmgLMyZPMruJFejUuedp169LgW6DbJt1rej1DJ5hWUMH4pHJ7",
55 "ED54C3F5BEDA8BD588B203D23A27398FAD9D20F88A974007D6994659CD7273FE1D",
56 "77AAED2698D56D6676323629160F4EEF21CFD9EE3D0745CC78FA291461F98278",
58 "This wallet was generated using a user-supplied "
59 "passphrase that has low entropy and is vulnerable "
60 "to brute-force attacks.",
61};
62
64 "rBcvXmNb7KPkNdMkpckdWPpbvkWgcV3nir",
65 "TED AVON CAVE HOUR BRAG JEFF RIFT NEAL TOLD FAT SEW SAN",
66 "shKdhWka8hS7Es3bpctCZXBiAwfUN",
67 "74BA8389B44F98CF41E795CD91F9C93F",
68 "aBRL2sqVuzrsM6zikPB4v8UBHGn1aKkrsxhYEffhcQxB2LKyywE5",
69 "03BD334FB9E06C58D69603E9922686528B18A754BC2F2E1ADA095FFE67DE952C64",
70 "84262FB16AA25BE407174C7EDAB531220C30FA4D8A28AA9D564673FB3D34502C",
71 "A4yKIRGdzrw0YQ$2%TFKYG9HP*&ok^!sy7E@RwICs",
72 "This wallet was generated using a user-supplied "
73 "passphrase. It may be vulnerable to brute-force "
74 "attacks.",
75};
76
78{
79public:
80 void
82 {
83 Json::Value params;
84 if (keyType)
85 params[jss::key_type] = *keyType;
86 Json::Value result = walletPropose(params);
87
88 BEAST_EXPECT(!contains_error(result));
89 BEAST_EXPECT(result.isMember(jss::account_id));
90 BEAST_EXPECT(result.isMember(jss::master_seed));
91 BEAST_EXPECT(result.isMember(jss::master_seed_hex));
92 BEAST_EXPECT(result.isMember(jss::public_key));
93 BEAST_EXPECT(result.isMember(jss::public_key_hex));
94 BEAST_EXPECT(result.isMember(jss::key_type));
95
96 expectEquals(result[jss::key_type], params.isMember(jss::key_type) ? params[jss::key_type] : "secp256k1");
97 BEAST_EXPECT(!result.isMember(jss::warning));
98
99 std::string seed = result[jss::master_seed].asString();
100
101 result = walletPropose(params);
102
103 // We asked for two random seeds, so they shouldn't match.
104 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
105 }
106
108 testSecretWallet(Json::Value const& params, key_strings const& s)
109 {
110 Json::Value result = walletPropose(params);
111
112 BEAST_EXPECT(!contains_error(result));
113 expectEquals(result[jss::account_id], s.account_id);
114 expectEquals(result[jss::master_seed], s.master_seed);
115 expectEquals(result[jss::master_seed_hex], s.master_seed_hex);
116 expectEquals(result[jss::public_key], s.public_key);
117 expectEquals(result[jss::public_key_hex], s.public_key_hex);
118 expectEquals(result[jss::key_type], params.isMember(jss::key_type) ? params[jss::key_type] : "secp256k1");
119 return result;
120 }
121
122 void
123 testSeed(std::optional<std::string> const& keyType, key_strings const& strings)
124 {
125 testcase("seed");
126
127 Json::Value params;
128 if (keyType)
129 params[jss::key_type] = *keyType;
130 params[jss::seed] = strings.master_seed;
131
132 auto const wallet = testSecretWallet(params, strings);
133 BEAST_EXPECT(!wallet.isMember(jss::warning));
134 }
135
136 void
137 testSeedHex(std::optional<std::string> const& keyType, key_strings const& strings)
138 {
139 testcase("seed_hex");
140
141 Json::Value params;
142 if (keyType)
143 params[jss::key_type] = *keyType;
144 params[jss::seed_hex] = strings.master_seed_hex;
145
146 auto const wallet = testSecretWallet(params, strings);
147 BEAST_EXPECT(!wallet.isMember(jss::warning));
148 }
149
150 void
151 testLegacyPassphrase(char const* value, std::optional<std::string> const& keyType, key_strings const& strings)
152 {
153 Json::Value params;
154 if (keyType)
155 params[jss::key_type] = *keyType;
156 params[jss::passphrase] = value;
157
158 auto const wallet = testSecretWallet(params, strings);
159 if (value == strings.passphrase)
160 BEAST_EXPECT(wallet[jss::warning] == strings.passphrase_warning);
161 else
162 BEAST_EXPECT(!wallet.isMember(jss::warning));
163 }
164
165 void
167 {
168 testcase("passphrase");
169
170 testLegacyPassphrase(strings.passphrase, keyType, strings);
171 testLegacyPassphrase(strings.master_key, keyType, strings);
172 testLegacyPassphrase(strings.master_seed, keyType, strings);
173 testLegacyPassphrase(strings.master_seed_hex, keyType, strings);
174 }
175
176 void
177 testKeyType(std::optional<std::string> const& keyType, key_strings const& strings)
178 {
179 testcase(keyType ? *keyType : "no key_type");
180
181 testRandomWallet(keyType);
182 testSeed(keyType, strings);
183 testSeedHex(keyType, strings);
184 testLegacyPassphrase(keyType, strings);
185
186 Json::Value params;
187 if (keyType)
188 params[jss::key_type] = *keyType;
189 params[jss::seed] = strings.master_seed;
190 params[jss::seed_hex] = strings.master_seed_hex;
191
192 // Secret fields are mutually exclusive.
193 BEAST_EXPECT(contains_error(walletPropose(params)));
194 }
195
196 void
198 {
199 testcase("Bad inputs");
200
201 // Passing non-strings where strings are required
202 {
203 Json::Value params;
204 params[jss::key_type] = "secp256k1";
205 params[jss::passphrase] = 20160506;
206 auto result = walletPropose(params);
207 BEAST_EXPECT(contains_error(result));
208 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'passphrase', not string.");
209 }
210
211 {
212 Json::Value params;
213 params[jss::key_type] = "secp256k1";
214 params[jss::seed] = Json::objectValue;
215 auto result = walletPropose(params);
216 BEAST_EXPECT(contains_error(result));
217 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'seed', not string.");
218 }
219
220 {
221 Json::Value params;
222 params[jss::key_type] = "ed25519";
223 params[jss::seed_hex] = Json::arrayValue;
224 auto result = walletPropose(params);
225 BEAST_EXPECT(contains_error(result));
226 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'seed_hex', not string.");
227 }
228
229 // Specifying multiple items at once
230 {
231 Json::Value params;
232 params[jss::key_type] = "secp256k1";
233 params[jss::passphrase] = common::master_key;
234 params[jss::seed_hex] = common::master_seed_hex;
235 params[jss::seed] = common::master_seed;
236 auto result = walletPropose(params);
237 BEAST_EXPECT(contains_error(result));
238 BEAST_EXPECT(
239 result[jss::error_message] ==
240 "Exactly one of the following must be specified: passphrase, "
241 "seed or seed_hex");
242 }
243
244 // Specifying bad key types:
245 {
246 Json::Value params;
247 params[jss::key_type] = "prime256v1";
248 params[jss::passphrase] = common::master_key;
249 auto result = walletPropose(params);
250 BEAST_EXPECT(contains_error(result));
251 BEAST_EXPECT(result[jss::error_message] == "Invalid parameters.");
252 }
253
254 {
255 Json::Value params;
256 params[jss::key_type] = Json::objectValue;
257 params[jss::seed_hex] = common::master_seed_hex;
258 auto result = walletPropose(params);
259 BEAST_EXPECT(contains_error(result));
260 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'key_type', not string.");
261 }
262
263 {
264 Json::Value params;
265 params[jss::key_type] = Json::arrayValue;
266 params[jss::seed] = common::master_seed;
267 auto result = walletPropose(params);
268 BEAST_EXPECT(contains_error(result));
269 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'key_type', not string.");
270 }
271 }
272
273 void
275 {
276 testcase("keypairForSignature - " + (keyType ? *keyType : "no key_type"));
277
278 auto const publicKey = parseBase58<PublicKey>(TokenType::AccountPublic, strings.public_key);
279 BEAST_EXPECT(publicKey);
280
281 if (!keyType)
282 {
283 {
284 Json::Value params;
285 Json::Value error;
286 params[jss::secret] = strings.master_seed;
287
288 auto ret = keypairForSignature(params, error);
289 BEAST_EXPECT(!contains_error(error));
290 if (BEAST_EXPECT(ret))
291 {
292 BEAST_EXPECT(ret->first.size() != 0);
293 BEAST_EXPECT(ret->first == publicKey);
294 }
295 }
296
297 {
298 Json::Value params;
299 Json::Value error;
300 params[jss::secret] = strings.master_seed_hex;
301
302 auto ret = keypairForSignature(params, error);
303 BEAST_EXPECT(!contains_error(error));
304 if (BEAST_EXPECT(ret))
305 {
306 BEAST_EXPECT(ret->first.size() != 0);
307 BEAST_EXPECT(ret->first == publicKey);
308 }
309 }
310
311 {
312 Json::Value params;
313 Json::Value error;
314 params[jss::secret] = strings.master_key;
315
316 auto ret = keypairForSignature(params, error);
317 BEAST_EXPECT(!contains_error(error));
318 if (BEAST_EXPECT(ret))
319 {
320 BEAST_EXPECT(ret->first.size() != 0);
321 BEAST_EXPECT(ret->first == publicKey);
322 }
323 }
324
325 keyType.emplace("secp256k1");
326 }
327
328 {
329 Json::Value params;
330 Json::Value error;
331
332 params[jss::key_type] = *keyType;
333 params[jss::seed] = strings.master_seed;
334
335 auto ret = keypairForSignature(params, error);
336 BEAST_EXPECT(!contains_error(error));
337 if (BEAST_EXPECT(ret))
338 {
339 BEAST_EXPECT(ret->first.size() != 0);
340 BEAST_EXPECT(ret->first == publicKey);
341 }
342 }
343
344 {
345 Json::Value params;
346 Json::Value error;
347
348 params[jss::key_type] = *keyType;
349 params[jss::seed_hex] = strings.master_seed_hex;
350
351 auto ret = keypairForSignature(params, error);
352 BEAST_EXPECT(!contains_error(error));
353 if (BEAST_EXPECT(ret))
354 {
355 BEAST_EXPECT(ret->first.size() != 0);
356 BEAST_EXPECT(ret->first == publicKey);
357 }
358 }
359
360 {
361 Json::Value params;
362 Json::Value error;
363
364 params[jss::key_type] = *keyType;
365 params[jss::passphrase] = strings.master_key;
366
367 auto ret = keypairForSignature(params, error);
368 BEAST_EXPECT(!contains_error(error));
369 if (BEAST_EXPECT(ret))
370 {
371 BEAST_EXPECT(ret->first.size() != 0);
372 BEAST_EXPECT(ret->first == publicKey);
373 }
374 }
375 }
376
377 void
379 {
380 // Specify invalid "secret"
381 {
382 Json::Value params;
383 Json::Value error;
384 params[jss::secret] = 314159265;
385 auto ret = keypairForSignature(params, error);
386 BEAST_EXPECT(contains_error(error));
387 BEAST_EXPECT(!ret);
388 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
389 }
390
391 {
392 Json::Value params;
393 Json::Value error;
394 params[jss::secret] = Json::arrayValue;
395 params[jss::secret].append("array:0");
396
397 auto ret = keypairForSignature(params, error);
398 BEAST_EXPECT(contains_error(error));
399 BEAST_EXPECT(!ret);
400 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
401 }
402
403 {
404 Json::Value params;
405 Json::Value error;
406 params[jss::secret] = Json::objectValue;
407 params[jss::secret]["string"] = "string";
408 params[jss::secret]["number"] = 702;
409
410 auto ret = keypairForSignature(params, error);
411 BEAST_EXPECT(contains_error(error));
412 BEAST_EXPECT(!ret);
413 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
414 }
415
416 // Specify "secret" and "key_type"
417 {
418 Json::Value params;
419 Json::Value error;
420 params[jss::key_type] = "ed25519";
421 params[jss::secret] = common::master_seed;
422
423 auto ret = keypairForSignature(params, error);
424 BEAST_EXPECT(contains_error(error));
425 BEAST_EXPECT(!ret);
426 BEAST_EXPECT(error[jss::error_message] == "The secret field is not allowed if key_type is used.");
427 }
428
429 // Specify unknown or bad "key_type"
430 {
431 Json::Value params;
432 Json::Value error;
433 params[jss::key_type] = "prime256v1";
434 params[jss::passphrase] = common::master_key;
435
436 auto ret = keypairForSignature(params, error);
437 BEAST_EXPECT(contains_error(error));
438 BEAST_EXPECT(!ret);
439 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'key_type'.");
440 }
441
442 {
443 Json::Value params;
444 Json::Value error;
445 params[jss::key_type] = Json::objectValue;
446 params[jss::seed_hex] = common::master_seed_hex;
447
448 auto ret = keypairForSignature(params, error);
449 BEAST_EXPECT(contains_error(error));
450 BEAST_EXPECT(!ret);
451 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'key_type', not string.");
452 }
453
454 {
455 Json::Value params;
456 Json::Value error;
457 params[jss::key_type] = Json::arrayValue;
458 params[jss::seed] = common::master_seed;
459
460 auto ret = keypairForSignature(params, error);
461 BEAST_EXPECT(contains_error(error));
462 BEAST_EXPECT(!ret);
463 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'key_type', not string.");
464 }
465
466 // Specify non-string passphrase
467 { // not a passphrase: number
468 Json::Value params;
469 Json::Value error;
470 params[jss::key_type] = "secp256k1";
471 params[jss::passphrase] = 1234567890;
472
473 auto ret = keypairForSignature(params, error);
474 BEAST_EXPECT(contains_error(error));
475 BEAST_EXPECT(!ret);
476 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
477 }
478
479 { // not a passphrase: object
480 Json::Value params;
481 Json::Value error;
482 params[jss::key_type] = "secp256k1";
483 params[jss::passphrase] = Json::objectValue;
484
485 auto ret = keypairForSignature(params, error);
486 BEAST_EXPECT(contains_error(error));
487 BEAST_EXPECT(!ret);
488 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
489 }
490
491 { // not a passphrase: array
492 Json::Value params;
493 Json::Value error;
494 params[jss::key_type] = "secp256k1";
495 params[jss::passphrase] = Json::arrayValue;
496
497 auto ret = keypairForSignature(params, error);
498 BEAST_EXPECT(contains_error(error));
499 BEAST_EXPECT(!ret);
500 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
501 }
502
503 { // not a passphrase: empty string
504 Json::Value params;
505 Json::Value error;
506 params[jss::key_type] = "secp256k1";
507 params[jss::passphrase] = "";
508
509 auto ret = keypairForSignature(params, error);
510 BEAST_EXPECT(contains_error(error));
511 BEAST_EXPECT(!ret);
512 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
513 }
514
515 // Specify non-string or invalid seed
516 { // not a seed: number
517 Json::Value params;
518 Json::Value error;
519 params[jss::key_type] = "secp256k1";
520 params[jss::seed] = 443556;
521
522 auto ret = keypairForSignature(params, error);
523 BEAST_EXPECT(contains_error(error));
524 BEAST_EXPECT(!ret);
525 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
526 }
527
528 { // not a string: object
529 Json::Value params;
530 Json::Value error;
531 params[jss::key_type] = "secp256k1";
532 params[jss::seed] = Json::objectValue;
533
534 auto ret = keypairForSignature(params, error);
535 BEAST_EXPECT(contains_error(error));
536 BEAST_EXPECT(!ret);
537 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
538 }
539
540 { // not a string: array
541 Json::Value params;
542 Json::Value error;
543 params[jss::key_type] = "secp256k1";
544 params[jss::seed] = Json::arrayValue;
545
546 auto ret = keypairForSignature(params, error);
547 BEAST_EXPECT(contains_error(error));
548 BEAST_EXPECT(!ret);
549 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
550 }
551
552 { // not a seed: empty
553 Json::Value params;
554 Json::Value error;
555 params[jss::key_type] = "secp256k1";
556 params[jss::seed] = "";
557
558 auto ret = keypairForSignature(params, error);
559 BEAST_EXPECT(contains_error(error));
560 BEAST_EXPECT(!ret);
561 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
562 }
563
564 { // not a seed: invalid characters
565 Json::Value params;
566 Json::Value error;
567 params[jss::key_type] = "secp256k1";
568 params[jss::seed] = "s M V s h z D F p t Z E m h s";
569
570 auto ret = keypairForSignature(params, error);
571 BEAST_EXPECT(contains_error(error));
572 BEAST_EXPECT(!ret);
573 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
574 }
575
576 { // not a seed: random string
577 Json::Value params;
578 Json::Value error;
579 params[jss::key_type] = "secp256k1";
580 params[jss::seed] = "pnnjkbnobnml43679nbvjdsklnbjs";
581
582 auto ret = keypairForSignature(params, error);
583 BEAST_EXPECT(contains_error(error));
584 BEAST_EXPECT(!ret);
585 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
586 }
587
588 // Specify non-string or invalid seed_hex
589 { // not a string: number
590 Json::Value params;
591 Json::Value error;
592 params[jss::key_type] = "secp256k1";
593 params[jss::seed_hex] = 443556;
594
595 auto ret = keypairForSignature(params, error);
596 BEAST_EXPECT(contains_error(error));
597 BEAST_EXPECT(!ret);
598 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
599 }
600
601 { // not a string: object
602 Json::Value params;
603 Json::Value error;
604 params[jss::key_type] = "secp256k1";
605 params[jss::seed_hex] = Json::objectValue;
606
607 auto ret = keypairForSignature(params, error);
608 BEAST_EXPECT(contains_error(error));
609 BEAST_EXPECT(!ret);
610 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
611 }
612
613 { // not a string: array
614 Json::Value params;
615 Json::Value error;
616 params[jss::key_type] = "secp256k1";
617 params[jss::seed_hex] = Json::arrayValue;
618
619 auto ret = keypairForSignature(params, error);
620 BEAST_EXPECT(contains_error(error));
621 BEAST_EXPECT(!ret);
622 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
623 }
624
625 { // empty
626 Json::Value params;
627 Json::Value error;
628 params[jss::key_type] = "secp256k1";
629 params[jss::seed_hex] = "";
630
631 auto ret = keypairForSignature(params, error);
632 BEAST_EXPECT(contains_error(error));
633 BEAST_EXPECT(!ret);
634 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
635 }
636
637 { // short
638 Json::Value params;
639 Json::Value error;
640 params[jss::key_type] = "secp256k1";
641 params[jss::seed_hex] = "A670A19B";
642
643 auto ret = keypairForSignature(params, error);
644 BEAST_EXPECT(contains_error(error));
645 BEAST_EXPECT(!ret);
646 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
647 }
648
649 { // not hex
650 Json::Value params;
651 Json::Value error;
652 params[jss::key_type] = "secp256k1";
653 params[jss::seed_hex] = common::passphrase;
654
655 auto ret = keypairForSignature(params, error);
656 BEAST_EXPECT(contains_error(error));
657 BEAST_EXPECT(!ret);
658 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
659 }
660
661 { // overlong
662 Json::Value params;
663 Json::Value error;
664 params[jss::key_type] = "secp256k1";
665 params[jss::seed_hex] = "BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
666
667 auto ret = keypairForSignature(params, error);
668 BEAST_EXPECT(contains_error(error));
669 BEAST_EXPECT(!ret);
670 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
671 }
672 }
673
674 void
676 {
677 testcase("ripple-lib encoded Ed25519 keys");
678
679 auto test = [this](char const* seed, char const* addr) {
680 {
681 Json::Value params;
682 Json::Value error;
683
684 params[jss::passphrase] = seed;
685
686 auto ret = keypairForSignature(params, error);
687
688 BEAST_EXPECT(!contains_error(error));
689 if (BEAST_EXPECT(ret))
690 {
691 BEAST_EXPECT(ret->first.size() != 0);
692 BEAST_EXPECT(toBase58(calcAccountID(ret->first)) == addr);
693 }
694 }
695
696 {
697 Json::Value params;
698 Json::Value error;
699
700 params[jss::key_type] = "secp256k1";
701 params[jss::passphrase] = seed;
702
703 auto ret = keypairForSignature(params, error);
704
705 BEAST_EXPECT(contains_error(error));
706 BEAST_EXPECT(error[jss::error_message] == "Specified seed is for an Ed25519 wallet.");
707 }
708
709 {
710 Json::Value params;
711 Json::Value error;
712
713 params[jss::key_type] = "ed25519";
714 params[jss::seed] = seed;
715
716 auto ret = keypairForSignature(params, error);
717
718 BEAST_EXPECT(!contains_error(error));
719 if (BEAST_EXPECT(ret))
720 {
721 BEAST_EXPECT(ret->first.size() != 0);
722 BEAST_EXPECT(toBase58(calcAccountID(ret->first)) == addr);
723 }
724 }
725
726 {
727 Json::Value params;
728 Json::Value error;
729
730 params[jss::key_type] = "secp256k1";
731 params[jss::seed] = seed;
732
733 auto ret = keypairForSignature(params, error);
734
735 BEAST_EXPECT(contains_error(error));
736 BEAST_EXPECT(error[jss::error_message] == "Specified seed is for an Ed25519 wallet.");
737 }
738 };
739
740 test("sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o", "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
741 test("sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz", "rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
742 test("sEdSxVntbihdLyabbfttMCqsaaucVR9", "rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
743 test("sEdSVwJjEXTYCztqDK4JD9WByH3otDX", "rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
744 test("sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U", "rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
745 test("sEdVeUZjuYT47Uy51FQCnzivsuWyiwB", "rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
746 test("sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH", "rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
747 test("sEd7A5jFBSdWbNeKGriQvLr1thBScJh", "rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
748 test("sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw", "rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
749 test("sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc", "r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
750 test("sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW", "rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
751 test("sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv", "r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
752 test("sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC", "rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
753 test("sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg", "rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
754 test("sEdTFJezurQwSJAbkLygj2gQXBut2wh", "rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
755 test("sEdSWajfQAAWFuDvVZF3AiGucReByLt", "rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");
756 }
757
758 void
776};
777
778BEAST_DEFINE_TESTSUITE(WalletPropose, rpc, xrpl);
779
780} // namespace RPC
781} // namespace xrpl
Represents a JSON value.
Definition json_value.h:131
Value & append(Value const &value)
Append value to array at the end.
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
Definition suite.h:148
void testSeed(std::optional< std::string > const &keyType, key_strings const &strings)
Json::Value testSecretWallet(Json::Value const &params, key_strings const &s)
void testKeyType(std::optional< std::string > const &keyType, key_strings const &strings)
void testLegacyPassphrase(std::optional< std::string > const &keyType, key_strings const &strings)
void testLegacyPassphrase(char const *value, std::optional< std::string > const &keyType, key_strings const &strings)
void testRandomWallet(std::optional< std::string > const &keyType)
void run() override
Runs the suite.
void testSeedHex(std::optional< std::string > const &keyType, key_strings const &strings)
void testKeypairForSignature(std::optional< std::string > keyType, key_strings const &strings)
bool expectEquals(S actual, T expected, std::string const &message="")
Definition TestSuite.h:15
T emplace(T... args)
T is_same_v
@ arrayValue
array value (ordered list)
Definition json_value.h:26
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:27
static char const * master_key
static char const * passphrase
static char const * master_seed_hex
static char const * master_seed
static key_strings const strong_brain_strings
static key_strings const secp256k1_strings
std::optional< std::pair< PublicKey, SecretKey > > keypairForSignature(Json::Value const &params, Json::Value &error, unsigned int apiVersion)
Generates a keypair for signature from RPC parameters.
static key_strings const ed25519_strings
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition AccountID.cpp:92
Json::Value walletPropose(Json::Value const &params)
AccountID calcAccountID(PublicKey const &pk)