Hallo, I guess someone of you is really confortable with the ASN1 API openssl offers. I have to admit, I have no idea how it exactly works, and information is really more than hard to find.

I need to read the following structures. Below the definitions you find my try. Maybe you can give me hints how the definitions really have to be realized using the openssl API.

------ DEFINITION ------

PersonenBindung ::= SEQUENCE {
version INTEGER,
issuerTemplate UTF8String,
assertionID UTF8String,
issueInstant UTF8String,
personData PersonData,
citizenPublicKey SEQUENCE SIZE (1..MAX) OF CitizenPublicKey,
signatureValue BIT STRING,
referenceDigest [0] BIT STRING OPTIONAL,
referenceManifestDigest [1] BIT STRING OPTIONAL,
manifestReferenceDigest [2] BIT STRING OPTIONAL,
}

PersonData ::= CHOICE {
physcialPerson [0] PhysicalPersonData,
corporateBody [1] CorporateBodyData
}

PhysicalPersonData ::= SEQUENCE {
baseId UTF8String,
givenName UTF8String,
familyName UTF8String,
dateOfBirth UTF8String
}

CorporateBodyData is not defined yet in the standard, is there some kind of ASN1_ANY which allows to skip an unknown entry?!

CitizenPublicKey ::= CHOICE {
onToken [0] INTEGER,
referenceURL [1] UTF8String,
x509Data [2] SubjectPublicKeyIn
}

------ MY TRY ------

typedef struct CitizenPublicKey_st
{
        int type;
        union
        {
                ASN1_INTEGER* onToken;
                ASN1_UTF8STRING referenceURL;
        }value;
} CITIZENPUBLICKEY;

DECLARE_ASN1_FUNCTIONS(CITIZENPUBLICKEY)

ASN1_CHOICE(CITIZENPUBLICKEY)={
        ASN1_SIMPLE(CITIZENPUBLICKEY, value.onToken, ASN1_INTEGER),
        ASN1_SIMPLE(CITIZENPUBLICKEY, value.referenceURL, ASN1_UTF8STRING),
} ASN1_CHOICE_END(CITIZENPUBLICKEY)

IMPLEMENT_ASN1_FUNCTIONS(CITIZENPUBLICKEY);


typedef struct PersonData_st
{
        ASN1_UTF8STRING* baseId;
        ASN1_UTF8STRING* givenName;
        ASN1_UTF8STRING* familyName;
        ASN1_UTF8STRING* dateOfBirth;
} PERSONDATA;

DECLARE_ASN1_FUNCTIONS(PERSONDATA);

ASN1_SEQUENCE(PERSONDATA)=
{
        ASN1_SIMPLE(PERSONDATA, baseId, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONDATA, givenName, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONDATA, familyName, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONDATA, dateOfBirth, ASN1_UTF8STRING)
} ASN1_SEQUENCE_END(PERSONDATA)

IMPLEMENT_ASN1_FUNCTIONS(PERSONDATA);


typedef struct PersonenBindung_st
{
        ASN1_INTEGER* version;
        ASN1_UTF8STRING* issuerTemplate;
        ASN1_UTF8STRING* assertionID;
        ASN1_UTF8STRING* issueInstant;
        PERSONDATA* personData;
        STACK_OF(CITIZENPUBLICKEY)* citizenPublicKey;
        ASN1_BIT_STRING signatureValue;
        ASN1_BIT_STRING unknown1;
        ASN1_BIT_STRING unknown2;
        ASN1_BIT_STRING unknown3;
} PERSONENBINDUNG;

DECLARE_ASN1_FUNCTIONS(PERSONENBINDUNG);

ASN1_SEQUENCE(PERSONENBINDUNG)=
{
        ASN1_SIMPLE(PERSONENBINDUNG, version, ASN1_INTEGER),
        ASN1_SIMPLE(PERSONENBINDUNG, issuerTemplate, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONENBINDUNG, assertionID, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONENBINDUNG, issueInstant, ASN1_UTF8STRING),
        ASN1_SIMPLE(PERSONENBINDUNG, personData, PERSONDATA),
        ASN1_SEQUENCE_OF(PERSONENBINDUNG, citizenPublicKey, CITIZENPUBLICKEY),
        ASN1_SIMPLE(PERSONENBINDUNG, signatureValue, ASN1_BIT_STRING),
        ASN1_OPT(PERSONENBINDUNG, unknown1, ASN1_BIT_STRING),
        ASN1_OPT(PERSONENBINDUNG, unknown2, ASN1_BIT_STRING),
        ASN1_OPT(PERSONENBINDUNG, unknown3, ASN1_BIT_STRING)
} ASN1_SEQUENCE_END(PERSONENBINDUNG)

IMPLEMENT_ASN1_FUNCTIONS(PERSONENBINDUNG);


 Thx in advance for any kind of help!


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to