On Sun, Jun 23, 2002, Michael Voucko wrote:
> Hi list,
>
> still trying to get all the ASN1 stuff done I need.
> My current problem is caused by an extra tag/length pair when using my
> DIRECTORY_STRING implementation.
>
> The ASN1 definition is like this
>
> DirectoryString ::= CHOICE {
> printableString PrintableString
> teletexString TeletexString
> utf8String UTF8String
> bmpString BMPString
> universalString UniversalString
> }
>
> My definition looks like this
>
> <snip>
> ASN1_CHOICE(DIRECTORY_STRING) = {
> ASN1_SIMPLE(DIRECTORY_STRING, value.PrintableString, ASN1_PRINTABLESTRING),
> ASN1_SIMPLE(DIRECTORY_STRING, value.TeletextString, ASN1_T61STRING),
> ASN1_SIMPLE(DIRECTORY_STRING, value.UTF8String, ASN1_UTF8STRING),
> ASN1_SIMPLE(DIRECTORY_STRING, value.BMPString, ASN1_BMPSTRING),
> ASN1_SIMPLE(DIRECTORY_STRING, value.UniversalString, ASN1_UNIVERSALSTRING)
> } ASN1_CHOICE_END(DIRECTORY_STRING)
>
> IMPLEMENT_ASN1_FUNCTIONS(DIRECTORY_STRING)
> </snip>
>
> The declaration of the corresponding struct looks like this
>
> <snip>
> typedef struct directory_string_st {
>
> #define DIRSTR_PRINTABLE 0
> #define DIRSTR_TELETEXT 1
> #define DIRSTR_UTF8 2
> #define DIRSTR_BMP 3
> #define DIRSTR_UNIVERSAL 4
>
> int type;
> union {
> ASN1_PRINTABLESTRING *PrintableString;
> ASN1_T61STRING *TeletextString;
> ASN1_UTF8STRING *UTF8String;
> ASN1_BMPSTRING *BMPString;
> ASN1_UNIVERSALSTRING *UniversalString;
> } value;
> } DIRECTORY_STRING;
>
> DECLARE_ASN1_FUNCTIONS(DIRECTORY_STRING)
>
> </snip>
>
>
> When using the DIRECTORYSTRING type in my source code like this to create a
> DIRECTORYSTRING containing a ASN1_PRINTABLE
>
> <snip>
> directoryString = DIRECTORYSTRING_new();
>
> directoryString->type = DIRSTR_PRINTABLE;
> mString = (ASN1_STRING *) ASN1_PRINTABLE_new();
> if (!mString)
> goto error_exit;
> if (!(ASN1_STRING_set(mString, aValue, -1)))
> {
> goto error_exit;
> }
> directoryString->value.PrintableString = (ASN1_PRINTABLESTRING *) mString;
>
> blobLen = i2d_DIRECTORYSTRING(directoryString, NULL);
> blob = (unsigned char *) malloc(blobLen);
> if (!blob)
> goto error_exit;
> tmpPtr = blob;
> blobLen = i2d_DIRECTORYSTRING(directoryString, &tmpPtr);
> </snip>
>
> I end up with an extra tag 0x0c and length byte.
>
> Can anybody point me to my problem?
>
Your problem above is that you have defined ASN1 functions using
DIRECTORY_STRING but the functions you call have DIRECTORYSTRING
in them which happens to be already defined in OpenSSL. These
have difference structures and are being confused as a result.
If you use DIRECTORY_STRING for the relevant calls then your
code works OK.
Though as I mentioned in the other message the DirectoryString
type is already defined in OpenSSL.
Steve.
--
Dr. Stephen Henson [EMAIL PROTECTED]
OpenSSL Project http://www.openssl.org/~steve/
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]