{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
module Crypto.WebAuthn.Cose.PublicKey
(
UncheckedPublicKey (..),
checkPublicKey,
PublicKey (PublicKey),
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 ()
import Data.Aeson (ToJSON)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as Base16
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import GHC.Generics (Generic)
data UncheckedPublicKey
=
PublicKeyEdDSA
{
UncheckedPublicKey -> CoseCurveEdDSA
eddsaCurve :: CoseCurveEdDSA,
UncheckedPublicKey -> ByteString
eddsaX :: BS.ByteString
}
|
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
/= :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
$c/= :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
== :: UncheckedPublicKey -> UncheckedPublicKey -> Bool
$c== :: 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
showList :: [UncheckedPublicKey] -> ShowS
$cshowList :: [UncheckedPublicKey] -> ShowS
show :: UncheckedPublicKey -> String
$cshow :: UncheckedPublicKey -> String
showsPrec :: Int -> UncheckedPublicKey -> ShowS
$cshowsPrec :: Int -> 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
$cto :: forall x. Rep UncheckedPublicKey x -> UncheckedPublicKey
$cfrom :: forall x. UncheckedPublicKey -> Rep UncheckedPublicKey x
Generic, [UncheckedPublicKey] -> Encoding
[UncheckedPublicKey] -> Value
UncheckedPublicKey -> Encoding
UncheckedPublicKey -> Value
(UncheckedPublicKey -> Value)
-> (UncheckedPublicKey -> Encoding)
-> ([UncheckedPublicKey] -> Value)
-> ([UncheckedPublicKey] -> Encoding)
-> ToJSON UncheckedPublicKey
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [UncheckedPublicKey] -> Encoding
$ctoEncodingList :: [UncheckedPublicKey] -> Encoding
toJSONList :: [UncheckedPublicKey] -> Value
$ctoJSONList :: [UncheckedPublicKey] -> Value
toEncoding :: UncheckedPublicKey -> Encoding
$ctoEncoding :: UncheckedPublicKey -> Encoding
toJSON :: UncheckedPublicKey -> Value
$ctoJSON :: UncheckedPublicKey -> Value
ToJSON)
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
/= :: PublicKey -> PublicKey -> Bool
$c/= :: PublicKey -> PublicKey -> Bool
== :: PublicKey -> PublicKey -> Bool
$c== :: 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
showList :: [PublicKey] -> ShowS
$cshowList :: [PublicKey] -> ShowS
show :: PublicKey -> String
$cshow :: PublicKey -> String
showsPrec :: Int -> PublicKey -> ShowS
$cshowsPrec :: Int -> PublicKey -> ShowS
Show, [PublicKey] -> Encoding
[PublicKey] -> Value
PublicKey -> Encoding
PublicKey -> Value
(PublicKey -> Value)
-> (PublicKey -> Encoding)
-> ([PublicKey] -> Value)
-> ([PublicKey] -> Encoding)
-> ToJSON PublicKey
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PublicKey] -> Encoding
$ctoEncodingList :: [PublicKey] -> Encoding
toJSONList :: [PublicKey] -> Value
$ctoJSONList :: [PublicKey] -> Value
toEncoding :: PublicKey -> Encoding
$ctoEncoding :: PublicKey -> Encoding
toJSON :: PublicKey -> Value
$ctoJSON :: PublicKey -> Value
ToJSON)
pattern PublicKey :: UncheckedPublicKey -> PublicKey
pattern $mPublicKey :: forall r.
PublicKey -> (UncheckedPublicKey -> r) -> (Void# -> r) -> r
PublicKey k <- CheckedPublicKey k
{-# COMPLETE PublicKey #-}
checkPublicKey :: UncheckedPublicKey -> Either Text PublicKey
checkPublicKey :: UncheckedPublicKey -> Either Text PublicKey
checkPublicKey key :: UncheckedPublicKey
key@PublicKeyEdDSA {ByteString
CoseCurveEdDSA
eddsaX :: ByteString
eddsaCurve :: CoseCurveEdDSA
eddsaX :: UncheckedPublicKey -> ByteString
eddsaCurve :: UncheckedPublicKey -> CoseCurveEdDSA
..}
| 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
<> ByteString -> Text
Text.decodeUtf8 (ByteString -> ByteString
Base16.encode ByteString
eddsaX)
where
actualSize :: Int
actualSize = ByteString -> Int
BS.length ByteString
eddsaX
expectedSize :: Int
expectedSize = CoseCurveEdDSA -> Int
coordinateSizeEdDSA CoseCurveEdDSA
eddsaCurve
checkPublicKey key :: UncheckedPublicKey
key@PublicKeyECDSA {Integer
CoseCurveECDSA
ecdsaY :: Integer
ecdsaX :: Integer
ecdsaCurve :: CoseCurveECDSA
ecdsaY :: UncheckedPublicKey -> Integer
ecdsaX :: UncheckedPublicKey -> Integer
ecdsaCurve :: UncheckedPublicKey -> CoseCurveECDSA
..}
| 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
/= :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
$c/= :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
== :: CoseCurveEdDSA -> CoseCurveEdDSA -> Bool
$c== :: 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
showList :: [CoseCurveEdDSA] -> ShowS
$cshowList :: [CoseCurveEdDSA] -> ShowS
show :: CoseCurveEdDSA -> String
$cshow :: CoseCurveEdDSA -> String
showsPrec :: Int -> CoseCurveEdDSA -> ShowS
$cshowsPrec :: Int -> 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
enumFromThenTo :: CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromThenTo :: CoseCurveEdDSA
-> CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFromTo :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromTo :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFromThen :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFromThen :: CoseCurveEdDSA -> CoseCurveEdDSA -> [CoseCurveEdDSA]
enumFrom :: CoseCurveEdDSA -> [CoseCurveEdDSA]
$cenumFrom :: CoseCurveEdDSA -> [CoseCurveEdDSA]
fromEnum :: CoseCurveEdDSA -> Int
$cfromEnum :: CoseCurveEdDSA -> Int
toEnum :: Int -> CoseCurveEdDSA
$ctoEnum :: Int -> CoseCurveEdDSA
pred :: CoseCurveEdDSA -> CoseCurveEdDSA
$cpred :: CoseCurveEdDSA -> CoseCurveEdDSA
succ :: CoseCurveEdDSA -> CoseCurveEdDSA
$csucc :: CoseCurveEdDSA -> CoseCurveEdDSA
Enum, CoseCurveEdDSA
CoseCurveEdDSA -> CoseCurveEdDSA -> Bounded CoseCurveEdDSA
forall a. a -> a -> Bounded a
maxBound :: CoseCurveEdDSA
$cmaxBound :: CoseCurveEdDSA
minBound :: CoseCurveEdDSA
$cminBound :: 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
$cto :: forall x. Rep CoseCurveEdDSA x -> CoseCurveEdDSA
$cfrom :: forall x. CoseCurveEdDSA -> Rep CoseCurveEdDSA x
Generic, [CoseCurveEdDSA] -> Encoding
[CoseCurveEdDSA] -> Value
CoseCurveEdDSA -> Encoding
CoseCurveEdDSA -> Value
(CoseCurveEdDSA -> Value)
-> (CoseCurveEdDSA -> Encoding)
-> ([CoseCurveEdDSA] -> Value)
-> ([CoseCurveEdDSA] -> Encoding)
-> ToJSON CoseCurveEdDSA
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CoseCurveEdDSA] -> Encoding
$ctoEncodingList :: [CoseCurveEdDSA] -> Encoding
toJSONList :: [CoseCurveEdDSA] -> Value
$ctoJSONList :: [CoseCurveEdDSA] -> Value
toEncoding :: CoseCurveEdDSA -> Encoding
$ctoEncoding :: CoseCurveEdDSA -> Encoding
toJSON :: CoseCurveEdDSA -> Value
$ctoJSON :: CoseCurveEdDSA -> Value
ToJSON)
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
/= :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
$c/= :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
== :: CoseCurveECDSA -> CoseCurveECDSA -> Bool
$c== :: 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
showList :: [CoseCurveECDSA] -> ShowS
$cshowList :: [CoseCurveECDSA] -> ShowS
show :: CoseCurveECDSA -> String
$cshow :: CoseCurveECDSA -> String
showsPrec :: Int -> CoseCurveECDSA -> ShowS
$cshowsPrec :: Int -> 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
enumFromThenTo :: CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromThenTo :: CoseCurveECDSA
-> CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFromTo :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromTo :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFromThen :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFromThen :: CoseCurveECDSA -> CoseCurveECDSA -> [CoseCurveECDSA]
enumFrom :: CoseCurveECDSA -> [CoseCurveECDSA]
$cenumFrom :: CoseCurveECDSA -> [CoseCurveECDSA]
fromEnum :: CoseCurveECDSA -> Int
$cfromEnum :: CoseCurveECDSA -> Int
toEnum :: Int -> CoseCurveECDSA
$ctoEnum :: Int -> CoseCurveECDSA
pred :: CoseCurveECDSA -> CoseCurveECDSA
$cpred :: CoseCurveECDSA -> CoseCurveECDSA
succ :: CoseCurveECDSA -> CoseCurveECDSA
$csucc :: CoseCurveECDSA -> CoseCurveECDSA
Enum, CoseCurveECDSA
CoseCurveECDSA -> CoseCurveECDSA -> Bounded CoseCurveECDSA
forall a. a -> a -> Bounded a
maxBound :: CoseCurveECDSA
$cmaxBound :: CoseCurveECDSA
minBound :: CoseCurveECDSA
$cminBound :: 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
$cto :: forall x. Rep CoseCurveECDSA x -> CoseCurveECDSA
$cfrom :: forall x. CoseCurveECDSA -> Rep CoseCurveECDSA x
Generic, [CoseCurveECDSA] -> Encoding
[CoseCurveECDSA] -> Value
CoseCurveECDSA -> Encoding
CoseCurveECDSA -> Value
(CoseCurveECDSA -> Value)
-> (CoseCurveECDSA -> Encoding)
-> ([CoseCurveECDSA] -> Value)
-> ([CoseCurveECDSA] -> Encoding)
-> ToJSON CoseCurveECDSA
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CoseCurveECDSA] -> Encoding
$ctoEncodingList :: [CoseCurveECDSA] -> Encoding
toJSONList :: [CoseCurveECDSA] -> Value
$ctoJSONList :: [CoseCurveECDSA] -> Value
toEncoding :: CoseCurveECDSA -> Encoding
$ctoEncoding :: CoseCurveECDSA -> Encoding
toJSON :: CoseCurveECDSA -> Value
$ctoJSON :: CoseCurveECDSA -> Value
ToJSON)
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