elements/src/wallet
Andrew Chow 5e55534586
Merge bitcoin/bitcoin#27068: wallet: SecureString to allow null characters
4bbf5ddd44 Detailed error message for passphrases with null chars (John Moffett)
b4bdabc223 doc: Release notes for 27068 (John Moffett)
4b1205ba37 Test case for passphrases with null characters (John Moffett)
00a0861181 Pass all characters to SecureString including nulls (John Moffett)

Pull request description:

  `SecureString` is a `std::string` specialization with a secure allocator. However, in practice it's treated like a C- string (no explicit length and null-terminated). This can cause unexpected and potentially insecure behavior. For instance, if a user enters a passphrase with embedded null characters (which is possible through Qt and the JSON-RPC), it will ignore any characters after the first null, potentially giving the user a false sense of security.

  Instead of assigning to `SecureString` via `std::string::c_str()`, assign it via a `std::string_view` of the original. This explicitly captures the size and still doesn't make any extraneous copies in memory.

  Note to reviewers, the following all compile identically in recent `GCC` (x86-64 and ARM64) with `-O2` (and `-std=c++17`):

  ```C++
  std::string orig_string;
  std::cin >> orig_string;
  SecureString s;
  s.reserve(100);
  // The following all compile identically
  s = orig_string;
  s = std::string_view{orig_string};
  s.assign(std::string_view{orig_string});
  s.assign(orig_string.data(), orig_string.size());
  ```

  So it's largely a matter of preference. However, one thing to keep in mind is that we want to avoid making unnecessary copies of any sensitive data in memory.

  Something like `SecureString s{orig_string};` is still invalid and probably unwanted in our case, since it'd get treated as a short string and optimized away from the secure allocator. I presume that's the reason for the `reserve()` calls.

  Fixes #27067.

ACKs for top commit:
  achow101:
    re-ACK 4bbf5ddd44
  stickies-v:
    re-ACK [4bbf5dd](4bbf5ddd44)
  furszy:
    utACK 4bbf5ddd

Tree-SHA512: 47a96905a82ca674b18076a20a388123beedf70e9de73e42574ea68afbb434734e56021835dd9b148cdbf61709926b487cc95e9021d9bc534a7c93b3e143d2f7
2023-02-22 13:02:16 -05:00
..
rpc Merge bitcoin/bitcoin#27068: wallet: SecureString to allow null characters 2023-02-22 13:02:16 -05:00
test Merge bitcoin/bitcoin#26940: test: create random and coins utils, add amount helper, dedupe add_coin 2023-02-17 17:28:14 -05:00
bdb.cpp clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
bdb.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
coincontrol.cpp Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
coincontrol.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
coinselection.cpp Merge bitcoin/bitcoin#26661: wallet: Coin Selection, return accurate error messages 2023-01-03 18:53:36 -05:00
coinselection.h Merge bitcoin/bitcoin#26661: wallet: Coin Selection, return accurate error messages 2023-01-03 18:53:36 -05:00
context.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
context.h Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
crypter.cpp Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
crypter.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
db.cpp Replace use of ArgsManager with DatabaseOptions 2022-03-16 08:26:28 +01:00
db.h clang-tidy: Fix modernize-use-default-member-init in headers 2023-01-31 11:50:10 +00:00
dump.cpp refactor: remove <util/system.h> include from wallet.h 2023-02-15 15:49:45 -03:00
dump.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
external_signer_scriptpubkeyman.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
external_signer_scriptpubkeyman.h wallet: set keypool_size instead of access global args manager 2023-02-15 15:49:44 -03:00
feebumper.cpp wallet: add outputs arguments to bumpfee and psbtbumpfee 2023-01-17 13:28:53 +02:00
feebumper.h wallet: add outputs arguments to bumpfee and psbtbumpfee 2023-01-17 13:28:53 +02:00
fees.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
fees.h Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
init.cpp Remove -sysperms option 2023-02-05 08:09:16 +00:00
interfaces.cpp wallet: add outputs arguments to bumpfee and psbtbumpfee 2023-01-17 13:28:53 +02:00
ismine.h Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
load.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
load.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
receive.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
receive.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
salvage.cpp refactor: wallet, remove global 'ArgsManager' access 2023-02-15 15:49:45 -03:00
salvage.h scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
scriptpubkeyman.cpp wallet: set keypool_size instead of access global args manager 2023-02-15 15:49:44 -03:00
scriptpubkeyman.h wallet: set keypool_size instead of access global args manager 2023-02-15 15:49:44 -03:00
spend.cpp Merge bitcoin/bitcoin#27053: wallet: reuse change dest when re-creating TX with avoidpartialspends 2023-02-20 17:20:37 +00:00
spend.h Merge bitcoin/bitcoin#25659: wallet: simplify ListCoins implementation 2023-01-18 14:26:39 -05:00
sqlite.cpp Use DataStream where possible 2023-01-26 10:44:05 +01:00
sqlite.h Use DataStream where possible 2023-01-26 10:44:05 +01:00
transaction.cpp Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
transaction.h Merge bitcoin/bitcoin#26499: wallet: Abandon descendants of orphaned coinbases 2023-01-30 10:09:41 +00:00
wallet.cpp Merge bitcoin/bitcoin#26595: wallet: be able to specify a wallet name and passphrase to migratewallet 2023-02-22 17:48:23 +00:00
wallet.h Merge bitcoin/bitcoin#26595: wallet: be able to specify a wallet name and passphrase to migratewallet 2023-02-22 17:48:23 +00:00
walletdb.cpp Use DataStream where possible 2023-01-26 10:44:05 +01:00
walletdb.h Use DataStream where possible 2023-01-26 10:44:05 +01:00
wallettool.cpp refactor: wallet, remove global 'ArgsManager' access 2023-02-15 15:49:45 -03:00
wallettool.h Add src/wallet/* code to wallet:: namespace 2022-01-06 22:14:16 -05:00
walletutil.cpp scripted-diff: Bump copyright headers 2022-12-24 23:49:50 +00:00
walletutil.h Implement LegacyScriptPubKeyMan::MigrateToDescriptor 2022-08-25 16:25:53 -04:00