Simplify obfuscated handshake parsing

parent 5fd3987e
...@@ -66,17 +66,15 @@ from_header(Header, Secret) when byte_size(Header) == 64 -> ...@@ -66,17 +66,15 @@ from_header(Header, Secret) when byte_size(Header) == 64 ->
{DecKey, DecIV} = init_up_decrypt(Header, Secret), {DecKey, DecIV} = init_up_decrypt(Header, Secret),
St = new(EncKey, EncIV, DecKey, DecIV), St = new(EncKey, EncIV, DecKey, DecIV),
{<<_:56/binary, Bin1:8/binary, _/binary>>, St1} = decrypt(Header, St), {<<_:56/binary, Bin1:8/binary, _/binary>>, St1} = decrypt(Header, St),
<<HeaderPart:56/binary, _/binary>> = Header, case Bin1 of
NewHeader = <<HeaderPart/binary, Bin1/binary>>, <<16#ef, 16#ef, 16#ef, 16#ef, _/binary>> ->
case NewHeader of DcId = get_dc(Bin1),
<<_:56/binary, 16#ef, 16#ef, 16#ef, 16#ef, _/binary>> ->
DcId = get_dc(NewHeader),
{ok, DcId, mtp_abridged, St1}; {ok, DcId, mtp_abridged, St1};
<<_:56/binary, 16#ee, 16#ee, 16#ee, 16#ee, _/binary>> -> <<16#ee, 16#ee, 16#ee, 16#ee, _/binary>> ->
DcId = get_dc(NewHeader), DcId = get_dc(Bin1),
{ok, DcId, mtp_intermediate, St1}; {ok, DcId, mtp_intermediate, St1};
<<_:56/binary, 16#dd, 16#dd, 16#dd, 16#dd, _/binary>> -> <<16#dd, 16#dd, 16#dd, 16#dd, _/binary>> ->
DcId = get_dc(NewHeader), DcId = get_dc(Bin1),
{ok, DcId, mtp_secure, St1}; {ok, DcId, mtp_secure, St1};
_ -> _ ->
metric:count_inc([?APP, protocol_error, total], 1, #{labels => [unknown]}), metric:count_inc([?APP, protocol_error, total], 1, #{labels => [unknown]}),
...@@ -96,7 +94,7 @@ init_up_decrypt(Bin, Secret) -> ...@@ -96,7 +94,7 @@ init_up_decrypt(Bin, Secret) ->
KeyHash = crypto:hash('sha256', <<Key/binary, Secret/binary>>), KeyHash = crypto:hash('sha256', <<Key/binary, Secret/binary>>),
{KeyHash, IV}. {KeyHash, IV}.
get_dc(<<_:60/binary, DcId:16/signed-little-integer, _/binary>>) -> get_dc(<<_:4/binary, DcId:16/signed-little-integer, _/binary>>) ->
DcId. DcId.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment