Safe Haskell | Safe |
---|---|
Language | Haskell2010 |
Render SHA message digests in the peculiar base32'ish format used by Nix.
- printSHA256 :: ByteString -> String
- packHex :: String -> ByteString
Documentation
printSHA256 :: ByteString -> String Source #
Render a SHA265 message digest into the somewhat unusual base32 scheme
used by Nix. That algorithm is remarkable, because it twists the bits of the
input buffer around quite a bit before grouping them into quintets that are
then translated into the target alphabet 0123456789abcdfghijklmnpqrsvwxyz
.
Basically, the sequence of bits
255 254 253 252 251 250 249 248 ... 7 6 5 4 3 2 1 0 |_______________________________| |______________________| byte 0 byte 31
is split into quintets as follows:
7 6 5 4 3 2 1 0 14 13 12 ... 251 252 253 254 255 |______________| |_____________| |____________| |___________________| quintet 0 quintet 1 quintet 2 quintet 51
before the encoding takes place. This leads to somewhat surprising results:
>>>
printSHA256 (packHex "0000000000000000000000000000000000000000000000000000000000000080")
"1000000000000000000000000000000000000000000000000000">>>
printSHA256 (packHex "0000000000000000000000000000000000000000000000000000000000000001")
"0080000000000000000000000000000000000000000000000000">>>
printSHA256 (packHex "7459ca5c6e117538122f04caf3dbfc58303028c26c58943430c16ff28a3b1d49")
"0j8x7f5g4vy160s98n3cq8l30c2qzkdz7jh45w93hx8idrfclnbl"
packHex :: String -> ByteString Source #
Parse a hexadecimal hash representation into its binary form suitable for
encoding with printSHA256
.
>>>
packHex "48656c6c6f2c20776f726c642e"
"Hello, world."
Leading zeros can be omitted, i.e. it's unnecessary to pad the input to an even number of bytes:
>>>
packHex "0"
"\NUL"