tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 */