capsule-update.robot: add tests of capsule updates

Failed to make spelling exception work in .codespellx and added
../ignore_lines.txt, maybe setting in .codespellrc doesn't work
anymore [0].

[0]: https://docs.openverse.org/general/contribution/codespell.html

Signed-off-by: Jan Prusinowski <jan.prusinowski@3mdeb.com>
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Signed-off-by: Filip Gołaś <filip.golas@3mdeb.com>
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
This commit is contained in:
Jan Prusinowski
2024-09-09 21:26:51 +03:00
committed by Sergii Dmytruk
parent b5264146bb
commit 3328ea59f2
9 changed files with 563 additions and 0 deletions
+280
View File
@@ -0,0 +1,280 @@
*** Settings ***
Library Collections
Library OperatingSystem
Library Process
Library String
Library Telnet timeout=20 seconds connection_timeout=120 seconds
Library SSHLibrary timeout=90 seconds
Library RequestsLibrary
# TODO: maybe have a single file to include if we need to include the same
# stuff in all test cases
Resource ../variables.robot
Resource ../keywords.robot
Resource ../keys.robot
# TODO:
# - document which setup/teardown keywords to use and what are they doing
# - go threough them and make sure they are doing what the name suggest (not
# exactly the case right now)
Suite Setup Run Keywords
... Display Preparation Instructions
... AND
... Prepare Test Suite
... AND
... Skip If not ${CAPSULE_UPDATE_SUPPORT} Capsule Update not supported
... AND
... Check If CAPSULE FW FILE Is Present
... AND
... Flash Firmware If Not QEMU
... AND
... Upload Required Files
... AND
... Turn Off Active ME
Suite Teardown Run Keywords
... Log Out And Close Connection
*** Variables ***
${FUM_DIALOG_TOP}= Update Mode. All firmware write protections are disabled in this mode.
${FUM_DIALOG_BOTTOM}= The platform will automatically reboot and disable Firmware Update Mode
*** Test Cases ***
CUP001.001 Capsule Update With Wrong Keys
[Documentation] Check that DUT rejects flashing a capsule signed with invalid certificate.
Boot Into UEFI Shell
${original_bios_version}= Get BIOS Version before update
Perform Capsule Update wrong_cert.cap
Select UEFI Shell Boot Option
${updated_bios_version}= Get BIOS Version after update
Should Be Equal ${original_bios_version} ${updated_bios_version}
Enter Capsule Testing Folder
${out}= Execute UEFI Shell Command CapsuleApp.efi -S
Should Contain ${out} Capsule Status: Security Violation
CUP002.001 Capsule Update With Wrong GUID
[Documentation] Check that DUT rejects flashing a capsule with invalid GUID.
Boot Into UEFI Shell
${original_bios_version}= Get BIOS Version before update
Perform Capsule Update invalid_guid.cap
Select UEFI Shell Boot Option
${updated_bios_version}= Get BIOS Version after update
Should Be Equal ${original_bios_version} ${updated_bios_version}
Enter Capsule Testing Folder
${out}= Execute UEFI Shell Command CapsuleApp.efi -S
Should Contain ${out} Capsule Status: Not Ready
CUP999.001 Capsule Update
[Documentation] Check for a successful Capsule Update.
... Please note that the test number is high on purpose. This test will flash FW! In future
... if additional test cases will be created - when running the whole suite - It will be good
... to keep the number of actual FW updates to minimum to prevent chip degradation.
Boot Into UEFI Shell
${original_bios_version}= Get BIOS Version before update
Perform Capsule Update max_fw_ver.cap
Select UEFI Shell Boot Option
${updated_bios_version}= Get BIOS Version after update
Should Not Be Equal ${original_bios_version} ${updated_bios_version}
Enter Capsule Testing Folder
${out}= Execute UEFI Shell Command CapsuleApp.efi -S
Should Contain ${out} CapsuleMax
Should Not Contain ${out} CapsuleLast
*** Keywords ***
Flash Firmware If Not QEMU
IF '${MANUFACTURER}' != 'QEMU'
Flash Firmware ${FW_FILE}
Power Cycle On
END
Get Key To Press
[Arguments] ${text}
${matches}= Get Regexp Matches ${text} [0-9]
${digit}= Set Variable ${matches[0]}
Log Found digit: ${digit}
RETURN ${digit}
Select UEFI Shell Boot Option
${boot_menu}= Enter Boot Menu Tianocore And Return Construction
Enter Submenu From Snapshot ${boot_menu} UEFI Shell
Read From Terminal Until Shell>
Boot Into UEFI Shell
Power On
Select UEFI Shell Boot Option
Extract BIOS Version
[Arguments] ${text}
${lines}= Split To Lines ${text}
${bios_version}= Set Variable None
FOR ${line} IN @{lines}
IF 'BIOS Version' in '${line}'
${bios_version}= Set Variable ${line}
END
END
IF '${bios_version}' == 'None'
FOR ${line} IN @{lines}
IF 'BIOSVersion' in '${line}'
${bios_version}= Set Variable ${line}
END
END
END
RETURN ${bios_version}
Get BIOS Version
[Arguments] ${label}
${out}= Execute UEFI Shell Command smbiosview -t 0
${bios_version}= Extract BIOS Version ${out}
Log To Console \n[${label}] ${bios_version}
RETURN ${bios_version}
Upload Required Files
${file_name}= Get File Name Without Extension ${CAPSULE_FW_FILE}
Check If Capsule File Exists ../edk2/${file_name}_max_fw_ver.cap
Check If Capsule File Exists ../edk2/${file_name}_wrong_cert.cap
Check If Capsule File Exists ../edk2/${file_name}_invalid_guid.cap
Power On
Boot System Or From Connected Disk ubuntu
IF '${DUT_CONNECTION_METHOD}' == 'pikvm'
Set Global Variable ${DUT_CONNECTION_METHOD} SSH
END
Login To Linux
Switch To Root User
# Send File To DUT uses regular user, so prepare target directory in as root
Execute Command In Terminal rm -r /capsule_testing
Execute Command In Terminal mkdir /capsule_testing
Execute Command In Terminal chmod 777 /capsule_testing
Log To Console Sending ./dasharo-stability/capsule-update-files/CapsuleApp.efi
Send File To DUT ./dasharo-stability/capsule-update-files/CapsuleApp.efi /capsule_testing/CapsuleApp.efi
Log To Console Sending ${CAPSULE_FW_FILE}
Send File To DUT ${CAPSULE_FW_FILE} /capsule_testing/valid_capsule.cap
Log To Console Sending ../edk2/${file_name}_max_fw_ver.cap
Send File To DUT ../edk2/${file_name}_max_fw_ver.cap /capsule_testing/max_fw_ver.cap
Log To Console Sending ../edk2/${file_name}_wrong_cert.cap
Send File To DUT ../edk2/${file_name}_wrong_cert.cap /capsule_testing/wrong_cert.cap
Log To Console Sending ../edk2/${file_name}_invalid_guid.cap
Send File To DUT ../edk2/${file_name}_invalid_guid.cap /capsule_testing/invalid_guid.cap
# Move the directory to ESP partition so the tests work even if root
# file-system is part of LVM
Execute Command In Terminal rm -r /boot/efi/capsule_testing
Execute Command In Terminal mv /capsule_testing /boot/efi
# Make sure file-system data is pushed to disks before resetting a platform
Execute Command In Terminal sync
Perform Capsule Update
[Arguments] ${capsule_file}
# Submit capsule to firmware without an automatic reset and verify that it
# was accepted without error
Enter Capsule Testing Folder
${out}= Execute UEFI Shell Command CapsuleApp.efi ${capsule_file} -NR
Should Not Contain ${out} is not recognised
Should Not Contain ${out} Command Error Status
Should Not Contain ${out} is not a valid capsule.
Should Not Contain ${out} failed to query capsule capability
Should Contain ${out} CapsuleApp: creating capsule descriptors at
Should Contain ${out} :\\capsule_testing\\>
# Reset the system manually
Execute UEFI Shell Command reset 3m
# Confirm update by following instructions of Firmware Update Mode dialog
Read From Terminal Until ${FUM_DIALOG_TOP}
${out}= Read From Terminal Until ${FUM_DIALOG_BOTTOM}
${digit}= Get Key To Press ${out}
Write Bare Into Terminal ${digit}
Get File Name Without Extension
[Arguments] ${file_path}
${path_components}= Split String ${file_path} /
${base_name}= Get From List ${path_components} -1
${name_parts}= Split String From Right ${base_name} . 1
${result}= Get From List ${name_parts} 0
RETURN ${result}
Check If Capsule File Exists
[Arguments] ${file_path}
${file_exists}= OperatingSystem.File Should Exist ${file_path}
IF '${file_exists}' == 'False'
Fail
... File ${file_path} does not exist!/nTo create capsule files required for this test run: 'sudo bash
... ./scripts/capsules/capsule_update_tests.sh ${CAPSULE_FW_FILE}' and start the test again.
END
Check If CAPSULE FW FILE Is Present
IF '${CAPSULE_FW_FILE}' == '${EMPTY}'
Log To Console capsule_fw_file parameter missing.
... Please add: -v capsule_fw_file:<capsule_to_be_testes>.cap to the robot command line and try again.
Fail
END
Enter Capsule Testing Folder
${fss}= Get FS From Uefi Shell
FOR ${fs} IN @{fss}
${out}= Execute UEFI Shell Command ${fs}:
IF 'is not a valid mapping.' in '''${out}'''
Fail Failed to find a file-system with capsule_testing/
END
${out}= Execute UEFI Shell Command cd capsule_testing
IF 'is not a directory.' not in '''${out}''' BREAK
END
Get FS From Uefi Shell
${map}= Execute UEFI Shell Command map
${fss}= Get Regexp Matches ${map} FS[0-9]{,2}
RETURN ${fss}
Turn Off Active ME
IF ${DASHARO_INTEL_ME_MENU_SUPPORT} == ${TRUE}
Power On
${setup_menu}= Enter Setup Menu Tianocore And Return Construction
${dasharo_menu}= Enter Dasharo System Features ${setup_menu}
${me_menu}= Enter Dasharo Submenu ${dasharo_menu} Intel Management Engine Options
Set Option State ${me_menu} Intel ME mode Disabled (HAP)
Save Changes And Reset
END
Display Preparation Instructions
Log To Console ******************************************************************************\n
Log To Console To run tests first prepare a valid capsule file(*) and then use this capsule
Log To Console file to generate invalid capsules required by the tests by running the script:
Log To Console \ \ \ \ ./scripts/capsules/capsule_update_tests.sh <capsule_file>.cap
Log To Console then start the tests:\n
Log To Console \ on QEMU:
Log To Console \ \ \ \ robot -v snipeit:no -L TRACE -v rte_ip:127.0.0.1 -v config:qemu \\
Log To Console \ \ \ \ \ \ -v capsule_fw_file:dasharo.cap dasharo-stability/capsule-update.robot
Log To Console \n on other platforms:
Log To Console \ \ \ \ robot -v snipeit:no -L TRACE -v rte_ip:<rte_ip> -v config:<config> \\
Log To Console \ \ \ \ \ \ -v sonoff_ip:<sonoff_ip> -v pikvm_ip:<pikvm_ip> -v device_ip:<device_ip> \\
Log To Console \ \ \ \ \ \ -v fw_file:<fw_file.rom> -v capsule_fw_file:<capsule_file>.cap \\
Log To Console \ \ \ \ \ \ dasharo-stability/capsule-update.robot
Log To Console \ \ or:
Log To Console \ \ \ \ robot -L TRACE -v rte_ip:<rte_ip> -v config:<config> -v device_ip:<device_ip> \\
Log To Console \ \ \ \ \ \ -v fw_file:<fw_file.rom> -v capsule_fw_file:<capsule_file>.cap \\
Log To Console \ \ \ \ \ \ dasharo-stability/capsule-update.robot
Log To Console \n(*) To start tests on DUT which use PIKVM: Before preparing the capsule please
Log To Console edit FW to enable Console Serial Redirection. Use the guide:
Log To Console
... \ \ https://github.com/Dasharo/open-source-firmware-validation/blob/develop/docs/troubleshooting.md
Log To Console Without it, a successful flash of DUT will prevent tests from working
Log To Console correctly.
Log To Console \n******************************************************************************
+1
View File
@@ -213,6 +213,7 @@ ${TPM_DETECT_SUPPORT}= ${FALSE}
${NVME_DETECTION_SUPPORT}= ${FALSE}
${USB_TYPE-A_DEVICES_DETECTION_SUPPORT}= ${FALSE}
${NETWORK_INTERFACE_AFTER_SUSPEND_SUPPORT}= ${FALSE}
${CAPSULE_UPDATE_SUPPORT}= ${FALSE}
# Test module: trenchboot
${TRENCHBOOT_SUPPORT}= ${FALSE}
@@ -110,6 +110,7 @@ ${TPM_DETECT_SUPPORT}= ${TRUE}
${NVME_DETECTION_SUPPORT}= ${TRUE}
${USB_TYPE-A_DEVICES_DETECTION_SUPPORT}= ${TRUE}
${NETWORK_INTERFACE_AFTER_SUSPEND_SUPPORT}= ${TRUE}
${CAPSULE_UPDATE_SUPPORT}= ${TRUE}
*** Keywords ***
+3
View File
@@ -80,6 +80,9 @@ ${TRENCHBOOT_SUPPORT}= ${TRUE}
${AUTO_BOOT_TIME_OUT_DEFAULT_VALUE}= 0
# Test module: dasharo-stability
${CAPSULE_UPDATE_SUPPORT}= ${TRUE}
*** Keywords ***
Power On
+183
View File
@@ -0,0 +1,183 @@
#!/bin/bash
here=$(realpath "$(dirname "$0")")
capsule=$(realpath "$1")
capsule_name=$(basename "$capsule")
capsule_name="${capsule_name%.*}"
cd ..
if [ ! -d "./edk2" ]; then
git clone --depth 1 --branch osfv-capsule-tests https://github.com/Dasharo/edk2.git
chmod 777 edk2
fi
cd edk2 || exit
# Decoding the capsule
BaseTools/BinWrappers/PosixLike/GenerateCapsule \
--decode "$capsule" \
--output decoded
# Extracting data
json_file="decoded.json"
dependencies=$(jq -r '.Payloads[0].Dependencies' "$json_file")
fw_version=$(jq -r '.Payloads[0].FwVersion' "$json_file")
guid=$(jq -r '.Payloads[0].Guid' "$json_file")
hardware_instance=$(jq -r '.Payloads[0].HardwareInstance' "$json_file")
lowest_supported_version=$(jq -r '.Payloads[0].LowestSupportedVersion' "$json_file")
monotonic_count=$(jq -r '.Payloads[0].MonotonicCount' "$json_file")
payload=$(jq -r '.Payloads[0].Payload' "$json_file")
update_image_index=$(jq -r '.Payloads[0].UpdateImageIndex' "$json_file")
echo
echo "\"Dependencies\": \"$dependencies\""
echo "\"FwVersion\": \"$fw_version\""
echo "\"Guid\": \"$guid\""
echo "\"HardwareInstance\": \"$hardware_instance\""
echo "\"LowestSupportedVersion\": \"$lowest_supported_version\""
echo "\"MonotonicCount\": \"$monotonic_count\""
echo "\"Payload\": \"$payload\""
echo "\"UpdateImageIndex\": \"$update_image_index\""
echo
# Create json config files with capsule configs
echo "--- CREATING CAPSULE WITH MAX POSSIBLE VERSION NUMBER ---"
file_descriptor="_max_fw_ver"
output_file="$capsule_name$file_descriptor.json"
if [ -f $output_file ]; then
rm $output_file
fi
# There might be an issue if more than one driver is present
content=$(cat <<EOF
{
"EmbeddedDrivers": [
{
"Driver": "decoded.EmbeddedDriver.1.efi"
}
],
"Payloads": [
{
"Payload": "$payload",
"Guid": "$guid",
"FwVersion": "0x99999999",
"LowestSupportedVersion": "$lowest_supported_version",
"OpenSslSignerPrivateCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestCert.pem",
"OpenSslOtherPublicCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestSub.pub.pem",
"OpenSslTrustedPublicCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestRoot.pub.pem"
}
]
}
EOF
)
echo "$content" > "$output_file"
echo "Json file: $output_file"
echo "Output file: $capsule_name$file_descriptor.cap"
BaseTools/BinWrappers/PosixLike/GenerateCapsule --encode \
--capflag PersistAcrossReset \
--json-file $output_file \
--output $capsule_name$file_descriptor.cap
echo "--- CREATING CAPSULE WITH WRONG CERTIFICATES ---"
file_descriptor="_wrong_cert"
output_file="$capsule_name$file_descriptor.json"
if [ -f $output_file ]; then
rm $output_file
fi
invalid_cert_file="$here/sign.p12"
invalid_sub_file="$here/sub.pub.pem"
invalid_root_file="$here/root.pub.pem"
if [ ! -f $invalid_cert_file ]; then
echo "!!!WARNING!!! Cert file not found!"
fi
if [ ! -f $invalid_sub_file ]; then
echo "!!!WARNING!!! Sub file not found!"
fi
if [ ! -f $invalid_root_file ]; then
echo "!!!WARNING!!! Root file not found!"
fi
# There might be an issue if more than one driver is present
content=$(cat <<EOF
{
"EmbeddedDrivers": [
{
"Driver": "decoded.EmbeddedDriver.1.efi"
}
],
"Payloads": [
{
"Payload": "$payload",
"Guid": "$guid",
"FwVersion": "$fw_version",
"LowestSupportedVersion": "$lowest_supported_version",
"OpenSslSignerPrivateCertFile": "$invalid_cert_file",
"OpenSslOtherPublicCertFile": "$invalid_sub_file",
"OpenSslTrustedPublicCertFile": "$invalid_root_file"
}
]
}
EOF
)
echo "$content" > "$output_file"
BaseTools/BinWrappers/PosixLike/GenerateCapsule --encode \
--capflag PersistAcrossReset \
--json-file $output_file \
--output $capsule_name$file_descriptor.cap
echo "--- CREATING CAPSULE WITH WRONG GUID ---"
file_descriptor="_invalid_guid"
output_file="$capsule_name$file_descriptor.json"
if [ -f $output_file ]; then
rm $output_file
fi
# There might be an issue if more than one driver is present
content=$(cat <<EOF
{
"EmbeddedDrivers": [
{
"Driver": "decoded.EmbeddedDriver.1.efi"
}
],
"Payloads": [
{
"Payload": "$payload",
"Guid": "11111111-2222-3333-4444-abcdefabcdef",
"FwVersion": "$fw_version",
"LowestSupportedVersion": "$lowest_supported_version",
"OpenSslSignerPrivateCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestCert.pem",
"OpenSslOtherPublicCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestSub.pub.pem",
"OpenSslTrustedPublicCertFile": "BaseTools/Source/Python/Pkcs7Sign/TestRoot.pub.pem"
}
]
}
EOF
)
echo "$content" > "$output_file"
echo "Json file: $output_file"
echo "Output file: $capsule_name$file_descriptor.cap"
BaseTools/BinWrappers/PosixLike/GenerateCapsule --encode \
--capflag PersistAcrossReset \
--json-file $output_file \
--output $capsule_name$file_descriptor.cap
+20
View File
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDWzCCAkOgAwIBAgIUN6TUIj8GstcO9IUwTMEXmkCxeK8wDQYJKoZIhvcNAQEL
BQAwPTELMAkGA1UEBhMCWFgxETAPBgNVBAgMCFByb3ZpbmNlMQwwCgYDVQQKDANP
cmcxDTALBgNVBAMMBHJvb3QwHhcNMjQwODMwMTA0MDA3WhcNMzQwODI4MTA0MDA3
WjA9MQswCQYDVQQGEwJYWDERMA8GA1UECAwIUHJvdmluY2UxDDAKBgNVBAoMA09y
ZzENMAsGA1UEAwwEcm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AMvqsqkyL9ggFheoliT5CD43TlQe7G37nj0MeURhe/PaihMiNIttryudy69vauBr
sA534KaGZrWGVKdfldZLXhPPMuqtUIXEqxvhXLyLjyTyJiTRPVSSwOGSssVIUPT2
Rm6h40SROoa02pHH19UMtutJi6jxZifMa9kZc6B15XPEYdEyMDwzbsbr3xQ3Pfrv
GeSRQ5ykMXZC532NZXg7rLRUGr9+M/hE6ixOm8ClQYn3djmsDHuVPk1we07YBZqq
ga2GrzPTmQ101wT1NfbrwSFn4aNhBhZwnWW55VCZ4yOgYDBp8qY1oomKzD8vYgTk
XZXvxSn2K5hv4R+1UJuhfvMCAwEAAaNTMFEwHQYDVR0OBBYEFEXDOVb1XqQovr4F
YddXtxQSrHYqMB8GA1UdIwQYMBaAFEXDOVb1XqQovr4FYddXtxQSrHYqMA8GA1Ud
EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACjYXNpdhgVpO2YG36nT2Spv
R6EeSaZsfjJvnHTkpFqp2QBelRPHGmCM564NCG5/hVnPPG+zMWleI481zrEX0LK+
X+VhUgNkWkltkY08GO/IHJbIiWhK8SexKluDj0uCRHqvPseolZoyFRwwPOzJDKjw
78sMppYcZY65N/9ce9Zo7s2/HSqqhCUy7vC+Z5D7AvnSFLcSalQUOxD4rGNOkoX2
TATEJObeXfu46E7ZTR5/1EC23ian/quAGY6VPDTH/odHtsVQGFmWBbFv/lqjSi7O
hg9KPCuhnhQL56j9k8LJFYs3deuO00g3vjhaEOKSNQM2PTXUONHavm0y/0PGO0Q=
-----END CERTIFICATE-----
+55
View File
@@ -0,0 +1,55 @@
Bag Attributes
localKeyID: 08 28 0D A4 86 E1 C9 AA E8 E6 7F 5B 50 FC 44 50 17 39 8B 82
subject=C = XX, ST = Province, O = Org, CN = sign
issuer=C = XX, ST = Province, O = Org, CN = sub
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgIBAjANBgkqhkiG9w0BAQsFADA8MQswCQYDVQQGEwJYWDER
MA8GA1UECAwIUHJvdmluY2UxDDAKBgNVBAoMA09yZzEMMAoGA1UEAwwDc3ViMB4X
DTI0MDgzMDEwNDAwN1oXDTM0MDgyODEwNDAwN1owPTELMAkGA1UEBhMCWFgxETAP
BgNVBAgMCFByb3ZpbmNlMQwwCgYDVQQKDANPcmcxDTALBgNVBAMMBHNpZ24wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnGfIocBNhZkRVCL7YitvIr3NQ
xMqoBEQNDno0hRAYnfePixyy0N5v2V0dWILC2MruMsQpo+7cCHjuA1K9Apvtdv2l
edMdIah9GhhAvebEum6ovCruff1c9kxvyqoGNHlEeMe2TwHMFSVh6AwntfBDozvq
4B9IdUF/rykYqsqJkyOBI74t3jxUbeFCxgx2csGNmP2dsNn0OLR5zjlHogjkwwUK
g7Tf/xwM2GzkEog+UFqZvM83PuyM3GLiRgrN4bOx/XDQKbhQKWNTrYq3EFEbptKD
nE+ktHY/BFJqyW9l5wJaaTGUYZApILL40s7OpZrMq83pCruoIQ0WQHxXMqGNAgMB
AAGjTTBLMAkGA1UdEwQCMAAwHQYDVR0OBBYEFDDlJK6LQ493J1nw8zlOigpdb1zL
MB8GA1UdIwQYMBaAFI0iQVKo0Ao237SXBWOEa3iuFbaCMA0GCSqGSIb3DQEBCwUA
A4IBAQDRogL6A61e6tu1/mJE14LS43Zq+i08KOkSqh2u+7LN78yhMhZcojCPcBaw
ZCfIrEUgaKaOIBArsCKv9i5WXHONzrfB2rBoHlUWXmHKS/LhWRS6BHpuYhjKZ3bC
UE7gHfSnK2Ckmj7JO+KYXDk1uE+liL2S4bRrePKbpoSLvy1/mh0smJUOUOgYkA10
3PCi/WEv/oqBTeambVsqHVmnhEQfId3BC0uTS/NJNeIGxlxw51Rt71FSjNvN4WED
SJmCUERecyi5dCEUJDnqYNBPETEWLbV8YvMU+xSrYBeIHG4EgJILtDYtWshI4Iuw
EhFitmOb/LpQM2SSRAPCeAn1quQ2
-----END CERTIFICATE-----
Bag Attributes
localKeyID: 08 28 0D A4 86 E1 C9 AA E8 E6 7F 5B 50 FC 44 50 17 39 8B 82
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCnGfIocBNhZkRV
CL7YitvIr3NQxMqoBEQNDno0hRAYnfePixyy0N5v2V0dWILC2MruMsQpo+7cCHju
A1K9Apvtdv2ledMdIah9GhhAvebEum6ovCruff1c9kxvyqoGNHlEeMe2TwHMFSVh
6AwntfBDozvq4B9IdUF/rykYqsqJkyOBI74t3jxUbeFCxgx2csGNmP2dsNn0OLR5
zjlHogjkwwUKg7Tf/xwM2GzkEog+UFqZvM83PuyM3GLiRgrN4bOx/XDQKbhQKWNT
rYq3EFEbptKDnE+ktHY/BFJqyW9l5wJaaTGUYZApILL40s7OpZrMq83pCruoIQ0W
QHxXMqGNAgMBAAECggEAHvkIsSUg+n89sDNISJPobBjVO4XWeHEd+fuSfDSjyKRT
FDi5T422hS3ZfAyBZENRzff78ynvJrqtS5SzG9SleU0Cc88SagZomBOjpjBs208h
HsaOAJm6wiXnAhujCzZjueTXQ7v+Pck3nh+oTR4ElEzn2L/FHKWbR+L8L5XMp9Yg
XtIKqV6n/2MySWhNUvnU6CqfSiY3qatclDquLSB2VJHIA6TT+YAFDxzs3EXFdJKk
dMDn4NzToSTx0hdWN0J5NCNLhtu0+YTHW+OODMZqEZlWexGHIo8HLQpuaxrNGAsU
oV0x8pHca9fjdl398z3CfgwUUcUwLQiGDWNN1U/RgwKBgQDobYrwRY2dxNe6MSdN
qsK7HIArgGvqaLvEtTVGyTR5lDA0r7kcXI1/Ag82Upj1RVbIuytcwiaEPXMGXr7X
bBeWFfl1RiZ8Bd139VQJVcuSGRZ4yJnmmM6fRQP9+d8R4+kkCNMHhPsOXhs7wZQp
uZDkDdwbX8iQwjxN7NmKoSfcrwKBgQC4DFlkY+4W3NHaOB73ivnG8em4e3Xv+rJS
tblcizTkVpvidYRU4Q5SFq7JW2qjXyQY3O1hhL/M/kYi7XG4M2FC4zRdnZtXvso4
YYtQ1sIsT8LPrL3vh799ePtxBF4h+eaWlT0ea+us+FBjjwJzMc+wy8KMw39DWZ5r
hQv2N/OMgwKBgQCjk2yD2r9m+IDGpg8+Jt5zZwSBGRlZ2KnFL662CaanpfYjLkR9
xFlEuINSPOEvRMRl8uv6lR0cVk7cfdObspQK6Z4tvdgZ0trhsMOa6kmhoYxiJvPB
CWvpRV4g4Tjv01FiLd+u3BUAMJTEAmGu180z4tk0Xr29uyVLxlP3r6FpOwKBgQCk
i2XgOvdBuWpkjoghCD8HfoBWTwrB4oBLMezmsA45lrUHYclNmWgUO/NIUlKkfQro
r5wK84QG4c4Sq/ZfmI/8HOVUTPP1Hr3sakkDnP08YJLq2KV24QZyRxeFk0IVXjap
qgNaj2HE4rv8Rn8KPh5REdp9vsqojBb2SZzIJH25wQKBgErIfKNhnNB34r3L41bo
7eG7q56ah4qoqrp5o4CM5KnW+Zb0YUFRpaFYemq9Lc7tPLv6VVCkOGugn/c8JzYh
NBm6pBwVYzxNVXViY8oUHS4Oya4RdgkLtR/spIU3Pi3vNBvrfWvIrpH9ObnzGciW
D7rsiUY/WQf2zkdVpTzI593q
-----END PRIVATE KEY-----
+20
View File
@@ -0,0 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDRzCCAi+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQGEwJYWDER
MA8GA1UECAwIUHJvdmluY2UxDDAKBgNVBAoMA09yZzENMAsGA1UEAwwEcm9vdDAe
Fw0yNDA4MzAxMDQwMDdaFw0zNDA4MjgxMDQwMDdaMDwxCzAJBgNVBAYTAlhYMREw
DwYDVQQIDAhQcm92aW5jZTEMMAoGA1UECgwDT3JnMQwwCgYDVQQDDANzdWIwggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwo8FL8pAyTh7vBtKMToy/vFp6
+pETes9sfR9dppkGCQ21t+7gFsnUAMbvXcAmISy9YhdAcN3kCNBr/qctdyi9C27O
m3HMsX8/ePZcALrNRuEVJqcnNVzwOn9SZsETA6VmKGf1agAER8YUoPwAFSiwzPVM
lIrtbb67OX3Pmha99x/Yc8x5x4pG45bTiv3fOEntgsfMGPbS3XyFCoA9PjMXtZNr
OeSw4ISH/yshelSCIG7I19zOzsb2T9DSB9EOC7fggEIi1qL2zDrSAbhXK9Rxn87K
e8fF9FBT4m7/sXok3MC0fjh7MxjB9Y1BHmaxMqFPLGsPyaIS+4Qk1H0pNXD5AgMB
AAGjUzBRMB0GA1UdDgQWBBSNIkFSqNAKNt+0lwVjhGt4rhW2gjAfBgNVHSMEGDAW
gBRFwzlW9V6kKL6+BWHXV7cUEqx2KjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4IBAQAEwwGdh5IEKB9Qs1A0B+En+J2Uu2epkpX6TN/4JAMrTCghv+iq
U/WwAmJ8dg+CL0vT6nr+t6cIWcVvRwrT6ZfUzLYUhIGDqaJbwjJaeXE1zM5jCMvq
9kGLw7mqZUiSFFIfejo3TSo2nS45xMgmoiYdXWMe9FX1LII3Yqcx3PgdVuDcA+V5
8cKxbwRQbt91g6SKoW13mfitm7XUJueT8I+9YovmkKfjIhqa1wK8ikDdG8b/t8vU
Jom/uQh3k6uU0QSURspkqJjF6uBVlCohA+bvJpAqOeTN+Zr45OSX8+ai5h2P12ZW
B+/ycVvhqeDKP7eJItQz0rQeaNgPQYFjp9Xc
-----END CERTIFICATE-----