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

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. #include "p12plcy.h"
  34. #include "secoid.h"
  35. #include "secport.h"
  36. #include "secpkcs5.h" /* LOTS of PKCS5 calls below.  XXX EVIL. */
  37. #define PKCS12_NULL  0x0000
  38. typedef struct pkcs12SuiteMapStr {
  39.     SECOidTag algTag;
  40.     unsigned int keyLengthBits; /* in bits */
  41.     unsigned long suite;
  42.     PRBool  allowed;
  43.     PRBool preferred;
  44. } pkcs12SuiteMap;
  45. static pkcs12SuiteMap pkcs12SuiteMaps[] = {
  46.     { SEC_OID_RC4, 40, PKCS12_RC4_40, PR_FALSE, PR_FALSE},
  47.     { SEC_OID_RC4,        128, PKCS12_RC4_128, PR_FALSE, PR_FALSE},
  48.     { SEC_OID_RC2_CBC, 40, PKCS12_RC2_CBC_40, PR_FALSE, PR_TRUE},
  49.     { SEC_OID_RC2_CBC,        128, PKCS12_RC2_CBC_128, PR_FALSE, PR_FALSE},
  50.     { SEC_OID_DES_CBC, 64, PKCS12_DES_56, PR_FALSE, PR_FALSE},
  51.     { SEC_OID_DES_EDE3_CBC,    192, PKCS12_DES_EDE3_168, PR_FALSE, PR_FALSE},
  52.     { SEC_OID_UNKNOWN,  0, PKCS12_NULL, PR_FALSE, PR_FALSE},
  53.     { SEC_OID_UNKNOWN,  0, 0L, PR_FALSE, PR_FALSE}
  54. };
  55. /* determine if algid is an algorithm which is allowed */
  56. PRBool 
  57. SEC_PKCS12DecryptionAllowed(SECAlgorithmID *algid)
  58. {
  59.     unsigned int keyLengthBits;
  60.     SECOidTag algId;
  61.     int i;
  62.    
  63.     algId = SEC_PKCS5GetCryptoAlgorithm(algid);
  64.     if(algId == SEC_OID_UNKNOWN) {
  65. return PR_FALSE;
  66.     }
  67.     
  68.     keyLengthBits = (unsigned int)(SEC_PKCS5GetKeyLength(algid) * 8);
  69.     i = 0;
  70.     while(pkcs12SuiteMaps[i].algTag != SEC_OID_UNKNOWN) {
  71. if((pkcs12SuiteMaps[i].algTag == algId) && 
  72.    (pkcs12SuiteMaps[i].keyLengthBits == keyLengthBits)) {
  73.     return pkcs12SuiteMaps[i].allowed;
  74. }
  75. i++;
  76.     }
  77.     return PR_FALSE;
  78. }
  79. /* is any encryption allowed? */
  80. PRBool
  81. SEC_PKCS12IsEncryptionAllowed(void)
  82. {
  83.     int i;
  84.     i = 0;
  85.     while(pkcs12SuiteMaps[i].algTag != SEC_OID_UNKNOWN) {
  86. if(pkcs12SuiteMaps[i].allowed == PR_TRUE) {
  87.     return PR_TRUE;
  88. i++;
  89.     }
  90.     return PR_FALSE;
  91. }
  92. /* get the preferred algorithm.
  93.  */
  94. SECOidTag
  95. SEC_PKCS12GetPreferredEncryptionAlgorithm(void)
  96. {
  97.     int i;
  98.     i = 0;
  99.     while(pkcs12SuiteMaps[i].algTag != SEC_OID_UNKNOWN) {
  100. if((pkcs12SuiteMaps[i].preferred == PR_TRUE) && 
  101.    (pkcs12SuiteMaps[i].allowed == PR_TRUE)) {
  102.     return SEC_PKCS5GetPBEAlgorithm(pkcs12SuiteMaps[i].algTag,
  103.          pkcs12SuiteMaps[i].keyLengthBits);
  104. }
  105. i++;
  106.     }
  107.     return SEC_OID_UNKNOWN;
  108. }
  109. /* return the strongest algorithm allowed */
  110. SECOidTag
  111. SEC_PKCS12GetStrongestAllowedAlgorithm(void)
  112. {
  113.     int i, keyLengthBits = 0;
  114.     SECOidTag algorithm = SEC_OID_UNKNOWN;
  115.     i = 0;
  116.     while(pkcs12SuiteMaps[i].algTag != SEC_OID_UNKNOWN) {
  117. if((pkcs12SuiteMaps[i].allowed == PR_TRUE) && 
  118.    (pkcs12SuiteMaps[i].keyLengthBits > (unsigned int)keyLengthBits) &&
  119.    (pkcs12SuiteMaps[i].algTag != SEC_OID_RC4)) {
  120.     algorithm = pkcs12SuiteMaps[i].algTag;
  121.     keyLengthBits = pkcs12SuiteMaps[i].keyLengthBits;
  122. }
  123. i++;
  124.     }
  125.     if(algorithm == SEC_OID_UNKNOWN) {
  126. return SEC_OID_UNKNOWN;
  127.     }
  128.     return SEC_PKCS5GetPBEAlgorithm(algorithm, keyLengthBits);
  129. }
  130. SECStatus
  131. SEC_PKCS12EnableCipher(long which, int on) 
  132. {
  133.     int i;
  134.     i = 0;
  135.     while(pkcs12SuiteMaps[i].suite != 0L) {
  136. if(pkcs12SuiteMaps[i].suite == (unsigned long)which) {
  137.     if(on) {
  138. pkcs12SuiteMaps[i].allowed = PR_TRUE;
  139.     } else {
  140. pkcs12SuiteMaps[i].allowed = PR_FALSE;
  141.     }
  142.     return SECSuccess;
  143. }
  144. i++;
  145.     }
  146.     return SECFailure;
  147. }
  148. SECStatus
  149. SEC_PKCS12SetPreferredCipher(long which, int on)
  150. {
  151.     int i;
  152.     PRBool turnedOff = PR_FALSE;
  153.     PRBool turnedOn = PR_FALSE;
  154.     i = 0;
  155.     while(pkcs12SuiteMaps[i].suite != 0L) {
  156. if(pkcs12SuiteMaps[i].preferred == PR_TRUE) {
  157.     pkcs12SuiteMaps[i].preferred = PR_FALSE;
  158.     turnedOff = PR_TRUE;
  159. }
  160. if(pkcs12SuiteMaps[i].suite == (unsigned long)which) {
  161.     pkcs12SuiteMaps[i].preferred = PR_TRUE;
  162.     turnedOn = PR_TRUE;
  163. }
  164. i++;
  165.     }
  166.     if((turnedOn) && (turnedOff)) {
  167. return SECSuccess;
  168.     }
  169.     return SECFailure;
  170. }