test_vcore_signature_data.cpp
test_vcore_signature_finder.cpp
test_vcore_signature_reader.cpp
+ test_vcore_ocsp.cpp
test_vcore_signature_validator.cpp
test_vcore_certificate.cpp
test_vcore_saxreader.cpp
#include "cert-svc/cpkcs12.h"
#include <cstring>
#include <sstream>
+#include <string>
+#include <list>
+#include "vcore/Certificate.h"
+
+using namespace ValidationCore;
static inline int convertHexToInt(std::string hexPair)
{
return certsvcStr;
}
+
+CertificateList createCertificateList(std::list<std::string> strList)
+{
+ CertificateList certList;
+ for (std::string certStr : strList) {
+ certList.push_back(CertificatePtr(new Certificate(certStr, Certificate::FORM_BASE64)));
+ }
+ return certList;
+}
*/
#include <string>
+#include <list>
+#include "vcore/Certificate.h"
#include "cert-svc/cinstance.h"
#include "cert-svc/cpkcs12.h"
+using namespace ValidationCore;
+
int convertStringToBytes(const std::string hexString, unsigned char **content);
std::string createLargeString(size_t size);
-CertSvcString wrapperCertsvcStringNew(CertSvcInstance instance, std::string originStr, int *retVal);
\ No newline at end of file
+CertSvcString wrapperCertsvcStringNew(CertSvcInstance instance, std::string originStr, int *retVal);
+CertificateList createCertificateList(std::list<std::string> strList);
\ No newline at end of file
"t3gTWPxTtFzprQyNiJHTmrbNWXLX1roRVGUE/I8Q4xexqpbNlJIW2Jjm/kqoKfnK"
"xORG6HNPXZV29NY2fDRPPOIYoFQzrXI=";
}
+
+namespace CertificateChain {
+ const std::string CertEE =
+ "MIIJGTCCBwGgAwIBAgITEgAxQ0VlMES59RTscQAAADFDRTANBgkqhkiG9w0BAQsF"
+ "ADBPMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
+ "MSAwHgYDVQQDExdNaWNyb3NvZnQgUlNBIFRMUyBDQSAwMTAeFw0yMjExMTUyMDE2"
+ "MzhaFw0yMzExMTUyMDE2MzhaMGExCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJXQTEQ"
+ "MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
+ "MRMwEQYDVQQDEwpyLmJpbmcuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB"
+ "CgKCAQEAvzvBoCT8A/rooZzeDm7yJ9PdB5c4ZE54P4q+R5ZaY3l9+UH7wkD/AMgx"
+ "5RUwpCg3JlZaSrl5kjp6xvjmhvy08v/mp0Jw80zG33lQ8DOk16VYBwpoSBy2Pn6E"
+ "6bhDYHGFybPzpKlKxiJHSYuiAF+05FfUk/jBmXFMkmsDlm5Fwq1y6/da4K0bJImC"
+ "msWDPDZrf3A8fu9lQeNRv3tbvrknOCGKaQ15iHxRpHhvMDxfX4/ba/ztw23wMExv"
+ "YKdAkUHQUMygbZE/vSBQhPtqqHFc+IY9sKpJ35oa4lfklnzgxlACogTmytJsrhry"
+ "lDeTp9bBAQwV2T7enHwoy1jdFaaJQwIDAQABo4IE2jCCBNYwggF+BgorBgEEAdZ5"
+ "AgQCBIIBbgSCAWoBaAB1AOg+0No+9QY1MudXKLyJa8kD08vREWvs62nhd31tBr1u"
+ "AAABhHz5BCoAAAQDAEYwRAIgTDH4xbzeE641O31H3wgjEfWbEhEKOfppCp+tYA3i"
+ "1CgCIF2TX3NmpCL3XEYDtbBv1ryuIA3cPGhgzynDWAdMiY5wAHYAVYHUwhaQNgFK"
+ "6gubVzxT8MDkOHhwJQgXL6OqHQcT0wwAAAGEfPkEXwAABAMARzBFAiEA3ao53zxV"
+ "/geztebynoFndOYoZiKOf0rSsa/PAEAsczcCIEOtGgNpraLTEJhe1OYbnuAo9Rak"
+ "eAbFPfjJdALwgGWVAHcAejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61IA"
+ "AAGEfPkC5AAABAMASDBGAiEAzov/r1LY9ELiZbJ2690S3ujq3gzpJ3Sxi6VN58gF"
+ "jH4CIQCG8bsL4aIfW3vB+o6mNl2xB9/cPEMbmFgUPBU8Lyr9uzAnBgkrBgEEAYI3"
+ "FQoEGjAYMAoGCCsGAQUFBwMCMAoGCCsGAQUFBwMBMD0GCSsGAQQBgjcVBwQwMC4G"
+ "JisGAQQBgjcVCIfahnWD7tkBgsmFG4G1nmGF9OtggV25+BCGkdB4AgFkAgElMIGH"
+ "BggrBgEFBQcBAQR7MHkwUwYIKwYBBQUHMAKGR2h0dHA6Ly93d3cubWljcm9zb2Z0"
+ "LmNvbS9wa2kvbXNjb3JwL01pY3Jvc29mdCUyMFJTQSUyMFRMUyUyMENBJTIwMDEu"
+ "Y3J0MCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC5tc29jc3AuY29tMB0GA1UdDgQW"
+ "BBSukOod1pztVw1Lx47hPotC/higDTAOBgNVHQ8BAf8EBAMCBLAwgeQGA1UdEQSB"
+ "3DCB2YIKci5iaW5nLmNvbYIUdGhha2EubXNmdHN0YXRpYy5jb22CDnRoYWthLmJp"
+ "bmcuY29tghF0aC5tc2Z0c3RhdGljLmNvbYILdGguYmluZy5jb22CE3Jha2EubXNm"
+ "dHN0YXRpYy5jb22CDXJha2EuYmluZy5jb22CEHIubXNmdHN0YXRpYy5jb22CDWFr"
+ "YW0uYmluZy5jb22CDSoubW0uYmluZy5uZXSCEyouZXhwbGljaXQuYmluZy5uZXSC"
+ "ECouYmluZ3N0YXRpYy5jb22CCiouYmluZy5jb20wgbAGA1UdHwSBqDCBpTCBoqCB"
+ "n6CBnIZNaHR0cDovL21zY3JsLm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9jcmwv"
+ "TWljcm9zb2Z0JTIwUlNBJTIwVExTJTIwQ0ElMjAwMS5jcmyGS2h0dHA6Ly9jcmwu"
+ "bWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9NaWNyb3NvZnQlMjBSU0ElMjBU"
+ "TFMlMjBDQSUyMDAxLmNybDBXBgNVHSAEUDBOMEIGCSsGAQQBgjcqATA1MDMGCCsG"
+ "AQUFBwIBFidodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9jcHMw"
+ "CAYGZ4EMAQICMB8GA1UdIwQYMBaAFLV2DDARzseSQk1Mx1wsyKkM6AtkMB0GA1Ud"
+ "JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAgEAUce0"
+ "vFbvYp03JZdLVC7vjMuKOloMCcGQy0CUO3P+T4322/JvQGjgKStq/9FA+GMvqmu0"
+ "yuC4R69o8wlDOhabeJYt2T87BpE31GBHoAYkFE7kdSYfF6FP3fq2FzYcIi8OoKWI"
+ "HHZ1RsIrMKaC3sWxhrmdIpDImdgXFBXlA1CPFafeioF50bQXmjndR0xMNwnpnRNS"
+ "6XNHC9rYARXe7Jj0qk8JYTvLgPGkkaMHmnS7Hn914d1dFIZ2hyVvA+rUtVRQ1oQx"
+ "Q+R+wsRl59Q15MCSIMWnp5Fcg1gcAduGuRCvWKpusJmX3tWjdUSKEQ1UP1qV0eMm"
+ "lh64jNwJ+ejX6psgyWO2a+dFpuD2l8MgFb2gN2RgS4YsPZyDitCBkezHrmsn8txQ"
+ "yaRStDiu6UgS1Z3cqxsNHfct4BdLd7ngzBMY5CacUcCHjwPyoIHYu4G6f84LztQT"
+ "s+uwMhnP9iP/6RiF3xgJMyrIKxUjC0aDjgYyOOVS6VpVLsdVdq0KImHElO5aknT0"
+ "UzvSa5LocKrmAUv+23Dvy/UU94vERy3WelqFzb+ktRgvje0LSsHaIQC8YhokEFx2"
+ "cXdJs7PwmADM4dFCD467C2lsXTzrS4WcvSLfq6xOZ2enl8L6qfQpJ58J49uhUqx3"
+ "lJtG1Q+rccyveDAacyyCp/pDdMQdYLranGFFioA=";
+
+ const std::string CertIM =
+ "MIIFWjCCBEKgAwIBAgIQDxSWXyAgaZlP1ceseIlB4jANBgkqhkiG9w0BAQsFADBa"
+ "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl"
+ "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw"
+ "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV"
+ "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT"
+ "QSBUTFMgQ0EgMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqYnfP"
+ "mmOyBoTzkDb0mfMUUavqlQo7Rgb9EUEf/lsGWMk4bgj8T0RIzTqk970eouKVuL5R"
+ "IMW/snBjXXgMQ8ApzWRJCZbar879BV8rKpHoAW4uGJssnNABf2n17j9TiFy6BWy+"
+ "IhVnFILyLNK+W2M3zK9gheiWa2uACKhuvgCca5Vw/OQYErEdG7LBEzFnMzTmJcli"
+ "W1iCdXby/vI/OxbfqkKD4zJtm45DJvC9Dh+hpzqvLMiK5uo/+aXSJY+SqhoIEpz+"
+ "rErHw+uAlKuHFtEjSeeku8eR3+Z5ND9BSqc6JtLqb0bjOHPm5dSRrgt4nnil75bj"
+ "c9j3lWXpBb9PXP9Sp/nPCK+nTQmZwHGjUnqlO9ebAVQD47ZisFonnDAmjrZNVqEX"
+ "F3p7laEHrFMxttYuD81BdOzxAbL9Rb/8MeFGQjE2Qx65qgVfhH+RsYuuD9dUw/3w"
+ "ZAhq05yO6nk07AM9c+AbNtRoEcdZcLCHfMDcbkXKNs5DJncCqXAN6LhXVERCw/us"
+ "G2MmCMLSIx9/kwt8bwhUmitOXc6fpT7SmFvRAtvxg84wUkg4Y/Gx++0j0z6StSeN"
+ "0EJz150jaHG6WV4HUqaWTb98Tm90IgXAU4AW2GBOlzFPiU5IY9jt+eXC2Q6yC/Zp"
+ "TL1LAcnL3Qa/OgLrHN0wiw1KFGD51WRPQ0Sh7QIDAQABo4IBJTCCASEwHQYDVR0O"
+ "BBYEFLV2DDARzseSQk1Mx1wsyKkM6AtkMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI"
+ "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI"
+ "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI"
+ "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g"
+ "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq"
+ "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG"
+ "SIb3DQEBCwUAA4IBAQCfK76SZ1vae4qt6P+dTQUO7bYNFUHR5hXcA2D59CJWnEj5"
+ "na7aKzyowKvQupW4yMH9fGNxtsh6iJswRqOOfZYC4/giBO/gNsBvwr8uDW7t1nYo"
+ "DYGHPpvnpxCM2mYfQFHq576/TmeYu1RZY29C4w8xYBlkAA8mDJfRhMCmehk7cN5F"
+ "JtyWRj2cZj/hOoI45TYDBChXpOlLZKIYiG1giY16vhCRi6zmPzEwv+tk156N6cGS"
+ "Vm44jTQ/rs1sa0JSYjzUaYngoFdZC4OfxnIkQvUIA4TOFmPzNPEFdjcZsgbeEz4T"
+ "cGHTBPK4R28F44qIMCtHRV55VMX53ev6P3hRddJb";
+
+ const std::string CertRoot =
+ "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ"
+ "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD"
+ "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX"
+ "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y"
+ "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy"
+ "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr"
+ "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr"
+ "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK"
+ "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu"
+ "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy"
+ "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye"
+ "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1"
+ "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3"
+ "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92"
+ "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx"
+ "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0"
+ "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz"
+ "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS"
+ "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp";
+
+ const std::string CertRootNotSupportOcsp =
+ "MIIDjjCCAnagAwIBAgIGAY+ZLZDuMA0GCSqGSIb3DQEBDQUAMHQxCzAJBgNVBAYT"
+ "AktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBBc3NvY2lh"
+ "dGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSAwHgYDVQQDDBdUaXplbiBBdXRob3Ig"
+ "Um9vdCBDbGFzczAeFw0yNDA1MjEwMzI0MTFaFw0yNTA1MjEwMzI0MTFaMHQxCzAJ"
+ "BgNVBAYTAktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBB"
+ "c3NvY2lhdGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSAwHgYDVQQDDBdUaXplbiBB"
+ "dXRob3IgUm9vdCBDbGFzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB"
+ "AKt8I6FYHbDjq4v7hkzDW5rUxiksmudpuBA8L7aclwY7BmiWD6N9vCF37IY3zPxn"
+ "d7JODIFFGWCbVQindVEBx4McvyrZnngmqNJxeMDzNyjiHmY+8Xg4hlyRHAfyVQWc"
+ "P9SGtYmKyR1n5uaA9FTdAkjUQ0voJ6AbzkRAaH3AgBiUmRdXv7BRU/z5G1Un3ART"
+ "BCUr7R9OxgrBcjUeWD5CfutTKxYYwM6/Fi65j6D1sLf4JdC9EcbLnFQducT3HNsH"
+ "Smtod48V32arxxcVGUJITPfWMb6VT8V3kEX5gLMZ9DPXEv+PZKLemlyAkBoTOP+7"
+ "G5wQJe134Lb9iR/u9p74aGcCAwEAAaMmMCQwEgYDVR0TAQH/BAgwBgEB/wIBADAO"
+ "BgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQENBQADggEBAB+5FNYvEQIfTu6e6R14"
+ "QIZMTF3HyIvd48jFJIfitUSQLEJmCW4jCpDAnAE7i2i4Yi5/aMLEN/R43I/Ck7cM"
+ "0qyE1gHasEDrs3OvV9A8IGOrT85YAUabBG4unkUP8+u5aH8mmXu519Ln9lpwJRbV"
+ "8vhFGDF6sqzFlNq02SHz+pKiXW7oFp7HNLigwJbxFgS9qBxEMiSPoM6afKj9PI56"
+ "fgf+6l1gQVpczxw489PGNTiws3NJSrNogzThR+9UKkT/s0/vhxFWaQaqZdj1j7Vg"
+ "i6PWaYUPG8H4jsKf04ZDHoDRt7zIiUmrjqIM1FTo+JeFlnslzce0x72JUnoQOcn6"
+ "xZ4=";
+
+ const std::string CertIMNotSupportOcsp =
+ "MIIDkTCCAnmgAwIBAgIGAY+ZMX39MA0GCSqGSIb3DQEBDQUAMHQxCzAJBgNVBAYT"
+ "AktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBBc3NvY2lh"
+ "dGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSAwHgYDVQQDDBdUaXplbiBBdXRob3Ig"
+ "Um9vdCBDbGFzczAeFw0yNDA1MjEwMzI4MjhaFw00NDA1MjEwMzI4MjhaMHoxCzAJ"
+ "BgNVBAYTAktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBB"
+ "c3NvY2lhdGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSYwJAYDVQQDDB1UaXplbiBT"
+ "RVMgQXV0aG9yIFNpZ25lciBDbGFzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC"
+ "AQoCggEBAPoDp5isAC1YE3ZZ3470zdFtPsG/iMEDun4vwv2ePb9s/QkgfOFmK6jV"
+ "1xSoCsCTotaDEw+H2kRJ89HXxlAcdG6I1mA6NVgUOt+Nh2NhswAu8BeGUfRLVDIm"
+ "35mJe2P8EHRg5VfVecXFlWy4gz4boqYsZ80m4MTbrxJERhoSvyr+QRLNXOaLn7G6"
+ "3+sbzIHN7GOznQjLCWKiEZpUTqYLf3F9oDYifL9/CUaQDtpHSl+YQD0iTybrnOmY"
+ "Z7LoivRmWnpFkv6JVFMzwMAJLYVVaPlMgFJwi4m5QFOXROw/jOfi7pgkFOpHzC30"
+ "IIZgVcwkqsaQvm4s3WKTG1jFVn/LrRcCAwEAAaMjMCEwDwYDVR0TAQH/BAUwAwEB"
+ "/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggEBADnYRZq8RZTqlr65"
+ "B7eeMEz+jmbdR0mifav4o2gofEW188+sajNVCeYzuczTzUHRe27Z6oJOagw32dKQ"
+ "zR17QZ/1+HYlFs/ZhOEp+qo/f+4V/iPlXne8oxWLK4mftCt4jg3Tov7HUHhd2gVI"
+ "B21w0lts1hCiyBj2kpSsIHfftDJcgI3/1UymNqSxAwrkRi2Et91PJ6EfEF7BukkU"
+ "fuFWDDAPV9i6rfAxTOd6W4YL/zwmhGq73d7S9IPTVzTmMCkQcxfAAbM0c8UOLmM/"
+ "FugMDhq68L65zW8sP26O0ATIcbXIugVXfETrhMPDNUqaI9TFRwaJsrLY+3UXaxW8"
+ "h0vi1ic=";
+
+ const std::string CertEENotSupportOcsp =
+ "MIIDkTCCAnmgAwIBAgIGAY+ZNINLMA0GCSqGSIb3DQEBDQUAMHQxCzAJBgNVBAYT"
+ "AktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBBc3NvY2lh"
+ "dGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSAwHgYDVQQDDBdUaXplbiBBdXRob3Ig"
+ "Um9vdCBDbGFzczAeFw0yNDA1MjEwMzMxNDZaFw00NDA1MjEwMzMxNDZaMHoxCzAJ"
+ "BgNVBAYTAktSMRMwEQYDVQQHDApTdXdvbiBDaXR5MRowGAYDVQQKDBFUaXplbiBB"
+ "c3NvY2lhdGlvbjESMBAGA1UECwwJVGl6ZW4gU0VTMSYwJAYDVQQDDB1UaXplbiBT"
+ "RVMgQXV0aG9yIFNpZ25lciBDbGFzczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC"
+ "AQoCggEBAIl4tzKrdR6olVjCRNTR4NDZRcXVrciM5qqeKHUYacgaUTBQ5P59tU3Y"
+ "xVSMUylcWkWdNfL7xfVoL+jJP4NlFzJdbRi3ZOyCXDL0uduXLTBnxY1UMOy5l0oN"
+ "1NDc6hlotjfo8i3oVbC8WZVEHMufVwUiDGu9UQa653lhIm3UAiAStc7RK9S5lC3V"
+ "tCAPWRIp4lAqRimMizy9YGaCFADCJkBs1orKGWr3d6Tm779Wm6RiNNmiuvFLC6OW"
+ "1VKkhaUdDy9Imre72gmjGOIPY0thH2xdctIM/XcgC9yGB0Kkq//Tl6M3/leK5/KN"
+ "QLti7Rxv53AiP4H4OdoOIQ2ZyT1Q13ECAwEAAaMjMCEwDwYDVR0TAQH/BAUwAwEB"
+ "/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggEBAJ/7UBHhlBJqiwic"
+ "cFsMqR+Y7y9rEKUszk1MIfHnOyl/4BobDolHI79tPmbK0XrhF3xJp4ZxpHIJ5oR5"
+ "PYzcKrQZlaGrTtQGLozBqAAK2qD68c40M1UyKFPcdzUx513gkSTtYSQe2e7nK+FI"
+ "qlMZm5C9TfvGjC4WCxA+Mu+HAmxEF6t0Jdq/P02a7/O5xHUi/3RburkjN6aazD/s"
+ "V+zMbSN5JLy7UDmUwn8P7NkC97DVJOolhXRV7PJ4BJjjdzDPu5d3oKfcQ2owbpGx"
+ "GCXrExBhL4nWzvG4PoDbsAQ9Wma/+R9vWgKOr/KvYsQjrTLSrBKpzZ5yW84C4uId"
+ "m5+JYVs=";
+}
extern const std::string DigestSHA1;
extern const std::string DigestSHA256;
extern const std::string Cert;
+}
+
+namespace CertificateChain {
+ extern const std::string CertEE;
+ extern const std::string CertIM;
+ extern const std::string CertRoot;
+
+ extern const std::string CertEENotSupportOcsp;
+ extern const std::string CertIMNotSupportOcsp;
+ extern const std::string CertRootNotSupportOcsp;
}
\ No newline at end of file
*/
#include "test_macros.h"
+#include "test_common.h"
+#include "test_constant.h"
#include "vcore/CertificateCollection.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>
-const std::string certEE =
- "MIIJGTCCBwGgAwIBAgITEgAxQ0VlMES59RTscQAAADFDRTANBgkqhkiG9w0BAQsF"
- "ADBPMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
- "MSAwHgYDVQQDExdNaWNyb3NvZnQgUlNBIFRMUyBDQSAwMTAeFw0yMjExMTUyMDE2"
- "MzhaFw0yMzExMTUyMDE2MzhaMGExCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJXQTEQ"
- "MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u"
- "MRMwEQYDVQQDEwpyLmJpbmcuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB"
- "CgKCAQEAvzvBoCT8A/rooZzeDm7yJ9PdB5c4ZE54P4q+R5ZaY3l9+UH7wkD/AMgx"
- "5RUwpCg3JlZaSrl5kjp6xvjmhvy08v/mp0Jw80zG33lQ8DOk16VYBwpoSBy2Pn6E"
- "6bhDYHGFybPzpKlKxiJHSYuiAF+05FfUk/jBmXFMkmsDlm5Fwq1y6/da4K0bJImC"
- "msWDPDZrf3A8fu9lQeNRv3tbvrknOCGKaQ15iHxRpHhvMDxfX4/ba/ztw23wMExv"
- "YKdAkUHQUMygbZE/vSBQhPtqqHFc+IY9sKpJ35oa4lfklnzgxlACogTmytJsrhry"
- "lDeTp9bBAQwV2T7enHwoy1jdFaaJQwIDAQABo4IE2jCCBNYwggF+BgorBgEEAdZ5"
- "AgQCBIIBbgSCAWoBaAB1AOg+0No+9QY1MudXKLyJa8kD08vREWvs62nhd31tBr1u"
- "AAABhHz5BCoAAAQDAEYwRAIgTDH4xbzeE641O31H3wgjEfWbEhEKOfppCp+tYA3i"
- "1CgCIF2TX3NmpCL3XEYDtbBv1ryuIA3cPGhgzynDWAdMiY5wAHYAVYHUwhaQNgFK"
- "6gubVzxT8MDkOHhwJQgXL6OqHQcT0wwAAAGEfPkEXwAABAMARzBFAiEA3ao53zxV"
- "/geztebynoFndOYoZiKOf0rSsa/PAEAsczcCIEOtGgNpraLTEJhe1OYbnuAo9Rak"
- "eAbFPfjJdALwgGWVAHcAejKMVNi3LbYg6jjgUh7phBZwMhOFTTvSK8E6V6NS61IA"
- "AAGEfPkC5AAABAMASDBGAiEAzov/r1LY9ELiZbJ2690S3ujq3gzpJ3Sxi6VN58gF"
- "jH4CIQCG8bsL4aIfW3vB+o6mNl2xB9/cPEMbmFgUPBU8Lyr9uzAnBgkrBgEEAYI3"
- "FQoEGjAYMAoGCCsGAQUFBwMCMAoGCCsGAQUFBwMBMD0GCSsGAQQBgjcVBwQwMC4G"
- "JisGAQQBgjcVCIfahnWD7tkBgsmFG4G1nmGF9OtggV25+BCGkdB4AgFkAgElMIGH"
- "BggrBgEFBQcBAQR7MHkwUwYIKwYBBQUHMAKGR2h0dHA6Ly93d3cubWljcm9zb2Z0"
- "LmNvbS9wa2kvbXNjb3JwL01pY3Jvc29mdCUyMFJTQSUyMFRMUyUyMENBJTIwMDEu"
- "Y3J0MCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC5tc29jc3AuY29tMB0GA1UdDgQW"
- "BBSukOod1pztVw1Lx47hPotC/higDTAOBgNVHQ8BAf8EBAMCBLAwgeQGA1UdEQSB"
- "3DCB2YIKci5iaW5nLmNvbYIUdGhha2EubXNmdHN0YXRpYy5jb22CDnRoYWthLmJp"
- "bmcuY29tghF0aC5tc2Z0c3RhdGljLmNvbYILdGguYmluZy5jb22CE3Jha2EubXNm"
- "dHN0YXRpYy5jb22CDXJha2EuYmluZy5jb22CEHIubXNmdHN0YXRpYy5jb22CDWFr"
- "YW0uYmluZy5jb22CDSoubW0uYmluZy5uZXSCEyouZXhwbGljaXQuYmluZy5uZXSC"
- "ECouYmluZ3N0YXRpYy5jb22CCiouYmluZy5jb20wgbAGA1UdHwSBqDCBpTCBoqCB"
- "n6CBnIZNaHR0cDovL21zY3JsLm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9jcmwv"
- "TWljcm9zb2Z0JTIwUlNBJTIwVExTJTIwQ0ElMjAwMS5jcmyGS2h0dHA6Ly9jcmwu"
- "bWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9NaWNyb3NvZnQlMjBSU0ElMjBU"
- "TFMlMjBDQSUyMDAxLmNybDBXBgNVHSAEUDBOMEIGCSsGAQQBgjcqATA1MDMGCCsG"
- "AQUFBwIBFidodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9jcHMw"
- "CAYGZ4EMAQICMB8GA1UdIwQYMBaAFLV2DDARzseSQk1Mx1wsyKkM6AtkMB0GA1Ud"
- "JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAgEAUce0"
- "vFbvYp03JZdLVC7vjMuKOloMCcGQy0CUO3P+T4322/JvQGjgKStq/9FA+GMvqmu0"
- "yuC4R69o8wlDOhabeJYt2T87BpE31GBHoAYkFE7kdSYfF6FP3fq2FzYcIi8OoKWI"
- "HHZ1RsIrMKaC3sWxhrmdIpDImdgXFBXlA1CPFafeioF50bQXmjndR0xMNwnpnRNS"
- "6XNHC9rYARXe7Jj0qk8JYTvLgPGkkaMHmnS7Hn914d1dFIZ2hyVvA+rUtVRQ1oQx"
- "Q+R+wsRl59Q15MCSIMWnp5Fcg1gcAduGuRCvWKpusJmX3tWjdUSKEQ1UP1qV0eMm"
- "lh64jNwJ+ejX6psgyWO2a+dFpuD2l8MgFb2gN2RgS4YsPZyDitCBkezHrmsn8txQ"
- "yaRStDiu6UgS1Z3cqxsNHfct4BdLd7ngzBMY5CacUcCHjwPyoIHYu4G6f84LztQT"
- "s+uwMhnP9iP/6RiF3xgJMyrIKxUjC0aDjgYyOOVS6VpVLsdVdq0KImHElO5aknT0"
- "UzvSa5LocKrmAUv+23Dvy/UU94vERy3WelqFzb+ktRgvje0LSsHaIQC8YhokEFx2"
- "cXdJs7PwmADM4dFCD467C2lsXTzrS4WcvSLfq6xOZ2enl8L6qfQpJ58J49uhUqx3"
- "lJtG1Q+rccyveDAacyyCp/pDdMQdYLranGFFioA=";
-const std::string certIM =
- "MIIFWjCCBEKgAwIBAgIQDxSWXyAgaZlP1ceseIlB4jANBgkqhkiG9w0BAQsFADBa"
- "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl"
- "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw"
- "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV"
- "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT"
- "QSBUTFMgQ0EgMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqYnfP"
- "mmOyBoTzkDb0mfMUUavqlQo7Rgb9EUEf/lsGWMk4bgj8T0RIzTqk970eouKVuL5R"
- "IMW/snBjXXgMQ8ApzWRJCZbar879BV8rKpHoAW4uGJssnNABf2n17j9TiFy6BWy+"
- "IhVnFILyLNK+W2M3zK9gheiWa2uACKhuvgCca5Vw/OQYErEdG7LBEzFnMzTmJcli"
- "W1iCdXby/vI/OxbfqkKD4zJtm45DJvC9Dh+hpzqvLMiK5uo/+aXSJY+SqhoIEpz+"
- "rErHw+uAlKuHFtEjSeeku8eR3+Z5ND9BSqc6JtLqb0bjOHPm5dSRrgt4nnil75bj"
- "c9j3lWXpBb9PXP9Sp/nPCK+nTQmZwHGjUnqlO9ebAVQD47ZisFonnDAmjrZNVqEX"
- "F3p7laEHrFMxttYuD81BdOzxAbL9Rb/8MeFGQjE2Qx65qgVfhH+RsYuuD9dUw/3w"
- "ZAhq05yO6nk07AM9c+AbNtRoEcdZcLCHfMDcbkXKNs5DJncCqXAN6LhXVERCw/us"
- "G2MmCMLSIx9/kwt8bwhUmitOXc6fpT7SmFvRAtvxg84wUkg4Y/Gx++0j0z6StSeN"
- "0EJz150jaHG6WV4HUqaWTb98Tm90IgXAU4AW2GBOlzFPiU5IY9jt+eXC2Q6yC/Zp"
- "TL1LAcnL3Qa/OgLrHN0wiw1KFGD51WRPQ0Sh7QIDAQABo4IBJTCCASEwHQYDVR0O"
- "BBYEFLV2DDARzseSQk1Mx1wsyKkM6AtkMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI"
- "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI"
- "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI"
- "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g"
- "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq"
- "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG"
- "SIb3DQEBCwUAA4IBAQCfK76SZ1vae4qt6P+dTQUO7bYNFUHR5hXcA2D59CJWnEj5"
- "na7aKzyowKvQupW4yMH9fGNxtsh6iJswRqOOfZYC4/giBO/gNsBvwr8uDW7t1nYo"
- "DYGHPpvnpxCM2mYfQFHq576/TmeYu1RZY29C4w8xYBlkAA8mDJfRhMCmehk7cN5F"
- "JtyWRj2cZj/hOoI45TYDBChXpOlLZKIYiG1giY16vhCRi6zmPzEwv+tk156N6cGS"
- "Vm44jTQ/rs1sa0JSYjzUaYngoFdZC4OfxnIkQvUIA4TOFmPzNPEFdjcZsgbeEz4T"
- "cGHTBPK4R28F44qIMCtHRV55VMX53ev6P3hRddJb";
-const std::string certRoot =
- "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ"
- "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD"
- "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX"
- "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y"
- "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy"
- "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr"
- "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr"
- "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK"
- "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu"
- "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy"
- "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye"
- "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1"
- "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3"
- "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92"
- "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx"
- "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0"
- "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz"
- "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS"
- "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp";
-
using namespace ValidationCore;
-
-CertificateList createCertificateList(std::list<std::string> strList)
-{
- CertificateList certList;
- for (std::string certStr : strList) {
- certList.push_back(CertificatePtr(new Certificate(certStr, Certificate::FORM_BASE64)));
- }
- return certList;
-}
+using namespace CertificateChain;
CertificateCollection collection;
POSITIVE_TEST_CASE(T_certificate_collection_load_certificate_list)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK(!collection.empty());
POSITIVE_TEST_CASE(T_certificate_collection_complete_certificate_chain)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK(collection.completeCertificateChain());
collection.clear();
- strList = {certRoot, certEE, certIM};
+ strList = {CertRoot, CertEE, CertIM};
certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK(collection.completeCertificateChain());
POSITIVE_TEST_CASE(T_certificate_collection_check_is_chain)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
collection.sort();
NEGATIVE_TEST_CASE(T_certificate_collection_check_is_chain_without_sorting)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK_THROW(collection.isChain(), CertificateCollection::Exception::WrongUsage);
POSITIVE_TEST_CASE(T_certificate_collection_get_chain)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
collection.sort();
NEGATIVE_TEST_CASE(T_certificate_collection_get_chain_without_sorting)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK_THROW(collection.getChain(), CertificateCollection::Exception::WrongUsage);
POSITIVE_TEST_CASE(T_certificate_collection_sort)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
BOOST_CHECK(collection.sort());
POSITIVE_TEST_CASE(T_certificate_collection_to_base_64_string)
{
- std::list<std::string> strList = {certEE, certIM, certRoot};
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
std::string result = collection.toBase64String();
POSITIVE_TEST_CASE(T_certificate_collection_iterator)
{
- std::list<std::string> strList = {certRoot, certIM, certEE};
+ std::list<std::string> strList = {CertRoot, CertIM, CertEE};
CertificateList certList = createCertificateList(strList);
collection.load(certList);
CertificatePtr certPtr = NULL;
CertificateList::const_iterator certIterator;
CertificateList::const_iterator certIteratorArray[2];
- Certificate firstCertificate = Certificate(certRoot, Certificate::FORM_BASE64);
+ Certificate firstCertificate = Certificate(CertRoot, Certificate::FORM_BASE64);
certIteratorArray[0] = collection.begin();
certIteratorArray[1] = collection.getCertificateList().begin();
BOOST_CHECK_EQUAL(hashName, expectedHashName);
}
- Certificate secondCertificate = Certificate(certEE, Certificate::FORM_BASE64);
+ Certificate secondCertificate = Certificate(CertEE, Certificate::FORM_BASE64);
hashName = collection.back()->getNameHash(Certificate::FIELD_SUBJECT);
expectedHashName = secondCertificate.getNameHash(Certificate::FIELD_SUBJECT);
--- /dev/null
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * This is internal test. ocsp.h isn't included in devel package
+ */
+
+#include "vcore/Ocsp.h"
+#include "test_constant.h"
+#include "test_common.h"
+#include "test_macros.h"
+#include <iostream>
+#include <cstring>
+#include <string.h>
+#include <list>
+
+using namespace ValidationCore;
+using namespace CertificateChain;
+using namespace std;
+
+BOOST_AUTO_TEST_SUITE(VCORE_OCSP_TEST)
+
+POSITIVE_TEST_CASE(T_check_ocsp_function)
+{
+ SignatureData data;
+
+ std::list<std::string> strList = {CertEE, CertIM, CertRoot};
+ CertificateList certList = createCertificateList(strList);
+ data.setSortedCertificateList(certList);
+
+ Ocsp::Result result = Ocsp::check(data);
+ BOOST_CHECK_EQUAL(result, Ocsp::Result::GOOD);
+}
+
+NEGATIVE_TEST_CASE(T_ocsp_certificate_chain_not_supported_ocsp)
+{
+ SignatureData data;
+
+ std::list<std::string> strList = {CertRootNotSupportOcsp, CertIMNotSupportOcsp, CertEENotSupportOcsp};
+ CertificateList certList = createCertificateList(strList);
+ data.setSortedCertificateList(certList);
+
+ BOOST_CHECK_THROW(Ocsp::check(data), Ocsp::Exception::OcspUnsupported);
+}
+
+NEGATIVE_TEST_CASE(T_ocsp_certificate_chain_too_short)
+{
+ SignatureData data;
+
+ CertificateList certList;
+ certList.push_back(CertificatePtr(new Certificate(CertRoot, Certificate::FORM_BASE64)));
+ data.setSortedCertificateList(certList);
+
+ BOOST_CHECK_THROW(Ocsp::check(data), Ocsp::Exception::InvalidParam);
+}
+
+NEGATIVE_TEST_CASE(T_ocsp_certificate_chain_with_unsorted_cert_list)
+{
+ SignatureData data;
+
+ BOOST_CHECK_THROW(Ocsp::check(data), Ocsp::Exception::InvalidParam);
+}
+
+BOOST_AUTO_TEST_SUITE_END()