static EVP_PKEY *do_b2i(const unsigned char **in, unsigned int length, int ispub) { const unsigned char *p = *in; unsigned int bitlen, magic; int isdss; if (do_blob_header(&p, length, &magic, &bitlen, &isdss, &ispub) <= 0) { PEMerr(PEM_F_DO_B2I, PEM_R_KEYBLOB_HEADER_PARSE_ERROR); return NULL; } length -= 16; if (length < blob_length(bitlen, isdss, ispub)) { PEMerr(PEM_F_DO_B2I, PEM_R_KEYBLOB_TOO_SHORT); return NULL; } if (isdss) return b2i_dss(&p, bitlen, ispub); else return b2i_rsa(&p, bitlen, ispub); }
static EVP_PKEY *do_b2i_bio(BIO *in, int ispub) { const unsigned char *p; unsigned char hdr_buf[16], *buf = NULL; unsigned int bitlen, magic, length; int isdss; EVP_PKEY *ret = NULL; if (BIO_read(in, hdr_buf, 16) != 16) { PEMerr(PEM_F_DO_B2I_BIO, PEM_R_KEYBLOB_TOO_SHORT); return NULL; } p = hdr_buf; if (do_blob_header(&p, 16, &magic, &bitlen, &isdss, &ispub) <= 0) return NULL; length = blob_length(bitlen, isdss, ispub); buf = (unsigned char*)OPENSSL_malloc(length); if (!buf) { PEMerr(PEM_F_DO_B2I_BIO, ERR_R_MALLOC_FAILURE); goto err; } p = buf; if (BIO_read(in, buf, length) != (int)length) { PEMerr(PEM_F_DO_B2I_BIO, PEM_R_KEYBLOB_TOO_SHORT); goto err; } if (isdss) ret = b2i_dss(&p, length, bitlen, ispub); else ret = b2i_rsa(&p, length, bitlen, ispub); err: if (buf) OPENSSL_free(buf); return ret; }