#include "common-res.h"
-const std::string TestData::SelfSignedCAPath = std::string(TESTAPP_RES_DIR) + "certs/root_cacert0.pem";
-const std::string TestData::subjectGoogleCA = "/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority";
+const std::string TestData::SelfSignedCAPath = std::string(TESTAPP_RES_DIR) +
+ "certs/root_cacert0.pem";
+const std::string TestData::subjectGoogleCA =
+ "/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority";
const std::string TestData::googleCA =
- "MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG"
- "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz"
- "cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2"
- "MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV"
- "BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt"
- "YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN"
- "ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE"
- "BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is"
- "I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G"
- "CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do"
- "lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc"
- "AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k";
+ "MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG"
+ "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz"
+ "cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2"
+ "MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV"
+ "BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt"
+ "YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN"
+ "ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE"
+ "BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is"
+ "I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G"
+ "CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do"
+ "lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc"
+ "AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k";
const std::string TestData::google2nd =
- "MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV"
- "UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi"
- "bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw"
- "MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh"
- "d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD"
- "QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx"
- "PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g"
- "5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo"
- "3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG"
- "A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX"
- "BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov"
- "L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG"
- "AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF"
- "BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB"
- "BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc"
- "q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR"
- "bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv";
+ "MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV"
+ "UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi"
+ "bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw"
+ "MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh"
+ "d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD"
+ "QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx"
+ "PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g"
+ "5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo"
+ "3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG"
+ "A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX"
+ "BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov"
+ "L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG"
+ "AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF"
+ "BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB"
+ "BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc"
+ "q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR"
+ "bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv";
const std::string TestData::certEE =
- "MIIDIjCCAougAwIBAgIQK59+5colpiUUIEeCdTqbuTANBgkqhkiG9w0BAQUFADBM"
- "MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg"
- "THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x"
- "MzA5MzAyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh"
- "MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRgw"
- "FgYDVQQDFA9tYWlsLmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ"
- "AoGBAK85FZho5JL+T0/xu/8NLrD+Jaq9aARnJ+psQ0ynbcvIj36B7ocmJRASVDOe"
- "qj2bj46Ss0sB4/lKKcMP/ay300yXKT9pVc9wgwSvLgRudNYPFwn+niAkJOPHaJys"
- "Eb2S5LIbCfICMrtVGy0WXzASI+JMSo3C2j/huL/3OrGGvvDFAgMBAAGjgecwgeQw"
- "DAYDVR0TAQH/BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0"
- "ZS5jb20vVGhhd3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEF"
- "BQcDAgYJYIZIAYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0"
- "cDovL29jc3AudGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3"
- "dGUuY29tL3JlcG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEF"
- "BQADgYEANYARzVI+hCn7wSjhIOUCj19xZVgdYnJXPOZeJWHTy60i+NiBpOf0rnzZ"
- "wW2qkw1iB5/yZ0eZNDNPPQJ09IHWOAgh6OKh+gVBnJzJ+fPIo+4NpddQVF4vfXm3"
- "fgp8tuIsqK7+lNfNFjBxBKqeecPStiSnJavwSI4vw6e7UN0Pz7A=";
+ "MIIDIjCCAougAwIBAgIQK59+5colpiUUIEeCdTqbuTANBgkqhkiG9w0BAQUFADBM"
+ "MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg"
+ "THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x"
+ "MzA5MzAyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh"
+ "MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRgw"
+ "FgYDVQQDFA9tYWlsLmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ"
+ "AoGBAK85FZho5JL+T0/xu/8NLrD+Jaq9aARnJ+psQ0ynbcvIj36B7ocmJRASVDOe"
+ "qj2bj46Ss0sB4/lKKcMP/ay300yXKT9pVc9wgwSvLgRudNYPFwn+niAkJOPHaJys"
+ "Eb2S5LIbCfICMrtVGy0WXzASI+JMSo3C2j/huL/3OrGGvvDFAgMBAAGjgecwgeQw"
+ "DAYDVR0TAQH/BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0"
+ "ZS5jb20vVGhhd3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEF"
+ "BQcDAgYJYIZIAYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0"
+ "cDovL29jc3AudGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3"
+ "dGUuY29tL3JlcG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEF"
+ "BQADgYEANYARzVI+hCn7wSjhIOUCj19xZVgdYnJXPOZeJWHTy60i+NiBpOf0rnzZ"
+ "wW2qkw1iB5/yZ0eZNDNPPQJ09IHWOAgh6OKh+gVBnJzJ+fPIo+4NpddQVF4vfXm3"
+ "fgp8tuIsqK7+lNfNFjBxBKqeecPStiSnJavwSI4vw6e7UN0Pz7A=";
const std::string TestData::certFullField =
- "MIICvzCCAigCCQCpduCB5TcrmDANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC"
- "S08xEzARBgNVBAgMCkt5ZW9uZ2tpZG8xDjAMBgNVBAcMBVN1d29uMRAwDgYDVQQK"
- "DAdTYW1zdW5nMRcwFQYDVQQLDA5Tb2Z0d2FyZUNlbnRlcjEWMBQGA1UEAwwNVGl6"
- "ZW5TZWN1cml0eTEgMB4GCSqGSIb3DQEJARYRay50YWtAc2Ftc3VuZy5jb20wHhcN"
- "MTUwODE5MDQzNTQxWhcNMjAwODE3MDQzNTQxWjCBrzELMAkGA1UEBhMCUE8xEzAR"
- "BgNVBAgMClNlb3VsU3RhdGUxDjAMBgNVBAcMBVNlb3VsMRYwFAYDVQQKDA1TYW1z"
- "dW5nU2Vjb25kMR0wGwYDVQQLDBRTb2Z0d2FyZUNlbnRlclNlY29uZDEcMBoGA1UE"
- "AwwTVGl6ZW5TZWN1cml0eVNlY29uZDEmMCQGCSqGSIb3DQEJARYXa3l1bmd3b29r"
- "LnRha0BnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANgIo6MF"
- "++LfNs3jSC87WRfO4zK/n+/xfPsn+Xwyi4jtsMxk2v/ye/SGESAACdCFFBL/EZ9j"
- "Adu/6kzuKDJ5SpphW++XoUM2YdNxHzf6+z8JK9IPVmhy3b/hQlVbtBiFAMuLOn1D"
- "C0gfTEnYRgZBs3v5Z/N35ZO1FoCz8y9wHmAXAgMBAAEwDQYJKoZIhvcNAQELBQAD"
- "gYEAb3/k6KLLGysGEMFk2rVVvroqGqzeKHfk+t/pbrdGHEr0EIIXIYBk7YCGhMVF"
- "Flw7g6Cpxyo1FQEFQhcdiv4/Iio2/RemtTYRILOnoaHSh9j9Fl1LT69MZq20hjId"
- "8WNW2Ah9APv29fpZQFXo8dMsy1cnh4hJhWVWWttSLUBd1uE=";
+ "MIICvzCCAigCCQCpduCB5TcrmDANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMC"
+ "S08xEzARBgNVBAgMCkt5ZW9uZ2tpZG8xDjAMBgNVBAcMBVN1d29uMRAwDgYDVQQK"
+ "DAdTYW1zdW5nMRcwFQYDVQQLDA5Tb2Z0d2FyZUNlbnRlcjEWMBQGA1UEAwwNVGl6"
+ "ZW5TZWN1cml0eTEgMB4GCSqGSIb3DQEJARYRay50YWtAc2Ftc3VuZy5jb20wHhcN"
+ "MTUwODE5MDQzNTQxWhcNMjAwODE3MDQzNTQxWjCBrzELMAkGA1UEBhMCUE8xEzAR"
+ "BgNVBAgMClNlb3VsU3RhdGUxDjAMBgNVBAcMBVNlb3VsMRYwFAYDVQQKDA1TYW1z"
+ "dW5nU2Vjb25kMR0wGwYDVQQLDBRTb2Z0d2FyZUNlbnRlclNlY29uZDEcMBoGA1UE"
+ "AwwTVGl6ZW5TZWN1cml0eVNlY29uZDEmMCQGCSqGSIb3DQEJARYXa3l1bmd3b29r"
+ "LnRha0BnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANgIo6MF"
+ "++LfNs3jSC87WRfO4zK/n+/xfPsn+Xwyi4jtsMxk2v/ye/SGESAACdCFFBL/EZ9j"
+ "Adu/6kzuKDJ5SpphW++XoUM2YdNxHzf6+z8JK9IPVmhy3b/hQlVbtBiFAMuLOn1D"
+ "C0gfTEnYRgZBs3v5Z/N35ZO1FoCz8y9wHmAXAgMBAAEwDQYJKoZIhvcNAQELBQAD"
+ "gYEAb3/k6KLLGysGEMFk2rVVvroqGqzeKHfk+t/pbrdGHEr0EIIXIYBk7YCGhMVF"
+ "Flw7g6Cpxyo1FQEFQhcdiv4/Iio2/RemtTYRILOnoaHSh9j9Fl1LT69MZq20hjId"
+ "8WNW2Ah9APv29fpZQFXo8dMsy1cnh4hJhWVWWttSLUBd1uE=";
std::string magdaCert =
- "MIIEDzCCA3igAwIBAgIJAMdKgvadG/Z/MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV"
- "BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT"
- "BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA"
- "c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIxMTMzWhcNMjExMDAyMTIxMTMzWjCBijEL"
- "MAkGA1UEBhMCUEwxFDASBgNVBAgTC01hem93aWVja2llMRIwEAYDVQQHEwlsZWdp"
- "b25vd28xEDAOBgNVBAoTB3NhbXN1bmcxDTALBgNVBAsTBHNwcmMxDjAMBgNVBAMT"
- "BW1hZ2RhMSAwHgYJKoZIhvcNAQkBFhFtYWdkYUBzYW1zdW5nLmNvbTCCAbcwggEr"
- "BgcqhkjOOAQBMIIBHgKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9"
- "sIvNrQLi2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7c"
- "Evx82Nb5jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3"
- "FQIVALcr8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+"
- "4acvInE9/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFd"
- "VKAKnyxi/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110"
- "L0ov19Q9fvqKp5UDgYUAAoGBAKxAQg7MqCgkC0MJftYjNaKM5n1iZv4j1li49zKf"
- "Y5nTLP+vYAvg0owLNYvJ5ncKfY1DACPU4/+tC7TTua95wgj5rwvAXnzgSyOGuSr0"
- "fK9DyrH6E0LfXT+WuIQHahm2iSbxqPrChlnp5/EXDTBaO6Qfdpq0BP48ClZebxcA"
- "+TYFo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy"
- "YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUmSpShswvWtEABd+l3WxccRcCydUw"
- "HwYDVR0jBBgwFoAUggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQAD"
- "gYEAgfnAu/gMJRC/BFwkgvrHL0TV4ffPVAf7RSnZS6ib4IHGgrvXJvL+Qh7vHykv"
- "ZIqD2L96nY2EaSNr0yXrT81YROndOQUJNx4Y/W8m6asu4hzANNZqWCbApPDIMK6V"
- "cPA1wrKgZqbWp218WBqI2v9pXV0O+jpzxq1+GeQV2UsbRwc=";
+ "MIIEDzCCA3igAwIBAgIJAMdKgvadG/Z/MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV"
+ "BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT"
+ "BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA"
+ "c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIxMTMzWhcNMjExMDAyMTIxMTMzWjCBijEL"
+ "MAkGA1UEBhMCUEwxFDASBgNVBAgTC01hem93aWVja2llMRIwEAYDVQQHEwlsZWdp"
+ "b25vd28xEDAOBgNVBAoTB3NhbXN1bmcxDTALBgNVBAsTBHNwcmMxDjAMBgNVBAMT"
+ "BW1hZ2RhMSAwHgYJKoZIhvcNAQkBFhFtYWdkYUBzYW1zdW5nLmNvbTCCAbcwggEr"
+ "BgcqhkjOOAQBMIIBHgKBgQC1PCOasFhlfMc1yjdcp7zkzXGiW+MpVuFlsdYwkAa9"
+ "sIvNrQLi2ulxcnNBeCHKDbk7U+J3/QwO2XanapQMUqvfjfjL1QQ5Vf7ENUWPNP7c"
+ "Evx82Nb5jWdHyRfV//TciBZN8GLNEbfhtWlhI6CbDW1AaY0nPZ879rSIk7/aNKZ3"
+ "FQIVALcr8uQAmnV+3DLIA5nTo0Bg0bjLAoGAJG7meUtQbMulRMdjzeCoya2FXdm+"
+ "4acvInE9/+MybXTB3bFANMyw6WTvk4K9RK8tm52N95cykTjpAbxqTMaXwkdWbOFd"
+ "VKAKnyxi/UKtY9Q6NmwJB2hbA1GUzhPko8rEda66CGl0VbyM1lKMJjA+wp9pG110"
+ "L0ov19Q9fvqKp5UDgYUAAoGBAKxAQg7MqCgkC0MJftYjNaKM5n1iZv4j1li49zKf"
+ "Y5nTLP+vYAvg0owLNYvJ5ncKfY1DACPU4/+tC7TTua95wgj5rwvAXnzgSyOGuSr0"
+ "fK9DyrH6E0LfXT+WuIQHahm2iSbxqPrChlnp5/EXDTBaO6Qfdpq0BP48ClZebxcA"
+ "+TYFo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy"
+ "YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUmSpShswvWtEABd+l3WxccRcCydUw"
+ "HwYDVR0jBBgwFoAUggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQAD"
+ "gYEAgfnAu/gMJRC/BFwkgvrHL0TV4ffPVAf7RSnZS6ib4IHGgrvXJvL+Qh7vHykv"
+ "ZIqD2L96nY2EaSNr0yXrT81YROndOQUJNx4Y/W8m6asu4hzANNZqWCbApPDIMK6V"
+ "cPA1wrKgZqbWp218WBqI2v9pXV0O+jpzxq1+GeQV2UsbRwc=";
std::string magdaMes = "c2lnbmVkIGRhdGEK";
const TestData::SigComponents TestData::magda(magdaCert, magdaMes, magdaSig);
std::string filipCert =
- "MIIC4zCCAkygAwIBAgIJAMdKgvadG/Z+MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV"
- "BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT"
- "BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA"
- "c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIwMDUxWhcNMjExMDAyMTIwMDUxWjB4MQsw"
- "CQYDVQQGEwJQTDEMMAoGA1UECBMDTUFaMQwwCgYDVQQHEwNMZWcxDDAKBgNVBAoT"
- "A1NhbTENMAsGA1UECxMEU1BSQzEOMAwGA1UEAxMFRmlsaXAxIDAeBgkqhkiG9w0B"
- "CQEWEWZpbGlwQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB"
- "gQDS/sS0wXSCb34ojN8bWFd4Pl9eTLHh18UNGsPpLpp4itdfuc/OgyqaSoDwBzVh"
- "EWAVLCTxexUa4Ncva+41NbkW4RCsFzeGs0ktpu1+8Q+v0QEOGqVF2rQkgilzDF/o"
- "O56Fxw9vG1OA+qdQd3yOAV2EqLNBPrEYB9K5GFyffrakSQIDAQABo3sweTAJBgNV"
- "HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp"
- "Y2F0ZTAdBgNVHQ4EFgQUeyy3iV75KtOkpPFd6mnR9dFGZMwwHwYDVR0jBBgwFoAU"
- "ggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQADgYEADtv0CBrQ1QCM"
- "H9jKFjpSpq7zFKMXQeVtb/Zie823//woicg8kxnP5sS4dJWNXNb1iMLdhgV80g1y"
- "t3gTWPxTtFzprQyNiJHTmrbNWXLX1roRVGUE/I8Q4xexqpbNlJIW2Jjm/kqoKfnK"
- "xORG6HNPXZV29NY2fDRPPOIYoFQzrXI=";
+ "MIIC4zCCAkygAwIBAgIJAMdKgvadG/Z+MA0GCSqGSIb3DQEBBQUAMHIxCzAJBgNV"
+ "BAYTAlBMMQwwCgYDVQQIEwNNYXoxEDAOBgNVBAoTB1NhbXN1bmcxDTALBgNVBAsT"
+ "BFNQUkMxEDAOBgNVBAMTB1NhbXN1bmcxIjAgBgkqhkiG9w0BCQEWE3NhbXN1bmdA"
+ "c2Ftc3VuZy5jb20wHhcNMTExMDA1MTIwMDUxWhcNMjExMDAyMTIwMDUxWjB4MQsw"
+ "CQYDVQQGEwJQTDEMMAoGA1UECBMDTUFaMQwwCgYDVQQHEwNMZWcxDDAKBgNVBAoT"
+ "A1NhbTENMAsGA1UECxMEU1BSQzEOMAwGA1UEAxMFRmlsaXAxIDAeBgkqhkiG9w0B"
+ "CQEWEWZpbGlwQHNhbXN1bmcuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB"
+ "gQDS/sS0wXSCb34ojN8bWFd4Pl9eTLHh18UNGsPpLpp4itdfuc/OgyqaSoDwBzVh"
+ "EWAVLCTxexUa4Ncva+41NbkW4RCsFzeGs0ktpu1+8Q+v0QEOGqVF2rQkgilzDF/o"
+ "O56Fxw9vG1OA+qdQd3yOAV2EqLNBPrEYB9K5GFyffrakSQIDAQABo3sweTAJBgNV"
+ "HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp"
+ "Y2F0ZTAdBgNVHQ4EFgQUeyy3iV75KtOkpPFd6mnR9dFGZMwwHwYDVR0jBBgwFoAU"
+ "ggh/2wAChuhTKqX6WK5nfxQ4yGAwDQYJKoZIhvcNAQEFBQADgYEADtv0CBrQ1QCM"
+ "H9jKFjpSpq7zFKMXQeVtb/Zie823//woicg8kxnP5sS4dJWNXNb1iMLdhgV80g1y"
+ "t3gTWPxTtFzprQyNiJHTmrbNWXLX1roRVGUE/I8Q4xexqpbNlJIW2Jjm/kqoKfnK"
+ "xORG6HNPXZV29NY2fDRPPOIYoFQzrXI=";
std::string filipMes = "Q3plZ28gdHUgc3p1a2Fzej8K";
std::string filipSigSHA1 =
- "xEIpVjEIUoDkYGtX2ih6Gbya0/gr7OMdvbBKmjqzfNh9GHqwrgjglByeC5sspUzPBUF4Vmg/hZqL"
- "gSsxXw9bKEa8c6mTQoNX51IC0ELPsoUMIJF1gGdFu0SzKptvU0+ksiiOM+70+s5t8s3z0G5PeA7O"
- "99oq8UlrX7GDlxaoTU4=";
+ "xEIpVjEIUoDkYGtX2ih6Gbya0/gr7OMdvbBKmjqzfNh9GHqwrgjglByeC5sspUzPBUF4Vmg/hZqL"
+ "gSsxXw9bKEa8c6mTQoNX51IC0ELPsoUMIJF1gGdFu0SzKptvU0+ksiiOM+70+s5t8s3z0G5PeA7O"
+ "99oq8UlrX7GDlxaoTU4=";
std::string filipSigSHA256 =
- "a5nGT6wnbQ8MLwLkG965E4e1Rv983E+v3nolLvvjuAKnfgWYb+70Da+T9ggYDTjngq+EBgC30w1p"
- "EScrwye8ELefvRxDWy1+tWR4QRW/Nd4oN2U/pvozoabDSpe9Cvt0ECEOWKDqIYYnoWFjOiXg9VwD"
- "HVVkQXvsSYu6thX/Xsk=";
+ "a5nGT6wnbQ8MLwLkG965E4e1Rv983E+v3nolLvvjuAKnfgWYb+70Da+T9ggYDTjngq+EBgC30w1p"
+ "EScrwye8ELefvRxDWy1+tWR4QRW/Nd4oN2U/pvozoabDSpe9Cvt0ECEOWKDqIYYnoWFjOiXg9VwD"
+ "HVVkQXvsSYu6thX/Xsk=";
const TestData::SigComponents TestData::filipSHA1(filipCert, filipMes, filipSigSHA1);
const TestData::SigComponents TestData::filipSHA256(filipCert, filipMes, filipSigSHA256);
std::string certChainArr[3] = {
- "MIIDXTCCAsagAwIBAgIBAjANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJLUjEO"
- "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
- "IFRlc3QxFzAVBgNVBAMMDlRlc3QgU2Vjb25kIENBMRswGQYJKoZIhvcNAQkBFgx0"
- "dEBnbWFpbC5jb20wHhcNMTQwNjE4MDgxMTA0WhcNMTUwNjE4MDgxMTA0WjB7MQsw"
- "CQYDVQQGEwJLUjEOMAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxFzAV"
- "BgNVBAsMDlRpemVuIFRlc3QgQUlBMRQwEgYDVQQDDAtUZXN0IFNpZ25lcjEbMBkG"
- "CSqGSIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB"
- "iQKBgQCwgKw+/71jWXnx4bLLZrTPmE+NrDfHSfZx8yTGYeewMzP6ZlXM8WduxNiq"
- "pqm7G2XN182GEXsdoxwa09HtMVGqSGA/BCamD1Z6liHOEb4UTB3ROJ1lZDDkyJ9a"
- "gZOfoZst/Aj8+bwV3x3ie+p4a2w/8eSsalrfef2gX6khaSsJOwIDAQABo4HxMIHu"
- "MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENl"
- "cnRpZmljYXRlMB0GA1UdDgQWBBRL0nKiNUjzh1/LPvZoqLvnVfOZqjAfBgNVHSME"
- "GDAWgBSpSfNbE0V2NHn/V5f660v2cWwYgDBzBggrBgEFBQcBAQRnMGUwIQYIKwYB"
- "BQUHMAGGFWh0dHA6Ly8xMjcuMC4wLjE6ODg4ODBABggrBgEFBQcwAoY0aHR0cDov"
- "L1NWUlNlY3VyZS1HMy1haWEudmVyaXNpZ24uY29tL1NWUlNlY3VyZUczLmNlcjAN"
- "BgkqhkiG9w0BAQUFAAOBgQABP+yru9/2auZ4ekjV03WRg5Vq/rqmOHDruMNVbZ4H"
- "4PBLRLSpC//OGahgEgUKe89BcB10lUi55D5YME3Do89I+hFugv0BPGaA201iLOhL"
- "/0u0aVm1yJxNt1YjW2fMKqnCHgjoHzh0wQC1pIb5vxJrYCn3Pbhml7W6JPDDJHfm"
- "XQ==",
-
- "MIIDLzCCApigAwIBAgIBATANBgkqhkiG9w0BAQUFADB4MQswCQYDVQQGEwJLUjEO"
- "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
- "IFRlc3QxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTEbMBkGCSqGSIb3DQEJARYMdHRA"
- "Z21haWwuY29tMB4XDTE0MDYxODA4MTA1OVoXDTE1MDYxODA4MTA1OVowejELMAkG"
- "A1UEBhMCS1IxDjAMBgNVBAgMBVNlb3VsMRAwDgYDVQQKDAdTYW1zdW5nMRMwEQYD"
- "VQQLDApUaXplbiBUZXN0MRcwFQYDVQQDDA5UZXN0IFNlY29uZCBDQTEbMBkGCSqG"
- "SIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB"
- "gQDLJrMAF/JzxIIrQzQ/3FGt7cGAUEYaEFSo+hcDKYRXaZC33/kkVANYFh+log9e"
- "MJUUlt0TBOg79tOnS/5MBwWaVLEOLalv0Uj2FfjEMpGd/xEF6Vv34mSTcWadMHyD"
- "wYwDZVwdFkrvOkA6WwgwS8XSrpbH/nkKUkKpk+YYljKEzQIDAQABo4HGMIHDMB0G"
- "A1UdDgQWBBSpSfNbE0V2NHn/V5f660v2cWwYgDAfBgNVHSMEGDAWgBRkHk9Lnhgv"
- "vOIwxHOma54FGt8SCDAMBgNVHRMEBTADAQH/MHMGCCsGAQUFBwEBBGcwZTAhBggr"
- "BgEFBQcwAYYVaHR0cDovLzEyNy4wLjAuMTo4ODg4MEAGCCsGAQUFBzAChjRodHRw"
- "Oi8vU1ZSU2VjdXJlLUczLWFpYS52ZXJpc2lnbi5jb20vU1ZSU2VjdXJlRzMuY2Vy"
- "MA0GCSqGSIb3DQEBBQUAA4GBAFonDQzs/Ts1sEDW3f5EmuKVZlpH9sLstSLJxZK8"
- "+v88Jbz451/Lf8hxvnMv3MwExXr9qPKPlvKRfj+bbLB5KTEcZ5zhDpJ7SDYesdUd"
- "RKOMSN0JIRL3JOCdYHOnJk6o+45vZ/TNv0lsiK90vxH2jo2EXnNG+jeyBGwp+3H6"
- "RWHw",
-
- "MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQUFADB4MQswCQYDVQQGEwJLUjEO"
- "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
- "IFRlc3QxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTEbMBkGCSqGSIb3DQEJARYMdHRA"
- "Z21haWwuY29tMB4XDTE0MDYxODA4MTA1MVoXDTE1MDYxODA4MTA1MVoweDELMAkG"
- "A1UEBhMCS1IxDjAMBgNVBAgMBVNlb3VsMRAwDgYDVQQKDAdTYW1zdW5nMRMwEQYD"
- "VQQLDApUaXplbiBUZXN0MRUwEwYDVQQDDAxUZXN0IFJvb3QgQ0ExGzAZBgkqhkiG"
- "9w0BCQEWDHR0QGdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA"
- "o6ZegsQ9hScM1yD7ejv44xUTJDjTlcGweHh76Im22x6yAljM2+dKdj3EIVGt0BA3"
- "6qdZFl8WOxzQGcAzQY7GFOXQVog4UjqHMxmWwAx5jQyBzIieAj4HZ2lquPBiyiIe"
- "HAo6sCSWsxnh7PqvWaAypPZVEqOJ3ga5rXyDCcjzQ8ECAwEAAaOBxjCBwzAdBgNV"
- "HQ4EFgQUZB5PS54YL7ziMMRzpmueBRrfEggwHwYDVR0jBBgwFoAUZB5PS54YL7zi"
- "MMRzpmueBRrfEggwDAYDVR0TBAUwAwEB/zBzBggrBgEFBQcBAQRnMGUwIQYIKwYB"
- "BQUHMAGGFWh0dHA6Ly8xMjcuMC4wLjE6ODg4ODBABggrBgEFBQcwAoY0aHR0cDov"
- "L1NWUlNlY3VyZS1HMy1haWEudmVyaXNpZ24uY29tL1NWUlNlY3VyZUczLmNlcjAN"
- "BgkqhkiG9w0BAQUFAAOBgQAyRJXTZcwRCkRNGZQCO8txHvrmgv8vQwnZZF6SwyY/"
- "Bry0fmlehtN52NLjjPEG6u9YFYfzSkjQlVR0qfQ2mNs3d6AKFlOdZOT6cuEIZuKe"
- "pDb2Tx5JJbIN6N3fE/lVSW88K9aSCF2n15gYTSVmD0juHuLAoWnIicaa+Sbe2Tsj"
- "AQ=="};
+ "MIIDXTCCAsagAwIBAgIBAjANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJLUjEO"
+ "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
+ "IFRlc3QxFzAVBgNVBAMMDlRlc3QgU2Vjb25kIENBMRswGQYJKoZIhvcNAQkBFgx0"
+ "dEBnbWFpbC5jb20wHhcNMTQwNjE4MDgxMTA0WhcNMTUwNjE4MDgxMTA0WjB7MQsw"
+ "CQYDVQQGEwJLUjEOMAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxFzAV"
+ "BgNVBAsMDlRpemVuIFRlc3QgQUlBMRQwEgYDVQQDDAtUZXN0IFNpZ25lcjEbMBkG"
+ "CSqGSIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB"
+ "iQKBgQCwgKw+/71jWXnx4bLLZrTPmE+NrDfHSfZx8yTGYeewMzP6ZlXM8WduxNiq"
+ "pqm7G2XN182GEXsdoxwa09HtMVGqSGA/BCamD1Z6liHOEb4UTB3ROJ1lZDDkyJ9a"
+ "gZOfoZst/Aj8+bwV3x3ie+p4a2w/8eSsalrfef2gX6khaSsJOwIDAQABo4HxMIHu"
+ "MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENl"
+ "cnRpZmljYXRlMB0GA1UdDgQWBBRL0nKiNUjzh1/LPvZoqLvnVfOZqjAfBgNVHSME"
+ "GDAWgBSpSfNbE0V2NHn/V5f660v2cWwYgDBzBggrBgEFBQcBAQRnMGUwIQYIKwYB"
+ "BQUHMAGGFWh0dHA6Ly8xMjcuMC4wLjE6ODg4ODBABggrBgEFBQcwAoY0aHR0cDov"
+ "L1NWUlNlY3VyZS1HMy1haWEudmVyaXNpZ24uY29tL1NWUlNlY3VyZUczLmNlcjAN"
+ "BgkqhkiG9w0BAQUFAAOBgQABP+yru9/2auZ4ekjV03WRg5Vq/rqmOHDruMNVbZ4H"
+ "4PBLRLSpC//OGahgEgUKe89BcB10lUi55D5YME3Do89I+hFugv0BPGaA201iLOhL"
+ "/0u0aVm1yJxNt1YjW2fMKqnCHgjoHzh0wQC1pIb5vxJrYCn3Pbhml7W6JPDDJHfm"
+ "XQ==",
+
+ "MIIDLzCCApigAwIBAgIBATANBgkqhkiG9w0BAQUFADB4MQswCQYDVQQGEwJLUjEO"
+ "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
+ "IFRlc3QxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTEbMBkGCSqGSIb3DQEJARYMdHRA"
+ "Z21haWwuY29tMB4XDTE0MDYxODA4MTA1OVoXDTE1MDYxODA4MTA1OVowejELMAkG"
+ "A1UEBhMCS1IxDjAMBgNVBAgMBVNlb3VsMRAwDgYDVQQKDAdTYW1zdW5nMRMwEQYD"
+ "VQQLDApUaXplbiBUZXN0MRcwFQYDVQQDDA5UZXN0IFNlY29uZCBDQTEbMBkGCSqG"
+ "SIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB"
+ "gQDLJrMAF/JzxIIrQzQ/3FGt7cGAUEYaEFSo+hcDKYRXaZC33/kkVANYFh+log9e"
+ "MJUUlt0TBOg79tOnS/5MBwWaVLEOLalv0Uj2FfjEMpGd/xEF6Vv34mSTcWadMHyD"
+ "wYwDZVwdFkrvOkA6WwgwS8XSrpbH/nkKUkKpk+YYljKEzQIDAQABo4HGMIHDMB0G"
+ "A1UdDgQWBBSpSfNbE0V2NHn/V5f660v2cWwYgDAfBgNVHSMEGDAWgBRkHk9Lnhgv"
+ "vOIwxHOma54FGt8SCDAMBgNVHRMEBTADAQH/MHMGCCsGAQUFBwEBBGcwZTAhBggr"
+ "BgEFBQcwAYYVaHR0cDovLzEyNy4wLjAuMTo4ODg4MEAGCCsGAQUFBzAChjRodHRw"
+ "Oi8vU1ZSU2VjdXJlLUczLWFpYS52ZXJpc2lnbi5jb20vU1ZSU2VjdXJlRzMuY2Vy"
+ "MA0GCSqGSIb3DQEBBQUAA4GBAFonDQzs/Ts1sEDW3f5EmuKVZlpH9sLstSLJxZK8"
+ "+v88Jbz451/Lf8hxvnMv3MwExXr9qPKPlvKRfj+bbLB5KTEcZ5zhDpJ7SDYesdUd"
+ "RKOMSN0JIRL3JOCdYHOnJk6o+45vZ/TNv0lsiK90vxH2jo2EXnNG+jeyBGwp+3H6"
+ "RWHw",
+
+ "MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQUFADB4MQswCQYDVQQGEwJLUjEO"
+ "MAwGA1UECAwFU2VvdWwxEDAOBgNVBAoMB1NhbXN1bmcxEzARBgNVBAsMClRpemVu"
+ "IFRlc3QxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTEbMBkGCSqGSIb3DQEJARYMdHRA"
+ "Z21haWwuY29tMB4XDTE0MDYxODA4MTA1MVoXDTE1MDYxODA4MTA1MVoweDELMAkG"
+ "A1UEBhMCS1IxDjAMBgNVBAgMBVNlb3VsMRAwDgYDVQQKDAdTYW1zdW5nMRMwEQYD"
+ "VQQLDApUaXplbiBUZXN0MRUwEwYDVQQDDAxUZXN0IFJvb3QgQ0ExGzAZBgkqhkiG"
+ "9w0BCQEWDHR0QGdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA"
+ "o6ZegsQ9hScM1yD7ejv44xUTJDjTlcGweHh76Im22x6yAljM2+dKdj3EIVGt0BA3"
+ "6qdZFl8WOxzQGcAzQY7GFOXQVog4UjqHMxmWwAx5jQyBzIieAj4HZ2lquPBiyiIe"
+ "HAo6sCSWsxnh7PqvWaAypPZVEqOJ3ga5rXyDCcjzQ8ECAwEAAaOBxjCBwzAdBgNV"
+ "HQ4EFgQUZB5PS54YL7ziMMRzpmueBRrfEggwHwYDVR0jBBgwFoAUZB5PS54YL7zi"
+ "MMRzpmueBRrfEggwDAYDVR0TBAUwAwEB/zBzBggrBgEFBQcBAQRnMGUwIQYIKwYB"
+ "BQUHMAGGFWh0dHA6Ly8xMjcuMC4wLjE6ODg4ODBABggrBgEFBQcwAoY0aHR0cDov"
+ "L1NWUlNlY3VyZS1HMy1haWEudmVyaXNpZ24uY29tL1NWUlNlY3VyZUczLmNlcjAN"
+ "BgkqhkiG9w0BAQUFAAOBgQAyRJXTZcwRCkRNGZQCO8txHvrmgv8vQwnZZF6SwyY/"
+ "Bry0fmlehtN52NLjjPEG6u9YFYfzSkjQlVR0qfQ2mNs3d6AKFlOdZOT6cuEIZuKe"
+ "pDb2Tx5JJbIN6N3fE/lVSW88K9aSCF2n15gYTSVmD0juHuLAoWnIicaa+Sbe2Tsj"
+ "AQ=="
+};
std::vector<std::string> TestData::certChain(certChainArr, certChainArr + 3);
std::string certChainSelfSignedArr[2] = {
- "MIICdzCCAeACAQcwDQYJKoZIhvcNAQEFBQAwgYIxCzAJBgNVBAYTAktSMQ4wDAYD"
- "VQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3VuZzETMBEGA1UECwwKVGl6ZW4gVGVz"
- "dDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZlcnNpb24gMTEbMBkGCSqGSIb3DQEJ"
- "ARYMdHRAZ21haWwuY29tMB4XDTE0MDYxNDA4MTI1MFoXDTE1MDYxNDA4MTI1MFow"
- "gYQxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3Vu"
- "ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDEhMB8GA1UEAwwYVGVzdCBTZWNvbmQgQ0Eg"
- "VmVyc2lvbiAxMRswGQYJKoZIhvcNAQkBFgx0dEBnbWFpbC5jb20wgZ8wDQYJKoZI"
- "hvcNAQEBBQADgY0AMIGJAoGBAKOqFNxvO2jYcq5kqVehHH5k1D1dYwhBnH/SReWE"
- "OTSbH+3lbaKhJQHPHjsndENUxPInF6r0prO3TqoMB6774Pmc+znoVfLsHvWorhyr"
- "8iQNyaSgVWt0+8L0FU8iReqr5BR6YcZpnVRCV9dAIcf6FIVGUGZhTs/NvZDzIc4T"
- "9RrLAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAGDDvWhdMFg4GtDdytrK/GJ9TxX5F"
- "9iA/8qCl0+JU1U7jUVIcX77AxeZGBtq02X+DtjEWqnepS1iYO2TUHZBKRRCB2+wF"
- "ZsQ5XWngLSco+UvqUzMpWIQqslDXixWSR+Bef2S7iND3u8HJLjTncMcuJNpoXsFK"
- "bUiLqMVGQCkGZMo=",
-
- "MIICdTCCAd4CAQYwDQYJKoZIhvcNAQEFBQAwgYIxCzAJBgNVBAYTAktSMQ4wDAYD"
- "VQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3VuZzETMBEGA1UECwwKVGl6ZW4gVGVz"
- "dDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZlcnNpb24gMTEbMBkGCSqGSIb3DQEJ"
- "ARYMdHRAZ21haWwuY29tMB4XDTE0MDYxNDA4MTIzNVoXDTE1MDYxNDA4MTIzNVow"
- "gYIxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3Vu"
- "ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZl"
- "cnNpb24gMTEbMBkGCSqGSIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3"
- "DQEBAQUAA4GNADCBiQKBgQDtxGjhpaUK6xa4+sjMQfkKRAtjFkjZasVIt7uKUy/g"
- "GcC5i5aoorfyX/NBQLAVoIHMogHLgitehKL5l13tLR7DSETrG9V3Yx9bkWRcjyqH"
- "1TkD+NDOmhTtVuqIh4hrGKITlZK35hOh0IUEfYNNL8uq/11fVPpR3Yx97PT/j4w1"
- "uwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAOHjfa7nbPKhqR0mGfsscPQZZAZzKq9y"
- "ttdjTaNbnybzcJzcN3uwOdYKMf26Dn968nAPkukWe8j6GyMJ1C9LMAWqMn5hl0rI"
- "x6mUBfKZrl33BKH4KTYOrt0vnHdrCM2TwMkwMZ5ja5bBnbNrfF4e0HIAMor4rnVP"
- "WDSlESMMmtTm"};
-std::vector<std::string> TestData::certChainSelfSigned(certChainSelfSignedArr, certChainSelfSignedArr + 2);
+ "MIICdzCCAeACAQcwDQYJKoZIhvcNAQEFBQAwgYIxCzAJBgNVBAYTAktSMQ4wDAYD"
+ "VQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3VuZzETMBEGA1UECwwKVGl6ZW4gVGVz"
+ "dDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZlcnNpb24gMTEbMBkGCSqGSIb3DQEJ"
+ "ARYMdHRAZ21haWwuY29tMB4XDTE0MDYxNDA4MTI1MFoXDTE1MDYxNDA4MTI1MFow"
+ "gYQxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3Vu"
+ "ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDEhMB8GA1UEAwwYVGVzdCBTZWNvbmQgQ0Eg"
+ "VmVyc2lvbiAxMRswGQYJKoZIhvcNAQkBFgx0dEBnbWFpbC5jb20wgZ8wDQYJKoZI"
+ "hvcNAQEBBQADgY0AMIGJAoGBAKOqFNxvO2jYcq5kqVehHH5k1D1dYwhBnH/SReWE"
+ "OTSbH+3lbaKhJQHPHjsndENUxPInF6r0prO3TqoMB6774Pmc+znoVfLsHvWorhyr"
+ "8iQNyaSgVWt0+8L0FU8iReqr5BR6YcZpnVRCV9dAIcf6FIVGUGZhTs/NvZDzIc4T"
+ "9RrLAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAGDDvWhdMFg4GtDdytrK/GJ9TxX5F"
+ "9iA/8qCl0+JU1U7jUVIcX77AxeZGBtq02X+DtjEWqnepS1iYO2TUHZBKRRCB2+wF"
+ "ZsQ5XWngLSco+UvqUzMpWIQqslDXixWSR+Bef2S7iND3u8HJLjTncMcuJNpoXsFK"
+ "bUiLqMVGQCkGZMo=",
+
+ "MIICdTCCAd4CAQYwDQYJKoZIhvcNAQEFBQAwgYIxCzAJBgNVBAYTAktSMQ4wDAYD"
+ "VQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3VuZzETMBEGA1UECwwKVGl6ZW4gVGVz"
+ "dDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZlcnNpb24gMTEbMBkGCSqGSIb3DQEJ"
+ "ARYMdHRAZ21haWwuY29tMB4XDTE0MDYxNDA4MTIzNVoXDTE1MDYxNDA4MTIzNVow"
+ "gYIxCzAJBgNVBAYTAktSMQ4wDAYDVQQIDAVTZW91bDEQMA4GA1UECgwHU2Ftc3Vu"
+ "ZzETMBEGA1UECwwKVGl6ZW4gVGVzdDEfMB0GA1UEAwwWVGVzdCBSb290IENBIFZl"
+ "cnNpb24gMTEbMBkGCSqGSIb3DQEJARYMdHRAZ21haWwuY29tMIGfMA0GCSqGSIb3"
+ "DQEBAQUAA4GNADCBiQKBgQDtxGjhpaUK6xa4+sjMQfkKRAtjFkjZasVIt7uKUy/g"
+ "GcC5i5aoorfyX/NBQLAVoIHMogHLgitehKL5l13tLR7DSETrG9V3Yx9bkWRcjyqH"
+ "1TkD+NDOmhTtVuqIh4hrGKITlZK35hOh0IUEfYNNL8uq/11fVPpR3Yx97PT/j4w1"
+ "uwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAOHjfa7nbPKhqR0mGfsscPQZZAZzKq9y"
+ "ttdjTaNbnybzcJzcN3uwOdYKMf26Dn968nAPkukWe8j6GyMJ1C9LMAWqMn5hl0rI"
+ "x6mUBfKZrl33BKH4KTYOrt0vnHdrCM2TwMkwMZ5ja5bBnbNrfF4e0HIAMor4rnVP"
+ "WDSlESMMmtTm"
+};
+std::vector<std::string> TestData::certChainSelfSigned(certChainSelfSignedArr,
+ certChainSelfSignedArr + 2);
class SigComponents {
public:
SigComponents(std::string &cert, std::string &mes, std::string &sig)
- : certificate(cert)
- , message(mes)
- , signature(sig) {}
+ : certificate(cert)
+ , message(mes)
+ , signature(sig) {}
std::string certificate;
std::string message;
CertSvcInstance vinstance;
-int main (int argc, char *argv[])
+int main(int argc, char *argv[])
{
- certsvc_instance_new(&vinstance);
- int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
- certsvc_instance_free(vinstance);
- return status;
+ certsvc_instance_new(&vinstance);
+ int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+ certsvc_instance_free(vinstance);
+ return status;
}
{
CertSvcString fieldStr;
int result = certsvc_certificate_get_string_field(
- cert,
- field,
- &fieldStr);
+ cert,
+ field,
+ &fieldStr);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result,
- "Error in certsvc_certificate_get_string_field. "
- "field : " << field << " expected : " << expected);
-
+ "Error in certsvc_certificate_get_string_field. "
+ "field : " << field << " expected : " << expected);
size_t size;
const char *ptr;
-
certsvc_string_to_cstring(fieldStr, &ptr, &size);
if (ptr != NULL) {
std::cout << "filed[" << field << "] str[" << ptr << "]" << std::endl;
RUNNER_ASSERT_MSG(strncmp(ptr, expected, size) == 0,
- "extracted field isn't match to expected value");
+ "extracted field isn't match to expected value");
} else {
std::cout << "field[" << field << "] is empty." << std::endl;
}
{
CertSvcCertificate cert;
int result = certsvc_certificate_new_from_file(
- vinstance,
- TestData::SelfSignedCAPath.c_str(),
- &cert);
+ vinstance,
+ TestData::SelfSignedCAPath.c_str(),
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_TRUE == result, "Error reading certificate");
-
CertSvcString string;
-
certsvc_certificate_get_string_field(
cert,
CERTSVC_SUBJECT_COMMON_NAME,
&string);
-
const char *ptr = "Samsung";
-
const char *buffer;
size_t len;
-
certsvc_string_to_cstring(string, &buffer, &len);
-
result = strncmp(buffer, ptr, strlen(ptr));
-
RUNNER_ASSERT_MSG(0 == result, "Error reading common name");
-
certsvc_certificate_free(cert);
}
RUNNER_TEST(T0103_is_signed_by)
{
CertSvcCertificate cert1, cert2;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
- TestData::googleCA.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert1);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
+ TestData::googleCA.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert1);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error reading certificate");
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
- TestData::google2nd.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert2);
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
+ TestData::google2nd.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert2);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error reading certificate");
-
int status;
result = certsvc_certificate_is_signed_by(cert2, cert1, &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Chain verification failed");
RUNNER_ASSERT_MSG(CERTSVC_TRUE == status, "Chain verification failed");
}
RUNNER_TEST(T0104_not_before_not_after)
{
CertSvcCertificate cert;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
- TestData::google2nd.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
+ TestData::google2nd.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error reading certificate");
-
time_t before, after;
result = certsvc_certificate_get_not_before(cert, &before);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error extracting NOT_BEFORE");
RUNNER_ASSERT_MSG(before == 1084406400, "TODO");
-
result = certsvc_certificate_get_not_after(cert, &after);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error extracting NOT_AFTER");
//extracted: date --date="May 12 23:59:59 2014 GMT" +%s
RUNNER_ASSERT_MSG(after == 1399939199, "TODO");
RUNNER_TEST(T01051_cert_get_field_subject)
{
CertSvcCertificate cert;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
- TestData::certFullField.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
+ TestData::certFullField.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT,
"/C=PO/ST=SeoulState/L=Seoul/O=SamsungSecond/OU=SoftwareCenterSecond/CN=TizenSecuritySecond/emailAddress=kyungwook.tak@gmail.com");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_COMMON_NAME,
"TizenSecuritySecond");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_COUNTRY_NAME,
"PO");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_STATE_NAME,
"SeoulState");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_LOCALITY_NAME,
"Seoul");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_ORGANIZATION_NAME,
"SamsungSecond");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME,
"SoftwareCenterSecond");
-
_get_string_field_and_check(
cert,
CERTSVC_SUBJECT_EMAIL_ADDRESS,
RUNNER_TEST(T01052_cert_get_field_issuer)
{
CertSvcCertificate cert;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
- TestData::certFullField.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
+ TestData::certFullField.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER,
"/C=KO/ST=Kyeongkido/L=Suwon/O=Samsung/OU=SoftwareCenter/CN=TizenSecurity/emailAddress=k.tak@samsung.com");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_COMMON_NAME,
"TizenSecurity");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_COUNTRY_NAME,
"KO");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_STATE_NAME,
"Kyeongkido");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_LOCALITY_NAME,
"Suwon");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_ORGANIZATION_NAME,
"Samsung");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME,
"SoftwareCenter");
-
_get_string_field_and_check(
cert,
CERTSVC_ISSUER_EMAIL_ADDRESS,
RUNNER_TEST(T01053_cert_get_field_other)
{
CertSvcCertificate cert;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
- TestData::certFullField.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::certFullField.c_str()),
+ TestData::certFullField.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
_get_string_field_and_check(
cert,
CERTSVC_VERSION,
"1");
-
_get_string_field_and_check(
cert,
CERTSVC_SERIAL_NUMBER,
"a9:76:e0:81:e5:37:2b:98");
-
_get_string_field_and_check(
cert,
CERTSVC_KEY_ALGO,
"rsaEncryption");
-
_get_string_field_and_check(
cert,
CERTSVC_SIGNATURE_ALGORITHM,
"sha256WithRSAEncryption");
-
_get_string_field_and_check(
cert,
CERTSVC_KEY,
RUNNER_TEST(T0106_chain_sort)
{
CertSvcCertificate cert1, cert2, cert3;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::certEE.c_str()),
- TestData::certEE.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert1);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::certEE.c_str()),
+ TestData::certEE.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert1);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
- TestData::google2nd.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert2);
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::google2nd.c_str()),
+ TestData::google2nd.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert2);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
- TestData::googleCA.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert3);
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
+ TestData::googleCA.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert3);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
CertSvcCertificate collection[3];
collection[0] = cert1;
collection[1] = cert3;
collection[2] = cert2;
-
- RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == certsvc_certificate_chain_sort(collection, 3), "FAIL TO SORT CERTIFICATE");
-
+ RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == certsvc_certificate_chain_sort(collection, 3),
+ "FAIL TO SORT CERTIFICATE");
RUNNER_ASSERT_MSG(
(memcmp(&collection[2], &cert3, sizeof(CertSvcCertificate)) == 0
- && memcmp(&collection[1], &cert2, sizeof(CertSvcCertificate)) == 0
- && memcmp(&collection[0], &cert1, sizeof(CertSvcCertificate)) == 0),
+ && memcmp(&collection[1], &cert2, sizeof(CertSvcCertificate)) == 0
+ && memcmp(&collection[0], &cert1, sizeof(CertSvcCertificate)) == 0),
"certsvc_certificate_chain_sort success but it's not sorted really.");
-
collection[0] = cert1;
collection[1] = cert3;
-
RUNNER_ASSERT_MSG(CERTSVC_FAIL == certsvc_certificate_chain_sort(collection, 2),
- "certsvc_certificate_chain_sort must be failed");
+ "certsvc_certificate_chain_sort must be failed");
}
RUNNER_TEST_GROUP_INIT(T0200_CAPI_CERTIFICATE_VERIFY)
RUNNER_TEST(T0201_message_verify_dsa_sha1)
{
CertSvcString msgb64, sigb64, msg, sig;
-
int result = certsvc_string_new(
- vinstance,
- TestData::magda.message.c_str(),
- TestData::magda.message.size(),
- &msgb64);
+ vinstance,
+ TestData::magda.message.c_str(),
+ TestData::magda.message.size(),
+ &msgb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading messsage.");
-
result = certsvc_string_new(vinstance,
- TestData::magda.signature.c_str(),
- TestData::magda.signature.size(),
- &sigb64);
+ TestData::magda.signature.c_str(),
+ TestData::magda.signature.size(),
+ &sigb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading signature.");
-
CertSvcCertificate cert;
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::magda.certificate.c_str()),
- TestData::magda.certificate.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::magda.certificate.c_str()),
+ TestData::magda.certificate.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
result = certsvc_base64_decode(msgb64, &msg);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
result = certsvc_base64_decode(sigb64, &sig);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
int status;
result = certsvc_message_verify(cert, msg, sig, "sha1", &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in verify message.");
RUNNER_ASSERT_MSG(status == CERTSVC_TRUE, "Error in verify message.");
}
RUNNER_TEST(T0202_message_verify_rsa_sha1)
{
CertSvcString msgb64, sigb64, msg, sig;
-
int result = certsvc_string_new(
- vinstance,
- TestData::filipSHA1.message.c_str(),
- TestData::filipSHA1.message.size(),
- &msgb64);
+ vinstance,
+ TestData::filipSHA1.message.c_str(),
+ TestData::filipSHA1.message.size(),
+ &msgb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading messsage.");
-
result = certsvc_string_new(
- vinstance,
- TestData::filipSHA1.signature.c_str(),
- TestData::filipSHA1.signature.size(),
- &sigb64);
+ vinstance,
+ TestData::filipSHA1.signature.c_str(),
+ TestData::filipSHA1.signature.size(),
+ &sigb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading signature.");
-
CertSvcCertificate cert;
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::filipSHA1.certificate.c_str()),
- TestData::filipSHA1.certificate.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::filipSHA1.certificate.c_str()),
+ TestData::filipSHA1.certificate.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
result = certsvc_base64_decode(msgb64, &msg);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
result = certsvc_base64_decode(sigb64, &sig);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
int status;
result = certsvc_message_verify(cert, msg, sig, "sha1", &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in verify message.");
RUNNER_ASSERT_MSG(status == CERTSVC_SUCCESS, "Error in verify message.");
-
std::string invalidMessage("q3plZ28gdHUgc3p1a2Fzej8K");
-
result = certsvc_string_new(
- vinstance,
- invalidMessage.c_str(),
- invalidMessage.size(),
- &msgb64);
+ vinstance,
+ invalidMessage.c_str(),
+ invalidMessage.size(),
+ &msgb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading messsage.");
-
result = certsvc_base64_decode(msgb64, &msg);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
result = certsvc_message_verify(cert, msg, sig, "sha1", &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in verify message.");
RUNNER_ASSERT_MSG(status == CERTSVC_INVALID_SIGNATURE, "Error in verify message.");
}
RUNNER_TEST(T0203_message_verify_rsa_sha256)
{
CertSvcString msgb64, sigb64, msg, sig;
-
int result = certsvc_string_new(
- vinstance,
- TestData::filipSHA256.message.c_str(),
- TestData::filipSHA256.message.size(),
- &msgb64);
+ vinstance,
+ TestData::filipSHA256.message.c_str(),
+ TestData::filipSHA256.message.size(),
+ &msgb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading messsage.");
-
result = certsvc_string_new(
- vinstance,
- TestData::filipSHA256.signature.c_str(),
- TestData::filipSHA256.signature.size(),
- &sigb64);
+ vinstance,
+ TestData::filipSHA256.signature.c_str(),
+ TestData::filipSHA256.signature.size(),
+ &sigb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading signature.");
-
CertSvcCertificate cert;
-
result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::filipSHA256.certificate.c_str()),
- TestData::filipSHA256.certificate.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::filipSHA256.certificate.c_str()),
+ TestData::filipSHA256.certificate.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
result = certsvc_base64_decode(msgb64, &msg);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
result = certsvc_base64_decode(sigb64, &sig);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
int status;
result = certsvc_message_verify(cert, msg, sig, "sha256", &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in verify message.");
RUNNER_ASSERT_MSG(status == CERTSVC_SUCCESS, "Error in verify message.");
-
std::string invalidMessage("q3plZ28gdHUgc3p1a2Fzej8K");
-
result = certsvc_string_new(
- vinstance,
- invalidMessage.c_str(),
- invalidMessage.size(),
- &msgb64);
+ vinstance,
+ invalidMessage.c_str(),
+ invalidMessage.size(),
+ &msgb64);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading messsage.");
-
result = certsvc_base64_decode(msgb64, &msg);
RUNNER_ASSERT_MSG(result == CERTSVC_TRUE, "Error in decoding base64.");
-
result = certsvc_message_verify(cert, msg, sig, "sha256", &status);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in verify message.");
RUNNER_ASSERT_MSG(status == CERTSVC_INVALID_SIGNATURE, "Error in verify message.");
}
{
const int MAXC = 3;
CertSvcCertificate certificate[MAXC];
-
size_t certCount = 0;
+
for (auto &cert : TestData::certChain)
RUNNER_ASSERT_MSG(
CERTSVC_SUCCESS ==
- certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(cert.c_str()),
- cert.size(),
- CERTSVC_FORM_DER_BASE64,
- &certificate[certCount++]),
+ certsvc_certificate_new_from_memory(
+ vinstance,
+ reinterpret_cast<const unsigned char *>(cert.c_str()),
+ cert.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &certificate[certCount++]),
"Error reading certificate");
int status;
- int result = certsvc_certificate_verify(certificate[0], &certificate[1], MAXC-1, NULL, 0, &status);
+ int result = certsvc_certificate_verify(certificate[0], &certificate[1], MAXC - 1, NULL, 0,
+ &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == status, "Error in certificate verification process.");
-
- result = certsvc_certificate_verify(certificate[0], certificate, MAXC-1, NULL, 0, &status);
+ result = certsvc_certificate_verify(certificate[0], certificate, MAXC - 1, NULL, 0, &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_FAIL == status, "Error in certificate verification process.");
-
result = certsvc_certificate_verify(certificate[0], certificate, 1, certificate, MAXC, &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_FAIL == status, "Error in certificate verification process.");
-
result = certsvc_certificate_verify(certificate[0], &certificate[2], 1, certificate, MAXC, &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == status, "Error in certificate verification process.");
-
// certsvc_certificate_verify_with_caflag
- result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC, NULL, 0, &status);
+ result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC, NULL, 0,
+ &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == status, "Error in certificate verification process.");
-
- result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC-1, NULL, 0, &status);
+ result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC - 1, NULL, 0,
+ &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_FAIL == status, "Error in certificate verification process.");
-
- result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, 1, certificate, MAXC, &status);
+ result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, 1, certificate, MAXC,
+ &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_FAIL == status, "Error in certificate verification process.");
-
- result = certsvc_certificate_verify_with_caflag(certificate[0], &certificate[2], 1, certificate, MAXC, &status);
+ result = certsvc_certificate_verify_with_caflag(certificate[0], &certificate[2], 1, certificate,
+ MAXC, &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == status, "Error in certificate verification process.");
}
{
const int MAXC = 2;
CertSvcCertificate certificate[MAXC];
-
size_t certCount = 0;
+
for (auto &cert : TestData::certChainSelfSigned)
RUNNER_ASSERT_MSG(
CERTSVC_SUCCESS ==
- certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(cert.c_str()),
- cert.size(),
- CERTSVC_FORM_DER_BASE64,
- &certificate[certCount++]),
+ certsvc_certificate_new_from_memory(
+ vinstance,
+ reinterpret_cast<const unsigned char *>(cert.c_str()),
+ cert.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &certificate[certCount++]),
"Error reading certificate");
int status;
int result = certsvc_certificate_verify(certificate[0], certificate, MAXC, NULL, 0, &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == status, "Error in certificate verification process.");
-
- result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC, NULL, 0, &status);
+ result = certsvc_certificate_verify_with_caflag(certificate[0], certificate, MAXC, NULL, 0,
+ &status);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certificate verification function.");
RUNNER_ASSERT_MSG(CERTSVC_FAIL == status, "Error in certificate verification process.");
}
"DnMrR0ZNRPgeSCiVLax1bkHxcvW74WchdKIb24ZtAsFwyrsmUCRV842YHdfddjo6\n"
"xgUu7B8n7hQeV3EADh6ft/lE8nalzAl9tALTxAmLtYvEYA7thvDoKi1k7bN48izL\n"
"gS9G4WEAUg==";
-
CertSvcInstance instance;
CertSvcCertificate certificate;
int retval;
-
RUNNER_ASSERT_MSG(
(retval = certsvc_instance_new(&instance)) == CERTSVC_SUCCESS,
"Failed to certsvc_instance_new. retval:" << retval);
-
RUNNER_ASSERT_MSG(
(retval = certsvc_certificate_new_from_memory(
- instance,
- (const unsigned char *)tizen_distributor_root_ca_partner_der_base64,
- strlen(tizen_distributor_root_ca_partner_der_base64),
- CERTSVC_FORM_DER_BASE64,
- &certificate) == CERTSVC_SUCCESS),
+ instance,
+ (const unsigned char *)tizen_distributor_root_ca_partner_der_base64,
+ strlen(tizen_distributor_root_ca_partner_der_base64),
+ CERTSVC_FORM_DER_BASE64,
+ &certificate) == CERTSVC_SUCCESS),
"Failed to certsvc_certificate_new_from_memory. retval: " << retval);
-
CertSvcVisibility visibility;
RUNNER_ASSERT_MSG(
(retval == certsvc_certificate_get_visibility(certificate, &visibility)) == CERTSVC_SUCCESS,
"Failed to certsvc_certificate_get_visibility. retval: " << retval);
-
RUNNER_ASSERT_MSG(
visibility == CERTSVC_VISIBILITY_PARTNER,
"returned visibility should be partner(" << CERTSVC_VISIBILITY_PARTNER
- << ") but returned(" << visibility << ")");
-
+ << ") but returned(" << visibility << ")");
certsvc_instance_free(instance);
}
RUNNER_TEST(T0301_dup_x509)
{
const int MAXB = 1024;
-
CertSvcCertificate certificate;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
- TestData::googleCA.size(),
- CERTSVC_FORM_DER_BASE64,
- &certificate);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
+ TestData::googleCA.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &certificate);
X509 *x509 = NULL;
result = certsvc_certificate_dup_x509(certificate, &x509);
-
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in certsvc_certificate_dup_x509.");
RUNNER_ASSERT_MSG(x509 != NULL, "Error in certsvc_certificate_dup_x509.");
-
X509_NAME *name = X509_get_subject_name(x509);
char buffer[MAXB];
X509_NAME_oneline(name, buffer, MAXB);
-
RUNNER_ASSERT_MSG(buffer == TestData::subjectGoogleCA, "Content does not match");
-
certsvc_certificate_free_x509(x509);
}
RUNNER_TEST(T0302_dup_pubkey_der)
{
CertSvcCertificate cert;
-
int result = certsvc_certificate_new_from_memory(
- vinstance,
- reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
- TestData::googleCA.size(),
- CERTSVC_FORM_DER_BASE64,
- &cert);
-
+ vinstance,
+ reinterpret_cast<const unsigned char *>(TestData::googleCA.c_str()),
+ TestData::googleCA.size(),
+ CERTSVC_FORM_DER_BASE64,
+ &cert);
RUNNER_ASSERT_MSG(CERTSVC_SUCCESS == result, "Error in reading certificate.");
-
unsigned char *pubkey = NULL;
size_t len = 0;
result = certsvc_certificate_dup_pubkey_der(cert, &pubkey, &len);
-
RUNNER_ASSERT_MSG(
CERTSVC_SUCCESS == result,
"Error in certsvc_certificate_dup_pubkey_der. result : " << result);
-
RUNNER_ASSERT_MSG(
d2i_PUBKEY(NULL, const_cast<const unsigned char **>(&pubkey), static_cast<long>(len)) != NULL,
"Error in converting returned der pubkey to internal.");
class BinaryQueue;
typedef std::auto_ptr<BinaryQueue> BinaryQueueAutoPtr;
-class AbstractInput
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, ReadFailed)
- };
+class AbstractInput {
+public:
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, ReadFailed)
+ };
- public:
- virtual ~AbstractInput() {}
+public:
+ virtual ~AbstractInput() {}
- /**
- * Read binary data from input
- * If no data is available method returns NULL buffer.
- * In case connection was successfuly close, method returns empty buffer
- *
- * @param[in] size Maximum number of bytes to read from input
- * @return Buffer containing read bytes
- * @throw ReadFailed
- */
- virtual BinaryQueueAutoPtr Read(size_t size) = 0;
+ /**
+ * Read binary data from input
+ * If no data is available method returns NULL buffer.
+ * In case connection was successfuly close, method returns empty buffer
+ *
+ * @param[in] size Maximum number of bytes to read from input
+ * @return Buffer containing read bytes
+ * @throw ReadFailed
+ */
+ virtual BinaryQueueAutoPtr Read(size_t size) = 0;
};
} // namespace VcoreDPL
namespace VcoreDPL {
class AbstractInputOutput :
- public AbstractInput,
- public AbstractOutput
-{
- public:
- virtual ~AbstractInputOutput() {}
+ public AbstractInput,
+ public AbstractOutput {
+public:
+ virtual ~AbstractInputOutput() {}
};
} // namespace VcoreDPL
class BinaryQueue;
typedef std::auto_ptr<BinaryQueue> BinaryQueueAutoPtr;
-class AbstractOutput
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, WriteFailed)
- };
+class AbstractOutput {
+public:
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, WriteFailed)
+ };
- public:
- virtual ~AbstractOutput() {}
+public:
+ virtual ~AbstractOutput() {}
- /**
- * Write binary data to output
- * If output is blocked, Write returns zero, if instance is a type of
- * WaitableAbstractOutput one can wait for writability then
- *
- * @param[in] buffer Input buffer with data to be written
- * @param[in] bufferSize Maximum number of bytes to write from buffer
- * @return Number of bytes success successfuly written or zero if output is
- * blocked
- * @throw WriteFailed
- */
- virtual size_t Write(const BinaryQueue &buffer, size_t bufferSize) = 0;
+ /**
+ * Write binary data to output
+ * If output is blocked, Write returns zero, if instance is a type of
+ * WaitableAbstractOutput one can wait for writability then
+ *
+ * @param[in] buffer Input buffer with data to be written
+ * @param[in] bufferSize Maximum number of bytes to write from buffer
+ * @return Number of bytes success successfuly written or zero if output is
+ * blocked
+ * @throw WriteFailed
+ */
+ virtual size_t Write(const BinaryQueue &buffer, size_t bufferSize) = 0;
};
} // namespace VcoreDPL
// Do not call directly
// Always use Assert macro
void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function) __attribute__ ((__noreturn__));
+ const char *file,
+ int line,
+ const char *function) __attribute__((__noreturn__));
} // namespace VcoreDPL
#define Assert(Condition) \
-do { \
- if (!(Condition)) { \
- VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \
- } \
-} while (0)
+ do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ } while (0)
#define AssertMsg(Condition, Msg) \
- do { \
- if (!(Condition)) { \
- VcoreDPL::AssertProc( \
- (std::string(std::string(#Condition)+" ") + Msg).c_str(), \
- __FILE__, __LINE__, __FUNCTION__); \
- } \
- } while (0)
+ do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc( \
+ (std::string(std::string(#Condition)+" ") + Msg).c_str(), \
+ __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ } while (0)
#endif // DPL_ASSERT_H
* @todo Add optimized implementation for FlattenConsume
*/
class BinaryQueue :
- public AbstractInputOutput
-{
- public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, OutOfData)
- };
-
- typedef void (*BufferDeleter)(const void *buffer, size_t bufferSize,
- void *userParam);
- static void BufferDeleterFree(const void *buffer,
- size_t bufferSize,
- void *userParam);
-
- class BucketVisitor
- {
- public:
- /**
- * Destructor
- */
- virtual ~BucketVisitor();
-
- /**
- * Visit bucket
- *
- * @return none
- * @param[in] buffer Constant pointer to bucket data buffer
- * @param[in] bufferSize Number of bytes in bucket
- */
- virtual void OnVisitBucket(const void *buffer, size_t bufferSize) = 0;
- };
-
- private:
- struct Bucket :
- private Noncopyable
- {
- const void *buffer;
- const void *ptr;
- size_t size;
- size_t left;
-
- BufferDeleter deleter;
- void *param;
-
- Bucket(const void *buffer,
- size_t bufferSize,
- BufferDeleter deleter,
- void *userParam);
- virtual ~Bucket();
- };
-
- typedef std::list<Bucket *> BucketList;
- BucketList m_buckets;
- size_t m_size;
-
- static void DeleteBucket(Bucket *bucket);
-
- class BucketVisitorCall
- {
- private:
- BucketVisitor *m_visitor;
-
- public:
- BucketVisitorCall(BucketVisitor *visitor);
- virtual ~BucketVisitorCall();
-
- void operator()(Bucket *bucket) const;
- };
-
- public:
- /**
- * Construct empty binary queue
- */
- BinaryQueue();
-
- /**
- * Construct binary queue via bare copy of other binary queue
- *
- * @param[in] other Other binary queue to copy from
- * @warning One cannot assume that bucket structure is preserved during copy
- */
- BinaryQueue(const BinaryQueue &other);
-
- /**
- * Destructor
- */
- virtual ~BinaryQueue();
-
- /**
- * Construct binary queue via bare copy of other binary queue
- *
- * @param[in] other Other binary queue to copy from
- * @warning One cannot assume that bucket structure is preserved during copy
- */
- BinaryQueue &operator=(const BinaryQueue &other);
-
- /**
- * Append copy of @a bufferSize bytes from memory pointed by @a buffer
- * to the end of binary queue. Uses default deleter based on free.
- *
- * @return none
- * @param[in] buffer Pointer to buffer to copy data from
- * @param[in] bufferSize Number of bytes to copy
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- * @see BinaryQueue::BufferDeleterFree
- */
- void AppendCopy(const void *buffer, size_t bufferSize);
-
- /**
- * Append @a bufferSize bytes from memory pointed by @a buffer
- * to the end of binary queue. Uses custom provided deleter.
- * Responsibility for deleting provided buffer is transfered to BinaryQueue.
- *
- * @return none
- * @param[in] buffer Pointer to data buffer
- * @param[in] bufferSize Number of bytes available in buffer
- * @param[in] deleter Pointer to deleter procedure used to free provided
- * buffer
- * @param[in] userParam User parameter passed to deleter routine
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- */
- void AppendUnmanaged(
- const void *buffer,
- size_t bufferSize,
- BufferDeleter deleter =
- &BinaryQueue::BufferDeleterFree,
- void *userParam = NULL);
-
- /**
- * Append copy of other binary queue to the end of this binary queue
- *
- * @return none
- * @param[in] other Constant reference to other binary queue to copy data
- * from
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- * @warning One cannot assume that bucket structure is preserved during copy
- */
- void AppendCopyFrom(const BinaryQueue &other);
-
- /**
- * Move bytes from other binary queue to the end of this binary queue.
- * This also removes all bytes from other binary queue.
- * This method is designed to be as fast as possible (only pointer swaps)
- * and is suggested over making copies of binary queues.
- * Bucket structure is preserved after operation.
- *
- * @return none
- * @param[in] other Reference to other binary queue to move data from
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- */
- void AppendMoveFrom(BinaryQueue &other);
-
- /**
- * Append copy of binary queue to the end of other binary queue
- *
- * @return none
- * @param[in] other Constant reference to other binary queue to copy data to
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- * @warning One cannot assume that bucket structure is preserved during copy
- */
- void AppendCopyTo(BinaryQueue &other) const;
-
- /**
- * Move bytes from binary queue to the end of other binary queue.
- * This also removes all bytes from binary queue.
- * This method is designed to be as fast as possible (only pointer swaps)
- * and is suggested over making copies of binary queues.
- * Bucket structure is preserved after operation.
- *
- * @return none
- * @param[in] other Reference to other binary queue to move data to
- * @exception std::bad_alloc Cannot allocate memory to hold additional data
- */
- void AppendMoveTo(BinaryQueue &other);
-
- /**
- * Retrieve total size of all data contained in binary queue
- *
- * @return Number of bytes in binary queue
- */
- size_t Size() const;
-
- /**
- * Remove all data from binary queue
- *
- * @return none
- */
- void Clear();
-
- /**
- * Check if binary queue is empty
- *
- * @return true if binary queue is empty, false otherwise
- */
- bool Empty() const;
-
- /**
- * Remove @a size bytes from beginning of binary queue
- *
- * @return none
- * @param[in] size Number of bytes to remove
- * @exception BinaryQueue::Exception::OutOfData Number of bytes is larger
- * than available bytes in binary queue
- */
- void Consume(size_t size);
-
- /**
- * Retrieve @a bufferSize bytes from beginning of binary queue and copy them
- * to user supplied buffer
- *
- * @return none
- * @param[in] buffer Pointer to user buffer to receive bytes
- * @param[in] bufferSize Size of user buffer pointed by @a buffer
- * @exception BinaryQueue::Exception::OutOfData Number of bytes to flatten
- * is larger than available bytes in binary queue
- */
- void Flatten(void *buffer, size_t bufferSize) const;
-
- /**
- * Retrieve @a bufferSize bytes from beginning of binary queue, copy them
- * to user supplied buffer, and remove from binary queue
- *
- * @return none
- * @param[in] buffer Pointer to user buffer to receive bytes
- * @param[in] bufferSize Size of user buffer pointed by @a buffer
- * @exception BinaryQueue::Exception::OutOfData Number of bytes to flatten
- * is larger than available bytes in binary queue
- */
- void FlattenConsume(void *buffer, size_t bufferSize);
-
- /**
- * Visit each buffer with data using visitor object
- *
- * @return none
- * @param[in] visitor Pointer to bucket visitor
- * @see BinaryQueue::BucketVisitor
- */
- void VisitBuckets(BucketVisitor *visitor) const;
-
- /**
- * IAbstractInput interface
- */
- virtual BinaryQueueAutoPtr Read(size_t size);
-
- /**
- * IAbstractOutput interface
- */
- virtual size_t Write(const BinaryQueue &buffer, size_t bufferSize);
+ public AbstractInputOutput {
+public:
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, OutOfData)
+ };
+
+ typedef void (*BufferDeleter)(const void *buffer, size_t bufferSize,
+ void *userParam);
+ static void BufferDeleterFree(const void *buffer,
+ size_t bufferSize,
+ void *userParam);
+
+ class BucketVisitor {
+ public:
+ /**
+ * Destructor
+ */
+ virtual ~BucketVisitor();
+
+ /**
+ * Visit bucket
+ *
+ * @return none
+ * @param[in] buffer Constant pointer to bucket data buffer
+ * @param[in] bufferSize Number of bytes in bucket
+ */
+ virtual void OnVisitBucket(const void *buffer, size_t bufferSize) = 0;
+ };
+
+private:
+ struct Bucket :
+ private Noncopyable {
+ const void *buffer;
+ const void *ptr;
+ size_t size;
+ size_t left;
+
+ BufferDeleter deleter;
+ void *param;
+
+ Bucket(const void *buffer,
+ size_t bufferSize,
+ BufferDeleter deleter,
+ void *userParam);
+ virtual ~Bucket();
+ };
+
+ typedef std::list<Bucket *> BucketList;
+ BucketList m_buckets;
+ size_t m_size;
+
+ static void DeleteBucket(Bucket *bucket);
+
+ class BucketVisitorCall {
+ private:
+ BucketVisitor *m_visitor;
+
+ public:
+ BucketVisitorCall(BucketVisitor *visitor);
+ virtual ~BucketVisitorCall();
+
+ void operator()(Bucket *bucket) const;
+ };
+
+public:
+ /**
+ * Construct empty binary queue
+ */
+ BinaryQueue();
+
+ /**
+ * Construct binary queue via bare copy of other binary queue
+ *
+ * @param[in] other Other binary queue to copy from
+ * @warning One cannot assume that bucket structure is preserved during copy
+ */
+ BinaryQueue(const BinaryQueue &other);
+
+ /**
+ * Destructor
+ */
+ virtual ~BinaryQueue();
+
+ /**
+ * Construct binary queue via bare copy of other binary queue
+ *
+ * @param[in] other Other binary queue to copy from
+ * @warning One cannot assume that bucket structure is preserved during copy
+ */
+ BinaryQueue &operator=(const BinaryQueue &other);
+
+ /**
+ * Append copy of @a bufferSize bytes from memory pointed by @a buffer
+ * to the end of binary queue. Uses default deleter based on free.
+ *
+ * @return none
+ * @param[in] buffer Pointer to buffer to copy data from
+ * @param[in] bufferSize Number of bytes to copy
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ * @see BinaryQueue::BufferDeleterFree
+ */
+ void AppendCopy(const void *buffer, size_t bufferSize);
+
+ /**
+ * Append @a bufferSize bytes from memory pointed by @a buffer
+ * to the end of binary queue. Uses custom provided deleter.
+ * Responsibility for deleting provided buffer is transfered to BinaryQueue.
+ *
+ * @return none
+ * @param[in] buffer Pointer to data buffer
+ * @param[in] bufferSize Number of bytes available in buffer
+ * @param[in] deleter Pointer to deleter procedure used to free provided
+ * buffer
+ * @param[in] userParam User parameter passed to deleter routine
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ */
+ void AppendUnmanaged(
+ const void *buffer,
+ size_t bufferSize,
+ BufferDeleter deleter =
+ &BinaryQueue::BufferDeleterFree,
+ void *userParam = NULL);
+
+ /**
+ * Append copy of other binary queue to the end of this binary queue
+ *
+ * @return none
+ * @param[in] other Constant reference to other binary queue to copy data
+ * from
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ * @warning One cannot assume that bucket structure is preserved during copy
+ */
+ void AppendCopyFrom(const BinaryQueue &other);
+
+ /**
+ * Move bytes from other binary queue to the end of this binary queue.
+ * This also removes all bytes from other binary queue.
+ * This method is designed to be as fast as possible (only pointer swaps)
+ * and is suggested over making copies of binary queues.
+ * Bucket structure is preserved after operation.
+ *
+ * @return none
+ * @param[in] other Reference to other binary queue to move data from
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ */
+ void AppendMoveFrom(BinaryQueue &other);
+
+ /**
+ * Append copy of binary queue to the end of other binary queue
+ *
+ * @return none
+ * @param[in] other Constant reference to other binary queue to copy data to
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ * @warning One cannot assume that bucket structure is preserved during copy
+ */
+ void AppendCopyTo(BinaryQueue &other) const;
+
+ /**
+ * Move bytes from binary queue to the end of other binary queue.
+ * This also removes all bytes from binary queue.
+ * This method is designed to be as fast as possible (only pointer swaps)
+ * and is suggested over making copies of binary queues.
+ * Bucket structure is preserved after operation.
+ *
+ * @return none
+ * @param[in] other Reference to other binary queue to move data to
+ * @exception std::bad_alloc Cannot allocate memory to hold additional data
+ */
+ void AppendMoveTo(BinaryQueue &other);
+
+ /**
+ * Retrieve total size of all data contained in binary queue
+ *
+ * @return Number of bytes in binary queue
+ */
+ size_t Size() const;
+
+ /**
+ * Remove all data from binary queue
+ *
+ * @return none
+ */
+ void Clear();
+
+ /**
+ * Check if binary queue is empty
+ *
+ * @return true if binary queue is empty, false otherwise
+ */
+ bool Empty() const;
+
+ /**
+ * Remove @a size bytes from beginning of binary queue
+ *
+ * @return none
+ * @param[in] size Number of bytes to remove
+ * @exception BinaryQueue::Exception::OutOfData Number of bytes is larger
+ * than available bytes in binary queue
+ */
+ void Consume(size_t size);
+
+ /**
+ * Retrieve @a bufferSize bytes from beginning of binary queue and copy them
+ * to user supplied buffer
+ *
+ * @return none
+ * @param[in] buffer Pointer to user buffer to receive bytes
+ * @param[in] bufferSize Size of user buffer pointed by @a buffer
+ * @exception BinaryQueue::Exception::OutOfData Number of bytes to flatten
+ * is larger than available bytes in binary queue
+ */
+ void Flatten(void *buffer, size_t bufferSize) const;
+
+ /**
+ * Retrieve @a bufferSize bytes from beginning of binary queue, copy them
+ * to user supplied buffer, and remove from binary queue
+ *
+ * @return none
+ * @param[in] buffer Pointer to user buffer to receive bytes
+ * @param[in] bufferSize Size of user buffer pointed by @a buffer
+ * @exception BinaryQueue::Exception::OutOfData Number of bytes to flatten
+ * is larger than available bytes in binary queue
+ */
+ void FlattenConsume(void *buffer, size_t bufferSize);
+
+ /**
+ * Visit each buffer with data using visitor object
+ *
+ * @return none
+ * @param[in] visitor Pointer to bucket visitor
+ * @see BinaryQueue::BucketVisitor
+ */
+ void VisitBuckets(BucketVisitor *visitor) const;
+
+ /**
+ * IAbstractInput interface
+ */
+ virtual BinaryQueueAutoPtr Read(size_t size);
+
+ /**
+ * IAbstractOutput interface
+ */
+ virtual size_t Write(const BinaryQueue &buffer, size_t bufferSize);
};
/**
namespace VcoreDPL {
namespace Colors {
namespace Text {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
} //namespace Text
namespace Html {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
} //namespace Html
} //namespace Colors
} //namespace VcoreDPL
namespace VcoreDPL {
void LogUnhandledException(const std::string &str);
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function);
+ const char *filename,
+ int line,
+ const char *function);
}
namespace VcoreDPL {
class Exception {
private:
- static unsigned int m_exceptionCount;
- static Exception* m_lastException;
- static void (*m_terminateHandler)();
-
- static void AddRef(Exception* exception)
- {
- if (!m_exceptionCount) {
- m_terminateHandler = std::set_terminate(&TerminateHandler);
- }
-
- ++m_exceptionCount;
- m_lastException = exception;
- }
-
- static void UnRef(Exception* e)
- {
- if (m_lastException == e) {
- m_lastException = NULL;
- }
-
- --m_exceptionCount;
-
- if (!m_exceptionCount) {
- std::set_terminate(m_terminateHandler);
- m_terminateHandler = NULL;
- }
- }
-
- static void TerminateHandler()
- {
- if (m_lastException != NULL) {
- DisplayKnownException(*m_lastException);
- abort();
- } else {
- DisplayUnknownException();
- abort();
- }
- }
-
- Exception *m_reason;
- std::string m_path;
- std::string m_function;
- int m_line;
+ static unsigned int m_exceptionCount;
+ static Exception *m_lastException;
+ static void (*m_terminateHandler)();
+
+ static void AddRef(Exception *exception)
+ {
+ if (!m_exceptionCount) {
+ m_terminateHandler = std::set_terminate(&TerminateHandler);
+ }
+
+ ++m_exceptionCount;
+ m_lastException = exception;
+ }
+
+ static void UnRef(Exception *e)
+ {
+ if (m_lastException == e) {
+ m_lastException = NULL;
+ }
+
+ --m_exceptionCount;
+
+ if (!m_exceptionCount) {
+ std::set_terminate(m_terminateHandler);
+ m_terminateHandler = NULL;
+ }
+ }
+
+ static void TerminateHandler()
+ {
+ if (m_lastException != NULL) {
+ DisplayKnownException(*m_lastException);
+ abort();
+ } else {
+ DisplayUnknownException();
+ abort();
+ }
+ }
+
+ Exception *m_reason;
+ std::string m_path;
+ std::string m_function;
+ int m_line;
protected:
- std::string m_message;
- std::string m_className;
+ std::string m_message;
+ std::string m_className;
public:
- static std::string KnownExceptionToString(const Exception &e)
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
- message << "\033[1;33mException trace:\033[m\n\n";
- message << e.DumpToString();
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static std::string UnknownExceptionToString()
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static void DisplayKnownException(const Exception& e)
- {
- LogUnhandledException(KnownExceptionToString(e).c_str());
- }
-
- static void DisplayUnknownException()
- {
- LogUnhandledException(UnknownExceptionToString().c_str());
- }
-
- Exception(const Exception &other)
- {
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
- }
-
- const Exception &operator =(const Exception &other)
- {
- if (this == &other) {
- return *this;
- }
-
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
-
- return *this;
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const std::string &message) :
- m_reason(NULL),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const Exception &reason,
- const std::string &message) :
- m_reason(new Exception(reason)),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- virtual ~Exception() throw()
- {
- if (m_reason != NULL) {
- delete m_reason;
- m_reason = NULL;
- }
-
- UnRef(this);
- }
-
- void Dump() const
- {
- // Show reason first
- if (m_reason != NULL) {
- m_reason->Dump();
- }
-
- // Afterward, dump exception
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file, m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
- }
-
- std::string DumpToString() const
- {
- std::string ret;
- if (m_reason != NULL) {
- ret = m_reason->DumpToString();
- }
-
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- char buf[1024];
- snprintf(buf,
- sizeof(buf),
- "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file,
- m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
-
- buf[sizeof(buf) - 1] = '\n';
- ret += buf;
-
- return ret;
- }
-
- Exception *GetReason() const
- {
- return m_reason;
- }
-
- std::string GetPath() const
- {
- return m_path;
- }
-
- std::string GetFunction() const
- {
- return m_function;
- }
-
- int GetLine() const
- {
- return m_line;
- }
-
- std::string GetMessage() const
- {
- return m_message;
- }
-
- std::string GetClassName() const
- {
- return m_className;
- }
+ static std::string KnownExceptionToString(const Exception &e)
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;33mException trace:\033[m\n\n";
+ message << e.DumpToString();
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static std::string UnknownExceptionToString()
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static void DisplayKnownException(const Exception &e)
+ {
+ LogUnhandledException(KnownExceptionToString(e).c_str());
+ }
+
+ static void DisplayUnknownException()
+ {
+ LogUnhandledException(UnknownExceptionToString().c_str());
+ }
+
+ Exception(const Exception &other)
+ {
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ }
+
+ const Exception &operator =(const Exception &other)
+ {
+ if (this == &other) {
+ return *this;
+ }
+
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ return *this;
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const std::string &message) :
+ m_reason(NULL),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const Exception &reason,
+ const std::string &message) :
+ m_reason(new Exception(reason)),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ virtual ~Exception() throw()
+ {
+ if (m_reason != NULL) {
+ delete m_reason;
+ m_reason = NULL;
+ }
+
+ UnRef(this);
+ }
+
+ void Dump() const
+ {
+ // Show reason first
+ if (m_reason != NULL) {
+ m_reason->Dump();
+ }
+
+ // Afterward, dump exception
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file, m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ }
+
+ std::string DumpToString() const
+ {
+ std::string ret;
+
+ if (m_reason != NULL) {
+ ret = m_reason->DumpToString();
+ }
+
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ char buf[1024];
+ snprintf(buf,
+ sizeof(buf),
+ "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file,
+ m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ buf[sizeof(buf) - 1] = '\n';
+ ret += buf;
+ return ret;
+ }
+
+ Exception *GetReason() const
+ {
+ return m_reason;
+ }
+
+ std::string GetPath() const
+ {
+ return m_path;
+ }
+
+ std::string GetFunction() const
+ {
+ return m_function;
+ }
+
+ int GetLine() const
+ {
+ return m_line;
+ }
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+
+ std::string GetClassName() const
+ {
+ return m_className;
+ }
};
} // namespace VcoreDPL
#define Try try
#define Throw(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__)
#define ThrowMsg(ClassName, Message) \
- do \
- { \
- std::ostringstream dplLoggingStream; \
- dplLoggingStream << Message; \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
- } while (0)
+ do \
+ { \
+ std::ostringstream dplLoggingStream; \
+ dplLoggingStream << Message; \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
+ } while (0)
#define ReThrow(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
#define ReThrowMsg(ClassName, Message) \
- throw ClassName(__FILE__, \
- __FUNCTION__, \
- __LINE__, \
- _rethrown_exception, \
- Message)
+ throw ClassName(__FILE__, \
+ __FUNCTION__, \
+ __LINE__, \
+ _rethrown_exception, \
+ Message)
#define Catch(ClassName) \
- catch (const ClassName &_rethrown_exception)
+ catch (const ClassName &_rethrown_exception)
#define DECLARE_EXCEPTION_TYPE(BaseClass, Class) \
- class Class : public BaseClass { \
- public: \
- Class(const char *path, \
- const char *function, \
- int line, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, message) { \
- \
- BaseClass::m_className = #Class; \
- } \
- \
- Class(const char *path, \
- const char *function, \
- int line, \
- const VcoreDPL::Exception & reason, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, reason, message) { \
- BaseClass::m_className = #Class; \
- } \
- };
+ class Class : public BaseClass { \
+ public: \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, message) { \
+ \
+ BaseClass::m_className = #Class; \
+ } \
+ \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const VcoreDPL::Exception & reason, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, reason, message) { \
+ BaseClass::m_className = #Class; \
+ } \
+ };
#define UNHANDLED_EXCEPTION_HANDLER_BEGIN try
#define UNHANDLED_EXCEPTION_HANDLER_END \
- catch (const VcoreDPL::Exception &exception) \
- { \
- std::ostringstream msg; \
- msg << VcoreDPL::Exception::KnownExceptionToString(exception); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (std::exception& e) \
- { \
- std::ostringstream msg; \
- msg << e.what(); \
- msg << "\n"; \
- msg << VcoreDPL::Exception::UnknownExceptionToString(); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (...) \
- { \
- std::ostringstream msg; \
- msg << VcoreDPL::Exception::UnknownExceptionToString(); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- }
+ catch (const VcoreDPL::Exception &exception) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::KnownExceptionToString(exception); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (std::exception& e) \
+ { \
+ std::ostringstream msg; \
+ msg << e.what(); \
+ msg << "\n"; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (...) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ }
namespace VcoreDPL {
namespace CommonException {
* important messages.
*/
DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from
- // underlying libraries or
- // kernel
+// underlying libraries or
+// kernel
}
}
* Used to detect type of valid reference to value object.
*/
template <typename T>
-T& ValueReference(T& t)
+T &ValueReference(T &t)
{
- return(t);
+ return (t);
}
template <typename T>
-const T& ValueReference(const T& t)
+const T &ValueReference(const T &t)
{
- return(t);
+ return (t);
}
} //Private
} //DPL
#define DPL_FOREACH_IMPL(temporaryName, iterator, container) \
- __typeof__ (VcoreDPL::Private::ValueReference((container))) & \
- temporaryName = (container); \
- for (__typeof__ (temporaryName.begin())iterator = \
- temporaryName.begin(); \
- (iterator) != temporaryName.end(); ++iterator)
+ __typeof__(VcoreDPL::Private::ValueReference((container))) & \
+ temporaryName = (container); \
+ for (__typeof__(temporaryName.begin())iterator = \
+ temporaryName.begin(); \
+ (iterator) != temporaryName.end(); ++iterator)
#define FOREACH(iterator, container) \
- DPL_FOREACH_IMPL( \
- DPL_MACRO_CONCAT(foreachContainerReference, __COUNTER__), \
- iterator, \
- container)
+ DPL_FOREACH_IMPL( \
+ DPL_MACRO_CONCAT(foreachContainerReference, __COUNTER__), \
+ iterator, \
+ container)
#endif // DPL_FOREACH_H
#define FREE_DELETER_H
#include <cstdlib>
-namespace VcoreDPL
-{
-struct free_deleter
-{
- void operator()(void *p) { std::free(p); }
+namespace VcoreDPL {
+struct free_deleter {
+ void operator()(void *p)
+ {
+ std::free(p);
+ }
};
}// DPL
#endif // FREE_DELETER_H
template<typename TargetType, typename SourceType>
TargetType lexical_cast(const SourceType &data)
{
- TargetType result;
-
- std::ostringstream out;
- out << data;
-
- std::istringstream in(out.str());
- in >> result;
-
- return result;
+ TargetType result;
+ std::ostringstream out;
+ out << data;
+ std::istringstream in(out.str());
+ in >> result;
+ return result;
}
} // namespace VcoreDPL
#define DPL_NONCOPYABLE_H
namespace VcoreDPL {
-class Noncopyable
-{
- private:
- Noncopyable(const Noncopyable &);
- const Noncopyable &operator=(const Noncopyable &);
+class Noncopyable {
+private:
+ Noncopyable(const Noncopyable &);
+ const Noncopyable &operator=(const Noncopyable &);
- public:
- Noncopyable();
- virtual ~Noncopyable();
+public:
+ Noncopyable();
+ virtual ~Noncopyable();
};
} // namespace VcoreDPL
#include <dpl/scoped_resource.h>
namespace VcoreDPL {
-struct ScopedFClosePolicy
-{
- typedef FILE* Type;
- static Type NullValue()
- {
- return NULL;
- }
- static void Destroy(Type file)
- {
- if (file != NULL) {
- // Try to flush first
- if (TEMP_FAILURE_RETRY(fflush(file)) != 0)
- return;
+struct ScopedFClosePolicy {
+ typedef FILE *Type;
+ static Type NullValue()
+ {
+ return NULL;
+ }
+ static void Destroy(Type file)
+ {
+ if (file != NULL) {
+ // Try to flush first
+ if (TEMP_FAILURE_RETRY(fflush(file)) != 0)
+ return;
- // fclose cannot be retried, try to close once
- if (fclose(file) != 0)
- return;
- }
- }
+ // fclose cannot be retried, try to close once
+ if (fclose(file) != 0)
+ return;
+ }
+ }
};
-class ScopedFClose : public ScopedResource<ScopedFClosePolicy>
-{
- typedef ScopedFClosePolicy Policy;
- typedef ScopedResource<Policy> BaseType;
+class ScopedFClose : public ScopedResource<ScopedFClosePolicy> {
+ typedef ScopedFClosePolicy Policy;
+ typedef ScopedResource<Policy> BaseType;
- public:
- explicit ScopedFClose(FILE* argFileStream = Policy::NullValue()) :
- BaseType(argFileStream)
- {}
+public:
+ explicit ScopedFClose(FILE *argFileStream = Policy::NullValue()) :
+ BaseType(argFileStream)
+ {}
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename Class>
-struct ScopedFreePolicy
-{
- typedef Class* Type;
- static Type NullValue()
- {
- return NULL;
- }
- static void Destroy(Type ptr)
- {
- free(ptr);
- }
+struct ScopedFreePolicy {
+ typedef Class *Type;
+ static Type NullValue()
+ {
+ return NULL;
+ }
+ static void Destroy(Type ptr)
+ {
+ free(ptr);
+ }
};
template<typename Memory>
-class ScopedFree : public ScopedResource<ScopedFreePolicy<Memory> >
-{
- typedef ScopedFreePolicy<Memory> Policy;
- typedef ScopedResource<Policy> BaseType;
+class ScopedFree : public ScopedResource<ScopedFreePolicy<Memory>> {
+ typedef ScopedFreePolicy<Memory> Policy;
+ typedef ScopedResource<Policy> BaseType;
- public:
- explicit ScopedFree(Memory *ptr = Policy::NullValue()) : BaseType(ptr) { }
+public:
+ explicit ScopedFree(Memory *ptr = Policy::NullValue()) : BaseType(ptr) { }
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename ClassPolicy>
class ScopedResource :
- private Noncopyable
-{
- public:
- typedef typename ClassPolicy::Type ValueType;
- typedef ScopedResource<ClassPolicy> ThisType;
+ private Noncopyable {
+public:
+ typedef typename ClassPolicy::Type ValueType;
+ typedef ScopedResource<ClassPolicy> ThisType;
- protected:
- ValueType m_value;
+protected:
+ ValueType m_value;
- public:
- explicit ScopedResource(ValueType value) : m_value(value) { }
+public:
+ explicit ScopedResource(ValueType value) : m_value(value) { }
- ~ScopedResource()
- {
- ClassPolicy::Destroy(m_value);
- }
+ ~ScopedResource()
+ {
+ ClassPolicy::Destroy(m_value);
+ }
- ValueType Get() const
- {
- return m_value;
- }
+ ValueType Get() const
+ {
+ return m_value;
+ }
- void Reset(ValueType value = ClassPolicy::NullValue())
- {
- ClassPolicy::Destroy(m_value);
- m_value = value;
- }
+ void Reset(ValueType value = ClassPolicy::NullValue())
+ {
+ ClassPolicy::Destroy(m_value);
+ m_value = value;
+ }
- ValueType Release()
- {
- ValueType value = m_value;
- m_value = ClassPolicy::NullValue();
- return value;
- }
- typedef ValueType ThisType::*UnknownBoolType;
+ ValueType Release()
+ {
+ ValueType value = m_value;
+ m_value = ClassPolicy::NullValue();
+ return value;
+ }
+ typedef ValueType ThisType::*UnknownBoolType;
- operator UnknownBoolType() const
- {
- return m_value == ClassPolicy::NullValue() ?
- 0 : //0 is valid here because it converts to false
- &ThisType::m_value; //it converts to true
- }
+ operator UnknownBoolType() const
+ {
+ return m_value == ClassPolicy::NullValue() ?
+ 0 : //0 is valid here because it converts to false
+ &ThisType::m_value; //it converts to true
+ }
- bool operator !() const
- {
- return m_value == ClassPolicy::NullValue();
- }
+ bool operator !() const
+ {
+ return m_value == ClassPolicy::NullValue();
+ }
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename Class>
class Singleton :
- private Class
-{
- //
- // Note:
- //
- // To remove posibility of instantiating directly Class,
- // make Class' default constructor protected
- //
+ private Class {
+ //
+ // Note:
+ //
+ // To remove posibility of instantiating directly Class,
+ // make Class' default constructor protected
+ //
- private:
- Singleton()
- {}
+private:
+ Singleton()
+ {}
- static Singleton &InternalInstance();
+ static Singleton &InternalInstance();
- public:
- virtual ~Singleton()
- {}
+public:
+ virtual ~Singleton()
+ {}
- static Class &Instance();
+ static Class &Instance();
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename Class>
-Singleton<Class>& Singleton<Class>::InternalInstance()
+Singleton<Class> &Singleton<Class>::InternalInstance()
{
- static Singleton<Class> instance;
- return instance;
+ static Singleton<Class> instance;
+ return instance;
}
template<typename Class>
Class &Singleton<Class>::Instance()
{
- Singleton<Class>& instance = Singleton<Class>::InternalInstance();
- return instance;
+ Singleton<Class> &instance = Singleton<Class>::InternalInstance();
+ return instance;
}
} // namespace VcoreDPL
#define IMPLEMENT_SINGLETON(Type) \
- template VcoreDPL::Singleton<Type>&VcoreDPL::Singleton<Type>::InternalInstance(); \
- template Type & VcoreDPL::Singleton<Type>::Instance(); \
+ template VcoreDPL::Singleton<Type>&VcoreDPL::Singleton<Type>::InternalInstance(); \
+ template Type & VcoreDPL::Singleton<Type>::Instance(); \
#endif // DPL_SINGLETON_IMPL_H
* Abstract class of parser that produces some higher level abstraction
* basing on incoming tokens
*/
-template<class Result, class Token> class AbstractInputParser
-{
+template<class Result, class Token> class AbstractInputParser {
public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, ParserError)
- };
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, ParserError)
+ };
- typedef Result ResultType;
- typedef Token TokenType;
+ typedef Result ResultType;
+ typedef Token TokenType;
- virtual ~AbstractInputParser() {}
+ virtual ~AbstractInputParser() {}
- virtual void ConsumeToken(std::unique_ptr<Token> && token) = 0;
- virtual bool IsStateValid() = 0;
- virtual Result GetResult() const = 0;
+ virtual void ConsumeToken(std::unique_ptr<Token> &&token) = 0;
+ virtual bool IsStateValid() = 0;
+ virtual Result GetResult() const = 0;
};
}
* There a waste in form of virtuality for parser and tokenizer
* -> this for forcing same tokenT type in both components
*/
-template<class ResultT, class TokenT> class AbstractInputReader
-{
+template<class ResultT, class TokenT> class AbstractInputReader {
public:
- typedef ResultT TokenType;
- typedef TokenT ResultType;
- typedef AbstractInputParser<ResultT, TokenT> ParserBase;
- typedef AbstractInputTokenizer<TokenT> TokenizerBase;
-
- class Exception
- {
- public:
- typedef typename TokenizerBase::Exception::TokenizerError TokenizerError;
- typedef typename ParserBase::Exception::ParserError ParserError;
- };
-
- AbstractInputReader(std::shared_ptr<AbstractInput> ia,
- std::unique_ptr<ParserBase> && parser,
- std::unique_ptr<TokenizerBase> && tokenizer)
- : m_parser(std::move(parser)), m_tokenizer(std::move(tokenizer))
- {
- m_tokenizer->Reset(ia);
- }
-
- virtual ~AbstractInputReader() {}
-
- ResultT ReadInput()
- {
- typedef typename Exception::TokenizerError TokenizerError;
- typedef typename Exception::ParserError ParserError;
-
- while(true)
- {
- std::unique_ptr<TokenT> token = m_tokenizer->GetNextToken();
- if(!token)
- {
- if(!m_tokenizer->IsStateValid())
- {
- ThrowMsg(TokenizerError, "Tokenizer error");
- }
- if(!m_parser->IsStateValid())
- {
- ThrowMsg(ParserError, "Parser error");
- }
-
- return m_parser->GetResult();
- }
- m_parser->ConsumeToken(std::move(token));
- }
- }
+ typedef ResultT TokenType;
+ typedef TokenT ResultType;
+ typedef AbstractInputParser<ResultT, TokenT> ParserBase;
+ typedef AbstractInputTokenizer<TokenT> TokenizerBase;
+
+ class Exception {
+ public:
+ typedef typename TokenizerBase::Exception::TokenizerError TokenizerError;
+ typedef typename ParserBase::Exception::ParserError ParserError;
+ };
+
+ AbstractInputReader(std::shared_ptr<AbstractInput> ia,
+ std::unique_ptr<ParserBase> &&parser,
+ std::unique_ptr<TokenizerBase> &&tokenizer)
+ : m_parser(std::move(parser)), m_tokenizer(std::move(tokenizer))
+ {
+ m_tokenizer->Reset(ia);
+ }
+
+ virtual ~AbstractInputReader() {}
+
+ ResultT ReadInput()
+ {
+ typedef typename Exception::TokenizerError TokenizerError;
+ typedef typename Exception::ParserError ParserError;
+
+ while (true) {
+ std::unique_ptr<TokenT> token = m_tokenizer->GetNextToken();
+
+ if (!token) {
+ if (!m_tokenizer->IsStateValid()) {
+ ThrowMsg(TokenizerError, "Tokenizer error");
+ }
+
+ if (!m_parser->IsStateValid()) {
+ ThrowMsg(ParserError, "Parser error");
+ }
+
+ return m_parser->GetResult();
+ }
+
+ m_parser->ConsumeToken(std::move(token));
+ }
+ }
protected:
- std::unique_ptr<ParserBase> m_parser;
- std::unique_ptr<TokenizerBase> m_tokenizer;
+ std::unique_ptr<ParserBase> m_parser;
+ std::unique_ptr<TokenizerBase> m_tokenizer;
};
}
* and produce tokens until end of source. If parsing ends in invalid state
* then IsStateValid() should return false
*/
-template<class Token> class AbstractInputTokenizer
-{
+template<class Token> class AbstractInputTokenizer {
public:
- class Exception
- {
- public:
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, TokenizerError)
- };
+ class Exception {
+ public:
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, TokenizerError)
+ };
- typedef Token TokenType;
+ typedef Token TokenType;
- AbstractInputTokenizer() {}
- virtual ~AbstractInputTokenizer() {}
+ AbstractInputTokenizer() {}
+ virtual ~AbstractInputTokenizer() {}
- /**
- * @brief Reset resets data source
- * @param wia AbstractWaitableInputAdapter instance
- */
- virtual void Reset(std::shared_ptr<AbstractInput> wia)
- {
- m_input = wia;
- }
+ /**
+ * @brief Reset resets data source
+ * @param wia AbstractWaitableInputAdapter instance
+ */
+ virtual void Reset(std::shared_ptr<AbstractInput> wia)
+ {
+ m_input = wia;
+ }
- /**
- * @brief GetNextToken
- *
- * Parses next token.
- * Returns pointer to token
- * @throw TokenizerError in condition of input source error
- * If returned empty pointer IsStateValid() == true -> end of input
- * IsStateValid() == false -> error
- *
- * @param token token to be set
- * @return
- */
- virtual std::unique_ptr<Token> GetNextToken() = 0;
- virtual bool IsStateValid() = 0;
+ /**
+ * @brief GetNextToken
+ *
+ * Parses next token.
+ * Returns pointer to token
+ * @throw TokenizerError in condition of input source error
+ * If returned empty pointer IsStateValid() == true -> end of input
+ * IsStateValid() == false -> error
+ *
+ * @param token token to be set
+ * @return
+ */
+ virtual std::unique_ptr<Token> GetNextToken() = 0;
+ virtual bool IsStateValid() = 0;
protected:
- std::shared_ptr<AbstractInput> m_input;
+ std::shared_ptr<AbstractInput> m_input;
};
}
TestResultsCollectorBasePtr;
class TestResultsCollectorBase :
- private VcoreDPL::Noncopyable
-{
- public:
- typedef TestResultsCollectorBase* (*CollectorConstructorFunc)();
- typedef std::list<std::string> TestCaseIdList;
- struct FailStatus
- {
- enum Type
- {
- NONE,
- FAILED,
- IGNORED,
- INTERNAL
- };
- };
+ private VcoreDPL::Noncopyable {
+public:
+ typedef TestResultsCollectorBase *(*CollectorConstructorFunc)();
+ typedef std::list<std::string> TestCaseIdList;
+ struct FailStatus {
+ enum Type {
+ NONE,
+ FAILED,
+ IGNORED,
+ INTERNAL
+ };
+ };
- virtual ~TestResultsCollectorBase() {}
+ virtual ~TestResultsCollectorBase() {}
- virtual bool Configure()
- {
- return true;
- }
- virtual void Start(int count) { DPL_UNUSED_PARAM(count); }
- virtual void Finish() { }
- virtual void CollectCurrentTestGroupName(const std::string& /*groupName*/)
- {}
+ virtual bool Configure()
+ {
+ return true;
+ }
+ virtual void Start(int count)
+ {
+ DPL_UNUSED_PARAM(count);
+ }
+ virtual void Finish() { }
+ virtual void CollectCurrentTestGroupName(const std::string & /*groupName*/)
+ {}
- virtual void CollectTestsCasesList(const TestCaseIdList& /*list*/) {}
- virtual void CollectResult(const std::string& id,
- const std::string& description,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "") = 0;
- virtual std::string CollectorSpecificHelp() const
- {
- return "";
- }
- virtual bool ParseCollectorSpecificArg (const std::string& /*arg*/)
- {
- return false;
- }
+ virtual void CollectTestsCasesList(const TestCaseIdList & /*list*/) {}
+ virtual void CollectResult(const std::string &id,
+ const std::string &description,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "") = 0;
+ virtual std::string CollectorSpecificHelp() const
+ {
+ return "";
+ }
+ virtual bool ParseCollectorSpecificArg(const std::string & /*arg*/)
+ {
+ return false;
+ }
- static TestResultsCollectorBase* Create(const std::string& name);
- static void RegisterCollectorConstructor(
- const std::string& name,
- CollectorConstructorFunc
- constructor);
- static std::vector<std::string> GetCollectorsNames();
+ static TestResultsCollectorBase *Create(const std::string &name);
+ static void RegisterCollectorConstructor(
+ const std::string &name,
+ CollectorConstructorFunc
+ constructor);
+ static std::vector<std::string> GetCollectorsNames();
- private:
- typedef std::map<std::string, CollectorConstructorFunc> ConstructorsMap;
- static ConstructorsMap m_constructorsMap;
+private:
+ typedef std::map<std::string, CollectorConstructorFunc> ConstructorsMap;
+ static ConstructorsMap m_constructorsMap;
};
}
}
namespace VcoreDPL {
namespace Test {
-class TestRunner
-{
- typedef std::map<std::string, TestResultsCollectorBasePtr>
- TestResultsCollectors;
- TestResultsCollectors m_collectors;
-
- std::string m_startTestId;
- bool m_runIgnored;
-
- public:
- TestRunner()
- : m_runIgnored(false)
- , m_allowChildLogs(false)
- , m_terminate(false)
- , m_totalAssertions(0)
- {}
-
- typedef void (*TestCase)();
-
- private:
- struct TestCaseStruct
- {
- std::string name;
- TestCase proc;
-
- bool operator <(const TestCaseStruct &other) const
- {
- return name < other.name;
- }
-
- bool operator ==(const TestCaseStruct &other) const
- {
- return name == other.name;
- }
-
- TestCaseStruct(const std::string &n, TestCase p) :
- name(n),
- proc(p)
- {}
- };
-
- typedef std::list<TestCaseStruct> TestCaseStructList;
- typedef std::map<std::string, TestCaseStructList> TestCaseGroupMap;
- TestCaseGroupMap m_testGroups;
-
- typedef std::set<std::string> SelectedTestNameSet;
- SelectedTestNameSet m_selectedTestNamesSet;
- typedef std::set<std::string> SelectedTestGroupSet;
- SelectedTestGroupSet m_selectedTestGroupSet;
- std::string m_currentGroup;
-
- // Terminate without any logs.
- // Some test requires to call fork function.
- // Child process must not produce any logs and should die quietly.
- bool m_allowChildLogs;
- bool m_terminate;
-
- std::atomic<int> m_totalAssertions;
-
- void Banner();
- void InvalidArgs(const std::string& message = "Invalid arguments!");
- void Usage();
-
- bool filterGroupsByXmls(const std::vector<std::string> & files);
- bool filterByXML(std::map<std::string, bool> & casesMap);
- void normalizeXMLTag(std::string& str, const std::string& testcase);
-
- enum Status { FAILED, IGNORED, PASS };
-
- Status RunTestCase(const TestCaseStruct& testCase);
-
- void RunTests();
-
- void CollectResult(const std::string& id,
- const std::string& description,
- const TestResultsCollectorBase::FailStatus::Type status
- = TestResultsCollectorBase::FailStatus::NONE,
- const std::string& reason = std::string());
-
- public:
- class TestFailed
- {
- private:
- std::string m_message;
-
- public:
- TestFailed()
- {}
-
- //! \brief Failed test message creator
- //!
- //! \param[in] aTest string for tested expression
- //! \param[in] aFile source file name
- //! \param[in] aLine source file line
- //! \param[in] aMessage error message
- TestFailed(const char* aTest,
- const char* aFile,
- int aLine,
- const std::string &aMessage);
-
- TestFailed(const std::string &message);
-
- std::string GetMessage() const
- {
- return m_message;
- }
- };
-
- class Ignored
- {
- private:
- std::string m_message;
-
- public:
- Ignored()
- {}
-
- Ignored(const std::string &message) :
- m_message(message)
- {}
-
- std::string GetMessage() const
- {
- return m_message;
- }
- };
-
- void MarkAssertion();
-
- void RegisterTest(const char *testName, TestCase proc);
- void InitGroup(const char* name);
-
- int ExecTestRunner(int argc, char *argv[]);
- typedef std::vector<std::string> ArgsList;
- int ExecTestRunner(const ArgsList& args);
- bool getRunIgnored() const;
- // The runner will terminate as soon as possible (after current test).
- void Terminate();
- bool GetAllowChildLogs();
+class TestRunner {
+ typedef std::map<std::string, TestResultsCollectorBasePtr>
+ TestResultsCollectors;
+ TestResultsCollectors m_collectors;
+
+ std::string m_startTestId;
+ bool m_runIgnored;
+
+public:
+ TestRunner()
+ : m_runIgnored(false)
+ , m_allowChildLogs(false)
+ , m_terminate(false)
+ , m_totalAssertions(0)
+ {}
+
+ typedef void (*TestCase)();
+
+private:
+ struct TestCaseStruct {
+ std::string name;
+ TestCase proc;
+
+ bool operator <(const TestCaseStruct &other) const
+ {
+ return name < other.name;
+ }
+
+ bool operator ==(const TestCaseStruct &other) const
+ {
+ return name == other.name;
+ }
+
+ TestCaseStruct(const std::string &n, TestCase p) :
+ name(n),
+ proc(p)
+ {}
+ };
+
+ typedef std::list<TestCaseStruct> TestCaseStructList;
+ typedef std::map<std::string, TestCaseStructList> TestCaseGroupMap;
+ TestCaseGroupMap m_testGroups;
+
+ typedef std::set<std::string> SelectedTestNameSet;
+ SelectedTestNameSet m_selectedTestNamesSet;
+ typedef std::set<std::string> SelectedTestGroupSet;
+ SelectedTestGroupSet m_selectedTestGroupSet;
+ std::string m_currentGroup;
+
+ // Terminate without any logs.
+ // Some test requires to call fork function.
+ // Child process must not produce any logs and should die quietly.
+ bool m_allowChildLogs;
+ bool m_terminate;
+
+ std::atomic<int> m_totalAssertions;
+
+ void Banner();
+ void InvalidArgs(const std::string &message = "Invalid arguments!");
+ void Usage();
+
+ bool filterGroupsByXmls(const std::vector<std::string> &files);
+ bool filterByXML(std::map<std::string, bool> &casesMap);
+ void normalizeXMLTag(std::string &str, const std::string &testcase);
+
+ enum Status { FAILED, IGNORED, PASS };
+
+ Status RunTestCase(const TestCaseStruct &testCase);
+
+ void RunTests();
+
+ void CollectResult(const std::string &id,
+ const std::string &description,
+ const TestResultsCollectorBase::FailStatus::Type status
+ = TestResultsCollectorBase::FailStatus::NONE,
+ const std::string &reason = std::string());
+
+public:
+ class TestFailed {
+ private:
+ std::string m_message;
+
+ public:
+ TestFailed()
+ {}
+
+ //! \brief Failed test message creator
+ //!
+ //! \param[in] aTest string for tested expression
+ //! \param[in] aFile source file name
+ //! \param[in] aLine source file line
+ //! \param[in] aMessage error message
+ TestFailed(const char *aTest,
+ const char *aFile,
+ int aLine,
+ const std::string &aMessage);
+
+ TestFailed(const std::string &message);
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+ };
+
+ class Ignored {
+ private:
+ std::string m_message;
+
+ public:
+ Ignored()
+ {}
+
+ Ignored(const std::string &message) :
+ m_message(message)
+ {}
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+ };
+
+ void MarkAssertion();
+
+ void RegisterTest(const char *testName, TestCase proc);
+ void InitGroup(const char *name);
+
+ int ExecTestRunner(int argc, char *argv[]);
+ typedef std::vector<std::string> ArgsList;
+ int ExecTestRunner(const ArgsList &args);
+ bool getRunIgnored() const;
+ // The runner will terminate as soon as possible (after current test).
+ void Terminate();
+ bool GetAllowChildLogs();
};
typedef VcoreDPL::Singleton<TestRunner> TestRunnerSingleton;
} // namespace VcoreDPL
#define RUNNER_TEST_GROUP_INIT(GroupName) \
- static int Static##GroupName##Init() \
- { \
- VcoreDPL::Test::TestRunnerSingleton::Instance().InitGroup(#GroupName); \
- return 0; \
- } \
- const int DPL_UNUSED Static##GroupName##InitVar = \
- Static##GroupName##Init();
+ static int Static##GroupName##Init() \
+ { \
+ VcoreDPL::Test::TestRunnerSingleton::Instance().InitGroup(#GroupName); \
+ return 0; \
+ } \
+ const int DPL_UNUSED Static##GroupName##InitVar = \
+ Static##GroupName##Init();
#define RUNNER_TEST(Proc) \
- void Proc(); \
- static int Static##Proc##Init() \
- { \
- VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc);\
- return 0; \
- } \
- const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
- void Proc()
+ void Proc(); \
+ static int Static##Proc##Init() \
+ { \
+ VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc);\
+ return 0; \
+ } \
+ const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
+ void Proc()
#define RUNNER_ASSERT_MSG(test, message) \
- do \
- { \
- VcoreDPL::Test::TestRunnerSingleton::Instance().MarkAssertion(); \
- \
- if (!(test)) \
- { \
- std::ostringstream assertMsg; \
- assertMsg << message; \
- throw VcoreDPL::Test::TestRunner::TestFailed(#test, \
- __FILE__, \
- __LINE__, \
- assertMsg.str()); \
- } \
- } while (0)
+ do \
+ { \
+ VcoreDPL::Test::TestRunnerSingleton::Instance().MarkAssertion(); \
+ \
+ if (!(test)) \
+ { \
+ std::ostringstream assertMsg; \
+ assertMsg << message; \
+ throw VcoreDPL::Test::TestRunner::TestFailed(#test, \
+ __FILE__, \
+ __LINE__, \
+ assertMsg.str()); \
+ } \
+ } while (0)
#define RUNNER_ASSERT(test) RUNNER_ASSERT_MSG(test, "")
#define RUNNER_FAIL RUNNER_ASSERT(false)
#define RUNNER_IGNORED_MSG(message) \
- do { \
- std::ostringstream assertMsg; \
- assertMsg << message; \
- throw VcoreDPL::Test::TestRunner::Ignored( assertMsg.str() ); \
- } while (0)
+ do { \
+ std::ostringstream assertMsg; \
+ assertMsg << message; \
+ throw VcoreDPL::Test::TestRunner::Ignored(assertMsg.str()); \
+ } while (0)
#endif // DPL_TEST_RUNNER_H
namespace VcoreDPL {
namespace Test {
-class PipeWrapper : VcoreDPL::Noncopyable
-{
- public:
- enum Usage {
- READONLY,
- WRITEONLY
- };
+class PipeWrapper : VcoreDPL::Noncopyable {
+public:
+ enum Usage {
+ READONLY,
+ WRITEONLY
+ };
- enum Status {
- SUCCESS,
- TIMEOUT,
- ERROR
- };
+ enum Status {
+ SUCCESS,
+ TIMEOUT,
+ ERROR
+ };
- PipeWrapper();
+ PipeWrapper();
- bool isReady();
+ bool isReady();
- void setUsage(Usage usage);
+ void setUsage(Usage usage);
- virtual ~PipeWrapper();
+ virtual ~PipeWrapper();
- Status send(int code, std::string &message);
+ Status send(int code, std::string &message);
- Status receive(int &code, std::string &data, time_t deadline);
+ Status receive(int &code, std::string &data, time_t deadline);
- void closeAll();
+ void closeAll();
- protected:
+protected:
- std::string toBinaryString(int data);
+ std::string toBinaryString(int data);
- void closeHelp(int desc);
+ void closeHelp(int desc);
- Status writeHelp(const void *buffer, int size);
+ Status writeHelp(const void *buffer, int size);
- Status readHelp(void *buf, int size, time_t deadline);
+ Status readHelp(void *buf, int size, time_t deadline);
- static const int PIPE_CLOSED = -1;
+ static const int PIPE_CLOSED = -1;
- int m_pipefd[2];
+ int m_pipefd[2];
};
void RunChildProc(TestRunner::TestCase procChild);
} // namespace VcoreDPL
#define RUNNER_CHILD_TEST(Proc) \
- void Proc(); \
- void Proc##Child(); \
- static int Static##Proc##Init() \
- { \
- VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc); \
- return 0; \
- } \
- const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
- void Proc(){ \
- VcoreDPL::Test::RunChildProc(&Proc##Child); \
- } \
- void Proc##Child()
+ void Proc(); \
+ void Proc##Child(); \
+ static int Static##Proc##Init() \
+ { \
+ VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc); \
+ return 0; \
+ } \
+ const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
+ void Proc(){ \
+ VcoreDPL::Test::RunChildProc(&Proc##Child); \
+ } \
+ void Proc##Child()
#endif // DPL_TEST_RUNNER_CHILD_H
namespace Test {
class SimplePipeWrapper :
- public PipeWrapper
-{
- public:
- SimplePipeWrapper();
+ public PipeWrapper {
+public:
+ SimplePipeWrapper();
- virtual ~SimplePipeWrapper();
+ virtual ~SimplePipeWrapper();
- Status send(std::string &message);
- Status receive(std::string &data, bool &empty, time_t deadline);
+ Status send(std::string &message);
+ Status receive(std::string &data, bool &empty, time_t deadline);
};
void RunMultiProc(TestRunner::TestCase procMulti);
} // namespace VcoreDPL
#define RUNNER_MULTIPROCESS_TEST(Proc) \
- void Proc(); \
- void Proc##Multi(); \
- static int Static##Proc##Init() \
- { \
- VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc); \
- return 0; \
- } \
- const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
- void Proc(){ \
- VcoreDPL::Test::RunMultiProc(&Proc##Multi); \
- } \
- void Proc##Multi()
+ void Proc(); \
+ void Proc##Multi(); \
+ static int Static##Proc##Init() \
+ { \
+ VcoreDPL::Test::TestRunnerSingleton::Instance().RegisterTest(#Proc, &Proc); \
+ return 0; \
+ } \
+ const int DPL_UNUSED Static##Proc##InitVar = Static##Proc##Init(); \
+ void Proc(){ \
+ VcoreDPL::Test::RunMultiProc(&Proc##Multi); \
+ } \
+ void Proc##Multi()
#endif // DPL_TEST_RUNNER_MULTIPROCESS_H
* };
*/
template<class ParserPolicy>
-class VSParser : public AbstractInputParser<VSResultPtr, VSToken>
-{
+class VSParser : public AbstractInputParser<VSResultPtr, VSToken> {
public:
- VSParser() : m_switchLine(true), m_result(new VSResult()) {}
+ VSParser() : m_switchLine(true), m_result(new VSResult()) {}
- void ConsumeToken(std::unique_ptr<VSToken> && token)
- {
- if(m_switchLine)
- {
- m_result->push_back(VSLine());
- m_switchLine = false;
- }
- if(token->isNewLine())
- {
- if(ParserPolicy::SkipLine(*m_result->rbegin()))
- {
- m_result->pop_back();
- }
- m_switchLine = true;
- }
- else
- {
- m_result->rbegin()->push_back(token->cell());
- }
- }
+ void ConsumeToken(std::unique_ptr<VSToken> &&token)
+ {
+ if (m_switchLine) {
+ m_result->push_back(VSLine());
+ m_switchLine = false;
+ }
- bool IsStateValid()
- {
- return ParserPolicy::Validate(m_result);
- }
+ if (token->isNewLine()) {
+ if (ParserPolicy::SkipLine(*m_result->rbegin())) {
+ m_result->pop_back();
+ }
- VSResultPtr GetResult() const
- {
- return m_result;
- }
+ m_switchLine = true;
+ } else {
+ m_result->rbegin()->push_back(token->cell());
+ }
+ }
+
+ bool IsStateValid()
+ {
+ return ParserPolicy::Validate(m_result);
+ }
+
+ VSResultPtr GetResult() const
+ {
+ return m_result;
+ }
private:
- bool m_switchLine;
- VSResultPtr m_result;
+ bool m_switchLine;
+ VSResultPtr m_result;
};
}
namespace VcoreDPL {
-struct CSVTokenizerPolicy
-{
- static std::string GetSeperators(); //cells in line are separated by given characters
- static bool SkipEmpty(); //if cell is empty, shoudl I skip?
- static void PrepareValue(std::string &); //transform each value
- static bool TryAgainAtEnd(int); //read is nonblocking so dat may not be yet available, should I retry?
+struct CSVTokenizerPolicy {
+ static std::string GetSeperators(); //cells in line are separated by given characters
+ static bool SkipEmpty(); //if cell is empty, shoudl I skip?
+ static void PrepareValue(std::string &); //transform each value
+ static bool TryAgainAtEnd(
+ int); //read is nonblocking so dat may not be yet available, should I retry?
};
-struct CSVParserPolicy
-{
- static bool SkipLine(const std::vector<std::string> & ); //should I skip whole readline?
- static bool Validate(std::shared_ptr<std::vector<std::vector<std::string> > > & result); //validate and adjust output data
+struct CSVParserPolicy {
+ static bool SkipLine(const std::vector<std::string>
+ &); //should I skip whole readline?
+ static bool Validate(std::shared_ptr<std::vector<std::vector<std::string>>>
+ &result); //validate and adjust output data
};
}
*
*/
template<class ParserPolicy, class TokenizerPolicy>
-class VSReader : public AbstractInputReader<VSResultPtr, VSToken>
-{
+class VSReader : public AbstractInputReader<VSResultPtr, VSToken> {
public:
- VSReader(std::shared_ptr<AbstractInput> wia)
- : AbstractInputReader<VSResultPtr, VSToken>(wia,
- std::unique_ptr<ParserBase>(new VSParser<ParserPolicy>()),
- std::unique_ptr<TokenizerBase>(new VSTokenizer<TokenizerPolicy>()))
- {}
+ VSReader(std::shared_ptr<AbstractInput> wia)
+ : AbstractInputReader<VSResultPtr, VSToken>(wia,
+ std::unique_ptr<ParserBase>(new VSParser<ParserPolicy>()),
+ std::unique_ptr<TokenizerBase>(new VSTokenizer<TokenizerPolicy>()))
+ {}
};
typedef VSReader<CSVParserPolicy, CSVTokenizerPolicy> CSVReader;
* };
*/
template<class TokenizerPolicy>
-class VSTokenizer : public AbstractInputTokenizer<VSToken>
-{
+class VSTokenizer : public AbstractInputTokenizer<VSToken> {
public:
- VSTokenizer() {}
-
- void Reset(std::shared_ptr<AbstractInput> ia)
- {
- AbstractInputTokenizer<VSToken>::Reset(ia);
- m_queue.Clear();
- m_finished = false;
- m_newline = false;
- }
-
- std::unique_ptr<VSToken> GetNextToken()
- {
- std::unique_ptr<VSToken> token;
- std::string data;
- char byte;
- int tryNumber = 0;
-
- while(true)
- {
- //check if newline was approched
- if(m_newline)
- {
- token.reset(new VSToken());
- m_newline = false;
- return token;
- }
-
- //read next data
- if(m_queue.Empty())
- {
- if(m_finished)
- {
- return token;
- }
- else
- {
- auto baptr = m_input->Read(4096);
- if(baptr.get() == 0)
- {
- ThrowMsg(Exception::TokenizerError, "Input read failed");
- }
- if(baptr->Empty())
- {
- if(TokenizerPolicy::TryAgainAtEnd(tryNumber))
- {
- ++tryNumber;
- continue;
- }
- m_finished = true;
- return token;
- }
- m_queue.AppendMoveFrom(*baptr);
- }
- }
-
- //process
- m_queue.FlattenConsume(&byte, 1); //queue uses pointer to consume bytes, this do not causes reallocations
- if(byte == '\n')
- {
- m_newline = true;
- if(!data.empty() || !TokenizerPolicy::SkipEmpty())
- {
- ProduceString(token, data);
- return token;
- }
- }
- else if(TokenizerPolicy::GetSeperators().find(byte) != std::string::npos)
- {
- if(!data.empty() || !TokenizerPolicy::SkipEmpty())
- {
- ProduceString(token, data);
- return token;
- }
- }
- else
- {
- data += byte;
- }
- }
- }
-
- bool IsStateValid()
- {
- if(!m_queue.Empty() && m_finished) return false;
- return true;
- }
+ VSTokenizer() {}
+
+ void Reset(std::shared_ptr<AbstractInput> ia)
+ {
+ AbstractInputTokenizer<VSToken>::Reset(ia);
+ m_queue.Clear();
+ m_finished = false;
+ m_newline = false;
+ }
+
+ std::unique_ptr<VSToken> GetNextToken()
+ {
+ std::unique_ptr<VSToken> token;
+ std::string data;
+ char byte;
+ int tryNumber = 0;
+
+ while (true) {
+ //check if newline was approched
+ if (m_newline) {
+ token.reset(new VSToken());
+ m_newline = false;
+ return token;
+ }
+
+ //read next data
+ if (m_queue.Empty()) {
+ if (m_finished) {
+ return token;
+ } else {
+ auto baptr = m_input->Read(4096);
+
+ if (baptr.get() == 0) {
+ ThrowMsg(Exception::TokenizerError, "Input read failed");
+ }
+
+ if (baptr->Empty()) {
+ if (TokenizerPolicy::TryAgainAtEnd(tryNumber)) {
+ ++tryNumber;
+ continue;
+ }
+
+ m_finished = true;
+ return token;
+ }
+
+ m_queue.AppendMoveFrom(*baptr);
+ }
+ }
+
+ //process
+ m_queue.FlattenConsume(&byte,
+ 1); //queue uses pointer to consume bytes, this do not causes reallocations
+
+ if (byte == '\n') {
+ m_newline = true;
+
+ if (!data.empty() || !TokenizerPolicy::SkipEmpty()) {
+ ProduceString(token, data);
+ return token;
+ }
+ } else if (TokenizerPolicy::GetSeperators().find(byte) != std::string::npos) {
+ if (!data.empty() || !TokenizerPolicy::SkipEmpty()) {
+ ProduceString(token, data);
+ return token;
+ }
+ } else {
+ data += byte;
+ }
+ }
+ }
+
+ bool IsStateValid()
+ {
+ if (!m_queue.Empty() && m_finished) return false;
+
+ return true;
+ }
protected:
- void ProduceString(std::unique_ptr<VSToken> & token, std::string & data)
- {
- TokenizerPolicy::PrepareValue(data);
- token.reset(new VSToken(data));
- }
-
- BinaryQueue m_queue;
- bool m_finished;
- bool m_newline;
+ void ProduceString(std::unique_ptr<VSToken> &token, std::string &data)
+ {
+ TokenizerPolicy::PrepareValue(data);
+ token.reset(new VSToken(data));
+ }
+
+ BinaryQueue m_queue;
+ bool m_finished;
+ bool m_newline;
};
}
namespace VcoreDPL {
-class VSToken
-{
+class VSToken {
public:
- VSToken(const std::string & c);
- VSToken(); //newline token - no new class to simplify
- const std::string & cell() const;
+ VSToken(const std::string &c);
+ VSToken(); //newline token - no new class to simplify
+ const std::string &cell() const;
- bool isNewLine();
+ bool isNewLine();
private:
- bool m_newline;
- std::string m_cell;
+ bool m_newline;
+ std::string m_cell;
};
}
namespace VcoreDPL {
void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function)
+ const char *file,
+ int line,
+ const char *function)
{
-
#define INTERNAL_LOG(message) \
-do { \
- std::cerr << message << std::endl; \
-} while (0)
-
- // Try to log failed assertion to log system
- Try {
- INTERNAL_LOG("########################################################################");
- INTERNAL_LOG("### DPL assertion failed! ###");
- INTERNAL_LOG("########################################################################");
- INTERNAL_LOG("### Condition: " << condition);
- INTERNAL_LOG("### File: " << file);
- INTERNAL_LOG("### Line: " << line);
- INTERNAL_LOG("### Function: " << function);
- INTERNAL_LOG("########################################################################");
- } catch (Exception) {
- // Just ignore possible double errors
- }
+ do { \
+ std::cerr << message << std::endl; \
+ } while (0)
+ // Try to log failed assertion to log system
+ Try {
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### DPL assertion failed! ###");
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### Condition: " << condition);
+ INTERNAL_LOG("### File: " << file);
+ INTERNAL_LOG("### Line: " << line);
+ INTERNAL_LOG("### Function: " << function);
+ INTERNAL_LOG("########################################################################");
+ } catch (Exception) {
+ // Just ignore possible double errors
+ }
- // Fail with c-library abort
- abort();
+ // Fail with c-library abort
+ abort();
}
} // namespace VcoreDPL
namespace VcoreDPL {
BinaryQueue::BinaryQueue() :
- m_size(0)
+ m_size(0)
{}
BinaryQueue::BinaryQueue(const BinaryQueue &other) :
- m_size(0)
+ m_size(0)
{
- AppendCopyFrom(other);
+ AppendCopyFrom(other);
}
BinaryQueue::~BinaryQueue()
{
- // Remove all remainig buckets
- Clear();
+ // Remove all remainig buckets
+ Clear();
}
BinaryQueue &BinaryQueue::operator=(const BinaryQueue &other)
{
- if (this != &other) {
- Clear();
- AppendCopyFrom(other);
- }
+ if (this != &other) {
+ Clear();
+ AppendCopyFrom(other);
+ }
- return *this;
+ return *this;
}
void BinaryQueue::AppendCopyFrom(const BinaryQueue &other)
{
- // To speed things up, always copy as one bucket
- void *bufferCopy = malloc(other.m_size);
-
- if (bufferCopy == NULL) {
- throw std::bad_alloc();
- }
-
- try {
- other.Flatten(bufferCopy, other.m_size);
- AppendUnmanaged(bufferCopy, other.m_size, &BufferDeleterFree, NULL);
- } catch (const std::bad_alloc &) {
- // Free allocated memory
- free(bufferCopy);
- throw;
- }
+ // To speed things up, always copy as one bucket
+ void *bufferCopy = malloc(other.m_size);
+
+ if (bufferCopy == NULL) {
+ throw std::bad_alloc();
+ }
+
+ try {
+ other.Flatten(bufferCopy, other.m_size);
+ AppendUnmanaged(bufferCopy, other.m_size, &BufferDeleterFree, NULL);
+ } catch (const std::bad_alloc &) {
+ // Free allocated memory
+ free(bufferCopy);
+ throw;
+ }
}
void BinaryQueue::AppendMoveFrom(BinaryQueue &other)
{
- // Copy all buckets
- std::copy(other.m_buckets.begin(),
- other.m_buckets.end(), std::back_inserter(m_buckets));
- m_size += other.m_size;
-
- // Clear other, but do not free memory
- other.m_buckets.clear();
- other.m_size = 0;
+ // Copy all buckets
+ std::copy(other.m_buckets.begin(),
+ other.m_buckets.end(), std::back_inserter(m_buckets));
+ m_size += other.m_size;
+ // Clear other, but do not free memory
+ other.m_buckets.clear();
+ other.m_size = 0;
}
void BinaryQueue::AppendCopyTo(BinaryQueue &other) const
{
- other.AppendCopyFrom(*this);
+ other.AppendCopyFrom(*this);
}
void BinaryQueue::AppendMoveTo(BinaryQueue &other)
{
- other.AppendMoveFrom(*this);
+ other.AppendMoveFrom(*this);
}
void BinaryQueue::Clear()
{
- std::for_each(m_buckets.begin(), m_buckets.end(), &DeleteBucket);
- m_buckets.clear();
- m_size = 0;
+ std::for_each(m_buckets.begin(), m_buckets.end(), &DeleteBucket);
+ m_buckets.clear();
+ m_size = 0;
}
-void BinaryQueue::AppendCopy(const void* buffer, size_t bufferSize)
+void BinaryQueue::AppendCopy(const void *buffer, size_t bufferSize)
{
- // Create data copy with malloc/free
- void *bufferCopy = malloc(bufferSize);
-
- // Check if allocation succeded
- if (bufferCopy == NULL) {
- throw std::bad_alloc();
- }
-
- // Copy user data
- memcpy(bufferCopy, buffer, bufferSize);
-
- try {
- // Try to append new bucket
- AppendUnmanaged(bufferCopy, bufferSize, &BufferDeleterFree, NULL);
- } catch (const std::bad_alloc &) {
- // Free allocated memory
- free(bufferCopy);
- throw;
- }
+ // Create data copy with malloc/free
+ void *bufferCopy = malloc(bufferSize);
+
+ // Check if allocation succeded
+ if (bufferCopy == NULL) {
+ throw std::bad_alloc();
+ }
+
+ // Copy user data
+ memcpy(bufferCopy, buffer, bufferSize);
+
+ try {
+ // Try to append new bucket
+ AppendUnmanaged(bufferCopy, bufferSize, &BufferDeleterFree, NULL);
+ } catch (const std::bad_alloc &) {
+ // Free allocated memory
+ free(bufferCopy);
+ throw;
+ }
}
-void BinaryQueue::AppendUnmanaged(const void* buffer,
- size_t bufferSize,
- BufferDeleter deleter,
- void* userParam)
+void BinaryQueue::AppendUnmanaged(const void *buffer,
+ size_t bufferSize,
+ BufferDeleter deleter,
+ void *userParam)
{
- // Do not attach empty buckets
- if (bufferSize == 0) {
- deleter(buffer, bufferSize, userParam);
- return;
- }
-
- // Just add new bucket with selected deleter
- m_buckets.push_back(new Bucket(buffer, bufferSize, deleter, userParam));
-
- // Increase total queue size
- m_size += bufferSize;
+ // Do not attach empty buckets
+ if (bufferSize == 0) {
+ deleter(buffer, bufferSize, userParam);
+ return;
+ }
+
+ // Just add new bucket with selected deleter
+ m_buckets.push_back(new Bucket(buffer, bufferSize, deleter, userParam));
+ // Increase total queue size
+ m_size += bufferSize;
}
size_t BinaryQueue::Size() const
{
- return m_size;
+ return m_size;
}
bool BinaryQueue::Empty() const
{
- return m_size == 0;
+ return m_size == 0;
}
void BinaryQueue::Consume(size_t size)
{
- // Check parameters
- if (size > m_size) {
- Throw(Exception::OutOfData);
- }
-
- size_t bytesLeft = size;
-
- // Consume data and/or remove buckets
- while (bytesLeft > 0) {
- // Get consume size
- size_t count = std::min(bytesLeft, m_buckets.front()->left);
-
- m_buckets.front()->ptr =
- static_cast<const char *>(m_buckets.front()->ptr) + count;
- m_buckets.front()->left -= count;
- bytesLeft -= count;
- m_size -= count;
-
- if (m_buckets.front()->left == 0) {
- DeleteBucket(m_buckets.front());
- m_buckets.pop_front();
- }
- }
+ // Check parameters
+ if (size > m_size) {
+ Throw(Exception::OutOfData);
+ }
+
+ size_t bytesLeft = size;
+
+ // Consume data and/or remove buckets
+ while (bytesLeft > 0) {
+ // Get consume size
+ size_t count = std::min(bytesLeft, m_buckets.front()->left);
+ m_buckets.front()->ptr =
+ static_cast<const char *>(m_buckets.front()->ptr) + count;
+ m_buckets.front()->left -= count;
+ bytesLeft -= count;
+ m_size -= count;
+
+ if (m_buckets.front()->left == 0) {
+ DeleteBucket(m_buckets.front());
+ m_buckets.pop_front();
+ }
+ }
}
void BinaryQueue::Flatten(void *buffer, size_t bufferSize) const
{
- // Check parameters
- if (bufferSize == 0) {
- return;
- }
-
- if (bufferSize > m_size) {
- Throw(Exception::OutOfData);
- }
-
- size_t bytesLeft = bufferSize;
- void *ptr = buffer;
- BucketList::const_iterator bucketIterator = m_buckets.begin();
- Assert(m_buckets.end() != bucketIterator);
-
- // Flatten data
- while (bytesLeft > 0) {
- // Get consume size
- size_t count = std::min(bytesLeft, (*bucketIterator)->left);
-
- // Copy data to user pointer
- memcpy(ptr, (*bucketIterator)->ptr, count);
-
- // Update flattened bytes count
- bytesLeft -= count;
- ptr = static_cast<char *>(ptr) + count;
-
- // Take next bucket
- ++bucketIterator;
- }
+ // Check parameters
+ if (bufferSize == 0) {
+ return;
+ }
+
+ if (bufferSize > m_size) {
+ Throw(Exception::OutOfData);
+ }
+
+ size_t bytesLeft = bufferSize;
+ void *ptr = buffer;
+ BucketList::const_iterator bucketIterator = m_buckets.begin();
+ Assert(m_buckets.end() != bucketIterator);
+
+ // Flatten data
+ while (bytesLeft > 0) {
+ // Get consume size
+ size_t count = std::min(bytesLeft, (*bucketIterator)->left);
+ // Copy data to user pointer
+ memcpy(ptr, (*bucketIterator)->ptr, count);
+ // Update flattened bytes count
+ bytesLeft -= count;
+ ptr = static_cast<char *>(ptr) + count;
+ // Take next bucket
+ ++bucketIterator;
+ }
}
void BinaryQueue::FlattenConsume(void *buffer, size_t bufferSize)
{
- // FIXME: Optimize
- Flatten(buffer, bufferSize);
- Consume(bufferSize);
+ // FIXME: Optimize
+ Flatten(buffer, bufferSize);
+ Consume(bufferSize);
}
void BinaryQueue::DeleteBucket(BinaryQueue::Bucket *bucket)
{
- delete bucket;
+ delete bucket;
}
-void BinaryQueue::BufferDeleterFree(const void* data,
- size_t dataSize,
- void* userParam)
+void BinaryQueue::BufferDeleterFree(const void *data,
+ size_t dataSize,
+ void *userParam)
{
- (void)dataSize;
- (void)userParam;
-
- // Default free deleter
- free(const_cast<void *>(data));
+ (void)dataSize;
+ (void)userParam;
+ // Default free deleter
+ free(const_cast<void *>(data));
}
-BinaryQueue::Bucket::Bucket(const void* data,
- size_t dataSize,
- BufferDeleter dataDeleter,
- void* userParam) :
- buffer(data),
- ptr(data),
- size(dataSize),
- left(dataSize),
- deleter(dataDeleter),
- param(userParam)
+BinaryQueue::Bucket::Bucket(const void *data,
+ size_t dataSize,
+ BufferDeleter dataDeleter,
+ void *userParam) :
+ buffer(data),
+ ptr(data),
+ size(dataSize),
+ left(dataSize),
+ deleter(dataDeleter),
+ param(userParam)
{
- Assert(data != NULL);
- Assert(deleter != NULL);
+ Assert(data != NULL);
+ Assert(deleter != NULL);
}
BinaryQueue::Bucket::~Bucket()
{
- // Invoke deleter on bucket data
- deleter(buffer, size, param);
+ // Invoke deleter on bucket data
+ deleter(buffer, size, param);
}
BinaryQueue::BucketVisitor::~BucketVisitor()
{}
BinaryQueue::BucketVisitorCall::BucketVisitorCall(BucketVisitor *visitor) :
- m_visitor(visitor)
+ m_visitor(visitor)
{}
BinaryQueue::BucketVisitorCall::~BucketVisitorCall()
void BinaryQueue::BucketVisitorCall::operator()(Bucket *bucket) const
{
- m_visitor->OnVisitBucket(bucket->ptr, bucket->left);
+ m_visitor->OnVisitBucket(bucket->ptr, bucket->left);
}
void BinaryQueue::VisitBuckets(BucketVisitor *visitor) const
{
- Assert(visitor != NULL);
-
- // Visit all buckets
- std::for_each(m_buckets.begin(), m_buckets.end(), BucketVisitorCall(visitor));
+ Assert(visitor != NULL);
+ // Visit all buckets
+ std::for_each(m_buckets.begin(), m_buckets.end(), BucketVisitorCall(visitor));
}
BinaryQueueAutoPtr BinaryQueue::Read(size_t size)
{
- // Simulate input stream
- size_t available = std::min(size, m_size);
-
- ScopedFree<void> bufferCopy(malloc(available));
-
- if (!bufferCopy) {
- throw std::bad_alloc();
- }
-
- BinaryQueueAutoPtr result(new BinaryQueue());
-
- Flatten(bufferCopy.Get(), available);
- result->AppendUnmanaged(
- bufferCopy.Get(), available, &BufferDeleterFree, NULL);
- bufferCopy.Release();
- Consume(available);
-
- return result;
+ // Simulate input stream
+ size_t available = std::min(size, m_size);
+ ScopedFree<void> bufferCopy(malloc(available));
+
+ if (!bufferCopy) {
+ throw std::bad_alloc();
+ }
+
+ BinaryQueueAutoPtr result(new BinaryQueue());
+ Flatten(bufferCopy.Get(), available);
+ result->AppendUnmanaged(
+ bufferCopy.Get(), available, &BufferDeleterFree, NULL);
+ bufferCopy.Release();
+ Consume(available);
+ return result;
}
size_t BinaryQueue::Write(const BinaryQueue &buffer, size_t bufferSize)
{
- // Simulate output stream
- AppendCopyFrom(buffer);
- return bufferSize;
+ // Simulate output stream
+ AppendCopyFrom(buffer);
+ return bufferSize;
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Colors {
namespace Text {
-const char* BOLD_GREEN_BEGIN = "\033[1;32m";
-const char* BOLD_GREEN_END = "\033[m";
-const char* RED_BEGIN = "\033[0;31m";
-const char* RED_END = "\033[m";
-const char* PURPLE_BEGIN = "\033[0;35m";
-const char* PURPLE_END = "\033[m";
-const char* GREEN_BEGIN = "\033[0;32m";
-const char* GREEN_END = "\033[m";
-const char* CYAN_BEGIN = "\033[0;36m";
-const char* CYAN_END = "\033[m";
-const char* BOLD_RED_BEGIN = "\033[1;31m";
-const char* BOLD_RED_END = "\033[m";
-const char* BOLD_YELLOW_BEGIN = "\033[1;33m";
-const char* BOLD_YELLOW_END = "\033[m";
-const char* BOLD_GOLD_BEGIN = "\033[0;33m";
-const char* BOLD_GOLD_END = "\033[m";
-const char* BOLD_WHITE_BEGIN = "\033[1;37m";
-const char* BOLD_WHITE_END = "\033[m";
+const char *BOLD_GREEN_BEGIN = "\033[1;32m";
+const char *BOLD_GREEN_END = "\033[m";
+const char *RED_BEGIN = "\033[0;31m";
+const char *RED_END = "\033[m";
+const char *PURPLE_BEGIN = "\033[0;35m";
+const char *PURPLE_END = "\033[m";
+const char *GREEN_BEGIN = "\033[0;32m";
+const char *GREEN_END = "\033[m";
+const char *CYAN_BEGIN = "\033[0;36m";
+const char *CYAN_END = "\033[m";
+const char *BOLD_RED_BEGIN = "\033[1;31m";
+const char *BOLD_RED_END = "\033[m";
+const char *BOLD_YELLOW_BEGIN = "\033[1;33m";
+const char *BOLD_YELLOW_END = "\033[m";
+const char *BOLD_GOLD_BEGIN = "\033[0;33m";
+const char *BOLD_GOLD_END = "\033[m";
+const char *BOLD_WHITE_BEGIN = "\033[1;37m";
+const char *BOLD_WHITE_END = "\033[m";
} //namespace Text
namespace Html {
-const char* BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
-const char* BOLD_GREEN_END = "</b></font>";
-const char* PURPLE_BEGIN = "<font color=\"purple\"><b>";
-const char* PURPLE_END = "</b></font>";
-const char* RED_BEGIN = "<font color=\"red\"><b>";
-const char* RED_END = "</b></font>";
-const char* GREEN_BEGIN = "<font color=\"green\">";
-const char* GREEN_END = "</font>";
-const char* CYAN_BEGIN = "<font color=\"cyan\">";
-const char* CYAN_END = "</font>";
-const char* BOLD_RED_BEGIN = "<font color=\"red\"><b>";
-const char* BOLD_RED_END = "</b></font>";
-const char* BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
-const char* BOLD_YELLOW_END = "</b></font>";
-const char* BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
-const char* BOLD_GOLD_END = "</b></font>";
-const char* BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
-const char* BOLD_WHITE_END = "</b></font>";
+const char *BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
+const char *BOLD_GREEN_END = "</b></font>";
+const char *PURPLE_BEGIN = "<font color=\"purple\"><b>";
+const char *PURPLE_END = "</b></font>";
+const char *RED_BEGIN = "<font color=\"red\"><b>";
+const char *RED_END = "</b></font>";
+const char *GREEN_BEGIN = "<font color=\"green\">";
+const char *GREEN_END = "</font>";
+const char *CYAN_BEGIN = "<font color=\"cyan\">";
+const char *CYAN_END = "</font>";
+const char *BOLD_RED_BEGIN = "<font color=\"red\"><b>";
+const char *BOLD_RED_END = "</b></font>";
+const char *BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
+const char *BOLD_YELLOW_END = "</b></font>";
+const char *BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
+const char *BOLD_GOLD_END = "</b></font>";
+const char *BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
+const char *BOLD_WHITE_END = "</b></font>";
} //namespace Html
} //namespace Colors
} //namespace VcoreDPL
#include <stdexcept>
namespace VcoreDPL {
-namespace // anonymous
-{
+namespace { // anonymous
const size_t DEFAULT_ERRNO_STRING_SIZE = 32;
} // namespace anonymous
std::string GetErrnoString(int error)
{
- size_t size = DEFAULT_ERRNO_STRING_SIZE;
- char *buffer = NULL;
-
- for (;;) {
- // Add one extra characted for end of string null value
- char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1));
+ size_t size = DEFAULT_ERRNO_STRING_SIZE;
+ char *buffer = NULL;
- if (!newBuffer) {
- // Failed to realloc
- ::free(buffer);
- throw std::bad_alloc();
- }
+ for (;;) {
+ // Add one extra characted for end of string null value
+ char *newBuffer = static_cast<char *>(::realloc(buffer, size + 1));
- // Setup reallocated buffer
- buffer = newBuffer;
- ::memset(buffer, 0, size + 1);
+ if (!newBuffer) {
+ // Failed to realloc
+ ::free(buffer);
+ throw std::bad_alloc();
+ }
- // Try to retrieve error string
+ // Setup reallocated buffer
+ buffer = newBuffer;
+ ::memset(buffer, 0, size + 1);
+ // Try to retrieve error string
#if (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE
- // The XSI-compliant version of strerror_r() is provided if:
- int result = ::strerror_r(error, buffer, size);
+ // The XSI-compliant version of strerror_r() is provided if:
+ int result = ::strerror_r(error, buffer, size);
+
+ if (result == 0) {
+ ScopedFree<char> scopedBufferFree(buffer);
+ return std::string(buffer);
+ }
- if (result == 0) {
- ScopedFree<char> scopedBufferFree(buffer);
- return std::string(buffer);
- }
#else
- errno = 0;
+ errno = 0;
+ // Otherwise, the GNU-specific version is provided.
+ char *result = ::strerror_r(error, buffer, size);
- // Otherwise, the GNU-specific version is provided.
- char *result = ::strerror_r(error, buffer, size);
+ if (result != NULL) {
+ ScopedFree<char> scopedBufferFree(buffer);
+ return std::string(result);
+ }
- if (result != NULL) {
- ScopedFree<char> scopedBufferFree(buffer);
- return std::string(result);
- }
#endif
- // Interpret errors
- switch (errno) {
- case EINVAL:
- // We got an invalid errno value
- ::free(buffer);
- ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error);
+ // Interpret errors
+ switch (errno) {
+ case EINVAL:
+ // We got an invalid errno value
+ ::free(buffer);
+ ThrowMsg(InvalidErrnoValue, "Invalid errno value: " << error);
- case ERANGE:
- // Incease buffer size and retry
- size <<= 1;
- continue;
+ case ERANGE:
+ // Incease buffer size and retry
+ size <<= 1;
+ continue;
- default:
- AssertMsg(0, "Invalid errno value after call to strerror_r!");
- }
- }
+ default:
+ AssertMsg(0, "Invalid errno value after call to strerror_r!");
+ }
+ }
}
} // namespace VcoreDPL
#include <iostream>
namespace VcoreDPL {
-Exception* Exception::m_lastException = NULL;
+Exception *Exception::m_lastException = NULL;
unsigned int Exception::m_exceptionCount = 0;
void (*Exception::m_terminateHandler)() = NULL;
void LogUnhandledException(const std::string &str)
{
- std::cerr << str << std::endl;
+ std::cerr << str << std::endl;
}
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function)
+ const char *filename,
+ int line,
+ const char *function)
{
- std::cerr << "Exception occured on file[" << filename
- << "] line[" << line
- << "] function[" << function
- << "] msg[" << str << "]" << std::endl;
+ std::cerr << "Exception occured on file[" << filename
+ << "] line[" << line
+ << "] function[" << function
+ << "] msg[" << str << "]" << std::endl;
}
} // namespace VcoreDPL
#include <cstdlib>
#define GREEN_RESULT_OK "[%s%s%s]\n", BOLD_GREEN_BEGIN, " OK ", \
- BOLD_GREEN_END
+ BOLD_GREEN_END
namespace VcoreDPL {
namespace Test {
bool ParseCollectorFileArg(const std::string &arg, std::string &filename)
{
- const std::string argname = "--file=";
- if (arg.find(argname) == 0 ) {
- filename = arg.substr(argname.size());
- return true;
- }
- return false;
+ const std::string argname = "--file=";
+
+ if (arg.find(argname) == 0) {
+ filename = arg.substr(argname.size());
+ return true;
+ }
+
+ return false;
}
-class Statistic
-{
- public:
- Statistic() :
- m_failed(0),
- m_ignored(0),
- m_passed(0),
- m_count(0)
- {}
-
- void AddTest(TestResultsCollectorBase::FailStatus::Type type)
- {
- ++m_count;
- switch (type) {
- case TestResultsCollectorBase::FailStatus::INTERNAL:
- case TestResultsCollectorBase::FailStatus::FAILED: ++m_failed;
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED: ++m_ignored;
- break;
- case TestResultsCollectorBase::FailStatus::NONE: ++m_passed;
- break;
- default:
- Assert(false && "Bad FailStatus");
- }
- }
-
- std::size_t GetTotal() const
- {
- return m_count;
- }
- std::size_t GetPassed() const
- {
- return m_passed;
- }
- std::size_t GetSuccesed() const
- {
- return m_passed;
- }
- std::size_t GetFailed() const
- {
- return m_failed;
- }
- std::size_t GetIgnored() const
- {
- return m_ignored;
- }
- float GetPassedOrIgnoredPercend() const
- {
- float passIgnoredPercent =
- 100.0f * (static_cast<float>(m_passed)
- + static_cast<float>(m_ignored))
- / static_cast<float>(m_count);
- return passIgnoredPercent;
- }
-
- private:
- std::size_t m_failed;
- std::size_t m_ignored;
- std::size_t m_passed;
- std::size_t m_count;
+class Statistic {
+public:
+ Statistic() :
+ m_failed(0),
+ m_ignored(0),
+ m_passed(0),
+ m_count(0)
+ {}
+
+ void AddTest(TestResultsCollectorBase::FailStatus::Type type)
+ {
+ ++m_count;
+
+ switch (type) {
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ ++m_failed;
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ ++m_ignored;
+ break;
+
+ case TestResultsCollectorBase::FailStatus::NONE:
+ ++m_passed;
+ break;
+
+ default:
+ Assert(false && "Bad FailStatus");
+ }
+ }
+
+ std::size_t GetTotal() const
+ {
+ return m_count;
+ }
+ std::size_t GetPassed() const
+ {
+ return m_passed;
+ }
+ std::size_t GetSuccesed() const
+ {
+ return m_passed;
+ }
+ std::size_t GetFailed() const
+ {
+ return m_failed;
+ }
+ std::size_t GetIgnored() const
+ {
+ return m_ignored;
+ }
+ float GetPassedOrIgnoredPercend() const
+ {
+ float passIgnoredPercent =
+ 100.0f * (static_cast<float>(m_passed)
+ + static_cast<float>(m_ignored))
+ / static_cast<float>(m_count);
+ return passIgnoredPercent;
+ }
+
+private:
+ std::size_t m_failed;
+ std::size_t m_ignored;
+ std::size_t m_passed;
+ std::size_t m_count;
};
class ConsoleCollector :
- public TestResultsCollectorBase
-{
- public:
- static TestResultsCollectorBase* Constructor();
-
- private:
- ConsoleCollector() {}
-
- virtual void CollectCurrentTestGroupName(const std::string& name)
- {
- printf("Starting group %s\n", name.c_str());
- m_currentGroup = name;
- }
-
- virtual void Finish()
- {
- using namespace VcoreDPL::Colors::Text;
-
- // Show result
- FOREACH(group, m_groupsStats) {
- PrintStats(group->first, group->second);
- }
- PrintStats("All tests together", m_stats);
- }
-
- virtual void CollectResult(const std::string& id,
- const std::string& /*description*/,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "")
- {
- using namespace VcoreDPL::Colors::Text;
- std::string tmp = "'" + id + "' ...";
-
- printf("Running test case %-60s", tmp.c_str());
- switch (status) {
- case TestResultsCollectorBase::FailStatus::NONE:
- printf(GREEN_RESULT_OK);
- break;
- case TestResultsCollectorBase::FailStatus::FAILED:
- PrintfErrorMessage(" FAILED ", reason, true);
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED:
- PrintfIgnoredMessage("Ignored ", reason, true);
- break;
- case TestResultsCollectorBase::FailStatus::INTERNAL:
- PrintfErrorMessage("INTERNAL", reason, true);
- break;
- default:
- Assert(false && "Bad status");
- }
- m_stats.AddTest(status);
- m_groupsStats[m_currentGroup].AddTest(status);
- }
-
- void PrintfErrorMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- using namespace VcoreDPL::Colors::Text;
- if (verbosity) {
- printf("[%s%s%s] %s%s%s\n",
- BOLD_RED_BEGIN,
- type,
- BOLD_RED_END,
- BOLD_YELLOW_BEGIN,
- message.c_str(),
- BOLD_YELLOW_END);
- } else {
- printf("[%s%s%s]\n",
- BOLD_RED_BEGIN,
- type,
- BOLD_RED_END);
- }
- }
-
- void PrintfIgnoredMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- using namespace VcoreDPL::Colors::Text;
- if (verbosity) {
- printf("[%s%s%s] %s%s%s\n",
- CYAN_BEGIN,
- type,
- CYAN_END,
- BOLD_GOLD_BEGIN,
- message.c_str(),
- BOLD_GOLD_END);
- } else {
- printf("[%s%s%s]\n",
- CYAN_BEGIN,
- type,
- CYAN_END);
- }
- }
-
- void PrintStats(const std::string& title, const Statistic& stats)
- {
- using namespace VcoreDPL::Colors::Text;
- printf("\n%sResults [%s]: %s\n", BOLD_GREEN_BEGIN,
- title.c_str(), BOLD_GREEN_END);
- printf("%s%s%3zu%s\n",
- CYAN_BEGIN,
- "Total tests: ",
- stats.GetTotal(),
- CYAN_END);
- printf(" %s%s%3zu%s\n",
- CYAN_BEGIN,
- "Succeeded: ",
- stats.GetPassed(),
- CYAN_END);
- printf(" %s%s%3zu%s\n",
- CYAN_BEGIN,
- "Failed: ",
- stats.GetFailed(),
- CYAN_END);
- printf(" %s%s%3zu%s\n",
- CYAN_BEGIN,
- "Ignored: ",
- stats.GetIgnored(),
- CYAN_END);
- }
-
- Statistic m_stats;
- std::map<std::string, Statistic> m_groupsStats;
- std::string m_currentGroup;
+ public TestResultsCollectorBase {
+public:
+ static TestResultsCollectorBase *Constructor();
+
+private:
+ ConsoleCollector() {}
+
+ virtual void CollectCurrentTestGroupName(const std::string &name)
+ {
+ printf("Starting group %s\n", name.c_str());
+ m_currentGroup = name;
+ }
+
+ virtual void Finish()
+ {
+ using namespace VcoreDPL::Colors::Text;
+ // Show result
+ FOREACH(group, m_groupsStats) {
+ PrintStats(group->first, group->second);
+ }
+ PrintStats("All tests together", m_stats);
+ }
+
+ virtual void CollectResult(const std::string &id,
+ const std::string & /*description*/,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "")
+ {
+ using namespace VcoreDPL::Colors::Text;
+ std::string tmp = "'" + id + "' ...";
+ printf("Running test case %-60s", tmp.c_str());
+
+ switch (status) {
+ case TestResultsCollectorBase::FailStatus::NONE:
+ printf(GREEN_RESULT_OK);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ PrintfErrorMessage(" FAILED ", reason, true);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ PrintfIgnoredMessage("Ignored ", reason, true);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ PrintfErrorMessage("INTERNAL", reason, true);
+ break;
+
+ default:
+ Assert(false && "Bad status");
+ }
+
+ m_stats.AddTest(status);
+ m_groupsStats[m_currentGroup].AddTest(status);
+ }
+
+ void PrintfErrorMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ using namespace VcoreDPL::Colors::Text;
+
+ if (verbosity) {
+ printf("[%s%s%s] %s%s%s\n",
+ BOLD_RED_BEGIN,
+ type,
+ BOLD_RED_END,
+ BOLD_YELLOW_BEGIN,
+ message.c_str(),
+ BOLD_YELLOW_END);
+ } else {
+ printf("[%s%s%s]\n",
+ BOLD_RED_BEGIN,
+ type,
+ BOLD_RED_END);
+ }
+ }
+
+ void PrintfIgnoredMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ using namespace VcoreDPL::Colors::Text;
+
+ if (verbosity) {
+ printf("[%s%s%s] %s%s%s\n",
+ CYAN_BEGIN,
+ type,
+ CYAN_END,
+ BOLD_GOLD_BEGIN,
+ message.c_str(),
+ BOLD_GOLD_END);
+ } else {
+ printf("[%s%s%s]\n",
+ CYAN_BEGIN,
+ type,
+ CYAN_END);
+ }
+ }
+
+ void PrintStats(const std::string &title, const Statistic &stats)
+ {
+ using namespace VcoreDPL::Colors::Text;
+ printf("\n%sResults [%s]: %s\n", BOLD_GREEN_BEGIN,
+ title.c_str(), BOLD_GREEN_END);
+ printf("%s%s%3zu%s\n",
+ CYAN_BEGIN,
+ "Total tests: ",
+ stats.GetTotal(),
+ CYAN_END);
+ printf(" %s%s%3zu%s\n",
+ CYAN_BEGIN,
+ "Succeeded: ",
+ stats.GetPassed(),
+ CYAN_END);
+ printf(" %s%s%3zu%s\n",
+ CYAN_BEGIN,
+ "Failed: ",
+ stats.GetFailed(),
+ CYAN_END);
+ printf(" %s%s%3zu%s\n",
+ CYAN_BEGIN,
+ "Ignored: ",
+ stats.GetIgnored(),
+ CYAN_END);
+ }
+
+ Statistic m_stats;
+ std::map<std::string, Statistic> m_groupsStats;
+ std::string m_currentGroup;
};
-TestResultsCollectorBase* ConsoleCollector::Constructor()
+TestResultsCollectorBase *ConsoleCollector::Constructor()
{
- return new ConsoleCollector();
+ return new ConsoleCollector();
}
class HtmlCollector :
- public TestResultsCollectorBase
-{
- public:
- static TestResultsCollectorBase* Constructor();
-
- private:
- HtmlCollector() : m_filename(DEFAULT_HTML_FILE_NAME) {}
-
- virtual void CollectCurrentTestGroupName(const std::string& name)
- {
- fprintf(m_fp.Get(), "<b>Starting group %s", name.c_str());
- m_currentGroup = name;
- }
-
- virtual bool Configure()
- {
- m_fp.Reset(fopen(m_filename.c_str(), "w"));
- if (!m_fp)
- return false;
-
- return true;
- }
- virtual std::string CollectorSpecificHelp() const
- {
- return "--file=<filename> - name of file for output\n"
- " default - index.html\n";
- }
-
- virtual void Start(int count)
- {
- DPL_UNUSED_PARAM(count);
- AssertMsg(!!m_fp, "File handle must not be null");
- fprintf(m_fp.Get(),
- "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0"
- "Transitional//EN\" "
- "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
- ">\n");
- fprintf(m_fp.Get(),
- "<html xmlns=\"http://www.w3.org/1999/xhtml\" "
- "lang=\"en\" dir=\"ltr\">\n");
- fprintf(m_fp.Get(), "<body style=\"background-color: black;\">\n");
- fprintf(m_fp.Get(), "<pre>\n");
- fprintf(m_fp.Get(), "<font color=\"white\">\n");
- }
-
- virtual void Finish()
- {
- using namespace VcoreDPL::Colors::Html;
- // Show result
- FOREACH(group, m_groupsStats) {
- PrintStats(group->first, group->second);
- }
- PrintStats("All tests together", m_stats);
- fprintf(m_fp.Get(), "</font>\n");
- fprintf(m_fp.Get(), "</pre>\n");
- fprintf(m_fp.Get(), "</body>\n");
- fprintf(m_fp.Get(), "</html>\n");
- }
-
- virtual bool ParseCollectorSpecificArg(const std::string& arg)
- {
- return ParseCollectorFileArg(arg, m_filename);
- }
-
- virtual void CollectResult(const std::string& id,
- const std::string& /*description*/,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "")
- {
- using namespace VcoreDPL::Colors::Html;
- std::string tmp = "'" + id + "' ...";
-
- fprintf(m_fp.Get(), "Running test case %-100s", tmp.c_str());
- switch (status) {
- case TestResultsCollectorBase::FailStatus::NONE:
- fprintf(m_fp.Get(), GREEN_RESULT_OK);
- break;
- case TestResultsCollectorBase::FailStatus::FAILED:
- PrintfErrorMessage(" FAILED ", reason, true);
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED:
- PrintfIgnoredMessage("Ignored ", reason, true);
- break;
- case TestResultsCollectorBase::FailStatus::INTERNAL:
- PrintfErrorMessage("INTERNAL", reason, true);
- break;
- default:
- Assert(false && "Bad status");
- }
- m_groupsStats[m_currentGroup].AddTest(status);
- m_stats.AddTest(status);
- }
-
- void PrintfErrorMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- using namespace VcoreDPL::Colors::Html;
- if (verbosity) {
- fprintf(m_fp.Get(),
- "[%s%s%s] %s%s%s\n",
- BOLD_RED_BEGIN,
- type,
- BOLD_RED_END,
- BOLD_YELLOW_BEGIN,
- message.c_str(),
- BOLD_YELLOW_END);
- } else {
- fprintf(m_fp.Get(),
- "[%s%s%s]\n",
- BOLD_RED_BEGIN,
- type,
- BOLD_RED_END);
- }
- }
-
- void PrintfIgnoredMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- using namespace VcoreDPL::Colors::Html;
-
- if (verbosity) {
- fprintf(m_fp.Get(),
- "[%s%s%s] %s%s%s\n",
- CYAN_BEGIN,
- type,
- CYAN_END,
- BOLD_GOLD_BEGIN,
- message.c_str(),
- BOLD_GOLD_END);
- } else {
- fprintf(m_fp.Get(),
- "[%s%s%s]\n",
- CYAN_BEGIN,
- type,
- CYAN_END);
- }
- }
-
- void PrintStats(const std::string& name, const Statistic& stats)
- {
- using namespace VcoreDPL::Colors::Html;
- fprintf(
- m_fp.Get(), "\n%sResults [%s]:%s\n", BOLD_GREEN_BEGIN,
- name.c_str(), BOLD_GREEN_END);
- fprintf(
- m_fp.Get(), "%s%s%3zu%s\n", CYAN_BEGIN,
- "Total tests: ", stats.GetTotal(), CYAN_END);
- fprintf(
- m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
- "Succeeded: ", stats.GetPassed(), CYAN_END);
- fprintf(
- m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
- "Failed: ", stats.GetFailed(), CYAN_END);
- fprintf(
- m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
- "Ignored: ", stats.GetIgnored(), CYAN_END);
- }
-
- std::string m_filename;
- ScopedFClose m_fp;
- Statistic m_stats;
- std::string m_currentGroup;
- std::map<std::string, Statistic> m_groupsStats;
+ public TestResultsCollectorBase {
+public:
+ static TestResultsCollectorBase *Constructor();
+
+private:
+ HtmlCollector() : m_filename(DEFAULT_HTML_FILE_NAME) {}
+
+ virtual void CollectCurrentTestGroupName(const std::string &name)
+ {
+ fprintf(m_fp.Get(), "<b>Starting group %s", name.c_str());
+ m_currentGroup = name;
+ }
+
+ virtual bool Configure()
+ {
+ m_fp.Reset(fopen(m_filename.c_str(), "w"));
+
+ if (!m_fp)
+ return false;
+
+ return true;
+ }
+ virtual std::string CollectorSpecificHelp() const
+ {
+ return "--file=<filename> - name of file for output\n"
+ " default - index.html\n";
+ }
+
+ virtual void Start(int count)
+ {
+ DPL_UNUSED_PARAM(count);
+ AssertMsg(!!m_fp, "File handle must not be null");
+ fprintf(m_fp.Get(),
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0"
+ "Transitional//EN\" "
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
+ ">\n");
+ fprintf(m_fp.Get(),
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" "
+ "lang=\"en\" dir=\"ltr\">\n");
+ fprintf(m_fp.Get(), "<body style=\"background-color: black;\">\n");
+ fprintf(m_fp.Get(), "<pre>\n");
+ fprintf(m_fp.Get(), "<font color=\"white\">\n");
+ }
+
+ virtual void Finish()
+ {
+ using namespace VcoreDPL::Colors::Html;
+ // Show result
+ FOREACH(group, m_groupsStats) {
+ PrintStats(group->first, group->second);
+ }
+ PrintStats("All tests together", m_stats);
+ fprintf(m_fp.Get(), "</font>\n");
+ fprintf(m_fp.Get(), "</pre>\n");
+ fprintf(m_fp.Get(), "</body>\n");
+ fprintf(m_fp.Get(), "</html>\n");
+ }
+
+ virtual bool ParseCollectorSpecificArg(const std::string &arg)
+ {
+ return ParseCollectorFileArg(arg, m_filename);
+ }
+
+ virtual void CollectResult(const std::string &id,
+ const std::string & /*description*/,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "")
+ {
+ using namespace VcoreDPL::Colors::Html;
+ std::string tmp = "'" + id + "' ...";
+ fprintf(m_fp.Get(), "Running test case %-100s", tmp.c_str());
+
+ switch (status) {
+ case TestResultsCollectorBase::FailStatus::NONE:
+ fprintf(m_fp.Get(), GREEN_RESULT_OK);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ PrintfErrorMessage(" FAILED ", reason, true);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ PrintfIgnoredMessage("Ignored ", reason, true);
+ break;
+
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ PrintfErrorMessage("INTERNAL", reason, true);
+ break;
+
+ default:
+ Assert(false && "Bad status");
+ }
+
+ m_groupsStats[m_currentGroup].AddTest(status);
+ m_stats.AddTest(status);
+ }
+
+ void PrintfErrorMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ using namespace VcoreDPL::Colors::Html;
+
+ if (verbosity) {
+ fprintf(m_fp.Get(),
+ "[%s%s%s] %s%s%s\n",
+ BOLD_RED_BEGIN,
+ type,
+ BOLD_RED_END,
+ BOLD_YELLOW_BEGIN,
+ message.c_str(),
+ BOLD_YELLOW_END);
+ } else {
+ fprintf(m_fp.Get(),
+ "[%s%s%s]\n",
+ BOLD_RED_BEGIN,
+ type,
+ BOLD_RED_END);
+ }
+ }
+
+ void PrintfIgnoredMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ using namespace VcoreDPL::Colors::Html;
+
+ if (verbosity) {
+ fprintf(m_fp.Get(),
+ "[%s%s%s] %s%s%s\n",
+ CYAN_BEGIN,
+ type,
+ CYAN_END,
+ BOLD_GOLD_BEGIN,
+ message.c_str(),
+ BOLD_GOLD_END);
+ } else {
+ fprintf(m_fp.Get(),
+ "[%s%s%s]\n",
+ CYAN_BEGIN,
+ type,
+ CYAN_END);
+ }
+ }
+
+ void PrintStats(const std::string &name, const Statistic &stats)
+ {
+ using namespace VcoreDPL::Colors::Html;
+ fprintf(
+ m_fp.Get(), "\n%sResults [%s]:%s\n", BOLD_GREEN_BEGIN,
+ name.c_str(), BOLD_GREEN_END);
+ fprintf(
+ m_fp.Get(), "%s%s%3zu%s\n", CYAN_BEGIN,
+ "Total tests: ", stats.GetTotal(), CYAN_END);
+ fprintf(
+ m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
+ "Succeeded: ", stats.GetPassed(), CYAN_END);
+ fprintf(
+ m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
+ "Failed: ", stats.GetFailed(), CYAN_END);
+ fprintf(
+ m_fp.Get(), " %s%s%3zu%s\n", CYAN_BEGIN,
+ "Ignored: ", stats.GetIgnored(), CYAN_END);
+ }
+
+ std::string m_filename;
+ ScopedFClose m_fp;
+ Statistic m_stats;
+ std::string m_currentGroup;
+ std::map<std::string, Statistic> m_groupsStats;
};
-TestResultsCollectorBase* HtmlCollector::Constructor()
+TestResultsCollectorBase *HtmlCollector::Constructor()
{
- return new HtmlCollector();
+ return new HtmlCollector();
}
class XmlCollector :
- public TestResultsCollectorBase
-{
- public:
- static TestResultsCollectorBase* Constructor();
-
- private:
- XmlCollector() : m_filename(DEFAULT_XML_FILE_NAME) {}
-
- virtual void CollectCurrentTestGroupName(const std::string& name)
- {
- std::size_t pos = GetCurrentGroupPosition();
- if (std::string::npos != pos) {
- GroupFinish(pos);
- FlushOutput();
- m_stats = Statistic();
- }
-
- pos = m_outputBuffer.find("</testsuites>");
- if (std::string::npos == pos) {
- ThrowMsg(VcoreDPL::Exception, "Could not find test suites closing tag");
- }
- GroupStart(pos, name);
- }
-
- void GroupStart(const std::size_t pos, const std::string& name)
- {
- std::stringstream groupHeader;
- groupHeader << "\n\t<testsuite";
- groupHeader << " name=\"" << EscapeSpecialCharacters(name) << "\"";
- groupHeader << R"( tests="1")"; // include SegFault
- groupHeader << R"( failures="1")"; // include SegFault
- groupHeader << R"( skipped="0")";
- groupHeader << ">";
-
- groupHeader << "\n\t\t<testcase name=\"unknown\" status=\"FAILED\">";
- groupHeader <<
- "\n\t\t\t<failure type=\"FAILED\" message=\"segmentation fault\"/>";
- groupHeader << "\n\t\t</testcase>";
-
- groupHeader << "\n\t</testsuite>";
-
- m_outputBuffer.insert(pos - 1, groupHeader.str());
- }
-
- virtual bool Configure()
- {
- m_fp.Reset(fopen(m_filename.c_str(), "w"));
- if (!m_fp)
- return false;
-
- return true;
- }
-
- virtual std::string CollectorSpecificHelp() const
- {
- return "--file=<filename> - name of file for output\n"
- " default - results.xml\n";
- }
-
- virtual void Start(int count)
- {
- AssertMsg(!!m_fp, "File handle must not be null");
- m_outputBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
- m_outputBuffer.append("<testsuites ");
- if(count >= 0)
- {
- m_outputBuffer.append("total=\"");
- m_outputBuffer.append(VcoreDPL::lexical_cast<std::string>(count));
- m_outputBuffer.append("\"");
- }
- m_outputBuffer.append(" >\n</testsuites>");
- FlushOutput();
- }
-
- virtual void Finish()
- {
- std::size_t pos = GetCurrentGroupPosition();
- if (std::string::npos != pos) {
- GroupFinish(pos);
- FlushOutput();
- }
- }
-
- virtual bool ParseCollectorSpecificArg(const std::string& arg)
- {
- return ParseCollectorFileArg(arg, m_filename);
- }
-
- virtual void CollectResult(const std::string& id,
- const std::string& /*description*/,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "")
- {
- m_resultBuffer.erase();
- m_resultBuffer.append("\t\t<testcase name=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(id));
- m_resultBuffer.append("\"");
- switch (status) {
- case TestResultsCollectorBase::FailStatus::NONE:
- m_resultBuffer.append(" status=\"OK\"/>\n");
- break;
- case TestResultsCollectorBase::FailStatus::FAILED:
- m_resultBuffer.append(" status=\"FAILED\">\n");
- PrintfErrorMessage("FAILED", EscapeSpecialCharacters(reason), true);
- m_resultBuffer.append("\t\t</testcase>\n");
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED:
- m_resultBuffer.append(" status=\"Ignored\">\n");
- PrintfIgnoredMessage("Ignored", EscapeSpecialCharacters(
- reason), true);
- m_resultBuffer.append("\t\t</testcase>\n");
- break;
- case TestResultsCollectorBase::FailStatus::INTERNAL:
- m_resultBuffer.append(" status=\"FAILED\">\n");
- PrintfErrorMessage("INTERNAL", EscapeSpecialCharacters(
- reason), true);
- m_resultBuffer.append("\t\t</testcase>");
- break;
- default:
- Assert(false && "Bad status");
- }
- std::size_t group_pos = GetCurrentGroupPosition();
- if (std::string::npos == group_pos) {
- ThrowMsg(VcoreDPL::Exception, "No current group set");
- }
-
- std::size_t last_case_pos = m_outputBuffer.find(
- "<testcase name=\"unknown\"",
- group_pos);
- if (std::string::npos == last_case_pos) {
- ThrowMsg(VcoreDPL::Exception, "Could not find SegFault test case");
- }
- m_outputBuffer.insert(last_case_pos - 2, m_resultBuffer);
-
- m_stats.AddTest(status);
-
- UpdateGroupHeader(group_pos,
- m_stats.GetTotal() + 1, // include SegFault
- m_stats.GetFailed() + 1, // include SegFault
- m_stats.GetIgnored());
- FlushOutput();
- }
-
- std::size_t GetCurrentGroupPosition() const
- {
- return m_outputBuffer.rfind("<testsuite ");
- }
-
- void UpdateGroupHeader(const std::size_t groupPosition,
- const unsigned int tests,
- const unsigned int failures,
- const unsigned int skipped)
- {
- UpdateElementAttribute(groupPosition, "tests", UIntToString(tests));
- UpdateElementAttribute(groupPosition, "failures", UIntToString(failures));
- UpdateElementAttribute(groupPosition, "skipped", UIntToString(skipped));
- }
-
- void UpdateElementAttribute(const std::size_t elementPosition,
- const std::string& name,
- const std::string& value)
- {
- std::string pattern = name + "=\"";
-
- std::size_t start = m_outputBuffer.find(pattern, elementPosition);
- if (std::string::npos == start) {
- ThrowMsg(VcoreDPL::Exception,
- "Could not find attribute " << name << " beginning");
- }
-
- std::size_t end = m_outputBuffer.find("\"", start + pattern.length());
- if (std::string::npos == end) {
- ThrowMsg(VcoreDPL::Exception,
- "Could not find attribute " << name << " end");
- }
-
- m_outputBuffer.replace(start + pattern.length(),
- end - start - pattern.length(),
- value);
- }
-
- std::string UIntToString(const unsigned int value)
- {
- std::stringstream result;
- result << value;
- return result.str();
- }
-
- void GroupFinish(const std::size_t groupPosition)
- {
- std::size_t segFaultStart =
- m_outputBuffer.find("<testcase name=\"unknown\"", groupPosition);
- if (std::string::npos == segFaultStart) {
- ThrowMsg(VcoreDPL::Exception,
- "Could not find SegFault test case start position");
- }
- segFaultStart -= 2; // to erase tabs
-
- std::string closeTag = "</testcase>";
- std::size_t segFaultEnd = m_outputBuffer.find(closeTag, segFaultStart);
- if (std::string::npos == segFaultEnd) {
- ThrowMsg(VcoreDPL::Exception,
- "Could not find SegFault test case end position");
- }
- segFaultEnd += closeTag.length() + 1; // to erase new line
-
- m_outputBuffer.erase(segFaultStart, segFaultEnd - segFaultStart);
-
- UpdateGroupHeader(groupPosition,
- m_stats.GetTotal(),
- m_stats.GetFailed(),
- m_stats.GetIgnored());
- }
-
- void FlushOutput()
- {
- int fd = fileno(m_fp.Get());
- if (-1 == fd) {
- int error = errno;
- ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
- }
-
- if (-1 == TEMP_FAILURE_RETRY(ftruncate(fd, 0L))) {
- int error = errno;
- ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
- }
-
- if (-1 == TEMP_FAILURE_RETRY(fseek(m_fp.Get(), 0L, SEEK_SET))) {
- int error = errno;
- ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
- }
-
- if (m_outputBuffer.size() !=
- fwrite(m_outputBuffer.c_str(), 1, m_outputBuffer.size(),
- m_fp.Get()))
- {
- int error = errno;
- ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
- }
-
- if (-1 == TEMP_FAILURE_RETRY(fflush(m_fp.Get()))) {
- int error = errno;
- ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
- }
- }
-
- void PrintfErrorMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- if (verbosity) {
- m_resultBuffer.append("\t\t\t<failure type=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(type));
- m_resultBuffer.append("\" message=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(message));
- m_resultBuffer.append("\"/>\n");
- } else {
- m_resultBuffer.append("\t\t\t<failure type=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(type));
- m_resultBuffer.append("\"/>\n");
- }
- }
-
- void PrintfIgnoredMessage(const char* type,
- const std::string& message,
- bool verbosity)
- {
- if (verbosity) {
- m_resultBuffer.append("\t\t\t<skipped type=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(type));
- m_resultBuffer.append("\" message=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(message));
- m_resultBuffer.append("\"/>\n");
- } else {
- m_resultBuffer.append("\t\t\t<skipped type=\"");
- m_resultBuffer.append(EscapeSpecialCharacters(type));
- m_resultBuffer.append("\"/>\n");
- }
- }
-
- std::string EscapeSpecialCharacters(std::string s)
- {
- for (unsigned int i = 0; i < s.size();) {
- switch (s[i]) {
- case '"':
- s.erase(i, 1);
- s.insert(i, """);
- i += 6;
- break;
-
- case '&':
- s.erase(i, 1);
- s.insert(i, "&");
- i += 5;
- break;
-
- case '<':
- s.erase(i, 1);
- s.insert(i, "<");
- i += 4;
- break;
-
- case '>':
- s.erase(i, 1);
- s.insert(i, ">");
- i += 4;
- break;
-
- case '\'':
- s.erase(i, 1);
- s.insert(i, "'");
- i += 5;
- break;
- default:
- ++i;
- break;
- }
- }
- return s;
- }
-
- std::string m_filename;
- ScopedFClose m_fp;
- Statistic m_stats;
- std::string m_outputBuffer;
- std::string m_resultBuffer;
+ public TestResultsCollectorBase {
+public:
+ static TestResultsCollectorBase *Constructor();
+
+private:
+ XmlCollector() : m_filename(DEFAULT_XML_FILE_NAME) {}
+
+ virtual void CollectCurrentTestGroupName(const std::string &name)
+ {
+ std::size_t pos = GetCurrentGroupPosition();
+
+ if (std::string::npos != pos) {
+ GroupFinish(pos);
+ FlushOutput();
+ m_stats = Statistic();
+ }
+
+ pos = m_outputBuffer.find("</testsuites>");
+
+ if (std::string::npos == pos) {
+ ThrowMsg(VcoreDPL::Exception, "Could not find test suites closing tag");
+ }
+
+ GroupStart(pos, name);
+ }
+
+ void GroupStart(const std::size_t pos, const std::string &name)
+ {
+ std::stringstream groupHeader;
+ groupHeader << "\n\t<testsuite";
+ groupHeader << " name=\"" << EscapeSpecialCharacters(name) << "\"";
+ groupHeader << R"( tests="1")"; // include SegFault
+ groupHeader << R"( failures="1")"; // include SegFault
+ groupHeader << R"( skipped="0")";
+ groupHeader << ">";
+ groupHeader << "\n\t\t<testcase name=\"unknown\" status=\"FAILED\">";
+ groupHeader <<
+ "\n\t\t\t<failure type=\"FAILED\" message=\"segmentation fault\"/>";
+ groupHeader << "\n\t\t</testcase>";
+ groupHeader << "\n\t</testsuite>";
+ m_outputBuffer.insert(pos - 1, groupHeader.str());
+ }
+
+ virtual bool Configure()
+ {
+ m_fp.Reset(fopen(m_filename.c_str(), "w"));
+
+ if (!m_fp)
+ return false;
+
+ return true;
+ }
+
+ virtual std::string CollectorSpecificHelp() const
+ {
+ return "--file=<filename> - name of file for output\n"
+ " default - results.xml\n";
+ }
+
+ virtual void Start(int count)
+ {
+ AssertMsg(!!m_fp, "File handle must not be null");
+ m_outputBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+ m_outputBuffer.append("<testsuites ");
+
+ if (count >= 0) {
+ m_outputBuffer.append("total=\"");
+ m_outputBuffer.append(VcoreDPL::lexical_cast<std::string>(count));
+ m_outputBuffer.append("\"");
+ }
+
+ m_outputBuffer.append(" >\n</testsuites>");
+ FlushOutput();
+ }
+
+ virtual void Finish()
+ {
+ std::size_t pos = GetCurrentGroupPosition();
+
+ if (std::string::npos != pos) {
+ GroupFinish(pos);
+ FlushOutput();
+ }
+ }
+
+ virtual bool ParseCollectorSpecificArg(const std::string &arg)
+ {
+ return ParseCollectorFileArg(arg, m_filename);
+ }
+
+ virtual void CollectResult(const std::string &id,
+ const std::string & /*description*/,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "")
+ {
+ m_resultBuffer.erase();
+ m_resultBuffer.append("\t\t<testcase name=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(id));
+ m_resultBuffer.append("\"");
+
+ switch (status) {
+ case TestResultsCollectorBase::FailStatus::NONE:
+ m_resultBuffer.append(" status=\"OK\"/>\n");
+ break;
+
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ m_resultBuffer.append(" status=\"FAILED\">\n");
+ PrintfErrorMessage("FAILED", EscapeSpecialCharacters(reason), true);
+ m_resultBuffer.append("\t\t</testcase>\n");
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ m_resultBuffer.append(" status=\"Ignored\">\n");
+ PrintfIgnoredMessage("Ignored", EscapeSpecialCharacters(
+ reason), true);
+ m_resultBuffer.append("\t\t</testcase>\n");
+ break;
+
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ m_resultBuffer.append(" status=\"FAILED\">\n");
+ PrintfErrorMessage("INTERNAL", EscapeSpecialCharacters(
+ reason), true);
+ m_resultBuffer.append("\t\t</testcase>");
+ break;
+
+ default:
+ Assert(false && "Bad status");
+ }
+
+ std::size_t group_pos = GetCurrentGroupPosition();
+
+ if (std::string::npos == group_pos) {
+ ThrowMsg(VcoreDPL::Exception, "No current group set");
+ }
+
+ std::size_t last_case_pos = m_outputBuffer.find(
+ "<testcase name=\"unknown\"",
+ group_pos);
+
+ if (std::string::npos == last_case_pos) {
+ ThrowMsg(VcoreDPL::Exception, "Could not find SegFault test case");
+ }
+
+ m_outputBuffer.insert(last_case_pos - 2, m_resultBuffer);
+ m_stats.AddTest(status);
+ UpdateGroupHeader(group_pos,
+ m_stats.GetTotal() + 1, // include SegFault
+ m_stats.GetFailed() + 1, // include SegFault
+ m_stats.GetIgnored());
+ FlushOutput();
+ }
+
+ std::size_t GetCurrentGroupPosition() const
+ {
+ return m_outputBuffer.rfind("<testsuite ");
+ }
+
+ void UpdateGroupHeader(const std::size_t groupPosition,
+ const unsigned int tests,
+ const unsigned int failures,
+ const unsigned int skipped)
+ {
+ UpdateElementAttribute(groupPosition, "tests", UIntToString(tests));
+ UpdateElementAttribute(groupPosition, "failures", UIntToString(failures));
+ UpdateElementAttribute(groupPosition, "skipped", UIntToString(skipped));
+ }
+
+ void UpdateElementAttribute(const std::size_t elementPosition,
+ const std::string &name,
+ const std::string &value)
+ {
+ std::string pattern = name + "=\"";
+ std::size_t start = m_outputBuffer.find(pattern, elementPosition);
+
+ if (std::string::npos == start) {
+ ThrowMsg(VcoreDPL::Exception,
+ "Could not find attribute " << name << " beginning");
+ }
+
+ std::size_t end = m_outputBuffer.find("\"", start + pattern.length());
+
+ if (std::string::npos == end) {
+ ThrowMsg(VcoreDPL::Exception,
+ "Could not find attribute " << name << " end");
+ }
+
+ m_outputBuffer.replace(start + pattern.length(),
+ end - start - pattern.length(),
+ value);
+ }
+
+ std::string UIntToString(const unsigned int value)
+ {
+ std::stringstream result;
+ result << value;
+ return result.str();
+ }
+
+ void GroupFinish(const std::size_t groupPosition)
+ {
+ std::size_t segFaultStart =
+ m_outputBuffer.find("<testcase name=\"unknown\"", groupPosition);
+
+ if (std::string::npos == segFaultStart) {
+ ThrowMsg(VcoreDPL::Exception,
+ "Could not find SegFault test case start position");
+ }
+
+ segFaultStart -= 2; // to erase tabs
+ std::string closeTag = "</testcase>";
+ std::size_t segFaultEnd = m_outputBuffer.find(closeTag, segFaultStart);
+
+ if (std::string::npos == segFaultEnd) {
+ ThrowMsg(VcoreDPL::Exception,
+ "Could not find SegFault test case end position");
+ }
+
+ segFaultEnd += closeTag.length() + 1; // to erase new line
+ m_outputBuffer.erase(segFaultStart, segFaultEnd - segFaultStart);
+ UpdateGroupHeader(groupPosition,
+ m_stats.GetTotal(),
+ m_stats.GetFailed(),
+ m_stats.GetIgnored());
+ }
+
+ void FlushOutput()
+ {
+ int fd = fileno(m_fp.Get());
+
+ if (-1 == fd) {
+ int error = errno;
+ ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
+ }
+
+ if (-1 == TEMP_FAILURE_RETRY(ftruncate(fd, 0L))) {
+ int error = errno;
+ ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
+ }
+
+ if (-1 == TEMP_FAILURE_RETRY(fseek(m_fp.Get(), 0L, SEEK_SET))) {
+ int error = errno;
+ ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
+ }
+
+ if (m_outputBuffer.size() !=
+ fwrite(m_outputBuffer.c_str(), 1, m_outputBuffer.size(),
+ m_fp.Get())) {
+ int error = errno;
+ ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
+ }
+
+ if (-1 == TEMP_FAILURE_RETRY(fflush(m_fp.Get()))) {
+ int error = errno;
+ ThrowMsg(VcoreDPL::Exception, VcoreDPL::GetErrnoString(error));
+ }
+ }
+
+ void PrintfErrorMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ if (verbosity) {
+ m_resultBuffer.append("\t\t\t<failure type=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(type));
+ m_resultBuffer.append("\" message=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(message));
+ m_resultBuffer.append("\"/>\n");
+ } else {
+ m_resultBuffer.append("\t\t\t<failure type=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(type));
+ m_resultBuffer.append("\"/>\n");
+ }
+ }
+
+ void PrintfIgnoredMessage(const char *type,
+ const std::string &message,
+ bool verbosity)
+ {
+ if (verbosity) {
+ m_resultBuffer.append("\t\t\t<skipped type=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(type));
+ m_resultBuffer.append("\" message=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(message));
+ m_resultBuffer.append("\"/>\n");
+ } else {
+ m_resultBuffer.append("\t\t\t<skipped type=\"");
+ m_resultBuffer.append(EscapeSpecialCharacters(type));
+ m_resultBuffer.append("\"/>\n");
+ }
+ }
+
+ std::string EscapeSpecialCharacters(std::string s)
+ {
+ for (unsigned int i = 0; i < s.size();) {
+ switch (s[i]) {
+ case '"':
+ s.erase(i, 1);
+ s.insert(i, """);
+ i += 6;
+ break;
+
+ case '&':
+ s.erase(i, 1);
+ s.insert(i, "&");
+ i += 5;
+ break;
+
+ case '<':
+ s.erase(i, 1);
+ s.insert(i, "<");
+ i += 4;
+ break;
+
+ case '>':
+ s.erase(i, 1);
+ s.insert(i, ">");
+ i += 4;
+ break;
+
+ case '\'':
+ s.erase(i, 1);
+ s.insert(i, "'");
+ i += 5;
+ break;
+
+ default:
+ ++i;
+ break;
+ }
+ }
+
+ return s;
+ }
+
+ std::string m_filename;
+ ScopedFClose m_fp;
+ Statistic m_stats;
+ std::string m_outputBuffer;
+ std::string m_resultBuffer;
};
-TestResultsCollectorBase* XmlCollector::Constructor()
+TestResultsCollectorBase *XmlCollector::Constructor()
{
- return new XmlCollector();
+ return new XmlCollector();
}
class CSVCollector :
- public TestResultsCollectorBase
-{
- public:
- static TestResultsCollectorBase* Constructor();
-
- private:
- CSVCollector() {}
-
- virtual void Start(int count)
- {
- DPL_UNUSED_PARAM(count);
- printf("GROUP;ID;RESULT;REASON\n");
- }
-
- virtual void CollectCurrentTestGroupName(const std::string& name)
- {
- m_currentGroup = name;
- }
-
- virtual void CollectResult(const std::string& id,
- const std::string& /*description*/,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "")
- {
- std::string statusMsg = "";
- switch (status) {
- case TestResultsCollectorBase::FailStatus::NONE: statusMsg = "OK";
- break;
- case TestResultsCollectorBase::FailStatus::FAILED: statusMsg = "FAILED";
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED: statusMsg =
- "IGNORED";
- break;
- case TestResultsCollectorBase::FailStatus::INTERNAL: statusMsg =
- "FAILED";
- break;
- default:
- Assert(false && "Bad status");
- }
- printf("%s;%s;%s;%s\n",
- m_currentGroup.c_str(),
- id.c_str(),
- statusMsg.c_str(),
- reason.c_str());
- }
-
- std::string m_currentGroup;
+ public TestResultsCollectorBase {
+public:
+ static TestResultsCollectorBase *Constructor();
+
+private:
+ CSVCollector() {}
+
+ virtual void Start(int count)
+ {
+ DPL_UNUSED_PARAM(count);
+ printf("GROUP;ID;RESULT;REASON\n");
+ }
+
+ virtual void CollectCurrentTestGroupName(const std::string &name)
+ {
+ m_currentGroup = name;
+ }
+
+ virtual void CollectResult(const std::string &id,
+ const std::string & /*description*/,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "")
+ {
+ std::string statusMsg = "";
+
+ switch (status) {
+ case TestResultsCollectorBase::FailStatus::NONE:
+ statusMsg = "OK";
+ break;
+
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ statusMsg = "FAILED";
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ statusMsg =
+ "IGNORED";
+ break;
+
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ statusMsg =
+ "FAILED";
+ break;
+
+ default:
+ Assert(false && "Bad status");
+ }
+
+ printf("%s;%s;%s;%s\n",
+ m_currentGroup.c_str(),
+ id.c_str(),
+ statusMsg.c_str(),
+ reason.c_str());
+ }
+
+ std::string m_currentGroup;
};
-TestResultsCollectorBase* CSVCollector::Constructor()
+TestResultsCollectorBase *CSVCollector::Constructor()
{
- return new CSVCollector();
+ return new CSVCollector();
}
}
class TAPCollector :
- public TestResultsCollectorBase
-{
- public:
- static TestResultsCollectorBase* Constructor();
-
- private:
- TAPCollector() : m_filename(DEFAULT_TAP_FILE_NAME) {}
-
- virtual bool Configure()
- {
- m_output.open(m_filename.c_str(), std::ios_base::trunc);
- if (m_output.fail())
- return false;
-
- return true;
- }
- virtual std::string CollectorSpecificHelp() const
- {
- std::string retVal = "--file=<filename> - name of file for output\n"
- " default - ";
- retVal += DEFAULT_TAP_FILE_NAME;
- retVal += "\n";
- return retVal;
- }
-
- virtual void Start(int count)
- {
- DPL_UNUSED_PARAM(count);
- AssertMsg(m_output.good(), "Output file must be opened.");
- m_output << "TAP version 13" << std::endl;
- m_testIndex = 0;
- }
-
- virtual void Finish()
- {
- m_output << "1.." << m_testIndex << std::endl;
- m_output << m_collectedData.rdbuf();
- m_output.close();
- }
-
- virtual bool ParseCollectorSpecificArg(const std::string& arg)
- {
- return ParseCollectorFileArg(arg, m_filename);
- }
-
- virtual void CollectResult(const std::string& id,
- const std::string& description,
- const FailStatus::Type status = FailStatus::NONE,
- const std::string& reason = "")
- {
- m_testIndex++;
- switch (status) {
- case TestResultsCollectorBase::FailStatus::NONE:
- LogBasicTAP(true, id, description);
- endTAPLine();
- break;
- case TestResultsCollectorBase::FailStatus::FAILED:
- LogBasicTAP(false, id, description);
- endTAPLine();
- break;
- case TestResultsCollectorBase::FailStatus::IGNORED:
- LogBasicTAP(true, id, description);
- m_collectedData << " # skip " << reason;
- endTAPLine();
- break;
- case TestResultsCollectorBase::FailStatus::INTERNAL:
- LogBasicTAP(true, id, description);
- endTAPLine();
- m_collectedData << " ---" << std::endl;
- m_collectedData << " message: " << reason << std::endl;
- m_collectedData << " severity: Internal" << std::endl;
- m_collectedData << " ..." << std::endl;
- break;
- default:
- Assert(false && "Bad status");
- }
- }
-
- void LogBasicTAP(bool isOK, const std::string& id,
- const std::string& description)
- {
- if (!isOK) {
- m_collectedData << "not ";
- }
- m_collectedData << "ok " << m_testIndex << " [" <<
- id << "] " << description;
- }
-
- void endTAPLine()
- {
- m_collectedData << std::endl;
- }
-
- std::string m_filename;
- std::stringstream m_collectedData;
- std::ofstream m_output;
- int m_testIndex;
+ public TestResultsCollectorBase {
+public:
+ static TestResultsCollectorBase *Constructor();
+
+private:
+ TAPCollector() : m_filename(DEFAULT_TAP_FILE_NAME) {}
+
+ virtual bool Configure()
+ {
+ m_output.open(m_filename.c_str(), std::ios_base::trunc);
+
+ if (m_output.fail())
+ return false;
+
+ return true;
+ }
+ virtual std::string CollectorSpecificHelp() const
+ {
+ std::string retVal = "--file=<filename> - name of file for output\n"
+ " default - ";
+ retVal += DEFAULT_TAP_FILE_NAME;
+ retVal += "\n";
+ return retVal;
+ }
+
+ virtual void Start(int count)
+ {
+ DPL_UNUSED_PARAM(count);
+ AssertMsg(m_output.good(), "Output file must be opened.");
+ m_output << "TAP version 13" << std::endl;
+ m_testIndex = 0;
+ }
+
+ virtual void Finish()
+ {
+ m_output << "1.." << m_testIndex << std::endl;
+ m_output << m_collectedData.rdbuf();
+ m_output.close();
+ }
+
+ virtual bool ParseCollectorSpecificArg(const std::string &arg)
+ {
+ return ParseCollectorFileArg(arg, m_filename);
+ }
+
+ virtual void CollectResult(const std::string &id,
+ const std::string &description,
+ const FailStatus::Type status = FailStatus::NONE,
+ const std::string &reason = "")
+ {
+ m_testIndex++;
+
+ switch (status) {
+ case TestResultsCollectorBase::FailStatus::NONE:
+ LogBasicTAP(true, id, description);
+ endTAPLine();
+ break;
+
+ case TestResultsCollectorBase::FailStatus::FAILED:
+ LogBasicTAP(false, id, description);
+ endTAPLine();
+ break;
+
+ case TestResultsCollectorBase::FailStatus::IGNORED:
+ LogBasicTAP(true, id, description);
+ m_collectedData << " # skip " << reason;
+ endTAPLine();
+ break;
+
+ case TestResultsCollectorBase::FailStatus::INTERNAL:
+ LogBasicTAP(true, id, description);
+ endTAPLine();
+ m_collectedData << " ---" << std::endl;
+ m_collectedData << " message: " << reason << std::endl;
+ m_collectedData << " severity: Internal" << std::endl;
+ m_collectedData << " ..." << std::endl;
+ break;
+
+ default:
+ Assert(false && "Bad status");
+ }
+ }
+
+ void LogBasicTAP(bool isOK, const std::string &id,
+ const std::string &description)
+ {
+ if (!isOK) {
+ m_collectedData << "not ";
+ }
+
+ m_collectedData << "ok " << m_testIndex << " [" <<
+ id << "] " << description;
+ }
+
+ void endTAPLine()
+ {
+ m_collectedData << std::endl;
+ }
+
+ std::string m_filename;
+ std::stringstream m_collectedData;
+ std::ofstream m_output;
+ int m_testIndex;
};
-TestResultsCollectorBase* TAPCollector::Constructor()
+TestResultsCollectorBase *TAPCollector::Constructor()
{
- return new TAPCollector();
+ return new TAPCollector();
}
void TestResultsCollectorBase::RegisterCollectorConstructor(
- const std::string& name,
- TestResultsCollectorBase::CollectorConstructorFunc func)
+ const std::string &name,
+ TestResultsCollectorBase::CollectorConstructorFunc func)
{
- Assert(m_constructorsMap.find(name) == m_constructorsMap.end());
- m_constructorsMap[name] = func;
+ Assert(m_constructorsMap.find(name) == m_constructorsMap.end());
+ m_constructorsMap[name] = func;
}
-TestResultsCollectorBase* TestResultsCollectorBase::Create(
- const std::string& name)
+TestResultsCollectorBase *TestResultsCollectorBase::Create(
+ const std::string &name)
{
- ConstructorsMap::iterator found = m_constructorsMap.find(name);
- if (found != m_constructorsMap.end()) {
- return found->second();
- } else {
- return NULL;
- }
+ ConstructorsMap::iterator found = m_constructorsMap.find(name);
+
+ if (found != m_constructorsMap.end()) {
+ return found->second();
+ } else {
+ return NULL;
+ }
}
std::vector<std::string> TestResultsCollectorBase::GetCollectorsNames()
{
- std::vector<std::string> list;
- FOREACH(it, m_constructorsMap)
- {
- list.push_back(it->first);
- }
- return list;
+ std::vector<std::string> list;
+ FOREACH(it, m_constructorsMap) {
+ list.push_back(it->first);
+ }
+ return list;
}
TestResultsCollectorBase::ConstructorsMap TestResultsCollectorBase::
- m_constructorsMap;
+m_constructorsMap;
namespace {
static int RegisterCollectorConstructors();
static const int RegisterHelperVariable = RegisterCollectorConstructors();
int RegisterCollectorConstructors()
{
- (void)RegisterHelperVariable;
-
- TestResultsCollectorBase::RegisterCollectorConstructor(
- "text",
- &ConsoleCollector::Constructor);
- TestResultsCollectorBase::RegisterCollectorConstructor(
- "html",
- &HtmlCollector::Constructor);
- TestResultsCollectorBase::RegisterCollectorConstructor(
- "csv",
- &CSVCollector::Constructor);
- TestResultsCollectorBase::RegisterCollectorConstructor(
- "tap",
- &TAPCollector::Constructor);
- TestResultsCollectorBase::RegisterCollectorConstructor(
- "xml",
- &XmlCollector::Constructor);
-
- return 0;
+ (void)RegisterHelperVariable;
+ TestResultsCollectorBase::RegisterCollectorConstructor(
+ "text",
+ &ConsoleCollector::Constructor);
+ TestResultsCollectorBase::RegisterCollectorConstructor(
+ "html",
+ &HtmlCollector::Constructor);
+ TestResultsCollectorBase::RegisterCollectorConstructor(
+ "csv",
+ &CSVCollector::Constructor);
+ TestResultsCollectorBase::RegisterCollectorConstructor(
+ "tap",
+ &TAPCollector::Constructor);
+ TestResultsCollectorBase::RegisterCollectorConstructor(
+ "xml",
+ &XmlCollector::Constructor);
+ return 0;
}
}
}
std::string getXMLNode(xmlNodePtr node)
{
- std::string ret;
- xmlChar * value = xmlNodeGetContent(node);
- if (value != NULL) {
- ret = std::string(reinterpret_cast<char*>(value));
- xmlFree(value);
- }
- return ret;
+ std::string ret;
+ xmlChar *value = xmlNodeGetContent(node);
+
+ if (value != NULL) {
+ ret = std::string(reinterpret_cast<char *>(value));
+ xmlFree(value);
+ }
+
+ return ret;
}
}
namespace VcoreDPL {
namespace Test {
-namespace // anonymous
-{
+namespace { // anonymous
std::string BaseName(std::string aPath)
{
- std::unique_ptr<char[],free_deleter> path(strdup(aPath.c_str()));
- if (NULL == path.get()) {
- throw std::bad_alloc();
- }
- char* baseName = basename(path.get());
- std::string retValue = baseName;
- return retValue;
+ std::unique_ptr<char[], free_deleter> path(strdup(aPath.c_str()));
+
+ if (NULL == path.get()) {
+ throw std::bad_alloc();
+ }
+
+ char *baseName = basename(path.get());
+ std::string retValue = baseName;
+ return retValue;
}
} // namespace anonymous
//! \param[in] aFile source file name
//! \param[in] aLine source file line
//! \param[in] aMessage error message
-TestRunner::TestFailed::TestFailed(const char* aTest,
- const char* aFile,
- int aLine,
- const std::string &aMessage)
+TestRunner::TestFailed::TestFailed(const char *aTest,
+ const char *aFile,
+ int aLine,
+ const std::string &aMessage)
{
- std::ostringstream assertMsg;
- assertMsg << "[" << BaseName(aFile) << ":" << aLine
- << "] Assertion failed ("
- << aTest << ") " << aMessage;
- m_message = assertMsg.str();
+ std::ostringstream assertMsg;
+ assertMsg << "[" << BaseName(aFile) << ":" << aLine
+ << "] Assertion failed ("
+ << aTest << ") " << aMessage;
+ m_message = assertMsg.str();
}
TestRunner::TestFailed::TestFailed(const std::string &message)
{
- m_message = message;
+ m_message = message;
}
void TestRunner::RegisterTest(const char *testName, TestCase proc)
{
- m_testGroups[m_currentGroup].push_back(TestCaseStruct(testName, proc));
+ m_testGroups[m_currentGroup].push_back(TestCaseStruct(testName, proc));
}
-void TestRunner::InitGroup(const char* name)
+void TestRunner::InitGroup(const char *name)
{
- m_currentGroup = name;
+ m_currentGroup = name;
}
-void TestRunner::normalizeXMLTag(std::string& str, const std::string& testcase)
+void TestRunner::normalizeXMLTag(std::string &str, const std::string &testcase)
{
- //Add testcase if missing
- std::string::size_type pos = str.find(testcase);
- if(pos != 0)
- {
- str = testcase + "_" + str;
- }
-
- //dpl test runner cannot have '-' character in name so it have to be replaced
- // for TCT case to make comparision works
- std::replace(str.begin(), str.end(), '-', '_');
+ //Add testcase if missing
+ std::string::size_type pos = str.find(testcase);
+
+ if (pos != 0) {
+ str = testcase + "_" + str;
+ }
+
+ //dpl test runner cannot have '-' character in name so it have to be replaced
+ // for TCT case to make comparision works
+ std::replace(str.begin(), str.end(), '-', '_');
}
-bool TestRunner::filterGroupsByXmls(const std::vector<std::string> & files)
+bool TestRunner::filterGroupsByXmls(const std::vector<std::string> &files)
{
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, XMLError)
-
- const std::string idPath = "/test_definition/suite/set/testcase/@id";
-
- bool success = true;
- std::map<std::string, bool> casesMap;
-
- std::string testsuite;
- if(!m_testGroups.empty())
- {
- for(TestCaseGroupMap::const_iterator cit = m_testGroups.begin(); cit != m_testGroups.end(); ++cit)
- {
- if(!cit->second.empty())
- {
- for(TestCaseStructList::const_iterator cj = cit->second.begin(); cj != cit->second.end(); ++cj)
- {
- std::string name = cj->name;
- std::string::size_type st = name.find('_');
- if(st != std::string::npos)
- {
- name = name.substr(0, st);
- testsuite = name;
- break;
- }
- }
- if(!testsuite.empty()) break;
- }
- }
- }
-
- xmlInitParser();
- LIBXML_TEST_VERSION
- xmlXPathInit();
-
- Try
- {
- FOREACH(file, files)
- {
- xmlDocPtr doc;
- xmlXPathContextPtr xpathCtx;
-
- doc = xmlReadFile(file->c_str(), NULL, 0);
- if (doc == NULL) {
- ThrowMsg(XMLError, "File Problem");
- } else {
- //context
- xpathCtx = xmlXPathNewContext(doc);
- if (xpathCtx == NULL) {
- ThrowMsg(XMLError,
- "Error: unable to create new XPath context\n");
- }
- xpathCtx->node = xmlDocGetRootElement(doc);
- }
-
- std::string result;
- xmlXPathObjectPtr xpathObject;
- //get requested node's values
- xpathObject = xmlXPathEvalExpression(BAD_CAST idPath.c_str(), xpathCtx);
- if (xpathObject == NULL)
- {
- ThrowMsg(XMLError, "XPath evaluation failure: " << idPath);
- }
- xmlNodeSetPtr nodes = xpathObject->nodesetval;
- unsigned size = (nodes) ? nodes->nodeNr : 0;
- for(unsigned i = 0; i < size; ++i)
- {
- if (nodes->nodeTab[i]->type == XML_ATTRIBUTE_NODE) {
- xmlNodePtr curNode = nodes->nodeTab[i];
- result = getXMLNode(curNode);
- normalizeXMLTag(result, testsuite);
- casesMap.insert(make_pair(result, false));
- }
- }
- //Cleanup of XPath data
- xmlXPathFreeObject(xpathObject);
- xmlXPathFreeContext(xpathCtx);
- xmlFreeDoc(doc);
- }
- }
- Catch(XMLError)
- {
- success = false;
- }
- xmlCleanupParser();
-
- if(!filterByXML(casesMap))
- {
- success = false;
- }
-
- return success;
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, XMLError)
+ const std::string idPath = "/test_definition/suite/set/testcase/@id";
+ bool success = true;
+ std::map<std::string, bool> casesMap;
+ std::string testsuite;
+
+ if (!m_testGroups.empty()) {
+ for (TestCaseGroupMap::const_iterator cit = m_testGroups.begin(); cit != m_testGroups.end();
+ ++cit) {
+ if (!cit->second.empty()) {
+ for (TestCaseStructList::const_iterator cj = cit->second.begin(); cj != cit->second.end(); ++cj) {
+ std::string name = cj->name;
+ std::string::size_type st = name.find('_');
+
+ if (st != std::string::npos) {
+ name = name.substr(0, st);
+ testsuite = name;
+ break;
+ }
+ }
+
+ if (!testsuite.empty()) break;
+ }
+ }
+ }
+
+ xmlInitParser();
+ LIBXML_TEST_VERSION
+ xmlXPathInit();
+ Try {
+ FOREACH(file, files)
+ {
+ xmlDocPtr doc;
+ xmlXPathContextPtr xpathCtx;
+ doc = xmlReadFile(file->c_str(), NULL, 0);
+
+ if (doc == NULL) {
+ ThrowMsg(XMLError, "File Problem");
+ } else {
+ //context
+ xpathCtx = xmlXPathNewContext(doc);
+
+ if (xpathCtx == NULL) {
+ ThrowMsg(XMLError,
+ "Error: unable to create new XPath context\n");
+ }
+
+ xpathCtx->node = xmlDocGetRootElement(doc);
+ }
+
+ std::string result;
+ xmlXPathObjectPtr xpathObject;
+ //get requested node's values
+ xpathObject = xmlXPathEvalExpression(BAD_CAST idPath.c_str(), xpathCtx);
+
+ if (xpathObject == NULL) {
+ ThrowMsg(XMLError, "XPath evaluation failure: " << idPath);
+ }
+
+ xmlNodeSetPtr nodes = xpathObject->nodesetval;
+ unsigned size = (nodes) ? nodes->nodeNr : 0;
+
+ for (unsigned i = 0; i < size; ++i) {
+ if (nodes->nodeTab[i]->type == XML_ATTRIBUTE_NODE) {
+ xmlNodePtr curNode = nodes->nodeTab[i];
+ result = getXMLNode(curNode);
+ normalizeXMLTag(result, testsuite);
+ casesMap.insert(make_pair(result, false));
+ }
+ }
+
+ //Cleanup of XPath data
+ xmlXPathFreeObject(xpathObject);
+ xmlXPathFreeContext(xpathCtx);
+ xmlFreeDoc(doc);
+ }
+ }
+ Catch(XMLError) {
+ success = false;
+ }
+ xmlCleanupParser();
+
+ if (!filterByXML(casesMap)) {
+ success = false;
+ }
+
+ return success;
}
-bool TestRunner::filterByXML(std::map<std::string, bool> & casesMap)
+bool TestRunner::filterByXML(std::map<std::string, bool> &casesMap)
{
- FOREACH(group, m_testGroups) {
- TestCaseStructList newList;
- FOREACH(iterator, group->second)
- {
- if (casesMap.find(iterator->name) != casesMap.end()) {
- casesMap[iterator->name] = true;
- newList.push_back(*iterator);
- }
- }
- group->second = newList;
- }
- FOREACH(cs, casesMap)
- {
- if(cs->second == false)
- {
- return false;
- }
- }
- return true;
+ FOREACH(group, m_testGroups) {
+ TestCaseStructList newList;
+ FOREACH(iterator, group->second) {
+ if (casesMap.find(iterator->name) != casesMap.end()) {
+ casesMap[iterator->name] = true;
+ newList.push_back(*iterator);
+ }
+ }
+ group->second = newList;
+ }
+ FOREACH(cs, casesMap) {
+ if (cs->second == false) {
+ return false;
+ }
+ }
+ return true;
}
-TestRunner::Status TestRunner::RunTestCase(const TestCaseStruct& testCase)
+TestRunner::Status TestRunner::RunTestCase(const TestCaseStruct &testCase)
{
- try {
- testCase.proc();
- } catch (const TestFailed &e) {
- // Simple test failure
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::FAILED,
- e.GetMessage());
- return FAILED;
- } catch (const Ignored &e) {
- if (m_runIgnored) {
- // Simple test have to be implemented
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::IGNORED,
- e.GetMessage());
- }
-
- return IGNORED;
- } catch (const VcoreDPL::Exception &e) {
- // DPL exception failure
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::INTERNAL,
- "DPL exception:" + e.GetMessage() + "\n" + e.DumpToString());
-
- return FAILED;
- } catch (const std::exception &) {
- // std exception failure
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::INTERNAL,
- "std exception");
-
- return FAILED;
- } catch (...) {
- // Unknown exception failure
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::INTERNAL,
- "unknown exception");
-
- return FAILED;
- }
-
- CollectResult(testCase.name,
- "",
- TestResultsCollectorBase::FailStatus::NONE);
-
- // Everything OK
- return PASS;
+ try {
+ testCase.proc();
+ } catch (const TestFailed &e) {
+ // Simple test failure
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::FAILED,
+ e.GetMessage());
+ return FAILED;
+ } catch (const Ignored &e) {
+ if (m_runIgnored) {
+ // Simple test have to be implemented
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::IGNORED,
+ e.GetMessage());
+ }
+
+ return IGNORED;
+ } catch (const VcoreDPL::Exception &e) {
+ // DPL exception failure
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::INTERNAL,
+ "DPL exception:" + e.GetMessage() + "\n" + e.DumpToString());
+ return FAILED;
+ } catch (const std::exception &) {
+ // std exception failure
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::INTERNAL,
+ "std exception");
+ return FAILED;
+ } catch (...) {
+ // Unknown exception failure
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::INTERNAL,
+ "unknown exception");
+ return FAILED;
+ }
+
+ CollectResult(testCase.name,
+ "",
+ TestResultsCollectorBase::FailStatus::NONE);
+ // Everything OK
+ return PASS;
}
void TestRunner::RunTests()
{
- using namespace VcoreDPL::Colors::Text;
-
- Banner();
-
- unsigned count = 0;
- FOREACH(group, m_testGroups) {
- count += group->second.size();
- }
-
- std::for_each(m_collectors.begin(),
- m_collectors.end(),
- [count] (const TestResultsCollectors::value_type & collector)
- {
- collector.second->Start(count);
- });
-
- fprintf(stderr, "%sFound %d testcases...%s\n", GREEN_BEGIN, count, GREEN_END);
- fprintf(stderr, "%s%s%s\n", GREEN_BEGIN, "Running tests...", GREEN_END);
- FOREACH(group, m_testGroups) {
- TestCaseStructList list = group->second;
- if (!list.empty()) {
- std::for_each(
- m_collectors.begin(),
- m_collectors.end(),
- [&group](const TestResultsCollectors::value_type & collector)
- {
- collector.second->
- CollectCurrentTestGroupName(group->first);
- });
- list.sort();
-
- for (TestCaseStructList::const_iterator iterator = list.begin();
- iterator != list.end();
- ++iterator)
- {
- TestCaseStruct test = *iterator;
- if (m_startTestId == test.name) {
- m_startTestId = "";
- }
-
- if (m_startTestId.empty()) {
- RunTestCase(test);
- }
- if (m_terminate == true) {
- // Terminate quietly without any logs
- return;
- }
- }
- }
- }
-
- std::for_each(m_collectors.begin(),
- m_collectors.end(),
- [] (const TestResultsCollectors::value_type & collector)
- {
- collector.second->Finish();
- });
-
- // Finished
- fprintf(stderr, "%s%s%s\n\n", GREEN_BEGIN, "Finished", GREEN_END);
+ using namespace VcoreDPL::Colors::Text;
+ Banner();
+ unsigned count = 0;
+ FOREACH(group, m_testGroups) {
+ count += group->second.size();
+ }
+ std::for_each(m_collectors.begin(),
+ m_collectors.end(),
+ [count](const TestResultsCollectors::value_type & collector) {
+ collector.second->Start(count);
+ });
+ fprintf(stderr, "%sFound %d testcases...%s\n", GREEN_BEGIN, count, GREEN_END);
+ fprintf(stderr, "%s%s%s\n", GREEN_BEGIN, "Running tests...", GREEN_END);
+ FOREACH(group, m_testGroups) {
+ TestCaseStructList list = group->second;
+
+ if (!list.empty()) {
+ std::for_each(
+ m_collectors.begin(),
+ m_collectors.end(),
+ [&group](const TestResultsCollectors::value_type & collector) {
+ collector.second->
+ CollectCurrentTestGroupName(group->first);
+ });
+ list.sort();
+
+ for (TestCaseStructList::const_iterator iterator = list.begin();
+ iterator != list.end();
+ ++iterator) {
+ TestCaseStruct test = *iterator;
+
+ if (m_startTestId == test.name) {
+ m_startTestId = "";
+ }
+
+ if (m_startTestId.empty()) {
+ RunTestCase(test);
+ }
+
+ if (m_terminate == true) {
+ // Terminate quietly without any logs
+ return;
+ }
+ }
+ }
+ }
+ std::for_each(m_collectors.begin(),
+ m_collectors.end(),
+ [](const TestResultsCollectors::value_type & collector) {
+ collector.second->Finish();
+ });
+ // Finished
+ fprintf(stderr, "%s%s%s\n\n", GREEN_BEGIN, "Finished", GREEN_END);
}
void TestRunner::CollectResult(
- const std::string& id,
- const std::string& description,
- const TestResultsCollectorBase::FailStatus::Type status,
- const std::string& reason)
+ const std::string &id,
+ const std::string &description,
+ const TestResultsCollectorBase::FailStatus::Type status,
+ const std::string &reason)
{
- std::for_each(m_collectors.begin(),
- m_collectors.end(),
- [&](const TestResultsCollectors::value_type & collector)
- {
- collector.second->CollectResult(id,
- description,
- status,
- reason);
- });
+ std::for_each(m_collectors.begin(),
+ m_collectors.end(),
+ [&](const TestResultsCollectors::value_type & collector) {
+ collector.second->CollectResult(id,
+ description,
+ status,
+ reason);
+ });
}
void TestRunner::Banner()
{
- using namespace VcoreDPL::Colors::Text;
- fprintf(stderr,
- "%s%s%s\n",
- BOLD_GREEN_BEGIN,
- "DPL tests runner",
- BOLD_GREEN_END);
- fprintf(stderr,
- "%s%s%s%s\n\n",
- GREEN_BEGIN,
- "Build: ",
- __TIMESTAMP__,
- GREEN_END);
+ using namespace VcoreDPL::Colors::Text;
+ fprintf(stderr,
+ "%s%s%s\n",
+ BOLD_GREEN_BEGIN,
+ "DPL tests runner",
+ BOLD_GREEN_END);
+ fprintf(stderr,
+ "%s%s%s%s\n\n",
+ GREEN_BEGIN,
+ "Build: ",
+ __TIMESTAMP__,
+ GREEN_END);
}
-void TestRunner::InvalidArgs(const std::string& message)
+void TestRunner::InvalidArgs(const std::string &message)
{
- using namespace VcoreDPL::Colors::Text;
- fprintf(stderr,
- "%s%s%s\n",
- BOLD_RED_BEGIN,
- message.c_str(),
- BOLD_RED_END);
+ using namespace VcoreDPL::Colors::Text;
+ fprintf(stderr,
+ "%s%s%s\n",
+ BOLD_RED_BEGIN,
+ message.c_str(),
+ BOLD_RED_END);
}
void TestRunner::Usage()
{
- fprintf(stderr, "Usage: runner [options]\n\n");
- fprintf(stderr, "Output type:\n");
- fprintf(stderr, " --output=<output type> --output=<output type> ...\n");
- fprintf(stderr, "\n possible output types:\n");
- FOREACH(type, TestResultsCollectorBase::GetCollectorsNames()) {
- fprintf(stderr, " --output=%s\n", type->c_str());
- }
- fprintf(stderr, "\n example:\n");
- fprintf(stderr,
- " test-binary --output=text --output=xml --file=output.xml\n\n");
- fprintf(stderr, "Other parameters:\n");
- fprintf(stderr,
- " --regexp='regexp'\t Only selected tests"
- " which names match regexp run\n\n");
- fprintf(stderr, " --start=<test id>\tStart from concrete test id");
- fprintf(stderr, " --group=<group name>\t Run tests only from one group\n");
- fprintf(stderr, " --runignored\t Run also ignored tests\n");
- fprintf(stderr, " --list\t Show a list of Test IDs\n");
- fprintf(stderr, " --listgroups\t Show a list of Test Group names \n");
- fprintf(stderr, " --only-from-xml=<xml file>\t Run only testcases specified in XML file \n"
- " XML name is taken from attribute id=\"part1_part2\" as whole.\n"
- " If part1 is not found (no _) then it is implicitily "
- "set according to suite part1 from binary tests\n");
- fprintf(
- stderr,
- " --listingroup=<group name>\t Show a list of Test IDS in one group\n");
- fprintf(stderr, " --allowchildlogs\t Allow to print logs from child process on screen.\n");
- fprintf(stderr, " When active child process will be able to print logs on stdout and stderr.\n");
- fprintf(stderr, " Both descriptors will be closed after test.\n");
- fprintf(stderr, " --help\t This help\n\n");
- std::for_each(m_collectors.begin(),
- m_collectors.end(),
- [] (const TestResultsCollectors::value_type & collector)
- {
- fprintf(stderr,
- "Output %s has specific args:\n",
- collector.first.c_str());
- fprintf(stderr,
- "%s\n",
- collector.second->
- CollectorSpecificHelp().c_str());
- });
- fprintf(stderr, "For bug reporting, please write to:\n");
- fprintf(stderr, "<p.dobrowolsk@samsung.com>\n");
+ fprintf(stderr, "Usage: runner [options]\n\n");
+ fprintf(stderr, "Output type:\n");
+ fprintf(stderr, " --output=<output type> --output=<output type> ...\n");
+ fprintf(stderr, "\n possible output types:\n");
+ FOREACH(type, TestResultsCollectorBase::GetCollectorsNames()) {
+ fprintf(stderr, " --output=%s\n", type->c_str());
+ }
+ fprintf(stderr, "\n example:\n");
+ fprintf(stderr,
+ " test-binary --output=text --output=xml --file=output.xml\n\n");
+ fprintf(stderr, "Other parameters:\n");
+ fprintf(stderr,
+ " --regexp='regexp'\t Only selected tests"
+ " which names match regexp run\n\n");
+ fprintf(stderr, " --start=<test id>\tStart from concrete test id");
+ fprintf(stderr, " --group=<group name>\t Run tests only from one group\n");
+ fprintf(stderr, " --runignored\t Run also ignored tests\n");
+ fprintf(stderr, " --list\t Show a list of Test IDs\n");
+ fprintf(stderr, " --listgroups\t Show a list of Test Group names \n");
+ fprintf(stderr, " --only-from-xml=<xml file>\t Run only testcases specified in XML file \n"
+ " XML name is taken from attribute id=\"part1_part2\" as whole.\n"
+ " If part1 is not found (no _) then it is implicitily "
+ "set according to suite part1 from binary tests\n");
+ fprintf(
+ stderr,
+ " --listingroup=<group name>\t Show a list of Test IDS in one group\n");
+ fprintf(stderr, " --allowchildlogs\t Allow to print logs from child process on screen.\n");
+ fprintf(stderr,
+ " When active child process will be able to print logs on stdout and stderr.\n");
+ fprintf(stderr, " Both descriptors will be closed after test.\n");
+ fprintf(stderr, " --help\t This help\n\n");
+ std::for_each(m_collectors.begin(),
+ m_collectors.end(),
+ [](const TestResultsCollectors::value_type & collector) {
+ fprintf(stderr,
+ "Output %s has specific args:\n",
+ collector.first.c_str());
+ fprintf(stderr,
+ "%s\n",
+ collector.second->
+ CollectorSpecificHelp().c_str());
+ });
+ fprintf(stderr, "For bug reporting, please write to:\n");
+ fprintf(stderr, "<p.dobrowolsk@samsung.com>\n");
}
int TestRunner::ExecTestRunner(int argc, char *argv[])
{
- std::vector<std::string> args;
- for (int i = 0; i < argc; ++i) {
- args.push_back(argv[i]);
- }
- return ExecTestRunner(args);
+ std::vector<std::string> args;
+
+ for (int i = 0; i < argc; ++i) {
+ args.push_back(argv[i]);
+ }
+
+ return ExecTestRunner(args);
}
void TestRunner::MarkAssertion()
{
- ++m_totalAssertions;
+ ++m_totalAssertions;
}
-int TestRunner::ExecTestRunner(const ArgsList& value)
+int TestRunner::ExecTestRunner(const ArgsList &value)
{
- m_runIgnored = false;
- ArgsList args = value;
- // Parse command line
- if (args.size() == 1) {
- InvalidArgs();
- Usage();
- return -1;
- }
-
- args.erase(args.begin());
-
- bool showHelp = false;
- bool justList = false;
- std::vector<std::string> xmlFiles;
-
- TestResultsCollectorBasePtr currentCollector;
-
- // Parse each argument
- FOREACH(it, args)
- {
- std::string arg = *it;
- const std::string regexp = "--regexp=";
- const std::string output = "--output=";
- const std::string groupId = "--group=";
- const std::string runIgnored = "--runignored";
- const std::string listCmd = "--list";
- const std::string startCmd = "--start=";
- const std::string listGroupsCmd = "--listgroups";
- const std::string listInGroup = "--listingroup=";
- const std::string allowChildLogs = "--allowchildlogs";
- const std::string onlyFromXML = "--only-from-xml=";
-
- if (currentCollector) {
- if (currentCollector->ParseCollectorSpecificArg(arg)) {
- continue;
- }
- }
-
- if (arg.find(startCmd) == 0) {
- arg.erase(0, startCmd.length());
- FOREACH(group, m_testGroups) {
- FOREACH(tc, group->second) {
- if (tc->name == arg) {
- m_startTestId = arg;
- break;
- }
- }
- if (!m_startTestId.empty()) {
- break;
- }
- }
- if (!m_startTestId.empty()) {
- continue;
- }
- InvalidArgs();
- fprintf(stderr, "Start test id has not been found\n");
- Usage();
- return 0;
- } else if (arg.find(groupId) == 0) {
- arg.erase(0, groupId.length());
- TestCaseGroupMap::iterator found = m_testGroups.find(arg);
- if (found != m_testGroups.end()) {
- std::string name = found->first;
- TestCaseStructList newList = found->second;
- m_testGroups.clear();
- m_testGroups[name] = newList;
- } else {
- fprintf(stderr, "Group %s not found\n", arg.c_str());
- InvalidArgs();
- Usage();
- return -1;
- }
- } else if (arg == runIgnored) {
- m_runIgnored = true;
- } else if (arg == listCmd) {
- justList = true;
- } else if (arg == listGroupsCmd) {
- FOREACH(group, m_testGroups) {
- printf("GR:%s\n", group->first.c_str());
- }
- return 0;
- } else if (arg.find(listInGroup) == 0) {
- arg.erase(0, listInGroup.length());
- FOREACH(test, m_testGroups[arg]) {
- printf("ID:%s\n", test->name.c_str());
- }
- return 0;
- } else if (arg.find(allowChildLogs) == 0) {
- arg.erase(0, allowChildLogs.length());
- m_allowChildLogs = true;
- } else if (arg == "--help") {
- showHelp = true;
- } else if (arg.find(output) == 0) {
- arg.erase(0, output.length());
- if (m_collectors.find(arg) != m_collectors.end()) {
- InvalidArgs(
- "Multiple outputs of the same type are not supported!");
- Usage();
- return -1;
- }
- currentCollector.reset(TestResultsCollectorBase::Create(arg));
- if (!currentCollector) {
- InvalidArgs("Unsupported output type!");
- Usage();
- return -1;
- }
- m_collectors[arg] = currentCollector;
- } else if (arg.find(regexp) == 0) {
- arg.erase(0, regexp.length());
- if (arg.length() == 0) {
- InvalidArgs();
- Usage();
- return -1;
- }
-
- if (arg[0] == '\'' && arg[arg.length() - 1] == '\'') {
- arg.erase(0);
- arg.erase(arg.length() - 1);
- }
-
- if (arg.length() == 0) {
- InvalidArgs();
- Usage();
- return -1;
- }
-
- pcrecpp::RE re(arg.c_str());
- FOREACH(group, m_testGroups) {
- TestCaseStructList newList;
- FOREACH(iterator, group->second)
- {
- if (re.PartialMatch(iterator->name)) {
- newList.push_back(*iterator);
- }
- }
- group->second = newList;
- }
- } else if(arg.find(onlyFromXML) == 0) {
- arg.erase(0, onlyFromXML.length());
- if (arg.length() == 0) {
- InvalidArgs();
- Usage();
- return -1;
- }
-
- if (arg[0] == '\'' && arg[arg.length() - 1] == '\'') {
- arg.erase(0);
- arg.erase(arg.length() - 1);
- }
-
- if (arg.length() == 0) {
- InvalidArgs();
- Usage();
- return -1;
- }
-
- xmlFiles.push_back(arg);
- } else {
- InvalidArgs();
- Usage();
- return -1;
- }
- }
-
- if(!xmlFiles.empty())
- {
- if(!filterGroupsByXmls(xmlFiles))
- {
- fprintf(stderr, "XML file is not correct\n");
- return 0;
- }
- }
-
- if(justList)
- {
- FOREACH(group, m_testGroups) {
- FOREACH(test, group->second) {
- printf("ID:%s:%s\n", group->first.c_str(), test->name.c_str());
- }
- }
- return 0;
- }
-
- currentCollector.reset();
-
- // Show help
- if (showHelp) {
- Usage();
- return 0;
- }
-
- if (m_collectors.empty()) {
- TestResultsCollectorBasePtr collector(
- TestResultsCollectorBase::Create("text"));
- m_collectors["text"] = collector;
- }
-
- for (auto it = m_collectors.begin(); it != m_collectors.end(); ++it) {
- if (!it->second->Configure()) {
- fprintf(stderr, "Could not configure selected output");
- return 0;
- }
- }
-
- // Run tests
- RunTests();
-
- return 0;
+ m_runIgnored = false;
+ ArgsList args = value;
+
+ // Parse command line
+ if (args.size() == 1) {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+
+ args.erase(args.begin());
+ bool showHelp = false;
+ bool justList = false;
+ std::vector<std::string> xmlFiles;
+ TestResultsCollectorBasePtr currentCollector;
+ // Parse each argument
+ FOREACH(it, args) {
+ std::string arg = *it;
+ const std::string regexp = "--regexp=";
+ const std::string output = "--output=";
+ const std::string groupId = "--group=";
+ const std::string runIgnored = "--runignored";
+ const std::string listCmd = "--list";
+ const std::string startCmd = "--start=";
+ const std::string listGroupsCmd = "--listgroups";
+ const std::string listInGroup = "--listingroup=";
+ const std::string allowChildLogs = "--allowchildlogs";
+ const std::string onlyFromXML = "--only-from-xml=";
+
+ if (currentCollector) {
+ if (currentCollector->ParseCollectorSpecificArg(arg)) {
+ continue;
+ }
+ }
+
+ if (arg.find(startCmd) == 0) {
+ arg.erase(0, startCmd.length());
+ FOREACH(group, m_testGroups) {
+ FOREACH(tc, group->second) {
+ if (tc->name == arg) {
+ m_startTestId = arg;
+ break;
+ }
+ }
+
+ if (!m_startTestId.empty()) {
+ break;
+ }
+ }
+
+ if (!m_startTestId.empty()) {
+ continue;
+ }
+
+ InvalidArgs();
+ fprintf(stderr, "Start test id has not been found\n");
+ Usage();
+ return 0;
+ } else if (arg.find(groupId) == 0) {
+ arg.erase(0, groupId.length());
+ TestCaseGroupMap::iterator found = m_testGroups.find(arg);
+
+ if (found != m_testGroups.end()) {
+ std::string name = found->first;
+ TestCaseStructList newList = found->second;
+ m_testGroups.clear();
+ m_testGroups[name] = newList;
+ } else {
+ fprintf(stderr, "Group %s not found\n", arg.c_str());
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+ } else if (arg == runIgnored) {
+ m_runIgnored = true;
+ } else if (arg == listCmd) {
+ justList = true;
+ } else if (arg == listGroupsCmd) {
+ FOREACH(group, m_testGroups) {
+ printf("GR:%s\n", group->first.c_str());
+ }
+ return 0;
+ } else if (arg.find(listInGroup) == 0) {
+ arg.erase(0, listInGroup.length());
+ FOREACH(test, m_testGroups[arg]) {
+ printf("ID:%s\n", test->name.c_str());
+ }
+ return 0;
+ } else if (arg.find(allowChildLogs) == 0) {
+ arg.erase(0, allowChildLogs.length());
+ m_allowChildLogs = true;
+ } else if (arg == "--help") {
+ showHelp = true;
+ } else if (arg.find(output) == 0) {
+ arg.erase(0, output.length());
+
+ if (m_collectors.find(arg) != m_collectors.end()) {
+ InvalidArgs(
+ "Multiple outputs of the same type are not supported!");
+ Usage();
+ return -1;
+ }
+
+ currentCollector.reset(TestResultsCollectorBase::Create(arg));
+
+ if (!currentCollector) {
+ InvalidArgs("Unsupported output type!");
+ Usage();
+ return -1;
+ }
+
+ m_collectors[arg] = currentCollector;
+ } else if (arg.find(regexp) == 0) {
+ arg.erase(0, regexp.length());
+
+ if (arg.length() == 0) {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+
+ if (arg[0] == '\'' && arg[arg.length() - 1] == '\'') {
+ arg.erase(0);
+ arg.erase(arg.length() - 1);
+ }
+
+ if (arg.length() == 0) {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+
+ pcrecpp::RE re(arg.c_str());
+ FOREACH(group, m_testGroups) {
+ TestCaseStructList newList;
+ FOREACH(iterator, group->second) {
+ if (re.PartialMatch(iterator->name)) {
+ newList.push_back(*iterator);
+ }
+ }
+ group->second = newList;
+ }
+ } else if (arg.find(onlyFromXML) == 0) {
+ arg.erase(0, onlyFromXML.length());
+
+ if (arg.length() == 0) {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+
+ if (arg[0] == '\'' && arg[arg.length() - 1] == '\'') {
+ arg.erase(0);
+ arg.erase(arg.length() - 1);
+ }
+
+ if (arg.length() == 0) {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+
+ xmlFiles.push_back(arg);
+ } else {
+ InvalidArgs();
+ Usage();
+ return -1;
+ }
+ }
+
+ if (!xmlFiles.empty()) {
+ if (!filterGroupsByXmls(xmlFiles)) {
+ fprintf(stderr, "XML file is not correct\n");
+ return 0;
+ }
+ }
+
+ if (justList) {
+ FOREACH(group, m_testGroups) {
+ FOREACH(test, group->second) {
+ printf("ID:%s:%s\n", group->first.c_str(), test->name.c_str());
+ }
+ }
+ return 0;
+ }
+
+ currentCollector.reset();
+
+ // Show help
+ if (showHelp) {
+ Usage();
+ return 0;
+ }
+
+ if (m_collectors.empty()) {
+ TestResultsCollectorBasePtr collector(
+ TestResultsCollectorBase::Create("text"));
+ m_collectors["text"] = collector;
+ }
+
+ for (auto it = m_collectors.begin(); it != m_collectors.end(); ++it) {
+ if (!it->second->Configure()) {
+ fprintf(stderr, "Could not configure selected output");
+ return 0;
+ }
+ }
+
+ // Run tests
+ RunTests();
+ return 0;
}
bool TestRunner::getRunIgnored() const
{
- return m_runIgnored;
+ return m_runIgnored;
}
void TestRunner::Terminate()
{
- m_terminate = true;
+ m_terminate = true;
}
bool TestRunner::GetAllowChildLogs()
{
- return m_allowChildLogs;
+ return m_allowChildLogs;
}
}
const int CHILD_TEST_PASS = 1;
const int CHILD_TEST_IGNORED = 2;
-int closeOutput() {
- int devnull;
- int retcode = -1;
- if (-1 == (devnull = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY))))
- return -1;
+int closeOutput()
+{
+ int devnull;
+ int retcode = -1;
- // replace stdout with /dev/null
- if (-1 == TEMP_FAILURE_RETRY(dup2(devnull, STDOUT_FILENO)))
- goto end;
+ if (-1 == (devnull = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY))))
+ return -1;
- // replace stderr with /dev/null
- if (-1 == TEMP_FAILURE_RETRY(dup2(devnull, STDERR_FILENO)))
- goto end;
+ // replace stdout with /dev/null
+ if (-1 == TEMP_FAILURE_RETRY(dup2(devnull, STDOUT_FILENO)))
+ goto end;
- retcode = 0;
+ // replace stderr with /dev/null
+ if (-1 == TEMP_FAILURE_RETRY(dup2(devnull, STDERR_FILENO)))
+ goto end;
+ retcode = 0;
end:
- close(devnull);
- return retcode;
+ close(devnull);
+ return retcode;
}
} // namespace anonymous
PipeWrapper::PipeWrapper()
{
- if (-1 == pipe(m_pipefd)) {
- m_pipefd[0] = PIPE_CLOSED;
- m_pipefd[1] = PIPE_CLOSED;
- }
+ if (-1 == pipe(m_pipefd)) {
+ m_pipefd[0] = PIPE_CLOSED;
+ m_pipefd[1] = PIPE_CLOSED;
+ }
}
PipeWrapper::~PipeWrapper()
{
- closeHelp(0);
- closeHelp(1);
+ closeHelp(0);
+ closeHelp(1);
}
bool PipeWrapper::isReady()
{
- return m_pipefd[0] != PIPE_CLOSED || m_pipefd[1] != PIPE_CLOSED;
+ return m_pipefd[0] != PIPE_CLOSED || m_pipefd[1] != PIPE_CLOSED;
}
void PipeWrapper::setUsage(Usage usage)
{
- if (usage == READONLY) {
- closeHelp(1);
- }
- if (usage == WRITEONLY) {
- closeHelp(0);
- }
+ if (usage == READONLY) {
+ closeHelp(1);
+ }
+
+ if (usage == WRITEONLY) {
+ closeHelp(0);
+ }
}
PipeWrapper::Status PipeWrapper::send(int code, std::string &message)
{
- if (m_pipefd[1] == PIPE_CLOSED) {
- return ERROR;
- }
-
- std::ostringstream output;
- output << toBinaryString(code);
- output << toBinaryString(static_cast<int>(message.size()));
- output << message;
-
- std::string binary = output.str();
- int size = binary.size();
-
- if ((writeHelp(&size,
- sizeof(int)) == ERROR) ||
- (writeHelp(binary.c_str(), size) == ERROR))
- {
- return ERROR;
- }
- return SUCCESS;
+ if (m_pipefd[1] == PIPE_CLOSED) {
+ return ERROR;
+ }
+
+ std::ostringstream output;
+ output << toBinaryString(code);
+ output << toBinaryString(static_cast<int>(message.size()));
+ output << message;
+ std::string binary = output.str();
+ int size = binary.size();
+
+ if ((writeHelp(&size,
+ sizeof(int)) == ERROR) ||
+ (writeHelp(binary.c_str(), size) == ERROR)) {
+ return ERROR;
+ }
+
+ return SUCCESS;
}
PipeWrapper::Status PipeWrapper::receive(int &code, std::string &data, time_t deadline)
{
- if (m_pipefd[0] == PIPE_CLOSED) {
- return ERROR;
- }
-
- int size;
- Status ret;
-
- if ((ret = readHelp(&size, sizeof(int), deadline)) != SUCCESS) {
- return ret;
- }
-
- std::vector<char> buffer;
- buffer.resize(size);
-
- if ((ret = readHelp(&buffer[0], size, deadline)) != SUCCESS) {
- return ret;
- }
-
- try {
- VcoreDPL::BinaryQueue queue;
- queue.AppendCopy(&buffer[0], size);
-
- queue.FlattenConsume(&code, sizeof(int));
- queue.FlattenConsume(&size, sizeof(int));
-
- buffer.resize(size);
-
- queue.FlattenConsume(&buffer[0], size);
- data.assign(buffer.begin(), buffer.end());
- } catch (VcoreDPL::BinaryQueue::Exception::Base &e) {
- return ERROR;
- }
- return SUCCESS;
+ if (m_pipefd[0] == PIPE_CLOSED) {
+ return ERROR;
+ }
+
+ int size;
+ Status ret;
+
+ if ((ret = readHelp(&size, sizeof(int), deadline)) != SUCCESS) {
+ return ret;
+ }
+
+ std::vector<char> buffer;
+ buffer.resize(size);
+
+ if ((ret = readHelp(&buffer[0], size, deadline)) != SUCCESS) {
+ return ret;
+ }
+
+ try {
+ VcoreDPL::BinaryQueue queue;
+ queue.AppendCopy(&buffer[0], size);
+ queue.FlattenConsume(&code, sizeof(int));
+ queue.FlattenConsume(&size, sizeof(int));
+ buffer.resize(size);
+ queue.FlattenConsume(&buffer[0], size);
+ data.assign(buffer.begin(), buffer.end());
+ } catch (VcoreDPL::BinaryQueue::Exception::Base &e) {
+ return ERROR;
+ }
+
+ return SUCCESS;
}
void PipeWrapper::closeAll()
{
- closeHelp(0);
- closeHelp(1);
+ closeHelp(0);
+ closeHelp(1);
}
std::string PipeWrapper::toBinaryString(int data)
{
- char buffer[sizeof(int)];
- memcpy(buffer, &data, sizeof(int));
- return std::string(buffer, buffer + sizeof(int));
+ char buffer[sizeof(int)];
+ memcpy(buffer, &data, sizeof(int));
+ return std::string(buffer, buffer + sizeof(int));
}
void PipeWrapper::closeHelp(int desc)
{
- if (m_pipefd[desc] != PIPE_CLOSED) {
- TEMP_FAILURE_RETRY(close(m_pipefd[desc]));
- m_pipefd[desc] = PIPE_CLOSED;
- }
+ if (m_pipefd[desc] != PIPE_CLOSED) {
+ TEMP_FAILURE_RETRY(close(m_pipefd[desc]));
+ m_pipefd[desc] = PIPE_CLOSED;
+ }
}
PipeWrapper::Status PipeWrapper::writeHelp(const void *buffer, int size)
{
- int ready = 0;
- const char *p = static_cast<const char *>(buffer);
- while (ready != size) {
- int ret = write(m_pipefd[1], &p[ready], size - ready);
-
- if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
- continue;
- }
-
- if (ret == -1) {
- closeHelp(1);
- return ERROR;
- }
-
- ready += ret;
- }
- return SUCCESS;
+ int ready = 0;
+ const char *p = static_cast<const char *>(buffer);
+
+ while (ready != size) {
+ int ret = write(m_pipefd[1], &p[ready], size - ready);
+
+ if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
+ continue;
+ }
+
+ if (ret == -1) {
+ closeHelp(1);
+ return ERROR;
+ }
+
+ ready += ret;
+ }
+
+ return SUCCESS;
}
PipeWrapper::Status PipeWrapper::readHelp(void *buf, int size, time_t deadline)
{
- int ready = 0;
- char *buffer = static_cast<char*>(buf);
- while (ready != size) {
- time_t wait = deadline - time(0);
- wait = wait < 1 ? 1 : wait;
- pollfd fds = { m_pipefd[0], POLLIN, 0 };
+ int ready = 0;
+ char *buffer = static_cast<char *>(buf);
+
+ while (ready != size) {
+ time_t wait = deadline - time(0);
+ wait = wait < 1 ? 1 : wait;
+ pollfd fds = { m_pipefd[0], POLLIN, 0 };
+ int pollReturn = poll(&fds, 1, wait * 1000);
- int pollReturn = poll(&fds, 1, wait * 1000);
+ if (pollReturn == 0) {
+ return TIMEOUT; // Timeout
+ }
- if (pollReturn == 0) {
- return TIMEOUT; // Timeout
- }
+ if (pollReturn < -1) {
+ return ERROR;
+ }
- if (pollReturn < -1) {
- return ERROR;
- }
+ int ret = read(m_pipefd[0], &buffer[ready], size - ready);
- int ret = read(m_pipefd[0], &buffer[ready], size - ready);
+ if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
+ continue;
+ }
- if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
- continue;
- }
+ if (ret == -1 || ret == 0) {
+ closeHelp(0);
+ return ERROR;
+ }
- if (ret == -1 || ret == 0) {
- closeHelp(0);
- return ERROR;
- }
+ ready += ret;
+ }
- ready += ret;
- }
- return SUCCESS;
+ return SUCCESS;
}
void RunChildProc(TestRunner::TestCase procChild)
{
- PipeWrapper pipe;
- if (!pipe.isReady()) {
- throw TestRunner::TestFailed("Pipe creation failed");
- }
-
- pid_t pid = fork();
-
- if (pid == -1) {
- throw TestRunner::TestFailed("Child creation failed");
- }
-
- if (pid != 0) {
- // parent code
- pipe.setUsage(PipeWrapper::READONLY);
-
- int code;
- std::string message;
-
- int pipeReturn = pipe.receive(code, message, time(0) + 10);
-
- if (pipeReturn != PipeWrapper::SUCCESS) { // Timeout or reading error
- pipe.closeAll();
- kill(pid, SIGKILL);
- }
-
- int status;
- waitpid(pid, &status, 0);
-
- if (pipeReturn == PipeWrapper::TIMEOUT) {
- throw TestRunner::TestFailed("Timeout");
- }
-
- if (pipeReturn == PipeWrapper::ERROR) {
- throw TestRunner::TestFailed("Reading pipe error");
- }
-
- if (code == CHILD_TEST_FAIL) {
- throw TestRunner::TestFailed(message);
- } else if (code == CHILD_TEST_IGNORED) {
- throw TestRunner::Ignored(message);
- }
- } else {
- // child code
-
- // End Runner after current test
- TestRunnerSingleton::Instance().Terminate();
-
- int code = CHILD_TEST_PASS;
- std::string msg;
-
- bool allowLogs = TestRunnerSingleton::Instance().GetAllowChildLogs();
-
- close(STDIN_FILENO);
- if (!allowLogs) {
- closeOutput(); // if fails nothing we can do
- }
-
- pipe.setUsage(PipeWrapper::WRITEONLY);
-
- try {
- procChild();
- } catch (const VcoreDPL::Test::TestRunner::TestFailed &e) {
- msg = e.GetMessage();
- code = CHILD_TEST_FAIL;
- } catch (const VcoreDPL::Test::TestRunner::Ignored &e) {
- msg = e.GetMessage();
- code = CHILD_TEST_IGNORED;
- } catch (...) { // catch all exception generated by "user" code
- msg = "unhandled exeception";
- code = CHILD_TEST_FAIL;
- }
-
- if (allowLogs) {
- closeOutput();
- }
-
- pipe.send(code, msg);
- }
+ PipeWrapper pipe;
+
+ if (!pipe.isReady()) {
+ throw TestRunner::TestFailed("Pipe creation failed");
+ }
+
+ pid_t pid = fork();
+
+ if (pid == -1) {
+ throw TestRunner::TestFailed("Child creation failed");
+ }
+
+ if (pid != 0) {
+ // parent code
+ pipe.setUsage(PipeWrapper::READONLY);
+ int code;
+ std::string message;
+ int pipeReturn = pipe.receive(code, message, time(0) + 10);
+
+ if (pipeReturn != PipeWrapper::SUCCESS) { // Timeout or reading error
+ pipe.closeAll();
+ kill(pid, SIGKILL);
+ }
+
+ int status;
+ waitpid(pid, &status, 0);
+
+ if (pipeReturn == PipeWrapper::TIMEOUT) {
+ throw TestRunner::TestFailed("Timeout");
+ }
+
+ if (pipeReturn == PipeWrapper::ERROR) {
+ throw TestRunner::TestFailed("Reading pipe error");
+ }
+
+ if (code == CHILD_TEST_FAIL) {
+ throw TestRunner::TestFailed(message);
+ } else if (code == CHILD_TEST_IGNORED) {
+ throw TestRunner::Ignored(message);
+ }
+ } else {
+ // child code
+ // End Runner after current test
+ TestRunnerSingleton::Instance().Terminate();
+ int code = CHILD_TEST_PASS;
+ std::string msg;
+ bool allowLogs = TestRunnerSingleton::Instance().GetAllowChildLogs();
+ close(STDIN_FILENO);
+
+ if (!allowLogs) {
+ closeOutput(); // if fails nothing we can do
+ }
+
+ pipe.setUsage(PipeWrapper::WRITEONLY);
+
+ try {
+ procChild();
+ } catch (const VcoreDPL::Test::TestRunner::TestFailed &e) {
+ msg = e.GetMessage();
+ code = CHILD_TEST_FAIL;
+ } catch (const VcoreDPL::Test::TestRunner::Ignored &e) {
+ msg = e.GetMessage();
+ code = CHILD_TEST_IGNORED;
+ } catch (...) { // catch all exception generated by "user" code
+ msg = "unhandled exeception";
+ code = CHILD_TEST_FAIL;
+ }
+
+ if (allowLogs) {
+ closeOutput();
+ }
+
+ pipe.send(code, msg);
+ }
}
} // namespace Test
} // namespace VcoreDPL
namespace Test {
SimplePipeWrapper::SimplePipeWrapper()
-: PipeWrapper()
+ : PipeWrapper()
{
-
}
SimplePipeWrapper::~SimplePipeWrapper()
{
-
}
PipeWrapper::Status SimplePipeWrapper::send(std::string &message)
{
- if (m_pipefd[1] == PIPE_CLOSED) {
- return ERROR;
- }
-
- if (message.size() > PIPE_BUF-1) {
- return ERROR;
- }
+ if (m_pipefd[1] == PIPE_CLOSED) {
+ return ERROR;
+ }
- char buffer[PIPE_BUF] = { 0 };
+ if (message.size() > PIPE_BUF - 1) {
+ return ERROR;
+ }
+ char buffer[PIPE_BUF] = { 0 };
- for(unsigned int i = 0; i < message.size(); ++i) {
- buffer[i] = message[i];
- }
+ for (unsigned int i = 0; i < message.size(); ++i) {
+ buffer[i] = message[i];
+ }
- return writeHelp(buffer, PIPE_BUF);
+ return writeHelp(buffer, PIPE_BUF);
}
PipeWrapper::Status SimplePipeWrapper::receive(std::string &data, bool &empty, time_t deadline)
{
- if (m_pipefd[0] == PIPE_CLOSED) {
- return ERROR;
- }
-
- empty = false;
-
- data.resize(PIPE_BUF);
-
- char buffer[PIPE_BUF] = { 0 };
-
- int ready = 0;
- while (ready != PIPE_BUF) {
- time_t wait = deadline - time(0);
- wait = wait < 1 ? 1 : wait;
- pollfd fds = { m_pipefd[0], POLLIN, 0 };
-
- int pollReturn = poll(&fds, 1, wait * 1000);
-
- if (pollReturn == 0) {
- return TIMEOUT; // Timeout
- }
-
- if (pollReturn < -1) {
- return ERROR;
- }
- int ret = read(m_pipefd[0], &buffer[ready], PIPE_BUF - ready);
- if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
- continue;
- }
-
- if (ret == -1) {
- closeHelp(0);
- return ERROR;
- }
- if (ret == 0) {
- empty = true;
- break;
- }
-
- ready += ret;
- }
-
-
- for(unsigned int i = 0; i < PIPE_BUF; ++i){
- if(buffer[i] == 0) {
- data.resize(i);
- return SUCCESS;
- }
- data[i] = buffer[i];
- }
-
- return ERROR;
+ if (m_pipefd[0] == PIPE_CLOSED) {
+ return ERROR;
+ }
+
+ empty = false;
+ data.resize(PIPE_BUF);
+ char buffer[PIPE_BUF] = { 0 };
+ int ready = 0;
+
+ while (ready != PIPE_BUF) {
+ time_t wait = deadline - time(0);
+ wait = wait < 1 ? 1 : wait;
+ pollfd fds = { m_pipefd[0], POLLIN, 0 };
+ int pollReturn = poll(&fds, 1, wait * 1000);
+
+ if (pollReturn == 0) {
+ return TIMEOUT; // Timeout
+ }
+
+ if (pollReturn < -1) {
+ return ERROR;
+ }
+
+ int ret = read(m_pipefd[0], &buffer[ready], PIPE_BUF - ready);
+
+ if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
+ continue;
+ }
+
+ if (ret == -1) {
+ closeHelp(0);
+ return ERROR;
+ }
+
+ if (ret == 0) {
+ empty = true;
+ break;
+ }
+
+ ready += ret;
+ }
+
+ for (unsigned int i = 0; i < PIPE_BUF; ++i) {
+ if (buffer[i] == 0) {
+ data.resize(i);
+ return SUCCESS;
+ }
+
+ data[i] = buffer[i];
+ }
+
+ return ERROR;
}
void RunMultiProc(TestRunner::TestCase procMulti)
{
- SimplePipeWrapper pipe;
- int code = MULTI_TEST_PASS;
- std::string msg = "";
- int pipeReturn;
-
- int waitStatus;
-
- pid_t top_pid = getpid();
-
- if (!pipe.isReady()) {
- throw TestRunner::TestFailed("Pipe creation failed");
- }
- // pipe
-
- try {
- procMulti();
- } catch (const TestRunner::TestFailed &e) {
- code = MULTI_TEST_FAILED;
- msg = e.GetMessage();
- } catch (const TestRunner::Ignored &e) {
- code = MULTI_TEST_IGNORED;
- msg = e.GetMessage();
- } catch (const VcoreDPL::Exception &e) {
- code = MULTI_TEST_INTERNAL;
- msg = "DPL exception:" + e.GetMessage();
- } catch (const std::exception &) {
- code = MULTI_TEST_INTERNAL;
- msg = "std exception";
- } catch (...) {
- // Unknown exception failure
- code = MULTI_TEST_INTERNAL;
- msg = "unknown exception";
- }
-
- while (true) {
- pid_t child_pid = wait(&waitStatus);
- if (child_pid == -1) {
- if (errno == ECHILD) {
- if (top_pid == getpid()) {
- std::string recMsg="";
-
- pipe.setUsage(PipeWrapper::READONLY);
-
- bool empty=false;
- while(true) {
- pipeReturn = pipe.receive(recMsg, empty, time(0) + 10);
-
- if (empty) {
- break;
- }
- if (pipeReturn == PipeWrapper::ERROR) {
- pipe.closeAll();
- throw TestRunner::TestFailed("Reading pipe error");
- } else if (pipeReturn == PipeWrapper::TIMEOUT) {
- pipe.closeAll();
- throw TestRunner::TestFailed("Timeout error");
- }
- msg = msg + "\n" + recMsg;
- }
- pipe.closeAll();
-
- switch(code) {
- case MULTI_TEST_PASS:
- return;
- case MULTI_TEST_FAILED:
- throw TestRunner::TestFailed(msg);
- case MULTI_TEST_IGNORED:
- throw TestRunner::Ignored(msg);
- case MULTI_TEST_INTERNAL:
- throw TestRunner::TestFailed(msg);
- default:
- throw TestRunner::TestFailed(msg);
- }
- } else {
- pipe.setUsage(PipeWrapper::WRITEONLY);
-
- pipeReturn = pipe.send(msg);
-
- if (pipeReturn == PipeWrapper::ERROR) {
- pipe.closeAll();
- code = MULTI_TEST_ERROR;
- }
-
- exit(code);
- }
- }
- } else if (WIFEXITED(waitStatus)) {
- if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_FAILED) {
- switch (code) {
- case MULTI_TEST_PASS:
- code = MULTI_TEST_FAILED;
- break;
- case MULTI_TEST_FAILED:
- break;
- case MULTI_TEST_IGNORED:
- code = MULTI_TEST_FAILED;
- break;
- case MULTI_TEST_INTERNAL:
- break;
- default:
- break;
- }
- } else if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_IGNORED) {
- switch (code) {
- case MULTI_TEST_PASS:
- code = MULTI_TEST_IGNORED;
- break;
- case MULTI_TEST_FAILED:
- break;
- case MULTI_TEST_IGNORED:
- break;
- case MULTI_TEST_INTERNAL:
- break;
- default:
- break;
- }
- } else if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_INTERNAL) {
- switch (code) {
- case MULTI_TEST_PASS:
- code = MULTI_TEST_INTERNAL;
- break;
- case MULTI_TEST_FAILED:
- code = MULTI_TEST_INTERNAL;
- break;
- case MULTI_TEST_IGNORED:
- code = MULTI_TEST_INTERNAL;
- break;
- case MULTI_TEST_INTERNAL:
- break;
- default:
- break;
- }
- } else if ((signed char)WEXITSTATUS(waitStatus) != MULTI_TEST_PASS) {
- code = MULTI_TEST_ERROR;
- msg = "PROCESS BAD CODE RETURN";
- }
- }
- }
+ SimplePipeWrapper pipe;
+ int code = MULTI_TEST_PASS;
+ std::string msg = "";
+ int pipeReturn;
+ int waitStatus;
+ pid_t top_pid = getpid();
+
+ if (!pipe.isReady()) {
+ throw TestRunner::TestFailed("Pipe creation failed");
+ }
+
+ // pipe
+
+ try {
+ procMulti();
+ } catch (const TestRunner::TestFailed &e) {
+ code = MULTI_TEST_FAILED;
+ msg = e.GetMessage();
+ } catch (const TestRunner::Ignored &e) {
+ code = MULTI_TEST_IGNORED;
+ msg = e.GetMessage();
+ } catch (const VcoreDPL::Exception &e) {
+ code = MULTI_TEST_INTERNAL;
+ msg = "DPL exception:" + e.GetMessage();
+ } catch (const std::exception &) {
+ code = MULTI_TEST_INTERNAL;
+ msg = "std exception";
+ } catch (...) {
+ // Unknown exception failure
+ code = MULTI_TEST_INTERNAL;
+ msg = "unknown exception";
+ }
+
+ while (true) {
+ pid_t child_pid = wait(&waitStatus);
+
+ if (child_pid == -1) {
+ if (errno == ECHILD) {
+ if (top_pid == getpid()) {
+ std::string recMsg = "";
+ pipe.setUsage(PipeWrapper::READONLY);
+ bool empty = false;
+
+ while (true) {
+ pipeReturn = pipe.receive(recMsg, empty, time(0) + 10);
+
+ if (empty) {
+ break;
+ }
+
+ if (pipeReturn == PipeWrapper::ERROR) {
+ pipe.closeAll();
+ throw TestRunner::TestFailed("Reading pipe error");
+ } else if (pipeReturn == PipeWrapper::TIMEOUT) {
+ pipe.closeAll();
+ throw TestRunner::TestFailed("Timeout error");
+ }
+
+ msg = msg + "\n" + recMsg;
+ }
+
+ pipe.closeAll();
+
+ switch (code) {
+ case MULTI_TEST_PASS:
+ return;
+
+ case MULTI_TEST_FAILED:
+ throw TestRunner::TestFailed(msg);
+
+ case MULTI_TEST_IGNORED:
+ throw TestRunner::Ignored(msg);
+
+ case MULTI_TEST_INTERNAL:
+ throw TestRunner::TestFailed(msg);
+
+ default:
+ throw TestRunner::TestFailed(msg);
+ }
+ } else {
+ pipe.setUsage(PipeWrapper::WRITEONLY);
+ pipeReturn = pipe.send(msg);
+
+ if (pipeReturn == PipeWrapper::ERROR) {
+ pipe.closeAll();
+ code = MULTI_TEST_ERROR;
+ }
+
+ exit(code);
+ }
+ }
+ } else if (WIFEXITED(waitStatus)) {
+ if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_FAILED) {
+ switch (code) {
+ case MULTI_TEST_PASS:
+ code = MULTI_TEST_FAILED;
+ break;
+
+ case MULTI_TEST_FAILED:
+ break;
+
+ case MULTI_TEST_IGNORED:
+ code = MULTI_TEST_FAILED;
+ break;
+
+ case MULTI_TEST_INTERNAL:
+ break;
+
+ default:
+ break;
+ }
+ } else if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_IGNORED) {
+ switch (code) {
+ case MULTI_TEST_PASS:
+ code = MULTI_TEST_IGNORED;
+ break;
+
+ case MULTI_TEST_FAILED:
+ break;
+
+ case MULTI_TEST_IGNORED:
+ break;
+
+ case MULTI_TEST_INTERNAL:
+ break;
+
+ default:
+ break;
+ }
+ } else if ((signed char)WEXITSTATUS(waitStatus) == MULTI_TEST_INTERNAL) {
+ switch (code) {
+ case MULTI_TEST_PASS:
+ code = MULTI_TEST_INTERNAL;
+ break;
+
+ case MULTI_TEST_FAILED:
+ code = MULTI_TEST_INTERNAL;
+ break;
+
+ case MULTI_TEST_IGNORED:
+ code = MULTI_TEST_INTERNAL;
+ break;
+
+ case MULTI_TEST_INTERNAL:
+ break;
+
+ default:
+ break;
+ }
+ } else if ((signed char)WEXITSTATUS(waitStatus) != MULTI_TEST_PASS) {
+ code = MULTI_TEST_ERROR;
+ msg = "PROCESS BAD CODE RETURN";
+ }
+ }
+ }
}
} // namespace Test
} // namespace VcoreDPL
std::string CSVTokenizerPolicy::GetSeperators()
{
- return ",";
+ return ",";
}
bool CSVTokenizerPolicy::SkipEmpty()
{
- return false;
+ return false;
}
void CSVTokenizerPolicy::PrepareValue(std::string &)
bool CSVTokenizerPolicy::TryAgainAtEnd(int)
{
- return false;
+ return false;
}
-bool CSVParserPolicy::SkipLine(const std::vector<std::string> & )
+bool CSVParserPolicy::SkipLine(const std::vector<std::string> &)
{
- return false;
+ return false;
}
-bool CSVParserPolicy::Validate(std::shared_ptr<std::vector<std::vector<std::string> > > & result)
+bool CSVParserPolicy::Validate(std::shared_ptr<std::vector<std::vector<std::string>>> &result)
{
- int num = -1;
- FOREACH(r, *result)
- {
- int size = r->size();
- if(num != -1 && num != size)
- return false;
+ int num = -1;
+ FOREACH(r, *result) {
+ int size = r->size();
- num = size;
- }
- return true;
+ if (num != -1 && num != size)
+ return false;
+
+ num = size;
+ }
+ return true;
}
}
namespace VcoreDPL {
-VSToken::VSToken(const std::string & c) : m_newline(false), m_cell(c)
+VSToken::VSToken(const std::string &c) : m_newline(false), m_cell(c)
{
}
{
}
-const std::string & VSToken::cell() const
+const std::string &VSToken::cell() const
{
- return m_cell;
+ return m_cell;
}
bool VSToken::isNewLine()
{
- return m_newline;
+ return m_newline;
}
}
retval = certsvc_string_new(instance, cStr, strlen(cStr), &certsvcStr);
RUNNER_ASSERT_MSG(retval == CERTSVC_SUCCESS,
- "Failed to certsvc_string_new with retval: " << retval);
-
+ "Failed to certsvc_string_new with retval: " << retval);
return certsvcStr;
}
const CertStoreType allStoreType = (CertStoreType)(WIFI_STORE | VPN_STORE | EMAIL_STORE);
#define CREATE_INSTANCE \
- certsvc_instance_new(&instance);
+ certsvc_instance_new(&instance);
#define FREE_INSTANCE \
- certsvc_instance_free(instance);
+ certsvc_instance_free(instance);
RUNNER_TEST(CERTSVC_PKCS12_1001_certsvc_get_root_cert_list)
{
CREATE_INSTANCE
-
- CertSvcStoreCertList* certList = NULL;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- int result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length);
+ int result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED,
+ &certList, &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
FREE_INSTANCE
}
{
CertStatus status = ENABLED;
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("24ad0b63.0");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
// if status is already disabled, roll it back to enable and go on
if (status == DISABLED) {
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Roll back certificate status to system store failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias,
+ ENABLED);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Roll back certificate status to system store failed.");
}
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, DISABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias,
+ DISABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
RUNNER_ASSERT_MSG(status == DISABLED, "invalid status from system store cert");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias, ENABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, SYSTEM_STORE, DISABLED, Alias,
+ ENABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, SYSTEM_STORE, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
RUNNER_ASSERT_MSG(status == ENABLED, "invalid status from system store cert");
-
certsvc_string_free(Alias);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1003_add_pem_file_in_individual_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerCertPemPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-1");
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to WIFI store failed.");
certsvc_string_free(Alias);
-
Alias = wrapper_certsvc_string_new("PEM-wifi-server-2");
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to VPN store failed.");
certsvc_string_free(Alias);
-
Alias = wrapper_certsvc_string_new("PEM-wifi-server-3");
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to EMAIL store failed.");
certsvc_string_free(Alias);
-
certsvc_string_free(Path);
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
-
CertSvcStoreCertList *certListOrig = certList;
int count = 0;
CertSvcString strSubject;
CertSvcString strIssuer;
CertSvcCertificate certificate;
+
while (certList) {
- result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
+ result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname,
+ &certificate);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
-
result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
-
result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
-
certsvc_string_free(strSubject);
certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1004_add_pem_file_in_all_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PEM-wifi-server-all-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerCertPemPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PEM file to all store failed.");
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1005_add_crt_file_in_individual_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1");
CertSvcString Path = wrapper_certsvc_string_new(TestData::CertCrtPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to WIFI store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to VPN store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to EMAIL store failed.");
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
-
CertSvcStoreCertList *certListOrig = certList;
int count = 0;
CertSvcString strSubject;
CertSvcString strIssuer;
CertSvcCertificate certificate;
- while (certList) {
- result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
+ while (certList) {
+ result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname,
+ &certificate);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
certsvc_string_free(strSubject);
certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1006_add_crt_file_in_all_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("CRT-TestingCRT1-all-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::CertCrtPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing CRT file to all store failed.");
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1007_install_p12_file_to_individual_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser");
CertSvcString Path = wrapper_certsvc_string_new(TestData::UserP12WithPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::UserP12Pass.c_str());
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to VPN store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to EMAIL store failed.");
-
- CertSvcStoreCertList* certList = NULL;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1008_install_p12_file_to_all_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("P12-WifiUser-all-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::UserP12WithPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::UserP12Pass.c_str());
-
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing p12 file to WIFI store failed.");
-
- CertSvcStoreCertList* certList = NULL;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1009_install_pfx_file_to_individual_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerPfxWithPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::ServerPfxPass.c_str());
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to VPN store failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL store failed.");
-
- CertSvcStoreCertList* certList = NULL;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1010_install_pfx_file_to_all_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-all-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerPfxWithPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::ServerPfxPass.c_str());
-
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI store failed.");
-
- CertSvcStoreCertList* certList = NULL;
+ CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from system store failed");
-
result = certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Freeing certificate list from system store failed");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1011_get_all_end_user_certificate_from_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length;
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, WIFI_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from WIFI_STORE failed.");
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, WIFI_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting end user certificate list from WIFI_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, VPN_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from VPN_STORE failed.");
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, VPN_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting end user certificate list from VPN_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
- result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting end user certificate list from EMAIL_STORE failed.");
+ result = certsvc_pkcs12_get_end_user_certificate_list_from_store(instance, EMAIL_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting end user certificate list from EMAIL_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, WIFI_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from WIFI_STORE failed.");
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, WIFI_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting root certificate list from WIFI_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, VPN_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from VPN_STORE failed.");
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, VPN_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting root certificate list from VPN_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
- result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, EMAIL_STORE, &certList, &length);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting root certificate list from EMAIL_STORE failed.");
+ result = certsvc_pkcs12_get_root_certificate_list_from_store(instance, EMAIL_STORE, &certList,
+ &length);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Getting root certificate list from EMAIL_STORE failed.");
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
FREE_INSTANCE
}
{
int result;
CertSvcString gname;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
-
CertSvcStoreCertList *certListOrig = certList;
+
while (certList) {
gname = wrapper_certsvc_string_new(certList->gname);
result = certsvc_pkcs12_delete_certificate_from_store(instance, certList->storeType, gname);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Deleting certificate from store failed.");
-
certsvc_string_free(gname);
-
certList = certList->next;
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1013_install_pfx_file_to_one_store_and_get_list_from_multiple_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerPfxWithPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::ServerPfxPass.c_str());
-
int isUnique = 0;
result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "check alias exists in store failed. result : " << result);
if (!isUnique) {
/* TODO: remove certificate which already exists and test continue */
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to EMAIL_STORE failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to WIFI_STORE failed.");
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed");
-
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certList);
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1014_installing_pfx_without_password_to_individual_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerPfxWithoutPassPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new("");
-
int isUnique = 0;
result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "check alias exists in store failed. result : " << result);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "check alias exists in store failed. result : " << result);
if (!isUnique) {
/* TODO: remove certificate which already exists and test continue */
}
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Importing PFX file to all store failed. result : " << result );
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Importing PFX file to all store failed. result : " << result);
certsvc_string_free(Alias);
certsvc_string_free(Path);
-
FREE_INSTANCE
}
-RUNNER_TEST(CERTSVC_PKCS12_1015_get_certificate_from_store) {
-
+RUNNER_TEST(CERTSVC_PKCS12_1015_get_certificate_from_store)
+{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, allStoreType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed.");
+
if (length == 0 || !certList) {
/* TODO: add any cert to store for testing */
RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
CertSvcString strSubject;
CertSvcString strIssuer;
CertSvcCertificate certificate;
+
while (certList) {
- result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
+ result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname,
+ &certificate);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
-
result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
-
result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
certsvc_string_free(strSubject);
certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1016_get_certificate_from_system_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, SYSTEM_STORE, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+
if (length == 0 || !certList) {
/* TODO: add any cert to store for testing */
RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
CertSvcString strSubject;
CertSvcString strIssuer;
CertSvcCertificate certificate;
- while (certList) {
- result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname, &certificate);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get certificate from store.");
+ while (certList) {
+ result = certsvc_pkcs12_get_certificate_from_store(instance, certList->storeType, certList->gname,
+ &certificate);
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get certificate from store.");
result = certsvc_certificate_get_string_field(certificate, CERTSVC_SUBJECT, &strSubject);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
result = certsvc_certificate_get_string_field(certificate, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
- RUNNER_ASSERT_MSG(result==CERTSVC_SUCCESS, "Failed to get string field.");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
certsvc_string_free(strSubject);
certsvc_string_free(strIssuer);
certsvc_certificate_free(certificate);
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListOrig);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1017_load_cert_list_from_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certListTemp = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED,
+ &certListTemp, &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed.");
+
if (length == 0 || !certListTemp) {
/* TODO: add any cert to store for testing */
RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
CertSvcString strIssuer;
CertSvcCertificate cert;
CertSvcString gname = wrapper_certsvc_string_new(certListTemp->gname);
-
CertSvcCertificateList certList;
result = certsvc_pkcs12_load_certificate_list_from_store(instance, VPN_STORE, gname, &certList);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Load certificate list form VPN_STORE failed.");
certsvc_string_free(gname);
-
length = 0;
result = certsvc_certificate_list_get_length(certList, &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate list get length failed.");
for (size_t i = 0; i < length; i++) {
result = certsvc_certificate_list_get_one(certList, i, &cert);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed.");
-
result = certsvc_certificate_get_string_field(cert, CERTSVC_SUBJECT, &strSubject);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
-
result = certsvc_certificate_get_string_field(cert, CERTSVC_ISSUER_COMMON_NAME, &strIssuer);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to get string field.");
-
certsvc_string_free(strSubject);
certsvc_string_free(strIssuer);
certsvc_certificate_free(cert);
}
certsvc_pkcs12_free_certificate_list_loaded_from_store(instance, &certListTemp);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1018_get_duplicate_private_key)
{
const char *privatekey_path = CERTSVC_PKCS12_STORAGE_DIR "/temp.txt";
-
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certListTemp = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED, &certListTemp, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, VPN_STORE, DISABLED,
+ &certListTemp, &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from VPN_STORE failed.");
+
if (length == 0 || !certListTemp) {
/* TODO: add any cert to store for testing */
RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, VPN_STORE, gname, &privatekey);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting duplicate private key from store failed.");
certsvc_string_free(gname);
-
FILE *fp = NULL;
+
if (!(fp = fopen(privatekey_path, "w")))
RUNNER_ASSERT_MSG(0, "Failed to open file for writing.");
result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
fclose(fp);
unlink(privatekey_path);
-
RUNNER_ASSERT_MSG(result != 0, "Failed to write private key onto file.");
-
certsvc_pkcs12_free_evp_pkey(privatekey);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1019_check_alias_exists)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-without-password");
-
int isUnique = 0;
result = certsvc_pkcs12_check_alias_exists_in_store(instance, allStoreType, Alias, &isUnique);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from all store failed.");
-
certsvc_string_free(Alias);
-
FREE_INSTANCE
}
{
CertStoreType storeTypeArr[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE};
int result;
-
CREATE_INSTANCE
for (size_t j = 0; j < 3; j++) {
CertStoreType storeType = storeTypeArr[j];
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
-
CertSvcStoreCertList *certListOrig = certList;
+
while (certList) {
CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
-
CertStatus status;
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, DISABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias,
+ DISABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
RUNNER_ASSERT_MSG(status == DISABLED, "certificate status should be disabled");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias, ENABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, DISABLED, Alias,
+ ENABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to system store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from system store failed.");
RUNNER_ASSERT_MSG(status == ENABLED, "certificate status should be enabled");
-
certsvc_string_free(Alias);
-
certList = certList->next;
}
RUNNER_TEST(CERTSVC_PKCS12_1021_add_pem_file_to_invalid_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("PFX-WifiServer-one-store");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerCertPemPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
- result = certsvc_pkcs12_import_from_file_to_store(instance, (CertStoreType)-1, Path, Pass, Alias);
- RUNNER_ASSERT_MSG(result == CERTSVC_INVALID_STORE_TYPE, "Importing certifcate should be failed with invalid store type");
-
+ result = certsvc_pkcs12_import_from_file_to_store(instance, (CertStoreType) - 1, Path, Pass, Alias);
+ RUNNER_ASSERT_MSG(result == CERTSVC_INVALID_STORE_TYPE,
+ "Importing certifcate should be failed with invalid store type");
result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing PEM file to SYSTEM_STORE should be failed");
-
result = certsvc_pkcs12_delete_certificate_from_store(instance, SYSTEM_STORE, Alias);
- RUNNER_ASSERT_MSG(result!=CERTSVC_SUCCESS, "Deleting certificate from SYSTEM_STORE should be failed");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Deleting certificate from SYSTEM_STORE should be failed");
certsvc_string_free(Alias);
certsvc_string_free(Path);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1022_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("eb375c3e.0");
-
CertStatus status;
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status with invalid store type should be failed");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias,
+ DISABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Set certificate status with invalid store type should be failed");
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status with invalid store type should be failed");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status with invalid store type should be failed");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias,
+ ENABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Set certificate status with invalid store type should be failed");
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status with invalid store type should be failed");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status with invalid store type should be failed");
certsvc_string_free(Alias);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1023_certsvc_set_cert_to_disabled_and_get_status_for_invalid_store)
{
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- int result = certsvc_pkcs12_get_certificate_list_from_store(instance, NONE_STORE, DISABLED, &certList, &length);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Getting certificate list from invalid store should be failed");
- RUNNER_ASSERT_MSG((length == 0 && certList == NULL), "no output should be returned with invalid store");
-
+ int result = certsvc_pkcs12_get_certificate_list_from_store(instance, NONE_STORE, DISABLED,
+ &certList, &length);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Getting certificate list from invalid store should be failed");
+ RUNNER_ASSERT_MSG((length == 0 &&
+ certList == NULL), "no output should be returned with invalid store");
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1024_certsvc_set_and_get_for_invalid_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("TestingCRT1");
CertSvcString Path = wrapper_certsvc_string_new(TestData::InvalidCertCrtPath.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(NULL);
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, NONE_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid CRT file should be failed.");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1025_install_invalid_pfx_file_to_individual_and_all_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcString Alias = wrapper_certsvc_string_new("WifiServer-123");
CertSvcString Path = wrapper_certsvc_string_new(TestData::ServerPfxWithPass2Path.c_str());
CertSvcString Pass = wrapper_certsvc_string_new(TestData::ServerPfx2Pass.c_str());
-
result = certsvc_pkcs12_import_from_file_to_store(instance, SYSTEM_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, WIFI_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, VPN_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, EMAIL_STORE, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
-
result = certsvc_pkcs12_import_from_file_to_store(instance, allStoreType, Path, Pass, Alias);
RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Importing invalid PFX file should be failed.");
-
certsvc_string_free(Alias);
certsvc_string_free(Path);
certsvc_string_free(Pass);
-
FREE_INSTANCE
}
RUNNER_TEST(CERTSVC_PKCS12_1026_enable_disable_status_certificate_from_invalid_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list from store failed.");
+
if (length == 0 || !certList) {
/* TODO: add any cert to store for testing */
RUNNER_ASSERT_MSG(0, "add any cert in store for testing");
while (certList) {
CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
-
CertStatus status;
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, DISABLED);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed.");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status from invalid store should be failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias,
+ DISABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Set certificate status to invalid store should be failed.");
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias, ENABLED);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Set certificate status to invalid store should be failed.");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status from invalid store should be failed.");
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, NONE_STORE, DISABLED, Alias,
+ ENABLED);
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Set certificate status to invalid store should be failed.");
result = certsvc_pkcs12_get_certificate_status_from_store(instance, NONE_STORE, Alias, &status);
- RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS, "Get certificate status from invalid store should be failed.");
-
+ RUNNER_ASSERT_MSG(result != CERTSVC_SUCCESS,
+ "Get certificate status from invalid store should be failed.");
certsvc_string_free(Alias);
-
certList = certList->next;
}
}
#define EAP_TLS_USER_CERT_PATH "user_cert.pem"
-#define EAP_TLS_PATH "/tmp/"
-#define EAP_TLS_CA_CERT_PATH "ca_cert.pem"
+#define EAP_TLS_PATH "/tmp/"
+#define EAP_TLS_CA_CERT_PATH "ca_cert.pem"
#define EAP_TLS_PRIVATEKEY_PATH "privatekey.pem"
RUNNER_TEST(CERTSVC_PKCS12_1027_get_alias_name_from_gname_from_store)
{
int result;
-
CREATE_INSTANCE
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, WIFI_STORE, DISABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed.");
-
int count = 1;
+
while (certList) {
CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
-
char *alias = NULL;
- result = certsvc_pkcs12_get_alias_name_for_certificate_in_store(instance, certList->storeType, Alias, &alias);
+ result = certsvc_pkcs12_get_alias_name_for_certificate_in_store(instance, certList->storeType,
+ Alias, &alias);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting alias name from gname failed.");
-
CertSvcCertificateList cert_list;
- result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias, &cert_list);
+ result = certsvc_pkcs12_load_certificate_list_from_store(instance, certList->storeType, Alias,
+ &cert_list);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_pkcs12_load_certificate_list failed");
-
size_t cert_counts = 0;
result = certsvc_certificate_list_get_length(cert_list, &cert_counts);
RUNNER_ASSERT_MSG(cert_counts > 0, "there is no certificates");
-
CertSvcCertificate *selected_certificate = new CertSvcCertificate[cert_counts];
RUNNER_ASSERT_MSG(selected_certificate != NULL, "failed to allocate memory");
-
CertSvcCertificate user_certificate;
result = certsvc_certificate_list_get_one(cert_list, 0, &user_certificate);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "certsvc_certificate_list_get_one failed");
-
X509 *x509 = NULL;
result = certsvc_certificate_dup_x509(user_certificate, &x509);
-
char user_cert_path[512];
-
const char *output_template = CERTSVC_PKCS12_STORAGE_DIR "/file_%d";
-
snprintf(user_cert_path, sizeof(user_cert_path), output_template, count++);
FILE *fp = fopen(user_cert_path, "w");
RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
result = PEM_write_X509(fp, x509);
fclose(fp);
-
certsvc_certificate_free_x509(x509);
certList = certList->next;
-
int cert_index = cert_counts - 1;
selected_certificate[0] = user_certificate;
-
char ca_cert_path[512];
- snprintf(ca_cert_path, sizeof(ca_cert_path), "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_CA_CERT_PATH);
+ snprintf(ca_cert_path, sizeof(ca_cert_path), "%s%s_%s", EAP_TLS_PATH, certList->gname,
+ EAP_TLS_CA_CERT_PATH);
+
while (cert_index) {
CertSvcCertificate ca_certificate;
result = certsvc_certificate_list_get_one(cert_list, cert_index, &ca_certificate);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to certsvc_certificate_list_get_one");
-
- selected_certificate[cert_counts-cert_index] = ca_certificate;
+ selected_certificate[cert_counts - cert_index] = ca_certificate;
cert_index--;
-
result = certsvc_certificate_dup_x509(ca_certificate, &x509);
-
fp = fopen(ca_cert_path, "a");
RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
-
result = PEM_write_X509(fp, x509);
fclose(fp);
-
certsvc_certificate_free_x509(x509);
}
int validity = 0;
- result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts, NULL, 0, &validity);
+ result = certsvc_certificate_verify(selected_certificate[0], selected_certificate, cert_counts,
+ NULL, 0, &validity);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to verify ca_certificate");
RUNNER_ASSERT_MSG(validity != 0, "Invalid certificate");
-
EVP_PKEY *privatekey = NULL;
result = certsvc_pkcs12_dup_evp_pkey_from_store(instance, WIFI_STORE, Alias, &privatekey);
- RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Failed to duplicate the private key for a certificate from wifi store");
-
+ RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS,
+ "Failed to duplicate the private key for a certificate from wifi store");
char privatekey_path[512];
- snprintf(privatekey_path, sizeof(privatekey_path), "%s%s_%s", EAP_TLS_PATH, certList->gname, EAP_TLS_PRIVATEKEY_PATH);
+ snprintf(privatekey_path, sizeof(privatekey_path), "%s%s_%s", EAP_TLS_PATH, certList->gname,
+ EAP_TLS_PRIVATEKEY_PATH);
fp = fopen(privatekey_path, "w");
RUNNER_ASSERT_MSG(fp != NULL, "Failed to open the file for writing");
-
result = PEM_write_PrivateKey(fp, privatekey, NULL, NULL, 0, NULL, NULL);
fclose(fp);
-
certsvc_pkcs12_free_evp_pkey(privatekey);
-
certsvc_string_free(Alias);
delete []selected_certificate;
}
{
CertStoreType array[3] = {VPN_STORE, WIFI_STORE, EMAIL_STORE};
int result;
-
CREATE_INSTANCE
for (size_t j = 0; j < 3; j++) {
CertStoreType storeType = array[j];
-
CertSvcStoreCertList *certList = NULL;
size_t length = 0;
- result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, ENABLED, &certList, &length);
+ result = certsvc_pkcs12_get_certificate_list_from_store(instance, storeType, ENABLED, &certList,
+ &length);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Getting certificate list failed.");
-
CertSvcStoreCertList *certListOrig = certList;
+
while (certList) {
CertSvcString Alias = wrapper_certsvc_string_new(certList->gname);
-
CertStatus status;
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, DISABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias,
+ DISABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
-
- result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias, ENABLED);
+ result = certsvc_pkcs12_set_certificate_status_to_store(instance, storeType, ENABLED, Alias,
+ ENABLED);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Set certificate status to store failed.");
-
result = certsvc_pkcs12_get_certificate_status_from_store(instance, storeType, Alias, &status);
RUNNER_ASSERT_MSG(result == CERTSVC_SUCCESS, "Get certificate status from store failed.");
-
certsvc_string_free(Alias);
-
certList = certList->next;
}
CertSvcInstance vinstance;
-int main (int argc, char *argv[]) {
- certsvc_instance_new(&vinstance);
- int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
- certsvc_instance_free(vinstance);
- return status;
+int main(int argc, char *argv[])
+{
+ certsvc_instance_new(&vinstance);
+ int status = VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+ certsvc_instance_free(vinstance);
+ return status;
}
#define PLUGIN_API __attribute__((visibility("default")))
extern "C" {
-ValidationCore::ValidatorPlugin *create(void);
-void destroy(ValidationCore::ValidatorPlugin *obj);
+ ValidationCore::ValidatorPlugin *create(void);
+ void destroy(ValidationCore::ValidatorPlugin *obj);
}
namespace ValidationCore {
ValidationCore::ValidatorPlugin *create(void)
{
ValidationCore::Plugin *plugin = new ValidationCore::Plugin;
-
SLOGI("Plugin create!");
-
return plugin;
}
void destroy(ValidationCore::ValidatorPlugin *obj)
{
delete obj;
-
SLOGI("Plugin destroy!");
}
*/
#include <dpl/test/test_runner.h>
-int main (int argc, char *argv[])
+int main(int argc, char *argv[])
{
VcoreDPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
-
return 0;
}
*/
RUNNER_TEST(T0031_Certificate)
{
- Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
- std::string result;
-
- result = cert.getCommonName(Certificate::FIELD_SUBJECT);
- RUNNER_ASSERT_MSG(!result.empty(), "No common name");
- RUNNER_ASSERT_MSG(!result.compare("www.verisign.com"), "CommonName mismatch");
-
- result = cert.getCommonName(Certificate::FIELD_ISSUER);
- RUNNER_ASSERT_MSG(!result.empty(), "No common name");
- RUNNER_ASSERT_MSG(!result.compare("VeriSign Class 3 Extended Validation SSL SGC CA"),
- "CommonName mismatch");
-
- result = cert.getCountryName();
- RUNNER_ASSERT_MSG(!result.empty(), "No country");
- RUNNER_ASSERT_MSG(!result.compare("US"), "Country mismatch");
+ Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
+ std::string result;
+ result = cert.getCommonName(Certificate::FIELD_SUBJECT);
+ RUNNER_ASSERT_MSG(!result.empty(), "No common name");
+ RUNNER_ASSERT_MSG(!result.compare("www.verisign.com"), "CommonName mismatch");
+ result = cert.getCommonName(Certificate::FIELD_ISSUER);
+ RUNNER_ASSERT_MSG(!result.empty(), "No common name");
+ RUNNER_ASSERT_MSG(!result.compare("VeriSign Class 3 Extended Validation SSL SGC CA"),
+ "CommonName mismatch");
+ result = cert.getCountryName();
+ RUNNER_ASSERT_MSG(!result.empty(), "No country");
+ RUNNER_ASSERT_MSG(!result.compare("US"), "Country mismatch");
}
/*
*/
RUNNER_TEST(T0032_Certificate)
{
- Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
-
- Certificate::Fingerprint fin =
- cert.getFingerprint(Certificate::FINGERPRINT_SHA1);
-
- unsigned char buff[20] = {
- 0xb9, 0x72, 0x1e, 0xd5, 0x49,
- 0xed, 0xbf, 0x31, 0x84, 0xd8,
- 0x27, 0x0c, 0xfe, 0x03, 0x11,
- 0x19, 0xdf, 0xc2, 0x2b, 0x0a};
- RUNNER_ASSERT_MSG(fin.size() == 20, "Wrong size of fingerprint");
-
- for (size_t i = 0; i<20; ++i) {
- RUNNER_ASSERT_MSG(fin[i] == buff[i], "Fingerprint mismatch");
- }
+ Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
+ Certificate::Fingerprint fin =
+ cert.getFingerprint(Certificate::FINGERPRINT_SHA1);
+ unsigned char buff[20] = {
+ 0xb9, 0x72, 0x1e, 0xd5, 0x49,
+ 0xed, 0xbf, 0x31, 0x84, 0xd8,
+ 0x27, 0x0c, 0xfe, 0x03, 0x11,
+ 0x19, 0xdf, 0xc2, 0x2b, 0x0a
+ };
+ RUNNER_ASSERT_MSG(fin.size() == 20, "Wrong size of fingerprint");
+
+ for (size_t i = 0; i < 20; ++i) {
+ RUNNER_ASSERT_MSG(fin[i] == buff[i], "Fingerprint mismatch");
+ }
}
/*
*/
RUNNER_TEST(T0033_Certificate)
{
- Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
-
- Certificate::AltNameSet nameSet = cert.getAlternativeNameDNS();
-
- RUNNER_ASSERT(nameSet.size() == 8);
-
- std::string str("verisign.com");
- RUNNER_ASSERT(nameSet.find(str) != nameSet.end());
-
- str = std::string("fake.com");
- RUNNER_ASSERT(nameSet.find(str) == nameSet.end());
-
+ Certificate cert(TestData::certVerisign, Certificate::FORM_BASE64);
+ Certificate::AltNameSet nameSet = cert.getAlternativeNameDNS();
+ RUNNER_ASSERT(nameSet.size() == 8);
+ std::string str("verisign.com");
+ RUNNER_ASSERT(nameSet.find(str) != nameSet.end());
+ str = std::string("fake.com");
+ RUNNER_ASSERT(nameSet.find(str) == nameSet.end());
}
/*
*/
RUNNER_TEST(T0034_Certificate_isCA)
{
- Certificate cert1(TestData::googleCA, Certificate::FORM_BASE64);
- RUNNER_ASSERT(cert1.isCA() > 0);
-
- Certificate cert2(TestData::google2nd, Certificate::FORM_BASE64);
- RUNNER_ASSERT(cert2.isCA() > 0);
-
- Certificate cert3(TestData::google3rd, Certificate::FORM_BASE64);
- RUNNER_ASSERT(cert3.isCA() == 0);
+ Certificate cert1(TestData::googleCA, Certificate::FORM_BASE64);
+ RUNNER_ASSERT(cert1.isCA() > 0);
+ Certificate cert2(TestData::google2nd, Certificate::FORM_BASE64);
+ RUNNER_ASSERT(cert2.isCA() > 0);
+ Certificate cert3(TestData::google3rd, Certificate::FORM_BASE64);
+ RUNNER_ASSERT(cert3.isCA() == 0);
}
const std::string TestData::widget_path = std::string(TESTAPP_RES_DIR) + "apps/wgt";
const std::string TestData::widget_dist22_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_dist22";
-const std::string TestData::widget_negative_hash_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_negative_hash";
-const std::string TestData::widget_negative_signature_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_negative_signature";
-const std::string TestData::widget_negative_certificate_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_negative_certificate";
+const std::string TestData::widget_negative_hash_path = std::string(TESTAPP_RES_DIR) +
+ "apps/wgt_negative_hash";
+const std::string TestData::widget_negative_signature_path = std::string(
+ TESTAPP_RES_DIR) + "apps/wgt_negative_signature";
+const std::string TestData::widget_negative_certificate_path = std::string(
+ TESTAPP_RES_DIR) + "apps/wgt_negative_certificate";
const std::string TestData::widget_partner_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_partner";
-const std::string TestData::widget_platform_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_platform";
-const std::string TestData::widget_positive_link_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_positive_link";
-const std::string TestData::widget_negative_link_path = std::string(TESTAPP_RES_DIR) + "apps/wgt_negative_link";
+const std::string TestData::widget_platform_path = std::string(TESTAPP_RES_DIR) +
+ "apps/wgt_platform";
+const std::string TestData::widget_positive_link_path = std::string(TESTAPP_RES_DIR) +
+ "apps/wgt_positive_link";
+const std::string TestData::widget_negative_link_path = std::string(TESTAPP_RES_DIR) +
+ "apps/wgt_negative_link";
const std::string TestData::tpk_path = std::string(TESTAPP_RES_DIR) + "apps/tpk";
const std::string TestData::attacked_tpk_path = std::string(TESTAPP_RES_DIR) + "apps/attacked-tpk";
-const std::string TestData::tpk_with_userdata_path = std::string(TESTAPP_RES_DIR) + "apps/tpk-with-userdata";
-const std::string TestData::attacked_tpk_with_userdata_path = std::string(TESTAPP_RES_DIR) + "apps/attacked-tpk-with-userdata";
+const std::string TestData::tpk_with_userdata_path = std::string(TESTAPP_RES_DIR) +
+ "apps/tpk-with-userdata";
+const std::string TestData::attacked_tpk_with_userdata_path = std::string(
+ TESTAPP_RES_DIR) + "apps/attacked-tpk-with-userdata";
const std::string TestData::certEE =
"MIIGXDCCBUSgAwIBAgIQKJK70TuBw91HAA0BqZSPETANBgkqhkiG9w0BAQsFADB3\n"
try {
SignatureData data;
CertificateList certList;
-
certList.push_back(CertificatePtr(new Certificate(TestData::certEE, Certificate::FORM_BASE64)));
certList.push_back(CertificatePtr(new Certificate(TestData::certIM, Certificate::FORM_BASE64)));
certList.push_back(CertificatePtr(new Certificate(TestData::certRoot, Certificate::FORM_BASE64)));
-
data.setSortedCertificateList(certList);
-
Ocsp::Result result = Ocsp::check(data);
-
RUNNER_ASSERT_MSG(
result == Ocsp::Result::GOOD,
"verisign cert shouldn't be revoked");
-
} catch (Ocsp::Exception::Base &e) {
RUNNER_ASSERT_MSG(0, "Exception occured in T0031 : " << e.DumpToString());
}
RUNNER_TEST(T00101_finder)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
- RUNNER_ASSERT_MSG(signatureSet.size() == 2, "Some signature has not been found");
-
- for (auto &fileInfo : signatureSet)
- RUNNER_ASSERT_MSG((
- (fileInfo.getFileName().find("author-signature.xml") != std::string::npos && fileInfo.getFileNumber() == -1) ||
- (fileInfo.getFileName().find("signature1.xml") != std::string::npos && fileInfo.getFileNumber() == 1)),
- "invalid signature xml found: " << fileInfo.getFileName() << " with number: " << fileInfo.getFileNumber());
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+ RUNNER_ASSERT_MSG(signatureSet.size() == 2, "Some signature has not been found");
+
+ for (auto &fileInfo : signatureSet)
+ RUNNER_ASSERT_MSG((
+ (fileInfo.getFileName().find("author-signature.xml") != std::string::npos &&
+ fileInfo.getFileNumber() == -1) ||
+ (fileInfo.getFileName().find("signature1.xml") != std::string::npos &&
+ fileInfo.getFileNumber() == 1)),
+ "invalid signature xml found: " << fileInfo.getFileName() << " with number: " <<
+ fileInfo.getFileNumber());
}
RUNNER_TEST(T00102_positive_public_check_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_path,
- true,
- true,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature() && data.getSignatureNumber() == 1)
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PUBLIC,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_path,
+ true,
+ true,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature() && data.getSignatureNumber() == 1)
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PUBLIC,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00103_positive_partner_check_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_partner_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_partner_path,
- true,
- true,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_partner_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_partner_path,
+ true,
+ true,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00104_positive_public_uncheck_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_path,
- true,
- false,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature() && data.getSignatureNumber() == 1)
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PUBLIC,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_path,
+ true,
+ false,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature() && data.getSignatureNumber() == 1)
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PUBLIC,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00105_positive_partner_uncheck_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_partner_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_partner_path,
- true,
- false,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_partner_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_partner_path,
+ true,
+ false,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00106_positive_tpk)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::tpk_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::tpk_path,
- true,
- true,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::tpk_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::tpk_path,
+ true,
+ true,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00107_positive_tpk_with_userdata)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::tpk_with_userdata_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- UriList uriList;
- uriList.emplace_back("author-siganture.xml");
- uriList.emplace_back("bin/preference");
- uriList.emplace_back("res/edje/pref_buttons_panel.edj");
- uriList.emplace_back("res/edje/pref_edit_panel.edj");
- uriList.emplace_back("res/edje/preference.edj");
- uriList.emplace_back("res/images/icon_delete.png");
- uriList.emplace_back("res/res.xml");
- uriList.emplace_back("shared/res/preference.png");
- uriList.emplace_back("tizen-manifest.xml");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.checkList(
- true,
- uriList,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::tpk_with_userdata_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+ UriList uriList;
+ uriList.emplace_back("author-siganture.xml");
+ uriList.emplace_back("bin/preference");
+ uriList.emplace_back("res/edje/pref_buttons_panel.edj");
+ uriList.emplace_back("res/edje/pref_edit_panel.edj");
+ uriList.emplace_back("res/edje/preference.edj");
+ uriList.emplace_back("res/images/icon_delete.png");
+ uriList.emplace_back("res/res.xml");
+ uriList.emplace_back("shared/res/preference.png");
+ uriList.emplace_back("tizen-manifest.xml");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.checkList(
+ true,
+ uriList,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00108_distributor_disregard_check)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_dist22_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_dist22_path,
- true,
- true,
- data);
-
- if (data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_CHAIN,
- "author sig validation should be fail : "
- << validator.errorToString(result));
- else
- if (data.getSignatureNumber() == 1)
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_CHAIN,
- "dist1 sig validation should be fail: "
- << validator.errorToString(result));
- else
- RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
- "dist22 sig validation should be disregarded: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_dist22_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_dist22_path,
+ true,
+ true,
+ data);
+
+ if (data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_CHAIN,
+ "author sig validation should be fail : "
+ << validator.errorToString(result));
+ else if (data.getSignatureNumber() == 1)
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_CHAIN,
+ "dist1 sig validation should be fail: "
+ << validator.errorToString(result));
+ else
+ RUNNER_ASSERT_MSG(result == E_SIG_DISREGARDED,
+ "dist22 sig validation should be disregarded: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00109_positive_platform_check_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_platform_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_platform_path,
- true,
- true,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PLATFORM,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_platform_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_platform_path,
+ true,
+ true,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PLATFORM,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00110_positive_platform_uncheck_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_platform_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_platform_path,
- true,
- false,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "sig validation should be success: "
- << validator.errorToString(result));
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PLATFORM,
- "visibility check failed.");
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_platform_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_platform_path,
+ true,
+ false,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "sig validation should be success: "
+ << validator.errorToString(result));
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PLATFORM,
+ "visibility check failed.");
+ }
}
RUNNER_TEST(T00111_positive_wgt_link)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_positive_link_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_positive_link_path,
- true,
- true,
- data);
-
- // this condition is for OCSP Success in signature1.xml
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_NONE,
- "If DT_LNK type point within package, it should be success: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_positive_link_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_positive_link_path,
+ true,
+ true,
+ data);
+
+ // this condition is for OCSP Success in signature1.xml
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_NONE,
+ "If DT_LNK type point within package, it should be success: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00112_negative_wgt_link)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_negative_link_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_negative_link_path,
- true,
- true,
- data);
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_REF,
- "If DT_LNK type point outside of package, it should be fail: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_negative_link_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_negative_link_path,
+ true,
+ true,
+ data);
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_REF,
+ "If DT_LNK type point outside of package, it should be fail: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00151_negative_hash_check_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_negative_hash_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_negative_hash_path,
- true,
- true,
- data);
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "dist sig shouldn't be success: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_negative_hash_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_negative_hash_path,
+ true,
+ true,
+ data);
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "dist sig shouldn't be success: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00152_negative_hash_uncheck_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_negative_hash_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_negative_hash_path,
- true,
- false,
- data);
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "dist sig shouldn't be success: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_negative_hash_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_negative_hash_path,
+ true,
+ false,
+ data);
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "dist sig shouldn't be success: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00153_negative_signature_check_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_negative_signature_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_negative_signature_path,
- true,
- true,
- data);
-
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "dist sig validation should be failed: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_negative_signature_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_negative_signature_path,
+ true,
+ true,
+ data);
+
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "dist sig validation should be failed: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00154_negative_signature_uncheck_ref)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::widget_negative_signature_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::widget_negative_signature_path,
- true,
- false,
- data);
-
- // TODO(sangwan.kwon) : delete if condition about author signature
- if (!data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "dist sig should be failed: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::widget_negative_signature_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::widget_negative_signature_path,
+ true,
+ false,
+ data);
+
+ // TODO(sangwan.kwon) : delete if condition about author signature
+ if (!data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "dist sig should be failed: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00155_negative_tpk_with_added_malfile)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::attacked_tpk_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.check(
- TestData::attacked_tpk_path,
- true,
- true,
- data);
-
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_REF,
- "dist sig validation should be failed: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::attacked_tpk_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.check(
+ TestData::attacked_tpk_path,
+ true,
+ true,
+ data);
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_REF,
+ "dist sig validation should be failed: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST(T00156_negative_tpk_with_userdata_file_changed_in_list)
{
- SignatureFileInfoSet signatureSet;
- SignatureFinder signatureFinder(TestData::attacked_tpk_with_userdata_path);
- RUNNER_ASSERT_MSG(
- SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
- "SignatureFinder failed");
-
- UriList uriList;
- uriList.emplace_back("author-siganture.xml");
- uriList.emplace_back("bin/preference");
- uriList.emplace_back("res/edje/pref_buttons_panel.edj");
- uriList.emplace_back("res/edje/pref_edit_panel.edj");
- uriList.emplace_back("res/edje/preference.edj");
- uriList.emplace_back("res/images/icon_delete.png");
- uriList.emplace_back("res/res.xml");
- uriList.emplace_back("shared/res/preference.png");
-
- /* this file is modified after signing app */
- uriList.emplace_back("tizen-manifest.xml");
-
- for (auto &sig : signatureSet) {
- SignatureValidator validator(sig);
- SignatureData data;
- VCerr result = validator.checkList(
- true,
- uriList,
- data);
-
- if (data.isAuthorSignature())
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "author sig validation should be failed: "
- << validator.errorToString(result));
- else
- RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
- "dist sig validation should be failed: "
- << validator.errorToString(result));
- }
+ SignatureFileInfoSet signatureSet;
+ SignatureFinder signatureFinder(TestData::attacked_tpk_with_userdata_path);
+ RUNNER_ASSERT_MSG(
+ SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
+ "SignatureFinder failed");
+ UriList uriList;
+ uriList.emplace_back("author-siganture.xml");
+ uriList.emplace_back("bin/preference");
+ uriList.emplace_back("res/edje/pref_buttons_panel.edj");
+ uriList.emplace_back("res/edje/pref_edit_panel.edj");
+ uriList.emplace_back("res/edje/preference.edj");
+ uriList.emplace_back("res/images/icon_delete.png");
+ uriList.emplace_back("res/res.xml");
+ uriList.emplace_back("shared/res/preference.png");
+ /* this file is modified after signing app */
+ uriList.emplace_back("tizen-manifest.xml");
+
+ for (auto &sig : signatureSet) {
+ SignatureValidator validator(sig);
+ SignatureData data;
+ VCerr result = validator.checkList(
+ true,
+ uriList,
+ data);
+
+ if (data.isAuthorSignature())
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "author sig validation should be failed: "
+ << validator.errorToString(result));
+ else
+ RUNNER_ASSERT_MSG(result == E_SIG_INVALID_SIG,
+ "dist sig validation should be failed: "
+ << validator.errorToString(result));
+ }
}
RUNNER_TEST_GROUP_INIT(T0020_SigVal_errorstring)
RUNNER_TEST(T0021)
{
- SignatureValidator validator(SignatureFileInfo("test-dummy", 1));
-
- for (VCerr code = E_SCOPE_FIRST; code >= E_SCOPE_LAST; code--) {
- std::cout << "E_SIG code["
- << code << "] : "
- << validator.errorToString(code) << std::endl;
- }
-
- /* print 10 more error code below last in case of plugin err exist */
- for (VCerr code = E_SCOPE_LAST - 1; code >= E_SCOPE_LAST - 10; code--) {
- std::cout << "VCerr from plugin["
- << code << "] : "
- << validator.errorToString(code) << std::endl;
- }
+ SignatureValidator validator(SignatureFileInfo("test-dummy", 1));
+
+ for (VCerr code = E_SCOPE_FIRST; code >= E_SCOPE_LAST; code--) {
+ std::cout << "E_SIG code["
+ << code << "] : "
+ << validator.errorToString(code) << std::endl;
+ }
+
+ /* print 10 more error code below last in case of plugin err exist */
+ for (VCerr code = E_SCOPE_LAST - 1; code >= E_SCOPE_LAST - 10; code--) {
+ std::cout << "VCerr from plugin["
+ << code << "] : "
+ << validator.errorToString(code) << std::endl;
+ }
}
static void UnitWrapper(const char *str, int type, int expected)
{
ASN1_TIME asn1Time;
-
memset(&asn1Time, 0, sizeof(ASN1_TIME));
-
ASN1_STRING_set(&asn1Time, str, strlen(str));
asn1Time.type = type;
-
time_t t = 0;
int ret = ValidationCore::asn1TimeToTimeT(&asn1Time, &t);
RUNNER_ASSERT_MSG(ret == expected,
- "ret: " << ret
- << " expected: " << expected
- << " time t: " << t);
+ "ret: " << ret
+ << " expected: " << expected
+ << " time t: " << t);
}
RUNNER_TEST_GROUP_INIT(T0040_TIME_CONVERSION)
#endif
typedef struct CertSvcCertificate_t {
- size_t privateHandler;
- CertSvcInstance privateInstance;
+ size_t privateHandler;
+ CertSvcInstance privateInstance;
} CertSvcCertificate;
typedef struct CertSvcCertificateList_t {
- size_t privateHandler;
- CertSvcInstance privateInstance;
+ size_t privateHandler;
+ CertSvcInstance privateInstance;
} CertSvcCertificateList;
#define MAX_STORE_ENUMS 5
typedef enum certImportType_t {
- NONE_STORE = 0,
- VPN_STORE = 1 << 0,
- WIFI_STORE = 1 << 1,
- EMAIL_STORE = 1 << 2,
- SYSTEM_STORE = 1 << 3,
- ALL_STORE = VPN_STORE | WIFI_STORE | EMAIL_STORE | SYSTEM_STORE
+ NONE_STORE = 0,
+ VPN_STORE = 1 << 0,
+ WIFI_STORE = 1 << 1,
+ EMAIL_STORE = 1 << 2,
+ SYSTEM_STORE = 1 << 3,
+ ALL_STORE = VPN_STORE | WIFI_STORE | EMAIL_STORE | SYSTEM_STORE
} CertStoreType;
typedef enum certStatus_t {
- DISABLED = 0,
- ENABLED = 1
+ DISABLED = 0,
+ ENABLED = 1
} CertStatus;
-typedef struct CertSvcStoreCertList_t{
- char *gname; // keyfile group name
- char *title; // common Name / Alias provided by the user
- CertStatus status;
- CertStoreType storeType;
- struct CertSvcStoreCertList_t *next;
+typedef struct CertSvcStoreCertList_t {
+ char *gname; // keyfile group name
+ char *title; // common Name / Alias provided by the user
+ CertStatus status;
+ CertStoreType storeType;
+ struct CertSvcStoreCertList_t *next;
} CertSvcStoreCertList;
typedef enum certType_t {
- PEM_CRT = 1 << 0,
- P12_END_USER = 1 << 1,
- P12_INTERMEDIATE = 1 << 2,
- P12_TRUSTED = 1 << 3,
- P12_PKEY = 1 << 4,
- INVALID_DATA = 1 << 5
+ PEM_CRT = 1 << 0,
+ P12_END_USER = 1 << 1,
+ P12_INTERMEDIATE = 1 << 2,
+ P12_TRUSTED = 1 << 3,
+ P12_PKEY = 1 << 4,
+ INVALID_DATA = 1 << 5
} CertType;
typedef enum CertSvcCertificateForm_t {
-/* CERTSVC_FORM_PEM, */
- CERTSVC_FORM_DER,
- CERTSVC_FORM_DER_BASE64
+ /* CERTSVC_FORM_PEM, */
+ CERTSVC_FORM_DER,
+ CERTSVC_FORM_DER_BASE64
} CertSvcCertificateForm;
typedef enum CertSvcCertificateField_t {
- CERTSVC_SUBJECT,
- CERTSVC_SUBJECT_COMMON_NAME,
- CERTSVC_SUBJECT_COUNTRY_NAME,
- CERTSVC_SUBJECT_STATE_NAME,
- CERTSVC_SUBJECT_LOCALITY_NAME,
- CERTSVC_SUBJECT_ORGANIZATION_NAME,
- CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME,
- CERTSVC_SUBJECT_EMAIL_ADDRESS,
-/* CERTSVC_SUBJECT_UID, */
- CERTSVC_ISSUER,
- CERTSVC_ISSUER_COMMON_NAME,
- CERTSVC_ISSUER_COUNTRY_NAME,
- CERTSVC_ISSUER_STATE_NAME,
- CERTSVC_ISSUER_LOCALITY_NAME,
- CERTSVC_ISSUER_ORGANIZATION_NAME,
- CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME,
- CERTSVC_ISSUER_EMAIL_ADDRESS,
-/* CERTSVC_ISSUER_UID, */
- CERTSVC_VERSION,
- CERTSVC_SERIAL_NUMBER,
- CERTSVC_KEY_USAGE,
- CERTSVC_KEY,
- CERTSVC_KEY_ALGO,
- CERTSVC_SIGNATURE_ALGORITHM
+ CERTSVC_SUBJECT,
+ CERTSVC_SUBJECT_COMMON_NAME,
+ CERTSVC_SUBJECT_COUNTRY_NAME,
+ CERTSVC_SUBJECT_STATE_NAME,
+ CERTSVC_SUBJECT_LOCALITY_NAME,
+ CERTSVC_SUBJECT_ORGANIZATION_NAME,
+ CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME,
+ CERTSVC_SUBJECT_EMAIL_ADDRESS,
+ /* CERTSVC_SUBJECT_UID, */
+ CERTSVC_ISSUER,
+ CERTSVC_ISSUER_COMMON_NAME,
+ CERTSVC_ISSUER_COUNTRY_NAME,
+ CERTSVC_ISSUER_STATE_NAME,
+ CERTSVC_ISSUER_LOCALITY_NAME,
+ CERTSVC_ISSUER_ORGANIZATION_NAME,
+ CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME,
+ CERTSVC_ISSUER_EMAIL_ADDRESS,
+ /* CERTSVC_ISSUER_UID, */
+ CERTSVC_VERSION,
+ CERTSVC_SERIAL_NUMBER,
+ CERTSVC_KEY_USAGE,
+ CERTSVC_KEY,
+ CERTSVC_KEY_ALGO,
+ CERTSVC_SIGNATURE_ALGORITHM
} CertSvcCertificateField;
typedef enum CertSvcVisibility_t {
* @see #CertSvcCertificate
*/
int certsvc_get_certificate(CertSvcInstance instance,
- CertStoreType storeType,
- const char *gname,
- CertSvcCertificate *certificate);
+ CertStoreType storeType,
+ const char *gname,
+ CertSvcCertificate *certificate);
/**
* Load certificate to @a CertSvcCertificate from file.
* @see #CertSvcCertificate
*/
int certsvc_certificate_new_from_file(CertSvcInstance instance,
- const char *location,
- CertSvcCertificate *certificate);
+ const char *location,
+ CertSvcCertificate *certificate);
/**
* Load certificate to @a CertSvcCertificate from memory.
* @see #CertSvcCertificateForm
*/
int certsvc_certificate_new_from_memory(CertSvcInstance instance,
- const unsigned char *memory,
- size_t len,
- CertSvcCertificateForm form,
- CertSvcCertificate *certificate);
+ const unsigned char *memory,
+ size_t len,
+ CertSvcCertificateForm form,
+ CertSvcCertificate *certificate);
/**
* Free structures connected with certificate.
* @see #CertSvcCertificateList
*/
int certsvc_certificate_search(CertSvcInstance instance,
- CertSvcCertificateField field,
- const char *value,
- CertSvcCertificateList *handler);
+ CertSvcCertificateField field,
+ const char *value,
+ CertSvcCertificateList *handler);
/**
* Get certificate from list founded by certsvc_certificate_search().
* @see #CertSvcCertificateList
*/
int certsvc_certificate_list_get_one(CertSvcCertificateList handler,
- size_t position,
- CertSvcCertificate *certificate);
+ size_t position,
+ CertSvcCertificate *certificate);
/**
* Return number of elements on the list.
* @see #CertSvcCertificateList
*/
int certsvc_certificate_list_get_length(CertSvcCertificateList handler,
- size_t *size);
+ size_t *size);
/**
* Free @a CertSvcCertificateList. It will not free certificates on the list.
* @see #CertSvcCertificate
*/
int certsvc_certificate_is_signed_by(CertSvcCertificate child,
- CertSvcCertificate parent,
- int *status);
+ CertSvcCertificate parent,
+ int *status);
/**
* Extract data field from certificate. Data in buffer could be free by
* @see #CertSvcCertificateField
*/
int certsvc_certificate_get_string_field(CertSvcCertificate certificate,
- CertSvcCertificateField field,
- CertSvcString *buffer);
+ CertSvcCertificateField field,
+ CertSvcString *buffer);
/**
* Extract NOT AFTER field from certificate.
*
*/
int certsvc_message_verify(
- CertSvcCertificate certificate,
- CertSvcString message,
- CertSvcString signature,
- const char *algorithm,
- int *status);
+ CertSvcCertificate certificate,
+ CertSvcString message,
+ CertSvcString signature,
+ const char *algorithm,
+ int *status);
/**
* Verify certificate. Root CA certificate should be stored in @a trusted.
* @return #CERTSVC_SUCCESS on success, otherwise a zero or negative error value
*/
int certsvc_certificate_verify(
- CertSvcCertificate certificate,
- const CertSvcCertificate *trusted,
- size_t trustedSize,
- const CertSvcCertificate *untrusted,
- size_t untrustedSize,
- int *status);
+ CertSvcCertificate certificate,
+ const CertSvcCertificate *trusted,
+ size_t trustedSize,
+ const CertSvcCertificate *untrusted,
+ size_t untrustedSize,
+ int *status);
/**
* Verify certificate with strict check of CA flag. Root CA certificate should
* @return #CERTSVC_SUCCESS on success, otherwise a zero or negative error value
*/
int certsvc_certificate_verify_with_caflag(
- CertSvcCertificate certificate,
- const CertSvcCertificate *trusted,
- size_t trustedSize,
- const CertSvcCertificate *untrusted,
- size_t untrustedSize,
- int *status);
+ CertSvcCertificate certificate,
+ const CertSvcCertificate *trusted,
+ size_t trustedSize,
+ const CertSvcCertificate *untrusted,
+ size_t untrustedSize,
+ int *status);
/**
* Get visibility from Tizen app signing root certificate.
*
* @see #CertSvcVisibility
*/
-int certsvc_certificate_get_visibility(CertSvcCertificate certificate, CertSvcVisibility *visibility);
+int certsvc_certificate_get_visibility(CertSvcCertificate certificate,
+ CertSvcVisibility *visibility);
#ifdef __cplusplus
#endif
typedef struct CertSvcInstance_t {
- void *privatePtr;
+ void *privatePtr;
} CertSvcInstance;
/**
* @see certsvc_string_free()
*/
int certsvc_pkcs12_has_password(CertSvcInstance instance,
- CertSvcString filepath,
- int *has_password);
+ CertSvcString filepath,
+ int *has_password);
/**
* Couter-routine for certsvc_pkcs12_private_key_dup.
* @see #CertStoreType
*/
int certsvc_pkcs12_private_key_dup_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char **buffer,
- size_t *size);
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **buffer,
+ size_t *size);
/**
* Set the status for the specified certificate in cert-svc store.
* @see #CertStatus
*/
int certsvc_pkcs12_set_certificate_status_to_store(CertSvcInstance instance,
- CertStoreType storeType,
- int is_root_app,
- CertSvcString gname,
- CertStatus status);
+ CertStoreType storeType,
+ int is_root_app,
+ CertSvcString gname,
+ CertStatus status);
/**
* Get the status for the specified certificate in cert-svc store.
* @see #CertStroeType
*/
int certsvc_pkcs12_get_certificate_status_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- CertStatus *status);
+ CertStoreType storeType,
+ CertSvcString gname,
+ CertStatus *status);
/**
* Get the certificates in cert-svc store.
* @see #CertSvcStoreCertList
*/
int certsvc_pkcs12_get_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- int is_root_app,
- CertSvcStoreCertList** certList,
- size_t *length);
+ CertStoreType storeType,
+ int is_root_app,
+ CertSvcStoreCertList **certList,
+ size_t *length);
/**
* Get the end user certificates in cert-svc store.
* @see #CertSvcStoreCertList
*/
int certsvc_pkcs12_get_end_user_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcStoreCertList** certList,
- size_t* length);
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length);
/**
* Get the root/trusted certificates in cert-svc store.
* @see #CertSvcStoreCertList
*/
int certsvc_pkcs12_get_root_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcStoreCertList** certList,
- size_t* length);
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length);
/**
* Free all @a CertSvcStoreCertList in linked list of data structure.
* @see #CertSvcStoreCertList
*/
int certsvc_pkcs12_free_certificate_list_loaded_from_store(CertSvcInstance instance,
- CertSvcStoreCertList** certList);
+ CertSvcStoreCertList **certList);
/**
* Get the certificate with the gname provided from cert-svc store.
* @see #CertStoreType
*/
int certsvc_pkcs12_get_certificate_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- const char *gname,
- CertSvcCertificate *certificate);
+ CertStoreType storeType,
+ const char *gname,
+ CertSvcCertificate *certificate);
/**
* Get the encoded certificate buffer with the gname provided from cert-svc store.
* @see #CertStoreType
*/
int certsvc_pkcs12_get_certificate_info_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char** buffer,
- size_t* size);
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **buffer,
+ size_t *size);
/**
* Import PKCS#12 bundle(with .pfx or .p12) or certificate(base64 form with .crt
* @see #CertStoreType
*/
int certsvc_pkcs12_import_from_file_to_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString path,
- CertSvcString password,
- CertSvcString alias);
+ CertStoreType storeType,
+ CertSvcString path,
+ CertSvcString password,
+ CertSvcString alias);
/**
* Delete the certificate with gname provided from cert-svc store.
* @see #CertStoreType
*/
int certsvc_pkcs12_delete_certificate_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname);
+ CertStoreType storeType,
+ CertSvcString gname);
/**
* Check the uniqueness of the alias in cert-svc store.
* @see #CertStoreType
*/
int certsvc_pkcs12_check_alias_exists_in_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString alias,
- int *is_unique);
+ CertStoreType storeType,
+ CertSvcString alias,
+ int *is_unique);
/**
* Get list of certificates from PKCS#12 bundle or single certificate which
* @see #CertSvcStoreCertList
*/
int certsvc_pkcs12_load_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString alias,
- CertSvcCertificateList *certificateList);
+ CertStoreType storeType,
+ CertSvcString alias,
+ CertSvcCertificateList *certificateList);
/**
* Get the alias name with the gname provided.
* @see #CertStoreType
*/
int certsvc_pkcs12_get_alias_name_for_certificate_in_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char **alias);
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **alias);
#ifdef __cplusplus
}
*
* @see certsvc_certificate_free_x509()
*/
-int certsvc_certificate_dup_x509(CertSvcCertificate certificate, X509** x509);
+int certsvc_certificate_dup_x509(CertSvcCertificate certificate, X509 **x509);
/**
* Free openssl x509 structure duplicated by certsvc_certificate_dup_x509().
*
* @return #CERTSVC_SUCCESS on success, otherwise a zero or negative error value
*/
-int certsvc_certificate_dup_pubkey_der(CertSvcCertificate certificate, unsigned char **pubkey, size_t *len);
+int certsvc_certificate_dup_pubkey_der(CertSvcCertificate certificate, unsigned char **pubkey,
+ size_t *len);
/**
* Get private key from cert-svc store in openssl EVP_PKEY structure.
* @see certsvc_pkcs12_free_evp_pkey()
*/
int certsvc_pkcs12_dup_evp_pkey_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- EVP_PKEY** pkey);
+ CertStoreType storeType,
+ CertSvcString gname,
+ EVP_PKEY **pkey);
/**
* Free openssl EVP_PKEY structure duplicated by certsvc_pkcs12_dup_ev_pkey()
* @see certsvc_pkcs12_dup_evp_pkey()
* @see certsvc_pkcs12_dup_evp_pkey_from_store()
*/
-void certsvc_pkcs12_free_evp_pkey(EVP_PKEY* pkey);
+void certsvc_pkcs12_free_evp_pkey(EVP_PKEY *pkey);
#ifdef __cplusplus
}
typedef struct CertSvcStringList_t {
- size_t privateHandler;
- CertSvcInstance privateInstance;
+ size_t privateHandler;
+ CertSvcInstance privateInstance;
} CertSvcStringList;
typedef struct CertSvcString_t {
- /*
- * You are not allowed to use private fields of this structure. It is internal
- * implementation of strings and it may change at any time without notice!
- * To extract data use certsvc_string_to_cstring function!
- */
- char *privateHandler;
- size_t privateLength;
- CertSvcInstance privateInstance;
+ /*
+ * You are not allowed to use private fields of this structure. It is internal
+ * implementation of strings and it may change at any time without notice!
+ * To extract data use certsvc_string_to_cstring function!
+ */
+ char *privateHandler;
+ size_t privateLength;
+ CertSvcInstance privateInstance;
} CertSvcString;
/**
* @see certsvc_string_free()
*/
int certsvc_string_new(
- CertSvcInstance instance,
- const char *input,
- size_t size,
- CertSvcString *output);
+ CertSvcInstance instance,
+ const char *input,
+ size_t size,
+ CertSvcString *output);
/**
* Create CertSvcString with @a input null-terminated string. @a output CertSvcString will
* @see certsvc_string_free()
*/
int certsvc_string_not_managed(
- CertSvcInstance instance,
- const char *input,
- size_t size,
- CertSvcString *output);
+ CertSvcInstance instance,
+ const char *input,
+ size_t size,
+ CertSvcString *output);
/**
* Get CertSvcString from CertSvcStringList with newly allocated memory.
* @see certsvc_string_free()
*/
int certsvc_string_list_get_one(CertSvcStringList hander,
- size_t position,
- CertSvcString *buffer);
+ size_t position,
+ CertSvcString *buffer);
/**
* Get list size of CertSvcStringList.
// Do not call directly
// Always use Assert macro
void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function) __attribute__ ((__noreturn__));
+ const char *file,
+ int line,
+ const char *function) __attribute__((__noreturn__));
} // namespace VcoreDPL
#define Assert(Condition) \
-do { \
- if (!(Condition)) { \
- VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \
- } \
-} while (0)
+ do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc(#Condition, __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ } while (0)
#define AssertMsg(Condition, Msg) \
- do { \
- if (!(Condition)) { \
- VcoreDPL::AssertProc( \
- (std::string(std::string(#Condition)+" ") + Msg).c_str(), \
- __FILE__, __LINE__, __FUNCTION__); \
- } \
- } while (0)
+ do { \
+ if (!(Condition)) { \
+ VcoreDPL::AssertProc( \
+ (std::string(std::string(#Condition)+" ") + Msg).c_str(), \
+ __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ } while (0)
#endif // DPL_ASSERT_H
namespace VcoreDPL {
namespace Colors {
namespace Text {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
} //namespace Text
namespace Html {
-extern const char* BOLD_GREEN_BEGIN;
-extern const char* BOLD_GREEN_END;
-extern const char* PURPLE_BEGIN;
-extern const char* PURPLE_END;
-extern const char* RED_BEGIN;
-extern const char* RED_END;
-extern const char* GREEN_BEGIN;
-extern const char* GREEN_END;
-extern const char* CYAN_BEGIN;
-extern const char* CYAN_END;
-extern const char* BOLD_RED_BEGIN;
-extern const char* BOLD_RED_END;
-extern const char* BOLD_YELLOW_BEGIN;
-extern const char* BOLD_YELLOW_END;
-extern const char* BOLD_GOLD_BEGIN;
-extern const char* BOLD_GOLD_END;
-extern const char* BOLD_WHITE_BEGIN;
-extern const char* BOLD_WHITE_END;
+extern const char *BOLD_GREEN_BEGIN;
+extern const char *BOLD_GREEN_END;
+extern const char *PURPLE_BEGIN;
+extern const char *PURPLE_END;
+extern const char *RED_BEGIN;
+extern const char *RED_END;
+extern const char *GREEN_BEGIN;
+extern const char *GREEN_END;
+extern const char *CYAN_BEGIN;
+extern const char *CYAN_END;
+extern const char *BOLD_RED_BEGIN;
+extern const char *BOLD_RED_END;
+extern const char *BOLD_YELLOW_BEGIN;
+extern const char *BOLD_YELLOW_END;
+extern const char *BOLD_GOLD_BEGIN;
+extern const char *BOLD_GOLD_END;
+extern const char *BOLD_WHITE_BEGIN;
+extern const char *BOLD_WHITE_END;
} //namespace Html
} //namespace Colors
} //namespace VcoreDPL
namespace VcoreDPL {
void LogUnhandledException(const std::string &str);
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function);
+ const char *filename,
+ int line,
+ const char *function);
}
namespace VcoreDPL {
class Exception {
private:
- static unsigned int m_exceptionCount;
- static Exception* m_lastException;
- static void (*m_terminateHandler)();
-
- static void AddRef(Exception* exception)
- {
- if (!m_exceptionCount) {
- m_terminateHandler = std::set_terminate(&TerminateHandler);
- }
-
- ++m_exceptionCount;
- m_lastException = exception;
- }
-
- static void UnRef(Exception* e)
- {
- if (m_lastException == e) {
- m_lastException = NULL;
- }
-
- --m_exceptionCount;
-
- if (!m_exceptionCount) {
- std::set_terminate(m_terminateHandler);
- m_terminateHandler = NULL;
- }
- }
-
- static void TerminateHandler()
- {
- if (m_lastException != NULL) {
- DisplayKnownException(*m_lastException);
- abort();
- } else {
- DisplayUnknownException();
- abort();
- }
- }
-
- Exception *m_reason;
- std::string m_path;
- std::string m_function;
- int m_line;
+ static unsigned int m_exceptionCount;
+ static Exception *m_lastException;
+ static void (*m_terminateHandler)();
+
+ static void AddRef(Exception *exception)
+ {
+ if (!m_exceptionCount) {
+ m_terminateHandler = std::set_terminate(&TerminateHandler);
+ }
+
+ ++m_exceptionCount;
+ m_lastException = exception;
+ }
+
+ static void UnRef(Exception *e)
+ {
+ if (m_lastException == e) {
+ m_lastException = NULL;
+ }
+
+ --m_exceptionCount;
+
+ if (!m_exceptionCount) {
+ std::set_terminate(m_terminateHandler);
+ m_terminateHandler = NULL;
+ }
+ }
+
+ static void TerminateHandler()
+ {
+ if (m_lastException != NULL) {
+ DisplayKnownException(*m_lastException);
+ abort();
+ } else {
+ DisplayUnknownException();
+ abort();
+ }
+ }
+
+ Exception *m_reason;
+ std::string m_path;
+ std::string m_function;
+ int m_line;
protected:
- std::string m_message;
- std::string m_className;
+ std::string m_message;
+ std::string m_className;
public:
- static std::string KnownExceptionToString(const Exception &e)
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
- message << "\033[1;33mException trace:\033[m\n\n";
- message << e.DumpToString();
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static std::string UnknownExceptionToString()
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static void DisplayKnownException(const Exception& e)
- {
- LogUnhandledException(KnownExceptionToString(e).c_str());
- }
-
- static void DisplayUnknownException()
- {
- LogUnhandledException(UnknownExceptionToString().c_str());
- }
-
- Exception(const Exception &other)
- {
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
- }
-
- const Exception &operator =(const Exception &other)
- {
- if (this == &other) {
- return *this;
- }
-
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
-
- return *this;
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const std::string &message) :
- m_reason(NULL),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const Exception &reason,
- const std::string &message) :
- m_reason(new Exception(reason)),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- virtual ~Exception() throw()
- {
- if (m_reason != NULL) {
- delete m_reason;
- m_reason = NULL;
- }
-
- UnRef(this);
- }
-
- void Dump() const
- {
- // Show reason first
- if (m_reason != NULL) {
- m_reason->Dump();
- }
-
- // Afterward, dump exception
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file, m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
- }
-
- std::string DumpToString() const
- {
- std::string ret;
- if (m_reason != NULL) {
- ret = m_reason->DumpToString();
- }
-
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- char buf[1024];
- snprintf(buf,
- sizeof(buf),
- "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file,
- m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
-
- buf[sizeof(buf) - 1] = '\n';
- ret += buf;
-
- return ret;
- }
-
- Exception *GetReason() const
- {
- return m_reason;
- }
-
- std::string GetPath() const
- {
- return m_path;
- }
-
- std::string GetFunction() const
- {
- return m_function;
- }
-
- int GetLine() const
- {
- return m_line;
- }
-
- std::string GetMessage() const
- {
- return m_message;
- }
-
- std::string GetClassName() const
- {
- return m_className;
- }
+ static std::string KnownExceptionToString(const Exception &e)
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;33mException trace:\033[m\n\n";
+ message << e.DumpToString();
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static std::string UnknownExceptionToString()
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static void DisplayKnownException(const Exception &e)
+ {
+ LogUnhandledException(KnownExceptionToString(e).c_str());
+ }
+
+ static void DisplayUnknownException()
+ {
+ LogUnhandledException(UnknownExceptionToString().c_str());
+ }
+
+ Exception(const Exception &other)
+ {
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ }
+
+ const Exception &operator =(const Exception &other)
+ {
+ if (this == &other) {
+ return *this;
+ }
+
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ return *this;
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const std::string &message) :
+ m_reason(NULL),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const Exception &reason,
+ const std::string &message) :
+ m_reason(new Exception(reason)),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ virtual ~Exception() throw()
+ {
+ if (m_reason != NULL) {
+ delete m_reason;
+ m_reason = NULL;
+ }
+
+ UnRef(this);
+ }
+
+ void Dump() const
+ {
+ // Show reason first
+ if (m_reason != NULL) {
+ m_reason->Dump();
+ }
+
+ // Afterward, dump exception
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file, m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ }
+
+ std::string DumpToString() const
+ {
+ std::string ret;
+
+ if (m_reason != NULL) {
+ ret = m_reason->DumpToString();
+ }
+
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ char buf[1024];
+ snprintf(buf,
+ sizeof(buf),
+ "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file,
+ m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ buf[sizeof(buf) - 1] = '\n';
+ ret += buf;
+ return ret;
+ }
+
+ Exception *GetReason() const
+ {
+ return m_reason;
+ }
+
+ std::string GetPath() const
+ {
+ return m_path;
+ }
+
+ std::string GetFunction() const
+ {
+ return m_function;
+ }
+
+ int GetLine() const
+ {
+ return m_line;
+ }
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+
+ std::string GetClassName() const
+ {
+ return m_className;
+ }
};
} // namespace VcoreDPL
#define Try try
#define Throw(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__)
#define ThrowMsg(ClassName, Message) \
- do \
- { \
- std::ostringstream dplLoggingStream; \
- dplLoggingStream << Message; \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
- } while (0)
+ do \
+ { \
+ std::ostringstream dplLoggingStream; \
+ dplLoggingStream << Message; \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
+ } while (0)
#define ReThrow(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
#define ReThrowMsg(ClassName, Message) \
- throw ClassName(__FILE__, \
- __FUNCTION__, \
- __LINE__, \
- _rethrown_exception, \
- Message)
+ throw ClassName(__FILE__, \
+ __FUNCTION__, \
+ __LINE__, \
+ _rethrown_exception, \
+ Message)
#define Catch(ClassName) \
- catch (const ClassName &_rethrown_exception)
+ catch (const ClassName &_rethrown_exception)
#define DECLARE_EXCEPTION_TYPE(BaseClass, Class) \
- class Class : public BaseClass { \
- public: \
- Class(const char *path, \
- const char *function, \
- int line, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, message) { \
- \
- BaseClass::m_className = #Class; \
- } \
- \
- Class(const char *path, \
- const char *function, \
- int line, \
- const VcoreDPL::Exception & reason, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, reason, message) { \
- BaseClass::m_className = #Class; \
- } \
- };
+ class Class : public BaseClass { \
+ public: \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, message) { \
+ \
+ BaseClass::m_className = #Class; \
+ } \
+ \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const VcoreDPL::Exception & reason, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, reason, message) { \
+ BaseClass::m_className = #Class; \
+ } \
+ };
#define UNHANDLED_EXCEPTION_HANDLER_BEGIN try
#define UNHANDLED_EXCEPTION_HANDLER_END \
- catch (const VcoreDPL::Exception &exception) \
- { \
- std::ostringstream msg; \
- msg << VcoreDPL::Exception::KnownExceptionToString(exception); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (std::exception& e) \
- { \
- std::ostringstream msg; \
- msg << e.what(); \
- msg << "\n"; \
- msg << VcoreDPL::Exception::UnknownExceptionToString(); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (...) \
- { \
- std::ostringstream msg; \
- msg << VcoreDPL::Exception::UnknownExceptionToString(); \
- VcoreDPL::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- }
+ catch (const VcoreDPL::Exception &exception) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::KnownExceptionToString(exception); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (std::exception& e) \
+ { \
+ std::ostringstream msg; \
+ msg << e.what(); \
+ msg << "\n"; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (...) \
+ { \
+ std::ostringstream msg; \
+ msg << VcoreDPL::Exception::UnknownExceptionToString(); \
+ VcoreDPL::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ }
namespace VcoreDPL {
namespace CommonException {
* important messages.
*/
DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from
- // underlying libraries or
- // kernel
+// underlying libraries or
+// kernel
}
}
#define DPL_NONCOPYABLE_H
namespace VcoreDPL {
-class Noncopyable
-{
- private:
- Noncopyable(const Noncopyable &);
- const Noncopyable &operator=(const Noncopyable &);
+class Noncopyable {
+private:
+ Noncopyable(const Noncopyable &);
+ const Noncopyable &operator=(const Noncopyable &);
- public:
- Noncopyable();
- virtual ~Noncopyable();
+public:
+ Noncopyable();
+ virtual ~Noncopyable();
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename Class>
class Singleton :
- private Class
-{
- //
- // Note:
- //
- // To remove posibility of instantiating directly Class,
- // make Class' default constructor protected
- //
+ private Class {
+ //
+ // Note:
+ //
+ // To remove posibility of instantiating directly Class,
+ // make Class' default constructor protected
+ //
- private:
- Singleton()
- {}
+private:
+ Singleton()
+ {}
- static Singleton &InternalInstance();
+ static Singleton &InternalInstance();
- public:
- virtual ~Singleton()
- {}
+public:
+ virtual ~Singleton()
+ {}
- static Class &Instance();
+ static Class &Instance();
};
} // namespace VcoreDPL
namespace VcoreDPL {
template<typename Class>
-Singleton<Class>& Singleton<Class>::InternalInstance()
+Singleton<Class> &Singleton<Class>::InternalInstance()
{
- static Singleton<Class> instance;
- return instance;
+ static Singleton<Class> instance;
+ return instance;
}
template<typename Class>
Class &Singleton<Class>::Instance()
{
- Singleton<Class>& instance = Singleton<Class>::InternalInstance();
- return instance;
+ Singleton<Class> &instance = Singleton<Class>::InternalInstance();
+ return instance;
}
} // namespace VcoreDPL
#define IMPLEMENT_SINGLETON(Type) \
- template VcoreDPL::Singleton<Type>&VcoreDPL::Singleton<Type>::InternalInstance(); \
- template Type & VcoreDPL::Singleton<Type>::Instance(); \
+ template VcoreDPL::Singleton<Type>&VcoreDPL::Singleton<Type>::InternalInstance(); \
+ template Type & VcoreDPL::Singleton<Type>::Instance(); \
#endif // DPL_SINGLETON_IMPL_H
namespace VcoreDPL {
void AssertProc(const char *condition,
- const char *file,
- int line,
- const char *function)
+ const char *file,
+ int line,
+ const char *function)
{
-
#define INTERNAL_LOG(message) \
-do { \
- std::ostringstream platformLog; \
- platformLog << message; \
- LogDebug("" << platformLog.str()); \
-} while (0)
-
- // Try to log failed assertion to log system
- Try {
- INTERNAL_LOG("########################################################################");
- INTERNAL_LOG("### DPL assertion failed! ###");
- INTERNAL_LOG("########################################################################");
- INTERNAL_LOG("### Condition: " << condition);
- INTERNAL_LOG("### File: " << file);
- INTERNAL_LOG("### Line: " << line);
- INTERNAL_LOG("### Function: " << function);
- INTERNAL_LOG("########################################################################");
- } catch (Exception) {
- // Just ignore possible double errors
- }
+ do { \
+ std::ostringstream platformLog; \
+ platformLog << message; \
+ LogDebug("" << platformLog.str()); \
+ } while (0)
+ // Try to log failed assertion to log system
+ Try {
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### DPL assertion failed! ###");
+ INTERNAL_LOG("########################################################################");
+ INTERNAL_LOG("### Condition: " << condition);
+ INTERNAL_LOG("### File: " << file);
+ INTERNAL_LOG("### Line: " << line);
+ INTERNAL_LOG("### Function: " << function);
+ INTERNAL_LOG("########################################################################");
+ } catch (Exception) {
+ // Just ignore possible double errors
+ }
- // Fail with c-library abort
- abort();
+ // Fail with c-library abort
+ abort();
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Colors {
namespace Text {
-const char* BOLD_GREEN_BEGIN = "\033[1;32m";
-const char* BOLD_GREEN_END = "\033[m";
-const char* RED_BEGIN = "\033[0;31m";
-const char* RED_END = "\033[m";
-const char* PURPLE_BEGIN = "\033[0;35m";
-const char* PURPLE_END = "\033[m";
-const char* GREEN_BEGIN = "\033[0;32m";
-const char* GREEN_END = "\033[m";
-const char* CYAN_BEGIN = "\033[0;36m";
-const char* CYAN_END = "\033[m";
-const char* BOLD_RED_BEGIN = "\033[1;31m";
-const char* BOLD_RED_END = "\033[m";
-const char* BOLD_YELLOW_BEGIN = "\033[1;33m";
-const char* BOLD_YELLOW_END = "\033[m";
-const char* BOLD_GOLD_BEGIN = "\033[0;33m";
-const char* BOLD_GOLD_END = "\033[m";
-const char* BOLD_WHITE_BEGIN = "\033[1;37m";
-const char* BOLD_WHITE_END = "\033[m";
+const char *BOLD_GREEN_BEGIN = "\033[1;32m";
+const char *BOLD_GREEN_END = "\033[m";
+const char *RED_BEGIN = "\033[0;31m";
+const char *RED_END = "\033[m";
+const char *PURPLE_BEGIN = "\033[0;35m";
+const char *PURPLE_END = "\033[m";
+const char *GREEN_BEGIN = "\033[0;32m";
+const char *GREEN_END = "\033[m";
+const char *CYAN_BEGIN = "\033[0;36m";
+const char *CYAN_END = "\033[m";
+const char *BOLD_RED_BEGIN = "\033[1;31m";
+const char *BOLD_RED_END = "\033[m";
+const char *BOLD_YELLOW_BEGIN = "\033[1;33m";
+const char *BOLD_YELLOW_END = "\033[m";
+const char *BOLD_GOLD_BEGIN = "\033[0;33m";
+const char *BOLD_GOLD_END = "\033[m";
+const char *BOLD_WHITE_BEGIN = "\033[1;37m";
+const char *BOLD_WHITE_END = "\033[m";
} //namespace Text
namespace Html {
-const char* BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
-const char* BOLD_GREEN_END = "</b></font>";
-const char* PURPLE_BEGIN = "<font color=\"purple\"><b>";
-const char* PURPLE_END = "</b></font>";
-const char* RED_BEGIN = "<font color=\"red\"><b>";
-const char* RED_END = "</b></font>";
-const char* GREEN_BEGIN = "<font color=\"green\">";
-const char* GREEN_END = "</font>";
-const char* CYAN_BEGIN = "<font color=\"cyan\">";
-const char* CYAN_END = "</font>";
-const char* BOLD_RED_BEGIN = "<font color=\"red\"><b>";
-const char* BOLD_RED_END = "</b></font>";
-const char* BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
-const char* BOLD_YELLOW_END = "</b></font>";
-const char* BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
-const char* BOLD_GOLD_END = "</b></font>";
-const char* BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
-const char* BOLD_WHITE_END = "</b></font>";
+const char *BOLD_GREEN_BEGIN = "<font color=\"green\"><b>";
+const char *BOLD_GREEN_END = "</b></font>";
+const char *PURPLE_BEGIN = "<font color=\"purple\"><b>";
+const char *PURPLE_END = "</b></font>";
+const char *RED_BEGIN = "<font color=\"red\"><b>";
+const char *RED_END = "</b></font>";
+const char *GREEN_BEGIN = "<font color=\"green\">";
+const char *GREEN_END = "</font>";
+const char *CYAN_BEGIN = "<font color=\"cyan\">";
+const char *CYAN_END = "</font>";
+const char *BOLD_RED_BEGIN = "<font color=\"red\"><b>";
+const char *BOLD_RED_END = "</b></font>";
+const char *BOLD_YELLOW_BEGIN = "<font color=\"yellow\"><b>";
+const char *BOLD_YELLOW_END = "</b></font>";
+const char *BOLD_GOLD_BEGIN = "<font color=\"gold\"><b>";
+const char *BOLD_GOLD_END = "</b></font>";
+const char *BOLD_WHITE_BEGIN = "<font color=\"white\"><b>";
+const char *BOLD_WHITE_END = "</b></font>";
} //namespace Html
} //namespace Colors
} //namespace VcoreDPL
#include <cstdio>
namespace VcoreDPL {
-Exception* Exception::m_lastException = NULL;
+Exception *Exception::m_lastException = NULL;
unsigned int Exception::m_exceptionCount = 0;
void (*Exception::m_terminateHandler)() = NULL;
void LogUnhandledException(const std::string &str)
{
- LogDebug("" << str);
+ LogDebug("" << str);
}
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function)
+ const char *filename,
+ int line,
+ const char *function)
{
- LogError("Exception occured on file[" << filename
- << "] line[" << line
- << "] function[" << function
- << "] msg[" << str << "]");
+ LogError("Exception occured on file[" << filename
+ << "] line[" << line
+ << "] function[" << function
+ << "] msg[" << str << "]");
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Log {
-class AbstractLogProvider
-{
+class AbstractLogProvider {
public:
- enum class LogLevel {
- None,
- Error,
- Warning,
- Info,
- Debug,
- Pedantic
- };
+ enum class LogLevel {
+ None,
+ Error,
+ Warning,
+ Info,
+ Debug,
+ Pedantic
+ };
- virtual ~AbstractLogProvider() {}
+ virtual ~AbstractLogProvider() {}
- virtual void SetTag(const char *tag);
+ virtual void SetTag(const char *tag);
- virtual void Log(LogLevel level,
- const char *message,
- const char *fileName,
- int line,
- const char *function) const = 0;
+ virtual void Log(LogLevel level,
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function) const = 0;
protected:
- static const char *LocateSourceFileName(const char *filename);
+ static const char *LocateSourceFileName(const char *filename);
};
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Log {
-class DLOGLogProvider : public AbstractLogProvider
-{
+class DLOGLogProvider : public AbstractLogProvider {
public:
- DLOGLogProvider();
- virtual ~DLOGLogProvider();
+ DLOGLogProvider();
+ virtual ~DLOGLogProvider();
- virtual void Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *fileName,
- int line,
- const char *function) const;
+ virtual void Log(AbstractLogProvider::LogLevel level,
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function) const;
- // Set global Tag according to DLOG
- virtual void SetTag(const char *tag);
+ // Set global Tag according to DLOG
+ virtual void SetTag(const char *tag);
private:
- std::unique_ptr<char[]> m_tag;
-
+ std::unique_ptr<char[]> m_tag;
};
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Log {
-class JournalLogProvider: public AbstractLogProvider
-{
+class JournalLogProvider: public AbstractLogProvider {
public:
- JournalLogProvider();
- virtual ~JournalLogProvider();
+ JournalLogProvider();
+ virtual ~JournalLogProvider();
- virtual void Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *fileName,
- int line,
- const char *function) const;
+ virtual void Log(AbstractLogProvider::LogLevel level,
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function) const;
};
} /* namespace Log */
* To switch logs into old style, export
* DPL_USE_OLD_STYLE_LOGS before application start
*/
-class LogSystem : private Noncopyable
-{
+class LogSystem : private Noncopyable {
public:
- LogSystem();
- virtual ~LogSystem();
-
- AbstractLogProvider::LogLevel GetLogLevel() const { return m_level; }
-
- void Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *filename,
- int line,
- const char *function) const;
-
-
- /**
- * Set default's DLOG provider Tag
- */
- void SetTag(const char *tag);
-
- /**
- * Add abstract provider to providers list
- *
- * @notice Ownership is transfered to LogSystem and deleted upon exit
- */
- void AddProvider(AbstractLogProvider *provider);
-
- /**
- * Remove abstract provider from providers list
- */
- void RemoveProvider(AbstractLogProvider *provider);
-
- /**
- * Selects given provider by name (overwrites environment setting)
- *
- * Throws std::out_of_range exception if not found.
- */
- void SelectProvider(const std::string& name);
-
- /**
- * Sets log level (overwrites environment settings)
- */
- void SetLogLevel(const char* level);
+ LogSystem();
+ virtual ~LogSystem();
+
+ AbstractLogProvider::LogLevel GetLogLevel() const
+ {
+ return m_level;
+ }
+
+ void Log(AbstractLogProvider::LogLevel level,
+ const char *message,
+ const char *filename,
+ int line,
+ const char *function) const;
+
+
+ /**
+ * Set default's DLOG provider Tag
+ */
+ void SetTag(const char *tag);
+
+ /**
+ * Add abstract provider to providers list
+ *
+ * @notice Ownership is transfered to LogSystem and deleted upon exit
+ */
+ void AddProvider(AbstractLogProvider *provider);
+
+ /**
+ * Remove abstract provider from providers list
+ */
+ void RemoveProvider(AbstractLogProvider *provider);
+
+ /**
+ * Selects given provider by name (overwrites environment setting)
+ *
+ * Throws std::out_of_range exception if not found.
+ */
+ void SelectProvider(const std::string &name);
+
+ /**
+ * Sets log level (overwrites environment settings)
+ */
+ void SetLogLevel(const char *level);
private:
- void RemoveProviders();
-
- typedef std::list<AbstractLogProvider *> AbstractLogProviderPtrList;
- AbstractLogProviderPtrList m_providers;
- AbstractLogProvider::LogLevel m_level;
-
- typedef AbstractLogProvider *(*ProviderFn)();
- /*
- * It cannot be global as it is used in library constructor and we can't be sure which
- * constructor is called first: library's or new_provider's.
- */
- std::unordered_map<std::string, ProviderFn> m_providerCtor;
+ void RemoveProviders();
+
+ typedef std::list<AbstractLogProvider *> AbstractLogProviderPtrList;
+ AbstractLogProviderPtrList m_providers;
+ AbstractLogProvider::LogLevel m_level;
+
+ typedef AbstractLogProvider *(*ProviderFn)();
+ /*
+ * It cannot be global as it is used in library constructor and we can't be sure which
+ * constructor is called first: library's or new_provider's.
+ */
+ std::unordered_map<std::string, ProviderFn> m_providerCtor;
};
/*
* Replacement low overhead null logging class
*/
-class NullStream
-{
- public:
- NullStream() {}
-
- template <typename T>
- NullStream& operator<<(const T&)
- {
- return *this;
- }
+class NullStream {
+public:
+ NullStream() {}
+
+ template <typename T>
+ NullStream &operator<<(const T &)
+ {
+ return *this;
+ }
};
/**
/* avoid warnings about unused variables */
#define DPL_MACRO_DUMMY_LOGGING(message, level) \
- do { \
- VcoreDPL::Log::NullStream ns; \
- ns << message; \
- } while (0)
+ do { \
+ VcoreDPL::Log::NullStream ns; \
+ ns << message; \
+ } while (0)
#define DPL_MACRO_FOR_LOGGING(message, level) \
-do \
-{ \
- if (level > VcoreDPL::Log::AbstractLogProvider::LogLevel::None && \
- VcoreDPL::Log::LogSystemSingleton::Instance().GetLogLevel() >= level) \
- { \
- std::ostringstream platformLog; \
- platformLog << message; \
- VcoreDPL::Log::LogSystemSingleton::Instance().Log(level, \
- platformLog.str().c_str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- } \
-} while (0)
+ do \
+ { \
+ if (level > VcoreDPL::Log::AbstractLogProvider::LogLevel::None && \
+ VcoreDPL::Log::LogSystemSingleton::Instance().GetLogLevel() >= level) \
+ { \
+ std::ostringstream platformLog; \
+ platformLog << message; \
+ VcoreDPL::Log::LogSystemSingleton::Instance().Log(level, \
+ platformLog.str().c_str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ } \
+ } while (0)
#ifdef TIZEN_ENGINEER_MODE
- #define LogDebug(message) DPL_MACRO_FOR_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Debug)
- #define LogPedantic(message) DPL_MACRO_FOR_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Pedantic)
+#define LogDebug(message) DPL_MACRO_FOR_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Debug)
+#define LogPedantic(message) DPL_MACRO_FOR_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Pedantic)
#else
- #define LogDebug(message) DPL_MACRO_DUMMY_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Debug)
- #define LogPedantic(message) DPL_MACRO_DUMMY_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Pedantic)
+#define LogDebug(message) DPL_MACRO_DUMMY_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Debug)
+#define LogPedantic(message) DPL_MACRO_DUMMY_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Pedantic)
#endif // TIZEN_ENGINEER_MODE
#define LogInfo(message) DPL_MACRO_FOR_LOGGING(message, VcoreDPL::Log::AbstractLogProvider::LogLevel::Info)
namespace VcoreDPL {
namespace Log {
-class OldStyleLogProvider : public AbstractLogProvider
-{
+class OldStyleLogProvider : public AbstractLogProvider {
public:
- OldStyleLogProvider();
- virtual ~OldStyleLogProvider() {}
+ OldStyleLogProvider();
+ virtual ~OldStyleLogProvider() {}
- virtual void Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *fileName,
- int line,
- const char *function) const;
+ virtual void Log(AbstractLogProvider::LogLevel level,
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function) const;
};
}
} // namespace VcoreDPL
const char *AbstractLogProvider::LocateSourceFileName(const char *filename)
{
- const char *ptr = strrchr(filename, '/');
- return ptr != NULL ? ptr + 1 : filename;
+ const char *ptr = strrchr(filename, '/');
+ return ptr != NULL ? ptr + 1 : filename;
}
}
}
void error(const char *tag, const char *msg)
{
- SLOG(LOG_ERROR, tag, "%s", msg);
+ SLOG(LOG_ERROR, tag, "%s", msg);
}
void warning(const char *tag, const char *msg)
{
- SLOG(LOG_WARN, tag, "%s", msg);
+ SLOG(LOG_WARN, tag, "%s", msg);
}
void info(const char *tag, const char *msg)
{
- SLOG(LOG_INFO, tag, "%s", msg);
+ SLOG(LOG_INFO, tag, "%s", msg);
}
void debug(const char *tag, const char *msg)
{
- SLOG(LOG_DEBUG, tag, "%s", msg);
+ SLOG(LOG_DEBUG, tag, "%s", msg);
}
void pedantic(const char *tag, const char *msg)
{
- SLOG(LOG_VERBOSE, tag, "%s", msg);
+ SLOG(LOG_VERBOSE, tag, "%s", msg);
}
std::map<AbstractLogProvider::LogLevel, dlogMacro> dlogMacros = {
- // [](const char* tag, const char* msg) { SLOG(LOG_ERROR, tag, "%s", msg); } won't compile
- { AbstractLogProvider::LogLevel::Error, error },
- { AbstractLogProvider::LogLevel::Warning, warning },
- { AbstractLogProvider::LogLevel::Info, info },
- { AbstractLogProvider::LogLevel::Debug, debug},
- { AbstractLogProvider::LogLevel::Pedantic, pedantic}
+ // [](const char* tag, const char* msg) { SLOG(LOG_ERROR, tag, "%s", msg); } won't compile
+ { AbstractLogProvider::LogLevel::Error, error },
+ { AbstractLogProvider::LogLevel::Warning, warning },
+ { AbstractLogProvider::LogLevel::Info, info },
+ { AbstractLogProvider::LogLevel::Debug, debug},
+ { AbstractLogProvider::LogLevel::Pedantic, pedantic}
};
} // namespace anonymous
void DLOGLogProvider::SetTag(const char *tag)
{
- size_t size = strlen(tag)+1;
- char *buff = new (std::nothrow) char[size];
- if (buff)
- memcpy(buff, tag, size);
- m_tag.reset(buff);
+ size_t size = strlen(tag) + 1;
+ char *buff = new(std::nothrow) char[size];
+
+ if (buff)
+ memcpy(buff, tag, size);
+
+ m_tag.reset(buff);
}
void DLOGLogProvider::Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *filename,
- int line,
- const char *function) const
+ const char *message,
+ const char *filename,
+ int line,
+ const char *function) const
{
- std::ostringstream val;
- val << std::string("[") << LocateSourceFileName(filename) << std::string(":") << line <<
- std::string("] ") << function << std::string("(): ") << message;
-
- try {
- dlogMacros.at(level)(m_tag.get(), val.str().c_str());
- } catch (const std::out_of_range&) {
- SLOG(LOG_ERROR, m_tag.get(), "Unsupported log level: %d", level);
- }
+ std::ostringstream val;
+ val << std::string("[") << LocateSourceFileName(filename) << std::string(":") << line <<
+ std::string("] ") << function << std::string("(): ") << message;
+
+ try {
+ dlogMacros.at(level)(m_tag.get(), val.str().c_str());
+ } catch (const std::out_of_range &) {
+ SLOG(LOG_ERROR, m_tag.get(), "Unsupported log level: %d", level);
+ }
}
}
} // namespace VcoreDPL
namespace {
std::map<AbstractLogProvider::LogLevel, int> journalLevel = {
- { AbstractLogProvider::LogLevel::Error, LOG_ERR },
- { AbstractLogProvider::LogLevel::Warning, LOG_WARNING },
- { AbstractLogProvider::LogLevel::Info, LOG_INFO },
- { AbstractLogProvider::LogLevel::Debug, LOG_DEBUG },
- { AbstractLogProvider::LogLevel::Pedantic, LOG_DEBUG }
+ { AbstractLogProvider::LogLevel::Error, LOG_ERR },
+ { AbstractLogProvider::LogLevel::Warning, LOG_WARNING },
+ { AbstractLogProvider::LogLevel::Info, LOG_INFO },
+ { AbstractLogProvider::LogLevel::Debug, LOG_DEBUG },
+ { AbstractLogProvider::LogLevel::Pedantic, LOG_DEBUG }
};
} // namespace anonymous
{}
void JournalLogProvider::Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *fileName,
- int line,
- const char *function) const
+ const char *message,
+ const char *fileName,
+ int line,
+ const char *function) const
{
- try {
- sd_journal_send("PRIORITY=%d", journalLevel.at(level),
- "CODE_FILE=%s", fileName,
- "CODE_FUNC=%s", function,
- "CODE_LINE=%d", line,
- // add file, line & function info to log message
- "MESSAGE=[%s:%d] %s(): %s", fileName, line, function, message,
- NULL);
- } catch (const std::out_of_range&) {
- sd_journal_send(
- "PRIORITY=%d", LOG_ERR,
- "CODE_FILE=%s", fileName,
- "CODE_FUNC=%s", function,
- "CODE_LINE=%d", line,
- // add file, line & function info to log message
- "MESSAGE=[%s:%d] %s(): Unsupported log level %d", fileName, line, function, level,
- NULL);
- }
+ try {
+ sd_journal_send("PRIORITY=%d", journalLevel.at(level),
+ "CODE_FILE=%s", fileName,
+ "CODE_FUNC=%s", function,
+ "CODE_LINE=%d", line,
+ // add file, line & function info to log message
+ "MESSAGE=[%s:%d] %s(): %s", fileName, line, function, message,
+ NULL);
+ } catch (const std::out_of_range &) {
+ sd_journal_send(
+ "PRIORITY=%d", LOG_ERR,
+ "CODE_FILE=%s", fileName,
+ "CODE_FUNC=%s", function,
+ "CODE_LINE=%d", line,
+ // add file, line & function info to log message
+ "MESSAGE=[%s:%d] %s(): Unsupported log level %d", fileName, line, function, level,
+ NULL);
+ }
}
} /* namespace Log */
namespace VcoreDPL {
namespace Log {
-namespace // anonymous
-{
+namespace { // anonymous
const char *const CERTSVC_LOG_LEVEL = "CERTSVC_LOG_LEVEL";
const char *const CERTSVC_LOG_PROVIDER = "CERTSVC_LOG_PROVIDER";
} // namespace anonymous
LogSystem::LogSystem()
- : m_providerCtor({
+ : m_providerCtor(
+{
#ifdef TIZEN_ENGINEER_MODE
- { CONSOLE, []{ return static_cast<AbstractLogProvider *>(new OldStyleLogProvider()); }},
+ { CONSOLE, []{ return static_cast<AbstractLogProvider *>(new OldStyleLogProvider()); }},
#endif
- { DLOG, []{ return static_cast<AbstractLogProvider *>(new DLOGLogProvider()); }},
- { JOURNALD, []{ return static_cast<AbstractLogProvider *>(new JournalLogProvider()); }}
- })
+ { DLOG, []{ return static_cast<AbstractLogProvider *>(new DLOGLogProvider()); }},
+ { JOURNALD, []{ return static_cast<AbstractLogProvider *>(new JournalLogProvider()); }}
+})
{
- SetLogLevel(getenv(CERTSVC_LOG_LEVEL));
+ SetLogLevel(getenv(CERTSVC_LOG_LEVEL));
+ AbstractLogProvider *prv = NULL;
- AbstractLogProvider *prv = NULL;
- try {
- prv = m_providerCtor.at(getenv(CERTSVC_LOG_PROVIDER))();
- } catch (const std::exception &) {
- prv = m_providerCtor[DLOG]();
- }
+ try {
+ prv = m_providerCtor.at(getenv(CERTSVC_LOG_PROVIDER))();
+ } catch (const std::exception &) {
+ prv = m_providerCtor[DLOG]();
+ }
- AddProvider(prv);
+ AddProvider(prv);
}
LogSystem::~LogSystem()
{
- RemoveProviders();
+ RemoveProviders();
}
-void LogSystem::SetTag(const char* tag)
+void LogSystem::SetTag(const char *tag)
{
- for (auto &it : m_providers)
- it->SetTag(tag);
+ for (auto &it : m_providers)
+ it->SetTag(tag);
}
void LogSystem::AddProvider(AbstractLogProvider *provider)
{
- m_providers.push_back(provider);
+ m_providers.push_back(provider);
}
void LogSystem::RemoveProvider(AbstractLogProvider *provider)
{
- m_providers.remove(provider);
+ m_providers.remove(provider);
}
void LogSystem::SelectProvider(const std::string &name)
{
- ProviderFn& prv = m_providerCtor.at(name);
-
- RemoveProviders();
- AddProvider(prv());
+ ProviderFn &prv = m_providerCtor.at(name);
+ RemoveProviders();
+ AddProvider(prv());
}
void LogSystem::SetLogLevel(const char *level)
{
- if (!level) {
- m_level = AbstractLogProvider::LogLevel::Debug;
- } else {
- try {
- m_level = static_cast<AbstractLogProvider::LogLevel>(std::stoi(level));
- } catch(const std::exception&) {
- m_level = AbstractLogProvider::LogLevel::Debug;
- }
- }
-
- if (m_level < AbstractLogProvider::LogLevel::None)
- m_level = AbstractLogProvider::LogLevel::None;
- else if (m_level > AbstractLogProvider::LogLevel::Pedantic)
- m_level = AbstractLogProvider::LogLevel::Pedantic;
+ if (!level) {
+ m_level = AbstractLogProvider::LogLevel::Debug;
+ } else {
+ try {
+ m_level = static_cast<AbstractLogProvider::LogLevel>(std::stoi(level));
+ } catch (const std::exception &) {
+ m_level = AbstractLogProvider::LogLevel::Debug;
+ }
+ }
+
+ if (m_level < AbstractLogProvider::LogLevel::None)
+ m_level = AbstractLogProvider::LogLevel::None;
+ else if (m_level > AbstractLogProvider::LogLevel::Pedantic)
+ m_level = AbstractLogProvider::LogLevel::Pedantic;
#ifndef TIZEN_ENGINEER_MODE
- if (m_level > AbstractLogProvider::LogLevel::Error)
- m_level = AbstractLogProvider::LogLevel::Error;
+
+ if (m_level > AbstractLogProvider::LogLevel::Error)
+ m_level = AbstractLogProvider::LogLevel::Error;
+
#endif
}
void LogSystem::Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *filename,
- int line,
- const char *function) const
+ const char *message,
+ const char *filename,
+ int line,
+ const char *function) const
{
- for (const auto &it : m_providers)
- it->Log(level, message, filename, line, function);
+ for (const auto &it : m_providers)
+ it->Log(level, message, filename, line, function);
}
void LogSystem::RemoveProviders()
{
- for (auto &it : m_providers)
- delete it;
+ for (auto &it : m_providers)
+ delete it;
- m_providers.clear();
+ m_providers.clear();
}
}
} // namespace VcoreDPL
namespace VcoreDPL {
namespace Log {
-namespace // anonymous
-{
+namespace { // anonymous
using namespace VcoreDPL::Colors::Text;
const char *DEBUG_BEGIN = GREEN_BEGIN;
const char *DEBUG_END = GREEN_END;
std::string GetFormattedTime()
{
- timeval tv;
- tm localNowTime;
-
- gettimeofday(&tv, NULL);
- localtime_r(&tv.tv_sec, &localNowTime);
-
- char format[64];
- snprintf(format,
- sizeof(format),
- "%02i:%02i:%02i.%03i",
- localNowTime.tm_hour,
- localNowTime.tm_min,
- localNowTime.tm_sec,
- static_cast<int>(tv.tv_usec / 1000));
- return format;
+ timeval tv;
+ tm localNowTime;
+ gettimeofday(&tv, NULL);
+ localtime_r(&tv.tv_sec, &localNowTime);
+ char format[64];
+ snprintf(format,
+ sizeof(format),
+ "%02i:%02i:%02i.%03i",
+ localNowTime.tm_hour,
+ localNowTime.tm_min,
+ localNowTime.tm_sec,
+ static_cast<int>(tv.tv_usec / 1000));
+ return format;
}
struct ColorMark {
- const char *const begin;
- const char *const end;
+ const char *const begin;
+ const char *const end;
};
std::map<AbstractLogProvider::LogLevel, ColorMark> consoleLevel = {
- { AbstractLogProvider::LogLevel::Error, {ERROR_BEGIN, ERROR_END} },
- { AbstractLogProvider::LogLevel::Warning, {WARNING_BEGIN, WARNING_END} },
- { AbstractLogProvider::LogLevel::Info, {INFO_BEGIN, INFO_END} },
- { AbstractLogProvider::LogLevel::Debug, {DEBUG_BEGIN, DEBUG_END} },
- { AbstractLogProvider::LogLevel::Pedantic, {PEDANTIC_BEGIN, PEDANTIC_END} }
+ { AbstractLogProvider::LogLevel::Error, {ERROR_BEGIN, ERROR_END} },
+ { AbstractLogProvider::LogLevel::Warning, {WARNING_BEGIN, WARNING_END} },
+ { AbstractLogProvider::LogLevel::Info, {INFO_BEGIN, INFO_END} },
+ { AbstractLogProvider::LogLevel::Debug, {DEBUG_BEGIN, DEBUG_END} },
+ { AbstractLogProvider::LogLevel::Pedantic, {PEDANTIC_BEGIN, PEDANTIC_END} }
};
} // namespace anonymous
OldStyleLogProvider::OldStyleLogProvider() {}
void OldStyleLogProvider::Log(AbstractLogProvider::LogLevel level,
- const char *message,
- const char *filename,
- int line,
- const char *function) const
+ const char *message,
+ const char *filename,
+ int line,
+ const char *function) const
{
- try {
- const struct ColorMark& mark = consoleLevel.at(level);
-
- std::ostringstream val;
- val << mark.begin << std::string("[") << GetFormattedTime() << std::string("] [") <<
- static_cast<unsigned long>(pthread_self()) << "/" << static_cast<int>(getpid()) <<
- std::string("] [") << LocateSourceFileName(filename) << std::string(":") << line <<
- std::string("] ") << function << std::string("(): ") << message << mark.end;
- fprintf(stdout, "%s\n", val.str().c_str());
- } catch (const std::out_of_range&) {
- fprintf(stdout, "Unsupported log level: %d\n", level);
- }
+ try {
+ const struct ColorMark &mark = consoleLevel.at(level);
+ std::ostringstream val;
+ val << mark.begin << std::string("[") << GetFormattedTime() << std::string("] [") <<
+ static_cast<unsigned long>(pthread_self()) << "/" << static_cast<int>(getpid()) <<
+ std::string("] [") << LocateSourceFileName(filename) << std::string(":") << line <<
+ std::string("] ") << function << std::string("(): ") << message << mark.end;
+ fprintf(stdout, "%s\n", val.str().c_str());
+ } catch (const std::out_of_range &) {
+ fprintf(stdout, "Unsupported log level: %d\n", level);
+ }
}
}
/*
*
- * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
*
* Contact: Kidong Kim <kd0228.kim@samsung.com>
*
#ifndef CERT_SERVER_LOGIC_H_
#define CERT_SERVER_LOGIC_H_
-int getCertificateDetailFromStore(CertStoreType storeType, CertType certType, const char* gname, char* cert);
+int getCertificateDetailFromStore(CertStoreType storeType, CertType certType, const char *gname,
+ char *cert);
-int getCertificateDetailFromSystemStore(const char* gname, char* cert);
+int getCertificateDetailFromSystemStore(const char *gname, char *cert);
-int deleteCertificateFromStore(CertStoreType storeType, const char* gname);
+int deleteCertificateFromStore(CertStoreType storeType, const char *gname);
-int getCertificateStatusFromStore(CertStoreType storeType, const char* gname, CertStatus *status);
+int getCertificateStatusFromStore(CertStoreType storeType, const char *gname, CertStatus *status);
-int setCertificateStatusToStore(CertStoreType storeType, int is_root_app, const char* gname, CertStatus status);
+int setCertificateStatusToStore(CertStoreType storeType, int is_root_app, const char *gname,
+ CertStatus status);
-int checkAliasExistsInStore(CertStoreType storeType, const char* alias, int *punique);
+int checkAliasExistsInStore(CertStoreType storeType, const char *alias, int *punique);
-int installCertificateToStore(CertStoreType storeType, const char* gname, const char *common_name, const char *private_key_gname, const char *associated_gname, const char *pCertBuffer, CertType certType);
+int installCertificateToStore(CertStoreType storeType, const char *gname, const char *common_name,
+ const char *private_key_gname, const char *associated_gname, const char *pCertBuffer,
+ CertType certType);
-int getCertificateListFromStore(int reqType, CertStoreType storeType, int is_root_app, char **ppCertListBuffer, size_t *bufferLen, size_t *certCount);
+int getCertificateListFromStore(int reqType, CertStoreType storeType, int is_root_app,
+ char **ppCertListBuffer, size_t *bufferLen, size_t *certCount);
-int getCertificateAliasFromStore(CertStoreType storeType, const char* gname, char* alias);
+int getCertificateAliasFromStore(CertStoreType storeType, const char *gname, char *alias);
-int loadCertificatesFromStore(CertStoreType storeType, const char* gname, char **ppCertBlockBuffer, size_t *bufferLen, size_t *certBlockCount);
+int loadCertificatesFromStore(CertStoreType storeType, const char *gname, char **ppCertBlockBuffer,
+ size_t *bufferLen, size_t *certBlockCount);
int update_ca_certificate_file(char *cert);
namespace ValidationCore {
Base64Encoder::Base64Encoder() :
- m_b64(0),
- m_bmem(0),
- m_finalized(false)
+ m_b64(0),
+ m_bmem(0),
+ m_finalized(false)
{
}
void Base64Encoder::append(const std::string &data)
{
- if (m_finalized) {
- LogWarning("Already finalized.");
- VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized");
- }
-
- if (!m_b64) {
- reset();
- }
- BIO_write(m_b64, data.c_str(), data.size());
+ if (m_finalized) {
+ LogWarning("Already finalized.");
+ VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized");
+ }
+
+ if (!m_b64) {
+ reset();
+ }
+
+ BIO_write(m_b64, data.c_str(), data.size());
}
void Base64Encoder::finalize()
{
- if (m_finalized) {
- LogWarning("Already finalized.");
- VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
- }
- m_finalized = true;
-
- if (BIO_flush(m_b64) != 1)
- VcoreThrowMsg(Exception::InternalError, "Bio internal error");
+ if (m_finalized) {
+ LogWarning("Already finalized.");
+ VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
+ }
+
+ m_finalized = true;
+
+ if (BIO_flush(m_b64) != 1)
+ VcoreThrowMsg(Exception::InternalError, "Bio internal error");
}
std::string Base64Encoder::get()
{
- if (!m_finalized) {
- LogWarning("Not finalized");
- VcoreThrowMsg(Exception::NotFinalized, "Not finalized");
- }
- BUF_MEM *bptr = 0;
- BIO_get_mem_ptr(m_b64, &bptr);
- if (bptr == 0) {
- LogError("Bio internal error");
- VcoreThrowMsg(Exception::InternalError, "Bio internal error");
- }
-
- if (bptr->length > 0) {
- return std::string(bptr->data, bptr->length);
- }
- return std::string();
+ if (!m_finalized) {
+ LogWarning("Not finalized");
+ VcoreThrowMsg(Exception::NotFinalized, "Not finalized");
+ }
+
+ BUF_MEM *bptr = 0;
+ BIO_get_mem_ptr(m_b64, &bptr);
+
+ if (bptr == 0) {
+ LogError("Bio internal error");
+ VcoreThrowMsg(Exception::InternalError, "Bio internal error");
+ }
+
+ if (bptr->length > 0) {
+ return std::string(bptr->data, bptr->length);
+ }
+
+ return std::string();
}
void Base64Encoder::reset()
{
- m_finalized = false;
- BIO_free_all(m_b64);
- m_b64 = BIO_new(BIO_f_base64());
- m_bmem = BIO_new(BIO_s_mem());
- if (!m_b64 || !m_bmem) {
- LogError("Error during allocation memory in BIO");
- VcoreThrowMsg(Exception::InternalError,
- "Error during allocation memory in BIO");
- }
- BIO_set_flags(m_b64, BIO_FLAGS_BASE64_NO_NL);
- m_b64 = BIO_push(m_b64, m_bmem);
+ m_finalized = false;
+ BIO_free_all(m_b64);
+ m_b64 = BIO_new(BIO_f_base64());
+ m_bmem = BIO_new(BIO_s_mem());
+
+ if (!m_b64 || !m_bmem) {
+ LogError("Error during allocation memory in BIO");
+ VcoreThrowMsg(Exception::InternalError,
+ "Error during allocation memory in BIO");
+ }
+
+ BIO_set_flags(m_b64, BIO_FLAGS_BASE64_NO_NL);
+ m_b64 = BIO_push(m_b64, m_bmem);
}
Base64Encoder::~Base64Encoder()
{
- BIO_free_all(m_b64);
+ BIO_free_all(m_b64);
}
Base64Decoder::Base64Decoder() :
- m_finalized(false)
+ m_finalized(false)
{
}
void Base64Decoder::append(const std::string &data)
{
- if (m_finalized) {
- LogWarning("Already finalized.");
- VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
- }
- m_input.append(data);
+ if (m_finalized) {
+ LogWarning("Already finalized.");
+ VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
+ }
+
+ m_input.append(data);
}
static bool whiteCharacter(char a)
{
- if (a == '\n')
- return true;
+ if (a == '\n')
+ return true;
- return false;
+ return false;
}
bool Base64Decoder::finalize()
{
- if (m_finalized) {
- LogWarning("Already finalized.");
- VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
- }
-
- m_finalized = true;
-
- m_input.erase(std::remove_if(m_input.begin(),
- m_input.end(),
- whiteCharacter),
- m_input.end());
-
- for (size_t i = 0; i<m_input.size(); ++i) {
- if (isalnum(m_input[i])
- || m_input[i] == '+'
- || m_input[i] == '/'
- || m_input[i] == '=')
- continue;
- LogError("Base64 input contains illegal chars: " << m_input[i]);
- return false;
- }
-
- BIO *b64, *bmem;
- size_t len = m_input.size();
- std::shared_ptr<char> buffer(new char[len], [](char *p){delete []p;});
- if (!buffer.get()) {
- LogError("Error in new");
- VcoreThrowMsg(Exception::InternalError, "Error in new");
- }
-
- memset(buffer.get(), 0, len);
- b64 = BIO_new(BIO_f_base64());
- if (!b64) {
- LogError("Couldn't create BIO object.");
- VcoreThrowMsg(Exception::InternalError, "Couldn't create BIO object.");
- }
- BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-
- std::shared_ptr<char> tmp(strdup(m_input.c_str()), [](char *p){free(p);});
- if (!tmp.get()) {
- LogError("Error in strdup");
- VcoreThrowMsg(Exception::InternalError, "Error in strdup");
- }
-
- m_input.clear();
-
- bmem = BIO_new_mem_buf(tmp.get(), len);
-
- if (!bmem) {
- BIO_free(b64);
- LogError("Internal error in BIO");
- VcoreThrowMsg(Exception::InternalError, "Internal error in BIO");
- }
-
- bmem = BIO_push(b64, bmem);
-
- if (!bmem) {
- BIO_free(b64);
- LogError("Internal error in BIO");
- VcoreThrowMsg(Exception::InternalError, "Internal error in BIO");
- }
-
- int readlen = BIO_read(bmem, buffer.get(), len);
- m_output.clear();
-
- bool status = true;
-
- if (readlen > 0)
- m_output.append(buffer.get(), readlen);
- else
- status = false;
-
- BIO_free_all(bmem);
-
- return status;
+ if (m_finalized) {
+ LogWarning("Already finalized.");
+ VcoreThrowMsg(Exception::AlreadyFinalized, "Already finalized.");
+ }
+
+ m_finalized = true;
+ m_input.erase(std::remove_if(m_input.begin(),
+ m_input.end(),
+ whiteCharacter),
+ m_input.end());
+
+ for (size_t i = 0; i < m_input.size(); ++i) {
+ if (isalnum(m_input[i])
+ || m_input[i] == '+'
+ || m_input[i] == '/'
+ || m_input[i] == '=')
+ continue;
+
+ LogError("Base64 input contains illegal chars: " << m_input[i]);
+ return false;
+ }
+
+ BIO *b64, *bmem;
+ size_t len = m_input.size();
+ std::shared_ptr<char> buffer(new char[len], [](char *p) {
+ delete []p;
+ });
+
+ if (!buffer.get()) {
+ LogError("Error in new");
+ VcoreThrowMsg(Exception::InternalError, "Error in new");
+ }
+
+ memset(buffer.get(), 0, len);
+ b64 = BIO_new(BIO_f_base64());
+
+ if (!b64) {
+ LogError("Couldn't create BIO object.");
+ VcoreThrowMsg(Exception::InternalError, "Couldn't create BIO object.");
+ }
+
+ BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
+ std::shared_ptr<char> tmp(strdup(m_input.c_str()), [](char *p) {
+ free(p);
+ });
+
+ if (!tmp.get()) {
+ LogError("Error in strdup");
+ VcoreThrowMsg(Exception::InternalError, "Error in strdup");
+ }
+
+ m_input.clear();
+ bmem = BIO_new_mem_buf(tmp.get(), len);
+
+ if (!bmem) {
+ BIO_free(b64);
+ LogError("Internal error in BIO");
+ VcoreThrowMsg(Exception::InternalError, "Internal error in BIO");
+ }
+
+ bmem = BIO_push(b64, bmem);
+
+ if (!bmem) {
+ BIO_free(b64);
+ LogError("Internal error in BIO");
+ VcoreThrowMsg(Exception::InternalError, "Internal error in BIO");
+ }
+
+ int readlen = BIO_read(bmem, buffer.get(), len);
+ m_output.clear();
+ bool status = true;
+
+ if (readlen > 0)
+ m_output.append(buffer.get(), readlen);
+ else
+ status = false;
+
+ BIO_free_all(bmem);
+ return status;
}
std::string Base64Decoder::get() const
{
- if (!m_finalized) {
- LogWarning("Not finalized.");
- VcoreThrowMsg(Exception::NotFinalized, "Not finalized");
- }
- return m_output;
+ if (!m_finalized) {
+ LogWarning("Not finalized.");
+ VcoreThrowMsg(Exception::NotFinalized, "Not finalized");
+ }
+
+ return m_output;
}
void Base64Decoder::reset()
{
- m_finalized = false;
- m_input.clear();
- m_output.clear();
+ m_finalized = false;
+ m_input.clear();
+ m_output.clear();
}
} // namespace ValidationCore
namespace ValidationCore {
class Base64Encoder {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, NotFinalized)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, AlreadyFinalized)
- };
- Base64Encoder();
- void append(const std::string &data);
- void finalize();
- std::string get();
- void reset();
- ~Base64Encoder();
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, NotFinalized)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, AlreadyFinalized)
+ };
+ Base64Encoder();
+ void append(const std::string &data);
+ void finalize();
+ std::string get();
+ void reset();
+ ~Base64Encoder();
private:
- Base64Encoder(const Base64Encoder &);
- const Base64Encoder &operator=(const Base64Encoder &);
+ Base64Encoder(const Base64Encoder &);
+ const Base64Encoder &operator=(const Base64Encoder &);
- BIO *m_b64;
- BIO *m_bmem;
- bool m_finalized;
+ BIO *m_b64;
+ BIO *m_bmem;
+ bool m_finalized;
};
class Base64Decoder {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, NotFinalized)
- VCORE_DECLARE_EXCEPTION_TYPE(Base, AlreadyFinalized)
- };
- Base64Decoder();
- void append(const std::string &data);
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, NotFinalized)
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, AlreadyFinalized)
+ };
+ Base64Decoder();
+ void append(const std::string &data);
- /*
- * Function will return false when BIO_read fails
- * (for example: when string was not in base64 format).
- */
- bool finalize();
- std::string get() const;
- void reset();
- ~Base64Decoder() {}
+ /*
+ * Function will return false when BIO_read fails
+ * (for example: when string was not in base64 format).
+ */
+ bool finalize();
+ std::string get() const;
+ void reset();
+ ~Base64Decoder() {}
private:
- Base64Decoder(const Base64Decoder &);
- const Base64Decoder &operator=(const Base64Decoder &);
+ Base64Decoder(const Base64Decoder &);
+ const Base64Decoder &operator=(const Base64Decoder &);
- std::string m_input;
- std::string m_output;
- bool m_finalized;
+ std::string m_input;
+ std::string m_output;
+ bool m_finalized;
};
} // namespace ValidationCore
namespace CertStoreId {
Set::Set()
- : m_certificateStorage(0)
+ : m_certificateStorage(0)
{}
Set::~Set()
void Set::add(Type second)
{
- m_certificateStorage |= second;
+ m_certificateStorage |= second;
}
bool Set::contains(Type second) const
{
- return static_cast<bool>(m_certificateStorage & second);
+ return static_cast<bool>(m_certificateStorage & second);
}
bool Set::isContainsVis() const
{
- Type visType = VIS_PUBLIC;
- visType |= VIS_PARTNER;
- visType |= VIS_PLATFORM;
+ Type visType = VIS_PUBLIC;
+ visType |= VIS_PARTNER;
+ visType |= VIS_PLATFORM;
+ visType &= m_certificateStorage;
- visType &= m_certificateStorage;
+ if (visType == 0)
+ return false;
- if (visType == 0)
- return false;
-
- return true;
+ return true;
}
bool Set::isEmpty() const
{
- return m_certificateStorage == 0;
+ return m_certificateStorage == 0;
}
std::string Set::typeToString() const
{
- std::string ret;
-
- if (m_certificateStorage & TIZEN_DEVELOPER)
- ret += "TIZEN_DEVELOPER ";
- if (m_certificateStorage & TIZEN_TEST)
- ret += "TIZEN_TEST ";
- if (m_certificateStorage & TIZEN_VERIFY)
- ret += "TIZEN_VERIFY ";
- if (m_certificateStorage & TIZEN_STORE)
- ret += "TIZEN_STORE ";
- if (m_certificateStorage & VIS_PUBLIC)
- ret += "VIS_PUBLIC ";
- if (m_certificateStorage & VIS_PARTNER)
- ret += "VIS_PARTNER ";
- if (m_certificateStorage & VIS_PLATFORM)
- ret += "VIS_PLATFORM ";
-
- return ret;
+ std::string ret;
+
+ if (m_certificateStorage & TIZEN_DEVELOPER)
+ ret += "TIZEN_DEVELOPER ";
+
+ if (m_certificateStorage & TIZEN_TEST)
+ ret += "TIZEN_TEST ";
+
+ if (m_certificateStorage & TIZEN_VERIFY)
+ ret += "TIZEN_VERIFY ";
+
+ if (m_certificateStorage & TIZEN_STORE)
+ ret += "TIZEN_STORE ";
+
+ if (m_certificateStorage & VIS_PUBLIC)
+ ret += "VIS_PUBLIC ";
+
+ if (m_certificateStorage & VIS_PARTNER)
+ ret += "VIS_PARTNER ";
+
+ if (m_certificateStorage & VIS_PLATFORM)
+ ret += "VIS_PLATFORM ";
+
+ return ret;
}
} // namespace CertStoreId
class Set {
public:
- Set();
- virtual ~Set();
+ Set();
+ virtual ~Set();
- void add(Type second);
- bool contains(Type second) const;
- bool isContainsVis() const;
- bool isEmpty() const;
+ void add(Type second);
+ bool contains(Type second) const;
+ bool isContainsVis() const;
+ bool isEmpty() const;
- std::string typeToString() const;
+ std::string typeToString() const;
private:
- Type m_certificateStorage;
+ Type m_certificateStorage;
};
} // namespace CertStoreId
Certificate::Certificate(X509 *cert)
{
- if (cert == NULL)
- VcoreThrowMsg(Certificate::Exception::WrongParamError,
- "Input X509 shouldn't be NULL.");
+ if (cert == NULL)
+ VcoreThrowMsg(Certificate::Exception::WrongParamError,
+ "Input X509 shouldn't be NULL.");
- m_x509 = X509_dup(cert);
+ m_x509 = X509_dup(cert);
- if (m_x509 == NULL)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Internal Openssl error in d2i_X509 function.");
+ if (m_x509 == NULL)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Internal Openssl error in d2i_X509 function.");
}
Certificate::Certificate(const std::string &data,
- Certificate::FormType form)
-{
- if (data.size() == 0)
- VcoreThrowMsg(Certificate::Exception::WrongParamError,
- "Input data shouldn't be empty");
-
- int size;
- const unsigned char *ptr;
- std::string tmp = data;
-
- // transform to DER format
- if (FORM_BASE64 == form) {
- try {
- Base64Decoder base64;
- base64.reset();
- base64.append(data);
- if (!base64.finalize()) {
- LogWarning("Error during decoding");
- }
- tmp = base64.get();
- } catch (const Base64Decoder::Exception::Base &e) {
- LogError("Exception in Certificate constructor : " << e.DumpToString());
- VcoreThrowMsg(Certificate::Exception::Base64Error, "Failed to Base64Decoder");
- }
- }
-
- ptr = reinterpret_cast<const unsigned char*>(tmp.c_str());
- size = static_cast<int>(tmp.size());
-
- m_x509 = d2i_X509(NULL, &ptr, size);
- if (!m_x509)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Internal Openssl error in d2i_X509 function.");
+ Certificate::FormType form)
+{
+ if (data.size() == 0)
+ VcoreThrowMsg(Certificate::Exception::WrongParamError,
+ "Input data shouldn't be empty");
+
+ int size;
+ const unsigned char *ptr;
+ std::string tmp = data;
+
+ // transform to DER format
+ if (FORM_BASE64 == form) {
+ try {
+ Base64Decoder base64;
+ base64.reset();
+ base64.append(data);
+
+ if (!base64.finalize()) {
+ LogWarning("Error during decoding");
+ }
+
+ tmp = base64.get();
+ } catch (const Base64Decoder::Exception::Base &e) {
+ LogError("Exception in Certificate constructor : " << e.DumpToString());
+ VcoreThrowMsg(Certificate::Exception::Base64Error, "Failed to Base64Decoder");
+ }
+ }
+
+ ptr = reinterpret_cast<const unsigned char *>(tmp.c_str());
+ size = static_cast<int>(tmp.size());
+ m_x509 = d2i_X509(NULL, &ptr, size);
+
+ if (!m_x509)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Internal Openssl error in d2i_X509 function.");
}
static off_t getFileSize(const std::string &location)
{
- struct stat status;
-
- stat(location.c_str(), &status);
-
- return status.st_size;
+ struct stat status;
+ stat(location.c_str(), &status);
+ return status.st_size;
}
CertificatePtr Certificate::createFromFile(const std::string &location)
{
- FILE *fp = NULL;
- X509 *x509 = NULL;
+ FILE *fp = NULL;
+ X509 *x509 = NULL;
+ fp = fopen(location.c_str(), "rb");
- fp = fopen(location.c_str(), "rb");
- if (fp == NULL)
- VcoreThrowMsg(Certificate::Exception::WrongParamError,
- "File cannot be opened : " << location);
+ if (fp == NULL)
+ VcoreThrowMsg(Certificate::Exception::WrongParamError,
+ "File cannot be opened : " << location);
- ScopedFile filePtr(fp, fclose);
+ ScopedFile filePtr(fp, fclose);
+ x509 = PEM_read_X509(fp, NULL, NULL, NULL);
- x509 = PEM_read_X509(fp, NULL, NULL, NULL);
- if (x509 == NULL) {
- rewind(fp);
- x509 = PEM_read_X509_AUX(fp, NULL, NULL, NULL);
- }
+ if (x509 == NULL) {
+ rewind(fp);
+ x509 = PEM_read_X509_AUX(fp, NULL, NULL, NULL);
+ }
- if (x509 != NULL) {
- ScopedX509 x509Ptr(x509, X509_free);
- return CertificatePtr(new Certificate(x509));
- }
+ if (x509 != NULL) {
+ ScopedX509 x509Ptr(x509, X509_free);
+ return CertificatePtr(new Certificate(x509));
+ }
- off_t filesize = getFileSize(location);
- if (filesize == 0)
- VcoreThrowMsg(Certificate::Exception::WrongParamError,
- "File content is empty : " << location);
+ off_t filesize = getFileSize(location);
- unsigned char *content = new unsigned char[filesize + 1];
- memset(content, 0x00, filesize + 1);
- rewind(fp);
- if (fread(content, sizeof(unsigned char), filesize, fp) != static_cast<size_t>(filesize))
- VcoreThrowMsg(Certificate::Exception::InternalError,
- "file read failed. wrong size : " << location);
+ if (filesize == 0)
+ VcoreThrowMsg(Certificate::Exception::WrongParamError,
+ "File content is empty : " << location);
- content[filesize] = '\0';
- const unsigned char *ptr = reinterpret_cast<const unsigned char *>(content);
- x509 = d2i_X509(NULL, &ptr, filesize);
- if (x509 == NULL)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Internal Openssl error in d2i_X509 function.");
+ unsigned char *content = new unsigned char[filesize + 1];
+ memset(content, 0x00, filesize + 1);
+ rewind(fp);
- return CertificatePtr(new Certificate(x509));
+ if (fread(content, sizeof(unsigned char), filesize, fp) != static_cast<size_t>(filesize))
+ VcoreThrowMsg(Certificate::Exception::InternalError,
+ "file read failed. wrong size : " << location);
+
+ content[filesize] = '\0';
+ const unsigned char *ptr = reinterpret_cast<const unsigned char *>(content);
+ x509 = d2i_X509(NULL, &ptr, filesize);
+
+ if (x509 == NULL)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Internal Openssl error in d2i_X509 function.");
+
+ return CertificatePtr(new Certificate(x509));
}
Certificate::~Certificate()
{
- X509_free(m_x509);
+ X509_free(m_x509);
}
-X509* Certificate::getX509(void) const
+X509 *Certificate::getX509(void) const
{
- return m_x509;
+ return m_x509;
}
std::string Certificate::getDER(void) const
{
- unsigned char *rawDer = NULL;
- int size = i2d_X509(m_x509, &rawDer);
- if (!rawDer || size <= 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "i2d_X509 failed");
+ unsigned char *rawDer = NULL;
+ int size = i2d_X509(m_x509, &rawDer);
- std::string output(reinterpret_cast<char*>(rawDer), size);
- OPENSSL_free(rawDer);
- return output;
+ if (!rawDer || size <= 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "i2d_X509 failed");
+
+ std::string output(reinterpret_cast<char *>(rawDer), size);
+ OPENSSL_free(rawDer);
+ return output;
}
std::string Certificate::getBase64(void) const
{
- Base64Encoder base64;
- try {
- base64.reset();
- base64.append(getDER());
- base64.finalize();
- } catch (const Base64Encoder::Exception::Base &e) {
- LogError("Exception in Certificate getBase64 : " << e.DumpToString());
- VcoreThrowMsg(Certificate::Exception::Base64Error, "Failed to Base64Encoder");
- }
- return base64.get();
+ Base64Encoder base64;
+
+ try {
+ base64.reset();
+ base64.append(getDER());
+ base64.finalize();
+ } catch (const Base64Encoder::Exception::Base &e) {
+ LogError("Exception in Certificate getBase64 : " << e.DumpToString());
+ VcoreThrowMsg(Certificate::Exception::Base64Error, "Failed to Base64Encoder");
+ }
+
+ return base64.get();
}
bool Certificate::isSignedBy(const CertificatePtr &parent) const
{
- if (!parent) {
- LogDebug("Invalid certificate parameter.");
- return false;
- }
- return 0 == X509_NAME_cmp(X509_get_subject_name(parent->m_x509),
- X509_get_issuer_name(m_x509));
+ if (!parent) {
+ LogDebug("Invalid certificate parameter.");
+ return false;
+ }
+
+ return 0 == X509_NAME_cmp(X509_get_subject_name(parent->m_x509),
+ X509_get_issuer_name(m_x509));
}
Certificate::Fingerprint Certificate::getFingerprint(
- Certificate::FingerprintType type) const
+ Certificate::FingerprintType type) const
{
- unsigned int fingerprintlength = EVP_MAX_MD_SIZE;
- unsigned char fingerprint[EVP_MAX_MD_SIZE];
- Fingerprint raw;
+ unsigned int fingerprintlength = EVP_MAX_MD_SIZE;
+ unsigned char fingerprint[EVP_MAX_MD_SIZE];
+ Fingerprint raw;
- if (type == FINGERPRINT_MD5) {
- if (!X509_digest(m_x509, EVP_md5(), fingerprint, &fingerprintlength))
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "MD5 digest counting failed!");
- }
+ if (type == FINGERPRINT_MD5) {
+ if (!X509_digest(m_x509, EVP_md5(), fingerprint, &fingerprintlength))
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "MD5 digest counting failed!");
+ }
- if (type == FINGERPRINT_SHA1) {
- if (!X509_digest(m_x509, EVP_sha1(), fingerprint, &fingerprintlength))
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "SHA1 digest counting failed");
- }
+ if (type == FINGERPRINT_SHA1) {
+ if (!X509_digest(m_x509, EVP_sha1(), fingerprint, &fingerprintlength))
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "SHA1 digest counting failed");
+ }
- raw.resize(fingerprintlength); // improve performance
- std::copy(fingerprint, fingerprint + fingerprintlength, raw.begin());
-
- return raw;
+ raw.resize(fingerprintlength); // improve performance
+ std::copy(fingerprint, fingerprint + fingerprintlength, raw.begin());
+ return raw;
}
X509_NAME *Certificate::getX509Name(FieldType type) const
{
- X509_NAME *name = NULL;
+ X509_NAME *name = NULL;
+
+ switch (type) {
+ case FIELD_ISSUER:
+ name = X509_get_issuer_name(m_x509);
+ break;
- switch (type) {
- case FIELD_ISSUER:
- name = X509_get_issuer_name(m_x509);
- break;
- case FIELD_SUBJECT:
- name = X509_get_subject_name(m_x509);
- break;
- default:
- VcoreThrowMsg(Certificate::Exception::WrongParamError,
- "Invalid field type param. type : " << type);
- }
+ case FIELD_SUBJECT:
+ name = X509_get_subject_name(m_x509);
+ break;
- if (!name)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error during x509 name extraction.");
+ default:
+ VcoreThrowMsg(Certificate::Exception::WrongParamError,
+ "Invalid field type param. type : " << type);
+ }
- return name;
+ if (!name)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error during x509 name extraction.");
+
+ return name;
}
std::string Certificate::getOneLine(FieldType type) const
{
- X509_NAME *name = getX509Name(type);
- static const int MAXB = 1024;
- char buffer[MAXB] = {0, };
- X509_NAME_oneline(name, buffer, MAXB);
-
- return std::string(buffer);
+ X509_NAME *name = getX509Name(type);
+ static const int MAXB = 1024;
+ char buffer[MAXB] = {0, };
+ X509_NAME_oneline(name, buffer, MAXB);
+ return std::string(buffer);
}
std::string Certificate::getField(FieldType type, int fieldNid) const
{
- X509_NAME *subjectName = getX509Name(type);
- X509_NAME_ENTRY *subjectEntry = NULL;
- std::string output;
- int entryCount = X509_NAME_entry_count(subjectName);
-
- for (int i = 0; i < entryCount; ++i) {
- subjectEntry = X509_NAME_get_entry(subjectName,
- i);
+ X509_NAME *subjectName = getX509Name(type);
+ X509_NAME_ENTRY *subjectEntry = NULL;
+ std::string output;
+ int entryCount = X509_NAME_entry_count(subjectName);
- if (!subjectEntry) {
- continue;
- }
+ for (int i = 0; i < entryCount; ++i) {
+ subjectEntry = X509_NAME_get_entry(subjectName,
+ i);
- int nid = OBJ_obj2nid(
- static_cast<ASN1_OBJECT*>(
- X509_NAME_ENTRY_get_object(subjectEntry)));
+ if (!subjectEntry) {
+ continue;
+ }
- if (nid != fieldNid) {
- continue;
- }
+ int nid = OBJ_obj2nid(
+ static_cast<ASN1_OBJECT *>(
+ X509_NAME_ENTRY_get_object(subjectEntry)));
- ASN1_STRING* pASN1Str = subjectEntry->value;
+ if (nid != fieldNid) {
+ continue;
+ }
- unsigned char* pData = NULL;
- int nLength = ASN1_STRING_to_UTF8(&pData,
- pASN1Str);
+ ASN1_STRING *pASN1Str = subjectEntry->value;
+ unsigned char *pData = NULL;
+ int nLength = ASN1_STRING_to_UTF8(&pData,
+ pASN1Str);
- if (nLength < 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Reading field error.");
+ if (nLength < 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Reading field error.");
- if (!pData) {
- output = std::string();
- }
- else {
- output = std::string(reinterpret_cast<char*>(pData), nLength);
- OPENSSL_free(pData);
- }
- }
+ if (!pData) {
+ output = std::string();
+ } else {
+ output = std::string(reinterpret_cast<char *>(pData), nLength);
+ OPENSSL_free(pData);
+ }
+ }
- return output;
+ return output;
}
std::string Certificate::getCommonName(FieldType type) const
{
- return getField(type, NID_commonName);
+ return getField(type, NID_commonName);
}
std::string Certificate::getCountryName(FieldType type) const
{
- return getField(type, NID_countryName);
+ return getField(type, NID_countryName);
}
std::string Certificate::getStateOrProvinceName(FieldType type) const
{
- return getField(type, NID_stateOrProvinceName);
+ return getField(type, NID_stateOrProvinceName);
}
std::string Certificate::getLocalityName(FieldType type) const
{
- return getField(type, NID_localityName);
+ return getField(type, NID_localityName);
}
std::string Certificate::getOrganizationName(FieldType type) const
{
- return getField(type, NID_organizationName);
+ return getField(type, NID_organizationName);
}
std::string Certificate::getOrganizationalUnitName(FieldType type) const
{
- return getField(type, NID_organizationalUnitName);
+ return getField(type, NID_organizationalUnitName);
}
std::string Certificate::getEmailAddres(FieldType type) const
{
- return getField(type, NID_pkcs9_emailAddress);
+ return getField(type, NID_pkcs9_emailAddress);
}
std::string Certificate::getNameHash(FieldType type) const
{
- unsigned long ulNameHash;
- char buf[9] = {0};
+ unsigned long ulNameHash;
+ char buf[9] = {0};
- if (type == FIELD_SUBJECT)
- ulNameHash = X509_subject_name_hash(m_x509);
- else
- ulNameHash = X509_issuer_name_hash(m_x509);
+ if (type == FIELD_SUBJECT)
+ ulNameHash = X509_subject_name_hash(m_x509);
+ else
+ ulNameHash = X509_issuer_name_hash(m_x509);
- snprintf(buf, 9, "%08lx", ulNameHash);
-
- return std::string(buf);
+ snprintf(buf, 9, "%08lx", ulNameHash);
+ return std::string(buf);
}
std::string Certificate::getUID(FieldType type) const
{
- ASN1_BIT_STRING *uid = NULL;
- if (type == FIELD_SUBJECT)
- uid = m_x509->cert_info->subjectUID;
- else
- uid = m_x509->cert_info->issuerUID;
-
- if (uid->data == NULL)
- return std::string();
+ ASN1_BIT_STRING *uid = NULL;
- char *temp = new char[uid->length + 1];
- memcpy(temp, uid->data, uid->length);
- temp[uid->length] = 0;
+ if (type == FIELD_SUBJECT)
+ uid = m_x509->cert_info->subjectUID;
+ else
+ uid = m_x509->cert_info->issuerUID;
- std::string uidStr(temp);
- delete []temp;
+ if (uid->data == NULL)
+ return std::string();
- return uidStr;
+ char *temp = new char[uid->length + 1];
+ memcpy(temp, uid->data, uid->length);
+ temp[uid->length] = 0;
+ std::string uidStr(temp);
+ delete []temp;
+ return uidStr;
}
std::string Certificate::getOCSPURL() const
{
- // TODO verify this code
- std::string retValue;
- AUTHORITY_INFO_ACCESS *aia = static_cast<AUTHORITY_INFO_ACCESS*>(
- X509_get_ext_d2i(m_x509,
- NID_info_access,
- NULL,
- NULL));
-
- // no AIA extension in the cert
- if (NULL == aia) {
- return retValue;
- }
-
- int count = sk_ACCESS_DESCRIPTION_num(aia);
-
- for (int i = 0; i < count; ++i) {
- ACCESS_DESCRIPTION* ad = sk_ACCESS_DESCRIPTION_value(aia, i);
-
- if (OBJ_obj2nid(ad->method) == NID_ad_OCSP &&
- ad->location->type == GEN_URI)
- {
- void *data = ASN1_STRING_data(ad->location->d.ia5);
- if (!data)
- retValue = std::string();
- else
- retValue = std::string(static_cast<char *>(data));
- break;
- }
- }
- sk_ACCESS_DESCRIPTION_free(aia);
- return retValue;
+ // TODO verify this code
+ std::string retValue;
+ AUTHORITY_INFO_ACCESS *aia = static_cast<AUTHORITY_INFO_ACCESS *>(
+ X509_get_ext_d2i(m_x509,
+ NID_info_access,
+ NULL,
+ NULL));
+
+ // no AIA extension in the cert
+ if (NULL == aia) {
+ return retValue;
+ }
+
+ int count = sk_ACCESS_DESCRIPTION_num(aia);
+
+ for (int i = 0; i < count; ++i) {
+ ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(aia, i);
+
+ if (OBJ_obj2nid(ad->method) == NID_ad_OCSP &&
+ ad->location->type == GEN_URI) {
+ void *data = ASN1_STRING_data(ad->location->d.ia5);
+
+ if (!data)
+ retValue = std::string();
+ else
+ retValue = std::string(static_cast<char *>(data));
+
+ break;
+ }
+ }
+
+ sk_ACCESS_DESCRIPTION_free(aia);
+ return retValue;
}
Certificate::AltNameSet Certificate::getAlternativeNameDNS() const
{
- AltNameSet set;
+ AltNameSet set;
+ GENERAL_NAME *namePart = NULL;
+ STACK_OF(GENERAL_NAME)* san =
+ static_cast<STACK_OF(GENERAL_NAME) *>(
+ X509_get_ext_d2i(m_x509, NID_subject_alt_name, NULL, NULL));
- GENERAL_NAME *namePart = NULL;
+ while (sk_GENERAL_NAME_num(san) > 0) {
+ if ((namePart = sk_GENERAL_NAME_pop(san)) == NULL)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "openssl sk_GENERAL_NAME_pop err.");
- STACK_OF(GENERAL_NAME)* san =
- static_cast<STACK_OF(GENERAL_NAME)*>(
- X509_get_ext_d2i(m_x509,NID_subject_alt_name,NULL,NULL));
+ if (GEN_DNS == namePart->type) {
+ char *temp = reinterpret_cast<char *>(ASN1_STRING_data(namePart->d.dNSName));
- while (sk_GENERAL_NAME_num(san) > 0) {
- if ((namePart = sk_GENERAL_NAME_pop(san)) == NULL)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "openssl sk_GENERAL_NAME_pop err.");
+ if (!temp) {
+ set.insert(std::string());
+ } else {
+ set.insert(std::string(temp));
+ LogDebug("FOUND GEN_DNS: " << temp);
+ }
+ } else {
+ LogDebug("FOUND GEN TYPE ID: " << namePart->type);
+ }
+ }
- if (GEN_DNS == namePart->type) {
- char *temp = reinterpret_cast<char *>(ASN1_STRING_data(namePart->d.dNSName));
- if (!temp) {
- set.insert(std::string());
- }
- else {
- set.insert(std::string(temp));
- LogDebug("FOUND GEN_DNS: " << temp);
- }
- } else {
- LogDebug("FOUND GEN TYPE ID: " << namePart->type);
- }
- }
- return set;
+ return set;
}
-ASN1_TIME* Certificate::getNotAfterTime() const
+ASN1_TIME *Certificate::getNotAfterTime() const
{
- auto timeafter = X509_get_notAfter(m_x509);
- if (!timeafter)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Reading Not After error.");
+ auto timeafter = X509_get_notAfter(m_x509);
- LogDebug("Get notAfter ASN1_TIME : " <<
- reinterpret_cast<char *>(timeafter->data));
+ if (!timeafter)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Reading Not After error.");
- return timeafter;
+ LogDebug("Get notAfter ASN1_TIME : " <<
+ reinterpret_cast<char *>(timeafter->data));
+ return timeafter;
}
-ASN1_TIME* Certificate::getNotBeforeTime() const
+ASN1_TIME *Certificate::getNotBeforeTime() const
{
- auto timebefore = X509_get_notBefore(m_x509);
- if (!timebefore)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Reading Not Before error.");
+ auto timebefore = X509_get_notBefore(m_x509);
- LogDebug("Get notBefore ASN1_TIME : " <<
- reinterpret_cast<char *>(timebefore->data));
+ if (!timebefore)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Reading Not Before error.");
- return timebefore;
+ LogDebug("Get notBefore ASN1_TIME : " <<
+ reinterpret_cast<char *>(timebefore->data));
+ return timebefore;
}
time_t Certificate::getNotAfter() const
{
- auto time = getNotAfterTime();
- time_t output;
+ auto time = getNotAfterTime();
+ time_t output;
- if (asn1TimeToTimeT(time, &output) == 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Converting ASN1_time to time_t error.");
+ if (asn1TimeToTimeT(time, &output) == 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Converting ASN1_time to time_t error.");
- return output;
+ return output;
}
time_t Certificate::getNotBefore() const
{
- auto time = getNotBeforeTime();
- time_t output;
+ auto time = getNotBeforeTime();
+ time_t output;
- if (asn1TimeToTimeT(time, &output) == 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Converting ASN1_time to time_t error.");
+ if (asn1TimeToTimeT(time, &output) == 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Converting ASN1_time to time_t error.");
- return output;
+ return output;
}
bool Certificate::isRootCert()
{
- // based on that root certificate has the same subject as issuer name
- return isSignedBy(this->shared_from_this());
+ // based on that root certificate has the same subject as issuer name
+ return isSignedBy(this->shared_from_this());
}
long Certificate::getVersion() const
{
- return X509_get_version(m_x509);
+ return X509_get_version(m_x509);
}
std::string Certificate::getSerialNumberString() const
{
- ASN1_INTEGER *ai = X509_get_serialNumber(m_x509);
- if (!ai)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in X509_get_serialNumber");
+ ASN1_INTEGER *ai = X509_get_serialNumber(m_x509);
+
+ if (!ai)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in X509_get_serialNumber");
+
+ std::stringstream stream;
+ stream << std::hex << std::setfill('0');
+
+ if (ai->type == V_ASN1_NEG_INTEGER) {
+ stream << "(Negetive) ";
+ }
+
+ for (int i = 0; i < ai->length; ++i) {
+ stream << std::setw(2) << (int)ai->data[i] << ":";
+ }
+
+ std::string data = stream.str();
- std::stringstream stream;
- stream << std::hex << std::setfill('0');
- if (ai->type == V_ASN1_NEG_INTEGER) {
- stream << "(Negetive) ";
- }
- for (int i=0; i<ai->length; ++i) {
- stream << std::setw(2) << (int)ai->data[i] << ":";
- }
- std::string data = stream.str();
- if (!data.empty()) {
- data.erase(--data.end());
- }
+ if (!data.empty()) {
+ data.erase(--data.end());
+ }
- return data;
+ return data;
}
std::string Certificate::getKeyUsageString() const
{
- // Extensions were defined in RFC 3280
- const char *usage[] = {
- "digitalSignature",
- "nonRepudiation",
- "keyEncipherment",
- "dataEncipherment",
- "keyAgreement",
- "keyCertSign",
- "cRLSign",
- "encipherOnly",
- "decipherOnly"
- };
- int crit = -1;
- int idx = -1;
- ASN1_BIT_STRING *keyUsage = (ASN1_BIT_STRING*)
- X509_get_ext_d2i(m_x509, NID_key_usage, &crit, &idx);
-
- std::stringstream stream;
- for(int i=0; i<9; ++i) {
- if (ASN1_BIT_STRING_get_bit(keyUsage, i)) {
- stream << usage[i] << ",";
- }
- }
- std::string result = stream.str();
- if (!result.empty()) {
- result.erase(--result.end());
- }
-
- return result;
+ // Extensions were defined in RFC 3280
+ const char *usage[] = {
+ "digitalSignature",
+ "nonRepudiation",
+ "keyEncipherment",
+ "dataEncipherment",
+ "keyAgreement",
+ "keyCertSign",
+ "cRLSign",
+ "encipherOnly",
+ "decipherOnly"
+ };
+ int crit = -1;
+ int idx = -1;
+ ASN1_BIT_STRING *keyUsage = (ASN1_BIT_STRING *)
+ X509_get_ext_d2i(m_x509, NID_key_usage, &crit, &idx);
+ std::stringstream stream;
+
+ for (int i = 0; i < 9; ++i) {
+ if (ASN1_BIT_STRING_get_bit(keyUsage, i)) {
+ stream << usage[i] << ",";
+ }
+ }
+
+ std::string result = stream.str();
+
+ if (!result.empty()) {
+ result.erase(--result.end());
+ }
+
+ return result;
}
std::string Certificate::getSignatureAlgorithmString() const
{
- std::unique_ptr<BIO, std::function<int(BIO*)>>
- b(BIO_new(BIO_s_mem()),BIO_free);
+ std::unique_ptr<BIO, std::function<int(BIO *)>>
+ b(BIO_new(BIO_s_mem()), BIO_free);
- if (!b.get())
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in BIO_new");
+ if (!b.get())
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in BIO_new");
- if (i2a_ASN1_OBJECT(b.get(), m_x509->cert_info->signature->algorithm) < 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in i2a_ASN1_OBJECT");
+ if (i2a_ASN1_OBJECT(b.get(), m_x509->cert_info->signature->algorithm) < 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in i2a_ASN1_OBJECT");
- BUF_MEM *bptr = 0;
- BIO_get_mem_ptr(b.get(), &bptr);
- if (bptr == 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in BIO_get_mem_ptr");
+ BUF_MEM *bptr = 0;
+ BIO_get_mem_ptr(b.get(), &bptr);
- std::string result(bptr->data, bptr->length);
+ if (bptr == 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in BIO_get_mem_ptr");
- return result;
+ std::string result(bptr->data, bptr->length);
+ return result;
}
std::string Certificate::getPublicKeyString() const
{
- std::unique_ptr<BIO, std::function<int(BIO*)>>
- b(BIO_new(BIO_s_mem()),BIO_free);
+ std::unique_ptr<BIO, std::function<int(BIO *)>>
+ b(BIO_new(BIO_s_mem()), BIO_free);
- if (!b.get())
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in BIO_new");
+ if (!b.get())
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in BIO_new");
- EVP_PKEY *pkey = X509_get_pubkey(m_x509);
- if (!pkey)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in X509_get_pubkey");
+ EVP_PKEY *pkey = X509_get_pubkey(m_x509);
- EVP_PKEY_print_public(b.get(), pkey, 16, NULL);
- EVP_PKEY_free(pkey);
+ if (!pkey)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in X509_get_pubkey");
- BUF_MEM *bptr = 0;
- BIO_get_mem_ptr(b.get(), &bptr);
- if (bptr == 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in BIO_get_mem_ptr");
+ EVP_PKEY_print_public(b.get(), pkey, 16, NULL);
+ EVP_PKEY_free(pkey);
+ BUF_MEM *bptr = 0;
+ BIO_get_mem_ptr(b.get(), &bptr);
- std::string result(bptr->data, bptr->length);
+ if (bptr == 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in BIO_get_mem_ptr");
- return result;
+ std::string result(bptr->data, bptr->length);
+ return result;
}
void Certificate::getPublicKeyDER(unsigned char **pubkey, size_t *len) const
{
- if (pubkey == NULL || len == NULL)
- VcoreThrowMsg(Certificate::Exception::WrongParamError, "Wrong parameter");
+ if (pubkey == NULL || len == NULL)
+ VcoreThrowMsg(Certificate::Exception::WrongParamError, "Wrong parameter");
- EVP_PKEY *pkey = X509_get_pubkey(m_x509);
- unsigned char *_pubkey = NULL;
- int _len = i2d_PUBKEY(pkey, &_pubkey);
- EVP_PKEY_free(pkey);
+ EVP_PKEY *pkey = X509_get_pubkey(m_x509);
+ unsigned char *_pubkey = NULL;
+ int _len = i2d_PUBKEY(pkey, &_pubkey);
+ EVP_PKEY_free(pkey);
- if (_pubkey == NULL || _len == 0)
- VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
- "Error in i2d_PUBKEY");
+ if (_pubkey == NULL || _len == 0)
+ VcoreThrowMsg(Certificate::Exception::OpensslInternalError,
+ "Error in i2d_PUBKEY");
- *pubkey = _pubkey;
- *len = static_cast<size_t>(_len);
+ *pubkey = _pubkey;
+ *len = static_cast<size_t>(_len);
}
std::string Certificate::getPublicKeyAlgoString() const
{
- return std::string(static_cast<const char *>(
- OBJ_nid2ln(OBJ_obj2nid(m_x509->cert_info->key->algor->algorithm))));
+ return std::string(static_cast<const char *>(
+ OBJ_nid2ln(OBJ_obj2nid(m_x509->cert_info->key->algor->algorithm))));
}
int Certificate::isCA() const
{
- return X509_check_ca(m_x509);
+ return X509_check_ca(m_x509);
}
std::string Certificate::FingerprintToColonHex(
- const Certificate::Fingerprint &fingerprint)
-{
- std::string outString;
- char buff[8];
-
- for (size_t i = 0; i < fingerprint.size(); ++i) {
- snprintf(buff,
- sizeof(buff),
- "%02X:",
- static_cast<unsigned int>(fingerprint[i]));
- outString += buff;
- }
-
- // remove trailing ":"
- outString.erase(outString.end() - 1);
- return outString;
+ const Certificate::Fingerprint &fingerprint)
+{
+ std::string outString;
+ char buff[8];
+
+ for (size_t i = 0; i < fingerprint.size(); ++i) {
+ snprintf(buff,
+ sizeof(buff),
+ "%02X:",
+ static_cast<unsigned int>(fingerprint[i]));
+ outString += buff;
+ }
+
+ // remove trailing ":"
+ outString.erase(outString.end() - 1);
+ return outString;
}
} // namespace ValidationCore
#include "vcore/exception.h"
extern "C" {
-struct x509_st;
-typedef struct x509_st X509;
-struct X509_name_st;
-typedef struct X509_name_st X509_NAME;
+ struct x509_st;
+ typedef struct x509_st X509;
+ struct X509_name_st;
+ typedef struct X509_name_st X509_NAME;
}
namespace ValidationCore {
class Certificate : public std::enable_shared_from_this<Certificate> {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, OpensslInternalError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, Base64Error);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongParamError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError);
- };
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, OpensslInternalError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, Base64Error);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongParamError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError);
+ };
- typedef std::vector<unsigned char> Fingerprint;
+ typedef std::vector<unsigned char> Fingerprint;
- // ascii string
- typedef std::string AltName;
- typedef std::set<AltName> AltNameSet;
+ // ascii string
+ typedef std::string AltName;
+ typedef std::set<AltName> AltNameSet;
- enum FingerprintType
- {
- FINGERPRINT_MD5,
- FINGERPRINT_SHA1
- };
- enum FieldType
- {
- FIELD_ISSUER,
- FIELD_SUBJECT
- };
-
- enum FormType
- {
- FORM_DER,
- FORM_BASE64
- };
-
- static CertificatePtr createFromFile(const std::string &location);
-
- explicit Certificate(X509 *cert);
-
- explicit Certificate(const std::string &data,
- FormType form = FORM_DER);
-
- ~Certificate();
-
- // It returns pointer to internal structure!
- // Do not free this pointer!
- X509 *getX509(void) const;
-
- std::string getDER(void) const;
-
- std::string getBase64(void) const;
-
- // This const is cheating here because you have no
- // guarantee that X509_get_subject_name will not
- // change X509 object.
- bool isSignedBy(const CertificatePtr &parent) const;
-
- Fingerprint getFingerprint(FingerprintType type) const;
-
- // getName uses deprecated functions. Usage is strongly discouraged.
- // utf8 string
- std::string getOneLine(FieldType type = FIELD_SUBJECT) const;
- std::string getCommonName(FieldType type = FIELD_SUBJECT) const;
- std::string getCountryName(FieldType type = FIELD_SUBJECT) const;
- std::string getStateOrProvinceName(FieldType type = FIELD_SUBJECT) const;
- std::string getLocalityName(FieldType type = FIELD_SUBJECT) const;
- std::string getOrganizationName(FieldType type = FIELD_SUBJECT) const;
- std::string getOrganizationalUnitName(FieldType type = FIELD_SUBJECT) const;
- std::string getEmailAddres(FieldType type = FIELD_SUBJECT) const;
-
- std::string getNameHash(FieldType type = FIELD_SUBJECT) const;
-
- // TODO: UID type is unsigned char. std::string should be changed to unsigned char container
- std::string getUID(FieldType type = FIELD_SUBJECT) const;
- std::string getOCSPURL() const;
-
-
-
- // Openssl supports 9 types of alternative name filed.
- // 4 of them are "string similar" types so it is possible
- // to create more generic function.
- AltNameSet getAlternativeNameDNS() const;
-
- time_t getNotAfter() const;
-
- time_t getNotBefore() const;
-
- ASN1_TIME* getNotAfterTime() const;
-
- ASN1_TIME* getNotBeforeTime() const;
-
- /**
- * @brief This is convenient function.
- *
- * @details It can't be const function (however it doesn't change internal
- * object). For details see #isSignedBy() function description.
- */
- bool isRootCert();
-
- /**
- * @brief Gets list of CRL distribution's points URIs
- */
- std::list<std::string> getCrlUris() const;
-
- long getVersion() const;
+ enum FingerprintType {
+ FINGERPRINT_MD5,
+ FINGERPRINT_SHA1
+ };
+ enum FieldType {
+ FIELD_ISSUER,
+ FIELD_SUBJECT
+ };
- // utf8 string
- std::string getSerialNumberString() const;
- std::string getKeyUsageString() const;
- std::string getSignatureAlgorithmString() const;
- std::string getPublicKeyAlgoString() const;
- std::string getPublicKeyString() const;
- void getPublicKeyDER(unsigned char **pubkey, size_t *len) const;
+ enum FormType {
+ FORM_DER,
+ FORM_BASE64
+ };
- /*
- * 0 - not CA
- * 1 - CA
- * 2 - deprecated and not used
- * 3 - older version of CA
- * 4 - older version of CA
- * 5 - netscape CA
- */
- int isCA() const;
+ static CertificatePtr createFromFile(const std::string &location);
- static std::string FingerprintToColonHex(
- const Fingerprint &fingerprint);
+ explicit Certificate(X509 *cert);
+
+ explicit Certificate(const std::string &data,
+ FormType form = FORM_DER);
+
+ ~Certificate();
+
+ // It returns pointer to internal structure!
+ // Do not free this pointer!
+ X509 *getX509(void) const;
+
+ std::string getDER(void) const;
+
+ std::string getBase64(void) const;
+
+ // This const is cheating here because you have no
+ // guarantee that X509_get_subject_name will not
+ // change X509 object.
+ bool isSignedBy(const CertificatePtr &parent) const;
+
+ Fingerprint getFingerprint(FingerprintType type) const;
+
+ // getName uses deprecated functions. Usage is strongly discouraged.
+ // utf8 string
+ std::string getOneLine(FieldType type = FIELD_SUBJECT) const;
+ std::string getCommonName(FieldType type = FIELD_SUBJECT) const;
+ std::string getCountryName(FieldType type = FIELD_SUBJECT) const;
+ std::string getStateOrProvinceName(FieldType type = FIELD_SUBJECT) const;
+ std::string getLocalityName(FieldType type = FIELD_SUBJECT) const;
+ std::string getOrganizationName(FieldType type = FIELD_SUBJECT) const;
+ std::string getOrganizationalUnitName(FieldType type = FIELD_SUBJECT) const;
+ std::string getEmailAddres(FieldType type = FIELD_SUBJECT) const;
+
+ std::string getNameHash(FieldType type = FIELD_SUBJECT) const;
+
+ // TODO: UID type is unsigned char. std::string should be changed to unsigned char container
+ std::string getUID(FieldType type = FIELD_SUBJECT) const;
+ std::string getOCSPURL() const;
+
+
+
+ // Openssl supports 9 types of alternative name filed.
+ // 4 of them are "string similar" types so it is possible
+ // to create more generic function.
+ AltNameSet getAlternativeNameDNS() const;
+
+ time_t getNotAfter() const;
+
+ time_t getNotBefore() const;
+
+ ASN1_TIME *getNotAfterTime() const;
+
+ ASN1_TIME *getNotBeforeTime() const;
+
+ /**
+ * @brief This is convenient function.
+ *
+ * @details It can't be const function (however it doesn't change internal
+ * object). For details see #isSignedBy() function description.
+ */
+ bool isRootCert();
+
+ /**
+ * @brief Gets list of CRL distribution's points URIs
+ */
+ std::list<std::string> getCrlUris() const;
+
+ long getVersion() const;
+
+ // utf8 string
+ std::string getSerialNumberString() const;
+ std::string getKeyUsageString() const;
+ std::string getSignatureAlgorithmString() const;
+ std::string getPublicKeyAlgoString() const;
+ std::string getPublicKeyString() const;
+ void getPublicKeyDER(unsigned char **pubkey, size_t *len) const;
+
+ /*
+ * 0 - not CA
+ * 1 - CA
+ * 2 - deprecated and not used
+ * 3 - older version of CA
+ * 4 - older version of CA
+ * 5 - netscape CA
+ */
+ int isCA() const;
+
+ static std::string FingerprintToColonHex(
+ const Fingerprint &fingerprint);
protected:
- X509_NAME *getX509Name(FieldType type) const;
+ X509_NAME *getX509Name(FieldType type) const;
- // utf8 string
- std::string getField(FieldType type, int fieldNid) const;
+ // utf8 string
+ std::string getField(FieldType type, int fieldNid) const;
- X509 *m_x509;
+ X509 *m_x509;
};
} // namespace ValidationCore
inline std::string toBinaryString(int data)
{
- char buffer[sizeof(int)];
- memcpy(buffer, &data, sizeof(int));
- return std::string(buffer, sizeof(int));
+ char buffer[sizeof(int)];
+ memcpy(buffer, &data, sizeof(int));
+ return std::string(buffer, sizeof(int));
}
bool isHashMatchedName(const std::string &name, const std::string &hash)
{
CertificatePtr certPtr = Certificate::createFromFile(path);
std::string name = certPtr->getNameHash(Certificate::FIELD_SUBJECT);
-
return isHashMatchedName(name, hash);
}
{
try {
std::string hash = certPtr->getNameHash(Certificate::FIELD_ISSUER);
+ std::unique_ptr<DIR, std::function<int(DIR *)>> dp(::opendir(dir.c_str()), ::closedir);
- std::unique_ptr<DIR, std::function<int(DIR*)>> dp(::opendir(dir.c_str()), ::closedir);
if (dp.get() == NULL) {
LogError("Failed open dir[" << dir << "]");
return CertificatePtr();
}
size_t len = offsetof(struct dirent, d_name) + pathconf(dir.c_str(), _PC_NAME_MAX) + 1;
- std::unique_ptr<struct dirent, std::function<void(void*)>>
- pEntry(static_cast<struct dirent *>(::malloc(len)), ::free);
-
+ std::unique_ptr<struct dirent, std::function<void(void *)>>
+ pEntry(static_cast<struct dirent *>(::malloc(len)), ::free);
struct dirent *dirp = NULL;
int ret = 0;
+
while ((ret = readdir_r(dp.get(), pEntry.get(), &dirp)) == 0 && dirp) {
if (dirp->d_type == DT_DIR)
continue;
}
LogDebug("Found hash matched file! : " << candidatePath);
-
CertificatePtr candidate = Certificate::createFromFile(candidatePath);
+
if (candidate->getOneLine().compare(certPtr->getOneLine(Certificate::FIELD_ISSUER)) != 0)
continue;
LogWarning("cert not found by hash[" << hash << "]");
return CertificatePtr();
-
} catch (const Certificate::Exception::Base &e) {
VcoreThrowMsg(
CertificateCollection::Exception::CertificateError,
{
LogDebug("Start to get issuer from store.");
CertificatePtr found = searchCert(TZ_SYS_CA_CERTS_TIZEN, certPtr, false);
+
if (found.get() != NULL) {
LogDebug("Found issuer cert in tizen root CA dir");
return found;
namespace ValidationCore {
CertificateCollection::CertificateCollection()
- : m_collectionStatus(COLLECTION_UNSORTED)
+ : m_collectionStatus(COLLECTION_UNSORTED)
{}
void CertificateCollection::clear(void)
{
- m_collectionStatus = COLLECTION_UNSORTED;
- m_certList.clear();
+ m_collectionStatus = COLLECTION_UNSORTED;
+ m_certList.clear();
}
void CertificateCollection::load(const CertificateList &certList)
{
- m_collectionStatus = COLLECTION_UNSORTED;
- std::copy(certList.begin(),
- certList.end(),
- std::back_inserter(m_certList));
+ m_collectionStatus = COLLECTION_UNSORTED;
+ std::copy(certList.begin(),
+ certList.end(),
+ std::back_inserter(m_certList));
}
std::string CertificateCollection::toBase64String() const
{
- std::ostringstream output;
- int certNum = m_certList.size();
- output << toBinaryString(certNum);
-
- for (auto i = m_certList.begin(); i != m_certList.end(); ++i) {
- std::string derCert = (*i)->getDER();
- output << toBinaryString(derCert.size());
- output << derCert;
- }
- Base64Encoder base64;
- base64.reset();
- base64.append(output.str());
- base64.finalize();
- return base64.get();
+ std::ostringstream output;
+ int certNum = m_certList.size();
+ output << toBinaryString(certNum);
+
+ for (auto i = m_certList.begin(); i != m_certList.end(); ++i) {
+ std::string derCert = (*i)->getDER();
+ output << toBinaryString(derCert.size());
+ output << derCert;
+ }
+
+ Base64Encoder base64;
+ base64.reset();
+ base64.append(output.str());
+ base64.finalize();
+ return base64.get();
}
CertificateList CertificateCollection::getCertificateList() const
{
- return m_certList;
+ return m_certList;
}
bool CertificateCollection::isChain() const
{
- if (COLLECTION_SORTED != m_collectionStatus)
- VcoreThrowMsg(CertificateCollection::Exception::WrongUsage,
- "You must sort certificate first");
+ if (COLLECTION_SORTED != m_collectionStatus)
+ VcoreThrowMsg(CertificateCollection::Exception::WrongUsage,
+ "You must sort certificate first");
- return (COLLECTION_SORTED == m_collectionStatus) ? true : false;
+ return (COLLECTION_SORTED == m_collectionStatus) ? true : false;
}
bool CertificateCollection::sort()
{
- if (COLLECTION_UNSORTED == m_collectionStatus) {
- sortCollection();
- }
- return (COLLECTION_SORTED == m_collectionStatus) ? true : false;
+ if (COLLECTION_UNSORTED == m_collectionStatus) {
+ sortCollection();
+ }
+
+ return (COLLECTION_SORTED == m_collectionStatus) ? true : false;
}
CertificateList CertificateCollection::getChain() const
{
- if (COLLECTION_SORTED != m_collectionStatus)
- VcoreThrowMsg(CertificateCollection::Exception::WrongUsage,
- "You must sort certificates first");
+ if (COLLECTION_SORTED != m_collectionStatus)
+ VcoreThrowMsg(CertificateCollection::Exception::WrongUsage,
+ "You must sort certificates first");
- return m_certList;
+ return m_certList;
}
void CertificateCollection::sortCollection()
{
- // sorting is not necessary
- if (m_certList.empty()) {
- m_collectionStatus = COLLECTION_SORTED;
- return;
- }
-
- CertificateList sorted;
- std::map<std::string, CertificatePtr> subTransl;
- std::map<std::string, CertificatePtr> issTransl;
-
- // Sort all certificate by subject
- for (auto it = m_certList.begin(); it != m_certList.end(); ++it) {
- subTransl.insert(std::make_pair((*it)->getOneLine(), (*it)));
- }
- // We need one start certificate
- sorted.push_back(subTransl.begin()->second);
- subTransl.erase(subTransl.begin());
-
- // Get the issuer from front certificate and find certificate with this subject in subTransl.
- // Add this certificate to the front.
- while (!subTransl.empty()) {
- std::string issuer = sorted.back()->getOneLine(Certificate::FIELD_ISSUER);
- auto it = subTransl.find(issuer);
- if (it == subTransl.end()) {
- break;
- }
- sorted.push_back(it->second);
- subTransl.erase(it);
- }
-
- // Sort all certificates by issuer
- for (auto it = subTransl.begin(); it != subTransl.end(); ++it) {
- issTransl.insert(std::make_pair(it->second->getOneLine(Certificate::FIELD_ISSUER), it->second));
- }
-
- // Get the subject from last certificate and find certificate with such issuer in issTransl.
- // Add this certificate at end.
- while (!issTransl.empty()) {
- std::string sub = sorted.front()->getOneLine();
- auto it = issTransl.find(sub);
- if (it == issTransl.end()) {
- break;
- }
- sorted.push_front(it->second);
- issTransl.erase(it);
- }
-
- if (!issTransl.empty()) {
- LogWarning("Certificates don't form a valid chain.");
- m_collectionStatus = COLLECTION_CHAIN_BROKEN;
- return;
- }
-
- m_collectionStatus = COLLECTION_SORTED;
- m_certList = sorted;
+ // sorting is not necessary
+ if (m_certList.empty()) {
+ m_collectionStatus = COLLECTION_SORTED;
+ return;
+ }
+
+ CertificateList sorted;
+ std::map<std::string, CertificatePtr> subTransl;
+ std::map<std::string, CertificatePtr> issTransl;
+
+ // Sort all certificate by subject
+ for (auto it = m_certList.begin(); it != m_certList.end(); ++it) {
+ subTransl.insert(std::make_pair((*it)->getOneLine(), (*it)));
+ }
+
+ // We need one start certificate
+ sorted.push_back(subTransl.begin()->second);
+ subTransl.erase(subTransl.begin());
+
+ // Get the issuer from front certificate and find certificate with this subject in subTransl.
+ // Add this certificate to the front.
+ while (!subTransl.empty()) {
+ std::string issuer = sorted.back()->getOneLine(Certificate::FIELD_ISSUER);
+ auto it = subTransl.find(issuer);
+
+ if (it == subTransl.end()) {
+ break;
+ }
+
+ sorted.push_back(it->second);
+ subTransl.erase(it);
+ }
+
+ // Sort all certificates by issuer
+ for (auto it = subTransl.begin(); it != subTransl.end(); ++it) {
+ issTransl.insert(std::make_pair(it->second->getOneLine(Certificate::FIELD_ISSUER), it->second));
+ }
+
+ // Get the subject from last certificate and find certificate with such issuer in issTransl.
+ // Add this certificate at end.
+ while (!issTransl.empty()) {
+ std::string sub = sorted.front()->getOneLine();
+ auto it = issTransl.find(sub);
+
+ if (it == issTransl.end()) {
+ break;
+ }
+
+ sorted.push_front(it->second);
+ issTransl.erase(it);
+ }
+
+ if (!issTransl.empty()) {
+ LogWarning("Certificates don't form a valid chain.");
+ m_collectionStatus = COLLECTION_CHAIN_BROKEN;
+ return;
+ }
+
+ m_collectionStatus = COLLECTION_SORTED;
+ m_certList = sorted;
}
/*
*/
bool CertificateCollection::completeCertificateChain()
{
- CertificatePtr last = m_certList.back();
- if (last->isRootCert())
- return true;
+ CertificatePtr last = m_certList.back();
- CertificatePtr rootCert = getIssuerCertFromStore(last);
+ if (last->isRootCert())
+ return true;
- if (!rootCert.get())
- return false;
+ CertificatePtr rootCert = getIssuerCertFromStore(last);
- if (!rootCert->isRootCert())
- return false;
+ if (!rootCert.get())
+ return false;
- m_certList.push_back(rootCert);
- return true;
+ if (!rootCert->isRootCert())
+ return false;
+
+ m_certList.push_back(rootCert);
+ return true;
}
-size_t CertificateCollection::size() const {
- return m_certList.size();
+size_t CertificateCollection::size() const
+{
+ return m_certList.size();
}
-bool CertificateCollection::empty() const {
- return m_certList.empty();
+bool CertificateCollection::empty() const
+{
+ return m_certList.empty();
}
-CertificateCollection::const_iterator CertificateCollection::begin() const {
- return m_certList.begin();
+CertificateCollection::const_iterator CertificateCollection::begin() const
+{
+ return m_certList.begin();
}
-CertificateCollection::const_iterator CertificateCollection::end() const {
- return m_certList.end();
+CertificateCollection::const_iterator CertificateCollection::end() const
+{
+ return m_certList.end();
}
-CertificatePtr CertificateCollection::back() const {
- return m_certList.back();
+CertificatePtr CertificateCollection::back() const
+{
+ return m_certList.back();
}
} // namespace ValidationCore
class CertificateCollection {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, CertificateError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongUsage);
- };
-
- CertificateCollection();
-
- typedef CertificateList::const_iterator const_iterator;
-
- /*
- * Remove all certificates from collection.
- */
- void clear();
-
- /*
- * In current implemenation this function MUST success.
- *
- * This function will add new certificate to collection.
- * This function DOES NOT clean collection.
- */
- void load(const CertificateList &certList);
-
- /*
- * This function will return all certificates from
- * collection encoded in base64 format.
- */
- std::string toBase64String() const;
-
- /*
- * This will return all certificate from collection.
- */
- CertificateList getCertificateList() const;
-
- /*
- * This function will return true if certificates
- * in in this structure were sorted and create
- * certificate chain.
-
- * Note: You MUST sort certificates first.
- */
- bool isChain() const;
-
- /*
- * This function will return true if all certificate are
- * able to create certificate chain.
- *
- * This function will sort certificates if collection
- * is not sorted.
- *
- * Note: This function will make all iterators invalid.
- */
- bool sort();
-
- /*
- * Precondition : cert list sorted and has more than on cert.
- * This function add root cert in cert list to complete cert chain
- */
- bool completeCertificateChain();
-
- /*
- * This function will return Certificate chain.
- *
- * First certificate on the list is EndEntity certificate.
- *
- * Last certificate on the list is RootCA certificate or
- * CA certificate if RootCA is not present.
- *
- * Note: You MUST sort certificates first and
- * check if certificates creates proper chain.
- */
- CertificateList getChain() const;
-
- /*
- * It returns size of certificate collection.
- */
- size_t size() const;
-
- /*
- * Return true if collection is empty.
- */
- bool empty() const;
-
- /*
- * This will return end iterator to internal collection.
- *
- * Note: this iterator will lose validity if you call non const
- * method on CertificateCollection class.
- */
- const_iterator begin() const;
-
- /*
- * This will return end iterator to internal collection.
- *
- * Note: this iterator will lose validity if you call non const
- * method on CertificateCollection class.
- */
- const_iterator end() const;
-
- /*
- * This function will return the last certificate from collection.
- *
- * Note: There is no point to call this function if certificate
- * collection is not sorted!
- */
- CertificatePtr back() const;
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, InternalError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, CertificateError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongUsage);
+ };
+
+ CertificateCollection();
+
+ typedef CertificateList::const_iterator const_iterator;
+
+ /*
+ * Remove all certificates from collection.
+ */
+ void clear();
+
+ /*
+ * In current implemenation this function MUST success.
+ *
+ * This function will add new certificate to collection.
+ * This function DOES NOT clean collection.
+ */
+ void load(const CertificateList &certList);
+
+ /*
+ * This function will return all certificates from
+ * collection encoded in base64 format.
+ */
+ std::string toBase64String() const;
+
+ /*
+ * This will return all certificate from collection.
+ */
+ CertificateList getCertificateList() const;
+
+ /*
+ * This function will return true if certificates
+ * in in this structure were sorted and create
+ * certificate chain.
+
+ * Note: You MUST sort certificates first.
+ */
+ bool isChain() const;
+
+ /*
+ * This function will return true if all certificate are
+ * able to create certificate chain.
+ *
+ * This function will sort certificates if collection
+ * is not sorted.
+ *
+ * Note: This function will make all iterators invalid.
+ */
+ bool sort();
+
+ /*
+ * Precondition : cert list sorted and has more than on cert.
+ * This function add root cert in cert list to complete cert chain
+ */
+ bool completeCertificateChain();
+
+ /*
+ * This function will return Certificate chain.
+ *
+ * First certificate on the list is EndEntity certificate.
+ *
+ * Last certificate on the list is RootCA certificate or
+ * CA certificate if RootCA is not present.
+ *
+ * Note: You MUST sort certificates first and
+ * check if certificates creates proper chain.
+ */
+ CertificateList getChain() const;
+
+ /*
+ * It returns size of certificate collection.
+ */
+ size_t size() const;
+
+ /*
+ * Return true if collection is empty.
+ */
+ bool empty() const;
+
+ /*
+ * This will return end iterator to internal collection.
+ *
+ * Note: this iterator will lose validity if you call non const
+ * method on CertificateCollection class.
+ */
+ const_iterator begin() const;
+
+ /*
+ * This will return end iterator to internal collection.
+ *
+ * Note: this iterator will lose validity if you call non const
+ * method on CertificateCollection class.
+ */
+ const_iterator end() const;
+
+ /*
+ * This function will return the last certificate from collection.
+ *
+ * Note: There is no point to call this function if certificate
+ * collection is not sorted!
+ */
+ CertificatePtr back() const;
protected:
- void sortCollection(void);
-
- enum CollectionStatus
- {
- // Certificate collection are not sorted in any way
- COLLECTION_UNSORTED,
- // Certificate collection creates certificate chain
- COLLECTION_SORTED,
- // Cerfificate collection is not able to create certificate chain
- COLLECTION_CHAIN_BROKEN,
- };
-
- CollectionStatus m_collectionStatus;
- CertificateList m_certList;
+ void sortCollection(void);
+
+ enum CollectionStatus {
+ // Certificate collection are not sorted in any way
+ COLLECTION_UNSORTED,
+ // Certificate collection creates certificate chain
+ COLLECTION_SORTED,
+ // Cerfificate collection is not able to create certificate chain
+ COLLECTION_CHAIN_BROKEN,
+ };
+
+ CollectionStatus m_collectionStatus;
+ CertificateList m_certList;
};
typedef std::list<CertificateCollection> CertificateCollectionList;
int hexCharToInt(char c)
{
- if (c >= 'a' && c <= 'f') {
- return 10 + static_cast<int>(c) - 'a';
- }
- if (c >= 'A' && c <= 'F') {
- return 10 + static_cast<int>(c) - 'A';
- }
- if (c >= '0' && c <= '9') {
- return static_cast<int>(c) - '0';
- }
- return c;
+ if (c >= 'a' && c <= 'f') {
+ return 10 + static_cast<int>(c) - 'a';
+ }
+
+ if (c >= 'A' && c <= 'F') {
+ return 10 + static_cast<int>(c) - 'A';
+ }
+
+ if (c >= '0' && c <= '9') {
+ return static_cast<int>(c) - '0';
+ }
+
+ return c;
}
} // anonymous namespace
namespace ValidationCore {
CertificateConfigReader::CertificateConfigReader()
- : m_certificateDomain(0)
- , m_parserSchema(this)
+ : m_certificateDomain(0)
+ , m_parserSchema(this)
{
- m_parserSchema.addBeginTagCallback(
- TOKEN_CERTIFICATE_SET,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::blankFunction);
-
- m_parserSchema.addBeginTagCallback(
- TOKEN_CERTIFICATE_DOMAIN,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::tokenCertificateDomain);
-
- m_parserSchema.addBeginTagCallback(
- TOKEN_FINGERPRINT_SHA1,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::blankFunction);
-
- m_parserSchema.addEndTagCallback(
- TOKEN_CERTIFICATE_SET,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::blankFunction);
-
- m_parserSchema.addEndTagCallback(
- TOKEN_CERTIFICATE_DOMAIN,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::blankFunction);
-
- m_parserSchema.addEndTagCallback(
- TOKEN_FINGERPRINT_SHA1,
- XML_EMPTY_NAMESPACE,
- &CertificateConfigReader::tokenEndFingerprintSHA1);
+ m_parserSchema.addBeginTagCallback(
+ TOKEN_CERTIFICATE_SET,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(
+ TOKEN_CERTIFICATE_DOMAIN,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::tokenCertificateDomain);
+ m_parserSchema.addBeginTagCallback(
+ TOKEN_FINGERPRINT_SHA1,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::blankFunction);
+ m_parserSchema.addEndTagCallback(
+ TOKEN_CERTIFICATE_SET,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::blankFunction);
+ m_parserSchema.addEndTagCallback(
+ TOKEN_CERTIFICATE_DOMAIN,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::blankFunction);
+ m_parserSchema.addEndTagCallback(
+ TOKEN_FINGERPRINT_SHA1,
+ XML_EMPTY_NAMESPACE,
+ &CertificateConfigReader::tokenEndFingerprintSHA1);
}
void CertificateConfigReader::initialize(
- const std::string &file,
- const std::string &scheme)
+ const std::string &file,
+ const std::string &scheme)
{
- m_parserSchema.initialize(file, true, SaxReader::VALIDATION_XMLSCHEME, scheme);
+ m_parserSchema.initialize(file, true, SaxReader::VALIDATION_XMLSCHEME, scheme);
}
void CertificateConfigReader::read(CertificateIdentifier &identificator)
{
- m_parserSchema.read(identificator);
+ m_parserSchema.read(identificator);
}
void CertificateConfigReader::blankFunction(CertificateIdentifier &)
void CertificateConfigReader::tokenCertificateDomain(CertificateIdentifier &)
{
- std::string name = m_parserSchema.getReader().attribute(TOKEN_ATTR_NAME);
-
- if (name.empty()) {
- VcoreThrowMsg(CertificateConfigReader::Exception::InvalidFile,
- "Invalid fingerprint file. Domain name is mandatory");
- } else if (name == TOKEN_VALUE_TIZEN_DEVELOPER) {
- m_certificateDomain = CertStoreId::TIZEN_DEVELOPER;
- } else if (name == TOKEN_VALUE_TIZEN_TEST) {
- m_certificateDomain = CertStoreId::TIZEN_TEST;
- } else if (name == TOKEN_VALUE_TIZEN_VERIFY) {
- m_certificateDomain = CertStoreId::TIZEN_VERIFY;
- } else if (name == TOKEN_VALUE_TIZEN_STORE) {
- m_certificateDomain = CertStoreId::TIZEN_STORE;
- } else if (name == TOKEN_VALUE_VISIBILITY_PUBLIC) {
- m_certificateDomain = CertStoreId::VIS_PUBLIC;
- } else if (name == TOKEN_VALUE_VISIBILITY_PARTNER) {
- m_certificateDomain = CertStoreId::VIS_PARTNER;
- } else if (name == TOKEN_VALUE_VISIBILITY_PLATFORM) {
- m_certificateDomain = CertStoreId::VIS_PLATFORM;
- } else {
- m_certificateDomain = 0;
- }
+ std::string name = m_parserSchema.getReader().attribute(TOKEN_ATTR_NAME);
+
+ if (name.empty()) {
+ VcoreThrowMsg(CertificateConfigReader::Exception::InvalidFile,
+ "Invalid fingerprint file. Domain name is mandatory");
+ } else if (name == TOKEN_VALUE_TIZEN_DEVELOPER) {
+ m_certificateDomain = CertStoreId::TIZEN_DEVELOPER;
+ } else if (name == TOKEN_VALUE_TIZEN_TEST) {
+ m_certificateDomain = CertStoreId::TIZEN_TEST;
+ } else if (name == TOKEN_VALUE_TIZEN_VERIFY) {
+ m_certificateDomain = CertStoreId::TIZEN_VERIFY;
+ } else if (name == TOKEN_VALUE_TIZEN_STORE) {
+ m_certificateDomain = CertStoreId::TIZEN_STORE;
+ } else if (name == TOKEN_VALUE_VISIBILITY_PUBLIC) {
+ m_certificateDomain = CertStoreId::VIS_PUBLIC;
+ } else if (name == TOKEN_VALUE_VISIBILITY_PARTNER) {
+ m_certificateDomain = CertStoreId::VIS_PARTNER;
+ } else if (name == TOKEN_VALUE_VISIBILITY_PLATFORM) {
+ m_certificateDomain = CertStoreId::VIS_PLATFORM;
+ } else {
+ m_certificateDomain = 0;
+ }
}
void CertificateConfigReader::tokenEndFingerprintSHA1(
- CertificateIdentifier &identificator)
+ CertificateIdentifier &identificator)
{
- std::string text = m_parserSchema.getText();
- text += ":"; // add guard at the end of fingerprint
- Certificate::Fingerprint fingerprint;
- int s = 0;
- int byteDescLen = 0;
- for (size_t i = 0; i < text.size(); ++i) {
- if (isxdigit(text[i])) {
- s <<= 4;
- s += hexCharToInt(text[i]);
- byteDescLen++;
- if (byteDescLen > 2) {
- Assert(0 && "Unsupported fingerprint format in xml file.");
- }
- } else if (text[i] == ':') {
- fingerprint.push_back(static_cast<unsigned char>(s));
- s = 0;
- byteDescLen = 0;
- } else {
- Assert(0 && "Unussported fingerprint format in xml file.");
- }
- }
-
- identificator.add(fingerprint, m_certificateDomain);
+ std::string text = m_parserSchema.getText();
+ text += ":"; // add guard at the end of fingerprint
+ Certificate::Fingerprint fingerprint;
+ int s = 0;
+ int byteDescLen = 0;
+
+ for (size_t i = 0; i < text.size(); ++i) {
+ if (isxdigit(text[i])) {
+ s <<= 4;
+ s += hexCharToInt(text[i]);
+ byteDescLen++;
+
+ if (byteDescLen > 2) {
+ Assert(0 && "Unsupported fingerprint format in xml file.");
+ }
+ } else if (text[i] == ':') {
+ fingerprint.push_back(static_cast<unsigned char>(s));
+ s = 0;
+ byteDescLen = 0;
+ } else {
+ Assert(0 && "Unussported fingerprint format in xml file.");
+ }
+ }
+
+ identificator.add(fingerprint, m_certificateDomain);
}
} // namespace ValidationCore
namespace ValidationCore {
class CertificateConfigReader {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, InvalidFile);
- };
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, InvalidFile);
+ };
- CertificateConfigReader();
+ CertificateConfigReader();
- void initialize(const std::string &file, const std::string &scheme);
- void read(CertificateIdentifier &identificator);
+ void initialize(const std::string &file, const std::string &scheme);
+ void read(CertificateIdentifier &identificator);
private:
- void blankFunction(CertificateIdentifier &);
- void tokenCertificateDomain(CertificateIdentifier &identificator);
- void tokenEndFingerprintSHA1(CertificateIdentifier &identificator);
+ void blankFunction(CertificateIdentifier &);
+ void tokenCertificateDomain(CertificateIdentifier &identificator);
+ void tokenEndFingerprintSHA1(CertificateIdentifier &identificator);
- CertStoreId::Type m_certificateDomain;
- ParserSchema<CertificateConfigReader, CertificateIdentifier> m_parserSchema;
+ CertStoreId::Type m_certificateDomain;
+ ParserSchema<CertificateConfigReader, CertificateIdentifier> m_parserSchema;
};
} // namespace ValidationCore
#ifndef \
_WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_CERTIFICATEIDENTIFICATOR_H_
#define \
- _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_CERTIFICATEIDENTIFICATOR_H_
+ _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_CERTIFICATEIDENTIFICATOR_H_
#include <map>
#include <dpl/noncopyable.h>
public:
typedef std::map<Certificate::Fingerprint, CertStoreId::Set> FingerPrintMap;
- CertificateIdentifier()
- {
- }
- ~CertificateIdentifier()
- {
- }
+ CertificateIdentifier()
+ {
+ }
+ ~CertificateIdentifier()
+ {
+ }
+
+ void add(const Certificate::Fingerprint &fingerprint,
+ CertStoreId::Type domain)
+ {
+ fingerPrintMap[fingerprint].add(domain);
+ }
+
+ CertStoreId::Set find(const Certificate::Fingerprint &fingerprint) const
+ {
+ FingerPrintMap::const_iterator iter = fingerPrintMap.find(fingerprint);
- void add(const Certificate::Fingerprint &fingerprint,
- CertStoreId::Type domain)
- {
- fingerPrintMap[fingerprint].add(domain);
- }
+ if (iter == fingerPrintMap.end()) {
+ return CertStoreId::Set();
+ }
- CertStoreId::Set find(const Certificate::Fingerprint &fingerprint) const
- {
- FingerPrintMap::const_iterator iter = fingerPrintMap.find(fingerprint);
- if (iter == fingerPrintMap.end()) {
- return CertStoreId::Set();
- }
- return iter->second;
- }
+ return iter->second;
+ }
- CertStoreId::Set find(const CertificatePtr &certificate) const
- {
- return find(certificate->getFingerprint(Certificate::FINGERPRINT_SHA1));
- }
+ CertStoreId::Set find(const CertificatePtr &certificate) const
+ {
+ return find(certificate->getFingerprint(Certificate::FINGERPRINT_SHA1));
+ }
private:
- FingerPrintMap fingerPrintMap;
+ FingerPrintMap fingerPrintMap;
};
} // namespace ValidationCore
namespace ValidationCore {
CertificateLoader::CertificateLoaderResult CertificateLoader::
- loadCertificateBasedOnExponentAndModulus(const std::string &m_modulus,
- const std::string &m_exponent)
+loadCertificateBasedOnExponentAndModulus(const std::string &m_modulus,
+ const std::string &m_exponent)
{
- (void) m_modulus;
- (void) m_exponent;
- LogError("Not implemented.");
- return UNKNOWN_ERROR;
+ (void) m_modulus;
+ (void) m_exponent;
+ LogError("Not implemented.");
+ return UNKNOWN_ERROR;
}
CertificateLoader::CertificateLoaderResult CertificateLoader::loadCertificate(
- const std::string &storageName,
- CertificateLoader::CertificateLoaderComparator *cmp)
+ const std::string &storageName,
+ CertificateLoader::CertificateLoaderComparator *cmp)
{
- (void) storageName;
- (void) cmp;
- LogError("Not Implemented");
- return UNKNOWN_ERROR;
+ (void) storageName;
+ (void) cmp;
+ LogError("Not Implemented");
+ return UNKNOWN_ERROR;
}
CertificateLoader::CertificateLoaderResult CertificateLoader::
- loadCertificateBasedOnSubjectName(const std::string &subjectName)
+loadCertificateBasedOnSubjectName(const std::string &subjectName)
{
- (void) subjectName;
- LogError("Not implemented.");
- return UNKNOWN_ERROR;
+ (void) subjectName;
+ LogError("Not implemented.");
+ return UNKNOWN_ERROR;
}
CertificateLoader::CertificateLoaderResult CertificateLoader::
- loadCertificateWithECKEY(const std::string &curveName,
- const std::string &publicKey)
+loadCertificateWithECKEY(const std::string &curveName,
+ const std::string &publicKey)
{
- (void) curveName;
- (void) publicKey;
- LogError("Not implemented.");
- return UNKNOWN_ERROR;
+ (void) curveName;
+ (void) publicKey;
+ LogError("Not implemented.");
+ return UNKNOWN_ERROR;
}
-CertificateLoader::CertificateLoaderResult CertificateLoader::loadCertificateFromRawData(const std::string &rawData)
+CertificateLoader::CertificateLoaderResult CertificateLoader::loadCertificateFromRawData(
+ const std::string &rawData)
{
- VcoreTry {
- m_certificatePtr = CertificatePtr(new Certificate(rawData, Certificate::FORM_BASE64));
- } VcoreCatch(Certificate::Exception::Base) {
- LogWarning("Error reading certificate by openssl.");
- return UNKNOWN_ERROR;
- }
-
- // Check the key length if sig algorithm is RSA
- EVP_PKEY *pKey = X509_get_pubkey(m_certificatePtr->getX509());
-
- if (pKey != NULL) {
- if (pKey->type == EVP_PKEY_RSA) {
- RSA* pRSA = pKey->pkey.rsa;
-
- if (pRSA) {
- int keyLength = RSA_size(pRSA);
-
- // key Length (modulus) is in bytes
- keyLength <<= 3;
- LogDebug("RSA key length: " << keyLength << " bits");
-
- if (keyLength < MIN_RSA_KEY_LENGTH) {
- LogError("RSA key too short! Has only " << keyLength << " bits");
- return CERTIFICATE_SECURITY_ERROR;
- }
- }
- }
- }
-
- return NO_ERROR;
+ VcoreTry {
+ m_certificatePtr = CertificatePtr(new Certificate(rawData, Certificate::FORM_BASE64));
+ } VcoreCatch(Certificate::Exception::Base) {
+ LogWarning("Error reading certificate by openssl.");
+ return UNKNOWN_ERROR;
+ }
+ // Check the key length if sig algorithm is RSA
+ EVP_PKEY *pKey = X509_get_pubkey(m_certificatePtr->getX509());
+
+ if (pKey != NULL) {
+ if (pKey->type == EVP_PKEY_RSA) {
+ RSA *pRSA = pKey->pkey.rsa;
+
+ if (pRSA) {
+ int keyLength = RSA_size(pRSA);
+ // key Length (modulus) is in bytes
+ keyLength <<= 3;
+ LogDebug("RSA key length: " << keyLength << " bits");
+
+ if (keyLength < MIN_RSA_KEY_LENGTH) {
+ LogError("RSA key too short! Has only " << keyLength << " bits");
+ return CERTIFICATE_SECURITY_ERROR;
+ }
+ }
+ }
+ }
+
+ return NO_ERROR;
}
CertificateLoader::CertificateLoaderResult CertificateLoader::
- loadCertificateBasedOnDSAComponents(const std::string& strP,
- const std::string& strQ,
- const std::string& strG,
- const std::string& strY,
- const std::string& strJ,
- const std::string& strSeed,
- const std::string& strPGenCounter)
+loadCertificateBasedOnDSAComponents(const std::string &strP,
+ const std::string &strQ,
+ const std::string &strG,
+ const std::string &strY,
+ const std::string &strJ,
+ const std::string &strSeed,
+ const std::string &strPGenCounter)
{
- (void) strP;
- (void) strQ;
- (void) strG;
- (void) strY;
- (void) strJ;
- (void) strSeed;
- (void) strPGenCounter;
- LogError("Not implemented.");
- return UNKNOWN_ERROR;
+ (void) strP;
+ (void) strQ;
+ (void) strG;
+ (void) strY;
+ (void) strJ;
+ (void) strSeed;
+ (void) strPGenCounter;
+ LogError("Not implemented.");
+ return UNKNOWN_ERROR;
}
-bool CertificateLoader::convertBase64NodeToBigNum(const std::string& strNode,
- BIGNUM** ppBigNum)
+bool CertificateLoader::convertBase64NodeToBigNum(const std::string &strNode,
+ BIGNUM **ppBigNum)
{
- (void) strNode;
- (void) ppBigNum;
- LogError("Not implemented.");
- return false;
+ (void) strNode;
+ (void) ppBigNum;
+ LogError("Not implemented.");
+ return false;
}
} // namespace ValidationCore
#include <vcore/Certificate.h>
namespace ValidationCore {
-class CertificateLoader : public VcoreDPL::Noncopyable
-{
- public:
- class CertificateLoaderComparator
- {
- public:
- virtual bool compare(X509 *x509cert) = 0;
- virtual ~CertificateLoaderComparator()
- {
- }
- };
-
- enum CertificateLoaderResult
- {
- NO_ERROR,
- CERTIFICATE_NOT_FOUND,
- UNSUPPORTED_CERTIFICATE_FIELD,
- WRONG_ARGUMENTS,
- CERTIFICATE_SECURITY_ERROR, //!< there are some issues with certificate security (i.e. key too short)
- UNKNOWN_ERROR
- };
-
- CertificateLoader()
- {
- }
-
- virtual ~CertificateLoader()
- {
- }
-
- CertificateLoaderResult loadCertificate(const std::string& storage,
- CertificateLoaderComparator *cmp);
-
- CertificateLoaderResult loadCertificateBasedOnSubjectName(
- const std::string &subjectName);
- CertificateLoaderResult loadCertificateBasedOnExponentAndModulus(
- const std::string &m_modulus,
- const std::string &m_exponent);
- // KW CertificateLoaderResult loadCertificateBasedOnIssuerName(const std::string &isserName,
- // KW const std::string &serialNumber);
-
- CertificateLoaderResult loadCertificateFromRawData(
- const std::string &rawData);
-
- CertificateLoaderResult loadCertificateBasedOnDSAComponents(
- const std::string& strP,
- const std::string& strQ,
- const std::string& strG,
- const std::string& strY,
- const std::string& strJ,
- const std::string& strSeed,
- const std::string& strPGenCounter);
-
- CertificateLoaderResult loadCertificateWithECKEY(
- const std::string &curveName,
- const std::string &publicKey);
-
- /**
- * converts base64 encoded node to SSL bignum
- * allocates mem on *ppBigNum, don't forget to free it later with BN_free!
- * returns conversion status
- */
- static bool convertBase64NodeToBigNum(const std::string& strNode,
- BIGNUM** ppBigNum);
-
- /*
- * encodes SSL bignum into base64 octstring
- * returns conversion status
- */
- // KW static bool convertBigNumToBase64Node(const BIGNUM* pBigNum, std::string& strNode);
-
- CertificatePtr getCertificatePtr() const
- {
- return m_certificatePtr;
- }
- private:
- CertificatePtr m_certificatePtr;
+class CertificateLoader : public VcoreDPL::Noncopyable {
+public:
+ class CertificateLoaderComparator {
+ public:
+ virtual bool compare(X509 *x509cert) = 0;
+ virtual ~CertificateLoaderComparator()
+ {
+ }
+ };
+
+ enum CertificateLoaderResult {
+ NO_ERROR,
+ CERTIFICATE_NOT_FOUND,
+ UNSUPPORTED_CERTIFICATE_FIELD,
+ WRONG_ARGUMENTS,
+ CERTIFICATE_SECURITY_ERROR, //!< there are some issues with certificate security (i.e. key too short)
+ UNKNOWN_ERROR
+ };
+
+ CertificateLoader()
+ {
+ }
+
+ virtual ~CertificateLoader()
+ {
+ }
+
+ CertificateLoaderResult loadCertificate(const std::string &storage,
+ CertificateLoaderComparator *cmp);
+
+ CertificateLoaderResult loadCertificateBasedOnSubjectName(
+ const std::string &subjectName);
+ CertificateLoaderResult loadCertificateBasedOnExponentAndModulus(
+ const std::string &m_modulus,
+ const std::string &m_exponent);
+ // KW CertificateLoaderResult loadCertificateBasedOnIssuerName(const std::string &isserName,
+ // KW const std::string &serialNumber);
+
+ CertificateLoaderResult loadCertificateFromRawData(
+ const std::string &rawData);
+
+ CertificateLoaderResult loadCertificateBasedOnDSAComponents(
+ const std::string &strP,
+ const std::string &strQ,
+ const std::string &strG,
+ const std::string &strY,
+ const std::string &strJ,
+ const std::string &strSeed,
+ const std::string &strPGenCounter);
+
+ CertificateLoaderResult loadCertificateWithECKEY(
+ const std::string &curveName,
+ const std::string &publicKey);
+
+ /**
+ * converts base64 encoded node to SSL bignum
+ * allocates mem on *ppBigNum, don't forget to free it later with BN_free!
+ * returns conversion status
+ */
+ static bool convertBase64NodeToBigNum(const std::string &strNode,
+ BIGNUM **ppBigNum);
+
+ /*
+ * encodes SSL bignum into base64 octstring
+ * returns conversion status
+ */
+ // KW static bool convertBigNumToBase64Node(const BIGNUM* pBigNum, std::string& strNode);
+
+ CertificatePtr getCertificatePtr() const
+ {
+ return m_certificatePtr;
+ }
+private:
+ CertificatePtr m_certificatePtr;
};
} // namespace ValidationCore
void initialize_req_data(VcoreRequestData *pData)
{
- memset(pData->gname, 0, VCORE_MAX_FILENAME_SIZE+1);
- memset(pData->common_name, 0, VCORE_MAX_FILENAME_SIZE+1);
- memset(pData->private_key_gname, 0, VCORE_MAX_FILENAME_SIZE+1);
- memset(pData->associated_gname, 0, VCORE_MAX_FILENAME_SIZE+1);
+ memset(pData->gname, 0, VCORE_MAX_FILENAME_SIZE + 1);
+ memset(pData->common_name, 0, VCORE_MAX_FILENAME_SIZE + 1);
+ memset(pData->private_key_gname, 0, VCORE_MAX_FILENAME_SIZE + 1);
+ memset(pData->associated_gname, 0, VCORE_MAX_FILENAME_SIZE + 1);
memset(pData->dataBlock, 0, VCORE_MAX_SEND_DATA_SIZE);
pData->certStatus = DISABLED;
pData->storeType = NONE_STORE;
- pData->reqType = (VcoreRequestType)-1;
+ pData->reqType = (VcoreRequestType) - 1;
pData->dataBlockLen = 0;
pData->is_root_app = -1;
pData->certType = INVALID_DATA;
return NULL;
node = (CertSvcStoreCertList *)malloc(sizeof(CertSvcStoreCertList));
+
if (node == NULL)
return NULL;
int offset = 0;
int remaining = length;
int read_len = 0;
- while(remaining > 0) {
+
+ while (remaining > 0) {
read_len = recv(sockfd, buff + offset, remaining, 0);
- if(read_len <= 0)
+
+ if (read_len <= 0)
return offset;
+
remaining -= read_len;
offset += read_len;
}
+
return offset;
}
-VcoreRequestData* set_request_data(
+VcoreRequestData *set_request_data(
VcoreRequestType reqType,
CertStoreType storeType,
int is_root_app,
CertType certType,
CertStatus certStatus)
{
- VcoreRequestData* pReqData = (VcoreRequestData*)malloc(sizeof(VcoreRequestData));
+ VcoreRequestData *pReqData = (VcoreRequestData *)malloc(sizeof(VcoreRequestData));
+
if (!pReqData) {
LogError("Failed to malloc VcoreRequestData");
return NULL;
}
- initialize_req_data(pReqData);
+ initialize_req_data(pReqData);
pReqData->reqType = reqType;
pReqData->storeType = (CertStoreType) storeType;
pReqData->dataBlockLen = dataLen;
free(pReqData);
return NULL;
}
+
strncpy(pReqData->gname, pGroupName, VCORE_MAX_FILENAME_SIZE);
pReqData->gname[strlen(pGroupName)] = '\0';
}
free(pReqData);
return NULL;
}
+
strncpy(pReqData->common_name, common_name, VCORE_MAX_FILENAME_SIZE);
pReqData->common_name[strlen(common_name)] = '\0';
}
free(pReqData);
return NULL;
}
+
strncpy(pReqData->private_key_gname, private_key_gname, VCORE_MAX_FILENAME_SIZE);
pReqData->private_key_gname[strlen(private_key_gname)] = '\0';
}
free(pReqData);
return NULL;
}
+
strncpy(pReqData->associated_gname, associated_gname, VCORE_MAX_FILENAME_SIZE);
pReqData->associated_gname[strlen(associated_gname)] = '\0';
}
free(pReqData);
return NULL;
}
+
memcpy(pReqData->dataBlock, pData, dataLen);
}
+
return pReqData;
}
-VcoreResponseData cert_svc_client_comm(VcoreRequestData *pClientData) {
+VcoreResponseData cert_svc_client_comm(VcoreRequestData *pClientData)
+{
int sockfd = 0;
int clientLen = 0;
int tempSockLen = 0;
strncpy(clientaddr.sun_path, VCORE_SOCK_PATH, tempSockLen);
clientaddr.sun_path[tempSockLen] = '\0';
clientLen = sizeof(clientaddr);
-
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
- if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
+ if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
LogError("Error in Set SO_RCVTIMEO Socket Option");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
- if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
+ if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) {
LogError("Error in Set SO_SNDTIMEO Socket Option");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
- if (connect(sockfd, (struct sockaddr*)&clientaddr, clientLen) < 0) {
+ if (connect(sockfd, (struct sockaddr *)&clientaddr, clientLen) < 0) {
LogError("Error in function connect()..");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
- if (write(sockfd, (char*)pClientData, sizeof(VcoreRequestData)) < 0) {
+ if (write(sockfd, (char *)pClientData, sizeof(VcoreRequestData)) < 0) {
LogError("Error in function write()..");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
- read_len = _recv_fixed_lenghth(sockfd, (char*)&recvData, sizeof(recvData));
+ read_len = _recv_fixed_lenghth(sockfd, (char *)&recvData, sizeof(recvData));
+
if (read_len < 0) {
LogError("Error in function read()..");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
- if(recvData.certCount > 0) {
- recvData.certList = (VcoreCertResponseData *) malloc(recvData.certCount * sizeof(VcoreCertResponseData));
+ if (recvData.certCount > 0) {
+ recvData.certList = (VcoreCertResponseData *) malloc(recvData.certCount * sizeof(
+ VcoreCertResponseData));
+
if (!recvData.certList) {
LogError("Failed to allocate memory");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
+
memset(recvData.certList, 0x00, recvData.certCount * sizeof(VcoreCertResponseData));
- for(i=0; i<recvData.certCount; i++) {
- read_len = _recv_fixed_lenghth(sockfd, (char*)(recvData.certList + i), sizeof(VcoreCertResponseData));
+
+ for (i = 0; i < recvData.certCount; i++) {
+ read_len = _recv_fixed_lenghth(sockfd, (char *)(recvData.certList + i),
+ sizeof(VcoreCertResponseData));
+
if (read_len < 0) {
LogError("Error in function read()..");
recvData.result = VCORE_SOCKET_ERROR;
}
}
- if(recvData.certBlockCount > 0) {
- recvData.certBlockList = (ResponseCertBlock *) malloc(recvData.certBlockCount * sizeof(ResponseCertBlock));
+ if (recvData.certBlockCount > 0) {
+ recvData.certBlockList = (ResponseCertBlock *) malloc(recvData.certBlockCount * sizeof(
+ ResponseCertBlock));
+
if (!recvData.certBlockList) {
LogError("Failed to allocate memory");
recvData.result = VCORE_SOCKET_ERROR;
goto Error_close_exit;
}
+
memset(recvData.certBlockList, 0x00, recvData.certBlockCount * sizeof(ResponseCertBlock));
- for(i=0; i<recvData.certBlockCount; i++) {
- read_len = _recv_fixed_lenghth(sockfd, (char*)(recvData.certBlockList + i), sizeof(ResponseCertBlock));
+
+ for (i = 0; i < recvData.certBlockCount; i++) {
+ read_len = _recv_fixed_lenghth(sockfd, (char *)(recvData.certBlockList + i),
+ sizeof(ResponseCertBlock));
+
if (read_len < 0) {
LogError("Error in function read()..");
recvData.result = VCORE_SOCKET_ERROR;
Error_close_exit:
close(sockfd);
+
if (recvData.result == VCORE_SOCKET_ERROR) {
free(recvData.certList);
recvData.certList = NULL;
recvData.certCount = 0;
-
free(recvData.certBlockList);
recvData.certBlockList = NULL;
recvData.certBlockCount = 0;
size_t certSize,
CertType certType)
{
- VcoreRequestData* pSendData = NULL;
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
}
pSendData = set_request_data(
- CERTSVC_INSTALL_CERTIFICATE,
- storeType,
- DISABLED,
- gname,
- common_name,
- private_key_gname,
- associated_gname,
- certData,
- certSize,
- certType,
- DISABLED);
+ CERTSVC_INSTALL_CERTIFICATE,
+ storeType,
+ DISABLED,
+ gname,
+ common_name,
+ private_key_gname,
+ associated_gname,
+ certData,
+ certSize,
+ certType,
+ DISABLED);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
return recvData.result;
}
-int vcore_client_set_certificate_status_to_store(CertStoreType storeType, int is_root_app, const char* gname, CertStatus status) {
-
- VcoreRequestData* pSendData = NULL;
+int vcore_client_set_certificate_status_to_store(CertStoreType storeType, int is_root_app,
+ const char *gname, CertStatus status)
+{
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
return CERTSVC_WRONG_ARGUMENT;
}
- pSendData = set_request_data(CERTSVC_SET_CERTIFICATE_STATUS, storeType, is_root_app, gname, NULL, NULL, NULL, NULL, 0, INVALID_DATA, status);
+ pSendData = set_request_data(CERTSVC_SET_CERTIFICATE_STATUS, storeType, is_root_app, gname, NULL,
+ NULL, NULL, NULL, 0, INVALID_DATA, status);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
recvData = cert_svc_client_comm(pSendData);
free(pSendData);
-
return recvData.result;
}
-int vcore_client_get_certificate_status_from_store(CertStoreType storeType, const char* gname, CertStatus *status) {
-
- VcoreRequestData* pSendData = NULL;
+int vcore_client_get_certificate_status_from_store(CertStoreType storeType, const char *gname,
+ CertStatus *status)
+{
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
return CERTSVC_WRONG_ARGUMENT;
}
- pSendData = set_request_data(CERTSVC_GET_CERTIFICATE_STATUS, storeType, DISABLED, gname, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED);
+ pSendData = set_request_data(CERTSVC_GET_CERTIFICATE_STATUS, storeType, DISABLED, gname, NULL, NULL,
+ NULL, NULL, 0, INVALID_DATA, DISABLED);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
return recvData.result;
}
-int vcore_client_check_alias_exist_in_store(CertStoreType storeType, const char* alias, int *isUnique) {
-
- VcoreRequestData* pSendData = NULL;
+int vcore_client_check_alias_exist_in_store(CertStoreType storeType, const char *alias,
+ int *isUnique)
+{
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
return CERTSVC_WRONG_ARGUMENT;
}
- pSendData = set_request_data(CERTSVC_CHECK_ALIAS_EXISTS, storeType, DISABLED,alias, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED);
+ pSendData = set_request_data(CERTSVC_CHECK_ALIAS_EXISTS, storeType, DISABLED, alias, NULL, NULL,
+ NULL, NULL, 0, INVALID_DATA, DISABLED);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
return recvData.result;
}
-int vcore_client_get_certificate_from_store(CertStoreType storeType, const char* gname, char** certData, size_t* certSize, CertType certType) {
-
- char* outData = NULL;
- VcoreRequestData* pSendData = NULL;
+int vcore_client_get_certificate_from_store(CertStoreType storeType, const char *gname,
+ char **certData, size_t *certSize, CertType certType)
+{
+ char *outData = NULL;
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
if (!gname || !certData || !certSize) {
initialize_res_data(&recvData);
if (storeType == SYSTEM_STORE) /* for extracting certificate from system store */
- pSendData = set_request_data(CERTSVC_EXTRACT_SYSTEM_CERT, storeType, DISABLED, gname, NULL, NULL, NULL, NULL, 0, certType, DISABLED);
+ pSendData = set_request_data(CERTSVC_EXTRACT_SYSTEM_CERT, storeType, DISABLED, gname, NULL, NULL,
+ NULL, NULL, 0, certType, DISABLED);
else /* for extracting certificate from other stores */
- pSendData = set_request_data(CERTSVC_EXTRACT_CERT, storeType, DISABLED, gname, NULL, NULL, NULL, NULL, 0, certType, DISABLED);
+ pSendData = set_request_data(CERTSVC_EXTRACT_CERT, storeType, DISABLED, gname, NULL, NULL, NULL,
+ NULL, 0, certType, DISABLED);
if (pSendData == NULL) {
LogError("Failed to set request data.");
}
recvData = cert_svc_client_comm(pSendData);
+
if (recvData.result < 0) {
LogError("An error occurred from server side err : " << recvData.result);
free(pSendData);
return recvData.result;
}
+
free(pSendData);
if (recvData.dataBlockLen > 0 && recvData.dataBlockLen <= VCORE_MAX_RECV_DATA_SIZE) {
- outData = (char*)malloc(recvData.dataBlockLen + 1);
- memset(outData, 0x00, recvData.dataBlockLen +1);
+ outData = (char *)malloc(recvData.dataBlockLen + 1);
+ memset(outData, 0x00, recvData.dataBlockLen + 1);
memcpy(outData, recvData.dataBlock, recvData.dataBlockLen);
*certData = outData;
*certSize = recvData.dataBlockLen;
- }
- else {
+ } else {
LogError("revcData length is wrong : " << recvData.dataBlockLen);
return CERTSVC_WRONG_ARGUMENT;
}
return recvData.result;
}
-int vcore_client_delete_certificate_from_store(CertStoreType storeType, const char* gname) {
-
- VcoreRequestData* pSendData = NULL;
+int vcore_client_delete_certificate_from_store(CertStoreType storeType, const char *gname)
+{
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
return CERTSVC_WRONG_ARGUMENT;
}
- pSendData = set_request_data(CERTSVC_DELETE_CERT, storeType, DISABLED, gname, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED);
+ pSendData = set_request_data(CERTSVC_DELETE_CERT, storeType, DISABLED, gname, NULL, NULL, NULL,
+ NULL, 0, INVALID_DATA, DISABLED);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
return recvData.result;
}
-int _vcore_client_get_certificate_list_from_store(VcoreRequestType reqType, CertStoreType storeType, int is_root_app,
- CertSvcStoreCertList **certList, size_t *length)
+int _vcore_client_get_certificate_list_from_store(VcoreRequestType reqType, CertStoreType storeType,
+ int is_root_app,
+ CertSvcStoreCertList **certList, size_t *length)
{
std::unique_ptr<VcoreRequestData, void(*)(void *)> pSendData(set_request_data(
- reqType, storeType, is_root_app,
- NULL, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED), free);
+ reqType, storeType, is_root_app,
+ NULL, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED), free);
+
if (!pSendData) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
}
VcoreResponseData recvData;
-
initialize_res_data(&recvData);
recvData = cert_svc_client_comm(pSendData.get());
-
CertSvcStoreCertList *curr = NULL;
CertSvcStoreCertList *prev = NULL;
CertSvcStoreCertList *list = NULL;
+
for (size_t i = 0; i < recvData.certCount; i++) {
curr = createStoreListNode(recvData.certList + i);
+
if (curr == NULL) {
destroyStoreList(list);
free(recvData.certList);
list = curr;
else
prev->next = curr;
+
prev = curr;
}
*length = recvData.certCount;
*certList = list;
-
LogDebug("get_certificate_list_from_store: result : " << recvData.result);
-
free(recvData.certList);
-
return recvData.result;
}
-int vcore_client_get_certificate_list_from_store(CertStoreType storeType, int is_root_app,
- CertSvcStoreCertList** certList, size_t *length)
+int vcore_client_get_certificate_list_from_store(CertStoreType storeType, int is_root_app,
+ CertSvcStoreCertList **certList, size_t *length)
{
- return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_CERTIFICATE_LIST, storeType, is_root_app,
- certList, length);
+ return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_CERTIFICATE_LIST, storeType,
+ is_root_app,
+ certList, length);
}
-int vcore_client_get_root_certificate_list_from_store(CertStoreType storeType,
- CertSvcStoreCertList **certList, size_t *length)
+int vcore_client_get_root_certificate_list_from_store(CertStoreType storeType,
+ CertSvcStoreCertList **certList, size_t *length)
{
- return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_ROOT_CERTIFICATE_LIST, storeType, 0,
- certList, length);
+ return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_ROOT_CERTIFICATE_LIST, storeType,
+ 0,
+ certList, length);
}
-int vcore_client_get_end_user_certificate_list_from_store(CertStoreType storeType,
- CertSvcStoreCertList **certList, size_t *length)
+int vcore_client_get_end_user_certificate_list_from_store(CertStoreType storeType,
+ CertSvcStoreCertList **certList, size_t *length)
{
- return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_USER_CERTIFICATE_LIST, storeType, 0,
- certList, length);
+ return _vcore_client_get_certificate_list_from_store(CERTSVC_GET_USER_CERTIFICATE_LIST, storeType,
+ 0,
+ certList, length);
}
-int vcore_client_get_certificate_alias_from_store(CertStoreType storeType, const char *gname, char **alias)
+int vcore_client_get_certificate_alias_from_store(CertStoreType storeType, const char *gname,
+ char **alias)
{
- VcoreRequestData* pSendData = NULL;
+ VcoreRequestData *pSendData = NULL;
VcoreResponseData recvData;
initialize_res_data(&recvData);
return CERTSVC_WRONG_ARGUMENT;
}
- pSendData = set_request_data(CERTSVC_GET_CERTIFICATE_ALIAS, storeType, DISABLED, gname, NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED);
+ pSendData = set_request_data(CERTSVC_GET_CERTIFICATE_ALIAS, storeType, DISABLED, gname, NULL, NULL,
+ NULL, NULL, 0, INVALID_DATA, DISABLED);
+
if (pSendData == NULL) {
LogError("Failed to set request data");
return CERTSVC_WRONG_ARGUMENT;
}
recvData = cert_svc_client_comm(pSendData);
-
*alias = strndup(recvData.common_name, sizeof(recvData.common_name));
free(pSendData);
return recvData.result;
}
-int vcore_client_load_certificates_from_store(CertStoreType storeType, const char *gname, char ***certs, size_t *ncerts)
+int vcore_client_load_certificates_from_store(CertStoreType storeType, const char *gname,
+ char ***certs, size_t *ncerts)
{
VcoreResponseData recvData;
- ResponseCertBlock* cert = NULL;
+ ResponseCertBlock *cert = NULL;
size_t i = 0;
size_t ncerts_out = 0;
char **certs_out = NULL;
-
initialize_res_data(&recvData);
-
std::unique_ptr<VcoreRequestData, void(*)(void *)> pSendData(set_request_data(
- CERTSVC_LOAD_CERTIFICATES, storeType, DISABLED, gname,
- NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED), free);
+ CERTSVC_LOAD_CERTIFICATES, storeType, DISABLED, gname,
+ NULL, NULL, NULL, NULL, 0, INVALID_DATA, DISABLED), free);
if (!pSendData) {
LogError("Failed to set request data");
}
recvData = cert_svc_client_comm(pSendData.get());
+
if (recvData.result != CERTSVC_SUCCESS) {
LogError("Failed to CERTSVC_LOAD_CERTIFICATES. server retcode : " << recvData.result);
return recvData.result;
}
ncerts_out = recvData.certBlockCount;
+
if (ncerts_out == 0) {
LogError("No certificates exist with gname[" << gname << "] in store[" << storeType << "]");
return CERTSVC_ALIAS_DOES_NOT_EXIST;
}
certs_out = (char **)malloc((ncerts_out + 1) * sizeof(char *));
+
if (certs_out == NULL)
return CERTSVC_BAD_ALLOC;
*certs = certs_out;
*ncerts = ncerts_out;
-
free(recvData.certBlockList);
-
return recvData.result;
}
#define VCORE_PKEY_TEMP_PATH "/tmp/tmpData"
typedef enum {
- CERTSVC_EXTRACT_CERT,
- CERTSVC_EXTRACT_SYSTEM_CERT,
- CERTSVC_DELETE_CERT,
- CERTSVC_INSTALL_CERTIFICATE,
- CERTSVC_GET_CERTIFICATE_STATUS,
- CERTSVC_SET_CERTIFICATE_STATUS,
- CERTSVC_CHECK_ALIAS_EXISTS,
- CERTSVC_GET_CERTIFICATE_LIST,
- CERTSVC_GET_CERTIFICATE_ALIAS,
- CERTSVC_GET_USER_CERTIFICATE_LIST,
- CERTSVC_GET_ROOT_CERTIFICATE_LIST,
- CERTSVC_LOAD_CERTIFICATES,
+ CERTSVC_EXTRACT_CERT,
+ CERTSVC_EXTRACT_SYSTEM_CERT,
+ CERTSVC_DELETE_CERT,
+ CERTSVC_INSTALL_CERTIFICATE,
+ CERTSVC_GET_CERTIFICATE_STATUS,
+ CERTSVC_SET_CERTIFICATE_STATUS,
+ CERTSVC_CHECK_ALIAS_EXISTS,
+ CERTSVC_GET_CERTIFICATE_LIST,
+ CERTSVC_GET_CERTIFICATE_ALIAS,
+ CERTSVC_GET_USER_CERTIFICATE_LIST,
+ CERTSVC_GET_ROOT_CERTIFICATE_LIST,
+ CERTSVC_LOAD_CERTIFICATES,
} VcoreRequestType;
typedef struct {
- VcoreRequestType reqType;
- CertStoreType storeType;
- char gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for gname */
- char common_name[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for common_name */
- char private_key_gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for private_key_gname */
- char associated_gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for associated_gname */
- char dataBlock[VCORE_MAX_SEND_DATA_SIZE]; /* for cert & key buffer */
- size_t dataBlockLen;
- CertStatus certStatus;
- int is_root_app;
- CertType certType;
+ VcoreRequestType reqType;
+ CertStoreType storeType;
+ char gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for gname */
+ char common_name[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for common_name */
+ char private_key_gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for private_key_gname */
+ char associated_gname[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /* for associated_gname */
+ char dataBlock[VCORE_MAX_SEND_DATA_SIZE]; /* for cert & key buffer */
+ size_t dataBlockLen;
+ CertStatus certStatus;
+ int is_root_app;
+ CertType certType;
} VcoreRequestData;
typedef struct {
- char gname[VCORE_MAX_FILENAME_SIZE * 2 + 1];
- char title[VCORE_MAX_FILENAME_SIZE * 2 + 1];
- CertStatus status;
- CertStoreType storeType;
+ char gname[VCORE_MAX_FILENAME_SIZE * 2 + 1];
+ char title[VCORE_MAX_FILENAME_SIZE * 2 + 1];
+ CertStatus status;
+ CertStoreType storeType;
} VcoreCertResponseData;
typedef struct {
- char dataBlock[VCORE_MAX_RECV_DATA_SIZE];
- size_t dataBlockLen;
+ char dataBlock[VCORE_MAX_RECV_DATA_SIZE];
+ size_t dataBlockLen;
} ResponseCertBlock;
typedef struct {
- char dataBlock[VCORE_MAX_RECV_DATA_SIZE];
- size_t dataBlockLen;
- CertStatus certStatus;
- char common_name[VCORE_MAX_FILENAME_SIZE* 2 + 1]; /*for common_name*/
- int result;
- int isAliasUnique;
- size_t certCount;
- VcoreCertResponseData* certList;
- size_t certBlockCount;
- ResponseCertBlock* certBlockList; // array
+ char dataBlock[VCORE_MAX_RECV_DATA_SIZE];
+ size_t dataBlockLen;
+ CertStatus certStatus;
+ char common_name[VCORE_MAX_FILENAME_SIZE * 2 + 1]; /*for common_name*/
+ int result;
+ int isAliasUnique;
+ size_t certCount;
+ VcoreCertResponseData *certList;
+ size_t certBlockCount;
+ ResponseCertBlock *certBlockList; // array
} VcoreResponseData;
-int vcore_client_set_certificate_status_to_store(CertStoreType storeType, int is_root_app, const char *gname, CertStatus status);
-int vcore_client_get_certificate_status_from_store(CertStoreType storeType, const char *gname, CertStatus *status);
-int vcore_client_check_alias_exist_in_store(CertStoreType storeType, const char *alias, int *isUnique);
-int vcore_client_install_certificate_to_store(CertStoreType storeType, const char *gname, const char *common_name, const char *private_key_gname, const char *associated_gname, const char *dataBlock, size_t dataBlockLen, CertType certType);
-int vcore_client_get_certificate_from_store(CertStoreType storeType, const char *gname, char **certData, size_t *certSize, CertType certType);
+int vcore_client_set_certificate_status_to_store(CertStoreType storeType, int is_root_app,
+ const char *gname, CertStatus status);
+int vcore_client_get_certificate_status_from_store(CertStoreType storeType, const char *gname,
+ CertStatus *status);
+int vcore_client_check_alias_exist_in_store(CertStoreType storeType, const char *alias,
+ int *isUnique);
+int vcore_client_install_certificate_to_store(CertStoreType storeType, const char *gname,
+ const char *common_name, const char *private_key_gname, const char *associated_gname,
+ const char *dataBlock, size_t dataBlockLen, CertType certType);
+int vcore_client_get_certificate_from_store(CertStoreType storeType, const char *gname,
+ char **certData, size_t *certSize, CertType certType);
int vcore_client_delete_certificate_from_store(CertStoreType storeType, const char *gname);
-int vcore_client_get_certificate_list_from_store(CertStoreType storeType, int is_root_app, CertSvcStoreCertList **certList, size_t *length);
-int vcore_client_get_root_certificate_list_from_store(CertStoreType storeType, CertSvcStoreCertList **certList, size_t *length);
-int vcore_client_get_end_user_certificate_list_from_store(CertStoreType storeType, CertSvcStoreCertList **certList, size_t *length);
-int vcore_client_get_certificate_alias_from_store(CertStoreType storeType, const char *gname, char **alias);
-int vcore_client_load_certificates_from_store(CertStoreType storeType, const char *gname, char ***certs, size_t *ncerts);
+int vcore_client_get_certificate_list_from_store(CertStoreType storeType, int is_root_app,
+ CertSvcStoreCertList **certList, size_t *length);
+int vcore_client_get_root_certificate_list_from_store(CertStoreType storeType,
+ CertSvcStoreCertList **certList, size_t *length);
+int vcore_client_get_end_user_certificate_list_from_store(CertStoreType storeType,
+ CertSvcStoreCertList **certList, size_t *length);
+int vcore_client_get_certificate_alias_from_store(CertStoreType storeType, const char *gname,
+ char **alias);
+int vcore_client_load_certificates_from_store(CertStoreType storeType, const char *gname,
+ char ***certs, size_t *ncerts);
#ifdef __cplusplus
}
namespace ValidationCore {
-class CryptoInit : public VcoreDPL::Noncopyable
-{
+class CryptoInit : public VcoreDPL::Noncopyable {
public:
CryptoInit();
virtual ~CryptoInit();
namespace {
-typedef std::unique_ptr<X509_STORE_CTX, std::function<void(X509_STORE_CTX*)>> X509_STORE_CTX_PTR;
-typedef std::unique_ptr<STACK_OF(X509), std::function<void(STACK_OF(X509)*)>> X509_STACK_PTR;
-typedef std::unique_ptr<X509_STORE, std::function<void(X509_STORE*)>> X509_STORE_PTR;
-typedef std::unique_ptr<SSL_CTX, std::function<void(SSL_CTX*)>> SSL_CTX_PTR;
-typedef std::unique_ptr<BIO, std::function<void(BIO*)>> BIO_PTR;
-typedef std::unique_ptr<char, std::function<void(void*)>> RAIIstr;
-typedef std::unique_ptr<OCSP_REQUEST, std::function<void(OCSP_REQUEST*)>> OCSP_REQUEST_PTR;
-typedef std::unique_ptr<OCSP_RESPONSE, std::function<void(OCSP_RESPONSE*)>> OCSP_RESPONSE_PTR;
-typedef std::unique_ptr<OCSP_BASICRESP, std::function<void(OCSP_BASICRESP*)>> OCSP_BASICRESP_PTR;
+typedef std::unique_ptr<X509_STORE_CTX, std::function<void(X509_STORE_CTX *)>> X509_STORE_CTX_PTR;
+typedef std::unique_ptr<STACK_OF(X509), std::function<void(STACK_OF(X509) *)>> X509_STACK_PTR;
+typedef std::unique_ptr<X509_STORE, std::function<void(X509_STORE *)>> X509_STORE_PTR;
+typedef std::unique_ptr<SSL_CTX, std::function<void(SSL_CTX *)>> SSL_CTX_PTR;
+typedef std::unique_ptr<BIO, std::function<void(BIO *)>> BIO_PTR;
+typedef std::unique_ptr<char, std::function<void(void *)>> RAIIstr;
+typedef std::unique_ptr<OCSP_REQUEST, std::function<void(OCSP_REQUEST *)>> OCSP_REQUEST_PTR;
+typedef std::unique_ptr<OCSP_RESPONSE, std::function<void(OCSP_RESPONSE *)>> OCSP_RESPONSE_PTR;
+typedef std::unique_ptr<OCSP_BASICRESP, std::function<void(OCSP_BASICRESP *)>> OCSP_BASICRESP_PTR;
inline X509_STACK_PTR create_x509_stack()
{
- return X509_STACK_PTR(sk_X509_new_null(), [](STACK_OF(X509) *stack) { sk_X509_free(stack); });
+ return X509_STACK_PTR(sk_X509_new_null(), [](STACK_OF(X509) * stack) {
+ sk_X509_free(stack);
+ });
}
inline X509_STORE_CTX_PTR create_x509_store_ctx()
inline RAIIstr create_RAIIstr(char *str)
{
- return RAIIstr(str, [](void *ptr) { OPENSSL_free(ptr); });
+ return RAIIstr(str, [](void *ptr) {
+ OPENSSL_free(ptr);
+ });
}
inline BIO_PTR create_BIO(BIO *bio)
std::vector<char> message(1024);
int size = BIO_read(bio, message.data(), message.size());
+
if (size > 0) {
message.resize(size);
LogError("OCSP error description ["
- << std::string(message.begin(), message.end()) << "]");
+ << std::string(message.begin(), message.end()) << "]");
}
BIO_free_all(bio);
{
/* initialize openssl library */
CryptoInitSingleton::Instance();
-
BIO_PTR bioLogger(BIO_new(BIO_s_mem()), BIO_write_and_free);
-
X509 *cert = _cert->getX509();
X509 *issuer = _issuer->getX509();
std::string ocspUrl = _cert->getOCSPURL();
if (ocspUrl.empty())
VcoreThrowMsg(Ocsp::Exception::OcspUnsupported,
- "Certificate[" << _cert->getOneLine() << "] doesn't provide OCSP extension");
+ "Certificate[" << _cert->getOneLine() << "] doesn't provide OCSP extension");
char *_ocspUrl = new char[ocspUrl.length() + 1];
+
if (_ocspUrl == NULL)
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to alloc memory");
- strncpy(_ocspUrl, ocspUrl.c_str(), ocspUrl.length() + 1);
+ strncpy(_ocspUrl, ocspUrl.c_str(), ocspUrl.length() + 1);
char *_host = NULL;
char *_port = NULL;
char *_path = NULL;
int use_ssl = 0;
-
int temp = OCSP_parse_url(_ocspUrl, &_host, &_port, &_path, &use_ssl);
-
LogDebug("ocspUrl[" << _ocspUrl
- << "] host[" << _host
- << "] port[" << _port
- << "] path[" << _path
- << "] use_ssl[" << use_ssl << "]");
-
+ << "] host[" << _host
+ << "] port[" << _port
+ << "] path[" << _path
+ << "] use_ssl[" << use_ssl << "]");
delete []_ocspUrl;
if (temp == 0) {
RAIIstr host = create_RAIIstr(_host);
RAIIstr port = create_RAIIstr(_port);
RAIIstr path = create_RAIIstr(_path);
-
BIO_PTR cbio = create_BIO(BIO_new_connect(host.get()));
+
if (cbio.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to create bio connect");
if (use_ssl == 1) {
SSL_CTX_PTR ssl_ctx = create_SSL_CTX();
+
if (ssl_ctx.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to SSL_CTX_new");
}
SSL_CTX_set_mode(ssl_ctx.get(), SSL_MODE_AUTO_RETRY);
-
BIO_PTR sbio = create_BIO(BIO_new_ssl(ssl_ctx.get(), 1));
+
if (sbio.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to BIO_new_ssl");
}
cbio.reset(BIO_push(sbio.get(), cbio.get()));
+
if (cbio.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to BIO_push");
}
OCSP_REQUEST_PTR req = create_OCSP_REQUEST();
+
if (req.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to OCSP_REQUEST_new");
}
OCSP_CERTID *certid = OCSP_cert_to_id(NULL, cert, issuer);
+
if (certid == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::UnknownError, "Failed to OCSP_cert_to_id");
}
OCSP_RESPONSE_PTR resp =
- create_OCSP_RESPONSE(OCSP_sendreq_bio(cbio.get(), path.get(), req.get()));
+ create_OCSP_RESPONSE(OCSP_sendreq_bio(cbio.get(), path.get(), req.get()));
if (resp.get() == NULL) {
ERR_print_errors(bioLogger.get());
}
OCSP_BASICRESP_PTR basicResp =
- create_OCSP_BASICRESP(OCSP_response_get1_basic(resp.get()));
+ create_OCSP_BASICRESP(OCSP_response_get1_basic(resp.get()));
+
if (basicResp.get() == NULL) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::InvalidResponse, "Failed to OCSP_response_get1_basic");
}
X509_STORE_PTR trustedStore = create_x509_store();
+
if (trustedCerts.get()) {
for (int idx = 0; idx < sk_X509_num(trustedCerts.get()); idx++)
X509_STORE_add_cert(trustedStore.get(), sk_X509_value(trustedCerts.get(), idx));
+
X509_STORE_add_cert(trustedStore.get(), issuer);
}
ASN1_GENERALIZEDTIME *rev = NULL;
ASN1_GENERALIZEDTIME *thisupd = NULL;
ASN1_GENERALIZEDTIME *nextupd = NULL;
+
if (OCSP_resp_find_status(
- basicResp.get(),
- certid,
- &ocspStatus,
- &reason,
- &rev,
- &thisupd,
- &nextupd) == 0) {
+ basicResp.get(),
+ certid,
+ &ocspStatus,
+ &reason,
+ &rev,
+ &thisupd,
+ &nextupd) == 0) {
ERR_print_errors(bioLogger.get());
VcoreThrowMsg(Ocsp::Exception::InvalidResponse, "Failed to OCSP_resp_find_status");
}
VcoreThrowMsg(Ocsp::Exception::InvalidResponse, "Unknown ocsp status.");
return ocspStatus == V_OCSP_CERTSTATUS_GOOD ?
- Ocsp::Result::GOOD : Ocsp::Result::REVOKED;
+ Ocsp::Result::GOOD : Ocsp::Result::REVOKED;
}
Ocsp::Result Ocsp::check(const SignatureData &data)
VcoreThrowMsg(Exception::InvalidParam, "cert list should be sorted");
const CertificateList &certChain = data.getCertList();
+
if (certChain.size() < 3)
VcoreThrowMsg(Exception::InvalidParam, "cert chain is too short");
X509_STACK_PTR trustedCerts = create_x509_stack();
-
auto it = certChain.cbegin();
it++;
it++;
+
/* don't trust the user cert and the first intermediate CA cert */
for (; it != certChain.cend(); it++) {
const auto &cert = it->get();
auto itCert = certChain.cbegin();
auto itIssuer = certChain.cbegin();
itIssuer++;
+
/* check ocsp except except self-signed root CA cert */
for (; itIssuer != certChain.end(); itCert++, itIssuer++) {
if (checkInternal(*itCert, *itIssuer, trustedCerts) == Result::REVOKED)
namespace ValidationCore {
namespace ParserSchemaException {
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, XmlReaderError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, CertificateLoaderError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedAlgorithm);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedValue);
+VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+VCORE_DECLARE_EXCEPTION_TYPE(Base, XmlReaderError);
+VCORE_DECLARE_EXCEPTION_TYPE(Base, CertificateLoaderError);
+VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedAlgorithm);
+VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedValue);
}
template<typename ParserType, typename DataType>
class ParserSchema {
public:
- struct TagDescription {
- TagDescription(const std::string &tag,
- const std::string & xmlNamespace) :
- tagName(tag),
- namespaceUri(xmlNamespace)
- {
- }
-
- std::string tagName;
- std::string namespaceUri;
-
- bool operator<(const TagDescription &second) const
- {
- if (tagName < second.tagName) {
- return true;
- }
- if (tagName > second.tagName) {
- return false;
- }
- if (namespaceUri < second.namespaceUri) {
- return true;
- }
- return false;
- }
- };
-
-
- ParserSchema(ParserType *parser)
- : m_functions(parser) {}
-
- virtual ~ParserSchema() {}
-
- void initialize(
- const std::string &filename,
- bool defaultArgs,
- SaxReader::ValidationType valType,
- const std::string &xmlschema)
- {
- VcoreTry
- {
- m_reader.initialize(filename, defaultArgs, valType, xmlschema);
- }
- VcoreCatch (SaxReader::Exception::Base)
- {
- VcoreReThrowMsg(ParserSchemaException::XmlReaderError, "XmlReaderError");
- }
- }
-
- void deinitialize()
- {
- m_reader.deinitialize();
- }
-
- void read(DataType &dataContainer)
- {
- VcoreTry
- {
- while (m_reader.next()) {
- switch (m_reader.type()) {
- case SaxReader::NODE_BEGIN:
- beginNode(dataContainer);
- break;
- case SaxReader::NODE_END:
- endNode(dataContainer);
- break;
- case SaxReader::NODE_TEXT:
- textNode(dataContainer);
- break;
- default:
- break;
- }
- }
- }
- VcoreCatch (SaxReader::Exception::Base)
- {
- VcoreReThrowMsg(ParserSchemaException::XmlReaderError, "XmlReaderError");
- }
- }
-
- typedef void (ParserType::*FunctionPtr)(DataType &data);
- typedef std::map<TagDescription, FunctionPtr> FunctionMap;
-
- void addBeginTagCallback(
- const std::string &tag,
- const std::string &namespaceUri,
- FunctionPtr function)
- {
- TagDescription desc(tag, namespaceUri);
- m_beginFunctionMap[desc] = function;
- }
-
- void addEndTagCallback(
- const std::string &tag,
- const std::string &namespaceUri,
- FunctionPtr function)
- {
- TagDescription desc(tag, namespaceUri);
- m_endFunctionMap[desc] = function;
- }
-
- SaxReader& getReader()
- {
- return m_reader;
- }
-
- std::string& getText()
- {
- return m_textNode;
- }
+ struct TagDescription {
+ TagDescription(const std::string &tag,
+ const std::string &xmlNamespace) :
+ tagName(tag),
+ namespaceUri(xmlNamespace)
+ {
+ }
+
+ std::string tagName;
+ std::string namespaceUri;
+
+ bool operator<(const TagDescription &second) const
+ {
+ if (tagName < second.tagName) {
+ return true;
+ }
+
+ if (tagName > second.tagName) {
+ return false;
+ }
+
+ if (namespaceUri < second.namespaceUri) {
+ return true;
+ }
+
+ return false;
+ }
+ };
+
+
+ ParserSchema(ParserType *parser)
+ : m_functions(parser) {}
+
+ virtual ~ParserSchema() {}
+
+ void initialize(
+ const std::string &filename,
+ bool defaultArgs,
+ SaxReader::ValidationType valType,
+ const std::string &xmlschema)
+ {
+ VcoreTry {
+ m_reader.initialize(filename, defaultArgs, valType, xmlschema);
+ }
+ VcoreCatch(SaxReader::Exception::Base) {
+ VcoreReThrowMsg(ParserSchemaException::XmlReaderError, "XmlReaderError");
+ }
+ }
+
+ void deinitialize()
+ {
+ m_reader.deinitialize();
+ }
+
+ void read(DataType &dataContainer)
+ {
+ VcoreTry {
+ while (m_reader.next())
+ {
+ switch (m_reader.type()) {
+ case SaxReader::NODE_BEGIN:
+ beginNode(dataContainer);
+ break;
+
+ case SaxReader::NODE_END:
+ endNode(dataContainer);
+ break;
+
+ case SaxReader::NODE_TEXT:
+ textNode(dataContainer);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ VcoreCatch(SaxReader::Exception::Base) {
+ VcoreReThrowMsg(ParserSchemaException::XmlReaderError, "XmlReaderError");
+ }
+ }
+
+ typedef void (ParserType::*FunctionPtr)(DataType &data);
+ typedef std::map<TagDescription, FunctionPtr> FunctionMap;
+
+ void addBeginTagCallback(
+ const std::string &tag,
+ const std::string &namespaceUri,
+ FunctionPtr function)
+ {
+ TagDescription desc(tag, namespaceUri);
+ m_beginFunctionMap[desc] = function;
+ }
+
+ void addEndTagCallback(
+ const std::string &tag,
+ const std::string &namespaceUri,
+ FunctionPtr function)
+ {
+ TagDescription desc(tag, namespaceUri);
+ m_endFunctionMap[desc] = function;
+ }
+
+ SaxReader &getReader()
+ {
+ return m_reader;
+ }
+
+ std::string &getText()
+ {
+ return m_textNode;
+ }
protected:
- void beginNode(DataType &dataContainer)
- {
- TagDescription desc(m_reader.name(), m_reader.namespaceURI());
- FunctionPtr fun = m_beginFunctionMap[desc];
-
- if (fun == 0) {
- return;
- }
-
- (m_functions->*fun)(dataContainer);
- }
-
- void endNode(DataType &dataContainer)
- {
- TagDescription desc(m_reader.name(), m_reader.namespaceURI());
- FunctionPtr fun = m_endFunctionMap[desc];
-
- if (fun == 0) {
- return;
- }
-
- (m_functions->*fun)(dataContainer);
- }
-
- void textNode(DataType &dataContainer)
- {
- (void)dataContainer;
- m_textNode = m_reader.value();
- }
-
- ParserType *m_functions;
- SaxReader m_reader;
- FunctionMap m_beginFunctionMap;
- FunctionMap m_endFunctionMap;
-
- // temporary values require due parsing textNode
- std::string m_textNode;
+ void beginNode(DataType &dataContainer)
+ {
+ TagDescription desc(m_reader.name(), m_reader.namespaceURI());
+ FunctionPtr fun = m_beginFunctionMap[desc];
+
+ if (fun == 0) {
+ return;
+ }
+
+ (m_functions->*fun)(dataContainer);
+ }
+
+ void endNode(DataType &dataContainer)
+ {
+ TagDescription desc(m_reader.name(), m_reader.namespaceURI());
+ FunctionPtr fun = m_endFunctionMap[desc];
+
+ if (fun == 0) {
+ return;
+ }
+
+ (m_functions->*fun)(dataContainer);
+ }
+
+ void textNode(DataType &dataContainer)
+ {
+ (void)dataContainer;
+ m_textNode = m_reader.value();
+ }
+
+ ParserType *m_functions;
+ SaxReader m_reader;
+ FunctionMap m_beginFunctionMap;
+ FunctionMap m_endFunctionMap;
+
+ // temporary values require due parsing textNode
+ std::string m_textNode;
};
} // namespace ValidationCore
, m_fail(true)
{
m_dlhandle = dlopen(PLUGIN_PATH.c_str(), RTLD_NOW);
+
if (!m_dlhandle) {
LogInfo("Plugin library has not been found/opened : " << PLUGIN_PATH);
return;
CreateValidatorPlugin_t createFun =
reinterpret_cast<CreateValidatorPlugin_t>(dlsym(m_dlhandle, "create"));
+
if (!createFun) {
LogError("create symbol cannot found from " << PLUGIN_PATH
- << ". dlerror : " << dlerror());
+ << ". dlerror : " << dlerror());
return;
}
m_destroy =
reinterpret_cast<DestroyValidatorPlugin_t>(dlsym(m_dlhandle, "destroy"));
+
if (!m_destroy) {
LogError("destroy symbole cannot found from " << PLUGIN_PATH
- << ". dlerror : " << dlerror());
+ << ". dlerror : " << dlerror());
return;
}
m_plugin = createFun();
+
if (!m_plugin) {
LogError("cannot create plugin with create func.");
return;
}
LogDebug("create plugin with createFun success.");
-
m_fail = false;
}
namespace ValidationCore {
-class ReferenceValidator::Impl
-{
- public:
- Impl(const std::string &dirpath)
- : m_dirpath(dirpath)
- , m_signatureRegexp(REGEXP_DISTRIBUTOR_SIGNATURE)
- {}
-
- virtual ~Impl(){}
-
- Result checkReferences(const SignatureData &signatureData)
- {
- const ReferenceSet &refSet = signatureData.getReferenceSet();
- ReferenceSet refDecoded;
-
- try {
- for (auto it = refSet.begin(); it != refSet.end(); ++it) {
- if (std::string::npos != it->find(MARK_ENCODED_CHAR))
- refDecoded.insert(decodeProcent(*it));
- else
- refDecoded.insert(*it);
- }
- } catch (Result &) {
- return ERROR_DECODING_URL;
- }
- return dfsCheckDirectories(
- refDecoded,
- std::string(),
- signatureData.isAuthorSignature());
- }
-
- Result checkOutbound(const std::string &linkPath, const std::string &appPath)
- {
- char resolvedPath[PATH_MAX];
- if (realpath((appPath + "/" + linkPath).c_str(), resolvedPath) == NULL)
- return ERROR_READING_LNK;
-
- std::string linkRealPath(resolvedPath);
- if (linkRealPath.compare(0, appPath.size(), appPath) == 0)
- return NO_ERROR;
- else
- return ERROR_OUTBOUND_LNK;
- }
-
- private:
- int hexToInt(char hex);
- std::string decodeProcent(const std::string &path);
-
- Result dfsCheckDirectories(
- const ReferenceSet &referenceSet,
- const std::string &directory,
- bool isAuthorSignature);
-
- inline bool isDistributorSignature(const char *cstring) const
- {
- return m_signatureRegexp.FullMatch(cstring);
- }
-
- std::string m_dirpath;
- pcrecpp::RE m_signatureRegexp;
+class ReferenceValidator::Impl {
+public:
+ Impl(const std::string &dirpath)
+ : m_dirpath(dirpath)
+ , m_signatureRegexp(REGEXP_DISTRIBUTOR_SIGNATURE)
+ {}
+
+ virtual ~Impl() {}
+
+ Result checkReferences(const SignatureData &signatureData)
+ {
+ const ReferenceSet &refSet = signatureData.getReferenceSet();
+ ReferenceSet refDecoded;
+
+ try {
+ for (auto it = refSet.begin(); it != refSet.end(); ++it) {
+ if (std::string::npos != it->find(MARK_ENCODED_CHAR))
+ refDecoded.insert(decodeProcent(*it));
+ else
+ refDecoded.insert(*it);
+ }
+ } catch (Result &) {
+ return ERROR_DECODING_URL;
+ }
+
+ return dfsCheckDirectories(
+ refDecoded,
+ std::string(),
+ signatureData.isAuthorSignature());
+ }
+
+ Result checkOutbound(const std::string &linkPath, const std::string &appPath)
+ {
+ char resolvedPath[PATH_MAX];
+
+ if (realpath((appPath + "/" + linkPath).c_str(), resolvedPath) == NULL)
+ return ERROR_READING_LNK;
+
+ std::string linkRealPath(resolvedPath);
+
+ if (linkRealPath.compare(0, appPath.size(), appPath) == 0)
+ return NO_ERROR;
+ else
+ return ERROR_OUTBOUND_LNK;
+ }
+
+private:
+ int hexToInt(char hex);
+ std::string decodeProcent(const std::string &path);
+
+ Result dfsCheckDirectories(
+ const ReferenceSet &referenceSet,
+ const std::string &directory,
+ bool isAuthorSignature);
+
+ inline bool isDistributorSignature(const char *cstring) const
+ {
+ return m_signatureRegexp.FullMatch(cstring);
+ }
+
+ std::string m_dirpath;
+ pcrecpp::RE m_signatureRegexp;
};
-int ReferenceValidator::Impl::hexToInt(char a) {
- if (a >= '0' && a <= '9') return a-'0';
- if (a >= 'A' && a <= 'F') return a-'A' + 10;
- if (a >= 'a' && a <= 'f') return a-'a' + 10;
- LogError("Symbol '" << a << "' is out of scope.");
- throw ERROR_DECODING_URL;
+int ReferenceValidator::Impl::hexToInt(char a)
+{
+ if (a >= '0' && a <= '9') return a - '0';
+
+ if (a >= 'A' && a <= 'F') return a - 'A' + 10;
+
+ if (a >= 'a' && a <= 'f') return a - 'a' + 10;
+
+ LogError("Symbol '" << a << "' is out of scope.");
+ throw ERROR_DECODING_URL;
}
-std::string ReferenceValidator::Impl::decodeProcent(const std::string &path) {
- std::vector<int> input(path.begin(), path.end());
- std::vector<char> output;
- try {
- size_t i = 0;
- while(i<input.size()) {
- if (MARK_ENCODED_CHAR == input[i]) {
- if (i+2 >= input.size())
- throw ERROR_DECODING_URL;
-
- int result = hexToInt(input[i+1])*16 + hexToInt(input[i+2]);
- output.push_back(static_cast<char>(result));
- i+=3;
- } else {
- output.push_back(static_cast<char>(input[i]));
- ++i;
- }
- }
- } catch (Result &) {
- LogError("Error while decoding url path : " << path);
- throw ERROR_DECODING_URL;
- }
- return std::string(output.begin(), output.end());
+std::string ReferenceValidator::Impl::decodeProcent(const std::string &path)
+{
+ std::vector<int> input(path.begin(), path.end());
+ std::vector<char> output;
+
+ try {
+ size_t i = 0;
+
+ while (i < input.size()) {
+ if (MARK_ENCODED_CHAR == input[i]) {
+ if (i + 2 >= input.size())
+ throw ERROR_DECODING_URL;
+
+ int result = hexToInt(input[i + 1]) * 16 + hexToInt(input[i + 2]);
+ output.push_back(static_cast<char>(result));
+ i += 3;
+ } else {
+ output.push_back(static_cast<char>(input[i]));
+ ++i;
+ }
+ }
+ } catch (Result &) {
+ LogError("Error while decoding url path : " << path);
+ throw ERROR_DECODING_URL;
+ }
+
+ return std::string(output.begin(), output.end());
}
ReferenceValidator::Result ReferenceValidator::Impl::dfsCheckDirectories(
- const ReferenceSet &referenceSet,
- const std::string &directory,
- bool isAuthorSignature)
+ const ReferenceSet &referenceSet,
+ const std::string &directory,
+ bool isAuthorSignature)
{
- int ret;
- DIR *dirp;
- struct dirent entry;
- struct dirent *result;
-
- std::string currentDir = m_dirpath;
- if (!directory.empty()) {
- currentDir += "/";
- currentDir += directory;
- }
-
- if ((dirp = opendir(currentDir.c_str())) == NULL) {
- LogError("Error opening directory : " << currentDir);
- return ERROR_OPENING_DIR;
- }
-
- for (ret = readdir_r(dirp, &entry, &result);
- ret == 0 && result != NULL;
- ret = readdir_r(dirp, &entry, &result)) {
- if (!strcmp(result->d_name, SPECIAL_SYMBOL_CURRENT_DIR)) {
- continue;
- }
-
- if (!strcmp(result->d_name, SPECIAL_SYMBOL_UPPER_DIR)) {
- continue;
- }
-
- if (result->d_type == DT_UNKNOWN) {
- // try to stat inode when readdir is not returning known type
- std::string path = currentDir + "/" + result->d_name;
- struct stat s;
- if (lstat(path.c_str(), &s) != 0) {
- closedir(dirp);
- return ERROR_LSTAT;
- }
- if (S_ISREG(s.st_mode)) {
- result->d_type = DT_REG;
- } else if (S_ISDIR(s.st_mode)) {
- result->d_type = DT_DIR;
- }
- }
-
- if (currentDir == m_dirpath && result->d_type == DT_REG &&
- !strcmp(result->d_name, SPECIAL_SYMBOL_AUTHOR_SIGNATURE_FILE) &&
- isAuthorSignature)
- {
- continue;
- }
-
- if (currentDir == m_dirpath && result->d_type == DT_REG &&
- isDistributorSignature(result->d_name)) {
- continue;
- }
-
- if (result->d_type == DT_DIR) {
- LogDebug("Open directory : " << (directory + result->d_name));
- std::string tmp_directory = directory + result->d_name + "/";
- Result result = dfsCheckDirectories(referenceSet,
- tmp_directory,
- isAuthorSignature);
- if (result != NO_ERROR) {
- closedir(dirp);
- return result;
- }
- } else if (result->d_type == DT_REG) {
- if (referenceSet.end() ==
- referenceSet.find(directory + result->d_name))
- {
- LogDebug("Found file : " << (directory + result->d_name));
- LogError("Unknown ERROR_REFERENCE_NOT_FOUND.");
- closedir(dirp);
- return ERROR_REFERENCE_NOT_FOUND;
- }
- } else if (result->d_type == DT_LNK) {
- std::string linkPath(directory + result->d_name);
-
- if (referenceSet.end() ==
- referenceSet.find(linkPath))
- {
- LogDebug("Found file : " << (directory + result->d_name));
- LogError("Unknown ERROR_REFERENCE_NOT_FOUND.");
- closedir(dirp);
- return ERROR_REFERENCE_NOT_FOUND;
- }
-
- Result ret = checkOutbound(linkPath, m_dirpath);
- if (ret != NO_ERROR) {
- LogError("Link file point wrong path");
- closedir(dirp);
- return ret;
- }
- } else {
- LogError("Unknown file type.");
- closedir(dirp);
- return ERROR_UNSUPPORTED_FILE_TYPE;
- }
- }
-
- if (ret != 0) {
- closedir(dirp);
- return ERROR_READING_DIR;
- }
-
- closedir(dirp);
-
- return NO_ERROR;
+ int ret;
+ DIR *dirp;
+ struct dirent entry;
+ struct dirent *result;
+ std::string currentDir = m_dirpath;
+
+ if (!directory.empty()) {
+ currentDir += "/";
+ currentDir += directory;
+ }
+
+ if ((dirp = opendir(currentDir.c_str())) == NULL) {
+ LogError("Error opening directory : " << currentDir);
+ return ERROR_OPENING_DIR;
+ }
+
+ for (ret = readdir_r(dirp, &entry, &result);
+ ret == 0 && result != NULL;
+ ret = readdir_r(dirp, &entry, &result)) {
+ if (!strcmp(result->d_name, SPECIAL_SYMBOL_CURRENT_DIR)) {
+ continue;
+ }
+
+ if (!strcmp(result->d_name, SPECIAL_SYMBOL_UPPER_DIR)) {
+ continue;
+ }
+
+ if (result->d_type == DT_UNKNOWN) {
+ // try to stat inode when readdir is not returning known type
+ std::string path = currentDir + "/" + result->d_name;
+ struct stat s;
+
+ if (lstat(path.c_str(), &s) != 0) {
+ closedir(dirp);
+ return ERROR_LSTAT;
+ }
+
+ if (S_ISREG(s.st_mode)) {
+ result->d_type = DT_REG;
+ } else if (S_ISDIR(s.st_mode)) {
+ result->d_type = DT_DIR;
+ }
+ }
+
+ if (currentDir == m_dirpath && result->d_type == DT_REG &&
+ !strcmp(result->d_name, SPECIAL_SYMBOL_AUTHOR_SIGNATURE_FILE) &&
+ isAuthorSignature) {
+ continue;
+ }
+
+ if (currentDir == m_dirpath && result->d_type == DT_REG &&
+ isDistributorSignature(result->d_name)) {
+ continue;
+ }
+
+ if (result->d_type == DT_DIR) {
+ LogDebug("Open directory : " << (directory + result->d_name));
+ std::string tmp_directory = directory + result->d_name + "/";
+ Result result = dfsCheckDirectories(referenceSet,
+ tmp_directory,
+ isAuthorSignature);
+
+ if (result != NO_ERROR) {
+ closedir(dirp);
+ return result;
+ }
+ } else if (result->d_type == DT_REG) {
+ if (referenceSet.end() ==
+ referenceSet.find(directory + result->d_name)) {
+ LogDebug("Found file : " << (directory + result->d_name));
+ LogError("Unknown ERROR_REFERENCE_NOT_FOUND.");
+ closedir(dirp);
+ return ERROR_REFERENCE_NOT_FOUND;
+ }
+ } else if (result->d_type == DT_LNK) {
+ std::string linkPath(directory + result->d_name);
+
+ if (referenceSet.end() ==
+ referenceSet.find(linkPath)) {
+ LogDebug("Found file : " << (directory + result->d_name));
+ LogError("Unknown ERROR_REFERENCE_NOT_FOUND.");
+ closedir(dirp);
+ return ERROR_REFERENCE_NOT_FOUND;
+ }
+
+ Result ret = checkOutbound(linkPath, m_dirpath);
+
+ if (ret != NO_ERROR) {
+ LogError("Link file point wrong path");
+ closedir(dirp);
+ return ret;
+ }
+ } else {
+ LogError("Unknown file type.");
+ closedir(dirp);
+ return ERROR_UNSUPPORTED_FILE_TYPE;
+ }
+ }
+
+ if (ret != 0) {
+ closedir(dirp);
+ return ERROR_READING_DIR;
+ }
+
+ closedir(dirp);
+ return NO_ERROR;
}
ReferenceValidator::ReferenceValidator(const std::string &dirpath)
- : m_impl(new Impl(dirpath))
+ : m_impl(new Impl(dirpath))
{}
-ReferenceValidator::~ReferenceValidator(){
- delete m_impl;
+ReferenceValidator::~ReferenceValidator()
+{
+ delete m_impl;
}
ReferenceValidator::Result ReferenceValidator::checkReferences(
- const SignatureData &signatureData)
+ const SignatureData &signatureData)
{
- return m_impl->checkReferences(signatureData);
+ return m_impl->checkReferences(signatureData);
}
ReferenceValidator::Result ReferenceValidator::checkOutbound(
- const std::string &linkPath, const std::string &appPath)
+ const std::string &linkPath, const std::string &appPath)
{
- return m_impl->checkOutbound(linkPath, appPath);
+ return m_impl->checkOutbound(linkPath, appPath);
}
} // ValidationCore
namespace ValidationCore {
-class ReferenceValidator : VcoreDPL::Noncopyable
-{
- public:
- enum Result
- {
- NO_ERROR = 0,
- ERROR_OPENING_DIR,
- ERROR_READING_DIR,
- ERROR_UNSUPPORTED_FILE_TYPE,
- ERROR_REFERENCE_NOT_FOUND,
- ERROR_DECODING_URL,
- ERROR_OUTBOUND_LNK,
- ERROR_READING_LNK,
- ERROR_LSTAT
- };
-
- ReferenceValidator(const std::string &dirpath);
-
- virtual ~ReferenceValidator();
-
- Result checkReferences(const SignatureData &signatureData);
- Result checkOutbound(const std::string &linkPath, const std::string &appPath);
-
- private:
- class Impl;
- Impl *m_impl;
+class ReferenceValidator : VcoreDPL::Noncopyable {
+public:
+ enum Result {
+ NO_ERROR = 0,
+ ERROR_OPENING_DIR,
+ ERROR_READING_DIR,
+ ERROR_UNSUPPORTED_FILE_TYPE,
+ ERROR_REFERENCE_NOT_FOUND,
+ ERROR_DECODING_URL,
+ ERROR_OUTBOUND_LNK,
+ ERROR_READING_LNK,
+ ERROR_LSTAT
+ };
+
+ ReferenceValidator(const std::string &dirpath);
+
+ virtual ~ReferenceValidator();
+
+ Result checkReferences(const SignatureData &signatureData);
+ Result checkOutbound(const std::string &linkPath, const std::string &appPath);
+
+private:
+ class Impl;
+ Impl *m_impl;
};
}
SaxReader::SaxReader() :
- m_reader(0)
+ m_reader(0)
{
}
SaxReader::~SaxReader()
{
- if (m_reader) {
- deinitialize();
- }
+ if (m_reader) {
+ deinitialize();
+ }
}
void SaxReader::initialize(
- const std::string &filename,
- bool defaultArgs,
- ValidationType validate,
- const std::string &schema)
+ const std::string &filename,
+ bool defaultArgs,
+ ValidationType validate,
+ const std::string &schema)
{
- Assert(m_reader == 0 && "Double initialization of SaxReader");
-
- LogDebug("SaxReader opening file: " << filename);
-
- m_reader = xmlNewTextReaderFilename(filename.c_str());
-
- if (!m_reader) {
- VcoreThrowMsg(SaxReader::Exception::FileOpeningError,
- "opening file " << filename << " error");
- }
-
- if (validate == VALIDATION_XMLSCHEME &&
- xmlTextReaderSchemaValidate(m_reader, schema.c_str())) {
- /*
- * unable to turn on schema validation
- */
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "Turn on Schema validation failed");
- }
-
- // Path to DTD schema is taken from xml file.
- if (validate == VALIDATION_DTD &&
- xmlTextReaderSetParserProp(m_reader, XML_PARSER_VALIDATE, 1)) {
- /*
- * unable to turn on DTD validation
- */
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "Turn on DTD validation failed!");
- }
-
- if (defaultArgs &&
- xmlTextReaderSetParserProp(m_reader, XML_PARSER_DEFAULTATTRS, 1)) {
- /*
- * unable to turn on default arguments
- */
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "Turn on default arguments failed");
- }
+ Assert(m_reader == 0 && "Double initialization of SaxReader");
+ LogDebug("SaxReader opening file: " << filename);
+ m_reader = xmlNewTextReaderFilename(filename.c_str());
+
+ if (!m_reader) {
+ VcoreThrowMsg(SaxReader::Exception::FileOpeningError,
+ "opening file " << filename << " error");
+ }
+
+ if (validate == VALIDATION_XMLSCHEME &&
+ xmlTextReaderSchemaValidate(m_reader, schema.c_str())) {
+ /*
+ * unable to turn on schema validation
+ */
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "Turn on Schema validation failed");
+ }
+
+ // Path to DTD schema is taken from xml file.
+ if (validate == VALIDATION_DTD &&
+ xmlTextReaderSetParserProp(m_reader, XML_PARSER_VALIDATE, 1)) {
+ /*
+ * unable to turn on DTD validation
+ */
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "Turn on DTD validation failed!");
+ }
+
+ if (defaultArgs &&
+ xmlTextReaderSetParserProp(m_reader, XML_PARSER_DEFAULTATTRS, 1)) {
+ /*
+ * unable to turn on default arguments
+ */
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "Turn on default arguments failed");
+ }
}
void SaxReader::deinitialize()
{
- xmlFreeTextReader(m_reader);
- m_reader = 0;
+ xmlFreeTextReader(m_reader);
+ m_reader = 0;
}
bool SaxReader::next()
{
- int res = xmlTextReaderRead(m_reader);
+ int res = xmlTextReaderRead(m_reader);
- if (res < 0)
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderRead error");
+ if (res < 0)
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderRead error");
- if (!xmlTextReaderIsValid(m_reader))
- VcoreThrowMsg(SaxReader::Exception::FileNotValid,
- "xmlTextReader is invalid");
+ if (!xmlTextReaderIsValid(m_reader))
+ VcoreThrowMsg(SaxReader::Exception::FileNotValid,
+ "xmlTextReader is invalid");
- return res ? true : false;
+ return res ? true : false;
}
void SaxReader::next(const std::string &token)
{
- int res = xmlTextReaderRead(m_reader);
+ int res = xmlTextReaderRead(m_reader);
- if (res < 0)
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderRead error");
+ if (res < 0)
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderRead error");
- if (!xmlTextReaderIsValid(m_reader))
- VcoreThrowMsg(SaxReader::Exception::FileNotValid,
- "xmlTextReader is invalid");
+ if (!xmlTextReaderIsValid(m_reader))
+ VcoreThrowMsg(SaxReader::Exception::FileNotValid,
+ "xmlTextReader is invalid");
- xmlChar *name = xmlTextReaderName(m_reader);
+ xmlChar *name = xmlTextReaderName(m_reader);
- if (!name)
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderName returns NULL");
+ if (!name)
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderName returns NULL");
- xmlChar *xmlToken = xmlCharStrdup(token.c_str());
+ xmlChar *xmlToken = xmlCharStrdup(token.c_str());
- if (xmlStrcmp(name, xmlToken)) {
- xmlFree(name);
- xmlFree(xmlToken);
+ if (xmlStrcmp(name, xmlToken)) {
+ xmlFree(name);
+ xmlFree(xmlToken);
+ VcoreThrowMsg(SaxReader::Exception::WrongToken, "Wrong Token");
+ }
- VcoreThrowMsg(SaxReader::Exception::WrongToken, "Wrong Token");
- }
-
- xmlFree(name);
- xmlFree(xmlToken);
+ xmlFree(name);
+ xmlFree(xmlToken);
}
bool SaxReader::isEmpty(void)
{
- int ret = xmlTextReaderIsEmptyElement(m_reader);
- if (-1 == ret)
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderIsEmptyElement error");
+ int ret = xmlTextReaderIsEmptyElement(m_reader);
+
+ if (-1 == ret)
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderIsEmptyElement error");
- return ret ? true : false;
+ return ret ? true : false;
}
std::string SaxReader::attribute(const std::string &token, ThrowType throwStatus)
{
- xmlChar *attr = xmlTextReaderGetAttribute(m_reader, BAD_CAST(token.c_str()));
- if (!attr) {
- if (throwStatus == THROW_DISABLE) {
- return std::string();
- }
- else {
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderGetAttribute error");
- }
- }
-
- std::string value = reinterpret_cast<const char *>(attr);
- xmlFree(attr);
-
- return value;
+ xmlChar *attr = xmlTextReaderGetAttribute(m_reader, BAD_CAST(token.c_str()));
+
+ if (!attr) {
+ if (throwStatus == THROW_DISABLE) {
+ return std::string();
+ } else {
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderGetAttribute error");
+ }
+ }
+
+ std::string value = reinterpret_cast<const char *>(attr);
+ xmlFree(attr);
+ return value;
}
std::string SaxReader::name()
{
- xmlChar *name = xmlTextReaderName(m_reader);
- if (!name)
- VcoreThrowMsg(SaxReader::Exception::ReadingNameError,
- "reading name error");
-
- std::string value = reinterpret_cast<const char *>(name);
- xmlFree(name);
- size_t pos = value.find_last_of(":");
- if (pos != std::string::npos) {
- value.erase(0, pos + 1);
- }
-
- return value;
+ xmlChar *name = xmlTextReaderName(m_reader);
+
+ if (!name)
+ VcoreThrowMsg(SaxReader::Exception::ReadingNameError,
+ "reading name error");
+
+ std::string value = reinterpret_cast<const char *>(name);
+ xmlFree(name);
+ size_t pos = value.find_last_of(":");
+
+ if (pos != std::string::npos) {
+ value.erase(0, pos + 1);
+ }
+
+ return value;
}
std::string SaxReader::namespaceURI()
{
- xmlChar *name = xmlTextReaderNamespaceUri(m_reader);
- if (!name) {
- return std::string();
- }
+ xmlChar *name = xmlTextReaderNamespaceUri(m_reader);
- std::string value = reinterpret_cast<const char *>(name);
- xmlFree(name);
+ if (!name) {
+ return std::string();
+ }
- return value;
+ std::string value = reinterpret_cast<const char *>(name);
+ xmlFree(name);
+ return value;
}
std::string SaxReader::value()
{
- xmlChar *text = xmlTextReaderValue(m_reader);
- if (!text)
- VcoreThrowMsg(SaxReader::Exception::ReadingValueError,
- "reading value error");
+ xmlChar *text = xmlTextReaderValue(m_reader);
- std::string value = reinterpret_cast<const char*>(text);
- xmlFree(text);
+ if (!text)
+ VcoreThrowMsg(SaxReader::Exception::ReadingValueError,
+ "reading value error");
- return value;
+ std::string value = reinterpret_cast<const char *>(text);
+ xmlFree(text);
+ return value;
}
SaxReader::NodeType SaxReader::type()
{
- xmlReaderTypes type =
- static_cast<xmlReaderTypes>(xmlTextReaderNodeType(m_reader));
- switch (type) {
- case XML_READER_TYPE_ELEMENT:
- return NODE_BEGIN;
- case XML_READER_TYPE_END_ELEMENT:
- return NODE_END;
- case XML_READER_TYPE_TEXT:
- return NODE_TEXT;
- case XML_READER_TYPE_NONE:
- case XML_READER_TYPE_ATTRIBUTE:
- case XML_READER_TYPE_CDATA:
- case XML_READER_TYPE_ENTITY_REFERENCE:
- case XML_READER_TYPE_ENTITY:
- case XML_READER_TYPE_PROCESSING_INSTRUCTION:
- case XML_READER_TYPE_COMMENT:
- case XML_READER_TYPE_DOCUMENT:
- case XML_READER_TYPE_DOCUMENT_TYPE:
- case XML_READER_TYPE_DOCUMENT_FRAGMENT:
- case XML_READER_TYPE_NOTATION:
- case XML_READER_TYPE_WHITESPACE:
- case XML_READER_TYPE_SIGNIFICANT_WHITESPACE:
- case XML_READER_TYPE_END_ENTITY:
- case XML_READER_TYPE_XML_DECLARATION:
- default:
- return NODE_UNSUPPORTED;
- }
+ xmlReaderTypes type =
+ static_cast<xmlReaderTypes>(xmlTextReaderNodeType(m_reader));
+
+ switch (type) {
+ case XML_READER_TYPE_ELEMENT:
+ return NODE_BEGIN;
+
+ case XML_READER_TYPE_END_ELEMENT:
+ return NODE_END;
+
+ case XML_READER_TYPE_TEXT:
+ return NODE_TEXT;
+
+ case XML_READER_TYPE_NONE:
+ case XML_READER_TYPE_ATTRIBUTE:
+ case XML_READER_TYPE_CDATA:
+ case XML_READER_TYPE_ENTITY_REFERENCE:
+ case XML_READER_TYPE_ENTITY:
+ case XML_READER_TYPE_PROCESSING_INSTRUCTION:
+ case XML_READER_TYPE_COMMENT:
+ case XML_READER_TYPE_DOCUMENT:
+ case XML_READER_TYPE_DOCUMENT_TYPE:
+ case XML_READER_TYPE_DOCUMENT_FRAGMENT:
+ case XML_READER_TYPE_NOTATION:
+ case XML_READER_TYPE_WHITESPACE:
+ case XML_READER_TYPE_SIGNIFICANT_WHITESPACE:
+ case XML_READER_TYPE_END_ENTITY:
+ case XML_READER_TYPE_XML_DECLARATION:
+ default:
+ return NODE_UNSUPPORTED;
+ }
}
void SaxReader::dumpNode(std::string &buffer)
{
- xmlBufferPtr buff = xmlBufferCreate();
-
- xmlNodePtr node = xmlTextReaderExpand(m_reader);
- if (!node) {
- xmlBufferFree(buff);
- VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
- "xmlTextReaderExpand error");
- }
-
- int size = xmlNodeDump(buff, node->doc, node, 0, 0);
- if (size > 0) {
- buffer.insert(0, reinterpret_cast<char*>(buff->content), size);
- }
- xmlBufferFree(buff);
+ xmlBufferPtr buff = xmlBufferCreate();
+ xmlNodePtr node = xmlTextReaderExpand(m_reader);
+
+ if (!node) {
+ xmlBufferFree(buff);
+ VcoreThrowMsg(SaxReader::Exception::ParserInternalError,
+ "xmlTextReaderExpand error");
+ }
+
+ int size = xmlNodeDump(buff, node->doc, node, 0, 0);
+
+ if (size > 0) {
+ buffer.insert(0, reinterpret_cast<char *>(buff->content), size);
+ }
+
+ xmlBufferFree(buff);
}
} // namespace ValidationCore
namespace ValidationCore {
class SaxReader {
public:
- SaxReader();
- ~SaxReader();
-
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, FileOpeningError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, FileNotValid);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, ParserInternalError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongToken);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, ReadingValueError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, ReadingNameError);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedType);
- };
-
- enum NodeType
- {
- NODE_UNSUPPORTED,
- NODE_BEGIN,
- NODE_END,
- NODE_TEXT
- };
-
- enum ThrowType
- {
- THROW_ENABLE = 0,
- THROW_DISABLE
- };
-
- /*
- * xml validation modes
- */
- enum ValidationType
- {
- VALIDATION_DISABLE,
- VALIDATION_XMLSCHEME,
- VALIDATION_DTD
- };
-
- /*
- * initializes parser
- */
- void initialize(
- const std::string &filename,
- bool defaultArgs = false,
- ValidationType validation = VALIDATION_DISABLE,
- const std::string &schema = std::string());
- /*
- * deinitializes parser
- */
- void deinitialize();
-
- /**
- * Move to next xml node.
- */
- bool next();
-
- /**
- * Move to next xml node. If next node name is differ from token the exception wiil
- * be thronw.
- */
- void next(const std::string &token);
-
- /**
- * Check if xml tag is empty.
- */
- bool isEmpty(void);
-
- /**
- * Read attribute tag.
- */
- std::string attribute(const std::string &token, ThrowType throwStatus = THROW_ENABLE);
-
- /**
- * Read xml tag name without namespace.
- */
- std::string name();
-
- /**
- * Read xml tag namespace URI
- */
- std::string namespaceURI();
-
- /**
- * Read xml tag value.
- */
- std::string value();
-
- /**
- * Return information about node type.
- */
- NodeType type();
-
- /**
- * Save all contonet of xml file which is between current tag and
- * it's close tag into buffer.
- */
- void dumpNode(std::string &buffer);
+ SaxReader();
+ ~SaxReader();
+
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, FileOpeningError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, FileNotValid);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, ParserInternalError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, WrongToken);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, ReadingValueError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, ReadingNameError);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, UnsupportedType);
+ };
+
+ enum NodeType {
+ NODE_UNSUPPORTED,
+ NODE_BEGIN,
+ NODE_END,
+ NODE_TEXT
+ };
+
+ enum ThrowType {
+ THROW_ENABLE = 0,
+ THROW_DISABLE
+ };
+
+ /*
+ * xml validation modes
+ */
+ enum ValidationType {
+ VALIDATION_DISABLE,
+ VALIDATION_XMLSCHEME,
+ VALIDATION_DTD
+ };
+
+ /*
+ * initializes parser
+ */
+ void initialize(
+ const std::string &filename,
+ bool defaultArgs = false,
+ ValidationType validation = VALIDATION_DISABLE,
+ const std::string &schema = std::string());
+ /*
+ * deinitializes parser
+ */
+ void deinitialize();
+
+ /**
+ * Move to next xml node.
+ */
+ bool next();
+
+ /**
+ * Move to next xml node. If next node name is differ from token the exception wiil
+ * be thronw.
+ */
+ void next(const std::string &token);
+
+ /**
+ * Check if xml tag is empty.
+ */
+ bool isEmpty(void);
+
+ /**
+ * Read attribute tag.
+ */
+ std::string attribute(const std::string &token, ThrowType throwStatus = THROW_ENABLE);
+
+ /**
+ * Read xml tag name without namespace.
+ */
+ std::string name();
+
+ /**
+ * Read xml tag namespace URI
+ */
+ std::string namespaceURI();
+
+ /**
+ * Read xml tag value.
+ */
+ std::string value();
+
+ /**
+ * Return information about node type.
+ */
+ NodeType type();
+
+ /**
+ * Save all contonet of xml file which is between current tag and
+ * it's close tag into buffer.
+ */
+ void dumpNode(std::string &buffer);
private:
- /*
- * internal libxml text reader
- */
- xmlTextReaderPtr m_reader;
+ /*
+ * internal libxml text reader
+ */
+ xmlTextReaderPtr m_reader;
};
}
namespace ValidationCore {
SignatureData::SignatureData()
- : m_signatureNumber(-1)
- , m_certificateSorted(false)
+ : m_signatureNumber(-1)
+ , m_certificateSorted(false)
{}
SignatureData::SignatureData(const std::string &fileName, int fileNumber)
- : m_signatureNumber(fileNumber)
- , m_fileName(fileName)
- , m_certificateSorted(false)
+ : m_signatureNumber(fileNumber)
+ , m_fileName(fileName)
+ , m_certificateSorted(false)
{}
SignatureData::~SignatureData()
{}
-const ReferenceSet& SignatureData::getReferenceSet() const
+const ReferenceSet &SignatureData::getReferenceSet() const
{
- return m_referenceSet;
+ return m_referenceSet;
}
void SignatureData::setReference(const ReferenceSet &referenceSet)
{
- m_referenceSet = referenceSet;
+ m_referenceSet = referenceSet;
}
CertificateList SignatureData::getCertList() const
{
- return m_certList;
+ return m_certList;
}
void SignatureData::setSortedCertificateList(const CertificateList &list)
{
- m_certList = list;
- m_certificateSorted = true;
+ m_certList = list;
+ m_certificateSorted = true;
}
bool SignatureData::isAuthorSignature() const
{
- return m_signatureNumber == -1;
+ return m_signatureNumber == -1;
}
std::string SignatureData::getSignatureFileName() const
{
- return m_fileName;
+ return m_fileName;
}
int SignatureData::getSignatureNumber() const
{
- return m_signatureNumber;
+ return m_signatureNumber;
}
std::string SignatureData::getRoleURI() const
{
- return m_roleURI;
+ return m_roleURI;
}
std::string SignatureData::getProfileURI() const
{
- return m_profileURI;
+ return m_profileURI;
}
bool SignatureData::containObjectReference(const std::string &ref) const
{
- std::string rName = "#";
- rName += ref;
- return m_referenceSet.end() != m_referenceSet.find(rName);
+ std::string rName = "#";
+ rName += ref;
+ return m_referenceSet.end() != m_referenceSet.find(rName);
}
ObjectList SignatureData::getObjectList() const
{
- return m_objectList;
+ return m_objectList;
}
void SignatureData::setStorageType(const CertStoreId::Set &storeIdSet)
{
- m_storeIdSet = storeIdSet;
+ m_storeIdSet = storeIdSet;
}
bool SignatureData::isCertListSorted() const
{
- return m_certificateSorted;
+ return m_certificateSorted;
}
-const CertStoreId::Set& SignatureData::getStorageType() const
+const CertStoreId::Set &SignatureData::getStorageType() const
{
- return m_storeIdSet;
+ return m_storeIdSet;
}
CertStoreId::Type SignatureData::getVisibilityLevel() const
{
- if (!m_storeIdSet.isContainsVis()) {
- LogWarning("Visibility level was broken.");
- return 0;
- }
+ if (!m_storeIdSet.isContainsVis()) {
+ LogWarning("Visibility level was broken.");
+ return 0;
+ }
- if (m_storeIdSet.contains(CertStoreId::VIS_PLATFORM))
- return CertStoreId::VIS_PLATFORM;
- else if (m_storeIdSet.contains(CertStoreId::VIS_PARTNER))
- return CertStoreId::VIS_PARTNER;
- else
- return CertStoreId::VIS_PUBLIC;
+ if (m_storeIdSet.contains(CertStoreId::VIS_PLATFORM))
+ return CertStoreId::VIS_PLATFORM;
+ else if (m_storeIdSet.contains(CertStoreId::VIS_PARTNER))
+ return CertStoreId::VIS_PARTNER;
+ else
+ return CertStoreId::VIS_PUBLIC;
}
-const SignatureData::IMEIList& SignatureData::getIMEIList() const
+const SignatureData::IMEIList &SignatureData::getIMEIList() const
{
- return m_imeiList;
+ return m_imeiList;
}
-const SignatureData::MEIDList& SignatureData::getMEIDList() const
+const SignatureData::MEIDList &SignatureData::getMEIDList() const
{
- return m_meidList;
+ return m_meidList;
}
CertificatePtr SignatureData::getEndEntityCertificatePtr() const
{
- if (m_certificateSorted)
- return m_certList.front();
+ if (m_certificateSorted)
+ return m_certList.front();
- return CertificatePtr();
+ return CertificatePtr();
}
CertificatePtr SignatureData::getRootCaCertificatePtr() const
{
- if (m_certificateSorted)
- return m_certList.back();
+ if (m_certificateSorted)
+ return m_certList.back();
- return CertificatePtr();
+ return CertificatePtr();
}
} // ValidationCore
class SignatureData {
public:
- SignatureData();
- SignatureData(const std::string &fileName, int fileNumber);
-
- virtual ~SignatureData();
-
- typedef std::list<std::string> IMEIList;
- typedef std::list<std::string> MEIDList;
-
- void setReference(const ReferenceSet &referenceSet);
- void setSortedCertificateList(const CertificateList &list);
- void setStorageType(const CertStoreId::Set &storeIdSet);
- bool isCertListSorted() const;
-
- const ReferenceSet& getReferenceSet() const;
- CertificateList getCertList() const;
- ObjectList getObjectList() const;
- bool containObjectReference(const std::string &ref) const;
- bool isAuthorSignature() const;
- int getSignatureNumber() const;
- std::string getSignatureFileName() const;
- std::string getRoleURI() const;
- std::string getProfileURI() const;
- const CertStoreId::Set& getStorageType() const;
- CertStoreId::Type getVisibilityLevel() const;
- const IMEIList& getIMEIList() const;
- const MEIDList& getMEIDList() const;
- CertificatePtr getEndEntityCertificatePtr() const;
- CertificatePtr getRootCaCertificatePtr() const;
-
- friend class SignatureReader;
+ SignatureData();
+ SignatureData(const std::string &fileName, int fileNumber);
+
+ virtual ~SignatureData();
+
+ typedef std::list<std::string> IMEIList;
+ typedef std::list<std::string> MEIDList;
+
+ void setReference(const ReferenceSet &referenceSet);
+ void setSortedCertificateList(const CertificateList &list);
+ void setStorageType(const CertStoreId::Set &storeIdSet);
+ bool isCertListSorted() const;
+
+ const ReferenceSet &getReferenceSet() const;
+ CertificateList getCertList() const;
+ ObjectList getObjectList() const;
+ bool containObjectReference(const std::string &ref) const;
+ bool isAuthorSignature() const;
+ int getSignatureNumber() const;
+ std::string getSignatureFileName() const;
+ std::string getRoleURI() const;
+ std::string getProfileURI() const;
+ const CertStoreId::Set &getStorageType() const;
+ CertStoreId::Type getVisibilityLevel() const;
+ const IMEIList &getIMEIList() const;
+ const MEIDList &getMEIDList() const;
+ CertificatePtr getEndEntityCertificatePtr() const;
+ CertificatePtr getRootCaCertificatePtr() const;
+
+ friend class SignatureReader;
private:
- ReferenceSet m_referenceSet;
- CertificateList m_certList;
-
- //TargetRestriction
- IMEIList m_imeiList;
- MEIDList m_meidList;
-
- /*
- * This number is taken from distributor signature file name.
- * Author signature do not contain any number on the file name.
- * Author signature should have signature number equal to -1.
- */
- int m_signatureNumber;
- std::string m_fileName;
- std::string m_roleURI;
- std::string m_profileURI;
- std::string m_identifier;
- ObjectList m_objectList;
- CertStoreId::Set m_storeIdSet;
- bool m_certificateSorted;
+ ReferenceSet m_referenceSet;
+ CertificateList m_certList;
+
+ //TargetRestriction
+ IMEIList m_imeiList;
+ MEIDList m_meidList;
+
+ /*
+ * This number is taken from distributor signature file name.
+ * Author signature do not contain any number on the file name.
+ * Author signature should have signature number equal to -1.
+ */
+ int m_signatureNumber;
+ std::string m_fileName;
+ std::string m_roleURI;
+ std::string m_profileURI;
+ std::string m_identifier;
+ ObjectList m_objectList;
+ CertStoreId::Set m_storeIdSet;
+ bool m_certificateSorted;
};
typedef std::set<SignatureData> SignatureDataSet;
namespace ValidationCore {
static const char *SIGNATURE_AUTHOR = "author-signature.xml";
static const char *REGEXP_DISTRIBUTOR_SIGNATURE =
- "^(signature)([1-9][0-9]*)(\\.xml)";
+ "^(signature)([1-9][0-9]*)(\\.xml)";
class SignatureFinder::Impl {
public:
- Impl(const std::string& dir)
- : m_dir(dir)
- , m_signatureRegexp(REGEXP_DISTRIBUTOR_SIGNATURE)
- {}
+ Impl(const std::string &dir)
+ : m_dir(dir)
+ , m_signatureRegexp(REGEXP_DISTRIBUTOR_SIGNATURE)
+ {}
- virtual ~Impl(){}
+ virtual ~Impl() {}
- Result find(SignatureFileInfoSet &set);
+ Result find(SignatureFileInfoSet &set);
private:
- std::string getFullPath(const std::string &file);
+ std::string getFullPath(const std::string &file);
- std::string m_dir;
- pcrecpp::RE m_signatureRegexp;
+ std::string m_dir;
+ pcrecpp::RE m_signatureRegexp;
};
std::string SignatureFinder::Impl::getFullPath(const std::string &file)
{
- std::string fullPath = m_dir;
+ std::string fullPath = m_dir;
- if (fullPath.back() != '/')
- fullPath += "/";
+ if (fullPath.back() != '/')
+ fullPath += "/";
- fullPath += file;
-
- return fullPath;
+ fullPath += file;
+ return fullPath;
}
SignatureFinder::Result SignatureFinder::Impl::find(SignatureFileInfoSet &set)
{
- int ret;
- DIR *dirp;
- struct dirent entry;
- struct dirent *result;
-
- if ((dirp = opendir(m_dir.c_str())) == NULL) {
- LogError("Error opening directory: " << m_dir);
- return ERROR_OPENING_DIR;
- }
-
- for (ret = readdir_r(dirp, &entry, &result);
- ret == 0 && result != NULL;
- ret = readdir_r(dirp, &entry, &result)) {
- /* number for author signature is -1 */
- if (!strcmp(result->d_name, SIGNATURE_AUTHOR)) {
- std::string fullPath = getFullPath(std::string(result->d_name));
- LogDebug("Found author signature file full path : " << fullPath);
- set.insert(SignatureFileInfo(fullPath, -1));
- continue;
- }
-
- std::string sig;
- std::string num;
- std::string xml; /* just for cutting out .xml */
- if (m_signatureRegexp.FullMatch(result->d_name, &sig, &num, &xml)) {
- std::istringstream stream(num);
- int number;
- stream >> number;
-
- if (stream.fail()) {
- closedir(dirp);
- return ERROR_ISTREAM;
- }
-
- std::string fullPath = getFullPath(std::string(result->d_name));
- LogDebug("Found signature file full path : " << fullPath);
- set.insert(SignatureFileInfo(fullPath, number));
- }
- }
-
- if (ret != 0) {
- LogError("Error in readdir");
- closedir(dirp);
- return ERROR_READING_DIR;
- }
-
- closedir(dirp);
- return NO_ERROR;
+ int ret;
+ DIR *dirp;
+ struct dirent entry;
+ struct dirent *result;
+
+ if ((dirp = opendir(m_dir.c_str())) == NULL) {
+ LogError("Error opening directory: " << m_dir);
+ return ERROR_OPENING_DIR;
+ }
+
+ for (ret = readdir_r(dirp, &entry, &result);
+ ret == 0 && result != NULL;
+ ret = readdir_r(dirp, &entry, &result)) {
+ /* number for author signature is -1 */
+ if (!strcmp(result->d_name, SIGNATURE_AUTHOR)) {
+ std::string fullPath = getFullPath(std::string(result->d_name));
+ LogDebug("Found author signature file full path : " << fullPath);
+ set.insert(SignatureFileInfo(fullPath, -1));
+ continue;
+ }
+
+ std::string sig;
+ std::string num;
+ std::string xml; /* just for cutting out .xml */
+
+ if (m_signatureRegexp.FullMatch(result->d_name, &sig, &num, &xml)) {
+ std::istringstream stream(num);
+ int number;
+ stream >> number;
+
+ if (stream.fail()) {
+ closedir(dirp);
+ return ERROR_ISTREAM;
+ }
+
+ std::string fullPath = getFullPath(std::string(result->d_name));
+ LogDebug("Found signature file full path : " << fullPath);
+ set.insert(SignatureFileInfo(fullPath, number));
+ }
+ }
+
+ if (ret != 0) {
+ LogError("Error in readdir");
+ closedir(dirp);
+ return ERROR_READING_DIR;
+ }
+
+ closedir(dirp);
+ return NO_ERROR;
}
-SignatureFinder::SignatureFinder(const std::string& dir)
- : m_impl(new Impl(dir))
+SignatureFinder::SignatureFinder(const std::string &dir)
+ : m_impl(new Impl(dir))
{}
SignatureFinder::~SignatureFinder()
{
- delete m_impl;
+ delete m_impl;
}
-SignatureFinder::Result SignatureFinder::find(SignatureFileInfoSet &set) {
- return m_impl->find(set);
+SignatureFinder::Result SignatureFinder::find(SignatureFileInfoSet &set)
+{
+ return m_impl->find(set);
}
} // namespace ValidationCore
class SignatureFileInfo {
public:
- SignatureFileInfo(const std::string &fileName, int num)
- : m_fileName(fileName)
- , m_fileNumber(num)
- {}
-
- std::string getFileName() const
- {
- return m_fileName;
- }
-
- int getFileNumber() const
- {
- return m_fileNumber;
- }
-
- bool operator<(const SignatureFileInfo &second) const
- {
- return m_fileNumber < second.m_fileNumber;
- }
+ SignatureFileInfo(const std::string &fileName, int num)
+ : m_fileName(fileName)
+ , m_fileNumber(num)
+ {}
+
+ std::string getFileName() const
+ {
+ return m_fileName;
+ }
+
+ int getFileNumber() const
+ {
+ return m_fileNumber;
+ }
+
+ bool operator<(const SignatureFileInfo &second) const
+ {
+ return m_fileNumber < second.m_fileNumber;
+ }
private:
- std::string m_fileName;
- int m_fileNumber;
+ std::string m_fileName;
+ int m_fileNumber;
};
typedef std::set<SignatureFileInfo> SignatureFileInfoSet;
class SignatureFinder {
public:
- enum Result
- {
- NO_ERROR,
- ERROR_OPENING_DIR,
- ERROR_READING_DIR,
- ERROR_ISTREAM
- };
+ enum Result {
+ NO_ERROR,
+ ERROR_OPENING_DIR,
+ ERROR_READING_DIR,
+ ERROR_ISTREAM
+ };
- SignatureFinder() = delete;
- explicit SignatureFinder(const std::string& dir);
+ SignatureFinder() = delete;
+ explicit SignatureFinder(const std::string &dir);
- virtual ~SignatureFinder();
+ virtual ~SignatureFinder();
- Result find(SignatureFileInfoSet &set);
+ Result find(SignatureFileInfoSet &set);
private:
- class Impl;
- Impl *m_impl;
+ class Impl;
+ Impl *m_impl;
- SignatureFinder(const SignatureFinder &);
- const SignatureFinder &operator=(const SignatureFinder &);
+ SignatureFinder(const SignatureFinder &);
+ const SignatureFinder &operator=(const SignatureFinder &);
};
} // namespace ValidationCore
namespace ValidationCore {
static const std::string XML_NAMESPACE =
- "http://www.w3.org/2000/09/xmldsig#";
+ "http://www.w3.org/2000/09/xmldsig#";
static const std::string XML_NAMESPACE_DIGITALSIG =
- "http://wacapps.net/ns/digsig";
+ "http://wacapps.net/ns/digsig";
static const std::string XML_OBJ_NS =
- "http://www.w3.org/2009/xmldsig-properties";
+ "http://www.w3.org/2009/xmldsig-properties";
// TAG TOKENS
static const std::string TOKEN_SIGNATURE = "Signature";
static const std::string TOKEN_SIGNED_INFO = "SignedInfo";
static const std::string TOKEN_CANONICALIZATION_METHOD =
- "CanonicalizationMethod";
+ "CanonicalizationMethod";
static const std::string TOKEN_SIGNATURE_METHOD = "SignatureMethod";
static const std::string TOKEN_REFERENCE = "Reference";
static const std::string TOKEN_TRANSFORMS = "Transforms";
// "http://www.w3.org/2001/04/xmlenc#sha512";
SignatureReader::SignatureReader() :
- m_signaturePropertiesCounter(0),
- m_targetRestrictionObjectFound(false),
- m_parserSchema(this)
-{
- /**
- * member func pointers map
- */
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNED_INFO,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_CANONICALIZATION_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_REFERENCE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_TRANSFORMS,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_TRANSFORM,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DIGEST_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DIGEST_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_KEY_INFO,
- XML_NAMESPACE,
- &SignatureReader::tokenKeyInfo);
- m_parserSchema.addBeginTagCallback(TOKEN_X509DATA,
- XML_NAMESPACE,
- &SignatureReader::tokenX509Data);
- m_parserSchema.addBeginTagCallback(TOKEN_X509CERTIFICATE,
- XML_NAMESPACE,
- &SignatureReader::tokenX509Certificate);
- m_parserSchema.addBeginTagCallback(TOKEN_ECKEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_NAMED_CURVE,
- XML_NAMESPACE,
- &SignatureReader::tokenNamedCurve);
- m_parserSchema.addBeginTagCallback(TOKEN_PUBLIC_KEY,
- XML_NAMESPACE,
- &SignatureReader::tokenPublicKey);
- m_parserSchema.addBeginTagCallback(TOKEN_OBJECT,
- XML_NAMESPACE,
- &SignatureReader::tokenObject);
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_PROPERTIES,
- XML_NAMESPACE,
- &SignatureReader::tokenSignatureProperties);
- m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_PROPERTY,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_PROFILE,
- XML_OBJ_NS,
- &SignatureReader::tokenProfile);
- m_parserSchema.addBeginTagCallback(TOKEN_ROLE,
- XML_OBJ_NS,
- &SignatureReader::tokenRole);
- m_parserSchema.addBeginTagCallback(TOKEN_IDENTIFIER,
- XML_OBJ_NS,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_KEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSAKEYVALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_P_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_Q_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_G_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_Y_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_J_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_SEED_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_DSA_PGENCOUNTER_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_RSA_KEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_MODULUS_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_EXPONENT_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addBeginTagCallback(TOKEN_TARGET_RESTRICTION,
- XML_NAMESPACE_DIGITALSIG,
- &SignatureReader::tokenTargetRestriction);
-
- m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_SIGNED_INFO,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_CANONICALIZATION_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_REFERENCE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_TRANSFORMS,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_TRANSFORM,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_DIGEST_METHOD,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_DIGEST_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_KEY_INFO,
- XML_NAMESPACE,
- &SignatureReader::tokenEndKeyInfo);
- m_parserSchema.addEndTagCallback(TOKEN_X509DATA,
- XML_NAMESPACE,
- &SignatureReader::tokenEndX509Data);
- m_parserSchema.addEndTagCallback(TOKEN_X509CERTIFICATE,
- XML_NAMESPACE,
- &SignatureReader::tokenEndX509Certificate);
- m_parserSchema.addEndTagCallback(TOKEN_ECKEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::tokenEndECKeyValue);
- m_parserSchema.addEndTagCallback(TOKEN_PUBLIC_KEY,
- XML_NAMESPACE,
- &SignatureReader::tokenEndPublicKey);
- m_parserSchema.addEndTagCallback(TOKEN_OBJECT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndObject);
- m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_PROPERTIES,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_PROPERTY,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_PROFILE,
- XML_OBJ_NS,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_ROLE,
- XML_OBJ_NS,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_IDENTIFIER,
- XML_OBJ_NS,
- &SignatureReader::tokenEndIdentifier);
- m_parserSchema.addEndTagCallback(TOKEN_KEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
- m_parserSchema.addEndTagCallback(TOKEN_DSAKEYVALUE,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAKeyValue);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_P_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAPComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_Q_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAQComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_G_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAGComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_Y_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAYComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_J_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAJComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_SEED_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSASeedComponent);
- m_parserSchema.addEndTagCallback(TOKEN_DSA_PGENCOUNTER_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndDSAPGenCounterComponent);
- m_parserSchema.addEndTagCallback(TOKEN_RSA_KEY_VALUE,
- XML_NAMESPACE,
- &SignatureReader::tokenEndRSAKeyValue);
- m_parserSchema.addEndTagCallback(TOKEN_MODULUS_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndKeyModulus);
- m_parserSchema.addEndTagCallback(TOKEN_EXPONENT_COMPONENT,
- XML_NAMESPACE,
- &SignatureReader::tokenEndKeyExponent);
- m_parserSchema.addEndTagCallback(TOKEN_TARGET_RESTRICTION,
- XML_NAMESPACE,
- &SignatureReader::blankFunction);
+ m_signaturePropertiesCounter(0),
+ m_targetRestrictionObjectFound(false),
+ m_parserSchema(this)
+{
+ /**
+ * member func pointers map
+ */
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNED_INFO,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_CANONICALIZATION_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_REFERENCE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_TRANSFORMS,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_TRANSFORM,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DIGEST_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DIGEST_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_KEY_INFO,
+ XML_NAMESPACE,
+ &SignatureReader::tokenKeyInfo);
+ m_parserSchema.addBeginTagCallback(TOKEN_X509DATA,
+ XML_NAMESPACE,
+ &SignatureReader::tokenX509Data);
+ m_parserSchema.addBeginTagCallback(TOKEN_X509CERTIFICATE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenX509Certificate);
+ m_parserSchema.addBeginTagCallback(TOKEN_ECKEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_NAMED_CURVE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenNamedCurve);
+ m_parserSchema.addBeginTagCallback(TOKEN_PUBLIC_KEY,
+ XML_NAMESPACE,
+ &SignatureReader::tokenPublicKey);
+ m_parserSchema.addBeginTagCallback(TOKEN_OBJECT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenObject);
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_PROPERTIES,
+ XML_NAMESPACE,
+ &SignatureReader::tokenSignatureProperties);
+ m_parserSchema.addBeginTagCallback(TOKEN_SIGNATURE_PROPERTY,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_PROFILE,
+ XML_OBJ_NS,
+ &SignatureReader::tokenProfile);
+ m_parserSchema.addBeginTagCallback(TOKEN_ROLE,
+ XML_OBJ_NS,
+ &SignatureReader::tokenRole);
+ m_parserSchema.addBeginTagCallback(TOKEN_IDENTIFIER,
+ XML_OBJ_NS,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_KEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSAKEYVALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_P_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_Q_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_G_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_Y_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_J_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_SEED_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_DSA_PGENCOUNTER_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_RSA_KEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_MODULUS_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_EXPONENT_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addBeginTagCallback(TOKEN_TARGET_RESTRICTION,
+ XML_NAMESPACE_DIGITALSIG,
+ &SignatureReader::tokenTargetRestriction);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNED_INFO,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_CANONICALIZATION_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_REFERENCE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_TRANSFORMS,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_TRANSFORM,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_DIGEST_METHOD,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_DIGEST_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_KEY_INFO,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndKeyInfo);
+ m_parserSchema.addEndTagCallback(TOKEN_X509DATA,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndX509Data);
+ m_parserSchema.addEndTagCallback(TOKEN_X509CERTIFICATE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndX509Certificate);
+ m_parserSchema.addEndTagCallback(TOKEN_ECKEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndECKeyValue);
+ m_parserSchema.addEndTagCallback(TOKEN_PUBLIC_KEY,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndPublicKey);
+ m_parserSchema.addEndTagCallback(TOKEN_OBJECT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndObject);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_PROPERTIES,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_SIGNATURE_PROPERTY,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_PROFILE,
+ XML_OBJ_NS,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_ROLE,
+ XML_OBJ_NS,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_IDENTIFIER,
+ XML_OBJ_NS,
+ &SignatureReader::tokenEndIdentifier);
+ m_parserSchema.addEndTagCallback(TOKEN_KEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
+ m_parserSchema.addEndTagCallback(TOKEN_DSAKEYVALUE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAKeyValue);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_P_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAPComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_Q_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAQComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_G_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAGComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_Y_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAYComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_J_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAJComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_SEED_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSASeedComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_DSA_PGENCOUNTER_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndDSAPGenCounterComponent);
+ m_parserSchema.addEndTagCallback(TOKEN_RSA_KEY_VALUE,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndRSAKeyValue);
+ m_parserSchema.addEndTagCallback(TOKEN_MODULUS_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndKeyModulus);
+ m_parserSchema.addEndTagCallback(TOKEN_EXPONENT_COMPONENT,
+ XML_NAMESPACE,
+ &SignatureReader::tokenEndKeyExponent);
+ m_parserSchema.addEndTagCallback(TOKEN_TARGET_RESTRICTION,
+ XML_NAMESPACE,
+ &SignatureReader::blankFunction);
}
void SignatureReader::initialize(
- SignatureData &signatureData,
- const std::string &xmlscheme)
+ SignatureData &signatureData,
+ const std::string &xmlscheme)
{
- m_parserSchema.initialize(
- signatureData.getSignatureFileName(),
- true,
- SaxReader::VALIDATION_XMLSCHEME,
- xmlscheme);
+ m_parserSchema.initialize(
+ signatureData.getSignatureFileName(),
+ true,
+ SaxReader::VALIDATION_XMLSCHEME,
+ xmlscheme);
}
void SignatureReader::read(SignatureData &signatureData)
{
- m_parserSchema.read(signatureData);
+ m_parserSchema.read(signatureData);
}
void SignatureReader::blankFunction(SignatureData &)
void SignatureReader::tokenNamedCurve(SignatureData &)
{
- m_nameCurveURI = m_parserSchema.getReader().attribute(TOKEN_URI);
+ m_nameCurveURI = m_parserSchema.getReader().attribute(TOKEN_URI);
}
void SignatureReader::tokenTargetRestriction(SignatureData &signatureData)
{
- std::string IMEI = m_parserSchema.getReader().attribute(TOKEN_IMEI);
- std::string MEID = m_parserSchema.getReader().attribute(TOKEN_MEID);
+ std::string IMEI = m_parserSchema.getReader().attribute(TOKEN_IMEI);
+ std::string MEID = m_parserSchema.getReader().attribute(TOKEN_MEID);
- //less verbose way to say (IMEI && MEID) || (!IMEI && !MEID)
- if (IMEI.empty() == MEID.empty()) {
- //WAC 2.0 WR-4650 point 4
- VcoreThrowMsg(SignatureReader::Exception::TargetRestriction,
- "TargetRestriction should contain exactly one attribute.");
- }
+ //less verbose way to say (IMEI && MEID) || (!IMEI && !MEID)
+ if (IMEI.empty() == MEID.empty()) {
+ //WAC 2.0 WR-4650 point 4
+ VcoreThrowMsg(SignatureReader::Exception::TargetRestriction,
+ "TargetRestriction should contain exactly one attribute.");
+ }
- if (!IMEI.empty()) {
- signatureData.m_imeiList.push_back(IMEI);
- }
- if (!MEID.empty()) {
- signatureData.m_meidList.push_back(MEID);
- }
+ if (!IMEI.empty()) {
+ signatureData.m_imeiList.push_back(IMEI);
+ }
+
+ if (!MEID.empty()) {
+ signatureData.m_meidList.push_back(MEID);
+ }
}
void SignatureReader::tokenEndKeyInfo(SignatureData &)
void SignatureReader::tokenEndX509Certificate(SignatureData &signatureData)
{
- CertificateLoader loader;
- if (CertificateLoader::NO_ERROR !=
- loader.loadCertificateFromRawData(m_parserSchema.getText())) {
- fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
- VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
- "Certificate could not be loaded");
- }
- signatureData.m_certList.push_back(loader.getCertificatePtr());
+ CertificateLoader loader;
+
+ if (CertificateLoader::NO_ERROR !=
+ loader.loadCertificateFromRawData(m_parserSchema.getText())) {
+ fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
+ VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
+ "Certificate could not be loaded");
+ }
+
+ signatureData.m_certList.push_back(loader.getCertificatePtr());
}
void SignatureReader::tokenEndRSAKeyValue(SignatureData &signatureData)
{
- CertificateLoader loader;
- if (CertificateLoader::NO_ERROR !=
- loader.loadCertificateBasedOnExponentAndModulus(m_modulus,
- m_exponent)) {
- fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
- VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
- "Certificate could not be loaded");
- }
- signatureData.m_certList.push_back(loader.getCertificatePtr());
+ CertificateLoader loader;
+
+ if (CertificateLoader::NO_ERROR !=
+ loader.loadCertificateBasedOnExponentAndModulus(m_modulus,
+ m_exponent)) {
+ fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
+ VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
+ "Certificate could not be loaded");
+ }
+
+ signatureData.m_certList.push_back(loader.getCertificatePtr());
}
void SignatureReader::tokenEndKeyModulus(SignatureData &)
{
- m_modulus = m_parserSchema.getText();
+ m_modulus = m_parserSchema.getText();
}
void SignatureReader::tokenEndKeyExponent(SignatureData &)
{
- m_exponent = m_parserSchema.getText();
+ m_exponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndPublicKey(SignatureData &)
{
- m_publicKey = m_parserSchema.getText();
+ m_publicKey = m_parserSchema.getText();
}
void SignatureReader::tokenEndECKeyValue(SignatureData &signatureData)
{
- CertificateLoader loader;
- if (CertificateLoader::NO_ERROR !=
- loader.loadCertificateWithECKEY(m_nameCurveURI, m_publicKey)) {
- fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
- VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
- "Certificate could not be loaded");
- }
- signatureData.m_certList.push_back(loader.getCertificatePtr());
+ CertificateLoader loader;
+
+ if (CertificateLoader::NO_ERROR !=
+ loader.loadCertificateWithECKEY(m_nameCurveURI, m_publicKey)) {
+ fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
+ VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
+ "Certificate could not be loaded");
+ }
+
+ signatureData.m_certList.push_back(loader.getCertificatePtr());
}
void SignatureReader::tokenEndObject(SignatureData &signatureData)
{
- m_signaturePropertiesCounter = 0;
-
- if (((!signatureData.m_imeiList.empty()) ||
- (!signatureData.m_meidList.empty())) &&
- m_targetRestrictionObjectFound) {
- //WAC 2.0 WR-4650 point 1
- VcoreThrowMsg(SignatureReader::Exception::TargetRestriction,
- "TargetRestriction should contain exactly one ds:Object "
- "containing zero or more wac:TargetRestriction children.");
- }
+ m_signaturePropertiesCounter = 0;
- if ((!signatureData.m_imeiList.empty()) ||
- (!signatureData.m_meidList.empty())) {
- m_targetRestrictionObjectFound = true;
- }
+ if (((!signatureData.m_imeiList.empty()) ||
+ (!signatureData.m_meidList.empty())) &&
+ m_targetRestrictionObjectFound) {
+ //WAC 2.0 WR-4650 point 1
+ VcoreThrowMsg(SignatureReader::Exception::TargetRestriction,
+ "TargetRestriction should contain exactly one ds:Object "
+ "containing zero or more wac:TargetRestriction children.");
+ }
+ if ((!signatureData.m_imeiList.empty()) ||
+ (!signatureData.m_meidList.empty())) {
+ m_targetRestrictionObjectFound = true;
+ }
}
void SignatureReader::tokenEndDSAPComponent(SignatureData &)
{
- m_dsaKeyPComponent = m_parserSchema.getText();
+ m_dsaKeyPComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAQComponent(SignatureData &)
{
- m_dsaKeyQComponent = m_parserSchema.getText();
+ m_dsaKeyQComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAGComponent(SignatureData &)
{
- m_dsaKeyGComponent = m_parserSchema.getText();
+ m_dsaKeyGComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAYComponent(SignatureData &)
{
- m_dsaKeyYComponent = m_parserSchema.getText();
+ m_dsaKeyYComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAJComponent(SignatureData &)
{
- m_dsaKeyJComponent = m_parserSchema.getText();
+ m_dsaKeyJComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSASeedComponent(SignatureData &)
{
- m_dsaKeySeedComponent = m_parserSchema.getText();
+ m_dsaKeySeedComponent = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAPGenCounterComponent(SignatureData &)
{
- m_dsaKeyPGenCounter = m_parserSchema.getText();
+ m_dsaKeyPGenCounter = m_parserSchema.getText();
}
void SignatureReader::tokenEndDSAKeyValue(SignatureData &signatureData)
{
- CertificateLoader loader;
+ CertificateLoader loader;
+
+ if (CertificateLoader::NO_ERROR !=
+ loader.loadCertificateBasedOnDSAComponents(m_dsaKeyPComponent,
+ m_dsaKeyQComponent,
+ m_dsaKeyGComponent,
+ m_dsaKeyYComponent,
+ m_dsaKeyJComponent,
+ m_dsaKeySeedComponent,
+ m_dsaKeyPGenCounter)) {
+ fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
+ VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
+ "Certificate could not be loaded.");
+ }
- if (CertificateLoader::NO_ERROR !=
- loader.loadCertificateBasedOnDSAComponents(m_dsaKeyPComponent,
- m_dsaKeyQComponent,
- m_dsaKeyGComponent,
- m_dsaKeyYComponent,
- m_dsaKeyJComponent,
- m_dsaKeySeedComponent,
- m_dsaKeyPGenCounter)) {
- fprintf(stderr, "## [validate error]: Certificate could not be loaded\n");
- VcoreThrowMsg(ParserSchemaException::CertificateLoaderError,
- "Certificate could not be loaded.");
- }
- signatureData.m_certList.push_back(loader.getCertificatePtr());
+ signatureData.m_certList.push_back(loader.getCertificatePtr());
}
void SignatureReader::tokenRole(SignatureData &signatureData)
{
- if (!signatureData.m_roleURI.empty()) {
- fprintf(stderr, "## [validate error]: Multiple definition of Role is not allowed\n");
- VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
- "Multiple definition of Role is not allowed.");
- }
- signatureData.m_roleURI = m_parserSchema.getReader().attribute(TOKEN_URI);
+ if (!signatureData.m_roleURI.empty()) {
+ fprintf(stderr, "## [validate error]: Multiple definition of Role is not allowed\n");
+ VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
+ "Multiple definition of Role is not allowed.");
+ }
+
+ signatureData.m_roleURI = m_parserSchema.getReader().attribute(TOKEN_URI);
}
void SignatureReader::tokenProfile(SignatureData &signatureData)
{
- if (!signatureData.m_profileURI.empty()) {
- fprintf(stderr, "## [validate error]: Multiple definition of Profile is not allowed\n");
- VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
- "Multiple definition of Profile is not allowed.");
- }
- signatureData.m_profileURI = m_parserSchema.getReader().attribute(TOKEN_URI);
+ if (!signatureData.m_profileURI.empty()) {
+ fprintf(stderr, "## [validate error]: Multiple definition of Profile is not allowed\n");
+ VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
+ "Multiple definition of Profile is not allowed.");
+ }
+
+ signatureData.m_profileURI = m_parserSchema.getReader().attribute(TOKEN_URI);
}
void SignatureReader::tokenEndIdentifier(SignatureData &signatureData)
{
- if (!signatureData.m_identifier.empty()) {
- fprintf(stderr, "## [validate error]: Multiple definition of Identifier is not allowed\n");
- VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
- "Multiple definition of Identifier is not allowed.");
- }
- signatureData.m_identifier = m_parserSchema.getText();
+ if (!signatureData.m_identifier.empty()) {
+ fprintf(stderr, "## [validate error]: Multiple definition of Identifier is not allowed\n");
+ VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
+ "Multiple definition of Identifier is not allowed.");
+ }
+
+ signatureData.m_identifier = m_parserSchema.getText();
}
void SignatureReader::tokenObject(SignatureData &signatureData)
{
- std::string id = m_parserSchema.getReader().attribute(TOKEN_ID);
+ std::string id = m_parserSchema.getReader().attribute(TOKEN_ID);
- if (id.empty()) {
- fprintf(stderr, "## [validate error]: Unsupported value of Attribute Id in Object tag\n");
- VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
- "Unsupported value of Attribute Id in Object tag.");
- }
+ if (id.empty()) {
+ fprintf(stderr, "## [validate error]: Unsupported value of Attribute Id in Object tag\n");
+ VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
+ "Unsupported value of Attribute Id in Object tag.");
+ }
- signatureData.m_objectList.push_back(id);
+ signatureData.m_objectList.push_back(id);
}
void SignatureReader::tokenSignatureProperties(SignatureData &)
{
- if (++m_signaturePropertiesCounter > 1) {
- fprintf(stderr, "## [validate error]: Only one SignatureProperties tag is allowed in Object\n");
- VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
- "Only one SignatureProperties tag is allowed in Object");
- }
+ if (++m_signaturePropertiesCounter > 1) {
+ fprintf(stderr, "## [validate error]: Only one SignatureProperties tag is allowed in Object\n");
+ VcoreThrowMsg(ParserSchemaException::UnsupportedValue,
+ "Only one SignatureProperties tag is allowed in Object");
+ }
}
} // namespace ValidationCore
class SignatureReader {
public:
- class Exception {
- public:
- VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
- VCORE_DECLARE_EXCEPTION_TYPE(Base, TargetRestriction);
- };
+ class Exception {
+ public:
+ VCORE_DECLARE_EXCEPTION_TYPE(ValidationCore::Exception, Base);
+ VCORE_DECLARE_EXCEPTION_TYPE(Base, TargetRestriction);
+ };
- SignatureReader();
+ SignatureReader();
- void initialize(SignatureData &signatureData, const std::string &xmlscheme);
+ void initialize(SignatureData &signatureData, const std::string &xmlscheme);
- void read(SignatureData &signatureData);
+ void read(SignatureData &signatureData);
private:
- void blankFunction(SignatureData &signatureData);
-
- void tokenKeyInfo(SignatureData &signatureData);
- void tokenKeyModulus(SignatureData &signatureData);
- void tokenKeyExponent(SignatureData &signatureData);
- void tokenX509Data(SignatureData &signatureData);
- void tokenX509Certificate(SignatureData &signatureData);
- void tokenPublicKey(SignatureData &signatureData);
- void tokenNamedCurve(SignatureData &signatureData);
- void tokenRole(SignatureData &signatureData);
- void tokenProfile(SignatureData &signatureData);
- void tokenObject(SignatureData &signatureData);
- void tokenSignatureProperties(SignatureData &signatureData);
-
- void tokenTargetRestriction(SignatureData &signatureData);
-
- void tokenEndKeyInfo(SignatureData &signatureData);
- // KW void tokenEndKeyName(SignatureData &signatureData);
-
- void tokenEndRSAKeyValue(SignatureData &signatureData);
-
- void tokenEndKeyModulus(SignatureData &signatureData);
- void tokenEndKeyExponent(SignatureData &signatureData);
- void tokenEndX509Data(SignatureData &signatureData);
-
- void tokenEndX509Certificate(SignatureData &signatureData);
-
- void tokenEndPublicKey(SignatureData &signatureData);
- void tokenEndECKeyValue(SignatureData &signatureData);
- void tokenEndIdentifier(SignatureData &signatureData);
- void tokenEndObject(SignatureData &signatureData);
-
- // DSA key components
- void tokenEndDSAPComponent(SignatureData& signatureData);
- void tokenEndDSAQComponent(SignatureData& signatureData);
- void tokenEndDSAGComponent(SignatureData& signatureData);
- void tokenEndDSAYComponent(SignatureData& signatureData);
- void tokenEndDSAJComponent(SignatureData& signatureData);
-
- void tokenEndDSAKeyValue(SignatureData& signatureData);
-
- void tokenEndDSASeedComponent(SignatureData& signatureData);
- void tokenEndDSAPGenCounterComponent(SignatureData& signatureData);
-
- // temporary values required due reference parsing process
- // optional parameters for dsa
- std::string m_dsaKeyPComponent;
- std::string m_dsaKeyQComponent;
- std::string m_dsaKeyGComponent;
- std::string m_dsaKeyYComponent;
- std::string m_dsaKeyJComponent;
- std::string m_dsaKeySeedComponent;
- std::string m_dsaKeyPGenCounter;
- // temporary values of ecdsa key
- std::string m_publicKey;
- std::string m_nameCurveURI;
- std::string m_modulus;
- std::string m_exponent;
-
- // temporary values required due Object parsing
- int m_signaturePropertiesCounter;
- bool m_targetRestrictionObjectFound;
-
- ParserSchema<SignatureReader, SignatureData> m_parserSchema;
+ void blankFunction(SignatureData &signatureData);
+
+ void tokenKeyInfo(SignatureData &signatureData);
+ void tokenKeyModulus(SignatureData &signatureData);
+ void tokenKeyExponent(SignatureData &signatureData);
+ void tokenX509Data(SignatureData &signatureData);
+ void tokenX509Certificate(SignatureData &signatureData);
+ void tokenPublicKey(SignatureData &signatureData);
+ void tokenNamedCurve(SignatureData &signatureData);
+ void tokenRole(SignatureData &signatureData);
+ void tokenProfile(SignatureData &signatureData);
+ void tokenObject(SignatureData &signatureData);
+ void tokenSignatureProperties(SignatureData &signatureData);
+
+ void tokenTargetRestriction(SignatureData &signatureData);
+
+ void tokenEndKeyInfo(SignatureData &signatureData);
+ // KW void tokenEndKeyName(SignatureData &signatureData);
+
+ void tokenEndRSAKeyValue(SignatureData &signatureData);
+
+ void tokenEndKeyModulus(SignatureData &signatureData);
+ void tokenEndKeyExponent(SignatureData &signatureData);
+ void tokenEndX509Data(SignatureData &signatureData);
+
+ void tokenEndX509Certificate(SignatureData &signatureData);
+
+ void tokenEndPublicKey(SignatureData &signatureData);
+ void tokenEndECKeyValue(SignatureData &signatureData);
+ void tokenEndIdentifier(SignatureData &signatureData);
+ void tokenEndObject(SignatureData &signatureData);
+
+ // DSA key components
+ void tokenEndDSAPComponent(SignatureData &signatureData);
+ void tokenEndDSAQComponent(SignatureData &signatureData);
+ void tokenEndDSAGComponent(SignatureData &signatureData);
+ void tokenEndDSAYComponent(SignatureData &signatureData);
+ void tokenEndDSAJComponent(SignatureData &signatureData);
+
+ void tokenEndDSAKeyValue(SignatureData &signatureData);
+
+ void tokenEndDSASeedComponent(SignatureData &signatureData);
+ void tokenEndDSAPGenCounterComponent(SignatureData &signatureData);
+
+ // temporary values required due reference parsing process
+ // optional parameters for dsa
+ std::string m_dsaKeyPComponent;
+ std::string m_dsaKeyQComponent;
+ std::string m_dsaKeyGComponent;
+ std::string m_dsaKeyYComponent;
+ std::string m_dsaKeyJComponent;
+ std::string m_dsaKeySeedComponent;
+ std::string m_dsaKeyPGenCounter;
+ // temporary values of ecdsa key
+ std::string m_publicKey;
+ std::string m_nameCurveURI;
+ std::string m_modulus;
+ std::string m_exponent;
+
+ // temporary values required due Object parsing
+ int m_signaturePropertiesCounter;
+ bool m_targetRestrictionObjectFound;
+
+ ParserSchema<SignatureReader, SignatureData> m_parserSchema;
};
}
inline bool _isTimeStrict(const Set &stores)
{
return (stores.contains(TIZEN_TEST) || stores.contains(TIZEN_VERIFY))
- ? true : false;
+ ? true : false;
}
} // namespace anonymous
if (roleURI != TOKEN_ROLE_AUTHOR_URI && m_data.isAuthorSignature()) {
LogWarning("URI attribute in Role tag does not "
- "match with signature filename.");
+ "match with signature filename.");
return false;
}
if (roleURI != TOKEN_ROLE_DIST_URI && !m_data.isAuthorSignature()) {
LogWarning("URI attribute in Role tag does not "
- "match with signature filename.");
+ "match with signature filename.");
return false;
}
+
return true;
}
{
if (TOKEN_PROFILE_URI != m_data.getProfileURI()) {
LogWarning("Profile tag contains unsupported value "
- "in URI attribute " << m_data.getProfileURI());
+ "in URI attribute " << m_data.getProfileURI());
return false;
}
+
return true;
}
try {
CertificateCollection collection;
-
// Load Certificates and make chain.
collection.load(m_data.getCertList());
+
if (!collection.sort() || collection.empty()) {
LogError("Certificates do not form valid chain.");
return E_SIG_INVALID_CHAIN;
return E_SIG_INVALID_CHAIN;
} else {
LogDebug("Distributor N's certificate has got "
- "unrecognized root CA certificate.");
+ "unrecognized root CA certificate.");
m_disregarded = true;
}
}
m_data.setSortedCertificateList(collection.getChain());
LogDebug("Finish making chain successfully.");
-
} catch (const CertificateCollection::Exception::Base &e) {
LogError("CertificateCollection exception : " << e.DumpToString());
return E_SIG_INVALID_CHAIN;
{
// Make chain process.
VCerr result = makeDataBySignature(true);
+
if (result != E_SIG_NONE)
return result;
LogDebug("Start to check certificate domain.");
auto certificatePtr = m_data.getCertList().back();
auto storeIdSet = createCertificateIdentifier().find(certificatePtr);
-
// Check root CA certificate has proper domain.
LogDebug("root certificate from " << storeIdSet.typeToString() << " domain");
+
if (m_data.isAuthorSignature()) {
if (!storeIdSet.contains(TIZEN_DEVELOPER)) {
LogError("author-signature.xml's root certificate "
- "isn't in tizen developer domain.");
+ "isn't in tizen developer domain.");
return E_SIG_INVALID_CHAIN;
}
} else {
if (storeIdSet.contains(TIZEN_DEVELOPER)) {
LogError("distributor signautre root certificate "
- "shouldn't be in tizen developer domain.");
+ "shouldn't be in tizen developer domain.");
return E_SIG_INVALID_CHAIN;
}
+
if (m_data.getSignatureNumber() == 1 && !storeIdSet.isContainsVis()) {
LogError("signature1.xml has got unrecognized root CA certificate.");
return E_SIG_INVALID_CHAIN;
m_data.setStorageType(storeIdSet);
LogDebug("Finish checking certificate domain.");
-
/*
* We add only Root CA certificate because the rest
* of certificates are present in signature files ;-)
*/
m_context.signatureFile = m_data.getSignatureFileName();
m_context.certificatePtr = m_data.getCertList().back();
-
/* certificate time check */
time_t lower = m_data.getEndEntityCertificatePtr()->getNotBefore();
time_t upper = m_data.getEndEntityCertificatePtr()->getNotAfter();
if (status != CertTimeStatus::VALID) {
LogDebug("Certificate's time is invalid.");
+
if (_isTimeStrict(storeIdSet))
return status == CertTimeStatus::EXPIRED
- ? E_SIG_CERT_EXPIRED : E_SIG_CERT_NOT_YET;
+ ? E_SIG_CERT_EXPIRED : E_SIG_CERT_NOT_YET;
time_t mid = _getMidTime(lower, upper);
LogInfo("Use middle notBeforeTime and notAfterTime."
try {
// Make certificate chain, check certificate info
VCerr result = preStep();
+
if (result != E_SIG_NONE)
return result;
// XmlSec validate
XmlSecSingleton::Instance().validate(m_context);
-
// Check reference of 'Object' tag - OID
m_data.setReference(m_context.referenceSet);
+
if (!checkObjectReferences()) {
LogWarning("Failed to check Object References");
return E_SIG_INVALID_REF;
// Check reference's existence
if (checkReferences) {
ReferenceValidator fileValidator(contentPath);
+
if (ReferenceValidator::NO_ERROR != fileValidator.checkReferences(m_data)) {
LogWarning("Invalid package - file references broken");
return E_SIG_INVALID_REF;
}
LogDebug("Signature validation check done successfully ");
-
} catch (const CertificateCollection::Exception::Base &e) {
LogError("CertificateCollection exception : " << e.DumpToString());
return E_SIG_INVALID_CHAIN;
LogInfo("Ocsp check throw exeption : " << e.DumpToString());
#ifdef PROFILE_MOBILE
LogInfo("Launch cert-checker.");
+
if (cchecker_ocsp_request() != 0)
LogError("Load cert-checker failed.");
+
#endif
} catch (const std::exception &e) {
LogError("std exception occured : " << e.what());
try {
// Make certificate chain, check certificate info
VCerr result = preStep();
+
if (result != E_SIG_NONE)
return result;
}
LogDebug("Signature validation of check list done successfully ");
-
} catch (const CertificateCollection::Exception::Base &e) {
LogError("CertificateCollection exception : " << e.DumpToString());
return E_SIG_INVALID_CHAIN;
LogInfo("Ocsp check throw exeption : " << e.DumpToString());
#ifdef PROFILE_MOBILE
LogInfo("Launch cert-checker.");
+
if (cchecker_ocsp_request() != 0)
LogError("Load cert-checker failed.");
+
#endif
} catch (...) {
LogError("Unknown exception in SignatureValidator::checkList");
SignatureData &outData)
{
VCerr result;
-
result = baseCheck(contentPath, checkOcsp, checkReferences);
result = additionalCheck(result);
-
outData = m_data;
-
return result;
}
SignatureData &outData)
{
VCerr result;
-
result = baseCheckList(checkOcsp, uriList);
result = additionalCheck(result);
-
outData = m_data;
-
return result;
}
CertificateList &certList)
{
VCerr result = makeDataBySignature(completeWithSystemCert);
+
if (result != E_SIG_NONE)
return result;
certList = m_data.getCertList();
-
return E_SIG_NONE;
}
std::string SignatureValidator::Impl::errorToString(VCerr code)
{
switch (code) {
- case E_SIG_NONE: return "Success.";
- case E_SIG_INVALID_FORMAT: return "Invalid format of signature file.";
- case E_SIG_INVALID_CERT: return "Invalid format of certificate in signature.";
- case E_SIG_INVALID_CHAIN: return "Invalid certificate chain with certificate in signature.";
- case E_SIG_INVALID_SIG: return "Invalid signature. Signed with wrong key, changed signature file or changed package file.";
- case E_SIG_INVALID_REF: return "Invalid file reference. An unsinged file was found.";
- case E_SIG_CERT_EXPIRED: return "Certificate in signature was expired.";
- case E_SIG_CERT_NOT_YET: return "Certificate in signature is not valid yet.";
- case E_SIG_DISREGARDED: return "Signature validation can be disregarded in some cases.";
- case E_SIG_REVOKED: return "One of certificate was revoked in certificate chain.";
- case E_SIG_PLUGIN: return "Failed to load plugin for additional validation check.";
- case E_SIG_OUT_OF_MEM: return "Out of memory.";
- case E_SIG_UNKNOWN: return "Unknown error.";
- default: return m_pluginHandler.errorToString(code);
+ case E_SIG_NONE:
+ return "Success.";
+
+ case E_SIG_INVALID_FORMAT:
+ return "Invalid format of signature file.";
+
+ case E_SIG_INVALID_CERT:
+ return "Invalid format of certificate in signature.";
+
+ case E_SIG_INVALID_CHAIN:
+ return "Invalid certificate chain with certificate in signature.";
+
+ case E_SIG_INVALID_SIG:
+ return "Invalid signature. Signed with wrong key, changed signature file or changed package file.";
+
+ case E_SIG_INVALID_REF:
+ return "Invalid file reference. An unsinged file was found.";
+
+ case E_SIG_CERT_EXPIRED:
+ return "Certificate in signature was expired.";
+
+ case E_SIG_CERT_NOT_YET:
+ return "Certificate in signature is not valid yet.";
+
+ case E_SIG_DISREGARDED:
+ return "Signature validation can be disregarded in some cases.";
+
+ case E_SIG_REVOKED:
+ return "One of certificate was revoked in certificate chain.";
+
+ case E_SIG_PLUGIN:
+ return "Failed to load plugin for additional validation check.";
+
+ case E_SIG_OUT_OF_MEM:
+ return "Out of memory.";
+
+ case E_SIG_UNKNOWN:
+ return "Unknown error.";
+
+ default:
+ return m_pluginHandler.errorToString(code);
}
}
return E_SIG_OUT_OF_MEM;
return m_pImpl->check(
- contentPath,
- checkOcsp,
- checkReferences,
- outData);
+ contentPath,
+ checkOcsp,
+ checkReferences,
+ outData);
}
VCerr SignatureValidator::checkList(
return E_SIG_OUT_OF_MEM;
return m_pImpl->checkList(
- checkOcsp,
- uriList,
- outData);
+ checkOcsp,
+ uriList,
+ outData);
}
VCerr SignatureValidator::makeChainBySignature(
*/
class SignatureValidator {
public:
- SignatureValidator(const SignatureFileInfo &info);
- virtual ~SignatureValidator();
+ SignatureValidator(const SignatureFileInfo &info);
+ virtual ~SignatureValidator();
- SignatureValidator() = delete;
- SignatureValidator(const SignatureValidator &) = delete;
- const SignatureValidator &operator=(const SignatureValidator &) = delete;
+ SignatureValidator() = delete;
+ SignatureValidator(const SignatureValidator &) = delete;
+ const SignatureValidator &operator=(const SignatureValidator &) = delete;
- VCerr check(
- const std::string &contentPath,
- bool checkOcsp,
- bool checkReferences,
- SignatureData &outData);
+ VCerr check(
+ const std::string &contentPath,
+ bool checkOcsp,
+ bool checkReferences,
+ SignatureData &outData);
- VCerr checkList(
- bool checkOcsp,
- const UriList &uriList,
- SignatureData &outData);
+ VCerr checkList(
+ bool checkOcsp,
+ const UriList &uriList,
+ SignatureData &outData);
- /*
- * @Remarks : cert list isn't completed with self-signed root CA system cert
- * if completeWithSystemCert is false.
- */
- VCerr makeChainBySignature(
- bool completeWithSystemCert,
- CertificateList &certList);
+ /*
+ * @Remarks : cert list isn't completed with self-signed root CA system cert
+ * if completeWithSystemCert is false.
+ */
+ VCerr makeChainBySignature(
+ bool completeWithSystemCert,
+ CertificateList &certList);
- std::string errorToString(int code);
+ std::string errorToString(int code);
private:
- class Impl;
- std::unique_ptr<Impl> m_pImpl;
+ class Impl;
+ std::unique_ptr<Impl> m_pImpl;
};
} // namespace ValidationCore
void _gmtime_adj(struct tm *tm, int offset)
{
- time_t t = mktime(tm);
- t += offset;
-
- memset(tm, 0, sizeof(struct tm));
-
- gmtime_r(&t, tm);
+ time_t t = mktime(tm);
+ t += offset;
+ memset(tm, 0, sizeof(struct tm));
+ gmtime_r(&t, tm);
}
/*
*/
int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d)
{
- static const int min[9] = { 0, 0, 1, 1, 0, 0, 0, 0, 0 };
- static const int max[9] = { 99, 99, 12, 31, 23, 59, 59, 12, 59 };
- char *a;
- int n, i, l, o;
-
- if (d->type != V_ASN1_GENERALIZEDTIME)
- return (0);
- l = d->length;
- a = (char *)d->data;
- o = 0;
- /*
- * GENERALIZEDTIME is similar to UTCTIME except the year is represented
- * as YYYY. This stuff treats everything as a two digit field so make
- * first two fields 00 to 99
- */
- if (l < 13)
- goto err;
- for (i = 0; i < 7; i++) {
- if ((i == 6) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
- i++;
- if (tm)
- tm->tm_sec = 0;
- break;
- }
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = a[o] - '0';
- if (++o > l)
- goto err;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = (n * 10) + a[o] - '0';
- if (++o > l)
- goto err;
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
- if (tm) {
- switch (i) {
- case 0:
- tm->tm_year = n * 100 - 1900;
- break;
- case 1:
- tm->tm_year += n;
- break;
- case 2:
- tm->tm_mon = n - 1;
- break;
- case 3:
- tm->tm_mday = n;
- break;
- case 4:
- tm->tm_hour = n;
- break;
- case 5:
- tm->tm_min = n;
- break;
- case 6:
- tm->tm_sec = n;
- break;
- }
- }
- }
- /*
- * Optional fractional seconds: decimal point followed by one or more
- * digits.
- */
- if (a[o] == '.') {
- if (++o > l)
- goto err;
- i = o;
- while ((a[o] >= '0') && (a[o] <= '9') && (o <= l))
- o++;
- /* Must have at least one digit after decimal point */
- if (i == o)
- goto err;
- }
-
- if (a[o] == 'Z')
- o++;
- else if ((a[o] == '+') || (a[o] == '-')) {
- int offsign = a[o] == '-' ? -1 : 1, offset = 0;
- o++;
- if (o + 4 > l)
- goto err;
- for (i = 7; i < 9; i++) {
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = a[o] - '0';
- o++;
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = (n * 10) + a[o] - '0';
- if ((n < min[i]) || (n > max[i]))
- goto err;
- if (tm) {
- if (i == 7)
- offset = n * 3600;
- else if (i == 8)
- offset += n * 60;
- }
- o++;
- }
- if (offset)
- _gmtime_adj(tm, offset * offsign);
- } else if (a[o]) {
- /* Missing time zone information. */
- goto err;
- }
- return (o == l);
- err:
- return (0);
+ static const int min[9] = { 0, 0, 1, 1, 0, 0, 0, 0, 0 };
+ static const int max[9] = { 99, 99, 12, 31, 23, 59, 59, 12, 59 };
+ char *a;
+ int n, i, l, o;
+
+ if (d->type != V_ASN1_GENERALIZEDTIME)
+ return (0);
+
+ l = d->length;
+ a = (char *)d->data;
+ o = 0;
+
+ /*
+ * GENERALIZEDTIME is similar to UTCTIME except the year is represented
+ * as YYYY. This stuff treats everything as a two digit field so make
+ * first two fields 00 to 99
+ */
+ if (l < 13)
+ goto err;
+
+ for (i = 0; i < 7; i++) {
+ if ((i == 6) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
+ i++;
+
+ if (tm)
+ tm->tm_sec = 0;
+
+ break;
+ }
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = a[o] - '0';
+
+ if (++o > l)
+ goto err;
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = (n * 10) + a[o] - '0';
+
+ if (++o > l)
+ goto err;
+
+ if ((n < min[i]) || (n > max[i]))
+ goto err;
+
+ if (tm) {
+ switch (i) {
+ case 0:
+ tm->tm_year = n * 100 - 1900;
+ break;
+
+ case 1:
+ tm->tm_year += n;
+ break;
+
+ case 2:
+ tm->tm_mon = n - 1;
+ break;
+
+ case 3:
+ tm->tm_mday = n;
+ break;
+
+ case 4:
+ tm->tm_hour = n;
+ break;
+
+ case 5:
+ tm->tm_min = n;
+ break;
+
+ case 6:
+ tm->tm_sec = n;
+ break;
+ }
+ }
+ }
+
+ /*
+ * Optional fractional seconds: decimal point followed by one or more
+ * digits.
+ */
+ if (a[o] == '.') {
+ if (++o > l)
+ goto err;
+
+ i = o;
+
+ while ((a[o] >= '0') && (a[o] <= '9') && (o <= l))
+ o++;
+
+ /* Must have at least one digit after decimal point */
+ if (i == o)
+ goto err;
+ }
+
+ if (a[o] == 'Z') {
+ o++;
+ } else if ((a[o] == '+') || (a[o] == '-')) {
+ int offsign = a[o] == '-' ? -1 : 1, offset = 0;
+ o++;
+
+ if (o + 4 > l)
+ goto err;
+
+ for (i = 7; i < 9; i++) {
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = a[o] - '0';
+ o++;
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = (n * 10) + a[o] - '0';
+
+ if ((n < min[i]) || (n > max[i]))
+ goto err;
+
+ if (tm) {
+ if (i == 7)
+ offset = n * 3600;
+ else if (i == 8)
+ offset += n * 60;
+ }
+
+ o++;
+ }
+
+ if (offset)
+ _gmtime_adj(tm, offset * offsign);
+ } else if (a[o]) {
+ /* Missing time zone information. */
+ goto err;
+ }
+
+ return (o == l);
+err:
+ return (0);
}
/*
*/
int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d)
{
- static const int min[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
- static const int max[8] = { 99, 12, 31, 23, 59, 59, 12, 59 };
- char *a;
- int n, i, l, o;
-
- if (d->type != V_ASN1_UTCTIME)
- return (0);
- l = d->length;
- a = (char *)d->data;
- o = 0;
-
- if (l < 11)
- goto err;
- for (i = 0; i < 6; i++) {
- if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
- i++;
- if (tm)
- tm->tm_sec = 0;
- break;
- }
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = a[o] - '0';
- if (++o > l)
- goto err;
-
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = (n * 10) + a[o] - '0';
- if (++o > l)
- goto err;
-
- if ((n < min[i]) || (n > max[i]))
- goto err;
- if (tm) {
- switch (i) {
- case 0:
- tm->tm_year = n < 50 ? n + 100 : n;
- break;
- case 1:
- tm->tm_mon = n - 1;
- break;
- case 2:
- tm->tm_mday = n;
- break;
- case 3:
- tm->tm_hour = n;
- break;
- case 4:
- tm->tm_min = n;
- break;
- case 5:
- tm->tm_sec = n;
- break;
- }
- }
- }
- if (a[o] == 'Z')
- o++;
- else if ((a[o] == '+') || (a[o] == '-')) {
- int offsign = a[o] == '-' ? -1 : 1, offset = 0;
- o++;
- if (o + 4 > l)
- goto err;
- for (i = 6; i < 8; i++) {
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = a[o] - '0';
- o++;
- if ((a[o] < '0') || (a[o] > '9'))
- goto err;
- n = (n * 10) + a[o] - '0';
- if ((n < min[i]) || (n > max[i]))
- goto err;
- if (tm) {
- if (i == 6)
- offset = n * 3600;
- else if (i == 7)
- offset += n * 60;
- }
- o++;
- }
- if (offset)
- _gmtime_adj(tm, offset * offsign);
- }
- return o == l;
- err:
- return 0;
+ static const int min[8] = { 0, 1, 1, 0, 0, 0, 0, 0 };
+ static const int max[8] = { 99, 12, 31, 23, 59, 59, 12, 59 };
+ char *a;
+ int n, i, l, o;
+
+ if (d->type != V_ASN1_UTCTIME)
+ return (0);
+
+ l = d->length;
+ a = (char *)d->data;
+ o = 0;
+
+ if (l < 11)
+ goto err;
+
+ for (i = 0; i < 6; i++) {
+ if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) {
+ i++;
+
+ if (tm)
+ tm->tm_sec = 0;
+
+ break;
+ }
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = a[o] - '0';
+
+ if (++o > l)
+ goto err;
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = (n * 10) + a[o] - '0';
+
+ if (++o > l)
+ goto err;
+
+ if ((n < min[i]) || (n > max[i]))
+ goto err;
+
+ if (tm) {
+ switch (i) {
+ case 0:
+ tm->tm_year = n < 50 ? n + 100 : n;
+ break;
+
+ case 1:
+ tm->tm_mon = n - 1;
+ break;
+
+ case 2:
+ tm->tm_mday = n;
+ break;
+
+ case 3:
+ tm->tm_hour = n;
+ break;
+
+ case 4:
+ tm->tm_min = n;
+ break;
+
+ case 5:
+ tm->tm_sec = n;
+ break;
+ }
+ }
+ }
+
+ if (a[o] == 'Z') {
+ o++;
+ } else if ((a[o] == '+') || (a[o] == '-')) {
+ int offsign = a[o] == '-' ? -1 : 1, offset = 0;
+ o++;
+
+ if (o + 4 > l)
+ goto err;
+
+ for (i = 6; i < 8; i++) {
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = a[o] - '0';
+ o++;
+
+ if ((a[o] < '0') || (a[o] > '9'))
+ goto err;
+
+ n = (n * 10) + a[o] - '0';
+
+ if ((n < min[i]) || (n > max[i]))
+ goto err;
+
+ if (tm) {
+ if (i == 6)
+ offset = n * 3600;
+ else if (i == 7)
+ offset += n * 60;
+ }
+
+ o++;
+ }
+
+ if (offset)
+ _gmtime_adj(tm, offset * offsign);
+ }
+
+ return o == l;
+err:
+ return 0;
}
} // namespace anonymous
int asn1TimeToTimeT(ASN1_TIME *t, time_t *res)
{
- if (res == NULL)
- return 0;
-
- int ret = 0;
- struct tm tm;
-
- memset(&tm, 0, sizeof(tm));
+ if (res == NULL)
+ return 0;
- if (t->type == V_ASN1_UTCTIME)
- ret = asn1_utctime_to_tm(&tm, t);
- else if (t->type == V_ASN1_GENERALIZEDTIME)
- ret = asn1_generalizedtime_to_tm(&tm, t);
- else
- ret = 0;
+ int ret = 0;
+ struct tm tm;
+ memset(&tm, 0, sizeof(tm));
- if (ret == 0)
- return 0;
+ if (t->type == V_ASN1_UTCTIME)
+ ret = asn1_utctime_to_tm(&tm, t);
+ else if (t->type == V_ASN1_GENERALIZEDTIME)
+ ret = asn1_generalizedtime_to_tm(&tm, t);
+ else
+ ret = 0;
- char buf[27]; // asctime_r return 26 characters
- LogDebug("Convert asn1 to tm: " << asctime_r(&tm, buf));
- *res = mktime(&tm);
+ if (ret == 0)
+ return 0;
- // If time_t occured overflow, set TIME_MAX.
- if(*res == -1) {
- LogDebug("Occured overflow time_t. it may year 2038 problem.");
- *res = TIME_MAX;
- }
+ char buf[27]; // asctime_r return 26 characters
+ LogDebug("Convert asn1 to tm: " << asctime_r(&tm, buf));
+ *res = mktime(&tm);
- // For Debugging.
- struct tm localTm;
- localtime_r(res, &localTm);
- LogDebug("Result time_t(tm format): " << asctime_r(&localTm, buf));
+ // If time_t occured overflow, set TIME_MAX.
+ if (*res == -1) {
+ LogDebug("Occured overflow time_t. it may year 2038 problem.");
+ *res = TIME_MAX;
+ }
- return 1;
+ // For Debugging.
+ struct tm localTm;
+ localtime_r(res, &localTm);
+ LogDebug("Result time_t(tm format): " << asctime_r(&localTm, buf));
+ return 1;
}
} // namespace ValidationCore
namespace ValidationCore {
-const CertificateIdentifier& createCertificateIdentifier()
+const CertificateIdentifier &createCertificateIdentifier()
{
static CertificateIdentifier certificateIdentifier;
static bool initialized = false;
std::string schema(FINGERPRINT_LIST_SCHEMA_PATH);
LogDebug("File with fingerprint list is : " << file);
LogDebug("File with fingerprint list schema is : " << schema);
-
// Read the fingerprint original list.
CertificateConfigReader reader;
reader.initialize(file, schema);
reader.read(certificateIdentifier);
// Check the fingerprint extention list exist.
- if (std::ifstream(FINGERPRINT_LIST_EXT_PATH))
- {
+ if (std::ifstream(FINGERPRINT_LIST_EXT_PATH)) {
std::string extFile(FINGERPRINT_LIST_EXT_PATH);
LogDebug("Exist fingerprint extention file, add it.");
-
// Read the fingerprint extention list.
CertificateConfigReader extReader;
extReader.initialize(extFile, schema);
initialized = true;
}
- return certificateIdentifier;
+ return certificateIdentifier;
}
} // namespace ValidationCore
// CertificateConfigReader and CertificateIdentificator so
// we are using factory method to create CertificateIdentificator.
-const CertificateIdentifier& createCertificateIdentifier();
+const CertificateIdentifier &createCertificateIdentifier();
} // namespace ValidationCore
#endif // _WRT_ENGINE_SRC_INSTALLER_CORE_VALIDATION_CORE_VALIDATORFACTORY_H_
template <typename Type>
struct CustomPtr {
- Type ptr;
- std::function<void(Type)> deleter;
-
- CustomPtr() = delete;
-
- explicit CustomPtr(Type in, std::function<void(Type)> d)
- : ptr(in)
- , deleter(d) {}
-
- ~CustomPtr()
- {
- deleter(ptr);
- }
-
- inline Type get(void) const
- {
- return ptr;
- }
-
- inline Type operator->() const
- {
- return ptr;
- }
-
- inline bool operator!() const
- {
- return (ptr == nullptr) ? true : false;
- }
+ Type ptr;
+ std::function<void(Type)> deleter;
+
+ CustomPtr() = delete;
+
+ explicit CustomPtr(Type in, std::function<void(Type)> d)
+ : ptr(in)
+ , deleter(d) {}
+
+ ~CustomPtr()
+ {
+ deleter(ptr);
+ }
+
+ inline Type get(void) const
+ {
+ return ptr;
+ }
+
+ inline Type operator->() const
+ {
+ return ptr;
+ }
+
+ inline bool operator!() const
+ {
+ return (ptr == nullptr) ? true : false;
+ }
};
struct FileWrapper {
- FileWrapper(void *argFile, bool argReleased)
- : file(argFile)
- , released(argReleased)
- {}
- void *file;
- bool released;
+ FileWrapper(void *argFile, bool argReleased)
+ : file(argFile)
+ , released(argReleased)
+ {}
+ void *file;
+ bool released;
};
} // anonymous namespace
int XmlSec::fileMatchCallback(const char *filename)
{
- std::string path = s_prefixPath + filename;
-
- return xmlFileMatch(path.c_str());
+ std::string path = s_prefixPath + filename;
+ return xmlFileMatch(path.c_str());
}
void *XmlSec::fileOpenCallback(const char *filename)
{
- std::string path = s_prefixPath + filename;
-
- LogDebug("Xmlsec opening : " << path);
- return new FileWrapper(xmlFileOpen(path.c_str()), false);
+ std::string path = s_prefixPath + filename;
+ LogDebug("Xmlsec opening : " << path);
+ return new FileWrapper(xmlFileOpen(path.c_str()), false);
}
int XmlSec::fileReadCallback(void *context,
- char *buffer,
- int len)
+ char *buffer,
+ int len)
{
- FileWrapper *fw = static_cast<FileWrapper*>(context);
- if (fw->released)
- return 0;
+ FileWrapper *fw = static_cast<FileWrapper *>(context);
+
+ if (fw->released)
+ return 0;
- int output = xmlFileRead(fw->file, buffer, len);
- if (output == 0) {
- fw->released = true;
- xmlFileClose(fw->file);
- }
+ int output = xmlFileRead(fw->file, buffer, len);
- return output;
+ if (output == 0) {
+ fw->released = true;
+ xmlFileClose(fw->file);
+ }
+
+ return output;
}
int XmlSec::fileCloseCallback(void *context)
{
- FileWrapper *fw = static_cast<FileWrapper*>(context);
- int output = 0;
- if (!fw->released)
- output = xmlFileClose(fw->file);
+ FileWrapper *fw = static_cast<FileWrapper *>(context);
+ int output = 0;
- delete fw;
+ if (!fw->released)
+ output = xmlFileClose(fw->file);
- return output;
+ delete fw;
+ return output;
}
void XmlSec::fileExtractPrefix(XmlSecContext &context)
{
- if (!context.workingDirectory.empty()) {
- s_prefixPath = context.workingDirectory;
- return;
- }
-
- s_prefixPath = context.signatureFile;
- size_t pos = s_prefixPath.rfind('/');
- if (pos == std::string::npos)
- s_prefixPath.clear();
- else
- s_prefixPath.erase(pos + 1, std::string::npos);
+ if (!context.workingDirectory.empty()) {
+ s_prefixPath = context.workingDirectory;
+ return;
+ }
+
+ s_prefixPath = context.signatureFile;
+ size_t pos = s_prefixPath.rfind('/');
+
+ if (pos == std::string::npos)
+ s_prefixPath.clear();
+ else
+ s_prefixPath.erase(pos + 1, std::string::npos);
}
void LogDebugPrint(const char *file,
- int line,
- const char *func,
- const char *errorObject,
- const char *errorSubject,
- int reason,
- const char *msg)
+ int line,
+ const char *func,
+ const char *errorObject,
+ const char *errorSubject,
+ int reason,
+ const char *msg)
{
- std::stringstream ss;
- ss << "[" << file << ":" << line << "][" << func
- << "] : [" << errorObject << "] : [" << errorSubject
- << "] : [" << msg << "]" << std::endl;
-
- if (reason == 256)
- LogError(ss.str());
- else
- LogDebug(ss.str());
+ std::stringstream ss;
+ ss << "[" << file << ":" << line << "][" << func
+ << "] : [" << errorObject << "] : [" << errorSubject
+ << "] : [" << msg << "]" << std::endl;
+
+ if (reason == 256)
+ LogError(ss.str());
+ else
+ LogDebug(ss.str());
}
XmlSec::XmlSec()
- : m_initialized(false)
- , m_pList(nullptr)
+ : m_initialized(false)
+ , m_pList(nullptr)
{
- LIBXML_TEST_VERSION
- xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
- xmlSubstituteEntitiesDefault(1);
+ LIBXML_TEST_VERSION
+ xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
+ xmlSubstituteEntitiesDefault(1);
#ifndef XMLSEC_NO_XSLT
- xmlIndentTreeOutput = 1;
+ xmlIndentTreeOutput = 1;
#endif
- if (xmlSecInit() < 0)
- ThrowMsg(Exception::InternalError, "Xmlsec initialization failed.");
+ if (xmlSecInit() < 0)
+ ThrowMsg(Exception::InternalError, "Xmlsec initialization failed.");
- if (xmlSecCheckVersion() != 1) {
- xmlSecShutdown();
- ThrowMsg(Exception::InternalError,
- "Loaded xmlsec library version is not compatible.");
- }
+ if (xmlSecCheckVersion() != 1) {
+ xmlSecShutdown();
+ ThrowMsg(Exception::InternalError,
+ "Loaded xmlsec library version is not compatible.");
+ }
#ifdef XMLSEC_CRYPTO_DYNAMIC_LOADING
- if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) {
- xmlSecShutdown();
- LogError(
- "Error: unable to load default xmlsec-crypto library. Make sure "
- "that you have it installed and check shared libraries path "
- "(LD_LIBRARY_PATH) envornment variable.");
- ThrowMsg(Exception::InternalError,
- "Unable to load default xmlsec-crypto library.");
- }
+
+ if (xmlSecCryptoDLLoadLibrary(BAD_CAST XMLSEC_CRYPTO) < 0) {
+ xmlSecShutdown();
+ LogError(
+ "Error: unable to load default xmlsec-crypto library. Make sure "
+ "that you have it installed and check shared libraries path "
+ "(LD_LIBRARY_PATH) envornment variable.");
+ ThrowMsg(Exception::InternalError,
+ "Unable to load default xmlsec-crypto library.");
+ }
+
#endif
- if (xmlSecCryptoAppInit(nullptr) < 0) {
- xmlSecShutdown();
- ThrowMsg(Exception::InternalError, "Crypto initialization failed.");
- }
+ if (xmlSecCryptoAppInit(nullptr) < 0) {
+ xmlSecShutdown();
+ ThrowMsg(Exception::InternalError, "Crypto initialization failed.");
+ }
- if (xmlSecCryptoInit() < 0) {
- xmlSecCryptoAppShutdown();
- xmlSecShutdown();
- ThrowMsg(Exception::InternalError,
- "Xmlsec-crypto initialization failed.");
- }
+ if (xmlSecCryptoInit() < 0) {
+ xmlSecCryptoAppShutdown();
+ xmlSecShutdown();
+ ThrowMsg(Exception::InternalError,
+ "Xmlsec-crypto initialization failed.");
+ }
- m_initialized = true;
+ m_initialized = true;
}
XmlSec::~XmlSec()
{
- if (m_initialized)
- return;
-
- xmlSecCryptoShutdown();
- xmlSecCryptoAppShutdown();
- xmlSecShutdown();
+ if (m_initialized)
+ return;
+ xmlSecCryptoShutdown();
+ xmlSecCryptoAppShutdown();
+ xmlSecShutdown();
#ifndef XMLSEC_NO_XSLT
- xsltCleanupGlobals();
+ xsltCleanupGlobals();
#endif
-
- s_prefixPath.clear();
- m_initialized = false;
+ s_prefixPath.clear();
+ m_initialized = false;
}
void XmlSec::validateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngrPtr)
{
- fileExtractPrefix(context);
- LogDebug("Prefix path : " << s_prefixPath);
-
- xmlSecIOCleanupCallbacks();
-
- xmlSecIORegisterCallbacks(
- fileMatchCallback,
- fileOpenCallback,
- fileReadCallback,
- fileCloseCallback);
-
- CustomPtr<xmlDocPtr> docPtr(xmlParseFile(context.signatureFile.c_str()), xmlFreeDoc);
- if (!docPtr || xmlDocGetRootElement(docPtr.get()) == nullptr)
- ThrowMsg(Exception::InvalidFormat,
- "Unable to parse sig xml file: " << context.signatureFile);
-
- xmlNodePtr node = xmlSecFindNode(
- xmlDocGetRootElement(docPtr.get()),
- xmlSecNodeSignature,
- xmlSecDSigNs);
- if (node == nullptr)
- ThrowMsg(Exception::InvalidFormat,
- "Start node not found in " << context.signatureFile);
-
- CustomPtr<xmlSecDSigCtxPtr> dsigCtx(xmlSecDSigCtxCreate(mngrPtr), xmlSecDSigCtxDestroy);
- if (!dsigCtx)
- ThrowMsg(Exception::OutOfMemory, "Failed to create signature context.");
-
- if (context.allowBrokenChain)
- dsigCtx->keyInfoReadCtx.flags |= XMLSEC_KEYINFO_FLAGS_ALLOW_BROKEN_CHAIN;
-
- if (context.validationTime) {
- LogDebug("Setting validation time.");
- dsigCtx->keyInfoReadCtx.certsVerificationTime = context.validationTime;
- }
-
- int res;
- switch (m_mode) {
- case ValidateMode::NORMAL:
- res = xmlSecDSigCtxVerify(dsigCtx.get(), node);
- break;
-
- case ValidateMode::NO_HASH:
- res = xmlSecDSigCtxVerifyEx(dsigCtx.get(), node, 1, nullptr);
- break;
-
- case ValidateMode::PARTIAL_HASH:
- {
- size_t n = m_pList->size();
- const char *pList[n + 1] = {0};
-
- size_t i = 0;
- for (auto uri : *m_pList)
- pList[i++] = uri.c_str();
-
- res = xmlSecDSigCtxVerifyEx(dsigCtx.get(), node, 0, pList);
- break;
- }
- default:
- ThrowMsg(Exception::InternalError, "ValidateMode is invalid");
- }
-
- if (res != 0)
- ThrowMsg(Exception::InvalidSig, "Signature verify error.");
-
- if (dsigCtx->keyInfoReadCtx.flags2 & XMLSEC_KEYINFO_ERROR_FLAGS_BROKEN_CHAIN) {
- LogWarning("Signature contains broken chain!");
- context.errorBrokenChain = true;
- }
-
- if (dsigCtx->status != xmlSecDSigStatusSucceeded)
- ThrowMsg(Exception::InvalidSig, "Signature status is not succedded.");
-
- xmlSecSize refSize = xmlSecPtrListGetSize(&(dsigCtx->signedInfoReferences));
- for (xmlSecSize i = 0; i < refSize; ++i) {
- xmlSecDSigReferenceCtxPtr dsigRefCtx = static_cast<xmlSecDSigReferenceCtxPtr>(
- xmlSecPtrListGetItem(&(dsigCtx->signedInfoReferences), i));
-
- if (!dsigRefCtx || !dsigRefCtx->uri)
- continue;
-
- if (dsigRefCtx->digestMethod
- && dsigRefCtx->digestMethod->id
- && dsigRefCtx->digestMethod->id->name) {
- auto digest = reinterpret_cast<const char * const>(
- dsigRefCtx->digestMethod->id->name);
-
- if (DIGEST_MD5.compare(digest) == 0)
- ThrowMsg(Exception::InvalidFormat,
- "MD5 digest method used! Please use sha");
- }
-
- context.referenceSet.emplace(reinterpret_cast<char *>(dsigRefCtx->uri));
- }
+ fileExtractPrefix(context);
+ LogDebug("Prefix path : " << s_prefixPath);
+ xmlSecIOCleanupCallbacks();
+ xmlSecIORegisterCallbacks(
+ fileMatchCallback,
+ fileOpenCallback,
+ fileReadCallback,
+ fileCloseCallback);
+ CustomPtr<xmlDocPtr> docPtr(xmlParseFile(context.signatureFile.c_str()), xmlFreeDoc);
+
+ if (!docPtr || xmlDocGetRootElement(docPtr.get()) == nullptr)
+ ThrowMsg(Exception::InvalidFormat,
+ "Unable to parse sig xml file: " << context.signatureFile);
+
+ xmlNodePtr node = xmlSecFindNode(
+ xmlDocGetRootElement(docPtr.get()),
+ xmlSecNodeSignature,
+ xmlSecDSigNs);
+
+ if (node == nullptr)
+ ThrowMsg(Exception::InvalidFormat,
+ "Start node not found in " << context.signatureFile);
+
+ CustomPtr<xmlSecDSigCtxPtr> dsigCtx(xmlSecDSigCtxCreate(mngrPtr), xmlSecDSigCtxDestroy);
+
+ if (!dsigCtx)
+ ThrowMsg(Exception::OutOfMemory, "Failed to create signature context.");
+
+ if (context.allowBrokenChain)
+ dsigCtx->keyInfoReadCtx.flags |= XMLSEC_KEYINFO_FLAGS_ALLOW_BROKEN_CHAIN;
+
+ if (context.validationTime) {
+ LogDebug("Setting validation time.");
+ dsigCtx->keyInfoReadCtx.certsVerificationTime = context.validationTime;
+ }
+
+ int res;
+
+ switch (m_mode) {
+ case ValidateMode::NORMAL:
+ res = xmlSecDSigCtxVerify(dsigCtx.get(), node);
+ break;
+
+ case ValidateMode::NO_HASH:
+ res = xmlSecDSigCtxVerifyEx(dsigCtx.get(), node, 1, nullptr);
+ break;
+
+ case ValidateMode::PARTIAL_HASH: {
+ size_t n = m_pList->size();
+ const char *pList[n + 1] = {0};
+ size_t i = 0;
+
+ for (auto uri : *m_pList)
+ pList[i++] = uri.c_str();
+
+ res = xmlSecDSigCtxVerifyEx(dsigCtx.get(), node, 0, pList);
+ break;
+ }
+
+ default:
+ ThrowMsg(Exception::InternalError, "ValidateMode is invalid");
+ }
+
+ if (res != 0)
+ ThrowMsg(Exception::InvalidSig, "Signature verify error.");
+
+ if (dsigCtx->keyInfoReadCtx.flags2 & XMLSEC_KEYINFO_ERROR_FLAGS_BROKEN_CHAIN) {
+ LogWarning("Signature contains broken chain!");
+ context.errorBrokenChain = true;
+ }
+
+ if (dsigCtx->status != xmlSecDSigStatusSucceeded)
+ ThrowMsg(Exception::InvalidSig, "Signature status is not succedded.");
+
+ xmlSecSize refSize = xmlSecPtrListGetSize(&(dsigCtx->signedInfoReferences));
+
+ for (xmlSecSize i = 0; i < refSize; ++i) {
+ xmlSecDSigReferenceCtxPtr dsigRefCtx = static_cast<xmlSecDSigReferenceCtxPtr>(
+ xmlSecPtrListGetItem(&(dsigCtx->signedInfoReferences), i));
+
+ if (!dsigRefCtx || !dsigRefCtx->uri)
+ continue;
+
+ if (dsigRefCtx->digestMethod
+ && dsigRefCtx->digestMethod->id
+ && dsigRefCtx->digestMethod->id->name) {
+ auto digest = reinterpret_cast<const char *const>(
+ dsigRefCtx->digestMethod->id->name);
+
+ if (DIGEST_MD5.compare(digest) == 0)
+ ThrowMsg(Exception::InvalidFormat,
+ "MD5 digest method used! Please use sha");
+ }
+
+ context.referenceSet.emplace(reinterpret_cast<char *>(dsigRefCtx->uri));
+ }
}
void XmlSec::loadDERCertificateMemory(XmlSecContext &context, xmlSecKeysMngrPtr mngrPtr)
{
- std::string derCert;
-
- try {
- derCert = context.certificatePtr->getDER();
- } catch (Certificate::Exception::Base &e) {
- ThrowMsg(Exception::InternalError,
- "Failed during x509 conversion to der format: " << e.DumpToString());
- }
-
- if (xmlSecCryptoAppKeysMngrCertLoadMemory(
- mngrPtr,
- reinterpret_cast<const xmlSecByte *>(derCert.data()),
- static_cast<xmlSecSize>(derCert.length()),
- xmlSecKeyDataFormatDer,
- xmlSecKeyDataTypeTrusted) < 0)
- ThrowMsg(Exception::InternalError, "Failed to load der cert from memory.");
+ std::string derCert;
+
+ try {
+ derCert = context.certificatePtr->getDER();
+ } catch (Certificate::Exception::Base &e) {
+ ThrowMsg(Exception::InternalError,
+ "Failed during x509 conversion to der format: " << e.DumpToString());
+ }
+
+ if (xmlSecCryptoAppKeysMngrCertLoadMemory(
+ mngrPtr,
+ reinterpret_cast<const xmlSecByte *>(derCert.data()),
+ static_cast<xmlSecSize>(derCert.length()),
+ xmlSecKeyDataFormatDer,
+ xmlSecKeyDataTypeTrusted) < 0)
+ ThrowMsg(Exception::InternalError, "Failed to load der cert from memory.");
}
void XmlSec::loadPEMCertificateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngrPtr)
{
- if (xmlSecCryptoAppKeysMngrCertLoad(
- mngrPtr,
- context.certificatePath.c_str(),
- xmlSecKeyDataFormatPem,
- xmlSecKeyDataTypeTrusted) < 0)
- ThrowMsg(Exception::InternalError, "Failed to load PEM cert from file.");
+ if (xmlSecCryptoAppKeysMngrCertLoad(
+ mngrPtr,
+ context.certificatePath.c_str(),
+ xmlSecKeyDataFormatPem,
+ xmlSecKeyDataTypeTrusted) < 0)
+ ThrowMsg(Exception::InternalError, "Failed to load PEM cert from file.");
}
void XmlSec::validateInternal(XmlSecContext &context)
{
- LogDebug("Start to validate.");
- Assert(!context.signatureFile.empty());
- Assert(!!context.certificatePtr || !context.certificatePath.empty());
+ LogDebug("Start to validate.");
+ Assert(!context.signatureFile.empty());
+ Assert(!!context.certificatePtr || !context.certificatePath.empty());
+ xmlSecErrorsSetCallback(LogDebugPrint);
- xmlSecErrorsSetCallback(LogDebugPrint);
+ if (!m_initialized)
+ ThrowMsg(Exception::InternalError, "XmlSec is not initialized");
- if (!m_initialized)
- ThrowMsg(Exception::InternalError, "XmlSec is not initialized");
+ CustomPtr<xmlSecKeysMngrPtr> mngrPtr(xmlSecKeysMngrCreate(), xmlSecKeysMngrDestroy);
- CustomPtr<xmlSecKeysMngrPtr> mngrPtr(xmlSecKeysMngrCreate(), xmlSecKeysMngrDestroy);
+ if (!mngrPtr)
+ ThrowMsg(Exception::InternalError, "Failed to create keys manager.");
- if (!mngrPtr)
- ThrowMsg(Exception::InternalError, "Failed to create keys manager.");
+ if (xmlSecCryptoAppDefaultKeysMngrInit(mngrPtr.get()) < 0)
+ ThrowMsg(Exception::InternalError, "Failed to initialize keys manager.");
- if (xmlSecCryptoAppDefaultKeysMngrInit(mngrPtr.get()) < 0)
- ThrowMsg(Exception::InternalError, "Failed to initialize keys manager.");
+ context.referenceSet.clear();
- context.referenceSet.clear();
+ if (!!context.certificatePtr)
+ loadDERCertificateMemory(context, mngrPtr.get());
- if (!!context.certificatePtr)
- loadDERCertificateMemory(context, mngrPtr.get());
+ if (!context.certificatePath.empty())
+ loadPEMCertificateFile(context, mngrPtr.get());
- if (!context.certificatePath.empty())
- loadPEMCertificateFile(context, mngrPtr.get());
-
- validateFile(context, mngrPtr.get());
+ validateFile(context, mngrPtr.get());
}
void XmlSec::validate(XmlSecContext &context)
{
- m_mode = ValidateMode::NORMAL;
- validateInternal(context);
+ m_mode = ValidateMode::NORMAL;
+ validateInternal(context);
}
void XmlSec::validateNoHash(XmlSecContext &context)
{
- m_mode = ValidateMode::NO_HASH;
- validateInternal(context);
+ m_mode = ValidateMode::NO_HASH;
+ validateInternal(context);
}
void XmlSec::validatePartialHash(XmlSecContext &context, const std::list<std::string> &targetUri)
{
- m_mode = ValidateMode::PARTIAL_HASH;
- m_pList = &targetUri;
-
- validateInternal(context);
+ m_mode = ValidateMode::PARTIAL_HASH;
+ m_pList = &targetUri;
+ validateInternal(context);
}
} // namespace ValidationCore
namespace ValidationCore {
class XmlSec : public VcoreDPL::Noncopyable {
-
public:
- struct XmlSecContext {
- /* You _must_ set one of the value: certificatePath or certificate. */
- XmlSecContext()
- : validationTime(0)
- , allowBrokenChain(false)
- , errorBrokenChain(false) {}
-
- /*
- * Absolute path to signature file.
- */
- std::string signatureFile;
- /*
- * Direcotory with signed data.
- * If you leave it empty xmlsec will use directory extracted
- * from signatureFile.
- */
- std::string workingDirectory;
- /*
- * Path to trusted certificate.
- */
- std::string certificatePath;
- /*
- * Trusted certificate. In most cases it should be Root CA certificate.
- */
- CertificatePtr certificatePtr;
- /*
- * Validation date.
- * 0 - uses current time.
- */
- time_t validationTime;
- /*
- * Input parameter.
- * If true, signature validation will not be interrupted by chain error.
- * If true and chain is broken then the value errorBrokenChain will be
- * set to true.
- */
- bool allowBrokenChain;
- /*
- * Output parameter.
- * This will be set if chain is incomplete or broken.
- */
- bool errorBrokenChain;
- /*
- * Output parameter.
- * Reference checked by xmlsec
- */
- ReferenceSet referenceSet;
- };
-
- struct Exception {
- DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
- DECLARE_EXCEPTION_TYPE(Base, InternalError)
- DECLARE_EXCEPTION_TYPE(Base, InvalidFormat)
- DECLARE_EXCEPTION_TYPE(Base, InvalidSig)
- DECLARE_EXCEPTION_TYPE(Base, OutOfMemory)
- };
-
- /* context - input/output param. */
- void validate(XmlSecContext &context);
- void validateNoHash(XmlSecContext &context);
- void validatePartialHash(XmlSecContext &context, const std::list<std::string> &targetUri);
+ struct XmlSecContext {
+ /* You _must_ set one of the value: certificatePath or certificate. */
+ XmlSecContext()
+ : validationTime(0)
+ , allowBrokenChain(false)
+ , errorBrokenChain(false) {}
+
+ /*
+ * Absolute path to signature file.
+ */
+ std::string signatureFile;
+ /*
+ * Direcotory with signed data.
+ * If you leave it empty xmlsec will use directory extracted
+ * from signatureFile.
+ */
+ std::string workingDirectory;
+ /*
+ * Path to trusted certificate.
+ */
+ std::string certificatePath;
+ /*
+ * Trusted certificate. In most cases it should be Root CA certificate.
+ */
+ CertificatePtr certificatePtr;
+ /*
+ * Validation date.
+ * 0 - uses current time.
+ */
+ time_t validationTime;
+ /*
+ * Input parameter.
+ * If true, signature validation will not be interrupted by chain error.
+ * If true and chain is broken then the value errorBrokenChain will be
+ * set to true.
+ */
+ bool allowBrokenChain;
+ /*
+ * Output parameter.
+ * This will be set if chain is incomplete or broken.
+ */
+ bool errorBrokenChain;
+ /*
+ * Output parameter.
+ * Reference checked by xmlsec
+ */
+ ReferenceSet referenceSet;
+ };
+
+ struct Exception {
+ DECLARE_EXCEPTION_TYPE(VcoreDPL::Exception, Base)
+ DECLARE_EXCEPTION_TYPE(Base, InternalError)
+ DECLARE_EXCEPTION_TYPE(Base, InvalidFormat)
+ DECLARE_EXCEPTION_TYPE(Base, InvalidSig)
+ DECLARE_EXCEPTION_TYPE(Base, OutOfMemory)
+ };
+
+ /* context - input/output param. */
+ void validate(XmlSecContext &context);
+ void validateNoHash(XmlSecContext &context);
+ void validatePartialHash(XmlSecContext &context, const std::list<std::string> &targetUri);
protected:
- XmlSec();
- ~XmlSec();
+ XmlSec();
+ ~XmlSec();
private:
- enum class ValidateMode : int {
- NORMAL,
- NO_HASH,
- PARTIAL_HASH
- };
-
- ValidateMode m_mode;
- bool m_initialized;
- const std::list<std::string> *m_pList;
-
- void loadDERCertificateMemory(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
- void loadPEMCertificateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
- void validateInternal(XmlSecContext &context);
- void validateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
-
- static std::string s_prefixPath;
- static int fileMatchCallback(const char *filename);
- static void *fileOpenCallback(const char *filename);
- static int fileReadCallback(void *context, char *buffer, int len);
- static int fileCloseCallback(void *context);
- static void fileExtractPrefix(XmlSecContext &context);
+ enum class ValidateMode : int {
+ NORMAL,
+ NO_HASH,
+ PARTIAL_HASH
+ };
+
+ ValidateMode m_mode;
+ bool m_initialized;
+ const std::list<std::string> *m_pList;
+
+ void loadDERCertificateMemory(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
+ void loadPEMCertificateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
+ void validateInternal(XmlSecContext &context);
+ void validateFile(XmlSecContext &context, xmlSecKeysMngrPtr mngr);
+
+ static std::string s_prefixPath;
+ static int fileMatchCallback(const char *filename);
+ static void *fileOpenCallback(const char *filename);
+ static int fileReadCallback(void *context, char *buffer, int len);
+ static int fileCloseCallback(void *context);
+ static void fileExtractPrefix(XmlSecContext &context);
};
typedef VcoreDPL::Singleton<XmlSec> XmlSecSingleton;
namespace {
struct CharDeleter {
- void operator()(char *str) const {
- free(str);
- }
+ void operator()(char *str) const
+ {
+ free(str);
+ }
};
struct CharArrDeleter {
- void operator()(char **arr) const {
- size_t i = 0;
- if (arr == NULL)
- return;
+ void operator()(char **arr) const
+ {
+ size_t i = 0;
- while (arr[i])
- free(arr[i++]);
+ if (arr == NULL)
+ return;
- free(arr);
- }
+ while (arr[i])
+ free(arr[i++]);
+
+ free(arr);
+ }
};
class CertSvcInstanceImpl {
public:
- CertSvcInstanceImpl()
- : m_certificateCounter(0)
- , m_idListCounter(0)
- , m_stringListCounter(0)
- {}
-
- ~CertSvcInstanceImpl(){
- auto it = m_allocatedStringSet.begin();
- for (; it != m_allocatedStringSet.end(); ++it)
- delete[] *it;
- }
-
- inline void reset(){
- m_certificateCounter = 0;
- m_certificateMap.clear();
- m_idListCounter = 0;
- m_idListMap.clear();
- m_stringListCounter = 0;
- m_stringListMap.clear();
-
- auto it = m_allocatedStringSet.begin();
- for (; it != m_allocatedStringSet.end(); ++it)
- delete[] *it;
-
- m_allocatedStringSet.clear();
- }
-
- inline size_t addCert(const CertificatePtr &cert) {
- m_certificateMap[m_certificateCounter] = cert;
- return m_certificateCounter++;
- }
-
- inline void removeCert(const CertSvcCertificate &cert) {
- auto iter = m_certificateMap.find(cert.privateHandler);
- if (iter != m_certificateMap.end()) {
- m_certificateMap.erase(iter);
- }
- }
-
- inline int getCertFromList(
- const CertSvcCertificateList &handler,
- size_t position,
- CertSvcCertificate *certificate)
- {
- auto iter = m_idListMap.find(handler.privateHandler);
- if (iter == m_idListMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- if (position >= iter->second.size()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- certificate->privateInstance = handler.privateInstance;
- certificate->privateHandler = (iter->second)[position];
- return CERTSVC_SUCCESS;
- }
-
- inline int getCertListLen(const CertSvcCertificateList &handler, size_t *len) {
- auto iter = m_idListMap.find(handler.privateHandler);
- if (iter == m_idListMap.end() || !len) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- *len = (iter->second).size();
- return CERTSVC_SUCCESS;
- }
-
- inline void removeCertList(const CertSvcCertificateList &handler) {
- auto iter = m_idListMap.find(handler.privateHandler);
- if (iter != m_idListMap.end())
- m_idListMap.erase(iter);
- }
-
- inline void removeCertListAll(const CertSvcCertificateList &handler) {
- auto iter = m_idListMap.find(handler.privateHandler);
- if (iter == m_idListMap.end())
- return;
-
- for (size_t pos = 0; pos < iter->second.size(); ++pos) {
- auto iterCert = m_certificateMap.find((iter->second)[pos]);
- if (iterCert == m_certificateMap.end())
- return;
-
- m_certificateMap.erase(iterCert);
- }
-
- m_idListMap.erase(iter);
- }
-
- inline int isSignedBy(const CertSvcCertificate &child,
- const CertSvcCertificate &parent,
- int *status)
- {
- auto citer = m_certificateMap.find(child.privateHandler);
- if (citer == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- auto piter = m_certificateMap.find(parent.privateHandler);
- if (piter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- if (citer->second->isSignedBy(piter->second)) {
- *status = CERTSVC_TRUE;
- } else {
- *status = CERTSVC_FALSE;
- }
- return CERTSVC_SUCCESS;
- }
-
- inline int getField(const CertSvcCertificate &cert,
- CertSvcCertificateField field,
- CertSvcString *buffer)
- {
- auto iter = m_certificateMap.find(cert.privateHandler);
- if (iter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- auto certPtr = iter->second;
- std::string result;
- switch (field) {
- case CERTSVC_SUBJECT:
- result = certPtr->getOneLine();
- break;
- case CERTSVC_ISSUER:
- result = certPtr->getOneLine(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_SUBJECT_COMMON_NAME:
- result = certPtr->getCommonName();
- break;
- case CERTSVC_SUBJECT_COUNTRY_NAME:
- result = certPtr->getCountryName();
- break;
- case CERTSVC_SUBJECT_STATE_NAME:
- result = certPtr->getStateOrProvinceName();
- break;
- case CERTSVC_SUBJECT_LOCALITY_NAME:
- result = certPtr->getLocalityName();
- break;
- case CERTSVC_SUBJECT_ORGANIZATION_NAME:
- result = certPtr->getOrganizationName();
- break;
- case CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME:
- result = certPtr->getOrganizationalUnitName();
- break;
- case CERTSVC_SUBJECT_EMAIL_ADDRESS:
- result = certPtr->getEmailAddres();
- break;
-/*
- case CERTSVC_SUBJECT_UID:
- result = certPtr->getUID();
- break;
-*/
- case CERTSVC_ISSUER_COMMON_NAME:
- result = certPtr->getCommonName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_COUNTRY_NAME:
- result = certPtr->getCountryName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_STATE_NAME:
- result = certPtr->getStateOrProvinceName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_LOCALITY_NAME:
- result = certPtr->getLocalityName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_ORGANIZATION_NAME:
- result = certPtr->getOrganizationName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME:
- result = certPtr->getOrganizationalUnitName(Certificate::FIELD_ISSUER);
- break;
- case CERTSVC_ISSUER_EMAIL_ADDRESS:
- result = certPtr->getEmailAddres(Certificate::FIELD_ISSUER);
- break;
-/*
- case CERTSVC_ISSUER_UID:
- result = certPtr->getUID(Certificate::FIELD_ISSUER);
- break;
-*/
- case CERTSVC_VERSION:
- {
- std::stringstream stream;
- stream << (certPtr->getVersion()+1);
- result = stream.str();
- break;
- }
- case CERTSVC_SERIAL_NUMBER:
- result = certPtr->getSerialNumberString();
- break;
- case CERTSVC_KEY_USAGE:
- result = certPtr->getKeyUsageString();
- break;
- case CERTSVC_KEY:
- result = certPtr->getPublicKeyString();
- break;
- case CERTSVC_KEY_ALGO:
- result = certPtr->getPublicKeyAlgoString();
- break;
- case CERTSVC_SIGNATURE_ALGORITHM:
- result = certPtr->getSignatureAlgorithmString();
- break;
- default:
- break;
- }
-
- if (result.empty()) {
- buffer->privateHandler = NULL;
- buffer->privateLength = 0;
- buffer->privateInstance = cert.privateInstance;
- return CERTSVC_SUCCESS;
- }
-
- char *cstring = new char[result.size() + 1];
- if (cstring == NULL) {
- buffer->privateHandler = NULL;
- buffer->privateLength = 0;
- buffer->privateInstance = cert.privateInstance;
- return CERTSVC_BAD_ALLOC;
- }
-
- strncpy(cstring, result.c_str(), result.size() + 1);
-
- buffer->privateHandler = cstring;
- buffer->privateLength = result.size();
- buffer->privateInstance = cert.privateInstance;
-
- m_allocatedStringSet.insert(cstring);
-
- return CERTSVC_SUCCESS;
- }
-
- inline int getNotAfter(const CertSvcCertificate &cert,
- time_t *time)
- {
- auto iter = m_certificateMap.find(cert.privateHandler);
- if (iter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- *time = iter->second->getNotAfter();
- return CERTSVC_SUCCESS;
- }
-
- inline int getNotBefore(const CertSvcCertificate &cert,
- time_t *time)
- {
- auto iter = m_certificateMap.find(cert.privateHandler);
- if (iter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- *time = iter->second->getNotBefore();
- return CERTSVC_SUCCESS;
- }
-
- inline int isRootCA(const CertSvcCertificate &cert, int *status){
- auto iter = m_certificateMap.find(cert.privateHandler);
- if (iter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- if (iter->second->isRootCert()) {
- *status = CERTSVC_TRUE;
- } else {
- *status = CERTSVC_FALSE;
- }
- return CERTSVC_SUCCESS;
- }
-
- inline int getStringFromList(
- const CertSvcStringList &handler,
- size_t position,
- CertSvcString *buffer)
- {
- buffer->privateHandler = NULL;
- buffer->privateLength = 0;
-
- auto iter = m_stringListMap.find(handler.privateHandler);
- if (iter == m_stringListMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- if (position >= iter->second.size()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- const std::string &data = iter->second.at(position);
- size_t size = data.size();
- char *cstring = new char[size + 1];
- if (!cstring) {
- return CERTSVC_FAIL;
- }
-
- strncpy(cstring, data.c_str(), size + 1);
-
- buffer->privateHandler = cstring;
- buffer->privateLength = size;
- buffer->privateInstance = handler.privateInstance;
-
- m_allocatedStringSet.insert(cstring);
-
- return CERTSVC_SUCCESS;
- }
-
- inline int getStringListLen(
- const CertSvcStringList &handler,
- size_t *size)
- {
- auto iter = m_stringListMap.find(handler.privateHandler);
- if (iter == m_stringListMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- *size = iter->second.size();
- return CERTSVC_SUCCESS;
- }
-
- inline void removeStringList(const CertSvcStringList &handler)
- {
- m_stringListMap.erase(m_stringListMap.find(handler.privateHandler));
- }
-
- inline void removeString(const CertSvcString &handler)
- {
- auto iter = m_allocatedStringSet.find(handler.privateHandler);
- if (iter != m_allocatedStringSet.end()) {
- delete[] *iter;
- m_allocatedStringSet.erase(iter);
- }
- }
-
- inline int sortCollection(CertSvcCertificate *certificate_array, size_t size) {
- if (size < 2) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- for (size_t i = 1; i < size; ++i) {
- if (certificate_array[i - 1].privateInstance.privatePtr
- != certificate_array[i].privateInstance.privatePtr)
- {
- return CERTSVC_WRONG_ARGUMENT;
- }
- }
-
- CertificateList certList;
- std::map<Certificate*, size_t> translator;
-
- for (size_t i = 0; i < size; ++i) {
- size_t pos = certificate_array[i].privateHandler;
- auto cert = m_certificateMap.find(pos);
- if (cert == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- translator[cert->second.get()] = pos;
- certList.push_back(cert->second);
- }
-
- CertificateCollection collection;
- collection.load(certList);
-
- if (!collection.sort()) {
- return CERTSVC_FAIL;
- }
-
- auto chain = collection.getChain();
-
- size_t i = 0;
- for (const auto &cert : collection.getChain())
- certificate_array[i++].privateHandler = translator[cert.get()];
-
- return CERTSVC_SUCCESS;
- }
-
- inline int getX509Copy(const CertSvcCertificate &certificate, X509** cert)
- {
- auto it = m_certificateMap.find(certificate.privateHandler);
- if (it == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- *cert = X509_dup(it->second->getX509());
- return CERTSVC_SUCCESS;
- }
-
- inline int getPubkeyDER(const CertSvcCertificate &certificate,
- unsigned char **pubkey,
- size_t *len)
- {
- auto it = m_certificateMap.find(certificate.privateHandler);
- if (it == m_certificateMap.end() || pubkey == NULL || len == NULL)
- return CERTSVC_WRONG_ARGUMENT;
-
- it->second->getPublicKeyDER(pubkey, len);
- return CERTSVC_SUCCESS;
- }
-
- inline int saveToFile(const CertSvcCertificate &certificate,
- const char *location)
- {
- auto it = m_certificateMap.find(certificate.privateHandler);
- if (it == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- FILE *out = fopen(location, "w");
- if (out == NULL) {
- return CERTSVC_FAIL;
- }
- if (0 == i2d_X509_fp(out, it->second->getX509())) {
- fclose(out);
- return CERTSVC_FAIL;
- }
- fclose(out);
- return CERTSVC_SUCCESS;
- }
-
- inline int verify(
- CertSvcCertificate certificate,
- CertSvcString &message,
- CertSvcString &signature,
- const char *algorithm,
- int *status)
- {
- int result = CERTSVC_FAIL;
-
- if (!status) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- auto it = m_certificateMap.find(certificate.privateHandler);
- if (it == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- OpenSSL_add_all_digests();
-
- int temp;
- EVP_MD_CTX* mdctx = NULL;
- const EVP_MD * md = NULL;
- X509 *cert = it->second->getX509();
- EVP_PKEY *pkey = NULL;
-
- if (cert == NULL) {
- goto err;
- }
-
- pkey = X509_get_pubkey(cert);
-
- if (pkey == NULL) {
- goto err;
- }
-
- if (algorithm == NULL) {
- md = EVP_get_digestbyobj(cert->cert_info->signature->algorithm);
- } else {
- md = EVP_get_digestbyname(algorithm);
- }
-
- if (md == NULL) {
- result = CERTSVC_INVALID_ALGORITHM;
- goto err;
- }
-
- mdctx = EVP_MD_CTX_create();
-
- if (mdctx == NULL) {
- goto err;
- }
-
- if (EVP_VerifyInit_ex(mdctx, md, NULL) != 1) {
- goto err;
- }
-
- if (EVP_VerifyUpdate(mdctx, message.privateHandler, message.privateLength) != 1) {
- goto err;
- }
-
- temp = EVP_VerifyFinal(mdctx,
- reinterpret_cast<unsigned char*>(signature.privateHandler),
- signature.privateLength,
- pkey);
-
- if (temp == 0) {
- *status = CERTSVC_INVALID_SIGNATURE;
- result = CERTSVC_SUCCESS;
- } else if (temp == 1) {
- *status = CERTSVC_SUCCESS;
- result = CERTSVC_SUCCESS;
- }
-
- err:
- if (mdctx != NULL)
- EVP_MD_CTX_destroy(mdctx);
- if (pkey != NULL)
- EVP_PKEY_free(pkey);
- return result;
- }
-
- inline int base64Encode(
- const CertSvcString &message,
- CertSvcString *base64)
- {
- if (!base64) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- std::string info(message.privateHandler, message.privateLength);
- Base64Encoder base;
- base.reset();
- base.append(info);
- base.finalize();
- info = base.get();
- char *ptr = new char[info.size()+1];
- if(ptr == NULL) {
- return CERTSVC_BAD_ALLOC;
- }
- memcpy(ptr, info.c_str(), info.size()+1);
- m_allocatedStringSet.insert(ptr);
- base64->privateHandler = ptr;
- base64->privateLength = info.size();
- base64->privateInstance = message.privateInstance;
- return CERTSVC_SUCCESS;
- }
-
- int base64Decode(
- const CertSvcString &base64,
- CertSvcString *message)
- {
- if (!message) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- std::string info(base64.privateHandler, base64.privateLength);
- Base64Decoder base;
- base.reset();
- base.append(info);
- if (!base.finalize()) {
- return CERTSVC_FAIL;
- }
- info = base.get();
- char *ptr = new char[info.size()+1];
- if(ptr == NULL) {
- return CERTSVC_BAD_ALLOC;
- }
- memcpy(ptr, info.c_str(), info.size()+1);
- m_allocatedStringSet.insert(ptr);
- message->privateHandler = ptr;
- message->privateLength = info.size();
- message->privateInstance = base64.privateInstance;
- return CERTSVC_SUCCESS;
- }
-
- inline int stringNew(
- CertSvcInstance &instance,
- const char *str,
- size_t size,
- CertSvcString *output)
- {
- if (!output)
- return CERTSVC_WRONG_ARGUMENT;
-
- /* return struct for empty string */
- if (size == 0 || str == NULL) {
- output->privateHandler = NULL;
- output->privateLength = 0;
- output->privateInstance = instance;
-
- return CERTSVC_SUCCESS;
- }
-
- if (strlen(str) < size)
- return CERTSVC_WRONG_ARGUMENT;
-
- char *ptr = new(std::nothrow) char[size + 1];
- if (ptr == NULL)
- return CERTSVC_BAD_ALLOC;
-
- memcpy(ptr, str, size);
- ptr[size] = '\0';
-
- output->privateHandler = ptr;
- output->privateLength = size;
- output->privateInstance = instance;
-
- m_allocatedStringSet.insert(ptr);
-
- return CERTSVC_SUCCESS;
- }
-
- inline int certificateVerify(
- CertSvcCertificate certificate,
- const CertSvcCertificate *trusted,
- size_t trustedSize,
- const CertSvcCertificate *untrusted,
- size_t untrustedSize,
- int checkCaFlag,
- int *status)
- {
- if (!trusted || !status) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- auto iter = m_certificateMap.find(certificate.privateHandler);
- if (iter == m_certificateMap.end()) {
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- X509 *cert = iter->second->getX509();
- X509_STORE *store = X509_STORE_new();
- STACK_OF(X509) *ustore = sk_X509_new_null();
-
- for (size_t i = 0; i < trustedSize; ++i) {
- auto iter = m_certificateMap.find(trusted[i].privateHandler);
- if (iter == m_certificateMap.end()) {
- X509_STORE_free(store);
- sk_X509_free(ustore);
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- X509_STORE_add_cert(store, iter->second->getX509());
- }
-
- for (size_t i = 0; i < untrustedSize; ++i) {
- auto iter = m_certificateMap.find(untrusted[i].privateHandler);
- if (iter == m_certificateMap.end()) {
- X509_STORE_free(store);
- sk_X509_free(ustore);
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- if (sk_X509_push(ustore, iter->second->getX509()) == 0)
- break;
- }
-
- X509_STORE_CTX context;
- X509_STORE_CTX_init(&context, store, cert, ustore);
- int result = X509_verify_cert(&context);
-
- if (result == 1 && checkCaFlag) { // check strictly
- STACK_OF(X509) *resultChain = X509_STORE_CTX_get1_chain(&context);
- X509* tmpCert = NULL;
- int caFlagValidity;
- while ((tmpCert = sk_X509_pop(resultChain))) {
- caFlagValidity = X509_check_ca(tmpCert);
- if (caFlagValidity != 1 && (tmpCert = sk_X509_pop(resultChain)) != NULL) {
- // the last one is not a CA.
- result = 0;
- break;
- }
- }
- }
-
- X509_STORE_CTX_cleanup(&context);
- X509_STORE_free(store);
- sk_X509_free(ustore);
-
- if (result == 1) {
- *status = CERTSVC_SUCCESS;
- } else {
- *status = CERTSVC_FAIL;
- }
- return CERTSVC_SUCCESS;
- }
+ CertSvcInstanceImpl()
+ : m_certificateCounter(0)
+ , m_idListCounter(0)
+ , m_stringListCounter(0)
+ {}
+
+ ~CertSvcInstanceImpl()
+ {
+ auto it = m_allocatedStringSet.begin();
+
+ for (; it != m_allocatedStringSet.end(); ++it)
+ delete[] *it;
+ }
+
+ inline void reset()
+ {
+ m_certificateCounter = 0;
+ m_certificateMap.clear();
+ m_idListCounter = 0;
+ m_idListMap.clear();
+ m_stringListCounter = 0;
+ m_stringListMap.clear();
+ auto it = m_allocatedStringSet.begin();
+
+ for (; it != m_allocatedStringSet.end(); ++it)
+ delete[] *it;
+
+ m_allocatedStringSet.clear();
+ }
+
+ inline size_t addCert(const CertificatePtr &cert)
+ {
+ m_certificateMap[m_certificateCounter] = cert;
+ return m_certificateCounter++;
+ }
+
+ inline void removeCert(const CertSvcCertificate &cert)
+ {
+ auto iter = m_certificateMap.find(cert.privateHandler);
+
+ if (iter != m_certificateMap.end()) {
+ m_certificateMap.erase(iter);
+ }
+ }
+
+ inline int getCertFromList(
+ const CertSvcCertificateList &handler,
+ size_t position,
+ CertSvcCertificate *certificate)
+ {
+ auto iter = m_idListMap.find(handler.privateHandler);
+
+ if (iter == m_idListMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ if (position >= iter->second.size()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ certificate->privateInstance = handler.privateInstance;
+ certificate->privateHandler = (iter->second)[position];
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getCertListLen(const CertSvcCertificateList &handler, size_t *len)
+ {
+ auto iter = m_idListMap.find(handler.privateHandler);
+
+ if (iter == m_idListMap.end() || !len) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ *len = (iter->second).size();
+ return CERTSVC_SUCCESS;
+ }
+
+ inline void removeCertList(const CertSvcCertificateList &handler)
+ {
+ auto iter = m_idListMap.find(handler.privateHandler);
+
+ if (iter != m_idListMap.end())
+ m_idListMap.erase(iter);
+ }
+
+ inline void removeCertListAll(const CertSvcCertificateList &handler)
+ {
+ auto iter = m_idListMap.find(handler.privateHandler);
+
+ if (iter == m_idListMap.end())
+ return;
+
+ for (size_t pos = 0; pos < iter->second.size(); ++pos) {
+ auto iterCert = m_certificateMap.find((iter->second)[pos]);
+
+ if (iterCert == m_certificateMap.end())
+ return;
+
+ m_certificateMap.erase(iterCert);
+ }
+
+ m_idListMap.erase(iter);
+ }
+
+ inline int isSignedBy(const CertSvcCertificate &child,
+ const CertSvcCertificate &parent,
+ int *status)
+ {
+ auto citer = m_certificateMap.find(child.privateHandler);
+
+ if (citer == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ auto piter = m_certificateMap.find(parent.privateHandler);
+
+ if (piter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ if (citer->second->isSignedBy(piter->second)) {
+ *status = CERTSVC_TRUE;
+ } else {
+ *status = CERTSVC_FALSE;
+ }
+
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getField(const CertSvcCertificate &cert,
+ CertSvcCertificateField field,
+ CertSvcString *buffer)
+ {
+ auto iter = m_certificateMap.find(cert.privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ auto certPtr = iter->second;
+ std::string result;
+
+ switch (field) {
+ case CERTSVC_SUBJECT:
+ result = certPtr->getOneLine();
+ break;
+
+ case CERTSVC_ISSUER:
+ result = certPtr->getOneLine(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_SUBJECT_COMMON_NAME:
+ result = certPtr->getCommonName();
+ break;
+
+ case CERTSVC_SUBJECT_COUNTRY_NAME:
+ result = certPtr->getCountryName();
+ break;
+
+ case CERTSVC_SUBJECT_STATE_NAME:
+ result = certPtr->getStateOrProvinceName();
+ break;
+
+ case CERTSVC_SUBJECT_LOCALITY_NAME:
+ result = certPtr->getLocalityName();
+ break;
+
+ case CERTSVC_SUBJECT_ORGANIZATION_NAME:
+ result = certPtr->getOrganizationName();
+ break;
+
+ case CERTSVC_SUBJECT_ORGANIZATION_UNIT_NAME:
+ result = certPtr->getOrganizationalUnitName();
+ break;
+
+ case CERTSVC_SUBJECT_EMAIL_ADDRESS:
+ result = certPtr->getEmailAddres();
+ break;
+
+ /*
+ case CERTSVC_SUBJECT_UID:
+ result = certPtr->getUID();
+ break;
+ */
+ case CERTSVC_ISSUER_COMMON_NAME:
+ result = certPtr->getCommonName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_COUNTRY_NAME:
+ result = certPtr->getCountryName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_STATE_NAME:
+ result = certPtr->getStateOrProvinceName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_LOCALITY_NAME:
+ result = certPtr->getLocalityName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_ORGANIZATION_NAME:
+ result = certPtr->getOrganizationName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_ORGANIZATION_UNIT_NAME:
+ result = certPtr->getOrganizationalUnitName(Certificate::FIELD_ISSUER);
+ break;
+
+ case CERTSVC_ISSUER_EMAIL_ADDRESS:
+ result = certPtr->getEmailAddres(Certificate::FIELD_ISSUER);
+ break;
+
+ /*
+ case CERTSVC_ISSUER_UID:
+ result = certPtr->getUID(Certificate::FIELD_ISSUER);
+ break;
+ */
+ case CERTSVC_VERSION: {
+ std::stringstream stream;
+ stream << (certPtr->getVersion() + 1);
+ result = stream.str();
+ break;
+ }
+
+ case CERTSVC_SERIAL_NUMBER:
+ result = certPtr->getSerialNumberString();
+ break;
+
+ case CERTSVC_KEY_USAGE:
+ result = certPtr->getKeyUsageString();
+ break;
+
+ case CERTSVC_KEY:
+ result = certPtr->getPublicKeyString();
+ break;
+
+ case CERTSVC_KEY_ALGO:
+ result = certPtr->getPublicKeyAlgoString();
+ break;
+
+ case CERTSVC_SIGNATURE_ALGORITHM:
+ result = certPtr->getSignatureAlgorithmString();
+ break;
+
+ default:
+ break;
+ }
+
+ if (result.empty()) {
+ buffer->privateHandler = NULL;
+ buffer->privateLength = 0;
+ buffer->privateInstance = cert.privateInstance;
+ return CERTSVC_SUCCESS;
+ }
+
+ char *cstring = new char[result.size() + 1];
+
+ if (cstring == NULL) {
+ buffer->privateHandler = NULL;
+ buffer->privateLength = 0;
+ buffer->privateInstance = cert.privateInstance;
+ return CERTSVC_BAD_ALLOC;
+ }
+
+ strncpy(cstring, result.c_str(), result.size() + 1);
+ buffer->privateHandler = cstring;
+ buffer->privateLength = result.size();
+ buffer->privateInstance = cert.privateInstance;
+ m_allocatedStringSet.insert(cstring);
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getNotAfter(const CertSvcCertificate &cert,
+ time_t *time)
+ {
+ auto iter = m_certificateMap.find(cert.privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ *time = iter->second->getNotAfter();
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getNotBefore(const CertSvcCertificate &cert,
+ time_t *time)
+ {
+ auto iter = m_certificateMap.find(cert.privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ *time = iter->second->getNotBefore();
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int isRootCA(const CertSvcCertificate &cert, int *status)
+ {
+ auto iter = m_certificateMap.find(cert.privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ if (iter->second->isRootCert()) {
+ *status = CERTSVC_TRUE;
+ } else {
+ *status = CERTSVC_FALSE;
+ }
+
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getStringFromList(
+ const CertSvcStringList &handler,
+ size_t position,
+ CertSvcString *buffer)
+ {
+ buffer->privateHandler = NULL;
+ buffer->privateLength = 0;
+ auto iter = m_stringListMap.find(handler.privateHandler);
+
+ if (iter == m_stringListMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ if (position >= iter->second.size()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ const std::string &data = iter->second.at(position);
+ size_t size = data.size();
+ char *cstring = new char[size + 1];
+
+ if (!cstring) {
+ return CERTSVC_FAIL;
+ }
+
+ strncpy(cstring, data.c_str(), size + 1);
+ buffer->privateHandler = cstring;
+ buffer->privateLength = size;
+ buffer->privateInstance = handler.privateInstance;
+ m_allocatedStringSet.insert(cstring);
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getStringListLen(
+ const CertSvcStringList &handler,
+ size_t *size)
+ {
+ auto iter = m_stringListMap.find(handler.privateHandler);
+
+ if (iter == m_stringListMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ *size = iter->second.size();
+ return CERTSVC_SUCCESS;
+ }
+
+ inline void removeStringList(const CertSvcStringList &handler)
+ {
+ m_stringListMap.erase(m_stringListMap.find(handler.privateHandler));
+ }
+
+ inline void removeString(const CertSvcString &handler)
+ {
+ auto iter = m_allocatedStringSet.find(handler.privateHandler);
+
+ if (iter != m_allocatedStringSet.end()) {
+ delete[] *iter;
+ m_allocatedStringSet.erase(iter);
+ }
+ }
+
+ inline int sortCollection(CertSvcCertificate *certificate_array, size_t size)
+ {
+ if (size < 2) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ for (size_t i = 1; i < size; ++i) {
+ if (certificate_array[i - 1].privateInstance.privatePtr
+ != certificate_array[i].privateInstance.privatePtr) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+ }
+
+ CertificateList certList;
+ std::map<Certificate *, size_t> translator;
+
+ for (size_t i = 0; i < size; ++i) {
+ size_t pos = certificate_array[i].privateHandler;
+ auto cert = m_certificateMap.find(pos);
+
+ if (cert == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ translator[cert->second.get()] = pos;
+ certList.push_back(cert->second);
+ }
+
+ CertificateCollection collection;
+ collection.load(certList);
+
+ if (!collection.sort()) {
+ return CERTSVC_FAIL;
+ }
+
+ auto chain = collection.getChain();
+ size_t i = 0;
+
+ for (const auto &cert : collection.getChain())
+ certificate_array[i++].privateHandler = translator[cert.get()];
+
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getX509Copy(const CertSvcCertificate &certificate, X509 **cert)
+ {
+ auto it = m_certificateMap.find(certificate.privateHandler);
+
+ if (it == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ *cert = X509_dup(it->second->getX509());
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getPubkeyDER(const CertSvcCertificate &certificate,
+ unsigned char **pubkey,
+ size_t *len)
+ {
+ auto it = m_certificateMap.find(certificate.privateHandler);
+
+ if (it == m_certificateMap.end() || pubkey == NULL || len == NULL)
+ return CERTSVC_WRONG_ARGUMENT;
+
+ it->second->getPublicKeyDER(pubkey, len);
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int saveToFile(const CertSvcCertificate &certificate,
+ const char *location)
+ {
+ auto it = m_certificateMap.find(certificate.privateHandler);
+
+ if (it == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ FILE *out = fopen(location, "w");
+
+ if (out == NULL) {
+ return CERTSVC_FAIL;
+ }
+
+ if (0 == i2d_X509_fp(out, it->second->getX509())) {
+ fclose(out);
+ return CERTSVC_FAIL;
+ }
+
+ fclose(out);
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int verify(
+ CertSvcCertificate certificate,
+ CertSvcString &message,
+ CertSvcString &signature,
+ const char *algorithm,
+ int *status)
+ {
+ int result = CERTSVC_FAIL;
+
+ if (!status) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ auto it = m_certificateMap.find(certificate.privateHandler);
+
+ if (it == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ OpenSSL_add_all_digests();
+ int temp;
+ EVP_MD_CTX *mdctx = NULL;
+ const EVP_MD *md = NULL;
+ X509 *cert = it->second->getX509();
+ EVP_PKEY *pkey = NULL;
+
+ if (cert == NULL) {
+ goto err;
+ }
+
+ pkey = X509_get_pubkey(cert);
+
+ if (pkey == NULL) {
+ goto err;
+ }
+
+ if (algorithm == NULL) {
+ md = EVP_get_digestbyobj(cert->cert_info->signature->algorithm);
+ } else {
+ md = EVP_get_digestbyname(algorithm);
+ }
+
+ if (md == NULL) {
+ result = CERTSVC_INVALID_ALGORITHM;
+ goto err;
+ }
+
+ mdctx = EVP_MD_CTX_create();
+
+ if (mdctx == NULL) {
+ goto err;
+ }
+
+ if (EVP_VerifyInit_ex(mdctx, md, NULL) != 1) {
+ goto err;
+ }
+
+ if (EVP_VerifyUpdate(mdctx, message.privateHandler, message.privateLength) != 1) {
+ goto err;
+ }
+
+ temp = EVP_VerifyFinal(mdctx,
+ reinterpret_cast<unsigned char *>(signature.privateHandler),
+ signature.privateLength,
+ pkey);
+
+ if (temp == 0) {
+ *status = CERTSVC_INVALID_SIGNATURE;
+ result = CERTSVC_SUCCESS;
+ } else if (temp == 1) {
+ *status = CERTSVC_SUCCESS;
+ result = CERTSVC_SUCCESS;
+ }
+
+err:
+
+ if (mdctx != NULL)
+ EVP_MD_CTX_destroy(mdctx);
+
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
+
+ return result;
+ }
+
+ inline int base64Encode(
+ const CertSvcString &message,
+ CertSvcString *base64)
+ {
+ if (!base64) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ std::string info(message.privateHandler, message.privateLength);
+ Base64Encoder base;
+ base.reset();
+ base.append(info);
+ base.finalize();
+ info = base.get();
+ char *ptr = new char[info.size() + 1];
+
+ if (ptr == NULL) {
+ return CERTSVC_BAD_ALLOC;
+ }
+
+ memcpy(ptr, info.c_str(), info.size() + 1);
+ m_allocatedStringSet.insert(ptr);
+ base64->privateHandler = ptr;
+ base64->privateLength = info.size();
+ base64->privateInstance = message.privateInstance;
+ return CERTSVC_SUCCESS;
+ }
+
+ int base64Decode(
+ const CertSvcString &base64,
+ CertSvcString *message)
+ {
+ if (!message) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ std::string info(base64.privateHandler, base64.privateLength);
+ Base64Decoder base;
+ base.reset();
+ base.append(info);
+
+ if (!base.finalize()) {
+ return CERTSVC_FAIL;
+ }
+
+ info = base.get();
+ char *ptr = new char[info.size() + 1];
+
+ if (ptr == NULL) {
+ return CERTSVC_BAD_ALLOC;
+ }
+
+ memcpy(ptr, info.c_str(), info.size() + 1);
+ m_allocatedStringSet.insert(ptr);
+ message->privateHandler = ptr;
+ message->privateLength = info.size();
+ message->privateInstance = base64.privateInstance;
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int stringNew(
+ CertSvcInstance &instance,
+ const char *str,
+ size_t size,
+ CertSvcString *output)
+ {
+ if (!output)
+ return CERTSVC_WRONG_ARGUMENT;
+
+ /* return struct for empty string */
+ if (size == 0 || str == NULL) {
+ output->privateHandler = NULL;
+ output->privateLength = 0;
+ output->privateInstance = instance;
+ return CERTSVC_SUCCESS;
+ }
+
+ if (strlen(str) < size)
+ return CERTSVC_WRONG_ARGUMENT;
+
+ char *ptr = new(std::nothrow) char[size + 1];
+
+ if (ptr == NULL)
+ return CERTSVC_BAD_ALLOC;
+
+ memcpy(ptr, str, size);
+ ptr[size] = '\0';
+ output->privateHandler = ptr;
+ output->privateLength = size;
+ output->privateInstance = instance;
+ m_allocatedStringSet.insert(ptr);
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int certificateVerify(
+ CertSvcCertificate certificate,
+ const CertSvcCertificate *trusted,
+ size_t trustedSize,
+ const CertSvcCertificate *untrusted,
+ size_t untrustedSize,
+ int checkCaFlag,
+ int *status)
+ {
+ if (!trusted || !status) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ auto iter = m_certificateMap.find(certificate.privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ X509 *cert = iter->second->getX509();
+ X509_STORE *store = X509_STORE_new();
+ STACK_OF(X509) *ustore = sk_X509_new_null();
+
+ for (size_t i = 0; i < trustedSize; ++i) {
+ auto iter = m_certificateMap.find(trusted[i].privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ X509_STORE_free(store);
+ sk_X509_free(ustore);
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ X509_STORE_add_cert(store, iter->second->getX509());
+ }
+
+ for (size_t i = 0; i < untrustedSize; ++i) {
+ auto iter = m_certificateMap.find(untrusted[i].privateHandler);
+
+ if (iter == m_certificateMap.end()) {
+ X509_STORE_free(store);
+ sk_X509_free(ustore);
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ if (sk_X509_push(ustore, iter->second->getX509()) == 0)
+ break;
+ }
+
+ X509_STORE_CTX context;
+ X509_STORE_CTX_init(&context, store, cert, ustore);
+ int result = X509_verify_cert(&context);
+
+ if (result == 1 && checkCaFlag) { // check strictly
+ STACK_OF(X509) *resultChain = X509_STORE_CTX_get1_chain(&context);
+ X509 *tmpCert = NULL;
+ int caFlagValidity;
+
+ while ((tmpCert = sk_X509_pop(resultChain))) {
+ caFlagValidity = X509_check_ca(tmpCert);
+
+ if (caFlagValidity != 1 && (tmpCert = sk_X509_pop(resultChain)) != NULL) {
+ // the last one is not a CA.
+ result = 0;
+ break;
+ }
+ }
+ }
+
+ X509_STORE_CTX_cleanup(&context);
+ X509_STORE_free(store);
+ sk_X509_free(ustore);
+
+ if (result == 1) {
+ *status = CERTSVC_SUCCESS;
+ } else {
+ *status = CERTSVC_FAIL;
+ }
+
+ return CERTSVC_SUCCESS;
+ }
// TODO : sangan.kwon, modify method by using CertificateIdentifier
- int getVisibility(CertSvcCertificate certificate, CertSvcVisibility *visibility, const char *fingerprintListPath)
- {
+ int getVisibility(CertSvcCertificate certificate, CertSvcVisibility *visibility,
+ const char *fingerprintListPath)
+ {
int ret = CERTSVC_FAIL;
//xmlChar *xmlPathCertificateSet = (xmlChar*) "CertificateSet"; /*unused variable*/
//xmlChar *xmlPathCertificateDomain = (xmlChar*) "CertificateDomain";// name=\"tizen-platform\""; /*unused variable*/
- xmlChar *xmlPathDomainPlatform = (xmlChar*) "tizen-platform";
- xmlChar *xmlPathDomainPublic = (xmlChar*) "tizen-public";
- xmlChar *xmlPathDomainPartner = (xmlChar*) "tizen-partner";
- xmlChar *xmlPathDomainDeveloper = (xmlChar*) "tizen-developer";
+ xmlChar *xmlPathDomainPlatform = (xmlChar *) "tizen-platform";
+ xmlChar *xmlPathDomainPublic = (xmlChar *) "tizen-public";
+ xmlChar *xmlPathDomainPartner = (xmlChar *) "tizen-partner";
+ xmlChar *xmlPathDomainDeveloper = (xmlChar *) "tizen-developer";
//xmlChar *xmlPathFingerPrintSHA1 = (xmlChar*) "FingerprintSHA1"; /*unused variable*/
+ auto iter = m_certificateMap.find(certificate.privateHandler);
- auto iter = m_certificateMap.find(certificate.privateHandler);
- if (iter == m_certificateMap.end()) {
+ if (iter == m_certificateMap.end()) {
return CERTSVC_FAIL;
- }
- CertificatePtr certPtr = iter->second;
-
- std::string fingerprint = Certificate::FingerprintToColonHex(certPtr->getFingerprint(Certificate::FINGERPRINT_SHA1));
+ }
+ CertificatePtr certPtr = iter->second;
+ std::string fingerprint = Certificate::FingerprintToColonHex(certPtr->getFingerprint(
+ Certificate::FINGERPRINT_SHA1));
/* load file */
xmlDocPtr doc = xmlParseFile(fingerprintListPath);
- if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL))
- {
+
+ if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)) {
LogError("Failed to prase fingerprint_list.xml");
return CERTSVC_IO_ERROR;
}
xmlNodePtr curPtr = xmlFirstElementChild(xmlDocGetRootElement(doc));
- if(curPtr == NULL)
- {
+
+ if (curPtr == NULL) {
LogError("Can not find root");
ret = CERTSVC_IO_ERROR;
goto out;
}
- while(curPtr != NULL)
- {
- xmlAttr* attr = curPtr->properties;
- if(!attr->children || !attr->children->content)
- {
+ while (curPtr != NULL) {
+ xmlAttr *attr = curPtr->properties;
+
+ if (!attr->children || !attr->children->content) {
LogError("Failed to get fingerprints from list");
ret = CERTSVC_FAIL;
goto out;
}
- xmlChar* strLevel = attr->children->content;
+ xmlChar *strLevel = attr->children->content;
xmlNodePtr FpPtr = xmlFirstElementChild(curPtr);
- if(FpPtr == NULL)
- {
+
+ if (FpPtr == NULL) {
LogError("Could not find fingerprint");
ret = CERTSVC_FAIL;
goto out;
}
LogDebug("Retrieve level : " << strLevel);
- while(FpPtr)
- {
+
+ while (FpPtr) {
xmlChar *content = xmlNodeGetContent(FpPtr);
- if(xmlStrcmp(content, (xmlChar*)fingerprint.c_str()) == 0)
- {
+
+ if (xmlStrcmp(content, (xmlChar *)fingerprint.c_str()) == 0) {
LogDebug("fingerprint : " << content << " are " << strLevel);
- if(!xmlStrcmp(strLevel, xmlPathDomainPlatform))
- {
+
+ if (!xmlStrcmp(strLevel, xmlPathDomainPlatform)) {
*visibility = CERTSVC_VISIBILITY_PLATFORM;
ret = CERTSVC_SUCCESS;
goto out;
- }
- else if(!xmlStrcmp(strLevel, xmlPathDomainPublic))
- {
+ } else if (!xmlStrcmp(strLevel, xmlPathDomainPublic)) {
*visibility = CERTSVC_VISIBILITY_PUBLIC;
ret = CERTSVC_SUCCESS;
goto out;
- }
- else if(!xmlStrcmp(strLevel, xmlPathDomainPartner))
- {
+ } else if (!xmlStrcmp(strLevel, xmlPathDomainPartner)) {
*visibility = CERTSVC_VISIBILITY_PARTNER;
ret = CERTSVC_SUCCESS;
goto out;
- }
- else if(!xmlStrcmp(strLevel, xmlPathDomainDeveloper))
- {
+ } else if (!xmlStrcmp(strLevel, xmlPathDomainDeveloper)) {
*visibility = CERTSVC_VISIBILITY_DEVELOPER;
ret = CERTSVC_SUCCESS;
goto out;
}
}
- FpPtr = xmlNextElementSibling(FpPtr);
+
+ FpPtr = xmlNextElementSibling(FpPtr);
+ }
+
+ curPtr = xmlNextElementSibling(curPtr);
+ }
+
+ xmlFreeDoc(doc);
+ return CERTSVC_FAIL;
+out:
+ xmlFreeDoc(doc);
+ return ret;
+ }
+
+ inline int pkcsNameIsUniqueInStore(
+ CertStoreType storeType,
+ CertSvcString pfxIdString,
+ int *is_unique)
+ {
+ return vcore_client_check_alias_exist_in_store(storeType, pfxIdString.privateHandler, is_unique);
+ }
+
+ inline int getCertDetailFromStore(CertStoreType storeType,
+ CertSvcString gname,
+ char **certBuffer,
+ size_t *certSize)
+ {
+ return vcore_client_get_certificate_from_store(storeType, gname.privateHandler, certBuffer,
+ certSize, PEM_CRT);
+ }
+
+ inline int pkcsDeleteCertFromStore(
+ CertStoreType storeType,
+ CertSvcString gname
+ )
+ {
+ return vcore_client_delete_certificate_from_store(storeType, gname.privateHandler);
+ }
+
+ inline int pkcsHasPassword(
+ CertSvcString filepath,
+ int *has_password)
+ {
+ return pkcs12_has_password(filepath.privateHandler, has_password);
+ }
+
+ inline int pkcsImportToStore(
+ CertStoreType storeType,
+ CertSvcString path,
+ CertSvcString pass,
+ CertSvcString pfxIdString)
+ {
+ return pkcs12_import_from_file_to_store(storeType, path.privateHandler, pass.privateHandler,
+ pfxIdString.privateHandler);
+ }
+
+ inline int pkcsGetAliasNameForCertInStore(CertStoreType storeType,
+ CertSvcString gname,
+ char **alias)
+ {
+ return vcore_client_get_certificate_alias_from_store(storeType, gname.privateHandler, alias);
+ }
+
+ inline int pkcsSetCertStatusToStore(CertStoreType storeType,
+ int is_root_app,
+ CertSvcString gname,
+ CertStatus status)
+ {
+ return vcore_client_set_certificate_status_to_store(storeType, is_root_app, gname.privateHandler,
+ status);
+ }
+
+ inline int pkcsGetCertStatusFromStore(
+ CertStoreType storeType,
+ CertSvcString gname,
+ CertStatus *status)
+ {
+ return vcore_client_get_certificate_status_from_store(storeType, gname.privateHandler, status);
+ }
+
+ inline int getCertFromStore(CertSvcInstance instance,
+ CertStoreType storeType,
+ const char *gname,
+ CertSvcCertificate *certificate)
+ {
+ return certsvc_get_certificate(instance, storeType, gname, certificate);
+ }
+
+ inline int freePkcsIdListFromStore(CertSvcStoreCertList **certList)
+ {
+ CertSvcStoreCertList *current;
+ CertSvcStoreCertList *next;
+
+ for (current = *certList; current != NULL; current = next) {
+ next = current->next;
+ free(current->title);
+ free(current->gname);
+ free(current);
+ }
+
+ *certList = NULL;
+ return CERTSVC_SUCCESS;
+ }
+
+ inline int getPkcsIdListFromStore(
+ CertStoreType storeType,
+ int is_root_app,
+ CertSvcStoreCertList **certList,
+ size_t *length)
+ {
+ return vcore_client_get_certificate_list_from_store(storeType, is_root_app, certList, length);
+ }
+
+ inline int getPkcsIdEndUserListFromStore(
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length)
+ {
+ return vcore_client_get_end_user_certificate_list_from_store(storeType, certList, length);
+ }
+
+ inline int getPkcsIdRootListFromStore(
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length)
+ {
+ return vcore_client_get_root_certificate_list_from_store(storeType, certList, length);
+ }
+
+ inline int getPkcsPrivateKeyFromStore(
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **certBuffer,
+ size_t *certSize)
+ {
+ return vcore_client_get_certificate_from_store(storeType, gname.privateHandler, certBuffer,
+ certSize, (CertType)P12_PKEY);
+ }
+
+ inline int getPkcsCertificateListFromStore(
+ CertSvcInstance &instance,
+ CertStoreType storeType,
+ CertSvcString &pfxIdString,
+ CertSvcCertificateList *handler)
+ {
+ char **certs = NULL;
+ size_t ncerts = 0;
+ int result = vcore_client_load_certificates_from_store(storeType, pfxIdString.privateHandler,
+ &certs, &ncerts);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Unable to load certificates from store.");
+ return result;
+ }
+
+ std::shared_ptr<char *> certsPtr(certs, CharArrDeleter());
+ std::vector<CertificatePtr> certPtrVector;
+
+ for (size_t i = 0; i < ncerts; i++) {
+ CertSvcString Alias;
+ Alias.privateHandler = certs[i];
+ Alias.privateLength = strlen(certs[i]);
+ char *certBuffer = NULL;
+ size_t certLength = 0;
+ result = certsvc_pkcs12_get_certificate_info_from_store(instance, storeType, Alias, &certBuffer,
+ &certLength);
+
+ if (result != CERTSVC_SUCCESS || !certBuffer) {
+ LogError("Failed to get certificate buffer.");
+ return CERTSVC_FAIL;
+ }
+
+ std::shared_ptr<char> certBufferPtr(certBuffer, CharDeleter());
+ const char *header = strstr(certBuffer, START_CERT);
+ const char *headEnd = START_CERT;
+
+ if (!header) {
+ header = strstr(certBuffer, START_TRUSTED);
+ headEnd = START_TRUSTED;
+
+ if (!header) {
+ LogError("Invalid format of certificate. alias : " << certs[i]);
+ return CERTSVC_FAIL;
+ }
+ }
+
+ const char *trailer = strstr(header, END_CERT);
+ const char *tailEnd = END_CERT;
+
+ if (!trailer) {
+ trailer = strstr(header, END_TRUSTED);
+ tailEnd = END_TRUSTED;
+
+ if (!trailer) {
+ LogError("Invalid format of certificate. alias : " << certs[i]);
+ return CERTSVC_FAIL;
+ }
}
- curPtr = xmlNextElementSibling(curPtr);
+
+ if ((strcmp(headEnd, START_CERT) == 0 && strcmp(tailEnd, END_TRUSTED) == 0)
+ || (strcmp(headEnd, START_TRUSTED) == 0 && strcmp(tailEnd, END_CERT) == 0)) {
+ LogError("Invalid format of certificate. alias : " << certs[i]);
+ return CERTSVC_FAIL;
+ }
+
+ header += strlen(headEnd); /* cut headEnd */
+ std::string certStr(header, strlen(header) - strlen(trailer));
+ certPtrVector.push_back(CertificatePtr(new Certificate(certStr, Certificate::FORM_BASE64)));
}
- xmlFreeDoc(doc);
- return CERTSVC_FAIL;
-out:
- xmlFreeDoc(doc);
- return ret;
- }
- inline int pkcsNameIsUniqueInStore(
- CertStoreType storeType,
- CertSvcString pfxIdString,
- int *is_unique)
- {
- return vcore_client_check_alias_exist_in_store(storeType, pfxIdString.privateHandler, is_unique);
- }
-
- inline int getCertDetailFromStore(CertStoreType storeType,
- CertSvcString gname,
- char **certBuffer,
- size_t *certSize)
- {
- return vcore_client_get_certificate_from_store(storeType, gname.privateHandler, certBuffer, certSize, PEM_CRT);
- }
-
- inline int pkcsDeleteCertFromStore(
- CertStoreType storeType,
- CertSvcString gname
- )
- {
- return vcore_client_delete_certificate_from_store(storeType, gname.privateHandler);
- }
-
- inline int pkcsHasPassword(
- CertSvcString filepath,
- int *has_password)
- {
- return pkcs12_has_password(filepath.privateHandler, has_password);
- }
-
- inline int pkcsImportToStore(
- CertStoreType storeType,
- CertSvcString path,
- CertSvcString pass,
- CertSvcString pfxIdString)
- {
- return pkcs12_import_from_file_to_store(storeType, path.privateHandler, pass.privateHandler, pfxIdString.privateHandler);
- }
-
- inline int pkcsGetAliasNameForCertInStore(CertStoreType storeType,
- CertSvcString gname,
- char **alias)
- {
- return vcore_client_get_certificate_alias_from_store(storeType, gname.privateHandler, alias);
- }
-
- inline int pkcsSetCertStatusToStore(CertStoreType storeType,
- int is_root_app,
- CertSvcString gname,
- CertStatus status)
- {
- return vcore_client_set_certificate_status_to_store(storeType, is_root_app, gname.privateHandler, status);
- }
-
- inline int pkcsGetCertStatusFromStore(
- CertStoreType storeType,
- CertSvcString gname,
- CertStatus *status)
- {
- return vcore_client_get_certificate_status_from_store(storeType, gname.privateHandler, status);
- }
-
- inline int getCertFromStore(CertSvcInstance instance,
- CertStoreType storeType,
- const char *gname,
- CertSvcCertificate *certificate)
- {
- return certsvc_get_certificate(instance, storeType, gname, certificate);
- }
-
- inline int freePkcsIdListFromStore(CertSvcStoreCertList **certList)
- {
- CertSvcStoreCertList *current;
- CertSvcStoreCertList *next;
-
- for (current = *certList; current != NULL; current = next) {
- next = current->next;
-
- free(current->title);
- free(current->gname);
- free(current);
- }
-
- *certList = NULL;
-
- return CERTSVC_SUCCESS;
- }
-
- inline int getPkcsIdListFromStore(
- CertStoreType storeType,
- int is_root_app,
- CertSvcStoreCertList** certList,
- size_t *length)
- {
- return vcore_client_get_certificate_list_from_store(storeType, is_root_app, certList, length);
- }
-
- inline int getPkcsIdEndUserListFromStore(
- CertStoreType storeType,
- CertSvcStoreCertList** certList,
- size_t *length)
- {
- return vcore_client_get_end_user_certificate_list_from_store(storeType, certList, length);
- }
-
- inline int getPkcsIdRootListFromStore(
- CertStoreType storeType,
- CertSvcStoreCertList** certList,
- size_t *length)
- {
- return vcore_client_get_root_certificate_list_from_store(storeType, certList, length);
- }
-
- inline int getPkcsPrivateKeyFromStore(
- CertStoreType storeType,
- CertSvcString gname,
- char **certBuffer,
- size_t *certSize)
- {
- return vcore_client_get_certificate_from_store(storeType, gname.privateHandler, certBuffer, certSize, (CertType)P12_PKEY);
- }
-
- inline int getPkcsCertificateListFromStore(
- CertSvcInstance &instance,
- CertStoreType storeType,
- CertSvcString &pfxIdString,
- CertSvcCertificateList *handler)
- {
- char **certs = NULL;
- size_t ncerts = 0;
- int result = vcore_client_load_certificates_from_store(storeType, pfxIdString.privateHandler, &certs, &ncerts);
- if (result != CERTSVC_SUCCESS) {
- LogError("Unable to load certificates from store.");
- return result;
- }
-
- std::shared_ptr<char *> certsPtr(certs, CharArrDeleter());
+ std::vector<size_t> listId;
- std::vector<CertificatePtr> certPtrVector;
- for (size_t i = 0; i < ncerts; i++) {
- CertSvcString Alias;
- Alias.privateHandler = certs[i];
- Alias.privateLength = strlen(certs[i]);
- char *certBuffer = NULL;
- size_t certLength = 0;
- result = certsvc_pkcs12_get_certificate_info_from_store(instance, storeType, Alias, &certBuffer, &certLength);
- if (result != CERTSVC_SUCCESS || !certBuffer) {
- LogError("Failed to get certificate buffer.");
- return CERTSVC_FAIL;
- }
-
- std::shared_ptr<char> certBufferPtr(certBuffer, CharDeleter());
-
- const char *header = strstr(certBuffer, START_CERT);
- const char *headEnd = START_CERT;
- if (!header) {
- header = strstr(certBuffer, START_TRUSTED);
- headEnd = START_TRUSTED;
- if (!header) {
- LogError("Invalid format of certificate. alias : " << certs[i]);
- return CERTSVC_FAIL;
- }
- }
-
- const char *trailer = strstr(header, END_CERT);
- const char *tailEnd = END_CERT;
- if (!trailer) {
- trailer = strstr(header, END_TRUSTED);
- tailEnd = END_TRUSTED;
- if (!trailer) {
- LogError("Invalid format of certificate. alias : " << certs[i]);
- return CERTSVC_FAIL;
- }
- }
-
- if ((strcmp(headEnd, START_CERT) == 0 && strcmp(tailEnd, END_TRUSTED) == 0)
- || (strcmp(headEnd, START_TRUSTED) == 0 && strcmp(tailEnd, END_CERT) == 0)) {
- LogError("Invalid format of certificate. alias : " << certs[i]);
- return CERTSVC_FAIL;
- }
-
- header += strlen(headEnd); /* cut headEnd */
- std::string certStr(header, strlen(header) - strlen(trailer));
- certPtrVector.push_back(CertificatePtr(new Certificate(certStr, Certificate::FORM_BASE64)));
- }
-
- std::vector<size_t> listId;
- for (const auto &cert : certPtrVector)
- listId.push_back(addCert(cert));
-
- size_t position = m_idListCounter++;
- m_idListMap[position] = listId;
-
- handler->privateInstance = instance;
- handler->privateHandler = position;
-
- return result;
- }
-
- inline bool checkValidStoreType(CertStoreType storeType)
- {
- if (storeType >= VPN_STORE && storeType <= ALL_STORE)
- return true;
- else
- return false;
- }
+ for (const auto &cert : certPtrVector)
+ listId.push_back(addCert(cert));
+
+ size_t position = m_idListCounter++;
+ m_idListMap[position] = listId;
+ handler->privateInstance = instance;
+ handler->privateHandler = position;
+ return result;
+ }
+
+ inline bool checkValidStoreType(CertStoreType storeType)
+ {
+ if (storeType >= VPN_STORE && storeType <= ALL_STORE)
+ return true;
+ else
+ return false;
+ }
private:
- size_t m_certificateCounter;
- std::map<size_t, CertificatePtr> m_certificateMap;
+ size_t m_certificateCounter;
+ std::map<size_t, CertificatePtr> m_certificateMap;
- size_t m_idListCounter;
- std::map<size_t, std::vector<size_t> > m_idListMap;
+ size_t m_idListCounter;
+ std::map<size_t, std::vector<size_t>> m_idListMap;
- size_t m_stringListCounter;
- std::map<size_t, std::vector<std::string> > m_stringListMap;
+ size_t m_stringListCounter;
+ std::map<size_t, std::vector<std::string>> m_stringListMap;
- std::set<char *> m_allocatedStringSet;
+ std::set<char *> m_allocatedStringSet;
};
-inline CertSvcInstanceImpl *impl(CertSvcInstance instance) {
- return static_cast<CertSvcInstanceImpl*>(instance.privatePtr);
+inline CertSvcInstanceImpl *impl(CertSvcInstance instance)
+{
+ return static_cast<CertSvcInstanceImpl *>(instance.privatePtr);
}
} // namespace anonymous
-int certsvc_instance_new(CertSvcInstance *instance) {
- static int init = 1;
- if (init) {
- OpenSSL_add_ssl_algorithms();
- OpenSSL_add_all_digests();
- init = 0;
- }
- try {
- instance->privatePtr =
- reinterpret_cast<void*>(new CertSvcInstanceImpl);
- if (instance->privatePtr)
- return CERTSVC_SUCCESS;
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+int certsvc_instance_new(CertSvcInstance *instance)
+{
+ static int init = 1;
+
+ if (init) {
+ OpenSSL_add_ssl_algorithms();
+ OpenSSL_add_all_digests();
+ init = 0;
+ }
+
+ try {
+ instance->privatePtr =
+ reinterpret_cast<void *>(new CertSvcInstanceImpl);
+
+ if (instance->privatePtr)
+ return CERTSVC_SUCCESS;
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
-void certsvc_instance_reset(CertSvcInstance instance) {
- impl(instance)->reset();
+void certsvc_instance_reset(CertSvcInstance instance)
+{
+ impl(instance)->reset();
}
-void certsvc_instance_free(CertSvcInstance instance) {
- delete impl(instance);
+void certsvc_instance_free(CertSvcInstance instance)
+{
+ delete impl(instance);
}
int certsvc_certificate_new_from_file(
- CertSvcInstance instance,
- const char *location,
- CertSvcCertificate *certificate)
+ CertSvcInstance instance,
+ const char *location,
+ CertSvcCertificate *certificate)
{
- try {
- CertificatePtr cert = Certificate::createFromFile(location);
-
- certificate->privateInstance = instance;
- certificate->privateHandler = impl(instance)->addCert(cert);
-
- return CERTSVC_SUCCESS;
- // TODO support for std exceptions
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ CertificatePtr cert = Certificate::createFromFile(location);
+ certificate->privateInstance = instance;
+ certificate->privateHandler = impl(instance)->addCert(cert);
+ return CERTSVC_SUCCESS;
+ // TODO support for std exceptions
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_new_from_memory(
- CertSvcInstance instance,
- const unsigned char *memory,
- size_t len,
- CertSvcCertificateForm form,
- CertSvcCertificate *certificate)
+ CertSvcInstance instance,
+ const unsigned char *memory,
+ size_t len,
+ CertSvcCertificateForm form,
+ CertSvcCertificate *certificate)
{
- try {
- Certificate::FormType formType;
- std::string binary((char*)memory, len);
-
- if (CERTSVC_FORM_DER == form) {
- formType = Certificate::FORM_DER;
- } else {
- formType = Certificate::FORM_BASE64;
- }
-
- CertificatePtr cert(new Certificate(binary, formType));
-
- certificate->privateInstance = instance;
- certificate->privateHandler = impl(instance)->addCert(cert);
- return CERTSVC_SUCCESS;
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ Certificate::FormType formType;
+ std::string binary((char *)memory, len);
+
+ if (CERTSVC_FORM_DER == form) {
+ formType = Certificate::FORM_DER;
+ } else {
+ formType = Certificate::FORM_BASE64;
+ }
+
+ CertificatePtr cert(new Certificate(binary, formType));
+ certificate->privateInstance = instance;
+ certificate->privateHandler = impl(instance)->addCert(cert);
+ return CERTSVC_SUCCESS;
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
void certsvc_certificate_free(CertSvcCertificate certificate)
}
int certsvc_certificate_save_file(
- CertSvcCertificate certificate,
- const char *location)
+ CertSvcCertificate certificate,
+ const char *location)
{
- return impl(certificate.privateInstance)->saveToFile(certificate, location);
+ return impl(certificate.privateInstance)->saveToFile(certificate, location);
}
int certsvc_certificate_list_get_one(
- CertSvcCertificateList handler,
- size_t position,
- CertSvcCertificate *certificate)
+ CertSvcCertificateList handler,
+ size_t position,
+ CertSvcCertificate *certificate)
{
- return impl(handler.privateInstance)->
- getCertFromList(handler, position, certificate);
+ return impl(handler.privateInstance)->
+ getCertFromList(handler, position, certificate);
}
int certsvc_certificate_list_get_length(
- CertSvcCertificateList handler,
- size_t *size)
+ CertSvcCertificateList handler,
+ size_t *size)
{
- return impl(handler.privateInstance)->getCertListLen(handler, size);
+ return impl(handler.privateInstance)->getCertListLen(handler, size);
}
void certsvc_certificate_list_free(CertSvcCertificateList handler)
{
- impl(handler.privateInstance)->removeCertList(handler);
+ impl(handler.privateInstance)->removeCertList(handler);
}
void certsvc_certificate_list_all_free(CertSvcCertificateList handler)
{
- impl(handler.privateInstance)->removeCertListAll(handler);
+ impl(handler.privateInstance)->removeCertListAll(handler);
}
int certsvc_certificate_is_signed_by(
- CertSvcCertificate child,
- CertSvcCertificate parent,
- int *status)
+ CertSvcCertificate child,
+ CertSvcCertificate parent,
+ int *status)
{
- if (child.privateInstance.privatePtr == parent.privateInstance.privatePtr) {
- return impl(child.privateInstance)->isSignedBy(child, parent, status);
- }
- return CERTSVC_WRONG_ARGUMENT;
+ if (child.privateInstance.privatePtr == parent.privateInstance.privatePtr) {
+ return impl(child.privateInstance)->isSignedBy(child, parent, status);
+ }
+
+ return CERTSVC_WRONG_ARGUMENT;
}
int certsvc_certificate_get_string_field(
- CertSvcCertificate certificate,
- CertSvcCertificateField field,
- CertSvcString *buffer)
+ CertSvcCertificate certificate,
+ CertSvcCertificateField field,
+ CertSvcString *buffer)
{
- try {
- return impl(certificate.privateInstance)->getField(certificate, field, buffer);
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->getField(certificate, field, buffer);
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_get_not_after(
- CertSvcCertificate certificate,
- time_t *result)
+ CertSvcCertificate certificate,
+ time_t *result)
{
- try {
- return impl(certificate.privateInstance)->getNotAfter(certificate, result);
- } catch(...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->getNotAfter(certificate, result);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_get_not_before(
- CertSvcCertificate certificate,
- time_t *result)
+ CertSvcCertificate certificate,
+ time_t *result)
{
- try {
- return impl(certificate.privateInstance)->getNotBefore(certificate, result);
- } catch(...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->getNotBefore(certificate, result);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_is_root_ca(CertSvcCertificate certificate, int *status)
{
- return impl(certificate.privateInstance)->isRootCA(certificate, status);
+ return impl(certificate.privateInstance)->isRootCA(certificate, status);
}
int certsvc_string_list_get_one(
- CertSvcStringList handler,
- size_t position,
- CertSvcString *buffer)
+ CertSvcStringList handler,
+ size_t position,
+ CertSvcString *buffer)
{
- try {
- return impl(handler.privateInstance)->getStringFromList(handler, position, buffer);
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(handler.privateInstance)->getStringFromList(handler, position, buffer);
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_string_list_get_length(
- CertSvcStringList handler,
- size_t *size)
+ CertSvcStringList handler,
+ size_t *size)
{
- return impl(handler.privateInstance)->getStringListLen(handler, size);
+ return impl(handler.privateInstance)->getStringListLen(handler, size);
}
void certsvc_string_list_free(CertSvcStringList handler)
{
- if (handler.privateHandler != 0)
- {
+ if (handler.privateHandler != 0) {
impl(handler.privateInstance)->removeStringList(handler);
handler.privateHandler = 0;
}
}
void certsvc_string_to_cstring(
- CertSvcString string,
- const char **buffer,
- size_t *len)
+ CertSvcString string,
+ const char **buffer,
+ size_t *len)
{
- if (buffer) {
- *buffer = string.privateHandler;
- }
- if (len) {
- *len = string.privateLength;
- }
+ if (buffer) {
+ *buffer = string.privateHandler;
+ }
+
+ if (len) {
+ *len = string.privateLength;
+ }
}
int certsvc_certificate_chain_sort(
- CertSvcCertificate *certificate_array,
- size_t size)
+ CertSvcCertificate *certificate_array,
+ size_t size)
{
- try {
- if (!certificate_array) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- return impl(certificate_array[0].privateInstance)->
- sortCollection(certificate_array, size);
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!certificate_array) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ return impl(certificate_array[0].privateInstance)->
+ sortCollection(certificate_array, size);
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_dup_x509(CertSvcCertificate certificate, X509 **cert)
{
- try {
- return impl(certificate.privateInstance)->getX509Copy(certificate, cert);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->getX509Copy(certificate, cert);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
void certsvc_certificate_free_x509(X509 *x509)
try {
return impl(certificate.privateInstance)->getPubkeyDER(certificate, pubkey, len);
} catch (...) {}
+
return CERTSVC_FAIL;
}
-void certsvc_pkcs12_free_evp_pkey(EVP_PKEY* pkey)
+void certsvc_pkcs12_free_evp_pkey(EVP_PKEY *pkey)
{
- EVP_PKEY_free(pkey);
+ EVP_PKEY_free(pkey);
}
int certsvc_message_verify(
- CertSvcCertificate certificate,
- CertSvcString message,
- CertSvcString signature,
- const char *algorithm,
- int *status)
+ CertSvcCertificate certificate,
+ CertSvcString message,
+ CertSvcString signature,
+ const char *algorithm,
+ int *status)
{
- try {
- return impl(certificate.privateInstance)->verify(
- certificate,
- message,
- signature,
- algorithm,
- status);
- } catch(...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->verify(
+ certificate,
+ message,
+ signature,
+ algorithm,
+ status);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_base64_encode(CertSvcString message, CertSvcString *base64)
{
- try {
- return impl(message.privateInstance)->base64Encode(message, base64);
- } catch(...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(message.privateInstance)->base64Encode(message, base64);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_base64_decode(CertSvcString base64, CertSvcString *message)
{
- try {
- return impl(base64.privateInstance)->base64Decode(base64, message);
- } catch(...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(base64.privateInstance)->base64Decode(base64, message);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_string_new(
- CertSvcInstance instance,
- const char *url,
- size_t size,
- CertSvcString *output)
+ CertSvcInstance instance,
+ const char *url,
+ size_t size,
+ CertSvcString *output)
{
- try {
- return impl(instance)->stringNew(instance, url, size, output);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(instance)->stringNew(instance, url, size, output);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_string_not_managed(
- CertSvcInstance instance,
- const char *url,
- size_t size,
- CertSvcString *output)
+ CertSvcInstance instance,
+ const char *url,
+ size_t size,
+ CertSvcString *output)
{
- if (!output) {
- return CERTSVC_WRONG_ARGUMENT;
- }
- output->privateHandler = const_cast<char*>(url);
- output->privateLength = size;
- output->privateInstance = instance;
- return CERTSVC_SUCCESS;
+ if (!output) {
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ output->privateHandler = const_cast<char *>(url);
+ output->privateLength = size;
+ output->privateInstance = instance;
+ return CERTSVC_SUCCESS;
}
int certsvc_certificate_verify(
- CertSvcCertificate certificate,
- const CertSvcCertificate *trusted,
- size_t trustedSize,
- const CertSvcCertificate *untrusted,
- size_t untrustedSize,
- int *status)
+ CertSvcCertificate certificate,
+ const CertSvcCertificate *trusted,
+ size_t trustedSize,
+ const CertSvcCertificate *untrusted,
+ size_t untrustedSize,
+ int *status)
{
- try {
- return impl(certificate.privateInstance)->certificateVerify(
- certificate,
- trusted,
- trustedSize,
- untrusted,
- untrustedSize,
- 0,
- status);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->certificateVerify(
+ certificate,
+ trusted,
+ trustedSize,
+ untrusted,
+ untrustedSize,
+ 0,
+ status);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_certificate_verify_with_caflag(
- CertSvcCertificate certificate,
- const CertSvcCertificate *trusted,
- size_t trustedSize,
- const CertSvcCertificate *untrusted,
- size_t untrustedSize,
- int *status)
+ CertSvcCertificate certificate,
+ const CertSvcCertificate *trusted,
+ size_t trustedSize,
+ const CertSvcCertificate *untrusted,
+ size_t untrustedSize,
+ int *status)
{
- try {
- return impl(certificate.privateInstance)->certificateVerify(
- certificate,
- trusted,
- trustedSize,
- untrusted,
- untrustedSize,
- 1,
- status);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(certificate.privateInstance)->certificateVerify(
+ certificate,
+ trusted,
+ trustedSize,
+ untrusted,
+ untrustedSize,
+ 1,
+ status);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
-int certsvc_certificate_get_visibility(CertSvcCertificate certificate, CertSvcVisibility *visibility)
+int certsvc_certificate_get_visibility(CertSvcCertificate certificate,
+ CertSvcVisibility *visibility)
{
- try {
- int result = impl(certificate.privateInstance)->getVisibility(certificate, visibility, FINGERPRINT_LIST_PATH);
- if (result != CERTSVC_SUCCESS) {
- LogDebug("Cannot find store id in FINGERPRINT_LIST_PATH. Find it in extention continue.");
- result = impl(certificate.privateInstance)->getVisibility(certificate, visibility, FINGERPRINT_LIST_EXT_PATH);
- }
- return result;
- } catch (...)
- {
- LogError("exception occur");
- }
- return CERTSVC_FAIL;
+ try {
+ int result = impl(certificate.privateInstance)->getVisibility(certificate, visibility,
+ FINGERPRINT_LIST_PATH);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogDebug("Cannot find store id in FINGERPRINT_LIST_PATH. Find it in extention continue.");
+ result = impl(certificate.privateInstance)->getVisibility(certificate, visibility,
+ FINGERPRINT_LIST_EXT_PATH);
+ }
+
+ return result;
+ } catch (...) {
+ LogError("exception occur");
+ }
+
+ return CERTSVC_FAIL;
}
int certsvc_get_certificate(CertSvcInstance instance,
- CertStoreType storeType,
- const char *gname,
- CertSvcCertificate *certificate)
+ CertStoreType storeType,
+ const char *gname,
+ CertSvcCertificate *certificate)
{
- int result = CERTSVC_SUCCESS;
- char* certBuffer = NULL;
- std::string fileName;
- size_t length = 0;
- FILE* fp_write = NULL;
- BIO* pBio = NULL;
- X509* x509Struct = NULL;
-
- try {
- result = vcore_client_get_certificate_from_store(storeType, gname, &certBuffer, &length, PEM_CRT);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to get certificate buffer from store.");
- return result;
- }
-
- pBio = BIO_new(BIO_s_mem());
- if (pBio == NULL) {
- LogError("Failed to allocate memory.");
- result = CERTSVC_BAD_ALLOC;
- }
-
- length = BIO_write(pBio, (const void *)certBuffer, (int)length);
- if ((int)length < 1) {
- LogError("Failed to load cert into bio.");
- result = CERTSVC_BAD_ALLOC;
- }
-
- x509Struct = PEM_read_bio_X509(pBio, NULL, 0, NULL);
- if (x509Struct != NULL) {
- CertificatePtr cert(new Certificate(x509Struct));
- certificate->privateInstance = instance;
- certificate->privateHandler = impl(instance)->addCert(cert);
- if (certBuffer!=NULL) free(certBuffer);
- }
- else {
- fileName.append(CERTSVC_PKCS12_STORAGE_DIR);
- fileName.append(gname);
- if (!(fp_write = fopen(fileName.c_str(), "w"))) {
- LogError("Failed to open the file for writing, [" << fileName << "].");
- result = CERTSVC_FAIL;
- goto error;
- }
-
- if (fwrite(certBuffer, sizeof(char), length, fp_write) != length) {
- LogError("Fail to write certificate.");
- result = CERTSVC_FAIL;
- goto error;
- }
-
- fclose(fp_write);
- result = certsvc_certificate_new_from_file(instance, fileName.c_str(), certificate);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to construct certificate from buffer.");
- goto error;
- }
- unlink(fileName.c_str());
- }
- result = CERTSVC_SUCCESS;
- } catch (std::bad_alloc &) {
- return CERTSVC_BAD_ALLOC;
- } catch (...) {}
+ int result = CERTSVC_SUCCESS;
+ char *certBuffer = NULL;
+ std::string fileName;
+ size_t length = 0;
+ FILE *fp_write = NULL;
+ BIO *pBio = NULL;
+ X509 *x509Struct = NULL;
+
+ try {
+ result = vcore_client_get_certificate_from_store(storeType, gname, &certBuffer, &length, PEM_CRT);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to get certificate buffer from store.");
+ return result;
+ }
+
+ pBio = BIO_new(BIO_s_mem());
+
+ if (pBio == NULL) {
+ LogError("Failed to allocate memory.");
+ result = CERTSVC_BAD_ALLOC;
+ }
+
+ length = BIO_write(pBio, (const void *)certBuffer, (int)length);
+
+ if ((int)length < 1) {
+ LogError("Failed to load cert into bio.");
+ result = CERTSVC_BAD_ALLOC;
+ }
+
+ x509Struct = PEM_read_bio_X509(pBio, NULL, 0, NULL);
+
+ if (x509Struct != NULL) {
+ CertificatePtr cert(new Certificate(x509Struct));
+ certificate->privateInstance = instance;
+ certificate->privateHandler = impl(instance)->addCert(cert);
+
+ if (certBuffer != NULL) free(certBuffer);
+ } else {
+ fileName.append(CERTSVC_PKCS12_STORAGE_DIR);
+ fileName.append(gname);
+
+ if (!(fp_write = fopen(fileName.c_str(), "w"))) {
+ LogError("Failed to open the file for writing, [" << fileName << "].");
+ result = CERTSVC_FAIL;
+ goto error;
+ }
+
+ if (fwrite(certBuffer, sizeof(char), length, fp_write) != length) {
+ LogError("Fail to write certificate.");
+ result = CERTSVC_FAIL;
+ goto error;
+ }
+
+ fclose(fp_write);
+ result = certsvc_certificate_new_from_file(instance, fileName.c_str(), certificate);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to construct certificate from buffer.");
+ goto error;
+ }
+
+ unlink(fileName.c_str());
+ }
+
+ result = CERTSVC_SUCCESS;
+ } catch (std::bad_alloc &) {
+ return CERTSVC_BAD_ALLOC;
+ } catch (...) {}
error:
- if (x509Struct) X509_free(x509Struct);
- if (pBio) BIO_free(pBio);
- return result;
+
+ if (x509Struct) X509_free(x509Struct);
+
+ if (pBio) BIO_free(pBio);
+
+ return result;
}
int certsvc_pkcs12_check_alias_exists_in_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString pfxIdString,
- int *is_unique)
+ CertStoreType storeType,
+ CertSvcString pfxIdString,
+ int *is_unique)
{
- if (pfxIdString.privateHandler == NULL || pfxIdString.privateLength<=0) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- return impl(instance)->pkcsNameIsUniqueInStore(storeType, pfxIdString, is_unique);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (pfxIdString.privateHandler == NULL || pfxIdString.privateLength <= 0) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsNameIsUniqueInStore(storeType, pfxIdString, is_unique);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_free_certificate_list_loaded_from_store(CertSvcInstance instance,
- CertSvcStoreCertList **certList)
+ CertSvcStoreCertList **certList)
{
- if (certList == NULL || *certList == NULL) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- return impl(instance)->freePkcsIdListFromStore(certList);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (certList == NULL || *certList == NULL) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ return impl(instance)->freePkcsIdListFromStore(certList);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- int is_root_app,
- CertSvcStoreCertList **certList,
- size_t *length)
+ CertStoreType storeType,
+ int is_root_app,
+ CertSvcStoreCertList **certList,
+ size_t *length)
{
- if (certList == NULL || *certList != NULL) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
+ if (certList == NULL || *certList != NULL) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
- return impl(instance)->getPkcsIdListFromStore(storeType, is_root_app, certList, length);
- } catch (...) {}
+ return impl(instance)->getPkcsIdListFromStore(storeType, is_root_app, certList, length);
+ } catch (...) {}
- return CERTSVC_FAIL;
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_end_user_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcStoreCertList **certList,
- size_t *length)
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length)
{
- if (certList == NULL || *certList != NULL) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- return impl(instance)->getPkcsIdEndUserListFromStore(storeType, certList, length);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (certList == NULL || *certList != NULL) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getPkcsIdEndUserListFromStore(storeType, certList, length);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_root_certificate_list_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcStoreCertList **certList,
- size_t *length)
+ CertStoreType storeType,
+ CertSvcStoreCertList **certList,
+ size_t *length)
{
- if (certList == NULL || *certList != NULL) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- return impl(instance)->getPkcsIdRootListFromStore(storeType, certList, length);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (certList == NULL || *certList != NULL) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getPkcsIdRootListFromStore(storeType, certList, length);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_certificate_info_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char **certBuffer,
- size_t *certSize)
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **certBuffer,
+ size_t *certSize)
{
- if (certBuffer == NULL || *certBuffer != NULL) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- return impl(instance)->getCertDetailFromStore(storeType, gname, certBuffer, certSize);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (certBuffer == NULL || *certBuffer != NULL) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getCertDetailFromStore(storeType, gname, certBuffer, certSize);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_delete_certificate_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname)
+ CertStoreType storeType,
+ CertSvcString gname)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->pkcsDeleteCertFromStore(storeType, gname);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsDeleteCertFromStore(storeType, gname);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_import_from_file_to_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString path,
- CertSvcString password,
- CertSvcString pfxIdString)
+ CertStoreType storeType,
+ CertSvcString path,
+ CertSvcString password,
+ CertSvcString pfxIdString)
{
- try {
- if (path.privateHandler == NULL || !impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- return impl(instance)->pkcsImportToStore(storeType, path, password, pfxIdString);
- } catch (...) {
- LogError("Exception occured from pkcsImportToStore");
- return CERTSVC_FAIL;
- }
+ try {
+ if (path.privateHandler == NULL || !impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsImportToStore(storeType, path, password, pfxIdString);
+ } catch (...) {
+ LogError("Exception occured from pkcsImportToStore");
+ return CERTSVC_FAIL;
+ }
}
int certsvc_pkcs12_get_alias_name_for_certificate_in_store(CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char **alias)
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **alias)
{
- if (gname.privateHandler == NULL || gname.privateLength<=0) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->pkcsGetAliasNameForCertInStore(storeType, gname, alias);
- } catch (...) {}
- return CERTSVC_FAIL;
+ if (gname.privateHandler == NULL || gname.privateLength <= 0) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsGetAliasNameForCertInStore(storeType, gname, alias);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_set_certificate_status_to_store(CertSvcInstance instance,
- CertStoreType storeType,
- int is_root_app,
- CertSvcString gname,
- CertStatus status)
+ CertStoreType storeType,
+ int is_root_app,
+ CertSvcString gname,
+ CertStatus status)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->pkcsSetCertStatusToStore(storeType, is_root_app, gname, status);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsSetCertStatusToStore(storeType, is_root_app, gname, status);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_certificate_status_from_store(
- CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- CertStatus *status)
+ CertSvcInstance instance,
+ CertStoreType storeType,
+ CertSvcString gname,
+ CertStatus *status)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->pkcsGetCertStatusFromStore(storeType, gname, status);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->pkcsGetCertStatusFromStore(storeType, gname, status);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_get_certificate_from_store(CertSvcInstance instance,
- CertStoreType storeType,
- const char *gname,
- CertSvcCertificate *certificate)
+ CertStoreType storeType,
+ const char *gname,
+ CertSvcCertificate *certificate)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->getCertFromStore(instance, storeType, gname, certificate);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getCertFromStore(instance, storeType, gname, certificate);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_load_certificate_list_from_store(
- CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString pfxIdString,
- CertSvcCertificateList *certificateList)
+ CertSvcInstance instance,
+ CertStoreType storeType,
+ CertSvcString pfxIdString,
+ CertSvcCertificateList *certificateList)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->getPkcsCertificateListFromStore(instance, storeType, pfxIdString, certificateList);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getPkcsCertificateListFromStore(instance, storeType, pfxIdString,
+ certificateList);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_private_key_dup_from_store(
- CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- char **certBuffer,
- size_t *certSize)
+ CertSvcInstance instance,
+ CertStoreType storeType,
+ CertSvcString gname,
+ char **certBuffer,
+ size_t *certSize)
{
- try {
- if (!impl(instance)->checkValidStoreType(storeType)) {
- LogError("Invalid input parameter.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
- return impl(instance)->getPkcsPrivateKeyFromStore(storeType, gname, certBuffer, certSize);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ if (!impl(instance)->checkValidStoreType(storeType)) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ return impl(instance)->getPkcsPrivateKeyFromStore(storeType, gname, certBuffer, certSize);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_dup_evp_pkey_from_store(
- CertSvcInstance instance,
- CertStoreType storeType,
- CertSvcString gname,
- EVP_PKEY** pkey)
+ CertSvcInstance instance,
+ CertStoreType storeType,
+ CertSvcString gname,
+ EVP_PKEY **pkey)
{
- char *buffer = NULL;
- size_t size;
-
- int result = certsvc_pkcs12_private_key_dup_from_store(instance, storeType, gname, &buffer, &size);
- if (result != CERTSVC_SUCCESS) {
- LogError("Error in certsvc_pkcs12_private_key_dup");
- return result;
- }
-
- BIO *b = BIO_new(BIO_s_mem());
- if ((int)size != BIO_write(b, buffer, size)) {
- LogError("Error in BIO_write");
- BIO_free_all(b);
- certsvc_pkcs12_private_key_free(buffer);
- return CERTSVC_FAIL;
- }
-
- certsvc_pkcs12_private_key_free(buffer);
- *pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL);
- BIO_free_all(b);
- if (*pkey)
- return CERTSVC_SUCCESS;
-
- LogError("Result is null. Openssl REASON code is : " << ERR_GET_REASON(ERR_peek_last_error()));
- return CERTSVC_FAIL;
+ char *buffer = NULL;
+ size_t size;
+ int result = certsvc_pkcs12_private_key_dup_from_store(instance, storeType, gname, &buffer, &size);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Error in certsvc_pkcs12_private_key_dup");
+ return result;
+ }
+
+ BIO *b = BIO_new(BIO_s_mem());
+
+ if ((int)size != BIO_write(b, buffer, size)) {
+ LogError("Error in BIO_write");
+ BIO_free_all(b);
+ certsvc_pkcs12_private_key_free(buffer);
+ return CERTSVC_FAIL;
+ }
+
+ certsvc_pkcs12_private_key_free(buffer);
+ *pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL);
+ BIO_free_all(b);
+
+ if (*pkey)
+ return CERTSVC_SUCCESS;
+
+ LogError("Result is null. Openssl REASON code is : " << ERR_GET_REASON(ERR_peek_last_error()));
+ return CERTSVC_FAIL;
}
int certsvc_pkcs12_has_password(
- CertSvcInstance instance,
- CertSvcString filepath,
- int *has_password)
+ CertSvcInstance instance,
+ CertSvcString filepath,
+ int *has_password)
{
- try {
- return impl(instance)->pkcsHasPassword(filepath, has_password);
- } catch (...) {}
- return CERTSVC_FAIL;
+ try {
+ return impl(instance)->pkcsHasPassword(filepath, has_password);
+ } catch (...) {}
+
+ return CERTSVC_FAIL;
}
void certsvc_pkcs12_private_key_free(char *buffer)
{
- free(buffer);
+ free(buffer);
}
#include <cstdio>
namespace ValidationCore {
-Exception* Exception::m_lastException = NULL;
+Exception *Exception::m_lastException = NULL;
unsigned int Exception::m_exceptionCount = 0;
void (*Exception::m_terminateHandler)() = NULL;
void LogUnhandledException(const std::string &str)
{
- LogDebug("" << str);
+ LogDebug("" << str);
}
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function)
+ const char *filename,
+ int line,
+ const char *function)
{
- LogError("[" << filename << ":" << line << "][" << function << "]" << str);
+ LogError("[" << filename << ":" << line << "][" << function << "]" << str);
}
} // namespace ValidationCore
namespace ValidationCore {
void LogUnhandledException(const std::string &str);
void LogUnhandledException(const std::string &str,
- const char *filename,
- int line,
- const char *function);
+ const char *filename,
+ int line,
+ const char *function);
}
namespace ValidationCore {
class Exception {
private:
- static unsigned int m_exceptionCount;
- static Exception* m_lastException;
- static void (*m_terminateHandler)();
-
- static void AddRef(Exception* exception)
- {
- if (!m_exceptionCount) {
- m_terminateHandler = std::set_terminate(&TerminateHandler);
- }
-
- ++m_exceptionCount;
- m_lastException = exception;
- }
-
- static void UnRef(Exception* e)
- {
- if (m_lastException == e) {
- m_lastException = NULL;
- }
-
- --m_exceptionCount;
-
- if (!m_exceptionCount) {
- std::set_terminate(m_terminateHandler);
- m_terminateHandler = NULL;
- }
- }
-
- static void TerminateHandler()
- {
- if (m_lastException != NULL) {
- DisplayKnownException(*m_lastException);
- abort();
- } else {
- DisplayUnknownException();
- abort();
- }
- }
-
- Exception *m_reason;
- std::string m_path;
- std::string m_function;
- int m_line;
+ static unsigned int m_exceptionCount;
+ static Exception *m_lastException;
+ static void (*m_terminateHandler)();
+
+ static void AddRef(Exception *exception)
+ {
+ if (!m_exceptionCount) {
+ m_terminateHandler = std::set_terminate(&TerminateHandler);
+ }
+
+ ++m_exceptionCount;
+ m_lastException = exception;
+ }
+
+ static void UnRef(Exception *e)
+ {
+ if (m_lastException == e) {
+ m_lastException = NULL;
+ }
+
+ --m_exceptionCount;
+
+ if (!m_exceptionCount) {
+ std::set_terminate(m_terminateHandler);
+ m_terminateHandler = NULL;
+ }
+ }
+
+ static void TerminateHandler()
+ {
+ if (m_lastException != NULL) {
+ DisplayKnownException(*m_lastException);
+ abort();
+ } else {
+ DisplayUnknownException();
+ abort();
+ }
+ }
+
+ Exception *m_reason;
+ std::string m_path;
+ std::string m_function;
+ int m_line;
protected:
- std::string m_message;
- std::string m_className;
+ std::string m_message;
+ std::string m_className;
public:
- static std::string KnownExceptionToString(const Exception &e)
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
- message << "\033[1;33mException trace:\033[m\n\n";
- message << e.DumpToString();
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static std::string UnknownExceptionToString()
- {
- std::ostringstream message;
- message <<
- "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
- message << "\033[1;31m\n=== Will now abort ===\033[m\n";
-
- return message.str();
- }
-
- static void DisplayKnownException(const Exception& e)
- {
- LogUnhandledException(KnownExceptionToString(e).c_str());
- }
-
- static void DisplayUnknownException()
- {
- LogUnhandledException(UnknownExceptionToString().c_str());
- }
-
- Exception(const Exception &other)
- {
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
- }
-
- const Exception &operator =(const Exception &other)
- {
- if (this == &other) {
- return *this;
- }
-
- // Deep copy
- if (other.m_reason != NULL) {
- m_reason = new Exception(*other.m_reason);
- } else {
- m_reason = NULL;
- }
-
- m_message = other.m_message;
- m_path = other.m_path;
- m_function = other.m_function;
- m_line = other.m_line;
-
- m_className = other.m_className;
-
- AddRef(this);
-
- return *this;
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const std::string &message) :
- m_reason(NULL),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- Exception(const char *path,
- const char *function,
- int line,
- const Exception &reason,
- const std::string &message) :
- m_reason(new Exception(reason)),
- m_path(path),
- m_function(function),
- m_line(line),
- m_message(message)
- {
- AddRef(this);
- }
-
- virtual ~Exception() throw()
- {
- if (m_reason != NULL) {
- delete m_reason;
- m_reason = NULL;
- }
-
- UnRef(this);
- }
-
- void Dump() const
- {
- // Show reason first
- if (m_reason != NULL) {
- m_reason->Dump();
- }
-
- // Afterward, dump exception
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file, m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
- }
-
- std::string DumpToString() const
- {
- std::string ret;
- if (m_reason != NULL) {
- ret = m_reason->DumpToString();
- }
-
- const char *file = strchr(m_path.c_str(), '/');
-
- if (file == NULL) {
- file = m_path.c_str();
- } else {
- ++file;
- }
-
- char buf[1024];
- snprintf(buf,
- sizeof(buf),
- "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
- file,
- m_line,
- m_function.c_str(),
- m_className.c_str(),
- m_message.empty() ? "<EMPTY>" : m_message.c_str());
-
- buf[sizeof(buf) - 1] = '\n';
- ret += buf;
-
- return ret;
- }
-
- Exception *GetReason() const
- {
- return m_reason;
- }
-
- std::string GetPath() const
- {
- return m_path;
- }
-
- std::string GetFunction() const
- {
- return m_function;
- }
-
- int GetLine() const
- {
- return m_line;
- }
-
- std::string GetMessage() const
- {
- return m_message;
- }
-
- std::string GetClassName() const
- {
- return m_className;
- }
+ static std::string KnownExceptionToString(const Exception &e)
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;33mException trace:\033[m\n\n";
+ message << e.DumpToString();
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static std::string UnknownExceptionToString()
+ {
+ std::ostringstream message;
+ message <<
+ "\033[1;5;31m\n=== Unhandled non-DPL exception occurred ===\033[m\n\n";
+ message << "\033[1;31m\n=== Will now abort ===\033[m\n";
+ return message.str();
+ }
+
+ static void DisplayKnownException(const Exception &e)
+ {
+ LogUnhandledException(KnownExceptionToString(e).c_str());
+ }
+
+ static void DisplayUnknownException()
+ {
+ LogUnhandledException(UnknownExceptionToString().c_str());
+ }
+
+ Exception(const Exception &other)
+ {
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ }
+
+ const Exception &operator =(const Exception &other)
+ {
+ if (this == &other) {
+ return *this;
+ }
+
+ // Deep copy
+ if (other.m_reason != NULL) {
+ m_reason = new Exception(*other.m_reason);
+ } else {
+ m_reason = NULL;
+ }
+
+ m_message = other.m_message;
+ m_path = other.m_path;
+ m_function = other.m_function;
+ m_line = other.m_line;
+ m_className = other.m_className;
+ AddRef(this);
+ return *this;
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const std::string &message) :
+ m_reason(NULL),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ Exception(const char *path,
+ const char *function,
+ int line,
+ const Exception &reason,
+ const std::string &message) :
+ m_reason(new Exception(reason)),
+ m_path(path),
+ m_function(function),
+ m_line(line),
+ m_message(message)
+ {
+ AddRef(this);
+ }
+
+ virtual ~Exception() throw()
+ {
+ if (m_reason != NULL) {
+ delete m_reason;
+ m_reason = NULL;
+ }
+
+ UnRef(this);
+ }
+
+ void Dump() const
+ {
+ // Show reason first
+ if (m_reason != NULL) {
+ m_reason->Dump();
+ }
+
+ // Afterward, dump exception
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ printf("\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file, m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ }
+
+ std::string DumpToString() const
+ {
+ std::string ret;
+
+ if (m_reason != NULL) {
+ ret = m_reason->DumpToString();
+ }
+
+ const char *file = strchr(m_path.c_str(), '/');
+
+ if (file == NULL) {
+ file = m_path.c_str();
+ } else {
+ ++file;
+ }
+
+ char buf[1024];
+ snprintf(buf,
+ sizeof(buf),
+ "\033[0;36m[%s:%i]\033[m %s() \033[4;35m%s\033[m: %s\033[m\n",
+ file,
+ m_line,
+ m_function.c_str(),
+ m_className.c_str(),
+ m_message.empty() ? "<EMPTY>" : m_message.c_str());
+ buf[sizeof(buf) - 1] = '\n';
+ ret += buf;
+ return ret;
+ }
+
+ Exception *GetReason() const
+ {
+ return m_reason;
+ }
+
+ std::string GetPath() const
+ {
+ return m_path;
+ }
+
+ std::string GetFunction() const
+ {
+ return m_function;
+ }
+
+ int GetLine() const
+ {
+ return m_line;
+ }
+
+ std::string GetMessage() const
+ {
+ return m_message;
+ }
+
+ std::string GetClassName() const
+ {
+ return m_className;
+ }
};
} // namespace ValidationCore
#define VcoreTry try
#define VcoreThrow(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__)
#define VcoreThrowMsg(ClassName, Message) \
- do \
- { \
- std::ostringstream dplLoggingStream; \
- dplLoggingStream << Message; \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
- } while (0)
+ do \
+ { \
+ std::ostringstream dplLoggingStream; \
+ dplLoggingStream << Message; \
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, dplLoggingStream.str()); \
+ } while (0)
#define VcoreReThrow(ClassName) \
- throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
+ throw ClassName(__FILE__, __FUNCTION__, __LINE__, _rethrown_exception)
#define VcoreReThrowMsg(ClassName, Message) \
- throw ClassName(__FILE__, \
- __FUNCTION__, \
- __LINE__, \
- _rethrown_exception, \
- Message)
+ throw ClassName(__FILE__, \
+ __FUNCTION__, \
+ __LINE__, \
+ _rethrown_exception, \
+ Message)
#define VcoreCatch(ClassName) \
- catch (const ClassName &_rethrown_exception)
+ catch (const ClassName &_rethrown_exception)
#define VCORE_DECLARE_EXCEPTION_TYPE(BaseClass, Class) \
- class Class : public BaseClass { \
- public: \
- Class(const char *path, \
- const char *function, \
- int line, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, message) { \
- \
- BaseClass::m_className = #Class; \
- } \
- \
- Class(const char *path, \
- const char *function, \
- int line, \
- const ValidationCore::Exception & reason, \
- const std::string & message = std::string()) \
- : BaseClass(path, function, line, reason, message) { \
- BaseClass::m_className = #Class; \
- } \
- };
+ class Class : public BaseClass { \
+ public: \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, message) { \
+ \
+ BaseClass::m_className = #Class; \
+ } \
+ \
+ Class(const char *path, \
+ const char *function, \
+ int line, \
+ const ValidationCore::Exception & reason, \
+ const std::string & message = std::string()) \
+ : BaseClass(path, function, line, reason, message) { \
+ BaseClass::m_className = #Class; \
+ } \
+ };
#define VCORE_UNHANDLED_EXCEPTION_HANDLER_BEGIN try
#define VCORE_UNHANDLED_EXCEPTION_HANDLER_END \
- catch (const ValidationCore::Exception &exception) \
- { \
- std::ostringstream msg; \
- msg << ValidationCore::Exception::KnownExceptionToString(exception); \
- ValidationCore::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (std::exception& e) \
- { \
- std::ostringstream msg; \
- msg << e.what(); \
- msg << "\n"; \
- msg << ValidationCore::Exception::UnknownExceptionToString(); \
- ValidationCore::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- } \
- catch (...) \
- { \
- std::ostringstream msg; \
- msg << ValidationCore::Exception::UnknownExceptionToString(); \
- ValidationCore::LogUnhandledException(msg.str(), \
- __FILE__, \
- __LINE__, \
- __FUNCTION__); \
- abort(); \
- }
+ catch (const ValidationCore::Exception &exception) \
+ { \
+ std::ostringstream msg; \
+ msg << ValidationCore::Exception::KnownExceptionToString(exception); \
+ ValidationCore::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (std::exception& e) \
+ { \
+ std::ostringstream msg; \
+ msg << e.what(); \
+ msg << "\n"; \
+ msg << ValidationCore::Exception::UnknownExceptionToString(); \
+ ValidationCore::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ } \
+ catch (...) \
+ { \
+ std::ostringstream msg; \
+ msg << ValidationCore::Exception::UnknownExceptionToString(); \
+ ValidationCore::LogUnhandledException(msg.str(), \
+ __FILE__, \
+ __LINE__, \
+ __FUNCTION__); \
+ abort(); \
+ }
namespace ValidationCore {
namespace CommonException {
* important messages.
*/
VCORE_DECLARE_EXCEPTION_TYPE(Exception, InternalError) ///< Unexpected error from
- // underlying libraries or
- // kernel
+// underlying libraries or
+// kernel
}
}
#include "vcore/Client.h"
#include "vcore/pkcs12.h"
-#define SYSCALL(call) while(((call) == -1) && (errno == EINTR))
+#define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
namespace {
using ValidationCore::CertificatePtr;
using ValidationCore::Certificate;
-using FileUniquePtr = std::unique_ptr<FILE, std::function<int(FILE*)>>;
-using BioUniquePtr = std::unique_ptr<BIO, std::function<void(BIO*)>>;
-using PKEYUniquePtr = std::unique_ptr<EVP_PKEY, std::function<void(EVP_PKEY*)>>;
-using X509UniquePtr = std::unique_ptr<X509, std::function<void(X509*)>>;
-using X509StackUniquePtr = std::unique_ptr<STACK_OF(X509), std::function<void(STACK_OF(X509)*)>>;
+using FileUniquePtr = std::unique_ptr<FILE, std::function<int(FILE *)>>;
+using BioUniquePtr = std::unique_ptr<BIO, std::function<void(BIO *)>>;
+using PKEYUniquePtr = std::unique_ptr<EVP_PKEY, std::function<void(EVP_PKEY *)>>;
+using X509UniquePtr = std::unique_ptr<X509, std::function<void(X509 *)>>;
+using X509StackUniquePtr = std::unique_ptr<STACK_OF(X509), std::function<void(STACK_OF(X509) *)>>;
void X509_stack_free(STACK_OF(X509) *stack)
{
- sk_X509_free(stack);
+ sk_X509_free(stack);
}
inline bool hasStore(CertStoreType types, CertStoreType type)
{
- return (types & type) != 0;
+ return (types & type) != 0;
}
inline CertStoreType nextStore(CertStoreType type)
{
- switch (type) {
- case NONE_STORE: return VPN_STORE;
- case VPN_STORE: return WIFI_STORE;
- case WIFI_STORE: return EMAIL_STORE;
- case EMAIL_STORE: return SYSTEM_STORE;
- case SYSTEM_STORE: return NONE_STORE;
- default: return NONE_STORE;
- }
+ switch (type) {
+ case NONE_STORE:
+ return VPN_STORE;
+
+ case VPN_STORE:
+ return WIFI_STORE;
+
+ case WIFI_STORE:
+ return EMAIL_STORE;
+
+ case EMAIL_STORE:
+ return SYSTEM_STORE;
+
+ case SYSTEM_STORE:
+ return NONE_STORE;
+
+ default:
+ return NONE_STORE;
+ }
}
std::string generateGname(void)
{
- int generator;
- int64_t random;
- SHA_CTX ctx;
- unsigned char d[SHA_DIGEST_LENGTH];
- int result;
- char *gname = NULL;
-
- SYSCALL(generator = open("/dev/urandom", O_RDONLY));
- if (generator == -1)
- return std::string();
- SYSCALL(result = read(generator, &random, sizeof(random)));
- if (result == -1) {
- SYSCALL(close(generator));
- return std::string();
- }
- SYSCALL(result = close(generator));
- if (result == -1)
- return std::string();
-
- SHA1_Init(&ctx);
- SHA1_Update(&ctx, &random, sizeof(random));
- SHA1_Final(d, &ctx);
-
- result = asprintf(&gname,
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
- "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
- d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9],
- d[10], d[11], d[12], d[13], d[14], d[15], d[16], d[17], d[18], d[19]);
-
- if (result == -1)
- return std::string();
-
- std::string ret(gname);
-
- free(gname);
-
- return ret;
+ int generator;
+ int64_t random;
+ SHA_CTX ctx;
+ unsigned char d[SHA_DIGEST_LENGTH];
+ int result;
+ char *gname = NULL;
+ SYSCALL(generator = open("/dev/urandom", O_RDONLY));
+
+ if (generator == -1)
+ return std::string();
+
+ SYSCALL(result = read(generator, &random, sizeof(random)));
+
+ if (result == -1) {
+ SYSCALL(close(generator));
+ return std::string();
+ }
+
+ SYSCALL(result = close(generator));
+
+ if (result == -1)
+ return std::string();
+
+ SHA1_Init(&ctx);
+ SHA1_Update(&ctx, &random, sizeof(random));
+ SHA1_Final(d, &ctx);
+ result = asprintf(&gname,
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9],
+ d[10], d[11], d[12], d[13], d[14], d[15], d[16], d[17], d[18], d[19]);
+
+ if (result == -1)
+ return std::string();
+
+ std::string ret(gname);
+ free(gname);
+ return ret;
}
std::string getCommonName(CertType type, const std::string &cert)
{
- BioUniquePtr bio(BIO_new(BIO_s_mem()), BIO_free_all);
- if (bio.get() == NULL) {
- LogError("Failed to allocate memory.");
- return std::string();
- }
-
- auto readCount = BIO_write(bio.get(), (const void *)cert.data(), (int)cert.length());
- if (readCount < 1) {
- LogError("Failed to load cert into bio.");
- return std::string();
- }
-
- X509 *x509 = NULL;
- switch (type) {
- case P12_TRUSTED:
- case P12_INTERMEDIATE:
- x509 = PEM_read_bio_X509_AUX(bio.get(), NULL, 0, NULL);
- break;
-
- default:
- x509 = PEM_read_bio_X509(bio.get(), NULL, 0, NULL);
- break;
- }
-
- if (x509 == NULL) {
- LogError("Failed to create x509 structure.");
- return std::string();
- }
-
- X509UniquePtr x509Ptr(x509, X509_free);
-
- const char *subject_c = X509_NAME_oneline(x509->cert_info->subject, NULL, 0);
- if (subject_c == NULL) {
- LogError("Failed to parse x509 structure");
- return std::string();
- }
-
- return std::string(subject_c);
+ BioUniquePtr bio(BIO_new(BIO_s_mem()), BIO_free_all);
+
+ if (bio.get() == NULL) {
+ LogError("Failed to allocate memory.");
+ return std::string();
+ }
+
+ auto readCount = BIO_write(bio.get(), (const void *)cert.data(), (int)cert.length());
+
+ if (readCount < 1) {
+ LogError("Failed to load cert into bio.");
+ return std::string();
+ }
+
+ X509 *x509 = NULL;
+
+ switch (type) {
+ case P12_TRUSTED:
+ case P12_INTERMEDIATE:
+ x509 = PEM_read_bio_X509_AUX(bio.get(), NULL, 0, NULL);
+ break;
+
+ default:
+ x509 = PEM_read_bio_X509(bio.get(), NULL, 0, NULL);
+ break;
+ }
+
+ if (x509 == NULL) {
+ LogError("Failed to create x509 structure.");
+ return std::string();
+ }
+
+ X509UniquePtr x509Ptr(x509, X509_free);
+ const char *subject_c = X509_NAME_oneline(x509->cert_info->subject, NULL, 0);
+
+ if (subject_c == NULL) {
+ LogError("Failed to parse x509 structure");
+ return std::string();
+ }
+
+ return std::string(subject_c);
}
/*
*/
int installPKEY(CertStoreType storeType,
- const std::string &key,
- const std::string &gname)
+ const std::string &key,
+ const std::string &gname)
{
- return vcore_client_install_certificate_to_store(
- storeType,
- gname.c_str(),
- NULL,
- NULL,
- NULL,
- key.c_str(),
- key.length(),
- P12_PKEY);
+ return vcore_client_install_certificate_to_store(
+ storeType,
+ gname.c_str(),
+ NULL,
+ NULL,
+ NULL,
+ key.c_str(),
+ key.length(),
+ P12_PKEY);
}
int installEndCert(CertStoreType storeType,
- const std::string &cert,
- const std::string &alias,
- const std::string &gname,
- const std::string &prikeyGname)
+ const std::string &cert,
+ const std::string &alias,
+ const std::string &gname,
+ const std::string &prikeyGname)
{
- return vcore_client_install_certificate_to_store(
- storeType,
- gname.c_str(),
- alias.c_str(),
- prikeyGname.c_str(),
- gname.c_str(),
- cert.c_str(),
- cert.length(),
- P12_END_USER);
+ return vcore_client_install_certificate_to_store(
+ storeType,
+ gname.c_str(),
+ alias.c_str(),
+ prikeyGname.c_str(),
+ gname.c_str(),
+ cert.c_str(),
+ cert.length(),
+ P12_END_USER);
}
int installChainCert(CertStoreType storeType,
- const std::string &cert,
- const std::string &gname,
- const std::string &endCertGname,
- CertType type)
+ const std::string &cert,
+ const std::string &gname,
+ const std::string &endCertGname,
+ CertType type)
{
- std::string commonName = getCommonName(type, cert);
-
- return vcore_client_install_certificate_to_store(
- storeType,
- gname.c_str(),
- commonName.c_str(),
- NULL,
- endCertGname.c_str(),
- cert.c_str(),
- cert.length(),
- type);
+ std::string commonName = getCommonName(type, cert);
+ return vcore_client_install_certificate_to_store(
+ storeType,
+ gname.c_str(),
+ commonName.c_str(),
+ NULL,
+ endCertGname.c_str(),
+ cert.c_str(),
+ cert.length(),
+ type);
}
int installCert(CertStoreType storeType,
- const std::string &cert,
- const std::string &gname)
+ const std::string &cert,
+ const std::string &gname)
{
- std::string commonName = getCommonName(PEM_CRT, cert);
-
- return vcore_client_install_certificate_to_store(
- storeType,
- gname.c_str(),
- commonName.c_str(),
- NULL,
- NULL,
- cert.c_str(),
- cert.length(),
- PEM_CRT);
+ std::string commonName = getCommonName(PEM_CRT, cert);
+ return vcore_client_install_certificate_to_store(
+ storeType,
+ gname.c_str(),
+ commonName.c_str(),
+ NULL,
+ NULL,
+ cert.c_str(),
+ cert.length(),
+ PEM_CRT);
}
std::string readFromFile(const std::string &path)
{
- FILE *fp = NULL;
- if ((fp = fopen(path.c_str(), "rb")) == NULL) {
- LogError("Fail to open file for reading : " << path);
- return std::string();
- }
-
- FileUniquePtr filePtr(fp, fclose);
-
- fseek(fp, 0L, SEEK_END);
- int len = ftell(fp);
- if (len <= 0) {
- LogError("Fail to get certificate length.");
- return std::string();
- }
-
- rewind(fp);
-
- char *content = (char *)malloc(sizeof(char) * (len + 1));
- if (content == NULL) {
- LogError("Fail to allocate memory");
- return std::string();
- }
-
- memset(content, 0x00, len + 1);
- size_t readLen = fread(content, sizeof(char), (size_t)len, fp);
- if (readLen != (size_t)len) {
- LogError("Fail to read file : " << path);
- free(content);
- return std::string();
- }
-
- content[len] = '\0';
-
- std::string ret(content);
-
- free(content);
-
- return ret;
+ FILE *fp = NULL;
+
+ if ((fp = fopen(path.c_str(), "rb")) == NULL) {
+ LogError("Fail to open file for reading : " << path);
+ return std::string();
+ }
+
+ FileUniquePtr filePtr(fp, fclose);
+ fseek(fp, 0L, SEEK_END);
+ int len = ftell(fp);
+
+ if (len <= 0) {
+ LogError("Fail to get certificate length.");
+ return std::string();
+ }
+
+ rewind(fp);
+ char *content = (char *)malloc(sizeof(char) * (len + 1));
+
+ if (content == NULL) {
+ LogError("Fail to allocate memory");
+ return std::string();
+ }
+
+ memset(content, 0x00, len + 1);
+ size_t readLen = fread(content, sizeof(char), (size_t)len, fp);
+
+ if (readLen != (size_t)len) {
+ LogError("Fail to read file : " << path);
+ free(content);
+ return std::string();
+ }
+
+ content[len] = '\0';
+ std::string ret(content);
+ free(content);
+ return ret;
}
std::string parseCRT(const std::string &cert)
{
- size_t from = 0;
- size_t to = 0;
- size_t tailLen = 0;
-
- from = cert.find(START_CERT);
- to = cert.find(END_CERT);
- tailLen = END_CERT.length();
-
- if (from == std::string::npos || to == std::string::npos || from > to) {
- from = cert.find(START_TRUSTED);
- to = cert.find(END_TRUSTED);
- tailLen = END_TRUSTED.length();
- }
-
- if (from == std::string::npos || to == std::string::npos || from > to)
- return std::string();
-
- return std::string(cert, from, to - from + tailLen);
+ size_t from = 0;
+ size_t to = 0;
+ size_t tailLen = 0;
+ from = cert.find(START_CERT);
+ to = cert.find(END_CERT);
+ tailLen = END_CERT.length();
+
+ if (from == std::string::npos || to == std::string::npos || from > to) {
+ from = cert.find(START_TRUSTED);
+ to = cert.find(END_TRUSTED);
+ tailLen = END_TRUSTED.length();
+ }
+
+ if (from == std::string::npos || to == std::string::npos || from > to)
+ return std::string();
+
+ return std::string(cert, from, to - from + tailLen);
}
#define _CERT_SVC_VERIFY_PKCS12
int verify_cert_details(X509 *cert, STACK_OF(X509) *certv)
{
- int result = CERTSVC_SUCCESS;
- char* pSubject = NULL;
- char* pIssuerName = NULL;
- X509_STORE_CTX *cert_ctx = NULL;
- X509_STORE *cert_store = NULL;
- int res = 0;
-
+ int result = CERTSVC_SUCCESS;
+ char *pSubject = NULL;
+ char *pIssuerName = NULL;
+ X509_STORE_CTX *cert_ctx = NULL;
+ X509_STORE *cert_store = NULL;
+ int res = 0;
#ifdef _CERT_SVC_VERIFY_PKCS12
- if (certv == NULL) {
- pSubject = X509_NAME_oneline(cert->cert_info->subject, NULL, 0);
- if (!pSubject) {
- LogError("Failed to get subject name");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- pIssuerName = X509_NAME_oneline(cert->cert_info->issuer, NULL, 0);
- if (!pIssuerName) {
- LogError("Failed to get issuer name");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- if (strcmp((const char*)pSubject, (const char*)pIssuerName) == 0) {
- /*self signed.. */
- EVP_PKEY *pKey = NULL;
- pKey = X509_get_pubkey(cert);
- if (!pKey) {
- LogError("Failed to get public key");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- if (X509_verify(cert, pKey) <= 0) {
- LogError("P12 verification failed");
- EVP_PKEY_free(pKey);
- result = CERTSVC_FAIL;
- goto free_memory;
- }
- LogDebug("P12 verification Success");
- EVP_PKEY_free(pKey);
- } else {
- cert_store = X509_STORE_new();
- if (!cert_store) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- res = X509_STORE_load_locations(cert_store, NULL, TZ_SYS_CA_CERTS);
- if (res != 1) {
- LogError("P12 load certificate store failed");
- X509_STORE_free(cert_store);
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- res = X509_STORE_set_default_paths(cert_store);
- if (res != 1) {
- LogError("P12 load certificate store path failed");
- X509_STORE_free(cert_store);
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- /* initialise store and store context */
- cert_ctx = X509_STORE_CTX_new();
- if (cert_ctx == NULL) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- /* construct store context */
- if (!X509_STORE_CTX_init(cert_ctx, cert_store, cert, NULL)) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
+
+ if (certv == NULL) {
+ pSubject = X509_NAME_oneline(cert->cert_info->subject, NULL, 0);
+
+ if (!pSubject) {
+ LogError("Failed to get subject name");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ pIssuerName = X509_NAME_oneline(cert->cert_info->issuer, NULL, 0);
+
+ if (!pIssuerName) {
+ LogError("Failed to get issuer name");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ if (strcmp((const char *)pSubject, (const char *)pIssuerName) == 0) {
+ /*self signed.. */
+ EVP_PKEY *pKey = NULL;
+ pKey = X509_get_pubkey(cert);
+
+ if (!pKey) {
+ LogError("Failed to get public key");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ if (X509_verify(cert, pKey) <= 0) {
+ LogError("P12 verification failed");
+ EVP_PKEY_free(pKey);
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ LogDebug("P12 verification Success");
+ EVP_PKEY_free(pKey);
+ } else {
+ cert_store = X509_STORE_new();
+
+ if (!cert_store) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ res = X509_STORE_load_locations(cert_store, NULL, TZ_SYS_CA_CERTS);
+
+ if (res != 1) {
+ LogError("P12 load certificate store failed");
+ X509_STORE_free(cert_store);
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ res = X509_STORE_set_default_paths(cert_store);
+
+ if (res != 1) {
+ LogError("P12 load certificate store path failed");
+ X509_STORE_free(cert_store);
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ /* initialise store and store context */
+ cert_ctx = X509_STORE_CTX_new();
+
+ if (cert_ctx == NULL) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ /* construct store context */
+ if (!X509_STORE_CTX_init(cert_ctx, cert_store, cert, NULL)) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
#ifdef P12_VERIFICATION_NEEDED
- res = X509_verify_cert(cert_ctx);
- if (res != 1) {
- LogError("P12 verification failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
- LogDebug("P12 verification Success");
+ res = X509_verify_cert(cert_ctx);
+
+ if (res != 1) {
+ LogError("P12 verification failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ LogDebug("P12 verification Success");
#endif
- }
- } else if (certv != NULL) {
- /* Cert Chain */
- cert_store = X509_STORE_new();
- if (!cert_store) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- res = X509_STORE_load_locations(cert_store, NULL, TZ_SYS_CA_CERTS);
- if (res != 1) {
- LogError("P12 load certificate store failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- res = X509_STORE_set_default_paths(cert_store);
- if (res != 1) {
- LogError("P12 load certificate path failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- /* initialise store and store context */
- cert_ctx = X509_STORE_CTX_new();
- if (cert_ctx == NULL) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- /* construct store context */
- if (!X509_STORE_CTX_init(cert_ctx, cert_store, cert, NULL)) {
- LogError("Memory allocation failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
-
- X509_STORE_CTX_trusted_stack(cert_ctx, certv);
+ }
+ } else if (certv != NULL) {
+ /* Cert Chain */
+ cert_store = X509_STORE_new();
+
+ if (!cert_store) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ res = X509_STORE_load_locations(cert_store, NULL, TZ_SYS_CA_CERTS);
+
+ if (res != 1) {
+ LogError("P12 load certificate store failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ res = X509_STORE_set_default_paths(cert_store);
+
+ if (res != 1) {
+ LogError("P12 load certificate path failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ /* initialise store and store context */
+ cert_ctx = X509_STORE_CTX_new();
+
+ if (cert_ctx == NULL) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ /* construct store context */
+ if (!X509_STORE_CTX_init(cert_ctx, cert_store, cert, NULL)) {
+ LogError("Memory allocation failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ X509_STORE_CTX_trusted_stack(cert_ctx, certv);
#ifdef P12_VERIFICATION_NEEDED
- res = X509_verify_cert(cert_ctx);
- if (res != 1) {
- LogError("P12 verification failed");
- result = CERTSVC_FAIL;
- goto free_memory;
- }
- LogDebug("P12 verification Success");
+ res = X509_verify_cert(cert_ctx);
+
+ if (res != 1) {
+ LogError("P12 verification failed");
+ result = CERTSVC_FAIL;
+ goto free_memory;
+ }
+
+ LogDebug("P12 verification Success");
#endif
- }
-#endif //_CERT_SVC_VERIFY_PKCS12
+ }
+#endif //_CERT_SVC_VERIFY_PKCS12
free_memory:
- if (cert_store != NULL)
- X509_STORE_free(cert_store);
- if (cert_ctx)
- X509_STORE_CTX_free(cert_ctx);
- free(pSubject);
- free(pIssuerName);
+ if (cert_store != NULL)
+ X509_STORE_free(cert_store);
- return result;
+ if (cert_ctx)
+ X509_STORE_CTX_free(cert_ctx);
+
+ free(pSubject);
+ free(pIssuerName);
+ return result;
}
enum class OsslType : int {
- PKEY = 1,
- X509,
- X509AUX
+ PKEY = 1,
+ X509,
+ X509AUX
};
std::string osslToPEM(OsslType type, void *data)
{
- std::vector<char> buf(4096);
- BioUniquePtr bio(BIO_new(BIO_s_mem()), BIO_free_all);
- if (bio.get() == NULL)
- return std::string();
+ std::vector<char> buf(4096);
+ BioUniquePtr bio(BIO_new(BIO_s_mem()), BIO_free_all);
+
+ if (bio.get() == NULL)
+ return std::string();
- switch (type) {
- case OsslType::PKEY:
- PEM_write_bio_PrivateKey(bio.get(), static_cast<EVP_PKEY *>(data), NULL, NULL, 0, NULL, NULL);
- break;
+ switch (type) {
+ case OsslType::PKEY:
+ PEM_write_bio_PrivateKey(bio.get(), static_cast<EVP_PKEY *>(data), NULL, NULL, 0, NULL, NULL);
+ break;
- case OsslType::X509:
- PEM_write_bio_X509(bio.get(), static_cast<X509 *>(data));
- break;
+ case OsslType::X509:
+ PEM_write_bio_X509(bio.get(), static_cast<X509 *>(data));
+ break;
- case OsslType::X509AUX:
- PEM_write_bio_X509_AUX(bio.get(), static_cast<X509 *>(data));
- break;
+ case OsslType::X509AUX:
+ PEM_write_bio_X509_AUX(bio.get(), static_cast<X509 *>(data));
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- int size = BIO_read(bio.get(), buf.data(), 4096);
- if (size <= 0)
- return std::string();
+ int size = BIO_read(bio.get(), buf.data(), 4096);
- buf[size] = '\0';
+ if (size <= 0)
+ return std::string();
- return std::string(buf.data());
+ buf[size] = '\0';
+ return std::string(buf.data());
}
int extractPkcs12(const std::string &path,
- const std::string &password,
- PKEYUniquePtr &keyPtr,
- X509UniquePtr &certPtr,
- X509StackUniquePtr &certvPtr)
+ const std::string &password,
+ PKEYUniquePtr &keyPtr,
+ X509UniquePtr &certPtr,
+ X509StackUniquePtr &certvPtr)
{
- FILE *stream = NULL;
- if ((stream = fopen(path.c_str(), "rb")) == NULL) {
- LogError("Unable to open the file for reading : " << path);
- return CERTSVC_IO_ERROR;
- }
-
- PKCS12 *container = d2i_PKCS12_fp(stream, NULL);
- fclose(stream);
- if (container == NULL) {
- LogError("Failed to parse the input file passed.");
- return CERTSVC_FAIL;
- }
-
- EVP_PKEY *key = NULL;
- X509 *cert = NULL;
- STACK_OF(X509) *certv = NULL;
- int result = PKCS12_parse(container, password.c_str(), &key, &cert, &certv);
- PKCS12_free(container);
- if (result != 1) {
- LogError("Failed to parse the file passed. openssl err : " << ERR_get_error());
- return CERTSVC_FAIL;
- }
-
- keyPtr.reset(key);
- certPtr.reset(cert);
- certvPtr.reset(certv);
-
- return CERTSVC_SUCCESS;
+ FILE *stream = NULL;
+
+ if ((stream = fopen(path.c_str(), "rb")) == NULL) {
+ LogError("Unable to open the file for reading : " << path);
+ return CERTSVC_IO_ERROR;
+ }
+
+ PKCS12 *container = d2i_PKCS12_fp(stream, NULL);
+ fclose(stream);
+
+ if (container == NULL) {
+ LogError("Failed to parse the input file passed.");
+ return CERTSVC_FAIL;
+ }
+
+ EVP_PKEY *key = NULL;
+ X509 *cert = NULL;
+ STACK_OF(X509) *certv = NULL;
+ int result = PKCS12_parse(container, password.c_str(), &key, &cert, &certv);
+ PKCS12_free(container);
+
+ if (result != 1) {
+ LogError("Failed to parse the file passed. openssl err : " << ERR_get_error());
+ return CERTSVC_FAIL;
+ }
+
+ keyPtr.reset(key);
+ certPtr.reset(cert);
+ certvPtr.reset(certv);
+ return CERTSVC_SUCCESS;
}
void rollbackStore(CertStoreType storeTypes, const std::string &endCertName)
{
- for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE; storeType = nextStore(storeType)) {
- if (!hasStore(storeTypes, storeType))
- continue;
-
- char **certChainName = NULL;
- size_t ncerts = 0;
-
- int result = vcore_client_load_certificates_from_store(storeType, endCertName.c_str(), &certChainName, &ncerts);
- if (result != CERTSVC_SUCCESS) {
- LogError("Unable to load certificates from store. result : " << result);
- continue;
- }
-
- for (size_t i = 0; i < ncerts; i++) {
- if (certChainName[i] == NULL)
- continue;
-
- vcore_client_delete_certificate_from_store(storeType, certChainName[i]);
- free(certChainName[i]);
- }
-
- vcore_client_delete_certificate_from_store(storeType, endCertName.c_str());
- }
+ for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE;
+ storeType = nextStore(storeType)) {
+ if (!hasStore(storeTypes, storeType))
+ continue;
+
+ char **certChainName = NULL;
+ size_t ncerts = 0;
+ int result = vcore_client_load_certificates_from_store(storeType, endCertName.c_str(),
+ &certChainName, &ncerts);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Unable to load certificates from store. result : " << result);
+ continue;
+ }
+
+ for (size_t i = 0; i < ncerts; i++) {
+ if (certChainName[i] == NULL)
+ continue;
+
+ vcore_client_delete_certificate_from_store(storeType, certChainName[i]);
+ free(certChainName[i]);
+ }
+
+ vcore_client_delete_certificate_from_store(storeType, endCertName.c_str());
+ }
}
int insertToStore(CertStoreType storeTypes,
- const std::string &alias,
- const std::string &prikeyName,
- const std::string &prikeyBuffer,
- const std::string &endCertName,
- const std::string &endCertBuffer,
- const std::vector<std::string> &certChainName,
- const std::vector<std::string> &certChainBuffer)
+ const std::string &alias,
+ const std::string &prikeyName,
+ const std::string &prikeyBuffer,
+ const std::string &endCertName,
+ const std::string &endCertBuffer,
+ const std::vector<std::string> &certChainName,
+ const std::vector<std::string> &certChainBuffer)
{
- size_t ncerts = certChainName.size();
-
- for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE; storeType = nextStore(storeType)) {
- if (!hasStore(storeTypes, storeType))
- continue;
-
- LogDebug("Processing store type : " << storeType);
-
- int result = installPKEY(storeType, prikeyBuffer, prikeyName);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to store the private key contents. result : " << result);
- return result;
- }
-
- result = installEndCert(storeType, endCertBuffer, alias, endCertName, prikeyName);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to install the end user certificate. result : " << result);
- return result;
- }
-
- for (size_t i = 0; i < ncerts; i++) {
- if (i == ncerts - 1)
- result = installChainCert(storeType, certChainBuffer[i], certChainName[i], endCertName, P12_INTERMEDIATE);
- else
- result = installChainCert(storeType, certChainBuffer[i], certChainName[i], endCertName, P12_TRUSTED);
-
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to install the ca certificates. result : " << result);
- return result;
- }
- }
- }
-
- LogDebug("Success to insert extracted pkcs12 data to db");
-
- return CERTSVC_SUCCESS;
+ size_t ncerts = certChainName.size();
+
+ for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE;
+ storeType = nextStore(storeType)) {
+ if (!hasStore(storeTypes, storeType))
+ continue;
+
+ LogDebug("Processing store type : " << storeType);
+ int result = installPKEY(storeType, prikeyBuffer, prikeyName);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to store the private key contents. result : " << result);
+ return result;
+ }
+
+ result = installEndCert(storeType, endCertBuffer, alias, endCertName, prikeyName);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to install the end user certificate. result : " << result);
+ return result;
+ }
+
+ for (size_t i = 0; i < ncerts; i++) {
+ if (i == ncerts - 1)
+ result = installChainCert(storeType, certChainBuffer[i], certChainName[i], endCertName,
+ P12_INTERMEDIATE);
+ else
+ result = installChainCert(storeType, certChainBuffer[i], certChainName[i], endCertName,
+ P12_TRUSTED);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to install the ca certificates. result : " << result);
+ return result;
+ }
+ }
+ }
+
+ LogDebug("Success to insert extracted pkcs12 data to db");
+ return CERTSVC_SUCCESS;
}
int insertToStorePEM(CertStoreType storeTypes, const std::string &path, const std::string &gname)
{
- std::string content = readFromFile(path);
- if (content.empty()) {
- LogError("Failed to read the file : " << path);
- return CERTSVC_IO_ERROR;
- }
-
- std::string parsed = parseCRT(content);
- if (parsed.empty()) {
- LogError("Failed to parse CRT : " << path);
- return CERTSVC_FAIL;
- }
-
- for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE; storeType = nextStore(storeType)) {
- if (!hasStore(storeTypes, storeType))
- continue;
-
- int result = installCert(storeType, parsed, gname);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to install PEM/CRT to db store : " << storeType << " result : " << result);
- rollbackStore(storeTypes, gname);
- return result;
- }
-
- LogDebug("Success to install PEM/CRT to db store : " << storeType);
- }
-
- LogDebug("Success to install PEM/CRT to db stores : " << storeTypes);
-
- return CERTSVC_SUCCESS;
+ std::string content = readFromFile(path);
+
+ if (content.empty()) {
+ LogError("Failed to read the file : " << path);
+ return CERTSVC_IO_ERROR;
+ }
+
+ std::string parsed = parseCRT(content);
+
+ if (parsed.empty()) {
+ LogError("Failed to parse CRT : " << path);
+ return CERTSVC_FAIL;
+ }
+
+ for (CertStoreType storeType = VPN_STORE; storeType < SYSTEM_STORE;
+ storeType = nextStore(storeType)) {
+ if (!hasStore(storeTypes, storeType))
+ continue;
+
+ int result = installCert(storeType, parsed, gname);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to install PEM/CRT to db store : " << storeType << " result : " << result);
+ rollbackStore(storeTypes, gname);
+ return result;
+ }
+
+ LogDebug("Success to install PEM/CRT to db store : " << storeType);
+ }
+
+ LogDebug("Success to install PEM/CRT to db stores : " << storeTypes);
+ return CERTSVC_SUCCESS;
}
} // namespace anonymous
int pkcs12_import_from_file_to_store(CertStoreType storeTypes,
- const char *_path,
- const char *_password,
- const char *_alias)
+ const char *_path,
+ const char *_password,
+ const char *_alias)
{
-
- int result = 0;
-
- if (_alias == NULL || _path == NULL || strlen(_path) < 4) {
- LogError("Invalid input parameter.");
- return CERTSVC_WRONG_ARGUMENT;
- }
-
- std::string path(_path);
- std::string alias(_alias);
- std::string password;
- if (_password != NULL)
- password = std::string(_password);
-
- LogDebug("pkcs12_import_from_file_to_store start. path[" << path << "] password[" << password << "] alias[" << alias << "]");
-
- if (storeTypes & SYSTEM_STORE) {
- LogError("User should not install any form of certificates in SYSTEM_STORE.");
- return CERTSVC_INVALID_STORE_TYPE;
- }
-
- /*
- * Installs CRT and PEM files.
- * We will passing NULL for private_key_gname and associated_gname parameter
- * in installFilePEM(). Which means that there is no private key involved
- * in the certificate which we are installing and there are no other
- * certificates related with the current certificate which is installed
- */
- std::string suffix = path.substr(path.length() - 4, 4);
- if (strcasecmp(suffix.c_str(), ".pem") == 0 || strcasecmp(suffix.c_str(), ".crt") == 0) {
- std::string gnamePEM = generateGname();
- result = insertToStorePEM(storeTypes, path, gnamePEM);
- if (result != CERTSVC_SUCCESS)
- LogError("Failed to install PEM/CRT file to store. gname : " << gnamePEM << " result : " << result);
-
- return result;;
- }
-
- LogDebug("Convert ossl type to string start");
-
- /* 0. extract pkcs12 data from file */
- PKEYUniquePtr key(nullptr, EVP_PKEY_free);
- X509UniquePtr cert(nullptr, X509_free);
- X509StackUniquePtr certv(nullptr, X509_stack_free);
- result = extractPkcs12(path, password, key, cert, certv);
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to extract pkcs12 file. result : " << result);
- return result;
- }
-
- LogDebug("extract pkcs12 to unique ptr success");
-
- result = verify_cert_details(cert.get(), certv.get());
- if (result != CERTSVC_SUCCESS) {
- LogError("Failed to verify p12 certificate. result : " << result);
- return result;
- }
-
- /* 1. handling private key */
- std::string prikeyName = generateGname();
- std::string prikeyBuffer = osslToPEM(OsslType::PKEY, key.get());
- if (prikeyName.empty() || prikeyBuffer.empty()) {
- LogError("Failed to transform pkey to PEM. result : " << result);
- return CERTSVC_FAIL;
- }
-
- LogDebug("Convert pkey to string success");
-
- /* 2. handling end user certificate */
- std::string endCertName = generateGname();
- std::string endCertBuffer = osslToPEM(OsslType::X509, cert.get());
- if (endCertName.empty() || endCertBuffer.empty()) {
- LogError("Failed to transform x509 to PEM. result : " << result);
- return CERTSVC_FAIL;
- }
-
- LogDebug("Convert end cert to string success");
-
- /* 3. handling certificate chain */
- std::vector<std::string> certChainName;
- std::vector<std::string> certChainBuffer;
- int ncerts = certv ? sk_X509_num(certv.get()) : 0;
- for (int i = 0; i < ncerts; i++) {
- std::string tempName = generateGname();
- std::string tempBuffer = osslToPEM(OsslType::X509AUX, sk_X509_value(certv.get(), i));
- if (tempName.empty() || tempBuffer.empty()) {
- LogError("Failed to transform x509 AUX to PEM");
- return CERTSVC_FAIL;
- }
-
- certChainName.push_back(std::move(tempName));
- certChainBuffer.push_back(std::move(tempBuffer));
- }
-
- LogDebug("Convert cert chain to string success");
-
- /* 4. insert extracted pkcs12 data to db */
- result = insertToStore(storeTypes,
- alias,
- prikeyName,
- prikeyBuffer,
- endCertName,
- endCertBuffer,
- certChainName,
- certChainBuffer);
-
- if (result != CERTSVC_SUCCESS)
- rollbackStore(storeTypes, endCertName);
-
- LogDebug("Success to import pkcs12 to store");
-
- return result;
+ int result = 0;
+
+ if (_alias == NULL || _path == NULL || strlen(_path) < 4) {
+ LogError("Invalid input parameter.");
+ return CERTSVC_WRONG_ARGUMENT;
+ }
+
+ std::string path(_path);
+ std::string alias(_alias);
+ std::string password;
+
+ if (_password != NULL)
+ password = std::string(_password);
+
+ LogDebug("pkcs12_import_from_file_to_store start. path[" << path << "] password[" << password <<
+ "] alias[" << alias << "]");
+
+ if (storeTypes & SYSTEM_STORE) {
+ LogError("User should not install any form of certificates in SYSTEM_STORE.");
+ return CERTSVC_INVALID_STORE_TYPE;
+ }
+
+ /*
+ * Installs CRT and PEM files.
+ * We will passing NULL for private_key_gname and associated_gname parameter
+ * in installFilePEM(). Which means that there is no private key involved
+ * in the certificate which we are installing and there are no other
+ * certificates related with the current certificate which is installed
+ */
+ std::string suffix = path.substr(path.length() - 4, 4);
+
+ if (strcasecmp(suffix.c_str(), ".pem") == 0 || strcasecmp(suffix.c_str(), ".crt") == 0) {
+ std::string gnamePEM = generateGname();
+ result = insertToStorePEM(storeTypes, path, gnamePEM);
+
+ if (result != CERTSVC_SUCCESS)
+ LogError("Failed to install PEM/CRT file to store. gname : " << gnamePEM << " result : " << result);
+
+ return result;;
+ }
+
+ LogDebug("Convert ossl type to string start");
+ /* 0. extract pkcs12 data from file */
+ PKEYUniquePtr key(nullptr, EVP_PKEY_free);
+ X509UniquePtr cert(nullptr, X509_free);
+ X509StackUniquePtr certv(nullptr, X509_stack_free);
+ result = extractPkcs12(path, password, key, cert, certv);
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to extract pkcs12 file. result : " << result);
+ return result;
+ }
+
+ LogDebug("extract pkcs12 to unique ptr success");
+ result = verify_cert_details(cert.get(), certv.get());
+
+ if (result != CERTSVC_SUCCESS) {
+ LogError("Failed to verify p12 certificate. result : " << result);
+ return result;
+ }
+
+ /* 1. handling private key */
+ std::string prikeyName = generateGname();
+ std::string prikeyBuffer = osslToPEM(OsslType::PKEY, key.get());
+
+ if (prikeyName.empty() || prikeyBuffer.empty()) {
+ LogError("Failed to transform pkey to PEM. result : " << result);
+ return CERTSVC_FAIL;
+ }
+
+ LogDebug("Convert pkey to string success");
+ /* 2. handling end user certificate */
+ std::string endCertName = generateGname();
+ std::string endCertBuffer = osslToPEM(OsslType::X509, cert.get());
+
+ if (endCertName.empty() || endCertBuffer.empty()) {
+ LogError("Failed to transform x509 to PEM. result : " << result);
+ return CERTSVC_FAIL;
+ }
+
+ LogDebug("Convert end cert to string success");
+ /* 3. handling certificate chain */
+ std::vector<std::string> certChainName;
+ std::vector<std::string> certChainBuffer;
+ int ncerts = certv ? sk_X509_num(certv.get()) : 0;
+
+ for (int i = 0; i < ncerts; i++) {
+ std::string tempName = generateGname();
+ std::string tempBuffer = osslToPEM(OsslType::X509AUX, sk_X509_value(certv.get(), i));
+
+ if (tempName.empty() || tempBuffer.empty()) {
+ LogError("Failed to transform x509 AUX to PEM");
+ return CERTSVC_FAIL;
+ }
+
+ certChainName.push_back(std::move(tempName));
+ certChainBuffer.push_back(std::move(tempBuffer));
+ }
+
+ LogDebug("Convert cert chain to string success");
+ /* 4. insert extracted pkcs12 data to db */
+ result = insertToStore(storeTypes,
+ alias,
+ prikeyName,
+ prikeyBuffer,
+ endCertName,
+ endCertBuffer,
+ certChainName,
+ certChainBuffer);
+
+ if (result != CERTSVC_SUCCESS)
+ rollbackStore(storeTypes, endCertName);
+
+ LogDebug("Success to import pkcs12 to store");
+ return result;
}
int pkcs12_has_password(const char *filepath, int *passworded)
{
- if (filepath == NULL || passworded == NULL)
- return CERTSVC_WRONG_ARGUMENT;
+ if (filepath == NULL || passworded == NULL)
+ return CERTSVC_WRONG_ARGUMENT;
- FILE *stream;
- if ((stream = fopen(filepath, "rb")) == NULL)
- return CERTSVC_IO_ERROR;
+ FILE *stream;
- PKCS12 *container = d2i_PKCS12_fp(stream, NULL);
- fclose(stream);
+ if ((stream = fopen(filepath, "rb")) == NULL)
+ return CERTSVC_IO_ERROR;
- if (container == NULL)
- return CERTSVC_FAIL;
+ PKCS12 *container = d2i_PKCS12_fp(stream, NULL);
+ fclose(stream);
- EVP_PKEY *pkey = NULL;
- X509 *cert = NULL;
- int result = PKCS12_parse(container, NULL, &pkey, &cert, NULL);
+ if (container == NULL)
+ return CERTSVC_FAIL;
- PKCS12_free(container);
+ EVP_PKEY *pkey = NULL;
+ X509 *cert = NULL;
+ int result = PKCS12_parse(container, NULL, &pkey, &cert, NULL);
+ PKCS12_free(container);
- if (pkey != NULL)
- EVP_PKEY_free(pkey);
- if (cert != NULL)
- X509_free(cert);
+ if (pkey != NULL)
+ EVP_PKEY_free(pkey);
- if (result != 1 && ERR_GET_REASON(ERR_peek_last_error()) != PKCS12_R_MAC_VERIFY_FAILURE)
- return CERTSVC_FAIL;
+ if (cert != NULL)
+ X509_free(cert);
- *passworded = (result == 1) ? 1 : 0;
+ if (result != 1 && ERR_GET_REASON(ERR_peek_last_error()) != PKCS12_R_MAC_VERIFY_FAILURE)
+ return CERTSVC_FAIL;
- return CERTSVC_SUCCESS;
+ *passworded = (result == 1) ? 1 : 0;
+ return CERTSVC_SUCCESS;
}
* @param[in] alias Logical name for certificate bundle identification (can't be empty).
* @return CERTSVC_SUCCESS, CERTSVC_FAIL, CERTSVC_DUPLICATED_ALIAS, CERTSVC_IO_ERROR, CERTSVC_WRONG_ARGUMENT, CERTSVC_BAD_ALLOC.
*/
-int pkcs12_import_from_file_to_store(CertStoreType storeType, const char *path, const char *password, const char *alias);
+int pkcs12_import_from_file_to_store(CertStoreType storeType, const char *path,
+ const char *password, const char *alias);
/**
* TO check if the p12/pfx file is protected by password or not.