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(a)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" =
--
-- Howard Chu
CTO, Symas Corp.
http://www.symas.com
Director, Highland Sun
http://highlandsun.com/hyc/
Chief Architect, OpenLDAP
http://www.openldap.org/project/