Re: [EXTERNAL] ASN.1 macros for composite structures.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Bonjour,

Taking your example, the following works here (Mac, OpenSSL 3.0.5).

$ cat myobj.h
#pragma once
#include <openssl/asn1.h>

#define ASN1_OBJECT_dup(x) ASN1_dup_of(ASN1_OBJECT,i2d_ASN1_OBJECT,d2i_ASN1_OBJECT,x)

/*
 * MyObj ::= SEQUENCE {
 *   a OBJECT IDENTIFIER,
 *   b OBJECT IDENTIFIER }
 */

typedef struct {
  ASN1_OBJECT *a;
  ASN1_OBJECT *b;
} MYOBJ;

DECLARE_ASN1_FUNCTIONS(MYOBJ);
DECLARE_ASN1_DUP_FUNCTION(MYOBJ);
DECLARE_ASN1_PRINT_FUNCTION(MYOBJ);
#define d2i_MYOBJ_bio(bp,p) ASN1_d2i_bio_of(MYOBJ,MYOBJ_new,d2i_MYOBJ,bp,p)
#define i2d_MYOBJ_bio(bp,o) ASN1_i2d_bio_of(MYOBJ,i2d_MYOBJ,bp,o)
#define d2i_MYOBJ_fp(fp,p) ASN1_d2i_fp_of(MYOBJ,MYOBJ_new,d2i_MYOBJ,fp,p)
#define i2d_MYOBJ_fp(fp,p) ASN1_i2d_fp_of(MYOBJ,i2d_MYOBJ,fp,p)


$ cat myobj.c
#include "myobj.h"
#include <openssl/asn1t.h>

/* MyObj */
ASN1_SEQUENCE(MYOBJ) = {
  ASN1_SIMPLE(MYOBJ, a, ASN1_OBJECT),
  ASN1_SIMPLE(MYOBJ, b, ASN1_OBJECT)
} ASN1_SEQUENCE_END(MYOBJ)

IMPLEMENT_ASN1_FUNCTIONS(MYOBJ);
IMPLEMENT_ASN1_DUP_FUNCTION(MYOBJ);
IMPLEMENT_ASN1_PRINT_FUNCTION(MYOBJ);


$ cat myprg.c
#include "myobj.h"
#include <stdio.h>
#include <stdlib.h>
#include <openssl/err.h>
#include <openssl/objects.h>
#include <openssl/bio.h>

int main(void)
{
  FILE *fout = NULL;
  BIO *bout = NULL;
  MYOBJ *myobj = NULL;

  printf("Openssl Version: %s\n", OPENSSL_VERSION_STR);

  myobj = MYOBJ_new();
  myobj->a = OBJ_nid2obj(NID_commonName);
  myobj->b = OBJ_nid2obj(NID_countryName);

  bout = BIO_new_fp(stdout, BIO_NOCLOSE);
  MYOBJ_print_ctx(bout, myobj, 0, NULL);
  BIO_flush(bout);
  BIO_free(bout);

  fout = fopen("myobj.der", "wb");
  i2d_MYOBJ_fp(fout, myobj);
  fclose(fout);

  ERR_print_errors_fp(stderr);
  return 0;
}

$ gcc -o myprg -I /opt/local/include -L /opt/local/lib myprg.c myobj.c -lcrypto

$ ./myprg
Openssl Version: 3.0.5
MYOBJ:
  a: commonName (2.5.4.3)
  b: countryName (2.5.4.6)

And there's a file myobj.der created in the current directory.


On Thu, Jan 26, 2023 at 6:57 PM Ladd, Watson via openssl-users <openssl-users@xxxxxxxxxxx> wrote:
Dear OpenSSL Users,

I have a structure of the form

typdef struct {
      ASN1_OBJECT *a;
       ASN1_OBJECT *b;
} example;

and I cannot figure out how to make the ASN.1 macros serialize it correctly.

When I tried to use an ASN1_SEQUENCE with two ASN1_SIMPLEs the code failed to serialize the structure.
I've been trying to use various ASN1_TYPE, but it seems those only work when ASN1_OPTS are used or some variant.

Any suggestions/pointers to documentation on how to do this? It seems like the resources that used to exist for the very old
macros don't exist anymore, and the newer more explicit stuff is only used inside of providers and not exposed elsewhere.

Sincerely,
Watson Ladd


--
Cordialement,
Erwann Abalea.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux