packages feed

Lazy-Pbkdf2 3.0.0 → 3.1.0

raw patch · 2 files changed

+44/−13 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Crypto.Pbkdf2: pbkdf2_blocks :: (ByteString -> ByteString -> ByteString) -> ByteString -> ByteString -> Integer -> [ByteString]
+ Crypto.Pbkdf2: pbkdf2_iterative_blocks :: (ByteString -> ByteString -> ByteString) -> ByteString -> ByteString -> Integer -> [ByteString]

Files

Crypto/Pbkdf2.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE Safe #-}-module Crypto.Pbkdf2 (pbkdf2, pbkdf2_iterative) where+module Crypto.Pbkdf2 (pbkdf2, pbkdf2_blocks, pbkdf2_iterative, pbkdf2_iterative_blocks) where  import Data.Bits (shiftR) import Data.Bits(xor)@@ -20,7 +20,7 @@   | B.length x == B.length y = B.pack $ B.zipWith xor x y   | otherwise = error "xor bytestrings are not of equal length" -pbkdf2_internal createBlocks prf password salt iterations = LB.concat $ map LB.fromStrict $ createBlocks $ first_iteration . hash'+pbkdf2_internal createBlocks prf password salt iterations = createBlocks $ first_iteration . hash'   where     hash' = prf password     first_iteration hash = additional_iterations hash hash 1@@ -46,6 +46,27 @@ -- calculated as (PRF output input), where output is the output of the previous -- block and input is the added salt for the previous block.  Notice that the -- output from the previous block is put in the password filed of the PRF.+pbkdf2_iterative_blocks :: (B.ByteString -> B.ByteString -> B.ByteString)+                            -- ^ @PRF@, the PRF function to be used for the+                            -- iterative PBKDF2. The first argument is secret, the+                            -- second argument is not.+                        -> B.ByteString -- ^ @Password@, the secret to use in the PBKDF2 computations.+                        -> B.ByteString -- ^ @Salt@, the not neccesarily secret data to use in the PBKDF2 computations.+                        -> Integer -- ^ @c@, number of iterations for the the PBKDF2 computations.+                        -> [B.ByteString] -- ^ @DK@, the output data in the+                            -- format of an unlimited lazy list of strict+                            -- ByteStrings, each of which is a block from+                            -- @PRF@. This can be useful for precalculations of+                            -- the next block, but by the design of this+                            -- algorithm it cannot be used to compute blocks in+                            -- parallel.+pbkdf2_iterative_blocks prf password salt iterations = pbkdf2_internal (createBlocks (B.pack []) 1) prf password salt iterations+  where+    createBlocks :: B.ByteString -> Bin.Word32 -> (B.ByteString -> B.ByteString) -> [B.ByteString]+    createBlocks blockSalt i hash = let prev = (hash $ B.concat [blockSalt, salt, B.pack $ octetsBE i])+                                     in prev:(createBlocks (prf prev blockSalt) (i + 1) hash)++-- | This is the same as 'pbkdf2_iterative_blocks', except that it returns a lazy bytestring instead. pbkdf2_iterative :: (B.ByteString -> B.ByteString -> B.ByteString)                      -- ^ @PRF@, the PRF function to be used for the                      -- iterative PBKDF2. The first argument is secret, the@@ -54,21 +75,31 @@                  -> B.ByteString -- ^ @Salt@, the not neccesarily secret data to use in the PBKDF2 computations.                  -> Integer -- ^ @c@, number of iterations for the the PBKDF2 computations.                  -> LB.ByteString -- ^ @DK@, the output data in the format of an unlimited lazy ByteString.-pbkdf2_iterative prf password salt iterations = pbkdf2_internal (createBlocks (B.pack []) 1) prf password salt iterations-  where-    createBlocks :: B.ByteString -> Bin.Word32 -> (B.ByteString -> B.ByteString) -> [B.ByteString]-    createBlocks blockSalt i hash = let prev = (hash $ B.concat [blockSalt, salt, B.pack $ octetsBE i])-                                     in prev:(createBlocks (prf prev blockSalt) (i + 1) hash)+pbkdf2_iterative prf password salt iterations = LB.concat $ map LB.fromStrict $ pbkdf2_iterative_blocks prf password salt iterations -pbkdf2 :: (B.ByteString -> B.ByteString -> B.ByteString)+-- | This is the standard PBKDF2 algorithm.+pbkdf2_blocks :: (B.ByteString -> B.ByteString -> B.ByteString)            -- ^ @PRF@, the PRF function to be used for PBKDF2. The first            -- argument is secret, the second argument is not.        -> B.ByteString -- ^ @Password@, the secret to use in the PBKDF2 computations.        -> B.ByteString -- ^ @Salt@, the not neccesarily secret data to use in the PBKDF2 computations.        -> Integer -- ^ @c@, number of iterations for the the PBKDF2 computations.-       -> LB.ByteString -- ^ @DK@, the output data in the format of an unlimited lazy ByteString.-pbkdf2 prf password salt iterations = pbkdf2_internal (createBlocks True 1) prf password salt iterations+       -> [B.ByteString] -- ^ @DK@, the output data in the+           -- format of an unlimited lazy list of strict+           -- ByteStrings, each of which is a block from+           -- @PRF@. These can be calculated in parallel.+pbkdf2_blocks prf password salt iterations = pbkdf2_internal (createBlocks True 1) prf password salt iterations   where     createBlocks :: Bool -> Bin.Word32 -> (B.ByteString -> B.ByteString) -> [B.ByteString]     createBlocks False 1 _ = error "Hashing algorithm looped, stopping to maintain security of data" -- Paranoia, but that's useful when doing crypto     createBlocks _ i hash = (hash $ B.concat [salt, B.pack $ octetsBE i]):(createBlocks False (i + 1) hash)++-- | This is the same as 'pbkdf2_blocks', except that it returns a lazy bytestring instead.+pbkdf2 :: (B.ByteString -> B.ByteString -> B.ByteString)+           -- ^ @PRF@, the PRF function to be used for PBKDF2. The first+           -- argument is secret, the second argument is not.+       -> B.ByteString -- ^ @Password@, the secret to use in the PBKDF2 computations.+       -> B.ByteString -- ^ @Salt@, the not neccesarily secret data to use in the PBKDF2 computations.+       -> Integer -- ^ @c@, number of iterations for the the PBKDF2 computations.+       -> LB.ByteString -- ^ @DK@, the output data in the format of an unlimited lazy ByteString.+pbkdf2 prf password salt iterations = LB.concat $ map LB.fromStrict $ pbkdf2_blocks prf password salt iterations
Lazy-Pbkdf2.cabal view
@@ -1,12 +1,12 @@ Name:           Lazy-Pbkdf2-Version:        3.0.0+Version:        3.1.0 Author:         Marcus Ofenhed <marcus@conditionraise.se> Maintainer:     Marcus Ofenhed <marcus@conditionraise.se> License:        MIT License-File:   LICENSE Synopsis:       Lazy PBKDF2 generator.-Description:    A PBKDF2 generator that generates a lazy ByteString-                of PRNG data.+Description:    A PBKDF2 generator that generates either a lazy ByteString of+                PRNG data or a lazy list of strict ByteStrings. Category:       Cryptography Build-Type:     Simple cabal-version:  >= 1.10