const SECHashObject * NSS_CMSUtil_GetHashObjByAlgID(SECAlgorithmID *algid) { SECOidTag oidTag = SECOID_FindOIDTag(&(algid->algorithm)); const SECHashObject *digobj = HASH_GetHashObjectByOidTag(oidTag); return digobj; }
/* returns zero for unknown hash OID */ unsigned int HASH_ResultLenByOidTag(SECOidTag hashOid) { const SECHashObject *hashObject = HASH_GetHashObjectByOidTag(hashOid); unsigned int resultLen = 0; if (hashObject) resultLen = hashObject->length; return resultLen; }
SECStatus SGN_Begin(SGNContext *cx) { if (cx->hashcx != NULL) { (*cx->hashobj->destroy)(cx->hashcx, PR_TRUE); cx->hashcx = NULL; } cx->hashobj = HASH_GetHashObjectByOidTag(cx->hashalg); if (!cx->hashobj) return SECFailure; /* error code is already set */ cx->hashcx = (*cx->hashobj->create)(); if (cx->hashcx == NULL) return SECFailure; (*cx->hashobj->begin)(cx->hashcx); return SECSuccess; }
const ALGDIGEST *Alg_get_digest_by_name(ALGORITHM_TYPE hash) { return HASH_GetHashObjectByOidTag(hash); }
static SEC_PKCS7EncoderContext * sec_pkcs7_encoder_start_contexts (SEC_PKCS7ContentInfo *cinfo, PK11SymKey *bulkkey) { SEC_PKCS7EncoderContext *p7ecx; SECOidTag kind; PRBool encrypt; SECItem **digests; SECAlgorithmID *digestalg, **digestalgs; p7ecx = (SEC_PKCS7EncoderContext*)PORT_ZAlloc (sizeof(SEC_PKCS7EncoderContext)); if (p7ecx == NULL) return NULL; digests = NULL; digestalg = NULL; digestalgs = NULL; encrypt = PR_FALSE; kind = SEC_PKCS7ContentType (cinfo); switch (kind) { default: case SEC_OID_PKCS7_DATA: break; case SEC_OID_PKCS7_DIGESTED_DATA: digestalg = &(cinfo->content.digestedData->digestAlg); break; case SEC_OID_PKCS7_SIGNED_DATA: digests = cinfo->content.signedData->digests; digestalgs = cinfo->content.signedData->digestAlgorithms; break; case SEC_OID_PKCS7_ENCRYPTED_DATA: case SEC_OID_PKCS7_ENVELOPED_DATA: encrypt = PR_TRUE; break; case SEC_OID_PKCS7_SIGNED_ENVELOPED_DATA: digests = cinfo->content.signedAndEnvelopedData->digests; digestalgs = cinfo->content.signedAndEnvelopedData->digestAlgorithms; encrypt = PR_TRUE; break; } if (encrypt) { p7ecx->encryptobj = sec_pkcs7_encoder_start_encrypt (cinfo, bulkkey); if (p7ecx->encryptobj == NULL) { PORT_Free (p7ecx); return NULL; } } if (digestalgs != NULL) { if (digests != NULL) { /* digests already created (probably for detached data) */ digestalg = NULL; } else { /* * XXX Some day we should handle multiple digests; for now, * assume only one will be done. */ PORT_Assert (digestalgs[0] != NULL && digestalgs[1] == NULL); digestalg = digestalgs[0]; } } if (digestalg != NULL) { SECOidTag oidTag = SECOID_FindOIDTag(&(digestalg->algorithm)); p7ecx->digestobj = HASH_GetHashObjectByOidTag(oidTag); if (p7ecx->digestobj != NULL) { p7ecx->digestcx = (* p7ecx->digestobj->create) (); if (p7ecx->digestcx == NULL) p7ecx->digestobj = NULL; else (* p7ecx->digestobj->begin) (p7ecx->digestcx); } if (p7ecx->digestobj == NULL) { if (p7ecx->encryptobj != NULL) sec_PKCS7DestroyEncryptObject (p7ecx->encryptobj); PORT_Free (p7ecx); return NULL; } } p7ecx->cinfo = cinfo; return p7ecx; }