Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mtproto_proxy
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
mtproto_proxy
Commits
1183dbdd
Commit
1183dbdd
authored
Jun 25, 2018
by
Sergey Prokhorov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for mtp_intermediate upstream
parent
9422356a
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
70 additions
and
7 deletions
+70
-7
mtp_intermediate.erl
mtp_intermediate.erl
+63
-0
mtp_handler.erl
src/mtp_handler.erl
+3
-3
mtp_obfuscated.erl
src/mtp_obfuscated.erl
+4
-4
No files found.
mtp_intermediate.erl
0 → 100644
View file @
1183dbdd
%%% @author Sergey <me@seriyps.ru>
%%% @copyright (C) 2018, Sergey
%%% @doc
%%% MTProto intermediate protocol
%%% @end
%%% Created : 18 Jun 2018 by Sergey <me@seriyps.ru>
-
module
(
mtp_intermediate
).
-
behaviour
(
mtp_layer
).
-
export
([
new
/
0
,
try_decode_packet
/
2
,
encode_packet
/
2
]).
-
export_type
([
codec
/
0
]).
-
record
(
int_st
,
{
buffer
=
<<>>
::
binary
()}).
-
define
(
MAX_PACKET_SIZE
,
1
*
1024
*
1024
).
% 1mb
-
define
(
APP
,
mtproto_proxy
).
-
define
(
MAX_SIZE
,
16#80000000
).
-
include
(
"dbg.hrl"
).
-
opaque
codec
()
::
#int_st
{}.
new
()
->
#int_st
{}.
-
spec
try_decode_packet
(
binary
(),
codec
())
->
{
ok
,
binary
(),
codec
()}
|
{
incomplete
,
codec
()}.
try_decode_packet
(
<<
Len
:
32
/
unsigned
-
little
,
_
/
binary
>>
=
Data
,
#int_st
{
buffer
=
<<>>
}
=
St
)
when
Len
<
?
MAX_SIZE
->
Len1
=
case
Len
<
?
MAX_SIZE
of
true
->
Len
;
false
->
Len
-
?
MAX_SIZE
end
,
(
Len1
<
?
MAX_PACKET_SIZE
)
orelse
begin
metric
:
count_inc
([
?
APP
,
protocol_error
,
total
],
1
,
#
{
labels
=>
[
intermediate_max_size
]}),
error
({
packet_too_large
,
Len1
})
end
,
try_decode_packet_len
(
Len1
,
Data
,
St
);
try_decode_packet
(
Bin
,
#int_st
{
buffer
=
Buf
}
=
St
)
when
byte_size
(
Buf
)
>
0
->
try_decode_packet
(
<<
Buf
/
binary
,
Bin
/
binary
>>
,
St
#int_st
{
buffer
=
<<>>
});
try_decode_packet
(
Bin
,
#int_st
{
buffer
=
<<>>
}
=
St
)
->
{
incomplete
,
St
#int_st
{
buffer
=
Bin
}}.
try_decode_packet_len
(
Len
,
Data
,
St
)
->
case
Data
of
<<
_:
4
/
binary
,
Packet
:
Len
/
binary
,
Rest
/
binary
>>
->
?
DBG
(
"len=
~p
~w
->
~w
"
,
[
Len
,
Data
,
Packet
]),
{
ok
,
Packet
,
St
#int_st
{
buffer
=
Rest
}};
_
->
{
incomplete
,
St
#int_st
{
buffer
=
Data
}}
end
.
-
spec
encode_packet
(
iodata
(),
codec
())
->
iodata
().
encode_packet
(
Data
,
St
)
->
Size
=
iolist_size
(
Data
),
Packet
=
[
<<
Size
:
32
/
little
>>
|
Data
],
?
DBG
(
"
~w
->
~w
"
,
[
iolist_to_binary
(
Data
),
iolist_to_binary
(
Packet
)]),
{
Packet
,
St
}.
src/mtp_handler.erl
View file @
1183dbdd
...
@@ -214,10 +214,10 @@ state_timeout(stop) ->
...
@@ -214,10 +214,10 @@ state_timeout(stop) ->
handle_upstream_data
(
<<
Header
:
64
/
binary
,
Rest
/
binary
>>
,
#state
{
stage
=
init
,
stage_state
=
<<>>
,
handle_upstream_data
(
<<
Header
:
64
/
binary
,
Rest
/
binary
>>
,
#state
{
stage
=
init
,
stage_state
=
<<>>
,
secret
=
Secret
}
=
S
)
->
secret
=
Secret
}
=
S
)
->
case
mtp_obfuscated
:
from_header
(
Header
,
Secret
)
of
case
mtp_obfuscated
:
from_header
(
Header
,
Secret
)
of
{
ok
,
DcId
,
ObfuscatedCodec
}
->
{
ok
,
DcId
,
PacketLayerMod
,
ObfuscatedCodec
}
->
ObfuscatedLayer
=
mtp_layer
:
new
(
mtp_obfuscated
,
ObfuscatedCodec
),
ObfuscatedLayer
=
mtp_layer
:
new
(
mtp_obfuscated
,
ObfuscatedCodec
),
AbridgedLayer
=
mtp_layer
:
new
(
mtp_abridged
,
mtp_abridge
d
:
new
()),
PacketLayer
=
mtp_layer
:
new
(
PacketLayerMod
,
PacketLayerMo
d
:
new
()),
UpCodec
=
mtp_layer
:
new
(
mtp_wrap
,
mtp_wrap
:
new
(
Abridged
Layer
,
UpCodec
=
mtp_layer
:
new
(
mtp_wrap
,
mtp_wrap
:
new
(
Packet
Layer
,
ObfuscatedLayer
)),
ObfuscatedLayer
)),
handle_upstream_header
(
handle_upstream_header
(
DcId
,
DcId
,
...
...
src/mtp_obfuscated.erl
View file @
1183dbdd
...
@@ -60,7 +60,7 @@ init_down_encrypt(<<_:8/binary, Key:32/binary, IV:16/binary, _/binary>>) ->
...
@@ -60,7 +60,7 @@ init_down_encrypt(<<_:8/binary, Key:32/binary, IV:16/binary, _/binary>>) ->
%% @doc creates new obfuscated stream (MTProto proxy format)
%% @doc creates new obfuscated stream (MTProto proxy format)
-
spec
from_header
(
binary
(),
binary
())
->
{
ok
,
in
et
:
ip4_address
(),
codec
()}.
-
spec
from_header
(
binary
(),
binary
())
->
{
ok
,
in
teger
(),
mtp_layer
:
codec
(),
codec
()}.
from_header
(
Header
,
Secret
)
when
byte_size
(
Header
)
==
64
->
from_header
(
Header
,
Secret
)
when
byte_size
(
Header
)
==
64
->
{
EncKey
,
EncIV
}
=
init_up_encrypt
(
Header
,
Secret
),
{
EncKey
,
EncIV
}
=
init_up_encrypt
(
Header
,
Secret
),
{
DecKey
,
DecIV
}
=
init_up_decrypt
(
Header
,
Secret
),
{
DecKey
,
DecIV
}
=
init_up_decrypt
(
Header
,
Secret
),
...
@@ -71,10 +71,10 @@ from_header(Header, Secret) when byte_size(Header) == 64 ->
...
@@ -71,10 +71,10 @@ from_header(Header, Secret) when byte_size(Header) == 64 ->
case
NewHeader
of
case
NewHeader
of
<<
_:
56
/
binary
,
16#ef
,
16#ef
,
16#ef
,
16#ef
,
_
/
binary
>>
->
<<
_:
56
/
binary
,
16#ef
,
16#ef
,
16#ef
,
16#ef
,
_
/
binary
>>
->
DcId
=
get_dc
(
NewHeader
),
DcId
=
get_dc
(
NewHeader
),
{
ok
,
DcId
,
St1
};
{
ok
,
DcId
,
mtp_abridged
,
St1
};
<<
_:
56
/
binary
,
16#ee
,
16#ee
,
16#ee
,
16#ee
,
_
/
binary
>>
->
<<
_:
56
/
binary
,
16#ee
,
16#ee
,
16#ee
,
16#ee
,
_
/
binary
>>
->
metric
:
count_inc
([
?
APP
,
protocol_error
,
total
],
1
,
#
{
labels
=>
[
intermediate
]}
),
DcId
=
get_dc
(
NewHeader
),
{
error
,
{
protocol_not_supported
,
intermediate
}
};
{
ok
,
DcId
,
mtp_intermediate
,
St1
};
_
->
_
->
metric
:
count_inc
([
?
APP
,
protocol_error
,
total
],
1
,
#
{
labels
=>
[
unknown
]}),
metric
:
count_inc
([
?
APP
,
protocol_error
,
total
],
1
,
#
{
labels
=>
[
unknown
]}),
{
error
,
unknown_protocol
}
{
error
,
unknown_protocol
}
...
...
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