shadowsocks 1.20140617 → 1.20140713
raw patch · 3 files changed
+10/−122 lines, 3 filesdep ~HsOpenSSL
Dependency ranges changed: HsOpenSSL
Files
- Shadowsocks/Cipher.hsc +0/−110
- Shadowsocks/Encrypt.hs +4/−4
- shadowsocks.cabal +6/−8
− Shadowsocks/Cipher.hsc
@@ -1,110 +0,0 @@--- Shamelessly taken from https://github.com/phonohawk/HsOpenSSL--- With ByteString version of cipherInit--{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE ForeignFunctionInterface #-}--module Shadowsocks.Cipher- ( CryptoMode (..)- , cipherInit- , cipherUpdateBS- , getCipherByName- ) where--#include <openssl/evp.h>--import Control.Applicative ((<$>))-import Control.Exception (mask_)-import Control.Monad (void)-import qualified Data.ByteString.Internal as B8-import Data.ByteString (useAsCStringLen)-import Foreign.C-import Foreign.C.Types-import Foreign.ForeignPtr-import Foreign.Marshal.Alloc (alloca)-import Foreign.Ptr-import Foreign.Storable (Storable(..))--foreign import ccall unsafe "EVP_CIPHER_CTX_init"- _cipher_ctx_init :: Ptr EVP_CIPHER_CTX -> IO ()--foreign import ccall unsafe "&EVP_CIPHER_CTX_cleanup"- _cipher_ctx_cleanup :: FunPtr (Ptr EVP_CIPHER_CTX -> IO ())--foreign import ccall unsafe "EVP_CIPHER_CTX_block_size"- _cipher_ctx_block_size :: Ptr EVP_CIPHER_CTX -> CInt--foreign import ccall unsafe "EVP_get_cipherbyname"- _get_cipherbyname :: CString -> IO (Ptr EVP_CIPHER)--foreign import ccall unsafe "EVP_CipherInit"- _CipherInit :: Ptr EVP_CIPHER_CTX- -> Ptr EVP_CIPHER -> CString -> CString -> CInt -> IO CInt--foreign import ccall unsafe "EVP_CipherUpdate"- _CipherUpdate :: Ptr EVP_CIPHER_CTX -> Ptr CChar -> Ptr CInt- -> Ptr CChar -> CInt -> IO CInt--newtype Cipher = Cipher (Ptr EVP_CIPHER)-data EVP_CIPHER--newtype CipherCtx = CipherCtx (ForeignPtr EVP_CIPHER_CTX)-data EVP_CIPHER_CTX--newCipherCtx :: IO CipherCtx-newCipherCtx = do- ctx <- mallocForeignPtrBytes (#size EVP_CIPHER_CTX)- mask_ $ do- withForeignPtr ctx _cipher_ctx_init- addForeignPtrFinalizer _cipher_ctx_cleanup ctx- return $ CipherCtx ctx--withCipherCtxPtr :: CipherCtx -> (Ptr EVP_CIPHER_CTX -> IO a) -> IO a-withCipherCtxPtr (CipherCtx ctx) = withForeignPtr ctx---- |@'getCipherByName' name@ returns a symmetric cipher algorithm--- whose name is @name@. If no algorithms are found, the result is--- @Nothing@.-getCipherByName :: String -> IO (Maybe Cipher)-getCipherByName name- = withCString name $ \ namePtr ->- do ptr <- _get_cipherbyname namePtr- return $ if ptr == nullPtr then Nothing else Just $ Cipher ptr--data CryptoMode = Encrypt | Decrypt--cryptoModeToInt :: CryptoMode -> CInt-cryptoModeToInt Encrypt = 1-cryptoModeToInt Decrypt = 0--cipherInit :: Cipher- -> B8.ByteString -> B8.ByteString -> CryptoMode -> IO CipherCtx-cipherInit (Cipher c) key iv mode- = do ctx <- newCipherCtx- withCipherCtxPtr ctx $ \ ctxPtr ->- useAsCStringLen key $ \ (keyPtr, _) ->- useAsCStringLen iv $ \ (ivPtr, _) ->- _CipherInit ctxPtr c keyPtr ivPtr (cryptoModeToInt mode)- >>= failIf_ (/= 1)- return ctx--cipherUpdateBS :: CipherCtx -> B8.ByteString -> IO B8.ByteString-cipherUpdateBS ctx inBS =- withCipherCtxPtr ctx $ \ctxPtr ->- useAsCStringLen inBS $ \(inBuf, inLen) ->- let len = inLen + fromIntegral (_cipher_ctx_block_size ctxPtr) - 1 in- B8.createAndTrim len $ \outBuf ->- alloca $ \outLenPtr ->- _CipherUpdate ctxPtr (castPtr outBuf) outLenPtr inBuf- (fromIntegral inLen)- >>= failIf (/= 1)- >> fromIntegral <$> peek outLenPtr--failIf :: (a -> Bool) -> a -> IO a-failIf f a- | f a = error "error"- | otherwise = return a--failIf_ :: (a -> Bool) -> a -> IO ()-failIf_ f a = void $ failIf f a
Shadowsocks/Encrypt.hs view
@@ -19,11 +19,11 @@ import Data.Monoid ((<>)) import Data.Word (Word8, Word64) import OpenSSL (withOpenSSL)+import OpenSSL.EVP.Cipher (getCipherByName, CryptoMode(..))+import OpenSSL.EVP.Internal (cipherInitBS, cipherUpdateBS) import OpenSSL.Random (randBytes) -import Shadowsocks.Cipher - method_supported :: HM.HashMap String (Int, Int) method_supported = HM.fromList [ ("aes-128-cfb", (16, 16))@@ -85,7 +85,7 @@ decipherCtx <- newEmptyMVar cipherMethod <- fmap fromJust $ withOpenSSL $ getCipherByName method- ctx <- cipherInit cipherMethod key cipher_iv Encrypt+ ctx <- cipherInitBS cipherMethod key cipher_iv Encrypt let encrypt "" = return "" encrypt buf = do@@ -102,7 +102,7 @@ if empty then do let decipher_iv = S.take m1 buf- dctx <- cipherInit cipherMethod key decipher_iv Decrypt+ dctx <- cipherInitBS cipherMethod key decipher_iv Decrypt putMVar decipherCtx dctx if S.null (S.drop m1 buf) then return ""
shadowsocks.cabal view
@@ -1,5 +1,5 @@ name: shadowsocks-version: 1.20140617+version: 1.20140713 synopsis: A fast tunnel proxy that help you get through firewalls description: Shadowsocks implemented in Haskell. Original python version: <https://github.com/clowwindy/shadowsocks>@@ -22,8 +22,7 @@ executable sslocal main-is: local.hs ghc-options: -Wall -fno-warn-unused-do-bind -O2 -threaded- other-modules: Shadowsocks.Cipher,- Shadowsocks.Encrypt,+ other-modules: Shadowsocks.Encrypt, Shadowsocks.Util other-extensions: OverloadedStrings, DeriveGeneric build-depends: base == 4.*,@@ -32,7 +31,7 @@ bytestring >= 0.9, containers >= 0.5, cryptohash >= 0.11,- HsOpenSSL >= 0.10,+ HsOpenSSL >= 0.11, network >= 2.4, optparse-applicative >= 0.8, unordered-containers >= 0.2@@ -41,8 +40,7 @@ executable ssserver main-is: server.hs ghc-options: -Wall -fno-warn-unused-do-bind -O2 -threaded- other-modules: Shadowsocks.Cipher,- Shadowsocks.Encrypt,+ other-modules: Shadowsocks.Encrypt, Shadowsocks.Util other-extensions: OverloadedStrings, DeriveGeneric build-depends: base == 4.*,@@ -51,7 +49,7 @@ bytestring >= 0.9, containers >= 0.5, cryptohash >= 0.11,- HsOpenSSL >= 0.10,+ HsOpenSSL >= 0.11, network >= 2.4, optparse-applicative >= 0.8, unordered-containers >= 0.2@@ -67,7 +65,7 @@ bytestring >= 0.9, containers >= 0.5, cryptohash >= 0.11,- HsOpenSSL >= 0.10,+ HsOpenSSL >= 0.11, network >= 2.4, optparse-applicative >= 0.8, process >= 1.1,