diff --git a/apps/sdlan/include/sdlan_pb.hrl b/apps/sdlan/include/sdlan_pb.hrl index 41cea25..a1fdd0d 100644 --- a/apps/sdlan/include/sdlan_pb.hrl +++ b/apps/sdlan/include/sdlan_pb.hrl @@ -61,8 +61,10 @@ -define('SDL_REGISTER_SUPER_ACK_PB_H', true). -record(sdl_register_super_ack, {pkt_id = 0 :: non_neg_integer() | undefined, % = 1, optional, 32 bits - aes_key = <<>> :: iodata() | undefined, % = 2, optional - session_token = <<>> :: iodata() | undefined % = 3, optional + algorithm = <<>> :: unicode:chardata() | undefined, % = 2, optional + key = <<>> :: iodata() | undefined, % = 3, optional + region_id = 0 :: non_neg_integer() | undefined, % = 4, optional, 32 bits + session_token = <<>> :: iodata() | undefined % = 5, optional }). -endif. diff --git a/apps/sdlan/src/quic/sdlan_quic_channel.erl b/apps/sdlan/src/quic/sdlan_quic_channel.erl index 6d52c3c..f461b3f 100644 --- a/apps/sdlan/src/quic/sdlan_quic_channel.erl +++ b/apps/sdlan/src/quic/sdlan_quic_channel.erl @@ -178,11 +178,13 @@ handle_event(internal, {frame, <>}, initial %% 建立到network的对应关系 case sdlan_network:get_pid(NetworkId) of NetworkPid when is_pid(NetworkPid) -> - {ok, AesKey, SessionToken} = sdlan_network:attach(NetworkPid, self(), ClientId, Mac, Ip, HostName), + {ok, Algorithm, Key, RegionId, SessionToken} = sdlan_network:attach(NetworkPid, self(), ClientId, Mac, Ip, HostName), RsaPubKey = sdlan_cipher:rsa_pem_decode(PubKey), RegisterSuperAck = sdlan_pb:encode_msg(#sdl_register_super_ack { pkt_id = PktId, - aes_key = rsa_encode(AesKey, RsaPubKey), + algorithm = Algorithm, + key = rsa_encode(Key, RsaPubKey), + region_id = RegionId, session_token = SessionToken }), diff --git a/apps/sdlan/src/sdlan_network.erl b/apps/sdlan/src/sdlan_network.erl index 4431548..3723c44 100644 --- a/apps/sdlan/src/sdlan_network.erl +++ b/apps/sdlan/src/sdlan_network.erl @@ -18,6 +18,9 @@ %% broadcast, "FF-FF-FF-FF-FF-FF" -define(BROADCAST_MAC, <<16#FF,16#FF,16#FF,16#FF,16#FF,16#FF>>). +%% 分区salt +-define(REGION_SALT, "salt_fG7xQp2BzH9L"). + %% API -export([start_link/2]). -export([get_name/1, get_pid/1, lookup_pid/1, peer_info/3, unregister/3, debug_info/1, get_network_id/1, attach/6, arp_request/2]). @@ -56,12 +59,16 @@ mask_len :: integer(), owner_id :: integer(), + %% 加密算法, 默认为chacha20 + algorithm :: binary(), + %% 同一个网络下公用的密钥, 采用AES-256加密算法;随机生成 + key :: binary(), + %% 设置网络带宽 throttle_key :: atom(), %% 转发流量统计 forward_bytes = 0, - %% 同一个网络下公用的密钥, 采用AES-256加密算法;随机生成 - aes_key :: binary(), + %% 记录已经使用了的ip, #{mac :: integer() => Host :: #endpoint{}} endpoints = #{} }). @@ -96,7 +103,7 @@ get_network_id(Pid) when is_pid(Pid) -> gen_server:call(Pid, get_network_id). -spec attach(Pid :: pid(), ChannelPid :: pid(), ClientId :: binary(), Mac :: binary(), Ip :: integer(), Hostname :: binary()) -> - {ok, AesKey :: binary(), SessionToken :: binary()}. + {ok, Algorithm :: binary(), Key :: binary(), RegionId :: integer(), SessionToken :: binary()}. attach(Pid, ChannelPid, ClientId, Mac, Ip, Hostname) when is_pid(Pid), is_pid(ChannelPid), is_binary(ClientId), is_binary(Mac), is_integer(Ip), is_binary(Hostname) -> gen_server:call(Pid, {attach, ChannelPid, ClientId, Mac, Ip, Hostname}). @@ -154,9 +161,8 @@ init([Id]) when is_integer(Id) -> case sdlan_api:get_network(Id) of {ok, #{<<"ipaddr">> := Null}} when Null == <<"null">>; Null == <<"NULL">> -> ignore; - {ok, #{<<"id">> := Id, <<"name">> := Name, <<"domain">> := Domain, <<"ipaddr">> := IpAddr0, <<"owner_id">> := OwnerId}} -> + {ok, #{<<"id">> := Id, <<"name">> := Name, <<"domain">> := Domain, <<"algorithm">> := Algorithm0, <<"ipaddr">> := IpAddr0, <<"owner_id">> := OwnerId}} -> {IpAddr, MaskLen} = parse_ipaddr(IpAddr0), - AesKey = sdlan_util:rand_byte(32), %% 限流key ThrottleKey = list_to_atom("network_throttle:" ++ integer_to_list(Id)), %% 绑定到资源协调器 @@ -164,9 +170,15 @@ init([Id]) when is_integer(Id) -> %% 每分钟汇报一次转发的流量 erlang:start_timer(?FLOW_REPORT_INTERVAL, self(), flow_report_ticker), + sdlan_domain_regedit:insert(Domain), - {ok, #state{network_id = Id, name = Name, domain = Domain, ipaddr = IpAddr, owner_id = OwnerId, mask_len = MaskLen, aes_key = AesKey, throttle_key = ThrottleKey}}; + %% 处理加密算法 + Algorithm = normalization_algorithm(Algorithm0), + Key = gen_key(Algorithm), + + {ok, #state{network_id = Id, name = Name, domain = Domain, ipaddr = IpAddr, algorithm = Algorithm, + owner_id = OwnerId, mask_len = MaskLen, key = Key, throttle_key = ThrottleKey}}; {error, Reason} -> logger:warning("[sdlan_network] load network: ~p, get error: ~p", [Id, Reason]), ignore @@ -184,7 +196,7 @@ init([Id]) when is_integer(Id) -> {stop, Reason :: term(), NewState :: #state{}}). %% 给客户端分配ip地址 handle_call({attach, ChannelPid, ClientId, Mac, Ip, Hostname}, _From, - State = #state{network_id = NetworkId, domain = Domain, endpoints = Endpoints, aes_key = AesKey}) -> + State = #state{network_id = NetworkId, domain = Domain, endpoints = Endpoints, algorithm = Algorithm, key = Key}) -> %% 分配ip地址的时候,以mac地址为唯一基准 logger:debug("[sdlan_network] alloc_ip, network_id: ~p, client_id: ~p, mac: ~p, ip_addr: ~p", [NetworkId, ClientId, sdlan_util:format_mac(Mac), sdlan_util:int_to_ipv4(Ip)]), @@ -219,7 +231,10 @@ handle_call({attach, ChannelPid, ClientId, Mac, Ip, Hostname}, _From, Endpoint = #endpoint{channel_pid = ChannelPid, channel_ref = ChannelRef, client_id = ClientId, mac = Mac, ip = Ip, hostname = Hostname, session_token = SessionToken, last_seen = erlang:monotonic_time(second)}, - {reply, {ok, AesKey, SessionToken}, State#state{endpoints = maps:put(Mac, Endpoint, Endpoints)}}; + %% 生成对应的分区id + RegionId = gen_region_id(Ip, ?REGION_SALT), + + {reply, {ok, Algorithm, Key, RegionId, SessionToken}, State#state{endpoints = maps:put(Mac, Endpoint, Endpoints)}}; %% client设置为禁止状态,不允许重连 handle_call({disable_client, ClientId}, _From, State = #state{endpoints = Endpoints}) -> @@ -510,4 +525,35 @@ same_hole(_, _) -> -spec gen_session_token() -> binary(). gen_session_token() -> Bytes = crypto:strong_rand_bytes(32), - base64:encode(Bytes). \ No newline at end of file + base64:encode(Bytes). + +-spec normalization_algorithm(any()) -> binary(). +normalization_algorithm(<<"aes">>) -> + <<"aes">>; +normalization_algorithm(<<"chacha20">>) -> + <<"chacha20">>; +normalization_algorithm(_) -> + <<"chacha20">>. + +-spec gen_key(Algorithm :: binary()) -> Key :: binary(). +gen_key(<<"aes">>) -> + sdlan_util:rand_byte(32); +gen_key(<<"chacha20">>) -> + sdlan_util:rand_byte(32). + +-spec gen_region_id(IpInt :: integer(), Salt :: string()) -> integer(). +gen_region_id(IpInt, Salt) -> + %% 把整数 IP 转成字符串 + IpStr = integer_to_list(IpInt), + %% 拼接盐 + FullStr = Salt ++ IpStr, + time33(FullStr, 5381). + +%% 核心Time33算法 +-spec time33(string(), integer()) -> integer(). +time33([], Hash) -> + Hash band 16#FFFFFFFF; % 32位 +time33([C|Rest], Hash) -> + %% hash = hash * 33 + char + NewHash = ((Hash bsl 5) + Hash) + C, + time33(Rest, NewHash). \ No newline at end of file diff --git a/apps/sdlan/src/sdlan_pb.erl b/apps/sdlan/src/sdlan_pb.erl index 2583316..f8e274e 100644 --- a/apps/sdlan/src/sdlan_pb.erl +++ b/apps/sdlan/src/sdlan_pb.erl @@ -362,7 +362,7 @@ encode_msg_sdl_register_super(#sdl_register_super{pkt_id = F1, client_id = F2, n encode_msg_sdl_register_super_ack(Msg, TrUserData) -> encode_msg_sdl_register_super_ack(Msg, <<>>, TrUserData). -encode_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, aes_key = F2, session_token = F3}, Bin, TrUserData) -> +encode_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, algorithm = F2, key = F3, region_id = F4, session_token = F5}, Bin, TrUserData) -> B1 = if F1 == undefined -> Bin; true -> begin @@ -376,19 +376,38 @@ encode_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, aes_key = true -> begin TrF2 = id(F2, TrUserData), - case iolist_size(TrF2) of - 0 -> B1; - _ -> e_type_bytes(TrF2, <>, TrUserData) + case is_empty_string(TrF2) of + true -> B1; + false -> e_type_string(TrF2, <>, TrUserData) end end end, - if F3 == undefined -> B2; + B3 = if F3 == undefined -> B2; + true -> + begin + TrF3 = id(F3, TrUserData), + case iolist_size(TrF3) of + 0 -> B2; + _ -> e_type_bytes(TrF3, <>, TrUserData) + end + end + end, + B4 = if F4 == undefined -> B3; + true -> + begin + TrF4 = id(F4, TrUserData), + if TrF4 =:= 0 -> B3; + true -> e_varint(TrF4, <>, TrUserData) + end + end + end, + if F5 == undefined -> B4; true -> begin - TrF3 = id(F3, TrUserData), - case iolist_size(TrF3) of - 0 -> B2; - _ -> e_type_bytes(TrF3, <>, TrUserData) + TrF5 = id(F5, TrUserData), + case iolist_size(TrF5) of + 0 -> B4; + _ -> e_type_bytes(TrF5, <>, TrUserData) end end end. @@ -1557,63 +1576,80 @@ skip_32_sdl_register_super(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F skip_64_sdl_register_super(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData) -> dfp_read_field_def_sdl_register_super(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, F@_6, F@_7, F@_8, F@_9, TrUserData). -decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), TrUserData). +decode_msg_sdl_register_super_ack(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Bin, 0, 0, 0, id(0, TrUserData), id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). -dfp_read_field_def_sdl_register_super_ack(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); -dfp_read_field_def_sdl_register_super_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_aes_key(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); -dfp_read_field_def_sdl_register_super_ack(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> d_field_sdl_register_super_ack_session_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); -dfp_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_ack{pkt_id = F@_1, aes_key = F@_2, session_token = F@_3}; -dfp_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dg_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). +dfp_read_field_def_sdl_register_super_ack(<<8, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_register_super_ack_pkt_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_register_super_ack_algorithm(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<26, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_register_super_ack_key(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_register_super_ack_region_id(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_sdl_register_super_ack_session_token(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dfp_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_register_super_ack{pkt_id = F@_1, algorithm = F@_2, key = F@_3, region_id = F@_4, session_token = F@_5}; +dfp_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_sdl_register_super_ack(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -dg_read_field_def_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 32 - 7 -> dg_read_field_def_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); -dg_read_field_def_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, TrUserData) -> +dg_read_field_def_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 32 - 7 -> + dg_read_field_def_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +dg_read_field_def_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Key = X bsl N + Acc, case Key of - 8 -> d_field_sdl_register_super_ack_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); - 18 -> d_field_sdl_register_super_ack_aes_key(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); - 26 -> d_field_sdl_register_super_ack_session_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, TrUserData); + 8 -> d_field_sdl_register_super_ack_pkt_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 18 -> d_field_sdl_register_super_ack_algorithm(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 26 -> d_field_sdl_register_super_ack_key(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 32 -> d_field_sdl_register_super_ack_region_id(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 42 -> d_field_sdl_register_super_ack_session_token(Rest, 0, 0, 0, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); _ -> case Key band 7 of - 0 -> skip_varint_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); - 1 -> skip_64_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); - 2 -> skip_length_delimited_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); - 3 -> skip_group_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData); - 5 -> skip_32_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, TrUserData) + 0 -> skip_varint_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 1 -> skip_64_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 2 -> skip_length_delimited_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 3 -> skip_group_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); + 5 -> skip_32_sdl_register_super_ack(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) end end; -dg_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, _) -> #sdl_register_super_ack{pkt_id = F@_1, aes_key = F@_2, session_token = F@_3}. +dg_read_field_def_sdl_register_super_ack(<<>>, 0, 0, _, F@_1, F@_2, F@_3, F@_4, F@_5, _) -> #sdl_register_super_ack{pkt_id = F@_1, algorithm = F@_2, key = F@_3, region_id = F@_4, session_token = F@_5}. -d_field_sdl_register_super_ack_pkt_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); -d_field_sdl_register_super_ack_pkt_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, TrUserData) -> +d_field_sdl_register_super_ack_pkt_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_pkt_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_register_super_ack_pkt_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, - dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, NewFValue, F@_2, F@_3, TrUserData). + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, NewFValue, F@_2, F@_3, F@_4, F@_5, TrUserData). -d_field_sdl_register_super_ack_aes_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_aes_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); -d_field_sdl_register_super_ack_aes_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, TrUserData) -> +d_field_sdl_register_super_ack_algorithm(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_algorithm(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_register_super_ack_algorithm(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, _, F@_3, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, NewFValue, F@_3, TrUserData). + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, NewFValue, F@_3, F@_4, F@_5, TrUserData). -d_field_sdl_register_super_ack_session_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); -d_field_sdl_register_super_ack_session_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, TrUserData) -> +d_field_sdl_register_super_ack_key(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_key(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_register_super_ack_key(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, _, F@_4, F@_5, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, F@_2, NewFValue, TrUserData). + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, F@_2, NewFValue, F@_4, F@_5, TrUserData). -skip_varint_sdl_register_super_ack(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> skip_varint_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData); -skip_varint_sdl_register_super_ack(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). +d_field_sdl_register_super_ack_region_id(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_sdl_register_super_ack_region_id(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_register_super_ack_region_id(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, _, F@_5, TrUserData) -> + {NewFValue, RestF} = {id((X bsl N + Acc) band 4294967295, TrUserData), Rest}, + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, F@_2, F@_3, NewFValue, F@_5, TrUserData). -skip_length_delimited_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) when N < 57 -> skip_length_delimited_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, TrUserData); -skip_length_delimited_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, TrUserData) -> +d_field_sdl_register_super_ack_session_token(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> + d_field_sdl_register_super_ack_session_token(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +d_field_sdl_register_super_ack_session_token(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, TrUserData) -> + {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, + dfp_read_field_def_sdl_register_super_ack(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, TrUserData). + +skip_varint_sdl_register_super_ack(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_varint_sdl_register_super_ack(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). + +skip_length_delimited_sdl_register_super_ack(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> + skip_length_delimited_sdl_register_super_ack(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); +skip_length_delimited_sdl_register_super_ack(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> Length = X bsl N + Acc, <<_:Length/binary, Rest2/binary>> = Rest, - dfp_read_field_def_sdl_register_super_ack(Rest2, 0, 0, F, F@_1, F@_2, F@_3, TrUserData). + dfp_read_field_def_sdl_register_super_ack(Rest2, 0, 0, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_group_sdl_register_super_ack(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, TrUserData) -> +skip_group_sdl_register_super_ack(Bin, _, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> {_, Rest} = read_group(Bin, FNum), - dfp_read_field_def_sdl_register_super_ack(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, TrUserData). + dfp_read_field_def_sdl_register_super_ack(Rest, 0, Z2, FNum, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_32_sdl_register_super_ack(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). +skip_32_sdl_register_super_ack(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). -skip_64_sdl_register_super_ack(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, TrUserData). +skip_64_sdl_register_super_ack(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_sdl_register_super_ack(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). decode_msg_sdl_register_super_nak(Bin, TrUserData) -> dfp_read_field_def_sdl_register_super_nak(Bin, 0, 0, 0, id(0, TrUserData), id(0, TrUserData), id(<<>>, TrUserData), TrUserData). @@ -2928,14 +2964,23 @@ merge_msg_sdl_register_super(#sdl_register_super{pkt_id = PFpkt_id, client_id = end}. -compile({nowarn_unused_function,merge_msg_sdl_register_super_ack/3}). -merge_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = PFpkt_id, aes_key = PFaes_key, session_token = PFsession_token}, #sdl_register_super_ack{pkt_id = NFpkt_id, aes_key = NFaes_key, session_token = NFsession_token}, _) -> +merge_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = PFpkt_id, algorithm = PFalgorithm, key = PFkey, region_id = PFregion_id, session_token = PFsession_token}, + #sdl_register_super_ack{pkt_id = NFpkt_id, algorithm = NFalgorithm, key = NFkey, region_id = NFregion_id, session_token = NFsession_token}, _) -> #sdl_register_super_ack{pkt_id = if NFpkt_id =:= undefined -> PFpkt_id; true -> NFpkt_id end, - aes_key = - if NFaes_key =:= undefined -> PFaes_key; - true -> NFaes_key + algorithm = + if NFalgorithm =:= undefined -> PFalgorithm; + true -> NFalgorithm + end, + key = + if NFkey =:= undefined -> PFkey; + true -> NFkey + end, + region_id = + if NFregion_id =:= undefined -> PFregion_id; + true -> NFregion_id end, session_token = if NFsession_token =:= undefined -> PFsession_token; @@ -3381,15 +3426,21 @@ v_msg_sdl_register_super(X, Path, _TrUserData) -> mk_type_error({expected_msg, s -compile({nowarn_unused_function,v_msg_sdl_register_super_ack/3}). -dialyzer({nowarn_function,v_msg_sdl_register_super_ack/3}). -v_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, aes_key = F2, session_token = F3}, Path, TrUserData) -> +v_msg_sdl_register_super_ack(#sdl_register_super_ack{pkt_id = F1, algorithm = F2, key = F3, region_id = F4, session_token = F5}, Path, TrUserData) -> if F1 == undefined -> ok; true -> v_type_uint32(F1, [pkt_id | Path], TrUserData) end, if F2 == undefined -> ok; - true -> v_type_bytes(F2, [aes_key | Path], TrUserData) + true -> v_type_string(F2, [algorithm | Path], TrUserData) end, if F3 == undefined -> ok; - true -> v_type_bytes(F3, [session_token | Path], TrUserData) + true -> v_type_bytes(F3, [key | Path], TrUserData) + end, + if F4 == undefined -> ok; + true -> v_type_uint32(F4, [region_id | Path], TrUserData) + end, + if F5 == undefined -> ok; + true -> v_type_bytes(F5, [session_token | Path], TrUserData) end, ok; v_msg_sdl_register_super_ack(X, Path, _TrUserData) -> mk_type_error({expected_msg, sdl_register_super_ack}, X, Path). @@ -3771,8 +3822,10 @@ get_msg_defs() -> #field{name = access_token, fnum = 9, rnum = 10, type = string, occurrence = defaulty, opts = []}]}, {{msg, sdl_register_super_ack}, [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, - #field{name = session_token, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]}, + #field{name = algorithm, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}, + #field{name = key, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = region_id, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 5, rnum = 6, type = bytes, occurrence = defaulty, opts = []}]}, {{msg, sdl_register_super_nak}, [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = error_code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []}, @@ -3937,8 +3990,10 @@ find_msg_def(sdl_register_super) -> #field{name = access_token, fnum = 9, rnum = 10, type = string, occurrence = defaulty, opts = []}]; find_msg_def(sdl_register_super_ack) -> [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, - #field{name = aes_key, fnum = 2, rnum = 3, type = bytes, occurrence = defaulty, opts = []}, - #field{name = session_token, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}]; + #field{name = algorithm, fnum = 2, rnum = 3, type = string, occurrence = defaulty, opts = []}, + #field{name = key, fnum = 3, rnum = 4, type = bytes, occurrence = defaulty, opts = []}, + #field{name = region_id, fnum = 4, rnum = 5, type = uint32, occurrence = defaulty, opts = []}, + #field{name = session_token, fnum = 5, rnum = 6, type = bytes, occurrence = defaulty, opts = []}]; find_msg_def(sdl_register_super_nak) -> [#field{name = pkt_id, fnum = 1, rnum = 2, type = uint32, occurrence = defaulty, opts = []}, #field{name = error_code, fnum = 2, rnum = 3, type = uint32, occurrence = defaulty, opts = []},