module Codec.Encryption.OpenPGP.SerializeForSigs (
putPKPforFingerprinting
, putPartialSigforSigning
, putSigTrailer
, putUforSigning
, putUIDforSigning
, putUAtforSigning
, putKeyforSigning
, putSigforSigning
) where
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC8
import Data.Serialize (Serialize, put)
import Data.Serialize.Put (Put, putWord8, putWord16be, putWord32be, putByteString, runPut)
import Codec.Encryption.OpenPGP.Serialize (putSKAddendum)
import Codec.Encryption.OpenPGP.Types
putPKPforFingerprinting :: Packet -> Put
putPKPforFingerprinting (PublicKey pkp) = do
putWord8 0x99
let bs = runPut $ put pkp
putWord16be . fromIntegral $ B.length bs
putByteString bs
putPKPforFingerprinting _ = fail "This should never happen"
putPartialSigforSigning :: Packet -> Put
putPartialSigforSigning (Signature (SigV4 st pka ha hashed _ _ _)) = do
putWord8 4
put st
put pka
put ha
let hb = runPut $ mapM_ put hashed
putWord16be . fromIntegral . B.length $ hb
putByteString hb
putPartialSigforSigning _ = fail "This should never happen"
putSigTrailer :: Packet -> Put
putSigTrailer (Signature (SigV4 _ _ _ hs _ _ _)) = do
putWord8 0x04
putWord8 0xff
putWord32be . fromIntegral . (+6) . B.length $ runPut $ mapM_ put hs
putSigTrailer _ = fail "This should never happen"
putUforSigning :: Packet -> Put
putUforSigning u@(UserId _) = putUIDforSigning u
putUforSigning u@(UserAttribute _) = putUAtforSigning u
putUforSigning _ = fail "This should never happen"
putUIDforSigning :: Packet -> Put
putUIDforSigning (UserId u) = do
putWord8 0xB4
let bs = BC8.pack u
putWord32be . fromIntegral . B.length $ bs
putByteString bs
putUIDforSigning _ = fail "This should never happen"
putUAtforSigning :: Packet -> Put
putUAtforSigning (UserAttribute us) = do
putWord8 0xD1
let bs = runPut (mapM_ put us)
putWord32be . fromIntegral . B.length $ bs
putByteString bs
putUAtforSigning _ = fail "This should never happen"
putSigforSigning :: Packet -> Put
putSigforSigning (Signature (SigV4 st pka ha hashed _ left16 mpis)) = do
putWord8 0x88
let bs = runPut $ put (SigV4 st pka ha hashed [] left16 mpis)
putWord32be . fromIntegral . B.length $ bs
putByteString bs
putSigforSigning _ = fail "Non-V4 not implemented."
putKeyforSigning :: Packet -> Put
putKeyforSigning (PublicKey pkp) = putKeyForSigning' pkp
putKeyforSigning (PublicSubkey pkp) = putKeyForSigning' pkp
putKeyforSigning (SecretKey pkp _) = putKeyForSigning' pkp
putKeyforSigning (SecretSubkey pkp _) = putKeyForSigning' pkp
putKeyforSigning _ = fail "This should never happen"
putKeyForSigning' :: PKPayload -> Put
putKeyForSigning' pkp = do
putWord8 0x99
let bs = runPut $ put pkp
putWord16be . fromIntegral . B.length $ bs
putByteString bs