packages feed

sbp-4.10.0: src/SwiftNav/SBP/Signing.hs

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE TemplateHaskell             #-}
{-# LANGUAGE RecordWildCards             #-}

-- |
-- Module:      SwiftNav.SBP.Signing
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- \< Messages relating to signatures \>

module SwiftNav.SBP.Signing
  ( module SwiftNav.SBP.Signing
  ) where

import BasicPrelude
import Control.Lens
import Control.Monad.Loops
import Data.Binary
import Data.Binary.Get
import Data.Binary.IEEE754
import Data.Binary.Put
import Data.ByteString.Lazy    hiding (ByteString)
import Data.Int
import Data.Word
import SwiftNav.SBP.TH
import SwiftNav.SBP.Types
import SwiftNav.SBP.Gnss

{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
{-# ANN module ("HLint: ignore Redundant do"::String) #-}
{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}


msgEd25519SignatureDep :: Word16
msgEd25519SignatureDep = 0x0C01

data MsgEd25519SignatureDep = MsgEd25519SignatureDep
  { _msgEd25519SignatureDep_signature     :: ![Word8]
    -- ^ ED25519 signature for messages.
  , _msgEd25519SignatureDep_fingerprint   :: ![Word8]
    -- ^ SHA-1 fingerprint of the associated certificate.
  , _msgEd25519SignatureDep_signed_messages :: ![Word32]
    -- ^ CRCs of signed messages.
  } deriving ( Show, Read, Eq )

instance Binary MsgEd25519SignatureDep where
  get = do
    _msgEd25519SignatureDep_signature <- replicateM 64 getWord8
    _msgEd25519SignatureDep_fingerprint <- replicateM 20 getWord8
    _msgEd25519SignatureDep_signed_messages <- whileM (not <$> isEmpty) getWord32le
    pure MsgEd25519SignatureDep {..}

  put MsgEd25519SignatureDep {..} = do
    mapM_ putWord8 _msgEd25519SignatureDep_signature
    mapM_ putWord8 _msgEd25519SignatureDep_fingerprint
    mapM_ putWord32le _msgEd25519SignatureDep_signed_messages

$(makeSBP 'msgEd25519SignatureDep ''MsgEd25519SignatureDep)
$(makeJSON "_msgEd25519SignatureDep_" ''MsgEd25519SignatureDep)
$(makeLenses ''MsgEd25519SignatureDep)

msgEd25519Certificate :: Word16
msgEd25519Certificate = 0x0C02

data MsgEd25519Certificate = MsgEd25519Certificate
  { _msgEd25519Certificate_n_msg           :: !Word8
    -- ^ Total number messages that make up the certificate. First nibble is the
    -- size of the sequence (n), second nibble is the zero-indexed counter
    -- (ith packet of n)
  , _msgEd25519Certificate_fingerprint     :: ![Word8]
    -- ^ SHA-1 fingerprint of the associated certificate.
  , _msgEd25519Certificate_certificate_bytes :: ![Word8]
    -- ^ ED25519 certificate bytes.
  } deriving ( Show, Read, Eq )

instance Binary MsgEd25519Certificate where
  get = do
    _msgEd25519Certificate_n_msg <- getWord8
    _msgEd25519Certificate_fingerprint <- replicateM 20 getWord8
    _msgEd25519Certificate_certificate_bytes <- whileM (not <$> isEmpty) getWord8
    pure MsgEd25519Certificate {..}

  put MsgEd25519Certificate {..} = do
    putWord8 _msgEd25519Certificate_n_msg
    mapM_ putWord8 _msgEd25519Certificate_fingerprint
    mapM_ putWord8 _msgEd25519Certificate_certificate_bytes

$(makeSBP 'msgEd25519Certificate ''MsgEd25519Certificate)
$(makeJSON "_msgEd25519Certificate_" ''MsgEd25519Certificate)
$(makeLenses ''MsgEd25519Certificate)

msgEd25519Signature :: Word16
msgEd25519Signature = 0x0C03

data MsgEd25519Signature = MsgEd25519Signature
  { _msgEd25519Signature_stream_counter  :: !Word8
    -- ^ Signature message counter. Zero indexed and incremented with each
    -- signature message. The counter will not increment if this message was
    -- in response to an on demand request. The counter will roll over after
    -- 256 messages. Upon connection, the value of the counter may not
    -- initially be zero.
  , _msgEd25519Signature_on_demand_counter :: !Word8
    -- ^ On demand message counter. Zero indexed and incremented with each
    -- signature message sent in response to an on demand message. The counter
    -- will roll over after 256 messages. Upon connection, the value of the
    -- counter may not initially be zero.
  , _msgEd25519Signature_signature       :: ![Word8]
    -- ^ ED25519 signature for messages.
  , _msgEd25519Signature_fingerprint     :: ![Word8]
    -- ^ SHA-1 fingerprint of the associated certificate.
  , _msgEd25519Signature_signed_messages :: ![Word32]
    -- ^ CRCs of signed messages.
  } deriving ( Show, Read, Eq )

instance Binary MsgEd25519Signature where
  get = do
    _msgEd25519Signature_stream_counter <- getWord8
    _msgEd25519Signature_on_demand_counter <- getWord8
    _msgEd25519Signature_signature <- replicateM 64 getWord8
    _msgEd25519Signature_fingerprint <- replicateM 20 getWord8
    _msgEd25519Signature_signed_messages <- whileM (not <$> isEmpty) getWord32le
    pure MsgEd25519Signature {..}

  put MsgEd25519Signature {..} = do
    putWord8 _msgEd25519Signature_stream_counter
    putWord8 _msgEd25519Signature_on_demand_counter
    mapM_ putWord8 _msgEd25519Signature_signature
    mapM_ putWord8 _msgEd25519Signature_fingerprint
    mapM_ putWord32le _msgEd25519Signature_signed_messages

$(makeSBP 'msgEd25519Signature ''MsgEd25519Signature)
$(makeJSON "_msgEd25519Signature_" ''MsgEd25519Signature)
$(makeLenses ''MsgEd25519Signature)