/* * NSS_CMSAttribute_AddValue - add another value to an attribute */ SECStatus NSS_CMSAttribute_AddValue(PLArenaPool *poolp, NSSCMSAttribute *attr, SECItem *value) { SECItem *copiedvalue; void *mark; PORT_Assert (poolp != NULL); mark = PORT_ArenaMark(poolp); if (value == NULL) { PORT_SetError(SEC_ERROR_INVALID_ARGS); goto loser; } if ((copiedvalue = SECITEM_ArenaDupItem(poolp, value)) == NULL) goto loser; if (NSS_CMSArray_Add(poolp, (void ***)&(attr->values), (void *)copiedvalue) != SECSuccess) goto loser; PORT_ArenaUnmark(poolp, mark); return SECSuccess; loser: PORT_Assert (mark != NULL); PORT_ArenaRelease (poolp, mark); return SECFailure; }
CERTGeneralName * CERT_DecodeAltNameExtension(PRArenaPool *reqArena, SECItem *EncodedAltName) { SECStatus rv = SECSuccess; CERTAltNameEncodedContext encodedContext; SECItem* newEncodedAltName; if (!reqArena) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return NULL; } newEncodedAltName = SECITEM_ArenaDupItem(reqArena, EncodedAltName); if (!newEncodedAltName) { return NULL; } encodedContext.encodedGenName = NULL; PORT_Memset(&encodedContext, 0, sizeof(CERTAltNameEncodedContext)); rv = SEC_QuickDERDecodeItem (reqArena, &encodedContext, CERT_GeneralNamesTemplate, newEncodedAltName); if (rv == SECFailure) { goto loser; } if (encodedContext.encodedGenName && encodedContext.encodedGenName[0]) return cert_DecodeGeneralNames(reqArena, encodedContext.encodedGenName); /* Extension contained an empty GeneralNames sequence */ /* Treat as extension not found */ PORT_SetError(SEC_ERROR_EXTENSION_NOT_FOUND); loser: return NULL; }
SECItem * crmf_get_public_value(SECKEYPublicKey *pubKey, SECItem *dest) { SECItem *src; switch (pubKey->keyType) { case dsaKey: src = &pubKey->u.dsa.publicValue; break; case rsaKey: src = &pubKey->u.rsa.modulus; break; case dhKey: src = &pubKey->u.dh.publicValue; break; default: src = NULL; break; } if (!src) { PORT_SetError(SEC_ERROR_INVALID_ARGS); return NULL; } if (dest != NULL) { SECStatus rv = SECITEM_CopyItem(NULL, dest, src); if (rv != SECSuccess) { dest = NULL; } } else { dest = SECITEM_ArenaDupItem(NULL, src); } return dest; }
SECStatus CERT_FindCRLNumberExten (PRArenaPool *arena, CERTCrl *crl, SECItem *value) { SECItem encodedExtenValue; SECItem *tmpItem = NULL; SECStatus rv; void *mark = NULL; encodedExtenValue.data = NULL; encodedExtenValue.len = 0; rv = cert_FindExtension(crl->extensions, SEC_OID_X509_CRL_NUMBER, &encodedExtenValue); if ( rv != SECSuccess ) return (rv); mark = PORT_ArenaMark(arena); tmpItem = SECITEM_ArenaDupItem(arena, &encodedExtenValue); if (tmpItem) { rv = SEC_QuickDERDecodeItem (arena, value, SEC_ASN1_GET(SEC_IntegerTemplate), tmpItem); } else { rv = SECFailure; } PORT_Free (encodedExtenValue.data); if (rv == SECFailure) { PORT_ArenaRelease(arena, mark); } else { PORT_ArenaUnmark(arena, mark); } return (rv); }
/* * NSS_CMSAttribute_Create - create an attribute * * if value is NULL, the attribute won't have a value. It can be added later * with NSS_CMSAttribute_AddValue. */ NSSCMSAttribute * NSS_CMSAttribute_Create(PRArenaPool *poolp, SECOidTag oidtag, SECItem *value, PRBool encoded) { NSSCMSAttribute *attr; SECItem *copiedvalue; void *mark; PORT_Assert (poolp != NULL); mark = PORT_ArenaMark (poolp); attr = (NSSCMSAttribute *)PORT_ArenaZAlloc(poolp, sizeof(NSSCMSAttribute)); if (attr == NULL) goto loser; attr->typeTag = SECOID_FindOIDByTag(oidtag); if (attr->typeTag == NULL) goto loser; if (SECITEM_CopyItem(poolp, &(attr->type), &(attr->typeTag->oid)) != SECSuccess) goto loser; if (value != NULL) { if ((copiedvalue = SECITEM_ArenaDupItem(poolp, value)) == NULL) goto loser; if (NSS_CMSArray_Add(poolp, (void ***)&(attr->values), (void *)copiedvalue) != SECSuccess) goto loser; } attr->encoded = encoded; PORT_ArenaUnmark (poolp, mark); return attr; loser: PORT_Assert (mark != NULL); PORT_ArenaRelease (poolp, mark); return NULL; }
static SECItem * crmf_decode_params(SECItem *inParams) { SECItem *params; SECStatus rv = SECFailure; PLArenaPool *poolp; poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE); if (poolp == NULL) { return NULL; } params = PORT_ArenaZNew(poolp, SECItem); if (params) { rv = SEC_ASN1DecodeItem(poolp, params, SEC_ASN1_GET(SEC_OctetStringTemplate), inParams); } params = (rv == SECSuccess) ? SECITEM_ArenaDupItem(NULL, params) : NULL; PORT_FreeArena(poolp, PR_FALSE); return params; }
SECItem * SECITEM_DupItem(const SECItem *from) { return SECITEM_ArenaDupItem(NULL, from); }