| varnishtest "secure_memcmp converter Test" |
| |
| #REQUIRE_VERSION=2.2 |
| #REQUIRE_OPTION=OPENSSL |
| |
| feature ignore_unknown_macro |
| |
| server s1 { |
| rxreq |
| txresp -hdr "Connection: close" |
| } -repeat 4 -start |
| |
| server s2 { |
| rxreq |
| txresp -hdr "Connection: close" |
| } -repeat 7 -start |
| |
| haproxy h1 -conf { |
| global |
| # WT: limit false-positives causing "HTTP header incomplete" due to |
| # idle server connections being randomly used and randomly expiring |
| # under us. |
| tune.idle-pool.shared off |
| |
| defaults |
| mode http |
| timeout connect 1s |
| timeout client 1s |
| timeout server 1s |
| |
| frontend fe |
| # This frontend matches two base64 encoded values and does not need to |
| # handle null bytes. |
| |
| bind "fd@${fe}" |
| |
| #### requests |
| http-request set-var(txn.hash) req.hdr(hash) |
| http-request set-var(txn.raw) req.hdr(raw) |
| |
| acl is_match var(txn.raw),sha1,base64,secure_memcmp(txn.hash) |
| |
| http-response set-header Match true if is_match |
| http-response set-header Match false if !is_match |
| |
| default_backend be |
| |
| frontend fe2 |
| # This frontend matches two binary values, needing to handle null |
| # bytes. |
| bind "fd@${fe2}" |
| |
| #### requests |
| http-request set-var(txn.hash) req.hdr(hash),b64dec |
| http-request set-var(txn.raw) req.hdr(raw) |
| |
| acl is_match var(txn.raw),sha1,secure_memcmp(txn.hash) |
| |
| http-response set-header Match true if is_match |
| http-response set-header Match false if !is_match |
| |
| default_backend be2 |
| |
| backend be |
| server s1 ${s1_addr}:${s1_port} |
| |
| backend be2 |
| server s2 ${s2_addr}:${s2_port} |
| } -start |
| |
| client c1 -connect ${h1_fe_sock} { |
| txreq -url "/" \ |
| -hdr "Raw: 1" \ |
| -hdr "Hash: NWoZK3kTsExUV00Ywo1G5jlUKKs=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 2" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELA=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 2" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELX=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "false" |
| txreq -url "/" \ |
| -hdr "Raw: 3" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELA=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "false" |
| } -run |
| |
| client c2 -connect ${h1_fe2_sock} { |
| txreq -url "/" \ |
| -hdr "Raw: 1" \ |
| -hdr "Hash: NWoZK3kTsExUV00Ywo1G5jlUKKs=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 2" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELA=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 2" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELX=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "false" |
| txreq -url "/" \ |
| -hdr "Raw: 3" \ |
| -hdr "Hash: 2kuSN7rMzfGcB2DKt67EqDWQELA=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "false" |
| |
| # Test for values with leading nullbytes. |
| txreq -url "/" \ |
| -hdr "Raw: 6132845" \ |
| -hdr "Hash: AAAAVaeL9nNcSok1j6sd40EEw8s=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 49177200" \ |
| -hdr "Hash: AAAA9GLglTNv2JoMv2n/w9Xadhc=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "true" |
| txreq -url "/" \ |
| -hdr "Raw: 6132845" \ |
| -hdr "Hash: AAAA9GLglTNv2JoMv2n/w9Xadhc=" |
| rxresp |
| expect resp.status == 200 |
| expect resp.http.match == "false" |
| } -run |