import binascii
from Crypto.Hash import SHA as SHA1
from Crypto.Hash import SHA256
def get_expected_pcr_value(hash_list):
"""
Description:
Given a list of hash strings, calculate the expected PCR values
For PCR0, extend by the Boot 0 hash and then the Boot Loader Hash
For PCR8, extend by the OS hash
Arg:
hash_list(list): PCR0 and PCR8 hashes
Return:
The calculated PCR value
"""
init = "0000000000000000000000000000000000000000000000000000000000000000"
pcr_init = init
pcr_bin = binascii.a2b_hex(pcr_init)
for hash_str in hash_list:
hash_bin = binascii.a2b_hex(hash_str)
hash_sha256_bin = SHA256.new(hash_bin).digest()
pcr_bin = SHA256.new(pcr_bin + hash_sha256_bin).digest()
return binascii.b2a_hex(pcr_bin).upper()
hash_list = ["927B8BBD968D0B233962AF2D453B8DE39ABB5FAFADF322431C2FA48DEB1D109BCE53E057AF701F57D6047D0B65EF05EDEB4391D2CA4B78E8147B8B0535D155C6",
"B9365069F0386B30F418FF0C32514F3BA00D25D8F6D98F06E36B3DA38E6423A4F19E2C61146835B9CF41E14B680211625AFF2F7956BDB7F7A174DE4F4D2D958B",
"C8B839EC99B7835F61634F83B0BAB90A2726E43FCBD50074616A0A03CDD2C374CED2E26AA0BEFB983D2009F47BD449648BD222123E3CFB019323B5529D1C259F",
"C75944C34D6DE50E73EB47C2EDF62309E7D7EFD3D45F1F4FBBB96CAD31419AAE6CBB42961EAD8630C054A8108B7035648E2A184DD3EB1B7E009C09B34C2CB487"]
result_pcr0 = get_expected_pcr_value(hash_list).decode("utf-8")
print(result_pcr0)
aW1wb3J0IGJpbmFzY2lpCmZyb20gQ3J5cHRvLkhhc2ggaW1wb3J0IFNIQSBhcyBTSEExCmZyb20gQ3J5cHRvLkhhc2ggaW1wb3J0IFNIQTI1NgoKZGVmIGdldF9leHBlY3RlZF9wY3JfdmFsdWUoaGFzaF9saXN0KToKICAgICIiIgogICAgRGVzY3JpcHRpb246CiAgICAgICAgR2l2ZW4gYSBsaXN0IG9mIGhhc2ggc3RyaW5ncywgY2FsY3VsYXRlIHRoZSBleHBlY3RlZCBQQ1IgdmFsdWVzCiAgICAgICAgRm9yIFBDUjAsIGV4dGVuZCBieSB0aGUgQm9vdCAwIGhhc2ggYW5kIHRoZW4gdGhlIEJvb3QgTG9hZGVyIEhhc2gKICAgICAgICBGb3IgUENSOCwgZXh0ZW5kIGJ5IHRoZSBPUyBoYXNoCiAgICBBcmc6CiAgICAgICAgaGFzaF9saXN0KGxpc3QpOiBQQ1IwIGFuZCBQQ1I4IGhhc2hlcwogICAgUmV0dXJuOgogICAgICAgIFRoZSBjYWxjdWxhdGVkIFBDUiB2YWx1ZQogICAgIiIiCiAgICBpbml0ID0gIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiCiAgICBwY3JfaW5pdCA9IGluaXQKICAgIHBjcl9iaW4gPSBiaW5hc2NpaS5hMmJfaGV4KHBjcl9pbml0KQogICAgZm9yIGhhc2hfc3RyIGluIGhhc2hfbGlzdDoKICAgICAgICBoYXNoX2JpbiA9IGJpbmFzY2lpLmEyYl9oZXgoaGFzaF9zdHIpCiAgICAgICAgaGFzaF9zaGEyNTZfYmluID0gU0hBMjU2Lm5ldyhoYXNoX2JpbikuZGlnZXN0KCkKICAgICAgICBwY3JfYmluID0gU0hBMjU2Lm5ldyhwY3JfYmluICsgaGFzaF9zaGEyNTZfYmluKS5kaWdlc3QoKQogICAgcmV0dXJuIGJpbmFzY2lpLmIyYV9oZXgocGNyX2JpbikudXBwZXIoKQoKaGFzaF9saXN0ID0gWyI5MjdCOEJCRDk2OEQwQjIzMzk2MkFGMkQ0NTNCOERFMzlBQkI1RkFGQURGMzIyNDMxQzJGQTQ4REVCMUQxMDlCQ0U1M0UwNTdBRjcwMUY1N0Q2MDQ3RDBCNjVFRjA1RURFQjQzOTFEMkNBNEI3OEU4MTQ3QjhCMDUzNUQxNTVDNiIsCiAgICAgICAgICAgICAiQjkzNjUwNjlGMDM4NkIzMEY0MThGRjBDMzI1MTRGM0JBMDBEMjVEOEY2RDk4RjA2RTM2QjNEQTM4RTY0MjNBNEYxOUUyQzYxMTQ2ODM1QjlDRjQxRTE0QjY4MDIxMTYyNUFGRjJGNzk1NkJEQjdGN0ExNzRERTRGNEQyRDk1OEIiLAogICAgICAgICAgICAgIkM4QjgzOUVDOTlCNzgzNUY2MTYzNEY4M0IwQkFCOTBBMjcyNkU0M0ZDQkQ1MDA3NDYxNkEwQTAzQ0REMkMzNzRDRUQyRTI2QUEwQkVGQjk4M0QyMDA5RjQ3QkQ0NDk2NDhCRDIyMjEyM0UzQ0ZCMDE5MzIzQjU1MjlEMUMyNTlGIiwKICAgICAgICAgICAgICJDNzU5NDRDMzRENkRFNTBFNzNFQjQ3QzJFREY2MjMwOUU3RDdFRkQzRDQ1RjFGNEZCQkI5NkNBRDMxNDE5QUFFNkNCQjQyOTYxRUFEODYzMEMwNTRBODEwOEI3MDM1NjQ4RTJBMTg0REQzRUIxQjdFMDA5QzA5QjM0QzJDQjQ4NyJdCnJlc3VsdF9wY3IwID0gZ2V0X2V4cGVjdGVkX3Bjcl92YWx1ZShoYXNoX2xpc3QpLmRlY29kZSgidXRmLTgiKQpwcmludChyZXN1bHRfcGNyMCk=