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

Crypto.PubKey.RSA.Types

Description

 
Synopsis

Documentation

data Error Source #

error possible during encryption, decryption or signing.

Constructors

MessageSizeIncorrect

the message to decrypt is not of the correct size (need to be == private_size)

MessageTooLong

the message to encrypt is too long

MessageNotRecognized

the message decrypted doesn't have a PKCS15 structure (0 2 .. 0 msg)

SignatureTooLong

the message's digest is too long

InvalidParameters

some parameters lead to breaking assumptions.

Instances

Instances details
Show Error Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

showsPrec :: Int -> Error -> ShowS #

show :: Error -> String #

showList :: [Error] -> ShowS #

Eq Error Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

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

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

data Blinder Source #

A blinder, which keeps the timing of the private key operation from saying anything about the number it was given.

The private exponent is not what is at risk. expSafe, which the exponentiation goes through, keeps the value of an exponent out of the work it does.

What a blinder covers is the other side. Without one, the operation runs on the ciphertext as it arrived, so how long it takes depends on a number an attacker may have chosen and can vary -- which is what a remote timing attack on RSA needs. With one, the input is multiplied by a random value first and that value divided out afterwards, so the timing carries nothing an attacker can steer.

Every private key operation here takes a Maybe Blinder. The Safer form of each -- decryptSafer, signSafer and their kind -- generates one and is the one to reach for. Pass Nothing only where the input is not attacker controlled and you have decided that it is not.

A blinder costs one more exponentiation, by the public exponent, which is the cheap direction: measured on an Apple M4, PKCS#1 v1.5 signing goes from about 601 to about 620 microseconds.

Use a blinder once. generateBlinder makes a fresh one; carrying one across operations is not what it is for.

Constructors

Blinder !Integer !Integer 

Instances

Instances details
Show Blinder Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Eq Blinder Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

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

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

data PublicKey Source #

Represent a RSA public key

Constructors

PublicKey 

Fields

Instances

Instances details
Data PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

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 #

Generic PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Associated Types

type Rep PublicKey 
Instance details

Defined in Crypto.PubKey.RSA.Types

type Rep PublicKey = D1 ('MetaData "PublicKey" "Crypto.PubKey.RSA.Types" "crypton-2.2.5-923qx9xmPoRGJz70ZM2O9F" 'False) (C1 ('MetaCons "PublicKey" 'PrefixI 'True) (S1 ('MetaSel ('Just "public_size") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int) :*: (S1 ('MetaSel ('Just "public_n") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Integer) :*: S1 ('MetaSel ('Just "public_e") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Integer))))
Read PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Show PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

NFData PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

rnf :: PublicKey -> () #

Eq PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

type Rep PublicKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

type Rep PublicKey = D1 ('MetaData "PublicKey" "Crypto.PubKey.RSA.Types" "crypton-2.2.5-923qx9xmPoRGJz70ZM2O9F" 'False) (C1 ('MetaCons "PublicKey" 'PrefixI 'True) (S1 ('MetaSel ('Just "public_size") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int) :*: (S1 ('MetaSel ('Just "public_n") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Integer) :*: S1 ('MetaSel ('Just "public_e") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Integer))))

data PrivateKey Source #

Represent a RSA private key.

Only the pub, d fields are mandatory to fill.

p, q, dP, dQ, qinv are by-product during RSA generation, but are useful to record here to speed up massively the decrypt and sign operation.

implementations can leave optional fields to 0.

Constructors

PrivateKey 

Fields

Instances

Instances details
Data PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

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 #

Generic PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Associated Types

type Rep PrivateKey 
Instance details

Defined in Crypto.PubKey.RSA.Types

Read PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Show PrivateKey Source #

The public part is shown; the secret fields are not. Use debugShow to see them.

Instance details

Defined in Crypto.PubKey.RSA.Types

DebugShow PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

NFData PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

rnf :: PrivateKey -> () #

Eq PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

type Rep PrivateKey Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

newtype KeyPair Source #

Represent RSA KeyPair

note the RSA private key contains already an instance of public key for efficiency

Constructors

KeyPair PrivateKey 

Instances

Instances details
Data KeyPair Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

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.RSA.Types

Show KeyPair Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

DebugShow KeyPair Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

NFData KeyPair Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

rnf :: KeyPair -> () #

Eq KeyPair Source # 
Instance details

Defined in Crypto.PubKey.RSA.Types

Methods

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

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

toPublicKey :: KeyPair -> PublicKey Source #

Public key of a RSA KeyPair

toPrivateKey :: KeyPair -> PrivateKey Source #

Private key of a RSA KeyPair

private_size :: PrivateKey -> Int Source #

get the size in bytes from a private key

private_n :: PrivateKey -> Integer Source #

get n from a private key

private_e :: PrivateKey -> Integer Source #

get e from a private key