for (i = 0; signerinfos[i] != NULL; i++) { signerinfo = signerinfos[i];
while (signerinfos) { signerinfo = *signerinfos;
NSS_CMSSignedData_Encode_BeforeStart(NSSCMSSignedData *sigd){    NSSCMSSignerInfo **signerinfos, *signerinfo;    SECOidTag digestalgtag;    SECItem *dummy;    int version;    SECStatus rv;    PRBool haveDigests = PR_FALSE;    int n, i;    PLArenaPool *poolp;    poolp = sigd->cmsg->poolp;    /* we assume that we have precomputed digests if there is a list of algorithms, and */    /* a chunk of data for each of those algorithms */    if (sigd->digestAlgorithms != NULL && sigd->digests != NULL) {	for (i=0; sigd->digestAlgorithms[i] != NULL; i++) {	    if (sigd->digests[i] == NULL)		break;	}	if (sigd->digestAlgorithms[i] == NULL)	/* reached the end of the array? */	    haveDigests = PR_TRUE;		/* yes: we must have all the digests */    }	        version = NSS_CMS_SIGNED_DATA_VERSION_BASIC;    /* RFC2630 5.1 "version is the syntax version number..." */    if (NSS_CMSContentInfo_GetContentTypeTag(&(sigd->contentInfo)) != SEC_OID_PKCS7_DATA)	version = NSS_CMS_SIGNED_DATA_VERSION_EXT;    signerinfos = sigd->signerInfos;    /* prepare all the SignerInfos */    for (i = 0; signerinfos[i] != NULL; i++) {	signerinfo = signerinfos[i];	/* RFC2630 5.1 "version is the syntax version number..." */	if (NSS_CMSSignerInfo_GetVersion(signerinfo) != NSS_CMS_SIGNER_INFO_VERSION_ISSUERSN)	    version = NSS_CMS_SIGNED_DATA_VERSION_EXT;		/* collect digestAlgorithms from SignerInfos */	/* (we need to know which algorithms we have when the content comes in) */	/* do not overwrite any existing digestAlgorithms (and digest) */	digestalgtag = NSS_CMSSignerInfo_GetDigestAlgTag(signerinfo);	n = NSS_CMSAlgArray_GetIndexByAlgTag(sigd->digestAlgorithms, digestalgtag);	if (n < 0 && haveDigests) {	    /* oops, there is a digestalg we do not have a digest for */	    /* but we were supposed to have all the digests already... */	    goto loser;	} else if (n < 0) {	    /* add the digestAlgorithm & a NULL digest */	    rv = NSS_CMSSignedData_AddDigest(poolp, sigd, digestalgtag, NULL);	    if (rv != SECSuccess)		goto loser;	} else {	    /* found it, nothing to do */	}    }    dummy = SEC_ASN1EncodeInteger(poolp, &(sigd->version), (long)version);    if (dummy == NULL)	return SECFailure;    /* this is a SET OF, so we need to sort them guys */    rv = NSS_CMSArray_SortByDER((void **)sigd->digestAlgorithms, SECOID_AlgorithmIDTemplate,				(void **)sigd->digests);    if (rv != SECSuccess)	return SECFailure;        return SECSuccess;loser:    return SECFailure;}