authorityKeyIdentifier.c revision 1.1.1.3
1/*	$NetBSD: authorityKeyIdentifier.c,v 1.1.1.3 2018/02/06 01:53:06 christos Exp $	*/
2
3/*
4 *    authorityKeyIdentifier.c
5 *    "AuthorityKeyIdentifierDefinition" ASN.1 module encode/decode/extracting/matching/free C src.
6 *    This file was generated by modified eSMACC compiler Wed Dec  8 22:22:49 2004
7 *    The generated files are supposed to be compiled as a module for OpenLDAP Software
8 */
9
10#include "authorityKeyIdentifier.h"
11
12BDecComponentAuthorityKeyIdentifierTop( void* mem_op, GenBuf* b, void *v, AsnLen* bytesDecoded,int mode) {
13	AsnTag tag;
14	AsnLen elmtLen;
15
16	tag = BDecTag ( b, bytesDecoded );
17	elmtLen = BDecLen ( b, bytesDecoded );
18	if ( elmtLen <= 0 ) return (-1);
19	if ( tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE) ) {
20		return (-1);
21	}
22
23	return BDecComponentAuthorityKeyIdentifier( mem_op, b, tag, elmtLen, ( ComponentAuthorityKeyIdentifier**)v, (AsnLen*)bytesDecoded, mode );
24}
25
26
27void init_module_AuthorityKeyIdentifierDefinition() {
28	InstallOidDecoderMapping( "2.5.29.35", NULL,
29				GDecComponentAuthorityKeyIdentifier,
30				BDecComponentAuthorityKeyIdentifierTop,
31				ExtractingComponentAuthorityKeyIdentifier,
32				MatchingComponentAuthorityKeyIdentifier	);
33}
34
35int
36MatchingComponentOtherName ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
37	int rc;
38	MatchingRule* mr;
39
40	if ( oid ) {
41		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
42		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
43	}
44
45	rc = 1;
46	rc =	MatchingComponentOid ( oid, (ComponentSyntaxInfo*)&((ComponentOtherName*)csi_attr)->type_id, (ComponentSyntaxInfo*)&((ComponentOtherName*)csi_assert)->type_id );
47	if ( rc != LDAP_COMPARE_TRUE )
48		return rc;
49	rc =	SetAnyTypeByComponentOid ((ComponentSyntaxInfo*)&((ComponentOtherName*)csi_attr)->value, (&((ComponentOtherName*)csi_attr)->type_id));
50	rc = MatchingComponentAnyDefinedBy ( oid, (ComponentAny*)&((ComponentOtherName*)csi_attr)->value, (ComponentAny*)&((ComponentOtherName*)csi_assert)->value);
51	if ( rc != LDAP_COMPARE_TRUE )
52		return rc;
53	return LDAP_COMPARE_TRUE;
54}  /* BMatchingComponentOtherName */
55
56void*
57ExtractingComponentOtherName ( void* mem_op, ComponentReference* cr, ComponentOtherName *comp )
58{
59
60	if ( ( comp->type_id.identifier.bv_val && strncmp(comp->type_id.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->type_id.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
61		if ( cr->cr_curr->ci_next == NULL )
62		return &comp->type_id;
63		else
64		return NULL;
65	}
66	if ( ( comp->value.identifier.bv_val && strncmp(comp->value.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->value.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
67		if ( cr->cr_curr->ci_next == NULL )
68		return &comp->value;
69		else
70		return NULL;
71	}
72	return NULL;
73}  /* ExtractingComponentOtherName */
74
75int
76BDecComponentOtherName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
77void* mem_op _AND_
78GenBuf * b _AND_
79AsnTag tagId0 _AND_
80AsnLen elmtLen0 _AND_
81ComponentOtherName **v _AND_
82AsnLen *bytesDecoded _AND_
83int mode)
84{
85	int seqDone = FALSE;
86	AsnLen totalElmtsLen1 = 0;
87	AsnLen elmtLen1;
88	AsnTag tagId1;
89	int mandatoryElmtCount1 = 0;
90	AsnLen totalElmtsLen2 = 0;
91	AsnLen elmtLen2;
92	AsnTag tagId2;
93	int old_mode = mode;
94	int rc;
95	ComponentOtherName *k, *t, c_temp;
96
97
98	if ( !(mode & DEC_ALLOC_MODE_1) ) {
99		memset(&c_temp,0,sizeof(c_temp));
100		 k = &c_temp;
101	} else
102		 k = t = *v;
103	mode = DEC_ALLOC_MODE_2;
104    tagId1 = BDecTag (b, &totalElmtsLen1 );
105
106    if (((tagId1 == MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))))
107    {
108    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
109		rc = 	BDecComponentOid (mem_op, b, tagId1, elmtLen1, (&k->type_id), &totalElmtsLen1, mode);
110		if ( rc != LDAP_SUCCESS ) return rc;
111		(&k->type_id)->identifier.bv_val = (&k->type_id)->id_buf;
112		(&k->type_id)->identifier.bv_len = strlen("type_id");
113		strcpy( (&k->type_id)->identifier.bv_val, "type_id");
114    tagId1 = BDecTag (b, &totalElmtsLen1);
115    }
116    else
117        return -1;
118
119
120
121    if (((tagId1 == MAKE_TAG_ID (CNTX, CONS, 0))))
122    {
123    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
124		rc = SetAnyTypeByComponentOid ((&k->value), (&k->type_id));
125 	rc = BDecComponentAnyDefinedBy (mem_op,b, (&k->value), &totalElmtsLen1, mode );
126		if ( rc != LDAP_SUCCESS ) return rc;
127		(&k->value)->identifier.bv_val = (&k->value)->id_buf;
128		(&k->value)->identifier.bv_len = strlen("value");
129		strcpy( (&k->value)->identifier.bv_val, "value");
130	if (elmtLen1 == INDEFINITE_LEN)
131        BDecEoc (b, &totalElmtsLen1 );
132        seqDone = TRUE;
133        if (elmtLen0 == INDEFINITE_LEN)
134            BDecEoc (b, &totalElmtsLen1 );
135        else if (totalElmtsLen1 != elmtLen0)
136        return -1;
137
138    }
139    else
140        return -1;
141
142
143
144    if (!seqDone)
145        return -1;
146
147	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
148	*v = t = (ComponentOtherName*) CompAlloc( mem_op, sizeof(ComponentOtherName) );
149	if ( !t ) return -1;
150	*t = *k;
151	}
152	t->syntax = (Syntax*)NULL;
153	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
154	if ( !t->comp_desc ) {
155		free ( t );
156		return -1;
157	}
158	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOtherName ;
159	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOtherName ;
160	t->comp_desc->cd_free = (comp_free_func*)NULL;
161	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentOtherName;
162	t->comp_desc->cd_type = ASN_COMPOSITE;
163	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
164	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOtherName;
165    (*bytesDecoded) += totalElmtsLen1;
166	return LDAP_SUCCESS;
167}  /* BDecOtherName*/
168
169int
170GDecComponentOtherName PARAMS (( mem_op,b, v, bytesDecoded, mode),
171void* mem_op _AND_
172GenBuf * b _AND_
173ComponentOtherName **v _AND_
174AsnLen *bytesDecoded _AND_
175int mode)
176{
177	char* peek_head,*peek_head2;
178	int i, strLen,strLen2, rc, old_mode = mode;
179	ComponentOtherName *k,*t, c_temp;
180
181
182	if ( !(mode & DEC_ALLOC_MODE_1) ) {
183		memset(&c_temp,0,sizeof(c_temp));
184		 k = &c_temp;
185	} else
186		 k = t = *v;
187	mode = DEC_ALLOC_MODE_2;
188	*bytesDecoded = 0;
189	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
190		Asn1Error("Error during Reading { in encoded data");
191		return LDAP_PROTOCOL_ERROR;
192	}
193	if(*peek_head != '{'){
194		Asn1Error("Missing { in encoded data");
195		return LDAP_PROTOCOL_ERROR;
196	}
197
198	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
199		Asn1Error("Error during Reading identifier");
200		return LDAP_PROTOCOL_ERROR;
201	}
202	if ( strncmp( peek_head, "type_id", strlen("type_id") ) == 0 ) {
203		rc = 	GDecComponentOid (mem_op, b, (&k->type_id), bytesDecoded, mode);
204		if ( rc != LDAP_SUCCESS ) return rc;
205	(&k->type_id)->identifier.bv_val = peek_head;
206	(&k->type_id)->identifier.bv_len = strLen;
207	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
208		Asn1Error("Error during Reading , ");
209		return LDAP_PROTOCOL_ERROR;
210	}
211	if(*peek_head != ','){
212		Asn1Error("Missing , in encoding");
213		return LDAP_PROTOCOL_ERROR;
214	}
215	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
216	  Asn1Error("Error during Reading identifier");
217		return LDAP_PROTOCOL_ERROR;
218	}
219	}
220	if ( strncmp( peek_head, "value", strlen("value") ) == 0 ) {
221		rc = SetAnyTypeByComponentOid ((&k->value), (&k->type_id));
222	rc = GDecComponentAnyDefinedBy (mem_op, b, (&k->value), bytesDecoded, mode );
223		if ( rc != LDAP_SUCCESS ) return rc;
224	(&k->value)->identifier.bv_val = peek_head;
225	(&k->value)->identifier.bv_len = strLen;
226	}
227	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ) {
228		Asn1Error("Error during Reading } in encoding");
229		return LDAP_PROTOCOL_ERROR;
230	}
231	if(*peek_head != '}'){
232		Asn1Error("Missing } in encoding");
233		return LDAP_PROTOCOL_ERROR;
234	}
235	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
236	*v = t = (ComponentOtherName*) CompAlloc( mem_op, sizeof(ComponentOtherName) );
237	if ( !t ) return -1;
238	*t = *k;
239	}
240	t->syntax = (Syntax*)NULL;
241	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
242	if ( !t->comp_desc ) {
243		free ( t );
244		return -1;
245	}
246	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentOtherName ;
247	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentOtherName ;
248	t->comp_desc->cd_free = (comp_free_func*)NULL;
249	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentOtherName;
250	t->comp_desc->cd_type = ASN_COMPOSITE;
251	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
252	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentOtherName;
253	return LDAP_SUCCESS;
254}  /* GDecOtherName*/
255
256
257int
258MatchingComponentORAddress ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
259	int rc;
260	MatchingRule* mr;
261
262	if ( oid ) {
263		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
264		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
265	}
266
267	rc = 1;
268	rc =	MatchingComponentOid ( oid, (ComponentSyntaxInfo*)&((ComponentORAddress*)csi_attr)->type_id, (ComponentSyntaxInfo*)&((ComponentORAddress*)csi_assert)->type_id );
269	if ( rc != LDAP_COMPARE_TRUE )
270		return rc;
271	rc =	SetAnyTypeByComponentOid ((ComponentSyntaxInfo*)&((ComponentORAddress*)csi_attr)->value, (&((ComponentORAddress*)csi_attr)->type_id));
272	rc = MatchingComponentAnyDefinedBy ( oid, (ComponentAny*)&((ComponentORAddress*)csi_attr)->value, (ComponentAny*)&((ComponentORAddress*)csi_assert)->value);
273	if ( rc != LDAP_COMPARE_TRUE )
274		return rc;
275	rc =	MatchingComponentOcts ( oid, (ComponentSyntaxInfo*)&((ComponentORAddress*)csi_attr)->extension, (ComponentSyntaxInfo*)&((ComponentORAddress*)csi_assert)->extension );
276	if ( rc != LDAP_COMPARE_TRUE )
277		return rc;
278	return LDAP_COMPARE_TRUE;
279}  /* BMatchingComponentORAddress */
280
281void*
282ExtractingComponentORAddress ( void* mem_op, ComponentReference* cr, ComponentORAddress *comp )
283{
284
285	if ( ( comp->type_id.identifier.bv_val && strncmp(comp->type_id.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->type_id.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
286		if ( cr->cr_curr->ci_next == NULL )
287		return &comp->type_id;
288		else
289		return NULL;
290	}
291	if ( ( comp->value.identifier.bv_val && strncmp(comp->value.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->value.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
292		if ( cr->cr_curr->ci_next == NULL )
293		return &comp->value;
294		else
295		return NULL;
296	}
297	if ( ( comp->extension.identifier.bv_val && strncmp(comp->extension.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->extension.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
298		if ( cr->cr_curr->ci_next == NULL )
299		return &comp->extension;
300		else
301		return NULL;
302	}
303	return NULL;
304}  /* ExtractingComponentORAddress */
305
306int
307BDecComponentORAddress PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
308void* mem_op _AND_
309GenBuf * b _AND_
310AsnTag tagId0 _AND_
311AsnLen elmtLen0 _AND_
312ComponentORAddress **v _AND_
313AsnLen *bytesDecoded _AND_
314int mode)
315{
316	int seqDone = FALSE;
317	AsnLen totalElmtsLen1 = 0;
318	AsnLen elmtLen1;
319	AsnTag tagId1;
320	int mandatoryElmtCount1 = 0;
321	int old_mode = mode;
322	int rc;
323	ComponentORAddress *k, *t, c_temp;
324
325
326	if ( !(mode & DEC_ALLOC_MODE_1) ) {
327		memset(&c_temp,0,sizeof(c_temp));
328		 k = &c_temp;
329	} else
330		 k = t = *v;
331	mode = DEC_ALLOC_MODE_2;
332    tagId1 = BDecTag (b, &totalElmtsLen1 );
333
334    if (((tagId1 == MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))))
335    {
336    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
337		rc = 	BDecComponentOid (mem_op, b, tagId1, elmtLen1, (&k->type_id), &totalElmtsLen1, mode);
338		if ( rc != LDAP_SUCCESS ) return rc;
339		(&k->type_id)->identifier.bv_val = (&k->type_id)->id_buf;
340		(&k->type_id)->identifier.bv_len = strlen("type_id");
341		strcpy( (&k->type_id)->identifier.bv_val, "type_id");
342    }
343    else
344        return -1;
345
346
347
348    {
349		rc = SetAnyTypeByComponentOid ((&k->value), (&k->type_id));
350 	rc = BDecComponentAnyDefinedBy (mem_op,b, (&k->value), &totalElmtsLen1, mode );
351		if ( rc != LDAP_SUCCESS ) return rc;
352		(&k->value)->identifier.bv_val = (&k->value)->id_buf;
353		(&k->value)->identifier.bv_len = strlen("value");
354		strcpy( (&k->value)->identifier.bv_val, "value");
355    if ((elmtLen0 != INDEFINITE_LEN) && (totalElmtsLen1 == elmtLen0))
356        seqDone = TRUE;
357    else
358    {
359        tagId1 = BDecTag (b, &totalElmtsLen1 );
360
361         if ((elmtLen0 == INDEFINITE_LEN) && (tagId1 == EOC_TAG_ID))
362        {
363            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1 )
364            seqDone = TRUE;
365        }
366    }
367    }
368
369
370    if ((!seqDone) && ((tagId1 == MAKE_TAG_ID (UNIV, PRIM, OCTETSTRING_TAG_CODE)) ||
371(tagId1 == MAKE_TAG_ID (UNIV, CONS, OCTETSTRING_TAG_CODE))))
372    {
373    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
374		rc = 	BDecComponentOcts (mem_op, b, tagId1, elmtLen1, (&k->extension), &totalElmtsLen1, mode);
375		if ( rc != LDAP_SUCCESS ) return rc;
376		(&k->extension)->identifier.bv_val = (&k->extension)->id_buf;
377		(&k->extension)->identifier.bv_len = strlen("extension");
378		strcpy( (&k->extension)->identifier.bv_val, "extension");
379        seqDone = TRUE;
380        if (elmtLen0 == INDEFINITE_LEN)
381            BDecEoc (b, &totalElmtsLen1 );
382        else if (totalElmtsLen1 != elmtLen0)
383        return -1;
384
385    }
386
387
388    if (!seqDone)
389        return -1;
390
391	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
392	*v = t = (ComponentORAddress*) CompAlloc( mem_op, sizeof(ComponentORAddress) );
393	if ( !t ) return -1;
394	*t = *k;
395	}
396	t->syntax = (Syntax*)NULL;
397	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
398	if ( !t->comp_desc ) {
399		free ( t );
400		return -1;
401	}
402	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentORAddress ;
403	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentORAddress ;
404	t->comp_desc->cd_free = (comp_free_func*)NULL;
405	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentORAddress;
406	t->comp_desc->cd_type = ASN_COMPOSITE;
407	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
408	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentORAddress;
409    (*bytesDecoded) += totalElmtsLen1;
410	return LDAP_SUCCESS;
411}  /* BDecORAddress*/
412
413int
414GDecComponentORAddress PARAMS (( mem_op,b, v, bytesDecoded, mode),
415void* mem_op _AND_
416GenBuf * b _AND_
417ComponentORAddress **v _AND_
418AsnLen *bytesDecoded _AND_
419int mode)
420{
421	char* peek_head,*peek_head2;
422	int i, strLen,strLen2, rc, old_mode = mode;
423	ComponentORAddress *k,*t, c_temp;
424
425
426	if ( !(mode & DEC_ALLOC_MODE_1) ) {
427		memset(&c_temp,0,sizeof(c_temp));
428		 k = &c_temp;
429	} else
430		 k = t = *v;
431	mode = DEC_ALLOC_MODE_2;
432	*bytesDecoded = 0;
433	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
434		Asn1Error("Error during Reading { in encoded data");
435		return LDAP_PROTOCOL_ERROR;
436	}
437	if(*peek_head != '{'){
438		Asn1Error("Missing { in encoded data");
439		return LDAP_PROTOCOL_ERROR;
440	}
441
442	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
443		Asn1Error("Error during Reading identifier");
444		return LDAP_PROTOCOL_ERROR;
445	}
446	if ( strncmp( peek_head, "type_id", strlen("type_id") ) == 0 ) {
447		rc = 	GDecComponentOid (mem_op, b, (&k->type_id), bytesDecoded, mode);
448		if ( rc != LDAP_SUCCESS ) return rc;
449	(&k->type_id)->identifier.bv_val = peek_head;
450	(&k->type_id)->identifier.bv_len = strLen;
451	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
452		Asn1Error("Error during Reading , ");
453		return LDAP_PROTOCOL_ERROR;
454	}
455	if(*peek_head != ','){
456		Asn1Error("Missing , in encoding");
457		return LDAP_PROTOCOL_ERROR;
458	}
459	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
460	  Asn1Error("Error during Reading identifier");
461		return LDAP_PROTOCOL_ERROR;
462	}
463	}
464	if ( strncmp( peek_head, "value", strlen("value") ) == 0 ) {
465		rc = SetAnyTypeByComponentOid ((&k->value), (&k->type_id));
466	rc = GDecComponentAnyDefinedBy (mem_op, b, (&k->value), bytesDecoded, mode );
467		if ( rc != LDAP_SUCCESS ) return rc;
468	(&k->value)->identifier.bv_val = peek_head;
469	(&k->value)->identifier.bv_len = strLen;
470	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
471		Asn1Error("Error during Reading , ");
472		return LDAP_PROTOCOL_ERROR;
473	}
474	if(*peek_head != ','){
475		Asn1Error("Missing , in encoding");
476		return LDAP_PROTOCOL_ERROR;
477	}
478	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
479	  Asn1Error("Error during Reading identifier");
480		return LDAP_PROTOCOL_ERROR;
481	}
482	}
483	if ( strncmp( peek_head, "extension", strlen("extension") ) == 0 ) {
484		rc = 	GDecComponentOcts (mem_op, b, (&k->extension), bytesDecoded, mode);
485		if ( rc != LDAP_SUCCESS ) return rc;
486	(&k->extension)->identifier.bv_val = peek_head;
487	(&k->extension)->identifier.bv_len = strLen;
488	}
489	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ) {
490		Asn1Error("Error during Reading } in encoding");
491		return LDAP_PROTOCOL_ERROR;
492	}
493	if(*peek_head != '}'){
494		Asn1Error("Missing } in encoding");
495		return LDAP_PROTOCOL_ERROR;
496	}
497	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
498	*v = t = (ComponentORAddress*) CompAlloc( mem_op, sizeof(ComponentORAddress) );
499	if ( !t ) return -1;
500	*t = *k;
501	}
502	t->syntax = (Syntax*)NULL;
503	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
504	if ( !t->comp_desc ) {
505		free ( t );
506		return -1;
507	}
508	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentORAddress ;
509	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentORAddress ;
510	t->comp_desc->cd_free = (comp_free_func*)NULL;
511	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentORAddress;
512	t->comp_desc->cd_type = ASN_COMPOSITE;
513	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
514	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentORAddress;
515	return LDAP_SUCCESS;
516}  /* GDecORAddress*/
517
518
519int
520MatchingComponentDirectoryString ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
521	int rc;
522	MatchingRule* mr;
523	ComponentDirectoryString *v1, *v2;
524
525
526	v1 = (ComponentDirectoryString*)csi_attr;
527	v2 = (ComponentDirectoryString*)csi_assert;
528	if ( oid ) {
529		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
530		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
531	}
532
533	if( (v1->choiceId != v2->choiceId ) )
534		return LDAP_COMPARE_FALSE;
535	switch( v1->choiceId )
536	{
537	   case DIRECTORYSTRING_TELETEXSTRING :
538		rc = 	MatchingComponentTeletexString ( oid, (ComponentSyntaxInfo*)(v1->a.teletexString), (ComponentSyntaxInfo*)(v2->a.teletexString) );
539		break;
540	   case DIRECTORYSTRING_PRINTABLESTRING :
541		rc = 	MatchingComponentPrintableString ( oid, (ComponentSyntaxInfo*)(v1->a.printableString), (ComponentSyntaxInfo*)(v2->a.printableString) );
542		break;
543	   case DIRECTORYSTRING_UNIVERSALSTRING :
544		rc = 	MatchingComponentUniversalString ( oid, (ComponentSyntaxInfo*)(v1->a.universalString), (ComponentSyntaxInfo*)(v2->a.universalString) );
545		break;
546	   case DIRECTORYSTRING_UTF8STRING :
547		rc = 	MatchingComponentUTF8String ( oid, (ComponentSyntaxInfo*)(v1->a.utf8String), (ComponentSyntaxInfo*)(v2->a.utf8String) );
548		break;
549	   case DIRECTORYSTRING_BMPSTRING :
550		rc = 	MatchingComponentBMPString ( oid, (ComponentSyntaxInfo*)(v1->a.bmpString), (ComponentSyntaxInfo*)(v2->a.bmpString) );
551		break;
552	default :
553		 return LDAP_PROTOCOL_ERROR;
554	}
555	return rc;
556}  /* BMatchingComponentDirectoryStringContent */
557
558void*
559ExtractingComponentDirectoryString ( void* mem_op, ComponentReference* cr, ComponentDirectoryString *comp )
560{
561
562
563	if( (comp->choiceId) ==  DIRECTORYSTRING_TELETEXSTRING &&
564		 (( comp->a.teletexString->identifier.bv_val && strncmp(comp->a.teletexString->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
565		 ( strncmp(comp->a.teletexString->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
566		if ( cr->cr_curr->ci_next == NULL )
567			return (comp->a.teletexString);
568		else {
569			cr->cr_curr = cr->cr_curr->ci_next;
570			return 	ExtractingComponentTeletexString ( mem_op, cr, (comp->a.teletexString) );
571		};
572	}
573	if( (comp->choiceId) ==  DIRECTORYSTRING_PRINTABLESTRING &&
574		 (( comp->a.printableString->identifier.bv_val && strncmp(comp->a.printableString->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
575		 ( strncmp(comp->a.printableString->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
576		if ( cr->cr_curr->ci_next == NULL )
577			return (comp->a.printableString);
578		else {
579			cr->cr_curr = cr->cr_curr->ci_next;
580			return 	ExtractingComponentPrintableString ( mem_op, cr, (comp->a.printableString) );
581		};
582	}
583	if( (comp->choiceId) ==  DIRECTORYSTRING_UNIVERSALSTRING &&
584		 (( comp->a.universalString->identifier.bv_val && strncmp(comp->a.universalString->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
585		 ( strncmp(comp->a.universalString->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
586		if ( cr->cr_curr->ci_next == NULL )
587			return (comp->a.universalString);
588		else {
589			cr->cr_curr = cr->cr_curr->ci_next;
590			return 	ExtractingComponentUniversalString ( mem_op, cr, (comp->a.universalString) );
591		};
592	}
593	if( (comp->choiceId) ==  DIRECTORYSTRING_UTF8STRING &&
594		 (( comp->a.utf8String->identifier.bv_val && strncmp(comp->a.utf8String->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
595		 ( strncmp(comp->a.utf8String->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
596		if ( cr->cr_curr->ci_next == NULL )
597			return (comp->a.utf8String);
598		else {
599			cr->cr_curr = cr->cr_curr->ci_next;
600			return 	ExtractingComponentUTF8String ( mem_op, cr, (comp->a.utf8String) );
601		};
602	}
603	if( (comp->choiceId) ==  DIRECTORYSTRING_BMPSTRING &&
604		 (( comp->a.bmpString->identifier.bv_val && strncmp(comp->a.bmpString->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
605		 ( strncmp(comp->a.bmpString->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
606		if ( cr->cr_curr->ci_next == NULL )
607			return (comp->a.bmpString);
608		else {
609			cr->cr_curr = cr->cr_curr->ci_next;
610			return 	ExtractingComponentBMPString ( mem_op, cr, (comp->a.bmpString) );
611		};
612	}
613	return NULL;
614}  /* ExtractingComponentDirectoryString */
615
616int
617BDecComponentDirectoryString PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
618void* mem_op _AND_
619GenBuf * b _AND_
620AsnTag tagId0 _AND_
621AsnLen elmtLen0 _AND_
622ComponentDirectoryString **v _AND_
623AsnLen *bytesDecoded _AND_
624int mode)
625{
626	int seqDone = FALSE;
627	AsnLen totalElmtsLen1 = 0;
628	AsnLen elmtLen1;
629	AsnTag tagId1;
630	int mandatoryElmtCount1 = 0;
631	int old_mode = mode;
632	int rc;
633	ComponentDirectoryString *k, *t, c_temp;
634
635
636	if ( !(mode & DEC_ALLOC_MODE_1) ) {
637		memset(&c_temp,0,sizeof(c_temp));
638		 k = &c_temp;
639	} else
640		 k = t = *v;
641	mode = DEC_ALLOC_MODE_2;
642    switch (tagId0)
643    {
644       case MAKE_TAG_ID (UNIV, PRIM, TELETEXSTRING_TAG_CODE):
645       case MAKE_TAG_ID (UNIV, CONS, TELETEXSTRING_TAG_CODE):
646        (k->choiceId) = DIRECTORYSTRING_TELETEXSTRING;
647		rc = 	BDecComponentTeletexString (mem_op, b, tagId0, elmtLen0, (&k->a.teletexString), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
648		if ( rc != LDAP_SUCCESS ) return rc;
649		(k->a.teletexString)->identifier.bv_val = (k->a.teletexString)->id_buf;
650		(k->a.teletexString)->identifier.bv_len = strlen("teletexString");
651		strcpy( (k->a.teletexString)->identifier.bv_val, "teletexString");
652    break;
653
654       case MAKE_TAG_ID (UNIV, PRIM, PRINTABLESTRING_TAG_CODE):
655       case MAKE_TAG_ID (UNIV, CONS, PRINTABLESTRING_TAG_CODE):
656        (k->choiceId) = DIRECTORYSTRING_PRINTABLESTRING;
657		rc = 	BDecComponentPrintableString (mem_op, b, tagId0, elmtLen0, (&k->a.printableString), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
658		if ( rc != LDAP_SUCCESS ) return rc;
659		(k->a.printableString)->identifier.bv_val = (k->a.printableString)->id_buf;
660		(k->a.printableString)->identifier.bv_len = strlen("printableString");
661		strcpy( (k->a.printableString)->identifier.bv_val, "printableString");
662    break;
663
664       case MAKE_TAG_ID (UNIV, PRIM, UNIVERSALSTRING_TAG_CODE):
665       case MAKE_TAG_ID (UNIV, CONS, UNIVERSALSTRING_TAG_CODE):
666        (k->choiceId) = DIRECTORYSTRING_UNIVERSALSTRING;
667		rc = 	BDecComponentUniversalString (mem_op, b, tagId0, elmtLen0, (&k->a.universalString), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
668		if ( rc != LDAP_SUCCESS ) return rc;
669		(k->a.universalString)->identifier.bv_val = (k->a.universalString)->id_buf;
670		(k->a.universalString)->identifier.bv_len = strlen("universalString");
671		strcpy( (k->a.universalString)->identifier.bv_val, "universalString");
672    break;
673
674       case MAKE_TAG_ID (UNIV, PRIM, UTF8STRING_TAG_CODE):
675       case MAKE_TAG_ID (UNIV, CONS, UTF8STRING_TAG_CODE):
676        (k->choiceId) = DIRECTORYSTRING_UTF8STRING;
677		rc = 	BDecComponentUTF8String (mem_op, b, tagId0, elmtLen0, (&k->a.utf8String), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
678		if ( rc != LDAP_SUCCESS ) return rc;
679		(k->a.utf8String)->identifier.bv_val = (k->a.utf8String)->id_buf;
680		(k->a.utf8String)->identifier.bv_len = strlen("utf8String");
681		strcpy( (k->a.utf8String)->identifier.bv_val, "utf8String");
682    break;
683
684       case MAKE_TAG_ID (UNIV, PRIM, BMPSTRING_TAG_CODE):
685       case MAKE_TAG_ID (UNIV, CONS, BMPSTRING_TAG_CODE):
686        (k->choiceId) = DIRECTORYSTRING_BMPSTRING;
687		rc = 	BDecComponentBMPString (mem_op, b, tagId0, elmtLen0, (&k->a.bmpString), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
688		if ( rc != LDAP_SUCCESS ) return rc;
689		(k->a.bmpString)->identifier.bv_val = (k->a.bmpString)->id_buf;
690		(k->a.bmpString)->identifier.bv_len = strlen("bmpString");
691		strcpy( (k->a.bmpString)->identifier.bv_val, "bmpString");
692    break;
693
694    default:
695        Asn1Error ("ERROR - unexpected tag in CHOICE\n");
696        return -1;
697        break;
698    } /* end switch */
699	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
700	*v = t = (ComponentDirectoryString*) CompAlloc( mem_op, sizeof(ComponentDirectoryString) );
701	if ( !t ) return -1;
702	*t = *k;
703	}
704	t->syntax = (Syntax*)NULL;
705	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
706	if ( !t->comp_desc ) {
707		free ( t );
708		return -1;
709	}
710	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentDirectoryString ;
711	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentDirectoryString ;
712	t->comp_desc->cd_free = (comp_free_func*)NULL;
713	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentDirectoryString;
714	t->comp_desc->cd_type = ASN_COMPOSITE;
715	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
716	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentDirectoryString;
717    (*bytesDecoded) += totalElmtsLen1;
718	return LDAP_SUCCESS;
719}  /* BDecDirectoryStringContent */
720
721int
722GDecComponentDirectoryString PARAMS (( mem_op,b, v, bytesDecoded, mode),
723void* mem_op _AND_
724GenBuf * b _AND_
725ComponentDirectoryString **v _AND_
726AsnLen *bytesDecoded _AND_
727int mode)
728{
729	char* peek_head,*peek_head2;
730	int i, strLen,strLen2, rc, old_mode = mode;
731	ComponentDirectoryString *k,*t, c_temp;
732
733
734	if ( !(mode & DEC_ALLOC_MODE_1) ) {
735		memset(&c_temp,0,sizeof(c_temp));
736		 k = &c_temp;
737	} else
738		 k = t = *v;
739	mode = DEC_ALLOC_MODE_2;
740	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
741		Asn1Error("Error during Reading identifier");
742		return LDAP_PROTOCOL_ERROR;
743	}
744	if( !(strLen2 = LocateNextGSERToken(mem_op,b,&peek_head2,GSER_NO_COPY)) ){
745		Asn1Error("Error during Reading identifier");
746		return LDAP_PROTOCOL_ERROR;
747	}
748	if(*peek_head2 != ':'){
749		Asn1Error("Missing : in encoded data");
750		return LDAP_PROTOCOL_ERROR;
751	}
752	if( strncmp("teletexString",peek_head, strlen("teletexString")) == 0){
753		(k->choiceId) = DIRECTORYSTRING_TELETEXSTRING;
754		rc = 	GDecComponentTeletexString (mem_op, b, (&k->a.teletexString), bytesDecoded, DEC_ALLOC_MODE_0 );
755		if ( rc != LDAP_SUCCESS ) return rc;
756		(k->a.teletexString)->identifier.bv_val = peek_head;
757		(k->a.teletexString)->identifier.bv_len = strLen;
758	}
759	else if( strncmp("printableString",peek_head,strlen("printableString")) == 0){
760		(k->choiceId) = DIRECTORYSTRING_PRINTABLESTRING;
761		rc = 	GDecComponentPrintableString (mem_op, b, (&k->a.printableString), bytesDecoded, DEC_ALLOC_MODE_0 );
762		if ( rc != LDAP_SUCCESS ) return rc;
763		(k->a.printableString)->identifier.bv_val = peek_head;
764		(k->a.printableString)->identifier.bv_len = strLen;
765	}
766	else if( strncmp("universalString",peek_head,strlen("universalString")) == 0){
767		(k->choiceId) = DIRECTORYSTRING_UNIVERSALSTRING;
768		rc = 	GDecComponentUniversalString (mem_op, b, (&k->a.universalString), bytesDecoded, DEC_ALLOC_MODE_0 );
769		if ( rc != LDAP_SUCCESS ) return rc;
770		(k->a.universalString)->identifier.bv_val = peek_head;
771		(k->a.universalString)->identifier.bv_len = strLen;
772	}
773	else if( strncmp("utf8String",peek_head,strlen("utf8String")) == 0){
774		(k->choiceId) = DIRECTORYSTRING_UTF8STRING;
775		rc = 	GDecComponentUTF8String (mem_op, b, (&k->a.utf8String), bytesDecoded, DEC_ALLOC_MODE_0 );
776		if ( rc != LDAP_SUCCESS ) return rc;
777		(k->a.utf8String)->identifier.bv_val = peek_head;
778		(k->a.utf8String)->identifier.bv_len = strLen;
779	}
780	else if( strncmp("bmpString",peek_head,strlen("bmpString")) == 0){
781		(k->choiceId) = DIRECTORYSTRING_BMPSTRING;
782		rc = 	GDecComponentBMPString (mem_op, b, (&k->a.bmpString), bytesDecoded, DEC_ALLOC_MODE_0 );
783		if ( rc != LDAP_SUCCESS ) return rc;
784		(k->a.bmpString)->identifier.bv_val = peek_head;
785		(k->a.bmpString)->identifier.bv_len = strLen;
786	}
787	else {
788		Asn1Error("Undefined Identifier");
789		return LDAP_PROTOCOL_ERROR;
790	}
791	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
792	*v = t = (ComponentDirectoryString*) CompAlloc( mem_op, sizeof(ComponentDirectoryString) );
793	if ( !t ) return -1;
794	*t = *k;
795	}
796	t->syntax = (Syntax*)NULL;
797	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
798	if ( !t->comp_desc ) {
799		free ( t );
800		return -1;
801	}
802	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentDirectoryString ;
803	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentDirectoryString ;
804	t->comp_desc->cd_free = (comp_free_func*)NULL;
805	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentDirectoryString;
806	t->comp_desc->cd_type = ASN_COMPOSITE;
807	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
808	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentDirectoryString;
809	return LDAP_SUCCESS;
810}  /* GDecDirectoryStringContent */
811
812
813int
814MatchingComponentEDIPartyName ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
815	int rc;
816	MatchingRule* mr;
817
818	if ( oid ) {
819		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
820		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
821	}
822
823	rc = 1;
824	if(COMPONENTNOT_NULL( ((ComponentEDIPartyName*)csi_attr)->nameAssigner ) ) {
825	rc =	MatchingComponentDirectoryString ( oid, (ComponentSyntaxInfo*)((ComponentEDIPartyName*)csi_attr)->nameAssigner, (ComponentSyntaxInfo*)((ComponentEDIPartyName*)csi_assert)->nameAssigner );
826	if ( rc != LDAP_COMPARE_TRUE )
827		return rc;
828	}
829	rc =	MatchingComponentDirectoryString ( oid, (ComponentSyntaxInfo*)((ComponentEDIPartyName*)csi_attr)->partyName, (ComponentSyntaxInfo*)((ComponentEDIPartyName*)csi_assert)->partyName );
830	if ( rc != LDAP_COMPARE_TRUE )
831		return rc;
832	return LDAP_COMPARE_TRUE;
833}  /* BMatchingComponentEDIPartyName */
834
835void*
836ExtractingComponentEDIPartyName ( void* mem_op, ComponentReference* cr, ComponentEDIPartyName *comp )
837{
838
839	if ( ( comp->nameAssigner->identifier.bv_val && strncmp(comp->nameAssigner->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->nameAssigner->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
840		if ( cr->cr_curr->ci_next == NULL )
841			return comp->nameAssigner;
842		else {
843			cr->cr_curr = cr->cr_curr->ci_next;
844			return 	ExtractingComponentDirectoryString ( mem_op, cr, comp->nameAssigner );
845		}
846	}
847	if ( ( comp->partyName->identifier.bv_val && strncmp(comp->partyName->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->partyName->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
848		if ( cr->cr_curr->ci_next == NULL )
849			return comp->partyName;
850		else {
851			cr->cr_curr = cr->cr_curr->ci_next;
852			return 	ExtractingComponentDirectoryString ( mem_op, cr, comp->partyName );
853		}
854	}
855	return NULL;
856}  /* ExtractingComponentEDIPartyName */
857
858int
859BDecComponentEDIPartyName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
860void* mem_op _AND_
861GenBuf * b _AND_
862AsnTag tagId0 _AND_
863AsnLen elmtLen0 _AND_
864ComponentEDIPartyName **v _AND_
865AsnLen *bytesDecoded _AND_
866int mode)
867{
868	int seqDone = FALSE;
869	AsnLen totalElmtsLen1 = 0;
870	AsnLen elmtLen1;
871	AsnTag tagId1;
872	int mandatoryElmtCount1 = 0;
873	AsnLen totalElmtsLen2 = 0;
874	AsnLen elmtLen2;
875	AsnTag tagId2;
876	AsnLen totalElmtsLen3 = 0;
877	AsnLen elmtLen3;
878	AsnTag tagId3;
879	int old_mode = mode;
880	int rc;
881	ComponentEDIPartyName *k, *t, c_temp;
882
883
884	if ( !(mode & DEC_ALLOC_MODE_1) ) {
885		memset(&c_temp,0,sizeof(c_temp));
886		 k = &c_temp;
887	} else
888		 k = t = *v;
889	mode = DEC_ALLOC_MODE_2;
890    tagId1 = BDecTag (b, &totalElmtsLen1 );
891
892    if (((tagId1 == MAKE_TAG_ID (CNTX, CONS, 0))))
893    {
894    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
895		rc =     tagId2 = BDecTag (b, &totalElmtsLen1 );
896    elmtLen2 = BDecLen (b, &totalElmtsLen1 );
897	BDecComponentDirectoryString (mem_op, b, tagId2, elmtLen2, (&k->nameAssigner), &totalElmtsLen1, mode);
898    if (elmtLen1 == INDEFINITE_LEN)
899        BDecEoc(b, &totalElmtsLen1 );
900		if ( rc != LDAP_SUCCESS ) return rc;
901		(k->nameAssigner)->identifier.bv_val = (k->nameAssigner)->id_buf;
902		(k->nameAssigner)->identifier.bv_len = strlen("nameAssigner");
903		strcpy( (k->nameAssigner)->identifier.bv_val, "nameAssigner");
904	if (elmtLen1 == INDEFINITE_LEN)
905        BDecEoc (b, &totalElmtsLen1 );
906    tagId1 = BDecTag (b, &totalElmtsLen1);
907    }
908
909
910    if (((tagId1 == MAKE_TAG_ID (CNTX, CONS, 1))))
911    {
912    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
913		rc =     tagId2 = BDecTag (b, &totalElmtsLen1 );
914    elmtLen2 = BDecLen (b, &totalElmtsLen1 );
915	BDecComponentDirectoryString (mem_op, b, tagId2, elmtLen2, (&k->partyName), &totalElmtsLen1, mode);
916    if (elmtLen1 == INDEFINITE_LEN)
917        BDecEoc(b, &totalElmtsLen1 );
918		if ( rc != LDAP_SUCCESS ) return rc;
919		(k->partyName)->identifier.bv_val = (k->partyName)->id_buf;
920		(k->partyName)->identifier.bv_len = strlen("partyName");
921		strcpy( (k->partyName)->identifier.bv_val, "partyName");
922	if (elmtLen1 == INDEFINITE_LEN)
923        BDecEoc (b, &totalElmtsLen1 );
924        seqDone = TRUE;
925        if (elmtLen0 == INDEFINITE_LEN)
926            BDecEoc (b, &totalElmtsLen1 );
927        else if (totalElmtsLen1 != elmtLen0)
928        return -1;
929
930    }
931    else
932        return -1;
933
934
935
936    if (!seqDone)
937        return -1;
938
939	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
940	*v = t = (ComponentEDIPartyName*) CompAlloc( mem_op, sizeof(ComponentEDIPartyName) );
941	if ( !t ) return -1;
942	*t = *k;
943	}
944	t->syntax = (Syntax*)NULL;
945	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
946	if ( !t->comp_desc ) {
947		free ( t );
948		return -1;
949	}
950	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEDIPartyName ;
951	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEDIPartyName ;
952	t->comp_desc->cd_free = (comp_free_func*)NULL;
953	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentEDIPartyName;
954	t->comp_desc->cd_type = ASN_COMPOSITE;
955	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
956	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentEDIPartyName;
957    (*bytesDecoded) += totalElmtsLen1;
958	return LDAP_SUCCESS;
959}  /* BDecEDIPartyName*/
960
961int
962GDecComponentEDIPartyName PARAMS (( mem_op,b, v, bytesDecoded, mode),
963void* mem_op _AND_
964GenBuf * b _AND_
965ComponentEDIPartyName **v _AND_
966AsnLen *bytesDecoded _AND_
967int mode)
968{
969	char* peek_head,*peek_head2;
970	int i, strLen,strLen2, rc, old_mode = mode;
971	ComponentEDIPartyName *k,*t, c_temp;
972
973
974	if ( !(mode & DEC_ALLOC_MODE_1) ) {
975		memset(&c_temp,0,sizeof(c_temp));
976		 k = &c_temp;
977	} else
978		 k = t = *v;
979	mode = DEC_ALLOC_MODE_2;
980	*bytesDecoded = 0;
981	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
982		Asn1Error("Error during Reading { in encoded data");
983		return LDAP_PROTOCOL_ERROR;
984	}
985	if(*peek_head != '{'){
986		Asn1Error("Missing { in encoded data");
987		return LDAP_PROTOCOL_ERROR;
988	}
989
990	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
991		Asn1Error("Error during Reading identifier");
992		return LDAP_PROTOCOL_ERROR;
993	}
994	if ( strncmp( peek_head, "nameAssigner", strlen("nameAssigner") ) == 0 ) {
995		rc = 	GDecComponentDirectoryString (mem_op, b, (&k->nameAssigner), bytesDecoded, mode);
996		if ( rc != LDAP_SUCCESS ) return rc;
997	( k->nameAssigner)->identifier.bv_val = peek_head;
998	( k->nameAssigner)->identifier.bv_len = strLen;
999	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1000		Asn1Error("Error during Reading , ");
1001		return LDAP_PROTOCOL_ERROR;
1002	}
1003	if(*peek_head != ','){
1004		Asn1Error("Missing , in encoding");
1005		return LDAP_PROTOCOL_ERROR;
1006	}
1007	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1008	  Asn1Error("Error during Reading identifier");
1009		return LDAP_PROTOCOL_ERROR;
1010	}
1011	}
1012	if ( strncmp( peek_head, "partyName", strlen("partyName") ) == 0 ) {
1013		rc = 	GDecComponentDirectoryString (mem_op, b, (&k->partyName), bytesDecoded, mode);
1014		if ( rc != LDAP_SUCCESS ) return rc;
1015	( k->partyName)->identifier.bv_val = peek_head;
1016	( k->partyName)->identifier.bv_len = strLen;
1017	}
1018	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ) {
1019		Asn1Error("Error during Reading } in encoding");
1020		return LDAP_PROTOCOL_ERROR;
1021	}
1022	if(*peek_head != '}'){
1023		Asn1Error("Missing } in encoding");
1024		return LDAP_PROTOCOL_ERROR;
1025	}
1026	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1027	*v = t = (ComponentEDIPartyName*) CompAlloc( mem_op, sizeof(ComponentEDIPartyName) );
1028	if ( !t ) return -1;
1029	*t = *k;
1030	}
1031	t->syntax = (Syntax*)NULL;
1032	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1033	if ( !t->comp_desc ) {
1034		free ( t );
1035		return -1;
1036	}
1037	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentEDIPartyName ;
1038	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentEDIPartyName ;
1039	t->comp_desc->cd_free = (comp_free_func*)NULL;
1040	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentEDIPartyName;
1041	t->comp_desc->cd_type = ASN_COMPOSITE;
1042	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1043	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentEDIPartyName;
1044	return LDAP_SUCCESS;
1045}  /* GDecEDIPartyName*/
1046
1047
1048
1049int
1050MatchingComponentGeneralName ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
1051	int rc;
1052	MatchingRule* mr;
1053	ComponentGeneralName *v1, *v2;
1054
1055
1056	v1 = (ComponentGeneralName*)csi_attr;
1057	v2 = (ComponentGeneralName*)csi_assert;
1058	if ( oid ) {
1059		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
1060		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
1061	}
1062
1063	if( (v1->choiceId != v2->choiceId ) )
1064		return LDAP_COMPARE_FALSE;
1065	switch( v1->choiceId )
1066	{
1067	   case GENERALNAME_OTHERNAME :
1068		rc = 	MatchingComponentOtherName ( oid, (ComponentSyntaxInfo*)(v1->a.otherName), (ComponentSyntaxInfo*)(v2->a.otherName) );
1069		break;
1070	   case GENERALNAME_RFC822NAME :
1071		rc = 	MatchingComponentIA5String ( oid, (ComponentSyntaxInfo*)(v1->a.rfc822Name), (ComponentSyntaxInfo*)(v2->a.rfc822Name) );
1072		break;
1073	   case GENERALNAME_DNSNAME :
1074		rc = 	MatchingComponentIA5String ( oid, (ComponentSyntaxInfo*)(v1->a.dNSName), (ComponentSyntaxInfo*)(v2->a.dNSName) );
1075		break;
1076	   case GENERALNAME_X400ADDRESS :
1077		rc = 	MatchingComponentORAddress ( oid, (ComponentSyntaxInfo*)(v1->a.x400Address), (ComponentSyntaxInfo*)(v2->a.x400Address) );
1078		break;
1079	   case GENERALNAME_DIRECTORYNAME :
1080		rc = 	MatchingComponentName ( oid, (ComponentSyntaxInfo*)(v1->a.directoryName), (ComponentSyntaxInfo*)(v2->a.directoryName) );
1081		break;
1082	   case GENERALNAME_EDIPARTYNAME :
1083		rc = 	MatchingComponentEDIPartyName ( oid, (ComponentSyntaxInfo*)(v1->a.ediPartyName), (ComponentSyntaxInfo*)(v2->a.ediPartyName) );
1084		break;
1085	   case GENERALNAME_UNIFORMRESOURCEIDENTIFIER :
1086		rc = 	MatchingComponentIA5String ( oid, (ComponentSyntaxInfo*)(v1->a.uniformResourceIdentifier), (ComponentSyntaxInfo*)(v2->a.uniformResourceIdentifier) );
1087		break;
1088	   case GENERALNAME_IPADDRESS :
1089		rc = 	MatchingComponentOcts ( oid, (ComponentSyntaxInfo*)(v1->a.iPAddress), (ComponentSyntaxInfo*)(v2->a.iPAddress) );
1090		break;
1091	   case GENERALNAME_REGISTEREDID :
1092		rc = 	MatchingComponentOid ( oid, (ComponentSyntaxInfo*)(v1->a.registeredID), (ComponentSyntaxInfo*)(v2->a.registeredID) );
1093		break;
1094	default :
1095		 return LDAP_PROTOCOL_ERROR;
1096	}
1097	return rc;
1098}  /* BMatchingComponentGeneralNameContent */
1099
1100void*
1101ExtractingComponentGeneralName ( void* mem_op, ComponentReference* cr, ComponentGeneralName *comp )
1102{
1103
1104
1105	if( (comp->choiceId) ==  GENERALNAME_OTHERNAME &&
1106		 (( comp->a.otherName->identifier.bv_val && strncmp(comp->a.otherName->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1107		 ( strncmp(comp->a.otherName->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1108		if ( cr->cr_curr->ci_next == NULL )
1109			return (comp->a.otherName);
1110		else {
1111			cr->cr_curr = cr->cr_curr->ci_next;
1112			return 	ExtractingComponentOtherName ( mem_op, cr, (comp->a.otherName) );
1113		};
1114	}
1115	if( (comp->choiceId) ==  GENERALNAME_RFC822NAME &&
1116		 (( comp->a.rfc822Name->identifier.bv_val && strncmp(comp->a.rfc822Name->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1117		 ( strncmp(comp->a.rfc822Name->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1118		if ( cr->cr_curr->ci_next == NULL )
1119			return (comp->a.rfc822Name);
1120		else {
1121			cr->cr_curr = cr->cr_curr->ci_next;
1122			return 	ExtractingComponentIA5String ( mem_op, cr, (comp->a.rfc822Name) );
1123		};
1124	}
1125	if( (comp->choiceId) ==  GENERALNAME_DNSNAME &&
1126		 (( comp->a.dNSName->identifier.bv_val && strncmp(comp->a.dNSName->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1127		 ( strncmp(comp->a.dNSName->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1128		if ( cr->cr_curr->ci_next == NULL )
1129			return (comp->a.dNSName);
1130		else {
1131			cr->cr_curr = cr->cr_curr->ci_next;
1132			return 	ExtractingComponentIA5String ( mem_op, cr, (comp->a.dNSName) );
1133		};
1134	}
1135	if( (comp->choiceId) ==  GENERALNAME_X400ADDRESS &&
1136		 (( comp->a.x400Address->identifier.bv_val && strncmp(comp->a.x400Address->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1137		 ( strncmp(comp->a.x400Address->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1138		if ( cr->cr_curr->ci_next == NULL )
1139			return (comp->a.x400Address);
1140		else {
1141			cr->cr_curr = cr->cr_curr->ci_next;
1142			return 	ExtractingComponentORAddress ( mem_op, cr, (comp->a.x400Address) );
1143		};
1144	}
1145	if( (comp->choiceId) ==  GENERALNAME_DIRECTORYNAME &&
1146		 (( comp->a.directoryName->identifier.bv_val && strncmp(comp->a.directoryName->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1147		 ( strncmp(comp->a.directoryName->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1148		if ( cr->cr_curr->ci_next == NULL )
1149			return (comp->a.directoryName);
1150		else {
1151			cr->cr_curr = cr->cr_curr->ci_next;
1152			return 	ExtractingComponentName ( mem_op, cr, (comp->a.directoryName) );
1153		};
1154	}
1155	if( (comp->choiceId) ==  GENERALNAME_EDIPARTYNAME &&
1156		 (( comp->a.ediPartyName->identifier.bv_val && strncmp(comp->a.ediPartyName->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1157		 ( strncmp(comp->a.ediPartyName->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1158		if ( cr->cr_curr->ci_next == NULL )
1159			return (comp->a.ediPartyName);
1160		else {
1161			cr->cr_curr = cr->cr_curr->ci_next;
1162			return 	ExtractingComponentEDIPartyName ( mem_op, cr, (comp->a.ediPartyName) );
1163		};
1164	}
1165	if( (comp->choiceId) ==  GENERALNAME_UNIFORMRESOURCEIDENTIFIER &&
1166		 (( comp->a.uniformResourceIdentifier->identifier.bv_val && strncmp(comp->a.uniformResourceIdentifier->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1167		 ( strncmp(comp->a.uniformResourceIdentifier->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1168		if ( cr->cr_curr->ci_next == NULL )
1169			return (comp->a.uniformResourceIdentifier);
1170		else {
1171			cr->cr_curr = cr->cr_curr->ci_next;
1172			return 	ExtractingComponentIA5String ( mem_op, cr, (comp->a.uniformResourceIdentifier) );
1173		};
1174	}
1175	if( (comp->choiceId) ==  GENERALNAME_IPADDRESS &&
1176		 (( comp->a.iPAddress->identifier.bv_val && strncmp(comp->a.iPAddress->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1177		 ( strncmp(comp->a.iPAddress->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1178		if ( cr->cr_curr->ci_next == NULL )
1179			return (comp->a.iPAddress);
1180		else {
1181			cr->cr_curr = cr->cr_curr->ci_next;
1182			return 	ExtractingComponentOcts ( mem_op, cr, (comp->a.iPAddress) );
1183		};
1184	}
1185	if( (comp->choiceId) ==  GENERALNAME_REGISTEREDID &&
1186		 (( comp->a.registeredID->identifier.bv_val && strncmp(comp->a.registeredID->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0) ||
1187		 ( strncmp(comp->a.registeredID->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0))) {
1188		if ( cr->cr_curr->ci_next == NULL )
1189			return (comp->a.registeredID);
1190		else {
1191			cr->cr_curr = cr->cr_curr->ci_next;
1192			return 	ExtractingComponentOid ( mem_op, cr, (comp->a.registeredID) );
1193		};
1194	}
1195	return NULL;
1196}  /* ExtractingComponentGeneralName */
1197
1198int
1199BDecComponentGeneralName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1200void* mem_op _AND_
1201GenBuf * b _AND_
1202AsnTag tagId0 _AND_
1203AsnLen elmtLen0 _AND_
1204ComponentGeneralName **v _AND_
1205AsnLen *bytesDecoded _AND_
1206int mode)
1207{
1208	int seqDone = FALSE;
1209	AsnLen totalElmtsLen1 = 0;
1210	AsnLen elmtLen1;
1211	AsnTag tagId1;
1212	int mandatoryElmtCount1 = 0;
1213	AsnLen totalElmtsLen2 = 0;
1214	AsnLen elmtLen2;
1215	AsnTag tagId2;
1216	AsnLen totalElmtsLen3 = 0;
1217	AsnLen elmtLen3;
1218	AsnTag tagId3;
1219	int old_mode = mode;
1220	int rc;
1221	ComponentGeneralName *k, *t, c_temp;
1222
1223
1224	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1225		memset(&c_temp,0,sizeof(c_temp));
1226		 k = &c_temp;
1227	} else
1228		 k = t = *v;
1229	mode = DEC_ALLOC_MODE_2;
1230    switch (tagId0)
1231    {
1232       case MAKE_TAG_ID (CNTX, CONS, 0):
1233if (BDecTag (b, &totalElmtsLen1 ) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))
1234    {
1235         Asn1Error ("Unexpected Tag\n");
1236         return -1;
1237    }
1238
1239    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1240        (k->choiceId) = GENERALNAME_OTHERNAME;
1241		rc = 	BDecComponentOtherName (mem_op, b, tagId1, elmtLen1, (&k->a.otherName), &totalElmtsLen1, mode);
1242		if ( rc != LDAP_SUCCESS ) return rc;
1243		(k->a.otherName)->identifier.bv_val = (k->a.otherName)->id_buf;
1244		(k->a.otherName)->identifier.bv_len = strlen("otherName");
1245		strcpy( (k->a.otherName)->identifier.bv_val, "otherName");
1246	if (elmtLen0 == INDEFINITE_LEN)
1247        BDecEoc (b, &totalElmtsLen1 );
1248    break;
1249
1250       case MAKE_TAG_ID (CNTX, CONS, 1):
1251    tagId1 = BDecTag (b, &totalElmtsLen1 );
1252if ((tagId1 != MAKE_TAG_ID (UNIV, PRIM, IA5STRING_TAG_CODE)) &&
1253   (tagId1 != MAKE_TAG_ID (UNIV, CONS, IA5STRING_TAG_CODE)))
1254    {
1255         Asn1Error ("Unexpected Tag\n");
1256         return -1;
1257    }
1258
1259    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1260        (k->choiceId) = GENERALNAME_RFC822NAME;
1261		rc = 	BDecComponentIA5String (mem_op, b, tagId1, elmtLen1, (&k->a.rfc822Name), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
1262		if ( rc != LDAP_SUCCESS ) return rc;
1263		(k->a.rfc822Name)->identifier.bv_val = (k->a.rfc822Name)->id_buf;
1264		(k->a.rfc822Name)->identifier.bv_len = strlen("rfc822Name");
1265		strcpy( (k->a.rfc822Name)->identifier.bv_val, "rfc822Name");
1266	if (elmtLen0 == INDEFINITE_LEN)
1267        BDecEoc (b, &totalElmtsLen1 );
1268    break;
1269
1270       case MAKE_TAG_ID (CNTX, CONS, 2):
1271    tagId1 = BDecTag (b, &totalElmtsLen1 );
1272if ((tagId1 != MAKE_TAG_ID (UNIV, PRIM, IA5STRING_TAG_CODE)) &&
1273   (tagId1 != MAKE_TAG_ID (UNIV, CONS, IA5STRING_TAG_CODE)))
1274    {
1275         Asn1Error ("Unexpected Tag\n");
1276         return -1;
1277    }
1278
1279    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1280        (k->choiceId) = GENERALNAME_DNSNAME;
1281		rc = 	BDecComponentIA5String (mem_op, b, tagId1, elmtLen1, (&k->a.dNSName), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
1282		if ( rc != LDAP_SUCCESS ) return rc;
1283		(k->a.dNSName)->identifier.bv_val = (k->a.dNSName)->id_buf;
1284		(k->a.dNSName)->identifier.bv_len = strlen("dNSName");
1285		strcpy( (k->a.dNSName)->identifier.bv_val, "dNSName");
1286	if (elmtLen0 == INDEFINITE_LEN)
1287        BDecEoc (b, &totalElmtsLen1 );
1288    break;
1289
1290       case MAKE_TAG_ID (CNTX, CONS, 3):
1291if (BDecTag (b, &totalElmtsLen1 ) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))
1292    {
1293         Asn1Error ("Unexpected Tag\n");
1294         return -1;
1295    }
1296
1297    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1298        (k->choiceId) = GENERALNAME_X400ADDRESS;
1299		rc = 	BDecComponentORAddress (mem_op, b, tagId1, elmtLen1, (&k->a.x400Address), &totalElmtsLen1, mode);
1300		if ( rc != LDAP_SUCCESS ) return rc;
1301		(k->a.x400Address)->identifier.bv_val = (k->a.x400Address)->id_buf;
1302		(k->a.x400Address)->identifier.bv_len = strlen("x400Address");
1303		strcpy( (k->a.x400Address)->identifier.bv_val, "x400Address");
1304	if (elmtLen0 == INDEFINITE_LEN)
1305        BDecEoc (b, &totalElmtsLen1 );
1306    break;
1307
1308       case MAKE_TAG_ID (CNTX, CONS, 4):
1309        (k->choiceId) = GENERALNAME_DIRECTORYNAME;
1310		tagId1 = BDecTag (b, &totalElmtsLen1 );
1311    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1312	rc = BDecComponentName (mem_op, b, tagId1, elmtLen1, (&k->a.directoryName), &totalElmtsLen1, mode);
1313    if (elmtLen0 == INDEFINITE_LEN)
1314        BDecEoc(b, &totalElmtsLen1 );
1315		if ( rc != LDAP_SUCCESS ) return rc;
1316		(k->a.directoryName)->identifier.bv_val = (k->a.directoryName)->id_buf;
1317		(k->a.directoryName)->identifier.bv_len = strlen("directoryName");
1318		strcpy( (k->a.directoryName)->identifier.bv_val, "directoryName");
1319	if (elmtLen0 == INDEFINITE_LEN)
1320        BDecEoc (b, &totalElmtsLen1 );
1321    break;
1322
1323       case MAKE_TAG_ID (CNTX, CONS, 5):
1324if (BDecTag (b, &totalElmtsLen1 ) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))
1325    {
1326         Asn1Error ("Unexpected Tag\n");
1327         return -1;
1328    }
1329
1330    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1331        (k->choiceId) = GENERALNAME_EDIPARTYNAME;
1332		rc = 	BDecComponentEDIPartyName (mem_op, b, tagId1, elmtLen1, (&k->a.ediPartyName), &totalElmtsLen1, mode);
1333		if ( rc != LDAP_SUCCESS ) return rc;
1334		(k->a.ediPartyName)->identifier.bv_val = (k->a.ediPartyName)->id_buf;
1335		(k->a.ediPartyName)->identifier.bv_len = strlen("ediPartyName");
1336		strcpy( (k->a.ediPartyName)->identifier.bv_val, "ediPartyName");
1337	if (elmtLen0 == INDEFINITE_LEN)
1338        BDecEoc (b, &totalElmtsLen1 );
1339    break;
1340
1341       case MAKE_TAG_ID (CNTX, CONS, 6):
1342    tagId1 = BDecTag (b, &totalElmtsLen1 );
1343if ((tagId1 != MAKE_TAG_ID (UNIV, PRIM, IA5STRING_TAG_CODE)) &&
1344   (tagId1 != MAKE_TAG_ID (UNIV, CONS, IA5STRING_TAG_CODE)))
1345    {
1346         Asn1Error ("Unexpected Tag\n");
1347         return -1;
1348    }
1349
1350    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1351        (k->choiceId) = GENERALNAME_UNIFORMRESOURCEIDENTIFIER;
1352		rc = 	BDecComponentIA5String (mem_op, b, tagId1, elmtLen1, (&k->a.uniformResourceIdentifier), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
1353		if ( rc != LDAP_SUCCESS ) return rc;
1354		(k->a.uniformResourceIdentifier)->identifier.bv_val = (k->a.uniformResourceIdentifier)->id_buf;
1355		(k->a.uniformResourceIdentifier)->identifier.bv_len = strlen("uniformResourceIdentifier");
1356		strcpy( (k->a.uniformResourceIdentifier)->identifier.bv_val, "uniformResourceIdentifier");
1357	if (elmtLen0 == INDEFINITE_LEN)
1358        BDecEoc (b, &totalElmtsLen1 );
1359    break;
1360
1361       case MAKE_TAG_ID (CNTX, CONS, 7):
1362    tagId1 = BDecTag (b, &totalElmtsLen1 );
1363if ((tagId1 != MAKE_TAG_ID (UNIV, PRIM, OCTETSTRING_TAG_CODE)) &&
1364   (tagId1 != MAKE_TAG_ID (UNIV, CONS, OCTETSTRING_TAG_CODE)))
1365    {
1366         Asn1Error ("Unexpected Tag\n");
1367         return -1;
1368    }
1369
1370    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1371        (k->choiceId) = GENERALNAME_IPADDRESS;
1372		rc = 	BDecComponentOcts (mem_op, b, tagId1, elmtLen1, (&k->a.iPAddress), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
1373		if ( rc != LDAP_SUCCESS ) return rc;
1374		(k->a.iPAddress)->identifier.bv_val = (k->a.iPAddress)->id_buf;
1375		(k->a.iPAddress)->identifier.bv_len = strlen("iPAddress");
1376		strcpy( (k->a.iPAddress)->identifier.bv_val, "iPAddress");
1377	if (elmtLen0 == INDEFINITE_LEN)
1378        BDecEoc (b, &totalElmtsLen1 );
1379    break;
1380
1381       case MAKE_TAG_ID (CNTX, CONS, 8):
1382if (BDecTag (b, &totalElmtsLen1 ) != MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))
1383    {
1384         Asn1Error ("Unexpected Tag\n");
1385         return -1;
1386    }
1387
1388    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1389        (k->choiceId) = GENERALNAME_REGISTEREDID;
1390		rc = 	BDecComponentOid (mem_op, b, tagId1, elmtLen1, (&k->a.registeredID), &totalElmtsLen1, DEC_ALLOC_MODE_0 );
1391		if ( rc != LDAP_SUCCESS ) return rc;
1392		(k->a.registeredID)->identifier.bv_val = (k->a.registeredID)->id_buf;
1393		(k->a.registeredID)->identifier.bv_len = strlen("registeredID");
1394		strcpy( (k->a.registeredID)->identifier.bv_val, "registeredID");
1395	if (elmtLen0 == INDEFINITE_LEN)
1396        BDecEoc (b, &totalElmtsLen1 );
1397    break;
1398
1399    default:
1400        Asn1Error ("ERROR - unexpected tag in CHOICE\n");
1401        return -1;
1402        break;
1403    } /* end switch */
1404	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1405	*v = t = (ComponentGeneralName*) CompAlloc( mem_op, sizeof(ComponentGeneralName) );
1406	if ( !t ) return -1;
1407	*t = *k;
1408	}
1409	t->syntax = (Syntax*)NULL;
1410	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1411	if ( !t->comp_desc ) {
1412		free ( t );
1413		return -1;
1414	}
1415	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentGeneralName ;
1416	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentGeneralName ;
1417	t->comp_desc->cd_free = (comp_free_func*)NULL;
1418	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentGeneralName;
1419	t->comp_desc->cd_type = ASN_COMPOSITE;
1420	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1421	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentGeneralName;
1422    (*bytesDecoded) += totalElmtsLen1;
1423	return LDAP_SUCCESS;
1424}  /* BDecGeneralNameContent */
1425
1426int
1427GDecComponentGeneralName PARAMS (( mem_op,b, v, bytesDecoded, mode),
1428void* mem_op _AND_
1429GenBuf * b _AND_
1430ComponentGeneralName **v _AND_
1431AsnLen *bytesDecoded _AND_
1432int mode)
1433{
1434	char* peek_head,*peek_head2;
1435	int i, strLen,strLen2, rc, old_mode = mode;
1436	ComponentGeneralName *k,*t, c_temp;
1437
1438
1439	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1440		memset(&c_temp,0,sizeof(c_temp));
1441		 k = &c_temp;
1442	} else
1443		 k = t = *v;
1444	mode = DEC_ALLOC_MODE_2;
1445	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1446		Asn1Error("Error during Reading identifier");
1447		return LDAP_PROTOCOL_ERROR;
1448	}
1449	if( !(strLen2 = LocateNextGSERToken(mem_op,b,&peek_head2,GSER_NO_COPY)) ){
1450		Asn1Error("Error during Reading identifier");
1451		return LDAP_PROTOCOL_ERROR;
1452	}
1453	if(*peek_head2 != ':'){
1454		Asn1Error("Missing : in encoded data");
1455		return LDAP_PROTOCOL_ERROR;
1456	}
1457	if( strncmp("otherName",peek_head, strlen("otherName")) == 0){
1458		(k->choiceId) = GENERALNAME_OTHERNAME;
1459		rc = 	GDecComponentOtherName (mem_op, b, (&k->a.otherName), bytesDecoded, mode);
1460		if ( rc != LDAP_SUCCESS ) return rc;
1461		(k->a.otherName)->identifier.bv_val = peek_head;
1462		(k->a.otherName)->identifier.bv_len = strLen;
1463	}
1464	else if( strncmp("rfc822Name",peek_head,strlen("rfc822Name")) == 0){
1465		(k->choiceId) = GENERALNAME_RFC822NAME;
1466		rc = 	GDecComponentIA5String (mem_op, b, (&k->a.rfc822Name), bytesDecoded, DEC_ALLOC_MODE_0 );
1467		if ( rc != LDAP_SUCCESS ) return rc;
1468		(k->a.rfc822Name)->identifier.bv_val = peek_head;
1469		(k->a.rfc822Name)->identifier.bv_len = strLen;
1470	}
1471	else if( strncmp("dNSName",peek_head,strlen("dNSName")) == 0){
1472		(k->choiceId) = GENERALNAME_DNSNAME;
1473		rc = 	GDecComponentIA5String (mem_op, b, (&k->a.dNSName), bytesDecoded, DEC_ALLOC_MODE_0 );
1474		if ( rc != LDAP_SUCCESS ) return rc;
1475		(k->a.dNSName)->identifier.bv_val = peek_head;
1476		(k->a.dNSName)->identifier.bv_len = strLen;
1477	}
1478	else if( strncmp("x400Address",peek_head,strlen("x400Address")) == 0){
1479		(k->choiceId) = GENERALNAME_X400ADDRESS;
1480		rc = 	GDecComponentORAddress (mem_op, b, (&k->a.x400Address), bytesDecoded, mode);
1481		if ( rc != LDAP_SUCCESS ) return rc;
1482		(k->a.x400Address)->identifier.bv_val = peek_head;
1483		(k->a.x400Address)->identifier.bv_len = strLen;
1484	}
1485	else if( strncmp("directoryName",peek_head,strlen("directoryName")) == 0){
1486		(k->choiceId) = GENERALNAME_DIRECTORYNAME;
1487		rc = 	GDecComponentName (mem_op, b, (&k->a.directoryName), bytesDecoded, mode);
1488		if ( rc != LDAP_SUCCESS ) return rc;
1489		(k->a.directoryName)->identifier.bv_val = peek_head;
1490		(k->a.directoryName)->identifier.bv_len = strLen;
1491	}
1492	else if( strncmp("ediPartyName",peek_head,strlen("ediPartyName")) == 0){
1493		(k->choiceId) = GENERALNAME_EDIPARTYNAME;
1494		rc = 	GDecComponentEDIPartyName (mem_op, b, (&k->a.ediPartyName), bytesDecoded, mode);
1495		if ( rc != LDAP_SUCCESS ) return rc;
1496		(k->a.ediPartyName)->identifier.bv_val = peek_head;
1497		(k->a.ediPartyName)->identifier.bv_len = strLen;
1498	}
1499	else if( strncmp("uniformResourceIdentifier",peek_head,strlen("uniformResourceIdentifier")) == 0){
1500		(k->choiceId) = GENERALNAME_UNIFORMRESOURCEIDENTIFIER;
1501		rc = 	GDecComponentIA5String (mem_op, b, (&k->a.uniformResourceIdentifier), bytesDecoded, DEC_ALLOC_MODE_0 );
1502		if ( rc != LDAP_SUCCESS ) return rc;
1503		(k->a.uniformResourceIdentifier)->identifier.bv_val = peek_head;
1504		(k->a.uniformResourceIdentifier)->identifier.bv_len = strLen;
1505	}
1506	else if( strncmp("iPAddress",peek_head,strlen("iPAddress")) == 0){
1507		(k->choiceId) = GENERALNAME_IPADDRESS;
1508		rc = 	GDecComponentOcts (mem_op, b, (&k->a.iPAddress), bytesDecoded, DEC_ALLOC_MODE_0 );
1509		if ( rc != LDAP_SUCCESS ) return rc;
1510		(k->a.iPAddress)->identifier.bv_val = peek_head;
1511		(k->a.iPAddress)->identifier.bv_len = strLen;
1512	}
1513	else if( strncmp("registeredID",peek_head,strlen("registeredID")) == 0){
1514		(k->choiceId) = GENERALNAME_REGISTEREDID;
1515		rc = 	GDecComponentOid (mem_op, b, (&k->a.registeredID), bytesDecoded, DEC_ALLOC_MODE_0 );
1516		if ( rc != LDAP_SUCCESS ) return rc;
1517		(k->a.registeredID)->identifier.bv_val = peek_head;
1518		(k->a.registeredID)->identifier.bv_len = strLen;
1519	}
1520	else {
1521		Asn1Error("Undefined Identifier");
1522		return LDAP_PROTOCOL_ERROR;
1523	}
1524	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1525	*v = t = (ComponentGeneralName*) CompAlloc( mem_op, sizeof(ComponentGeneralName) );
1526	if ( !t ) return -1;
1527	*t = *k;
1528	}
1529	t->syntax = (Syntax*)NULL;
1530	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1531	if ( !t->comp_desc ) {
1532		free ( t );
1533		return -1;
1534	}
1535	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentGeneralName ;
1536	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentGeneralName ;
1537	t->comp_desc->cd_free = (comp_free_func*)NULL;
1538	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentGeneralName;
1539	t->comp_desc->cd_type = ASN_COMPOSITE;
1540	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1541	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentGeneralName;
1542	return LDAP_SUCCESS;
1543}  /* GDecGeneralNameContent */
1544
1545
1546int
1547MatchingComponentGeneralNames ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
1548	int rc;
1549	MatchingRule* mr;
1550	void* component1, *component2;
1551	AsnList *v1, *v2, t_list;
1552
1553
1554	if ( oid ) {
1555		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
1556		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
1557	}
1558
1559	v1 = &((ComponentGeneralNames*)csi_attr)->comp_list;
1560	v2 = &((ComponentGeneralNames*)csi_assert)->comp_list;
1561	FOR_EACH_LIST_PAIR_ELMT(component1, component2, v1, v2)
1562	{
1563		if( MatchingComponentGeneralName(oid, (ComponentSyntaxInfo*)component1, (ComponentSyntaxInfo*)component2) == LDAP_COMPARE_FALSE) {
1564			return LDAP_COMPARE_FALSE;
1565		}
1566	} /* end of for */
1567
1568	AsnListFirst( v1 );
1569	AsnListFirst( v2 );
1570	if( (!component1 && component2) || (component1 && !component2))
1571		return LDAP_COMPARE_FALSE;
1572	else
1573		return LDAP_COMPARE_TRUE;
1574}  /* BMatchingComponentGeneralNamesContent */
1575
1576void*
1577ExtractingComponentGeneralNames ( void* mem_op, ComponentReference* cr, ComponentGeneralNames *comp )
1578{
1579	int count = 0;
1580	int total;
1581	AsnList *v = &comp->comp_list;
1582	ComponentInt *k;
1583	ComponentGeneralName *component;
1584
1585
1586	switch ( cr->cr_curr->ci_type ) {
1587	case LDAP_COMPREF_FROM_BEGINNING :
1588		count = cr->cr_curr->ci_val.ci_from_beginning;
1589		FOR_EACH_LIST_ELMT( component , v ) {
1590			if( --count == 0 ) {
1591				if( cr->cr_curr->ci_next == NULL )
1592					return component;
1593				else {
1594					cr->cr_curr = cr->cr_curr->ci_next;
1595					return 	ExtractingComponentGeneralName ( mem_op, cr, component );
1596				}
1597			}
1598		}
1599		break;
1600	case LDAP_COMPREF_FROM_END :
1601		total = AsnListCount ( v );
1602		count = cr->cr_curr->ci_val.ci_from_end;
1603		count = total + count +1;
1604		FOR_EACH_LIST_ELMT ( component, v ) {
1605			if( --count == 0 ) {
1606				if( cr->cr_curr->ci_next == NULL )
1607					return component;
1608				else {
1609					cr->cr_curr = cr->cr_curr->ci_next;
1610					return 	ExtractingComponentGeneralName ( mem_op, cr, component );
1611				}
1612			}
1613		}
1614		break;
1615	case LDAP_COMPREF_ALL :
1616		return comp;
1617	case LDAP_COMPREF_COUNT :
1618		k = (ComponentInt*)CompAlloc( mem_op, sizeof(ComponentInt));
1619		k->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1620		k->comp_desc->cd_tag = (-1);
1621		k->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentInt;
1622		k->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentInt;
1623		k->comp_desc->cd_extract_i = (extract_component_from_id_func*)NULL;
1624		k->comp_desc->cd_type = ASN_BASIC;
1625		k->comp_desc->cd_type_id = BASICTYPE_INTEGER;
1626		k->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentInt;
1627		k->value = AsnListCount(v);
1628		return k;
1629	default :
1630		return NULL;
1631	}
1632}  /* ExtractingComponentGeneralNames */
1633
1634int
1635BDecComponentGeneralNames PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1636void* mem_op _AND_
1637GenBuf * b _AND_
1638AsnTag tagId0 _AND_
1639AsnLen elmtLen0 _AND_
1640ComponentGeneralNames **v _AND_
1641AsnLen *bytesDecoded _AND_
1642int mode)
1643{
1644	int seqDone = FALSE;
1645	AsnLen totalElmtsLen1 = 0;
1646	AsnLen elmtLen1;
1647	AsnTag tagId1;
1648	int mandatoryElmtCount1 = 0;
1649	int old_mode = mode;
1650	int rc;
1651	ComponentGeneralNames *k, *t, c_temp;
1652
1653
1654	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1655		memset(&c_temp,0,sizeof(c_temp));
1656		 k = &c_temp;
1657	} else
1658		 k = t = *v;
1659	mode = DEC_ALLOC_MODE_2;
1660	AsnListInit(&k->comp_list,sizeof(ComponentGeneralName));
1661    for (totalElmtsLen1 = 0; (totalElmtsLen1 < elmtLen0) || (elmtLen0 == INDEFINITE_LEN);)
1662    {
1663        ComponentGeneralName **tmpVar;
1664    tagId1 = BDecTag (b, &totalElmtsLen1 );
1665
1666    if ((tagId1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN))
1667    {
1668        BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1 )
1669        break; /* got EOC so can exit this SET OF/SEQ OF's for loop*/
1670    }
1671        elmtLen1 = BDecLen (b, &totalElmtsLen1);
1672    tmpVar = (ComponentGeneralName**) CompAsnListAppend (mem_op,&k->comp_list);
1673		rc = 	BDecComponentGeneralName (mem_op, b, tagId1, elmtLen1, tmpVar, &totalElmtsLen1, mode);
1674		if ( rc != LDAP_SUCCESS ) return rc;
1675    } /* end of for */
1676
1677	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1678	*v = t = (ComponentGeneralNames*) CompAlloc( mem_op, sizeof(ComponentGeneralNames) );
1679	if ( !t ) return -1;
1680	*t = *k;
1681	}
1682	t->syntax = (Syntax*)NULL;
1683	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1684	if ( !t->comp_desc ) {
1685		free ( t );
1686		return -1;
1687	}
1688	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentGeneralNames ;
1689	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentGeneralNames ;
1690	t->comp_desc->cd_free = (comp_free_func*)NULL;
1691	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentGeneralNames;
1692	t->comp_desc->cd_type = ASN_COMPOSITE;
1693	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1694	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentGeneralNames;
1695    (*bytesDecoded) += totalElmtsLen1;
1696	return LDAP_SUCCESS;
1697}  /* BDecGeneralNamesContent */
1698
1699int
1700GDecComponentGeneralNames PARAMS (( mem_op,b, v, bytesDecoded, mode),
1701void* mem_op _AND_
1702GenBuf * b _AND_
1703ComponentGeneralNames **v _AND_
1704AsnLen *bytesDecoded _AND_
1705int mode)
1706{
1707	char* peek_head,*peek_head2;
1708	int i, strLen,strLen2, rc, old_mode = mode;
1709	ComponentGeneralNames *k,*t, c_temp;
1710
1711
1712	int ElmtsLen1;
1713	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1714		memset(&c_temp,0,sizeof(c_temp));
1715		 k = &c_temp;
1716	} else
1717		 k = t = *v;
1718	mode = DEC_ALLOC_MODE_2;
1719	AsnListInit( &k->comp_list, sizeof( ComponentGeneralName ) );
1720	*bytesDecoded = 0;
1721	if( !(strLen = LocateNextGSERToken(mem_op,b, &peek_head, GSER_PEEK)) ){
1722		Asn1Error("Error during Reading { in encoding");
1723		return LDAP_PROTOCOL_ERROR;
1724	}
1725	if(*peek_head != '{'){
1726		Asn1Error("Missing { in encoded data");
1727		return LDAP_PROTOCOL_ERROR;
1728	}
1729
1730	for (ElmtsLen1 = 0; ElmtsLen1 >= INDEFINITE_LEN; ElmtsLen1++)
1731	{
1732		ComponentGeneralName **tmpVar;
1733		if( !(strLen = LocateNextGSERToken(mem_op,b, &peek_head, GSER_NO_COPY)) ){
1734			Asn1Error("Error during Reading{ in encoding");
1735			return LDAP_PROTOCOL_ERROR;
1736		}
1737		if(*peek_head == '}') break;
1738		if( !(*peek_head == '{' || *peek_head ==',') ) {
1739			return LDAP_PROTOCOL_ERROR;
1740		}
1741		tmpVar = (ComponentGeneralName**) CompAsnListAppend (mem_op, &k->comp_list);
1742		if ( tmpVar == NULL ) {
1743			Asn1Error("Error during Reading{ in encoding");
1744			return LDAP_PROTOCOL_ERROR;
1745		}
1746		rc = 	GDecComponentGeneralName (mem_op, b, tmpVar, bytesDecoded, mode);
1747		if ( rc != LDAP_SUCCESS ) return rc;
1748	} /* end of for */
1749
1750	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1751	*v = t = (ComponentGeneralNames*) CompAlloc( mem_op, sizeof(ComponentGeneralNames) );
1752	if ( !t ) return -1;
1753	*t = *k;
1754	}
1755	t->syntax = (Syntax*)NULL;
1756	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1757	if ( !t->comp_desc ) {
1758		free ( t );
1759		return -1;
1760	}
1761	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentGeneralNames ;
1762	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentGeneralNames ;
1763	t->comp_desc->cd_free = (comp_free_func*)NULL;
1764	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentGeneralNames;
1765	t->comp_desc->cd_type = ASN_COMPOSITE;
1766	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1767	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentGeneralNames;
1768	return LDAP_SUCCESS;
1769}  /* GDecGeneralNamesContent */
1770
1771
1772int
1773MatchingComponentAuthorityKeyIdentifier ( char* oid, ComponentSyntaxInfo* csi_attr, ComponentSyntaxInfo* csi_assert ) {
1774	int rc;
1775	MatchingRule* mr;
1776
1777	if ( oid ) {
1778		mr = retrieve_matching_rule( oid, csi_attr->csi_comp_desc->cd_type_id);
1779		if ( mr ) return component_value_match( mr, csi_attr, csi_assert );
1780	}
1781
1782	rc = 1;
1783	rc =	MatchingComponentKeyIdentifier ( oid, (ComponentSyntaxInfo*)&((ComponentAuthorityKeyIdentifier*)csi_attr)->keyIdentifier, (ComponentSyntaxInfo*)&((ComponentAuthorityKeyIdentifier*)csi_assert)->keyIdentifier );
1784	if ( rc != LDAP_COMPARE_TRUE )
1785		return rc;
1786	if(COMPONENTNOT_NULL( ((ComponentAuthorityKeyIdentifier*)csi_attr)->authorityCertIssuer ) ) {
1787	rc =	MatchingComponentGeneralNames ( oid, (ComponentSyntaxInfo*)((ComponentAuthorityKeyIdentifier*)csi_attr)->authorityCertIssuer, (ComponentSyntaxInfo*)((ComponentAuthorityKeyIdentifier*)csi_assert)->authorityCertIssuer );
1788	if ( rc != LDAP_COMPARE_TRUE )
1789		return rc;
1790	}
1791	if(COMPONENTNOT_NULL( ((ComponentAuthorityKeyIdentifier*)csi_attr)->authorityCertSerialNumber ) ) {
1792	rc =	MatchingComponentCertificateSerialNumber ( oid, (ComponentSyntaxInfo*)((ComponentAuthorityKeyIdentifier*)csi_attr)->authorityCertSerialNumber, (ComponentSyntaxInfo*)((ComponentAuthorityKeyIdentifier*)csi_assert)->authorityCertSerialNumber );
1793	if ( rc != LDAP_COMPARE_TRUE )
1794		return rc;
1795	}
1796	return LDAP_COMPARE_TRUE;
1797}  /* BMatchingComponentAuthorityKeyIdentifier */
1798
1799void*
1800ExtractingComponentAuthorityKeyIdentifier ( void* mem_op, ComponentReference* cr, ComponentAuthorityKeyIdentifier *comp )
1801{
1802
1803	if ( ( comp->keyIdentifier.identifier.bv_val && strncmp(comp->keyIdentifier.identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->keyIdentifier.id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
1804		if ( cr->cr_curr->ci_next == NULL )
1805		return &comp->keyIdentifier;
1806		else
1807		return NULL;
1808	}
1809	if ( ( comp->authorityCertIssuer->identifier.bv_val && strncmp(comp->authorityCertIssuer->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->authorityCertIssuer->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
1810		if ( cr->cr_curr->ci_next == NULL )
1811			return comp->authorityCertIssuer;
1812		else {
1813			cr->cr_curr = cr->cr_curr->ci_next;
1814			return 	ExtractingComponentGeneralNames ( mem_op, cr, comp->authorityCertIssuer );
1815		}
1816	}
1817	if ( ( comp->authorityCertSerialNumber->identifier.bv_val && strncmp(comp->authorityCertSerialNumber->identifier.bv_val, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) || ( strncmp(comp->authorityCertSerialNumber->id_buf, cr->cr_curr->ci_val.ci_identifier.bv_val,cr->cr_curr->ci_val.ci_identifier.bv_len) == 0 ) ) {
1818		if ( cr->cr_curr->ci_next == NULL )
1819			return comp->authorityCertSerialNumber;
1820		else {
1821			cr->cr_curr = cr->cr_curr->ci_next;
1822			return 	ExtractingComponentCertificateSerialNumber ( mem_op, cr, comp->authorityCertSerialNumber );
1823		}
1824	}
1825	return NULL;
1826}  /* ExtractingComponentAuthorityKeyIdentifier */
1827
1828int
1829BDecComponentAuthorityKeyIdentifier PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1830void* mem_op _AND_
1831GenBuf * b _AND_
1832AsnTag tagId0 _AND_
1833AsnLen elmtLen0 _AND_
1834ComponentAuthorityKeyIdentifier **v _AND_
1835AsnLen *bytesDecoded _AND_
1836int mode)
1837{
1838	int seqDone = FALSE;
1839	AsnLen totalElmtsLen1 = 0;
1840	AsnLen elmtLen1;
1841	AsnTag tagId1;
1842	int mandatoryElmtCount1 = 0;
1843	AsnLen totalElmtsLen2 = 0;
1844	AsnLen elmtLen2;
1845	AsnTag tagId2;
1846	int old_mode = mode;
1847	int rc;
1848	ComponentAuthorityKeyIdentifier *k, *t, c_temp;
1849
1850
1851	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1852		memset(&c_temp,0,sizeof(c_temp));
1853		 k = &c_temp;
1854	} else
1855		 k = t = *v;
1856	mode = DEC_ALLOC_MODE_2;
1857    if ((elmtLen0 != INDEFINITE_LEN) && (totalElmtsLen1 == elmtLen0))
1858        seqDone = TRUE;
1859    else
1860    {
1861        tagId1 = BDecTag (b, &totalElmtsLen1 );
1862
1863         if ((elmtLen0 == INDEFINITE_LEN) && (tagId1 == EOC_TAG_ID))
1864        {
1865            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1 )
1866            seqDone = TRUE;
1867        }
1868    }
1869
1870    if ((!seqDone) && ((tagId1 == MAKE_TAG_ID (CNTX, PRIM, 0)) ||
1871(tagId1 == MAKE_TAG_ID (CNTX, CONS, 0))))
1872    {
1873    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1874                rc =    BDecComponentKeyIdentifier (mem_op, b, tagId1, elmtLen1, (&k->keyIdentifier), &totalElmtsLen1, mode);
1875                if ( rc != LDAP_SUCCESS ) return rc;
1876                (&k->keyIdentifier)->identifier.bv_val = (&k->keyIdentifier)->id_buf;
1877                (&k->keyIdentifier)->identifier.bv_len = strlen("keyIdentifier");
1878                strcpy( (&k->keyIdentifier)->identifier.bv_val, "keyIdentifier");
1879    if ((elmtLen0 != INDEFINITE_LEN) && (totalElmtsLen1 == elmtLen0))
1880        seqDone = TRUE;
1881    else
1882    {
1883        tagId1 = BDecTag (b, &totalElmtsLen1 );
1884
1885         if ((elmtLen0 == INDEFINITE_LEN) && (tagId1 == EOC_TAG_ID))
1886        {
1887            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1 )
1888            seqDone = TRUE;
1889        }
1890    }
1891    }
1892
1893    if ((!seqDone) && ((tagId1 == MAKE_TAG_ID (CNTX, CONS, 1))))
1894    {
1895    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1896                rc =    BDecComponentGeneralNames (mem_op, b, tagId1, elmtLen1,
1897(&k->authorityCertIssuer), &totalElmtsLen1, mode);
1898                if ( rc != LDAP_SUCCESS ) return rc;
1899                (k->authorityCertIssuer)->identifier.bv_val = (k->authorityCertIssuer)->id_buf;
1900                (k->authorityCertIssuer)->identifier.bv_len = strlen("authorityCertIssuer");
1901                strcpy( (k->authorityCertIssuer)->identifier.bv_val, "authorityCertIssuer");
1902    if ((elmtLen0 != INDEFINITE_LEN) && (totalElmtsLen1 == elmtLen0))
1903        seqDone = TRUE;
1904    else
1905    {
1906        tagId1 = BDecTag (b, &totalElmtsLen1 );
1907
1908         if ((elmtLen0 == INDEFINITE_LEN) && (tagId1 == EOC_TAG_ID))
1909        {
1910            BDEC_2ND_EOC_OCTET (b, &totalElmtsLen1 )
1911            seqDone = TRUE;
1912        }
1913    }
1914    }
1915
1916    if ((!seqDone) && ((tagId1 == MAKE_TAG_ID (CNTX, PRIM, 2))))
1917    {
1918    elmtLen1 = BDecLen (b, &totalElmtsLen1 );
1919                rc =    BDecComponentCertificateSerialNumber (mem_op, b, tagId1, elmtLen1, (&k->authorityCertSerialNumber), &totalElmtsLen1, DEC_ALLOC_MODE_0 );                if ( rc != LDAP_SUCCESS ) return rc;
1920                (k->authorityCertSerialNumber)->identifier.bv_val = (k->authorityCertSerialNumber)->id_buf;
1921                (k->authorityCertSerialNumber)->identifier.bv_len = strlen("authorityCertSerialNumber");
1922                strcpy( (k->authorityCertSerialNumber)->identifier.bv_val, "authorityCertSerialNumber");
1923        seqDone = TRUE;
1924        if (elmtLen0 == INDEFINITE_LEN)
1925            BDecEoc (b, &totalElmtsLen1 );
1926        else if (totalElmtsLen1 != elmtLen0)
1927        return -1;
1928
1929    }
1930
1931    if (!seqDone)
1932        return -1;
1933
1934	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
1935	*v = t = (ComponentAuthorityKeyIdentifier*) CompAlloc( mem_op, sizeof(ComponentAuthorityKeyIdentifier) );
1936	if ( !t ) return -1;
1937	*t = *k;
1938	}
1939	t->syntax = (Syntax*)NULL;
1940	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
1941	if ( !t->comp_desc ) {
1942		free ( t );
1943		return -1;
1944	}
1945	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAuthorityKeyIdentifier ;
1946	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAuthorityKeyIdentifier ;
1947	t->comp_desc->cd_free = (comp_free_func*)NULL;
1948	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentAuthorityKeyIdentifier;
1949	t->comp_desc->cd_type = ASN_COMPOSITE;
1950	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
1951	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAuthorityKeyIdentifier;
1952    (*bytesDecoded) += totalElmtsLen1;
1953	return LDAP_SUCCESS;
1954}  /* BDecAuthorityKeyIdentifier*/
1955
1956int
1957GDecComponentAuthorityKeyIdentifier PARAMS (( mem_op,b, v, bytesDecoded, mode),
1958void* mem_op _AND_
1959GenBuf * b _AND_
1960ComponentAuthorityKeyIdentifier **v _AND_
1961AsnLen *bytesDecoded _AND_
1962int mode)
1963{
1964	char* peek_head,*peek_head2;
1965	int i, strLen,strLen2, rc, old_mode = mode;
1966	ComponentAuthorityKeyIdentifier *k,*t, c_temp;
1967
1968
1969	if ( !(mode & DEC_ALLOC_MODE_1) ) {
1970		memset(&c_temp,0,sizeof(c_temp));
1971		 k = &c_temp;
1972	} else
1973		 k = t = *v;
1974	mode = DEC_ALLOC_MODE_2;
1975	*bytesDecoded = 0;
1976	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1977		Asn1Error("Error during Reading { in encoded data");
1978		return LDAP_PROTOCOL_ERROR;
1979	}
1980	if(*peek_head != '{'){
1981		Asn1Error("Missing { in encoded data");
1982		return LDAP_PROTOCOL_ERROR;
1983	}
1984
1985	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1986		Asn1Error("Error during Reading identifier");
1987		return LDAP_PROTOCOL_ERROR;
1988	}
1989	if ( strncmp( peek_head, "keyIdentifier", strlen("keyIdentifier") ) == 0 ) {
1990		rc = 	GDecComponentKeyIdentifier (mem_op, b, (&k->keyIdentifier), bytesDecoded, mode);
1991		if ( rc != LDAP_SUCCESS ) return rc;
1992	(&k->keyIdentifier)->identifier.bv_val = peek_head;
1993	(&k->keyIdentifier)->identifier.bv_len = strLen;
1994	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
1995		Asn1Error("Error during Reading , ");
1996		return LDAP_PROTOCOL_ERROR;
1997	}
1998	if(*peek_head != ','){
1999		Asn1Error("Missing , in encoding");
2000		return LDAP_PROTOCOL_ERROR;
2001	}
2002	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
2003	  Asn1Error("Error during Reading identifier");
2004		return LDAP_PROTOCOL_ERROR;
2005	}
2006	}
2007	if ( strncmp( peek_head, "authorityCertIssuer", strlen("authorityCertIssuer") ) == 0 ) {
2008		rc = 	GDecComponentGeneralNames (mem_op, b, (&k->authorityCertIssuer), bytesDecoded, mode);
2009		if ( rc != LDAP_SUCCESS ) return rc;
2010	( k->authorityCertIssuer)->identifier.bv_val = peek_head;
2011	( k->authorityCertIssuer)->identifier.bv_len = strLen;
2012	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
2013		Asn1Error("Error during Reading , ");
2014		return LDAP_PROTOCOL_ERROR;
2015	}
2016	if(*peek_head != ','){
2017		Asn1Error("Missing , in encoding");
2018		return LDAP_PROTOCOL_ERROR;
2019	}
2020	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ){
2021	  Asn1Error("Error during Reading identifier");
2022		return LDAP_PROTOCOL_ERROR;
2023	}
2024	}
2025	if ( strncmp( peek_head, "authorityCertSerialNumber", strlen("authorityCertSerialNumber") ) == 0 ) {
2026		rc = 	GDecComponentCertificateSerialNumber (mem_op, b, (&k->authorityCertSerialNumber), bytesDecoded, DEC_ALLOC_MODE_0 );
2027		if ( rc != LDAP_SUCCESS ) return rc;
2028	( k->authorityCertSerialNumber)->identifier.bv_val = peek_head;
2029	( k->authorityCertSerialNumber)->identifier.bv_len = strLen;
2030	}
2031	if( !(strLen = LocateNextGSERToken(mem_op,b,&peek_head,GSER_NO_COPY)) ) {
2032		Asn1Error("Error during Reading } in encoding");
2033		return LDAP_PROTOCOL_ERROR;
2034	}
2035	if(*peek_head != '}'){
2036		Asn1Error("Missing } in encoding");
2037		return LDAP_PROTOCOL_ERROR;
2038	}
2039	if( !(old_mode & DEC_ALLOC_MODE_1) ) {
2040	*v = t = (ComponentAuthorityKeyIdentifier*) CompAlloc( mem_op, sizeof(ComponentAuthorityKeyIdentifier) );
2041	if ( !t ) return -1;
2042	*t = *k;
2043	}
2044	t->syntax = (Syntax*)NULL;
2045	t->comp_desc = CompAlloc( mem_op, sizeof( ComponentDesc ) );
2046	if ( !t->comp_desc ) {
2047		free ( t );
2048		return -1;
2049	}
2050	t->comp_desc->cd_gser_decoder = (gser_decoder_func*)GDecComponentAuthorityKeyIdentifier ;
2051	t->comp_desc->cd_ber_decoder = (ber_decoder_func*)BDecComponentAuthorityKeyIdentifier ;
2052	t->comp_desc->cd_free = (comp_free_func*)NULL;
2053	t->comp_desc->cd_extract_i = (extract_component_from_id_func*)ExtractingComponentAuthorityKeyIdentifier;
2054	t->comp_desc->cd_type = ASN_COMPOSITE;
2055	t->comp_desc->cd_type_id = COMPOSITE_ASN1_TYPE;
2056	t->comp_desc->cd_all_match = (allcomponent_matching_func*)MatchingComponentAuthorityKeyIdentifier;
2057	return LDAP_SUCCESS;
2058}  /* GDecAuthorityKeyIdentifier*/
2059
2060
2061