The ITS doesn't really handle MIME messages very well. Please just follow the guidelines on the OpenLDAP web site.
http://www.openldap.org/devel/contributing.html
jgcardoso@seguridata.com wrote:
This is a multi-part message in MIME format.
------_=_NextPart_001_01CBA7B8.A7EC1D62 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
I created a function to support conversion from DER BitString encoded data to RFC4517 Bit String Format.
I tested it alone and it seems to work fine with normal and abnormal situations.
=20
I also wrote a proposal to the call that must be included at ldap_X509dn2bv() function.
=20
First comes the conversion function and after comes the proposal.
=20
=20
/*****************************************************/
=20
#define BITS_PER_BYTE 8
#define SQUOTE_LENGTH 1
#define B_CHAR_LENGTH 1
#define STR_OVERHEAD (2*SQUOTE_LENGTH + B_CHAR_LENGTH)
=20
int ldap_der_to_rfc4517_BitString (struct berval *berValue,
struct berval *rfc4517Value) {
ber_len_t bitPadding=3D0;
ber_len_t bits, maxBits;
char *tmpStr;
unsigned char byte;
ber_len_t bitLength;
ber_len_t valLen;
unsigned char* valPtr;
=20
rfc4517Value->bv_len=3D0; rfc4517Value->bv_val=3DNULL;
=20
/* Gets padding and points to binary data */ valLen=3DberValue->bv_len; valPtr=3D(unsigned char*)berValue->bv_val; if (valLen) { bitPadding=3D(ber_len_t)(valPtr[0]); valLen--; valPtr++; } /* If Block is non DER encoding fixes to DER encoding */ if (bitPadding>=3D BITS_PER_BYTE) { if (valLen*BITS_PER_BYTE> bitPadding ) { valLen-=3D(bitPadding/BITS_PER_BYTE); bitPadding%=3DBITS_PER_BYTE; } else { valLen=3D0; bitPadding=3D0; } } /* Just in case bad encoding */ if (valLen*BITS_PER_BYTE< bitPadding ) { bitPadding=3D0; valLen=3D0; }
=20
/* Gets buffer to hold RFC4517 Bit String format */ bitLength=3DvalLen*BITS_PER_BYTE-bitPadding; tmpStr=3DLDAP_MALLOC(bitLength + STR_OVERHEAD + 1);
=20
if (!tmpStr) return LDAP_NO_MEMORY;
=20
rfc4517Value->bv_val=3DtmpStr; rfc4517Value->bv_len=3DbitLength + STR_OVERHEAD;
=20
/* Formatting in '*binary-digit'B format */ maxBits=3DBITS_PER_BYTE; *tmpStr=3D'\''; tmpStr++; while(valLen) { byte=3D*valPtr; if (valLen=3D=3D1) maxBits-=3DbitPadding; for (bits=3D0; bits<maxBits; bits++) { if (0x80& byte) *tmpStr=3D'1'; else *tmpStr=3D'0'; tmpStr++; byte<<=3D1; } valPtr++; valLen--; } *tmpStr=3D'\''; tmpStr++; *tmpStr=3D'B'; tmpStr++; *tmpStr=3D0;
=20
return LDAP_SUCCESS;
}
=20
=20
/*****************************************************/
/*****************************************************/
=20
=20
/*
- Other tags found in AVAs (X.520)
*/
#define LBER_TAG_BITSTRING ((ber_tag_t) 0x03UL)
=20
=20
ldap_X509dn2bv function updated:
=20
switch(tag) { case LBER_TAG_UNIVERSAL: /* This uses 32-bit ISO 10646-1 */ csize =3D 4; goto to_utf8; case LBER_TAG_BMP: /* This uses 16-bit ISO 10646-1 */ csize =3D 2; goto to_utf8; case LBER_TAG_BITSTRING: /* X.690 bitString value converted to RFC4517 Bit
String */
rc =3D ldap_der_to_rfc4517_BitString(&Val,
&newAVA->la_value );
goto after_utf8; case LBER_TAG_TELETEX: /* This uses 8-bit, assume ISO 8859-1 */ csize =3D 1;
to_utf8: rc =3D ldap_ucs_to_utf8s(&Val, csize, &newAVA->la_value );
after_utf8: newAVA->la_flags |=3D LDAP_AVA_FREE_VALUE;
if (rc !=3D LDAP_SUCCESS) goto nomem; newAVA->la_flags =3D LDAP_AVA_NONPRINTABLE; break; case LBER_TAG_UTF8: newAVA->la_flags =3D LDAP_AVA_NONPRINTABLE; /* This is already in UTF-8 encoding */ case LBER_TAG_IA5: case LBER_TAG_PRINTABLE: /* These are always 7-bit strings */ newAVA->la_value =3D Val; default: ; }
=20
------_=_NextPart_001_01CBA7B8.A7EC1D62 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" = xmlns:o=3D"urn:schemas-microsoft-com:office:office" = xmlns:w=3D"urn:schemas-microsoft-com:office:word" = xmlns:x=3D"urn:schemas-microsoft-com:office:excel" =