int _hx509_name_ds_cmp(const DirectoryString *ds1, const DirectoryString *ds2, int *diff) { uint32_t *ds1lp, *ds2lp; size_t ds1len, ds2len; int ret; ret = dsstringprep(ds1, &ds1lp, &ds1len); if (ret) return ret; ret = dsstringprep(ds2, &ds2lp, &ds2len); if (ret) { free(ds1lp); return ret; } if (ds1len != ds2len) *diff = ds1len - ds2len; else *diff = memcmp(ds1lp, ds2lp, ds1len * sizeof(ds1lp[0])); free(ds1lp); free(ds2lp); return 0; }
int _hx509_name_ds_cmp(const DirectoryString *ds1, const DirectoryString *ds2, int *diff) { uint32_t *ds1lp, *ds2lp; size_t ds1len, ds2len, i; int ret; ret = dsstringprep(ds1, &ds1lp, &ds1len); if (ret) return ret; ret = dsstringprep(ds2, &ds2lp, &ds2len); if (ret) { free(ds1lp); return ret; } if (ds1len != ds2len) *diff = ds1len - ds2len; else { for (i = 0; i < ds1len; i++) { *diff = ds1lp[i] - ds2lp[i]; if (*diff) break; } } free(ds1lp); free(ds2lp); return 0; }
int hx509_name_get_component(hx509_name name, int rdn, const heim_oid *type, unsigned *count, char **str) { Name *n = &name->der_name; size_t len, ulen; uint32_t *ds; unsigned i; int ret; if (str) *str = NULL; if (rdn >= n->u.rdnSequence.len) return ERANGE; for (i = *count; i < n->u.rdnSequence.val[rdn].len; i++) { if (der_heim_oid_cmp(&n->u.rdnSequence.val[rdn].val[i].type, type) == 0) { *count = i + 1; if (str == NULL) return HX509_NAME_MALFORMED; ret = dsstringprep(&n->u.rdnSequence.val[rdn].val[i].value, &ds, &len); if (ret) return ret; ret = wind_ucs4utf8_length(ds, len, &ulen); if (ret) { free(ds); return ret; } ulen += 1; *str = malloc(ulen); if (str == NULL) { free(ds); return ENOMEM; } ret = wind_ucs4utf8(ds, len, *str, &ulen); free(ds); if (ret) { free(*str); *str = NULL; return ret; } return 0; } } if (str == NULL) return 0; return HX509_NAME_MALFORMED; }