nonce (empty) → 1.0
raw patch · 4 files changed
+158/−0 lines, 4 filesdep +basedep +base64-bytestringdep +bytestringsetup-changed
Dependencies added: base, base64-bytestring, bytestring, cprng-aes, crypto-random, text, transformers
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- nonce.cabal +42/−0
- src/Crypto/Nonce.hs +84/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2014, Prowdsponsor <opensource@prowdsponsor.com>++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Felipe Lessa <felipe.lessa@prowdsponsor.com> nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ nonce.cabal view
@@ -0,0 +1,42 @@+name: nonce+version: 1.0+synopsis: Generate cryptographic nonces.+homepage: https://github.com/prowdsponsor/nonce+license: BSD3+license-file: LICENSE+author: Felipe Lessa <felipe.lessa@prowdsponsor.com>+maintainer: Prowdsponsor <opensource@prowdsponsor.com>+copyright: (c) 2014 Prowdsponsor+category: Cryptography+build-type: Simple+cabal-version: >= 1.10+description:+ According to the Wikipedia, a nonce is an arbitrary number used+ only once in a cryptographic communication. This package+ contain helper functions for generating nonces.+ .+ There are many kinds of nonces used in different situations.+ It's not guarantee that by using the nonces from this package+ you won't have any security issues. Please make sure that the+ nonces generated via this package are usable on your design.++source-repository head+ type: git+ location: git://github.com/prowdsponsor/nonce.git++library+ exposed-modules:+ Crypto.Nonce+ build-depends:+ base >= 4.5 && < 4.8+ , base64-bytestring == 1.0.*+ , bytestring >= 0.9+ , crypto-random == 0.0.*+ , cprng-aes == 0.5.*+ , text >= 0.9+ , transformers >= 0.2+ hs-source-dirs: src/+ default-language: Haskell2010+ ghc-options: -Wall+ default-extensions:+ DeriveDataTypeable
+ src/Crypto/Nonce.hs view
@@ -0,0 +1,84 @@+-- | Usage of this module is very simple. Here is a sample GHCi run:+--+-- @+-- *Crypto.Nonce> g <- new+-- *Crypto.Nonce> nonce128 g+-- \"c\\164\\252\\162f\\207\\245\\ESC`\\180p\\DC4\\234\\223QP\"+-- *Crypto.Nonce> nonce128 g+-- \"\\203C\\190\\138aI\\158\\194\\146\\&7\\208\\&7\\ETX0\\f\\229\"+-- *Crypto.Nonce> nonce128url g+-- \"3RP-iEFT-6NrpCMsxigondMC\"+-- *Crypto.Nonce> nonce128url g+-- \"MVZH3Gi5zSKXJY-_qdtznxla\"+-- *Crypto.Nonce> nonce128url g+-- \"3f3cVNfuZT62-uGco1CBThci\"+-- *Crypto.Nonce> nonce128urlT g+-- \"iGMJyrRkw2QMp09SRy59s4Jx\"+-- *Crypto.Nonce> nonce128urlT g+-- \"WsHs0KwYiex3tsqQZ8b0119_\"+-- *Crypto.Nonce> nonce128urlT g+-- \"JWkLSX7qSFGu1Q3PHuExwurF\"+-- @+--+-- The functions that generate nonces are not pure on purpose,+-- since that makes it a lot harder to reuse the same nonce.+module Crypto.Nonce+ ( Generator+ , new+ , nonce128+ , nonce128url+ , nonce128urlT+ ) where++import Control.Monad (liftM)+import Control.Monad.IO.Class (MonadIO, liftIO)+import Data.Tuple (swap)+import Data.Typeable (Typeable)++import qualified Crypto.Random as R+import qualified Crypto.Random.AESCtr as AESCtr+import qualified Data.ByteString as B+import qualified Data.ByteString.Base64.URL as B64URL+import qualified Data.IORef as I+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+++-- | An encapsulated nonce generator.+data Generator =+ G (I.IORef AESCtr.AESRNG)+ deriving (Typeable)++instance Show Generator where+ show _ = "<NonceGenerator>"+++-- | Create a new nonce generator using the system entropy.+new :: MonadIO m => m Generator+new = liftM G . liftIO $ AESCtr.makeSystem >>= I.newIORef+++-- | (Internal) Generate the given number of bytes from the AES CPRNG.+genBytes :: MonadIO m => Int -> Generator -> m B.ByteString+genBytes n (G v) = liftIO $ I.atomicModifyIORef v $ swap . R.cprgGenerate n+++-- | Generate a 128 bit nonce as a 'B.ByteString' of 16 bytes.+-- Each byte may have any value from @0@ to @255@.+nonce128 :: MonadIO m => Generator -> m B.ByteString+nonce128 = genBytes 16+++-- | Generate a 128 bit nonce as a 'B.ByteString' of 24 bytes.+-- Each byte is either a letter (upper or lowercase), a digit, a+-- dash (@-@) or an underscore (@_@), which is the set of+-- characters from the base64url encoding. In order to avoid any+-- issues with padding, the generated nonce actually has 144 bits.+nonce128url :: MonadIO m => Generator -> m B.ByteString+nonce128url = liftM B64URL.encode . genBytes 18+++-- | Same as 'nonce128url', but returns its result as 'T.Text'+-- instead.+nonce128urlT :: MonadIO m => Generator -> m T.Text+nonce128urlT = liftM TE.decodeUtf8 . nonce128url