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/admin/keygen/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
97 result[jss::key_type],
98 params.isMember(jss::key_type) ? params[jss::key_type] : "secp256k1");
99 BEAST_EXPECT(!result.isMember(jss::warning));
100
101 std::string const seed = result[jss::master_seed].asString();
102
103 result = walletPropose(params);
104
105 // We asked for two random seeds, so they shouldn't match.
106 BEAST_EXPECT(result[jss::master_seed].asString() != seed);
107 }
108
110 testSecretWallet(Json::Value const& params, key_strings const& s)
111 {
112 Json::Value result = walletPropose(params);
113
114 BEAST_EXPECT(!contains_error(result));
115 expectEquals(result[jss::account_id], s.account_id);
116 expectEquals(result[jss::master_seed], s.master_seed);
117 expectEquals(result[jss::master_seed_hex], s.master_seed_hex);
118 expectEquals(result[jss::public_key], s.public_key);
119 expectEquals(result[jss::public_key_hex], s.public_key_hex);
121 result[jss::key_type],
122 params.isMember(jss::key_type) ? params[jss::key_type] : "secp256k1");
123 return result;
124 }
125
126 void
127 testSeed(std::optional<std::string> const& keyType, key_strings const& strings)
128 {
129 testcase("seed");
130
131 Json::Value params;
132 if (keyType)
133 params[jss::key_type] = *keyType;
134 params[jss::seed] = strings.master_seed;
135
136 auto const wallet = testSecretWallet(params, strings);
137 BEAST_EXPECT(!wallet.isMember(jss::warning));
138 }
139
140 void
141 testSeedHex(std::optional<std::string> const& keyType, key_strings const& strings)
142 {
143 testcase("seed_hex");
144
145 Json::Value params;
146 if (keyType)
147 params[jss::key_type] = *keyType;
148 params[jss::seed_hex] = strings.master_seed_hex;
149
150 auto const wallet = testSecretWallet(params, strings);
151 BEAST_EXPECT(!wallet.isMember(jss::warning));
152 }
153
154 void
156 char const* value,
157 std::optional<std::string> const& keyType,
158 key_strings const& strings)
159 {
160 Json::Value params;
161 if (keyType)
162 params[jss::key_type] = *keyType;
163 params[jss::passphrase] = value;
164
165 auto const wallet = testSecretWallet(params, strings);
166 if (value == strings.passphrase)
167 {
168 BEAST_EXPECT(wallet[jss::warning] == strings.passphrase_warning);
169 }
170 else
171 {
172 BEAST_EXPECT(!wallet.isMember(jss::warning));
173 }
174 }
175
176 void
178 {
179 testcase("passphrase");
180
181 testLegacyPassphrase(strings.passphrase, keyType, strings);
182 testLegacyPassphrase(strings.master_key, keyType, strings);
183 testLegacyPassphrase(strings.master_seed, keyType, strings);
184 testLegacyPassphrase(strings.master_seed_hex, keyType, strings);
185 }
186
187 void
188 testKeyType(std::optional<std::string> const& keyType, key_strings const& strings)
189 {
190 testcase(keyType ? *keyType : "no key_type");
191
192 testRandomWallet(keyType);
193 testSeed(keyType, strings);
194 testSeedHex(keyType, strings);
195 testLegacyPassphrase(keyType, strings);
196
197 Json::Value params;
198 if (keyType)
199 params[jss::key_type] = *keyType;
200 params[jss::seed] = strings.master_seed;
201 params[jss::seed_hex] = strings.master_seed_hex;
202
203 // Secret fields are mutually exclusive.
204 BEAST_EXPECT(contains_error(walletPropose(params)));
205 }
206
207 void
209 {
210 testcase("Bad inputs");
211
212 // Passing non-strings where strings are required
213 {
214 Json::Value params;
215 params[jss::key_type] = "secp256k1";
216 params[jss::passphrase] = 20160506;
217 auto result = walletPropose(params);
218 BEAST_EXPECT(contains_error(result));
219 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'passphrase', not string.");
220 }
221
222 {
223 Json::Value params;
224 params[jss::key_type] = "secp256k1";
225 params[jss::seed] = Json::objectValue;
226 auto result = walletPropose(params);
227 BEAST_EXPECT(contains_error(result));
228 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'seed', not string.");
229 }
230
231 {
232 Json::Value params;
233 params[jss::key_type] = "ed25519";
234 params[jss::seed_hex] = Json::arrayValue;
235 auto result = walletPropose(params);
236 BEAST_EXPECT(contains_error(result));
237 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'seed_hex', not string.");
238 }
239
240 // Specifying multiple items at once
241 {
242 Json::Value params;
243 params[jss::key_type] = "secp256k1";
244 params[jss::passphrase] = common::master_key;
245 params[jss::seed_hex] = common::master_seed_hex;
246 params[jss::seed] = common::master_seed;
247 auto result = walletPropose(params);
248 BEAST_EXPECT(contains_error(result));
249 BEAST_EXPECT(
250 result[jss::error_message] ==
251 "Exactly one of the following must be specified: passphrase, "
252 "seed or seed_hex");
253 }
254
255 // Specifying bad key types:
256 {
257 Json::Value params;
258 params[jss::key_type] = "prime256v1";
259 params[jss::passphrase] = common::master_key;
260 auto result = walletPropose(params);
261 BEAST_EXPECT(contains_error(result));
262 BEAST_EXPECT(result[jss::error_message] == "Invalid parameters.");
263 }
264
265 {
266 Json::Value params;
267 params[jss::key_type] = Json::objectValue;
268 params[jss::seed_hex] = common::master_seed_hex;
269 auto result = walletPropose(params);
270 BEAST_EXPECT(contains_error(result));
271 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'key_type', not string.");
272 }
273
274 {
275 Json::Value params;
276 params[jss::key_type] = Json::arrayValue;
277 params[jss::seed] = common::master_seed;
278 auto result = walletPropose(params);
279 BEAST_EXPECT(contains_error(result));
280 BEAST_EXPECT(result[jss::error_message] == "Invalid field 'key_type', not string.");
281 }
282 }
283
284 void
286 {
287 testcase("keypairForSignature - " + (keyType ? *keyType : "no key_type"));
288
289 auto const publicKey = parseBase58<PublicKey>(TokenType::AccountPublic, strings.public_key);
290 BEAST_EXPECT(publicKey);
291
292 if (!keyType)
293 {
294 {
295 Json::Value params;
296 Json::Value error;
297 params[jss::secret] = strings.master_seed;
298
299 auto ret = keypairForSignature(params, error);
300 BEAST_EXPECT(!contains_error(error));
301 if (BEAST_EXPECT(ret); ret.has_value())
302 {
303 BEAST_EXPECT(ret->first.size() != 0);
304 BEAST_EXPECT(ret->first == publicKey);
305 }
306 }
307
308 {
309 Json::Value params;
310 Json::Value error;
311 params[jss::secret] = strings.master_seed_hex;
312
313 auto ret = keypairForSignature(params, error);
314 BEAST_EXPECT(!contains_error(error));
315 if (BEAST_EXPECT(ret); ret.has_value())
316 {
317 BEAST_EXPECT(ret->first.size() != 0);
318 BEAST_EXPECT(ret->first == publicKey);
319 }
320 }
321
322 {
323 Json::Value params;
324 Json::Value error;
325 params[jss::secret] = strings.master_key;
326
327 auto ret = keypairForSignature(params, error);
328 BEAST_EXPECT(!contains_error(error));
329 if (BEAST_EXPECT(ret); ret.has_value())
330 {
331 BEAST_EXPECT(ret->first.size() != 0);
332 BEAST_EXPECT(ret->first == publicKey);
333 }
334 }
335
336 keyType.emplace("secp256k1");
337 }
338
339 {
340 Json::Value params;
341 Json::Value error;
342
343 params[jss::key_type] = *keyType;
344 params[jss::seed] = strings.master_seed;
345
346 auto ret = keypairForSignature(params, error);
347 BEAST_EXPECT(!contains_error(error));
348 if (BEAST_EXPECT(ret); ret.has_value())
349 {
350 BEAST_EXPECT(ret->first.size() != 0);
351 BEAST_EXPECT(ret->first == publicKey);
352 }
353 }
354
355 {
356 Json::Value params;
357 Json::Value error;
358
359 params[jss::key_type] = *keyType;
360 params[jss::seed_hex] = strings.master_seed_hex;
361
362 auto ret = keypairForSignature(params, error);
363 BEAST_EXPECT(!contains_error(error));
364 if (BEAST_EXPECT(ret); ret.has_value())
365 {
366 BEAST_EXPECT(ret->first.size() != 0);
367 BEAST_EXPECT(ret->first == publicKey);
368 }
369 }
370
371 {
372 Json::Value params;
373 Json::Value error;
374
375 params[jss::key_type] = *keyType;
376 params[jss::passphrase] = strings.master_key;
377
378 auto ret = keypairForSignature(params, error);
379 BEAST_EXPECT(!contains_error(error));
380 if (BEAST_EXPECT(ret); ret.has_value())
381 {
382 BEAST_EXPECT(ret->first.size() != 0);
383 BEAST_EXPECT(ret->first == publicKey);
384 }
385 }
386 }
387
388 void
390 {
391 // Specify invalid "secret"
392 {
393 Json::Value params;
394 Json::Value error;
395 params[jss::secret] = 314159265;
396 auto ret = keypairForSignature(params, error);
397 BEAST_EXPECT(contains_error(error));
398 BEAST_EXPECT(!ret);
399 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
400 }
401
402 {
403 Json::Value params;
404 Json::Value error;
405 params[jss::secret] = Json::arrayValue;
406 params[jss::secret].append("array:0");
407
408 auto ret = keypairForSignature(params, error);
409 BEAST_EXPECT(contains_error(error));
410 BEAST_EXPECT(!ret);
411 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
412 }
413
414 {
415 Json::Value params;
416 Json::Value error;
417 params[jss::secret] = Json::objectValue;
418 params[jss::secret]["string"] = "string";
419 params[jss::secret]["number"] = 702;
420
421 auto ret = keypairForSignature(params, error);
422 BEAST_EXPECT(contains_error(error));
423 BEAST_EXPECT(!ret);
424 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'secret', not string.");
425 }
426
427 // Specify "secret" and "key_type"
428 {
429 Json::Value params;
430 Json::Value error;
431 params[jss::key_type] = "ed25519";
432 params[jss::secret] = common::master_seed;
433
434 auto ret = keypairForSignature(params, error);
435 BEAST_EXPECT(contains_error(error));
436 BEAST_EXPECT(!ret);
437 BEAST_EXPECT(
438 error[jss::error_message] ==
439 "The secret field is not allowed if key_type is used.");
440 }
441
442 // Specify unknown or bad "key_type"
443 {
444 Json::Value params;
445 Json::Value error;
446 params[jss::key_type] = "prime256v1";
447 params[jss::passphrase] = common::master_key;
448
449 auto ret = keypairForSignature(params, error);
450 BEAST_EXPECT(contains_error(error));
451 BEAST_EXPECT(!ret);
452 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'key_type'.");
453 }
454
455 {
456 Json::Value params;
457 Json::Value error;
458 params[jss::key_type] = Json::objectValue;
459 params[jss::seed_hex] = common::master_seed_hex;
460
461 auto ret = keypairForSignature(params, error);
462 BEAST_EXPECT(contains_error(error));
463 BEAST_EXPECT(!ret);
464 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'key_type', not string.");
465 }
466
467 {
468 Json::Value params;
469 Json::Value error;
470 params[jss::key_type] = Json::arrayValue;
471 params[jss::seed] = common::master_seed;
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 'key_type', not string.");
477 }
478
479 // Specify non-string passphrase
480 { // not a passphrase: number
481 Json::Value params;
482 Json::Value error;
483 params[jss::key_type] = "secp256k1";
484 params[jss::passphrase] = 1234567890;
485
486 auto ret = keypairForSignature(params, error);
487 BEAST_EXPECT(contains_error(error));
488 BEAST_EXPECT(!ret);
489 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
490 }
491
492 { // not a passphrase: object
493 Json::Value params;
494 Json::Value error;
495 params[jss::key_type] = "secp256k1";
496 params[jss::passphrase] = Json::objectValue;
497
498 auto ret = keypairForSignature(params, error);
499 BEAST_EXPECT(contains_error(error));
500 BEAST_EXPECT(!ret);
501 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
502 }
503
504 { // not a passphrase: array
505 Json::Value params;
506 Json::Value error;
507 params[jss::key_type] = "secp256k1";
508 params[jss::passphrase] = Json::arrayValue;
509
510 auto ret = keypairForSignature(params, error);
511 BEAST_EXPECT(contains_error(error));
512 BEAST_EXPECT(!ret);
513 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'passphrase', not string.");
514 }
515
516 { // not a passphrase: empty string
517 Json::Value params;
518 Json::Value error;
519 params[jss::key_type] = "secp256k1";
520 params[jss::passphrase] = "";
521
522 auto ret = keypairForSignature(params, error);
523 BEAST_EXPECT(contains_error(error));
524 BEAST_EXPECT(!ret);
525 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
526 }
527
528 // Specify non-string or invalid seed
529 { // not a seed: number
530 Json::Value params;
531 Json::Value error;
532 params[jss::key_type] = "secp256k1";
533 params[jss::seed] = 443556;
534
535 auto ret = keypairForSignature(params, error);
536 BEAST_EXPECT(contains_error(error));
537 BEAST_EXPECT(!ret);
538 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
539 }
540
541 { // not a string: object
542 Json::Value params;
543 Json::Value error;
544 params[jss::key_type] = "secp256k1";
545 params[jss::seed] = Json::objectValue;
546
547 auto ret = keypairForSignature(params, error);
548 BEAST_EXPECT(contains_error(error));
549 BEAST_EXPECT(!ret);
550 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
551 }
552
553 { // not a string: array
554 Json::Value params;
555 Json::Value error;
556 params[jss::key_type] = "secp256k1";
557 params[jss::seed] = Json::arrayValue;
558
559 auto ret = keypairForSignature(params, error);
560 BEAST_EXPECT(contains_error(error));
561 BEAST_EXPECT(!ret);
562 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed', not string.");
563 }
564
565 { // not a seed: empty
566 Json::Value params;
567 Json::Value error;
568 params[jss::key_type] = "secp256k1";
569 params[jss::seed] = "";
570
571 auto ret = keypairForSignature(params, error);
572 BEAST_EXPECT(contains_error(error));
573 BEAST_EXPECT(!ret);
574 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
575 }
576
577 { // not a seed: invalid characters
578 Json::Value params;
579 Json::Value error;
580 params[jss::key_type] = "secp256k1";
581 params[jss::seed] = "s M V s h z D F p t Z E m h s";
582
583 auto ret = keypairForSignature(params, error);
584 BEAST_EXPECT(contains_error(error));
585 BEAST_EXPECT(!ret);
586 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
587 }
588
589 { // not a seed: random string
590 Json::Value params;
591 Json::Value error;
592 params[jss::key_type] = "secp256k1";
593 params[jss::seed] = "pnnjkbnobnml43679nbvjdsklnbjs";
594
595 auto ret = keypairForSignature(params, error);
596 BEAST_EXPECT(contains_error(error));
597 BEAST_EXPECT(!ret);
598 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
599 }
600
601 // Specify non-string or invalid seed_hex
602 { // not a string: number
603 Json::Value params;
604 Json::Value error;
605 params[jss::key_type] = "secp256k1";
606 params[jss::seed_hex] = 443556;
607
608 auto ret = keypairForSignature(params, error);
609 BEAST_EXPECT(contains_error(error));
610 BEAST_EXPECT(!ret);
611 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
612 }
613
614 { // not a string: object
615 Json::Value params;
616 Json::Value error;
617 params[jss::key_type] = "secp256k1";
618 params[jss::seed_hex] = Json::objectValue;
619
620 auto ret = keypairForSignature(params, error);
621 BEAST_EXPECT(contains_error(error));
622 BEAST_EXPECT(!ret);
623 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
624 }
625
626 { // not a string: array
627 Json::Value params;
628 Json::Value error;
629 params[jss::key_type] = "secp256k1";
630 params[jss::seed_hex] = Json::arrayValue;
631
632 auto ret = keypairForSignature(params, error);
633 BEAST_EXPECT(contains_error(error));
634 BEAST_EXPECT(!ret);
635 BEAST_EXPECT(error[jss::error_message] == "Invalid field 'seed_hex', not string.");
636 }
637
638 { // empty
639 Json::Value params;
640 Json::Value error;
641 params[jss::key_type] = "secp256k1";
642 params[jss::seed_hex] = "";
643
644 auto ret = keypairForSignature(params, error);
645 BEAST_EXPECT(contains_error(error));
646 BEAST_EXPECT(!ret);
647 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
648 }
649
650 { // short
651 Json::Value params;
652 Json::Value error;
653 params[jss::key_type] = "secp256k1";
654 params[jss::seed_hex] = "A670A19B";
655
656 auto ret = keypairForSignature(params, error);
657 BEAST_EXPECT(contains_error(error));
658 BEAST_EXPECT(!ret);
659 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
660 }
661
662 { // not hex
663 Json::Value params;
664 Json::Value error;
665 params[jss::key_type] = "secp256k1";
666 params[jss::seed_hex] = common::passphrase;
667
668 auto ret = keypairForSignature(params, error);
669 BEAST_EXPECT(contains_error(error));
670 BEAST_EXPECT(!ret);
671 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
672 }
673
674 { // overlong
675 Json::Value params;
676 Json::Value error;
677 params[jss::key_type] = "secp256k1";
678 params[jss::seed_hex] = "BE6A670A19B209E112146D0A7ED2AAD72567D0FC913";
679
680 auto ret = keypairForSignature(params, error);
681 BEAST_EXPECT(contains_error(error));
682 BEAST_EXPECT(!ret);
683 BEAST_EXPECT(error[jss::error_message] == "Disallowed seed.");
684 }
685 }
686
687 void
689 {
690 testcase("ripple-lib encoded Ed25519 keys");
691
692 auto test = [this](char const* seed, char const* addr) {
693 {
694 Json::Value params;
695 Json::Value error;
696
697 params[jss::passphrase] = seed;
698
699 auto ret = keypairForSignature(params, error);
700
701 BEAST_EXPECT(!contains_error(error));
702 if (BEAST_EXPECT(ret); ret.has_value())
703 {
704 BEAST_EXPECT(ret->first.size() != 0);
705 BEAST_EXPECT(toBase58(calcAccountID(ret->first)) == addr);
706 }
707 }
708
709 {
710 Json::Value params;
711 Json::Value error;
712
713 params[jss::key_type] = "secp256k1";
714 params[jss::passphrase] = seed;
715
716 auto ret = keypairForSignature(params, error);
717
718 BEAST_EXPECT(contains_error(error));
719 BEAST_EXPECT(
720 error[jss::error_message] == "Specified seed is for an Ed25519 wallet.");
721 }
722
723 {
724 Json::Value params;
725 Json::Value error;
726
727 params[jss::key_type] = "ed25519";
728 params[jss::seed] = seed;
729
730 auto ret = keypairForSignature(params, error);
731
732 BEAST_EXPECT(!contains_error(error));
733 if (BEAST_EXPECT(ret); ret.has_value())
734 {
735 BEAST_EXPECT(ret->first.size() != 0);
736 BEAST_EXPECT(toBase58(calcAccountID(ret->first)) == addr);
737 }
738 }
739
740 {
741 Json::Value params;
742 Json::Value error;
743
744 params[jss::key_type] = "secp256k1";
745 params[jss::seed] = seed;
746
747 auto ret = keypairForSignature(params, error);
748
749 BEAST_EXPECT(contains_error(error));
750 BEAST_EXPECT(
751 error[jss::error_message] == "Specified seed is for an Ed25519 wallet.");
752 }
753 };
754
755 test("sEdVWZmeUDgQdMEFKTK9kYVX71FKB7o", "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ");
756 test("sEd7zJoVnqg1FxB9EuaHC1AB5UPfHWz", "rDw51qRrBEeMw7Na1Nh79LN7HYZDo7nZFE");
757 test("sEdSxVntbihdLyabbfttMCqsaaucVR9", "rwiyBDfAYegXZyaQcN2L1vAbKRYn2wNFMq");
758 test("sEdSVwJjEXTYCztqDK4JD9WByH3otDX", "rQJ4hZzNGkLQhLtKPCmu1ywEw1ai2vgUJN");
759 test("sEdV3jXjKuUoQTSr1Rb4yw8Kyn9r46U", "rERRw2Pxbau4tevE61V5vZUwD7Rus5Y6vW");
760 test("sEdVeUZjuYT47Uy51FQCnzivsuWyiwB", "rszewT5gRjUgWNEmnfMjvVYzJCkhvWY32i");
761 test("sEd7MHTewdw4tFYeS7rk7XT4qHiA9jH", "rBB2rvnf4ztwjgNhinFXQJ91nAZjkFgR3p");
762 test("sEd7A5jFBSdWbNeKGriQvLr1thBScJh", "rLAXz8Nz7aDivz7PwThsLFqaKrizepNCdA");
763 test("sEdVPU9M2uyzVNT4Yb5Dn4tUtYjbFAw", "rHbHRFPCxD5fnn98TBzsQHJ7SsRq7eHkRj");
764 test("sEdVfF2zhAmS8gfMYzJ4yWBMeR4BZKc", "r9PsneKHcAE7kUfiTixomM5Mnwi28tCc7h");
765 test("sEdTjRtcsQkwthDXUSLi9DHNyJcR8GW", "rM4soF4XS3wZrmLurvE6ZmudG16Lk5Dur5");
766 test("sEdVNKeu1Lhpfh7Nf6tRDbxnmMyZ4Dv", "r4ZwJxq6FDtWjapDtCGhjG6mtNm1nWdJcD");
767 test("sEd7bK4gf5BHJ1WbaEWx8pKMA9MLHpC", "rD6tnn51m4o1uXeEK9CFrZ3HR7DcFhiYnp");
768 test("sEd7jCh3ppnQMsLdGcZ6TZayZaHhBLg", "rTcBkiRQ1EfFQ4FCCwqXNHpn1yUTAACkj");
769 test("sEdTFJezurQwSJAbkLygj2gQXBut2wh", "rnXaMacNbRwcJddbbPbqdcpSUQcfzFmrR8");
770 test("sEdSWajfQAAWFuDvVZF3AiGucReByLt", "rBJtow6V3GTdsWMamrxetRDwWs6wwTxcKa");
771 }
772
773 void
791};
792
793BEAST_DEFINE_TESTSUITE(WalletPropose, rpc, xrpl);
794
795} // namespace RPC
796} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
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:150
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:14
T emplace(T... args)
T is_same_v
@ arrayValue
array value (ordered list)
Definition json_value.h:25
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:26
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:5
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)