Home | History | Annotate | Line # | Download | only in comp_match
componentlib.c revision 1.1.1.4
      1 /*	$NetBSD: componentlib.c,v 1.1.1.4 2018/02/06 01:53:06 christos Exp $	*/
      2 
      3 /* Copyright 2004 IBM Corporation
      4  * All rights reserved.
      5  * Redisribution and use in source and binary forms, with or without
      6  * modification, are permitted only as authorizd by the OpenLADP
      7  * Public License.
      8  */
      9 /* ACKNOWLEDGEMENTS
     10  * This work originally developed by Sang Seok Lim
     11  * 2004/06/18	03:20:00	slim (at) OpenLDAP.org
     12  */
     13 
     14 #include <sys/cdefs.h>
     15 __RCSID("$NetBSD: componentlib.c,v 1.1.1.4 2018/02/06 01:53:06 christos Exp $");
     16 
     17 #include "portable.h"
     18 #include <ac/string.h>
     19 #include <ac/socket.h>
     20 #include <ldap_pvt.h>
     21 #include "lutil.h"
     22 #include <ldap.h>
     23 #include "slap.h"
     24 #include "component.h"
     25 
     26 #include "componentlib.h"
     27 #include "asn.h"
     28 #include <asn-gser.h>
     29 #include <stdlib.h>
     30 
     31 #include <string.h>
     32 
     33 #ifndef SLAPD_COMP_MATCH
     34 #define SLAPD_COMP_MATCH SLAPD_MOD_DYNAMIC
     35 #endif
     36 
     37 #ifdef SLAPD_COMP_MATCH
     38 /*
     39  * Matching function : BIT STRING
     40  */
     41 int
     42 MatchingComponentBits ( char* oid, ComponentSyntaxInfo *csi_attr,
     43 			ComponentSyntaxInfo *csi_assert )
     44 {
     45 	int rc;
     46         MatchingRule* mr;
     47         ComponentBits *a, *b;
     48 
     49         if ( oid ) {
     50                 mr = retrieve_matching_rule(oid, (AsnTypeId)csi_attr->csi_comp_desc->cd_type_id );
     51                 if ( mr )
     52                         return component_value_match( mr, csi_attr , csi_assert );
     53         }
     54         a = ((ComponentBits*)csi_attr);
     55         b = ((ComponentBits*)csi_assert);
     56 	rc = ( a->value.bitLen == b->value.bitLen &&
     57 		strncmp( a->value.bits,b->value.bits,a->value.bitLen ) == 0 );
     58         return rc ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
     59 }
     60 
     61 /*
     62  * Free function: BIT STRING
     63  */
     64 void
     65 FreeComponentBits ( ComponentBits* v ) {
     66 	FreeAsnBits( &v->value );
     67 }
     68 
     69 /*
     70  * GSER Encoder : BIT STRING
     71  */
     72 int
     73 GEncComponentBits ( GenBuf *b, ComponentBits *in )
     74 {
     75 	GAsnBits bits = {0};
     76 
     77 	bits.value = in->value;
     78 	if ( !in )
     79 		return (-1);
     80 	return GEncAsnBitsContent ( b, &bits);
     81 }
     82 
     83 
     84 /*
     85  * GSER Decoder : BIT STRING
     86  */
     87 int
     88 GDecComponentBits ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
     89 {
     90         char* peek_head;
     91         int i, strLen;
     92         void* component_values;
     93         ComponentBits* k, **k2;
     94 	GAsnBits result;
     95 
     96         k = (ComponentBits*) v;
     97 
     98         if ( mode & DEC_ALLOC_MODE_0 ) {
     99                 k2 = (ComponentBits**) v;
    100                 *k2 = (ComponentBits*) CompAlloc( mem_op, sizeof( ComponentBits ) );
    101 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    102                 k = *k2;
    103         }
    104 
    105 	if ( GDecAsnBitsContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    106 		if ( k ) CompFree( mem_op,  k );
    107 		return LDAP_DECODING_ERROR;
    108 	}
    109 	k->value = result.value;
    110 	k->comp_desc = get_component_description (BASICTYPE_BITSTRING);
    111 
    112 	return LDAP_SUCCESS;
    113 }
    114 
    115 /*
    116  * Component BER Decoder : BIT STRING
    117  */
    118 int
    119 BDecComponentBitsTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    120 	return BDecComponentBits ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    121 }
    122 
    123 int
    124 BDecComponentBits ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    125 			AsnLen *bytesDecoded, int mode )
    126 {
    127         char* peek_head;
    128         int i, strLen, rc;
    129         void* component_values;
    130         ComponentBits* k, **k2;
    131 	AsnBits result;
    132 
    133         k = (ComponentBits*) v;
    134 
    135         if ( mode & DEC_ALLOC_MODE_0 ) {
    136                 k2 = (ComponentBits**) v;
    137                 *k2 = (ComponentBits*) CompAlloc( mem_op, sizeof( ComponentBits ) );
    138 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    139                 k = *k2;
    140         }
    141 
    142 	if ( mode & CALL_TAG_DECODER ){
    143 		mode = mode & CALL_CONTENT_DECODER;
    144 		rc = BDecAsnBits ( mem_op, b, &result, bytesDecoded );
    145 	} else {
    146 		rc = BDecAsnBitsContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    147 	}
    148 
    149 	if ( rc < 0 ) {
    150 		if ( k ) CompFree( mem_op,  k );
    151 		return LDAP_DECODING_ERROR;
    152 	}
    153 
    154 	k->value = result;
    155 	k->comp_desc = get_component_description (BASICTYPE_BITSTRING);
    156 
    157 	return LDAP_SUCCESS;
    158 }
    159 
    160 /*
    161  * Component GSER BMPString Encoder
    162  */
    163 int
    164 GEncComponentBMPString ( GenBuf *b, ComponentBMPString *in )
    165 {
    166 	GBMPString t = {0};
    167 
    168 	if ( !in || in->value.octetLen <= 0 )
    169 		return (-1);
    170 	t.value = in->value;
    171 	return GEncBMPStringContent ( b, &t );
    172 }
    173 
    174 /*
    175  * Component GSER BMPString Decoder
    176  */
    177 int
    178 GDecComponentBMPString ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode)
    179 {
    180         char* peek_head;
    181         int i, strLen;
    182         void* component_values;
    183         ComponentBMPString* k, **k2;
    184 	GBMPString result;
    185 
    186         k = (ComponentBMPString*) v;
    187 
    188         if ( mode & DEC_ALLOC_MODE_0 ) {
    189                 k2 = (ComponentBMPString**) v;
    190                 *k2 = (ComponentBMPString*) CompAlloc( mem_op, sizeof( ComponentBMPString ) );
    191 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    192                 k = *k2;
    193         }
    194 
    195         *bytesDecoded = 0;
    196 
    197 	if ( GDecBMPStringContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    198 		if ( k ) CompFree( mem_op, k );
    199 		return LDAP_DECODING_ERROR;
    200 	}
    201 
    202 	k->value = result.value;
    203 	k->comp_desc = get_component_description (BASICTYPE_BMP_STR);
    204 
    205 	return LDAP_SUCCESS;
    206 
    207 }
    208 
    209 /*
    210  * Component BER BMPString Decoder
    211  */
    212 int
    213 BDecComponentBMPStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    214 	return BDecComponentBMPString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    215 }
    216 
    217 int
    218 BDecComponentBMPString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    219 			AsnLen *bytesDecoded, int mode )
    220 {
    221         char* peek_head;
    222         int i, strLen, rc;
    223         void* component_values;
    224         ComponentBMPString* k, **k2;
    225 	BMPString result;
    226 
    227         k = (ComponentBMPString*) v;
    228 
    229         if ( mode & DEC_ALLOC_MODE_0 ) {
    230                 k2 = (ComponentBMPString**) v;
    231                 *k2 = (ComponentBMPString*) CompAlloc( mem_op, sizeof( ComponentBMPString ) );
    232 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    233                 k = *k2;
    234         }
    235 
    236 	if ( mode & CALL_TAG_DECODER ){
    237 		mode = mode & CALL_CONTENT_DECODER;
    238 		rc = BDecBMPString ( mem_op, b, &result, bytesDecoded );
    239 	} else {
    240 		rc = BDecBMPStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    241 	}
    242 
    243 	if ( rc < 0 ) {
    244 		if ( k ) CompFree( mem_op, k );
    245 		return LDAP_DECODING_ERROR;
    246 	}
    247 
    248 	k->value = result;
    249 	k->comp_desc = get_component_description (BASICTYPE_BMP_STR);
    250 
    251 	return LDAP_SUCCESS;
    252 
    253 }
    254 
    255 /*
    256  * Component GSER Encoder : UTF8 String
    257  */
    258 int
    259 GEncComponentUTF8String ( GenBuf *b, ComponentUTF8String *in )
    260 {
    261 	GUTF8String t = {0};
    262 	if ( !in || in->value.octetLen <= 0 )
    263 		return (-1);
    264 	t.value = in->value;
    265 	return GEncUTF8StringContent ( b, &t );
    266 }
    267 
    268 /*
    269  * Component GSER Decoder :  UTF8 String
    270  */
    271 int
    272 GDecComponentUTF8String ( void* mem_op, GenBuf *b, void *v,
    273 				AsnLen *bytesDecoded, int mode) {
    274         char* peek_head;
    275         int i, strLen;
    276         void* component_values;
    277         ComponentUTF8String* k, **k2;
    278 	GUTF8String result;
    279 
    280         k = (ComponentUTF8String*) v;
    281 
    282         if ( mode & DEC_ALLOC_MODE_0 ) {
    283                 k2 = (ComponentUTF8String**) v;
    284                 *k2 = (ComponentUTF8String*)CompAlloc( mem_op, sizeof( ComponentUTF8String ) );
    285 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    286                 k = *k2;
    287         }
    288 
    289         *bytesDecoded = 0;
    290 
    291 	if ( GDecUTF8StringContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    292 		if ( k ) CompFree( mem_op,  k );
    293 		return LDAP_DECODING_ERROR;
    294 	}
    295 
    296 	k->value = result.value;
    297 	k->comp_desc = get_component_description (BASICTYPE_UTF8_STR);
    298 
    299 	return LDAP_SUCCESS;
    300 }
    301 
    302 /*
    303  * Component BER Decoder : UTF8String
    304  */
    305 int
    306 BDecComponentUTF8StringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    307 	return BDecComponentUTF8String ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    308 }
    309 
    310 int
    311 BDecComponentUTF8String ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len,
    312 				void *v, AsnLen *bytesDecoded, int mode )
    313 {
    314         char* peek_head;
    315         int i, strLen, rc;
    316         void* component_values;
    317         ComponentUTF8String* k, **k2;
    318 	UTF8String result;
    319 
    320         k = (ComponentUTF8String*) v;
    321 
    322         if ( mode & DEC_ALLOC_MODE_0 ) {
    323                 k2 = (ComponentUTF8String**) v;
    324                 *k2 = (ComponentUTF8String*) CompAlloc( mem_op, sizeof( ComponentUTF8String ) );
    325 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    326                 k = *k2;
    327         }
    328 
    329 	if ( mode & CALL_TAG_DECODER ){
    330 		mode = mode & CALL_CONTENT_DECODER;
    331 		rc = BDecUTF8String ( mem_op, b, &result, bytesDecoded );
    332 	} else {
    333 		rc = BDecUTF8StringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    334 	}
    335 	if ( rc < 0 ) {
    336 		if ( k ) CompFree( mem_op,  k );
    337 		return LDAP_DECODING_ERROR;
    338 	}
    339 
    340 	k->value = result;
    341 	k->comp_desc = get_component_description (BASICTYPE_UTF8_STR);
    342 
    343 	return LDAP_SUCCESS;
    344 }
    345 
    346 /*
    347  * Component GSER Encoder :  Teletex String
    348  */
    349 int
    350 GEncComponentTeletexString ( GenBuf *b, ComponentTeletexString *in )
    351 {
    352 	GTeletexString t = {0};
    353 
    354 	if ( !in || in->value.octetLen <= 0 )
    355 		return (-1);
    356 	t.value = in->value;
    357 	return GEncTeletexStringContent ( b, &t );
    358 }
    359 
    360 /*
    361  * Component GSER Decoder :  Teletex String
    362  */
    363 int
    364 GDecComponentTeletexString  ( void* mem_op, GenBuf *b, void *v,
    365 					AsnLen *bytesDecoded, int mode) {
    366         char* peek_head;
    367         int i, strLen;
    368         void* component_values;
    369         ComponentTeletexString* k, **k2;
    370 	GTeletexString result;
    371 
    372         k = (ComponentTeletexString*) v;
    373 
    374         if ( mode & DEC_ALLOC_MODE_0 ) {
    375                 k2 = (ComponentTeletexString**) v;
    376                 *k2 = (ComponentTeletexString*)CompAlloc( mem_op, sizeof( ComponentTeletexString ) );
    377 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    378                 k = *k2;
    379         }
    380 
    381         *bytesDecoded = 0;
    382 
    383 	if ( GDecTeletexStringContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    384 		if ( k ) CompFree( mem_op,  k );
    385 		return LDAP_DECODING_ERROR;
    386 	}
    387 
    388 	k->value = result.value;
    389 	k->comp_desc = get_component_description (BASICTYPE_VIDEOTEX_STR);
    390 
    391 	return LDAP_SUCCESS;
    392 }
    393 
    394 
    395 /*
    396  * Matching function : BOOLEAN
    397  */
    398 int
    399 MatchingComponentBool(char* oid, ComponentSyntaxInfo* csi_attr,
    400                         ComponentSyntaxInfo* csi_assert )
    401 {
    402         MatchingRule* mr;
    403         ComponentBool *a, *b;
    404 
    405         if( oid ) {
    406                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
    407                 if ( mr )
    408                         return component_value_match( mr, csi_attr , csi_assert );
    409         }
    410 
    411         a = ((ComponentBool*)csi_attr);
    412         b = ((ComponentBool*)csi_assert);
    413 
    414         return (a->value == b->value) ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
    415 }
    416 
    417 /*
    418  * GSER Encoder : BOOLEAN
    419  */
    420 int
    421 GEncComponentBool ( GenBuf *b, ComponentBool *in )
    422 {
    423 	GAsnBool t = {0};
    424 
    425 	if ( !in )
    426 		return (-1);
    427 	t.value = in->value;
    428 	return GEncAsnBoolContent ( b, &t );
    429 }
    430 
    431 /*
    432  * GSER Decoder : BOOLEAN
    433  */
    434 int
    435 GDecComponentBool ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
    436 {
    437         char* peek_head;
    438         int i, strLen;
    439         ComponentBool* k, **k2;
    440 	GAsnBool result;
    441 
    442         k = (ComponentBool*) v;
    443 
    444         if ( mode & DEC_ALLOC_MODE_0 ) {
    445                 k2 = (ComponentBool**) v;
    446                 *k2 = (ComponentBool*) CompAlloc( mem_op, sizeof( ComponentBool ) );
    447 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    448                 k = *k2;
    449         }
    450 
    451 	if ( GDecAsnBoolContent( mem_op, b, &result, bytesDecoded ) < 0 ) {
    452 		if ( k ) CompFree ( mem_op, k );
    453 		return LDAP_DECODING_ERROR;
    454 	}
    455 
    456 	k->value = result.value;
    457 	k->comp_desc = get_component_description (BASICTYPE_BOOLEAN);
    458 
    459         return LDAP_SUCCESS;
    460 }
    461 
    462 /*
    463  * Component BER Decoder : BOOLEAN
    464  */
    465 int
    466 BDecComponentBoolTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    467 	return BDecComponentBool ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    468 }
    469 
    470 int
    471 BDecComponentBool ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    472 			AsnLen *bytesDecoded, int mode )
    473 {
    474         char* peek_head;
    475         int i, strLen, rc;
    476         ComponentBool* k, **k2;
    477 	AsnBool result;
    478 
    479         k = (ComponentBool*) v;
    480 
    481         if ( mode & DEC_ALLOC_MODE_0 ) {
    482                 k2 = (ComponentBool**) v;
    483                 *k2 = (ComponentBool*) CompAlloc( mem_op, sizeof( ComponentBool ) );
    484 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    485                 k = *k2;
    486         }
    487 
    488 	if ( mode & CALL_TAG_DECODER ){
    489 		mode = mode & CALL_CONTENT_DECODER;
    490 		rc = BDecAsnBool ( mem_op, b, &result, bytesDecoded );
    491 	} else {
    492 		rc = BDecAsnBoolContent( mem_op, b, tagId, len, &result, bytesDecoded );
    493 	}
    494 	if ( rc < 0 ) {
    495 		if ( k ) CompFree ( mem_op, k );
    496 		return LDAP_DECODING_ERROR;
    497 	}
    498 
    499 	k->value = result;
    500 	k->comp_desc = get_component_description (BASICTYPE_BOOLEAN);
    501 
    502         return LDAP_SUCCESS;
    503 }
    504 
    505 /*
    506  * Matching function : ENUMERATE
    507  */
    508 int
    509 MatchingComponentEnum ( char* oid, ComponentSyntaxInfo *csi_attr,
    510 			ComponentSyntaxInfo *csi_assert )
    511 {
    512         int rc;
    513         MatchingRule* mr;
    514         ComponentEnum *a, *b;
    515 
    516         if( oid ) {
    517                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
    518                 if ( mr )
    519                         return component_value_match( mr, csi_attr , csi_assert );
    520         }
    521         a = ((ComponentEnum*)csi_attr);
    522         b = ((ComponentEnum*)csi_assert);
    523         rc = (a->value == b->value);
    524 
    525         return rc ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
    526 }
    527 
    528 /*
    529  * GSER Encoder : ENUMERATE
    530  */
    531 int
    532 GEncComponentEnum ( GenBuf *b, ComponentEnum *in )
    533 {
    534 	GAsnEnum t = {0};
    535 
    536 	if ( !in )
    537 		return (-1);
    538 	t.value = in->value;
    539 	return GEncAsnEnumContent ( b, &t );
    540 }
    541 
    542 /*
    543  * GSER Decoder : ENUMERATE
    544  */
    545 int
    546 GDecComponentEnum ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
    547 {
    548         char* peek_head;
    549         int i, strLen;
    550         void* component_values;
    551         ComponentEnum* k, **k2;
    552 	GAsnEnum result;
    553 
    554         k = (ComponentEnum*) v;
    555 
    556         if ( mode & DEC_ALLOC_MODE_0 ) {
    557                 k2 = (ComponentEnum**) v;
    558                 *k2 = (ComponentEnum*) CompAlloc( mem_op, sizeof( ComponentEnum ) );
    559 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    560                 k = *k2;
    561         }
    562 
    563 	if ( GDecAsnEnumContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    564 		if ( k ) CompFree ( mem_op, k );
    565 		return LDAP_DECODING_ERROR;
    566 	}
    567 
    568 	k->value_identifier.bv_val = result.value_identifier;
    569 	k->value_identifier.bv_len = result.len;
    570 
    571 	k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    572 	if ( !k->comp_desc )  {
    573 		if ( k ) CompFree ( mem_op, k );
    574 		return LDAP_DECODING_ERROR;
    575 	}
    576 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentEnum;
    577 	k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEnum;
    578 	k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEnum;
    579 	k->comp_desc->cd_free = (comp_free_func*)NULL;
    580 	k->comp_desc->cd_extract_i = NULL;
    581 	k->comp_desc->cd_type = ASN_BASIC;
    582 	k->comp_desc->cd_type_id = BASICTYPE_ENUMERATED;
    583 	k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentEnum;
    584 
    585 	return LDAP_SUCCESS;
    586 }
    587 
    588 /*
    589  * Component BER Decoder : ENUMERATE
    590  */
    591 int
    592 BDecComponentEnumTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    593 	return BDecComponentEnum ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    594 }
    595 
    596 int
    597 BDecComponentEnum ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    598 			AsnLen *bytesDecoded, int mode )
    599 {
    600         char* peek_head;
    601         int i, strLen, rc;
    602         void* component_values;
    603         ComponentEnum* k, **k2;
    604 	AsnEnum result;
    605 
    606         k = (ComponentEnum*) v;
    607 
    608         if ( mode & DEC_ALLOC_MODE_0 ) {
    609                 k2 = (ComponentEnum**) v;
    610                 *k2 = (ComponentEnum*) CompAlloc( mem_op, sizeof( ComponentEnum ) );
    611 		if ( k ) return LDAP_DECODING_ERROR;
    612                 k = *k2;
    613         }
    614 
    615 	if ( mode & CALL_TAG_DECODER ){
    616 		mode = mode & CALL_CONTENT_DECODER;
    617 		rc = BDecAsnEnum ( mem_op, b, &result, bytesDecoded );
    618 	} else {
    619 		rc = BDecAsnEnumContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    620 	}
    621 	if ( rc < 0 ) {
    622 		if ( k ) CompFree ( mem_op, k );
    623 		return LDAP_DECODING_ERROR;
    624 	}
    625 
    626 	k->value = result;
    627 
    628         k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    629 	if ( !k->comp_desc )  {
    630 		if ( k  ) CompFree ( mem_op, k );
    631 		return LDAP_DECODING_ERROR;
    632 	}
    633 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentEnum;
    634         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEnum;
    635         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEnum;
    636 	k->comp_desc->cd_free = (comp_free_func*)NULL;
    637         k->comp_desc->cd_extract_i = NULL;
    638         k->comp_desc->cd_type = ASN_BASIC;
    639         k->comp_desc->cd_type_id = BASICTYPE_ENUMERATED;
    640         k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentEnum;
    641 
    642 	return LDAP_SUCCESS;
    643 }
    644 
    645 /*
    646  * Component GSER Encoder : IA5String
    647  */
    648 int
    649 GEncComponentIA5Stirng ( GenBuf *b, ComponentIA5String* in )
    650 {
    651 	GIA5String t = {0};
    652 	t.value = in->value;
    653 	if ( !in || in->value.octetLen <= 0 ) return (-1);
    654 	return GEncIA5StringContent( b, &t );
    655 }
    656 
    657 /*
    658  * Component BER Decoder : IA5String
    659  */
    660 int
    661 BDecComponentIA5StringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    662 	return BDecComponentIA5String ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    663 }
    664 
    665 int
    666 BDecComponentIA5String ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    667 			AsnLen *bytesDecoded, int mode )
    668 {
    669         char* peek_head;
    670         int i, strLen, rc;
    671         void* component_values;
    672         ComponentIA5String* k, **k2;
    673 	IA5String result;
    674 
    675         k = (ComponentIA5String*) v;
    676 
    677         if ( mode & DEC_ALLOC_MODE_0 ) {
    678                 k2 = (ComponentIA5String**) v;
    679                 *k2 = (ComponentIA5String*) CompAlloc( mem_op, sizeof( ComponentIA5String ) );
    680 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    681                 k = *k2;
    682         }
    683 
    684 	if ( mode & CALL_TAG_DECODER ){
    685 		mode = mode & CALL_CONTENT_DECODER;
    686 		rc = BDecIA5String ( mem_op, b, &result, bytesDecoded );
    687 	} else {
    688 		rc = BDecIA5StringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    689 	}
    690 	if ( rc < 0 ) {
    691 		if ( k ) CompFree ( mem_op, k );
    692 		return LDAP_DECODING_ERROR;
    693 	}
    694 
    695 	k->value = result;
    696 
    697         k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    698 	if ( !k->comp_desc )  {
    699 		if ( k ) CompFree ( mem_op, k );
    700 		return LDAP_DECODING_ERROR;
    701 	}
    702 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentIA5String;
    703         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentIA5String;
    704         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentIA5String;
    705 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentIA5String;
    706         k->comp_desc->cd_extract_i = NULL;
    707         k->comp_desc->cd_type = ASN_BASIC;
    708         k->comp_desc->cd_type_id = BASICTYPE_IA5_STR;
    709         k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentIA5String;
    710 
    711 	return LDAP_SUCCESS;
    712 }
    713 
    714 /*
    715  * Matching function : INTEGER
    716  */
    717 int
    718 MatchingComponentInt(char* oid, ComponentSyntaxInfo* csi_attr,
    719                         ComponentSyntaxInfo* csi_assert )
    720 {
    721         MatchingRule* mr;
    722         ComponentInt *a, *b;
    723 
    724         if( oid ) {
    725                 /* check if this ASN type's matching rule is overrided */
    726                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
    727                 /* if existing function is overrided, call the overriding
    728 function*/
    729                 if ( mr )
    730                         return component_value_match( mr, csi_attr , csi_assert );
    731         }
    732         a = ((ComponentInt*)csi_attr);
    733         b = ((ComponentInt*)csi_assert);
    734 
    735         return ( a->value == b->value ) ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
    736 }
    737 
    738 /*
    739  * GSER Encoder : INTEGER
    740  */
    741 int
    742 GEncComponentInt ( GenBuf *b, ComponentInt* in )
    743 {
    744 	GAsnInt t = {0};
    745 
    746 	if ( !in )
    747 		return (-1);
    748 	t.value = in->value;
    749 	return GEncAsnIntContent ( b, &t );
    750 }
    751 
    752 /*
    753  * GSER Decoder : INTEGER
    754  */
    755 int
    756 GDecComponentInt( void* mem_op, GenBuf * b, void *v, AsnLen *bytesDecoded, int mode)
    757 {
    758         char* peek_head;
    759         int i, strLen;
    760         void* component_values;
    761         ComponentInt* k, **k2;
    762 	GAsnInt result;
    763 
    764         k = (ComponentInt*) v;
    765 
    766         if ( mode & DEC_ALLOC_MODE_0 ) {
    767                 k2 = (ComponentInt**) v;
    768                 *k2 = (ComponentInt*) CompAlloc( mem_op, sizeof( ComponentInt ) );
    769 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    770                 k = *k2;
    771         }
    772 
    773 	if ( GDecAsnIntContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    774 		if ( k ) CompFree ( mem_op, k );
    775 		return LDAP_DECODING_ERROR;
    776 	}
    777 	k->value = result.value;
    778 	k->comp_desc = get_component_description (BASICTYPE_INTEGER );
    779 
    780         return LDAP_SUCCESS;
    781 }
    782 
    783 /*
    784  * Component BER Decoder : INTEGER
    785  */
    786 int
    787 BDecComponentIntTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    788 	return BDecComponentInt ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    789 }
    790 
    791 int
    792 BDecComponentInt ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    793 			AsnLen *bytesDecoded, int mode )
    794 {
    795         char* peek_head;
    796         int i, strLen, rc;
    797         void* component_values;
    798         ComponentInt* k, **k2;
    799 	AsnInt result;
    800 
    801         k = (ComponentInt*) v;
    802 
    803         if ( mode & DEC_ALLOC_MODE_0 ) {
    804                 k2 = (ComponentInt**) v;
    805                 *k2 = (ComponentInt*) CompAlloc( mem_op, sizeof( ComponentInt ) );
    806 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    807                 k = *k2;
    808         }
    809 
    810 	if ( mode & CALL_TAG_DECODER ){
    811 		mode = mode & CALL_CONTENT_DECODER;
    812 		rc = BDecAsnInt ( mem_op, b, &result, bytesDecoded );
    813 	} else {
    814 		rc = BDecAsnIntContent ( mem_op, b, tagId, len, &result, bytesDecoded );
    815 	}
    816 	k->value = result;
    817 
    818 	k->comp_desc = get_component_description (BASICTYPE_INTEGER );
    819 
    820         return LDAP_SUCCESS;
    821 }
    822 
    823 /*
    824  * Matching function : NULL
    825  */
    826 int
    827 MatchingComponentNull ( char *oid, ComponentSyntaxInfo *csi_attr,
    828 			ComponentSyntaxInfo *csi_assert )
    829 {
    830         MatchingRule* mr;
    831         ComponentNull *a, *b;
    832 
    833         if( oid ) {
    834                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
    835                 if ( mr )
    836                         return component_value_match( mr, csi_attr , csi_assert );
    837         }
    838         a = ((ComponentNull*)csi_attr);
    839         b = ((ComponentNull*)csi_assert);
    840 
    841         return (a->value == b->value) ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
    842 }
    843 
    844 /*
    845  * GSER Encoder : NULL
    846  */
    847 int
    848 GEncComponentNull ( GenBuf *b, ComponentNull *in )
    849 {
    850 	GAsnNull t = {0};
    851 
    852 	if ( !in )
    853 		return (-1);
    854 	t.value = in->value;
    855 	return GEncAsnNullContent ( b, &t );
    856 }
    857 
    858 /*
    859  * GSER Decoder : NULL
    860  */
    861 int
    862 GDecComponentNull ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
    863 {
    864         char* peek_head;
    865         int i, strLen;
    866         void* component_values;
    867         ComponentNull* k, **k2;
    868 	GAsnNull result;
    869 
    870         k = (ComponentNull*) v;
    871 
    872         if ( mode & DEC_ALLOC_MODE_0 ) {
    873                 k2 = (ComponentNull**) v;
    874                 *k2 = (ComponentNull*) CompAlloc( mem_op, sizeof( ComponentNull ) );
    875 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    876                 k = *k2;
    877         }
    878 
    879 	if ( GDecAsnNullContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
    880 		if ( k ) CompFree ( mem_op, k );
    881 		return LDAP_DECODING_ERROR;
    882 	}
    883 	k->value = result.value;
    884 
    885 	k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    886 	if ( !k->comp_desc )  {
    887 		if ( k ) CompFree ( mem_op, k );
    888 		return LDAP_DECODING_ERROR;
    889 	}
    890 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNull;
    891 	k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNull;
    892 	k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNull;
    893 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentNull;
    894 	k->comp_desc->cd_extract_i = NULL;
    895 	k->comp_desc->cd_type = ASN_BASIC;
    896 	k->comp_desc->cd_type_id = BASICTYPE_NULL;
    897 	k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentNull;
    898 
    899 	return LDAP_SUCCESS;
    900 }
    901 
    902 /*
    903  * Component BER Decoder : NULL
    904  */
    905 int
    906 BDecComponentNullTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
    907 {
    908 	return BDecComponentNull ( mem_op, b, 0, 0, v,bytesDecoded, mode|CALL_TAG_DECODER );
    909 }
    910 
    911 int
    912 BDecComponentNull ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
    913 			AsnLen *bytesDecoded, int mode )
    914 {
    915         char* peek_head;
    916         int i, strLen, rc;
    917         void* component_values;
    918         ComponentNull* k, **k2;
    919 	AsnNull result;
    920 
    921         k = (ComponentNull*) v;
    922 
    923         if ( mode & DEC_ALLOC_MODE_0 ) {
    924                 k2 = (ComponentNull**) v;
    925                 *k2 = (ComponentNull*) CompAlloc( mem_op, sizeof( ComponentNull ) );
    926 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    927                 k = *k2;
    928         }
    929 
    930 	if ( mode & CALL_TAG_DECODER ){
    931 		mode = mode & CALL_CONTENT_DECODER;
    932 		rc = BDecAsnNull ( mem_op, b, &result, bytesDecoded );
    933 	}
    934 	else {
    935 		rc = BDecAsnNullContent ( mem_op, b, tagId, len, &result, bytesDecoded);
    936 	}
    937 	if ( rc < 0 ) {
    938 		if ( k ) CompFree ( mem_op, k );
    939 		return LDAP_DECODING_ERROR;
    940 	}
    941 	k->value = result;
    942 
    943 	k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    944 	if ( !k->comp_desc )  {
    945 		if ( k ) CompFree ( mem_op, k );
    946 		return LDAP_DECODING_ERROR;
    947 	}
    948 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNull;
    949 	k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNull;
    950 	k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNull;
    951 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentNull;
    952 	k->comp_desc->cd_extract_i = NULL;
    953 	k->comp_desc->cd_type = ASN_BASIC;
    954 	k->comp_desc->cd_type_id = BASICTYPE_NULL;
    955 	k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentNull;
    956 	return LDAP_SUCCESS;
    957 }
    958 
    959 /*
    960  * Component BER Decoder : NumericString
    961  */
    962 int
    963 BDecComponentNumericStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
    964 	return BDecComponentNumericString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
    965 }
    966 
    967 int
    968 BDecComponentNumericString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
    969 {
    970         char* peek_head;
    971         int i, strLen, rc;
    972         void* component_values;
    973         ComponentNumericString* k, **k2;
    974 	NumericString result;
    975 
    976         k = (ComponentNumericString*) v;
    977 
    978         if ( mode & DEC_ALLOC_MODE_0 ) {
    979                 k2 = (ComponentNumericString**) v;
    980                 *k2 = (ComponentNumericString*) CompAlloc( mem_op, sizeof( ComponentNumericString ) );
    981 		if ( !*k2 ) return LDAP_DECODING_ERROR;
    982                 k = *k2;
    983         }
    984 
    985 	if ( mode & CALL_TAG_DECODER ){
    986 		mode = mode & CALL_CONTENT_DECODER;
    987 		rc = BDecNumericString ( mem_op, b, &result, bytesDecoded );
    988 	} else {
    989 		rc = BDecNumericStringContent ( mem_op, b, tagId, len, &result, bytesDecoded);
    990 	}
    991 	if ( rc < 0 ) {
    992 		if ( k ) CompFree ( mem_op, k );
    993 		return LDAP_DECODING_ERROR;
    994 	}
    995 	k->value = result;
    996 
    997         k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
    998 	if ( !k->comp_desc )  {
    999 		if ( k ) CompFree ( mem_op, k );
   1000 		return LDAP_DECODING_ERROR;
   1001 	}
   1002 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentNumericString;
   1003         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentNumericString;
   1004         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentNumericString;
   1005 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentNumericString;
   1006         k->comp_desc->cd_extract_i = NULL;
   1007         k->comp_desc->cd_type = ASN_BASIC;
   1008         k->comp_desc->cd_type_id = BASICTYPE_NUMERIC_STR;
   1009         k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentNumericString;
   1010 
   1011 	return LDAP_SUCCESS;
   1012 }
   1013 
   1014 
   1015 /*
   1016  * Free function : OCTET STRING
   1017  */
   1018 void
   1019 FreeComponentOcts ( ComponentOcts* v) {
   1020 	FreeAsnOcts( &v->value );
   1021 }
   1022 
   1023 /*
   1024  * Matching function : OCTET STRING
   1025  */
   1026 int
   1027 MatchingComponentOcts ( char* oid, ComponentSyntaxInfo* csi_attr,
   1028 			ComponentSyntaxInfo* csi_assert )
   1029 {
   1030         int rc;
   1031         MatchingRule* mr;
   1032         ComponentOcts *a, *b;
   1033 
   1034         if( oid ) {
   1035                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
   1036                 if ( mr )
   1037                         return component_value_match( mr, csi_attr , csi_assert );
   1038         }
   1039         a = (ComponentOcts*) csi_attr;
   1040         b = (ComponentOcts*) csi_assert;
   1041 	/* Assume that both of OCTET string has end of string character */
   1042 	if ( (a->value.octetLen == b->value.octetLen) &&
   1043 		strncmp ( a->value.octs, b->value.octs, a->value.octetLen ) == 0 )
   1044         	return LDAP_COMPARE_TRUE;
   1045 	else
   1046 		return LDAP_COMPARE_FALSE;
   1047 }
   1048 
   1049 /*
   1050  * GSER Encoder : OCTET STRING
   1051  */
   1052 int
   1053 GEncComponentOcts ( GenBuf* b, ComponentOcts *in )
   1054 {
   1055 	GAsnOcts t = {0};
   1056 	if ( !in || in->value.octetLen <= 0 )
   1057 		return (-1);
   1058 
   1059 	t.value = in->value;
   1060 	return GEncAsnOctsContent ( b, &t );
   1061 }
   1062 
   1063 /*
   1064  * GSER Decoder : OCTET STRING
   1065  */
   1066 int
   1067 GDecComponentOcts ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1068 {
   1069         char *peek_head, *data;
   1070         int i, j, strLen;
   1071         void* component_values;
   1072         ComponentOcts* k, **k2;
   1073 	GAsnOcts result;
   1074 
   1075         k = (ComponentOcts*) v;
   1076 
   1077         if ( mode & DEC_ALLOC_MODE_0 ) {
   1078                 k2 = (ComponentOcts**) v;
   1079                 *k2 = (ComponentOcts*) CompAlloc( mem_op, sizeof( ComponentOcts ) );
   1080 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1081                 k = *k2;
   1082         }
   1083 
   1084 	if ( GDecAsnOctsContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
   1085 		if ( k ) CompFree ( mem_op, k );
   1086 		return LDAP_DECODING_ERROR;
   1087 	}
   1088 	k->value = result.value;
   1089 
   1090 	k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
   1091 	if ( !k->comp_desc )  {
   1092 		if ( k ) CompFree ( mem_op, k );
   1093 		return LDAP_DECODING_ERROR;
   1094 	}
   1095 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentOcts;
   1096 	k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOcts;
   1097 	k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOcts;
   1098 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentOcts;
   1099 	k->comp_desc->cd_extract_i = NULL;
   1100 	k->comp_desc->cd_type = ASN_BASIC;
   1101 	k->comp_desc->cd_type_id = BASICTYPE_OCTETSTRING;
   1102 	k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOcts;
   1103 
   1104 	return LDAP_SUCCESS;
   1105 }
   1106 
   1107 /*
   1108  * Component BER Decoder : OCTET STRING
   1109  */
   1110 int
   1111 BDecComponentOctsTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1112 	return BDecComponentOcts ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1113 }
   1114 
   1115 int
   1116 BDecComponentOcts ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
   1117 			AsnLen *bytesDecoded, int mode )
   1118 {
   1119         char *peek_head, *data;
   1120         int i, strLen, rc;
   1121         void* component_values;
   1122         ComponentOcts* k, **k2;
   1123 	AsnOcts result;
   1124 
   1125         k = (ComponentOcts*) v;
   1126 
   1127         if ( mode & DEC_ALLOC_MODE_0 ) {
   1128                 k2 = (ComponentOcts**) v;
   1129                 *k2 = (ComponentOcts*) CompAlloc( mem_op, sizeof( ComponentOcts ) );
   1130 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1131                 k = *k2;
   1132         }
   1133 
   1134 	if ( mode & CALL_TAG_DECODER ){
   1135 		mode = mode & CALL_CONTENT_DECODER;
   1136 		rc = BDecAsnOcts ( mem_op, b, &result, bytesDecoded );
   1137 	} else {
   1138 		rc = BDecAsnOctsContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1139 	}
   1140 	if ( rc < 0 ) {
   1141 		if ( k ) CompFree ( mem_op, k );
   1142 		return LDAP_DECODING_ERROR;
   1143 	}
   1144 	k->value = result;
   1145 
   1146         k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
   1147 	if ( !k->comp_desc )  {
   1148 		if ( k ) CompFree ( mem_op, k );
   1149 		return LDAP_DECODING_ERROR;
   1150 	}
   1151 	k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentOcts;
   1152         k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOcts;
   1153         k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOcts;
   1154 	k->comp_desc->cd_free = (comp_free_func*)FreeComponentOcts;
   1155         k->comp_desc->cd_extract_i = NULL;
   1156         k->comp_desc->cd_type = ASN_BASIC;
   1157         k->comp_desc->cd_type_id = BASICTYPE_OCTETSTRING;
   1158         k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOcts;
   1159 	return LDAP_SUCCESS;
   1160 }
   1161 
   1162 /*
   1163  * Matching function : OBJECT IDENTIFIER
   1164  */
   1165 int
   1166 MatchingComponentOid ( char *oid, ComponentSyntaxInfo *csi_attr ,
   1167 			ComponentSyntaxInfo *csi_assert )
   1168 {
   1169         int rc;
   1170         MatchingRule* mr;
   1171         ComponentOid *a, *b;
   1172 
   1173         if( oid ) {
   1174                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
   1175                 if ( mr )
   1176                         return component_value_match( mr, csi_attr , csi_assert );
   1177         }
   1178 
   1179         a = (ComponentOid*)csi_attr;
   1180         b = (ComponentOid*)csi_assert;
   1181 	if ( a->value.octetLen != b->value.octetLen )
   1182 		return LDAP_COMPARE_FALSE;
   1183         rc = ( strncmp( a->value.octs, b->value.octs, a->value.octetLen ) == 0 );
   1184 
   1185         return rc ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
   1186 }
   1187 
   1188 /*
   1189  * GSER Encoder : OID
   1190  */
   1191 GEncComponentOid ( GenBuf *b, ComponentOid *in )
   1192 {
   1193 	GAsnOid t = {0};
   1194 
   1195 	if ( !in || in->value.octetLen <= 0 )
   1196 		return (-1);
   1197 	t.value = in->value;
   1198 	return GEncAsnOidContent( b, (GAsnOcts*)&t );
   1199 }
   1200 
   1201 /*
   1202  * GSER Decoder : OID
   1203  */
   1204 int
   1205 GDecAsnDescOidContent ( void* mem_op, GenBuf *b, GAsnOid *result, AsnLen *bytesDecoded ){
   1206 	AttributeType *ad_type;
   1207 	struct berval name;
   1208 	char* peek_head;
   1209 	int strLen;
   1210 
   1211 	strLen = LocateNextGSERToken ( mem_op, b, &peek_head, GSER_NO_COPY );
   1212 	name.bv_val = peek_head;
   1213 	name.bv_len = strLen;
   1214 
   1215 	ad_type = at_bvfind( &name );
   1216 
   1217 	if ( !ad_type )
   1218 		return LDAP_DECODING_ERROR;
   1219 
   1220 	peek_head = ad_type->sat_atype.at_oid;
   1221 	strLen = strlen ( peek_head );
   1222 
   1223 	result->value.octs = (char*)EncodeComponentOid ( mem_op, peek_head , &strLen );
   1224 	result->value.octetLen = strLen;
   1225 	return LDAP_SUCCESS;
   1226 }
   1227 
   1228 int
   1229 IsNumericOid ( char* peek_head , int strLen ) {
   1230 	int i;
   1231 	int num_dot;
   1232 	for ( i = 0, num_dot = 0 ; i < strLen ; i++ ) {
   1233 		if ( peek_head[i] == '.' ) num_dot++;
   1234 		else if ( peek_head[i] > '9' || peek_head[i] < '0' )
   1235 			return (-1);
   1236 	}
   1237 	if ( num_dot )
   1238 		return (1);
   1239 	else
   1240 		return (-1);
   1241 }
   1242 
   1243 int
   1244 GDecComponentOid ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1245 {
   1246         char* peek_head;
   1247         int i, strLen, rc;
   1248         void* component_values;
   1249         ComponentOid* k, **k2;
   1250 	GAsnOid result;
   1251 
   1252         k = (ComponentOid*) v;
   1253 
   1254         if ( mode & DEC_ALLOC_MODE_0 ) {
   1255                 k2 = (ComponentOid**) v;
   1256                 *k2 = (ComponentOid*) CompAlloc( mem_op, sizeof( ComponentOid ) );
   1257 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1258                 k = *k2;
   1259         }
   1260 
   1261 	strLen = LocateNextGSERToken ( mem_op, b, &peek_head, GSER_PEEK );
   1262 	if ( IsNumericOid ( peek_head , strLen ) >= 1 ) {
   1263 		/* numeric-oid */
   1264 		if ( GDecAsnOidContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
   1265 			if ( k ) CompFree ( mem_op, k );
   1266 			return LDAP_DECODING_ERROR;
   1267 		}
   1268 	}
   1269 	else {
   1270 		/*descr*/
   1271 		if ( GDecAsnDescOidContent ( mem_op, b, &result, bytesDecoded ) < 0 ){
   1272 			if ( k ) CompFree ( mem_op, k );
   1273 			return LDAP_DECODING_ERROR;
   1274 		}
   1275 	}
   1276 	k->value = result.value;
   1277 	k->comp_desc = get_component_description (BASICTYPE_OID);
   1278 
   1279 	return LDAP_SUCCESS;
   1280 }
   1281 
   1282 /*
   1283  * Component BER Decoder : OID
   1284  */
   1285 int
   1286 BDecComponentOidTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1287 	return BDecComponentOid ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1288 }
   1289 
   1290 int
   1291 BDecComponentOid ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v,
   1292 			AsnLen *bytesDecoded, int mode )
   1293 {
   1294         char* peek_head;
   1295         int i, strLen, rc;
   1296         void* component_values;
   1297         ComponentOid* k, **k2;
   1298 	AsnOid result;
   1299 
   1300         k = (ComponentOid*) v;
   1301 
   1302         if ( mode & DEC_ALLOC_MODE_0 ) {
   1303                 k2 = (ComponentOid**) v;
   1304                 *k2 = (ComponentOid*) CompAlloc( mem_op, sizeof( ComponentOid ) );
   1305 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1306                 k = *k2;
   1307         }
   1308 
   1309 	if ( mode & CALL_TAG_DECODER ){
   1310 		mode = mode & CALL_CONTENT_DECODER;
   1311 		rc = BDecAsnOid ( mem_op, b, &result, bytesDecoded );
   1312 	} else {
   1313 		rc = BDecAsnOidContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1314 	}
   1315 	if ( rc < 0 ) {
   1316 		if ( k ) CompFree ( mem_op, k );
   1317 		return LDAP_DECODING_ERROR;
   1318 	}
   1319 	k->value = result;
   1320 
   1321 	k->comp_desc = get_component_description (BASICTYPE_OID);
   1322 
   1323 	return LDAP_SUCCESS;
   1324 }
   1325 
   1326 /*
   1327  * Component BER Decoder : PrintiableString
   1328  */
   1329 
   1330 int
   1331 BDecComponentPrintableStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1332 {
   1333 	return BDecComponentPrintableString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1334 }
   1335 
   1336 int
   1337 BDecComponentPrintableString( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1338 {
   1339         char* peek_head;
   1340         int i, strLen, rc;
   1341         void* component_values;
   1342         ComponentPrintableString* k, **k2;
   1343 	AsnOid result;
   1344 
   1345         k = (ComponentPrintableString*) v;
   1346 
   1347         if ( mode & DEC_ALLOC_MODE_0 ) {
   1348                 k2 = (ComponentPrintableString**) v;
   1349                 *k2 = (ComponentPrintableString*) CompAlloc( mem_op, sizeof( ComponentPrintableString ) );
   1350 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1351                 k = *k2;
   1352         }
   1353 
   1354 	if ( mode & CALL_TAG_DECODER ) {
   1355 		mode = mode & CALL_CONTENT_DECODER;
   1356 		rc = BDecPrintableString ( mem_op, b, &result, bytesDecoded );
   1357 	} else {
   1358 		rc = BDecPrintableStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1359 	}
   1360 	if ( rc < 0 ) {
   1361 		if ( k ) CompFree ( mem_op, k );
   1362 		return LDAP_DECODING_ERROR;
   1363 	}
   1364 	k->value = result;
   1365 
   1366 	k->comp_desc = get_component_description (BASICTYPE_PRINTABLE_STR);
   1367 
   1368 	return LDAP_SUCCESS;
   1369 }
   1370 
   1371 /*
   1372  * Component BER Decoder : TeletexString
   1373  */
   1374 
   1375 int
   1376 BDecComponentTeletexStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1377 {
   1378 	return BDecComponentTeletexString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1379 }
   1380 
   1381 int
   1382 BDecComponentTeletexString( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1383 {
   1384         char* peek_head;
   1385         int i, strLen, rc;
   1386         void* component_values;
   1387         ComponentTeletexString* k, **k2;
   1388 	AsnOid result;
   1389 
   1390         k = (ComponentTeletexString*) v;
   1391 
   1392         if ( mode & DEC_ALLOC_MODE_0 ) {
   1393                 k2 = (ComponentTeletexString**) v;
   1394                 *k2 = (ComponentTeletexString*) CompAlloc( mem_op, sizeof( ComponentTeletexString ) );
   1395 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1396                 k = *k2;
   1397         }
   1398 
   1399 	if ( mode & CALL_TAG_DECODER ) {
   1400 		mode = mode & CALL_CONTENT_DECODER;
   1401 		rc = BDecTeletexString ( mem_op, b, &result, bytesDecoded );
   1402 	} else {
   1403 		rc = BDecTeletexStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1404 	}
   1405 	if ( rc < 0 ) {
   1406 		if ( k ) CompFree ( mem_op, k );
   1407 		return LDAP_DECODING_ERROR;
   1408 	}
   1409 	k->value = result;
   1410 
   1411 	k->comp_desc = get_component_description (BASICTYPE_T61_STR);
   1412 
   1413 	return LDAP_SUCCESS;
   1414 }
   1415 
   1416 
   1417 /*
   1418  * Matching function : Real
   1419  */
   1420 int
   1421 MatchingComponentReal (char* oid, ComponentSyntaxInfo *csi_attr,
   1422 			ComponentSyntaxInfo *csi_assert )
   1423 {
   1424         int rc;
   1425         MatchingRule* mr;
   1426         ComponentReal *a, *b;
   1427 
   1428         if( oid ) {
   1429                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
   1430                 if ( mr )
   1431                         return component_value_match( mr, csi_attr , csi_assert );
   1432         }
   1433         a = (ComponentReal*)csi_attr;
   1434         b = (ComponentReal*)csi_assert;
   1435         rc = (a->value == b->value);
   1436 
   1437         return rc ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
   1438 }
   1439 
   1440 /*
   1441  * GSER Encoder : Real
   1442  */
   1443 int
   1444 GEncComponentReal ( GenBuf *b, ComponentReal *in )
   1445 {
   1446 	GAsnReal t = {0};
   1447 	if ( !in )
   1448 		return (-1);
   1449 	t.value = in->value;
   1450 	return GEncAsnRealContent ( b, &t );
   1451 }
   1452 
   1453 /*
   1454  * GSER Decoder : Real
   1455  */
   1456 int
   1457 GDecComponentReal ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1458 {
   1459         char* peek_head;
   1460         int i, strLen;
   1461         void* component_values;
   1462         ComponentReal* k, **k2;
   1463 	GAsnReal result;
   1464 
   1465         k = (ComponentReal*) v;
   1466 
   1467         if ( mode & DEC_ALLOC_MODE_0 ) {
   1468                 k2 = (ComponentReal**) v;
   1469                 *k2 = (ComponentReal*) CompAlloc( mem_op, sizeof( ComponentReal ) );
   1470 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1471                 k = *k2;
   1472         }
   1473 
   1474 	if ( GDecAsnRealContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
   1475 		if ( k ) CompFree ( mem_op, k );
   1476 		return LDAP_DECODING_ERROR;
   1477 	}
   1478 	k->value = result.value;
   1479 	k->comp_desc = get_component_description (BASICTYPE_REAL);
   1480 
   1481         return LDAP_SUCCESS;
   1482 }
   1483 
   1484 /*
   1485  * Component BER Decoder : Real
   1486  */
   1487 int
   1488 BDecComponentRealTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1489 	return BDecComponentReal ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1490 }
   1491 
   1492 int
   1493 BDecComponentReal ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1494 {
   1495         char* peek_head;
   1496         int i, strLen, rc;
   1497         void* component_values;
   1498         ComponentReal* k, **k2;
   1499 	AsnReal result;
   1500 
   1501         k = (ComponentReal*) v;
   1502 
   1503         if ( mode & DEC_ALLOC_MODE_0 ) {
   1504                 k2 = (ComponentReal**) v;
   1505                 *k2 = (ComponentReal*) CompAlloc( mem_op, sizeof( ComponentReal ) );
   1506 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1507                 k = *k2;
   1508         }
   1509 
   1510 	if ( mode & CALL_TAG_DECODER ){
   1511 		mode = mode & CALL_CONTENT_DECODER;
   1512 		rc = BDecAsnReal ( mem_op, b, &result, bytesDecoded );
   1513 	} else {
   1514 		rc = BDecAsnRealContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1515 	}
   1516 	if ( rc < 0 ) {
   1517 		if ( k ) CompFree ( mem_op, k );
   1518 		return LDAP_DECODING_ERROR;
   1519 	}
   1520 	k->value = result;
   1521 	k->comp_desc = get_component_description (BASICTYPE_REAL);
   1522 
   1523         return LDAP_SUCCESS;
   1524 }
   1525 
   1526 /*
   1527  * Matching function : Relative OID
   1528  */
   1529 int
   1530 MatchingComponentRelativeOid ( char* oid, ComponentSyntaxInfo *csi_attr,
   1531 					ComponentSyntaxInfo *csi_assert )
   1532 {
   1533         int rc;
   1534         MatchingRule* mr;
   1535         ComponentRelativeOid *a, *b;
   1536 
   1537         if( oid ) {
   1538                 mr = retrieve_matching_rule(oid, csi_attr->csi_comp_desc->cd_type_id );
   1539                 if ( mr )
   1540                         return component_value_match( mr, csi_attr , csi_assert );
   1541         }
   1542 
   1543         a = (ComponentRelativeOid*)csi_attr;
   1544         b = (ComponentRelativeOid*)csi_assert;
   1545 
   1546 	if ( a->value.octetLen != b->value.octetLen )
   1547 		return LDAP_COMPARE_FALSE;
   1548         rc = ( strncmp( a->value.octs, b->value.octs, a->value.octetLen ) == 0 );
   1549 
   1550         return rc ? LDAP_COMPARE_TRUE:LDAP_COMPARE_FALSE;
   1551 }
   1552 
   1553 /*
   1554  * GSER Encoder : RELATIVE_OID.
   1555  */
   1556 int
   1557 GEncComponentRelativeOid ( GenBuf *b, ComponentRelativeOid *in )
   1558 {
   1559 	GAsnRelativeOid t = {0};
   1560 
   1561 	if ( !in || in->value.octetLen <= 0 )
   1562 		return (-1);
   1563 	t.value = in->value;
   1564 	return GEncAsnRelativeOidContent ( b , (GAsnOcts*)&t );
   1565 }
   1566 
   1567 /*
   1568  * GSER Decoder : RELATIVE_OID.
   1569  */
   1570 int
   1571 GDecComponentRelativeOid ( void* mem_op, GenBuf *b,void *v, AsnLen *bytesDecoded, int mode )
   1572 {
   1573         char* peek_head;
   1574         int i, strLen;
   1575         void* component_values;
   1576         ComponentRelativeOid* k, **k2;
   1577 	GAsnRelativeOid result;
   1578 
   1579         k = (ComponentRelativeOid*) v;
   1580 
   1581         if ( mode & DEC_ALLOC_MODE_0 ) {
   1582                 k2 = (ComponentRelativeOid**) v;
   1583                 *k2 = (ComponentRelativeOid*) CompAlloc( mem_op, sizeof( ComponentRelativeOid ) );
   1584 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1585                 k = *k2;
   1586         }
   1587 
   1588 	if ( GDecAsnRelativeOidContent ( mem_op, b, &result, bytesDecoded ) < 0 ) {
   1589 		if ( k ) CompFree ( mem_op, k );
   1590 		return LDAP_DECODING_ERROR;
   1591 	}
   1592 	k->value = result.value;
   1593 	k->comp_desc = get_component_description (BASICTYPE_OID);
   1594 
   1595 	return LDAP_SUCCESS;
   1596 }
   1597 
   1598 /*
   1599  * Component BER Decoder : RELATIVE_OID.
   1600  */
   1601 int
   1602 BDecComponentRelativeOidTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1603 	return BDecComponentRelativeOid ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1604 }
   1605 
   1606 int
   1607 BDecComponentRelativeOid ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1608 {
   1609         char* peek_head;
   1610         int i, strLen, rc;
   1611         void* component_values;
   1612         ComponentRelativeOid* k, **k2;
   1613 	AsnRelativeOid result;
   1614 
   1615         k = (ComponentRelativeOid*) v;
   1616 
   1617         if ( mode & DEC_ALLOC_MODE_0 ) {
   1618                 k2 = (ComponentRelativeOid**) v;
   1619                 *k2 = (ComponentRelativeOid*) CompAlloc( mem_op, sizeof( ComponentRelativeOid ) );
   1620 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1621                 k = *k2;
   1622         }
   1623 
   1624 	if ( mode & CALL_TAG_DECODER ){
   1625 		mode = mode & CALL_CONTENT_DECODER;
   1626 		rc = BDecAsnRelativeOid ( mem_op, b, &result, bytesDecoded );
   1627 	} else {
   1628 		rc = BDecAsnRelativeOidContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1629 	}
   1630 	if ( rc < 0 ) {
   1631 		if ( k ) CompFree ( mem_op, k );
   1632 		return LDAP_DECODING_ERROR;
   1633 	}
   1634 	k->value = result;
   1635 	k->comp_desc = get_component_description (BASICTYPE_OID);
   1636 
   1637 	return LDAP_SUCCESS;
   1638 }
   1639 
   1640 /*
   1641  * GSER Encoder : UniversalString
   1642  */
   1643 int
   1644 GEncComponentUniversalString ( GenBuf *b, ComponentUniversalString *in )
   1645 {
   1646 	GUniversalString t = {0};
   1647 	if ( !in || in->value.octetLen <= 0 )
   1648 		return (-1);
   1649 	t.value = in->value;
   1650 	return GEncUniversalStringContent( b, &t );
   1651 }
   1652 
   1653 /*
   1654  * GSER Decoder : UniversalString
   1655  */
   1656 static int
   1657 UTF8toUniversalString( char* octs, int len){
   1658 	/* Need to be Implemented */
   1659 	return LDAP_SUCCESS;
   1660 }
   1661 
   1662 int
   1663 GDecComponentUniversalString ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode )
   1664 {
   1665 	if ( GDecComponentUTF8String ( mem_op, b, v, bytesDecoded, mode) < 0 )
   1666 	UTF8toUniversalString( ((ComponentUniversalString*)v)->value.octs, ((ComponentUniversalString*)v)->value.octetLen );
   1667 		return LDAP_DECODING_ERROR;
   1668 }
   1669 
   1670 /*
   1671  * Component BER Decoder : UniverseString
   1672  */
   1673 int
   1674 BDecComponentUniversalStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1675 	return BDecComponentUniversalString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1676 }
   1677 
   1678 int
   1679 BDecComponentUniversalString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1680 {
   1681         char* peek_head;
   1682         int i, strLen, rc;
   1683         void* component_values;
   1684         ComponentUniversalString* k, **k2;
   1685 	UniversalString result;
   1686 
   1687         k = (ComponentUniversalString*) v;
   1688 
   1689         if ( mode & DEC_ALLOC_MODE_0 ) {
   1690                 k2 = (ComponentUniversalString**) v;
   1691                 *k2 = (ComponentUniversalString*) CompAlloc( mem_op, sizeof( ComponentUniversalString ) );
   1692 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1693                 k = *k2;
   1694         }
   1695 
   1696 	if ( mode & CALL_TAG_DECODER ){
   1697 		mode = mode & CALL_CONTENT_DECODER;
   1698 		rc = BDecUniversalString ( mem_op, b, &result, bytesDecoded );
   1699 	} else {
   1700 		rc = BDecUniversalStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1701 	}
   1702 	if ( rc < 0 ) {
   1703 		if ( k ) CompFree ( mem_op, k );
   1704 		return LDAP_DECODING_ERROR;
   1705 	}
   1706 	k->value = result;
   1707 	k->comp_desc = get_component_description (BASICTYPE_UNIVERSAL_STR);
   1708 
   1709 	return LDAP_SUCCESS;
   1710 }
   1711 
   1712 /*
   1713  * Component BER Decoder : VisibleString
   1714  */
   1715 int
   1716 BDecComponentVisibleStringTag ( void* mem_op, GenBuf *b, void *v, AsnLen *bytesDecoded, int mode ) {
   1717 	return BDecComponentVisibleString ( mem_op, b, 0, 0, v, bytesDecoded, mode|CALL_TAG_DECODER );
   1718 }
   1719 
   1720 int
   1721 BDecComponentVisibleString ( void* mem_op, GenBuf *b, AsnTag tagId, AsnLen len, void *v, AsnLen *bytesDecoded, int mode )
   1722 {
   1723         char* peek_head;
   1724         int i, strLen, rc;
   1725         void* component_values;
   1726         ComponentVisibleString* k, **k2;
   1727 	VisibleString result;
   1728 
   1729         k = (ComponentVisibleString*) v;
   1730 
   1731         if ( mode & DEC_ALLOC_MODE_0 ) {
   1732                 k2 = (ComponentVisibleString**) v;
   1733                 *k2 = (ComponentVisibleString*) CompAlloc( mem_op, sizeof( ComponentVisibleString ) );
   1734 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1735                 k = *k2;
   1736         }
   1737 
   1738 	if ( mode & CALL_TAG_DECODER ){
   1739 		mode = mode & CALL_CONTENT_DECODER;
   1740 		rc = BDecVisibleString ( mem_op, b, &result, bytesDecoded );
   1741 	} else {
   1742 		rc = BDecVisibleStringContent ( mem_op, b, tagId, len, &result, bytesDecoded );
   1743 	}
   1744 	k->value = result;
   1745 	k->comp_desc = get_component_description (BASICTYPE_VISIBLE_STR);
   1746 
   1747 	return LDAP_SUCCESS;
   1748 }
   1749 
   1750 /*
   1751  * Routines for handling an ANY DEFINED Type
   1752  */
   1753 
   1754 /* Check if the <select> type CR and the OID of the given ANY type */
   1755 int
   1756 CheckSelectTypeCorrect ( void* mem_op, ComponentAnyInfo* cai, struct berval* select ) {
   1757 	int strLen;
   1758 	AttributeType* ad_type;
   1759 	char* oid;
   1760 	char* result;
   1761 
   1762 	if ( IsNumericOid ( select->bv_val , select->bv_len ) ) {
   1763 		oid = select->bv_val;
   1764 		strLen = select->bv_len;
   1765 	} else {
   1766 		ad_type = at_bvfind( select );
   1767 
   1768 		if ( !ad_type )
   1769 			return LDAP_DECODING_ERROR;
   1770 
   1771 		oid = ad_type->sat_atype.at_oid;
   1772 		strLen = strlen ( oid );
   1773 	}
   1774 	result = EncodeComponentOid ( mem_op, oid , &strLen );
   1775 	if ( !result || strLen <= 0 ) return (-1);
   1776 
   1777 	if ( cai->oid.octetLen == strLen &&
   1778 		strncmp ( cai->oid.octs, result, strLen ) == 0 )
   1779 		return (1);
   1780 	else
   1781 		return (-1);
   1782 }
   1783 
   1784 int
   1785 SetAnyTypeByComponentOid ( ComponentAny *v, ComponentOid *id ) {
   1786 	Hash hash;
   1787 	void *anyInfo;
   1788 
   1789 	/* use encoded oid as hash string */
   1790 	hash = MakeHash (id->value.octs, id->value.octetLen);
   1791 	if (CheckForAndReturnValue (anyOidHashTblG, hash, &anyInfo))
   1792 		v->cai = (ComponentAnyInfo*) anyInfo;
   1793 	else
   1794 		v->cai = NULL;
   1795 
   1796 	if ( !v->cai ) {
   1797 	/*
   1798 	 * If not found, the data considered as octet chunk
   1799 	 * Yet-to-be-Implemented
   1800 	 */
   1801 	}
   1802 	return LDAP_SUCCESS;
   1803 }
   1804 
   1805 void
   1806 SetAnyTypeByComponentInt( ComponentAny *v, ComponentInt id) {
   1807 	Hash hash;
   1808 	void *anyInfo;
   1809 
   1810 	hash = MakeHash ((char*)&id, sizeof (id));
   1811 	if (CheckForAndReturnValue (anyIntHashTblG, hash, &anyInfo))
   1812 		v->cai = (ComponentAnyInfo*) anyInfo;
   1813 	else
   1814 		v->cai = NULL;
   1815 }
   1816 
   1817 int
   1818 GEncComponentAny ( GenBuf *b, ComponentAny *in )
   1819 {
   1820 	if ( in->cai != NULL  && in->cai->Encode != NULL )
   1821 		return in->cai->Encode(b, &in->value );
   1822 	else
   1823 		return (-1);
   1824 }
   1825 
   1826 int
   1827 BEncComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode)
   1828 {
   1829         ComponentAny *k, **k2;
   1830 
   1831         k = (ComponentAny*) result;
   1832 
   1833 	if ( !k ) return (-1);
   1834 
   1835         if ( mode & DEC_ALLOC_MODE_0 ) {
   1836                 k2 = (ComponentAny**) result;
   1837                 *k2 = (ComponentAny*) CompAlloc( mem_op, sizeof( ComponentAny ) );
   1838 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1839                 k = *k2;
   1840         }
   1841 
   1842 	if ((result->cai != NULL) && (result->cai->BER_Decode != NULL)) {
   1843 		result->value = (void*) CompAlloc ( mem_op, result->cai->size );
   1844 		if ( !result->value ) return 0;
   1845 		result->cai->BER_Decode ( mem_op, b, result->value, (int*)bytesDecoded, DEC_ALLOC_MODE_1);
   1846 
   1847 		k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
   1848 		if ( !k->comp_desc )  {
   1849 			if ( k ) CompFree ( mem_op, k );
   1850 			return LDAP_DECODING_ERROR;
   1851 		}
   1852 		k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
   1853 		k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
   1854 		k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
   1855 		k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
   1856 		k->comp_desc->cd_extract_i = NULL;
   1857 		k->comp_desc->cd_type = ASN_BASIC;
   1858 		k->comp_desc->cd_type_id = BASICTYPE_ANY;
   1859 		k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAny;
   1860 		return LDAP_SUCCESS;
   1861 	}
   1862 	else {
   1863 		Asn1Error ("ERROR - Component ANY Decode routine is NULL\n");
   1864 		return 0;
   1865 	}
   1866 }
   1867 
   1868 int
   1869 BDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode) {
   1870 	int rc;
   1871         ComponentAny *k, **k2;
   1872 
   1873         k = (ComponentAny*) result;
   1874 
   1875 	if ( !k ) return (-1);
   1876 
   1877         if ( mode & DEC_ALLOC_MODE_0 ) {
   1878                 k2 = (ComponentAny**) result;
   1879                 *k2 = (ComponentAny*) CompAlloc( mem_op, sizeof( ComponentAny ) );
   1880 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1881                 k = *k2;
   1882         }
   1883 
   1884 	if ((result->cai != NULL) && (result->cai->BER_Decode != NULL)) {
   1885 		result->cai->BER_Decode ( mem_op, b, (ComponentSyntaxInfo*)&result->value, (int*)bytesDecoded, DEC_ALLOC_MODE_0 );
   1886 
   1887 		k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
   1888 		if ( !k->comp_desc )  {
   1889 			if ( k ) CompFree ( mem_op, k );
   1890 			return LDAP_DECODING_ERROR;
   1891 		}
   1892 		k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
   1893 		k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
   1894 		k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
   1895 		k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
   1896 		k->comp_desc->cd_extract_i = NULL;
   1897 		k->comp_desc->cd_type = ASN_BASIC;
   1898 		k->comp_desc->cd_type_id = BASICTYPE_ANY;
   1899 		k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAny;
   1900 		return LDAP_SUCCESS;
   1901 	}
   1902 	else {
   1903 		Asn1Error ("ERROR - Component ANY Decode routine is NULL\n");
   1904 		return 0;
   1905 	}
   1906 }
   1907 
   1908 int
   1909 GDecComponentAny ( void* mem_op, GenBuf *b, ComponentAny *result, AsnLen *bytesDecoded, int mode) {
   1910         ComponentAny *k, **k2;
   1911 
   1912         k = (ComponentAny*) result;
   1913 
   1914         if ( mode & DEC_ALLOC_MODE_0 ) {
   1915                 k2 = (ComponentAny**) result;
   1916                 *k2 = (ComponentAny*) CompAlloc( mem_op, sizeof( ComponentAny ) );
   1917 		if ( !*k2 ) return LDAP_DECODING_ERROR;
   1918                 k = *k2;
   1919         }
   1920 	if ((result->cai != NULL) && (result->cai->GSER_Decode != NULL)) {
   1921 		result->value = (void*) CompAlloc ( mem_op, result->cai->size );
   1922 		if ( !result->value ) return 0;
   1923 		result->cai->GSER_Decode ( mem_op, b, result->value, (int*)bytesDecoded, DEC_ALLOC_MODE_1);
   1924 		k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
   1925 		if ( !k->comp_desc )  {
   1926 			if ( k ) CompFree ( mem_op, k );
   1927 			return LDAP_DECODING_ERROR;
   1928 		}
   1929 		k->comp_desc->cd_gser_encoder = (encoder_func*)GEncComponentAny;
   1930 		k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAny;
   1931 		k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAny;
   1932 		k->comp_desc->cd_free = (comp_free_func*)FreeComponentAny;
   1933 		k->comp_desc->cd_type = ASN_BASIC;
   1934 		k->comp_desc->cd_extract_i = NULL;
   1935 		k->comp_desc->cd_type_id = BASICTYPE_ANY;
   1936 		k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAny;
   1937 		return LDAP_SUCCESS;
   1938 	}
   1939 	else {
   1940 		Asn1Error ("ERROR - ANY Decode routine is NULL\n");
   1941 		return 0;
   1942 	}
   1943 }
   1944 
   1945 int
   1946 MatchingComponentAny (char* oid, ComponentAny *result, ComponentAny *result2) {
   1947 	void *comp1, *comp2;
   1948 
   1949 	if ( result->comp_desc->cd_type_id == BASICTYPE_ANY )
   1950 		comp1 = result->value;
   1951 	else
   1952 		comp1 = result;
   1953 
   1954 	if ( result2->comp_desc->cd_type_id == BASICTYPE_ANY )
   1955 		comp2 = result2->value;
   1956 	else
   1957 		comp2 = result2;
   1958 
   1959 	if ((result->cai != NULL) && (result->cai->Match != NULL)) {
   1960 		if ( result->comp_desc->cd_type_id == BASICTYPE_ANY )
   1961 			return result->cai->Match(oid, comp1, comp2 );
   1962 		else if ( result2->comp_desc->cd_type_id == BASICTYPE_ANY )
   1963 			return result2->cai->Match(oid, comp1, comp2);
   1964 		else
   1965 			return LDAP_INVALID_SYNTAX;
   1966 	}
   1967 	else {
   1968 		Asn1Error ("ERROR - ANY Matching routine is NULL\n");
   1969 		return LDAP_INVALID_SYNTAX;
   1970 	}
   1971 }
   1972 
   1973 void*
   1974 ExtractingComponentAny ( void* mem_op, ComponentReference* cr,  ComponentAny *result ) {
   1975 	if ((result->cai != NULL) && (result->cai->Extract != NULL)) {
   1976 		return (void*) result->cai->Extract( mem_op, cr , result->value );
   1977 	}
   1978 	else {
   1979 		Asn1Error ("ERROR - ANY Extracting routine is NULL\n");
   1980 		return (void*)NULL;
   1981 	}
   1982 }
   1983 
   1984 void
   1985 FreeComponentAny (ComponentAny* any) {
   1986 	if ( any->cai != NULL && any->cai->Free != NULL ) {
   1987 		any->cai->Free( any->value );
   1988 		free ( ((ComponentSyntaxInfo*)any->value)->csi_comp_desc );
   1989 		free ( any->value );
   1990 	}
   1991 	else
   1992 		Asn1Error ("ERROR - ANY Free routine is NULL\n");
   1993 }
   1994 
   1995 void
   1996 InstallAnyByComponentInt (int anyId, ComponentInt intId, unsigned int size,
   1997 			EncodeFcn encode, gser_decoder_func* G_decode,
   1998 			ber_tag_decoder_func* B_decode, ExtractFcn extract,
   1999 			MatchFcn match, FreeFcn free,
   2000 			PrintFcn print)
   2001 {
   2002 	ComponentAnyInfo *a;
   2003 	Hash h;
   2004 
   2005 	a = (ComponentAnyInfo*) malloc(sizeof (ComponentAnyInfo));
   2006 	a->anyId = anyId;
   2007 	a->oid.octs = NULL;
   2008 	a->oid.octetLen = 0;
   2009 	a->intId = intId;
   2010 	a->size = size;
   2011 	a->Encode = encode;
   2012 	a->GSER_Decode = G_decode;
   2013 	a->BER_Decode = B_decode;
   2014 	a->Match = match;
   2015 	a->Extract = extract;
   2016 	a->Free = free;
   2017 	a->Print = print;
   2018 
   2019 	if (anyIntHashTblG == NULL)
   2020 		anyIntHashTblG = InitHash();
   2021 
   2022 	h = MakeHash ((char*)&intId, sizeof (intId));
   2023 
   2024 	if(anyIntHashTblG != NULL)
   2025 		Insert(anyIntHashTblG, a, h);
   2026 }
   2027 
   2028 
   2029 /*
   2030  * OID and its corresponding decoder can be registerd with this func.
   2031  * If contained types constrained by <select> are used,
   2032  * their OID and decoder MUST be registered, otherwise it will return no entry.
   2033  * An open type(ANY type) also need be registered.
   2034  */
   2035 void
   2036 InstallOidDecoderMapping ( char* ch_oid, EncodeFcn encode, gser_decoder_func* G_decode, ber_tag_decoder_func* B_decode, ExtractFcn extract, MatchFcn match ) {
   2037 	AsnOid oid;
   2038 	int strLen;
   2039 	void* mem_op;
   2040 
   2041 	strLen = strlen( ch_oid );
   2042 	if( strLen <= 0 ) return;
   2043 	mem_op = comp_nibble_memory_allocator ( 128, 16 );
   2044 	oid.octs = EncodeComponentOid ( mem_op, ch_oid, &strLen );
   2045 	oid.octetLen = strLen;
   2046 	if( strLen <= 0 ) return;
   2047 
   2048 
   2049 	InstallAnyByComponentOid ( 0, &oid, 0, encode, G_decode, B_decode,
   2050 						extract, match, NULL, NULL);
   2051 	comp_nibble_memory_free(mem_op);
   2052 }
   2053 
   2054 /*
   2055  * Look up Oid-decoder mapping table by berval have either
   2056  * oid or description
   2057  */
   2058 OidDecoderMapping*
   2059 RetrieveOidDecoderMappingbyBV( struct berval* in ) {
   2060 	if ( IsNumericOid ( in->bv_val, in->bv_len ) )
   2061 		return RetrieveOidDecoderMappingbyOid( in->bv_val, in->bv_len );
   2062 	else
   2063 		return RetrieveOidDecoderMappingbyDesc( in->bv_val, in->bv_len );
   2064 }
   2065 
   2066 /*
   2067  * Look up Oid-decoder mapping table by dotted OID
   2068  */
   2069 OidDecoderMapping*
   2070 RetrieveOidDecoderMappingbyOid( char* ch_oid, int oid_len ) {
   2071 	Hash hash;
   2072 	void *anyInfo;
   2073 	AsnOid oid;
   2074 	int strLen;
   2075 	void* mem_op;
   2076 
   2077 	mem_op = comp_nibble_memory_allocator ( 128, 16 );
   2078 	oid.octs = EncodeComponentOid ( mem_op, ch_oid, &oid_len);
   2079 	oid.octetLen = oid_len;
   2080 	if( oid_len <= 0 ) {
   2081 		comp_nibble_memory_free( mem_op );
   2082 		return NULL;
   2083 	}
   2084 
   2085 	/* use encoded oid as hash string */
   2086 	hash = MakeHash ( oid.octs, oid.octetLen);
   2087 	comp_nibble_memory_free( mem_op );
   2088 	if (CheckForAndReturnValue (anyOidHashTblG, hash, &anyInfo))
   2089 		return (OidDecoderMapping*) anyInfo;
   2090 	else
   2091 		return (OidDecoderMapping*) NULL;
   2092 
   2093 }
   2094 
   2095 /*
   2096  * Look up Oid-decoder mapping table by description
   2097  */
   2098 OidDecoderMapping*
   2099 RetrieveOidDecoderMappingbyDesc( char* desc, int desc_len ) {
   2100 	Hash hash;
   2101 	void *anyInfo;
   2102 	AsnOid oid;
   2103 	AttributeType* ad_type;
   2104 	struct berval bv;
   2105 	void* mem_op;
   2106 
   2107 	bv.bv_val = desc;
   2108 	bv.bv_len = desc_len;
   2109 	ad_type = at_bvfind( &bv );
   2110 
   2111 	oid.octs = ad_type->sat_atype.at_oid;
   2112 	oid.octetLen = strlen ( oid.octs );
   2113 
   2114 	if ( !ad_type )
   2115 		return (OidDecoderMapping*) NULL;
   2116 
   2117 	mem_op = comp_nibble_memory_allocator ( 128, 16 );
   2118 
   2119 	oid.octs = EncodeComponentOid ( mem_op, oid.octs , (int*)&oid.octetLen );
   2120 	if( oid.octetLen <= 0 ) {
   2121 		comp_nibble_memory_free( mem_op );
   2122 		return (OidDecoderMapping*) NULL;
   2123 	}
   2124 
   2125 	/* use encoded oid as hash string */
   2126 	hash = MakeHash ( oid.octs, oid.octetLen);
   2127 	comp_nibble_memory_free( mem_op );
   2128 	if (CheckForAndReturnValue (anyOidHashTblG, hash, &anyInfo))
   2129 		return (OidDecoderMapping*) anyInfo;
   2130 	else
   2131 		return (OidDecoderMapping*) NULL;
   2132 
   2133 }
   2134 void
   2135 InstallAnyByComponentOid (int anyId, AsnOid *oid, unsigned int size,
   2136 			EncodeFcn encode, gser_decoder_func* G_decode,
   2137 			ber_tag_decoder_func* B_decode, ExtractFcn extract,
   2138 			 MatchFcn match, FreeFcn free, PrintFcn print)
   2139 {
   2140 	ComponentAnyInfo *a;
   2141 	Hash h;
   2142 
   2143 	a = (ComponentAnyInfo*) malloc (sizeof (ComponentAnyInfo));
   2144 	a->anyId = anyId;
   2145 	if ( oid ) {
   2146 		a->oid.octs = malloc( oid->octetLen );
   2147 		memcpy ( a->oid.octs, oid->octs, oid->octetLen );
   2148 		a->oid.octetLen = oid->octetLen;
   2149 	}
   2150 	a->size = size;
   2151 	a->Encode = encode;
   2152 	a->GSER_Decode = G_decode;
   2153 	a->BER_Decode = B_decode;
   2154 	a->Match = match;
   2155 	a->Extract = extract;
   2156 	a->Free = free;
   2157 	a->Print = print;
   2158 
   2159 	h = MakeHash (oid->octs, oid->octetLen);
   2160 
   2161 	if (anyOidHashTblG == NULL)
   2162 		anyOidHashTblG = InitHash();
   2163 
   2164 	if(anyOidHashTblG != NULL)
   2165 		Insert(anyOidHashTblG, a, h);
   2166 }
   2167 
   2168 int
   2169 BDecComponentTop  (
   2170 ber_decoder_func *decoder _AND_
   2171 void* mem_op _AND_
   2172 GenBuf *b _AND_
   2173 AsnTag tag _AND_
   2174 AsnLen elmtLen _AND_
   2175 void **v _AND_
   2176 AsnLen *bytesDecoded _AND_
   2177 int mode) {
   2178 	tag = BDecTag ( b, bytesDecoded );
   2179 	elmtLen = BDecLen ( b, bytesDecoded );
   2180 	if ( elmtLen <= 0 ) return (-1);
   2181 	if ( tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE) ) {
   2182 		return (-1);
   2183 	}
   2184 
   2185 	return (*decoder)( mem_op, b, tag, elmtLen, (ComponentSyntaxInfo*)v,(int*)bytesDecoded, mode );
   2186 }
   2187 
   2188 /*
   2189  * ASN.1 specification of a distinguished name
   2190  * DistinguishedName ::= RDNSequence
   2191  * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
   2192  * RelativeDistinguishedName ::= SET SIZE(1..MAX) OF AttributeTypeandValue
   2193  * AttributeTypeandValue ::= SEQUENCE {
   2194  * 	type	AttributeType
   2195  *	value	AttributeValue
   2196  * }
   2197  * When dnMatch/rdnMatch is used in a component assertion value
   2198  * the component in DistinguishedName/RelativeDistinguishedName
   2199  * need to be converted to the LDAP encodings in RFC2253
   2200  * in order to be matched against the assertion value
   2201  * If allComponentMatch is used, the assertion value may be
   2202  * decoded into the Internal Representation(Component Tree)
   2203  * by the corresponding GSER or BER decoder
   2204  * Following routine converts a component tree(DistinguishedName) into
   2205  * LDAP encodings in RFC2253
   2206  * Example)
   2207  * IR : ComponentRDNSequence
   2208  * GSER : { { type cn, value sang },{ type o, value ibm}, {type c, value us} }
   2209  * LDAP Encodings : cn=sang,o=ibm,c=us
   2210  */
   2211 
   2212 increment_bv_mem_by_size ( struct berval* in, int size ) {
   2213 	int new_size = in->bv_len + size;
   2214 	in->bv_val = realloc( in->bv_val, new_size );
   2215 	in->bv_len = new_size;
   2216 }
   2217 
   2218 int
   2219 ConvertBER2Desc( char* in, int size, struct berval* out, int* pos ) {
   2220 	int desc_size;
   2221 	char* desc_ptr;
   2222 	unsigned int firstArcNum;
   2223 	unsigned int arcNum;
   2224 	int i, rc, start_pos = *pos;
   2225 	char buf[MAX_OID_LEN];
   2226 	AttributeType *at;
   2227 	struct berval bv_name;
   2228 
   2229 	/*convert BER oid to desc*/
   2230 	for ( i = 0, arcNum = 0; (i < size) && (in[i] & 0x80 ); i++ )
   2231 		arcNum = (arcNum << 7) + (in[i] & 0x7f);
   2232 	arcNum = (arcNum << 7) + (in[i] & 0x7f);
   2233 	i++;
   2234 	firstArcNum = (unsigned short)(arcNum/40);
   2235 	if ( firstArcNum > 2 )
   2236 		firstArcNum = 2;
   2237 
   2238 	arcNum = arcNum - (firstArcNum * 40 );
   2239 
   2240 	rc = intToAscii ( arcNum, buf );
   2241 
   2242 	/*check if the buffer can store the first/second arc and two dots*/
   2243 	if ( out->bv_len < *pos + 2 + 1 + rc )
   2244 		increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2245 
   2246 	if ( firstArcNum == 1)
   2247 		out->bv_val[*pos] = '1';
   2248 	else
   2249 		out->bv_val[*pos] = '2';
   2250 	(*pos)++;
   2251 	out->bv_val[*pos] = '.';
   2252 	(*pos)++;
   2253 
   2254 	memcpy( out->bv_val + *pos, buf, rc );
   2255 	*pos += rc;
   2256 	out->bv_val[*pos] = '.';
   2257 	(*pos)++;
   2258 
   2259 	for ( ; i < size ; ) {
   2260 		for ( arcNum=0; (i < size) && (in[i] & 0x80) ; i++ )
   2261 			arcNum = (arcNum << 7) + (in[i] & 0x7f);
   2262 		arcNum = (arcNum << 7) + (in[i] & 0x7f);
   2263 		i++;
   2264 
   2265 		rc = intToAscii ( arcNum, buf );
   2266 
   2267 		if ( out->bv_len < *pos + rc + 1 )
   2268 			increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2269 
   2270 		memcpy( out->bv_val + *pos, buf, rc );
   2271 		*pos += rc;
   2272 		out->bv_val[*pos] = '.';
   2273 		(*pos)++;
   2274 	}
   2275 	(*pos)--;/*remove the last '.'*/
   2276 
   2277 	/*
   2278 	 * lookup OID database to locate desc
   2279 	 * then overwrite OID with desc in *out
   2280 	 * If failed to look up desc, OID form is used
   2281 	 */
   2282 	bv_name.bv_val = out->bv_val + start_pos;
   2283 	bv_name.bv_len = *pos - start_pos;
   2284 	at = at_bvfind( &bv_name );
   2285 	if ( !at )
   2286 		return LDAP_SUCCESS;
   2287 	desc_size = at->sat_cname.bv_len;
   2288 	memcpy( out->bv_val + start_pos, at->sat_cname.bv_val, desc_size );
   2289 	*pos = start_pos + desc_size;
   2290 	return LDAP_SUCCESS;
   2291 }
   2292 
   2293 int
   2294 ConvertComponentAttributeTypeAndValue2RFC2253 ( irAttributeTypeAndValue* in, struct berval* out, int *pos ) {
   2295 	int rc;
   2296 	int value_size = ((ComponentUTF8String*)in->value.value)->value.octetLen;
   2297 	char* value_ptr =  ((ComponentUTF8String*)in->value.value)->value.octs;
   2298 
   2299 	rc = ConvertBER2Desc( in->type.value.octs, in->type.value.octetLen, out, pos );
   2300 	if ( rc != LDAP_SUCCESS ) return rc;
   2301 	if ( out->bv_len < *pos + 1/*for '='*/  )
   2302 		increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2303 	/*Between type and value, put '='*/
   2304 	out->bv_val[*pos] = '=';
   2305 	(*pos)++;
   2306 
   2307 	/*Assume it is string*/
   2308 	if ( out->bv_len < *pos + value_size )
   2309 		increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2310 	memcpy( out->bv_val + *pos, value_ptr, value_size );
   2311 	out->bv_len += value_size;
   2312 	*pos += value_size;
   2313 
   2314 	return LDAP_SUCCESS;
   2315 }
   2316 
   2317 int
   2318 ConvertRelativeDistinguishedName2RFC2253 ( irRelativeDistinguishedName* in, struct berval *out , int* pos) {
   2319 	irAttributeTypeAndValue* attr_typeNvalue;
   2320 	int rc;
   2321 
   2322 
   2323 	FOR_EACH_LIST_ELMT( attr_typeNvalue, &in->comp_list)
   2324 	{
   2325 		rc = ConvertComponentAttributeTypeAndValue2RFC2253( attr_typeNvalue, out, pos );
   2326 		if ( rc != LDAP_SUCCESS ) return LDAP_INVALID_SYNTAX;
   2327 
   2328 		if ( out->bv_len < *pos + 1/*for '+'*/  )
   2329 			increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2330 		/*between multivalued RDNs, put comma*/
   2331 		out->bv_val[(*pos)++] = '+';
   2332 	}
   2333 	(*pos)--;/*remove the last '+'*/
   2334 	return LDAP_SUCCESS;
   2335 }
   2336 
   2337 int
   2338 ConvertRDN2RFC2253 ( irRelativeDistinguishedName* in, struct berval *out ) {
   2339 	int rc, pos = 0;
   2340 	out->bv_val = (char*)malloc( INITIAL_DN_SIZE );
   2341 	out->bv_len = INITIAL_DN_SIZE;
   2342 
   2343 	rc = ConvertRelativeDistinguishedName2RFC2253 ( in, out , &pos);
   2344 	if ( rc != LDAP_SUCCESS ) return rc;
   2345 	out->bv_val[pos] = '\0';
   2346 	out->bv_len = pos;
   2347 	return LDAP_SUCCESS;
   2348 }
   2349 
   2350 int
   2351 ConvertRDNSequence2RFC2253( irRDNSequence *in, struct berval* out ) {
   2352 	irRelativeDistinguishedName* rdn_seq;
   2353 	AsnList* seq = &in->comp_list;
   2354 	int pos = 0, rc ;
   2355 
   2356 	out->bv_val = (char*)malloc( INITIAL_DN_SIZE );
   2357 	out->bv_len = INITIAL_DN_SIZE;
   2358 
   2359 	FOR_EACH_LIST_ELMT( rdn_seq, seq )
   2360 	{
   2361 		rc = ConvertRelativeDistinguishedName2RFC2253( rdn_seq, out, &pos );
   2362 		if ( rc != LDAP_SUCCESS ) return LDAP_INVALID_SYNTAX;
   2363 
   2364 		if ( out->bv_len < pos + 1/*for ','*/ )
   2365 			increment_bv_mem_by_size ( out, INCREMENT_SIZE );
   2366 		/*Between RDN, put comma*/
   2367 		out->bv_val[pos++] = ',';
   2368 	}
   2369 	pos--;/*remove the last '+'*/
   2370 	out->bv_val[pos] = '\0';
   2371 	out->bv_len =pos;
   2372 	return LDAP_SUCCESS;
   2373 }
   2374 
   2375 #endif
   2376