static int check_heim_integer_same(const char *p, const char *norm_p, heim_integer *i) { heim_integer i2; char *str; int ret; ret = der_print_hex_heim_integer(i, &str); if (ret) errx(1, "der_print_hex_heim_integer: %d", ret); if (strcmp(str, norm_p) != 0) errx(1, "der_print_hex_heim_integer: %s != %s", str, p); ret = der_parse_hex_heim_integer(str, &i2); if (ret) errx(1, "der_parse_hex_heim_integer: %d", ret); if (der_heim_integer_cmp(i, &i2) != 0) errx(1, "der_heim_integer_cmp: p %s", p); der_free_heim_integer(&i2); free(str); ret = der_parse_hex_heim_integer(p, &i2); if (ret) errx(1, "der_parse_hex_heim_integer: %d", ret); if (der_heim_integer_cmp(i, &i2) != 0) errx(1, "der_heim_integer_cmp: norm"); der_free_heim_integer(&i2); return 0; }
static int unparse_CMSIdentifier(hx509_context context, CMSIdentifier *id, char **str) { int ret = -1; *str = NULL; switch (id->element) { case choice_CMSIdentifier_issuerAndSerialNumber: { IssuerAndSerialNumber *iasn; char *serial, *name; iasn = &id->u.issuerAndSerialNumber; ret = _hx509_Name_to_string(&iasn->issuer, &name); if(ret) return ret; ret = der_print_hex_heim_integer(&iasn->serialNumber, &serial); if (ret) { free(name); return ret; } ret = asprintf(str, "certificate issued by %s with serial number %s", name, serial); free(name); free(serial); break; } case choice_CMSIdentifier_subjectKeyIdentifier: { KeyIdentifier *ki = &id->u.subjectKeyIdentifier; char *keyid; ssize_t len; len = hex_encode(ki->data, ki->length, &keyid); if (len < 0) return ENOMEM; ret = asprintf(str, "certificate with id %s", keyid); free(keyid); break; } default: ret = asprintf(str, "certificate have unknown CMSidentifier type"); break; } /* * In the following if, we check ret and *str which should be returned/set * by asprintf(3) in every branch of the switch statement. */ if (ret == -1 || *str == NULL) return ENOMEM; return 0; }
static int unparse_CMSIdentifier(hx509_context context, CMSIdentifier *id, char **str) { int ret; *str = NULL; switch (id->element) { case choice_CMSIdentifier_issuerAndSerialNumber: { IssuerAndSerialNumber *iasn; char *serial, *name; iasn = &id->u.issuerAndSerialNumber; ret = _hx509_Name_to_string(&iasn->issuer, &name); if(ret) return ret; ret = der_print_hex_heim_integer(&iasn->serialNumber, &serial); if (ret) { free(name); return ret; } asprintf(str, "certificate issued by %s with serial number %s", name, serial); free(name); free(serial); break; } case choice_CMSIdentifier_subjectKeyIdentifier: { KeyIdentifier *ki = &id->u.subjectKeyIdentifier; char *keyid; ssize_t len; len = hex_encode(ki->data, ki->length, &keyid); if (len < 0) return ENOMEM; asprintf(str, "certificate with id %s", keyid); free(keyid); break; } default: asprintf(str, "certificate have unknown CMSidentifier type"); break; } if (*str == NULL) return ENOMEM; return 0; }