diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Channel.hs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/Channel.hs b/src/Channel.hs index 625d526..8753ecf 100644 --- a/src/Channel.hs +++ b/src/Channel.hs @@ -20,7 +20,7 @@ import Crypto.Cipher.Types import Crypto.Error import Data.Binary -import Data.ByteArray +import Data.ByteArray (ByteArray, Bytes, ScrubbedBytes, append, convert) import Data.ByteArray qualified as BA import Data.ByteString qualified as B import Data.ByteString.Lazy qualified as BL @@ -90,8 +90,13 @@ createChannelRequest st self peer = liftIO $ do acceptChannelRequest :: (MonadIO m, MonadError String m) => UnifiedIdentity -> UnifiedIdentity -> Stored ChannelRequest -> m (Stored ChannelAccept, Channel) acceptChannelRequest self peer req = do - when ((crPeers $ fromStored $ signedData $ fromStored req) /= sort (map idData [self, peer])) $ - throwError $ "mismatched peers in channel request" + case sequence $ map validateIdentity $ crPeers $ fromStored $ signedData $ fromStored req of + Nothing -> throwError $ "invalid peers in channel request" + Just peers -> do + when (not $ any (self `sameIdentity`) peers) $ + throwError $ "self identity missing in channel request peers" + when (not $ any (peer `sameIdentity`) peers) $ + throwError $ "peer identity missing in channel request peers" when (idKeyMessage peer `notElem` (map (sigKey . fromStored) $ signedSignature $ fromStored req)) $ throwError $ "channel requent not signed by peer" @@ -116,8 +121,13 @@ acceptedChannel self peer acc = do let req = caRequest $ fromStored $ signedData $ fromStored acc KeySizeFixed ksize = cipherKeySize (undefined :: AES128) - when ((crPeers $ fromStored $ signedData $ fromStored req) /= sort (map idData [self, peer])) $ - throwError $ "mismatched peers in channel accept" + case sequence $ map validateIdentity $ crPeers $ fromStored $ signedData $ fromStored req of + Nothing -> throwError $ "invalid peers in channel accept" + Just peers -> do + when (not $ any (self `sameIdentity`) peers) $ + throwError $ "self identity missing in channel accept peers" + when (not $ any (peer `sameIdentity`) peers) $ + throwError $ "peer identity missing in channel accept peers" when (idKeyMessage peer `notElem` (map (sigKey . fromStored) $ signedSignature $ fromStored acc)) $ throwError $ "channel accept not signed by peer" when (idKeyMessage self `notElem` (map (sigKey . fromStored) $ signedSignature $ fromStored req)) $ |