distribution-nixpkgs-1.1.1: Types and functions to manipulate the Nixpkgs distribution

Safe HaskellSafe
LanguageHaskell2010

Distribution.Nixpkgs.Hashes

Description

Render SHA message digests in the peculiar base32'ish format used by Nix.

Synopsis

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"