pkix_pl_system.h (51934B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 /* 5 * This file defines several platform independent functions to make system 6 * calls in a portable manner. 7 * 8 */ 9 10 #ifndef _PKIX_PL_SYSTEM_H 11 #define _PKIX_PL_SYSTEM_H 12 13 #include "pkixt.h" 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 /* General 20 * 21 * Please refer to the libpkix Programmer's Guide for detailed information 22 * about how to use the libpkix library. Certain key warnings and notices from 23 * that document are repeated here for emphasis. 24 * 25 * All identifiers in this file (and all public identifiers defined in 26 * libpkix) begin with "PKIX_". Private identifiers only intended for use 27 * within the library begin with "pkix_". 28 * 29 * A function returns NULL upon success, and a PKIX_Error pointer upon failure. 30 * 31 * Unless otherwise noted, for all accessor (gettor) functions that return a 32 * PKIX_PL_Object pointer, callers should assume that this pointer refers to a 33 * shared object. Therefore, the caller should treat this shared object as 34 * read-only and should not modify this shared object. When done using the 35 * shared object, the caller should release the reference to the object by 36 * using the PKIX_PL_Object_DecRef function. 37 * 38 * While a function is executing, if its arguments (or anything referred to by 39 * its arguments) are modified, free'd, or destroyed, the function's behavior 40 * is undefined. 41 * 42 */ 43 44 /* 45 * FUNCTION: PKIX_PL_Initialize 46 * DESCRIPTION: 47 * 48 * XXX If this function is really only meant to be used by PKIX_Initialize, 49 * why don't we just put it in a private header file rather than the public 50 * API. I think it may confuse users. 51 * 52 * This function should NOT be called by applications. It is only meant to 53 * be used internally. The application needs only to call PKIX_Initialize, 54 * which in turn will call this function. 55 * 56 * This function initializes data structures critical to the operation of 57 * libpkix. If initialization is not successful, an Error pointer is 58 * returned. This function should only be called once. If it is called more 59 * than once, the behavior is undefined. 60 * 61 * No PKIX_* types and functions should be used before this function is 62 * called and returns successfully. 63 * 64 * PARAMETERS: 65 * "platformInitNeeded" 66 * Boolean indicating whether platform initialization is to be called 67 * "useArenas" 68 * Boolean indicating whether allocation is to be done using arenas or 69 * individual allocation (malloc). 70 * "pPlContext" 71 * Address at which platform-specific context pointer is stored. Must be 72 * non-NULL. 73 * THREAD SAFETY: 74 * Not Thread Safe 75 * 76 * This function assumes that no other thread is calling this function while 77 * it is executing. 78 * RETURNS: 79 * Returns NULL if the function succeeds. 80 * Returns a Fatal Error if the function fails in an unrecoverable way. 81 */ 82 PKIX_Error * 83 PKIX_PL_Initialize( 84 PKIX_Boolean platformInitNeeded, 85 PKIX_Boolean useArenas, 86 void **pPlContext); 87 88 /* 89 * FUNCTION: PKIX_PL_Shutdown 90 * DESCRIPTION: 91 * 92 * XXX If this function is really only meant to be used by PKIX_Shutdown, 93 * why don't we just put it in a private header file rather than the public 94 * API. I think it may confuse users. 95 * 96 * This function should NOT be called by applications. It is only meant to 97 * be used internally. The application needs only to call PKIX_Shutdown, 98 * which in turn will call this function. 99 * 100 * This function deallocates any memory used by the Portability Layer (PL) 101 * component of the libpkix library and shuts down any ongoing operations. 102 * This function should only be called once. If it is called more than once, 103 * the behavior is undefined. 104 * 105 * No PKIX_* types and functions should be used after this function is called 106 * and returns successfully. 107 * 108 * PARAMETERS: 109 * "platformInitNeeded" 110 * Boolean value of whether PKIX initialized NSS: PKIX_TRUE if we 111 * called nssInit, PKIX_FALSE otherwise 112 * "plContext" 113 * Platform-specific context pointer. 114 * THREAD SAFETY: 115 * Not Thread Safe 116 * 117 * This function makes use of global variables and should only be called once. 118 * RETURNS: 119 * Returns NULL if the function succeeds. 120 * Returns a Fatal Error if the function fails in an unrecoverable way. 121 */ 122 PKIX_Error * 123 PKIX_PL_Shutdown(void *plContext); 124 125 /* standard memory management operations (not reference-counted) */ 126 127 /* 128 * FUNCTION: PKIX_PL_Malloc 129 * DESCRIPTION: 130 * 131 * Allocates a block of "size" bytes. The bytes are not initialized. A 132 * pointer to the newly allocated memory will be stored at "pMemory". The 133 * memory allocated by PKIX_PL_Malloc() may only be freed by PKIX_PL_Free(). 134 * If "size" equals zero, this function stores NULL at "pMemory". 135 * 136 * PARAMETERS: 137 * "size" 138 * Number of bytes to allocate. 139 * "pMemory" 140 * Address where newly allocated pointer will be stored. Must be non-NULL. 141 * "plContext" 142 * Platform-specific context pointer. 143 * THREAD SAFETY: 144 * Thread safety depends on underlying thread safety of platform used by PL. 145 * RETURNS: 146 * Returns NULL if the function succeeds. 147 * Returns a Fatal Error if the function fails in an unrecoverable way. 148 */ 149 PKIX_Error * 150 PKIX_PL_Malloc( 151 PKIX_UInt32 size, 152 void **pMemory, 153 void *plContext); 154 155 /* 156 * FUNCTION: PKIX_PL_Calloc 157 * DESCRIPTION: 158 * 159 * Allocates memory for an array of "nElem" elements, with each element 160 * requiring "elSize" bytes, and with all the bits initialized to zero. A 161 * pointer to the newly allocated memory will be stored at "pMemory". The 162 * memory allocated by PKIX_PL_Calloc() may only be freed by PKIX_PL_Free(). 163 * If "nElem" equals zero or "elSize" equals zero, this function stores NULL 164 * at "pMemory". 165 * 166 * PARAMETERS: 167 * "nElem" 168 * Number of elements needed. 169 * "elSize" 170 * Number of bytes needed per element. 171 * "pMemory" 172 * Address where newly allocated pointer will be stored. Must be non-NULL. 173 * "plContext" 174 * Platform-specific context pointer. 175 * THREAD SAFETY: 176 * Thread safety depends on underlying thread safety of platform used by PL. 177 * RETURNS: 178 * Returns NULL if the function succeeds. 179 * Returns a Fatal Error if the function fails in an unrecoverable way. 180 */ 181 PKIX_Error * 182 PKIX_PL_Calloc( 183 PKIX_UInt32 nElem, 184 PKIX_UInt32 elSize, 185 void **pMemory, 186 void *plContext); 187 188 /* 189 * FUNCTION: PKIX_PL_Realloc 190 * DESCRIPTION: 191 * 192 * Resizes an existing block of memory (pointed to by "ptr") to "size" bytes. 193 * Stores a pointer to the resized memory at "pNewPtr". The "ptr" must 194 * originate from either PKIX_PL_Malloc(), PKIX_PL_Realloc(), or 195 * PKIX_PL_Calloc(). If "ptr" is NULL, this function behaves as if 196 * PKIX_PL_Malloc were called. If "ptr" is not NULL and "size" equals zero, 197 * the memory pointed to by "ptr" is deallocated and this function stores 198 * NULL at "pPtr". 199 * 200 * PARAMETERS: 201 * "ptr" 202 * A pointer to an existing block of memory. 203 * "size" 204 * New size in bytes. 205 * "pPtr" 206 * Address where newly allocated pointer will be stored. Must be non-NULL. 207 * "plContext" 208 * Platform-specific context pointer. 209 * THREAD SAFETY: 210 * Thread safety depends on underlying thread safety of platform used by PL. 211 * RETURNS: 212 * Returns NULL if the function succeeds. 213 * Returns a Fatal Error if the function fails in an unrecoverable way. 214 */ 215 PKIX_Error * 216 PKIX_PL_Realloc( 217 void *ptr, 218 PKIX_UInt32 size, 219 void **pNewPtr, 220 void *plContext); 221 222 /* 223 * FUNCTION: PKIX_PL_Free 224 * DESCRIPTION: 225 * 226 * Frees a block of memory pointed to by "ptr". This value must originate with 227 * either PKIX_PL_Malloc(), PKIX_PL_Calloc, or PKIX_PL_Realloc(). If "ptr" is 228 * NULL, the function has no effect. 229 * 230 * PARAMETERS: 231 * "ptr" 232 * A pointer to an existing block of memory. 233 * "plContext" 234 * Platform-specific context pointer. 235 * THREAD SAFETY: 236 * Thread safety depends on underlying thread safety of platform used by PL. 237 * RETURNS: 238 * Returns NULL always. 239 */ 240 PKIX_Error * 241 PKIX_PL_Free( 242 void *ptr, 243 void *plContext); 244 245 /* Callback Types 246 * 247 * The next few typedefs define function pointer types for the standard 248 * functions associated with every object type. See the Implementation 249 * Guidelines or the comments below for more information. 250 */ 251 252 /* 253 * TYPE: PKIX_PL_DestructorCallback 254 * DESCRIPTION: 255 * 256 * This callback function destroys (or DecRef's) any pointers contained in 257 * the user data for the Object pointed to by "object" before the Object is 258 * destroyed. 259 * 260 * PARAMETERS: 261 * "object" 262 * Address of Object to destroy. Must be non-NULL. 263 * "plContext" 264 * Platform-specific context pointer. 265 * THREAD SAFETY: 266 * Thread Safe 267 * 268 * Multiple threads must be able to safely call this function without 269 * worrying about conflicts (as long as they're not operating on the same 270 * object and nobody else is performing an operation on the object at the 271 * same time). Both of these conditions should be guaranteed by the fact that 272 * the object's ref count was reduced to 0 in a lock that's still held when 273 * this callback is called. 274 * RETURNS: 275 * Returns NULL if the function succeeds. 276 * Returns an error if the function fails in a non-fatal way. 277 * Returns a Fatal Error if the function fails in an unrecoverable way. 278 */ 279 typedef PKIX_Error * 280 (*PKIX_PL_DestructorCallback)( 281 PKIX_PL_Object *object, 282 void *plContext); 283 284 /* 285 * TYPE: PKIX_PL_EqualsCallback 286 * DESCRIPTION: 287 * 288 * This callback function compares the Object pointed to by "firstObject" with 289 * the Object pointed to by "secondObject" for equality and stores the result 290 * at "pResult" (PKIX_TRUE if equal; PKIX_FALSE if not). 291 * 292 * PARAMETERS: 293 * "firstObject" 294 * Address of first object to compare. Must be non-NULL. 295 * "secondObject" 296 * Address of second object to compare. Must be non-NULL. 297 * "pResult" 298 * Address where Boolean will be stored. Must be non-NULL. 299 * "plContext" 300 * Platform-specific context pointer. 301 * THREAD SAFETY: 302 * Thread Safe 303 * 304 * Multiple threads must be able to safely call this function without 305 * worrying about conflicts, even if they're operating on the same objects. 306 * RETURNS: 307 * Returns NULL if the function succeeds. 308 * Returns an error if the function fails in a non-fatal way. 309 * Returns a Fatal Error if the function fails in an unrecoverable way. 310 */ 311 typedef PKIX_Error * 312 (*PKIX_PL_EqualsCallback)( 313 PKIX_PL_Object *firstObject, 314 PKIX_PL_Object *secondObject, 315 PKIX_Boolean *pResult, 316 void *plContext); 317 318 /* 319 * TYPE: PKIX_PL_HashcodeCallback 320 * DESCRIPTION: 321 * 322 * This callback function computes the hashcode of the Object pointed to by 323 * "object" and stores the result at "pValue". 324 * 325 * PARAMETERS: 326 * "object" 327 * Address of Object whose hashcode is desired. Must be non-NULL. 328 * "pValue" 329 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 330 * "plContext" 331 * Platform-specific context pointer. 332 * THREAD SAFETY: 333 * Thread Safe 334 * 335 * Multiple threads must be able to safely call this function without 336 * worrying about conflicts, even if they're operating on the same object. 337 * RETURNS: 338 * Returns NULL if the function succeeds. 339 * Returns an error if the function fails in a non-fatal way. 340 * Returns a Fatal Error if the function fails in an unrecoverable way. 341 */ 342 typedef PKIX_Error * 343 (*PKIX_PL_HashcodeCallback)( 344 PKIX_PL_Object *object, 345 PKIX_UInt32 *pValue, 346 void *plContext); 347 348 /* 349 * TYPE: PKIX_PL_ToStringCallback 350 * DESCRIPTION: 351 * 352 * This callback function converts the Object pointed to by "object" to a 353 * string representation and stores the result at "pString". 354 * 355 * PARAMETERS: 356 * "object" 357 * Object to get a string representation from. Must be non-NULL. 358 * "pString" 359 * Address where object pointer will be stored. Must be non-NULL. 360 * "plContext" 361 * Platform-specific context pointer. 362 * THREAD SAFETY: 363 * Thread Safe 364 * 365 * Multiple threads must be able to safely call this function without 366 * worrying about conflicts, even if they're operating on the same object. 367 * RETURNS: 368 * Returns NULL if the function succeeds. 369 * Returns an error if the function fails in a non-fatal way. 370 * Returns a Fatal Error if the function fails in an unrecoverable way. 371 */ 372 typedef PKIX_Error * 373 (*PKIX_PL_ToStringCallback)( 374 PKIX_PL_Object *object, 375 PKIX_PL_String **pString, 376 void *plContext); 377 378 /* 379 * TYPE: PKIX_PL_ComparatorCallback 380 * DESCRIPTION: 381 * 382 * This callback function determines how the Object pointed to by 383 * "firstObject" compares to the Object pointed to by "secondObject" and 384 * stores the result at "pResult". 385 * 386 * Result is less than 0 if firstObject < secondObject 387 * Result equals 0 if firstObject = secondObject 388 * Result is greater than 0 if firstObject > secondObject 389 * 390 * PARAMETERS: 391 * "firstObject" 392 * Address of the first Object to compare. Must be non-NULL. 393 * "secondObject" 394 * Address of the second Object to compare. Must be non-NULL. 395 * "pResult" 396 * Address where PKIX_Int32 will be stored. Must be non-NULL. 397 * "plContext" 398 * Platform-specific context pointer. 399 * THREAD SAFETY: 400 * Thread Safe 401 * 402 * Multiple threads must be able to safely call this function without 403 * worrying about conflicts, even if they're operating on the same objects. 404 * RETURNS: 405 * Returns NULL if the function succeeds. 406 * Returns an error if the function fails in a non-fatal way. 407 * Returns a Fatal Error if the function fails in an unrecoverable way. 408 */ 409 typedef PKIX_Error * 410 (*PKIX_PL_ComparatorCallback)( 411 PKIX_PL_Object *firstObject, 412 PKIX_PL_Object *secondObject, 413 PKIX_Int32 *pResult, 414 void *plContext); 415 416 /* 417 * TYPE: PKIX_PL_DuplicateCallback 418 * DESCRIPTION: 419 * 420 * This callback function creates a copy of the Object pointed to by "object" 421 * and stores it at "pNewObject". Changes to the copy will not affect the 422 * original and vice versa. 423 * 424 * Note that if "object" is immutable, the Duplicate callback function simply 425 * needs to increment the reference count on "object" and return a reference 426 * to "object". 427 * 428 * PARAMETERS: 429 * "object" 430 * Address of the object to be copied. Must be non-NULL. 431 * "pNewObject" 432 * Address where object pointer will be stored. Must be non-NULL. 433 * "plContext" 434 * Platform-specific context pointer. 435 * THREAD SAFETY: 436 * Thread Safe 437 * 438 * Multiple threads must be able to safely call this function without 439 * worrying about conflicts, even if they're operating on the same object. 440 * RETURNS: 441 * Returns NULL if the function succeeds. 442 * Returns an error if the function fails in a non-fatal way. 443 * Returns a Fatal Error if the function fails in an unrecoverable way. 444 */ 445 typedef PKIX_Error * 446 (*PKIX_PL_DuplicateCallback)( 447 PKIX_PL_Object *object, 448 PKIX_PL_Object **pNewObject, 449 void *plContext); 450 451 /* reference-counted objects */ 452 453 /* 454 * FUNCTION: PKIX_PL_Object_Alloc 455 * DESCRIPTION: 456 * 457 * Allocates a new Object of type "type" with "size" bytes and stores the 458 * resulting pointer at "pObject". The reference count of the newly 459 * allocated object will be initialized to 1. To improve performance, each 460 * object maintains a small cache for the results of Hashcode and ToString. 461 * Mutable objects should call InvalidateCache whenever changes are made to 462 * the object's state (after creation). If an error occurs during allocation, 463 * "pObject" will be set to NULL. If "size" equals zero, this function creates 464 * an Object with a reference count of 1, and places a pointer to unallocated 465 * memory at "pMemory". 466 * 467 * PARAMETERS: 468 * "type" 469 * The type code of this object. See pkixt.h for codes. The type code 470 * must be previously registered with PKIX_PL_Object_RegisterType(). 471 * "size" 472 * The number of bytes needed for this object. 473 * "pMemory" 474 * Address where object pointer will be stored. Must be non-NULL. 475 * "plContext" 476 * Platform-specific context pointer. 477 * THREAD SAFETY: 478 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 479 * RETURNS: 480 * Returns NULL if the function succeeds. 481 * Returns a Fatal Error if the function fails in an unrecoverable way. 482 */ 483 PKIX_Error * 484 PKIX_PL_Object_Alloc( 485 PKIX_TYPENUM type, 486 PKIX_UInt32 size, 487 PKIX_PL_Object **pObject, 488 void *plContext); 489 490 /* 491 * FUNCTION: PKIX_PL_Object_IsTypeRegistered 492 * DESCRIPTION: 493 * 494 * Checks whether "type" has been registered by a previous call to 495 * PKIX_PL_Object_RegisterType() and stores the Boolean result at "pBool". 496 * This function will typically only be called by constructors for specific 497 * types. 498 * 499 * PARAMETERS: 500 * "type" 501 * The type code to check if valid. 502 * "pBool" 503 * Address where Boolean will be stored. Must be non-NULL. 504 * "plContext" 505 * Platform-specific context pointer. 506 * THREAD SAFETY: 507 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 508 * RETURNS: 509 * Returns NULL if the function succeeds. 510 * Returns a Fatal Error if the function fails in an unrecoverable way. 511 */ 512 PKIX_Error * 513 PKIX_PL_Object_IsTypeRegistered( 514 PKIX_UInt32 type, 515 PKIX_Boolean *pBool, 516 void *plContext); 517 518 #ifdef PKIX_USER_OBJECT_TYPE 519 /* 520 * FUNCTION: PKIX_PL_Object_RegisterType 521 * DESCRIPTION: 522 * 523 * Registers a new Object with type value "type" and associates it with a set 524 * of functions ("destructor", "equalsFunction", "hashcodeFunction", 525 * "toStringFunction", "comparator", "duplicateFunction"). The new type value 526 * is also associated with a string pointed to by "description", which is used 527 * by the default ToStringCallback. This function may only be called with a 528 * particular "type" value once. If "destructor", "equalsFunction", 529 * "hashcodeFunction", or "toStringFunction" are NULL, default functions will 530 * be registered. However, if "comparator" and "duplicateFunction" are NULL, 531 * no functions will be registered and calls to PKIX_PL_Object_Compare and 532 * PKIX_PL_Object_Duplicate will result in an error. 533 * 534 * PARAMETERS: 535 * "type" 536 * The type code. 537 * "description" 538 * The string used by the default ToStringCallback. Default used if NULL. 539 * "destructor" 540 * The DestructorCallback function to be set. Default used if NULL. 541 * "equalsFunction" 542 * The EqualsCallback function to be set. Default used if NULL. 543 * "hashcodeFunction" 544 * The HashcodeCallback function to be set. Default used if NULL. 545 * "toStringFunction" 546 * The ToStringCallback function to be set. Default used if NULL. 547 * "comparator" 548 * The ComparatorCallback function to be set. None set if NULL. If no 549 * callback function is set in this field, calls to 550 * PKIX_PL_Object_Compare() will result in an error. 551 * "duplicateFunction" 552 * The DuplicateCallback function to be set. None set if NULL. If no 553 * callback function is set in this field, calls to 554 * PKIX_PL_Object_Duplicate() will result in an error. 555 * "plContext" 556 * Platform-specific context pointer. 557 * THREAD SAFETY: 558 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 559 * RETURNS: 560 * Returns NULL if the function succeeds. 561 * Returns an Object Error if "type" is already registered. 562 * Returns a Fatal Error if the function fails in an unrecoverable way. 563 */ 564 PKIX_Error * 565 PKIX_PL_Object_RegisterType( 566 PKIX_UInt32 type, 567 char *description, 568 PKIX_PL_DestructorCallback destructor, 569 PKIX_PL_EqualsCallback equalsFunction, 570 PKIX_PL_HashcodeCallback hashcodeFunction, 571 PKIX_PL_ToStringCallback toStringFunction, 572 PKIX_PL_ComparatorCallback comparator, 573 PKIX_PL_DuplicateCallback duplicateFunction, 574 void *plContext); 575 576 #endif 577 /* 578 * FUNCTION: PKIX_PL_Object_InvalidateCache 579 * DESCRIPTION: 580 * 581 * Invalidates the cache of the Object pointed to by "object". The cache 582 * contains results of Hashcode and ToString. This function should be used by 583 * mutable objects whenever changes are made to the Object's state (after 584 * creation). 585 * 586 * For example, if ToString is called on a mutable Object, the result will be 587 * computed, cached, and returned. If the Object's state does not change, a 588 * subsequent call to ToString will recognize that the relevant result is 589 * cached and will simply return the result (without calling the Object's 590 * ToStringCallback to recompute it). However, when the Object's state 591 * changes, the cache needs to be invalidated in order to force a subsequent 592 * call to ToString to recompute the result. 593 * 594 * PARAMETERS: 595 * "object" 596 * Address of Object whose cache is to be invalidated. Must be non-NULL. 597 * "plContext" 598 * Platform-specific context pointer. 599 * 600 * THREAD SAFETY 601 * Thread Safe - Object Type Table is locked during modification. 602 * 603 * Multiple threads can safely call this function without worrying about 604 * conflicts, even if they're operating on the same object. 605 * RETURNS: 606 * Returns NULL if the function succeeds. 607 * Returns a Fatal Error if the function fails in an unrecoverable way. 608 */ 609 PKIX_Error * 610 PKIX_PL_Object_InvalidateCache( 611 PKIX_PL_Object *object, 612 void *plContext); 613 614 /* 615 * FUNCTION: PKIX_PL_Object_IncRef 616 * DESCRIPTION: 617 * 618 * Increments the reference count of the Object pointed to by "object". 619 * 620 * PARAMETERS: 621 * "object" 622 * Address of Object whose reference count is to be incremented. 623 * Must be non-NULL. 624 * "plContext" 625 * Platform-specific context pointer. 626 * THREAD SAFETY: 627 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 628 * RETURNS: 629 * Returns NULL if the function succeeds. 630 * Returns a Fatal Error if the function fails in an unrecoverable way. 631 */ 632 PKIX_Error * 633 PKIX_PL_Object_IncRef( 634 PKIX_PL_Object *object, 635 void *plContext); 636 637 /* 638 * FUNCTION: PKIX_PL_Object_DecRef 639 * DESCRIPTION: 640 * 641 * Decrements the reference count of the Object pointed to by "object". If the 642 * resulting reference count is zero, the destructor (if any) registered for 643 * the Object's type (by PKIX_PL_RegisterType) will be called and then the 644 * Object will be destroyed. 645 * 646 * PARAMETERS: 647 * "object" 648 * Address of Object whose reference count is to be decremented. 649 * Must be non-NULL. 650 * "plContext" 651 * Platform-specific context pointer. 652 * THREAD SAFETY: 653 * If destructor is not called, multiple threads can safely call this function 654 * without worrying about conflicts, even if they're operating on the same 655 * object. If destructor is called, thread safety depends on the callback 656 * defined by PKIX_PL_RegisterType(). 657 * RETURNS: 658 * Returns NULL if the function succeeds. 659 * Returns a Fatal Error if the function fails in an unrecoverable way. 660 */ 661 PKIX_Error * 662 PKIX_PL_Object_DecRef( 663 PKIX_PL_Object *object, 664 void *plContext); 665 666 /* 667 * FUNCTION: PKIX_PL_Object_Equals 668 * DESCRIPTION: 669 * 670 * Compares the Object pointed to by "firstObject" with the Object pointed to 671 * by "secondObject" for equality using the callback function registered for 672 * "firstObject"'s type, and stores the Boolean result at "pResult". While 673 * typical callbacks will return PKIX_FALSE if the objects are of different 674 * types, other callbacks may be capable of comparing objects of different 675 * types [which may correctly result in cases where Equals(first, second) 676 * differs from Equals(second, first)]. 677 * 678 * PARAMETERS: 679 * "firstObject" 680 * Address of the first Object to compare. Must be non-NULL. 681 * The EqualsCallback for this Object will be called. 682 * "secondObject" 683 * Address of the second Object to compare. Must be non-NULL. 684 * "pResult" 685 * Address where Boolean will be stored. Must be non-NULL. 686 * "plContext" 687 * Platform-specific context pointer. 688 * THREAD SAFETY: 689 * Thread safety depends on the callback defined by PKIX_PL_RegisterType(). 690 * RETURNS: 691 * Returns NULL if the function succeeds. 692 * Returns an Object Error if the function fails in a non-fatal way. 693 * Returns a Fatal Error if the function fails in an unrecoverable way. 694 */ 695 PKIX_Error * 696 PKIX_PL_Object_Equals( 697 PKIX_PL_Object *firstObject, 698 PKIX_PL_Object *secondObject, 699 PKIX_Boolean *pResult, 700 void *plContext); 701 702 /* 703 * FUNCTION: PKIX_PL_Object_Hashcode 704 * DESCRIPTION: 705 * 706 * Computes a hashcode of the Object pointed to by "object" using the 707 * callback registered for "object"'s type and stores it at "pValue". Two 708 * objects which are equal should have the same hashcode. Once a call to 709 * Hashcode has been made, the results are cached and subsequent calls to 710 * Hashcode will return the cached value. For mutable objects, an 711 * InvalidateCache function is provided, which should be called whenever 712 * changes are made to the object's state (after creation). 713 * 714 * PARAMETERS: 715 * "object" 716 * Address of the Object whose hashcode is desired. Must be non-NULL. 717 * The HashcodeCallback for this object will be called. 718 * "pValue" 719 * Address where PKIX_Int32 will be stored. Must be non-NULL. 720 * "plContext" 721 * Platform-specific context pointer. 722 * 723 * THREAD SAFETY: 724 * Thread safety depends on the callback defined by PKIX_PL_RegisterType(). 725 * RETURNS: 726 * Returns NULL if the function succeeds. 727 * Returns an Object Error if the function fails in a non-fatal way. 728 * Returns a Fatal Error if the function fails in an unrecoverable way. 729 */ 730 PKIX_Error * 731 PKIX_PL_Object_Hashcode( 732 PKIX_PL_Object *object, 733 PKIX_UInt32 *pValue, 734 void *plContext); 735 736 /* 737 * FUNCTION: PKIX_PL_Object_ToString 738 * DESCRIPTION: 739 * 740 * Creates a string representation of the Object pointed to by "object" using 741 * the callback registered for "object"'s type and stores it at "pString". 742 * Once a call to ToString has been made, the results are cached and 743 * subsequent calls to ToString will return the cached value. For mutable 744 * objects, an InvalidateCache function is provided, which should be called 745 * whenever changes are made to the object's state (after creation). 746 * 747 * PARAMETERS: 748 * "object" 749 * Address of Object whose string representation is desired. 750 * Must be non-NULL. The ToStringCallback for this object will be called. 751 * "pString" 752 * Address where object pointer will be stored. Must be non-NULL. 753 * "plContext" 754 * Platform-specific context pointer. 755 * THREAD SAFETY: 756 * Thread safety depends on the callback defined by PKIX_PL_RegisterType(). 757 * RETURNS: 758 * Returns NULL if the function succeeds. 759 * Returns an Object Error if the function fails in a non-fatal way. 760 * Returns a Fatal Error if the function fails in an unrecoverable way. 761 */ 762 PKIX_Error * 763 PKIX_PL_Object_ToString( 764 PKIX_PL_Object *object, 765 PKIX_PL_String **pString, 766 void *plContext); 767 768 /* 769 * FUNCTION: PKIX_PL_Object_Compare 770 * DESCRIPTION: 771 * 772 * Compares the Object pointed to by "firstObject" and the Object pointed to 773 * by "secondObject" using the comparator registered for "firstObject"'s type 774 * and stores the result at "pResult". Different types may be compared. This 775 * may correctly result in cases where Compare(first, second) is not the 776 * opposite of Compare(second, first). The PKIX_Int32 value stored at 777 * "pResult" will be: 778 * Less than 0 if "firstObject" < "secondObject" 779 * Equals to 0 if "firstObject" = "secondObject" 780 * Greater than 0 if "firstObject" > "secondObject" 781 * 782 * PARAMETERS: 783 * "firstObject" 784 * Address of first Object to compare. Must be non-NULL. 785 * The ComparatorCallback for this object will be called. 786 * "secondObject" 787 * Address of second object to compare. Must be non-NULL. 788 * "pResult 789 * Address where PKIX_Int32 will be stored. Must be non-NULL. 790 * "plContext" 791 * Platform-specific context pointer. 792 * THREAD SAFETY: 793 * Thread safety depends on the comparator defined by PKIX_PL_RegisterType(). 794 * RETURNS: 795 * Returns NULL if the function succeeds. 796 * Returns an Object Error if the function fails in a non-fatal way. 797 * Returns a Fatal Error if the function fails in an unrecoverable way. 798 */ 799 PKIX_Error * 800 PKIX_PL_Object_Compare( 801 PKIX_PL_Object *firstObject, 802 PKIX_PL_Object *secondObject, 803 PKIX_Int32 *pResult, 804 void *plContext); 805 806 /* 807 * FUNCTION: PKIX_PL_Object_Duplicate 808 * DESCRIPTION: 809 * 810 * Creates a duplicate copy of the Object pointed to by "object" using the 811 * callback registered for "object"'s type and stores the copy at 812 * "pNewObject". Changes to the new object will not affect the original and 813 * vice versa. 814 * 815 * Note that if "object" is immutable, the Duplicate callback function simply 816 * needs to increment the reference count on "object" and return a reference 817 * to "object". 818 * 819 * PARAMETERS: 820 * "object" 821 * Address of Object to be duplicated. Must be non-NULL. 822 * The DuplicateCallback for this Object will be called. 823 * "pNewObject" 824 * Address where object pointer will be stored. Must be non-NULL. 825 * "plContext" 826 * Platform-specific context pointer. 827 * THREAD SAFETY: 828 * Thread safety depends on the callback defined by PKIX_PL_RegisterType(). 829 * RETURNS: 830 * Returns NULL if the function succeeds. 831 * Returns an Object Error if the function fails in a non-fatal way. 832 * Returns a Fatal Error if the function fails in an unrecoverable way. 833 */ 834 PKIX_Error * 835 PKIX_PL_Object_Duplicate( 836 PKIX_PL_Object *object, 837 PKIX_PL_Object **pNewObject, 838 void *plContext); 839 840 /* 841 * FUNCTION: PKIX_PL_Object_GetType 842 * DESCRIPTION: 843 * 844 * Retrieves the type code of the Object pointed to by "object" and stores it 845 * at "pType". See pkixt.h for type codes. 846 * 847 * PARAMETERS: 848 * "object" 849 * Address of Object whose type is desired. Must be non-NULL. 850 * "pType" 851 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 852 * "plContext" 853 * Platform-specific context pointer. 854 * THREAD SAFETY: 855 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 856 * RETURNS: 857 * Returns NULL if the function succeeds. 858 * Returns a Fatal Error if the function fails in an unrecoverable way. 859 */ 860 PKIX_Error * 861 PKIX_PL_Object_GetType( 862 PKIX_PL_Object *object, 863 PKIX_UInt32 *pType, 864 void *plContext); 865 866 /* 867 * FUNCTION: PKIX_PL_Object_Lock 868 * DESCRIPTION: 869 * 870 * Locks the Mutex associated with the Object pointed to by "object". When an 871 * object is created, it is associated with an object-specific Mutex to allow 872 * for synchronization when the fields of the object are modified. 873 * 874 * PARAMETERS: 875 * "object" 876 * Address of Object whose Mutex is to be locked. Must be non-NULL. 877 * "plContext" 878 * Platform-specific context pointer. 879 * THREAD SAFETY: 880 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 881 * RETURNS: 882 * Returns NULL if the function succeeds. 883 * Returns a Fatal Error if the function fails in an unrecoverable way. 884 */ 885 PKIX_Error * 886 PKIX_PL_Object_Lock( 887 PKIX_PL_Object *object, 888 void *plContext); 889 890 /* 891 * FUNCTION: PKIX_PL_Object_Unlock 892 * DESCRIPTION: 893 * 894 * Unlocks the Mutex associated with the Object pointed to by "object". When 895 * an object is created, it is associated with an object-specific Mutex to 896 * allow for synchronization when the fields of the object are modified. 897 * 898 * PARAMETERS: 899 * "object" 900 * Address of Object whose Mutex is to be unlocked. Must be non-NULL. 901 * "plContext" 902 * Platform-specific context pointer. 903 * THREAD SAFETY: 904 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 905 * RETURNS: 906 * Returns NULL if the function succeeds. 907 * Returns a Fatal Error if the function fails in an unrecoverable way. 908 */ 909 PKIX_Error * 910 PKIX_PL_Object_Unlock( 911 PKIX_PL_Object *object, 912 void *plContext); 913 914 /* mutexes (locks) */ 915 916 /* 917 * FUNCTION: PKIX_PL_Mutex_Create 918 * DESCRIPTION: 919 * 920 * Creates a new Mutex and stores it at "pNewLock". 921 * 922 * PARAMETERS: 923 * "pNewLock" 924 * Address where object pointer will be stored. Must be non-NULL. 925 * "plContext" 926 * Platform-specific context pointer. 927 * THREAD SAFETY: 928 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 929 * RETURNS: 930 * Returns NULL if the function succeeds. 931 * Returns a Fatal Error if the function fails in an unrecoverable way. 932 */ 933 PKIX_Error * 934 PKIX_PL_Mutex_Create( 935 PKIX_PL_Mutex **pNewLock, 936 void *plContext); 937 938 /* 939 * FUNCTION: PKIX_PL_Mutex_Lock 940 * DESCRIPTION: 941 * 942 * Locks the Mutex pointed to by "lock". If the Mutex is already locked, this 943 * function will block the current thread until the mutex can be locked by 944 * this thread. 945 * 946 * PARAMETERS: 947 * "lock" 948 * Address of Mutex to lock. Must be non-NULL. 949 * "plContext" 950 * Platform-specific context pointer. 951 * THREAD SAFETY: 952 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 953 * RETURNS: 954 * Returns NULL if the function succeeds. 955 * Returns a Fatal Error if the function fails in an unrecoverable way. 956 */ 957 PKIX_Error * 958 PKIX_PL_Mutex_Lock( 959 PKIX_PL_Mutex *lock, 960 void *plContext); 961 962 /* 963 * FUNCTION: PKIX_PL_Mutex_Unlock 964 * DESCRIPTION: 965 * 966 * Unlocks the Mutex pointed to by "lock" if the current thread holds the 967 * Mutex. 968 * 969 * PARAMETERS: 970 * "lock" 971 * Address of Mutex to unlock. Must be non-NULL. 972 * "plContext" 973 * Platform-specific context pointer. 974 * THREAD SAFETY: 975 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 976 * RETURNS: 977 * Returns NULL if the function succeeds. 978 * Returns a Fatal Error if the function fails in an unrecoverable way. 979 */ 980 PKIX_Error * 981 PKIX_PL_Mutex_Unlock( 982 PKIX_PL_Mutex *lock, 983 void *plContext); 984 985 /* monitor (locks) */ 986 987 /* 988 * FUNCTION: PKIX_PL_MonitorLock_Create 989 * DESCRIPTION: 990 * 991 * Creates a new PKIX_PL_MonitorLock and stores it at "pNewLock". 992 * 993 * PARAMETERS: 994 * "pNewLock" 995 * Address where object pointer will be stored. Must be non-NULL. 996 * "plContext" 997 * Platform-specific context pointer. 998 * THREAD SAFETY: 999 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1000 * RETURNS: 1001 * Returns NULL if the function succeeds. 1002 * Returns a Fatal Error if the function fails in an unrecoverable way. 1003 */ 1004 PKIX_Error * 1005 PKIX_PL_MonitorLock_Create( 1006 PKIX_PL_MonitorLock **pNewLock, 1007 void *plContext); 1008 1009 /* 1010 * FUNCTION: PKIX_PL_MonitorLock_Enter 1011 * DESCRIPTION: 1012 * 1013 * Locks the MonitorLock pointed to by "lock". If the MonitorLock is already 1014 * locked by other thread, this function will block the current thread. If 1015 * the "lock" had been locked by current thread, this function will NOT block. 1016 * 1017 * PARAMETERS: 1018 * "lock" 1019 * Address of MonitorLock to lock. Must be non-NULL. 1020 * "plContext" 1021 * Platform-specific context pointer. 1022 * THREAD SAFETY: 1023 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1024 * RETURNS: 1025 * Returns NULL if the function succeeds. 1026 * Returns a Fatal Error if the function fails in an unrecoverable way. 1027 */ 1028 PKIX_Error * 1029 PKIX_PL_MonitorLock_Enter( 1030 PKIX_PL_MonitorLock *lock, 1031 void *plContext); 1032 1033 /* 1034 * FUNCTION: PKIX_PL_MonitorLock_Exit 1035 * DESCRIPTION: 1036 * 1037 * Unlocks the MonitorLock pointed to by "lock" if the lock counter of 1038 * current thread holds the MonitorLock reach 0, the lock is released. 1039 * 1040 * PARAMETERS: 1041 * "lock" 1042 * Address of MonitorLock to unlock. Must be non-NULL. 1043 * "plContext" 1044 * Platform-specific context pointer. 1045 * THREAD SAFETY: 1046 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1047 * RETURNS: 1048 * Returns NULL if the function succeeds. 1049 * Returns a Fatal Error if the function fails in an unrecoverable way. 1050 */ 1051 PKIX_Error * 1052 PKIX_PL_MonitorLock_Exit( 1053 PKIX_PL_MonitorLock *lock, 1054 void *plContext); 1055 1056 /* strings and formatted printing */ 1057 1058 /* 1059 * FUNCTION: PKIX_PL_String_Create 1060 * DESCRIPTION: 1061 * 1062 * Creates a new String using the data pointed to by "pString", the 1063 * PKIX_UInt32 pointed to by "stringLen", and the PKIX_UInt32 pointed to by 1064 * "fmtIndicator" and stores it at "pString". If the format is PKIX_ESCASCII 1065 * the "stringLen" parameter is ignored and the string extends until a zero 1066 * byte is found. Once created, a String object is immutable. 1067 * 1068 * Valid formats are: 1069 * PKIX_ESCASCII 1070 * PKIX_ESCASCII_DEBUG 1071 * PKIX_UTF8 1072 * PKIX_UTF8_NULL_TERM 1073 * PKIX_UTF16 1074 * 1075 * PARAMETERS: 1076 * "fmtIndicator" 1077 * Format that "stringRep" is encoded with. Must be non-NULL. 1078 * "stringRep" 1079 * Address of encoded string representation. Must be non-NULL. 1080 * "stringLen" 1081 * Length of data stored at stringRep. 1082 * "pString" 1083 * Address where object pointer will be stored. Must be non-NULL. 1084 * "plContext" 1085 * Platform-specific context pointer. 1086 * THREAD SAFETY: 1087 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1088 * RETURNS: 1089 * Returns NULL if the function succeeds. 1090 * Returns a String Error if the function fails in a non-fatal way. 1091 * Returns a Fatal Error if the function fails in an unrecoverable way. 1092 */ 1093 PKIX_Error * 1094 PKIX_PL_String_Create( 1095 PKIX_UInt32 fmtIndicator, 1096 const void *stringRep, 1097 PKIX_UInt32 stringLen, 1098 PKIX_PL_String **pString, 1099 void *plContext); 1100 1101 /* 1102 * FUNCTION: PKIX_PL_Sprintf 1103 * DESCRIPTION: 1104 * 1105 * Creates a formatted string at "pOut" using the given format "fmt" and a 1106 * variable length list of arguments. The format flags are identical to 1107 * standard C with the exception that %s expects a PKIX_PL_String*, rather 1108 * than a char *, and that {%d, %i, %o, %u, %x, %X} expect PKIX_UInt32 or 1109 * PKIX_Int32 instead of int or unsigned int. 1110 * 1111 * PARAMETERS: 1112 * "pOut" 1113 * Address where object pointer will be stored. Must be non-NULL. 1114 * "plContext" 1115 * Platform-specific context pointer. 1116 * "fmt" 1117 * Address of format string. Must be non-NULL. 1118 * THREAD SAFETY: 1119 * Not Thread Safe - Caller must have exclusive access to all arguments. 1120 * (see Thread Safety Definitions in Programmer's Guide) 1121 * RETURNS: 1122 * Returns NULL if the function succeeds. 1123 * Returns a String Error if the function fails in a non-fatal way. 1124 * Returns a Fatal Error if the function fails in an unrecoverable way. 1125 */ 1126 PKIX_Error * 1127 PKIX_PL_Sprintf( 1128 PKIX_PL_String **pOut, 1129 void *plContext, 1130 const PKIX_PL_String *fmt, ...); 1131 1132 /* 1133 * FUNCTION: PKIX_PL_GetString 1134 * DESCRIPTION: 1135 * 1136 * Retrieves the String associated with the value of "stringID" (if any) and 1137 * stores it at "pString". If no such string is associated with "stringID", 1138 * this function uses "defaultString" to create a String and stores it at 1139 * "pString". 1140 * 1141 * PARAMETERS: 1142 * "stringID" 1143 * PKIX_UInt32 valud of string identifier. 1144 * "defaultString" 1145 * Address of a PKIX_ESCASCII encoded string representation. 1146 * Must be non-NULL. 1147 * "pString" 1148 * Address where object pointer will be stored. Must be non-NULL. 1149 * "plContext" 1150 * Platform-specific context pointer. 1151 * THREAD SAFETY: 1152 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1153 * RETURNS: 1154 * Returns NULL if the function succeeds. 1155 * Returns a String Error if the function fails in a non-fatal way. 1156 * Returns a Fatal Error if the function fails in an unrecoverable way. 1157 */ 1158 PKIX_Error * 1159 PKIX_PL_GetString( 1160 PKIX_UInt32 stringID, 1161 char *defaultString, 1162 PKIX_PL_String **pString, 1163 void *plContext); 1164 1165 /* 1166 * FUNCTION: PKIX_PL_String_GetEncoded 1167 * DESCRIPTION: 1168 * 1169 * Retrieves the value of the String pointed to by "string" in the encoding 1170 * specified by "fmtIndicator" and stores the result in "pStringRep" and 1171 * "pLength", respectively. Note that "pStringRep" is not reference counted 1172 * and will need to be freed with PKIX_PL_Free(). 1173 * 1174 * PARAMETERS: 1175 * "string" 1176 * Address of String whose encoded value is desired. Must be non-NULL. 1177 * "fmtIndicator" 1178 * Format of encoding. Supported formats are: 1179 * PKIX_ESCASCII, PKIX_ESCASII_DEBUG, PKIX_UTF8, PKIX_UTF8_NULL_TERM, and 1180 * PKIX_UTF16. XXX Where are these documented? 1181 * "pStringRep" 1182 * Address where pointer to encoded value will be stored. 1183 * Must be non-NULL. 1184 * "pLength" 1185 * Address where byte length of encoded value will be stored. 1186 * "plContext" 1187 * Platform-specific context pointer. 1188 * THREAD SAFETY: 1189 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1190 * RETURNS: 1191 * Returns NULL if the function succeeds. 1192 * Returns a String Error if the function fails in a non-fatal way. 1193 * Returns a Fatal Error if the function fails in an unrecoverable way. 1194 */ 1195 PKIX_Error * 1196 PKIX_PL_String_GetEncoded( 1197 PKIX_PL_String *string, 1198 PKIX_UInt32 fmtIndicator, 1199 void **pStringRep, 1200 PKIX_UInt32 *pLength, 1201 void *plContext); 1202 1203 /* 1204 * Hashtable 1205 * 1206 * A hashtable is a very efficient data structure used for mapping keys to 1207 * values. Any non-null PKIX_PL_Object can be used as a key or as a value, 1208 * provided that it correctly implements the PKIX_PL_EqualsCallback and the 1209 * PKIX_PL_HashcodeCallback. A hashtable consists of several buckets, with 1210 * each bucket capable of holding a linked list of key/value mappings. When 1211 * adding, retrieving, or deleting a value, the hashcode of the key is used to 1212 * determine which bucket's linked list is relevant. The corresponding 1213 * key/value pair is then appended, retrieved, or deleted. 1214 */ 1215 1216 /* 1217 * FUNCTION: PKIX_PL_HashTable_Create 1218 * DESCRIPTION: 1219 * 1220 * Creates a new Hashtable with an initial capacity of "numBuckets" buckets 1221 * and "maxEntriesPerBucket" of entries limit for each bucket and stores it 1222 * at "pResult". 1223 * 1224 * PARAMETERS: 1225 * "numBuckets" 1226 * The initial number of hash table buckets. Must be non-zero. 1227 * "maxEntriesPerBucket" 1228 * The limit of entries per bucket. Zero means no limit. 1229 * "pResult" 1230 * Address where object pointer will be stored. Must be non-NULL. 1231 * "plContext" 1232 * Platform-specific context pointer. 1233 * THREAD SAFETY: 1234 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1235 * RETURNS: 1236 * Returns NULL if the function succeeds. 1237 * Returns a Fatal Error if the function fails in an unrecoverable way. 1238 */ 1239 PKIX_Error * 1240 PKIX_PL_HashTable_Create( 1241 PKIX_UInt32 numBuckets, 1242 PKIX_UInt32 maxEntriesPerBucket, 1243 PKIX_PL_HashTable **pResult, 1244 void *plContext); 1245 1246 /* 1247 * FUNCTION: PKIX_PL_HashTable_Add 1248 * DESCRIPTION: 1249 * 1250 * Adds a key/value mapping using the Objects pointed to by "key" and "value" 1251 * to the Hashtable pointed to by "ht". 1252 * 1253 * Function increments key/value reference counts. Caller is responsible to 1254 * to decrement(destroy) key/value ref counts(objects). 1255 * 1256 * PARAMETERS: 1257 * "ht" 1258 * Address of Hashtable to be added to. Must be non-NULL. 1259 * "key" 1260 * Address of Object to be associated with "value". Must be non-NULL. 1261 * "value" 1262 * Address of Object to be added to Hashtable. Must be non-NULL. 1263 * "plContext" 1264 * Platform-specific context pointer. 1265 * THREAD SAFETY: 1266 * Not Thread Safe - assumes exclusive access to "ht" 1267 * (see Thread Safety Definitions in Programmer's Guide) 1268 * RETURNS: 1269 * Returns NULL if the function succeeds. 1270 * Returns a Hashtable Error if the function fails in a non-fatal way. 1271 * Returns a Fatal Error if the function fails in an unrecoverable way. 1272 */ 1273 PKIX_Error * 1274 PKIX_PL_HashTable_Add( 1275 PKIX_PL_HashTable *ht, 1276 PKIX_PL_Object *key, 1277 PKIX_PL_Object *value, 1278 void *plContext); 1279 1280 /* 1281 * FUNCTION: PKIX_PL_HashTable_Remove 1282 * DESCRIPTION: 1283 * 1284 * Removes the Object value whose key is equal to the Object pointed to by 1285 * "key" from the Hashtable pointed to by "ht". If no such object exists, 1286 * this function throws an Error. 1287 * 1288 * Function frees "value" object. Caller is responsible to free "key" 1289 * object. 1290 * 1291 * PARAMETERS: 1292 * "ht" 1293 * Address of Hashtable to remove object from. Must be non-NULL. 1294 * "key" 1295 * Address of Object used for lookup. Must be non-NULL. 1296 * "plContext" 1297 * Platform-specific context pointer. 1298 * THREAD SAFETY: 1299 * Not Thread Safe - assumes exclusive access to "ht" 1300 * (see Thread Safety Definitions in Programmer's Guide) 1301 * RETURNS: 1302 * Returns NULL if the function succeeds. 1303 * Returns a Hashtable Error if the function fails in a non-fatal way. 1304 * Returns a Fatal Error if the function fails in an unrecoverable way. 1305 */ 1306 PKIX_Error * 1307 PKIX_PL_HashTable_Remove( 1308 PKIX_PL_HashTable *ht, 1309 PKIX_PL_Object *key, 1310 void *plContext); 1311 1312 /* 1313 * FUNCTION: PKIX_PL_HashTable_Lookup 1314 * DESCRIPTION: 1315 * 1316 * Retrieves the Object whose key equals the Object pointed to by "key" from 1317 * the Hashtable associated with "ht" and stores it at "pResult". If no 1318 * Object is found, this function stores NULL at "pResult". 1319 * 1320 * PARAMETERS: 1321 * "ht" 1322 * Address of Hashtable to lookup Object from. Must be non-NULL. 1323 * "key" 1324 * Address of key Object used for lookup. Must be non-NULL. 1325 * "pResult" 1326 * Address where object pointer will be stored. Must be non-NULL. 1327 * "plContext" 1328 * Platform-specific context pointer. 1329 * THREAD SAFETY: 1330 * Conditionally Thread Safe 1331 * (see Thread Safety Definitions in Programmer's Guide) 1332 * RETURNS: 1333 * Returns NULL if the function succeeds. 1334 * Returns a Hashtable Error if the function fails in a non-fatal way. 1335 * Returns a Fatal Error if the function fails in an unrecoverable way. 1336 */ 1337 PKIX_Error * 1338 PKIX_PL_HashTable_Lookup( 1339 PKIX_PL_HashTable *ht, 1340 PKIX_PL_Object *key, 1341 PKIX_PL_Object **pResult, 1342 void *plContext); 1343 1344 /* 1345 * FUNCTION: PKIX_PL_ByteArray_Create 1346 * DESCRIPTION: 1347 * 1348 * Creates a new ByteArray using "length" bytes of data pointed to by "array" 1349 * and stores it at "pByteArray". Once created, a ByteArray is immutable. 1350 * 1351 * PARAMETERS: 1352 * "array" 1353 * Address of source data. 1354 * "length" 1355 * Number of bytes to copy. 1356 * "pByteArray" 1357 * Address where object pointer will be stored. Must be non-NULL. 1358 * "plContext" 1359 * Platform-specific context pointer. 1360 * THREAD SAFETY: 1361 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1362 * RETURNS: 1363 * Returns NULL if the function succeeds. 1364 * Returns a Fatal Error if the function fails in an unrecoverable way. 1365 */ 1366 PKIX_Error * 1367 PKIX_PL_ByteArray_Create( 1368 void *array, 1369 PKIX_UInt32 length, 1370 PKIX_PL_ByteArray **pByteArray, 1371 void *plContext); 1372 1373 /* 1374 * FUNCTION: PKIX_PL_ByteArray_GetPointer 1375 * DESCRIPTION: 1376 * 1377 * Allocates enough memory to hold the contents of the ByteArray pointed to 1378 * by "byteArray", copies the data from the ByteArray pointed to by 1379 * "byteArray" into the newly allocated memory, and stores a pointer to the 1380 * memory at "pArray". Note that "pArray" is not reference counted. It will 1381 * need to be freed with PKIX_PL_Free(). 1382 * 1383 * PARAMETERS: 1384 * "byteArray" 1385 * Address of ByteArray whose data is desired. Must be non-NULL. 1386 * "pArray" 1387 * Address where object pointer will be stored. Must be non-NULL. 1388 * "plContext" 1389 * Platform-specific context pointer. 1390 * THREAD SAFETY: 1391 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1392 * RETURNS: 1393 * Returns NULL if the function succeeds. 1394 * Returns a Fatal Error if the function fails in an unrecoverable way. 1395 */ 1396 PKIX_Error * 1397 PKIX_PL_ByteArray_GetPointer( 1398 PKIX_PL_ByteArray *byteArray, 1399 void **pArray, 1400 void *plContext); 1401 1402 /* 1403 * FUNCTION: PKIX_PL_ByteArray_GetLength 1404 * DESCRIPTION: 1405 * 1406 * Retrieves the length of the ByteArray pointed to by "byteArray" and stores 1407 * the length at "pLength". 1408 * 1409 * PARAMETERS: 1410 * "byteArray" 1411 * Address of ByteArray whose length is desired. Must be non-NULL. 1412 * "pLength" 1413 * Address where PKIX_UInt32 will be stored. Must be non-NULL. 1414 * "plContext" 1415 * Platform-specific context pointer. 1416 * THREAD SAFETY: 1417 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1418 * RETURNS: 1419 * Returns NULL if the function succeeds. 1420 * Returns a Fatal Error if the function fails in an unrecoverable way. 1421 */ 1422 PKIX_Error * 1423 PKIX_PL_ByteArray_GetLength( 1424 PKIX_PL_ByteArray *byteArray, 1425 PKIX_UInt32 *pLength, 1426 void *plContext); 1427 1428 /* 1429 * FUNCTION: PKIX_PL_OID_Create 1430 * DESCRIPTION: 1431 * 1432 * Creates a new OID using NSS oid tag. 1433 * 1434 * PARAMETERS: 1435 * "idtag" 1436 * nss oid id tag. 1437 * "pOID" 1438 * Address where object pointer will be stored. Must be non-NULL. 1439 * "plContext" 1440 * Platform-specific context pointer. 1441 * THREAD SAFETY: 1442 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1443 * RETURNS: 1444 * Returns NULL if the function succeeds. 1445 * Returns an OID Error if the function fails in a non-fatal way. 1446 * Returns a Fatal Error if the function fails in an unrecoverable way. 1447 */ 1448 PKIX_Error * 1449 PKIX_PL_OID_Create( 1450 SECOidTag idtag, 1451 PKIX_PL_OID **pOID, 1452 void *plContext); 1453 1454 /* 1455 * FUNCTION: PKIX_PL_OID_CreateBySECItem 1456 * DESCRIPTION: 1457 * 1458 * Creates a new OID using a DER encoded OID stored as SECItem. 1459 * 1460 * PARAMETERS: 1461 * "derOid" 1462 * Address of SECItem that holds DER encoded OID. 1463 * "pOID" 1464 * Address where object pointer will be stored. Must be non-NULL. 1465 * "plContext" 1466 * Platform-specific context pointer. 1467 * THREAD SAFETY: 1468 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1469 * RETURNS: 1470 * Returns NULL if the function succeeds. 1471 * Returns an OID Error if the function fails in a non-fatal way. 1472 * Returns a Fatal Error if the function fails in an unrecoverable way. 1473 */ 1474 PKIX_Error * 1475 PKIX_PL_OID_CreateBySECItem( 1476 SECItem *derOid, 1477 PKIX_PL_OID **pOID, 1478 void *plContext); 1479 1480 /* 1481 * FUNCTION: PKIX_PL_BigInt_Create 1482 * DESCRIPTION: 1483 * 1484 * Creates a new BigInt using the source String pointed to by "stringRep" and 1485 * stores it at "pBigInt". Valid source Strings consist of an even number of 1486 * hexadecimal digits, which are always interpreted as a positive number. 1487 * Once created, a BigInt is immutable. 1488 * 1489 * The regexp format is: 1490 * HexDigit ::= [0-9] | [A-F] | [a-f] 1491 * DoubleHex ::= HexDigit HexDigit 1492 * BigIntSrc ::= (DoubleHex)+ 1493 * 1494 * Note that since we are using DoubleHex, the number of characters in the 1495 * source MUST be even. Additionally, the first DoubleHex MUST NOT be "00" 1496 * unless it is the only DoubleHex. 1497 * 1498 * Valid : "09" 1499 * Valid : "00" (special case where first and only DoubleHex is "00") 1500 * Invalid: "9" (not DoubleHex: odd number of characters) 1501 * Invalid: "0009" (first DoubleHex is "00") 1502 * 1503 * XXX Why does this take a String object while OID_Create takes a char* ? 1504 * Perhaps because OID_Create is often used with constant strings and 1505 * this function isn't. That's a good reason, but we should explain it 1506 * (if it's right) 1507 * PARAMETERS: 1508 * "stringRep" 1509 * Address of String representing a BigInt. Must be non-NULL. 1510 * "pBigInt" 1511 * Address where object pointer will be stored. Must be non-NULL. 1512 * "plContext" 1513 * Platform-specific context pointer. 1514 * THREAD SAFETY: 1515 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1516 * RETURNS: 1517 * Returns NULL if the function succeeds. 1518 * Returns a BigInt Error if the function fails in a non-fatal way. 1519 * Returns a Fatal Error if the function fails in an unrecoverable way. 1520 */ 1521 PKIX_Error * 1522 PKIX_PL_BigInt_Create( 1523 PKIX_PL_String *stringRep, 1524 PKIX_PL_BigInt **pBigInt, 1525 void *plContext); 1526 1527 #ifdef __cplusplus 1528 } 1529 #endif 1530 1531 /* 1532 * FUNCTION: PKIX_PL_GetPLErrorCode 1533 * DESCRIPTION: 1534 * 1535 * Returns error code from PL layer. 1536 * 1537 * THREAD SAFETY: 1538 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1539 * RETURNS: 1540 * PL layer error code. 1541 */ 1542 int 1543 PKIX_PL_GetPLErrorCode(); 1544 1545 #endif /* _LIBPKIX_SYSTEM_H */