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@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