module Distribution.Nixpkgs.Hashes ( printSHA256, packHex ) where
import Control.Exception ( assert )
import Data.Bits
import Data.ByteString ( ByteString )
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BSC
import Data.Char
import Data.Word
base32chars :: ByteString
base32chars :: ByteString
base32chars = String -> ByteString
BSC.pack String
"0123456789abcdfghijklmnpqrsvwxyz";
printSHA256 :: ByteString -> String
printSHA256 :: ByteString -> String
printSHA256 ByteString
buf = forall a. (?callStack::CallStack) => Bool -> a -> a
assert (ByteString -> Int
BS.length ByteString
buf forall a. Eq a => a -> a -> Bool
== Int
32) forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (ByteString -> Int -> Char
BSC.index ByteString
base32chars forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Int -> Word8
getQuintet ByteString
buf) [Int
51,Int
50..Int
0]
getQuintet :: ByteString -> Int -> Word8
getQuintet :: ByteString -> Int -> Word8
getQuintet ByteString
buf Int
n = (Word8
c1 forall a. Bits a => a -> a -> a
.|. Word8
c2) forall a. Bits a => a -> a -> a
.&. Word8
0x1f
where
b :: Int
b = Int
n forall a. Num a => a -> a -> a
* Int
5
(Int
i,Int
j) = Int
b forall a. Integral a => a -> a -> (a, a)
`divMod` Int
8
c1 :: Word8
c1 = (?callStack::CallStack) => ByteString -> Int -> Word8
BS.index ByteString
buf Int
i forall a. Bits a => a -> Int -> a
`shiftR` Int
j
c2 :: Word8
c2 = if Int
i forall a. Ord a => a -> a -> Bool
>= Int
31 then Word8
0 else (?callStack::CallStack) => ByteString -> Int -> Word8
BS.index ByteString
buf (Int
iforall a. Num a => a -> a -> a
+Int
1) forall a. Bits a => a -> Int -> a
`shiftL` (Int
8forall a. Num a => a -> a -> a
-Int
j)
packHex :: String -> ByteString
packHex :: String -> ByteString
packHex = [Word8] -> ByteString
BS.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [Word8]
hex2bin
hex2bin :: String -> [Word8]
hex2bin :: String -> [Word8]
hex2bin String
input = String -> [Word8]
f forall a b. (a -> b) -> a -> b
$ (if forall a. Integral a => a -> Bool
even (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
input) then forall a. a -> a
id else (Char
'0'forall a. a -> [a] -> [a]
:)) String
input
where
f :: String -> [Word8]
f :: String -> [Word8]
f [] = []
f [Char
x] = [Char -> Word8
digit Char
x]
f (Char
x1:Char
x2:String
xs) = ((Char -> Word8
digit Char
x1 forall a. Bits a => a -> Int -> a
`shiftL` Int
4) forall a. Bits a => a -> a -> a
.|. Char -> Word8
digit Char
x2) forall a. a -> [a] -> [a]
: String -> [Word8]
f String
xs
digit :: Char -> Word8
digit :: Char -> Word8
digit = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt