@@ -150,18 +150,22 @@ delete_pods() {
150150 local encrypted_pod_name=$( esudo kubectl get pod -o wide | grep encrypted-image-tests | awk ' {print $1;}' || true)
151151 local unencrypted_pod_name=$( esudo kubectl get pod -o wide | grep unencrypted-image-tests | awk ' {print $1;}' || true)
152152 local encrypted_pod_name_es=$( esudo kubectl get pod -o wide | grep encrypted-image-tests-es | awk ' {print $1;}' || true)
153+ local signed_pod_name=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $1;}' || true)
153154
154- # Delete both encrypted and unencrypted pods
155+ # Delete encrypted, unencrypted, and signed pods
155156 esudo kubectl delete -f \
156157 " ${TEST_DIR} /unencrypted-image-tests.yaml" 2> /dev/null || true
157158 esudo kubectl delete -f \
158159 " ${TEST_DIR} /encrypted-image-tests.yaml" 2> /dev/null || true
159160 esudo kubectl delete -f \
160161 " ${TEST_DIR} /encrypted-image-tests-es.yaml" 2> /dev/null || true
161-
162+ esudo kubectl delete -f \
163+ " ${TEST_DIR} /signed-image-tests.yaml" 2> /dev/null || true
164+
162165 [ -z " ${encrypted_pod_name} " ] || (kubernetes_wait_for_pod_delete_state " ${encrypted_pod_name} " || true)
163166 [ -z " ${unencrypted_pod_name} " ] || (kubernetes_wait_for_pod_delete_state " ${unencrypted_pod_name} " || true)
164167 [ -z " ${encrypted_pod_name_es} " ] || (kubernetes_wait_for_pod_delete_state " ${encrypted_pod_name_es} " || true)
168+ [ -z " ${signed_pod_name} " ] || (kubernetes_wait_for_pod_delete_state " ${signed_pod_name} " || true)
165169}
166170
167171run_kbs () {
@@ -177,6 +181,12 @@ run_kbs() {
177181
178182 pushd simple-kbs
179183 git checkout -b " branch_${simple_kbs_tag} " " ${simple_kbs_tag} "
184+
185+ # copy resources
186+ cp ${TESTS_REPO_DIR} /integration/kubernetes/confidential/fixtures/policy.json resources/
187+ cp ${TESTS_REPO_DIR} /integration/kubernetes/confidential/fixtures/cosign.pub resources/
188+ cp ${TESTS_REPO_DIR} /integration/kubernetes/confidential/fixtures/cosignWrong.pub resources/
189+
180190 esudo docker-compose build
181191
182192 esudo docker-compose up -d
@@ -315,6 +325,7 @@ setup_file() {
315325
316326 generate_service_yaml " unencrypted-image-tests" " ${IMAGE_REPO} :unencrypted"
317327 generate_service_yaml " encrypted-image-tests" " ${IMAGE_REPO} :encrypted"
328+ generate_service_yaml " signed-image-tests" " quay.io/kata-containers/confidential-containers:cosign-signed"
318329
319330 # SEV-ES policy is 7:
320331 # - NODBG (1): Debugging of the guest is disallowed when set
@@ -339,10 +350,26 @@ setup() {
339350EOF
340351}
341352
353+ setup_cosign_signatures_files () {
354+ local key_file=" ${1: cosign.pub} "
355+
356+ mysql -u${KBS_DB_USER} -p${KBS_DB_PW} -h ${KBS_DB_HOST} -D ${KBS_DB} << EOF
357+ INSERT INTO secrets VALUES (10, 'key_id1', '${ENCRYPTION_KEY} ', 10);
358+ INSERT INTO keysets VALUES (10, 'KEYSET-1', '["key_id1"]', 10);
359+ # see https://github.com/confidential-containers/simple-kbs/blob/8507253e9060fb081fd1eac7bf2841ebf02c0847/db/db-mysql.sql#L140
360+ # INSERT INTO resources VALUES (10, 0, resource_type, resource_path, 10);
361+ INSERT INTO resources SET resource_type="Policy", resource_path="policy.json";
362+ INSERT INTO resources SET resource_type="Cosign Key", resource_path="${key_file} ";
363+ EOF
364+ }
365+
342366@test " $test_tag Test SEV unencrypted container launch success" {
343367 # Turn off pre-attestation. It is not necessary for an unencrypted image.
344368 esudo sed -i ' s/guest_pre_attestation = true/guest_pre_attestation = false/g' ${SEV_CONFIG}
345369
370+ # Turn off signature verification
371+ esudo sed -i ' s/agent.enable_signature_verification=true/agent.enable_signature_verification=false/g' ${SEV_CONFIG}
372+
346373 # Start the service/deployment/pod
347374 esudo kubectl apply -f " ${TEST_DIR} /unencrypted-image-tests.yaml"
348375
514541 fi
515542}
516543
544+ @test " $test_tag Test signed image with no required measurement" {
545+ # Add resource files to
546+ setup_cosign_signatures_files
547+
548+ # change kernel command line for signature validation
549+ esudo sed -i ' s/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
550+
551+ # Start the service/deployment/pod
552+ esudo kubectl apply -f " ${TEST_DIR} /signed-image-tests.yaml"
553+
554+ # Retrieve pod name, wait for it to come up, retrieve pod ip
555+ pod_name=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $1;}' )
556+ kubernetes_wait_for_pod_ready_state " $pod_name " 20
557+ pod_ip=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $6;}' )
558+
559+ print_service_info
560+ }
561+
562+ @test " $test_tag Test signed image with no required measurement, but wrong key (failure)" {
563+ # Add resource files to
564+ setup_cosign_signatures_files " cosignWrong.pub"
565+
566+ # change kernel command line for signature validation
567+ esudo sed -i ' s/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
568+
569+ # Start the service/deployment/pod
570+ esudo kubectl apply -f " ${TEST_DIR} /signed-image-tests.yaml"
571+
572+ # Retrieve pod name, wait for it to come up, retrieve pod ip
573+ pod_name=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $1;}' )
574+ kubernetes_wait_for_pod_ready_state " $pod_name " 20
575+ pod_ip=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $6;}' )
576+
577+ print_service_info
578+ }
579+
580+ @test " $test_tag Test signed image with required measurement" {
581+ # Generate firmware measurement
582+ local append=$( cat ${TEST_DIR} /guest-kernel-append)
583+ echo " Kernel Append: ${append} "
584+ measurement=$( generate_firmware_measurement_with_append " ${append} " )
585+ echo " Firmware Measurement: ${measurement} "
586+
587+ # Add resource files to
588+ setup_cosign_signatures_files
589+
590+ # Add key to KBS with policy measurement
591+ add_key_to_kbs_db ${measurement}
592+
593+ # change kernel command line for signature validation
594+ esudo sed -i ' s/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
595+
596+ # Start the service/deployment/pod
597+ esudo kubectl apply -f " ${TEST_DIR} /signed-image-tests.yaml"
598+
599+ # Retrieve pod name, wait for it to come up, retrieve pod ip
600+ pod_name=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $1;}' )
601+ kubernetes_wait_for_pod_ready_state " $pod_name " 20
602+ pod_ip=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $6;}' )
603+
604+ print_service_info
605+ }
606+
607+ @test " $test_tag Test signed image with INVALID measurement" {
608+ # Generate firmware measurement
609+ local append=" INVALID-INPUT"
610+ measurement=$( generate_firmware_measurement_with_append ${append} )
611+ echo " Firmware Measurement: ${measurement} "
612+
613+ # Add resource files to
614+ setup_cosign_signatures_files
517615
616+ # Add key to KBS with policy measurement
617+ add_key_to_kbs_db ${measurement}
618+
619+ # change kernel command line for signature validation
620+ esudo sed -i ' s/agent.enable_signature_verification=false/agent.enable_signature_verification=true/g' ${SEV_CONFIG}
621+
622+ # Make sure pre-attestation is enabled.
623+ esudo sed -i ' s/guest_pre_attestation = false/guest_pre_attestation = true/g' ${SEV_CONFIG}
624+
625+ # Start the service/deployment/pod
626+ esudo kubectl apply -f " ${TEST_DIR} /signed-image-tests.yaml"
627+
628+ # Retrieve pod name, wait for it to come up, retrieve pod ip
629+ pod_name=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $1;}' )
630+ kubernetes_wait_for_pod_ready_state " $pod_name " 20
631+ pod_ip=$( esudo kubectl get pod -o wide | grep signed-image-tests | awk ' {print $6;}' )
632+
633+ print_service_info
634+ }
518635
519636teardown_file () {
520637 echo " ###############################################################################"
0 commit comments