C++ OpenSSL Verify X509 Certificate
g++ main.cpp -o main -lcrypto
main.cpp
#include <openssl/pem.h> #include <openssl/x509.h> #include <openssl/x509v3.h> int sig_verify(const char* cert_pem, const char* intermediate_pem) { BIO *b = BIO_new(BIO_s_mem()); BIO_puts(b, intermediate_pem); X509 * issuer = PEM_read_bio_X509(b, NULL, NULL, NULL); EVP_PKEY *signing_key=X509_get_pubkey(issuer); BIO *c = BIO_new(BIO_s_mem()); BIO_puts(c, cert_pem); X509 * x509 = PEM_read_bio_X509(c, NULL, NULL, NULL); int result = X509_verify(x509, signing_key); EVP_PKEY_free(signing_key); BIO_free(b); BIO_free(c); X509_free(x509); X509_free(issuer); return result; } void cert_info(const char* cert_pem) { BIO *b = BIO_new(BIO_s_mem()); BIO_puts(b, cert_pem); X509 * x509 = PEM_read_bio_X509(b, NULL, NULL, NULL); BIO *bio_out = BIO_new_fp(stdout, BIO_NOCLOSE); //Subject BIO_printf(bio_out,"Subject: "); X509_NAME_print(bio_out,X509_get_subject_name(x509),0); BIO_printf(bio_out,"\n"); //Issuer BIO_printf(bio_out,"Issuer: "); X509_NAME_print(bio_out,X509_get_issuer_name(x509),0); BIO_printf(bio_out,"\n"); //Public Key EVP_PKEY *pkey=X509_get_pubkey(x509); EVP_PKEY_print_public(bio_out, pkey, 0, NULL); EVP_PKEY_free(pkey); //Signature X509_signature_print(bio_out, x509->sig_alg, x509->signature); BIO_printf(bio_out,"\n"); BIO_free(bio_out); BIO_free(b); X509_free(x509); } //---------------------------------------------------------------------- int main(int argc, char **argv) { OpenSSL_add_all_algorithms(); OpenSSL_add_all_ciphers(); OpenSSL_add_all_digests(); const char cert[] = "-----BEGIN CERTIFICATE-----" "\n" "MIIFGzCCBKGgAwIBAgIQA8TAm6Yf9god6g9PkdJfazAKBggqhkjOPQQDAzBMMQsw" "\n" "CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSYwJAYDVQQDEx1EaWdp" "\n" "Q2VydCBFQ0MgU2VjdXJlIFNlcnZlciBDQTAeFw0xMzA5MzAwMDAwMDBaFw0xNjEw" "\n" "MDQxMjAwMDBaMGAxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIEwRVdGFoMQ0wCwYDVQQH" "\n" "EwRMZWhpMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjEaMBgGA1UEAxMRYmxvZy5k" "\n" "aWdpY2VydC5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmpgkfE9I8G/Eo" "\n" "IYPyu+X5Er6nll65D8gZ2OfTLCzebHwdybes1TDSde3E1V1tccz5aWqzJNgJrkPD" "\n" "+uzLc5r/o4IDTzCCA0swHwYDVR0jBBgwFoAUo53mH/naOU/AbuiRy5Wl2jHiCp8w" "\n" "HQYDVR0OBBYEFAjOkz5ghkAzC1h+65zS3yI6Y5ewMBwGA1UdEQQVMBOCEWJsb2cu" "\n" "ZGlnaWNlcnQuY29tMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcD" "\n" "AQYIKwYBBQUHAwIwaQYDVR0fBGIwYDAuoCygKoYoaHR0cDovL2NybDMuZGlnaWNl" "\n" "cnQuY29tL3NzY2EtZWNjLWcxLmNybDAuoCygKoYoaHR0cDovL2NybDQuZGlnaWNl" "\n" "cnQuY29tL3NzY2EtZWNjLWcxLmNybDCCAcQGA1UdIASCAbswggG3MIIBswYJYIZI" "\n" "AYb9bAEBMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20v" "\n" "c3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBu" "\n" "AHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0" "\n" "AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBl" "\n" "ACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAg" "\n" "AGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBn" "\n" "AHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBi" "\n" "AGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0" "\n" "AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjB7" "\n" "BggrBgEFBQcBAQRvMG0wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0" "\n" "LmNvbTBFBggrBgEFBQcwAoY5aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp" "\n" "Z2lDZXJ0RUNDU2VjdXJlU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQCMAAwCgYIKoZI" "\n" "zj0EAwMDaAAwZQIxAMNQ2j9Ua2jMEfRvhkhwRxF6NWVVFwxiV/D071rYkh1fNRFY" "\n" "1HRwzkxwfNR1och05gIweNMRY3kbaVp4Nv3LwiT2v/n9hm8IoOG8G4lXTWrwQHWA" "\n" "Rps5Urye1f8nmWtvxWeY" "\n" "-----END CERTIFICATE-----"; const char intermediate[] = "-----BEGIN CERTIFICATE-----" "\n" "MIIDrDCCApSgAwIBAgIQCssoukZe5TkIdnRw883GEjANBgkqhkiG9w0BAQwFADBh" "\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3" "\n" "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD" "\n" "QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEwxCzAJBgNVBAYTAlVT" "\n" "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJjAkBgNVBAMTHURpZ2lDZXJ0IEVDQyBT" "\n" "ZWN1cmUgU2VydmVyIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4ghC6nfYJN6g" "\n" "LGSkE85AnCNyqQIKDjc/ITa4jVMU9tWRlUvzlgKNcR7E2Munn17voOZ/WpIRllNv" "\n" "68DLP679Wz9HJOeaBy6Wvqgvu1cYr3GkvXg6HuhbPGtkESvMNCuMo4IBITCCAR0w" "\n" "EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwNAYIKwYBBQUHAQEE" "\n" "KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQgYDVR0f" "\n" "BDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xv" "\n" "YmFsUm9vdENBLmNybDA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYc" "\n" "aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAdBgNVHQ4EFgQUo53mH/naOU/A" "\n" "buiRy5Wl2jHiCp8wHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJ" "\n" "KoZIhvcNAQEMBQADggEBAMeKoENL7HTJxavVHzA1Nm6YVntIrAVjrnuaVyRXzG/6" "\n" "3qttnMe2uuzO58pzZNvfBDcKAEmzP58mrZGMIOgfiA4q+2Y3yDDo0sIkp0VILeoB" "\n" "UEoxlBPfjV/aKrtJPGHzecicZpIalir0ezZYoyxBEHQa0+1IttK7igZFcTMQMHp6" "\n" "mCHdJLnsnLWSB62DxsRq+HfmNb4TDydkskO/g+l3VtsIh5RHFPVfKK+jaEyDj2D3" "\n" "loB5hWp2Jp2VDCADjT7ueihlZGak2YPqmXTNbk19HOuNssWvFhtOyPNV6og4ETQd" "\n" "Ea8/B6hPatJ0ES8q/HO3X8IVQwVs1n3aAr0im0/T+Xc=" "\n" "-----END CERTIFICATE-----"; cert_info(cert); cert_info(intermediate); sig_verify(cert,intermediate); }
code snippets are licensed under Creative Commons CC-By-SA 3.0 (unless otherwise specified)