size_t sk_push(_STACK *sk, void *p) { return (sk_insert(sk, p, sk->num)); }
int sk_unshift (_STACK * st, void *data) { return (sk_insert (st, data, 0)); }
int sk_push (_STACK * st, void *data) { return (sk_insert (st, data, st->num)); }
int sk_push(STACK *st, char *data) { return(sk_insert(st,data,st->num)); }
int sk_unshift(STACK *st, char *data) { return(sk_insert(st,data,0)); }
/* * der points to the start of one or more DER-encoded keys. If there is * more than one key, the keys must be contained in multi-key CGA * extensions. * * Returns a stack of EVP_PKEYs on success. */ _STACK * cga_der2keys(uint8_t *der, int dlen) { uint8_t *dk; EVP_PKEY *k; int klen, elen; uint16_t type; _STACK *sk; if ((sk = sk_new_null()) == NULL) { APPLOG_NOMEM(); return (NULL); } /* Extract first key, not in an extension */ dk = cga_parse_key(der, &klen); DBG(&dbg_asn1, "getting key 1 (klen %d dlen %d)", klen, dlen); if ((k = cga_der2key(der, klen)) == NULL) { goto fail; } if (sk_push(sk, (void *)k) == 0) { APPLOG_NOMEM(); goto fail; } /* Extract any keys in extensions */ der += klen; dlen -= klen; while (dlen > 0) { if (cga_parse_next_ext(der, dlen, &elen, &type) < 0) { goto fail; } DBG(&dbg_asn1, "got extension type %d len %d", type, elen); if (dlen < elen) { DBG(&dbg_asn1, "elen > dlen (%d / %d)", elen, dlen); goto fail; } if (type != CGA_MULTIKEY_EXT) { goto next; } dk = cga_get_multikey_key(der, &klen); DBG(&dbg_asn1, "getting ext key (%d bytes)", klen); if ((k = cga_der2key(dk, klen)) == NULL) { goto fail; } if (sk_insert(sk, (void *)k, 0) == 0) { APPLOG_NOMEM(); goto fail; } next: dlen -= elen; der += elen; } return (sk); fail: cga_free_keystack(sk); return (NULL); }