Commit Graph

430 Commits

Author SHA1 Message Date
merge-script 8eacfd0191
Merge rust-bitcoin/rust-bitcoin#3557: Remove needless_borrows_for_generic_args
6aa8c2b023 Remove needless_borrows_for_generic_args (Tobin C. Harding)

Pull request description:

  This has been fixed and we use nightly to lint so we have access to the merged fix.

ACKs for top commit:
  apoelstra:
    ACK 6aa8c2b023619534437043e76ec4252f27295875; successfully ran local tests

Tree-SHA512: 011677b6c1a2dc6c63097cafd1682fab5d9bdd94133b872bdd49699a55c80a01a8e6e5e844ae1cfe1ca9da47a2ba2ed6b910719b1ccbb06e60e22ecb01ec0efc
2024-11-01 13:37:27 +00:00
merge-script 5ec0e5299b
Merge rust-bitcoin/rust-bitcoin#3377: Release tracking PR: `bitcoin_hashes 0.15.0`
80b5d8b7b3 hashes: Add changelog for release 0.15.0 (Tobin C. Harding)

Pull request description:

  The version has already been bumped on `master`.

  In preparation for releasing `hashes v0.15.0` add a changelog entry.

ACKs for top commit:
  apoelstra:
    ACK 80b5d8b7b36ea97007f062971a732ec8a512cfa5; successfully ran local tests; again lots of stuff!

Tree-SHA512: ab1bbdf7df819c587dc905e4cdcda2232ede2a495a0e395e5d6f6bd730a7c3c0675e05f8ab616e5e6dee0a87836ab486d025f80608e73b713007391711ef15ba
2024-11-01 12:22:57 +00:00
Tobin C. Harding 6aa8c2b023
Remove needless_borrows_for_generic_args
This has been fixed and we use nightly to lint so we have access to the
merged fix.

Removing the attribute uncovers a bunch of real lint warnings, fix
them while we are at it.
2024-11-01 14:30:45 +11:00
Tobin C. Harding 80b5d8b7b3
hashes: Add changelog for release 0.15.0
The version has already been bumped on `master`.

In preparation for releasing `hashes v0.15.0` add a changelog entry.
2024-10-31 17:14:26 +11:00
Leo Nash 7f289a9fdf Bump hex-conservative to 0.3.0 2024-10-31 03:36:22 +00:00
Tobin C. Harding e84346644e
Run the formatter
Run `just fmt` - no other changes.
2024-10-30 11:30:24 +11:00
Tobin C. Harding abcac54078
hashes: Move public macros
Put the two "real" public macros at the top of the `macros` file and add
a module level doc to link to them because they don't show up otherwise.
2024-10-30 07:10:37 +11:00
Tobin C. Harding 2868985a91
Replace TBD with next hashes release version
We are about to release `bitcoin_hashes 0.15.0`, replace the TBD string
with the version number.

Requires changing `allow(deprecated_in_future)` attribute to
`allow(deprecated)` (in functions that are them self deprecated).
2024-10-30 07:10:36 +11:00
Tobin C. Harding baab5e580d
hashes: Move private macro
We have two files one for public macros and one for private macros. Move
the `engine_input_impl` macro to the private macros file.

Requires change to call sites because we do not have `use_macros`
attribute on the `internal_macros` file.
2024-10-29 14:06:12 +11:00
Tobin C. Harding e4486d07f0
hashes: Hide macros from docs
These three macros are solely provided to reduce code duplication, they
are only part of the public API because they are used by the "real"
public macro `hash_newtype`.
2024-10-29 14:01:50 +11:00
Tobin C. Harding 25c4c78e26
hashes: Put attribute under rustdoc
Like we do for all the other macros ptu the `macro_export` attribute
below the macro comments.
2024-10-29 13:58:50 +11:00
Tobin C. Harding 5a736edaaa
hashes: Move serde_macros code into macros
Roll the `serde_macros` module into `macros`, requires making `macros`
public but since it explicitly holds public macros this is reasonable.

Keep the original module and deprecate it.
2024-10-27 07:07:01 +11:00
Tobin C. Harding aaa78a3a09
hashes: Rename util to macros
The `utils` module holds public macros, call it `macros` instead.
2024-10-27 07:03:50 +11:00
Tobin C. Harding 34e638d40c
hashes: Separate private and public modules
The private and public modules are already grouped, add a line of
whitespace to make it _even_ more clear. Trivial I know, this patch got
smaller during rebase.
2024-10-27 07:03:50 +11:00
Jamil Lambert, PhD b22db6268c
Remove unnecessary lifetimes 2024-10-24 14:08:20 +01:00
merge-script 456bbf11d1
Merge rust-bitcoin/rust-bitcoin#3505: CI: Hobble WASM job
5ec17a2ee8 CI: Hobble WASM job (Tobin C. Harding)

Pull request description:

  The WASM job is not working. `wasm-pack build` works fine but `wasm-pack test` doesn't compile.

  Comment out the line that runs `wasm-pack test`.

ACKs for top commit:
  apoelstra:
    ACK 5ec17a2ee8c963d182777a9661b1bab786956bd4; successfully ran local tests; LGTM

Tree-SHA512: 5ea88bd99f625a8c669dc1dec02486dd549e9ac83d7670c6c7b3b25c86de3fc9a8dbc959dc39de92305dd5e254e0b8ed9424cae5e5941b66a6476ee433009fdd
2024-10-23 19:16:40 +00:00
merge-script 79ff70255b
Merge rust-bitcoin/rust-bitcoin#3477: Polish the `hashes` crate
1cb24c1f15 hashes:: Polish crate level rustdocs (Tobin C. Harding)
98691186dc hashes: Move engine functions (Tobin C. Harding)
12f261c009 hashes: Re-order from_byte_array (Tobin C. Harding)
c11587d60d hashes: Rename hash_type macro (Tobin C. Harding)
62617cf9ac hashes: Move from_engine function to other macro (Tobin C. Harding)
bb7dd2c479 hashes: Move DISPLAY_BACKWARD to top of impl block (Tobin C. Harding)
71013afe07 hashes: Put attribute under doc (Tobin C. Harding)

Pull request description:

  `hashes 1.0.0` can't be far away, here is a quick polish (done while I waited for my car to get fixed).

  Everything here is internal except stuff to docs. Note please I claim "internal change only" in a bunch of patches that do code moves but these effect the docs build because order is preserved in some instances.

ACKs for top commit:
  apoelstra:
    ACK 1cb24c1f150bc2d65d0be439f2005f41d95ad23c; successfully ran local tests

Tree-SHA512: 430c451afab8fc92fb4596bf2d4b36c086333fe72b3fe5858925b75597641b8c4f5e49f7643888fa19b675d3070ce9a3606623cd56bdba6cfc59e459fbdda440
2024-10-22 22:24:49 +00:00
Tobin C. Harding 5ec17a2ee8
CI: Hobble WASM job
The WASM job is not working. `wasm-pack build` works fine but `wasm-pack
test` doesn't compile.

Comment out the line that runs `wasm-pack test`.
2024-10-23 06:59:51 +11:00
Tobin C. Harding 1cb24c1f15
hashes:: Polish crate level rustdocs
`hashes v1.0.0` is close, make an effort to polish the crate level rustdocs.
2024-10-16 12:26:14 +11:00
Tobin C. Harding 98691186dc
hashes: Move engine functions
The `sha256t` module is unique in that it implements its methods
manually (as call throughs) instead of using the macros. To make it more
clear what is implemented re-order the engine constructor and getter to
better mirror the layout in the macros.

Internal change only.
2024-10-16 12:22:42 +11:00
Tobin C. Harding 12f261c009
hashes: Re-order from_byte_array
The `hashes` crate has a bunch of similar types defined by a bunch of
similar macros and impl blocks, all of which makes it difficult to tell
exactly what is implemented where. In an effort to make the code easier
to read order the `from_byte_array` constructor in the same place across
the crate. Note also we typically put constructors up the top, also
`from_byte_array` is the likely most used constructor so put it first.

FWIW I discovered this while polishing the HTML docs.

Internal change only.
2024-10-16 12:22:42 +11:00
Tobin C. Harding c11587d60d
hashes: Rename hash_type macro
Conceptually (and using traits) we split the hashes into "general"
hash types and more restricted hash types (`Hash`). Also we observe that
the `hash_type` macro defines all the inherent functions name
identically to the `GeneralHash` trait methods.

Rename the trait to describe better what it does.

Internal change only.
2024-10-16 12:22:42 +11:00
Tobin C. Harding 62617cf9ac
hashes: Move from_engine function to other macro
The `from_engine` function is associated with a general hash type but we
are defining it in the `hash_type` macro which holds nothing but
functions associated with the `Hash` trait. By "associated" I mean
methods on the type as opposed to trait methods.

In preparation for re-naming the `hash_type` macro move the
`from_engine` function there. Requires duplicating the code in the
`siphash` impl block, this is as expected because the `siphash` requires
a custom implementation of the general hashing functionality.

Internal change only.
2024-10-16 12:22:22 +11:00
Tobin C. Harding bb7dd2c479
hashes: Move DISPLAY_BACKWARD to top of impl block
There is no obvious reason why this const is further down the block,
move it.

Refactor only, no logic change.
2024-10-16 11:59:13 +11:00
Tobin C. Harding 71013afe07
hashes: Put attribute under doc
As is typical round here, put the attribute under the associated
rustdoc.
2024-10-16 11:59:07 +11:00
Jamil Lambert, PhD 88b53a471e
Unify deprecated note field format
All the deprecated note fields have been changed to be lower case and in
the format "use `a` instead".
2024-10-15 15:16:01 +01:00
Tobin C. Harding e68da281ff
Warn on future deprecations
We use `TBD` in our `deprecated` string and it was discovered that there
is an exception on this string so as not to warn because it is used
internally by the Rust language. However there is a special lint to
enable warnings, lets use it.

Add `#![warn(deprecated_in_future)]` to the coding conventions section
of all crates except `fuzz`.
2024-10-15 07:56:06 +11:00
Tobin C. Harding 2cc944578d
Fully deprecate Hash::from_slice
We had an initial go at this but we didn't do the `Hash` trait method.
In order to do so we need to hack the serde code a fair bit, note the
public visitor types.
2024-10-15 07:56:05 +11:00
Fmt Bot f1733309e0 2024-10-13 automated rustfmt nightly 2024-10-13 01:20:28 +00:00
merge-script fe62d94ff7
Merge rust-bitcoin/rust-bitcoin#3296: Remove the `SliceIndex` implementation from hash types
3b7ba4f977 Remove the SliceIndex implementation from hash types (Tobin C. Harding)

Pull request description:

  If folk really want to index into a hash they can us `as_byte_array` then index that.

  Includes a bump to the version number of `hashes` to `v0.15.0` - this is because otherwise `secp` won't build since we are breaking an API that is used in the current release of secp.

  Fix: #3115

ACKs for top commit:
  apoelstra:
    ACK 3b7ba4f977 successfully ran local tests

Tree-SHA512: 0ba93268cd8133fe683183c5e39ab8b3bf25c15bfa5767d2934d67a5f6a0d2f65f6c9304952315fe8a33abfce488d810a8d28400a28facfb658879ed06acca63
2024-10-10 22:39:21 +00:00
Jamil Lambert, PhD 1f8fdc6ccb
Fix type used in bytes_hashed addition
`length` was changed to `bytes_hashed` and the type changed from `usize`
to `u64`.

The addition under the `hashes_fuzz` feature flag has been changed from
`usize` to `u64` to fix the fuzz error.
2024-10-09 16:19:07 +01:00
Jamil Lambert, PhD d37b8a5dd2
Fix HashEngine.length name change to bytes_hashed
When `hashes_fuzz` is on the field `length` is refered to but it was
changed to `bytes_hashed` in a previous PR.

This has been fixed by changing `length` to `bytes_hashed`.
2024-10-09 16:17:20 +01:00
Tobin C. Harding 3b7ba4f977
Remove the SliceIndex implementation from hash types
If folk really want to index into a hash they can us `as_byte_array`
then index that.

Includes a bump to the version number of `hashes` to `v0.15.0` - this
is because otherwise `secp` won't build since we are breaking an API
that is used in the current release of secp.

Fix: #3115
2024-10-02 10:18:45 +10:00
Tobin C. Harding fed94f8899
Bump version of bitcoin-io to 0.2.0
In preparation for releasing `io v0.2.0` bump the version number,
add a changelog entry, update the lock files, and depend on the new
version in all crates that depend on `io`.
2024-10-02 09:47:10 +10:00
merge-script 66d2c0214a
Merge rust-bitcoin/rust-bitcoin#3429: Rename Midstate::into_parts to Midstate::to_parts since it derives Copy
be94c9e54b Rename Midstate::into_parts to Midstate::to_parts since it derives Copy (Shing Him Ng)

Pull request description:

  This is a follow up to #3010

  Fixes #3079

ACKs for top commit:
  tcharding:
    ACK be94c9e54b
  apoelstra:
    ACK be94c9e54b successfully ran local tests

Tree-SHA512: 0d838a2064136d050d319116f6df3d598323b04a137e7bb7cb5f3f1a87d72ad1ee4d2f3b228a2f9d68e7ca117c0f922ef6551f783eb39c8db0db1188e4732c41
2024-10-01 16:03:53 +00:00
merge-script de120de5b9
Merge rust-bitcoin/rust-bitcoin#3410: Fix buggy cfg in rustdocs
8bb0d3f667 Fix buggy cfg in rustdocs (Tobin C. Harding)

Pull request description:

  In b9643bf3e9 we introduced an incorrect `cfg` attribute, that has just shown up, no clue why clippy only just presented me with this error now. Anywho, the current code is buggy and the rustdoc tests are never being run.

  Fix `cfg` attribute to use the feature name correctly and fix the imports so the code runs.

  Maintain the explicit `main` so that we can return an error using the `?` operator. Remove the empty `main` because its not needed anymore, it is a hang-over from Rust back in the day (before main was automatically added, IIUC).

ACKs for top commit:
  apoelstra:
    ACK 8bb0d3f667 successfully ran local tests

Tree-SHA512: 27f571ac3644417c06d0b4eb6fb122b39ac1068aefa4bcfc03f1febe2d031fb30616883c55c42c2ec80d419572fe7eba9bcc239e3c0e0e178ec7eaf8533b9efe
2024-10-01 14:37:29 +00:00
Tobin C. Harding 8bb0d3f667
Fix buggy cfg in rustdocs
In b9643bf3e9 we introduced an incorrect
`cfg` attribute, that has just shown up, no clue why clippy only just
presented me with this error now. Anywho, the current code is buggy and
the rustdoc tests are never being run.

Fix `cfg` attribute to use the feature name correctly and fix the
imports so the code runs.

Maintain the explicit `main` so that we can return an error using the
`?` operator. Remove the empty `main` because its not needed anymore,
it is a hang-over from Rust back in the day (before main was
automatically added, IIUC).
2024-10-01 08:37:22 +10:00
Shing Him Ng be94c9e54b Rename Midstate::into_parts to Midstate::to_parts since it derives Copy 2024-09-30 08:13:16 -05:00
Andrew Poelstra c2674caf4c
clippy: remove some newly-detected unnecessary returns 2024-09-30 12:31:17 +00:00
Fmt Bot a65d2a0ee4 2024-09-29 automated rustfmt nightly 2024-09-29 01:21:14 +00:00
merge-script d0fc012497
Merge rust-bitcoin/rust-bitcoin#3374: hashes: Remove unused file
8b9d657667 hashes: Remove unused file (Tobin C. Harding)

Pull request description:

  Recently we moved the tests from `impls` to `tests/io.rs` but forgot to delete the original file.

  Remove the already unused `impls.rs` file.

ACKs for top commit:
  apoelstra:
    ACK 8b9d657667 successfully ran local tests

Tree-SHA512: f701825239aff18faa0cd7adf69e1a8830dfb532df9d52c6d545e6352054ae6cb8c625c9fc05b7db374822d3478acf16858bc38ffbecf45575f555eb80f010e1
2024-09-25 13:30:06 +00:00
merge-script 40ba08f369
Merge rust-bitcoin/rust-bitcoin#3395: Remove schemars all together
58704c2eff Remove schemars all together (Tobin C. Harding)

Pull request description:

  We introduced schemars as a personal favor to a user, and it broke our CI repeatedly but eventually it seemed like it was stable (mainly, our MSRV caught up with its MSRV) so we just let it slide. In the end having schemars on hashes but nowhere else in the rust-bitcoin ecosystem did not prove that useful.

  Remove schemars all together.

  Fix: #3393

ACKs for top commit:
  apoelstra:
    ACK 58704c2eff successfully ran local tests

Tree-SHA512: 11c136797f28903c7d6b5199ad55d86bc4bc29ee8dd6f0d575e029f4dbebebabed57ebce6cf773b286297ea84f18d0b6cc58e150299e99457e048226478b49cc
2024-09-24 19:21:56 +00:00
merge-script 76ea4eb400
Merge rust-bitcoin/rust-bitcoin#3298: hashes: Rename length field and use u64
cbfddb0394 hashes: Rename length field and use u64 (Tobin C. Harding)

Pull request description:

  The hash engine types have a `length` field that is used to cache the number of bytes hashed so far, as such it is an arbitrary number and could use a `u64` instead of `usize`.

  While we are at it rename `length` to `bytes_hashed` to remove any ambiguity of what this field is. Note this field is private, we already have the public getter `n_bytes_hashes` to get the value.

  Introduce a private function `incomplete_block_size`, the purpose of this function is to put all the casts in one place so they can be well documented and easily understood.

  Fix: #3016

ACKs for top commit:
  apoelstra:
    ACK cbfddb0394 successfully ran local tests

Tree-SHA512: a9d932938afcbd6dfb9db471a02fa7e3fff8f0659906627001ad241390b9af57088fd34afeae551c70c2c49783e6296f110b57ff9de6fed2609f4648ec8fd934
2024-09-23 20:10:09 +00:00
Tobin C. Harding 58704c2eff
Remove schemars all together
We introduced schemars as a personal favor to a user, and it broke our
CI repeatedly but eventually it seemed like it was stable (mainly, our
MSRV caught up with its MSRV) so we just let it slide. In the end having
schemars on hashes but nowhere else in the rust-bitcoin ecosystem did
not prove that useful.

Remove schemars all together.

Fix: #3393
2024-09-23 06:57:00 +10:00
merge-script 855c4bb754
Merge rust-bitcoin/rust-bitcoin#3364: Remove unused inports, and fix unused variables and methods in docs
f6abdcc001 Allow unused in `macros.rs` docs (Jamil Lambert, PhD)
fd89ddf401 Remove or fix unused variables and methods in docs (Jamil Lambert, PhD)
ff6b1d4f19 Remove unused variables and methods from docs (Jamil Lambert, PhD)
e58cda6f92 Remove `unused_imports` in docs (Jamil Lambert, PhD)

Pull request description:

  As mentioned in #3362 examples in documentation are not linted in the same way as other code, but should still contain correctly written code.

  #![doc(test(attr(warn(unused))))] has been added to all lib.rs files

  In the docs throughout all crates:

  - Unused imports have been removed.

  - Unused variables, structs and enums have been used e.g. with an `assert_eq!` or prefixed with `_`

  - Unused methods have been called in the example code.

ACKs for top commit:
  tcharding:
    ACK f6abdcc001
  apoelstra:
    ACK f6abdcc001 successfully ran local tests

Tree-SHA512: c3de1775ecde6971056e9fed2c9fa1621785787a6a6ccbf3a6dbd11e18d42d4956949f3f8adfc75d94fd25db998b04adb1c346cc2c2ba47f4dc37402e1388277
2024-09-20 02:10:51 +00:00
Jamil Lambert, PhD fd89ddf401
Remove or fix unused variables and methods in docs
Examples in documentation are not linted in the same way as other code,
but should still contain correctly written code.

Throughout all of the crates except internals (another commit) unused
variables have been prefixed with `_`, unused imports have been removed,
and a warn attribute added to all of the `lib.rs` files.
2024-09-18 16:37:47 +01:00
merge-script a543b45df1
Merge rust-bitcoin/rust-bitcoin#3359: Use UFCS in macros
25d906d936 Use UFCS in macros (Liam Aharon)

Pull request description:

  Closes #3304

ACKs for top commit:
  apoelstra:
    ACK 25d906d936 successfully ran local tests
  tcharding:
    ACK 25d906d936

Tree-SHA512: a02a8507bcec73dab1ec8d49e45eab327d989c276d931520e0fff312faf7d3165292c300fb9414314f9b94b1255ee49a0fb64303df6d971c9089226b6873c36a
2024-09-18 13:35:56 +00:00
Tobin C. Harding 8b9d657667
hashes: Remove unused file
Recently we moved the tests from `impls` to `tests/io.rs` but forgot to
delete the original file.

Remove the already unused `impls.rs` file.
2024-09-18 09:13:49 +10:00
Fmt Bot 7990724ff4 2024-09-15 automated rustfmt nightly 2024-09-15 01:19:55 +00:00
Liam Aharon 25d906d936
Use UFCS in macros 2024-09-14 09:46:57 +02:00
Tobin C. Harding 6c0aaa0915
hashes: Put test function in a module
With a recent nightly toolchain `clippy` gives us an error:

  error: missing documentation for a constant

I'm not sure why the error is emitted but wrapping the function in a
`tests` module as is standard practice clears the error.
2024-09-12 15:28:41 +10:00
merge-script 0388930690
Merge rust-bitcoin/rust-bitcoin#3328: Add basic `miri` checks
bd8ad1f5e2 Add basic `miri` checks (Martin Habovstiak)
fb5971cc2b Fix UB in `siphash24` (Martin Habovstiak)

Pull request description:

  We have a bit of `unsafe` code in the crates which should really be checked with `miri`. Thus this adds a basic CI check that automatically determines which crates need `miri` checking and checks them. It also makes sure to enable all target features so that SIMD code can be checked as well.

  This doesn't try to do anything fancy with maintainer tools or run task for now, since I just want to test the basic idea.

  Closes #3192

ACKs for top commit:
  storopoli:
    ACK bd8ad1f5e2
  tcharding:
    ACK bd8ad1f5e2
  sanket1729:
    ACK bd8ad1f5e2
  apoelstra:
    ACK bd8ad1f5e2 successfully ran local tests; wow, good find!

Tree-SHA512: a0d33c7851d6d6b288ca8cc1a902f187814dd82e3528c6f8169fdc0ba71991b99451276aaba5e3b6cde6029e09158063d65e48a71d1e01ee20302b9f653584ef
2024-09-10 15:21:37 +00:00
merge-script 1aed58a6d6
Merge rust-bitcoin/rust-bitcoin#3128: hashes: Remove `io` feature
ae93e226e3 Remove hashes io feature (Tobin C. Harding)

Pull request description:

  Currently we only get `std::io::Write` impls when the `bitcoin-io` dependency is used. This is overly restrictive, it would be nice to have `std::io::Write` imlps even without the `bitcoin-io` dependency.

  Copy the logic out of the `bitcoin_io::impl_write` macro into `hashes` but feature gate it differently.

  Call the new macro inside `hash_type` (and in `hmac`), remove the `impls` module, and move the tests to the integration test directory.

  Remove the `io` feature from `hashes`, now if users enable `std` they get `std::io::Write` impls and if they enable `bitcoin-io` they get `bitcoin_io::Write` impls as well.

ACKs for top commit:
  Kixunil:
    ACK ae93e226e3
  apoelstra:
    ACK ae93e226e3 successfully ran local tests

Tree-SHA512: d47c9c060750e8a024c46cbf7afe8d0d1245fa1f5e575f36b3a11e2460d3620ad9def1a6331dafe77d46affc99b043ec9679e619ce8ddfa32436a5826ece09e4
2024-09-09 19:28:51 +00:00
merge-script 9797e50ab5
Merge rust-bitcoin/rust-bitcoin#3310: Shoosh linter in bench build
fe46225ed0 Allow unused imports when running bench code (Tobin C. Harding)
eb67e873e0 Allow unused variables in release mode (Tobin C. Harding)

Pull request description:

  Two patches to clear the million warnings when running the bench code.

ACKs for top commit:
  apoelstra:
    ACK fe46225ed0 successfully ran local tests; though in the first commit you could also use `cfg_attr` FWIW
  Kixunil:
    ACK fe46225ed0

Tree-SHA512: 3f705e0441d8c0e41e9ceb5473572810ff2513f7e5531c1b7889418a3a85ac8622e50e271c7a3b5c386fb3f5629b85d4bd79739c4a02b51d58da86890721d8d2
2024-09-09 17:56:45 +00:00
Tobin C. Harding cbfddb0394
hashes: Rename length field and use u64
The hash engine types have a `length` field that is used to cache the
number of bytes hashed so far, as such it is an arbitrary number and
could use a `u64` instead of `usize`.

While we are at it rename `length` to `bytes_hashed` to remove any
ambiguity of what this field is. Note this field is private, we already
have the public getter `n_bytes_hashes` to get the value.

Introduce a private function `incomplete_block_size`, the purpose of
this function is to put all the casts in one place so they can be well
documented and easily understood.

Fix: #3016
2024-09-09 14:46:38 +10:00
Tobin C. Harding ae93e226e3
Remove hashes io feature
Currently we only get `std::io::Write` impls when the `bitcoin-io`
dependency is used. This is overly restrictive, it would be nice to have
`std::io::Write` imlps even without the `bitcoin-io` dependency.

Copy the logic out of the `bitcoin_io::impl_write` macro into `hashes`
but feature gate it differently.

Call the new macro inside `hash_type` (and in `hmac`), remove the
`impls` module, and move the tests to the integration test directory.

Remove the `io` feature from `hashes`, now if users enable `std` they
get `std::io::Write` impls and if they enable `bitcoin-io` they get
`bitcoin_io::Write` impls as well.
2024-09-09 06:37:49 +10:00
Martin Habovstiak fb5971cc2b Fix UB in `siphash24`
The code in `siphash24` was obtaining the pointer in buffer at offset by
accessing an element at that offset instead of accessing a range or
simply computing the offset of the pointer from the start. This is UB
because one canot access past `T` even if the allocation is known to be
large enough. This change fixes it by using a range and also replaces
complicated code with simpler use of `from_le_bytes`.

It's quite likely that this can be improved further, possibly even
removing the `unsafe` without speed penalty but it's a larger task
that's not a priority right now.
2024-09-08 12:08:13 +02:00
Fmt Bot 9a5ba9b6df 2024-09-08 automated rustfmt nightly 2024-09-08 01:17:12 +00:00
merge-script 2c26dc4e57
Merge rust-bitcoin/rust-bitcoin#3314: hashes: Use $crate in internal macros
d72f730211 hashes: Use $crate in internal macros (Tobin C. Harding)

Pull request description:

  These are only called from within the crate but it is still more correct to use `$crate` and saves this from biting us later if we copy the code someplace else.

  Internal change only.

ACKs for top commit:
  Kixunil:
    ACK d72f730211
  apoelstra:
    ACK d72f730211 successfully ran local tests

Tree-SHA512: d278643c3fbeb28ca377ebf59958054dd2893c46b48469e03a8c7517c5b0b33271de061ae662c400d45962724fe4d13cada41fd5b839a1ff784521ac69c9db72
2024-09-07 13:40:04 +00:00
Jamil Lambert, PhD a20d0bc4eb
Deprecate `from_slice()` in sha256.rs
Support for Rust arrays is now much better so slice-accepting
methods that require a fixed length can be replaced with a method that
accepts an array.

`from_slice()` has been deprecated. A `from_byte_array()` function
already exists to be used instead.
2024-09-06 12:33:52 +01:00
Tobin C. Harding d72f730211
hashes: Use $crate in internal macros
These are only called from within the crate but it is still more correct
to use `$crate` and saves this from biting us later if we copy the code
someplace else.

Internal change only.
2024-09-06 09:20:10 +10:00
Tobin C. Harding fe46225ed0
Allow unused imports when running bench code
Running the bench code results in a million warnings, instead of
solving these just allow unused imports as we do for fuzz code.
2024-09-05 12:46:13 +10:00
merge-script 9233eb2fa3
Merge rust-bitcoin/rust-bitcoin#3275: Enforce that `Hash::Bytes` is an array
be13397570 Make hmac & hkdf more robust against buggy `Hash` (Martin Habovstiak)
94c0614bda Enforce that `Hash::Bytes` is an array (Martin Habovstiak)

Pull request description:

  This makes sure `Hash::Bytes` is an array. We've discussed this somewhere but I don't remember where.

  I'm not sure if the second commit is actually valuable but hopefully shouldn't make things worse.

ACKs for top commit:
  apoelstra:
    ACK be13397570 successfully ran local tests; yep, this looks like an improvement. Agreed that the second commit has questionable value but doe not make things worse
  tcharding:
    ACK be13397570

Tree-SHA512: 0fed982084f0f98927c2b4a275cec81cb4bbc0efbf01551a0a4a8b6b39a4504830243ee8d55a5c0418d81b5d4babc7b22332dbacc0609ced8fada84d2961ae71
2024-09-02 00:42:39 +00:00
Martin Habovstiak be13397570 Make hmac & hkdf more robust against buggy `Hash`
Use the newly added requirement that `Hash::Bytes` is an array to
protect the implementation of hmac and hkdf against implementations that
would accidentally return slices of different sizes from the `AsRef`
impl.
2024-08-30 06:20:30 +02:00
Martin Habovstiak 94c0614bda Enforce that `Hash::Bytes` is an array
In the future we would like to guarantee the correctness of `LEN` which
is currently not entirely possible, so this at least adds a sealed trait
enforcing the `Bytes` type to be an array. Consumers concerned about the
validity of the length can access the `LEN` constant on `Bytes` instead
to get the correct length of the array.
2024-08-30 06:16:44 +02:00
merge-script 0d9e8f8c99
Merge rust-bitcoin/rust-bitcoin#3204: Do many cleanups (and bug fix)
dae42bef9d do not enable bitcoin-io by default (Antoni Spaanderman)
a14cdaf859 don't enable std by default when testing (Antoni Spaanderman)
e83830dcfc use slice instead of array to not have to hardcode the length (Antoni Spaanderman)
55749d6f61 use `hash.to_byte_array` to check equality with `test.output` (Antoni Spaanderman)
969864e3b0 use fixed size array if possible, otherwise `&'static [u8]` (Antoni Spaanderman)
28ccf70fa6 remove unnecesarry borrow operator (`&`) (Antoni Spaanderman)
fa3a3afd02 remove unnecessary slicing (Antoni Spaanderman)
22e42ab86c fix test code being unnecessarily feature gated (Antoni Spaanderman)

Pull request description:

  - remove 2 unnecessary cfg attributes from tests left over from  #3167 (it made them not dependent on `alloc` anymore)
  - simplify assertion logic by removing unnecessary conversions before comparing
  - make tests `no_std` compatible by adding imports to alloc or std
  - feature gate tests behind the `alloc` feature if they use anything from the alloc crate (like the `format!` macro)
  - `schemars` feature enables `alloc` because (for example) its trait wants implementations to return `String`
  - fix `bitcoin-io` always enabling when `std` is enabled (only useful if people depend on `hashes` only, `bitcoin` depends on `bitcoin-io` already)

ACKs for top commit:
  tcharding:
    ACK dae42bef9d
  Kixunil:
    ACK dae42bef9d
  apoelstra:
    ACK dae42bef9d successfully ran local tests

Tree-SHA512: 622fd4963ef21530a98af89bcfc71abe8723aac12d363ab88d9bd30dcf2f75392711bec10e2901fab5f1a30e11897d1aae36e22892738aa1e5670166f91fddd4
2024-08-29 21:20:10 +00:00
Jamil Lambert, PhD a76d76eca1
Change `T::from_str(s)` to `s.parse::<T>()`
`s.parse` is more idiomatic and produces more helpful error messages.

This has been changed repo wide in the main codebase, not including
examples, rustdocs, and in the test module.

`use std::str::FromStr;` has been removed where this change makes
it unnecessary.
2024-08-27 17:31:00 +01:00
Antoni Spaanderman dae42bef9d
do not enable bitcoin-io by default 2024-08-26 21:45:18 +02:00
Antoni Spaanderman a14cdaf859
don't enable std by default when testing
- make tests no_std compatible by adding imports to alloc or std
- feature gate tests behind the 'alloc' feature if they use anything
  from 'alloc' (like the `format!` macro)
- schemars feature enables alloc
2024-08-26 21:08:23 +02:00
Antoni Spaanderman 55749d6f61
use `hash.to_byte_array` to check equality with `test.output`
Tests in 'hashes' used various ways to do this that looked different but
did the same.
2024-08-26 17:22:09 +02:00
Antoni Spaanderman 969864e3b0
use fixed size array if possible, otherwise `&'static [u8]`
(or `&'static str`)
This test is now consistent with other tests.
2024-08-26 17:22:08 +02:00
Antoni Spaanderman 28ccf70fa6
remove unnecesarry borrow operator (`&`)
`assert_eq!` already borrows the arguments, so this is redundant.
2024-08-26 17:22:08 +02:00
Antoni Spaanderman fa3a3afd02
remove unnecessary slicing
This was needed in older versions of Rust that are not supported
anymore by this crate.
2024-08-26 17:22:08 +02:00
Antoni Spaanderman 22e42ab86c
fix test code being unnecessarily feature gated
These cfg attributes were here because these tests used the `vec!` macro
in the past.
2024-08-26 17:21:48 +02:00
Fmt Bot fbf7f41875 2024-08-25 automated rustfmt nightly 2024-08-25 01:14:09 +00:00
merge-script 6f335b011c
Merge rust-bitcoin/rust-bitcoin#3223: Use TBD in deprecated attribute
a2be82c0c9 Use TBD in deprecated attribute (Tobin C. Harding)

Pull request description:

  Our `release` job checks for 'TBD', I can't remember exactly why but I thought we introduced `0.0.0-NEXT-RELEASE` because CI was failing when we used TBD - clearly this is not the case now because we have a bunch of `TBD`s in the code base.

  Change all the instances of `0.0.0-NEXT-RELEASE` to be `TBD`.

ACKs for top commit:
  Kixunil:
    ACK a2be82c0c9
  apoelstra:
    ACK a2be82c0c9 successfully ran local tests

Tree-SHA512: b383cc4095484291a7b4dca593ad5e017e3a9de9bfae9d6e9447ae36da32aa1c0d1fd593f49fd52c04db5ca5cdbaae8b30a772f792df13542f0a157a86295746
2024-08-24 02:55:37 +00:00
Tobin C. Harding a2be82c0c9
Use TBD in deprecated attribute
Our `release` job checks for 'TBD', I can't remember exactly why but I
thought we introduced `0.0.0-NEXT-RELEASE` because CI was failing when
we used TBD - clearly this is not the case now because we have a bunch
of `TBD`s in the code base.

Change all the instances of `0.0.0-NEXT-RELEASE` to be `TBD`.
2024-08-23 14:49:57 +10:00
Martin Habovstiak 6e5bd473a6 Improve siphash's `as_u64` -> `to_u64` rename
The previous change was just a dumb rename with no deprecation and it
also kept the `self` type which should be taken by value since the hash
is `Copy`. This improves on it by adding a deprecated method of the
original name and changing the type to be `self` instead of `&self`.
2024-08-23 05:54:41 +02:00
Martin Habovstiak 1a91492204 Clean up the siphash mess
Previously we had removed `Default` impl on `siphash24::HashEngine` by
reimplementing the type manually. This was a really bad idea as it
inevitably led to API differences that broke the build which we didn't
notice because of unrelated bug. It should've just split the macro from
the start as was suggested but it was claimed to be difficult, I don't
think was the case as can be seen by this PR.

This commit does what the previous one should've done: it renames the
macro to have `_no_default` suffix, creates another one of the original
name that calls into `_no_default` one and moves anything related to
`Default`. This cleanly ensures all previous hashes stay the same while
siphash gets `Default` removed. This also removes all now-conflicting
impls from `siphash24` module which makes the module almost identical to
what it looked like before the change. The only differences are removed
`Default`/`new`, fixes in tests and recent rename of `as_u64` to
`to_u64`.
2024-08-23 05:54:41 +02:00
merge-script 722a7239df
Merge rust-bitcoin/rust-bitcoin#3214: Panic in const context
60b3cabb41 Panic in const context (Tobin C. Harding)

Pull request description:

  Now that our MSRV is past 1.57 we can panic in const contexts.

  Fix: #2427

ACKs for top commit:
  Kixunil:
    ACK 60b3cabb41
  apoelstra:
    ACK 60b3cabb41 successfully ran local tests

Tree-SHA512: 705a8b7d52a11826e6084684706cb7e01dfaa554e4e369739e64e64263537b0c8c0e518b04e96249ecdeea1f22b534594ffd2a89e17ebba85b369d896e820239
2024-08-22 16:32:12 +00:00
merge-script 8f851967a2
Merge rust-bitcoin/rust-bitcoin#3184: Reduce API surface of tagged wrapped hash types
c97389596b Remove stale docs from sha256t_hash_newtype (Tobin C. Harding)
39f7dcb816 Reduce API surface of tagged wrapped hash types (Tobin C. Harding)

Pull request description:

  Recently we made it so that wrapper types created with `hash_newtype` were not general purpose hash types i.e., one could not easily hash arbitrary data into them. We would like to do the same for tagged wrapped hash types.

  In `hashes` do:

  - Create a new macro `sha256_tag` that does just the tag/engine stuff out of the `sha256t_hash_newtype` macro.
  - Deprecate the `sha256t_hash_newtype` macro.

  In `bitcoin` do:

  - Use a combination of `sha256_tag` and `hash_newtype` to create tagged wrapped hash types.

  Note that we do not add private helper functions `engine` and `from_engine` to the tagged wrapper types as we do for legacy/segwit in `sighash`. Can be done later if wanted/needed.

  Fix: #3135

ACKs for top commit:
  Kixunil:
    ACK c97389596b
  apoelstra:
    ACK c97389596b successfully ran local tests

Tree-SHA512: d937a8eac1a77298231f946f9dfbc2f7739af8da00f2075b0b54803b4111c0cec810bc6564515153769193056cf102a9c954e216664f055b249d4a6153b14bca
2024-08-22 14:42:58 +00:00
Tobin C. Harding 60b3cabb41
Panic in const context
Now that our MSRV is past 1.57 we can panic in const contexts.

Fix: #2427
2024-08-22 17:37:17 +10:00
Tobin C. Harding c97389596b
Remove stale docs from sha256t_hash_newtype
We removed the repetition a while ago from the macro but left the docs
in there - remove them.
2024-08-22 16:31:58 +10:00
Tobin C. Harding 39f7dcb816
Reduce API surface of tagged wrapped hash types
Recently we made it so that wrapper types created with `hash_newtype`
were not general purpose hash types i.e., one could not easily hash
arbitrary data into them. We would like to do the same for tagged
wrapped hash types.

In `hashes` do:

- Create a new macro `sha256t_tag` that does just the tag/engine stuff
out of the `sha256t_hash_newtype` macro.
- Deprecate the `sha256t_hash_newtype` macro.

In `bitcoin` do:

- Use a combination of `sha256t_tag` and `hash_newtype` to create tagged
wrapped hash types.

Note that we do not add private helper functions `engine` and
`from_engine` to the tagged wrapper types as we do for legacy/segwit in
`sighash`. Can be done later if wanted/needed.
2024-08-22 10:07:58 +10:00
Tobin C. Harding aed61bd2d4
Implement FromStr and serde impls for siphash
The `serde` impls and `FromStr` are missing from `siphash`, add them.
2024-08-21 16:00:13 +10:00
Tobin C. Harding f8846101ae
siphash: Make functions inherent
In recent work making functions on hash types inherent it seems we
missed `siphash`. Add inherent getters/setters to the `siphash::Hash`
type and call through to them from the `Hash` trait impl.
2024-08-21 16:00:13 +10:00
Tobin C. Harding 321d82ca53
hashes: Pin in extra_test
Note:

- The `extra_test.sh` script runs for all toolchains.
- The `schemars` crate does not use the repo lock files.
- We need to pin some deps when building the `schemars` test.

Pin in the `extra_test.sh` script, and mention it in the docs so the
docs don't go stale next MSRV update.

This was previously unnoticed because of the `run_task` bug.

ref: rust-bitcoin/rust-bitcoin-maintainer-tools#10
2024-08-21 15:31:28 +10:00
Tobin C. Harding 42c7617a46
Fix shchemars test
In #3010 we added a `length` field to the `sha256::Midstate` which broke
the `schemars` test but we did not notice because of the current bug [0]
in the `run_task` CI script.

[0] https://github.com/rust-bitcoin/rust-bitcoin-maintainer-tools/issues/10
2024-08-21 15:31:28 +10:00
Tobin C. Harding b6fda6517c
Implement JsonSchema for siphash::Hash
We lost this impl at some stage in the last few weeks and did not notice
because of a bug in `run_task` [0].

Implement `JsonSchema` for `siphash` as we do for all the other hash
types.

[0] https://github.com/rust-bitcoin/rust-bitcoin-maintainer-tools/issues/10
2024-08-21 15:31:28 +10:00
Tobin C. Harding 1af6ff4394
hashes: Feature gate hash_reader unit test
The `hash_reader` function is only available when `bitcoin-io` is
enabled - it should be feature gated.
2024-08-21 15:31:28 +10:00
Tobin C. Harding 5230d3309c
Remove hash_reader from sha256t_hash_newtype
The `hash_reader` function is new and unreleased, it should never have
been put into the `sha256t_hash_newtype` macro, and its broken.
2024-08-21 15:31:28 +10:00
leichak 2756b7fd7a Removed unneeded usages of vec! macro 2024-08-19 10:12:09 +02:00
Tobin C. Harding 191897f9ea
Manually format
Run `rustfmt` and manually fix the places where comments are moved to
the wrong place.
2024-08-08 09:38:45 +10:00
merge-script 50e3465bde
Merge rust-bitcoin/rust-bitcoin#3129: hashes:: Rename const_hash functions
e7762e0612 hashes:: Rename const_hash functions (Tobin C. Harding)

Pull request description:

  There are a number of issues with the two `const_hash` functions in the `sha256` module:

  - The two `const_hash` functions in the `sha256` module differ slightly, one finalizes the hash and one is for computing the midstate.
  - They are inefficient and provided for usage for const context only.

  Fix both issues by renaming the functions as discussed in #3075.

  Close: #3075

ACKs for top commit:
  Kixunil:
    ACK e7762e0612
  apoelstra:
    ACK e7762e0612 successfully ran local tests

Tree-SHA512: 2b765bbbaa596d060a555495582b24175f660bf630de489cf0e0199f1c589f13f46dde5c9735bffece10a1ff116a70472f821df66c62a97fffb424f16e5568f9
2024-08-06 19:15:46 +00:00
merge-script 075ab9d3e0
Merge rust-bitcoin/rust-bitcoin#3127: hashes: Call through to trait methods
975f22f399 hashes: Call through to trait methods (Tobin C. Harding)

Pull request description:

  Currently we have duplicate code in inherent functions that also occurs in the default implementation of the `GeneralHash` trait methods, this is unnecessary because we can call through to the trait methods.

ACKs for top commit:
  Kixunil:
    ACK 975f22f399
  apoelstra:
    ACK 975f22f399 successfully ran local tests

Tree-SHA512: 74d8905a20d75536abf477dd2226e3cb12d8bd7330b1769e520840df1538362c6cbec6a976dfeb771797732b1f9259ee4f1970cadb69eca67b8b9bbe956ceeca
2024-08-06 16:58:59 +00:00
Tobin C. Harding e7762e0612
hashes:: Rename const_hash functions
There are a number of issues with the two `const_hash` functions in the
`sha256` module:

- The two `const_hash` functions in the `sha256` module differ slightly,
  one finalizes the hash and one is for computing the midstate.
- They are inefficient and provided for usage for const context only.

Fix both issues by renaming the functions as discussed in #3075.

Close: #3075
2024-08-06 12:27:15 +10:00
Tobin C. Harding 0a045d87ea
hashes: Add a new hash_reader function
Add a function `hash_reader` that uses the `BufRead` trait to read
bytes directly into the hash engine.

Add the functionality to:

- as a trait method in the `GeneralHash` trait with default implementation
- as inherent functions to all the hash types

Close: #3050
2024-08-06 10:38:57 +10:00
Tobin C. Harding 975f22f399
hashes: Call through to trait methods
Currently we have duplicate code in inherent functions that also occurs
in the default implementation of the `GeneralHash` trait methods, this
is unnecessary because we can call through to the trait methods.
2024-08-06 10:28:03 +10:00
Shing Him Ng 5a91719755 Rename Siphash::as_u64 to Siphash::to_u64 2024-08-02 18:20:23 -05:00
Nick Johnson 2969b032f9 Push up the Default bound on HashEngine
* The Default bound only makes sense for unkeyed hash functions which
can fire up a new engine without a key. Keyed hash functions, like
SipHash24 or Poly1305 require a secret key to be initialized and
should not implement a default engine generator.
* SipHash24 tests updated to the previous default key "0".
2024-07-31 13:13:51 -07:00
merge-script 15b87606bf
Merge rust-bitcoin/rust-bitcoin#3100: Bump MSRV to 1.63
c72069e921 Bump MSRV to 1.63 (Martin Habovstiak)

Pull request description:

  The version 1.63 satisfies our requirements for MSRV and provides significant benefits so this commit bumps it. This commit also starts using some advantages of the new MSRV, namely namespaced features, weak dependencies and the ability to use trait bounds in `const` context.

  This however does not yet migrade the `rand-std` feature because that requires a release of `secp256k1` with the same kind of change - bumping MSRV to 1.63 and removing `rand-std` in favor of weak dependency. (Accompanying PR to secp256k1: https://github.com/rust-bitcoin/rust-secp256k1/pull/709 )

  Suggested plan:

  * merge both PRs
  * at some point release `hashes` and `secp256k`
  * remove `rand-std` from `bitcoin`
  * release the rest of the crates

ACKs for top commit:
  apoelstra:
    ACK c72069e921
  tcharding:
    ACK c72069e921

Tree-SHA512: 0b301ef8145f01967318d3ed1c738d33e6cf9e44f835f3762122b460a536f926916dbd6ea39d6f80b4f95402cd845e924401e75427dbb0731ca5b12b4fa6915e
2024-07-28 21:11:28 +00:00
Martin Habovstiak c72069e921 Bump MSRV to 1.63
The version 1.63 satisfies our requirements for MSRV and provides
significant benefits so this commit bumps it. This commit also starts
using some advantages of the new MSRV, namely namespaced features, weak
dependencies and the ability to use trait bounds in `const` context.

This however does not yet migrade the `rand-std` feature because that
requires a release of `secp256k1` with the same kind of change - bumping
MSRV to 1.63 and removing `rand-std` in favor of weak dependency.
2024-07-27 07:24:32 +02:00
Tobin C. Harding 98fe6179db
Use "unfinalized" in header of Midstate
The midstate has not been finalized [0], so use the term in the struct
header.

FTR I don't know _exactly_ what "finalized" means in the context of
sha256 hashing (or hashing in general). This change came from a review
suggestion and we have other mentions of "finalized" in the code.
2024-07-18 06:16:46 +10:00
Tobin C. Harding 86de586898
Use const to construct Midstate
As a bit more of an example of how to use the `sha256::Midstate` use a
`static` in one of the unit tests.
2024-07-18 06:16:46 +10:00
Tobin C. Harding dcb18bfa7a
Add length to sha256::Midstate
In a `HashEngine` the `length` field represents number of bytes
input into the hash engine.

Note also:

> the midstate bytes are only updated when the compression function is
run, which only happens every 64 bytes.

Currently our midstate API allows extracting the midstate after any
amount of input bytes, this is probably not what users want.

Note also that most users should not be using the midstate API anyways.

With all this in mind, add a private `length` field to the `Midstate`
struct and enforce an invariant that it is modulo 64.

Add a single const `Midstate` constructor that panics if the invariant
is violated. The `Midstate` is niche enough that panic is acceptable.

Remove the `from_slice`, `from_byte_array`, and `to_byte_array`
functions because they no longer make sense. Keep `AsRef<[u8]>` for
cheap access to the midstate's inner byte slice.

Note change to `Debug`: `bytes` field now does not include the `0x`
prefix because `as_hex` because of the use of `debug_struct`.

Enjoy nice warm fuzzy feeling from hacking on crypto code.
2024-07-18 06:16:45 +10:00
Tobin C. Harding db0502d3cd
Use third person in rustdoc
As is convention in this repo use the third person when describing the
`sha256::HashEngine::from_midstate` function.
2024-07-18 06:13:26 +10:00
Tobin C. Harding 34dd95f909
Debug Midstate forwards
Done in preparation for adding a `length` field to `Midstate` and also
in preparation for removing the `Display` implementation (will be
justified in the patch that does it).

Currently in the `Debug` impl of `Midstate` we are calling through to
`Display` using the alternate form of printing, we can use `as_hex` to
achieve almost the same thing. Note that in `LowerHex` we use the
`fmt_hex_exact` macro that allows us to reverse the iterator however
when we later attempt to use `f.debug_struct` we cannot use the macro.

Elect to change the current behaviour to `Debug` forwards, shown by the
change to the regression test.
2024-07-18 06:13:24 +10:00
Tobin C. Harding 1d0e70b1da
Add regression test for Midstate debug output
In preparation for patching the `Debug` implementation of `Midstate` and
a regression test.
2024-07-18 06:12:53 +10:00
Tobin C. Harding ca823945fc
Manually implement AsRef (remove Borrow)
Currently we are using a macro to implement `AsRef` and `Borrow` for
`sha256::Midstate`.

In preparation for adding a length field to the `Midstate` remove the
implementation of `Borrow` but keep `AsRef`.

API breaking change.
2024-07-17 08:47:38 +10:00
Tobin C. Harding 7dc68b62e9
Remove serde from sha256::Midstate
The `sha256::Midstate` is a niche use case type, there is no real reason
we need to support serialization/deserialization. If people really want
this they can just get the byte array and serialize it themselves.

API breaking change.
2024-07-17 08:47:38 +10:00
Tobin C. Harding 07e8e5d3a6
Stop using macro for Midstate
In preparation for changing the `sha256::Midstate` internals stop using
the `arr_newtype_fmt_impl` macro and implement the `fmt` traits
manually.

In doing so, remove the `DISPLAY_BACKWARDS` const but keep the current
behaviour of displaying the midstate backwards.
2024-07-17 08:47:38 +10:00
Tobin C. Harding 37b54dd54c
Move from_midstate function
Move the `sha256::HashEngine::from_midstate` function to be in the same
impl block as `midstate`.

Refactor only, no logic change.
2024-07-17 08:47:38 +10:00
Tobin C. Harding 9efe4cea9d
Move impl block under struct
Put the impl block for `Midstate` under the struct, as is customary.

(Note the diff shows moving some other code around the impl block not
the impl block itself.)

Code move only.
2024-07-17 08:47:38 +10:00
Tobin C. Harding 5941008733
Import sha256t in docs builds
Explicitly import `sha256t` in docs builds and remove explicit link
target. This patch is code churn on its own but the `sha256t` module
will be used again in proceeding patches, done separately to reduce the
size/complexity of proceeding patches.
2024-07-17 08:47:37 +10:00
merge-script 8eb5d8fad0
Merge rust-bitcoin/rust-bitcoin#3019: Fix error messages
2169b75bba Use lower case error messages (Jamil Lambert, PhD)

Pull request description:

  Error messages should be lower case, except for proper nouns and variable names.  These have all been changed.

  ~~They should also state what went wrong.  Some expect error messages were positive, giving the correct behaviour or correct input.  These have been changed so that they are now negative, i.e. saying what went wrong.~~

  EDIT: After further discussion it was decided not to change the expect messages.

ACKs for top commit:
  Kixunil:
    ACK 2169b75bba
  tcharding:
    ACK 2169b75bba

Tree-SHA512: 92442c869e0141532425f6fca5195fd319b65026f68c4230a65ad70253565d98931b2b44ee202975c307280525c505147e272297dc81207312e40c43d007021c
2024-07-16 15:30:26 +00:00
merge-script c50796c238
Merge rust-bitcoin/rust-bitcoin#2981: Remove to/from/as_raw_hash functions
2b56f763d0 hashes: Remove to/from/as_raw_hash (Tobin C. Harding)

Pull request description:

  In an effort to shrink the API of `hashes` remove the `from_raw_hash`, `to_raw_hash`, and `as_raw_hash` inherent functions from types created with the `hash_newtype` macro.

  There are a few reasons why this is favourable:

  - It allows stable crates to use the macro and not expose unstable `hashes` types in their API.
  - It makes types created with the macro less "general" in the sense that its more obscure to just hash any data into them. This allows us to write cleaner APIs in `rust-bitcoin`.

ACKs for top commit:
  Kixunil:
    ACK 2b56f763d0
  apoelstra:
    ACK 2b56f763d0

Tree-SHA512: 3d73aa8250dd775994623c9201dd819256acf2ec82526b3537da74c9e19c2ac5e8bba358a2171f7b02342804cb6b4d5ac4dca88d912b3d46d14e3bc35dd5cb91
2024-07-15 13:53:37 +00:00
Jamil Lambert, PhD 2169b75bba Use lower case error messages
Error messages should start with a lower case character unless it is a
proper noun.

This has been changed everywhere.
2024-07-15 09:25:08 +01:00
Tobin C. Harding 2b56f763d0
hashes: Remove to/from/as_raw_hash
In an effort to shrink the API of `hashes` remove the `from_raw_hash`,
`to_raw_hash`, and `as_raw_hash` inherent functions from types created
with the `hash_newtype` macro.

There are a few reasons why this is favourable:

- It allows stable crates to use the macro and not expose unstable
`hashes` types in their API.
- It makes types created with the macro less "general" in the sense that
its more obscure to just hash any data into them. This allows us to
write cleaner APIs in `rust-bitcoin`.
2024-07-14 05:03:36 +10:00
Tobin C. Harding 8dcecfc144
Remove midstate from the GeneralHash and HashEngine traits
Midstates are not generic objects; they don't have universal
cryptographic properties and if you are using them you should be using a
specific midstate type. Therefore it shouldn't be part of `GeneralHash` or
`HashEngine`. Furthermore, in practice it seems like `sha2` midstates are
the only ones that anybody uses, at least in bitcoin.

Remove the midstate stuff from the `GeneralHash` and `HashEngine`
traits. Keep the `midstate` functionality as inherent functions if it is
used internally. Keep the functionality on `sha256` as inherent public
functions.
2024-07-13 07:59:33 +10:00
Tobin C. Harding 360d1fb1bb
hashes: Use $crate in macro
Depending on types being in scope when calling macros is bad practice
but we have mistakenly done so in `internal_macros` when using the
`FromSliceError`.

Use `$crate::FromSliceError` in the macro and remove import statements.
2024-07-12 12:55:22 +10:00
Tobin C. Harding 51010777bf
hashes: Strongly type the hash160::HashEngine
Currently we are using a type alias for the `hash160::HashEngine`.

Type alias' allow for potential mixing of types, a `hash160::HashEngine`
struct can better serve our users with not much additional complexity or
maintenance burden.

As we did for the `sha256d::HashEngine`, add a new wrapper type
`hash160::HashEngine` that replaces the current type alias.
2024-07-09 13:30:20 +10:00
Tobin C. Harding d5dd54a489
hashes: Strongly type the sha256d::HashEngine
Currently we are using a type alias for the `sha256d::HashEngine`.

Type alias' allow for potential mixing of types, a `sha256d::HashEngine`
struct can better serve our users with not much additional complexity or
maintenance burden.
2024-07-09 13:21:11 +10:00
Tobin C. Harding a7422a779c
hashes: Add const hash engine constructors
Add `const` constructors to all hash engines. Call through to
`Self::new` in `default` impls on `HashEngine`.
2024-07-09 13:17:16 +10:00
Fmt Bot 91382977fb 2024-07-07 automated rustfmt nightly 2024-07-07 01:10:59 +00:00
merge-script 96dffb2152
Merge rust-bitcoin/rust-bitcoin#2939: Automated nightly rustfmt (2024-06-30)
19b093080b 2024-06-30 automated rustfmt nightly (Fmt Bot)

Pull request description:

  Automated nightly `rustfmt` changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action

ACKs for top commit:
  apoelstra:
    ACK 19b093080b

Tree-SHA512: 50d905ab4823e5e746751c0aacd145fc5640c9cb250d99bcd44800c72a890562c0014a9eee21602198388dee7bd9354ff764bab5616aac82bf7660669f8c2ee1
2024-06-30 12:09:40 +00:00
Fmt Bot 19b093080b 2024-06-30 automated rustfmt nightly 2024-06-30 01:10:26 +00:00
Jamil Lambert, PhD d099b9c195 Remove wildcard from prelude import
Wildcards have been replaced with what is actually used.

In a couple of cases an additional use statement was added to the test
module to import `DisplayHex` which is only used in test, but
previously imported with the wildcard at the top.
2024-06-28 08:02:43 +01:00
merge-script 0f3a9969fd
Merge rust-bitcoin/rust-bitcoin#2915: Clean up manifests
bc25ed35d5 Order serde feature list alphabetically (Tobin C. Harding)
5bd3387c15 Move package metadata to be underneath package section (Tobin C. Harding)
a2a9f193fe Put workspace crates in alphabetical order (Tobin C. Harding)
05931cc0fa Run the formatter (Tobin C. Harding)

Pull request description:

  We are getting an increasing number of crates in the repo, clean up the manifests a bit in an endevour to help keep things manageable.

  All  patches are trivial and the PR makes no logic changes.

ACKs for top commit:
  Kixunil:
    ACK bc25ed35d5
  apoelstra:
    ACK bc25ed35d5

Tree-SHA512: a9850449a6f71ac5d53f501e36175e900bf4986f44c7636d3b1b55df80804b92bb10d8da7798f6bb866722aa2354ad2880ab5c0f5c4633f198c137d2ca42b7c9
2024-06-27 14:30:18 +00:00
Tobin C. Harding 264d080054
hashes: Add hash type alias'
In an effort to make the `hashes` crate more  ergonomic to use add a
bunch of alias' to the crate root - use re-exports where possible and
type alias' where required.

We intentionally do not rename the `foo::Hash` types so that uses have a
choice of either using the module path to differentiate or to use the
alias.

Update the crate level docs to use the alias' because they are more
terse with no loss of clarity.
2024-06-26 15:06:22 +10:00
Tobin C. Harding d2632d3d8a
hashes: Re-export Hkdf
Re-export `Hkdf` from the crate root. While we are at it group the
re-exports and skip formatting as is convention around here.
2024-06-26 15:00:56 +10:00
Tobin C. Harding 5bd3387c15
Move package metadata to be underneath package section
The package metatadata never changes and is not necessary to look at
basically ever, put it down the bottom of the manifest out of the way.

Helps to keep features and dependencies closer together.

Refactor only, no logic changes.
2024-06-25 10:02:27 +10:00
Andrew Poelstra 91265977f8
hashes: stop exposing engine/from_engine and general hashing methods in hash_newtype
We manually implement these methods (and the GeneralHash trait) on newtypes
around sha256t::Hash, because tagged hashes require a bit more work. In
the next commit (API diff) you will see that this affects two hashes,
which are the only things that appear green in the diff.

Users who want to implement their own engine/from_engine types now need
to do it on their own. We do this for the non-Taproot sighash types in
`bitcoin` (though only privately) to demonstrate that it's possible.
2024-06-24 13:58:05 +00:00
Andrew Poelstra 0aa539f836
hashes: remove engine/from_engine from embedded test
This commit illustrates the transformation I intend to make everywhere
we use newtyped hashes as "general hashes". *Within the module that the
newtype is defined* I encapsulate engine calls, which I do by calling
engine methods on the underlying general hash function. So within the
module there is a slight reduction in type safety, in the sense that I
need to make sure that I'm wrapping stuff properly.

But outside of the module, there will be no difference except that I
will no longer export engine/from_engine/hash/etc on newtyped hashes.
Instead callers will need to compute the newtyped hash only in ways
supported by the API.

In theory we could have a macro to produce engine/from_engine/etc for
newtypes that want to act as general hashes. But AFAICT there is no use
case for this.

Alternately, we could have a macro that produces *private* Engine types
and private engine/from_engine/etc methods for the hashes, which could
be used within the module and would provide stronger type safety within
the module. But in practice, raw hashing is usually only used within a
couple of methods, so all this infrastructure is way overkill and will
just make maintenance harder for everybody.
2024-06-24 13:51:23 +00:00
Andrew Poelstra 73dcc79763
hashes: split Hash trait into two 2024-06-24 13:28:54 +00:00
Andrew Poelstra 1fe4c63986
hashes: remove unused Hash import in embedded test 2024-06-24 13:28:54 +00:00
Andrew Poelstra 8869f35a69
hashes: drop the `all_zeros` method on arbitrary hashes
Manually implement it for Wtxid, Txid and BlockHash, where the all-zero
"hash" has a consensus meaning. But in general we should not be
implementing this method unless we have a good reason to do so. It can
be emulated or implemeted in terms of from_byte_array.

The use of Wtxid::all_zeros is obscure and specific enough that I am
tempted to drop it. But for txid and blockhash, the 0 hash appears in
actual blockdata and we should keep it.

All other uses of all_zeros were either in test code or in places where
the specific hash was not important and [u8; 32] was a more appropriate
type.
2024-06-22 15:09:28 +00:00
Andrew Poelstra 154e91af8c
hashes: constify a bunch of constructors 2024-06-22 15:08:15 +00:00
Andrew Poelstra c155cbf8b2
hashes: use workaround to get constfns on tagged hashes with MSRV
As you can see from the - lines in the API diff, there is no reduction
in API surface (we just remove the T:Tag bound from the sha256t::Tag
type, which is not strictly necessary but maybe we would prefer to keep).
2024-06-22 15:08:15 +00:00
Fmt Bot 4745b55cae 2024-06-16 automated rustfmt nightly 2024-06-16 01:09:27 +00:00
Andrew Poelstra dc866a70bc
Merge rust-bitcoin/rust-bitcoin#2866: Run schemars test from extra_tests
1f58476cb4 Run schemars test from extra_tests (Tobin C. Harding)

Pull request description:

  We have a mechanism to run additional custom tests by way of the `extra_tests.sh` script in each crate.

  Remove the CI job and run the schemars test using `extra_tests.sh`. This patch changes the test coverage because currently the schemars test is only run with a stable toolchain but with this patch applied it runs with stable, MSRV, and nightly.

  Fix: #2787

ACKs for top commit:
  apoelstra:
    ACK 1f58476cb4

Tree-SHA512: 607132890ed08bf75fb544a0e10aeeda5f9c137eb04349f8af5ab28866408d4208cae4688c08645ffca95e7d9568562dbbbfa992382b5d2cb3efeba583d78b1f
2024-06-15 12:54:57 +00:00
Tobin C. Harding 1f58476cb4
Run schemars test from extra_tests
We have a mechanism to run additional custom tests by way of the
`extra_tests.sh` script in each crate.

Remove the CI job and run the schemars test using `extra_tests.sh`. This
patch changes the test coverage because currently the schemars test is
only run with a stable toolchain but with this patch applied it runs
with stable, MSRV, and nightly.

Fix: #2787
2024-06-14 13:44:18 +10:00
Tobin C. Harding 6b7d02e5ae
Add inherent functions to hashes
Currently we have a trait `Hash` that is required for `Hmac`, `Hkdf`,
and other use cases. However, it is unegonomic for users who just want
to do a simple hash to have to import the trait.

Add inherent functions to all hash types including those created with
the new wrapper type macros.

This patch introduces some duplicate code but we are trying to make
progress in the hashes API re-write. We can come back and de-dublicate
later.

Includes making `to_byte_array`,`from_byte_array`, `as_byte_array`, and
`all_zeros` const where easily possible.
2024-06-14 10:17:00 +10:00
Andrew Poelstra cd768303dc
Merge rust-bitcoin/rust-bitcoin#2857: Remove repetition from sha256t_hash_newtype macro
8aa893ebd0 Remove repetition from sha256t_hash_newtype macro (Tobin C. Harding)

Pull request description:

  The `sha256t_hash_newtype` macro is hard to reason about because we allow repetition so which tag goes with which type is slightly obscure.

  Remove repetition and call the macro three times.

  Internal change in `bitcoin`, API change in `hashes`.

  Fix #2811

ACKs for top commit:
  apoelstra:
    ACK 8aa893ebd0 nice, small diff

Tree-SHA512: b38e7c307ac7288b4a5c1c3170ad6aa54c62bd3198922ec8bb091867b230bb9149f7dc996766fc8fa20a1af18b318c475b3e83e2689d322b7f4af0d5cb588e50
2024-06-11 19:46:52 +00:00
Tobin C. Harding 8aa893ebd0
Remove repetition from sha256t_hash_newtype macro
The `sha256t_hash_newtype` macro is hard to reason about because we
allow repetition so which tag goes with which type is slightly obscure.

Remove repetition and call the macro three times.

Internal change in `bitcoin`, API change in `hashes`.
2024-06-11 13:59:55 +10:00
Tobin C. Harding ce1db3ea26
hashes: Move non-trait functions
The `hash_trait_impls` macro currently adds an impl block for `Hash` -
this is not what the docs say since and `impl Hash` block is nothing
to do with traits.

Move the impl block and add a duplicate of the functions to the
`sha256t::Hash` type.

This is a refactor, no API or logic changes. Note that wrapper types
currently do net get these functions - that will be
discussed/implemented separately.
2024-06-11 13:03:09 +10:00
Jamil Lambert, PhD 4a9f74b55c fix missing fullstops in bitcoin rustdoc
Added missing fullstops to the rustdoc titles for everything on the main page of the bitcoin crate
2024-06-06 16:37:12 +01:00
Fmt Bot 07ef78ea96 2024-06-02 automated rustfmt nightly 2024-06-02 01:07:10 +00:00
Andrew Poelstra 0d1cab68ee
Merge rust-bitcoin/rust-bitcoin#2644: Add HKDF to bitcoin_hashes
c9d1ff7037 Update hashes API changes (Nick Johnson)
878ab924d1 Add HMAC Extract-and-Expand Key Derivation Function (Nick Johnson)

Pull request description:

  rustaceanrob and I have been working on a Rust-based BIP324 implementation over at https://github.com/rustaceanrob/bip324. We have been attempting to keep the code pretty clean in hopes of a future "soft landing" in rust-bitcoin. I figured the HKDF implementation is a small, self-contained chunk that might allow us to learn the ropes here first.

  There was a mention in the [discussion thread on BIP324](https://github.com/rust-bitcoin/rust-bitcoin/discussions/1691) that the hashes interface may be changing in the near future. I am not sure the effect that would have on this implementation, but happy to work through any issues.

  Closes #2551

ACKs for top commit:
  tcharding:
    ACK c9d1ff7037
  apoelstra:
    ACK c9d1ff7037

Tree-SHA512: 404d51ca055db4366ec57f1503fcf350aebcd181f36a20a17763ea8c47ade851213fc882acd2785313953a3e768d588c230f737ff93f88121b97c34b37c65127
2024-05-31 22:13:08 +00:00
Tobin C. Harding 60ab3d26e5
CI: Remove shebang from non-executable scripts
Some of our CI shell scripts are meant only to be sourced and not
run directly however they include an initial shebang line, implying that
they should be run.

Remove the shebang line from `crates.sh` and the various `test_vars.sh`
scripts. Add a `shellcheck` directive to inhibit the no-shebang warning.

Fix: #2764
2024-05-31 10:10:00 +10:00
Nick Johnson 878ab924d1 Add HMAC Extract-and-Expand Key Derivation Function
BIP324's peer to peer encryption protocol requires an HMAC-based extract
and expand key derivation function (HKDF). HKDFs were not part of many
bitcoin protocols before BIP324, but the hope is that the encrypted
protocol becomes the dominant standard justifying this implementation.
2024-05-30 15:12:18 -07:00