Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <jni.h>
- #include <android/log.h>
- #include <android/asset_manager.h>
- #include <android/asset_manager_jni.h>
- #include <openssl/ssl.h>
- #include <openssl/asn1.h>
- #include <openssl/bio.h>
- #include <openssl/x509.h>
- #include <openssl/x509_vfy.h>
- #include <openssl/pem.h>
- #include <openssl/x509v3.h>
- #include <openssl/err.h>
- #include <openssl/conf.h>
- #include <string.h>
- static int verify_certificate_hostname(X509 *cert, char *hostname) {
- int extcount;
- int success = 0;
- char name[256];
- X509_NAME *subj;
- const char *extstr;
- CONF_VALUE *nval;
- X509_EXTENSION *ext;
- X509V3_EXT_METHOD *meth;
- STACK_OF(CONF_VALUE) *val;
- void *ext_internal;
- if ((extcount = X509_get_ext_count(cert)) > 0) {
- for (int i = 0; !success && i < extcount; i++) {
- ext = X509_get_ext(cert, i);
- extstr = OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(ext)));
- if (!strcasecmp(extstr, "subjectAltName")) {
- if (!(meth = X509V3_EXT_get(ext))) break;
- const unsigned char *data = ext->value->data;
- ext_internal = X509V3_EXT_d2i(ext);
- val = meth->i2v(meth, ext_internal, 0);
- for (int j = 0; j < sk_CONF_VALUE_num(val); j++) {
- nval = sk_CONF_VALUE_value(val, j);
- if (!strcasecmp(nval->name, "DNS") && !strcasecmp(nval->value, hostname)) {
- success = 1;
- break;
- }
- }
- }
- }
- }
- if (!success && (subj = X509_get_subject_name(cert)) && X509_NAME_get_text_by_NID(subj, NID_commonName, name, sizeof(name)) > 0) {
- name[sizeof(name) - 1] = '\0';
- if (!strcasecmp(name, hostname)) success = 1;
- }
- return success;
- }
Advertisement
Add Comment
Please, Sign In to add comment