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

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.  * Support routines for CMS implementation, none of which are exported.
  35.  *
  36.  * Do not export this file!  If something in here is really needed outside
  37.  * of smime code, first try to add a CMS interface which will do it for
  38.  * you.  If that has a problem, then just move out what you need, changing
  39.  * its name as appropriate!
  40.  *
  41.  * $Id: cmslocal.h,v 1.2 2000/06/13 21:56:29 chrisk%netscape.com Exp $
  42.  */
  43. #ifndef _CMSLOCAL_H_
  44. #define _CMSLOCAL_H_
  45. #include "cms.h"
  46. #include "cmsreclist.h"
  47. #include "secasn1t.h"
  48. extern const SEC_ASN1Template NSSCMSContentInfoTemplate[];
  49. /************************************************************************/
  50. SEC_BEGIN_PROTOS
  51. /***********************************************************************
  52.  * cmscipher.c - en/decryption routines
  53.  ***********************************************************************/
  54. /*
  55.  * NSS_CMSCipherContext_StartDecrypt - create a cipher context to do decryption
  56.  * based on the given bulk * encryption key and algorithm identifier (which may include an iv).
  57.  */
  58. extern NSSCMSCipherContext *
  59. NSS_CMSCipherContext_StartDecrypt(PK11SymKey *key, SECAlgorithmID *algid);
  60. /*
  61.  * NSS_CMSCipherContext_StartEncrypt - create a cipher object to do encryption,
  62.  * based on the given bulk encryption key and algorithm tag.  Fill in the algorithm
  63.  * identifier (which may include an iv) appropriately.
  64.  */
  65. extern NSSCMSCipherContext *
  66. NSS_CMSCipherContext_StartEncrypt(PRArenaPool *poolp, PK11SymKey *key, SECAlgorithmID *algid);
  67. extern void
  68. NSS_CMSCipherContext_Destroy(NSSCMSCipherContext *cc);
  69. /*
  70.  * NSS_CMSCipherContext_DecryptLength - find the output length of the next call to decrypt.
  71.  *
  72.  * cc - the cipher context
  73.  * input_len - number of bytes used as input
  74.  * final - true if this is the final chunk of data
  75.  *
  76.  * Result can be used to perform memory allocations.  Note that the amount
  77.  * is exactly accurate only when not doing a block cipher or when final
  78.  * is false, otherwise it is an upper bound on the amount because until
  79.  * we see the data we do not know how many padding bytes there are
  80.  * (always between 1 and bsize).
  81.  */
  82. extern unsigned int
  83. NSS_CMSCipherContext_DecryptLength(NSSCMSCipherContext *cc, unsigned int input_len, PRBool final);
  84. /*
  85.  * NSS_CMSCipherContext_EncryptLength - find the output length of the next call to encrypt.
  86.  *
  87.  * cc - the cipher context
  88.  * input_len - number of bytes used as input
  89.  * final - true if this is the final chunk of data
  90.  *
  91.  * Result can be used to perform memory allocations.
  92.  */
  93. extern unsigned int
  94. NSS_CMSCipherContext_EncryptLength(NSSCMSCipherContext *cc, unsigned int input_len, PRBool final);
  95. /*
  96.  * NSS_CMSCipherContext_Decrypt - do the decryption
  97.  *
  98.  * cc - the cipher context
  99.  * output - buffer for decrypted result bytes
  100.  * output_len_p - number of bytes in output
  101.  * max_output_len - upper bound on bytes to put into output
  102.  * input - pointer to input bytes
  103.  * input_len - number of input bytes
  104.  * final - true if this is the final chunk of data
  105.  *
  106.  * Decrypts a given length of input buffer (starting at "input" and
  107.  * containing "input_len" bytes), placing the decrypted bytes in
  108.  * "output" and storing the output length in "*output_len_p".
  109.  * "cc" is the return value from NSS_CMSCipher_StartDecrypt.
  110.  * When "final" is true, this is the last of the data to be decrypted.
  111.  */ 
  112. extern SECStatus
  113. NSS_CMSCipherContext_Decrypt(NSSCMSCipherContext *cc, unsigned char *output,
  114.   unsigned int *output_len_p, unsigned int max_output_len,
  115.   const unsigned char *input, unsigned int input_len,
  116.   PRBool final);
  117. /*
  118.  * NSS_CMSCipherContext_Encrypt - do the encryption
  119.  *
  120.  * cc - the cipher context
  121.  * output - buffer for decrypted result bytes
  122.  * output_len_p - number of bytes in output
  123.  * max_output_len - upper bound on bytes to put into output
  124.  * input - pointer to input bytes
  125.  * input_len - number of input bytes
  126.  * final - true if this is the final chunk of data
  127.  *
  128.  * Encrypts a given length of input buffer (starting at "input" and
  129.  * containing "input_len" bytes), placing the encrypted bytes in
  130.  * "output" and storing the output length in "*output_len_p".
  131.  * "cc" is the return value from NSS_CMSCipher_StartEncrypt.
  132.  * When "final" is true, this is the last of the data to be encrypted.
  133.  */ 
  134. extern SECStatus
  135. NSS_CMSCipherContext_Encrypt(NSSCMSCipherContext *cc, unsigned char *output,
  136.   unsigned int *output_len_p, unsigned int max_output_len,
  137.   const unsigned char *input, unsigned int input_len,
  138.   PRBool final);
  139. /************************************************************************
  140.  * cmspubkey.c - public key operations
  141.  ************************************************************************/
  142. /*
  143.  * NSS_CMSUtil_EncryptSymKey_RSA - wrap a symmetric key with RSA
  144.  *
  145.  * this function takes a symmetric key and encrypts it using an RSA public key
  146.  * according to PKCS#1 and RFC2633 (S/MIME)
  147.  */
  148. extern SECStatus
  149. NSS_CMSUtil_EncryptSymKey_RSA(PLArenaPool *poolp, CERTCertificate *cert, PK11SymKey *key,
  150. SECItem *encKey);
  151. /*
  152.  * NSS_CMSUtil_DecryptSymKey_RSA - unwrap a RSA-wrapped symmetric key
  153.  *
  154.  * this function takes an RSA-wrapped symmetric key and unwraps it, returning a symmetric
  155.  * key handle. Please note that the actual unwrapped key data may not be allowed to leave
  156.  * a hardware token...
  157.  */
  158. extern PK11SymKey *
  159. NSS_CMSUtil_DecryptSymKey_RSA(SECKEYPrivateKey *privkey, SECItem *encKey, SECOidTag bulkalgtag);
  160. extern SECStatus
  161. NSS_CMSUtil_EncryptSymKey_MISSI(PLArenaPool *poolp, CERTCertificate *cert, PK11SymKey *key,
  162. SECOidTag symalgtag, SECItem *encKey, SECItem **pparams, void *pwfn_arg);
  163. extern PK11SymKey *
  164. NSS_CMSUtil_DecryptSymKey_MISSI(SECKEYPrivateKey *privkey, SECItem *encKey,
  165. SECAlgorithmID *keyEncAlg, SECOidTag bulkalgtag, void *pwfn_arg);
  166. extern SECStatus
  167. NSS_CMSUtil_EncryptSymKey_ESDH(PLArenaPool *poolp, CERTCertificate *cert, PK11SymKey *key,
  168. SECItem *encKey, SECItem **ukm, SECAlgorithmID *keyEncAlg,
  169. SECItem *originatorPubKey);
  170. extern PK11SymKey *
  171. NSS_CMSUtil_DecryptSymKey_ESDH(SECKEYPrivateKey *privkey, SECItem *encKey,
  172. SECAlgorithmID *keyEncAlg, SECOidTag bulkalgtag, void *pwfn_arg);
  173. /************************************************************************
  174.  * cmsreclist.c - recipient list stuff
  175.  ************************************************************************/
  176. extern NSSCMSRecipient **nss_cms_recipient_list_create(NSSCMSRecipientInfo **recipientinfos);
  177. extern void nss_cms_recipient_list_destroy(NSSCMSRecipient **recipient_list);
  178. extern NSSCMSRecipientEncryptedKey *NSS_CMSRecipientEncryptedKey_Create(PLArenaPool *poolp);
  179. /************************************************************************
  180.  * cmsarray.c - misc array functions
  181.  ************************************************************************/
  182. /*
  183.  * NSS_CMSArray_Alloc - allocate an array in an arena
  184.  */
  185. extern void **
  186. NSS_CMSArray_Alloc(PRArenaPool *poolp, int n);
  187. /*
  188.  * NSS_CMSArray_Add - add an element to the end of an array
  189.  */
  190. extern SECStatus
  191. NSS_CMSArray_Add(PRArenaPool *poolp, void ***array, void *obj);
  192. /*
  193.  * NSS_CMSArray_IsEmpty - check if array is empty
  194.  */
  195. extern PRBool
  196. NSS_CMSArray_IsEmpty(void **array);
  197. /*
  198.  * NSS_CMSArray_Count - count number of elements in array
  199.  */
  200. extern int
  201. NSS_CMSArray_Count(void **array);
  202. /*
  203.  * NSS_CMSArray_Sort - sort an array ascending, in place
  204.  *
  205.  * If "secondary" is not NULL, the same reordering gets applied to it.
  206.  * If "tertiary" is not NULL, the same reordering gets applied to it.
  207.  * "compare" is a function that returns 
  208.  *  < 0 when the first element is less than the second
  209.  *  = 0 when the first element is equal to the second
  210.  *  > 0 when the first element is greater than the second
  211.  */
  212. extern void
  213. NSS_CMSArray_Sort(void **primary, int (*compare)(void *,void *), void **secondary, void **tertiary);
  214. /************************************************************************
  215.  * cmsattr.c - misc attribute functions
  216.  ************************************************************************/
  217. /*
  218.  * NSS_CMSAttribute_Create - create an attribute
  219.  *
  220.  * if value is NULL, the attribute won't have a value. It can be added later
  221.  * with NSS_CMSAttribute_AddValue.
  222.  */
  223. extern NSSCMSAttribute *
  224. NSS_CMSAttribute_Create(PRArenaPool *poolp, SECOidTag oidtag, SECItem *value, PRBool encoded);
  225. /*
  226.  * NSS_CMSAttribute_AddValue - add another value to an attribute
  227.  */
  228. extern SECStatus
  229. NSS_CMSAttribute_AddValue(PLArenaPool *poolp, NSSCMSAttribute *attr, SECItem *value);
  230. /*
  231.  * NSS_CMSAttribute_GetType - return the OID tag
  232.  */
  233. extern SECOidTag
  234. NSS_CMSAttribute_GetType(NSSCMSAttribute *attr);
  235. /*
  236.  * NSS_CMSAttribute_GetValue - return the first attribute value
  237.  *
  238.  * We do some sanity checking first:
  239.  * - Multiple values are *not* expected.
  240.  * - Empty values are *not* expected.
  241.  */
  242. extern SECItem *
  243. NSS_CMSAttribute_GetValue(NSSCMSAttribute *attr);
  244. /*
  245.  * NSS_CMSAttribute_CompareValue - compare the attribute's first value against data
  246.  */
  247. extern PRBool
  248. NSS_CMSAttribute_CompareValue(NSSCMSAttribute *attr, SECItem *av);
  249. /*
  250.  * NSS_CMSAttributeArray_Encode - encode an Attribute array as SET OF Attributes
  251.  *
  252.  * If you are wondering why this routine does not reorder the attributes
  253.  * first, and might be tempted to make it do so, see the comment by the
  254.  * call to ReorderAttributes in cmsencode.c.  (Or, see who else calls this
  255.  * and think long and hard about the implications of making it always
  256.  * do the reordering.)
  257.  */
  258. extern SECItem *
  259. NSS_CMSAttributeArray_Encode(PRArenaPool *poolp, NSSCMSAttribute ***attrs, SECItem *dest);
  260. /*
  261.  * NSS_CMSAttributeArray_Reorder - sort attribute array by attribute's DER encoding
  262.  *
  263.  * make sure that the order of the attributes guarantees valid DER (which must be
  264.  * in lexigraphically ascending order for a SET OF); if reordering is necessary it
  265.  * will be done in place (in attrs).
  266.  */
  267. extern SECStatus
  268. NSS_CMSAttributeArray_Reorder(NSSCMSAttribute **attrs);
  269. /*
  270.  * NSS_CMSAttributeArray_FindAttrByOidTag - look through a set of attributes and
  271.  * find one that matches the specified object ID.
  272.  *
  273.  * If "only" is true, then make sure that there is not more than one attribute
  274.  * of the same type.  Otherwise, just return the first one found. (XXX Does
  275.  * anybody really want that first-found behavior?  It was like that when I found it...)
  276.  */
  277. extern NSSCMSAttribute *
  278. NSS_CMSAttributeArray_FindAttrByOidTag(NSSCMSAttribute **attrs, SECOidTag oidtag, PRBool only);
  279. /*
  280.  * NSS_CMSAttributeArray_AddAttr - add an attribute to an
  281.  * array of attributes. 
  282.  */
  283. extern SECStatus
  284. NSS_CMSAttributeArray_AddAttr(PLArenaPool *poolp, NSSCMSAttribute ***attrs, NSSCMSAttribute *attr);
  285. /*
  286.  * NSS_CMSAttributeArray_SetAttr - set an attribute's value in a set of attributes
  287.  */
  288. extern SECStatus
  289. NSS_CMSAttributeArray_SetAttr(PLArenaPool *poolp, NSSCMSAttribute ***attrs, SECOidTag type, SECItem *value, PRBool encoded);
  290. /************************************************************************/
  291. SEC_END_PROTOS
  292. #endif /* _CMSLOCAL_H_ */