Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
T
Titanium-Web-Proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Titanium-Web-Proxy
Commits
70e1a0dd
Commit
70e1a0dd
authored
Jun 28, 2017
by
Honfika
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Parse ciphers
parent
1589642a
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
641 additions
and
237 deletions
+641
-237
ConnectRequest.cs
Titanium.Web.Proxy/Http/ConnectRequest.cs
+2
-82
RequestHandler.cs
Titanium.Web.Proxy/RequestHandler.cs
+7
-1
ClientHelloInfo.cs
Titanium.Web.Proxy/Ssl/ClientHelloInfo.cs
+112
-0
SslCiphers.cs
Titanium.Web.Proxy/Ssl/SslCiphers.cs
+341
-0
SslExtension.cs
Titanium.Web.Proxy/Ssl/SslExtension.cs
+18
-0
SslExtensions.cs
Titanium.Web.Proxy/Ssl/SslExtensions.cs
+4
-153
SslTools.cs
Titanium.Web.Proxy/Ssl/SslTools.cs
+151
-0
Titanium.Web.Proxy.csproj
Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
+6
-1
No files found.
Titanium.Web.Proxy/Http/ConnectRequest.cs
View file @
70e1a0dd
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.Ssl
;
namespace
Titanium.Web.Proxy.Http
{
...
...
@@ -10,81 +7,4 @@ namespace Titanium.Web.Proxy.Http
{
public
ClientHelloInfo
ClientHelloInfo
{
get
;
set
;
}
}
public
class
ClientHelloInfo
{
public
int
MajorVersion
{
get
;
set
;
}
public
int
MinorVersion
{
get
;
set
;
}
public
byte
[]
Random
{
get
;
set
;
}
public
DateTime
Time
{
get
{
DateTime
time
=
DateTime
.
MinValue
;
if
(
Random
.
Length
>
3
)
{
time
=
new
DateTime
(
1970
,
1
,
1
,
0
,
0
,
0
,
0
,
DateTimeKind
.
Utc
)
.
AddSeconds
(((
uint
)
Random
[
3
]
<<
24
)
+
((
uint
)
Random
[
2
]
<<
16
)
+
((
uint
)
Random
[
1
]
<<
8
)
+
(
uint
)
Random
[
0
]).
ToLocalTime
();
}
return
time
;
}
}
public
byte
[]
SessionId
{
get
;
set
;
}
public
byte
[]
CiphersData
{
get
;
set
;
}
public
byte
[]
CompressionData
{
get
;
set
;
}
public
List
<
Extension
>
Extensions
{
get
;
set
;
}
private
static
string
SslVersionToString
(
int
major
,
int
minor
)
{
string
str
=
"Unknown"
;
if
(
major
==
3
&&
minor
==
3
)
str
=
"TLS/1.2"
;
else
if
(
major
==
3
&&
minor
==
2
)
str
=
"TLS/1.1"
;
else
if
(
major
==
3
&&
minor
==
1
)
str
=
"TLS/1.0"
;
else
if
(
major
==
3
&&
minor
==
0
)
str
=
"SSL/3.0"
;
else
if
(
major
==
2
&&
minor
==
0
)
str
=
"SSL/2.0"
;
return
$"
{
major
}
.
{
minor
}
(
{
str
}
)"
;
}
/// <summary>
/// Returns a <see cref="System.String" /> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String" /> that represents this instance.
/// </returns>
public
override
string
ToString
()
{
var
sb
=
new
StringBuilder
();
sb
.
AppendLine
(
"A SSLv3-compatible ClientHello handshake was found. Titanium extracted the parameters below."
);
sb
.
AppendLine
();
sb
.
AppendLine
(
$"Version:
{
SslVersionToString
(
MajorVersion
,
MinorVersion
)}
"
);
sb
.
AppendLine
(
$"Random:
{
string
.
Join
(
" "
,
Random
.
Select
(
x
=>
x
.
ToString
(
"X2"
)))}
"
);
sb
.
AppendLine
(
$"\"Time\":
{
Time
}
"
);
sb
.
AppendLine
(
$"SessionID:
{
string
.
Join
(
" "
,
SessionId
.
Select
(
x
=>
x
.
ToString
(
"X2"
)))}
"
);
if
(
Extensions
!=
null
)
{
sb
.
AppendLine
(
"Extensions:"
);
foreach
(
var
extension
in
Extensions
)
{
sb
.
AppendLine
(
$"
{
extension
.
Name
}
:
{
extension
.
Data
}
"
);
}
}
return
sb
.
ToString
();
}
}
}
Titanium.Web.Proxy/RequestHandler.cs
View file @
70e1a0dd
...
...
@@ -17,6 +17,7 @@ using Titanium.Web.Proxy.Http;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Network.Tcp
;
using
Titanium.Web.Proxy.Shared
;
using
Titanium.Web.Proxy.Ssl
;
namespace
Titanium.Web.Proxy
{
...
...
@@ -116,7 +117,12 @@ namespace Titanium.Web.Proxy
connectArgs
.
WebSession
.
Response
=
CreateConnectResponse
(
version
);
await
WriteResponse
(
connectArgs
.
WebSession
.
Response
,
clientStreamWriter
);
bool
isClientHello
=
await
HttpsTools
.
IsClientHello
(
clientStream
,
connectArgs
);
var
clientHelloInfo
=
await
HttpsTools
.
GetClientHelloInfo
(
clientStream
);
bool
isClientHello
=
clientHelloInfo
!=
null
;
if
(
isClientHello
)
{
connectRequest
.
ClientHelloInfo
=
clientHelloInfo
;
}
if
(
TunnelConnectResponse
!=
null
)
{
...
...
Titanium.Web.Proxy/Ssl/ClientHelloInfo.cs
0 → 100644
View file @
70e1a0dd
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
namespace
Titanium.Web.Proxy.Ssl
{
public
class
ClientHelloInfo
{
private
static
readonly
string
[]
compressions
=
{
"null"
,
"DEFLATE"
};
public
int
MajorVersion
{
get
;
set
;
}
public
int
MinorVersion
{
get
;
set
;
}
public
byte
[]
Random
{
get
;
set
;
}
public
DateTime
Time
{
get
{
DateTime
time
=
DateTime
.
MinValue
;
if
(
Random
.
Length
>
3
)
{
time
=
new
DateTime
(
1970
,
1
,
1
,
0
,
0
,
0
,
0
,
DateTimeKind
.
Utc
)
.
AddSeconds
(((
uint
)
Random
[
3
]
<<
24
)
+
((
uint
)
Random
[
2
]
<<
16
)
+
((
uint
)
Random
[
1
]
<<
8
)
+
(
uint
)
Random
[
0
]).
ToLocalTime
();
}
return
time
;
}
}
public
byte
[]
SessionId
{
get
;
set
;
}
public
int
[]
Ciphers
{
get
;
set
;
}
public
byte
[]
CompressionData
{
get
;
set
;
}
public
List
<
SslExtension
>
Extensions
{
get
;
set
;
}
private
static
string
SslVersionToString
(
int
major
,
int
minor
)
{
string
str
=
"Unknown"
;
if
(
major
==
3
&&
minor
==
3
)
str
=
"TLS/1.2"
;
else
if
(
major
==
3
&&
minor
==
2
)
str
=
"TLS/1.1"
;
else
if
(
major
==
3
&&
minor
==
1
)
str
=
"TLS/1.0"
;
else
if
(
major
==
3
&&
minor
==
0
)
str
=
"SSL/3.0"
;
else
if
(
major
==
2
&&
minor
==
0
)
str
=
"SSL/2.0"
;
return
$"
{
major
}
.
{
minor
}
(
{
str
}
)"
;
}
/// <summary>
/// Returns a <see cref="System.String" /> that represents this instance.
/// </summary>
/// <returns>
/// A <see cref="System.String" /> that represents this instance.
/// </returns>
public
override
string
ToString
()
{
var
sb
=
new
StringBuilder
();
sb
.
AppendLine
(
"A SSLv3-compatible ClientHello handshake was found. Titanium extracted the parameters below."
);
sb
.
AppendLine
();
sb
.
AppendLine
(
$"Version:
{
SslVersionToString
(
MajorVersion
,
MinorVersion
)}
"
);
sb
.
AppendLine
(
$"Random:
{
string
.
Join
(
" "
,
Random
.
Select
(
x
=>
x
.
ToString
(
"X2"
)))}
"
);
sb
.
AppendLine
(
$"\"Time\":
{
Time
}
"
);
sb
.
AppendLine
(
$"SessionID:
{
string
.
Join
(
" "
,
SessionId
.
Select
(
x
=>
x
.
ToString
(
"X2"
)))}
"
);
if
(
Extensions
!=
null
)
{
sb
.
AppendLine
(
"Extensions:"
);
foreach
(
var
extension
in
Extensions
)
{
sb
.
AppendLine
(
$"
{
extension
.
Name
}
:
{
extension
.
Data
}
"
);
}
}
if
(
CompressionData
.
Length
>
0
)
{
int
id
=
CompressionData
[
0
];
string
compression
=
null
;
compression
=
compressions
.
Length
>
id
?
compressions
[
id
]
:
$"unknown [0x
{
id
:
X2
}
]"
;
sb
.
AppendLine
(
$"Compression:
{
compression
}
"
);
}
if
(
Ciphers
.
Length
>
0
)
{
sb
.
AppendLine
(
$"Ciphers:"
);
foreach
(
int
cipher
in
Ciphers
)
{
string
cipherStr
;
if
(!
SslCiphers
.
Ciphers
.
TryGetValue
(
cipher
,
out
cipherStr
))
{
cipherStr
=
$"unknown"
;
}
sb
.
AppendLine
(
$"[0x
{
cipher
:
X4
}
]
{
cipherStr
}
"
);
}
}
return
sb
.
ToString
();
}
}
}
\ No newline at end of file
Titanium.Web.Proxy/Ssl/SslCiphers.cs
0 → 100644
View file @
70e1a0dd
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
Titanium.Web.Proxy.Ssl
{
static
class
SslCiphers
{
public
static
readonly
Dictionary
<
int
,
string
>
Ciphers
=
new
Dictionary
<
int
,
string
>
{
{
0x0000
,
"TLS_NULL_WITH_NULL_NULL"
},
{
0x0001
,
"TLS_RSA_WITH_NULL_MD5"
},
{
0x0002
,
"TLS_RSA_WITH_NULL_SHA"
},
{
0x0003
,
"TLS_RSA_EXPORT_WITH_RC4_40_MD5"
},
{
0x0004
,
"TLS_RSA_WITH_RC4_128_MD5"
},
{
0x0005
,
"TLS_RSA_WITH_RC4_128_SHA"
},
{
0x0006
,
"TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"
},
{
0x0007
,
"TLS_RSA_WITH_IDEA_CBC_SHA"
},
{
0x0008
,
"TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x0009
,
"TLS_RSA_WITH_DES_CBC_SHA"
},
{
0x000A
,
"TLS_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0x000B
,
"TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x000C
,
"TLS_DH_DSS_WITH_DES_CBC_SHA"
},
{
0x000D
,
"TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"
},
{
0x000E
,
"TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x000F
,
"TLS_DH_RSA_WITH_DES_CBC_SHA"
},
{
0x0010
,
"TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0x0011
,
"TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x0012
,
"TLS_DHE_DSS_WITH_DES_CBC_SHA"
},
{
0x0013
,
"TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
},
{
0x0014
,
"TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x0015
,
"TLS_DHE_RSA_WITH_DES_CBC_SHA"
},
{
0x0016
,
"TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0x0017
,
"TLS_DH_anon_EXPORT_WITH_RC4_40_MD5"
},
{
0x0018
,
"TLS_DH_anon_WITH_RC4_128_MD5"
},
{
0x0019
,
"TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA"
},
{
0x001A
,
"TLS_DH_anon_WITH_DES_CBC_SHA"
},
{
0x001B
,
"TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"
},
{
0x001E
,
"TLS_KRB5_WITH_DES_CBC_SHA"
},
{
0x001F
,
"TLS_KRB5_WITH_3DES_EDE_CBC_SHA"
},
{
0x0020
,
"TLS_KRB5_WITH_RC4_128_SHA"
},
{
0x0021
,
"TLS_KRB5_WITH_IDEA_CBC_SHA"
},
{
0x0022
,
"TLS_KRB5_WITH_DES_CBC_MD5"
},
{
0x0023
,
"TLS_KRB5_WITH_3DES_EDE_CBC_MD5"
},
{
0x0024
,
"TLS_KRB5_WITH_RC4_128_MD5"
},
{
0x0025
,
"TLS_KRB5_WITH_IDEA_CBC_MD5"
},
{
0x0026
,
"TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"
},
{
0x0027
,
"TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"
},
{
0x0028
,
"TLS_KRB5_EXPORT_WITH_RC4_40_SHA"
},
{
0x0029
,
"TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"
},
{
0x002A
,
"TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"
},
{
0x002B
,
"TLS_KRB5_EXPORT_WITH_RC4_40_MD5"
},
{
0x002C
,
"TLS_PSK_WITH_NULL_SHA"
},
{
0x002D
,
"TLS_DHE_PSK_WITH_NULL_SHA"
},
{
0x002E
,
"TLS_RSA_PSK_WITH_NULL_SHA"
},
{
0x002F
,
"TLS_RSA_WITH_AES_128_CBC_SHA"
},
{
0x0030
,
"TLS_DH_DSS_WITH_AES_128_CBC_SHA"
},
{
0x0031
,
"TLS_DH_RSA_WITH_AES_128_CBC_SHA"
},
{
0x0032
,
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA"
},
{
0x0033
,
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA"
},
{
0x0034
,
"TLS_DH_anon_WITH_AES_128_CBC_SHA"
},
{
0x0035
,
"TLS_RSA_WITH_AES_256_CBC_SHA"
},
{
0x0036
,
"TLS_DH_DSS_WITH_AES_256_CBC_SHA"
},
{
0x0037
,
"TLS_DH_RSA_WITH_AES_256_CBC_SHA"
},
{
0x0038
,
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA"
},
{
0x0039
,
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA"
},
{
0x003A
,
"TLS_DH_anon_WITH_AES_256_CBC_SHA"
},
{
0x003B
,
"TLS_RSA_WITH_NULL_SHA256"
},
{
0x003C
,
"TLS_RSA_WITH_AES_128_CBC_SHA256"
},
{
0x003D
,
"TLS_RSA_WITH_AES_256_CBC_SHA256"
},
{
0x003E
,
"TLS_DH_DSS_WITH_AES_128_CBC_SHA256"
},
{
0x003F
,
"TLS_DH_RSA_WITH_AES_128_CBC_SHA256"
},
{
0x0040
,
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"
},
{
0x0041
,
"TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0042
,
"TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0043
,
"TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0044
,
"TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0045
,
"TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0046
,
"TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"
},
{
0x0067
,
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"
},
{
0x0068
,
"TLS_DH_DSS_WITH_AES_256_CBC_SHA256"
},
{
0x0069
,
"TLS_DH_RSA_WITH_AES_256_CBC_SHA256"
},
{
0x006A
,
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"
},
{
0x006B
,
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"
},
{
0x006C
,
"TLS_DH_anon_WITH_AES_128_CBC_SHA256"
},
{
0x006D
,
"TLS_DH_anon_WITH_AES_256_CBC_SHA256"
},
{
0x0084
,
"TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x0085
,
"TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x0086
,
"TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x0087
,
"TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x0088
,
"TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x0089
,
"TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"
},
{
0x008A
,
"TLS_PSK_WITH_RC4_128_SHA"
},
{
0x008B
,
"TLS_PSK_WITH_3DES_EDE_CBC_SHA"
},
{
0x008C
,
"TLS_PSK_WITH_AES_128_CBC_SHA"
},
{
0x008D
,
"TLS_PSK_WITH_AES_256_CBC_SHA"
},
{
0x008E
,
"TLS_DHE_PSK_WITH_RC4_128_SHA"
},
{
0x008F
,
"TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"
},
{
0x0090
,
"TLS_DHE_PSK_WITH_AES_128_CBC_SHA"
},
{
0x0091
,
"TLS_DHE_PSK_WITH_AES_256_CBC_SHA"
},
{
0x0092
,
"TLS_RSA_PSK_WITH_RC4_128_SHA"
},
{
0x0093
,
"TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"
},
{
0x0094
,
"TLS_RSA_PSK_WITH_AES_128_CBC_SHA"
},
{
0x0095
,
"TLS_RSA_PSK_WITH_AES_256_CBC_SHA"
},
{
0x0096
,
"TLS_RSA_WITH_SEED_CBC_SHA"
},
{
0x0097
,
"TLS_DH_DSS_WITH_SEED_CBC_SHA"
},
{
0x0098
,
"TLS_DH_RSA_WITH_SEED_CBC_SHA"
},
{
0x0099
,
"TLS_DHE_DSS_WITH_SEED_CBC_SHA"
},
{
0x009A
,
"TLS_DHE_RSA_WITH_SEED_CBC_SHA"
},
{
0x009B
,
"TLS_DH_anon_WITH_SEED_CBC_SHA"
},
{
0x009C
,
"TLS_RSA_WITH_AES_128_GCM_SHA256"
},
{
0x009D
,
"TLS_RSA_WITH_AES_256_GCM_SHA384"
},
{
0x009E
,
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
},
{
0x009F
,
"TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"
},
{
0x00A0
,
"TLS_DH_RSA_WITH_AES_128_GCM_SHA256"
},
{
0x00A1
,
"TLS_DH_RSA_WITH_AES_256_GCM_SHA384"
},
{
0x00A2
,
"TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"
},
{
0x00A3
,
"TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"
},
{
0x00A4
,
"TLS_DH_DSS_WITH_AES_128_GCM_SHA256"
},
{
0x00A5
,
"TLS_DH_DSS_WITH_AES_256_GCM_SHA384"
},
{
0x00A6
,
"TLS_DH_anon_WITH_AES_128_GCM_SHA256"
},
{
0x00A7
,
"TLS_DH_anon_WITH_AES_256_GCM_SHA384"
},
{
0x00A8
,
"TLS_PSK_WITH_AES_128_GCM_SHA256"
},
{
0x00A9
,
"TLS_PSK_WITH_AES_256_GCM_SHA384"
},
{
0x00AA
,
"TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"
},
{
0x00AB
,
"TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"
},
{
0x00AC
,
"TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"
},
{
0x00AD
,
"TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"
},
{
0x00AE
,
"TLS_PSK_WITH_AES_128_CBC_SHA256"
},
{
0x00AF
,
"TLS_PSK_WITH_AES_256_CBC_SHA384"
},
{
0x00B0
,
"TLS_PSK_WITH_NULL_SHA256"
},
{
0x00B1
,
"TLS_PSK_WITH_NULL_SHA384"
},
{
0x00B2
,
"TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"
},
{
0x00B3
,
"TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"
},
{
0x00B4
,
"TLS_DHE_PSK_WITH_NULL_SHA256"
},
{
0x00B5
,
"TLS_DHE_PSK_WITH_NULL_SHA384"
},
{
0x00B6
,
"TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"
},
{
0x00B7
,
"TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"
},
{
0x00B8
,
"TLS_RSA_PSK_WITH_NULL_SHA256"
},
{
0x00B9
,
"TLS_RSA_PSK_WITH_NULL_SHA384"
},
{
0x00BA
,
"TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00BB
,
"TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00BC
,
"TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00BD
,
"TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00BE
,
"TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00BF
,
"TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0x00C0
,
"TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00C1
,
"TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00C2
,
"TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00C3
,
"TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00C4
,
"TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00C5
,
"TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"
},
{
0x00FF
,
"TLS_EMPTY_RENEGOTIATION_INFO_SCSV"
},
{
0x5600
,
"TLS_FALLBACK_SCSV"
},
{
0xC001
,
"TLS_ECDH_ECDSA_WITH_NULL_SHA"
},
{
0xC002
,
"TLS_ECDH_ECDSA_WITH_RC4_128_SHA"
},
{
0xC003
,
"TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC004
,
"TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"
},
{
0xC005
,
"TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"
},
{
0xC006
,
"TLS_ECDHE_ECDSA_WITH_NULL_SHA"
},
{
0xC007
,
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"
},
{
0xC008
,
"TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC009
,
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"
},
{
0xC00A
,
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"
},
{
0xC00B
,
"TLS_ECDH_RSA_WITH_NULL_SHA"
},
{
0xC00C
,
"TLS_ECDH_RSA_WITH_RC4_128_SHA"
},
{
0xC00D
,
"TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC00E
,
"TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"
},
{
0xC00F
,
"TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"
},
{
0xC010
,
"TLS_ECDHE_RSA_WITH_NULL_SHA"
},
{
0xC011
,
"TLS_ECDHE_RSA_WITH_RC4_128_SHA"
},
{
0xC012
,
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC013
,
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
},
{
0xC014
,
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"
},
{
0xC015
,
"TLS_ECDH_anon_WITH_NULL_SHA"
},
{
0xC016
,
"TLS_ECDH_anon_WITH_RC4_128_SHA"
},
{
0xC017
,
"TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"
},
{
0xC018
,
"TLS_ECDH_anon_WITH_AES_128_CBC_SHA"
},
{
0xC019
,
"TLS_ECDH_anon_WITH_AES_256_CBC_SHA"
},
{
0xC01A
,
"TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC01B
,
"TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"
},
{
0xC01C
,
"TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"
},
{
0xC01D
,
"TLS_SRP_SHA_WITH_AES_128_CBC_SHA"
},
{
0xC01E
,
"TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"
},
{
0xC01F
,
"TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"
},
{
0xC020
,
"TLS_SRP_SHA_WITH_AES_256_CBC_SHA"
},
{
0xC021
,
"TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"
},
{
0xC022
,
"TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"
},
{
0xC023
,
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"
},
{
0xC024
,
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"
},
{
0xC025
,
"TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"
},
{
0xC026
,
"TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"
},
{
0xC027
,
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
},
{
0xC028
,
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"
},
{
0xC029
,
"TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"
},
{
0xC02A
,
"TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"
},
{
0xC02B
,
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
},
{
0xC02C
,
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
},
{
0xC02D
,
"TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"
},
{
0xC02E
,
"TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"
},
{
0xC02F
,
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
},
{
0xC030
,
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
},
{
0xC031
,
"TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"
},
{
0xC032
,
"TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"
},
{
0xC033
,
"TLS_ECDHE_PSK_WITH_RC4_128_SHA"
},
{
0xC034
,
"TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"
},
{
0xC035
,
"TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"
},
{
0xC036
,
"TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"
},
{
0xC037
,
"TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"
},
{
0xC038
,
"TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"
},
{
0xC039
,
"TLS_ECDHE_PSK_WITH_NULL_SHA"
},
{
0xC03A
,
"TLS_ECDHE_PSK_WITH_NULL_SHA256"
},
{
0xC03B
,
"TLS_ECDHE_PSK_WITH_NULL_SHA384"
},
{
0xC03C
,
"TLS_RSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC03D
,
"TLS_RSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC03E
,
"TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"
},
{
0xC03F
,
"TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"
},
{
0xC040
,
"TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC041
,
"TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC042
,
"TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"
},
{
0xC043
,
"TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"
},
{
0xC044
,
"TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC045
,
"TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC046
,
"TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"
},
{
0xC047
,
"TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"
},
{
0xC048
,
"TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC049
,
"TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC04A
,
"TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC04B
,
"TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC04C
,
"TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC04D
,
"TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC04E
,
"TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"
},
{
0xC04F
,
"TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"
},
{
0xC050
,
"TLS_RSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC051
,
"TLS_RSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC052
,
"TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC053
,
"TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC054
,
"TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC055
,
"TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC056
,
"TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"
},
{
0xC057
,
"TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"
},
{
0xC058
,
"TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"
},
{
0xC059
,
"TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"
},
{
0xC05A
,
"TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"
},
{
0xC05B
,
"TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"
},
{
0xC05C
,
"TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC05D
,
"TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC05E
,
"TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC05F
,
"TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC060
,
"TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC061
,
"TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC062
,
"TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"
},
{
0xC063
,
"TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"
},
{
0xC064
,
"TLS_PSK_WITH_ARIA_128_CBC_SHA256"
},
{
0xC065
,
"TLS_PSK_WITH_ARIA_256_CBC_SHA384"
},
{
0xC066
,
"TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"
},
{
0xC067
,
"TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"
},
{
0xC068
,
"TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"
},
{
0xC069
,
"TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"
},
{
0xC06A
,
"TLS_PSK_WITH_ARIA_128_GCM_SHA256"
},
{
0xC06B
,
"TLS_PSK_WITH_ARIA_256_GCM_SHA384"
},
{
0xC06C
,
"TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"
},
{
0xC06D
,
"TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"
},
{
0xC06E
,
"TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"
},
{
0xC06F
,
"TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"
},
{
0xC070
,
"TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"
},
{
0xC071
,
"TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"
},
{
0xC072
,
"TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC073
,
"TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC074
,
"TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC075
,
"TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC076
,
"TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC077
,
"TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC078
,
"TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC079
,
"TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC07A
,
"TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC07B
,
"TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC07C
,
"TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC07D
,
"TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC07E
,
"TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC07F
,
"TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC080
,
"TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC081
,
"TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC082
,
"TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC083
,
"TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC084
,
"TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC085
,
"TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC086
,
"TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC087
,
"TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC088
,
"TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC089
,
"TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC08A
,
"TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC08B
,
"TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC08C
,
"TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC08D
,
"TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC08E
,
"TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC08F
,
"TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC090
,
"TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC091
,
"TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC092
,
"TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"
},
{
0xC093
,
"TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"
},
{
0xC094
,
"TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC095
,
"TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC096
,
"TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC097
,
"TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC098
,
"TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC099
,
"TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC09A
,
"TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"
},
{
0xC09B
,
"TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"
},
{
0xC09C
,
"TLS_RSA_WITH_AES_128_CCM"
},
{
0xC09D
,
"TLS_RSA_WITH_AES_256_CCM"
},
{
0xC09E
,
"TLS_DHE_RSA_WITH_AES_128_CCM"
},
{
0xC09F
,
"TLS_DHE_RSA_WITH_AES_256_CCM"
},
{
0xC0A0
,
"TLS_RSA_WITH_AES_128_CCM_8"
},
{
0xC0A1
,
"TLS_RSA_WITH_AES_256_CCM_8"
},
{
0xC0A2
,
"TLS_DHE_RSA_WITH_AES_128_CCM_8"
},
{
0xC0A3
,
"TLS_DHE_RSA_WITH_AES_256_CCM_8"
},
{
0xC0A4
,
"TLS_PSK_WITH_AES_128_CCM"
},
{
0xC0A5
,
"TLS_PSK_WITH_AES_256_CCM"
},
{
0xC0A6
,
"TLS_DHE_PSK_WITH_AES_128_CCM"
},
{
0xC0A7
,
"TLS_DHE_PSK_WITH_AES_256_CCM"
},
{
0xC0A8
,
"TLS_PSK_WITH_AES_128_CCM_8"
},
{
0xC0A9
,
"TLS_PSK_WITH_AES_256_CCM_8"
},
{
0xC0AA
,
"TLS_PSK_DHE_WITH_AES_128_CCM_8"
},
{
0xC0AB
,
"TLS_PSK_DHE_WITH_AES_256_CCM_8"
},
{
0xC0AC
,
"TLS_ECDHE_ECDSA_WITH_AES_128_CCM"
},
{
0xC0AD
,
"TLS_ECDHE_ECDSA_WITH_AES_256_CCM"
},
{
0xC0AE
,
"TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8"
},
{
0xC0AF
,
"TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8"
},
{
0xCCA8
,
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCA9
,
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCAA
,
"TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCAB
,
"TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCAC
,
"TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCAD
,
"TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"
},
{
0xCCAE
,
"TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"
},
};
}
}
Titanium.Web.Proxy/Ssl/SslExtension.cs
0 → 100644
View file @
70e1a0dd
namespace
Titanium.Web.Proxy.Ssl
{
public
class
SslExtension
{
public
int
Value
{
get
;
set
;
}
public
string
Name
{
get
;
set
;
}
public
string
Data
{
get
;
set
;
}
public
SslExtension
(
int
value
,
string
name
,
string
data
)
{
Value
=
value
;
Name
=
name
;
Data
=
data
;
}
}
}
\ No newline at end of file
Titanium.Web.Proxy/
Http/HttpsTool
s.cs
→
Titanium.Web.Proxy/
Ssl/SslExtension
s.cs
View file @
70e1a0dd
...
...
@@ -3,149 +3,16 @@ using System.Collections.Generic;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.EventArguments
;
using
Titanium.Web.Proxy.Helpers
;
namespace
Titanium.Web.Proxy.
Http
namespace
Titanium.Web.Proxy.
Ssl
{
class
HttpsTool
s
internal
class
SslExtension
s
{
public
static
async
Task
<
bool
>
IsClientHello
(
CustomBufferedStream
clientStream
,
TunnelConnectSessionEventArgs
connectArgs
)
{
//detects the HTTPS ClientHello message as it is described in the following url:
//https://stackoverflow.com/questions/3897883/how-to-detect-an-incoming-ssl-https-handshake-ssl-wire-format
var
request
=
(
ConnectRequest
)
connectArgs
.
WebSession
.
Request
;
int
recordType
=
await
clientStream
.
PeekByteAsync
(
0
);
if
(
recordType
==
0x80
)
{
var
peekStream
=
new
CustomBufferedPeekStream
(
clientStream
,
1
);
//SSL 2
int
length
=
peekStream
.
ReadByte
();
if
(
length
<
9
)
{
// Message body too short.
return
false
;
}
if
(
peekStream
.
ReadByte
()
!=
0x01
)
{
// should be ClientHello
return
false
;
}
int
majorVersion
=
clientStream
.
ReadByte
();
int
minorVersion
=
clientStream
.
ReadByte
();
return
true
;
}
else
if
(
recordType
==
0x16
)
{
var
peekStream
=
new
CustomBufferedPeekStream
(
clientStream
,
1
);
//should contain at least 43 bytes
// 2 version + 2 length + 1 type + 3 length(?) + 2 version + 32 random + 1 sessionid length
if
(!
await
peekStream
.
EnsureBufferLength
(
43
))
{
return
false
;
}
//SSL 3.0 or TLS 1.0, 1.1 and 1.2
int
majorVersion
=
peekStream
.
ReadByte
();
int
minorVersion
=
peekStream
.
ReadByte
();
int
length
=
peekStream
.
ReadInt16
();
if
(
peekStream
.
ReadByte
()
!=
0x01
)
{
// should be ClientHello
return
false
;
}
length
=
peekStream
.
ReadInt24
();
majorVersion
=
peekStream
.
ReadByte
();
minorVersion
=
peekStream
.
ReadByte
();
byte
[]
random
=
peekStream
.
ReadBytes
(
32
);
length
=
peekStream
.
ReadByte
();
// sessionid + 2 ciphersData length
if
(!
await
peekStream
.
EnsureBufferLength
(
length
+
2
))
{
return
false
;
}
byte
[]
sessionId
=
peekStream
.
ReadBytes
(
length
);
length
=
peekStream
.
ReadInt16
();
// ciphersData + compressionData length
if
(!
await
peekStream
.
EnsureBufferLength
(
length
+
1
))
{
return
false
;
}
byte
[]
ciphersData
=
peekStream
.
ReadBytes
(
length
);
length
=
peekStream
.
ReadByte
();
if
(
length
<
1
)
{
return
false
;
}
// compressionData
if
(!
await
peekStream
.
EnsureBufferLength
(
length
))
{
return
false
;
}
byte
[]
compressionData
=
peekStream
.
ReadBytes
(
length
);
List
<
Extension
>
extensions
=
null
;
if
(
majorVersion
>
3
||
majorVersion
==
3
&&
minorVersion
>=
1
)
{
if
(
await
peekStream
.
EnsureBufferLength
(
2
))
{
length
=
peekStream
.
ReadInt16
();
if
(
await
peekStream
.
EnsureBufferLength
(
length
))
{
extensions
=
new
List
<
Extension
>();
while
(
peekStream
.
Available
>
3
)
{
int
id
=
peekStream
.
ReadInt16
();
length
=
peekStream
.
ReadInt16
();
byte
[]
data
=
peekStream
.
ReadBytes
(
length
);
extensions
.
Add
(
GetExtension
(
id
,
data
));
}
}
}
}
request
.
ClientHelloInfo
=
new
ClientHelloInfo
{
MajorVersion
=
majorVersion
,
MinorVersion
=
minorVersion
,
Random
=
random
,
SessionId
=
sessionId
,
CiphersData
=
ciphersData
,
CompressionData
=
compressionData
,
Extensions
=
extensions
,
};
return
true
;
}
return
false
;
}
private
static
Extension
GetExtension
(
int
value
,
byte
[]
data
)
internal
static
SslExtension
GetExtension
(
int
value
,
byte
[]
data
)
{
string
name
=
GetExtensionName
(
value
);
string
dataStr
=
GetExtensionData
(
value
,
data
);
return
new
Extension
(
value
,
name
,
dataStr
);
return
new
Ssl
Extension
(
value
,
name
,
dataStr
);
}
private
static
string
GetExtensionData
(
int
value
,
byte
[]
data
)
...
...
@@ -528,20 +395,4 @@ namespace Titanium.Web.Proxy.Http
return
string
.
Join
(
" "
,
data
.
Select
(
x
=>
x
.
ToString
(
"X2"
)));
}
}
public
class
Extension
{
public
int
Value
{
get
;
set
;
}
public
string
Name
{
get
;
set
;
}
public
string
Data
{
get
;
set
;
}
public
Extension
(
int
value
,
string
name
,
string
data
)
{
Value
=
value
;
Name
=
name
;
Data
=
data
;
}
}
}
Titanium.Web.Proxy/Ssl/SslTools.cs
0 → 100644
View file @
70e1a0dd
using
System.Collections.Generic
;
using
System.Threading.Tasks
;
using
Titanium.Web.Proxy.EventArguments
;
using
Titanium.Web.Proxy.Helpers
;
using
Titanium.Web.Proxy.Http
;
namespace
Titanium.Web.Proxy.Ssl
{
class
HttpsTools
{
public
static
async
Task
<
bool
>
IsClientHello
(
CustomBufferedStream
clientStream
)
{
var
clientHello
=
await
GetClientHelloInfo
(
clientStream
);
return
clientHello
!=
null
;
}
public
static
async
Task
<
ClientHelloInfo
>
GetClientHelloInfo
(
CustomBufferedStream
clientStream
)
{
//detects the HTTPS ClientHello message as it is described in the following url:
//https://stackoverflow.com/questions/3897883/how-to-detect-an-incoming-ssl-https-handshake-ssl-wire-format
int
recordType
=
await
clientStream
.
PeekByteAsync
(
0
);
if
(
recordType
==
0x80
)
{
var
peekStream
=
new
CustomBufferedPeekStream
(
clientStream
,
1
);
//SSL 2
int
length
=
peekStream
.
ReadByte
();
if
(
length
<
9
)
{
// Message body too short.
return
null
;
}
if
(
peekStream
.
ReadByte
()
!=
0x01
)
{
// should be ClientHello
return
null
;
}
int
majorVersion
=
clientStream
.
ReadByte
();
int
minorVersion
=
clientStream
.
ReadByte
();
return
new
ClientHelloInfo
();
}
else
if
(
recordType
==
0x16
)
{
var
peekStream
=
new
CustomBufferedPeekStream
(
clientStream
,
1
);
//should contain at least 43 bytes
// 2 version + 2 length + 1 type + 3 length(?) + 2 version + 32 random + 1 sessionid length
if
(!
await
peekStream
.
EnsureBufferLength
(
43
))
{
return
null
;
}
//SSL 3.0 or TLS 1.0, 1.1 and 1.2
int
majorVersion
=
peekStream
.
ReadByte
();
int
minorVersion
=
peekStream
.
ReadByte
();
int
length
=
peekStream
.
ReadInt16
();
if
(
peekStream
.
ReadByte
()
!=
0x01
)
{
// should be ClientHello
return
null
;
}
length
=
peekStream
.
ReadInt24
();
majorVersion
=
peekStream
.
ReadByte
();
minorVersion
=
peekStream
.
ReadByte
();
byte
[]
random
=
peekStream
.
ReadBytes
(
32
);
length
=
peekStream
.
ReadByte
();
// sessionid + 2 ciphersData length
if
(!
await
peekStream
.
EnsureBufferLength
(
length
+
2
))
{
return
null
;
}
byte
[]
sessionId
=
peekStream
.
ReadBytes
(
length
);
length
=
peekStream
.
ReadInt16
();
// ciphersData + compressionData length
if
(!
await
peekStream
.
EnsureBufferLength
(
length
+
1
))
{
return
null
;
}
byte
[]
ciphersData
=
peekStream
.
ReadBytes
(
length
);
int
[]
ciphers
=
new
int
[
ciphersData
.
Length
/
2
];
for
(
int
i
=
0
;
i
<
ciphers
.
Length
;
i
++)
{
ciphers
[
i
]
=
(
ciphersData
[
2
*
i
]
<<
8
)
+
ciphersData
[
2
*
i
+
1
];
}
length
=
peekStream
.
ReadByte
();
if
(
length
<
1
)
{
return
null
;
}
// compressionData
if
(!
await
peekStream
.
EnsureBufferLength
(
length
))
{
return
null
;
}
byte
[]
compressionData
=
peekStream
.
ReadBytes
(
length
);
List
<
SslExtension
>
extensions
=
null
;
if
(
majorVersion
>
3
||
majorVersion
==
3
&&
minorVersion
>=
1
)
{
if
(
await
peekStream
.
EnsureBufferLength
(
2
))
{
length
=
peekStream
.
ReadInt16
();
if
(
await
peekStream
.
EnsureBufferLength
(
length
))
{
extensions
=
new
List
<
SslExtension
>();
while
(
peekStream
.
Available
>
3
)
{
int
id
=
peekStream
.
ReadInt16
();
length
=
peekStream
.
ReadInt16
();
byte
[]
data
=
peekStream
.
ReadBytes
(
length
);
extensions
.
Add
(
SslExtensions
.
GetExtension
(
id
,
data
));
}
}
}
}
var
clientHelloInfo
=
new
ClientHelloInfo
{
MajorVersion
=
majorVersion
,
MinorVersion
=
minorVersion
,
Random
=
random
,
SessionId
=
sessionId
,
Ciphers
=
ciphers
,
CompressionData
=
compressionData
,
Extensions
=
extensions
,
};
return
clientHelloInfo
;
}
return
null
;
}
}
}
Titanium.Web.Proxy/Titanium.Web.Proxy.csproj
View file @
70e1a0dd
...
...
@@ -95,11 +95,15 @@
<Compile
Include=
"Helpers\HttpHelper.cs"
/>
<Compile
Include=
"Helpers\Network.cs"
/>
<Compile
Include=
"Helpers\Tcp.cs"
/>
<Compile
Include=
"Ssl\ClientHelloInfo.cs"
/>
<Compile
Include=
"Http\ConnectRequest.cs"
/>
<Compile
Include=
"Http\ConnectResponse.cs"
/>
<Compile
Include=
"Http\HeaderCollection.cs"
/>
<Compile
Include=
"Http\HeaderParser.cs"
/>
<Compile
Include=
"Http\HttpsTools.cs"
/>
<Compile
Include=
"Ssl\SslCiphers.cs"
/>
<Compile
Include=
"Ssl\SslExtension.cs"
/>
<Compile
Include=
"Ssl\SslExtensions.cs"
/>
<Compile
Include=
"Ssl\SslTools.cs"
/>
<Compile
Include=
"Http\HttpWebClient.cs"
/>
<Compile
Include=
"Http\Request.cs"
/>
<Compile
Include=
"Http\Response.cs"
/>
...
...
@@ -160,6 +164,7 @@
<None
Include=
"packages.config"
/>
<None
Include=
"StrongNameKey.snk"
/>
</ItemGroup>
<ItemGroup
/>
<Import
Project=
"$(MSBuildToolsPath)\Microsoft.CSharp.targets"
/>
<Import
Project=
"$(SolutionDir)\.nuget\NuGet.targets"
Condition=
"Exists('$(SolutionDir)\.nuget\NuGet.targets')"
/>
<Target
Name=
"EnsureNuGetPackageBuildImports"
BeforeTargets=
"PrepareForBuild"
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment