|
2 | 2 |
|
3 | 3 | use libfuzzer_sys::{fuzz_target, Corpus}; |
4 | 4 |
|
5 | | -use stellar_strkey::Strkey as StrkeyNew; |
| 5 | +use stellar_strkey::ed25519::PrivateKey as PrivateKeyNew; |
| 6 | +use stellar_strkey::{Strkey as StrkeyNew, Unredacted}; |
6 | 7 | use stellar_strkey_v16::Strkey as StrkeyOld; |
7 | 8 |
|
8 | 9 | // Compare parsing and encoding between the current library and v0.0.16. |
9 | 10 | fuzz_target!(|s: &str| -> Corpus { |
| 11 | + // `S…` strkeys are parsed via ed25519::PrivateKey on the new side and |
| 12 | + // Strkey::PrivateKeyEd25519 on the old side. |
| 13 | + if s.starts_with('S') { |
| 14 | + return compare_private_key(s); |
| 15 | + } |
| 16 | + |
10 | 17 | // Try parsing with both versions. |
11 | 18 | let old_result: Result<StrkeyOld, _> = s.parse(); |
12 | 19 | let new_result: Result<StrkeyNew, _> = s.parse(); |
@@ -57,9 +64,6 @@ fn compare_internals(new: &StrkeyNew, old: &StrkeyOld) { |
57 | 64 | (StrkeyNew::PublicKeyEd25519(n), StrkeyOld::PublicKeyEd25519(o)) => { |
58 | 65 | assert_eq!(n.0, o.0, "PublicKeyEd25519 data mismatch"); |
59 | 66 | } |
60 | | - (StrkeyNew::PrivateKeyEd25519(n), StrkeyOld::PrivateKeyEd25519(o)) => { |
61 | | - assert_eq!(n.0, o.0, "PrivateKeyEd25519 data mismatch"); |
62 | | - } |
63 | 67 | (StrkeyNew::PreAuthTx(n), StrkeyOld::PreAuthTx(o)) => { |
64 | 68 | assert_eq!(n.0, o.0, "PreAuthTx data mismatch"); |
65 | 69 | } |
@@ -101,3 +105,19 @@ fn compare_internals(new: &StrkeyNew, old: &StrkeyOld) { |
101 | 105 | } |
102 | 106 | } |
103 | 107 | } |
| 108 | + |
| 109 | +/// Compare new's `ed25519::PrivateKey` parse against old's |
| 110 | +/// `Strkey::PrivateKeyEd25519` for `S…` inputs. |
| 111 | +fn compare_private_key(s: &str) -> Corpus { |
| 112 | + let new: Result<PrivateKeyNew, _> = s.parse(); |
| 113 | + let old: Result<StrkeyOld, _> = s.parse(); |
| 114 | + match (new, old) { |
| 115 | + (Ok(new), Ok(StrkeyOld::PrivateKeyEd25519(old))) => { |
| 116 | + assert_eq!(new.0, old.0, "PrivateKeyEd25519 data mismatch"); |
| 117 | + assert_eq!(Unredacted(&new).to_string().as_str(), s, "roundtrip failed"); |
| 118 | + Corpus::Keep |
| 119 | + } |
| 120 | + (Err(_), Err(_)) => Corpus::Keep, |
| 121 | + (new, old) => panic!("private-key parse mismatch\nInput: {s}\nNew: {new:?}\nOld: {old:?}"), |
| 122 | + } |
| 123 | +} |
0 commit comments