セキュアブートできるOVMFをソースからコンパイルする

QEMUでUEFIブートを行うためのBIOSであるOVMFの話題である。セキュアブートではないOVMFのコンパイル方法は [OVMFをビルドする](https://ideal-reality.com/computer/linux/ovmf-build/) の通りやればよいが、セキュアブートできるOVMFのコンパイル方法はどこにも書いて無さそうなので記録する。だいたい下記のことを自動で行うスクリプトが https://github.com/emojifreak/qemu-arm-image-builder/blob/main/OVMF-Fedora/my-ovmf-build.sh にある。コンパイル環境はLinuxを仮定。Intel/AMD 64ビットCPUで使えるOVMFを対象にするが、適切に読み替えれば32ビットのOVMFも作成できることを確認している。

# コンパイル環境の設定
Debian, Ubuntu系なら `sudo apt-get build-dep edk2` とする。Fedoraなら https://src.fedoraproject.org/rpms/edk2/blob/HEAD/f/edk2.spec の中の `BuildRequires:` に書いてあるパッケージを `dnf` でインストールする。

# ソースの入手
```shell
git clone --recursive https://github.com/tianocore/edk2.git
git clone --recursive https://github.com/rhuefi/qemu-ovmf-secureboot.git
wget https://github.com/emojifreak/qemu-arm-image-builder/raw/main/OVMF-Fedora/UefiShell.fedora-amd64.iso
```

# コンパイル
```shell
cd edk2
./OvmfPkg/build.sh -a IA32 -a X64 -DFD_SIZE_4MB -DSECURE_BOOT_ENABLE=TRUE -DSMM_REQUIRE=TRUE
```

とすると `edk2/Build/Ovmf3264/DEBUG_GCC5/FV` に、QEMUなどで使うための`OVMF_CODE.fd` と`OVMF_VARS.fd` ができる。ここではまだセキュアブート検証用の鍵が`OVMF_VARS.fd`に埋め込まれていないため、埋め込み作業を行う。ここで上記の `SECURE_BOOT_ENABLE` と `SMM_REQUIRE` は必須。 `-a IA32 -a X64` を `-a X64` にするとS3サスペンド・リジュームをQEMUで無効にしないと起動できないOVMFができる。

# 鍵の埋め込み
末尾に述べるようにシェル変数`FEDORA_KEY`, `UBUNTU_KEY`, `DEBIAN_KEY` を適切に定義して `python3 ../qemu-ovmf-secureboot/ovmf-vars-generator --qemu-binary qemu-system-x86_64 --verbose --verbose --enable-kvm --ovmf-binary Build/Ovmf3264/DEBUG_GCC5/FV/OVMF_CODE.fd --ovmf-template-vars Build/Ovmf3264/DEBUG_GCC5/FV/OVMF_VARS.fd --uefi-shell-iso ../UefiShell.fedora-amd64.iso --skip-testing --oem-string "$FEDORA_KEY" --oem-string "$DEBIAN_KEY" --oem-string "$UBUNTU_KEY" Build/Ovmf3264/DEBUG_GCC5/FV/OVMF_VARS.secboot.fd` とすると鍵を埋め込まれた `Build/Ovmf3264/DEBUG_GCC5/FV/OVMF_VARS.secboot.fd` が新たにできる。ここで `OVMF_VARS*.fd` はNVRAMの内容なのでゲストOSごとにコピーして用いる。

# QEMUによるセキュアブート
上記の `OVMF_CODE.fd` と `OVMF_VARS.secboot.fd` を適切な場所にコピーして `qemu-system-x86_64 -enable-kvm -cpu max -machine q35,smm=on,accel=kvm -global driver=cfi.pflash01,property=secure,value=on -drive if=pflash,unit=0,format=raw,read-only=on,file=OVMF_CODE.fd -drive if=pflash,unit=1,format=raw,file=OVMF_VARS.secboot.fd` とすればセキュアブートするQEMUを使える。KVMは無くても動作する。

# Fedora, CentOS, RedHat, Ubuntu, Debian の鍵
は以下の通り。それ以外のセキュアブート用鍵を見つけられていないが、上記の `ovmf-vars-generator` のオプションは `--oem-string` は何度でも指定してよいため、他の鍵が見つかればそれも含めるようにするとよい。CentOS, RedHatの鍵はFedoraと共通。

```shell
DEBIAN_KEY="4e32566d-8e9e-4f52-81d3-5bb9715f9727:MIIDvTCCAqWgAwIBAgIURQHuOT5SKXg234VCyOV7u4jRSzcwDQYJKoZIhvcNAQELBQAwbjEPMA0GA1UECgwGRGViaWFuMS0wKwYDVQQDDCREZWJpYW4gVUVGSSBTZWN1cmUgQm9vdCAoUEsvS0VLIGtleSkxLDAqBgkqhkiG9w0BCQEWHWRlYmlhbi1kZXZlbEBsaXN0cy5kZWJpYW4ub3JnMB4XDTE5MDcwODIzNDI0OVoXDTI5MDcwNTIzNDI0OVowbjEPMA0GA1UECgwGRGViaWFuMS0wKwYDVQQDDCREZWJpYW4gVUVGSSBTZWN1cmUgQm9vdCAoUEsvS0VLIGtleSkxLDAqBgkqhkiG9w0BCQEWHWRlYmlhbi1kZXZlbEBsaXN0cy5kZWJpYW4ub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm6tJi7ql+lQqcZp5BcQbRhHFs71ZYoBxrbtsxFColtaJ6+gR1Ig8SeSPUc2lh8PS/lEeOhu/2Fs4U7WdaFLRPoLL2/1eAYEwxL5z4NZWP0oo8TPXUmF7hKJAohiIeFsU0B5tariuEESvEpmmey3puo0KWJM4aett8G+XIv7gD7Sk+cgrO3O5Uc8fH+VmB8vd907zVypJaVNBgPzVanXZug1nvVPGHdXlZb8LjfwWWGXtWaZXjzNIpmwn3LQdnpSeY4sZAr/gAVI0KKQTiP75ewYd4neFB55OG6rKDGrk3yvpiqxCBd4y1TT54m+WwtQFX8kg2DOaAYJdlGl4Ti7gxwIDAQABo1MwUTAdBgNVHQ4EFgQUiAnrn/p9LV3bMGenr7mJjqPuAnMwHwYDVR0jBBgwFoAUiAnrn/p9LV3bMGenr7mJjqPuAnMwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEACnQviYBeHsTyyaJNtjTusWid8r13heVoZtX/diApnw3zzRufIk4mnREZk5ajmwz9iN+g7xEJHsJwbyD2/r7DWjxAR3mgLILGQjzEPK9Vf4rDDQxqz598nby1bTNzzfkTDo5Nzvj2VHTHkCjrb1gx1kGeJacEQIoo2zY5c+rknow+Qlp7BSB45k1pH7q/obcC2eOr/ELZd83g3Qg7vpZ5XF1x7sdo6KYIaS3/mK1RyxvvObBScAPTPKfOpfCTYsprYUvce8cAnoA6v6+Veff2FH5F8bRsyDGfCjgn/Dz7RCJOetNyFy92XMYAiyYFFZXrcVJfW5DIy/1TAaT/CsitJQ=="
UBUNTU_KEY="4e32566d-8e9e-4f52-81d3-5bb9715f9727:MIIDNjCCAh4CCQCUy69JzVan2DANBgkqhkiG9w0BAQsFADBdMS0wKwYDVQQDDCRVYnVudHUgT1ZNRiBTZWN1cmUgQm9vdCAoUEsvS0VLIGtleSkxLDAqBgkqhkiG9w0BCQEWHXVidW50dS1kZXZlbEBsaXN0cy51YnVudHUuY29tMB4XDTE4MDYyMDIxNDg0NloXDTI4MDYxNzIxNDg0NlowXTEtMCsGA1UEAwwkVWJ1bnR1IE9WTUYgU2VjdXJlIEJvb3QgKFBLL0tFSyBrZXkpMSwwKgYJKoZIhvcNAQkBFh11YnVudHUtZGV2ZWxAbGlzdHMudWJ1bnR1LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMuwK+l3nl5x6ebrHYVShs/7jPAKeTTMu4MQlTbNoOZvVQhOcedjkBNaPPdd63TBxYFAnJhUBLl9hW/GB5Fn9itT0yh5G64XCBafy3rJLF8L99VDUYEuvB+a3boYATCToVnODb8h0ImORBF8sgKZm65CJlgQ93YGZbjLePnuawhU2EVH2HFyLZEWjd3JPxstlzGj+JiwvETdFX/fHbnrW+fLCLEnLLZ/YPo6We0mtVTEqHWm6G5WUIbpzPzOOGpiCKHdI+VFsX7w1TBdMhCqnxcpLn7NRXEEgw+OQ5gnOLR9kTKI+MRkux9pDGZ5v9VMcPZi2iZTHRd9briIGOL/fo0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAGLAtUs7fnf5oKU7E7+woUrHP03WXAwhTNI9eTs7YLPgwC2qGAGkzdUZUbzc4zS4SaItITlYYeWfZ9PvPhPGyIZOeuBMoUeBknsC2daRVX11aAcgOnQhxMD0WjSRG5nQ5rXRZ/NwYvctJR81l41kDToNqjBIjJ3FThzz8hHyMv/DCh3ch/X2Hj7ib+1IPfoHFk+mD/6e+y46wHWS5u0Bol9w4VBMwa3FYniFgKrAmnoiuo2br5fBbgH/7326lJ7Qb/H4mBLKz/c3iw4PF+KQxspc04tJdvQ+pDEtTUiXVE0zcBip2EJgPVK0szO5H6gtXbfyoTqDr1DKaD4x9JD3yKQ=="
FEDORA_KEY="4e32566d-8e9e-4f52-81d3-5bb9715f9727:MIIDoDCCAoigAwIBAgIJAP71iOjzlsDxMA0GCSqGSIb3DQEBCwUAMFExKzApBgNVBAMTIlJlZCBIYXQgU2VjdXJlIEJvb3QgKFBLL0tFSyBrZXkgMSkxIjAgBgkqhkiG9w0BCQEWE3NlY2FsZXJ0QHJlZGhhdC5jb20wHhcNMTQxMDMxMTExNTM3WhcNMzcxMDI1MTExNTM3WjBRMSswKQYDVQQDEyJSZWQgSGF0IFNlY3VyZSBCb290IChQSy9LRUsga2V5IDEpMSIwIAYJKoZIhvcNAQkBFhNzZWNhbGVydEByZWRoYXQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkB+Ee42865cmgm2Iq4rJjGhw+d9LB7I3gwsCyGdoMJ7j8PCZSrhZV8ZB9jiL/mZMSek3N5IumAEeWxRQ5qiNJQ31huarMMtAFuqNixaGcEM38s7Akd9xFI6ZDom2TG0kHozkL08l0LoG+MboGRh2cx2BbajYBc86yHsoyDajFg0pjJmaaNyrwE2Nv1q7K6k5SwSXHPk2u8U6hgSur9SCe+Cr3kkFaPz2rmgabJBNVxk8ZGYD9sdSm/eUz5NqoWjJqs+Za7yqXgjnORz3+A+6Bn7xy+h23f4i2q06Xls06rPJ4E0EKX64YLkF77XZF1hWFmC5MDLwNkrD8nmNEkBw8wIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUPOlg4/8ZoQp7o0L0jUIutNWccuwwHwYDVR0jBBgwFoAUPOlg4/8ZoQp7o0L0jUIutNWccuwwDQYJKoZIhvcNAQELBQADggEBAFxNkoi0gl8drYsR7N8GpnqlK583VQyNbgUArbcMQYlpz9ZlBptReNKtx7+c3AVzf+ceORO06rYwfUB1q5xDC9+wwhu/MOD0/sDbYiGY9sWv3jtPSQrmHvmGsD8N1tRGN9tUdF7/EcJgxnBYxRxv7LLYbm/DvDOHOKTzRGScNDsolCZ4J58WF+g7aQolqXM2fp43XOzoP9uR+RKzPc7n3RXDrowFIGGbld6br/qxXBzll+fDNBGF9YonJqRwNuwM9oM9kPc28/nzFdSQYr5TtK/TSa/v9HPoe3bkRCo3uoGkmQw6MSRxoOTktxrLR+SqIs/vdWGA40O3SFdzET14m2k="
```