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 +41/−10
- Lazy-Pbkdf2.cabal +3/−3
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