cms.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:35k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * Interfaces of the CMS implementation.
  35.  *
  36.  * $Id: cms.h,v 1.6 2000/09/29 16:38:11 mcgreer%netscape.com Exp $
  37.  */
  38. #ifndef _CMS_H_
  39. #define _CMS_H_
  40. #include "seccomon.h"
  41. #include "mcom_db.h" /* needed by certt.h */
  42. #include "secoidt.h"
  43. #include "secder.h" /* needed by certt.h; XXX go away when possible */
  44. #include "certt.h"
  45. #include "keyt.h"
  46. #include "hasht.h"
  47. #include "cmst.h"
  48. /************************************************************************/
  49. SEC_BEGIN_PROTOS
  50. /************************************************************************
  51.  * cmsdecode.c - CMS decoding
  52.  ************************************************************************/
  53. /*
  54.  * NSS_CMSDecoder_Start - set up decoding of a DER-encoded CMS message
  55.  *
  56.  * "poolp" - pointer to arena for message, or NULL if new pool should be created
  57.  * "cb", "cb_arg" - callback function and argument for delivery of inner content
  58.  *                  inner content will be stored in the message if cb is NULL.
  59.  * "pwfn", pwfn_arg" - callback function for getting token password
  60.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  61.  */
  62. extern NSSCMSDecoderContext *
  63. NSS_CMSDecoder_Start(PRArenaPool *poolp,
  64.       NSSCMSContentCallback cb, void *cb_arg,
  65.       PK11PasswordFunc pwfn, void *pwfn_arg,
  66.       NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
  67. /*
  68.  * NSS_CMSDecoder_Update - feed DER-encoded data to decoder
  69.  */
  70. extern SECStatus
  71. NSS_CMSDecoder_Update(NSSCMSDecoderContext *p7dcx, const char *buf, unsigned long len);
  72. /*
  73.  * NSS_CMSDecoder_Cancel - cancel a decoding process
  74.  */
  75. extern void
  76. NSS_CMSDecoder_Cancel(NSSCMSDecoderContext *p7dcx);
  77. /*
  78.  * NSS_CMSDecoder_Finish - mark the end of inner content and finish decoding
  79.  */
  80. extern NSSCMSMessage *
  81. NSS_CMSDecoder_Finish(NSSCMSDecoderContext *p7dcx);
  82. /*
  83.  * NSS_CMSMessage_CreateFromDER - decode a CMS message from DER encoded data
  84.  */
  85. extern NSSCMSMessage *
  86. NSS_CMSMessage_CreateFromDER(SECItem *DERmessage,
  87.     NSSCMSContentCallback cb, void *cb_arg,
  88.     PK11PasswordFunc pwfn, void *pwfn_arg,
  89.     NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg);
  90. /************************************************************************
  91.  * cmsencode.c - CMS encoding
  92.  ************************************************************************/
  93. /*
  94.  * NSS_CMSEncoder_Start - set up encoding of a CMS message
  95.  *
  96.  * "cmsg" - message to encode
  97.  * "outputfn", "outputarg" - callback function for delivery of DER-encoded output
  98.  *                           will not be called if NULL.
  99.  * "dest" - if non-NULL, pointer to SECItem that will hold the DER-encoded output
  100.  * "destpoolp" - pool to allocate DER-encoded output in
  101.  * "pwfn", pwfn_arg" - callback function for getting token password
  102.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  103.  * "detached_digestalgs", "detached_digests" - digests from detached content
  104.  */
  105. extern NSSCMSEncoderContext *
  106. NSS_CMSEncoder_Start(NSSCMSMessage *cmsg,
  107. NSSCMSContentCallback outputfn, void *outputarg,
  108. SECItem *dest, PLArenaPool *destpoolp,
  109. PK11PasswordFunc pwfn, void *pwfn_arg,
  110. NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
  111. SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
  112. /*
  113.  * NSS_CMSEncoder_Update - take content data delivery from the user
  114.  *
  115.  * "p7ecx" - encoder context
  116.  * "data" - content data
  117.  * "len" - length of content data
  118.  */
  119. extern SECStatus
  120. NSS_CMSEncoder_Update(NSSCMSEncoderContext *p7ecx, const char *data, unsigned long len);
  121. /*
  122.  * NSS_CMSEncoder_Finish - signal the end of data
  123.  *
  124.  * we need to walk down the chain of encoders and the finish them from the innermost out
  125.  */
  126. extern SECStatus
  127. NSS_CMSEncoder_Finish(NSSCMSEncoderContext *p7ecx);
  128. /************************************************************************
  129.  * cmsmessage.c - CMS message object
  130.  ************************************************************************/
  131. /*
  132.  * NSS_CMSMessage_Create - create a CMS message object
  133.  *
  134.  * "poolp" - arena to allocate memory from, or NULL if new arena should be created
  135.  */
  136. extern NSSCMSMessage *
  137. NSS_CMSMessage_Create(PLArenaPool *poolp);
  138. /*
  139.  * NSS_CMSMessage_SetEncodingParams - set up a CMS message object for encoding or decoding
  140.  *
  141.  * "cmsg" - message object
  142.  * "pwfn", pwfn_arg" - callback function for getting token password
  143.  * "decrypt_key_cb", "decrypt_key_cb_arg" - callback function for getting bulk key for encryptedData
  144.  * "detached_digestalgs", "detached_digests" - digests from detached content
  145.  *
  146.  * used internally.
  147.  */
  148. extern void
  149. NSS_CMSMessage_SetEncodingParams(NSSCMSMessage *cmsg,
  150. PK11PasswordFunc pwfn, void *pwfn_arg,
  151. NSSCMSGetDecryptKeyCallback decrypt_key_cb, void *decrypt_key_cb_arg,
  152. SECAlgorithmID **detached_digestalgs, SECItem **detached_digests);
  153. /*
  154.  * NSS_CMSMessage_Destroy - destroy a CMS message and all of its sub-pieces.
  155.  */
  156. extern void
  157. NSS_CMSMessage_Destroy(NSSCMSMessage *cmsg);
  158. /*
  159.  * NSS_CMSMessage_Copy - return a copy of the given message. 
  160.  *
  161.  * The copy may be virtual or may be real -- either way, the result needs
  162.  * to be passed to NSS_CMSMessage_Destroy later (as does the original).
  163.  */
  164. extern NSSCMSMessage *
  165. NSS_CMSMessage_Copy(NSSCMSMessage *cmsg);
  166. /*
  167.  * NSS_CMSMessage_GetArena - return a pointer to the message's arena pool
  168.  */
  169. extern PLArenaPool *
  170. NSS_CMSMessage_GetArena(NSSCMSMessage *cmsg);
  171. /*
  172.  * NSS_CMSMessage_GetContentInfo - return a pointer to the top level contentInfo
  173.  */
  174. extern NSSCMSContentInfo *
  175. NSS_CMSMessage_GetContentInfo(NSSCMSMessage *cmsg);
  176. /*
  177.  * Return a pointer to the actual content. 
  178.  * In the case of those types which are encrypted, this returns the *plain* content.
  179.  * In case of nested contentInfos, this descends and retrieves the innermost content.
  180.  */
  181. extern SECItem *
  182. NSS_CMSMessage_GetContent(NSSCMSMessage *cmsg);
  183. /*
  184.  * NSS_CMSMessage_ContentLevelCount - count number of levels of CMS content objects in this message
  185.  *
  186.  * CMS data content objects do not count.
  187.  */
  188. extern int
  189. NSS_CMSMessage_ContentLevelCount(NSSCMSMessage *cmsg);
  190. /*
  191.  * NSS_CMSMessage_ContentLevel - find content level #n
  192.  *
  193.  * CMS data content objects do not count.
  194.  */
  195. extern NSSCMSContentInfo *
  196. NSS_CMSMessage_ContentLevel(NSSCMSMessage *cmsg, int n);
  197. /*
  198.  * NSS_CMSMessage_ContainsCertsOrCrls - see if message contains certs along the way
  199.  */
  200. extern PRBool
  201. NSS_CMSMessage_ContainsCertsOrCrls(NSSCMSMessage *cmsg);
  202. /*
  203.  * NSS_CMSMessage_IsEncrypted - see if message contains a encrypted submessage
  204.  */
  205. extern PRBool
  206. NSS_CMSMessage_IsEncrypted(NSSCMSMessage *cmsg);
  207. /*
  208.  * NSS_CMSMessage_IsSigned - see if message contains a signed submessage
  209.  *
  210.  * If the CMS message has a SignedData with a signature (not just a SignedData)
  211.  * return true; false otherwise.  This can/should be called before calling
  212.  * VerifySignature, which will always indicate failure if no signature is
  213.  * present, but that does not mean there even was a signature!
  214.  * Note that the content itself can be empty (detached content was sent
  215.  * another way); it is the presence of the signature that matters.
  216.  */
  217. extern PRBool
  218. NSS_CMSMessage_IsSigned(NSSCMSMessage *cmsg);
  219. /*
  220.  * NSS_CMSMessage_IsContentEmpty - see if content is empty
  221.  *
  222.  * returns PR_TRUE is innermost content length is < minLen
  223.  * XXX need the encrypted content length (why?)
  224.  */
  225. extern PRBool
  226. NSS_CMSMessage_IsContentEmpty(NSSCMSMessage *cmsg, unsigned int minLen);
  227. /************************************************************************
  228.  * cmscinfo.c - CMS contentInfo methods
  229.  ************************************************************************/
  230. /*
  231.  * NSS_CMSContentInfo_Destroy - destroy a CMS contentInfo and all of its sub-pieces.
  232.  */
  233. extern void
  234. NSS_CMSContentInfo_Destroy(NSSCMSContentInfo *cinfo);
  235. /*
  236.  * NSS_CMSContentInfo_GetChildContentInfo - get content's contentInfo (if it exists)
  237.  */
  238. extern NSSCMSContentInfo *
  239. NSS_CMSContentInfo_GetChildContentInfo(NSSCMSContentInfo *cinfo);
  240. /*
  241.  * NSS_CMSContentInfo_SetContent - set cinfo's content type & content to CMS object
  242.  */
  243. extern SECStatus
  244. NSS_CMSContentInfo_SetContent(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECOidTag type, void *ptr);
  245. /*
  246.  * NSS_CMSContentInfo_SetContent_XXXX - typesafe wrappers for NSS_CMSContentInfo_SetType
  247.  *   set cinfo's content type & content to CMS object
  248.  */
  249. extern SECStatus
  250. NSS_CMSContentInfo_SetContent_Data(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, SECItem *data, PRBool detached);
  251. extern SECStatus
  252. NSS_CMSContentInfo_SetContent_SignedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSSignedData *sigd);
  253. extern SECStatus
  254. NSS_CMSContentInfo_SetContent_EnvelopedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEnvelopedData *envd);
  255. extern SECStatus
  256. NSS_CMSContentInfo_SetContent_DigestedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSDigestedData *digd);
  257. extern SECStatus
  258. NSS_CMSContentInfo_SetContent_EncryptedData(NSSCMSMessage *cmsg, NSSCMSContentInfo *cinfo, NSSCMSEncryptedData *encd);
  259. /*
  260.  * NSS_CMSContentInfo_GetContent - get pointer to inner content
  261.  *
  262.  * needs to be casted...
  263.  */
  264. extern void *
  265. NSS_CMSContentInfo_GetContent(NSSCMSContentInfo *cinfo);
  266. /* 
  267.  * NSS_CMSContentInfo_GetInnerContent - get pointer to innermost content
  268.  *
  269.  * this is typically only called by NSS_CMSMessage_GetContent()
  270.  */
  271. extern SECItem *
  272. NSS_CMSContentInfo_GetInnerContent(NSSCMSContentInfo *cinfo);
  273. /*
  274.  * NSS_CMSContentInfo_GetContentType{Tag,OID} - find out (saving pointer to lookup result
  275.  * for future reference) and return the inner content type.
  276.  */
  277. extern SECOidTag
  278. NSS_CMSContentInfo_GetContentTypeTag(NSSCMSContentInfo *cinfo);
  279. extern SECItem *
  280. NSS_CMSContentInfo_GetContentTypeOID(NSSCMSContentInfo *cinfo);
  281. /*
  282.  * NSS_CMSContentInfo_GetContentEncAlgTag - find out (saving pointer to lookup result
  283.  * for future reference) and return the content encryption algorithm tag.
  284.  */
  285. extern SECOidTag
  286. NSS_CMSContentInfo_GetContentEncAlgTag(NSSCMSContentInfo *cinfo);
  287. /*
  288.  * NSS_CMSContentInfo_GetContentEncAlg - find out and return the content encryption algorithm tag.
  289.  */
  290. extern SECAlgorithmID *
  291. NSS_CMSContentInfo_GetContentEncAlg(NSSCMSContentInfo *cinfo);
  292. extern SECStatus
  293. NSS_CMSContentInfo_SetContentEncAlg(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
  294.     SECOidTag bulkalgtag, SECItem *parameters, int keysize);
  295. extern SECStatus
  296. NSS_CMSContentInfo_SetContentEncAlgID(PLArenaPool *poolp, NSSCMSContentInfo *cinfo,
  297.     SECAlgorithmID *algid, int keysize);
  298. extern void
  299. NSS_CMSContentInfo_SetBulkKey(NSSCMSContentInfo *cinfo, PK11SymKey *bulkkey);
  300. extern PK11SymKey *
  301. NSS_CMSContentInfo_GetBulkKey(NSSCMSContentInfo *cinfo);
  302. extern int
  303. NSS_CMSContentInfo_GetBulkKeySize(NSSCMSContentInfo *cinfo);
  304. /************************************************************************
  305.  * cmsutil.c - CMS misc utility functions
  306.  ************************************************************************/
  307. /*
  308.  * NSS_CMSArray_SortByDER - sort array of objects by objects' DER encoding
  309.  *
  310.  * make sure that the order of the objects guarantees valid DER (which must be
  311.  * in lexigraphically ascending order for a SET OF); if reordering is necessary it
  312.  * will be done in place (in objs).
  313.  */
  314. extern SECStatus
  315. NSS_CMSArray_SortByDER(void **objs, const SEC_ASN1Template *objtemplate, void **objs2);
  316. /*
  317.  * NSS_CMSUtil_DERCompare - for use with NSS_CMSArray_Sort to
  318.  *  sort arrays of SECItems containing DER
  319.  */
  320. extern int
  321. NSS_CMSUtil_DERCompare(void *a, void *b);
  322. /*
  323.  * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
  324.  * algorithms.
  325.  *
  326.  * algorithmArray - array of algorithm IDs
  327.  * algid - algorithmid of algorithm to pick
  328.  *
  329.  * Returns:
  330.  *  An integer containing the index of the algorithm in the array or -1 if 
  331.  *  algorithm was not found.
  332.  */
  333. extern int
  334. NSS_CMSAlgArray_GetIndexByAlgID(SECAlgorithmID **algorithmArray, SECAlgorithmID *algid);
  335. /*
  336.  * NSS_CMSAlgArray_GetIndexByAlgID - find a specific algorithm in an array of 
  337.  * algorithms.
  338.  *
  339.  * algorithmArray - array of algorithm IDs
  340.  * algiddata - id of algorithm to pick
  341.  *
  342.  * Returns:
  343.  *  An integer containing the index of the algorithm in the array or -1 if 
  344.  *  algorithm was not found.
  345.  */
  346. extern int
  347. NSS_CMSAlgArray_GetIndexByAlgTag(SECAlgorithmID **algorithmArray, SECOidTag algtag);
  348. extern SECHashObject *
  349. NSS_CMSUtil_GetHashObjByAlgID(SECAlgorithmID *algid);
  350. /*
  351.  * XXX I would *really* like to not have to do this, but the current
  352.  * signing interface gives me little choice.
  353.  */
  354. extern SECOidTag
  355. NSS_CMSUtil_MakeSignatureAlgorithm(SECOidTag hashalg, SECOidTag encalg);
  356. extern const SEC_ASN1Template *
  357. NSS_CMSUtil_GetTemplateByTypeTag(SECOidTag type);
  358. extern size_t
  359. NSS_CMSUtil_GetSizeByTypeTag(SECOidTag type);
  360. extern NSSCMSContentInfo *
  361. NSS_CMSContent_GetContentInfo(void *msg, SECOidTag type);
  362. extern const char *
  363. NSS_CMSUtil_VerificationStatusToString(NSSCMSVerificationStatus vs);
  364. /************************************************************************
  365.  * cmssigdata.c - CMS signedData methods
  366.  ************************************************************************/
  367. extern NSSCMSSignedData *
  368. NSS_CMSSignedData_Create(NSSCMSMessage *cmsg);
  369. extern void
  370. NSS_CMSSignedData_Destroy(NSSCMSSignedData *sigd);
  371. /*
  372.  * NSS_CMSSignedData_Encode_BeforeStart - do all the necessary things to a SignedData
  373.  *     before start of encoding.
  374.  *
  375.  * In detail:
  376.  *  - find out about the right value to put into sigd->version
  377.  *  - come up with a list of digestAlgorithms (which should be the union of the algorithms
  378.  *         in the signerinfos).
  379.  *         If we happen to have a pre-set list of algorithms (and digest values!), we
  380.  *         check if we have all the signerinfos' algorithms. If not, this is an error.
  381.  */
  382. extern SECStatus
  383. NSS_CMSSignedData_Encode_BeforeStart(NSSCMSSignedData *sigd);
  384. extern SECStatus
  385. NSS_CMSSignedData_Encode_BeforeData(NSSCMSSignedData *sigd);
  386. /*
  387.  * NSS_CMSSignedData_Encode_AfterData - do all the necessary things to a SignedData
  388.  *     after all the encapsulated data was passed through the encoder.
  389.  *
  390.  * In detail:
  391.  *  - create the signatures in all the SignerInfos
  392.  *
  393.  * Please note that nothing is done to the Certificates and CRLs in the message - this
  394.  * is entirely the responsibility of our callers.
  395.  */
  396. extern SECStatus
  397. NSS_CMSSignedData_Encode_AfterData(NSSCMSSignedData *sigd);
  398. extern SECStatus
  399. NSS_CMSSignedData_Decode_BeforeData(NSSCMSSignedData *sigd);
  400. /*
  401.  * NSS_CMSSignedData_Decode_AfterData - do all the necessary things to a SignedData
  402.  *     after all the encapsulated data was passed through the decoder.
  403.  */
  404. extern SECStatus
  405. NSS_CMSSignedData_Decode_AfterData(NSSCMSSignedData *sigd);
  406. /*
  407.  * NSS_CMSSignedData_Decode_AfterEnd - do all the necessary things to a SignedData
  408.  *     after all decoding is finished.
  409.  */
  410. extern SECStatus
  411. NSS_CMSSignedData_Decode_AfterEnd(NSSCMSSignedData *sigd);
  412. /* 
  413.  * NSS_CMSSignedData_GetSignerInfos - retrieve the SignedData's signer list
  414.  */
  415. extern NSSCMSSignerInfo **
  416. NSS_CMSSignedData_GetSignerInfos(NSSCMSSignedData *sigd);
  417. extern int
  418. NSS_CMSSignedData_SignerInfoCount(NSSCMSSignedData *sigd);
  419. extern NSSCMSSignerInfo *
  420. NSS_CMSSignedData_GetSignerInfo(NSSCMSSignedData *sigd, int i);
  421. /* 
  422.  * NSS_CMSSignedData_GetDigestAlgs - retrieve the SignedData's digest algorithm list
  423.  */
  424. extern SECAlgorithmID **
  425. NSS_CMSSignedData_GetDigestAlgs(NSSCMSSignedData *sigd);
  426. /*
  427.  * NSS_CMSSignedData_GetContentInfo - return pointer to this signedData's contentinfo
  428.  */
  429. extern NSSCMSContentInfo *
  430. NSS_CMSSignedData_GetContentInfo(NSSCMSSignedData *sigd);
  431. /* 
  432.  * NSS_CMSSignedData_GetCertificateList - retrieve the SignedData's certificate list
  433.  */
  434. extern SECItem **
  435. NSS_CMSSignedData_GetCertificateList(NSSCMSSignedData *sigd);
  436. extern SECStatus
  437. NSS_CMSSignedData_ImportCerts(NSSCMSSignedData *sigd, CERTCertDBHandle *certdb,
  438. SECCertUsage certusage, PRBool keepcerts);
  439. /*
  440.  * NSS_CMSSignedData_HasDigests - see if we have digests in place
  441.  */
  442. extern PRBool
  443. NSS_CMSSignedData_HasDigests(NSSCMSSignedData *sigd);
  444. /*
  445.  * NSS_CMSSignedData_VerifySignerInfo - check a signature.
  446.  *
  447.  * The digests were either calculated during decoding (and are stored in the
  448.  * signedData itself) or set after decoding using NSS_CMSSignedData_SetDigests.
  449.  *
  450.  * The verification checks if the signing cert is valid and has a trusted chain
  451.  * for the purpose specified by "certusage".
  452.  */
  453. extern SECStatus
  454. NSS_CMSSignedData_VerifySignerInfo(NSSCMSSignedData *sigd, int i, CERTCertDBHandle *certdb,
  455.     SECCertUsage certusage);
  456. /*
  457.  * NSS_CMSSignedData_VerifyCertsOnly - verify the certs in a certs-only message
  458. */
  459. extern SECStatus
  460. NSS_CMSSignedData_VerifyCertsOnly(NSSCMSSignedData *sigd, 
  461.                                   CERTCertDBHandle *certdb, 
  462.                                   SECCertUsage usage);
  463. extern SECStatus
  464. NSS_CMSSignedData_AddCertList(NSSCMSSignedData *sigd, CERTCertificateList *certlist);
  465. /*
  466.  * NSS_CMSSignedData_AddCertChain - add cert and its entire chain to the set of certs 
  467.  */
  468. extern SECStatus
  469. NSS_CMSSignedData_AddCertChain(NSSCMSSignedData *sigd, CERTCertificate *cert);
  470. extern SECStatus
  471. NSS_CMSSignedData_AddCertificate(NSSCMSSignedData *sigd, CERTCertificate *cert);
  472. extern PRBool
  473. NSS_CMSSignedData_ContainsCertsOrCrls(NSSCMSSignedData *sigd);
  474. extern SECStatus
  475. NSS_CMSSignedData_AddSignerInfo(NSSCMSSignedData *sigd,
  476. NSSCMSSignerInfo *signerinfo);
  477. extern SECItem *
  478. NSS_CMSSignedData_GetDigestByAlgTag(NSSCMSSignedData *sigd, SECOidTag algtag);
  479. extern SECStatus
  480. NSS_CMSSignedData_SetDigests(NSSCMSSignedData *sigd,
  481. SECAlgorithmID **digestalgs,
  482. SECItem **digests);
  483. extern SECStatus
  484. NSS_CMSSignedData_SetDigestValue(NSSCMSSignedData *sigd,
  485. SECOidTag digestalgtag,
  486. SECItem *digestdata);
  487. extern SECStatus
  488. NSS_CMSSignedData_AddDigest(PRArenaPool *poolp,
  489. NSSCMSSignedData *sigd,
  490. SECOidTag digestalgtag,
  491. SECItem *digest);
  492. extern SECItem *
  493. NSS_CMSSignedData_GetDigestValue(NSSCMSSignedData *sigd, SECOidTag digestalgtag);
  494. /*
  495.  * NSS_CMSSignedData_CreateCertsOnly - create a certs-only SignedData.
  496.  *
  497.  * cert          - base certificates that will be included
  498.  * include_chain - if true, include the complete cert chain for cert
  499.  *
  500.  * More certs and chains can be added via AddCertificate and AddCertChain.
  501.  *
  502.  * An error results in a return value of NULL and an error set.
  503.  */
  504. extern NSSCMSSignedData *
  505. NSS_CMSSignedData_CreateCertsOnly(NSSCMSMessage *cmsg, CERTCertificate *cert, PRBool include_chain);
  506. /************************************************************************
  507.  * cmssiginfo.c - signerinfo methods
  508.  ************************************************************************/
  509. extern NSSCMSSignerInfo *
  510. NSS_CMSSignerInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert, SECOidTag digestalgtag);
  511. /*
  512.  * NSS_CMSSignerInfo_Destroy - destroy a SignerInfo data structure
  513.  */
  514. extern void
  515. NSS_CMSSignerInfo_Destroy(NSSCMSSignerInfo *si);
  516. /*
  517.  * NSS_CMSSignerInfo_Sign - sign something
  518.  *
  519.  */
  520. extern SECStatus
  521. NSS_CMSSignerInfo_Sign(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
  522. extern SECStatus
  523. NSS_CMSSignerInfo_VerifyCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb,
  524.     SECCertUsage certusage);
  525. /*
  526.  * NSS_CMSSignerInfo_Verify - verify the signature of a single SignerInfo
  527.  *
  528.  * Just verifies the signature. The assumption is that verification of the certificate
  529.  * is done already.
  530.  */
  531. extern SECStatus
  532. NSS_CMSSignerInfo_Verify(NSSCMSSignerInfo *signerinfo, SECItem *digest, SECItem *contentType);
  533. extern NSSCMSVerificationStatus
  534. NSS_CMSSignerInfo_GetVerificationStatus(NSSCMSSignerInfo *signerinfo);
  535. extern SECOidData *
  536. NSS_CMSSignerInfo_GetDigestAlg(NSSCMSSignerInfo *signerinfo);
  537. extern SECOidTag
  538. NSS_CMSSignerInfo_GetDigestAlgTag(NSSCMSSignerInfo *signerinfo);
  539. extern int
  540. NSS_CMSSignerInfo_GetVersion(NSSCMSSignerInfo *signerinfo);
  541. extern CERTCertificateList *
  542. NSS_CMSSignerInfo_GetCertList(NSSCMSSignerInfo *signerinfo);
  543. /*
  544.  * NSS_CMSSignerInfo_GetSigningTime - return the signing time,
  545.  *       in UTCTime format, of a CMS signerInfo.
  546.  *
  547.  * sinfo - signerInfo data for this signer
  548.  *
  549.  * Returns a pointer to XXXX (what?)
  550.  * A return value of NULL is an error.
  551.  */
  552. extern SECStatus
  553. NSS_CMSSignerInfo_GetSigningTime(NSSCMSSignerInfo *sinfo, PRTime *stime);
  554. /*
  555.  * Return the signing cert of a CMS signerInfo.
  556.  *
  557.  * the certs in the enclosing SignedData must have been imported already
  558.  */
  559. extern CERTCertificate *
  560. NSS_CMSSignerInfo_GetSigningCertificate(NSSCMSSignerInfo *signerinfo, CERTCertDBHandle *certdb);
  561. /*
  562.  * NSS_CMSSignerInfo_GetSignerCommonName - return the common name of the signer
  563.  *
  564.  * sinfo - signerInfo data for this signer
  565.  *
  566.  * Returns a pointer to allocated memory, which must be freed.
  567.  * A return value of NULL is an error.
  568.  */
  569. extern char *
  570. NSS_CMSSignerInfo_GetSignerCommonName(NSSCMSSignerInfo *sinfo);
  571. /*
  572.  * NSS_CMSSignerInfo_GetSignerEmailAddress - return the common name of the signer
  573.  *
  574.  * sinfo - signerInfo data for this signer
  575.  *
  576.  * Returns a pointer to allocated memory, which must be freed.
  577.  * A return value of NULL is an error.
  578.  */
  579. extern char *
  580. NSS_CMSSignerInfo_GetSignerEmailAddress(NSSCMSSignerInfo *sinfo);
  581. /*
  582.  * NSS_CMSSignerInfo_AddAuthAttr - add an attribute to the
  583.  * authenticated (i.e. signed) attributes of "signerinfo". 
  584.  */
  585. extern SECStatus
  586. NSS_CMSSignerInfo_AddAuthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
  587. /*
  588.  * NSS_CMSSignerInfo_AddUnauthAttr - add an attribute to the
  589.  * unauthenticated attributes of "signerinfo". 
  590.  */
  591. extern SECStatus
  592. NSS_CMSSignerInfo_AddUnauthAttr(NSSCMSSignerInfo *signerinfo, NSSCMSAttribute *attr);
  593. /* 
  594.  * NSS_CMSSignerInfo_AddSigningTime - add the signing time to the
  595.  * authenticated (i.e. signed) attributes of "signerinfo". 
  596.  *
  597.  * This is expected to be included in outgoing signed
  598.  * messages for email (S/MIME) but is likely useful in other situations.
  599.  *
  600.  * This should only be added once; a second call will do nothing.
  601.  *
  602.  * XXX This will probably just shove the current time into "signerinfo"
  603.  * but it will not actually get signed until the entire item is
  604.  * processed for encoding.  Is this (expected to be small) delay okay?
  605.  */
  606. extern SECStatus
  607. NSS_CMSSignerInfo_AddSigningTime(NSSCMSSignerInfo *signerinfo, PRTime t);
  608. /*
  609.  * NSS_CMSSignerInfo_AddSMIMECaps - add a SMIMECapabilities attribute to the
  610.  * authenticated (i.e. signed) attributes of "signerinfo".
  611.  *
  612.  * This is expected to be included in outgoing signed
  613.  * messages for email (S/MIME).
  614.  */
  615. extern SECStatus
  616. NSS_CMSSignerInfo_AddSMIMECaps(NSSCMSSignerInfo *signerinfo);
  617. /*
  618.  * NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs - add a SMIMEEncryptionKeyPreferences attribute to the
  619.  * authenticated (i.e. signed) attributes of "signerinfo".
  620.  *
  621.  * This is expected to be included in outgoing signed messages for email (S/MIME).
  622.  */
  623. SECStatus
  624. NSS_CMSSignerInfo_AddSMIMEEncKeyPrefs(NSSCMSSignerInfo *signerinfo, CERTCertificate *cert, CERTCertDBHandle *certdb);
  625. /* 
  626.  * NSS_CMSSignerInfo_AddCounterSignature - countersign a signerinfo
  627.  */
  628. extern SECStatus
  629. NSS_CMSSignerInfo_AddCounterSignature(NSSCMSSignerInfo *signerinfo,
  630.     SECOidTag digestalg, CERTCertificate signingcert);
  631. /*
  632.  * XXXX the following needs to be done in the S/MIME layer code
  633.  * after signature of a signerinfo is verified
  634.  */
  635. extern SECStatus
  636. NSS_SMIMESignerInfo_SaveSMIMEProfile(NSSCMSSignerInfo *signerinfo);
  637. /*
  638.  * NSS_CMSSignerInfo_IncludeCerts - set cert chain inclusion mode for this signer
  639.  */
  640. extern SECStatus
  641. NSS_CMSSignerInfo_IncludeCerts(NSSCMSSignerInfo *signerinfo, NSSCMSCertChainMode cm, SECCertUsage usage);
  642. /************************************************************************
  643.  * cmsenvdata.c - CMS envelopedData methods
  644.  ************************************************************************/
  645. /*
  646.  * NSS_CMSEnvelopedData_Create - create an enveloped data message
  647.  */
  648. extern NSSCMSEnvelopedData *
  649. NSS_CMSEnvelopedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
  650. /*
  651.  * NSS_CMSEnvelopedData_Destroy - destroy an enveloped data message
  652.  */
  653. extern void
  654. NSS_CMSEnvelopedData_Destroy(NSSCMSEnvelopedData *edp);
  655. /*
  656.  * NSS_CMSEnvelopedData_GetContentInfo - return pointer to this envelopedData's contentinfo
  657.  */
  658. extern NSSCMSContentInfo *
  659. NSS_CMSEnvelopedData_GetContentInfo(NSSCMSEnvelopedData *envd);
  660. /*
  661.  * NSS_CMSEnvelopedData_AddRecipient - add a recipientinfo to the enveloped data msg
  662.  *
  663.  * rip must be created on the same pool as edp - this is not enforced, though.
  664.  */
  665. extern SECStatus
  666. NSS_CMSEnvelopedData_AddRecipient(NSSCMSEnvelopedData *edp, NSSCMSRecipientInfo *rip);
  667. /*
  668.  * NSS_CMSEnvelopedData_Encode_BeforeStart - prepare this envelopedData for encoding
  669.  *
  670.  * at this point, we need
  671.  * - recipientinfos set up with recipient's certificates
  672.  * - a content encryption algorithm (if none, 3DES will be used)
  673.  *
  674.  * this function will generate a random content encryption key (aka bulk key),
  675.  * initialize the recipientinfos with certificate identification and wrap the bulk key
  676.  * using the proper algorithm for every certificiate.
  677.  * it will finally set the bulk algorithm and key so that the encode step can find it.
  678.  */
  679. extern SECStatus
  680. NSS_CMSEnvelopedData_Encode_BeforeStart(NSSCMSEnvelopedData *envd);
  681. /*
  682.  * NSS_CMSEnvelopedData_Encode_BeforeData - set up encryption
  683.  */
  684. extern SECStatus
  685. NSS_CMSEnvelopedData_Encode_BeforeData(NSSCMSEnvelopedData *envd);
  686. /*
  687.  * NSS_CMSEnvelopedData_Encode_AfterData - finalize this envelopedData for encoding
  688.  */
  689. extern SECStatus
  690. NSS_CMSEnvelopedData_Encode_AfterData(NSSCMSEnvelopedData *envd);
  691. /*
  692.  * NSS_CMSEnvelopedData_Decode_BeforeData - find our recipientinfo, 
  693.  * derive bulk key & set up our contentinfo
  694.  */
  695. extern SECStatus
  696. NSS_CMSEnvelopedData_Decode_BeforeData(NSSCMSEnvelopedData *envd);
  697. /*
  698.  * NSS_CMSEnvelopedData_Decode_AfterData - finish decrypting this envelopedData's content
  699.  */
  700. extern SECStatus
  701. NSS_CMSEnvelopedData_Decode_AfterData(NSSCMSEnvelopedData *envd);
  702. /*
  703.  * NSS_CMSEnvelopedData_Decode_AfterEnd - finish decoding this envelopedData
  704.  */
  705. extern SECStatus
  706. NSS_CMSEnvelopedData_Decode_AfterEnd(NSSCMSEnvelopedData *envd);
  707. /************************************************************************
  708.  * cmsrecinfo.c - CMS recipientInfo methods
  709.  ************************************************************************/
  710. /*
  711.  * NSS_CMSRecipientInfo_Create - create a recipientinfo
  712.  *
  713.  * we currently do not create KeyAgreement recipientinfos with multiple recipientEncryptedKeys
  714.  * the certificate is supposed to have been verified by the caller
  715.  */
  716. extern NSSCMSRecipientInfo *
  717. NSS_CMSRecipientInfo_Create(NSSCMSMessage *cmsg, CERTCertificate *cert);
  718. extern void
  719. NSS_CMSRecipientInfo_Destroy(NSSCMSRecipientInfo *ri);
  720. extern int
  721. NSS_CMSRecipientInfo_GetVersion(NSSCMSRecipientInfo *ri);
  722. extern SECItem *
  723. NSS_CMSRecipientInfo_GetEncryptedKey(NSSCMSRecipientInfo *ri, int subIndex);
  724. extern SECOidTag
  725. NSS_CMSRecipientInfo_GetKeyEncryptionAlgorithmTag(NSSCMSRecipientInfo *ri);
  726. extern SECStatus
  727. NSS_CMSRecipientInfo_WrapBulkKey(NSSCMSRecipientInfo *ri, PK11SymKey *bulkkey, SECOidTag bulkalgtag);
  728. extern PK11SymKey *
  729. NSS_CMSRecipientInfo_UnwrapBulkKey(NSSCMSRecipientInfo *ri, int subIndex,
  730. CERTCertificate *cert, SECKEYPrivateKey *privkey, SECOidTag bulkalgtag);
  731. /************************************************************************
  732.  * cmsencdata.c - CMS encryptedData methods
  733.  ************************************************************************/
  734. /*
  735.  * NSS_CMSEncryptedData_Create - create an empty encryptedData object.
  736.  *
  737.  * "algorithm" specifies the bulk encryption algorithm to use.
  738.  * "keysize" is the key size.
  739.  * 
  740.  * An error results in a return value of NULL and an error set.
  741.  * (Retrieve specific errors via PORT_GetError()/XP_GetError().)
  742.  */
  743. extern NSSCMSEncryptedData *
  744. NSS_CMSEncryptedData_Create(NSSCMSMessage *cmsg, SECOidTag algorithm, int keysize);
  745. /*
  746.  * NSS_CMSEncryptedData_Destroy - destroy an encryptedData object
  747.  */
  748. extern void
  749. NSS_CMSEncryptedData_Destroy(NSSCMSEncryptedData *encd);
  750. /*
  751.  * NSS_CMSEncryptedData_GetContentInfo - return pointer to encryptedData object's contentInfo
  752.  */
  753. extern NSSCMSContentInfo *
  754. NSS_CMSEncryptedData_GetContentInfo(NSSCMSEncryptedData *encd);
  755. /*
  756.  * NSS_CMSEncryptedData_Encode_BeforeStart - do all the necessary things to a EncryptedData
  757.  *     before encoding begins.
  758.  *
  759.  * In particular:
  760.  *  - set the correct version value.
  761.  *  - get the encryption key
  762.  */
  763. extern SECStatus
  764. NSS_CMSEncryptedData_Encode_BeforeStart(NSSCMSEncryptedData *encd);
  765. /*
  766.  * NSS_CMSEncryptedData_Encode_BeforeData - set up encryption
  767.  */
  768. extern SECStatus
  769. NSS_CMSEncryptedData_Encode_BeforeData(NSSCMSEncryptedData *encd);
  770. /*
  771.  * NSS_CMSEncryptedData_Encode_AfterData - finalize this encryptedData for encoding
  772.  */
  773. extern SECStatus
  774. NSS_CMSEncryptedData_Encode_AfterData(NSSCMSEncryptedData *encd);
  775. /*
  776.  * NSS_CMSEncryptedData_Decode_BeforeData - find bulk key & set up decryption
  777.  */
  778. extern SECStatus
  779. NSS_CMSEncryptedData_Decode_BeforeData(NSSCMSEncryptedData *encd);
  780. /*
  781.  * NSS_CMSEncryptedData_Decode_AfterData - finish decrypting this encryptedData's content
  782.  */
  783. extern SECStatus
  784. NSS_CMSEncryptedData_Decode_AfterData(NSSCMSEncryptedData *encd);
  785. /*
  786.  * NSS_CMSEncryptedData_Decode_AfterEnd - finish decoding this encryptedData
  787.  */
  788. extern SECStatus
  789. NSS_CMSEncryptedData_Decode_AfterEnd(NSSCMSEncryptedData *encd);
  790. /************************************************************************
  791.  * cmsdigdata.c - CMS encryptedData methods
  792.  ************************************************************************/
  793. /*
  794.  * NSS_CMSDigestedData_Create - create a digestedData object (presumably for encoding)
  795.  *
  796.  * version will be set by NSS_CMSDigestedData_Encode_BeforeStart
  797.  * digestAlg is passed as parameter
  798.  * contentInfo must be filled by the user
  799.  * digest will be calculated while encoding
  800.  */
  801. extern NSSCMSDigestedData *
  802. NSS_CMSDigestedData_Create(NSSCMSMessage *cmsg, SECAlgorithmID *digestalg);
  803. /*
  804.  * NSS_CMSDigestedData_Destroy - destroy a digestedData object
  805.  */
  806. extern void
  807. NSS_CMSDigestedData_Destroy(NSSCMSDigestedData *digd);
  808. /*
  809.  * NSS_CMSDigestedData_GetContentInfo - return pointer to digestedData object's contentInfo
  810.  */
  811. extern NSSCMSContentInfo *
  812. NSS_CMSDigestedData_GetContentInfo(NSSCMSDigestedData *digd);
  813. /*
  814.  * NSS_CMSDigestedData_Encode_BeforeStart - do all the necessary things to a DigestedData
  815.  *     before encoding begins.
  816.  *
  817.  * In particular:
  818.  *  - set the right version number. The contentInfo's content type must be set up already.
  819.  */
  820. extern SECStatus
  821. NSS_CMSDigestedData_Encode_BeforeStart(NSSCMSDigestedData *digd);
  822. /*
  823.  * NSS_CMSDigestedData_Encode_BeforeData - do all the necessary things to a DigestedData
  824.  *     before the encapsulated data is passed through the encoder.
  825.  *
  826.  * In detail:
  827.  *  - set up the digests if necessary
  828.  */
  829. extern SECStatus
  830. NSS_CMSDigestedData_Encode_BeforeData(NSSCMSDigestedData *digd);
  831. /*
  832.  * NSS_CMSDigestedData_Encode_AfterData - do all the necessary things to a DigestedData
  833.  *     after all the encapsulated data was passed through the encoder.
  834.  *
  835.  * In detail:
  836.  *  - finish the digests
  837.  */
  838. extern SECStatus
  839. NSS_CMSDigestedData_Encode_AfterData(NSSCMSDigestedData *digd);
  840. /*
  841.  * NSS_CMSDigestedData_Decode_BeforeData - do all the necessary things to a DigestedData
  842.  *     before the encapsulated data is passed through the encoder.
  843.  *
  844.  * In detail:
  845.  *  - set up the digests if necessary
  846.  */
  847. extern SECStatus
  848. NSS_CMSDigestedData_Decode_BeforeData(NSSCMSDigestedData *digd);
  849. /*
  850.  * NSS_CMSDigestedData_Decode_AfterData - do all the necessary things to a DigestedData
  851.  *     after all the encapsulated data was passed through the encoder.
  852.  *
  853.  * In detail:
  854.  *  - finish the digests
  855.  */
  856. extern SECStatus
  857. NSS_CMSDigestedData_Decode_AfterData(NSSCMSDigestedData *digd);
  858. /*
  859.  * NSS_CMSDigestedData_Decode_AfterEnd - finalize a digestedData.
  860.  *
  861.  * In detail:
  862.  *  - check the digests for equality
  863.  */
  864. extern SECStatus
  865. NSS_CMSDigestedData_Decode_AfterEnd(NSSCMSDigestedData *digd);
  866. /************************************************************************
  867.  * cmsdigest.c - digestion routines
  868.  ************************************************************************/
  869. /*
  870.  * NSS_CMSDigestContext_StartMultiple - start digest calculation using all the
  871.  *  digest algorithms in "digestalgs" in parallel.
  872.  */
  873. extern NSSCMSDigestContext *
  874. NSS_CMSDigestContext_StartMultiple(SECAlgorithmID **digestalgs);
  875. /*
  876.  * NSS_CMSDigestContext_StartSingle - same as NSS_CMSDigestContext_StartMultiple, but
  877.  *  only one algorithm.
  878.  */
  879. extern NSSCMSDigestContext *
  880. NSS_CMSDigestContext_StartSingle(SECAlgorithmID *digestalg);
  881. /*
  882.  * NSS_CMSDigestContext_Update - feed more data into the digest machine
  883.  */
  884. extern void
  885. NSS_CMSDigestContext_Update(NSSCMSDigestContext *cmsdigcx, const unsigned char *data, int len);
  886. /*
  887.  * NSS_CMSDigestContext_Cancel - cancel digesting operation
  888.  */
  889. extern void
  890. NSS_CMSDigestContext_Cancel(NSSCMSDigestContext *cmsdigcx);
  891. /*
  892.  * NSS_CMSDigestContext_FinishMultiple - finish the digests and put them
  893.  *  into an array of SECItems (allocated on poolp)
  894.  */
  895. extern SECStatus
  896. NSS_CMSDigestContext_FinishMultiple(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
  897.     SECItem ***digestsp);
  898. /*
  899.  * NSS_CMSDigestContext_FinishSingle - same as NSS_CMSDigestContext_FinishMultiple,
  900.  *  but for one digest.
  901.  */
  902. extern SECStatus
  903. NSS_CMSDigestContext_FinishSingle(NSSCMSDigestContext *cmsdigcx, PLArenaPool *poolp,
  904.     SECItem *digest);
  905. /************************************************************************
  906.  * 
  907.  ************************************************************************/
  908. /* shortcuts for basic use */
  909. /*
  910.  * NSS_CMSDEREncode - DER Encode a CMS message, with input being
  911.  *                    the plaintext message and derOut being the output,
  912.  *                    stored in arena's pool.
  913.  */
  914. extern SECStatus
  915. NSS_CMSDEREncode(NSSCMSMessage *cmsg, SECItem *input, SECItem *derOut, 
  916.                  PLArenaPool *arena);
  917. /************************************************************************/
  918. SEC_END_PROTOS
  919. #endif /* _CMS_H_ */