int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist) { for (; extlist->ext_nid != -1; extlist++) if (!X509V3_EXT_add(extlist)) return 0; return 1; }
/* * This function adds the TBB extensions to the internal extension list * maintained by OpenSSL so they can be used later. * * It also initializes the methods to print the contents of the extension. If an * alias is specified in the TBB extension, we reuse the methods of the alias. * Otherwise, only methods for V_ASN1_INTEGER and V_ASN1_OCTET_STRING are * provided. Any other type will be printed as a raw ascii string. * * Return: 0 = success, Otherwise: error */ int ext_init(void) { cmd_opt_t cmd_opt; ext_t *ext; X509V3_EXT_METHOD *m; int nid, ret; unsigned int i; for (i = 0; i < num_extensions; i++) { ext = &extensions[i]; /* Register command line option */ if (ext->opt) { cmd_opt.long_opt.name = ext->opt; cmd_opt.long_opt.has_arg = required_argument; cmd_opt.long_opt.flag = NULL; cmd_opt.long_opt.val = CMD_OPT_EXT; cmd_opt.help_msg = ext->help_msg; cmd_opt_add(&cmd_opt); } /* Register the extension OID in OpenSSL */ if (ext->oid == NULL) { continue; } nid = OBJ_create(ext->oid, ext->sn, ext->ln); if (ext->alias) { X509V3_EXT_add_alias(nid, ext->alias); } else { m = &ext->method; memset(m, 0x0, sizeof(X509V3_EXT_METHOD)); switch (ext->asn1_type) { case V_ASN1_INTEGER: m->it = ASN1_ITEM_ref(ASN1_INTEGER); m->i2s = (X509V3_EXT_I2S)i2s_ASN1_INTEGER; m->s2i = (X509V3_EXT_S2I)s2i_ASN1_INTEGER; break; case V_ASN1_OCTET_STRING: m->it = ASN1_ITEM_ref(ASN1_OCTET_STRING); m->i2s = (X509V3_EXT_I2S)i2s_ASN1_OCTET_STRING; m->s2i = (X509V3_EXT_S2I)s2i_ASN1_OCTET_STRING; break; default: continue; } m->ext_nid = nid; ret = X509V3_EXT_add(m); if (!ret) { ERR_print_errors_fp(stdout); return 1; } } } return 0; }
EXPORT_C int X509V3_EXT_add_alias(int nid_to, int nid_from) { X509V3_EXT_METHOD *ext, *tmpext; if(!(ext = X509V3_EXT_get_nid(nid_from))) { X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,X509V3_R_EXTENSION_NOT_FOUND); return 0; } if(!(tmpext = (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METHOD)))) { X509V3err(X509V3_F_X509V3_EXT_ADD_ALIAS,ERR_R_MALLOC_FAILURE); return 0; } *tmpext = *ext; tmpext->ext_nid = nid_to; tmpext->ext_flags |= X509V3_EXT_DYNAMIC; return X509V3_EXT_add(tmpext); }
int X509V3_EXT_add_alias(int nid_to, int nid_from) { const X509V3_EXT_METHOD *ext; X509V3_EXT_METHOD *tmpext; if(!(ext = X509V3_EXT_get_nid(nid_from))) { OPENSSL_PUT_ERROR(X509V3, X509V3_R_EXTENSION_NOT_FOUND); return 0; } if(!(tmpext = (X509V3_EXT_METHOD *)OPENSSL_malloc(sizeof(X509V3_EXT_METHOD)))) { OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE); return 0; } *tmpext = *ext; tmpext->ext_nid = nid_to; tmpext->ext_flags |= X509V3_EXT_DYNAMIC; return X509V3_EXT_add(tmpext); }
/** * Module activation */ static int globus_l_openssl_activate(void) { int i; int pci_NID; int pci_old_NID; X509V3_EXT_METHOD * pci_x509v3_ext_meth = NULL; X509V3_EXT_METHOD * pci_old_x509v3_ext_meth = NULL; SSL_library_init(); globus_module_activate(GLOBUS_COMMON_MODULE); globus_module_activate(GLOBUS_GSI_OPENSSL_ERROR_MODULE); mutex_pool = malloc(CRYPTO_num_locks() * sizeof(globus_mutex_t)); for(i=0;i<CRYPTO_num_locks();i++) { globus_mutex_init(&(mutex_pool[i]),NULL); } if (!CRYPTO_get_locking_callback()) { CRYPTO_set_locking_callback(globus_l_openssl_locking_cb); } if (!CRYPTO_get_id_callback()) { CRYPTO_set_id_callback(globus_l_openssl_thread_id); } if (OBJ_txt2nid(ANY_LANGUAGE_OID) == 0) { OBJ_create(ANY_LANGUAGE_OID, ANY_LANGUAGE_SN, ANY_LANGUAGE_LN); } if (OBJ_txt2nid(IMPERSONATION_PROXY_OID) == 0) { OBJ_create(IMPERSONATION_PROXY_OID, IMPERSONATION_PROXY_SN, IMPERSONATION_PROXY_LN); } if (OBJ_txt2nid(INDEPENDENT_PROXY_OID) == 0) { OBJ_create(INDEPENDENT_PROXY_OID, INDEPENDENT_PROXY_SN, INDEPENDENT_PROXY_LN); } if (OBJ_txt2nid(LIMITED_PROXY_OID) == 0) { OBJ_create(LIMITED_PROXY_OID, LIMITED_PROXY_SN, LIMITED_PROXY_LN); } pci_NID = OBJ_txt2nid(PROXYCERTINFO_OID); if (pci_NID == 0) { pci_NID = OBJ_create(PROXYCERTINFO_OID, PROXYCERTINFO_SN, PROXYCERTINFO_LN); } pci_old_NID = OBJ_txt2nid(PROXYCERTINFO_OLD_OID); if (pci_old_NID == 0) { pci_old_NID = OBJ_create(PROXYCERTINFO_OLD_OID, PROXYCERTINFO_OLD_SN, PROXYCERTINFO_OLD_LN); } /* this sets the pci NID in the static X509V3_EXT_METHOD struct */ if (X509V3_EXT_get_nid(pci_NID) == NULL) { pci_x509v3_ext_meth = PROXYCERTINFO_x509v3_ext_meth(); pci_x509v3_ext_meth->ext_nid = pci_NID; X509V3_EXT_add(pci_x509v3_ext_meth); } if (X509V3_EXT_get_nid(pci_old_NID) == NULL) { pci_old_x509v3_ext_meth = PROXYCERTINFO_OLD_x509v3_ext_meth(); pci_old_x509v3_ext_meth->ext_nid = pci_old_NID; X509V3_EXT_add(pci_old_x509v3_ext_meth); } return GLOBUS_SUCCESS; }