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

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. #ifndef _SECPKCS5_H_
  34. #define _SECPKCS5_H_
  35. #include "plarena.h"
  36. #include "secitem.h"
  37. #include "seccomon.h"
  38. #include "secoidt.h"
  39. #include "hasht.h"
  40. typedef SECItem * (* SEC_PKCS5GetPBEPassword)(void *arg);
  41. /* used for V2 PKCS 12 Draft Spec */ 
  42. typedef enum {
  43.     pbeBitGenIDNull,
  44.     pbeBitGenCipherKey = 0x01,
  45.     pbeBitGenCipherIV = 0x02,
  46.     pbeBitGenIntegrityKey = 0x03
  47. } PBEBitGenID;
  48. typedef struct _pbeBitGenParameters {
  49.     unsigned int u, v;
  50.     SECOidTag hashAlgorithm;
  51. } pbeBitGenParameters;
  52. typedef struct _PBEBitGenContext {
  53.     PRArenaPool *arena;
  54.     /* hash algorithm information */
  55.     pbeBitGenParameters pbeParams;
  56.     SECHashObject *hashObject;
  57.     void *hash;
  58.     /* buffers used in generation of bits */
  59.     SECItem D, S, P, I, A, B;
  60.     unsigned int c, n;
  61.     unsigned int iterations;
  62. } PBEBitGenContext;
  63. extern const SEC_ASN1Template SEC_PKCS5PBEParameterTemplate[];
  64. typedef struct SEC_PKCS5PBEParameterStr SEC_PKCS5PBEParameter;
  65. struct SEC_PKCS5PBEParameterStr {
  66.     PRArenaPool *poolp;
  67.     SECItem salt; /* octet string */
  68.     SECItem iteration; /* integer */
  69.     /* used locally */
  70.     SECOidTag algorithm;
  71.     int iter;
  72. };
  73. SEC_BEGIN_PROTOS
  74. /* Create a PKCS5 Algorithm ID
  75.  * The algorithm ID is set up using the PKCS #5 parameter structure
  76.  *  algorithm is the PBE algorithm ID for the desired algorithm
  77.  *  salt can be specified or can be NULL, if salt is NULL then the
  78.  *    salt is generated from random bytes
  79.  *  iteration is the number of iterations for which to perform the
  80.  *    hash prior to key and iv generation.
  81.  * If an error occurs or the algorithm specified is not supported 
  82.  * or is not a password based encryption algorithm, NULL is returned.
  83.  * Otherwise, a pointer to the algorithm id is returned.
  84.  */
  85. extern SECAlgorithmID *
  86. SEC_PKCS5CreateAlgorithmID(SECOidTag algorithm,
  87.    SECItem *salt, 
  88.    int iteration);
  89. /* Get the initialization vector.  The password is passed in, hashing
  90.  * is performed, and the initialization vector is returned.
  91.  *  algid is a pointer to a PBE algorithm ID
  92.  *  pwitem is the password
  93.  * If an error occurs or the algorithm id is not a PBE algrithm,
  94.  * NULL is returned.  Otherwise, the iv is returned in a secitem.
  95.  */
  96. extern SECItem *
  97. SEC_PKCS5GetIV(SECAlgorithmID *algid, SECItem *pwitem, PRBool faulty3DES);
  98. /* Get the key.  The password is passed in, hashing is performed,
  99.  * and the key is returned.
  100.  *  algid is a pointer to a PBE algorithm ID
  101.  *  pwitem is the password
  102.  * If an error occurs or the algorithm id is not a PBE algrithm,
  103.  * NULL is returned.  Otherwise, the key is returned in a secitem.
  104.  */
  105. extern SECItem *
  106. SEC_PKCS5GetKey(SECAlgorithmID *algid, SECItem *pwitem, PRBool faulty3DES);
  107. /* Get PBE salt.  The salt for the password based algorithm is returned.
  108.  *  algid is the PBE algorithm identifier
  109.  * If an error occurs NULL is returned, otherwise the salt is returned
  110.  * in a SECItem.
  111.  */
  112. extern SECItem *
  113. SEC_PKCS5GetSalt(SECAlgorithmID *algid);
  114. /* Encrypt/Decrypt data using password based encryption.  
  115.  *  algid is the PBE algorithm identifier,
  116.  *  pwitem is the password,
  117.  *  src is the source for encryption/decryption,
  118.  *  encrypt is PR_TRUE for encryption, PR_FALSE for decryption.
  119.  * The key and iv are generated based upon PKCS #5 then the src
  120.  * is either encrypted or decrypted.  If an error occurs, NULL
  121.  * is returned, otherwise the ciphered contents is returned.
  122.  */
  123. extern SECItem *
  124. SEC_PKCS5CipherData(SECAlgorithmID *algid, SECItem *pwitem,
  125.     SECItem *src, PRBool encrypt, PRBool *update);
  126. /* Checks to see if algid algorithm is a PBE algorithm.  If
  127.  * so, PR_TRUE is returned, otherwise PR_FALSE is returned.
  128.  */
  129. extern PRBool 
  130. SEC_PKCS5IsAlgorithmPBEAlg(SECAlgorithmID *algid);
  131. /* Destroys PBE parameter */
  132. extern void
  133. SEC_PKCS5DestroyPBEParameter(SEC_PKCS5PBEParameter *param);
  134. /* Convert Algorithm ID to PBE parameter */
  135. extern SEC_PKCS5PBEParameter *
  136. SEC_PKCS5GetPBEParameter(SECAlgorithmID *algid);
  137. /* Determine how large the key generated is */
  138. extern int
  139. SEC_PKCS5GetKeyLength(SECAlgorithmID *algid);
  140. /* map crypto algorithm to pbe algorithm, assume sha 1 hashing for DES
  141.  */
  142. extern SECOidTag
  143. SEC_PKCS5GetPBEAlgorithm(SECOidTag algTag, int keyLen);
  144. /* return the underlying crypto algorithm */
  145. extern SECOidTag
  146. SEC_PKCS5GetCryptoAlgorithm(SECAlgorithmID *algid);
  147. extern PBEBitGenContext *
  148. PBE_CreateContext(SECOidTag hashAlgorithm, PBEBitGenID bitGenPurpose,
  149.   SECItem *pwitem, SECItem *salt, unsigned int bitsNeeded,
  150.   unsigned int interations);
  151. extern SECItem *
  152. PBE_GenerateBits(PBEBitGenContext *pbeCtxt);
  153. extern void PBE_DestroyContext(PBEBitGenContext *pbeCtxt);
  154. extern SECStatus PBE_PK11ParamToAlgid(SECOidTag algTag, SECItem *param,
  155.   PRArenaPool *arena, SECAlgorithmID *algId);
  156. SEC_END_PROTOS
  157. #endif