static VALUE decode_bstr(unsigned char* der, int length, long *unused_bits) { ASN1_BIT_STRING *bstr; unsigned char *p, *buf; long len; VALUE ret; p = der; if(!(bstr = d2i_ASN1_BIT_STRING(NULL, &p, length))) ossl_raise(eASN1Error, NULL); len = bstr->length; if(!(buf = OPENSSL_malloc(len))){ ASN1_BIT_STRING_free(bstr); ossl_raise(eASN1Error, NULL); } *unused_bits = 0; if(bstr->flags & ASN1_STRING_FLAG_BITS_LEFT) *unused_bits = bstr->flags & 0x07; memcpy(buf, bstr->data, len); ASN1_BIT_STRING_free(bstr); ret = ossl_buf2str(buf, len); return ret; }
/* * call-seq: * bn.to_s => string * bn.to_s(base) => string * * === Parameters * * +base+ - integer * * * Valid values: * * * * 0 - MPI * * * * 2 - binary * * * * 10 - the default * * * * 16 - hex */ static VALUE ossl_bn_to_s(int argc, VALUE *argv, VALUE self) { BIGNUM *bn; VALUE str, bs; int base = 10, len; char *buf; if (rb_scan_args(argc, argv, "01", &bs) == 1) { base = NUM2INT(bs); } GetBN(self, bn); switch (base) { case 0: len = BN_bn2mpi(bn, NULL); str = rb_str_new(0, len); if (BN_bn2mpi(bn, RSTRING_PTR(str)) != len) ossl_raise(eBNError, NULL); break; case 2: len = BN_num_bytes(bn); str = rb_str_new(0, len); if (BN_bn2bin(bn, RSTRING_PTR(str)) != len) ossl_raise(eBNError, NULL); break; case 10: if (!(buf = BN_bn2dec(bn))) ossl_raise(eBNError, NULL); str = ossl_buf2str(buf, strlen(buf)); break; case 16: if (!(buf = BN_bn2hex(bn))) ossl_raise(eBNError, NULL); str = ossl_buf2str(buf, strlen(buf)); break; default: ossl_raise(rb_eArgError, "illegal radix %d", base); } return str; }
/* * call-seq: * spki.to_pem => PEM-encoded string * * Returns the PEM encoding of this SPKI. */ static VALUE ossl_spki_to_pem(VALUE self) { NETSCAPE_SPKI *spki; char *data; VALUE str; GetSPKI(self, spki); if (!(data = NETSCAPE_SPKI_b64_encode(spki))) { ossl_raise(eSPKIError, NULL); } str = ossl_buf2str(data, rb_long2int(strlen(data))); return str; }
p = buf; if(tc == V_ASN1_UNIVERSAL) ossl_i2d_ASN1_TYPE(asn1, &p); else{ if(explicit){ ASN1_put_object(&p, 1, ossl_i2d_ASN1_TYPE(asn1, NULL), tn, tc); ossl_i2d_ASN1_TYPE(asn1, &p); } else{ ossl_i2d_ASN1_TYPE(asn1, &p); *buf = tc | tn | (*buf & V_ASN1_CONSTRUCTED); } } ossl_ASN1_TYPE_free(asn1); reallen = p - buf; assert(reallen <= length); str = ossl_buf2str(buf, reallen); /* buf will be free in ossl_buf2str */ return str; } static VALUE ossl_asn1cons_to_der(VALUE self) { int tag, tn, tc, explicit; long seq_len, length; unsigned char *p; VALUE value, str; tag = ossl_asn1_default_tag(self); tn = NUM2INT(ossl_asn1_get_tag(self)); tc = ossl_asn1_tag_class(self);