Add support for Blake2s and Blake2b hash algorithms #867
Open
valeriosetti wants to merge 20 commits from
valeriosetti/blake2 into development
pull from: valeriosetti/blake2
merge into: gh-Mbed-TLS:development
gh-Mbed-TLS:development
gh-Mbed-TLS:tf-psa-crypto-1.1
gh-Mbed-TLS:archive/20261005T153337Z-force/pull/927
gh-Mbed-TLS:archive/20261001T141055Z-force/pull/927
gh-Mbed-TLS:archive/20261005T153337Z-force/pull/931
gh-Mbed-TLS:archive/20261001T083616Z-force/pull/927
gh-Mbed-TLS:archive/20260930T232327Z-force/pull/927
gh-Mbed-TLS:archive/20260930T154618Z-force/pull/927
gh-Mbed-TLS:archive/20260929T231919Z-rescue/rohankl-arm/mldsa-pubkey-899
gh-Mbed-TLS:archive/20260929T231919Z-rescue/sigvartmh/pr/spake2p-9342-public-key-import-export
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ManoharPaturi/fix-pem-ct-padding
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ManoharPaturi/fix-asn1write-null-guard
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ManoharPaturi/fix-pbes2-params-validation
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/blake2
gh-Mbed-TLS:archive/20260929T231919Z-rescue/jfdev001/v1.1.1_bump-cmake-minimum-version
gh-Mbed-TLS:archive/20260929T231919Z-rescue/jfdev001/bump-cmake-minimum-version
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ronald-cron-arm/sm3-base
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/blake2-hmac
gh-Mbed-TLS:archive/20260929T231919Z-rescue/v1rtu3x/enforce-hash-length-sign-verify
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/file-backed-keystore-doc
gh-Mbed-TLS:archive/20260929T231919Z-rescue/sigvartmh/pr/spake2p-9344-set-context
gh-Mbed-TLS:archive/20260929T231919Z-rescue/sigvartmh/pr/spake2p-9343-key-pair-import-export-depends-on-9342
gh-Mbed-TLS:archive/20260929T231919Z-rescue/romart/development
gh-Mbed-TLS:archive/20260929T231919Z-rescue/sweetlilmre/constant-time-embedded-perf
gh-Mbed-TLS:archive/20260929T231919Z-rescue/JulioLoayzaM/add-wycheproof-rsa-pss
gh-Mbed-TLS:archive/20260929T231919Z-rescue/JulioLoayzaM/add-wycheproof-ecdsa
gh-Mbed-TLS:archive/20260929T231919Z-rescue/JulioLoayzaM/add-wycheproof-tests
gh-Mbed-TLS:archive/20260929T231919Z-rescue/oubaid-a/dev_psa_driver_wrapper
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/keystoreless-prototype-1
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/issue9580
gh-Mbed-TLS:archive/20260929T231919Z-rescue/LeonieReichertABB/hpke-functionality
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/psa-hash-no-buffer-copy-1.1
gh-Mbed-TLS:archive/20260929T231919Z-rescue/vanhauser-thc/development
gh-Mbed-TLS:archive/20260929T231919Z-rescue/tpambor/key-wrap
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ruiliio/psa_xts
gh-Mbed-TLS:archive/20261011T063515Z-force/pull/538
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/fix-broken-links-1.1
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/issue669
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/prepare-release-test
gh-Mbed-TLS:archive/20260929T231919Z-rescue/krish2718/wpa3-sae-design-note
gh-Mbed-TLS:archive/20260929T231919Z-rescue/nzzlinh/fix_iar_endianness_1.1
gh-Mbed-TLS:archive/20260929T231919Z-rescue/nzzlinh/fix-iar-endianness
gh-Mbed-TLS:archive/20260929T231919Z-rescue/abtom87/fix-pbkdf2-iter-count
gh-Mbed-TLS:archive/20260929T231919Z-rescue/minosgalanakis/tools/prepare_release_lite
gh-Mbed-TLS:archive/20260929T231919Z-rescue/Harshal5/fix/aes-xts-in-place-cts
gh-Mbed-TLS:archive/20260929T231919Z-rescue/sigvartmh/pr/spake2p-9347-prover-depends-on-9342-9343-9344
gh-Mbed-TLS:archive/20260929T231919Z-rescue/crabel99/async-hardware-support-c35df962
gh-Mbed-TLS:tf-psa-crypto-1.2.0_mergeback
gh-Mbed-TLS:tf-psa-crypto-1.1.1_mergeback
gh-Mbed-TLS:archive/20260929T231919Z-rescue/asmellby/feature/dispatch-library
gh-Mbed-TLS:tf-psa-crypto-release-sync
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ChakshuGupta13/fix/ecdsa-zeroize-stack-key
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/security-md-option-names
gh-Mbed-TLS:archive/20260929T231919Z-rescue/parmi93/patch-2
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/remove-mldsa-sign-from-build
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/tf-m-build-issues
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/test-context-population
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/iar-1.1.0
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/fork-helper-unit-tests-create-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/redundant-declarations
gh-Mbed-TLS:archive/20260929T231919Z-rescue/hasheddan/docs/fix-broken-links
gh-Mbed-TLS:main
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/reintroduce-dh
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/cipher-update-incorrect-error
gh-Mbed-TLS:archive/20260929T231919Z-rescue/Marandil/fix/mbedtls-4314-parse-explicit-curve
gh-Mbed-TLS:archive/20260929T231919Z-rescue/schneider-electric/dev/plaj-se/parse-rsassa-pss
gh-Mbed-TLS:archive/20260929T231919Z-rescue/minosgalanakis/bugfix/program-fuzz-mscv
gh-Mbed-TLS:archive/20260929T231919Z-rescue/daverodgman/aesgcm
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/sha3-coverity-20260224
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bensze01/undef
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/issue523
gh-Mbed-TLS:archive/20260929T231919Z-rescue/dannytsen/ppc-dev
gh-Mbed-TLS:archive/20260929T231919Z-rescue/daverodgman/aes12
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/ascon-prototype
gh-Mbed-TLS:archive/20260929T231919Z-rescue/daverodgman/chacha10
gh-Mbed-TLS:archive/20260929T231919Z-rescue/kusumitg/implement_psa_pake_set_context_for_spake2p
gh-Mbed-TLS:archive/20260929T231919Z-rescue/davidhorstmann-arm/add-code-size-target
gh-Mbed-TLS:archive/20260929T231919Z-rescue/bjwtaylor/simplify-sign_func
gh-Mbed-TLS:archive/20260929T231919Z-rescue/mfil/feature/aes_ni_parallel
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ivv19041994/patch-1
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/psa-verify-policy-relax
gh-Mbed-TLS:public_2/main
gh-Mbed-TLS:archive/20260929T231919Z-rescue/mpg/pk-sign-proto
gh-Mbed-TLS:release/tf-psa-crypto1.0.0-documentation
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/0e-plans-july-updates
gh-Mbed-TLS:archive/20260929T231919Z-rescue/davidhorstmann-arm/guard-context-types-in-client-only
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/psa-driver-interface-spec-remove
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/ecp-self-test-race-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/KiruthikPrakash/feature/9342_add-support-for-spake2p-public-key-import-export
gh-Mbed-TLS:archive/20260929T231919Z-rescue/ruiliio/chacha20_16
gh-Mbed-TLS:archive/20260929T231919Z-rescue/irwir/winsock2
gh-Mbed-TLS:archive/20260929T231919Z-rescue/aphroteus/development
gh-Mbed-TLS:archive/20260929T231919Z-rescue/amjoul01/amjoul01/psa-mac-out-of-bound-fix
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/everest-submodule-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/yamt/xtensa-ccount
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/all.sh-generate-only-before-checks-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/Harshal5/feat/builtin_cmac_driver_use_psa_crypto_interface
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/test-data_t-empty_is_empty-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/jean-baptisteboric-eaton/oids-pkcs7-authenticated-attributes
gh-Mbed-TLS:dev/bensze01/public-only-commit
gh-Mbed-TLS:archive/20260929T231919Z-rescue/waleed-elmelegy-arm/psa-key-wrap-aes-kw
gh-Mbed-TLS:archive/20260929T231919Z-rescue/tfloch/psa_add_xts_algorithm
gh-Mbed-TLS:archive/20260929T231919Z-rescue/gilles-peskine-arm/msancf-clang16-crypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/DemiMarie/document-unexpected-tags
gh-Mbed-TLS:archive/20260929T231919Z-rescue/DemiMarie/strict-len
gh-Mbed-TLS:archive/20260929T231919Z-rescue/valeriosetti/issue9255-tfpsacrypto
gh-Mbed-TLS:archive/20260929T231919Z-rescue/daantimmer/use-compiler-frontend
gh-Mbed-TLS:archive/20260929T231919Z-rescue/benmcollins/enable-rsassa-pss-pkparse
gh-Mbed-TLS:dev/paul-elliott-arm/add_iop_key_agreement_negative_tests
gh-Mbed-TLS:add-iop-export-pub-key-get-num-ops
gh-Mbed-TLS:dev/rc/new-2-d635ea1
gh-Mbed-TLS:dev/bensze01/jenkins
No reviewers
Labels
Clear labels
api-break
This issue/PR breaks the API and must wait for a new major version
approved
Design and code approved - may be waiting for CI or backports
bug
Something isn't working
component-docs
Docs / website issues filed here for tracking
component-platform
Portability layer and build scripts
component-test
Test framework and CI scripts
dependencies
Pull requests that update a dependency file
deprecation
needs deprecation announcement
DO-NOT-MERGE
enhancement
New feature or request
good first issue
Good for newcomers
help wanted
This issue is not being actively worked on, but PRs welcome.
needs-adoption
stalled PR that someone should pick up and complete
needs-backports
Backports are missing or are pending review and approval.
needs-ci
Needs to pass CI tests
needs-design-approval
Needs design discussion / approval
needs-info
An issue or PR which needs further info from the reporter / author
needs-preceding-pr
Requires another PR to be merged first
needs-review
Every commit must be reviewed by at least two team members
needs-reviewer
This PR needs someone to pick it up for review
needs-work
priority-high
High priority - will be reviewed soon
priority-low
Low priority - this may not receive review soon
priority-medium
Medium priority - this can be reviewed as time permits
priority-scheduled
This PR is big - it will require time to be scheduled for review
priority-very-high
Highest priority - prioritise this over other review work
resolved-after-1.1
The issue is resolved in development, but still present in 1.1 LTS.
single-reviewer
This PR qualifies for having only one reviewer
size-l
Estimated task size: large (2w+)
size-m
Estimated task size: medium (~1w)
size-optimisation
size-s
Estimated task size: small (~2d)
size-xs
Estimated task size: extra small (a few hours at most)
No labels
api-break
approved
bug
component-docs
component-platform
component-test
dependencies
deprecation
DO-NOT-MERGE
enhancement
good first issue
help wanted
needs-adoption
needs-backports
needs-ci
needs-design-approval
needs-info
needs-preceding-pr
needs-review
needs-reviewer
needs-work
priority-high
priority-low
priority-medium
priority-scheduled
priority-very-high
resolved-after-1.1
single-reviewer
size-l
size-m
size-optimisation
size-s
size-xs
Milestone
Clear milestone
No items
No milestone
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
gh-Mbed-TLS/TF-PSA-Crypto!867
Loading…
Reference in a new issue
No description provided.
Delete branch "valeriosetti/blake2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Description
Blake2 was initially proposed in RFC 7693. It provides:
PSA Crypto API added Blake2 into the specs in version 1.5:
Adding support for all of this in a single PR would mean having a very large PR which is difficult to review. As a consequence the scope of this PR is limited to add only hash support (MAC is done in this follow-up PR) and for the single threaded case (i.e. no parallel).
Prerequisite PRs:
A follow-up PR (https://github.com/Mbed-TLS/TF-PSA-Crypto/pull/898) will add support for MAC.
PR checklist
Please remove the segment/s on either side of the | symbol as appropriate, and add any relevant link/s to the end of the line.
If the provided content is part of the present PR remove the # symbol.
Some comments, questions and suggestions.
@ -22,6 +22,8 @@#define PSA_WANT_ALG_CHACHA20_POLY1305 1#define PSA_WANT_ALG_CMAC 1Putting this here as I can't comment on the commit messages commits 9d20167eda738062dba18702ba0173ef04f81f3d and 212901fe98d9b298eb0ea88b12a8a1db4685c959 refer blake2p should this be blake2b?
Do the failing tests need investigating or is this expected?
@ -22,6 +22,8 @@#define PSA_WANT_ALG_CHACHA20_POLY1305 1#define PSA_WANT_ALG_CMAC 1#define PSA_WANT_ALG_CTR 1It will also probably need a changelog
@ -0,0 +50,4 @@} tf_psa_crypto_blake2s_context;#if defined(MBEDTLS_PSA_BUILTIN_ALG_BLAKE2S_HASH256)Is there a reason there is no doxygen for these functions? The whole implementation also lacks comments to explain it's operation and aid future maintainability. Is there a reason for this? I guess it's private, so we don't want the docs in the public documentation. It would still be useful to have some docs though. I've attached a patch of some docs i added to aid the review that might be a good starting point.
documentation.patch
@ -0,0 +1,389 @@/**For the benefit other other reviewers this implementation flags as having similarities to nanonext 0.10.4 and PlantUML 1.2023.11 nanonext includes mbedtls and the simularities in PlantUML appear to be related to the fact they are both based RFC 7693 and not indicative of them being related implementations.
It might be useful to put a scope at the top for future reference, something like
Maybe also state that tree hashing is not supported due to it not being in the PSA API what do yoiu think?
@ -0,0 +106,4 @@static void tf_psa_crypto_blake2s_compress(tf_psa_crypto_blake2s_context *ctx, int last){int i;uint32_t v[16], m[16];These two variables could contain sensitive data and although they are not available through the API, it probably makes sense to wipe them when your done with them
@ -0,0 +142,4 @@mbedtls_platform_zeroize(m, sizeof(m));}void tf_psa_crypto_blake2s_update(tf_psa_crypto_blake2s_context *ctx,Is there a reason we copy one byte at a time instead of copying one block at a time?
@ -0,0 +281,4 @@static void tf_psa_crypto_blake2b_compress(tf_psa_crypto_blake2b_context *ctx, int last){int i;uint64_t v[16], m[16];These two variables could contain sensitive data and although they are not available through the API, it probably makes sense to wipe them when your done with them
@ -0,0 +317,4 @@mbedtls_platform_zeroize(m, sizeof(m));}void tf_psa_crypto_blake2b_update(tf_psa_crypto_blake2b_context *ctx,Is there a reason we copy one byte at a time instead of copying one block at a time?
@ -950,0 +958,4 @@** \return 1 if alg is a BLAKE2 hash algorithm, 0 otherwise.*/#define PSA_ALG_IS_BLAKE2_HASH(alg) \I think this requires a parentheses around the expression as otherwise it is not safe to negate or compose
@ -0,0 +1,773 @@Blake2s RFC 7693 Appendix A ("abc")blake2b:"":"616263":"BA80A53F981C4D0D6A2797B69F12F6E94C212F14685AC4B74B12BB6FDBFFA2D17D87C5392AAB792DC252D5DE4533CC9518D38AA8DBF1925AB92386EDD4009923"Blake2b KAT #0 (msg len=0)It might be good to add the RFC 7693 Appendix A: BLAKE2b-512("abc") and RFC 7693 Appendix B: BLAKE2s-256("abc") to exercise unkeyed mode.
@ -0,0 +1,103 @@/* BEGIN_HEADER */It might be useful to extend the testing to inclulde:
psa_hash_compute()tests, zero/short buffers, output sanitization, invalid expected hashes, invalid state transitions, abort/reuse, active-target cloning, and driver-error propagation.PSA_ERROR_NOT_SUPPORTED.NULLwith a nonzero input/key length and aNULLoutput are caller preconditions. Document them or add validation and negative tests.Is it intentional to drop SHA3_512 support?
@ -22,6 +22,8 @@#define PSA_WANT_ALG_CHACHA20_POLY1305 1#define PSA_WANT_ALG_CMAC 1#define PSA_WANT_ALG_CTR 1Yeah, that's marked as
TODOin the description of the PR indeed :)@ -22,6 +22,8 @@#define PSA_WANT_ALG_CHACHA20_POLY1305 1#define PSA_WANT_ALG_CMAC 1Failing tests are due to missing changes in
mbedtls. CI in https://github.com/Mbed-TLS/mbedtls/pull/10921 was green when it was including this PR.Oops, no, sorry
@ -22,6 +22,8 @@#define PSA_WANT_ALG_CHACHA20_POLY1305 1#define PSA_WANT_ALG_CMAC 1ouch, yes, sorry also for this one :/
@ -0,0 +50,4 @@} tf_psa_crypto_blake2s_context;#if defined(MBEDTLS_PSA_BUILTIN_ALG_BLAKE2S_HASH256)Lazyness during initial development followed by oversight when finalizing the work ;)
@ -0,0 +106,4 @@static void tf_psa_crypto_blake2s_compress(tf_psa_crypto_blake2s_context *ctx, int last){int i;uint32_t v[16], m[16];Not sure about this.
mcontains the input data that has been passed totf_psa_crypto_blake2s_updateso IMO that's not really secret material. As forvthat's used to compute the new internal state that's stored inctx->stateso I'm not sure this is really leaking any information that's not available anyway in the context.What exactly are
vandmleaking?I mean, the algorithm is deterministic, so ideally given the key (if any) and the input material anyone knows exactly what the output will look like. Isn't it?
@ -0,0 +281,4 @@static void tf_psa_crypto_blake2b_compress(tf_psa_crypto_blake2b_context *ctx, int last){int i;uint64_t v[16], m[16];Same as above
@ -0,0 +317,4 @@mbedtls_platform_zeroize(m, sizeof(m));}void tf_psa_crypto_blake2b_update(tf_psa_crypto_blake2b_context *ctx,Honestly that was the design proposed in the RFC and I just took that as working solution. I knew it could perhaps be optimized, but I didn't bothered trying that at the time. I can do this now however!
On this please note that the input data is not necessarily provided in blocks whose size is multiple of 32 or 64, so some handling has to be done anyway.
@ -0,0 +142,4 @@mbedtls_platform_zeroize(m, sizeof(m));}void tf_psa_crypto_blake2s_update(tf_psa_crypto_blake2s_context *ctx,Same as above
@ -0,0 +1,389 @@/**IIRC that´s not part of the RFC 7963. It's something they implemented in the reference design in https://github.com/BLAKE2/BLAKE2, but it's not part of the RFC. See the end of this section.
@ -0,0 +1,103 @@/* BEGIN_HEADER */Thanks to the merge of all prerequisite PRs now the CI is green and this PR is officially ready for review :)
@ -0,0 +317,4 @@mbedtls_platform_zeroize(m, sizeof(m));}void tf_psa_crypto_blake2b_update(tf_psa_crypto_blake2b_context *ctx,So, I think it's a nice to have. Not sure if it's essential though, I would see what the second reviewer thinks and at least add an additional issue that's it's further work.
@ -0,0 +1,389 @@/**Maybe something like this then:
/*
*/
?
@ -0,0 +1,4 @@FeaturesShould this be blake2b not 2p?
@ -0,0 +1,292 @@/**Is this HMAC or native keyed BLAKE2? Ditto on 66:133:180:360
@ -0,0 +1,292 @@/**Oops, right, of course HMAC is not correct. OTOH using 'Blake2 MAC' all the times looks a bit too verbose, so I think I will go with just 'MAC'. Please, let me know if that doesn't look like a good idea to you.
@ -0,0 +1,4 @@FeaturesYes, sorry. I know the correct version is
2b, but for some mysterious reason my mind keeps preferring2p🤦I rebased to resolve a conflict on the
frameworkreference. While at this, since currentframeworkbeing referenced fromdevelopmentis also newer than what this PR needs, I dropped the commit updating theframeworkreference. This should reduce the potential conflict surface with other changes.@ -0,0 +106,4 @@static void tf_psa_crypto_blake2s_compress(tf_psa_crypto_blake2s_context *ctx, int last){int i;uint32_t v[16], m[16];So, I think it depends a little on the use case. There is a possible exposure as follows:
tf_psa_crypto_blake2s_init(ctx, outlen, key, keylen)
→ copies the key into ctx->buf and marks the first block full
tf_psa_crypto_blake2s_update(ctx, message, length)
→ compresses that block when message bytes arrive
→ m[] is loaded from ctx->buf, so m[] contains the key bytes
→ the mixing rounds combine m[] with v[]
→ v[] and then ctx->state become key dependent
In some instances you are initialising this to NULL 0 such as drivers/builtin/src/psa_crypto_hash.c:177. So they are not an issue. Though in others such as the test and blake2.c:381 you are. So ultimately I think it depends if this init function is supposed to init with the real values or with NULL 0? Though it may be worth just zeroing them to be certain, what do you think?
As per further discussion
@ -0,0 +106,4 @@static void tf_psa_crypto_blake2s_compress(tf_psa_crypto_blake2s_context *ctx, int last){int i;uint32_t v[16], m[16];Yeah, I get your point. I still think the attack scenario is a bit complex because you need to be able to read the stack of the thread doing Blake2, but at the same time you cannot dump the context (
tf_psa_crypto_blake2s_context/tf_psa_crypto_blake2b_context- because the context contains the same material). So it should be like:As far as I know step (2) should not be allowed in normal OSes like Linux (but I guess also all other ones).
However, since all other SHA algorithms are doing the same and what you proposed look like a safe approach, I implemented it.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.