crypton-2.2.5: Cryptography Primitives
LicenseBSD-style
MaintainerVincent Hanquez <vincent@snarc.org>
Stabilityexperimental
PortabilityGood
Safe HaskellNone
LanguageHaskell2010

Crypto.PubKey.DSA

Description

An implementation of the Digital Signature Algorithm (DSA)

What is kept from the clock, and what is not

Signing keeps the private number and the ephemeral k out of the two places whose duration would otherwise follow them: the exponentiation is expSafe, which walks the exponent a fixed four bits at a time, and k is inverted by Fermat's little theorem rather than by the extended Euclidean algorithm, whose number of steps follows the bits it is given.

What is left is the arithmetic around them. x * r, the addition and the reduction modulo q are Integer operations, and an Integer costs what its size says: a private number that happens to be short is multiplied in fewer words than a full-length one. The same holds in Crypto.PubKey.ElGamal and Crypto.PubKey.Rabin.Basic. Removing it means leaving Integer for a fixed-width representation, which is what Crypto.PubKey.RSA does for its exponentiation and the curve modules do throughout; there is nothing a caller can do about it from here.

Synopsis

Documentation

data Params Source #

Represent DSA parameters namely P, G, and Q.

Constructors

Params 

Fields

Instances

Instances details
Data Params Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Params -> c Params #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Params #

toConstr :: Params -> Constr #

dataTypeOf :: Params -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Params) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Params) #

gmapT :: (forall b. Data b => b -> b) -> Params -> Params #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Params -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Params -> r #

gmapQ :: (forall d. Data d => d -> u) -> Params -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Params -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Params -> m Params #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Params -> m Params #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Params -> m Params #

Read Params Source # 
Instance details

Defined in Crypto.PubKey.DSA

Show Params Source # 
Instance details

Defined in Crypto.PubKey.DSA

NFData Params Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

rnf :: Params -> () #

Eq Params Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

(==) :: Params -> Params -> Bool #

(/=) :: Params -> Params -> Bool #

data Signature Source #

Represent a DSA signature namely R and S.

Constructors

Signature 

Fields

Instances

Instances details
Data Signature Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Signature -> c Signature #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Signature #

toConstr :: Signature -> Constr #

dataTypeOf :: Signature -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Signature) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Signature) #

gmapT :: (forall b. Data b => b -> b) -> Signature -> Signature #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Signature -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Signature -> r #

gmapQ :: (forall d. Data d => d -> u) -> Signature -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Signature -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Signature -> m Signature #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Signature -> m Signature #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Signature -> m Signature #

Read Signature Source # 
Instance details

Defined in Crypto.PubKey.DSA

Show Signature Source # 
Instance details

Defined in Crypto.PubKey.DSA

NFData Signature Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

rnf :: Signature -> () #

Eq Signature Source # 
Instance details

Defined in Crypto.PubKey.DSA

data PublicKey Source #

Represent a DSA public key.

Constructors

PublicKey 

Fields

Instances

Instances details
Data PublicKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PublicKey -> c PublicKey #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c PublicKey #

toConstr :: PublicKey -> Constr #

dataTypeOf :: PublicKey -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c PublicKey) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c PublicKey) #

gmapT :: (forall b. Data b => b -> b) -> PublicKey -> PublicKey #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PublicKey -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PublicKey -> r #

gmapQ :: (forall d. Data d => d -> u) -> PublicKey -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> PublicKey -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> PublicKey -> m PublicKey #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> PublicKey -> m PublicKey #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> PublicKey -> m PublicKey #

Read PublicKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Show PublicKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

NFData PublicKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

rnf :: PublicKey -> () #

Eq PublicKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

data PrivateKey Source #

Represent a DSA private key.

Only x need to be secret. the DSA parameters are publicly shared with the other side.

Constructors

PrivateKey 

Fields

Instances

Instances details
Data PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PrivateKey -> c PrivateKey #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c PrivateKey #

toConstr :: PrivateKey -> Constr #

dataTypeOf :: PrivateKey -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c PrivateKey) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c PrivateKey) #

gmapT :: (forall b. Data b => b -> b) -> PrivateKey -> PrivateKey #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PrivateKey -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PrivateKey -> r #

gmapQ :: (forall d. Data d => d -> u) -> PrivateKey -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> PrivateKey -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> PrivateKey -> m PrivateKey #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> PrivateKey -> m PrivateKey #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> PrivateKey -> m PrivateKey #

Read PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Show PrivateKey Source #

The parameters are shown; private_x is not. Use debugShow to see it.

Instance details

Defined in Crypto.PubKey.DSA

DebugShow PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

NFData PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

rnf :: PrivateKey -> () #

Eq PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.DSA

type PublicNumber = Integer Source #

DSA Public Number, usually embedded in DSA Public Key

type PrivateNumber = Integer Source #

DSA Private Number, usually embedded in DSA Private Key

Generation

generatePrivate :: MonadRandom m => Params -> m PrivateNumber Source #

generate a private number with no specific property this number is usually called X in DSA text.

calculatePublic :: Params -> PrivateNumber -> PublicNumber Source #

Calculate the public number from the parameters and the private key

Signature primitive

sign :: (ByteArrayAccess msg, HashAlgorithm hash, MonadRandom m) => PrivateKey -> hash -> msg -> m Signature Source #

sign message using the private key.

signWith Source #

Arguments

:: (ByteArrayAccess msg, HashAlgorithm hash) 
=> Integer

k random number

-> PrivateKey

private key

-> hash

hash function

-> msg

message to sign

-> Maybe Signature 

sign message using the private key and an explicit k number.

signDigest :: (HashAlgorithm hash, MonadRandom m) => PrivateKey -> Digest hash -> m Signature Source #

Sign a digest using the private key. See signDigestWith for why a digest rather than a hash value.

signDigestWith Source #

Arguments

:: HashAlgorithm hash 
=> Integer

k random number

-> PrivateKey

private key

-> Digest hash

digest of the message to sign

-> Maybe Signature 

Sign a digest using the private key and an explicit k number.

The digest's type says which algorithm made it, so this needs nothing else to name one. signWith takes a hash value and never reads it -- it is there to fix the type -- which leaves a caller that is itself polymorphic in the algorithm with nothing to pass.

Verification primitive

verify :: (ByteArrayAccess msg, HashAlgorithm hash) => hash -> PublicKey -> Signature -> msg -> Bool Source #

verify a bytestring using the public key.

verifyDigest :: HashAlgorithm hash => PublicKey -> Signature -> Digest hash -> Bool Source #

Verify a signature over a digest. See signDigestWith for why a digest rather than a hash value.

Key pair

data KeyPair Source #

Represent a DSA key pair

Instances

Instances details
Data KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> KeyPair -> c KeyPair #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c KeyPair #

toConstr :: KeyPair -> Constr #

dataTypeOf :: KeyPair -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c KeyPair) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c KeyPair) #

gmapT :: (forall b. Data b => b -> b) -> KeyPair -> KeyPair #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> KeyPair -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> KeyPair -> r #

gmapQ :: (forall d. Data d => d -> u) -> KeyPair -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> KeyPair -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> KeyPair -> m KeyPair #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> KeyPair -> m KeyPair #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> KeyPair -> m KeyPair #

Read KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

Show KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

DebugShow KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

NFData KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

rnf :: KeyPair -> () #

Eq KeyPair Source # 
Instance details

Defined in Crypto.PubKey.DSA

Methods

(==) :: KeyPair -> KeyPair -> Bool #

(/=) :: KeyPair -> KeyPair -> Bool #

toPublicKey :: KeyPair -> PublicKey Source #

Public key of a DSA Key pair

toPrivateKey :: KeyPair -> PrivateKey Source #

Private key of a DSA Key pair