1 /*        $NetBSD: authorityKeyIdentifier.c,v 1.2 2021/08/14 16:14:51 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 
BDecComponentAuthorityKeyIdentifierTop(void * mem_op,GenBuf * b,void * v,AsnLen * bytesDecoded,int mode)12 BDecComponentAuthorityKeyIdentifierTop( 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 
init_module_AuthorityKeyIdentifierDefinition()27 void init_module_AuthorityKeyIdentifierDefinition() {
28           InstallOidDecoderMapping( "2.5.29.35", NULL,
29                                         GDecComponentAuthorityKeyIdentifier,
30                                         BDecComponentAuthorityKeyIdentifierTop,
31                                         ExtractingComponentAuthorityKeyIdentifier,
32                                         MatchingComponentAuthorityKeyIdentifier );
33 }
34 
35 int
MatchingComponentOtherName(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)36 MatchingComponentOtherName ( 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 
56 void*
ExtractingComponentOtherName(void * mem_op,ComponentReference * cr,ComponentOtherName * comp)57 ExtractingComponentOtherName ( 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 
75 int
76 BDecComponentOtherName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
77 void* mem_op _AND_
78 GenBuf * b _AND_
79 AsnTag tagId0 _AND_
80 AsnLen elmtLen0 _AND_
81 ComponentOtherName **v _AND_
82 AsnLen *bytesDecoded _AND_
83 int 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 
169 int
170 GDecComponentOtherName PARAMS (( mem_op,b, v, bytesDecoded, mode),
171 void* mem_op _AND_
172 GenBuf * b _AND_
173 ComponentOtherName **v _AND_
174 AsnLen *bytesDecoded _AND_
175 int 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 
257 int
MatchingComponentORAddress(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)258 MatchingComponentORAddress ( 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 
281 void*
ExtractingComponentORAddress(void * mem_op,ComponentReference * cr,ComponentORAddress * comp)282 ExtractingComponentORAddress ( 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 
306 int
307 BDecComponentORAddress PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
308 void* mem_op _AND_
309 GenBuf * b _AND_
310 AsnTag tagId0 _AND_
311 AsnLen elmtLen0 _AND_
312 ComponentORAddress **v _AND_
313 AsnLen *bytesDecoded _AND_
314 int 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 
413 int
414 GDecComponentORAddress PARAMS (( mem_op,b, v, bytesDecoded, mode),
415 void* mem_op _AND_
416 GenBuf * b _AND_
417 ComponentORAddress **v _AND_
418 AsnLen *bytesDecoded _AND_
419 int 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 
519 int
MatchingComponentDirectoryString(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)520 MatchingComponentDirectoryString ( 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 
558 void*
ExtractingComponentDirectoryString(void * mem_op,ComponentReference * cr,ComponentDirectoryString * comp)559 ExtractingComponentDirectoryString ( 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 
616 int
617 BDecComponentDirectoryString PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
618 void* mem_op _AND_
619 GenBuf * b _AND_
620 AsnTag tagId0 _AND_
621 AsnLen elmtLen0 _AND_
622 ComponentDirectoryString **v _AND_
623 AsnLen *bytesDecoded _AND_
624 int 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 
721 int
722 GDecComponentDirectoryString PARAMS (( mem_op,b, v, bytesDecoded, mode),
723 void* mem_op _AND_
724 GenBuf * b _AND_
725 ComponentDirectoryString **v _AND_
726 AsnLen *bytesDecoded _AND_
727 int 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 
813 int
MatchingComponentEDIPartyName(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)814 MatchingComponentEDIPartyName ( 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 
835 void*
ExtractingComponentEDIPartyName(void * mem_op,ComponentReference * cr,ComponentEDIPartyName * comp)836 ExtractingComponentEDIPartyName ( 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 
858 int
859 BDecComponentEDIPartyName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
860 void* mem_op _AND_
861 GenBuf * b _AND_
862 AsnTag tagId0 _AND_
863 AsnLen elmtLen0 _AND_
864 ComponentEDIPartyName **v _AND_
865 AsnLen *bytesDecoded _AND_
866 int 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 
961 int
962 GDecComponentEDIPartyName PARAMS (( mem_op,b, v, bytesDecoded, mode),
963 void* mem_op _AND_
964 GenBuf * b _AND_
965 ComponentEDIPartyName **v _AND_
966 AsnLen *bytesDecoded _AND_
967 int 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 
1049 int
MatchingComponentGeneralName(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)1050 MatchingComponentGeneralName ( 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 
1100 void*
ExtractingComponentGeneralName(void * mem_op,ComponentReference * cr,ComponentGeneralName * comp)1101 ExtractingComponentGeneralName ( 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 
1198 int
1199 BDecComponentGeneralName PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1200 void* mem_op _AND_
1201 GenBuf * b _AND_
1202 AsnTag tagId0 _AND_
1203 AsnLen elmtLen0 _AND_
1204 ComponentGeneralName **v _AND_
1205 AsnLen *bytesDecoded _AND_
1206 int 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):
1233 if (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 );
1252 if ((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 );
1272 if ((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):
1291 if (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):
1324 if (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 );
1343 if ((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 );
1363 if ((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):
1382 if (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 
1426 int
1427 GDecComponentGeneralName PARAMS (( mem_op,b, v, bytesDecoded, mode),
1428 void* mem_op _AND_
1429 GenBuf * b _AND_
1430 ComponentGeneralName **v _AND_
1431 AsnLen *bytesDecoded _AND_
1432 int 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 
1546 int
MatchingComponentGeneralNames(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)1547 MatchingComponentGeneralNames ( 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 
1576 void*
ExtractingComponentGeneralNames(void * mem_op,ComponentReference * cr,ComponentGeneralNames * comp)1577 ExtractingComponentGeneralNames ( 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 
1634 int
1635 BDecComponentGeneralNames PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1636 void* mem_op _AND_
1637 GenBuf * b _AND_
1638 AsnTag tagId0 _AND_
1639 AsnLen elmtLen0 _AND_
1640 ComponentGeneralNames **v _AND_
1641 AsnLen *bytesDecoded _AND_
1642 int 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 
1699 int
1700 GDecComponentGeneralNames PARAMS (( mem_op,b, v, bytesDecoded, mode),
1701 void* mem_op _AND_
1702 GenBuf * b _AND_
1703 ComponentGeneralNames **v _AND_
1704 AsnLen *bytesDecoded _AND_
1705 int 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 
1772 int
MatchingComponentAuthorityKeyIdentifier(char * oid,ComponentSyntaxInfo * csi_attr,ComponentSyntaxInfo * csi_assert)1773 MatchingComponentAuthorityKeyIdentifier ( 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 
1799 void*
ExtractingComponentAuthorityKeyIdentifier(void * mem_op,ComponentReference * cr,ComponentAuthorityKeyIdentifier * comp)1800 ExtractingComponentAuthorityKeyIdentifier ( 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 
1828 int
1829 BDecComponentAuthorityKeyIdentifier PARAMS ((b, tagId0, elmtLen0, v, bytesDecoded, mode),
1830 void* mem_op _AND_
1831 GenBuf * b _AND_
1832 AsnTag tagId0 _AND_
1833 AsnLen elmtLen0 _AND_
1834 ComponentAuthorityKeyIdentifier **v _AND_
1835 AsnLen *bytesDecoded _AND_
1836 int 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 
1956 int
1957 GDecComponentAuthorityKeyIdentifier PARAMS (( mem_op,b, v, bytesDecoded, mode),
1958 void* mem_op _AND_
1959 GenBuf * b _AND_
1960 ComponentAuthorityKeyIdentifier **v _AND_
1961 AsnLen *bytesDecoded _AND_
1962 int 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