/* * nssHash_create * */ NSS_IMPLEMENT nssHash * nssHash_Create ( NSSArena *arenaOpt, PRUint32 numBuckets, PLHashFunction keyHash, PLHashComparator keyCompare, PLHashComparator valueCompare ) { nssHash *rv; NSSArena *arena; PRBool i_alloced; #ifdef NSSDEBUG if( arenaOpt && PR_SUCCESS != nssArena_verifyPointer(arenaOpt) ) { nss_SetError(NSS_ERROR_INVALID_POINTER); return (nssHash *)NULL; } #endif /* NSSDEBUG */ if (arenaOpt) { arena = arenaOpt; i_alloced = PR_FALSE; } else { arena = nssArena_Create(); i_alloced = PR_TRUE; } rv = nss_ZNEW(arena, nssHash); if( (nssHash *)NULL == rv ) { goto loser; } rv->mutex = PZ_NewLock(nssILockOther); if( (PZLock *)NULL == rv->mutex ) { goto loser; } rv->plHashTable = PL_NewHashTable(numBuckets, keyHash, keyCompare, valueCompare, &nssArenaHashAllocOps, arena); if( (PLHashTable *)NULL == rv->plHashTable ) { (void)PZ_DestroyLock(rv->mutex); goto loser; } rv->count = 0; rv->arena = arena; rv->i_alloced_arena = i_alloced; return rv; loser: (void)nss_ZFreeIf(rv); return (nssHash *)NULL; }
NSS_IMPLEMENT NSSItem * nssItem_Create ( NSSArena *arenaOpt, NSSItem *rvOpt, PRUint32 length, const void *data ) { NSSItem *rv = (NSSItem *)NULL; #ifdef DEBUG if( (NSSArena *)NULL != arenaOpt ) { if( PR_SUCCESS != nssArena_verifyPointer(arenaOpt) ) { return (NSSItem *)NULL; } } if( (const void *)NULL == data ) { if( length > 0 ) { nss_SetError(NSS_ERROR_INVALID_POINTER); return (NSSItem *)NULL; } } #endif /* DEBUG */ if( (NSSItem *)NULL == rvOpt ) { rv = (NSSItem *)nss_ZNEW(arenaOpt, NSSItem); if( (NSSItem *)NULL == rv ) { goto loser; } } else { rv = rvOpt; } rv->size = length; rv->data = nss_ZAlloc(arenaOpt, length); if( (void *)NULL == rv->data ) { goto loser; } if( length > 0 ) { (void)nsslibc_memcpy(rv->data, data, length); } return rv; loser: if( rv != rvOpt ) { nss_ZFreeIf(rv); } return (NSSItem *)NULL; }
/* * nssCKFWHash_Create * */ NSS_IMPLEMENT nssCKFWHash * nssCKFWHash_Create ( NSSCKFWInstance *fwInstance, NSSArena *arena, CK_RV *pError ) { nssCKFWHash *rv; #ifdef NSSDEBUG if (!pError) { return (nssCKFWHash *)NULL; } if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { *pError = CKR_ARGUMENTS_BAD; return (nssCKFWHash *)NULL; } #endif /* NSSDEBUG */ rv = nss_ZNEW(arena, nssCKFWHash); if (!rv) { *pError = CKR_HOST_MEMORY; return (nssCKFWHash *)NULL; } rv->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); if (!rv->mutex) { if( CKR_OK == *pError ) { (void)nss_ZFreeIf(rv); *pError = CKR_GENERAL_ERROR; } return (nssCKFWHash *)NULL; } rv->plHashTable = PL_NewHashTable(0, nss_ckfw_identity_hash, PL_CompareValues, PL_CompareValues, &nssArenaHashAllocOps, arena); if (!rv->plHashTable) { (void)nssCKFWMutex_Destroy(rv->mutex); (void)nss_ZFreeIf(rv); *pError = CKR_HOST_MEMORY; return (nssCKFWHash *)NULL; } rv->count = 0; return rv; }
NSS_IMPLEMENT NSSItem * nssItem_Duplicate(NSSItem *obj, NSSArena *arenaOpt, NSSItem *rvOpt) { #ifdef DEBUG if ((NSSArena *)NULL != arenaOpt) { if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) { return (NSSItem *)NULL; } } if ((NSSItem *)NULL == obj) { nss_SetError(NSS_ERROR_INVALID_ITEM); return (NSSItem *)NULL; } #endif /* DEBUG */ return nssItem_Create(arenaOpt, rvOpt, obj->size, obj->data); }
static PLHashEntry * PR_CALLBACK nss_arena_hash_alloc_entry ( void *pool, const void *key ) { NSSArena *arena = NULL; #ifdef NSSDEBUG if( (void *)NULL != arena ) { if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { return (void *)NULL; } } #endif /* NSSDEBUG */ return nss_ZNEW(arena, PLHashEntry); }
static void * PR_CALLBACK nss_arena_hash_alloc_table ( void *pool, PRSize size ) { NSSArena *arena = (NSSArena *)NULL; #ifdef NSSDEBUG if( (void *)NULL != arena ) { if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { return (void *)NULL; } } #endif /* NSSDEBUG */ return nss_ZAlloc(arena, size); }
NSS_IMPLEMENT NSSUTF8 * nssUTF8_Duplicate ( const NSSUTF8 *s, NSSArena *arenaOpt ) { NSSUTF8 *rv; PRUint32 len; #ifdef NSSDEBUG if( (const NSSUTF8 *)NULL == s ) { nss_SetError(NSS_ERROR_INVALID_POINTER); return (NSSUTF8 *)NULL; } if( (NSSArena *)NULL != arenaOpt ) { if( PR_SUCCESS != nssArena_verifyPointer(arenaOpt) ) { return (NSSUTF8 *)NULL; } } #endif /* NSSDEBUG */ len = PL_strlen((const char *)s); #ifdef PEDANTIC if( '\0' != ((const char *)s)[ len ] ) { /* must have wrapped, e.g., too big for PRUint32 */ nss_SetError(NSS_ERROR_NO_MEMORY); return (NSSUTF8 *)NULL; } #endif /* PEDANTIC */ len++; /* zero termination */ rv = nss_ZAlloc(arenaOpt, len); if( (void *)NULL == rv ) { return (NSSUTF8 *)NULL; } (void)nsslibc_memcpy(rv, s, len); return rv; }
NSS_IMPLEMENT NSSItem * nssUTF8_GetEncoding(NSSArena *arenaOpt, NSSItem *rvOpt, nssStringType type, NSSUTF8 *string) { NSSItem *rv = (NSSItem *)NULL; PRStatus status = PR_SUCCESS; #ifdef NSSDEBUG if ((NSSArena *)NULL != arenaOpt) { if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) { return (NSSItem *)NULL; } } if ((NSSUTF8 *)NULL == string) { nss_SetError(NSS_ERROR_INVALID_POINTER); return (NSSItem *)NULL; } #endif /* NSSDEBUG */ switch (type) { case nssStringType_DirectoryString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_TeletexString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_PrintableString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_UniversalString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_BMPString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_UTF8String: { NSSUTF8 *dup = nssUTF8_Duplicate(string, arenaOpt); if ((NSSUTF8 *)NULL == dup) { return (NSSItem *)NULL; } if ((NSSItem *)NULL == rvOpt) { rv = nss_ZNEW(arenaOpt, NSSItem); if ((NSSItem *)NULL == rv) { (void)nss_ZFreeIf(dup); return (NSSItem *)NULL; } } else { rv = rvOpt; } rv->data = dup; dup = (NSSUTF8 *)NULL; rv->size = nssUTF8_Size(rv->data, &status); if ((0 == rv->size) && (PR_SUCCESS != status)) { if ((NSSItem *)NULL == rvOpt) { (void)nss_ZFreeIf(rv); } return (NSSItem *)NULL; } } break; case nssStringType_PHGString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; default: nss_SetError(NSS_ERROR_UNSUPPORTED_TYPE); break; } return rv; }
NSS_IMPLEMENT NSSUTF8 * nssUTF8_Create(NSSArena *arenaOpt, nssStringType type, const void *inputString, PRUint32 size /* in bytes, not characters */ ) { NSSUTF8 *rv = NULL; #ifdef NSSDEBUG if ((NSSArena *)NULL != arenaOpt) { if (PR_SUCCESS != nssArena_verifyPointer(arenaOpt)) { return (NSSUTF8 *)NULL; } } if ((const void *)NULL == inputString) { nss_SetError(NSS_ERROR_INVALID_POINTER); return (NSSUTF8 *)NULL; } #endif /* NSSDEBUG */ switch (type) { case nssStringType_DirectoryString: /* This is a composite type requiring BER */ nss_SetError(NSS_ERROR_UNSUPPORTED_TYPE); break; case nssStringType_TeletexString: /* * draft-ietf-pkix-ipki-part1-11 says in part: * * In addition, many legacy implementations support names encoded * in the ISO 8859-1 character set (Latin1String) but tag them as * TeletexString. The Latin1String includes characters used in * Western European countries which are not part of the * TeletexString charcter set. Implementations that process * TeletexString SHOULD be prepared to handle the entire ISO * 8859-1 character set.[ISO 8859-1]. */ nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_PrintableString: /* * PrintableString consists of A-Za-z0-9 ,()+,-./:=? * This is a subset of ASCII, which is a subset of UTF8. * So we can just duplicate the string over. */ if (0 == size) { rv = nssUTF8_Duplicate((const NSSUTF8 *)inputString, arenaOpt); } else { rv = nss_ZAlloc(arenaOpt, size + 1); if ((NSSUTF8 *)NULL == rv) { return (NSSUTF8 *)NULL; } (void)nsslibc_memcpy(rv, inputString, size); } break; case nssStringType_UniversalString: /* 4-byte unicode */ nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_BMPString: /* Base Multilingual Plane of Unicode */ nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_UTF8String: if (0 == size) { rv = nssUTF8_Duplicate((const NSSUTF8 *)inputString, arenaOpt); } else { rv = nss_ZAlloc(arenaOpt, size + 1); if ((NSSUTF8 *)NULL == rv) { return (NSSUTF8 *)NULL; } (void)nsslibc_memcpy(rv, inputString, size); } break; case nssStringType_PHGString: /* * PHGString is an IA5String (with case-insensitive comparisons). * IA5 is ~almost~ ascii; ascii has dollar-sign where IA5 has * currency symbol. */ nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; case nssStringType_GeneralString: nss_SetError(NSS_ERROR_INTERNAL_ERROR); /* unimplemented */ break; default: nss_SetError(NSS_ERROR_UNSUPPORTED_TYPE); break; } return rv; }
/* * nssCKFWObject_Create * */ NSS_IMPLEMENT NSSCKFWObject * nssCKFWObject_Create ( NSSArena *arena, NSSCKMDObject *mdObject, NSSCKFWSession *fwSession, NSSCKFWToken *fwToken, NSSCKFWInstance *fwInstance, CK_RV *pError ) { NSSCKFWObject *fwObject; nssCKFWHash *mdObjectHash; #ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSCKFWObject *)NULL; } if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { *pError = CKR_ARGUMENTS_BAD; return (NSSCKFWObject *)NULL; } #endif /* NSSDEBUG */ if( (NSSCKFWToken *)NULL == fwToken ) { *pError = CKR_ARGUMENTS_BAD; return (NSSCKFWObject *)NULL; } mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); if( (nssCKFWHash *)NULL == mdObjectHash ) { *pError = CKR_GENERAL_ERROR; return (NSSCKFWObject *)NULL; } if( nssCKFWHash_Exists(mdObjectHash, mdObject) ) { fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); return fwObject; } fwObject = nss_ZNEW(arena, NSSCKFWObject); if( (NSSCKFWObject *)NULL == fwObject ) { *pError = CKR_HOST_MEMORY; return (NSSCKFWObject *)NULL; } fwObject->arena = arena; fwObject->mdObject = mdObject; fwObject->fwSession = fwSession; if( (NSSCKFWSession *)NULL != fwSession ) { fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); } fwObject->fwToken = fwToken; fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); fwObject->fwInstance = fwInstance; fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); if( (NSSCKFWMutex *)NULL == fwObject->mutex ) { if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } return (NSSCKFWObject *)NULL; } *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); if( CKR_OK != *pError ) { nss_ZFreeIf(fwObject); return (NSSCKFWObject *)NULL; } #ifdef DEBUG *pError = object_add_pointer(fwObject); if( CKR_OK != *pError ) { nssCKFWHash_Remove(mdObjectHash, mdObject); nss_ZFreeIf(fwObject); return (NSSCKFWObject *)NULL; } #endif /* DEBUG */ *pError = CKR_OK; return fwObject; }