module Codec.Encryption.OpenPGP.KeyInfo
( pubkeySize
, pkalgoAbbrev
) where
import qualified Crypto.PubKey.DSA as DSA
import qualified Crypto.PubKey.ECC.ECDSA as ECDSA
import qualified Crypto.PubKey.ECC.Types as ECCT
import qualified Crypto.PubKey.RSA as RSA
import Data.Bits (shiftR)
import Data.List (unfoldr)
import Codec.Encryption.OpenPGP.Types
import qualified Codec.Encryption.OpenPGP.Types.Internal.Base as BaseTypes
import Codec.Encryption.OpenPGP.Types.Internal.Errors
( KeyInfoError (..)
)
pubkeySize :: PKey -> Either KeyInfoError Int
pubkeySize :: PKey -> Either KeyInfoError Int
pubkeySize (RSAPubKey (RSA_PublicKey PublicKey
x)) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right (PublicKey -> Int
RSA.public_size PublicKey
x Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8)
pubkeySize (DSAPubKey (DSA_PublicKey PublicKey
x)) =
Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right (Integer -> Int
bitcount (Integer -> Int) -> (PublicKey -> Integer) -> PublicKey -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Params -> Integer
DSA.params_p (Params -> Integer)
-> (PublicKey -> Params) -> PublicKey -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PublicKey -> Params
DSA.public_params (PublicKey -> Int) -> PublicKey -> Int
forall a b. (a -> b) -> a -> b
$ PublicKey
x)
pubkeySize (ElGamalPubKey Integer
p Integer
_ Integer
_) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right (Integer -> Int
bitcount Integer
p)
pubkeySize (ECDSAPubKey (ECDSA_PublicKey (ECDSA.PublicKey Curve
curve PublicPoint
_))) =
Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Curve -> Int
ECCT.curveSizeBits Curve
curve))
pubkeySize
( ECDHPubKey
(ECDSAPubKey (ECDSA_PublicKey (ECDSA.PublicKey Curve
curve PublicPoint
_)))
HashAlgorithm
_
SymmetricAlgorithm
_
) =
Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Curve -> Int
ECCT.curveSizeBits Curve
curve))
pubkeySize (ECDHPubKey (EdDSAPubKey EdSigningCurve
EdSigningCurve25519 EdPoint
_) HashAlgorithm
_ SymmetricAlgorithm
_) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right Int
256
pubkeySize (ECDHPubKey (EdDSAPubKey EdSigningCurve
EdSigningCurve448 EdPoint
_) HashAlgorithm
_ SymmetricAlgorithm
_) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right Int
448
pubkeySize (EdDSAPubKey EdSigningCurve
EdSigningCurve25519 EdPoint
_) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right Int
256
pubkeySize (EdDSAPubKey EdSigningCurve
EdSigningCurve448 EdPoint
_) = Int -> Either KeyInfoError Int
forall a b. b -> Either a b
Right Int
448
pubkeySize PKey
x = KeyInfoError -> Either KeyInfoError Int
forall a b. a -> Either a b
Left (PKey -> KeyInfoError
KeyInfoUnsupportedAlgorithm PKey
x)
bitcount :: Integer -> Int
bitcount :: Integer -> Int
bitcount =
(Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8)
(Int -> Int) -> (Integer -> Int) -> Integer -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Bool] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length
([Bool] -> Int) -> (Integer -> [Bool]) -> Integer -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Maybe (Bool, Integer)) -> Integer -> [Bool]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr
( \Integer
x ->
if Integer
x Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
0
then Maybe (Bool, Integer)
forall a. Maybe a
Nothing
else (Bool, Integer) -> Maybe (Bool, Integer)
forall a. a -> Maybe a
Just (Bool
True, Integer
x Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftR` Int
8)
)
pkalgoAbbrev :: PubKeyAlgorithm -> String
pkalgoAbbrev :: PubKeyAlgorithm -> String
pkalgoAbbrev PubKeyAlgorithm
RSA = String
"rsa"
pkalgoAbbrev PubKeyAlgorithm
DSA = String
"dsa"
pkalgoAbbrev PubKeyAlgorithm
ElgamalEncryptOnly = String
"elg"
pkalgoAbbrev PubKeyAlgorithm
DeprecatedRSAEncryptOnly = String
"-re"
pkalgoAbbrev PubKeyAlgorithm
DeprecatedRSASignOnly = String
"-rs"
pkalgoAbbrev PubKeyAlgorithm
ECDH = String
"ecdh"
pkalgoAbbrev PubKeyAlgorithm
ECDSA = String
"ecd"
pkalgoAbbrev PubKeyAlgorithm
ForbiddenElgamal = String
"-eg"
pkalgoAbbrev PubKeyAlgorithm
DH = String
"dh"
pkalgoAbbrev PubKeyAlgorithm
EdDSALegacy = String
"edd"
pkalgoAbbrev PubKeyAlgorithm
BaseTypes.X25519 = String
"x25"
pkalgoAbbrev PubKeyAlgorithm
BaseTypes.X448 = String
"x448"
pkalgoAbbrev PubKeyAlgorithm
BaseTypes.Ed25519 = String
"e25"
pkalgoAbbrev PubKeyAlgorithm
BaseTypes.Ed448 = String
"e448"
pkalgoAbbrev (OtherPKA Word8
_) = String
"."