packages feed

ssh 0.3.1 → 0.3.2

raw patch · 12 files changed

+77/−80 lines, 12 filesdep ~RSAdep ~network

Dependency ranges changed: RSA, network

Files

src/SSH.hs view
@@ -1,31 +1,37 @@ module SSH where  import Control.Concurrent (forkIO)-import Control.Concurrent.Chan+import Control.Concurrent.Chan (newChan, writeChan) import Control.Exception (bracket) import Control.Monad (replicateM)-import Control.Monad.Trans.State+import Control.Monad.Trans.State (evalStateT, get, gets, modify) import Data.Digest.Pure.SHA (bytestringDigest, sha1)-import Crypto.HMAC-import Crypto.Hash.CryptoAPI+import Crypto.HMAC (hmac, MacKey(MacKey))+import Crypto.Hash.CryptoAPI (SHA1, MD5) import Data.List (intercalate) import Data.List.Split (splitOn)-import Network+import Network (PortID(..), PortNumber, withSocketsDo, listenOn, sClose, Socket, accept) import OpenSSL.BN (randIntegerOneToNMinusOne, modexp)-import System.IO-import System.Random+import System.IO (hPutStr, hSetBinaryMode, hPutStr, hFlush, hIsEOF, hGetLine)+import System.Random (randomRIO) import qualified Data.ByteString.Lazy as LBS import qualified Data.Map as M import qualified Data.Serialize as S -import SSH.Channel+import SSH.Channel (ChannelConfig(..), ChannelRequest(..), ChannelMessage(..), newChannel) import SSH.Crypto-import SSH.Debug-import SSH.NetReader-import SSH.Packet-import SSH.Sender+    ( Cipher(..), CipherType(..), CipherMode(..), HMAC(..), KeyPair(..)+    , sign, blob, blobToKey, verify, safePrime, generator+    )+import SSH.Debug (dump)+import SSH.NetReader (readByte, readBytes, readLBS, readULong, readInteger, readBool, readString)+import SSH.Packet (Packet, io, byte, raw, string, long, integer, byteString, doPacket, makeKey)+import SSH.Sender (SenderState(..), Sender(..), SenderMessage(..), sender) import SSH.Session-import SSH.Util+    ( SessionConfig(..), SessionState(..), Session, Authorize(..)+    , getPacket, net, getChannel, newChannelID+    )+import SSH.Util (strictLBS, fromLBS)   version :: String
src/SSH/Channel.hs view
@@ -1,20 +1,20 @@ {-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} module SSH.Channel where -import Control.Concurrent-import Control.Exception+import Control.Concurrent (ThreadId, Chan, newChan, readChan, writeChan, forkIO, killThread)+import Control.Exception (catch, IOException) import Control.Monad (when)-import Control.Monad.Trans.State-import Data.Word-import System.Exit-import System.IO+import Control.Monad.Trans.State (StateT, evalStateT, get, gets, modify)+import Data.Word (Word32)+import System.Exit (ExitCode(..))+import System.IO (Handle, hFlush, hClose, hIsEOF, hGetChar, hReady, hSetBinaryMode) import System.Process (ProcessHandle, runInteractiveCommand,                        terminateProcess, waitForProcess,) import qualified Data.ByteString.Lazy as LBS -import SSH.Debug-import SSH.Packet-import SSH.Sender+import SSH.Debug (dump)+import SSH.Packet (io, long, byte, string, Packet, packetLength)+import SSH.Sender (Sender(..), SenderMessage)  type Channel = StateT ChannelState IO 
src/SSH/Crypto.hs view
@@ -1,23 +1,23 @@ module SSH.Crypto where  import Control.Monad (replicateM)-import Control.Monad.Trans.State+import Control.Monad.Trans.State (evalState) import Data.ASN1.BinaryEncoding (BER(..), DER(..)) import Data.ASN1.Encoding (decodeASN1, encodeASN1)-import Data.ASN1.Stream-import Data.ASN1.Types+import Data.ASN1.Stream (getConstructedEnd)+import Data.ASN1.Types (ASN1(..), ASN1ConstructionType(..)) import Data.Digest.Pure.SHA (bytestringDigest, sha1) import Data.List (isPrefixOf) import qualified Codec.Binary.Base64.String as B64-import qualified Codec.Crypto.RSA as RSA+import qualified Codec.Crypto.RSA.Pure as RSA import qualified Data.ByteString.Lazy as LBS import qualified OpenSSL.DSA as DSA  import qualified Crypto.Types.PubKey.RSA as RSAKey -import SSH.Packet-import SSH.NetReader-import SSH.Util+import SSH.Packet (doPacket, string, integer, netString, netLBS)+import SSH.NetReader (readString, readInteger)+import SSH.Util (toLBS, fromLBS, strictLBS, fromOctets, i2osp, integerLog2)  data Cipher =     Cipher@@ -207,10 +207,12 @@ sign :: KeyPair -> LBS.ByteString -> IO LBS.ByteString sign (RSAKeyPair p@(RSAPublicKey e n) d _ _ _ _ _) m = do   let keyLen = rsaKeyLen p-  return $ LBS.concat-    [ netString "ssh-rsa"-    , netLBS (RSA.rsassa_pkcs1_v1_5_sign RSA.ha_SHA1 (RSAKey.PrivateKey (RSAKey.PublicKey keyLen n e) d 0 0 0 0 0) m)-    ]+      sig = RSA.rsassa_pkcs1_v1_5_sign RSA.hashSHA1 (RSAKey.PrivateKey (RSAKey.PublicKey keyLen n e) d 0 0 0 0 0) m+  case sig of+    Right sigBs -> return $ LBS.concat [ netString "ssh-rsa"+                                       , netLBS sigBs+                                       ]+    Left rsaErr -> error $ "Error while performing RSA signature: " ++ show rsaErr sign (DSAKeyPair (DSAPublicKey p q g y) x) m = do     (r, s) <- DSA.signDigestedDataWithDSA (DSA.tupleToDSAKeyPair (p, q, g, y, x)) digest     return $ LBS.concat@@ -235,7 +237,10 @@ verify p@(RSAPublicKey e n) message signature = do     let keyLen = rsaKeyLen p         realSignature = LBS.drop (LBS.length signature - fromIntegral keyLen) signature-    return $ RSA.rsassa_pkcs1_v1_5_verify RSA.ha_SHA1 (RSAKey.PublicKey keyLen n e) message realSignature+        sigRes = RSA.rsassa_pkcs1_v1_5_verify RSA.hashSHA1 (RSAKey.PublicKey keyLen n e) message realSignature+    return $ case sigRes of+               Right r -> r+               Left  _ -> False  verify (DSAPublicKey p q g y) message signature = do     let realSignature = LBS.drop (LBS.length signature - 40) signature
src/SSH/Debug.hs view
@@ -1,4 +1,4 @@-module SSH.Debug where+module SSH.Debug (debug, debugging, dump) where  import Debug.Trace 
src/SSH/NetReader.hs view
@@ -1,12 +1,12 @@ module SSH.NetReader where -import Control.Monad.Trans.State+import Control.Monad.Trans.State (State, gets, modify) import Data.Binary (decode)-import Data.Int-import Data.Word+import Data.Int (Int32)+import Data.Word (Word8, Word32) import qualified Data.ByteString.Lazy as LBS -import SSH.Packet+import SSH.Packet (unmpint) import SSH.Util (fromLBS)  
src/SSH/Sender.hs view
@@ -1,18 +1,18 @@ module SSH.Sender where -import Control.Concurrent.Chan+import Control.Concurrent.Chan (Chan, readChan) import Control.Monad (replicateM)-import Data.Word-import System.IO-import System.Random+import Data.Word (Word8, Word32)+import System.IO (Handle, hFlush)+import System.Random (randomRIO) import qualified Codec.Crypto.SimpleAES as A import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS -import SSH.Debug-import SSH.Crypto-import SSH.Packet-import SSH.Util+import SSH.Debug (dump)+import SSH.Crypto (Cipher(..), HMAC(..), CipherType(..), CipherMode(..), fromBlocks, toBlocks)+import SSH.Packet (Packet, doPacket, raw, byte, long)+import SSH.Util (strictLBS)   data SenderState
src/SSH/Session.hs view
@@ -1,24 +1,24 @@ {-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} module SSH.Session where -import Control.Concurrent.Chan-import Control.Monad.IO.Class-import Control.Monad.Trans.State+import Control.Concurrent.Chan (Chan)+import Control.Monad.IO.Class (liftIO)+import Control.Monad.Trans.State (StateT, get, gets, modify, runState) import Data.Binary (decode, encode)-import Data.Word-import System.IO+import Data.Word (Word8, Word32)+import System.IO (Handle) import qualified Codec.Crypto.SimpleAES as A import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.Map as M -import SSH.Channel-import SSH.Crypto hiding (verify)-import SSH.Debug-import SSH.NetReader-import SSH.Packet-import SSH.Sender-import SSH.Util+import SSH.Channel (ChannelConfig, ChannelMessage)+import SSH.Crypto (Cipher(..), HMAC(..), KeyPair(..), PublicKey(..), CipherType(..), CipherMode(..), toBlocks)+import SSH.Debug (dump)+import SSH.NetReader (NetReader)+import SSH.Packet (io)+import SSH.Sender (Sender(..), SenderMessage)+import SSH.Util (strictLBS)   type Session = StateT SessionState IO
src/SSH/Util.hs view
@@ -1,5 +1,8 @@ {-# LANGUAGE MagicHash #-}-module SSH.Util where+module SSH.Util+    ( toLBS, fromLBS, strictLBS+    , integerLog2, toOctets, fromOctets, i2osp+    ) where  import Data.Word (Word8) import qualified Data.ByteString as BS
ssh.cabal view
@@ -1,5 +1,5 @@ name:                ssh-version:             0.3.1+version:             0.3.2 synopsis:            A pure-Haskell SSH server library. description:     This a library for implementing your own servers that handle SSH@@ -20,7 +20,6 @@ extra-source-files:  CHANGES,                      README,                      test/keys/host,-                     test/keys/host.pub,                      test/keys/client/id_rsa_test,                      test/keys/client/id_rsa_test.pub,                      test/keys/client/id_rsa_test2,@@ -32,9 +31,7 @@                      test/keys/client/id_rsa_4096,                      test/keys/client/id_rsa_4096.pub,                      test/keys/client/id_dsa,-                     test/keys/client/id_dsa.pub,-                     test/keys/client/id_dsa2,-                     test/keys/client/id_dsa2.pub+                     test/keys/client/id_dsa.pub   source-repository   head@@ -71,7 +68,7 @@                     integer-gmp >= 0.5 && < 1.1,                     network,                     process,-                    RSA >= 1.2 && < 1.3,+                    RSA >= 2.1.0 && < 2.1.1,                     random,                     SHA,                     SimpleAES,
− test/keys/client/id_dsa2
@@ -1,12 +0,0 @@------BEGIN DSA PRIVATE KEY------MIIBuwIBAAKBgQD3ncQcimGZGV5mMZxfYRpfMcwUhMXbW7jUuWLDvfMXm9dpfw4H-nKeXP7LtDSjzUQreXA6lf20wh3/dxsKNFAbqPwgDuOxZD5JXPahMaoNqOg+/V5DD-qhTjJrxGzsMCWstYV1nsCQMN4aVlZLqJ4dhiVwwRIkCbPXFmhuJYxhL8aQIVAO9L-HPk1IGpMSi2gcGqKS754Kr+JAoGAfWTPY44qm5T+z6Tn7EwVaak5wj4XwrzvfGKY-ay/LKyPGn9m8Y+YfJ2zv1QQyTXmNC1wjpKI8ZL6ff8d0ft1RO6+HsFvoCSHDWPKR-x5ZopfUg/pDeiVwwU83IhSmPUECz/+8jGZ+rKrQdLc3bc1GhyfvcsAWL5PBwzqDs-z4X4WTUCgYAPrLJresqVe+jDHRIzvW5WhyYgyjN2PMHYxV/J7i54pM4Qj/zHPiK3-TpeuaCLgih2DQbtJrn+4KfIbv+/v2AsHGcj/kZEGvS1+t+pX98zo10gdsSAVoOig-nAp4Rt18vFbSc+0xQgj0NFrWvSrU6bszSVD1fYGkpdzbg+WSwscMsQIVALC8wPU1-fTf6hMJojbMUTbOZWMRM------END DSA PRIVATE KEY-----
− test/keys/client/id_dsa2.pub
@@ -1,1 +0,0 @@-ssh-dss AAAAB3NzaC1kc3MAAACBAPedxByKYZkZXmYxnF9hGl8xzBSExdtbuNS5YsO98xeb12l/Dgecp5c/su0NKPNRCt5cDqV/bTCHf93Gwo0UBuo/CAO47FkPklc9qExqg2o6D79XkMOqFOMmvEbOwwJay1hXWewJAw3hpWVkuonh2GJXDBEiQJs9cWaG4ljGEvxpAAAAFQDvSxz5NSBqTEotoHBqiku+eCq/iQAAAIB9ZM9jjiqblP7PpOfsTBVpqTnCPhfCvO98YphrL8srI8af2bxj5h8nbO/VBDJNeY0LXCOkojxkvp9/x3R+3VE7r4ewW+gJIcNY8pHHlmil9SD+kN6JXDBTzciFKY9QQLP/7yMZn6sqtB0tzdtzUaHJ+9ywBYvk8HDOoOzPhfhZNQAAAIAPrLJresqVe+jDHRIzvW5WhyYgyjN2PMHYxV/J7i54pM4Qj/zHPiK3TpeuaCLgih2DQbtJrn+4KfIbv+/v2AsHGcj/kZEGvS1+t+pX98zo10gdsSAVoOignAp4Rt18vFbSc+0xQgj0NFrWvSrU6bszSVD1fYGkpdzbg+WSwscMsQ== ganesh@paxton
− test/keys/host.pub
@@ -1,1 +0,0 @@-ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzNP/nr/FCVvTwv5Z0m/ThcDFXcsWo2TvccYJ3Yw66XpDlKIMtP6zZ+KwrY8Vih3BEPXIh3nmi7LfEJU2SPUV1itfgVred10+3yrOHCsouGahZUSjh7n2SPPyrmqEIU4ey1iwe0oc0rW98mJlpiUi4b39eYFkdMtWbO/CSGfSdcq2EwVKrmHwwu+M/TT8RjjfyW5jGSXqtqjk7sko4Wcz8DX+jOfGFilt3/NCd3I7vPkByE704MY0L6FsQKQgLxzZXpdskKF+iUdNR7pbPzT0R2/LPBcIjldT9aTevo/qlVrUD+q4nqWDfduJz8VtlTEyFUmDG1ZQeL+Cg43lSI9zP ganesh@paxton