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