Blame nss/lib/smime/cms.h

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * Interfaces of the CMS implementation.
Packit 40b132
 */
Packit 40b132
Packit 40b132
#ifndef _CMS_H_
Packit 40b132
#define _CMS_H_
Packit 40b132
Packit 40b132
#include "seccomon.h"
Packit 40b132
Packit 40b132
#include "secoidt.h"
Packit 40b132
#include "certt.h"
Packit 40b132
#include "keyt.h"
Packit 40b132
#include "hasht.h"
Packit 40b132
#include "cmst.h"
Packit 40b132
Packit 40b132
/************************************************************************/
Packit 40b132
SEC_BEGIN_PROTOS
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsdecode.c - CMS decoding
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDecoder_Start - set up decoding of a DER-encoded CMS message
Packit 40b132
 *
Packit 40b132
 * "poolp" - pointer to arena for message, or NULL if new pool should be created
Packit 40b132
 * "cb", "cb_arg" - callback function and argument for delivery of inner content
Packit 40b132
 *                  inner content will be stored in the message if cb is NULL.
Packit 40b132
 * "pwfn", pwfn_arg" - callback function for getting token password
Packit 40b132
 * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
Packit 40b132
 */
Packit 40b132
extern NSSCMSDecoderContext *
Packit 40b132
NSS_CMSDecoder_Start(PLArenaPool *poolp,
Packit 40b132
		      NSSCMSContentCallback cb, void *cb_arg,
Packit 40b132
		      PK11PasswordFunc pwfn, void *pwfn_arg,
Packit 40b132
		      NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDecoder_Update - feed DER-encoded data to decoder
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDecoder_Update(NSSCMSDecoderContext *p7dcx, const char *buf, unsigned long len);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDecoder_Cancel - cancel a decoding process
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSDecoder_Cancel(NSSCMSDecoderContext *p7dcx);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDecoder_Finish - mark the end of inner content and finish decoding
Packit 40b132
 */
Packit 40b132
extern NSSCMSMessage *
Packit 40b132
NSS_CMSDecoder_Finish(NSSCMSDecoderContext *p7dcx);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_CreateFromDER - decode a CMS message from DER encoded data
Packit 40b132
 */
Packit 40b132
extern NSSCMSMessage *
Packit 40b132
NSS_CMSMessage_CreateFromDER(SECItem *DERmessage,
Packit 40b132
		    NSSCMSContentCallback cb, void *cb_arg,
Packit 40b132
		    PK11PasswordFunc pwfn, void *pwfn_arg,
Packit 40b132
		    NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsencode.c - CMS encoding
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncoder_Start - set up encoding of a CMS message
Packit 40b132
 *
Packit 40b132
 * "cmsg" - message to encode
Packit 40b132
 * "outputfn", "outputarg" - callback function for delivery of DER-encoded output
Packit 40b132
 *                           will not be called if NULL.
Packit 40b132
 * "dest" - if non-NULL, pointer to SECItem that will hold the DER-encoded output
Packit 40b132
 * "destpoolp" - pool to allocate DER-encoded output in
Packit 40b132
 * "pwfn", pwfn_arg" - callback function for getting token password
Packit 40b132
 * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
Packit 40b132
 * "detached_digestalgs", "detached_digests" - digests from detached content
Packit 40b132
 */
Packit 40b132
extern NSSCMSEncoderContext *
Packit 40b132
NSS_CMSEncoder_Start(NSSCMSMessage *cmsg,
Packit 40b132
			NSSCMSContentCallback outputfn, void *outputarg,
Packit 40b132
			SECItem *dest, PLArenaPool *destpoolp,
Packit 40b132
			PK11PasswordFunc pwfn, void *pwfn_arg,
Packit 40b132
			NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
Packit 40b132
			SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncoder_Update - take content data delivery from the user
Packit 40b132
 *
Packit 40b132
 * "p7ecx" - encoder context
Packit 40b132
 * "data" - content data
Packit 40b132
 * "len" - length of content data
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncoder_Update(NSSCMSEncoderContext *p7ecx, const char *data, unsigned long len);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncoder_Cancel - stop all encoding
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncoder_Cancel(NSSCMSEncoderContext *p7ecx);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncoder_Finish - signal the end of data
Packit 40b132
 *
Packit 40b132
 * we need to walk down the chain of encoders and the finish them from the innermost out
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncoder_Finish(NSSCMSEncoderContext *p7ecx);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsmessage.c - CMS message object
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_Create - create a CMS message object
Packit 40b132
 *
Packit 40b132
 * "poolp" - arena to allocate memory from, or NULL if new arena should be created
Packit 40b132
 */
Packit 40b132
extern NSSCMSMessage *
Packit 40b132
NSS_CMSMessage_Create(PLArenaPool *poolp);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_SetEncodingParams - set up a CMS message object for encoding or decoding
Packit 40b132
 *
Packit 40b132
 * "cmsg" - message object
Packit 40b132
 * "pwfn", pwfn_arg" - callback function for getting token password
Packit 40b132
 * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
Packit 40b132
 * "detached_digestalgs", "detached_digests" - digests from detached content
Packit 40b132
 *
Packit 40b132
 * used internally.
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSMessage_SetEncodingParams(NSSCMSMessage *cmsg,
Packit 40b132
			PK11PasswordFunc pwfn, void *pwfn_arg,
Packit 40b132
			NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
Packit 40b132
			SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_Destroy - destroy a CMS message and all of its sub-pieces.
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSMessage_Destroy(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_Copy - return a copy of the given message. 
Packit 40b132
 *
Packit 40b132
 * The copy may be virtual or may be real -- either way, the result needs
Packit 40b132
 * to be passed to NSS_CMSMessage_Destroy later (as does the original).
Packit 40b132
 */
Packit 40b132
extern NSSCMSMessage *
Packit 40b132
NSS_CMSMessage_Copy(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_GetArena - return a pointer to the message's arena pool
Packit 40b132
 */
Packit 40b132
extern PLArenaPool *
Packit 40b132
NSS_CMSMessage_GetArena(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_GetContentInfo - return a pointer to the top level contentInfo
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSMessage_GetContentInfo(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * Return a pointer to the actual content. 
Packit 40b132
 * In the case of those types which are encrypted, this returns the *plain* content.
Packit 40b132
 * In case of nested contentInfos, this descends and retrieves the innermost content.
Packit 40b132
 */
Packit 40b132
extern SECItem *
Packit 40b132
NSS_CMSMessage_GetContent(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_ContentLevelCount - count number of levels of CMS content objects in this message
Packit 40b132
 *
Packit 40b132
 * CMS data content objects do not count.
Packit 40b132
 */
Packit 40b132
extern int
Packit 40b132
NSS_CMSMessage_ContentLevelCount(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_ContentLevel - find content level #n
Packit 40b132
 *
Packit 40b132
 * CMS data content objects do not count.
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSMessage_ContentLevel(NSSCMSMessage *cmsg, int n);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_ContainsCertsOrCrls - see if message contains certs along the way
Packit 40b132
 */
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSMessage_ContainsCertsOrCrls(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_IsEncrypted - see if message contains a encrypted submessage
Packit 40b132
 */
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSMessage_IsEncrypted(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_IsSigned - see if message contains a signed submessage
Packit 40b132
 *
Packit 40b132
 * If the CMS message has a SignedData with a signature (not just a SignedData)
Packit 40b132
 * return true; false otherwise.  This can/should be called before calling
Packit 40b132
 * VerifySignature, which will always indicate failure if no signature is
Packit 40b132
 * present, but that does not mean there even was a signature!
Packit 40b132
 * Note that the content itself can be empty (detached content was sent
Packit 40b132
 * another way); it is the presence of the signature that matters.
Packit 40b132
 */
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSMessage_IsSigned(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSMessage_IsContentEmpty - see if content is empty
Packit 40b132
 *
Packit 40b132
 * returns PR_TRUE is innermost content length is < minLen
Packit 40b132
 * XXX need the encrypted content length (why?)
Packit 40b132
 */
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSMessage_IsContentEmpty(NSSCMSMessage *cmsg, unsigned int minLen);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmscinfo.c - CMS contentInfo methods
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_Destroy - destroy a CMS contentInfo and all of its sub-pieces.
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSContentInfo_Destroy(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_GetChildContentInfo - get content's contentInfo (if it exists)
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSContentInfo_GetChildContentInfo(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_SetContent - set cinfo's content type & content to CMS object
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECOidTag type, void *ptr);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_SetContent_XXXX - typesafe wrappers for NSS_CMSContentInfo_SetType
Packit 40b132
 *   set cinfo's content type & content to CMS object
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent_Data(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECItem *data, PRBool detached);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent_SignedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent_EnvelopedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent_DigestedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContent_EncryptedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * turn off streaming for this content type.
Packit 40b132
 * This could fail with SEC_ERROR_NO_MEMORY in memory constrained conditions.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetDontStream(NSSCMSContentInfo *cinfo, PRBool dontStream);
Packit 40b132
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_GetContent - get pointer to inner content
Packit 40b132
 *
Packit 40b132
 * needs to be casted...
Packit 40b132
 */
Packit 40b132
extern void *
Packit 40b132
NSS_CMSContentInfo_GetContent(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSContentInfo_GetInnerContent - get pointer to innermost content
Packit 40b132
 *
Packit 40b132
 * this is typically only called by NSS_CMSMessage_GetContent()
Packit 40b132
 */
Packit 40b132
extern SECItem *
Packit 40b132
NSS_CMSContentInfo_GetInnerContent(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_GetContentType{Tag,OID} - find out (saving pointer to lookup result
Packit 40b132
 * for future reference) and return the inner content type.
Packit 40b132
 */
Packit 40b132
extern SECOidTag
Packit 40b132
NSS_CMSContentInfo_GetContentTypeTag(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
extern SECItem *
Packit 40b132
NSS_CMSContentInfo_GetContentTypeOID(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_GetContentEncAlgTag - find out (saving pointer to lookup result
Packit 40b132
 * for future reference) and return the content encryption algorithm tag.
Packit 40b132
 */
Packit 40b132
extern SECOidTag
Packit 40b132
NSS_CMSContentInfo_GetContentEncAlgTag(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSContentInfo_GetContentEncAlg - find out and return the content encryption algorithm tag.
Packit 40b132
 */
Packit 40b132
extern SECAlgorithmID *
Packit 40b132
NSS_CMSContentInfo_GetContentEncAlg(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContentEncAlg(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
Packit 40b132
				    SECOidTag bulkalgtag, SECItem *parameters, int keysize);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSContentInfo_SetContentEncAlgID(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
Packit 40b132
				    SECAlgorithmID *algid, int keysize);
Packit 40b132
Packit 40b132
extern void
Packit 40b132
NSS_CMSContentInfo_SetBulkKey(NSSCMSContentInfo *cinfo, PK11SymKey *bulkkey);
Packit 40b132
Packit 40b132
extern PK11SymKey *
Packit 40b132
NSS_CMSContentInfo_GetBulkKey(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
extern int
Packit 40b132
NSS_CMSContentInfo_GetBulkKeySize(NSSCMSContentInfo *cinfo);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsutil.c - CMS misc utility functions
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSArray_SortByDER - sort array of objects by objects' DER encoding
Packit 40b132
 *
Packit 40b132
 * make sure that the order of the objects guarantees valid DER (which must be
Packit 40b132
 * in lexigraphically ascending order for a SET OF); if reordering is necessary it
Packit 40b132
 * will be done in place (in objs).
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSArray_SortByDER(void **objs, const SEC_ASN1Template *objtemplate, void **objs2);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSUtil_DERCompare - for use with NSS_CMSArray_Sort to
Packit 40b132
 *  sort arrays of SECItems containing DER
Packit 40b132
 */
Packit 40b132
extern int
Packit 40b132
NSS_CMSUtil_DERCompare(void *a, void *b);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
Packit 40b132
 * algorithms.
Packit 40b132
 *
Packit 40b132
 * algorithmArray - array of algorithm IDs
Packit 40b132
 * algid - algorithmid of algorithm to pick
Packit 40b132
 *
Packit 40b132
 * Returns:
Packit 40b132
 *  An integer containing the index of the algorithm in the array or -1 if 
Packit 40b132
 *  algorithm was not found.
Packit 40b132
 */
Packit 40b132
extern int
Packit 40b132
NSS_CMSAlgArray_GetIndexByAlgID(SECAlgorithmID **algorithmArray, SECAlgorithmID *algid);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
Packit 40b132
 * algorithms.
Packit 40b132
 *
Packit 40b132
 * algorithmArray - array of algorithm IDs
Packit 40b132
 * algiddata - id of algorithm to pick
Packit 40b132
 *
Packit 40b132
 * Returns:
Packit 40b132
 *  An integer containing the index of the algorithm in the array or -1 if 
Packit 40b132
 *  algorithm was not found.
Packit 40b132
 */
Packit 40b132
extern int
Packit 40b132
NSS_CMSAlgArray_GetIndexByAlgTag(SECAlgorithmID **algorithmArray, SECOidTag algtag);
Packit 40b132
Packit 40b132
extern const SECHashObject *
Packit 40b132
NSS_CMSUtil_GetHashObjByAlgID(SECAlgorithmID *algid);
Packit 40b132
Packit 40b132
extern const SEC_ASN1Template *
Packit 40b132
NSS_CMSUtil_GetTemplateByTypeTag(SECOidTag type);
Packit 40b132
Packit 40b132
extern size_t
Packit 40b132
NSS_CMSUtil_GetSizeByTypeTag(SECOidTag type);
Packit 40b132
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSContent_GetContentInfo(void *msg, SECOidTag type);
Packit 40b132
Packit 40b132
extern const char *
Packit 40b132
NSS_CMSUtil_VerificationStatusToString(NSSCMSVerificationStatus vs);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmssigdata.c - CMS signedData methods
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
extern NSSCMSSignedData *
Packit 40b132
NSS_CMSSignedData_Create(NSSCMSMessage *cmsg);
Packit 40b132
Packit 40b132
extern void
Packit 40b132
NSS_CMSSignedData_Destroy(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_Encode_BeforeStart - do all the necessary things to a SignedData
Packit 40b132
 *     before start of encoding.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - find out about the right value to put into sigd->version
Packit 40b132
 *  - come up with a list of digestAlgorithms (which should be the union of the algorithms
Packit 40b132
 *         in the signerinfos).
Packit 40b132
 *         If we happen to have a pre-set list of algorithms (and digest values!), we
Packit 40b132
 *         check if we have all the signerinfos' algorithms. If not, this is an error.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Encode_BeforeStart(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Encode_BeforeData(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_Encode_AfterData - do all the necessary things to a SignedData
Packit 40b132
 *     after all the encapsulated data was passed through the encoder.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - create the signatures in all the SignerInfos
Packit 40b132
 *
Packit 40b132
 * Please note that nothing is done to the Certificates and CRLs in the message - this
Packit 40b132
 * is entirely the responsibility of our callers.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Encode_AfterData(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Decode_BeforeData(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_Decode_AfterData - do all the necessary things to a SignedData
Packit 40b132
 *     after all the encapsulated data was passed through the decoder.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Decode_AfterData(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_Decode_AfterEnd - do all the necessary things to a SignedData
Packit 40b132
 *     after all decoding is finished.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_Decode_AfterEnd(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSSignedData_GetSignerInfos - retrieve the SignedData's signer list
Packit 40b132
 */
Packit 40b132
extern NSSCMSSignerInfo **
Packit 40b132
NSS_CMSSignedData_GetSignerInfos(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern int
Packit 40b132
NSS_CMSSignedData_SignerInfoCount(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern NSSCMSSignerInfo *
Packit 40b132
NSS_CMSSignedData_GetSignerInfo(NSSCMSSignedData *sigd, int i);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSSignedData_GetDigestAlgs - retrieve the SignedData's digest algorithm list
Packit 40b132
 */
Packit 40b132
extern SECAlgorithmID **
Packit 40b132
NSS_CMSSignedData_GetDigestAlgs(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_GetContentInfo - return pointer to this signedData's contentinfo
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSSignedData_GetContentInfo(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSSignedData_GetCertificateList - retrieve the SignedData's certificate list
Packit 40b132
 */
Packit 40b132
extern SECItem **
Packit 40b132
NSS_CMSSignedData_GetCertificateList(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_ImportCerts(NSSCMSSignedData *sigd, CERTCertDBHandle *certdb,
Packit 40b132
				SECCertUsage certusage, PRBool keepcerts);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_HasDigests - see if we have digests in place
Packit 40b132
 */
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSSignedData_HasDigests(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_VerifySignerInfo - check a signature.
Packit 40b132
 *
Packit 40b132
 * The digests were either calculated during decoding (and are stored in the
Packit 40b132
 * signedData itself) or set after decoding using NSS_CMSSignedData_SetDigests.
Packit 40b132
 *
Packit 40b132
 * The verification checks if the signing cert is valid and has a trusted chain
Packit 40b132
 * for the purpose specified by "certusage".
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_VerifySignerInfo(NSSCMSSignedData *sigd, int i, CERTCertDBHandle *certdb,
Packit 40b132
				    SECCertUsage certusage);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_VerifyCertsOnly - verify the certs in a certs-only message
Packit 40b132
*/
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_VerifyCertsOnly(NSSCMSSignedData *sigd, 
Packit 40b132
                                  CERTCertDBHandle *certdb, 
Packit 40b132
                                  SECCertUsage usage);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_AddCertList(NSSCMSSignedData *sigd, CERTCertificateList *certlist);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_AddCertChain - add cert and its entire chain to the set of certs 
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_AddCertChain(NSSCMSSignedData *sigd, CERTCertificate *cert);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_AddCertificate(NSSCMSSignedData *sigd, CERTCertificate *cert);
Packit 40b132
Packit 40b132
extern PRBool
Packit 40b132
NSS_CMSSignedData_ContainsCertsOrCrls(NSSCMSSignedData *sigd);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_AddSignerInfo(NSSCMSSignedData *sigd,
Packit 40b132
				NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_SetDigests(NSSCMSSignedData *sigd,
Packit 40b132
				SECAlgorithmID **digestalgs,
Packit 40b132
				SECItem **digests);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_SetDigestValue(NSSCMSSignedData *sigd,
Packit 40b132
				SECOidTag digestalgtag,
Packit 40b132
				SECItem *digestdata);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignedData_AddDigest(PLArenaPool *poolp,
Packit 40b132
				NSSCMSSignedData *sigd,
Packit 40b132
				SECOidTag digestalgtag,
Packit 40b132
				SECItem *digest);
Packit 40b132
Packit 40b132
extern SECItem *
Packit 40b132
NSS_CMSSignedData_GetDigestValue(NSSCMSSignedData *sigd, SECOidTag digestalgtag);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignedData_CreateCertsOnly - create a certs-only SignedData.
Packit 40b132
 *
Packit 40b132
 * cert          - base certificates that will be included
Packit 40b132
 * include_chain - if true, include the complete cert chain for cert
Packit 40b132
 *
Packit 40b132
 * More certs and chains can be added via AddCertificate and AddCertChain.
Packit 40b132
 *
Packit 40b132
 * An error results in a return value of NULL and an error set.
Packit 40b132
 */
Packit 40b132
extern NSSCMSSignedData *
Packit 40b132
NSS_CMSSignedData_CreateCertsOnly(NSSCMSMessage *cmsg, CERTCertificate *cert, PRBool include_chain);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmssiginfo.c - signerinfo methods
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
extern NSSCMSSignerInfo *
Packit 40b132
NSS_CMSSignerInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert, SECOidTag digestalgtag);
Packit 40b132
extern NSSCMSSignerInfo *
Packit 40b132
NSS_CMSSignerInfo_CreateWithSubjKeyID(NSSCMSMessage *cmsg, SECItem *subjKeyID, SECKEYPublicKey *pubKey, SECKEYPrivateKey *signingKey, SECOidTag digestalgtag);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_Destroy - destroy a SignerInfo data structure
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSSignerInfo_Destroy(NSSCMSSignerInfo *si);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_Sign - sign something
Packit 40b132
 *
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_Sign(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_VerifyCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb,
Packit 40b132
			    SECCertUsage certusage);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_Verify - verify the signature of a single SignerInfo
Packit 40b132
 *
Packit 40b132
 * Just verifies the signature. The assumption is that verification of the certificate
Packit 40b132
 * is done already.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_Verify(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
Packit 40b132
Packit 40b132
extern NSSCMSVerificationStatus
Packit 40b132
NSS_CMSSignerInfo_GetVerificationStatus(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
extern SECOidData *
Packit 40b132
NSS_CMSSignerInfo_GetDigestAlg(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
extern SECOidTag
Packit 40b132
NSS_CMSSignerInfo_GetDigestAlgTag(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
extern int
Packit 40b132
NSS_CMSSignerInfo_GetVersion(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
extern CERTCertificateList *
Packit 40b132
NSS_CMSSignerInfo_GetCertList(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_GetSigningTime - return the signing time,
Packit 40b132
 *				      in UTCTime format, of a CMS signerInfo.
Packit 40b132
 *
Packit 40b132
 * sinfo - signerInfo data for this signer
Packit 40b132
 *
Packit 40b132
 * Returns a pointer to XXXX (what?)
Packit 40b132
 * A return value of NULL is an error.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_GetSigningTime(NSSCMSSignerInfo *sinfo, PRTime *stime);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * Return the signing cert of a CMS signerInfo.
Packit 40b132
 *
Packit 40b132
 * the certs in the enclosing SignedData must have been imported already
Packit 40b132
 */
Packit 40b132
extern CERTCertificate *
Packit 40b132
NSS_CMSSignerInfo_GetSigningCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_GetSignerCommonName - return the common name of the signer
Packit 40b132
 *
Packit 40b132
 * sinfo - signerInfo data for this signer
Packit 40b132
 *
Packit 40b132
 * Returns a pointer to allocated memory, which must be freed with PORT_Free.
Packit 40b132
 * A return value of NULL is an error.
Packit 40b132
 */
Packit 40b132
extern char *
Packit 40b132
NSS_CMSSignerInfo_GetSignerCommonName(NSSCMSSignerInfo *sinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_GetSignerEmailAddress - return the common name of the signer
Packit 40b132
 *
Packit 40b132
 * sinfo - signerInfo data for this signer
Packit 40b132
 *
Packit 40b132
 * Returns a pointer to allocated memory, which must be freed.
Packit 40b132
 * A return value of NULL is an error.
Packit 40b132
 */
Packit 40b132
extern char *
Packit 40b132
NSS_CMSSignerInfo_GetSignerEmailAddress(NSSCMSSignerInfo *sinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_AddAuthAttr - add an attribute to the
Packit 40b132
 * authenticated (i.e. signed) attributes of "signerinfo". 
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddAuthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_AddUnauthAttr - add an attribute to the
Packit 40b132
 * unauthenticated attributes of "signerinfo". 
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddUnauthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSSignerInfo_AddSigningTime - add the signing time to the
Packit 40b132
 * authenticated (i.e. signed) attributes of "signerinfo". 
Packit 40b132
 *
Packit 40b132
 * This is expected to be included in outgoing signed
Packit 40b132
 * messages for email (S/MIME) but is likely useful in other situations.
Packit 40b132
 *
Packit 40b132
 * This should only be added once; a second call will do nothing.
Packit 40b132
 *
Packit 40b132
 * XXX This will probably just shove the current time into "signerinfo"
Packit 40b132
 * but it will not actually get signed until the entire item is
Packit 40b132
 * processed for encoding.  Is this (expected to be small) delay okay?
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddSigningTime(NSSCMSSignerInfo *signerinfo, PRTime t);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_AddSMIMECaps - add a SMIMECapabilities attribute to the
Packit 40b132
 * authenticated (i.e. signed) attributes of "signerinfo".
Packit 40b132
 *
Packit 40b132
 * This is expected to be included in outgoing signed
Packit 40b132
 * messages for email (S/MIME).
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddSMIMECaps(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs - add a SMIMEEncryptionKeyPreferences attribute to the
Packit 40b132
 * authenticated (i.e. signed) attributes of "signerinfo".
Packit 40b132
 *
Packit 40b132
 * This is expected to be included in outgoing signed messages for email (S/MIME).
Packit 40b132
 */
Packit 40b132
SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs(NSSCMSSignerInfo *signerinfo, CERTCertificate *cert, CERTCertDBHandle *certdb);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_AddMSSMIMEEncKeyPrefs - add a SMIMEEncryptionKeyPreferences attribute to the
Packit 40b132
 * authenticated (i.e. signed) attributes of "signerinfo", using the OID preferred by Microsoft.
Packit 40b132
 *
Packit 40b132
 * This is expected to be included in outgoing signed messages for email (S/MIME),
Packit 40b132
 * if compatibility with Microsoft mail clients is wanted.
Packit 40b132
 */
Packit 40b132
SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddMSSMIMEEncKeyPrefs(NSSCMSSignerInfo *signerinfo, CERTCertificate *cert, CERTCertDBHandle *certdb);
Packit 40b132
Packit 40b132
/* 
Packit 40b132
 * NSS_CMSSignerInfo_AddCounterSignature - countersign a signerinfo
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_AddCounterSignature(NSSCMSSignerInfo *signerinfo,
Packit 40b132
				    SECOidTag digestalg, CERTCertificate signingcert);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * XXXX the following needs to be done in the S/MIME layer code
Packit 40b132
 * after signature of a signerinfo is verified
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_SMIMESignerInfo_SaveSMIMEProfile(NSSCMSSignerInfo *signerinfo);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSSignerInfo_IncludeCerts - set cert chain inclusion mode for this signer
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSSignerInfo_IncludeCerts(NSSCMSSignerInfo *signerinfo, NSSCMSCertChainMode cm, SECCertUsage usage);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsenvdata.c - CMS envelopedData methods
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Create - create an enveloped data message
Packit 40b132
 */
Packit 40b132
extern NSSCMSEnvelopedData *
Packit 40b132
NSS_CMSEnvelopedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Destroy - destroy an enveloped data message
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSEnvelopedData_Destroy(NSSCMSEnvelopedData *edp);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_GetContentInfo - return pointer to this envelopedData's contentinfo
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSEnvelopedData_GetContentInfo(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_AddRecipient - add a recipientinfo to the enveloped data msg
Packit 40b132
 *
Packit 40b132
 * rip must be created on the same pool as edp - this is not enforced, though.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_AddRecipient(NSSCMSEnvelopedData *edp, NSSCMSRecipientInfo *rip);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Encode_BeforeStart - prepare this envelopedData for encoding
Packit 40b132
 *
Packit 40b132
 * at this point, we need
Packit 40b132
 * - recipientinfos set up with recipient's certificates
Packit 40b132
 * - a content encryption algorithm (if none, 3DES will be used)
Packit 40b132
 *
Packit 40b132
 * this function will generate a random content encryption key (aka bulk key),
Packit 40b132
 * initialize the recipientinfos with certificate identification and wrap the bulk key
Packit 40b132
 * using the proper algorithm for every certificiate.
Packit 40b132
 * it will finally set the bulk algorithm and key so that the encode step can find it.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Encode_BeforeStart(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Encode_BeforeData - set up encryption
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Encode_BeforeData(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Encode_AfterData - finalize this envelopedData for encoding
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Encode_AfterData(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Decode_BeforeData - find our recipientinfo, 
Packit 40b132
 * derive bulk key & set up our contentinfo
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Decode_BeforeData(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Decode_AfterData - finish decrypting this envelopedData's content
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Decode_AfterData(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEnvelopedData_Decode_AfterEnd - finish decoding this envelopedData
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEnvelopedData_Decode_AfterEnd(NSSCMSEnvelopedData *envd);
Packit 40b132
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsrecinfo.c - CMS recipientInfo methods
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSRecipientInfo_Create - create a recipientinfo
Packit 40b132
 *
Packit 40b132
 * we currently do not create KeyAgreement recipientinfos with multiple recipientEncryptedKeys
Packit 40b132
 * the certificate is supposed to have been verified by the caller
Packit 40b132
 */
Packit 40b132
extern NSSCMSRecipientInfo *
Packit 40b132
NSS_CMSRecipientInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert);
Packit 40b132
Packit 40b132
extern NSSCMSRecipientInfo *
Packit 40b132
NSS_CMSRecipientInfo_CreateWithSubjKeyID(NSSCMSMessage   *cmsg, 
Packit 40b132
                                         SECItem         *subjKeyID,
Packit 40b132
                                         SECKEYPublicKey *pubKey);
Packit 40b132
Packit 40b132
extern NSSCMSRecipientInfo *
Packit 40b132
NSS_CMSRecipientInfo_CreateWithSubjKeyIDFromCert(NSSCMSMessage *cmsg, 
Packit 40b132
                                                 CERTCertificate *cert);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSRecipientInfo_CreateNew - create a blank recipientinfo for 
Packit 40b132
 * applications which want to encode their own CMS structures and
Packit 40b132
 * key exchange types.
Packit 40b132
 */
Packit 40b132
extern NSSCMSRecipientInfo *
Packit 40b132
NSS_CMSRecipientInfo_CreateNew(void* pwfn_arg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSRecipientInfo_CreateFromDER - create a recipientinfo  from partially
Packit 40b132
 * decoded DER data for applications which want to encode their own CMS 
Packit 40b132
 * structures and key exchange types.
Packit 40b132
 */
Packit 40b132
extern NSSCMSRecipientInfo *
Packit 40b132
NSS_CMSRecipientInfo_CreateFromDER(SECItem* input, void* pwfn_arg);
Packit 40b132
Packit 40b132
extern void
Packit 40b132
NSS_CMSRecipientInfo_Destroy(NSSCMSRecipientInfo *ri);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSRecipientInfo_GetCertAndKey - retrieve the cert and key from the
Packit 40b132
 * recipientInfo struct. If retcert or retkey are NULL, the cert or 
Packit 40b132
 * key (respectively) would not be returned). This function is a no-op if both 
Packit 40b132
 * retcert and retkey are NULL. Caller inherits ownership of the cert and key
Packit 40b132
 * he requested (and is responsible to free them).
Packit 40b132
 */
Packit 40b132
SECStatus NSS_CMSRecipientInfo_GetCertAndKey(NSSCMSRecipientInfo *ri,
Packit 40b132
   CERTCertificate** retcert, SECKEYPrivateKey** retkey);
Packit 40b132
Packit 40b132
extern int
Packit 40b132
NSS_CMSRecipientInfo_GetVersion(NSSCMSRecipientInfo *ri);
Packit 40b132
Packit 40b132
extern SECItem *
Packit 40b132
NSS_CMSRecipientInfo_GetEncryptedKey(NSSCMSRecipientInfo *ri, int subIndex);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSRecipientInfo_Encode - encode an NSS_CMSRecipientInfo as ASN.1
Packit 40b132
 */
Packit 40b132
SECStatus NSS_CMSRecipientInfo_Encode(PLArenaPool* poolp,
Packit 40b132
                                      const NSSCMSRecipientInfo *src,
Packit 40b132
                                      SECItem* returned);
Packit 40b132
Packit 40b132
extern SECOidTag
Packit 40b132
NSS_CMSRecipientInfo_GetKeyEncryptionAlgorithmTag(NSSCMSRecipientInfo *ri);
Packit 40b132
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSRecipientInfo_WrapBulkKey(NSSCMSRecipientInfo *ri, PK11SymKey *bulkkey, SECOidTag bulkalgtag);
Packit 40b132
Packit 40b132
extern PK11SymKey *
Packit 40b132
NSS_CMSRecipientInfo_UnwrapBulkKey(NSSCMSRecipientInfo *ri, int subIndex,
Packit 40b132
		CERTCertificate *cert, SECKEYPrivateKey *privkey, SECOidTag bulkalgtag);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsencdata.c - CMS encryptedData methods
Packit 40b132
 ************************************************************************/
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Create - create an empty encryptedData object.
Packit 40b132
 *
Packit 40b132
 * "algorithm" specifies the bulk encryption algorithm to use.
Packit 40b132
 * "keysize" is the key size.
Packit 40b132
 * 
Packit 40b132
 * An error results in a return value of NULL and an error set.
Packit 40b132
 * (Retrieve specific errors via PORT_GetError()/XP_GetError().)
Packit 40b132
 */
Packit 40b132
extern NSSCMSEncryptedData *
Packit 40b132
NSS_CMSEncryptedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Destroy - destroy an encryptedData object
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSEncryptedData_Destroy(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_GetContentInfo - return pointer to encryptedData object's contentInfo
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSEncryptedData_GetContentInfo(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Encode_BeforeStart - do all the necessary things to a EncryptedData
Packit 40b132
 *     before encoding begins.
Packit 40b132
 *
Packit 40b132
 * In particular:
Packit 40b132
 *  - set the correct version value.
Packit 40b132
 *  - get the encryption key
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Encode_BeforeStart(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Encode_BeforeData - set up encryption
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Encode_BeforeData(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Encode_AfterData - finalize this encryptedData for encoding
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Encode_AfterData(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Decode_BeforeData - find bulk key & set up decryption
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Decode_BeforeData(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Decode_AfterData - finish decrypting this encryptedData's content
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Decode_AfterData(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSEncryptedData_Decode_AfterEnd - finish decoding this encryptedData
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSEncryptedData_Decode_AfterEnd(NSSCMSEncryptedData *encd);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsdigdata.c - CMS encryptedData methods
Packit 40b132
 ************************************************************************/
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Create - create a digestedData object (presumably for encoding)
Packit 40b132
 *
Packit 40b132
 * version will be set by NSS_CMSDigestedData_Encode_BeforeStart
Packit 40b132
 * digestAlg is passed as parameter
Packit 40b132
 * contentInfo must be filled by the user
Packit 40b132
 * digest will be calculated while encoding
Packit 40b132
 */
Packit 40b132
extern NSSCMSDigestedData *
Packit 40b132
NSS_CMSDigestedData_Create(NSSCMSMessage *cmsg, SECAlgorithmID *digestalg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Destroy - destroy a digestedData object
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSDigestedData_Destroy(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_GetContentInfo - return pointer to digestedData object's contentInfo
Packit 40b132
 */
Packit 40b132
extern NSSCMSContentInfo *
Packit 40b132
NSS_CMSDigestedData_GetContentInfo(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Encode_BeforeStart - do all the necessary things to a DigestedData
Packit 40b132
 *     before encoding begins.
Packit 40b132
 *
Packit 40b132
 * In particular:
Packit 40b132
 *  - set the right version number. The contentInfo's content type must be set up already.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Encode_BeforeStart(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Encode_BeforeData - do all the necessary things to a DigestedData
Packit 40b132
 *     before the encapsulated data is passed through the encoder.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - set up the digests if necessary
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Encode_BeforeData(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Encode_AfterData - do all the necessary things to a DigestedData
Packit 40b132
 *     after all the encapsulated data was passed through the encoder.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - finish the digests
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Encode_AfterData(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Decode_BeforeData - do all the necessary things to a DigestedData
Packit 40b132
 *     before the encapsulated data is passed through the encoder.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - set up the digests if necessary
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Decode_BeforeData(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Decode_AfterData - do all the necessary things to a DigestedData
Packit 40b132
 *     after all the encapsulated data was passed through the encoder.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - finish the digests
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Decode_AfterData(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestedData_Decode_AfterEnd - finalize a digestedData.
Packit 40b132
 *
Packit 40b132
 * In detail:
Packit 40b132
 *  - check the digests for equality
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestedData_Decode_AfterEnd(NSSCMSDigestedData *digd);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * cmsdigest.c - digestion routines
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_StartMultiple - start digest calculation using all the
Packit 40b132
 *  digest algorithms in "digestalgs" in parallel.
Packit 40b132
 */
Packit 40b132
extern NSSCMSDigestContext *
Packit 40b132
NSS_CMSDigestContext_StartMultiple(SECAlgorithmID **digestalgs);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_StartSingle - same as NSS_CMSDigestContext_StartMultiple, but
Packit 40b132
 *  only one algorithm.
Packit 40b132
 */
Packit 40b132
extern NSSCMSDigestContext *
Packit 40b132
NSS_CMSDigestContext_StartSingle(SECAlgorithmID *digestalg);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_Update - feed more data into the digest machine
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSDigestContext_Update(NSSCMSDigestContext *cmsdigcx, const unsigned char *data, int len);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_Cancel - cancel digesting operation
Packit 40b132
 */
Packit 40b132
extern void
Packit 40b132
NSS_CMSDigestContext_Cancel(NSSCMSDigestContext *cmsdigcx);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_FinishMultiple - finish the digests and put them
Packit 40b132
 *  into an array of SECItems (allocated on poolp)
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestContext_FinishMultiple(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
Packit 40b132
			    SECItem ***digestsp);
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDigestContext_FinishSingle - same as NSS_CMSDigestContext_FinishMultiple,
Packit 40b132
 *  but for one digest.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDigestContext_FinishSingle(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
Packit 40b132
			    SECItem *digest);
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * 
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/* shortcuts for basic use */
Packit 40b132
Packit 40b132
/*
Packit 40b132
 * NSS_CMSDEREncode - DER Encode a CMS message, with input being
Packit 40b132
 *                    the plaintext message and derOut being the output,
Packit 40b132
 *                    stored in arena's pool.
Packit 40b132
 */
Packit 40b132
extern SECStatus
Packit 40b132
NSS_CMSDEREncode(NSSCMSMessage *cmsg, SECItem *input, SECItem *derOut, 
Packit 40b132
                 PLArenaPool *arena);
Packit 40b132
Packit 40b132
Packit 40b132
/************************************************************************
Packit 40b132
 * 
Packit 40b132
 ************************************************************************/
Packit 40b132
Packit 40b132
/*
Packit 40b132
 *  define new S/MIME content type entries
Packit 40b132
 *
Packit 40b132
 *  S/MIME uses the builtin PKCS7 oid types for encoding and decoding the
Packit 40b132
 *  various S/MIME content. Some applications have their own content type
Packit 40b132
 *  which is different from the standard content type defined by S/MIME.
Packit 40b132
 *
Packit 40b132
 *  This function allows you to register new content types. There are basically
Packit 40b132
 *  Two different types of content, Wrappping content, and Data.
Packit 40b132
 *
Packit 40b132
 *  For data types, All the functions below can be zero or NULL excext 
Packit 40b132
 *  type and is isData, which should be your oid tag and PR_FALSE respectively
Packit 40b132
 *
Packit 40b132
 *  For wrapping types, everything must be provided, or you will get encoder
Packit 40b132
 *  failures.
Packit 40b132
 *
Packit 40b132
 *  If NSS doesn't already define the OID that you need, you can register 
Packit 40b132
 *  your own with SECOID_AddEntry.
Packit 40b132
 * 
Packit 40b132
 *  Once you have defined your new content type, you can pass your new content
Packit 40b132
 *  type to NSS_CMSContentInfo_SetContent().
Packit 40b132
 * 
Packit 40b132
 *  If you are using a wrapping type you can pass your own data structure in 
Packit 40b132
 *  the ptr field, but it must contain and embedded NSSCMSGenericWrappingData 
Packit 40b132
 *  structure as the first element. The size you pass to 
Packit 40b132
 *  NSS_CMSType_RegisterContentType is the total size of your self defined 
Packit 40b132
 *  data structure. NSS_CMSContentInfo_GetContent will return that data 
Packit 40b132
 *  structure from the content info. Your ASN1Template will be evaluated 
Packit 40b132
 *  against that data structure.
Packit 40b132
 */
Packit 40b132
SECStatus NSS_CMSType_RegisterContentType(SECOidTag type,
Packit 40b132
                          SEC_ASN1Template *asn1Template, size_t size,
Packit 40b132
                          NSSCMSGenericWrapperDataDestroy  destroy,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback decode_before,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback decode_after,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback decode_end,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback encode_start,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback encode_before,
Packit 40b132
                          NSSCMSGenericWrapperDataCallback encode_after,
Packit 40b132
                          PRBool isData);
Packit 40b132
Packit 40b132
/************************************************************************/
Packit 40b132
SEC_END_PROTOS
Packit 40b132
Packit 40b132
#endif /* _CMS_H_ */