示例#1
0
NETSCAPE_SPKI *
NETSCAPE_SPKI_b64_decode(const char *str, int len)
{
	unsigned char *spki_der;
	const unsigned char *p;
	int spki_len;
	NETSCAPE_SPKI *spki;

	if (len <= 0)
		len = strlen(str);
	if (!(spki_der = malloc(len + 1))) {
		X509err(X509_F_NETSCAPE_SPKI_B64_DECODE, ERR_R_MALLOC_FAILURE);
		return NULL;
	}
	spki_len = EVP_DecodeBlock(spki_der, (const unsigned char *)str, len);
	if (spki_len < 0) {
		X509err(X509_F_NETSCAPE_SPKI_B64_DECODE,
		    X509_R_BASE64_DECODE_ERROR);
		free(spki_der);
		return NULL;
	}
	p = spki_der;
	spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len);
	free(spki_der);
	return spki;
}
示例#2
0
NETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len)
{
	unsigned char *spki_der;
	const unsigned char *p;
	size_t spki_len;
	NETSCAPE_SPKI *spki;
	if (len <= 0)
		len = strlen(str);
	if (!EVP_DecodedLength(&spki_len, len)) {
		OPENSSL_PUT_ERROR(X509, NETSCAPE_SPKI_b64_decode, X509_R_BASE64_DECODE_ERROR);
		return NULL;
	}
	if (!(spki_der = OPENSSL_malloc(spki_len))) {
		OPENSSL_PUT_ERROR(X509, NETSCAPE_SPKI_b64_decode, ERR_R_MALLOC_FAILURE);
		return NULL;
	}
	if (!EVP_DecodeBase64(spki_der, &spki_len, spki_len, (const uint8_t *)str, len)) {
		OPENSSL_PUT_ERROR(X509, NETSCAPE_SPKI_b64_decode, X509_R_BASE64_DECODE_ERROR);
		OPENSSL_free(spki_der);
		return NULL;
	}
	p = spki_der;
	spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len);
	OPENSSL_free(spki_der);
	return spki;
}
示例#3
0
/*
 * call-seq:
 *    SPKI.new([request]) => spki
 *
 * === Parameters
 * * +request+ - optional raw request, either in PEM or DER format.
 */
static VALUE
ossl_spki_initialize(int argc, VALUE *argv, VALUE self)
{
    NETSCAPE_SPKI *spki;
    VALUE buffer;
    const unsigned char *p;

    if (rb_scan_args(argc, argv, "01", &buffer) == 0) {
	return self;
    }
    StringValue(buffer);
    if (!(spki = NETSCAPE_SPKI_b64_decode(RSTRING_PTR(buffer), -1))) {
	p = (unsigned char *)RSTRING_PTR(buffer);
	if (!(spki = d2i_NETSCAPE_SPKI(NULL, &p, RSTRING_LEN(buffer)))) {
	    ossl_raise(eSPKIError, NULL);
	}
    }
    NETSCAPE_SPKI_free(DATA_PTR(self));
    DATA_PTR(self) = spki;
    ERR_clear_error();

    return self;
}