#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/err.h>

const char *certTxt = "-----BEGIN CERTIFICATE-----\n"\
"MIICMTCCAZoCCQD+KQjThaQoEDANBgkqhkiG9w0BAQUFADBdMQswCQYDVQQGEwJV\n"\
"UzETMBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UEBwwETm9uZTEOMAwGA1UECgwF\n"\
"U3F1aWQxCzAJBgNVBAsMAml0MQ0wCwYDVQQDDARub25lMB4XDTEzMDUxMDE0MjUz\n"\
"N1oXDTE0MDUxMDE0MjUzN1owXTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUt\n"\
"U3RhdGUxDTALBgNVBAcMBE5vbmUxDjAMBgNVBAoMBVNxdWlkMQswCQYDVQQLDAJp\n"\
"dDENMAsGA1UEAwwEbm9uZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAtSz4\n"\
"dQExZQ8mseCr9fwYD3OsIE7p0QvEb8QVQlrLeJ3nqalUb415cg+eyVn1ZAPU52si\n"\
"VebNlKRhIilZfyiwSEuxyyvfmcAVbAMjhwjAuPod8LtQneF9qbxRa4OjytQ1+v7h\n"\
"GFMmZECLvwF5+UUXgPPbFhcBd9gu32YdWs8ADJMCAwEAATANBgkqhkiG9w0BAQUF\n"\
"AAOBgQAqxsFSwhSJkolHtOev4jlk2JqpLcUHq6IpVbfpou7YM2Ca5sSKMf9/mjoY\n"\
"kRyhg6TX/1ymde1V1tA80DjIZYiF/m4YLwsSJVV2hE4lja/e8CvBLzeTSPe3S0rH\n"\
"cWcRnuH9ts0PRPUD0NxZejib4F8m7hI2emm5d56xizvYooZzzg==\n"\
"-----END CERTIFICATE-----";

int main(int argc, char *argv[])
{
    // SSL_load_error_strings();
    SSLeay_add_ssl_algorithms();
    BIO *certBio = BIO_new(BIO_s_mem());
    BIO_puts(certBio, certTxt);

    X509 * cert = NULL;
    if (!PEM_read_bio_X509(certBio, &cert, 0, 0)) {
        fprintf(stderr, "Error building certificate\n");
        return -1;
    }

    SSL_CTX *sslContext = SSL_CTX_new(SSLv3_method());
    if (!sslContext) {
        fprintf(stderr, "Error creating ssl context\n");
        return -1;
    }

    if (!SSL_CTX_use_certificate(sslContext, cert)) {
        fprintf(stderr, "Error attaching certificate to ssl context\n");
        return -1;
    }


    X509 ***pCert = (X509 ***)sslContext->cert;
    X509 *sslCtxCert = pCert && *pCert ? **pCert : NULL;      
    if (sslCtxCert != cert)  {
        fprintf(stderr, "Geting certificate dicectly from SSL_CTX object failed!\n");
        return 1;
    }


    SSL *ssl = SSL_new(sslContext);
    if (!ssl) {
        fprintf(stderr, "Error creating ssl object\n");
        return -1;
    }

    X509 * sslCert =  SSL_get_certificate(ssl);
    if (sslCert != cert) {
        fprintf(stderr, "SSL_get_certificate failed!\n");
        return 1;
    }

    pCert = (X509 ***)ssl->cert;
    sslCert = pCert && *pCert ? **pCert : NULL; 
    if (sslCert != cert)  {
        fprintf(stderr, "Geting certificate dicectly from ssl object failed!\n");
        return 1;
    }
   
    return 0;
}

