packages feed

peyotls-codec 0.1.0.0 → 0.2.0.0

raw patch · 7 files changed

+88/−55 lines, 7 files

Files

peyotls-codec.cabal view
@@ -2,7 +2,7 @@ cabal-version:	>= 1.8  name:		peyotls-codec-version:	0.1.0.0+version:	0.2.0.0 stability:	Experimental author:		Yoshikuni Jujo <PAF01143@nifty.ne.jp> maintainer:	Yoshikuni Jujo <PAF01143@nifty.ne.jp>@@ -22,14 +22,14 @@ source-repository	this     type:	git     location:	git://github.com/YoshikuniJujo/peyotls.git-    tag:	peyotls-0.1.6.7+    tag:	peyotls-0.1.6.8  library     hs-source-dirs:	src     exposed-modules:-            Network.PeyoTLS.Codec,-            Network.PeyoTLS.Codec.ContentTypes+            Network.PeyoTLS.Codec     other-modules:+            Network.PeyoTLS.Codec.ContentTypes             Network.PeyoTLS.Codec.Hello, Network.PeyoTLS.Codec.Extension,             Network.PeyoTLS.Codec.Certificate             Network.PeyoTLS.Codec.HSAlg
src/Network/PeyoTLS/Codec.hs view
@@ -1,15 +1,25 @@ {-# LANGUAGE OverloadedStrings #-}  module Network.PeyoTLS.Codec (-	Handshake(..), HandshakeItem(..),+	-- * Fragment+	ContType(..), PrtVrsn(..),+	-- * Cipher Suite, Compression Method, Signature Algorithm+	CipherSuite(..), KeyEx(..), BulkEnc(..), CmpMtd(..),+	HSAlg(..), SignAlg(..), HashAlg(..),+	-- * Handshake+	Handshake(HCCSpec, HHelloReq), HandshakeItem(..),+	CCSpec(..),+	-- ** Hello 	ClHello(..), SvHello(..), SssnId(..),-		CipherSuite(..), KeyEx(..), BulkEnc(..),-		CmpMtd(..), Extension(..), isRnInfo, emptyRnInfo,+		Extension(..), isRnInfo, emptyRnInfo,+	-- ** Server Key Exchange 	SvKeyEx(..), SvKeyExDhe(..), SvKeyExEcdhe(..),-	CertReq(..), certReq, ClCertType(..), SignAlg(..), HashAlg(..),+	-- ** Others+	CertReq(..), certReq, ClCertType(..), 	SHDone(..), ClKeyEx(..), Epms(..),-	DigitSigned(..), Finished(..),-	CCSpec(..), ) where+	DigitSigned(..),+	Finished(..),+	) where  import Control.Applicative ((<$>), (<*>)) import Control.Monad (unless)@@ -23,9 +33,10 @@ import qualified Crypto.Types.PubKey.ECC as ECC  import Network.PeyoTLS.Codec.Hello (-	ClHello(..), SvHello(..), SssnId(..),+	ContType(..),+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..), 	CipherSuite(..), KeyEx(..), BulkEnc(..),-	CmpMtd(..), HashAlg(..), SignAlg(..),+	CmpMtd(..), HSAlg(..), HashAlg(..), SignAlg(..), 	Extension(..), isRnInfo, emptyRnInfo ) import Network.PeyoTLS.Codec.Certificate ( 	CertReq(..), certReq, ClCertType(..), ClKeyEx(..), DigitSigned(..) )@@ -33,8 +44,9 @@ modNm :: String modNm = "Network.PeyoTLS.Types" --- RFC 5246 7.4 Handshake Protocol+-- | RFC 5246 7.4 Handshake Protocol --+-- @ -- enum { -- 	hello_request(0), client_hello(1), server_hello(2), -- 	certificate(11), server_key_exchange(12),@@ -59,6 +71,7 @@ -- 		case finished:			Finished; -- 	} body; -- } Handshake;+-- @  data Handshake 	= HCCSpec                     | HHelloReq
src/Network/PeyoTLS/Codec/Certificate.hs view
@@ -59,15 +59,15 @@ 			either (fail . show) return . ASN1.decodeASN1' ASN1.DER =<< 			B.take =<< B.take 2) -data ClCertType = CTRsaSign | CTEcdsaSign | CTRaw Word8 deriving (Show, Eq)+data ClCertType = CTRsaSign | CTEcdsaSign | CertTypeRaw Word8 deriving (Show, Eq)  instance B.Bytable ClCertType where 	encode CTRsaSign = "\x01" 	encode CTEcdsaSign = "\x40"-	encode (CTRaw w) = BS.pack [w]+	encode (CertTypeRaw w) = BS.pack [w] 	decode bs = case BS.unpack bs of 		[w] -> Right $ case w of-			1 -> CTRsaSign; 64 -> CTEcdsaSign; _ -> CTRaw w+			1 -> CTRsaSign; 64 -> CTEcdsaSign; _ -> CertTypeRaw w 		_ -> Left $ modNm ++ ": ClCertType.decode"  data ClKeyEx = ClKeyEx BS.ByteString deriving Show
src/Network/PeyoTLS/Codec/ContentTypes.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} -module Network.PeyoTLS.Codec.ContentTypes (ProtocolVersion, ContType(..)) where+module Network.PeyoTLS.Codec.ContentTypes (PrtVrsn(..), ContType(..)) where  import Data.Word @@ -10,25 +10,31 @@ modNm :: String modNm = "Network.PeyoTLS.Codec.ContentTypes" --- RFC 5246 6.2.1+-- | RFC 5246 6.2.1 Fragmentation --+-- @ -- struct { -- 	uint8 major; -- 	uint8 minor; -- } ProtocolVersion;+-- @++data PrtVrsn = PrtVrsn Word8 Word8 deriving (Show, Eq, Ord)++instance B.Bytable PrtVrsn where+	encode (PrtVrsn mj mn) = BS.pack [mj, mn]+	decode mjmn = case BS.unpack mjmn of+		[mj, mn] -> Right $ PrtVrsn mj mn+		_ -> Left $ modNm ++ ": PrtVrsn.decode"++-- | RFC 5246 6.2.1 Fragmentation --+-- @ -- enum { -- 	change_cipher_spec(20), alert(21), handshake(22), -- 	application_data(23), (255) -- } ContentType;--data ProtocolVersion = ProtocolVersion Word8 Word8 deriving (Show, Eq)--instance B.Bytable ProtocolVersion where-	encode (ProtocolVersion mj mn) = BS.pack [mj, mn]-	decode mjmn = case BS.unpack mjmn of-		[mj, mn] -> Right $ ProtocolVersion mj mn-		_ -> Left $ modNm ++ ": ProtocolVersion.decode"+-- @  data ContType = CTCCSpec | CTAlert | CTHandshake | CTAppData | CTNull | CTRaw Word8 	deriving (Show, Eq)
src/Network/PeyoTLS/Codec/Extension.hs view
@@ -2,7 +2,7 @@ {-# OPTIONS_GHC -fno-warn-orphans #-}  module Network.PeyoTLS.Codec.Extension (-	Extension(..), isRnInfo, emptyRnInfo, SignAlg(..), HashAlg(..) ) where+	Extension(..), isRnInfo, emptyRnInfo, HSAlg(..), SignAlg(..), HashAlg(..) ) where  import Control.Applicative ((<$>), (<*>)) import Data.Bits (shiftL, (.|.))@@ -13,21 +13,23 @@ import qualified Crypto.Types.PubKey.DH as DH import qualified Crypto.Types.PubKey.ECC as ECC -import Network.PeyoTLS.Codec.HSAlg(HSAlg, HashAlg(..), SignAlg(..))+import Network.PeyoTLS.Codec.HSAlg(HSAlg(..), HashAlg(..), SignAlg(..))  modNm :: String modNm = "Network.PeyoTLS.Codec.Extension" --- RFC 5246 7.4.1.4. Hello Wxtensions+-- | RFC 5246 7.4.1.4. Hello Wxtensions --+-- @ -- struct { -- 	ExtensionType extension_type;--- 	opaque extension_data<0..2^16-1>;+-- 	opaque extension_data\<0..2^16-1>; -- } Extension; -- -- enum { -- 	signature_algorithms(13), (65535) -- } ExtensionType+-- @  data Extension 	= ESName [SName]
src/Network/PeyoTLS/Codec/HSAlg.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} -module Network.PeyoTLS.Codec.HSAlg (HSAlg, SignAlg(..), HashAlg(..)) where+module Network.PeyoTLS.Codec.HSAlg (HSAlg(..), SignAlg(..), HashAlg(..)) where  import Control.Applicative import Data.Word (Word8)@@ -11,12 +11,14 @@ modNm :: String modNm = "Network.PeyoTLS.Codec.HSAlg" --- RFC 5246 7.4.1.4.1.+-- | RFC 5246 7.4.1.4.1. --+-- @ -- struct { -- 	HashAlgorithm hash; -- 	SignatureAlgorithm signature; -- } SignatureAndHashAlgorithm;+-- @  data HSAlg = HSAlg HashAlg SignAlg deriving (Show, Eq) @@ -25,20 +27,22 @@ 	decode hasa = let (ha, sa) = BS.splitAt 1 hasa in 		HSAlg <$> B.decode ha <*> B.decode sa --- RFC 5246 7.4.1.4.1.+-- | RFC 5246 7.4.1.4.1. --+-- @ -- enum { -- 	none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), -- 	sha512(6), (255) -- } HashAlgorithm;+-- @  data HashAlg-	= HNone | Md5 | Sha1 | Sha224 | Sha256 | Sha384 | Sha512+	= HANone | Md5 | Sha1 | Sha224 | Sha256 | Sha384 | Sha512 	| HARaw Word8 	deriving (Show, Eq)  instance B.Bytable HashAlg where-	encode HNone  = "\x00"+	encode HANone  = "\x00" 	encode Md5    = "\x01" 	encode Sha1   = "\x02" 	encode Sha224 = "\x03"@@ -48,15 +52,17 @@ 	encode (HARaw w) = BS.pack [w] 	decode bs = case BS.unpack bs of 		[ha] -> Right $ case ha of-			0 -> HNone ; 1 -> Md5+			0 -> HANone ; 1 -> Md5 			2 -> Sha1  ; 3 -> Sha224; 4 -> Sha256 			5 -> Sha384; 6 -> Sha512; _ -> HARaw ha 		_ -> Left $ modNm ++ ": HashAlg.decode" instance B.Parsable HashAlg where parse = B.take 1 --- RFC 5246 7.4.1.4.1.+-- | RFC 5246 7.4.1.4.1. --+-- @ -- enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }+-- @  data SignAlg = SAnon | Rsa | Dsa | Ecdsa | SARaw Word8 deriving (Show, Eq) 
src/Network/PeyoTLS/Codec/Hello.hs view
@@ -1,9 +1,10 @@ {-# LANGUAGE OverloadedStrings #-}  module Network.PeyoTLS.Codec.Hello (-	ClHello(..), SvHello(..), SssnId(..),+	ContType(..),+	ClHello(..), SvHello(..), PrtVrsn(..), SssnId(..), 		CipherSuite(..), KeyEx(..), BulkEnc(..),-		CmpMtd(..), SignAlg(..), HashAlg(..),+		CmpMtd(..), HSAlg(..), SignAlg(..), HashAlg(..), 		Extension(..), isRnInfo, emptyRnInfo ) where  import Control.Applicative ((<$>), (<*>))@@ -13,20 +14,22 @@ import qualified Codec.Bytable.BigEndian as B  import Network.PeyoTLS.Codec.Extension (-	Extension(..), isRnInfo, emptyRnInfo, SignAlg(..), HashAlg(..) )+	Extension(..), isRnInfo, emptyRnInfo, HSAlg(..), SignAlg(..), HashAlg(..) )+import Network.PeyoTLS.Codec.ContentTypes (ContType(..), PrtVrsn(..)) import Network.PeyoTLS.CipherSuite (CipherSuite(..), KeyEx(..), BulkEnc(..))  modNm :: String modNm = "Network.PeyoTLS.Codec.Hello" --- RFC 5246 7.4.1.2. Client Hello+-- | RFC 5246 7.4.1.2. Client Hello --+-- @ -- struct { -- 	uint32 gmt_unix_time; -- 	opaque random_bytes[28]; -- } Random ----- opaque SessionID<0..32>;+-- opaque SessionID\<0..32>; -- -- uint8 CipherSuite[2]; --@@ -36,38 +39,40 @@ -- 	ProtocolVersion client_version; -- 	Random random; -- 	SessionID session_id;--- 	CipherSuite cipher_suites<2..2^16-2>;--- 	CompressionMethod compression_methods<1..2^8-1>;+-- 	CipherSuite cipher_suites\<2..2^16-2>;+-- 	CompressionMethod compression_methods\<1..2^8-1>; -- 	select (extensions_present) { -- 		case false:	struct {};--- 		case true:	Extension extensions<0..2^16-1>;+-- 		case true:	Extension extensions\<0..2^16-1>; -- 	}; -- } ClientHello;+-- @  data ClHello-	= ClHello (Word8, Word8) BS.ByteString SssnId [CipherSuite] [CmpMtd]+	= ClHello PrtVrsn BS.ByteString SssnId [CipherSuite] [CmpMtd] 		(Maybe [Extension]) 	| ClHelloRaw BS.ByteString 	deriving Show  instance B.Bytable ClHello where 	decode = B.evalBytableM $ ClHello-		<$> ((,) <$> B.head <*> B.head)+		<$> B.take 2 		<*> B.take 32 <*> (B.take =<< B.take 1) 		<*> (flip B.list (B.take 2) =<< B.take 2) 		<*> (flip B.list (B.take 1) =<< B.take 1) 		<*> do	nl <- B.null 			if nl then return Nothing else Just <$> 				(flip B.list B.parse =<< B.take 2)-	encode (ClHello (vj, vn) r sid css cms mel) = BS.concat [-		B.encode vj, B.encode vn, B.encode r, B.addLen w8 $ B.encode sid,+	encode (ClHello vjvn r sid css cms mel) = BS.concat [+		B.encode vjvn, B.encode r, B.addLen w8 $ B.encode sid, 		B.addLen w16 . BS.concat $ map B.encode css, 		B.addLen w8 . BS.concat $ map B.encode cms, 		maybe "" (B.addLen w16 . BS.concat . map B.encode) mel ] 	encode (ClHelloRaw bs) = bs --- RFC 5246 7.4.1.3. Server Hello+-- | RFC 5246 7.4.1.3. Server Hello --+-- @ -- struct { -- 	ProtocolVersion server_version; -- 	Random random;@@ -76,25 +81,26 @@ -- 	CompressionMethod compression_method; -- 	select (extensions_present) { -- 		case false: struct {};--- 		case true: Extension extensions<0..2^16-1>;+-- 		case true: Extension extensions\<0..2^16-1>; -- 	}; -- } ServerHello;+-- @  data SvHello-	= SvHello (Word8, Word8) BS.ByteString SssnId CipherSuite CmpMtd+	= SvHello PrtVrsn BS.ByteString SssnId CipherSuite CmpMtd 		(Maybe [Extension]) 	| SvHelloRaw BS.ByteString 	deriving Show  instance B.Bytable SvHello where 	decode = B.evalBytableM $ SvHello-		<$> ((,) <$> B.head <*> B.head)+		<$> B.take 2 		<*> B.take 32 <*> (B.take =<< B.take 1) <*> B.take 2 <*> B.take 1 		<*> do	n <- B.null 			if n then return Nothing else Just <$> 				(flip B.list B.parse =<< B.take 2)-	encode (SvHello (vj, vn) r sid cs cm mes) = BS.concat [-		B.encode vj, B.encode vn, B.encode r, B.addLen w8 $ B.encode sid,+	encode (SvHello vjvn r sid cs cm mes) = BS.concat [+		B.encode vjvn, B.encode r, B.addLen w8 $ B.encode sid, 		B.encode cs, B.encode cm, 		maybe "" (B.addLen w16 . BS.concat . map B.encode) mes ] 	encode (SvHelloRaw sh) = sh