module Crypto.RNCryptor.Padding
  ( pkcs7Padding ) where

import           Data.ByteString (ByteString)
import qualified Data.ByteString as B


--------------------------------------------------------------------------------
-- | Computes the padding as per PKCS#7. The specification can be found 
-- here: <http://tools.ietf.org/html/rfc5652#section-6.3>
pkcs7Padding :: Int
             -- ^ The block size (e.g. 16 bytes)
             -> Int
             -- ^ The input size
             -> ByteString
             -- ^ The resulting padding
pkcs7Padding :: Int -> Int -> ByteString
pkcs7Padding Int
k Int
l =
  let octetsSize :: Int
octetsSize = Int
k Int -> Int -> Int
forall a. Num a => a -> a -> a
- (Int
l Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
k)
  in  [Word8] -> ByteString
B.pack ([Word8] -> ByteString) -> [Word8] -> ByteString
forall a b. (a -> b) -> a -> b
$ Int -> Word8 -> [Word8]
forall a. Int -> a -> [a]
replicate Int
octetsSize (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
octetsSize)