Dr. Stephen Henson
steve at openssl.org
Tue Sep 13 20:32:22 UTC 2016
On Tue, Sep 13, 2016, Thomas Francis, Jr. wrote:
> What???s the replacement for code that used SKM_ASN1_SET_OF_i2d in OpenSSL 1.1? The code I???ve got that calls this function is getting the DER encoding of a STACK_OF() as a sorted SET. This STACK_OF() is of a custom ASN1 type; and is a member of another structure that is also a custom ASN1 structure.
> The call looks like this:
> int len = SKM_ASN1_SET_OF_i2d(structureName, containingStructure->member, NULL, i2d_structureName, V_ASN1_SET, V_ASN1_UNIVERSAL, IS_SET);*
> ???structureName??? is the typedef???d name of the C struct, which was also passed to the DEFINE_STACK_OF() and DECLARE_ASN1_FUNCTIONS() macros (in OpenSSL < 1.1, it???s DECLARE_STACK_OF(), not DEFINE_STACK_OF() ).
> ???containingStructure??? is a pointer to a C struct, and its member, ???member??? is of the type, STACK_OF(structureName).
There isn't a precise equivalent but it looks like you need an i2d function to
encode as SET OF. You can do that.
First you need a typedef for the STACK_OF something like:
typedef STACK_OF(FOO) FOOS
Then you create an ASN.1 ITEM template like this:
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0, foos, FOO)
You then add IMPLEMENT_ASN1_FUNCTIONS(FOOS) and DECLARE_ASN1_FUINCTION(FOOS).
This will produce new functions i2d_FOOS, d2i_FOOS, FOOS_new() and
FOOS_free() which should do what you want. If you don't want the new/free ones
you can use IMPLEMENT_ASN1_ENCODE_FUNCTIONS instead.
This is used in OpenSSL in a few places such as the implementation of
GeneralNames which is a SEQUENCE_OF GeneralName.
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
More information about the openssl-users