Zeroize PrivateKey - #112
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 624dba4432
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
This PR strengthens handling of secret material by zeroizing ed25519::PrivateKey seeds on drop and adding zeroizing encode/decode helpers that avoid leaving intermediate scratch buffers in memory. It also adds fuzz targets to compare behavior against the v0.0.16 published crate and to assert equivalence between “plain” and “zeroizing” convert paths.
Changes:
- Add
Zeroize/ZeroizeOnDroptoed25519::PrivateKey, introducewrite_string, and route private-key decode/encode through zeroizing buffers. - Add
convert::encode_zeroizing/convert::decode_zeroizingAPIs plus unit tests ensuring they match existingencode/decode. - Add new fuzz targets (
fuzz_compare_v16,fuzz_compare_zeroizing), corpus seeds, and bump crate/deps (heapless 0.9 + zeroize 1) and version to 0.0.17.
Reviewed changes
Copilot reviewed 167 out of 178 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/strkey.rs | Document Strkey zeroization semantics and recommend private-key-specific decoding APIs when zeroization is required. |
| src/lib.rs | Expose convert as a public (doc-hidden) module to access new zeroizing helpers. |
| src/ed25519.rs | Make PrivateKey zeroize-on-drop; add write_string; update decode path to use decode_zeroizing; add unit test. |
| src/convert.rs | Add encode_zeroizing/decode_zeroizing and tests comparing outputs to the existing encode/decode. |
| Makefile | Add fuzz targets fuzz-compare-v16 and fuzz-compare-zeroizing. |
| fuzz/fuzz_targets/fuzz_compare_zeroizing.rs | Fuzz target comparing plain vs zeroizing encode/decode behavior. |
| fuzz/fuzz_targets/fuzz_compare_v16.rs | Fuzz target comparing current parsing/encoding against stellar-strkey v0.0.16. |
| fuzz/corpus/fuzz_compare_v16/seed-XBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWGTOG | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-TBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHXL7 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-SBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHOKR | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAQACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6IBZGM | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAQACAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUPB6IAAAAAAAAPM | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAOQCAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4Z2PQ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAOQCAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DXFH6 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAOQCAQDAQCQMBYIBEFAWDANBYHRAEISCMKBKFQXDAMRUGY4DUAAAAFGBU | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXP | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXO | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXN | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXM | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXL | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXK | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXJ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGXI | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAKB5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAGAAAAAAAAAAAAAAAAAAACTPZ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAGAAAAAAAAAAAAAAAAAAACTPY | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAGAAAAAAAAAAAAAAAAAAACTP3 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAGAAAAAAAAAAAAAAAAAAACTP2 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYZ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYY | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYX | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYW | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYV | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYU | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYT | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYS | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYR | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKYQ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY7 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY6 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY4 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY3 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAEAAAAAAAAAAAAARKY2 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAACAAAAAABNWT | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-PA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAACAAAAAABNWS | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2DMLK | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVAAAAAAAAAAAAAJQ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVAAAAAAAAAAAAAJLKA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVAAAAAAAAAAAAAJLK | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVAAAAAAAAAAAAAAV75I | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUR | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUK=== | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-MA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQGAAAAAAAAAPCICBKU | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-M47QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LAAAAAAAADLH2 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUPJNAAAAAA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUPJNAAA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUPJNA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUPJN | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAGPZA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-LA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQGZ5J | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-L47QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUSV4 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-L=A7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUPJN | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-GAAAAAAAACGC6 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUACUSI | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-GA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQHES5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-G47QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVP2I | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-G=3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQHES5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-CA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUWDA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-CA3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQGAXE | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAT6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGXACA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAADMPVKHBTYIH522D2O3CGHPHSP4ZXFNISHBXEYYDWJYBZ5AXD3CA3GDEAAAAAAA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAADMPVKHBTYIH522D2O3CGHPHSP4ZXFNISHBXEYYDWJYBZ5AXD3CA3GDEAAAA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAADMPVKHBTYIH522D2O3CGHPHSP4ZXFNISHBXEYYDWJYBZ5AXD3CA3GDEA | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAADMPVKHBTYIH522D2O3CGHPHSP4ZXFNISHBXEYYDWJYBZ5AXD3CA3GDE | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAD6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGR4TX | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAD6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGR4TW | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAD6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGR4TV | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAD6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGR4TU | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BAAAAAAAAAAK3EY | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-BA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUADTYY | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-B47QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVA4D | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-AAD6DBUX6J22DMZOHIEZTEQ64CVCHEDRKWZONFEUL5Q26QD7R76RGR4TU | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/seed-3D5KRYM6CB7OWQ6TWYRR3Z4T7GNZLKERYNZGGA5SOAOPIFY6YQHES5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/fe8092bb1b53a678d86898ac18d85c61f9e612d1 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/fe12e31b759edb1cafb8988d301242e5d57ab9c1 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/f5a63959843e299898a9cefcc9c3dd7f54c39054 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/f0487a34f7760f330ca2c020c1fd8df827f7b534 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/ee1cbaa0c703001aa9061f30e7911f54b479d7dd | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/e7fd8a5c56ee816241f6fa114319a1769814b4a4 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/e60fb62528dda11c7f47c25369b0205c7a2f304f | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/db3f49e07d16953ba6e0c04c17ca0a308353ef8f | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/da70a685b0c2d9d49bee34c00d36fe121113c792 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/d9d4f7b42a9949f41d7566a28ff67544ce91421d | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/d0a22300db064cb9fc471a5d9c780fe84e201421 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/d094b9d0cab14d274e5e7d651b37c07920d349f5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/c5672c8bfc6e0bcc067cac30ea315256f29cf390 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/c521b85ce4ba3e296288ae3555a9ec43c93a2114 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/c427c553f0e2c4e269a0b0e98cfc86cef7e837f4 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/c1fe3a7b487f66a6ac8c7e4794bc55c31b0ef403 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/c1dfd96eea8cc2b62785275bca38ac261256e278 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/bfe2fce9ad197e3df58aef0ffe071c78a30bd6df | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/be14e7fcd9db06988506acfb8b52cdf3804712d3 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/bd100143b4df2f4d401a92eed9d1daa38dc4f14a | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/b3649a2987d9a438af63b49f7debf11c671077af | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/b0052b6d69e2c381e8a8e1d65fe79dd26e3dd236 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/af8229acb9c949874ec15d6d3c34d7964a0e9656 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/a94dfb23d720cda3283616d2d8d947101cdd15e9 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/a8e602f5f64af9048874285d07e2bab5aa88a031 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/a6f57425137e9aa54537f0b3f5364ce165aedb0a | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/a137d3c99e8e343e95f49b5cdff82ece4af7db7d | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/a122d7e19e22ea5704beb204e1dbb50f4438f440 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/971bb9b4947ac7f077e0475d1203b83a442e1b9b | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/935542905185520a379510bbe0aa9d594099e82a | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/8fc834929b471831f4fd1f43fa9e722715a921e1 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/8d31c2074ad0d76b5937eb5008ea7cc3deae3771 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/8b1f555d3e3e0ce0cb281bb48b9b423e0038a1ef | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/89b527c8f13870b4e4f1fe5c407b0565692c507f | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/897e4d6b4a082016c994c257d4a291123e521c56 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/867a3254ce1d333fae2f5e2e6a131a8375008c10 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/82596d711bb1802e2e4b9aa539e70d93b89a0cd2 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/8076066d40b97022d1044f7c89e3dd5ac05b6084 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/7e4806faa70fa87dd7ce286e0bfa21270f7850db | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/7cc65aa8a116bda64a43f69b6179abca8e245c05 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/7bb3c0eb51f17ab43967467b1e27623d0dd874f3 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/7b49a9e1a870ee9ee24295b145650390b169ea68 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/73407e379a8aca4fe8fe1ab09d660ec79d49cc2f | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/7162cc107f2c5f83bdd81617ec73ddac328ad500 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/6fb9efe5c95de9128bb4e99235db5d0bd5d7af10 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/6dac94b1351edd98973561fb69b2f53f7a68ebc0 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/6c8b58bb4f5e8e536e60dbaa035127ef5644fa22 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/6873e7825d3b55be073097bc327e934855270910 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/64ec4d036e34669ac6386a67288fe9a5f9999550 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/60d9c68282fbca9cdb07a26b0e33470010cbb2d7 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/572ccd879b3312ca5552c2ad1ed3ad20ecc9cf09 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/544beda29ec90e0b27ad24f2c813234c8fd65c1a | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/506c6591f7521b1e2943cf5095a7c866d02f2460 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/4e7c6dc43d91a015025f09371d9b891a3ae4d63e | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/4d1f399307709d26f418d72def11edb5ade4b343 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/4aa23ad905bea04f7057d19fca3ee97d01a875ca | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/491d867ae27270b088be7a912ae4c159948a40ab | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/4206d1a9b995faa079a3542c05e188058a59d222 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/40582d347d6d10c940d065bed10f19e1bc7b7e3f | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/3e5d02891cd711f2dee4f1ef708a15633940aaad | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/37a32288065fc19690f4da7047bc398f2155b620 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/368b0fafab29c6f722ed1b336bee2311af0afda7 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/3296027f2f6683080a4664c2ed358f8a286ef14e | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/31b61ed1c861e0ce9f89b081dbb7b78e026b31c0 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/2dba1d6c7456aafcc8136e62b4734126967e3dc1 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/1ff5bba3cab16637098dedcccb1222c200281cc4 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/1d0e706bf8162f355bd5e63e34c9f8da16412dcd | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/1c48a6d108d427bb31ca960352a868253d22388c | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/18c3155f5011b393f9570bd874298afd96ce9be0 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/18a722e72c42d975589a08dca53c3ee7d5149563 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/17c90bf25583dc87cacc1dd965f4f764f6f9fb69 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/16d36c98a0a4994a3a9eb09bd6660af396a85036 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/110722f71b3fc8b1e813b4ff9faa6ef8ff99a21c | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/0f4814337c5740c1377ebfa6bce72dcd634922d5 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/0c63b7c4feefb3d9fdb19070b520399099818598 | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/0766bf41b7a7ffa28561a61e8f887bc1367660fb | Seed corpus input for fuzz_compare_v16. |
| fuzz/corpus/fuzz_compare_v16/0077f5d44970e20dfff5388ea003809ede53cf5e | Seed corpus input for fuzz_compare_v16. |
| fuzz/Cargo.toml | Add deps needed for fuzz targets (heapless+zeroize) and add new fuzz binaries + v0.0.16 comparison dep. |
| fuzz/Cargo.lock | Lock updated to include heapless 0.9 and zeroize plus multiple stellar-strkey versions. |
| Cargo.toml | Bump crate version/MSRV and add zeroize + heapless zeroize feature. |
| Cargo.lock | Lock updated for heapless 0.9 and zeroize crates. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Claude finished @leighmcculloch's task in 3m 59s —— View job Code review — Zeroize PrivateKey seed and decode buffersOverall direction is solid: derive That said, two of the new Blocking —
|
|
Claude finished @leighmcculloch's task in 1m 48s —— View job Code review — re-check after syncSince the prior review (commit
Still blocking
Fix is one line at the top of each function (after the out.clear();Plus a regression test that calls each Fix the reset bug + add tests → Still open (design / nit)
What looks good
Todos
|
|
Claude finished @leighmcculloch's task in 5m 17s —— View job Code review — re-check after
|
|
Claude finished @leighmcculloch's task in 4m 43s —— View job Code review — re-check after
|
|
Claude finished @leighmcculloch's task in 1m 42s —— View job Code review — re-check after
|
What
heaplessfrom 0.8 to 0.9 with thezeroizefeature; addzeroize 1(no_std-compatible).ed25519::PrivateKey: dropCopy, deriveZeroizeandZeroizeOnDropso the 32-byte seed is overwritten on drop.convert::encode_zeroizingandconvert::decode_zeroizing. They wrap their intermediate scratch buffers inZeroizing<…>and take a caller-provided output by&mut, eliminating return-value moves of secret bytes.PrivateKey::write_string(&self, &mut Zeroizing<String<E>>)— the zeroize-aware encoding path that writes directly into a caller-provided buffer.PrivateKey::from_slicenow usesdecode_zeroizingwith a localZeroizing<Vec<u8, P>>.PrivateKey::to_stringroutes throughwrite_string/encode_zeroizingso its intermediate scratch is zeroed; the returnedString<E>itself remains plain by design (see docs).# Zeroizesemantics onPrivateKey(protections + remaining leak vectors) and onStrkey(its decode path does not zero — usePrivateKey::from_slice/from_stringdirectly for a private-key strkey).convert.rsconfirmingencode_zeroizing/decode_zeroizingproduce identical output toencode/decode; unit test ined25519.rsconfirmingwrite_stringmatchesto_string.fuzz_compare_v16(andmake fuzz-compare-v16) cross-checks parsing/encoding/decoded data of the in-tree code against the publishedstellar-strkey 0.0.16crate to catch any behavioural drift introduced by this refactor.0.0.17.Why
PrivateKeypreviously held its raw 32-byte seed withCopysemantics and noDrop, so the bytes could remain in process memory after the value had nominally been dropped. The decode path compounded this by leaving stack-residentheapless::Vecscratch buffers (35-byte binary + 32-byte payload) uncleared on return.This change overwrites the seed bytes on drop, removes the by-value
Copyduplication, and clears the intermediate scratch buffers used by the encode/decode paths for private keys. Residue from the few remaining return-value moves is called out in the docs on the relevant items, withwrite_stringprovided as the no-residue encoding path.Breaking changes (pre-1.0):
PrivateKeyno longer derivesCopy. Callers passing it by value need.clone()or to borrow.