module Crypto.JOSE.Legacy
(
JWK'
) where
import Control.Applicative
import Control.Arrow
import Data.Aeson
import Data.Aeson.Types
import Crypto.JOSE.Classes
import Crypto.JOSE.JWA.JWK
import qualified Crypto.JOSE.Types.Internal as Types
import Crypto.JOSE.TH
$(Crypto.JOSE.TH.deriveJOSEType "RS" ["RS"])
newtype RSKeyParameters = RSKeyParameters RSAKeyParameters
deriving (Eq, Show)
instance FromJSON RSKeyParameters where
parseJSON = withObject "RS" $ \o -> fmap RSKeyParameters $ RSAKeyParameters
<$> ((o .: "algorithm" :: Parser RS) *> pure RSA)
<*> o .: "modulus"
<*> o .: "exponent"
<*> (fmap (`RSAPrivateKeyParameters` Nothing) <$> (o .:? "secretExponent"))
instance ToJSON RSKeyParameters where
toJSON (RSKeyParameters (RSAKeyParameters _ n e priv))
= object $ ["algorithm" .= RS, "modulus" .= n ,"exponent" .= e]
++ maybe [] (\p -> ["secretExponent" .= rsaD p]) priv
instance Key RSKeyParameters where
type KeyGenParam RSKeyParameters = Int
type KeyContent RSKeyParameters = RSAKeyParameters
gen p = first fromKeyContent . gen p
fromKeyContent = RSKeyParameters
sign h (RSKeyParameters k) = sign h k
verify h (RSKeyParameters k) = verify h k
newtype JWK' = JWK' RSKeyParameters deriving (Eq, Show)
instance FromJSON JWK' where
parseJSON = withObject "JWK'" $ \o -> JWK' <$> parseJSON (Object o)
instance ToJSON JWK' where
toJSON (JWK' k) = object $
"version" .= ("2012.08.15" :: String) : Types.objectPairs (toJSON k)
instance Key JWK' where
type KeyGenParam JWK' = Int
type KeyContent JWK' = RSKeyParameters
gen p g = first JWK' $ gen p g
fromKeyContent = JWK'
sign h (JWK' k) = sign h k
verify h (JWK' k) = verify h k