SECItem * NSS_CMSContentInfo_GetInnerContent(NSSCMSContentInfo *cinfo) { NSSCMSContentInfo *ccinfo; SECOidTag tag; SECItem *pItem = NULL; if (cinfo == NULL) { return NULL; } tag = NSS_CMSContentInfo_GetContentTypeTag(cinfo); if (NSS_CMSType_IsData(tag)) { pItem = cinfo->content.data; } else if (NSS_CMSType_IsWrapper(tag)) { ccinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo); if (ccinfo != NULL) { pItem = NSS_CMSContentInfo_GetContent(ccinfo); } } else { PORT_Assert(0); } return pItem; }
/* * NSS_CMSMessage_ContentLevel - find content level #n * * CMS data content objects do not count. */ NSSCMSContentInfo * NSS_CMSMessage_ContentLevel(NSSCMSMessage *cmsg, int n) { int count = 0; NSSCMSContentInfo *cinfo; /* walk down the chain of contentinfos */ for (cinfo = &(cmsg->contentInfo); cinfo != NULL && count < n; cinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo)) { count++; } return cinfo; }
/* * NSS_CMSMessage_ContentLevelCount - count number of levels of CMS content objects in this message * * CMS data content objects do not count. */ int NSS_CMSMessage_ContentLevelCount(NSSCMSMessage *cmsg) { int count = 0; NSSCMSContentInfo *cinfo; /* walk down the chain of contentinfos */ for (cinfo = &(cmsg->contentInfo); cinfo != NULL; ) { count++; cinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo); } return count; }
/* * NSS_CMSMessage_ContainsCertsOrCrls - see if message contains certs along the way */ PRBool NSS_CMSMessage_ContainsCertsOrCrls(NSSCMSMessage *cmsg) { NSSCMSContentInfo *cinfo; /* descend into CMS message */ for (cinfo = &(cmsg->contentInfo); cinfo != NULL; cinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo)) { if (!NSS_CMSType_IsData(NSS_CMSContentInfo_GetContentTypeTag(cinfo))) continue; /* next level */ if (NSS_CMSSignedData_ContainsCertsOrCrls(cinfo->content.signedData)) return PR_TRUE; /* callback here for generic wrappers? */ } return PR_FALSE; }
/* * NSS_CMSMessage_IsEncrypted - see if message contains a encrypted submessage */ PRBool NSS_CMSMessage_IsEncrypted(NSSCMSMessage *cmsg) { NSSCMSContentInfo *cinfo; /* walk down the chain of contentinfos */ for (cinfo = &(cmsg->contentInfo); cinfo != NULL; cinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo)) { switch (NSS_CMSContentInfo_GetContentTypeTag(cinfo)) { case SEC_OID_PKCS7_ENVELOPED_DATA: case SEC_OID_PKCS7_ENCRYPTED_DATA: return PR_TRUE; default: /* callback here for generic wrappers? */ break; } } return PR_FALSE; }
/* * NSS_CMSMessage_IsSigned - see if message contains a signed submessage * * If the CMS message has a SignedData with a signature (not just a SignedData) * return true; false otherwise. This can/should be called before calling * VerifySignature, which will always indicate failure if no signature is * present, but that does not mean there even was a signature! * Note that the content itself can be empty (detached content was sent * another way); it is the presence of the signature that matters. */ PRBool NSS_CMSMessage_IsSigned(NSSCMSMessage *cmsg) { NSSCMSContentInfo *cinfo; /* walk down the chain of contentinfos */ for (cinfo = &(cmsg->contentInfo); cinfo != NULL; cinfo = NSS_CMSContentInfo_GetChildContentInfo(cinfo)) { switch (NSS_CMSContentInfo_GetContentTypeTag(cinfo)) { case SEC_OID_PKCS7_SIGNED_DATA: if (!NSS_CMSArray_IsEmpty((void **)cinfo->content.signedData->signerInfos)) return PR_TRUE; break; default: /* callback here for generic wrappers? */ break; } } return PR_FALSE; }