diff --git a/sgx/ias/sgx_test.go b/sgx/ias/sgx_test.go index a31be63..43d4721 100644 --- a/sgx/ias/sgx_test.go +++ b/sgx/ias/sgx_test.go @@ -1,40 +1,63 @@ package ias -// import ( -// "encoding/json" -// "io/ioutil" -// "testing" -// "time" - -// "github.com/ethereum/go-ethereum/common" -// "github.com/oasisprotocol/oasis-core/go/common/sgx/ias" -// "github.com/stretchr/testify/require" -// ) - -// type EndorsedAttestationVerificationReport struct { -// AVR string `json:"avr"` -// Signature []byte `json:"signature"` -// SigningCert []byte `json:"signing_cert"` -// } - -// func TestReportVerification(t *testing.T) { -// ias.SetAllowDebugEnclaves() -// defer ias.UnsetAllowDebugEnclaves() - -// const path = "../../testdata/avr-280814000042567078634030940835907407639" -// bz, err := ioutil.ReadFile(path) -// require.NoError(t, err) - -// var eavr EndorsedAttestationVerificationReport -// require.NoError(t, json.Unmarshal(bz, &eavr)) - -// require.NoError(t, VerifyReport(eavr.AVR, eavr.Signature, eavr.SigningCert, time.Now())) -// avr, err := ParseAndValidateAVR(eavr.AVR) -// require.NoError(t, err) - -// quote, err := avr.Quote() -// require.NoError(t, err) -// addr, err := GetEnclaveKeyAddress(quote) -// require.NoError(t, err) -// require.Equal(t, common.HexToAddress("0x0f1bf704ad5bbadb4ae8a2a8d4ecb1999a1e05ed"), addr) -// } +import ( + "encoding/json" + "os" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/oasisprotocol/oasis-core/go/common/sgx/ias" + "github.com/stretchr/testify/require" +) + +type endorsedAttestationVerificationReport struct { + AVR string `json:"avr"` + Signature []byte `json:"signature"` + SigningCert []byte `json:"signing_cert"` +} + +func TestReportVerification(t *testing.T) { + type testCase struct { + path string + ek common.Address + op common.Address + } + + ias.SetAllowDebugEnclaves() + defer ias.UnsetAllowDebugEnclaves() + + var testCases = []testCase{ + { + "../../testdata/001-avr", + common.HexToAddress("0x836Fec0cC99Ed0242ed02fBAAb648652B2372E41"), + common.Address{}, + }, + { + "../../testdata/002-avr", + common.HexToAddress("0xC9f79d5de52dbe84120055FF286642C5c328466e"), + common.HexToAddress("0xcb96F8d6C2d543102184d679D7829b39434E4EEc"), + }, + } + + for _, tc := range testCases { + t.Run(tc.path, func(t *testing.T) { + bz, err := os.ReadFile(tc.path) + require.NoError(t, err) + + var eavr endorsedAttestationVerificationReport + require.NoError(t, json.Unmarshal(bz, &eavr)) + + require.NoError(t, VerifyReport([]byte(eavr.AVR), eavr.Signature, eavr.SigningCert, time.Now())) + avr, err := ParseAndValidateAVR([]byte(eavr.AVR)) + require.NoError(t, err) + + quote, err := avr.Quote() + require.NoError(t, err) + ek, operator, err := GetEKAndOperator(quote) + require.NoError(t, err) + require.Equal(t, tc.ek, ek) + require.Equal(t, tc.op, operator) + }) + } +} diff --git a/testdata/001-avr b/testdata/001-avr new file mode 100644 index 0000000..78b99c1 --- /dev/null +++ b/testdata/001-avr @@ -0,0 +1 @@ +{"avr":"{\"id\":\"82305734235721330313258195182452685352\",\"timestamp\":\"2024-06-15T14:54:05.076187\",\"version\":4,\"advisoryURL\":\"https://security-center.intel.com\",\"advisoryIDs\":[\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00615\",\"INTEL-SA-00617\",\"INTEL-SA-00828\"],\"isvEnclaveQuoteStatus\":\"GROUP_OUT_OF_DATE\",\"platformInfoBlob\":\"1502006504000F00001010020202800E0000000000000000000D00000C000000020000000000000BF15E27AE7DBEA372B58C8E7EA55F29162D44A3BD9FED427495B88F7285714A5D40C28003908ACCED63BB0A84F0F51666B4E1567933ADCD1225CB3E4A7442556CCB\",\"isvEnclaveQuoteBody\":\"AgAAAPELAAALAAoAAAAAALCbZcb+Fr6JI5sV5pIlYVvGLswAqzmOjdUyk842m+GFDg7//wKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAHAAAAAAAAANUJe3YpwAPB/0ZYGkZAHUP0Qdq5GTQBcols6dUKNfCtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACD1xnnferKFHD2uvYqTXdDA8iZ22kCD5xw7h38CMfOngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg2/sDMme0CQu0C+6q2SGUrI3LkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}","signature":"fxIBrO0zxDOL6X+He5p/0dmw9uU/22uSzoV/YeCzQyCqd7E9EAsRtZSGBY9m+LOC1I5SyhZU/myrGc1c6O+nm8KS/61NDhLIr0DxEqiXLKlYPYZLmgKz2q8ff+sPCf60LutciKr8JsAQpU4uay/Rbw78O+ZuFumPsOBDbJnoDDfTKuD1jbAdE/gdU4S0oOH5EZChk7/nyJ/heF7VC01pGrETyXnEvo+qjpcGpeAYLK7hHT+HTJOANnfysD+8L6SLJihHi6RWNWW9eg/i/uXkLHxlomHqgklZ0da38q55tJ54H4ngxynGBVMPMCdnOXrDicvr3gnljIgYe52/irFstw==","signing_cert":"MIIEoTCCAwmgAwIBAgIJANEHdl0yo7CWMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQDDCdJbnRlbCBTR1ggQXR0ZXN0YXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwHhcNMTYxMTIyMDkzNjU4WhcNMjYxMTIwMDkzNjU4WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NhbnRhIENsYXJhMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlvbjEtMCsGA1UEAwwkSW50ZWwgU0dYIEF0dGVzdGF0aW9uIFJlcG9ydCBTaWduaW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqXot4OZuphR8nudFrAFiaGxxkgma/Es/BA+tbeCTUR106AL1ENcWA4FX3K+E9BBL0/7X5rj5nIgX/R/1ubhkKWw9gfqPG3KeAtIdcv/uTO1yXv50vqaPvE1CRChvzdS/ZEBqQ5oVvLTPZ3VEicQjlytKgN9cLnxbwtuvLUK7eyRPfJW/ksddOzP8VBBniolYnRCD2jrMRZ8nBM2ZWYwnXnwYeOAHV+W9tOhAImwRwKF/95yAsVwd21ryHMJBcGH70qLagZ7Ttyt++qO/6+KAXJuKwZqjRlEtSEz8gZQeFfVYgcwSfo96oSMAzVr7V0L6HSDLRnpb6xxmbPdqNol4tQIDAQABo4GkMIGhMB8GA1UdIwQYMBaAFHhDe3amfrzQr35CN+s1fDuHAVE8MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMGAGA1UdHwRZMFcwVaBToFGGT2h0dHA6Ly90cnVzdGVkc2VydmljZXMuaW50ZWwuY29tL2NvbnRlbnQvQ1JML1NHWC9BdHRlc3RhdGlvblJlcG9ydFNpZ25pbmdDQS5jcmwwDQYJKoZIhvcNAQELBQADggGBAGcIthtcK9IVRz4rRq+ZKE+7k50/OxUsmW8aavOzKb0iCx07YQ9rzi5nU73tME2yGRLzhSViFs/LpFa9lpQL6JL1aQwmDR74TxYGBAIi5f4I5TJoCCEqRHz91kpG6Uvyn2tLmnIdJbPE4vYvWLrtXXfFBSSPD4Afn7+3/XUggAlc7oCTizOfbbtOFlYA4g5KcYgS1J2ZAeMQqbUdZseZCcaZZZn65tdqee8UXZlDvx0+NdO0LR+5pFy+juM0wWbu59MvzcmTXbjsi7HY6zd53Yq5K244fwFHRQ8eOB0IWB+4PfM7FeAApZvlfqlKOlLcZL2uyVmzRkyR5yW72uo9mehX44CiPJ2fse9Y6eQtcfEhMPkmHXI01sN+KwPbpA39+xOsStjhP9N1Y1a2tQAVo+yVgLgV2Hws73Fc0o3wC78qPEA+v2aRs/Be3ZFDgDyghc/1fgU+7C+P6kbqd4poyb6IW8KCJbxfMJvkordNOgOUUxndPHEi/tb/U7uLjLOgPA==","mrenclave":"1Ql7dinAA8H/RlgaRkAdQ/RB2rkZNAFyiWzp1Qo18K0=","enclave_key":"g2/sDMme0CQu0C+6q2SGUrI3LkE="} \ No newline at end of file diff --git a/testdata/002-avr b/testdata/002-avr new file mode 100644 index 0000000..64c5d96 --- /dev/null +++ b/testdata/002-avr @@ -0,0 +1 @@ +{"avr":"{\"id\":\"299780094755765409756324070816338710222\",\"timestamp\":\"2024-06-15T15:26:41.435346\",\"version\":4,\"advisoryURL\":\"https://security-center.intel.com\",\"advisoryIDs\":[\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00615\",\"INTEL-SA-00617\",\"INTEL-SA-00828\"],\"isvEnclaveQuoteStatus\":\"GROUP_OUT_OF_DATE\",\"platformInfoBlob\":\"1502006504000F00001010020202800E0000000000000000000D00000C000000020000000000000BF1455E68672300A84CB3AF9346070E51DA1025D4D926CFDC27580CB1AA228C53C0763BA1C3B953EDA0EA67B8A853433F01AE35ECAD9B23B0A7CD8B2C03B3EB6DF0\",\"isvEnclaveQuoteBody\":\"AgAAAPELAAALAAoAAAAAALCbZcb+Fr6JI5sV5pIlYVscBTe7uprtxTHUAUhDjlE9Dg7//wKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAHAAAAAAAAANUJe3YpwAPB/0ZYGkZAHUP0Qdq5GTQBcols6dUKNfCtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACD1xnnferKFHD2uvYqTXdDA8iZ22kCD5xw7h38CMfOngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByfedXeUtvoQSAFX/KGZCxcMoRm7LlvjWwtVDECGE1nnXgps5Q05O7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}","signature":"VRdkrz3PRf86d62xs5RNmNV73lLM6k9xh477ahZ4uFsaI4pKh4b7x2GiCo2reHvrJ4tgIqGUKAq0TOXae0sUDiZ5fIhI+WiJbrnc0iqFctRnjKX3sf6i3ZYw37jiHFFO1Fxwv/agSlL/uCVOSbQfmkpcVDMi1tvRTOSdXwcdOv1OxDE/2s16pInCIFWS8uCZOSXS3W7/Vg6nw6ufJGwOHbOp0VyjoDCgGwgzLj+BwgM+S2EuFhqrhfgnoB3bWXQX0hQ6d2ruJhVBiCb7UHxrt2QHV9bPSwKstVHpd8IITdGi7LqUDyIHP/y/lwe456fER+7ZbD4QSKrhMrznUGgNiw==","signing_cert":"MIIEoTCCAwmgAwIBAgIJANEHdl0yo7CWMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQDDCdJbnRlbCBTR1ggQXR0ZXN0YXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwHhcNMTYxMTIyMDkzNjU4WhcNMjYxMTIwMDkzNjU4WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NhbnRhIENsYXJhMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlvbjEtMCsGA1UEAwwkSW50ZWwgU0dYIEF0dGVzdGF0aW9uIFJlcG9ydCBTaWduaW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqXot4OZuphR8nudFrAFiaGxxkgma/Es/BA+tbeCTUR106AL1ENcWA4FX3K+E9BBL0/7X5rj5nIgX/R/1ubhkKWw9gfqPG3KeAtIdcv/uTO1yXv50vqaPvE1CRChvzdS/ZEBqQ5oVvLTPZ3VEicQjlytKgN9cLnxbwtuvLUK7eyRPfJW/ksddOzP8VBBniolYnRCD2jrMRZ8nBM2ZWYwnXnwYeOAHV+W9tOhAImwRwKF/95yAsVwd21ryHMJBcGH70qLagZ7Ttyt++qO/6+KAXJuKwZqjRlEtSEz8gZQeFfVYgcwSfo96oSMAzVr7V0L6HSDLRnpb6xxmbPdqNol4tQIDAQABo4GkMIGhMB8GA1UdIwQYMBaAFHhDe3amfrzQr35CN+s1fDuHAVE8MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMGAGA1UdHwRZMFcwVaBToFGGT2h0dHA6Ly90cnVzdGVkc2VydmljZXMuaW50ZWwuY29tL2NvbnRlbnQvQ1JML1NHWC9BdHRlc3RhdGlvblJlcG9ydFNpZ25pbmdDQS5jcmwwDQYJKoZIhvcNAQELBQADggGBAGcIthtcK9IVRz4rRq+ZKE+7k50/OxUsmW8aavOzKb0iCx07YQ9rzi5nU73tME2yGRLzhSViFs/LpFa9lpQL6JL1aQwmDR74TxYGBAIi5f4I5TJoCCEqRHz91kpG6Uvyn2tLmnIdJbPE4vYvWLrtXXfFBSSPD4Afn7+3/XUggAlc7oCTizOfbbtOFlYA4g5KcYgS1J2ZAeMQqbUdZseZCcaZZZn65tdqee8UXZlDvx0+NdO0LR+5pFy+juM0wWbu59MvzcmTXbjsi7HY6zd53Yq5K244fwFHRQ8eOB0IWB+4PfM7FeAApZvlfqlKOlLcZL2uyVmzRkyR5yW72uo9mehX44CiPJ2fse9Y6eQtcfEhMPkmHXI01sN+KwPbpA39+xOsStjhP9N1Y1a2tQAVo+yVgLgV2Hws73Fc0o3wC78qPEA+v2aRs/Be3ZFDgDyghc/1fgU+7C+P6kbqd4poyb6IW8KCJbxfMJvkordNOgOUUxndPHEi/tb/U7uLjLOgPA==","mrenclave":"1Ql7dinAA8H/RlgaRkAdQ/RB2rkZNAFyiWzp1Qo18K0=","enclave_key":"yfedXeUtvoQSAFX/KGZCxcMoRm4="} \ No newline at end of file diff --git a/testdata/avr-280814000042567078634030940835907407639 b/testdata/avr-280814000042567078634030940835907407639 deleted file mode 100644 index 6dbce53..0000000 --- a/testdata/avr-280814000042567078634030940835907407639 +++ /dev/null @@ -1 +0,0 @@ -{"avr":"{\"id\":\"280814000042567078634030940835907407639\",\"timestamp\":\"2022-09-04T13:57:54.519465\",\"version\":4,\"advisoryURL\":\"https://security-center.intel.com\",\"advisoryIDs\":[\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00477\"],\"isvEnclaveQuoteStatus\":\"GROUP_OUT_OF_DATE\",\"platformInfoBlob\":\"1502006504000E00000C0C02020280060000000000000000000C00000C000000020000000000000BF123AF8E06B0A12593DB860A7DED8EB54E09D572873B8862A7946B55004E40253F7241C106A8FDCF5F7B8348A7DAD14A4F59F20E562A8462006ED9364DE5A9285A\",\"isvEnclaveQuoteBody\":\"AgAAAPELAAALAAoAAAAAALCbZcb+Fr6JI5sV5pIlYVuRo6Qwc+0kiYErg1tGqjPSDQ3//wKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAHAAAAAAAAAAUDS7XQvWoMcf/eU+Hv8uHAxVJbz8rxbDg7txoi/W8hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACD1xnnferKFHD2uvYqTXdDA8iZ22kCD5xw7h38CMfOngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPG/cErVu620rooqjU7LGZmh4F7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"}","signature":"cFpsPJ+9EWdPZKKLmM6L34KejGZeEB8o1WZnC4vv/VfuMPUzIS7GcUx3R5DI9BeR5SL0oqbALk8h4/IisbPATfW49E/nEuVjYeezDt09TfoSUQsKoosXr1GiTPtzRLP8HRPw8Wxrft0n+rVmnYL24uvlcGzB5DbD9vENEiWatklZk+3gs8lCztpFj8r/GnfJb7/ihEtGd4tW0P3vOVWHiPBsYJ44/tR1xLa8BLCTZw4pkyu8+h0DeD9d4QpYZTdBI2kp1IPLdeEmHGoFoKvAF0hETU/gDlImW9M0YQ2jG6a+/f1wqmY5VmG3L85PxMEQuUNXurhvdAYsPewbGAULyw==","signing_cert":"MIIEoTCCAwmgAwIBAgIJANEHdl0yo7CWMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEUMBIGA1UEBwwLU2FudGEgQ2xhcmExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMTAwLgYDVQQDDCdJbnRlbCBTR1ggQXR0ZXN0YXRpb24gUmVwb3J0IFNpZ25pbmcgQ0EwHhcNMTYxMTIyMDkzNjU4WhcNMjYxMTIwMDkzNjU4WjB7MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFDASBgNVBAcMC1NhbnRhIENsYXJhMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlvbjEtMCsGA1UEAwwkSW50ZWwgU0dYIEF0dGVzdGF0aW9uIFJlcG9ydCBTaWduaW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqXot4OZuphR8nudFrAFiaGxxkgma/Es/BA+tbeCTUR106AL1ENcWA4FX3K+E9BBL0/7X5rj5nIgX/R/1ubhkKWw9gfqPG3KeAtIdcv/uTO1yXv50vqaPvE1CRChvzdS/ZEBqQ5oVvLTPZ3VEicQjlytKgN9cLnxbwtuvLUK7eyRPfJW/ksddOzP8VBBniolYnRCD2jrMRZ8nBM2ZWYwnXnwYeOAHV+W9tOhAImwRwKF/95yAsVwd21ryHMJBcGH70qLagZ7Ttyt++qO/6+KAXJuKwZqjRlEtSEz8gZQeFfVYgcwSfo96oSMAzVr7V0L6HSDLRnpb6xxmbPdqNol4tQIDAQABo4GkMIGhMB8GA1UdIwQYMBaAFHhDe3amfrzQr35CN+s1fDuHAVE8MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMGAGA1UdHwRZMFcwVaBToFGGT2h0dHA6Ly90cnVzdGVkc2VydmljZXMuaW50ZWwuY29tL2NvbnRlbnQvQ1JML1NHWC9BdHRlc3RhdGlvblJlcG9ydFNpZ25pbmdDQS5jcmwwDQYJKoZIhvcNAQELBQADggGBAGcIthtcK9IVRz4rRq+ZKE+7k50/OxUsmW8aavOzKb0iCx07YQ9rzi5nU73tME2yGRLzhSViFs/LpFa9lpQL6JL1aQwmDR74TxYGBAIi5f4I5TJoCCEqRHz91kpG6Uvyn2tLmnIdJbPE4vYvWLrtXXfFBSSPD4Afn7+3/XUggAlc7oCTizOfbbtOFlYA4g5KcYgS1J2ZAeMQqbUdZseZCcaZZZn65tdqee8UXZlDvx0+NdO0LR+5pFy+juM0wWbu59MvzcmTXbjsi7HY6zd53Yq5K244fwFHRQ8eOB0IWB+4PfM7FeAApZvlfqlKOlLcZL2uyVmzRkyR5yW72uo9mehX44CiPJ2fse9Y6eQtcfEhMPkmHXI01sN+KwPbpA39+xOsStjhP9N1Y1a2tQAVo+yVgLgV2Hws73Fc0o3wC78qPEA+v2aRs/Be3ZFDgDyghc/1fgU+7C+P6kbqd4poyb6IW8KCJbxfMJvkordNOgOUUxndPHEi/tb/U7uLjLOgPA=="} \ No newline at end of file