{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StandaloneDeriving #-}
module Crypto.WebAuthn.Cose.PublicKey
(
UncheckedPublicKey (..),
checkPublicKey,
PublicKey (PublicKey),
EdDSAKeyBytes (..),
CoseCurveEdDSA (..),
coordinateSizeEdDSA,
CoseCurveECDSA (..),
toCryptCurveECDSA,
fromCryptCurveECDSA,
coordinateSizeECDSA,
)
where
import qualified Crypto.PubKey.ECC.Prim as ECC
import qualified Crypto.PubKey.ECC.Types as ECC
import qualified Crypto.PubKey.Ed25519 as Ed25519
import Crypto.WebAuthn.Internal.ToJSONOrphans (PrettyHexByteString (PrettyHexByteString))
import Data.Aeson (ToJSON)
import qualified Data.ByteString as BS
import Data.Text (Text)
import qualified Data.Text as Text
import GHC.Generics (Generic)
newtype EdDSAKeyBytes = EdDSAKeyBytes {EdDSAKeyBytes -> ByteString
unEdDSAKeyBytes :: BS.ByteString}
deriving newtype (EdDSAKeyBytes -> EdDSAKeyBytes -> Bool
(EdDSAKeyBytes -> EdDSAKeyBytes -> Bool)
-> (EdDSAKeyBytes -> EdDSAKeyBytes -> Bool) -> Eq EdDSAKeyBytes
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EdDSAKeyBytes -> EdDSAKeyBytes -> Bool
== :: EdDSAKeyBytes -> EdDSAKeyBytes -> Bool
$c/= :: EdDSAKeyBytes -> EdDSAKeyBytes -> Bool
/= :: EdDSAKeyBytes -> EdDSAKeyBytes -> Bool
Eq)
deriving (Int -> EdDSAKeyBytes -> ShowS
[EdDSAKeyBytes] -> ShowS
EdDSAKeyBytes -> String
(Int -> EdDSAKeyBytes -> ShowS)
-> (EdDSAKeyBytes -> String)
-> ([EdDSAKeyBytes] -> ShowS)
-> Show EdDSAKeyBytes
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EdDSAKeyBytes -> ShowS
showsPrec :: Int -> EdDSAKeyBytes -> ShowS
$cshow :: EdDSAKeyBytes -> String
show :: EdDSAKeyBytes -> String
$cshowList :: [EdDSAKeyBytes] -> ShowS
showList :: [EdDSAKeyBytes] -> ShowS
Show, [EdDSAKeyBytes] -> Value
[EdDSAKeyBytes] -> Encoding
EdDSAKeyBytes -> Value
EdDSAKeyBytes -> Encoding
(EdDSAKeyBytes -> Value)
-> (EdDSAKeyBytes -> Encoding)
-> ([EdDSAKeyBytes] -> Value)
-> ([EdDSAKeyBytes] -> Encoding)
-> ToJSON EdDSAKeyBytes
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: EdDSAKeyBytes -> Value
toJSON :: EdDSAKeyBytes -> Value
$ctoEncoding :: EdDSAKeyBytes -> Encoding
toEncoding :: EdDSAKeyBytes -> Encoding
$ctoJSONList :: [EdDSAKeyBytes] -> Value
toJSONList :: [EdDSAKeyBytes] -> Value
$ctoEncodingList :: [EdDSAKeyBytes] -> Encoding
toEncodingList :: [EdDSAKeyBytes] -> Encoding
ToJSON) via PrettyHexByteString
data UncheckedPublicKey
=
PublicKeyEdDSA
{
UncheckedPublicKey -> CoseCurveEdDSA
eddsaCurve :: CoseCurveEdDSA,
UncheckedPublicKey -> EdDSAKeyBytes
eddsaX :: EdDSAKeyBytes
}
|
PublicKeyECDSA
{
UncheckedPublicKey -> CoseCurveECDSA
ecdsaCurve :: CoseCurveECDSA,
UncheckedPublicKey -> Integer
ecdsaX :: Integer,
UncheckedPublicKey -> Integer
ecdsaY :: Integer
}
|
PublicKeyRSA
{
UncheckedPublicKey -> Integer
rsaN :: Integer,
UncheckedPublicKey -> Integer
rsaE :: Integer
}
deriving (UncheckedPublicKey -> UncheckedPublicKey -> Bool
(UncheckedPublicKey -> UncheckedPublicKey -> Bool)
-> (UncheckedPublicKey -> UncheckedPublicKey -> Bool)
-> Eq UncheckedPublicKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
== :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
$c/= :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
/= :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
Eq, Int -> UncheckedPublicKey -> ShowS
[UncheckedPublicKey] -> ShowS
UncheckedPublicKey -> String
(Int -> UncheckedPublicKey -> ShowS)
-> (UncheckedPublicKey -> String)
-> ([UncheckedPublicKey] -> ShowS)
-> Show UncheckedPublicKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UncheckedPublicKey -> ShowS
showsPrec :: Int -> UncheckedPublicKey -> ShowS
$cshow :: UncheckedPublicKey -> String
show :: UncheckedPublicKey -> String
$cshowList :: [UncheckedPublicKey] -> ShowS
showList :: [UncheckedPublicKey] -> ShowS
Show, (forall x. UncheckedPublicKey -> Rep UncheckedPublicKey x)
-> (forall x. Rep UncheckedPublicKey x -> UncheckedPublicKey)
-> Generic UncheckedPublicKey
forall x. Rep UncheckedPublicKey x -> UncheckedPublicKey
forall x. UncheckedPublicKey -> Rep UncheckedPublicKey x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. UncheckedPublicKey -> Rep UncheckedPublicKey x
from :: forall x. UncheckedPublicKey -> Rep UncheckedPublicKey x
$cto :: forall x. Rep UncheckedPublicKey x -> UncheckedPublicKey
to :: forall x. Rep UncheckedPublicKey x -> UncheckedPublicKey
Generic)
deriving instance ToJSON UncheckedPublicKey
newtype PublicKey = CheckedPublicKey UncheckedPublicKey
deriving newtype (PublicKey -> PublicKey -> Bool
(PublicKey -> PublicKey -> Bool)
-> (PublicKey -> PublicKey -> Bool) -> Eq PublicKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PublicKey -> PublicKey -> Bool
== :: PublicKey -> PublicKey -> Bool
$c/= :: PublicKey -> PublicKey -> Bool
/= :: PublicKey -> PublicKey -> Bool
Eq, Int -> PublicKey -> ShowS
[PublicKey] -> ShowS
PublicKey -> String
(Int -> PublicKey -> ShowS)
-> (PublicKey -> String)
-> ([PublicKey] -> ShowS)
-> Show PublicKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PublicKey -> ShowS
showsPrec :: Int -> PublicKey -> ShowS
$cshow :: PublicKey -> String
show :: PublicKey -> String
$cshowList :: [PublicKey] -> ShowS
showList :: [PublicKey] -> ShowS
Show)
deriving newtype instance ToJSON PublicKey
pattern PublicKey :: UncheckedPublicKey -> PublicKey
pattern $mPublicKey :: forall {r}.
PublicKey -> (UncheckedPublicKey -> r) -> ((# #) -> r) -> r
PublicKey k <- CheckedPublicKey k
{-# COMPLETE PublicKey #-}
checkPublicKey :: UncheckedPublicKey -> Either Text PublicKey
checkPublicKey :: UncheckedPublicKey -> Either Text PublicKey
checkPublicKey key :: UncheckedPublicKey
key@PublicKeyEdDSA {CoseCurveEdDSA
EdDSAKeyBytes
eddsaCurve :: UncheckedPublicKey -> CoseCurveEdDSA
eddsaX :: UncheckedPublicKey -> EdDSAKeyBytes
eddsaCurve :: CoseCurveEdDSA
eddsaX :: EdDSAKeyBytes
..}
| Int
actualSize Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
expectedSize = PublicKey -> Either Text PublicKey
forall a b. b -> Either a b
Right (PublicKey -> Either Text PublicKey)
-> PublicKey -> Either Text PublicKey
forall a b. (a -> b) -> a -> b
$ UncheckedPublicKey -> PublicKey
CheckedPublicKey UncheckedPublicKey
key
| Bool
otherwise =
Text -> Either Text PublicKey
forall a b. a -> Either a b
Left (Text -> Either Text PublicKey) -> Text -> Either Text PublicKey
forall a b. (a -> b) -> a -> b
$
Text
"EdDSA public key for curve "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (CoseCurveEdDSA -> String
forall a. Show a => a -> String
show CoseCurveEdDSA
eddsaCurve)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" didn't have the expected size of "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (Int -> String
forall a. Show a => a -> String
show Int
expectedSize)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" bytes, it has "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (Int -> String
forall a. Show a => a -> String
show Int
actualSize)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" bytes instead: "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (EdDSAKeyBytes -> String
forall a. Show a => a -> String
show EdDSAKeyBytes
eddsaX)
where
actualSize :: Int
actualSize = ByteString -> Int
BS.length (ByteString -> Int) -> ByteString -> Int
forall a b. (a -> b) -> a -> b
$ EdDSAKeyBytes -> ByteString
unEdDSAKeyBytes EdDSAKeyBytes
eddsaX
expectedSize :: Int
expectedSize = CoseCurveEdDSA -> Int
coordinateSizeEdDSA CoseCurveEdDSA
eddsaCurve
checkPublicKey key :: UncheckedPublicKey
key@PublicKeyECDSA {Integer
CoseCurveECDSA
ecdsaCurve :: UncheckedPublicKey -> CoseCurveECDSA
ecdsaX :: UncheckedPublicKey -> Integer
ecdsaY :: UncheckedPublicKey -> Integer
ecdsaCurve :: CoseCurveECDSA
ecdsaX :: Integer
ecdsaY :: Integer
..}
| Curve -> Point -> Bool
ECC.isPointValid Curve
curve Point
point = PublicKey -> Either Text PublicKey
forall a b. b -> Either a b
Right (PublicKey -> Either Text PublicKey)
-> PublicKey -> Either Text PublicKey
forall a b. (a -> b) -> a -> b
$ UncheckedPublicKey -> PublicKey
CheckedPublicKey UncheckedPublicKey
key
| Bool
otherwise =
Text -> Either Text PublicKey
forall a b. a -> Either a b
Left (Text -> Either Text PublicKey) -> Text -> Either Text PublicKey
forall a b. (a -> b) -> a -> b
$
Text
"ECDSA public key point is not valid for curve "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (CoseCurveECDSA -> String
forall a. Show a => a -> String
show CoseCurveECDSA
ecdsaCurve)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
": "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (Point -> String
forall a. Show a => a -> String
show Point
point)
where
curve :: Curve
curve = CurveName -> Curve
ECC.getCurveByName (CoseCurveECDSA -> CurveName
toCryptCurveECDSA CoseCurveECDSA
ecdsaCurve)
point :: Point
point = Integer -> Integer -> Point
ECC.Point Integer
ecdsaX Integer
ecdsaY
checkPublicKey UncheckedPublicKey
key = PublicKey -> Either Text PublicKey
forall a b. b -> Either a b
Right (PublicKey -> Either Text PublicKey)
-> PublicKey -> Either Text PublicKey
forall a b. (a -> b) -> a -> b
$ UncheckedPublicKey -> PublicKey
CheckedPublicKey UncheckedPublicKey
key
data CoseCurveEdDSA
=
CoseCurveEd25519
deriving (CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
(CoseCurveEdDSA -> CoseCurveEdDSA -> Bool)
-> (CoseCurveEdDSA -> CoseCurveEdDSA -> Bool) -> Eq CoseCurveEdDSA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
== :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
$c/= :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
/= :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
Eq, Int -> CoseCurveEdDSA -> ShowS
[CoseCurveEdDSA] -> ShowS
CoseCurveEdDSA -> String
(Int -> CoseCurveEdDSA -> ShowS)
-> (CoseCurveEdDSA -> String)
-> ([CoseCurveEdDSA] -> ShowS)
-> Show CoseCurveEdDSA
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CoseCurveEdDSA -> ShowS
showsPrec :: Int -> CoseCurveEdDSA -> ShowS
$cshow :: CoseCurveEdDSA -> String
show :: CoseCurveEdDSA -> String
$cshowList :: [CoseCurveEdDSA] -> ShowS
showList :: [CoseCurveEdDSA] -> ShowS
Show, Int -> CoseCurveEdDSA
CoseCurveEdDSA -> Int
CoseCurveEdDSA -> [CoseCurveEdDSA]
CoseCurveEdDSA -> CoseCurveEdDSA
CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
(CoseCurveEdDSA -> CoseCurveEdDSA)
-> (CoseCurveEdDSA -> CoseCurveEdDSA)
-> (Int -> CoseCurveEdDSA)
-> (CoseCurveEdDSA -> Int)
-> (CoseCurveEdDSA -> [CoseCurveEdDSA])
-> (CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA])
-> (CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA])
-> (CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA])
-> Enum CoseCurveEdDSA
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: CoseCurveEdDSA -> CoseCurveEdDSA
succ :: CoseCurveEdDSA -> CoseCurveEdDSA
$cpred :: CoseCurveEdDSA -> CoseCurveEdDSA
pred :: CoseCurveEdDSA -> CoseCurveEdDSA
$ctoEnum :: Int -> CoseCurveEdDSA
toEnum :: Int -> CoseCurveEdDSA
$cfromEnum :: CoseCurveEdDSA -> Int
fromEnum :: CoseCurveEdDSA -> Int
$cenumFrom :: CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFrom :: CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromThen :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFromThen :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromTo :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFromTo :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromThenTo :: CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFromThenTo :: CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
Enum, CoseCurveEdDSA
CoseCurveEdDSA -> CoseCurveEdDSA -> Bounded CoseCurveEdDSA
forall a. a -> a -> Bounded a
$cminBound :: CoseCurveEdDSA
minBound :: CoseCurveEdDSA
$cmaxBound :: CoseCurveEdDSA
maxBound :: CoseCurveEdDSA
Bounded, (forall x. CoseCurveEdDSA -> Rep CoseCurveEdDSA x)
-> (forall x. Rep CoseCurveEdDSA x -> CoseCurveEdDSA)
-> Generic CoseCurveEdDSA
forall x. Rep CoseCurveEdDSA x -> CoseCurveEdDSA
forall x. CoseCurveEdDSA -> Rep CoseCurveEdDSA x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CoseCurveEdDSA -> Rep CoseCurveEdDSA x
from :: forall x. CoseCurveEdDSA -> Rep CoseCurveEdDSA x
$cto :: forall x. Rep CoseCurveEdDSA x -> CoseCurveEdDSA
to :: forall x. Rep CoseCurveEdDSA x -> CoseCurveEdDSA
Generic)
deriving instance ToJSON CoseCurveEdDSA
coordinateSizeEdDSA :: CoseCurveEdDSA -> Int
coordinateSizeEdDSA :: CoseCurveEdDSA -> Int
coordinateSizeEdDSA CoseCurveEdDSA
CoseCurveEd25519 = Int
Ed25519.publicKeySize
data CoseCurveECDSA
=
CoseCurveP256
|
CoseCurveP384
|
CoseCurveP521
deriving (CoseCurveECDSA -> CoseCurveECDSA -> Bool
(CoseCurveECDSA -> CoseCurveECDSA -> Bool)
-> (CoseCurveECDSA -> CoseCurveECDSA -> Bool) -> Eq CoseCurveECDSA
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
== :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
$c/= :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
/= :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
Eq, Int -> CoseCurveECDSA -> ShowS
[CoseCurveECDSA] -> ShowS
CoseCurveECDSA -> String
(Int -> CoseCurveECDSA -> ShowS)
-> (CoseCurveECDSA -> String)
-> ([CoseCurveECDSA] -> ShowS)
-> Show CoseCurveECDSA
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CoseCurveECDSA -> ShowS
showsPrec :: Int -> CoseCurveECDSA -> ShowS
$cshow :: CoseCurveECDSA -> String
show :: CoseCurveECDSA -> String
$cshowList :: [CoseCurveECDSA] -> ShowS
showList :: [CoseCurveECDSA] -> ShowS
Show, Int -> CoseCurveECDSA
CoseCurveECDSA -> Int
CoseCurveECDSA -> [CoseCurveECDSA]
CoseCurveECDSA -> CoseCurveECDSA
CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
(CoseCurveECDSA -> CoseCurveECDSA)
-> (CoseCurveECDSA -> CoseCurveECDSA)
-> (Int -> CoseCurveECDSA)
-> (CoseCurveECDSA -> Int)
-> (CoseCurveECDSA -> [CoseCurveECDSA])
-> (CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA])
-> (CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA])
-> (CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA])
-> Enum CoseCurveECDSA
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: CoseCurveECDSA -> CoseCurveECDSA
succ :: CoseCurveECDSA -> CoseCurveECDSA
$cpred :: CoseCurveECDSA -> CoseCurveECDSA
pred :: CoseCurveECDSA -> CoseCurveECDSA
$ctoEnum :: Int -> CoseCurveECDSA
toEnum :: Int -> CoseCurveECDSA
$cfromEnum :: CoseCurveECDSA -> Int
fromEnum :: CoseCurveECDSA -> Int
$cenumFrom :: CoseCurveECDSA -> [CoseCurveECDSA]
enumFrom :: CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromThen :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFromThen :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromTo :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFromTo :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromThenTo :: CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFromThenTo :: CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
Enum, CoseCurveECDSA
CoseCurveECDSA -> CoseCurveECDSA -> Bounded CoseCurveECDSA
forall a. a -> a -> Bounded a
$cminBound :: CoseCurveECDSA
minBound :: CoseCurveECDSA
$cmaxBound :: CoseCurveECDSA
maxBound :: CoseCurveECDSA
Bounded, (forall x. CoseCurveECDSA -> Rep CoseCurveECDSA x)
-> (forall x. Rep CoseCurveECDSA x -> CoseCurveECDSA)
-> Generic CoseCurveECDSA
forall x. Rep CoseCurveECDSA x -> CoseCurveECDSA
forall x. CoseCurveECDSA -> Rep CoseCurveECDSA x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CoseCurveECDSA -> Rep CoseCurveECDSA x
from :: forall x. CoseCurveECDSA -> Rep CoseCurveECDSA x
$cto :: forall x. Rep CoseCurveECDSA x -> CoseCurveECDSA
to :: forall x. Rep CoseCurveECDSA x -> CoseCurveECDSA
Generic)
deriving instance ToJSON CoseCurveECDSA
toCryptCurveECDSA :: CoseCurveECDSA -> ECC.CurveName
toCryptCurveECDSA :: CoseCurveECDSA -> CurveName
toCryptCurveECDSA CoseCurveECDSA
CoseCurveP256 = CurveName
ECC.SEC_p256r1
toCryptCurveECDSA CoseCurveECDSA
CoseCurveP384 = CurveName
ECC.SEC_p384r1
toCryptCurveECDSA CoseCurveECDSA
CoseCurveP521 = CurveName
ECC.SEC_p521r1
fromCryptCurveECDSA :: ECC.CurveName -> Either Text CoseCurveECDSA
fromCryptCurveECDSA :: CurveName -> Either Text CoseCurveECDSA
fromCryptCurveECDSA CurveName
ECC.SEC_p256r1 = CoseCurveECDSA -> Either Text CoseCurveECDSA
forall a b. b -> Either a b
Right CoseCurveECDSA
CoseCurveP256
fromCryptCurveECDSA CurveName
ECC.SEC_p384r1 = CoseCurveECDSA -> Either Text CoseCurveECDSA
forall a b. b -> Either a b
Right CoseCurveECDSA
CoseCurveP384
fromCryptCurveECDSA CurveName
ECC.SEC_p521r1 = CoseCurveECDSA -> Either Text CoseCurveECDSA
forall a b. b -> Either a b
Right CoseCurveECDSA
CoseCurveP521
fromCryptCurveECDSA CurveName
curve =
Text -> Either Text CoseCurveECDSA
forall a b. a -> Either a b
Left (Text -> Either Text CoseCurveECDSA)
-> Text -> Either Text CoseCurveECDSA
forall a b. (a -> b) -> a -> b
$
Text
"Curve "
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
Text.pack (CurveName -> String
forall a. Show a => a -> String
show CurveName
curve)
Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" is not a supported COSE ECDSA public key curve"
coordinateSizeECDSA :: CoseCurveECDSA -> Int
coordinateSizeECDSA :: CoseCurveECDSA -> Int
coordinateSizeECDSA CoseCurveECDSA
curve = Int
byteSize
where
bitSize :: Int
bitSize = Curve -> Int
ECC.curveSizeBits (CurveName -> Curve
ECC.getCurveByName (CoseCurveECDSA -> CurveName
toCryptCurveECDSA CoseCurveECDSA
curve))
byteSize :: Int
byteSize = (Int
bitSize Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
7) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
8