SECStatus cmmf_CopyCertifiedKeyPair(PLArenaPool *poolp, CMMFCertifiedKeyPair *dest, CMMFCertifiedKeyPair *src) { SECStatus rv; rv = cmmf_CopyCertOrEncCert(poolp, &dest->certOrEncCert, &src->certOrEncCert); if (rv != SECSuccess) { return rv; } if (src->privateKey != NULL) { CRMFEncryptedValue *encVal; encVal = (poolp == NULL) ? PORT_ZNew(CRMFEncryptedValue) : PORT_ArenaZNew(poolp, CRMFEncryptedValue); if (encVal == NULL) { return SECFailure; } rv = crmf_copy_encryptedvalue(poolp, src->privateKey, encVal); if (rv != SECSuccess) { if (!poolp) { crmf_destroy_encrypted_value(encVal, PR_TRUE); } return rv; } dest->privateKey = encVal; } rv = cmmf_copy_secitem(poolp, &dest->derPublicationInfo, &src->derPublicationInfo); return rv; }
CRMFEncryptedValue * CRMF_EncryptedKeyGetEncryptedValue(CRMFEncryptedKey *inEncrKey) { CRMFEncryptedValue *newEncrValue = NULL; SECStatus rv; PORT_Assert(inEncrKey != NULL); if (inEncrKey == NULL || CRMF_EncryptedKeyGetChoice(inEncrKey) != crmfEncryptedValueChoice) { goto loser; } newEncrValue = PORT_ZNew(CRMFEncryptedValue); if (newEncrValue == NULL) { goto loser; } rv = crmf_copy_encryptedvalue(NULL, &inEncrKey->value.encryptedValue, newEncrValue); if (rv != SECSuccess) { goto loser; } return newEncrValue; loser: if (newEncrValue != NULL) { CRMF_DestroyEncryptedValue(newEncrValue); } return NULL; }
static SECStatus cmmf_CopyCertOrEncCert(PLArenaPool *poolp, CMMFCertOrEncCert *dest, CMMFCertOrEncCert *src) { SECStatus rv = SECSuccess; CRMFEncryptedValue *encVal; dest->choice = src->choice; rv = cmmf_copy_secitem(poolp, &dest->derValue, &src->derValue); switch (src->choice) { case cmmfCertificate: dest->cert.certificate = CERT_DupCertificate(src->cert.certificate); break; case cmmfEncryptedCert: encVal = (poolp == NULL) ? PORT_ZNew(CRMFEncryptedValue) : PORT_ArenaZNew(poolp, CRMFEncryptedValue); if (encVal == NULL) { return SECFailure; } rv = crmf_copy_encryptedvalue(poolp, src->cert.encryptedCert, encVal); if (rv != SECSuccess) { if (!poolp) { crmf_destroy_encrypted_value(encVal, PR_TRUE); } return rv; } dest->cert.encryptedCert = encVal; break; default: rv = SECFailure; } return rv; }
SECStatus crmf_copy_encryptedkey(PLArenaPool *poolp, CRMFEncryptedKey *srcEncrKey, CRMFEncryptedKey *destEncrKey) { SECStatus rv; void *mark = NULL; if (poolp != NULL) { mark = PORT_ArenaMark(poolp); } switch (srcEncrKey->encKeyChoice) { case crmfEncryptedValueChoice: rv = crmf_copy_encryptedvalue(poolp, &srcEncrKey->value.encryptedValue, &destEncrKey->value.encryptedValue); break; case crmfEnvelopedDataChoice: destEncrKey->value.envelopedData = SEC_PKCS7CopyContentInfo(srcEncrKey->value.envelopedData); rv = (destEncrKey->value.envelopedData != NULL) ? SECSuccess : SECFailure; break; default: rv = SECFailure; } if (rv != SECSuccess) { goto loser; } destEncrKey->encKeyChoice = srcEncrKey->encKeyChoice; if (mark) { PORT_ArenaUnmark(poolp, mark); } return SECSuccess; loser: if (mark) { PORT_ArenaRelease(poolp, mark); } return SECFailure; }