static int asn1_item_flags_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it, int flags) { if (out && !*out) { unsigned char *p, *buf; int len; len = ASN1_item_ex_i2d(&val, NULL, it, -1, flags); if (len <= 0) return len; buf = OPENSSL_malloc(len); if (!buf) return -1; p = buf; ASN1_item_ex_i2d(&val, &p, it, -1, flags); *out = buf; return len; } return ASN1_item_ex_i2d(&val, out, it, -1, flags); }
int pkt_encode(const ASN1_VALUE *val, const ASN1_ITEM *it, pkt_t *pkt) { pkt_t tmp = {}; tmp.size = ASN1_item_ex_i2d(WRAP(ASN1_VALUE, val), NULL, it, -1, 0); if (tmp.size > (typeof(tmp.size)) sizeof(tmp.data)) return E2BIG; if (tmp.size <= 0) return EINVAL; tmp.size = ASN1_item_ex_i2d(WRAP(ASN1_VALUE, val), WRAP(unsigned char, tmp.data), it, -1, 0); if (tmp.size <= 0) return EINVAL; *pkt = tmp; return 0; }