Calculate SHA-1 digests in Elm.
This package supports hashing of:
String
using the utf-8 encodingBytes
, anelm/bytes
sequence of byte valuesList Int
where the elements are assumed to be below 256
And can represent the digest as:
- a hexadecimal string
- a base64 string
Bytes
- a
List Int
of byte values
Upgrading from 1.0.0 <= v < 1.0.4
is strongly recommended. Later
versions are more rigiorously tested, are significantly more performant, contain
bug fixes, and work with elm v0.19.1.
2.0.0
prioritises use ofBytes
over [List Int
].1.1.0
introduces the option to hashBytes
and representDigest
s asBytes
, without breaking the API.1.0.5
provides the performance improvements of the hashing algorithm in a non-breaking manner.
Please see the Contributors section for thanks and more information.
import Bytes.Encode as Encode
import Bytes exposing (Bytes)
import SHA1
digest1 : SHA1.Digest
digest1 = SHA1.fromString "string"
byteValues : List Int
byteValues = [0x00, 0xFF, 0xCE, 0x35, 0x74]
digest2 : SHA1.Digest
digest2 = SHA1.fromByteValues byteValues
buffer : Bytes
buffer =
List.map Encode.unsignedInt8 byteValues
|> Encode.sequence
|> Encode.encode
digest3 : SHA1.Digest
digest3 = SHA1.fromBytes buffer
SHA1.toHex digest1
--> "ecb252044b5ea0f679ee78ec1a12904739e2904d"
SHA1.toBase64 digest2
--> "gHweOF5Lyg+Ha7ujrlYwNa/Hwgk="
SHA1.toByteValues digest3
--> [ 0x80, 0x7C, 0x1E, 0x38
--> , 0x5E, 0x4B, 0xCA, 0x0F
--> , 0x87, 0x6B, 0xBB, 0xA3
--> , 0xAE, 0x56, 0x30, 0x35
--> , 0xAF, 0xC7, 0xC2, 0x09
--> ]
Not officially validated through CAVP/CMVP, although digests are tested against CAVS responses via pyca/cryptography.
Validation tests can be run by executing make cavs
. This requires make, curl, elm, elm-test and gawk. Alternatively, to run all tests, execute make test
(which also requires elm-format and elm-verify-examples). See the Makefile
for details.
This package is also tested against additional hashes in the documentation (using elm-verify-examples), tests/Tests.elm, and indirectly via romariolopezc/elm-hmac-sha1’s tests, and TSFoster/elm-uuid’s tests.
Please note that SHA-1 is not “considered secure against well-funded opponents”, but it does have its uses, including, but not limited to, version 5 UUIDs.
Special thanks to Folkert de Vries for a major rewrite of this library, including huge performance gains, more rigorous testing, and support for elm/bytes. More information can be found on this Elm Discourse thread.
- Thanks to Colin T.A. Gray for finding and fixing a bug related to inputs of 311 bytes
- Thanks to Dimitri Benin for making this package work with elm v0.19.1
- Benchmarks
- Add way to run benchmarks
- Automate testing that changes do not negatively impact performance?
- Write CONTRIBUTING.md