On Tue, Sep 12, 2017, Mat??j Cepl wrote: > Hi, > > I am working on porting M2Crypto to OpenSSL 1.1.* API (in branch > https://gitlab.com/mcepl/m2crypto/commits/openssl-1.1.0 ) and I > got lost in STACK_OF structures. > > Simplified function I have troubles with is (the real stuff with > all Python2/Python3 shims is https://is.gd/Nbq3Qp ; the similar problem > is couple of lines below in the function get_der_encoding_stack). > > #include <openssl/asn1.h> > #include <openssl/x509.h> > #include <openssl/x509v3.h> > > #include <openssl/asn1t.h> > > typedef STACK_OF(X509) SEQ_CERT; > > ASN1_ITEM_TEMPLATE(SEQ_CERT) = > ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, > SeqCert, X509) > ASN1_ITEM_TEMPLATE_END(SEQ_CERT) > > IMPLEMENT_ASN1_FUNCTIONS(SEQ_CERT) > > ... > > STACK_OF(X509) * > make_stack_from_der_sequence(PyObject * pyEncodedString){ > STACK_OF(X509) *certs; > Py_ssize_t encoded_string_len; > char *encoded_string; > > encoded_string_len = PyString_Size(pyEncodedString); > > if (encoded_string_len > INT_MAX) { > PyErr_SetString(PyExc_ValueError, > "object too large"); > return NULL; > } > > encoded_string = PyString_AsString(pyEncodedString); > > if (!encoded_string) { > return NULL; > } > > certs = ASN1_seq_unpack( > (unsigned char *)encoded_string, > encoded_string_len, > d2i_X509, X509_free ); > if (!certs) { > PyErr_SetString(_x509_err, > ERR_reason_error_string( > ERR_get_error())); > return NULL; > } > > return certs; > } > > Obviously this fails to compile with these errors: > > SWIG/_m2crypto_wrap.c: In function > ???make_stack_from_der_sequence???: > SWIG/_m2crypto_wrap.c:8718:13: warning: implicit declaration of > function ???ASN1_seq_unpack???; did you mean ???ASN1_item_unpack???? [- > Wimplicit-function-declaration] > certs = ASN1_seq_unpack((unsigned char *)encoded_string, > encoded_string_len, d2i_X509, X509_free ); > ^~~~~~~~~~~~~~~ > ASN1_item_unpack > SWIG/_m2crypto_wrap.c:8718:11: warning: assignment makes pointer > from integer without a cast [-Wint-conversion] > certs = ASN1_seq_unpack((unsigned char *)encoded_string, > encoded_string_len, d2i_X509, X509_free ); > ^ > Obviously I have missed something from STACK_OF API, but I cannot > for the love of the world find what. Did truly *_seq_unpack > functions got lost on the way to 1.1 API? If I have to do the > unpacking "manually", how to do it? > > How can I get STACK_OF(X509) from the string with DER > certificate? > > I was looking also to the discussion by Jim Carroll on > https://goo.gl/ZUxQH8 but I have probably misunderstood > something. I believe I do everything I am supposed to, but still > there is something apparently missing. > Yes *_seq_unpack() is no longer in 1.1. What happens is that code above it generates a function d2i_SEQ_CERT() which does the same as ASN1_seq_unpack() for a certificate. So something like this should work: const unsigned char *tmp = (unsigned char *)encoded_string; ... certs = d21_SEQ_CERT(NULL, &tmp, encoded_string_len); Steve. -- Dr Stephen N. Henson. OpenSSL project core developer. Commercial tech support now available see: http://www.openssl.org -- openssl-users mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users