[openssl-users] M_ASN1_D2I_* replacement in OpenSSL 1.1.0

Erwann Abalea Erwann.Abalea at docusign.com
Tue Sep 20 10:44:30 UTC 2016


Bonjour,

Something like this?

/*

MyChoice ::= CHOICE {
  anInteger INTEGER,
  anOctetString OCTET STRING
  anASCIIString IA5STRING
}

MyStruct ::= SEQUENCE {
  item1 MyChoice
}

*/

__ File mytypes.h __

#include <openssl/asn1.h>

#define ASN1_OBJECT_dup(x) ASN1_dup_of(ASN1_OBJECT,i2d_ASN1_OBJECT,d2i_ASN1_OBJECT,x)
#define DECLARE_ASN1_DUP_FUNCTION(stname) stname * stname##_dup(stname *x);

typedef struct {
  int type;
  union {
    ASN1_INTEGER *anInteger;
    ASN1_OCTET_STRING *anOctetString;
    ASN1_IA5STRING *anASCIIString;
  } value;
} MYCHOICE;

DECLARE_ASN1_FUNCTIONS(MYCHOICE)
DECLARE_ASN1_DUP_FUNCTION(MYCHOICE)
DECLARE_ASN1_PRINT_FUNCTION(MYCHOICE)
#define d2i_MYCHOICE_bio(bp,p) ASN1_d2i_bio_of(MYCHOICE, MYCHOICE_new,d2i_ MYCHOICE,bp,p)
#define i2d_MYCHOICE_bio(bp,o) ASN1_i2d_bio_of(MYCHOICE,i2d_ MYCHOICE,bp,o)
#define d2i_MYCHOICE_fp(fp,p) ASN1_d2i_fp_of(MYCHOICE, MYCHOICE_new,d2i_ MYCHOICE,fp,p)
#define i2d_MYCHOICE_fp(fp,p) ASN1_i2d_fp_of(MYCHOICE,i2d_ MYCHOICE,fp,p)


typedef struct {
  MYCHOICE *item1;
} MYSTRUCT;

DECLARE_ASN1_FUNCTIONS(MYSTRUCT)
DECLARE_ASN1_DUP_FUNCTION(MYSTRUCT)
DECLARE_ASN1_PRINT_FUNCTION(MYSTRUCT)
#define d2i_MYSTRUCT_bio(bp,p) ASN1_d2i_bio_of(MYSTRUCT, MYSTRUCT_new,d2i_ MYSTRUCT,bp,p)
#define i2d_MYSTRUCT_bio(bp,o) ASN1_i2d_bio_of(MYSTRUCT,i2d_ MYSTRUCT,bp,o)
#define d2i_MYSTRUCT_fp(fp,p) ASN1_d2i_fp_of(MYSTRUCT, MYSTRUCT_new,d2i_ MYSTRUCT,fp,p)
#define i2d_MYSTRUCT_fp(fp,p) ASN1_i2d_fp_of(MYSTRUCT,i2d_ MYSTRUCT,fp,p)
____

__ File mytypes.c __
#include <openssl/asn1t.h>
#include "mytypes.h"

ASN1_CHOICE(MYCHOICE) = {
  ASN1_SIMPLE(MYCHOICE, value.anInteger, ASN1_INTEGER),
  ASN1_SIMPLE(MYCHOICE, value.anOctetString, ASN1_OCTET_STRING),
  ASN1_SIMPLE(MYCHOICE, value.anASCIIString, ASN1_IA5STRING)
} ASN1_CHOICE_END(MYCHOICE)

IMPLEMENT_ASN1_FUNCTIONS(MYCHOICE)
IMPLEMENT_ASN1_DUP_FUNCTION(MYCHOICE)
IMPLEMENT_ASN1_PRINT_FUNCTION(MYCHOICE)


ASN1_SEQUENCE(MYSTRUCT) = {
  ASN1_SIMPLE(MYSTRUCT, item1, MYCHOICE)
} ASN1_SEQUENCE_END(MYSTRUCT)

IMPLEMENT_ASN1_FUNCTIONS(MYSTRUCT)
IMPLEMENT_ASN1_DUP_FUNCTION(MYSTRUCT)
IMPLEMENT_ASN1_PRINT_FUNCTION(MYSTRUCT)
____

Now you can call i2d_MYSTRUCT()/d2i_MYSTRUCT() to encode/decode such a data type, and similar _bio, _fp, _dup functions as well.

Cordialement,
Erwann Abalea

Le 20 sept. 2016 à 11:45, Aleksandr Konstantinov <aleksandr.v.konstantinov at gmail.com<mailto:aleksandr.v.konstantinov at gmail.com>> a écrit :

Hello,

Thanks a lot. One more question if possible. Is there any way to express single element of the ASN1 sequence which can be any of ASN1_OCTET_STRING or ASN1_UTF8STRING and potentially other types?
Or maybe there is some tutorial for new interface similar to something like http://www.umich.edu/~x509/ssleay/asn1-macros.html for old one?

Best regards,


A.K.



On Mon, Sep 19, 2016 at 3:05 PM, Dr. Stephen Henson <steve at openssl.org<mailto:steve at openssl.org>> wrote:
On Mon, Sep 19, 2016, Aleksandr Konstantinov wrote:

>
> Thanks. Your answer helped a lot and I'm progressing now. Could You please
> also give me a hint what M_ASN1_BIT_STRING_dup/ASN1_BIT_STRING_dup could be
> replaced with?
>

ASN1_STRING_dup should work fine: ASN1_BIT_STRING is actually typedefed to
ASN1_STRING.

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org<http://www.openssl.org/>
--
openssl-users mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users

--
openssl-users mailing list
To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mta.openssl.org/pipermail/openssl-users/attachments/20160920/cda727c7/attachment-0001.html>


More information about the openssl-users mailing list