verify_sig_setup.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. set -e
  4. set -u
  5. set -o pipefail
  6. VERBOSE="${SELFTESTS_VERBOSE:=0}"
  7. LOG_FILE="$(mktemp /tmp/verify_sig_setup.log.XXXXXX)"
  8. x509_genkey_content="\
  9. [ req ]
  10. default_bits = 2048
  11. distinguished_name = req_distinguished_name
  12. prompt = no
  13. string_mask = utf8only
  14. x509_extensions = myexts
  15. [ req_distinguished_name ]
  16. CN = eBPF Signature Verification Testing Key
  17. [ myexts ]
  18. basicConstraints=critical,CA:FALSE
  19. keyUsage=digitalSignature
  20. subjectKeyIdentifier=hash
  21. authorityKeyIdentifier=keyid
  22. "
  23. usage()
  24. {
  25. echo "Usage: $0 <setup|cleanup <existing_tmp_dir>"
  26. exit 1
  27. }
  28. setup()
  29. {
  30. local tmp_dir="$1"
  31. echo "${x509_genkey_content}" > ${tmp_dir}/x509.genkey
  32. openssl req -new -nodes -utf8 -sha256 -days 36500 \
  33. -batch -x509 -config ${tmp_dir}/x509.genkey \
  34. -outform PEM -out ${tmp_dir}/signing_key.pem \
  35. -keyout ${tmp_dir}/signing_key.pem 2>&1
  36. openssl x509 -in ${tmp_dir}/signing_key.pem -out \
  37. ${tmp_dir}/signing_key.der -outform der
  38. key_id=$(cat ${tmp_dir}/signing_key.der | keyctl padd asymmetric ebpf_testing_key @s)
  39. keyring_id=$(keyctl newring ebpf_testing_keyring @s)
  40. keyctl link $key_id $keyring_id
  41. }
  42. cleanup() {
  43. local tmp_dir="$1"
  44. keyctl unlink $(keyctl search @s asymmetric ebpf_testing_key) @s
  45. keyctl unlink $(keyctl search @s keyring ebpf_testing_keyring) @s
  46. rm -rf ${tmp_dir}
  47. }
  48. fsverity_create_sign_file() {
  49. local tmp_dir="$1"
  50. data_file=${tmp_dir}/data-file
  51. sig_file=${tmp_dir}/sig-file
  52. dd if=/dev/urandom of=$data_file bs=1 count=12345 2> /dev/null
  53. fsverity sign --key ${tmp_dir}/signing_key.pem $data_file $sig_file
  54. # We do not want to enable fsverity on $data_file yet. Try whether
  55. # the file system support fsverity on a different file.
  56. touch ${tmp_dir}/tmp-file
  57. fsverity enable ${tmp_dir}/tmp-file
  58. }
  59. fsverity_enable_file() {
  60. local tmp_dir="$1"
  61. data_file=${tmp_dir}/data-file
  62. fsverity enable $data_file
  63. }
  64. catch()
  65. {
  66. local exit_code="$1"
  67. local log_file="$2"
  68. if [[ "${exit_code}" -ne 0 ]]; then
  69. cat "${log_file}" >&3
  70. fi
  71. rm -f "${log_file}"
  72. exit ${exit_code}
  73. }
  74. main()
  75. {
  76. [[ $# -ne 2 ]] && usage
  77. local action="$1"
  78. local tmp_dir="$2"
  79. [[ ! -d "${tmp_dir}" ]] && echo "Directory ${tmp_dir} doesn't exist" && exit 1
  80. if [[ "${action}" == "setup" ]]; then
  81. setup "${tmp_dir}"
  82. elif [[ "${action}" == "cleanup" ]]; then
  83. cleanup "${tmp_dir}"
  84. elif [[ "${action}" == "fsverity-create-sign" ]]; then
  85. fsverity_create_sign_file "${tmp_dir}"
  86. elif [[ "${action}" == "fsverity-enable" ]]; then
  87. fsverity_enable_file "${tmp_dir}"
  88. else
  89. echo "Unknown action: ${action}"
  90. exit 1
  91. fi
  92. }
  93. trap 'catch "$?" "${LOG_FILE}"' EXIT
  94. if [[ "${VERBOSE}" -eq 0 ]]; then
  95. # Save the stderr to 3 so that we can output back to
  96. # it incase of an error.
  97. exec 3>&2 1>"${LOG_FILE}" 2>&1
  98. fi
  99. main "$@"
  100. rm -f "${LOG_FILE}"