aboutsummaryrefslogtreecommitdiffstats
path: root/src/ranch_proxy_header.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-11-26 11:52:27 +0100
committerLoïc Hoguin <[email protected]>2018-11-26 11:52:27 +0100
commit0d9ad0a8445e7ba6e8bf9591257fa4457dda8321 (patch)
tree456dc3ad8457c00c9870bc32f40195d4430104e0 /src/ranch_proxy_header.erl
parent7423a7bb6dde5edc26283544956ae7387fa69688 (diff)
downloadranch-0d9ad0a8445e7ba6e8bf9591257fa4457dda8321.tar.gz
ranch-0d9ad0a8445e7ba6e8bf9591257fa4457dda8321.tar.bz2
ranch-0d9ad0a8445e7ba6e8bf9591257fa4457dda8321.zip
Use the correct CRC32 algorithm for the PROXY header
Turns out it wasn't the plain CRC32 algorithm that should have been used, whoops! The implementation was adapted from pseudo code from Thomas Cioppettini. I've renamed the PROXY header building option value for checksum from crc32 to crc32c and updated the documentation. There is no support for plain crc32 checksums.
Diffstat (limited to 'src/ranch_proxy_header.erl')
-rw-r--r--src/ranch_proxy_header.erl26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/ranch_proxy_header.erl b/src/ranch_proxy_header.erl
index 837ce2d..081157f 100644
--- a/src/ranch_proxy_header.erl
+++ b/src/ranch_proxy_header.erl
@@ -48,7 +48,7 @@
-export_type([proxy_info/0]).
-type build_opts() :: #{
- checksum => crc32,
+ checksum => crc32c,
padding => pos_integer() %% >= 3
}.
@@ -482,6 +482,18 @@ parse_v2_test() ->
Path/binary, 0:Padding,
"GET / HTTP/1.1\r\n">>),
ok.
+
+parse_v2_regression_test() ->
+ %% Real packet received from AWS. We confirm that the CRC32C
+ %% check succeeds only (in other words that ok is returned).
+ {ok, _, <<>>} = parse(<<
+ 13, 10, 13, 10, 0, 13, 10, 81, 85, 73, 84, 10, 33, 17, 0, 84,
+ 172, 31, 7, 113, 172, 31, 10, 31, 200, 242, 0, 80, 3, 0, 4,
+ 232, 214, 137, 45, 234, 0, 23, 1, 118, 112, 99, 101, 45, 48,
+ 56, 100, 50, 98, 102, 49, 53, 102, 97, 99, 53, 48, 48, 49, 99,
+ 57, 4, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>>),
+ ok.
-endif.
parse_tlv(Rest, 0, Info, _) ->
@@ -497,8 +509,8 @@ parse_tlv(<<16#3, TLVLen:16, CRC32C:32, Rest/bits>>, Len0, Info, Header) when TL
Len = Len0 - TLVLen - 3,
BeforeLen = byte_size(Header) - Len - TLVLen,
<<Before:BeforeLen/binary, _:32, After:Len/binary>> = Header,
- %% The initial CRC is erlang:crc32(<<"\r\n\r\n\0\r\nQUIT\n", 2:4, 1:4>>).
- case erlang:crc32(1302506282, [Before, <<0:32>>, After]) of
+ %% The initial CRC is ranch_crc32c:crc32c(<<"\r\n\r\n\0\r\nQUIT\n", 2:4, 1:4>>).
+ case ranch_crc32c:crc32c(2900412422, [Before, <<0:32>>, After]) of
CRC32C ->
parse_tlv(Rest, Len, Info, Header);
_ ->
@@ -591,7 +603,7 @@ header(ProxyInfo=#{version := 2, command := proxy,
Addresses = addresses(ProxyInfo),
TLVs = tlvs(ProxyInfo, Opts),
ExtraLen = case Opts of
- #{checksum := crc32} -> 7;
+ #{checksum := crc32c} -> 7;
_ -> 0
end,
Len = iolist_size(Addresses) + iolist_size(TLVs) + ExtraLen,
@@ -603,8 +615,8 @@ header(ProxyInfo=#{version := 2, command := proxy,
TLVs
],
case Opts of
- #{checksum := crc32} ->
- CRC32C = erlang:crc32([Header, <<16#3, 4:16, 0:32>>]),
+ #{checksum := crc32c} ->
+ CRC32C = ranch_crc32c:crc32c([Header, <<16#3, 4:16, 0:32>>]),
[Header, <<16#3, 4:16, CRC32C:32>>];
_ ->
Header
@@ -849,7 +861,7 @@ v2_checksum_test() ->
dest_address => {10, 11, 12, 13},
dest_port => 23456
},
- {ok, Test, <<>>} = parse(iolist_to_binary(header(Test, #{checksum => crc32}))),
+ {ok, Test, <<>>} = parse(iolist_to_binary(header(Test, #{checksum => crc32c}))),
ok.
v2_padding_test() ->