int OBJ_create(const char *oid, const char *sn, const char *ln) { int ok=0; ASN1_OBJECT *op=NULL; unsigned char *buf; int i; i=a2d_ASN1_OBJECT(NULL,0,oid,-1); if (i <= 0) return(0); if ((buf=(unsigned char *)OPENSSL_malloc(i)) == NULL) { OBJerr(OBJ_F_OBJ_CREATE,ERR_R_MALLOC_FAILURE); return(0); } i=a2d_ASN1_OBJECT(buf,i,oid,-1); if (i == 0) goto err; op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln); if (op == NULL) goto err; ok=OBJ_add_object(op); err: ASN1_OBJECT_free(op); OPENSSL_free(buf); return(ok); }
static void *construct_method(const char *algorithm_name, const OSSL_DISPATCH *fns, OSSL_PROVIDER *prov, void *data) { struct method_data_st *methdata = data; void *method = NULL; int nid = OBJ_sn2nid(algorithm_name); if (nid == NID_undef) { /* Create a new NID for that name on the fly */ ASN1_OBJECT tmpobj; /* This is the same as OBJ_create() but without requiring a OID */ tmpobj.nid = OBJ_new_nid(1); tmpobj.sn = tmpobj.ln = methdata->name; tmpobj.flags = ASN1_OBJECT_FLAG_DYNAMIC; tmpobj.length = 0; tmpobj.data = NULL; nid = OBJ_add_object(&tmpobj); } if (nid == NID_undef) return NULL; method = methdata->method_from_dispatch(nid, fns, prov); if (method == NULL) return NULL; return method; }
static void list_objects(void) { int max_nid = OBJ_new_nid(0); int i; char *oid_buf = NULL; int oid_size = 0; /* Skip 0, since that's NID_undef */ for (i = 1; i < max_nid; i++) { const ASN1_OBJECT *obj = OBJ_nid2obj(i); const char *sn = OBJ_nid2sn(i); const char *ln = OBJ_nid2ln(i); int n = 0; /* * If one of the retrieved objects somehow generated an error, * we ignore it. The check for NID_undef below will detect the * error and simply skip to the next NID. */ ERR_clear_error(); if (OBJ_obj2nid(obj) == NID_undef) continue; if ((n = OBJ_obj2txt(NULL, 0, obj, 1)) == 0) { BIO_printf(bio_out, "# None-OID object: %s, %s\n", sn, ln); continue; } if (n < 0) break; /* Error */ if (n > oid_size) { oid_buf = OPENSSL_realloc(oid_buf, n + 1); if (oid_buf == NULL) { BIO_printf(bio_err, "ERROR: Memory allocation\n"); break; /* Error */ } oid_size = n + 1; } if (OBJ_obj2txt(oid_buf, oid_size, obj, 1) < 0) break; /* Error */ if (ln == NULL || strcmp(sn, ln) == 0) BIO_printf(bio_out, "%s = %s\n", sn, oid_buf); else BIO_printf(bio_out, "%s = %s, %s\n", sn, ln, oid_buf); } OPENSSL_free(oid_buf); }
/* Create a new NID when we have no OID for that mechanism */ static int t4_add_NID(char *sn, char *ln) { ASN1_OBJECT *o; int nid; if ((o = ASN1_OBJECT_create(OBJ_new_nid(1), (unsigned char *)"", 1, sn, ln)) == NULL) { T4err(T4_F_ADD_NID, T4_R_ASN1_OBJECT_CREATE); return (0); } /* Will return NID_undef on error */ nid = OBJ_add_object(o); ASN1_OBJECT_free(o); return (nid); }
static QString oid_sect() { QString ret; int i, max = OBJ_new_nid(0); for (i=first_additional_oid; i < max; i++) { const char *sn = OBJ_nid2sn(i); if (!sn) break; ret += QString("%1 = %2\n"). arg(OBJ_nid2sn(i)). arg(OBJ_obj2QString(OBJ_nid2obj(i), 1)); } if (!ret.isEmpty()) { ret = QString("oid_section = xca_oids\n\n" "[ xca_oids ]\n") + ret + "\n"; } return ret; }