varnishtest "secure_memcmp converter Test" #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 "${HAPROXY_TEST_TIMEOUT-5s}" timeout client "${HAPROXY_TEST_TIMEOUT-5s}" timeout server "${HAPROXY_TEST_TIMEOUT-5s}" 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