- /* We've now got the internal representation: convert to DER */
- ext_len = method->i2d(ext_struc, NULL);
- ext_der = Malloc(ext_len);
- p = ext_der;
- method->i2d(ext_struc, &p);
- method->ext_free(ext_struc);
- ext_oct = ASN1_OCTET_STRING_new();
+ ext = do_ext_i2d(method, ext_nid, crit, ext_struc);
+ if(method->it) ASN1_item_free(ext_struc, ASN1_ITEM_ptr(method->it));
+ else method->ext_free(ext_struc);
+ return ext;
+
+}
+
+static X509_EXTENSION *do_ext_i2d(X509V3_EXT_METHOD *method, int ext_nid,
+ int crit, void *ext_struc)
+{
+ unsigned char *ext_der;
+ int ext_len;
+ ASN1_OCTET_STRING *ext_oct;
+ X509_EXTENSION *ext;
+ /* Convert internal representation to DER */
+ if(method->it) {
+ ext_der = NULL;
+ ext_len = ASN1_item_i2d(ext_struc, &ext_der, ASN1_ITEM_ptr(method->it));
+ if(ext_len < 0) goto merr;
+ } else {
+ unsigned char *p;
+ ext_len = method->i2d(ext_struc, NULL);
+ if(!(ext_der = OPENSSL_malloc(ext_len))) goto merr;
+ p = ext_der;
+ method->i2d(ext_struc, &p);
+ }
+ if(!(ext_oct = M_ASN1_OCTET_STRING_new())) goto merr;