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 +19/−13
- src/SSH/Channel.hs +9/−9
- src/SSH/Crypto.hs +17/−12
- src/SSH/Debug.hs +1/−1
- src/SSH/NetReader.hs +4/−4
- src/SSH/Sender.hs +8/−8
- src/SSH/Session.hs +12/−12
- src/SSH/Util.hs +4/−1
- ssh.cabal +3/−6
- test/keys/client/id_dsa2 +0/−12
- test/keys/client/id_dsa2.pub +0/−1
- test/keys/host.pub +0/−1
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