int der_get_oid (const unsigned char *p, size_t len, oid *data, size_t *size) { int n; size_t oldlen = len; if (len < 1) return ASN1_OVERRUN; data->components = malloc((len + 1) * sizeof(*data->components)); if (data->components == NULL && len != 0) return ENOMEM; data->components[0] = (*p) / 40; data->components[1] = (*p) % 40; --len; ++p; for (n = 2; len > 0; ++n) { unsigned u = 0; do { --len; u = u * 128 + (*p++ % 128); } while (len > 0 && p[-1] & 0x80); data->components[n] = u; } if (p[-1] & 0x80) { free_oid (data); return ASN1_OVERRUN; } data->length = n; if (size) *size = oldlen; return 0; }
static void free_MechType(MechType * data) { free_oid(data); }