| 
					
				 | 
			
			
				@@ -0,0 +1,120 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#!/bin/bash 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set -exo pipefail 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Copyright (c) 2020 Red Hat, Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Author: Sergio Correia <scorreia@redhat.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# This program is free software: you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# it under the terms of the GNU General Public License as published by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# the Free Software Foundation, either version 3 of the License, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# (at your option) any later version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# This program is distributed in the hope that it will be useful, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# but WITHOUT ANY WARRANTY; without even the implied warranty of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# GNU General Public License for more details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# You should have received a copy of the GNU General Public License 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# along with this program.  If not, see <http://www.gnu.org/licenses/>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+. tang-common-test-functions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TEST=$(basename "${0}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+on_exit() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    exit_status=$? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tang_stop "${TMP}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [ -d "${TMP}" ] && rm -rf "${TMP}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    exit "${exit_status}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+trap 'on_exit' EXIT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+TMP="$(mktemp -d)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+port=$(tang_new_random_port) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tang_run "${TMP}" "${port}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+url="http://localhost:${port}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+data="just a sample text" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Get the advertisement and extract the keys. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+adv="$(tang_get_adv "${port}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jwks="$(jose fmt --json="${adv}" --get payload --b64load --output=-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+enc="$(printf '%s' "${jwks}" | jose jwk use --input=- --required \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       --use deriveKey --output=-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jose fmt --json="${enc}" --get keys --array \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      || enc="$(printf '{"keys": [%s]}' "${enc}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jwk="$(jose fmt --json="${enc}" --get keys --array --foreach=- \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       | jose fmt --json=- --delete key_ops --delete alg --output=-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jwe_t='{"protected":{"alg":"ECDH-ES","enc":"A256GCM","clevis":{"pin":"tang","tang":{}}}}' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jwe_t="$(jose fmt --json="${jwe_t}" --get protected --get clevis --get tang --quote "${url}" --set url -UUUUo-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jwe_t="$(printf '%s' "${jwks}" | jose fmt --json="${jwe_t}" --get protected --get clevis --get tang --json=- --set adv -UUUUo-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# We currently support SHA-1 (legacy) and SHA-256. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CLEVIS_SUPPORTED_THP_ALGS="S1 S256" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Now we will use every hash algorithm supported by jose to create a thumbprint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# for `kid', then we do the encoding and verify clevis decrypt can decode it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# correctly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+for alg in ${CLEVIS_SUPPORTED_THP_ALGS}; do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    kid="$(printf '%s' "${jwk}" | jose jwk thp -a "${alg}" --input=-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    jwe="$(jose fmt --json="${jwe_t}" --get protected --quote "${kid}" -s kid -UUo-)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    encoded=$(printf '%s%s' "${jwk}" "${data}" \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              | jose jwe enc --input="${jwe}" --key=- --detached=- --compact) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if ! decoded="$(printf '%s' "${encoded}" | clevis decrypt)"; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: decoding is expected to work (alg = ${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if  [ "${decoded}" != "${data}" ]; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: tang decrypt should have succeeded decoded[${decoded}] data[${data}] (alg = ${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+done 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Now let's test encryption providing the thp in the configuration. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+data="just another test" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+for alg in ${CLEVIS_SUPPORTED_THP_ALGS}; do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    thp="$(jose fmt --json="${adv}" -g payload -y -o- \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           | jose jwk use -i- -r -u verify -o- \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           | jose jwk thp -i- -a "${alg}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cfg="$(printf '{"url":"%s", "thp":"%s"}' "${url}" "${thp}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if ! encoded=$(printf '%s' "${data}" | clevis encrypt tang "${cfg}"); then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: tang encryption should have succeeded when providing the thp (${thp}) with any supported algorithm (${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if ! decoded="$(printf '%s' "${encoded}" | clevis decrypt)"; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: decoding is expected to work (thp alg = ${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if  [ "${decoded}" != "${data}" ]; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: tang decrypt should have succeeded decoded[${decoded}] data[${data}] (alg = ${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+done 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Let's also try some unsupported thp hash algorithms. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+UNSUPPORTED="S224 S384 S512" # SHA-224, SHA-384, SHA-512. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+for alg in ${UNSUPPORTED}; do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    thp="$(jose fmt --json="${adv}" -g payload -y -o- \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           | jose jwk use -i- -r -u verify -o- \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           | jose jwk thp -i- -a "${alg}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cfg="$(printf '{"url":"%s", "thp":"%s"}' "${url}" "${thp}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if echo foo | clevis encrypt tang "${cfg}" >/dev/null; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: tang encryption should have failed when providing the thp (${thp}) with an unsupported algorithm (${alg})" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+done 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Now let's try some bad values for thp. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+for thp in "" "foo" "invalid"; do 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cfg="$(printf '{"url":"%s", "thp":"%s"}' "${url}" "${thp}")" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if echo foo | clevis encrypt tang "${cfg}" >/dev/null; then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tang_error "${TEST}: tang encryption expected to fail when providing a bad thp" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+done 
			 |