Skip to content

Latest commit

 

History

History
125 lines (85 loc) · 4.51 KB

README.md

File metadata and controls

125 lines (85 loc) · 4.51 KB

SHA1

Calculate SHA-1 digests in Elm.

This package supports hashing of:

  • String using the utf-8 encoding
  • Bytes, an elm/bytes sequence of byte values
  • List Int where the elements are assumed to be below 256

And can represent the digest as:

Release notes

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 of Bytes over [List Int].
  • 1.1.0 introduces the option to hash Bytes and represent Digests as Bytes, 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.

Examples

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
--> ]

Validation

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.

Contributors

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.

TODO

  • Benchmarks
    • Add way to run benchmarks
    • Automate testing that changes do not negatively impact performance?
  • Write CONTRIBUTING.md