security/nss/lib/pk11wrap/pk11mech.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     4 /*
     5  * This file maps various PKCS #11 Mechanisms to related mechanisms, key
     6  * types, and ASN.1 encodings.
     7  */
     8 #include "seccomon.h"
     9 #include "secmod.h"
    10 #include "secmodi.h"
    11 #include "pkcs11t.h"
    12 #include "pk11func.h"
    13 #include "secitem.h"
    14 #include "secder.h"
    15 #include "secasn1.h" 
    16 #include "secoid.h"
    17 #include "secerr.h"
    19 /*************************************************************
    20  * local static and global data
    21  *************************************************************/
    23 /*
    24  * Tables used for Extended mechanism mapping (currently not used)
    25  */
    26 typedef struct {
    27 	CK_MECHANISM_TYPE keyGen;
    28 	CK_KEY_TYPE keyType;
    29 	CK_MECHANISM_TYPE type;
    30 	CK_MECHANISM_TYPE padType;
    31 	int blockSize;
    32 	int iv;
    33 } pk11MechanismData;
    35 static pk11MechanismData pk11_default = 
    36   { CKM_GENERIC_SECRET_KEY_GEN, CKK_GENERIC_SECRET, 
    37 	CKM_FAKE_RANDOM, CKM_FAKE_RANDOM, 8, 8 };
    38 static pk11MechanismData *pk11_MechanismTable = NULL;
    39 static int pk11_MechTableSize = 0;
    40 static int pk11_MechEntrySize = 0;
    42 /*
    43  * list of mechanisms we're willing to wrap secret keys with.
    44  * This list is ordered by preference.
    45  */
    46 CK_MECHANISM_TYPE wrapMechanismList[] = {
    47     CKM_DES3_ECB,
    48     CKM_CAST5_ECB,
    49     CKM_AES_ECB,
    50     CKM_CAMELLIA_ECB,
    51     CKM_SEED_ECB,
    52     CKM_CAST5_ECB,
    53     CKM_DES_ECB,
    54     CKM_KEY_WRAP_LYNKS,
    55     CKM_IDEA_ECB,
    56     CKM_CAST3_ECB,
    57     CKM_CAST_ECB,
    58     CKM_RC5_ECB,
    59     CKM_RC2_ECB,
    60     CKM_CDMF_ECB,
    61     CKM_SKIPJACK_WRAP,
    62 };
    64 int wrapMechanismCount = sizeof(wrapMechanismList)/sizeof(wrapMechanismList[0]);
    66 /*********************************************************************
    67  *       Mechanism Mapping functions
    68  *********************************************************************/
    70 /*
    71  * lookup an entry in the mechanism table. If none found, return the
    72  * default structure.
    73  */
    74 static pk11MechanismData *
    75 pk11_lookup(CK_MECHANISM_TYPE type)
    76 {
    77     int i;
    78     for (i=0; i < pk11_MechEntrySize; i++) {
    79 	if (pk11_MechanismTable[i].type == type) {
    80 	     return (&pk11_MechanismTable[i]);
    81 	}
    82     }
    83     return &pk11_default;
    84 }
    86 /*
    87  * find the best key wrap mechanism for this slot.
    88  */
    89 CK_MECHANISM_TYPE
    90 PK11_GetBestWrapMechanism(PK11SlotInfo *slot)
    91 {
    92     int i;
    93     for (i=0; i < wrapMechanismCount; i++) {
    94 	if (PK11_DoesMechanism(slot,wrapMechanismList[i])) {
    95 	    return wrapMechanismList[i];
    96 	}
    97     }
    98     return CKM_INVALID_MECHANISM;
    99 }
   101 /*
   102  * NOTE: This is not thread safe. Called at init time, and when loading
   103  * a new Entry. It is reasonably safe as long as it is not re-entered
   104  * (readers will always see a consistant table)
   105  *
   106  * This routine is called to add entries to the mechanism table, once there,
   107  * they can not be removed.
   108  */
   109 void
   110 PK11_AddMechanismEntry(CK_MECHANISM_TYPE type, CK_KEY_TYPE key,
   111 		 	CK_MECHANISM_TYPE keyGen, 
   112 			CK_MECHANISM_TYPE padType,
   113 			int ivLen, int blockSize)
   114 {
   115     int tableSize = pk11_MechTableSize;
   116     int size = pk11_MechEntrySize;
   117     int entry = size++;
   118     pk11MechanismData *old = pk11_MechanismTable;
   119     pk11MechanismData *newt = pk11_MechanismTable;
   122     if (size > tableSize) {
   123 	int oldTableSize = tableSize;
   124 	tableSize += 10;
   125 	newt = PORT_NewArray(pk11MechanismData, tableSize);
   126 	if (newt == NULL) return;
   128 	if (old) PORT_Memcpy(newt, old, oldTableSize*sizeof(*newt));
   129     } else old = NULL;
   131     newt[entry].type = type;
   132     newt[entry].keyType = key;
   133     newt[entry].keyGen = keyGen;
   134     newt[entry].padType = padType;
   135     newt[entry].iv = ivLen;
   136     newt[entry].blockSize = blockSize;
   138     pk11_MechanismTable = newt;
   139     pk11_MechTableSize = tableSize;
   140     pk11_MechEntrySize = size;
   141     if (old) PORT_Free(old);
   142 }
   144 /*
   145  * Get the mechanism needed for the given key type
   146  */
   147 CK_MECHANISM_TYPE
   148 PK11_GetKeyMechanism(CK_KEY_TYPE type)
   149 {
   150     switch (type) {
   151     case CKK_SEED:
   152 	return CKM_SEED_CBC;
   153     case CKK_CAMELLIA:
   154 	return CKM_CAMELLIA_CBC;
   155     case CKK_AES:
   156 	return CKM_AES_CBC;
   157     case CKK_DES:
   158 	return CKM_DES_CBC;
   159     case CKK_DES3:
   160 	return CKM_DES3_KEY_GEN;
   161     case CKK_DES2:
   162 	return CKM_DES2_KEY_GEN;
   163     case CKK_CDMF:
   164 	return CKM_CDMF_CBC;
   165     case CKK_RC2:
   166 	return CKM_RC2_CBC;
   167     case CKK_RC4:
   168 	return CKM_RC4;
   169     case CKK_RC5:
   170 	return CKM_RC5_CBC;
   171     case CKK_SKIPJACK:
   172 	return CKM_SKIPJACK_CBC64;
   173     case CKK_BATON:
   174 	return CKM_BATON_CBC128;
   175     case CKK_JUNIPER:
   176 	return CKM_JUNIPER_CBC128;
   177     case CKK_IDEA:
   178 	return CKM_IDEA_CBC;
   179     case CKK_CAST:
   180 	return CKM_CAST_CBC;
   181     case CKK_CAST3:
   182 	return CKM_CAST3_CBC;
   183     case CKK_CAST5:
   184 	return CKM_CAST5_CBC;
   185     case CKK_RSA:
   186 	return CKM_RSA_PKCS;
   187     case CKK_DSA:
   188 	return CKM_DSA;
   189     case CKK_DH:
   190 	return CKM_DH_PKCS_DERIVE;
   191     case CKK_KEA:
   192 	return CKM_KEA_KEY_DERIVE;
   193     case CKK_EC:  /* CKK_ECDSA is deprecated */
   194 	return CKM_ECDSA;
   195     case CKK_GENERIC_SECRET:
   196     default:
   197 	return CKM_SHA_1_HMAC;
   198     }
   199 }
   201 /*
   202  * Get the key type needed for the given mechanism
   203  */
   204 CK_KEY_TYPE
   205 PK11_GetKeyType(CK_MECHANISM_TYPE type,unsigned long len)
   206 {
   207     switch (type) {
   208     case CKM_SEED_ECB:
   209     case CKM_SEED_CBC:
   210     case CKM_SEED_MAC:
   211     case CKM_SEED_MAC_GENERAL:
   212     case CKM_SEED_CBC_PAD:
   213     case CKM_SEED_KEY_GEN:
   214 	return CKK_SEED;
   215     case CKM_CAMELLIA_ECB:
   216     case CKM_CAMELLIA_CBC:
   217     case CKM_CAMELLIA_MAC:
   218     case CKM_CAMELLIA_MAC_GENERAL:
   219     case CKM_CAMELLIA_CBC_PAD:
   220     case CKM_CAMELLIA_KEY_GEN:
   221 	return CKK_CAMELLIA;
   222     case CKM_AES_ECB:
   223     case CKM_AES_CBC:
   224     case CKM_AES_CCM:
   225     case CKM_AES_CTR:
   226     case CKM_AES_CTS:
   227     case CKM_AES_GCM:
   228     case CKM_AES_MAC:
   229     case CKM_AES_MAC_GENERAL:
   230     case CKM_AES_CBC_PAD:
   231     case CKM_AES_KEY_GEN:
   232     case CKM_NETSCAPE_AES_KEY_WRAP:
   233     case CKM_NETSCAPE_AES_KEY_WRAP_PAD:
   234 	return CKK_AES;
   235     case CKM_DES_ECB:
   236     case CKM_DES_CBC:
   237     case CKM_DES_MAC:
   238     case CKM_DES_MAC_GENERAL:
   239     case CKM_DES_CBC_PAD:
   240     case CKM_DES_KEY_GEN:
   241     case CKM_KEY_WRAP_LYNKS:
   242     case CKM_PBE_MD2_DES_CBC:
   243     case CKM_PBE_MD5_DES_CBC:
   244 	return CKK_DES;
   245     case CKM_DES3_ECB:
   246     case CKM_DES3_CBC:
   247     case CKM_DES3_MAC:
   248     case CKM_DES3_MAC_GENERAL:
   249     case CKM_DES3_CBC_PAD:
   250 	return (len == 16) ? CKK_DES2 : CKK_DES3;
   251     case CKM_DES2_KEY_GEN:
   252     case CKM_PBE_SHA1_DES2_EDE_CBC:
   253 	return CKK_DES2;
   254     case CKM_PBE_SHA1_DES3_EDE_CBC:
   255     case CKM_DES3_KEY_GEN:
   256 	return CKK_DES3;
   257     case CKM_CDMF_ECB:
   258     case CKM_CDMF_CBC:
   259     case CKM_CDMF_MAC:
   260     case CKM_CDMF_MAC_GENERAL:
   261     case CKM_CDMF_CBC_PAD:
   262     case CKM_CDMF_KEY_GEN:
   263 	return CKK_CDMF;
   264     case CKM_RC2_ECB:
   265     case CKM_RC2_CBC:
   266     case CKM_RC2_MAC:
   267     case CKM_RC2_MAC_GENERAL:
   268     case CKM_RC2_CBC_PAD:
   269     case CKM_RC2_KEY_GEN:
   270     case CKM_PBE_SHA1_RC2_128_CBC:
   271     case CKM_PBE_SHA1_RC2_40_CBC:
   272 	return CKK_RC2;
   273     case CKM_RC4:
   274     case CKM_RC4_KEY_GEN:
   275 	return CKK_RC4;
   276     case CKM_RC5_ECB:
   277     case CKM_RC5_CBC:
   278     case CKM_RC5_MAC:
   279     case CKM_RC5_MAC_GENERAL:
   280     case CKM_RC5_CBC_PAD:
   281     case CKM_RC5_KEY_GEN:
   282 	return CKK_RC5;
   283     case CKM_SKIPJACK_CBC64:
   284     case CKM_SKIPJACK_ECB64:
   285     case CKM_SKIPJACK_OFB64:
   286     case CKM_SKIPJACK_CFB64:
   287     case CKM_SKIPJACK_CFB32:
   288     case CKM_SKIPJACK_CFB16:
   289     case CKM_SKIPJACK_CFB8:
   290     case CKM_SKIPJACK_KEY_GEN:
   291     case CKM_SKIPJACK_WRAP:
   292     case CKM_SKIPJACK_PRIVATE_WRAP:
   293 	return CKK_SKIPJACK;
   294     case CKM_BATON_ECB128:
   295     case CKM_BATON_ECB96:
   296     case CKM_BATON_CBC128:
   297     case CKM_BATON_COUNTER:
   298     case CKM_BATON_SHUFFLE:
   299     case CKM_BATON_WRAP:
   300     case CKM_BATON_KEY_GEN:
   301 	return CKK_BATON;
   302     case CKM_JUNIPER_ECB128:
   303     case CKM_JUNIPER_CBC128:
   304     case CKM_JUNIPER_COUNTER:
   305     case CKM_JUNIPER_SHUFFLE:
   306     case CKM_JUNIPER_WRAP:
   307     case CKM_JUNIPER_KEY_GEN:
   308 	return CKK_JUNIPER;
   309     case CKM_IDEA_CBC:
   310     case CKM_IDEA_ECB:
   311     case CKM_IDEA_MAC:
   312     case CKM_IDEA_MAC_GENERAL:
   313     case CKM_IDEA_CBC_PAD:
   314     case CKM_IDEA_KEY_GEN:
   315 	return CKK_IDEA;
   316     case CKM_CAST_ECB:
   317     case CKM_CAST_CBC:
   318     case CKM_CAST_MAC:
   319     case CKM_CAST_MAC_GENERAL:
   320     case CKM_CAST_CBC_PAD:
   321     case CKM_CAST_KEY_GEN:
   322     case CKM_PBE_MD5_CAST_CBC:
   323 	return CKK_CAST;
   324     case CKM_CAST3_ECB:
   325     case CKM_CAST3_CBC:
   326     case CKM_CAST3_MAC:
   327     case CKM_CAST3_MAC_GENERAL:
   328     case CKM_CAST3_CBC_PAD:
   329     case CKM_CAST3_KEY_GEN:
   330     case CKM_PBE_MD5_CAST3_CBC:
   331 	return CKK_CAST3;
   332     case CKM_CAST5_ECB:
   333     case CKM_CAST5_CBC:
   334     case CKM_CAST5_MAC:
   335     case CKM_CAST5_MAC_GENERAL:
   336     case CKM_CAST5_CBC_PAD:
   337     case CKM_CAST5_KEY_GEN:
   338     case CKM_PBE_MD5_CAST5_CBC:
   339 	return CKK_CAST5;
   340     case CKM_RSA_PKCS:
   341     case CKM_RSA_9796:
   342     case CKM_RSA_X_509:
   343     case CKM_MD2_RSA_PKCS:
   344     case CKM_MD5_RSA_PKCS:
   345     case CKM_SHA1_RSA_PKCS:
   346     case CKM_SHA224_RSA_PKCS:
   347     case CKM_SHA256_RSA_PKCS:
   348     case CKM_SHA384_RSA_PKCS:
   349     case CKM_SHA512_RSA_PKCS:
   350     case CKM_KEY_WRAP_SET_OAEP:
   351     case CKM_RSA_PKCS_KEY_PAIR_GEN:
   352     case CKM_RSA_X9_31_KEY_PAIR_GEN:
   353 	return CKK_RSA;
   354     case CKM_DSA:
   355     case CKM_DSA_SHA1:
   356     case CKM_DSA_KEY_PAIR_GEN:
   357 	return CKK_DSA;
   358     case CKM_DH_PKCS_DERIVE:
   359     case CKM_DH_PKCS_KEY_PAIR_GEN:
   360 	return CKK_DH;
   361     case CKM_KEA_KEY_DERIVE:
   362     case CKM_KEA_KEY_PAIR_GEN:
   363 	return CKK_KEA;
   364     case CKM_ECDSA:
   365     case CKM_ECDSA_SHA1:
   366     case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */
   367     case CKM_ECDH1_DERIVE:
   368 	return CKK_EC;  /* CKK_ECDSA is deprecated */
   369     case CKM_SSL3_PRE_MASTER_KEY_GEN:
   370     case CKM_GENERIC_SECRET_KEY_GEN:
   371     case CKM_SSL3_MASTER_KEY_DERIVE:
   372     case CKM_SSL3_MASTER_KEY_DERIVE_DH:
   373     case CKM_SSL3_KEY_AND_MAC_DERIVE:
   374     case CKM_SSL3_SHA1_MAC:
   375     case CKM_SSL3_MD5_MAC:
   376     case CKM_TLS_MASTER_KEY_DERIVE:
   377     case CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256:
   378     case CKM_TLS_MASTER_KEY_DERIVE_DH:
   379     case CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256:
   380     case CKM_TLS_KEY_AND_MAC_DERIVE:
   381     case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256:
   382     case CKM_SHA_1_HMAC:
   383     case CKM_SHA_1_HMAC_GENERAL:
   384     case CKM_SHA224_HMAC:
   385     case CKM_SHA224_HMAC_GENERAL:
   386     case CKM_SHA256_HMAC:
   387     case CKM_SHA256_HMAC_GENERAL:
   388     case CKM_SHA384_HMAC:
   389     case CKM_SHA384_HMAC_GENERAL:
   390     case CKM_SHA512_HMAC:
   391     case CKM_SHA512_HMAC_GENERAL:
   392     case CKM_MD2_HMAC:
   393     case CKM_MD2_HMAC_GENERAL:
   394     case CKM_MD5_HMAC:
   395     case CKM_MD5_HMAC_GENERAL:
   396     case CKM_TLS_PRF_GENERAL:
   397     case CKM_NSS_TLS_PRF_GENERAL_SHA256:
   398 	return CKK_GENERIC_SECRET;
   399     default:
   400 	return pk11_lookup(type)->keyType;
   401     }
   402 }
   404 /*
   405  * Get the Key Gen Mechanism needed for the given 
   406  * crypto mechanism
   407  */
   408 CK_MECHANISM_TYPE
   409 PK11_GetKeyGen(CK_MECHANISM_TYPE type)
   410 {
   411     return PK11_GetKeyGenWithSize(type, 0);
   412 }
   414 CK_MECHANISM_TYPE
   415 PK11_GetKeyGenWithSize(CK_MECHANISM_TYPE type, int size)
   416 {
   417     switch (type) {
   418     case CKM_SEED_ECB:
   419     case CKM_SEED_CBC:
   420     case CKM_SEED_MAC:
   421     case CKM_SEED_MAC_GENERAL:
   422     case CKM_SEED_CBC_PAD:
   423     case CKM_SEED_KEY_GEN:
   424 	return CKM_SEED_KEY_GEN;
   425     case CKM_CAMELLIA_ECB:
   426     case CKM_CAMELLIA_CBC:
   427     case CKM_CAMELLIA_MAC:
   428     case CKM_CAMELLIA_MAC_GENERAL:
   429     case CKM_CAMELLIA_CBC_PAD:
   430     case CKM_CAMELLIA_KEY_GEN:
   431 	return CKM_CAMELLIA_KEY_GEN;
   432     case CKM_AES_ECB:
   433     case CKM_AES_CBC:
   434     case CKM_AES_CCM:
   435     case CKM_AES_CTR:
   436     case CKM_AES_CTS:
   437     case CKM_AES_GCM:
   438     case CKM_AES_MAC:
   439     case CKM_AES_MAC_GENERAL:
   440     case CKM_AES_CBC_PAD:
   441     case CKM_AES_KEY_GEN:
   442 	return CKM_AES_KEY_GEN;
   443     case CKM_DES_ECB:
   444     case CKM_DES_CBC:
   445     case CKM_DES_MAC:
   446     case CKM_DES_MAC_GENERAL:
   447     case CKM_KEY_WRAP_LYNKS:
   448     case CKM_DES_CBC_PAD:
   449     case CKM_DES_KEY_GEN:
   450 	return CKM_DES_KEY_GEN;
   451     case CKM_DES3_ECB:
   452     case CKM_DES3_CBC:
   453     case CKM_DES3_MAC:
   454     case CKM_DES3_MAC_GENERAL:
   455     case CKM_DES3_CBC_PAD:
   456 	return (size == 16) ? CKM_DES2_KEY_GEN : CKM_DES3_KEY_GEN;
   457     case CKM_DES3_KEY_GEN:
   458 	return CKM_DES3_KEY_GEN;
   459     case CKM_DES2_KEY_GEN:
   460 	return CKM_DES2_KEY_GEN;
   461     case CKM_CDMF_ECB:
   462     case CKM_CDMF_CBC:
   463     case CKM_CDMF_MAC:
   464     case CKM_CDMF_MAC_GENERAL:
   465     case CKM_CDMF_CBC_PAD:
   466     case CKM_CDMF_KEY_GEN:
   467 	return CKM_CDMF_KEY_GEN;
   468     case CKM_RC2_ECB:
   469     case CKM_RC2_CBC:
   470     case CKM_RC2_MAC:
   471     case CKM_RC2_MAC_GENERAL:
   472     case CKM_RC2_CBC_PAD:
   473     case CKM_RC2_KEY_GEN:
   474 	return CKM_RC2_KEY_GEN;
   475     case CKM_RC4:
   476     case CKM_RC4_KEY_GEN:
   477 	return CKM_RC4_KEY_GEN;
   478     case CKM_RC5_ECB:
   479     case CKM_RC5_CBC:
   480     case CKM_RC5_MAC:
   481     case CKM_RC5_MAC_GENERAL:
   482     case CKM_RC5_CBC_PAD:
   483     case CKM_RC5_KEY_GEN:
   484 	return CKM_RC5_KEY_GEN;
   485     case CKM_SKIPJACK_CBC64:
   486     case CKM_SKIPJACK_ECB64:
   487     case CKM_SKIPJACK_OFB64:
   488     case CKM_SKIPJACK_CFB64:
   489     case CKM_SKIPJACK_CFB32:
   490     case CKM_SKIPJACK_CFB16:
   491     case CKM_SKIPJACK_CFB8:
   492     case CKM_SKIPJACK_WRAP:
   493     case CKM_SKIPJACK_KEY_GEN:
   494 	return CKM_SKIPJACK_KEY_GEN;
   495     case CKM_BATON_ECB128:
   496     case CKM_BATON_ECB96:
   497     case CKM_BATON_CBC128:
   498     case CKM_BATON_COUNTER:
   499     case CKM_BATON_SHUFFLE:
   500     case CKM_BATON_WRAP:
   501     case CKM_BATON_KEY_GEN:
   502 	return CKM_BATON_KEY_GEN;
   503     case CKM_JUNIPER_ECB128:
   504     case CKM_JUNIPER_CBC128:
   505     case CKM_JUNIPER_COUNTER:
   506     case CKM_JUNIPER_SHUFFLE:
   507     case CKM_JUNIPER_WRAP:
   508     case CKM_JUNIPER_KEY_GEN:
   509 	return CKM_JUNIPER_KEY_GEN;
   510     case CKM_IDEA_CBC:
   511     case CKM_IDEA_ECB:
   512     case CKM_IDEA_MAC:
   513     case CKM_IDEA_MAC_GENERAL:
   514     case CKM_IDEA_CBC_PAD:
   515     case CKM_IDEA_KEY_GEN:
   516 	return CKM_IDEA_KEY_GEN;
   517     case CKM_CAST_ECB:
   518     case CKM_CAST_CBC:
   519     case CKM_CAST_MAC:
   520     case CKM_CAST_MAC_GENERAL:
   521     case CKM_CAST_CBC_PAD:
   522     case CKM_CAST_KEY_GEN:
   523 	return CKM_CAST_KEY_GEN;
   524     case CKM_CAST3_ECB:
   525     case CKM_CAST3_CBC:
   526     case CKM_CAST3_MAC:
   527     case CKM_CAST3_MAC_GENERAL:
   528     case CKM_CAST3_CBC_PAD:
   529     case CKM_CAST3_KEY_GEN:
   530 	return CKM_CAST3_KEY_GEN;
   531     case CKM_CAST5_ECB:
   532     case CKM_CAST5_CBC:
   533     case CKM_CAST5_MAC:
   534     case CKM_CAST5_MAC_GENERAL:
   535     case CKM_CAST5_CBC_PAD:
   536     case CKM_CAST5_KEY_GEN:
   537 	return CKM_CAST5_KEY_GEN;
   538     case CKM_RSA_PKCS:
   539     case CKM_RSA_9796:
   540     case CKM_RSA_X_509:
   541     case CKM_MD2_RSA_PKCS:
   542     case CKM_MD5_RSA_PKCS:
   543     case CKM_SHA1_RSA_PKCS:
   544     case CKM_SHA224_RSA_PKCS:
   545     case CKM_SHA256_RSA_PKCS:
   546     case CKM_SHA384_RSA_PKCS:
   547     case CKM_SHA512_RSA_PKCS:
   548     case CKM_KEY_WRAP_SET_OAEP:
   549     case CKM_RSA_PKCS_KEY_PAIR_GEN:
   550 	return CKM_RSA_PKCS_KEY_PAIR_GEN;
   551     case CKM_RSA_X9_31_KEY_PAIR_GEN:
   552 	return CKM_RSA_X9_31_KEY_PAIR_GEN;
   553     case CKM_DSA:
   554     case CKM_DSA_SHA1:
   555     case CKM_DSA_KEY_PAIR_GEN:
   556 	return CKM_DSA_KEY_PAIR_GEN;
   557     case CKM_DH_PKCS_DERIVE:
   558     case CKM_DH_PKCS_KEY_PAIR_GEN:
   559 	return CKM_DH_PKCS_KEY_PAIR_GEN;
   560     case CKM_KEA_KEY_DERIVE:
   561     case CKM_KEA_KEY_PAIR_GEN:
   562 	return CKM_KEA_KEY_PAIR_GEN;
   563     case CKM_ECDSA:
   564     case CKM_ECDSA_SHA1:
   565     case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */
   566     case CKM_ECDH1_DERIVE:
   567         return CKM_EC_KEY_PAIR_GEN; 
   568     case CKM_SSL3_PRE_MASTER_KEY_GEN:
   569     case CKM_SSL3_MASTER_KEY_DERIVE:
   570     case CKM_SSL3_KEY_AND_MAC_DERIVE:
   571     case CKM_SSL3_SHA1_MAC:
   572     case CKM_SSL3_MD5_MAC:
   573     case CKM_TLS_MASTER_KEY_DERIVE:
   574     case CKM_TLS_KEY_AND_MAC_DERIVE:
   575     case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256:
   576 	return CKM_SSL3_PRE_MASTER_KEY_GEN;
   577     case CKM_SHA_1_HMAC:
   578     case CKM_SHA_1_HMAC_GENERAL:
   579     case CKM_SHA224_HMAC:
   580     case CKM_SHA224_HMAC_GENERAL:
   581     case CKM_SHA256_HMAC:
   582     case CKM_SHA256_HMAC_GENERAL:
   583     case CKM_SHA384_HMAC:
   584     case CKM_SHA384_HMAC_GENERAL:
   585     case CKM_SHA512_HMAC:
   586     case CKM_SHA512_HMAC_GENERAL:
   587     case CKM_MD2_HMAC:
   588     case CKM_MD2_HMAC_GENERAL:
   589     case CKM_MD5_HMAC:
   590     case CKM_MD5_HMAC_GENERAL:
   591     case CKM_TLS_PRF_GENERAL:
   592     case CKM_NSS_TLS_PRF_GENERAL_SHA256:
   593     case CKM_GENERIC_SECRET_KEY_GEN:
   594 	return CKM_GENERIC_SECRET_KEY_GEN;
   595     case CKM_PBE_MD2_DES_CBC:
   596     case CKM_PBE_MD5_DES_CBC:
   597     case CKM_PBA_SHA1_WITH_SHA1_HMAC:
   598     case CKM_NETSCAPE_PBE_SHA1_HMAC_KEY_GEN:
   599     case CKM_NETSCAPE_PBE_MD5_HMAC_KEY_GEN:
   600     case CKM_NETSCAPE_PBE_MD2_HMAC_KEY_GEN:
   601     case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
   602     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
   603     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
   604     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
   605     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
   606     case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
   607     case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
   608     case CKM_PBE_SHA1_RC2_40_CBC:
   609     case CKM_PBE_SHA1_RC2_128_CBC:
   610     case CKM_PBE_SHA1_RC4_40:
   611     case CKM_PBE_SHA1_RC4_128:
   612     case CKM_PBE_SHA1_DES3_EDE_CBC:
   613     case CKM_PBE_SHA1_DES2_EDE_CBC:
   614     case CKM_PKCS5_PBKD2:
   615     	return type;
   616     default:
   617 	return pk11_lookup(type)->keyGen;
   618     }
   619 }
   621 /*
   622  * get the mechanism block size
   623  */
   624 int
   625 PK11_GetBlockSize(CK_MECHANISM_TYPE type,SECItem *params)
   626 {
   627     CK_RC5_PARAMS *rc5_params;
   628     CK_RC5_CBC_PARAMS *rc5_cbc_params;
   629     switch (type) {
   630     case CKM_RC5_ECB:
   631 	if ((params) && (params->data)) {
   632 	    rc5_params = (CK_RC5_PARAMS *) params->data;
   633 	    return (rc5_params->ulWordsize)*2;
   634 	}
   635 	return 8;
   636     case CKM_RC5_CBC:
   637     case CKM_RC5_CBC_PAD:
   638 	if ((params) && (params->data)) {
   639 	    rc5_cbc_params = (CK_RC5_CBC_PARAMS *) params->data;
   640 	    return (rc5_cbc_params->ulWordsize)*2;
   641 	}
   642 	return 8;
   643     case CKM_DES_ECB:
   644     case CKM_DES3_ECB:
   645     case CKM_RC2_ECB:
   646     case CKM_IDEA_ECB:
   647     case CKM_CAST_ECB:
   648     case CKM_CAST3_ECB:
   649     case CKM_CAST5_ECB:
   650     case CKM_RC2_CBC:
   651     case CKM_SKIPJACK_CBC64:
   652     case CKM_SKIPJACK_ECB64:
   653     case CKM_SKIPJACK_OFB64:
   654     case CKM_SKIPJACK_CFB64:
   655     case CKM_DES_CBC:
   656     case CKM_DES3_CBC:
   657     case CKM_IDEA_CBC:
   658     case CKM_CAST_CBC:
   659     case CKM_CAST3_CBC:
   660     case CKM_CAST5_CBC:
   661     case CKM_DES_CBC_PAD:
   662     case CKM_DES3_CBC_PAD:
   663     case CKM_RC2_CBC_PAD:
   664     case CKM_IDEA_CBC_PAD:
   665     case CKM_CAST_CBC_PAD:
   666     case CKM_CAST3_CBC_PAD:
   667     case CKM_CAST5_CBC_PAD:
   668     case CKM_PBE_MD2_DES_CBC:
   669     case CKM_PBE_MD5_DES_CBC:
   670     case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
   671     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
   672     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
   673     case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
   674     case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
   675     case CKM_PBE_SHA1_RC2_40_CBC:
   676     case CKM_PBE_SHA1_RC2_128_CBC:
   677     case CKM_PBE_SHA1_DES3_EDE_CBC:
   678     case CKM_PBE_SHA1_DES2_EDE_CBC:
   679 	return 8;
   680     case CKM_SKIPJACK_CFB32:
   681     case CKM_SKIPJACK_CFB16:
   682     case CKM_SKIPJACK_CFB8:
   683 	return 4;
   684     case CKM_SEED_ECB:
   685     case CKM_SEED_CBC:
   686     case CKM_SEED_CBC_PAD:
   687     case CKM_CAMELLIA_ECB:
   688     case CKM_CAMELLIA_CBC:
   689     case CKM_CAMELLIA_CBC_PAD:
   690     case CKM_AES_ECB:
   691     case CKM_AES_CBC:
   692     case CKM_AES_CBC_PAD:
   693     case CKM_BATON_ECB128:
   694     case CKM_BATON_CBC128:
   695     case CKM_BATON_COUNTER:
   696     case CKM_BATON_SHUFFLE:
   697     case CKM_JUNIPER_ECB128:
   698     case CKM_JUNIPER_CBC128:
   699     case CKM_JUNIPER_COUNTER:
   700     case CKM_JUNIPER_SHUFFLE:
   701 	return 16;
   702     case CKM_BATON_ECB96:
   703 	return 12;
   704     case CKM_RC4:
   705     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
   706     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
   707     case CKM_PBE_SHA1_RC4_40:
   708     case CKM_PBE_SHA1_RC4_128:
   709 	return 0;
   710     case CKM_RSA_PKCS:
   711     case CKM_RSA_9796:
   712     case CKM_RSA_X_509:
   713 	/*actually it's the modulus length of the key!*/
   714 	return -1;	/* failure */
   715     default:
   716 	return pk11_lookup(type)->blockSize;
   717     }
   718 }
   720 /*
   721  * get the iv length
   722  */
   723 int
   724 PK11_GetIVLength(CK_MECHANISM_TYPE type)
   725 {
   726     switch (type) {
   727     case CKM_SEED_ECB:
   728     case CKM_CAMELLIA_ECB:
   729     case CKM_AES_ECB:
   730     case CKM_DES_ECB:
   731     case CKM_DES3_ECB:
   732     case CKM_RC2_ECB:
   733     case CKM_IDEA_ECB:
   734     case CKM_SKIPJACK_WRAP:
   735     case CKM_BATON_WRAP:
   736     case CKM_RC5_ECB:
   737     case CKM_CAST_ECB:
   738     case CKM_CAST3_ECB:
   739     case CKM_CAST5_ECB:
   740 	return 0;
   741     case CKM_RC2_CBC:
   742     case CKM_DES_CBC:
   743     case CKM_DES3_CBC:
   744     case CKM_IDEA_CBC:
   745     case CKM_PBE_MD2_DES_CBC:
   746     case CKM_PBE_MD5_DES_CBC:
   747     case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
   748     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
   749     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
   750     case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
   751     case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
   752     case CKM_PBE_SHA1_RC2_40_CBC:
   753     case CKM_PBE_SHA1_RC2_128_CBC:
   754     case CKM_PBE_SHA1_DES3_EDE_CBC:
   755     case CKM_PBE_SHA1_DES2_EDE_CBC:
   756     case CKM_RC5_CBC:
   757     case CKM_CAST_CBC:
   758     case CKM_CAST3_CBC:
   759     case CKM_CAST5_CBC:
   760     case CKM_RC2_CBC_PAD:
   761     case CKM_DES_CBC_PAD:
   762     case CKM_DES3_CBC_PAD:
   763     case CKM_IDEA_CBC_PAD:
   764     case CKM_RC5_CBC_PAD:
   765     case CKM_CAST_CBC_PAD:
   766     case CKM_CAST3_CBC_PAD:
   767     case CKM_CAST5_CBC_PAD:
   768 	return 8;
   769     case CKM_SEED_CBC:
   770     case CKM_SEED_CBC_PAD:
   771     case CKM_CAMELLIA_CBC:
   772     case CKM_CAMELLIA_CBC_PAD:
   773     case CKM_AES_CBC:
   774     case CKM_AES_CBC_PAD:
   775 	return 16;
   776     case CKM_SKIPJACK_CBC64:
   777     case CKM_SKIPJACK_ECB64:
   778     case CKM_SKIPJACK_OFB64:
   779     case CKM_SKIPJACK_CFB64:
   780     case CKM_SKIPJACK_CFB32:
   781     case CKM_SKIPJACK_CFB16:
   782     case CKM_SKIPJACK_CFB8:
   783     case CKM_BATON_ECB128:
   784     case CKM_BATON_ECB96:
   785     case CKM_BATON_CBC128:
   786     case CKM_BATON_COUNTER:
   787     case CKM_BATON_SHUFFLE:
   788     case CKM_JUNIPER_ECB128:
   789     case CKM_JUNIPER_CBC128:
   790     case CKM_JUNIPER_COUNTER:
   791     case CKM_JUNIPER_SHUFFLE:
   792 	return 24;
   793     case CKM_RC4:
   794     case CKM_RSA_PKCS:
   795     case CKM_RSA_9796:
   796     case CKM_RSA_X_509:
   797     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
   798     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
   799     case CKM_PBE_SHA1_RC4_40:
   800     case CKM_PBE_SHA1_RC4_128:
   801 	return 0;
   802     default:
   803 	return pk11_lookup(type)->iv;
   804     }
   805 }
   808 /* These next two utilities are here to help facilitate future
   809  * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions
   810  * like SSL and S-MIME to automatically add them.
   811  */
   812 SECItem *
   813 pk11_ParamFromIVWithLen(CK_MECHANISM_TYPE type, SECItem *iv, int keyLen)
   814 {
   815     CK_RC2_CBC_PARAMS *rc2_params = NULL;
   816     CK_RC2_PARAMS *rc2_ecb_params = NULL;
   817     CK_RC5_PARAMS *rc5_params = NULL;
   818     CK_RC5_CBC_PARAMS *rc5_cbc_params = NULL;
   819     SECItem *param;
   821     param = (SECItem *)PORT_Alloc(sizeof(SECItem));
   822     if (param == NULL) return NULL;
   823     param->data = NULL;
   824     param->len = 0;
   825     param->type = 0;
   826     switch (type) {
   827     case CKM_SEED_ECB:
   828     case CKM_CAMELLIA_ECB:
   829     case CKM_AES_ECB:
   830     case CKM_DES_ECB:
   831     case CKM_DES3_ECB:
   832     case CKM_RSA_PKCS:
   833     case CKM_RSA_X_509:
   834     case CKM_RSA_9796:
   835     case CKM_IDEA_ECB:
   836     case CKM_CDMF_ECB:
   837     case CKM_CAST_ECB:
   838     case CKM_CAST3_ECB:
   839     case CKM_CAST5_ECB:
   840     case CKM_RC4:
   841 	break;
   842     case CKM_RC2_ECB:
   843 	rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS));
   844 	if (rc2_ecb_params == NULL) break;
   845 	/*  Maybe we should pass the key size in too to get this value? */
   846 	*rc2_ecb_params = keyLen ? keyLen*8 : 128;
   847 	param->data = (unsigned char *) rc2_ecb_params;
   848 	param->len = sizeof(CK_RC2_PARAMS);
   849 	break;
   850     case CKM_RC2_CBC:
   851     case CKM_RC2_CBC_PAD:
   852 	rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS));
   853 	if (rc2_params == NULL) break;
   854 	/* Maybe we should pass the key size in too to get this value? */
   855 	rc2_params->ulEffectiveBits = keyLen ? keyLen*8 : 128;
   856 	if (iv && iv->data)
   857 	    PORT_Memcpy(rc2_params->iv,iv->data,sizeof(rc2_params->iv));
   858 	param->data = (unsigned char *) rc2_params;
   859 	param->len = sizeof(CK_RC2_CBC_PARAMS);
   860 	break;
   861     case CKM_RC5_CBC:
   862     case CKM_RC5_CBC_PAD:
   863 	rc5_cbc_params = (CK_RC5_CBC_PARAMS *)
   864 		PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + ((iv) ? iv->len : 0));
   865 	if (rc5_cbc_params == NULL) break;
   866 	if (iv && iv->data && iv->len) {
   867 	    rc5_cbc_params->pIv = ((CK_BYTE_PTR) rc5_cbc_params) 
   868 						+ sizeof(CK_RC5_CBC_PARAMS);
   869 	    PORT_Memcpy(rc5_cbc_params->pIv,iv->data,iv->len);
   870 	    rc5_cbc_params->ulIvLen = iv->len;
   871 	    rc5_cbc_params->ulWordsize = iv->len/2;
   872 	} else {
   873 	    rc5_cbc_params->ulWordsize = 4;
   874 	    rc5_cbc_params->pIv = NULL;
   875 	    rc5_cbc_params->ulIvLen = 0;
   876 	}
   877 	rc5_cbc_params->ulRounds = 16;
   878 	param->data = (unsigned char *) rc5_cbc_params;
   879 	param->len = sizeof(CK_RC5_CBC_PARAMS);
   880 	break;
   881     case CKM_RC5_ECB:
   882 	rc5_params = (CK_RC5_PARAMS *)PORT_Alloc(sizeof(CK_RC5_PARAMS));
   883 	if (rc5_params == NULL) break;
   884 	if (iv && iv->data && iv->len) {
   885 	    rc5_params->ulWordsize = iv->len/2;
   886 	} else {
   887 	    rc5_params->ulWordsize = 4;
   888 	}
   889 	rc5_params->ulRounds = 16;
   890 	param->data = (unsigned char *) rc5_params;
   891 	param->len = sizeof(CK_RC5_PARAMS);
   892 	break;
   894     case CKM_SEED_CBC:
   895     case CKM_CAMELLIA_CBC:
   896     case CKM_AES_CBC:
   897     case CKM_DES_CBC:
   898     case CKM_DES3_CBC:
   899     case CKM_IDEA_CBC:
   900     case CKM_CDMF_CBC:
   901     case CKM_CAST_CBC:
   902     case CKM_CAST3_CBC:
   903     case CKM_CAST5_CBC:
   904     case CKM_CAMELLIA_CBC_PAD:
   905     case CKM_AES_CBC_PAD:
   906     case CKM_DES_CBC_PAD:
   907     case CKM_DES3_CBC_PAD:
   908     case CKM_IDEA_CBC_PAD:
   909     case CKM_CDMF_CBC_PAD:
   910     case CKM_CAST_CBC_PAD:
   911     case CKM_CAST3_CBC_PAD:
   912     case CKM_CAST5_CBC_PAD:
   913     case CKM_SKIPJACK_CBC64:
   914     case CKM_SKIPJACK_ECB64:
   915     case CKM_SKIPJACK_OFB64:
   916     case CKM_SKIPJACK_CFB64:
   917     case CKM_SKIPJACK_CFB32:
   918     case CKM_SKIPJACK_CFB16:
   919     case CKM_SKIPJACK_CFB8:
   920     case CKM_BATON_ECB128:
   921     case CKM_BATON_ECB96:
   922     case CKM_BATON_CBC128:
   923     case CKM_BATON_COUNTER:
   924     case CKM_BATON_SHUFFLE:
   925     case CKM_JUNIPER_ECB128:
   926     case CKM_JUNIPER_CBC128:
   927     case CKM_JUNIPER_COUNTER:
   928     case CKM_JUNIPER_SHUFFLE:
   929 	if ((iv == NULL) || (iv->data == NULL)) break;
   930 	param->data = (unsigned char*)PORT_Alloc(iv->len);
   931 	if (param->data != NULL) {
   932 	    PORT_Memcpy(param->data,iv->data,iv->len);
   933 	    param->len = iv->len;
   934 	}
   935 	break;
   936      /* unknown mechanism, pass IV in if it's there */
   937      default:
   938 	if (pk11_lookup(type)->iv == 0) {
   939 	    break;
   940 	}
   941 	if ((iv == NULL) || (iv->data == NULL)) {
   942 	    break;
   943 	}
   944 	param->data = (unsigned char*)PORT_Alloc(iv->len);
   945 	if (param->data != NULL) {
   946 	    PORT_Memcpy(param->data,iv->data,iv->len);
   947 	    param->len = iv->len;
   948 	}
   949 	break;
   950      }
   951      return param;
   952 }
   954 /* These next two utilities are here to help facilitate future
   955  * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions
   956  * like SSL and S-MIME to automatically add them.
   957  */
   958 SECItem *
   959 PK11_ParamFromIV(CK_MECHANISM_TYPE type,SECItem *iv)
   960 {
   961     return pk11_ParamFromIVWithLen(type, iv, 0);
   962 }
   964 unsigned char *
   965 PK11_IVFromParam(CK_MECHANISM_TYPE type,SECItem *param,int *len)
   966 {
   967     CK_RC2_CBC_PARAMS *rc2_params;
   968     CK_RC5_CBC_PARAMS *rc5_cbc_params;
   970     *len = 0;
   971     switch (type) {
   972     case CKM_SEED_ECB:
   973     case CKM_CAMELLIA_ECB:
   974     case CKM_AES_ECB:
   975     case CKM_DES_ECB:
   976     case CKM_DES3_ECB:
   977     case CKM_RSA_PKCS:
   978     case CKM_RSA_X_509:
   979     case CKM_RSA_9796:
   980     case CKM_IDEA_ECB:
   981     case CKM_CDMF_ECB:
   982     case CKM_CAST_ECB:
   983     case CKM_CAST3_ECB:
   984     case CKM_CAST5_ECB:
   985     case CKM_RC4:
   986 	return NULL;
   987     case CKM_RC2_ECB:
   988 	return NULL;
   989     case CKM_RC2_CBC:
   990     case CKM_RC2_CBC_PAD:
   991 	rc2_params = (CK_RC2_CBC_PARAMS *)param->data;
   992         *len = sizeof(rc2_params->iv);
   993 	return &rc2_params->iv[0];
   994     case CKM_RC5_CBC:
   995     case CKM_RC5_CBC_PAD:
   996 	rc5_cbc_params = (CK_RC5_CBC_PARAMS *) param->data;
   997 	*len = rc5_cbc_params->ulIvLen;
   998 	return rc5_cbc_params->pIv;
   999     case CKM_SEED_CBC:
  1000     case CKM_CAMELLIA_CBC:
  1001     case CKM_AES_CBC:
  1002     case CKM_DES_CBC:
  1003     case CKM_DES3_CBC:
  1004     case CKM_IDEA_CBC:
  1005     case CKM_CDMF_CBC:
  1006     case CKM_CAST_CBC:
  1007     case CKM_CAST3_CBC:
  1008     case CKM_CAST5_CBC:
  1009     case CKM_CAMELLIA_CBC_PAD:
  1010     case CKM_AES_CBC_PAD:
  1011     case CKM_DES_CBC_PAD:
  1012     case CKM_DES3_CBC_PAD:
  1013     case CKM_IDEA_CBC_PAD:
  1014     case CKM_CDMF_CBC_PAD:
  1015     case CKM_CAST_CBC_PAD:
  1016     case CKM_CAST3_CBC_PAD:
  1017     case CKM_CAST5_CBC_PAD:
  1018     case CKM_SKIPJACK_CBC64:
  1019     case CKM_SKIPJACK_ECB64:
  1020     case CKM_SKIPJACK_OFB64:
  1021     case CKM_SKIPJACK_CFB64:
  1022     case CKM_SKIPJACK_CFB32:
  1023     case CKM_SKIPJACK_CFB16:
  1024     case CKM_SKIPJACK_CFB8:
  1025     case CKM_BATON_ECB128:
  1026     case CKM_BATON_ECB96:
  1027     case CKM_BATON_CBC128:
  1028     case CKM_BATON_COUNTER:
  1029     case CKM_BATON_SHUFFLE:
  1030     case CKM_JUNIPER_ECB128:
  1031     case CKM_JUNIPER_CBC128:
  1032     case CKM_JUNIPER_COUNTER:
  1033     case CKM_JUNIPER_SHUFFLE:
  1034 	break;
  1035      /* unknown mechanism, pass IV in if it's there */
  1036      default:
  1037 	break;
  1039      if (param->data) {
  1040 	*len = param->len;
  1042      return param->data;
  1045 typedef struct sec_rc5cbcParameterStr {
  1046     SECItem version;
  1047     SECItem rounds;
  1048     SECItem blockSizeInBits;
  1049     SECItem iv;
  1050 } sec_rc5cbcParameter;
  1052 static const SEC_ASN1Template sec_rc5ecb_parameter_template[] = {
  1053     { SEC_ASN1_SEQUENCE,
  1054           0, NULL, sizeof(sec_rc5cbcParameter) },
  1055     { SEC_ASN1_INTEGER,
  1056           offsetof(sec_rc5cbcParameter,version) },
  1057     { SEC_ASN1_INTEGER,
  1058           offsetof(sec_rc5cbcParameter,rounds) },
  1059     { SEC_ASN1_INTEGER,
  1060           offsetof(sec_rc5cbcParameter,blockSizeInBits) },
  1061     { 0 }
  1062 };
  1064 static const SEC_ASN1Template sec_rc5cbc_parameter_template[] = {
  1065     { SEC_ASN1_SEQUENCE,
  1066           0, NULL, sizeof(sec_rc5cbcParameter) },
  1067     { SEC_ASN1_INTEGER,
  1068           offsetof(sec_rc5cbcParameter,version) },
  1069     { SEC_ASN1_INTEGER,
  1070           offsetof(sec_rc5cbcParameter,rounds) },
  1071     { SEC_ASN1_INTEGER,
  1072           offsetof(sec_rc5cbcParameter,blockSizeInBits) },
  1073     { SEC_ASN1_OCTET_STRING,
  1074           offsetof(sec_rc5cbcParameter,iv) },
  1075     { 0 }
  1076 };
  1078 typedef struct sec_rc2cbcParameterStr {
  1079     SECItem rc2ParameterVersion;
  1080     SECItem iv;
  1081 } sec_rc2cbcParameter;
  1083 static const SEC_ASN1Template sec_rc2cbc_parameter_template[] = {
  1084     { SEC_ASN1_SEQUENCE,
  1085           0, NULL, sizeof(sec_rc2cbcParameter) },
  1086     { SEC_ASN1_INTEGER,
  1087           offsetof(sec_rc2cbcParameter,rc2ParameterVersion) },
  1088     { SEC_ASN1_OCTET_STRING,
  1089           offsetof(sec_rc2cbcParameter,iv) },
  1090     { 0 }
  1091 };
  1093 static const SEC_ASN1Template sec_rc2ecb_parameter_template[] = {
  1094     { SEC_ASN1_SEQUENCE,
  1095           0, NULL, sizeof(sec_rc2cbcParameter) },
  1096     { SEC_ASN1_INTEGER,
  1097           offsetof(sec_rc2cbcParameter,rc2ParameterVersion) },
  1098     { 0 }
  1099 };
  1101 /* S/MIME picked id values to represent differnt keysizes */
  1102 /* I do have a formula, but it ain't pretty, and it only works because you
  1103  * can always match three points to a parabola:) */
  1104 static unsigned char  rc2_map(SECItem *version)
  1106     long x;
  1108     x = DER_GetInteger(version);
  1110     switch (x) {
  1111         case 58: return 128;
  1112         case 120: return 64;
  1113         case 160: return 40;
  1115     return 128; 
  1118 static unsigned long  rc2_unmap(unsigned long x)
  1120     switch (x) {
  1121         case 128: return 58;
  1122         case 64: return 120;
  1123         case 40: return 160;
  1125     return 58; 
  1130 /* Generate a mechaism param from a type, and iv. */
  1131 SECItem *
  1132 PK11_ParamFromAlgid(SECAlgorithmID *algid)
  1134     CK_RC2_CBC_PARAMS * rc2_cbc_params = NULL;
  1135     CK_RC2_PARAMS *     rc2_ecb_params = NULL;
  1136     CK_RC5_CBC_PARAMS * rc5_cbc_params = NULL;
  1137     CK_RC5_PARAMS *     rc5_ecb_params = NULL;
  1138     PLArenaPool *       arena          = NULL;
  1139     SECItem *           mech           = NULL;
  1140     SECOidTag           algtag;
  1141     SECStatus           rv;
  1142     CK_MECHANISM_TYPE   type;
  1143     /* initialize these to prevent UMRs in the ASN1 decoder. */
  1144     SECItem             iv  =   {siBuffer, NULL, 0};
  1145     sec_rc2cbcParameter rc2 = { {siBuffer, NULL, 0}, {siBuffer, NULL, 0} };
  1146     sec_rc5cbcParameter rc5 = { {siBuffer, NULL, 0}, {siBuffer, NULL, 0},
  1147                                 {siBuffer, NULL, 0}, {siBuffer, NULL, 0} };
  1149     algtag = SECOID_GetAlgorithmTag(algid);
  1150     type = PK11_AlgtagToMechanism(algtag);
  1152     mech = PORT_New(SECItem);
  1153     if (mech == NULL) {
  1154     	return NULL;
  1156     mech->type = siBuffer;
  1157     mech->data = NULL;
  1158     mech->len  = 0;
  1160     arena = PORT_NewArena(1024);
  1161     if (!arena) {
  1162     	goto loser;
  1165     /* handle the complicated cases */
  1166     switch (type) {
  1167     case CKM_RC2_ECB:
  1168         rv = SEC_ASN1DecodeItem(arena, &rc2 ,sec_rc2ecb_parameter_template,
  1169 							&(algid->parameters));
  1170 	if (rv != SECSuccess) { 
  1171 	    goto loser;
  1173 	rc2_ecb_params = PORT_New(CK_RC2_PARAMS);
  1174 	if (rc2_ecb_params == NULL) {
  1175 	    goto loser;
  1177 	*rc2_ecb_params = rc2_map(&rc2.rc2ParameterVersion);
  1178 	mech->data = (unsigned char *) rc2_ecb_params;
  1179 	mech->len  = sizeof *rc2_ecb_params;
  1180 	break;
  1181     case CKM_RC2_CBC:
  1182     case CKM_RC2_CBC_PAD:
  1183         rv = SEC_ASN1DecodeItem(arena, &rc2 ,sec_rc2cbc_parameter_template,
  1184 							&(algid->parameters));
  1185 	if (rv != SECSuccess) { 
  1186 	    goto loser;
  1188 	rc2_cbc_params = PORT_New(CK_RC2_CBC_PARAMS);
  1189 	if (rc2_cbc_params == NULL) {
  1190 	    goto loser;
  1192 	mech->data = (unsigned char *) rc2_cbc_params;
  1193 	mech->len  = sizeof *rc2_cbc_params;
  1194 	rc2_cbc_params->ulEffectiveBits = rc2_map(&rc2.rc2ParameterVersion);
  1195 	if (rc2.iv.len != sizeof rc2_cbc_params->iv) {
  1196 	    PORT_SetError(SEC_ERROR_INPUT_LEN);
  1197 	    goto loser;
  1199 	PORT_Memcpy(rc2_cbc_params->iv, rc2.iv.data, rc2.iv.len);
  1200 	break;
  1201     case CKM_RC5_ECB:
  1202         rv = SEC_ASN1DecodeItem(arena, &rc5 ,sec_rc5ecb_parameter_template,
  1203 							&(algid->parameters));
  1204 	if (rv != SECSuccess) { 
  1205 	    goto loser;
  1207 	rc5_ecb_params = PORT_New(CK_RC5_PARAMS);
  1208 	if (rc5_ecb_params == NULL) {
  1209 	    goto loser;
  1211 	rc5_ecb_params->ulRounds   = DER_GetInteger(&rc5.rounds);
  1212 	rc5_ecb_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits)/8;
  1213 	mech->data = (unsigned char *) rc5_ecb_params;
  1214 	mech->len = sizeof *rc5_ecb_params;
  1215 	break;
  1216     case CKM_RC5_CBC:
  1217     case CKM_RC5_CBC_PAD:
  1218         rv = SEC_ASN1DecodeItem(arena, &rc5 ,sec_rc5cbc_parameter_template,
  1219 							&(algid->parameters));
  1220 	if (rv != SECSuccess) { 
  1221 	    goto loser;
  1223 	rc5_cbc_params = (CK_RC5_CBC_PARAMS *)
  1224 		PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + rc5.iv.len);
  1225 	if (rc5_cbc_params == NULL) {
  1226 	    goto loser;
  1228 	mech->data = (unsigned char *) rc5_cbc_params;
  1229 	mech->len = sizeof *rc5_cbc_params;
  1230 	rc5_cbc_params->ulRounds   = DER_GetInteger(&rc5.rounds);
  1231 	rc5_cbc_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits)/8;
  1232         rc5_cbc_params->pIv        = ((CK_BYTE_PTR)rc5_cbc_params)
  1233 						+ sizeof(CK_RC5_CBC_PARAMS);
  1234         rc5_cbc_params->ulIvLen    = rc5.iv.len;
  1235 	PORT_Memcpy(rc5_cbc_params->pIv, rc5.iv.data, rc5.iv.len);
  1236 	break;
  1237     case CKM_PBE_MD2_DES_CBC:
  1238     case CKM_PBE_MD5_DES_CBC:
  1239     case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
  1240     case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
  1241     case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
  1242     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
  1243     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
  1244     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
  1245     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
  1246     case CKM_PBE_SHA1_DES2_EDE_CBC:
  1247     case CKM_PBE_SHA1_DES3_EDE_CBC:
  1248     case CKM_PBE_SHA1_RC2_40_CBC:
  1249     case CKM_PBE_SHA1_RC2_128_CBC:
  1250     case CKM_PBE_SHA1_RC4_40:
  1251     case CKM_PBE_SHA1_RC4_128:
  1252     case CKM_PKCS5_PBKD2:
  1253 	rv = pbe_PK11AlgidToParam(algid,mech);
  1254 	if (rv != SECSuccess) {
  1255 	    goto loser;
  1257 	break;
  1258     case CKM_RC4:
  1259     case CKM_SEED_ECB:
  1260     case CKM_CAMELLIA_ECB:
  1261     case CKM_AES_ECB:
  1262     case CKM_DES_ECB:
  1263     case CKM_DES3_ECB:
  1264     case CKM_IDEA_ECB:
  1265     case CKM_CDMF_ECB:
  1266     case CKM_CAST_ECB:
  1267     case CKM_CAST3_ECB:
  1268     case CKM_CAST5_ECB:
  1269 	break;
  1271     default:
  1272 	if (pk11_lookup(type)->iv == 0) {
  1273 	    break;
  1275 	/* FALL THROUGH */
  1276     case CKM_SEED_CBC:
  1277     case CKM_CAMELLIA_CBC:
  1278     case CKM_AES_CBC:
  1279     case CKM_DES_CBC:
  1280     case CKM_DES3_CBC:
  1281     case CKM_IDEA_CBC:
  1282     case CKM_CDMF_CBC:
  1283     case CKM_CAST_CBC:
  1284     case CKM_CAST3_CBC:
  1285     case CKM_CAST5_CBC:
  1286     case CKM_SEED_CBC_PAD:
  1287     case CKM_CAMELLIA_CBC_PAD:
  1288     case CKM_AES_CBC_PAD:
  1289     case CKM_DES_CBC_PAD:
  1290     case CKM_DES3_CBC_PAD:
  1291     case CKM_IDEA_CBC_PAD:
  1292     case CKM_CDMF_CBC_PAD:
  1293     case CKM_CAST_CBC_PAD:
  1294     case CKM_CAST3_CBC_PAD:
  1295     case CKM_CAST5_CBC_PAD:
  1296     case CKM_SKIPJACK_CBC64:
  1297     case CKM_SKIPJACK_ECB64:
  1298     case CKM_SKIPJACK_OFB64:
  1299     case CKM_SKIPJACK_CFB64:
  1300     case CKM_SKIPJACK_CFB32:
  1301     case CKM_SKIPJACK_CFB16:
  1302     case CKM_SKIPJACK_CFB8:
  1303     case CKM_BATON_ECB128:
  1304     case CKM_BATON_ECB96:
  1305     case CKM_BATON_CBC128:
  1306     case CKM_BATON_COUNTER:
  1307     case CKM_BATON_SHUFFLE:
  1308     case CKM_JUNIPER_ECB128:
  1309     case CKM_JUNIPER_CBC128:
  1310     case CKM_JUNIPER_COUNTER:
  1311     case CKM_JUNIPER_SHUFFLE:
  1312 	/* simple cases are simply octet string encoded IVs */
  1313 	rv = SEC_ASN1DecodeItem(arena, &iv,
  1314                                 SEC_ASN1_GET(SEC_OctetStringTemplate),
  1315                                 &(algid->parameters));
  1316 	if (rv != SECSuccess || iv.data == NULL) {
  1317 	    goto loser;
  1319 	/* XXX Should be some IV length sanity check here. */
  1320 	mech->data = (unsigned char*)PORT_Alloc(iv.len);
  1321 	if (mech->data == NULL) {
  1322 	    goto loser;
  1324 	PORT_Memcpy(mech->data, iv.data, iv.len);
  1325 	mech->len = iv.len;
  1326 	break;
  1328     PORT_FreeArena(arena, PR_FALSE);
  1329     return mech;
  1331 loser:
  1332     if (arena)
  1333     	PORT_FreeArena(arena, PR_FALSE);
  1334     SECITEM_FreeItem(mech,PR_TRUE);
  1335     return NULL;
  1338 /*
  1339  * Generate an IV for the given mechanism 
  1340  */
  1341 static SECStatus
  1342 pk11_GenIV(CK_MECHANISM_TYPE type, SECItem *iv) {
  1343     int iv_size = PK11_GetIVLength(type);
  1344     SECStatus rv;
  1346     iv->len = iv_size;
  1347     if (iv_size == 0) { 
  1348 	iv->data = NULL;
  1349 	return SECSuccess;
  1352     iv->data = (unsigned char *) PORT_Alloc(iv_size);
  1353     if (iv->data == NULL) {
  1354 	iv->len = 0;
  1355 	return SECFailure;
  1358     rv = PK11_GenerateRandom(iv->data,iv->len);
  1359     if (rv != SECSuccess) {
  1360 	PORT_Free(iv->data);
  1361 	iv->data = NULL; iv->len = 0;
  1362 	return SECFailure;
  1364     return SECSuccess;
  1368 /*
  1369  * create a new parameter block from the passed in MECHANISM and the
  1370  * key. Use Netscape's S/MIME Rules for the New param block.
  1371  */
  1372 SECItem *
  1373 pk11_GenerateNewParamWithKeyLen(CK_MECHANISM_TYPE type, int keyLen) 
  1375     CK_RC2_CBC_PARAMS *rc2_params;
  1376     CK_RC2_PARAMS *rc2_ecb_params;
  1377     SECItem *mech;
  1378     SECItem iv;
  1379     SECStatus rv;
  1382     mech = (SECItem *) PORT_Alloc(sizeof(SECItem));
  1383     if (mech == NULL) return NULL;
  1385     rv = SECSuccess;
  1386     mech->type = siBuffer;
  1387     switch (type) {
  1388     case CKM_RC4:
  1389     case CKM_SEED_ECB:
  1390     case CKM_CAMELLIA_ECB:
  1391     case CKM_AES_ECB:
  1392     case CKM_DES_ECB:
  1393     case CKM_DES3_ECB:
  1394     case CKM_IDEA_ECB:
  1395     case CKM_CDMF_ECB:
  1396     case CKM_CAST_ECB:
  1397     case CKM_CAST3_ECB:
  1398     case CKM_CAST5_ECB:
  1399 	mech->data = NULL;
  1400 	mech->len = 0;
  1401 	break;
  1402     case CKM_RC2_ECB:
  1403 	rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS));
  1404 	if (rc2_ecb_params == NULL) {
  1405 	    rv = SECFailure;
  1406 	    break;
  1408 	/* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5,
  1409 	 *   or RC4 key. Of course that wouldn't happen here doing RC2:).*/
  1410 	*rc2_ecb_params = keyLen ? keyLen*8 : 128;
  1411 	mech->data = (unsigned char *) rc2_ecb_params;
  1412 	mech->len = sizeof(CK_RC2_PARAMS);
  1413 	break;
  1414     case CKM_RC2_CBC:
  1415     case CKM_RC2_CBC_PAD:
  1416 	rv = pk11_GenIV(type,&iv);
  1417 	if (rv != SECSuccess) {
  1418 	    break;
  1420 	rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS));
  1421 	if (rc2_params == NULL) {
  1422 	    PORT_Free(iv.data);
  1423 	    rv = SECFailure;
  1424 	    break;
  1426 	/* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5,
  1427 	 *   or RC4 key. Of course that wouldn't happen here doing RC2:).*/
  1428 	rc2_params->ulEffectiveBits = keyLen ? keyLen*8 : 128;
  1429 	if (iv.data)
  1430 	    PORT_Memcpy(rc2_params->iv,iv.data,sizeof(rc2_params->iv));
  1431 	mech->data = (unsigned char *) rc2_params;
  1432 	mech->len = sizeof(CK_RC2_CBC_PARAMS);
  1433 	PORT_Free(iv.data);
  1434 	break;
  1435     case CKM_RC5_ECB:
  1436         PORT_Free(mech);
  1437 	return PK11_ParamFromIV(type,NULL);
  1438     case CKM_RC5_CBC:
  1439     case CKM_RC5_CBC_PAD:
  1440 	rv = pk11_GenIV(type,&iv);
  1441 	if (rv != SECSuccess) {
  1442 	    break;
  1444         PORT_Free(mech);
  1445 	return PK11_ParamFromIV(type,&iv);
  1446     default:
  1447 	if (pk11_lookup(type)->iv == 0) {
  1448 	    mech->data = NULL;
  1449 	    mech->len = 0;
  1450 	    break;
  1452     case CKM_SEED_CBC:
  1453     case CKM_CAMELLIA_CBC:
  1454     case CKM_AES_CBC:
  1455     case CKM_DES_CBC:
  1456     case CKM_DES3_CBC:
  1457     case CKM_IDEA_CBC:
  1458     case CKM_CDMF_CBC:
  1459     case CKM_CAST_CBC:
  1460     case CKM_CAST3_CBC:
  1461     case CKM_CAST5_CBC:
  1462     case CKM_DES_CBC_PAD:
  1463     case CKM_DES3_CBC_PAD:
  1464     case CKM_IDEA_CBC_PAD:
  1465     case CKM_CDMF_CBC_PAD:
  1466     case CKM_CAST_CBC_PAD:
  1467     case CKM_CAST3_CBC_PAD:
  1468     case CKM_CAST5_CBC_PAD:
  1469     case CKM_SKIPJACK_CBC64:
  1470     case CKM_SKIPJACK_ECB64:
  1471     case CKM_SKIPJACK_OFB64:
  1472     case CKM_SKIPJACK_CFB64:
  1473     case CKM_SKIPJACK_CFB32:
  1474     case CKM_SKIPJACK_CFB16:
  1475     case CKM_SKIPJACK_CFB8:
  1476     case CKM_BATON_ECB128:
  1477     case CKM_BATON_ECB96:
  1478     case CKM_BATON_CBC128:
  1479     case CKM_BATON_COUNTER:
  1480     case CKM_BATON_SHUFFLE:
  1481     case CKM_JUNIPER_ECB128:
  1482     case CKM_JUNIPER_CBC128:
  1483     case CKM_JUNIPER_COUNTER:
  1484     case CKM_JUNIPER_SHUFFLE:
  1485 	rv = pk11_GenIV(type,&iv);
  1486 	if (rv != SECSuccess) {
  1487 	    break;
  1489 	mech->data = (unsigned char*)PORT_Alloc(iv.len);
  1490 	if (mech->data == NULL) {
  1491 	    PORT_Free(iv.data);
  1492 	    rv = SECFailure;
  1493 	    break;
  1495 	PORT_Memcpy(mech->data,iv.data,iv.len);
  1496 	mech->len = iv.len;
  1497         PORT_Free(iv.data);
  1498 	break;
  1500     if (rv !=  SECSuccess) {
  1501 	SECITEM_FreeItem(mech,PR_TRUE);
  1502 	return NULL;
  1504     return mech;
  1508 SECItem *
  1509 PK11_GenerateNewParam(CK_MECHANISM_TYPE type, PK11SymKey *key) 
  1511     int keyLen = key ? PK11_GetKeyLength(key) :  0;
  1513     return pk11_GenerateNewParamWithKeyLen(type, keyLen);
  1516 #define RC5_V10 0x10
  1518 /* turn a PKCS #11 parameter into a DER Encoded Algorithm ID */
  1519 SECStatus
  1520 PK11_ParamToAlgid(SECOidTag algTag, SECItem *param, 
  1521 				PLArenaPool *arena, SECAlgorithmID *algid) {
  1522     CK_RC2_CBC_PARAMS *rc2_params;
  1523     sec_rc2cbcParameter rc2;
  1524     CK_RC5_CBC_PARAMS *rc5_params;
  1525     sec_rc5cbcParameter rc5;
  1526     CK_MECHANISM_TYPE type = PK11_AlgtagToMechanism(algTag);
  1527     SECItem *newParams = NULL;
  1528     SECStatus rv = SECFailure;
  1529     unsigned long rc2version;
  1531     switch (type) {
  1532     case CKM_RC4:
  1533     case CKM_SEED_ECB:
  1534     case CKM_CAMELLIA_ECB:
  1535     case CKM_AES_ECB:
  1536     case CKM_DES_ECB:
  1537     case CKM_DES3_ECB:
  1538     case CKM_IDEA_ECB:
  1539     case CKM_CDMF_ECB:
  1540     case CKM_CAST_ECB:
  1541     case CKM_CAST3_ECB:
  1542     case CKM_CAST5_ECB:
  1543 	newParams = NULL;
  1544 	rv = SECSuccess;
  1545 	break;
  1546     case CKM_RC2_ECB:
  1547 	break;
  1548     case CKM_RC2_CBC:
  1549     case CKM_RC2_CBC_PAD:
  1550 	rc2_params = (CK_RC2_CBC_PARAMS *)param->data;
  1551 	rc2version = rc2_unmap(rc2_params->ulEffectiveBits);
  1552 	if (SEC_ASN1EncodeUnsignedInteger (NULL, &(rc2.rc2ParameterVersion),
  1553 					   rc2version) == NULL)
  1554 	    break;
  1555 	rc2.iv.data = rc2_params->iv;
  1556 	rc2.iv.len = sizeof(rc2_params->iv);
  1557 	newParams = SEC_ASN1EncodeItem (NULL, NULL, &rc2,
  1558                                          sec_rc2cbc_parameter_template);
  1559         PORT_Free(rc2.rc2ParameterVersion.data);
  1560 	if (newParams == NULL)
  1561 	    break;
  1562 	rv = SECSuccess;
  1563 	break;
  1565     case CKM_RC5_ECB: /* well not really... */
  1566 	break;
  1567     case CKM_RC5_CBC:
  1568     case CKM_RC5_CBC_PAD:
  1569 	rc5_params = (CK_RC5_CBC_PARAMS *)param->data;
  1570 	if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.version, RC5_V10) == NULL)
  1571 	    break;
  1572 	if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.blockSizeInBits, 
  1573 					rc5_params->ulWordsize*8) == NULL) {
  1574             PORT_Free(rc5.version.data);
  1575 	    break;
  1577 	if (SEC_ASN1EncodeUnsignedInteger (NULL, &rc5.rounds, 
  1578 					rc5_params->ulWordsize*8) == NULL) {
  1579             PORT_Free(rc5.blockSizeInBits.data);
  1580             PORT_Free(rc5.version.data);
  1581 	    break;
  1583 	rc5.iv.data = rc5_params->pIv;
  1584 	rc5.iv.len = rc5_params->ulIvLen;
  1585 	newParams = SEC_ASN1EncodeItem (NULL, NULL, &rc5,
  1586                                          sec_rc5cbc_parameter_template);
  1587         PORT_Free(rc5.version.data);
  1588         PORT_Free(rc5.blockSizeInBits.data);
  1589         PORT_Free(rc5.rounds.data);
  1590 	if (newParams == NULL)
  1591 	    break;
  1592 	rv = SECSuccess;
  1593 	break;
  1594     case CKM_PBE_MD2_DES_CBC:
  1595     case CKM_PBE_MD5_DES_CBC:
  1596     case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
  1597     case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
  1598     case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
  1599     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
  1600     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
  1601     case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
  1602     case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
  1603     case CKM_PBE_SHA1_DES3_EDE_CBC:
  1604     case CKM_PBE_SHA1_DES2_EDE_CBC:
  1605     case CKM_PBE_SHA1_RC2_40_CBC:
  1606     case CKM_PBE_SHA1_RC2_128_CBC:
  1607     case CKM_PBE_SHA1_RC4_40:
  1608     case CKM_PBE_SHA1_RC4_128:
  1609 	return PBE_PK11ParamToAlgid(algTag, param, arena, algid);
  1610     default:
  1611 	if (pk11_lookup(type)->iv == 0) {
  1612 	    rv = SECSuccess;
  1613 	    newParams = NULL;
  1614 	    break;
  1616     case CKM_SEED_CBC:
  1617     case CKM_CAMELLIA_CBC:
  1618     case CKM_AES_CBC:
  1619     case CKM_DES_CBC:
  1620     case CKM_DES3_CBC:
  1621     case CKM_IDEA_CBC:
  1622     case CKM_CDMF_CBC:
  1623     case CKM_CAST_CBC:
  1624     case CKM_CAST3_CBC:
  1625     case CKM_CAST5_CBC:
  1626     case CKM_DES_CBC_PAD:
  1627     case CKM_DES3_CBC_PAD:
  1628     case CKM_IDEA_CBC_PAD:
  1629     case CKM_CDMF_CBC_PAD:
  1630     case CKM_CAST_CBC_PAD:
  1631     case CKM_CAST3_CBC_PAD:
  1632     case CKM_CAST5_CBC_PAD:
  1633     case CKM_SKIPJACK_CBC64:
  1634     case CKM_SKIPJACK_ECB64:
  1635     case CKM_SKIPJACK_OFB64:
  1636     case CKM_SKIPJACK_CFB64:
  1637     case CKM_SKIPJACK_CFB32:
  1638     case CKM_SKIPJACK_CFB16:
  1639     case CKM_SKIPJACK_CFB8:
  1640     case CKM_BATON_ECB128:
  1641     case CKM_BATON_ECB96:
  1642     case CKM_BATON_CBC128:
  1643     case CKM_BATON_COUNTER:
  1644     case CKM_BATON_SHUFFLE:
  1645     case CKM_JUNIPER_ECB128:
  1646     case CKM_JUNIPER_CBC128:
  1647     case CKM_JUNIPER_COUNTER:
  1648     case CKM_JUNIPER_SHUFFLE:
  1649 	newParams = SEC_ASN1EncodeItem(NULL,NULL,param,
  1650                                        SEC_ASN1_GET(SEC_OctetStringTemplate) );
  1651 	if (newParams == NULL)
  1652 	    break;
  1653 	rv = SECSuccess;
  1654 	break;
  1657     if (rv !=  SECSuccess) {
  1658 	if (newParams) SECITEM_FreeItem(newParams,PR_TRUE);
  1659 	return rv;
  1662     rv = SECOID_SetAlgorithmID(arena, algid, algTag, newParams);
  1663     SECITEM_FreeItem(newParams,PR_TRUE);
  1664     return rv;
  1667 /* turn an OID algorithm tag into a PKCS #11 mechanism. This allows us to
  1668  * map OID's directly into the PKCS #11 mechanism we want to call. We find
  1669  * this mapping in our standard OID table */
  1670 CK_MECHANISM_TYPE
  1671 PK11_AlgtagToMechanism(SECOidTag algTag) {
  1672     SECOidData *oid = SECOID_FindOIDByTag(algTag);
  1674     if (oid) return (CK_MECHANISM_TYPE) oid->mechanism;
  1675     return CKM_INVALID_MECHANISM;
  1678 /* turn a mechanism into an oid. */
  1679 SECOidTag
  1680 PK11_MechanismToAlgtag(CK_MECHANISM_TYPE type) {
  1681     SECOidData *oid = SECOID_FindOIDByMechanism((unsigned long)type);
  1683     if (oid) return oid->offset;
  1684     return SEC_OID_UNKNOWN;
  1687 /* Determine appropriate blocking mechanism, used when wrapping private keys
  1688  * which require PKCS padding.  If the mechanism does not map to a padding
  1689  * mechanism, we simply return the mechanism.
  1690  */
  1691 CK_MECHANISM_TYPE
  1692 PK11_GetPadMechanism(CK_MECHANISM_TYPE type) {
  1693     switch(type) {
  1694 	case CKM_SEED_CBC:
  1695 	    return CKM_SEED_CBC_PAD;
  1696 	case CKM_CAMELLIA_CBC:
  1697 	    return CKM_CAMELLIA_CBC_PAD;
  1698 	case CKM_AES_CBC:
  1699 	    return CKM_AES_CBC_PAD;
  1700 	case CKM_DES_CBC:
  1701 	    return CKM_DES_CBC_PAD;
  1702 	case CKM_DES3_CBC:
  1703 	    return CKM_DES3_CBC_PAD;
  1704 	case CKM_RC2_CBC:
  1705 	    return CKM_RC2_CBC_PAD;
  1706 	case CKM_CDMF_CBC:
  1707 	    return CKM_CDMF_CBC_PAD;
  1708 	case CKM_CAST_CBC:
  1709 	    return CKM_CAST_CBC_PAD;
  1710 	case CKM_CAST3_CBC:
  1711 	    return CKM_CAST3_CBC_PAD;
  1712 	case CKM_CAST5_CBC:
  1713 	    return CKM_CAST5_CBC_PAD;
  1714 	case CKM_RC5_CBC:
  1715 	    return CKM_RC5_CBC_PAD; 
  1716 	case CKM_IDEA_CBC:
  1717 	    return CKM_IDEA_CBC_PAD; 
  1718 	default:
  1719 	    break;
  1722     return type;
  1725 static PRBool
  1726 pk11_isAllZero(unsigned char *data,int len) {
  1727     while (len--) {
  1728 	if (*data++) {
  1729 	    return PR_FALSE;
  1732     return PR_TRUE;
  1735 CK_RV
  1736 PK11_MapPBEMechanismToCryptoMechanism(CK_MECHANISM_PTR pPBEMechanism, 
  1737 				      CK_MECHANISM_PTR pCryptoMechanism,
  1738 				      SECItem *pbe_pwd, PRBool faulty3DES)
  1740     int iv_len = 0;
  1741     CK_PBE_PARAMS_PTR pPBEparams;
  1742     CK_RC2_CBC_PARAMS_PTR rc2_params;
  1743     CK_ULONG rc2_key_len;
  1745     if((pPBEMechanism == CK_NULL_PTR) || (pCryptoMechanism == CK_NULL_PTR)) {
  1746 	return CKR_HOST_MEMORY;
  1749     /* pkcs5 v2 cannot be supported by this interface.
  1750      * use PK11_GetPBECryptoMechanism instead.
  1751      */
  1752     if ((pPBEMechanism->mechanism == CKM_INVALID_MECHANISM) || 
  1753 	(pPBEMechanism->mechanism == CKM_PKCS5_PBKD2)) {
  1754 	return CKR_MECHANISM_INVALID;
  1757     pPBEparams = (CK_PBE_PARAMS_PTR)pPBEMechanism->pParameter;
  1758     iv_len = PK11_GetIVLength(pPBEMechanism->mechanism);
  1760     if (iv_len) {
  1761 	if (pk11_isAllZero(pPBEparams->pInitVector,iv_len)) {
  1762 	    SECItem param;
  1763 	    PK11SymKey *symKey;
  1764 	    PK11SlotInfo *intSlot = PK11_GetInternalSlot();
  1766 	    if (intSlot == NULL) {
  1767 		return CKR_DEVICE_ERROR;
  1770 	    param.data = pPBEMechanism->pParameter;
  1771 	    param.len = pPBEMechanism->ulParameterLen;
  1773 	    symKey = PK11_RawPBEKeyGen(intSlot,
  1774 		pPBEMechanism->mechanism, &param, pbe_pwd, faulty3DES, NULL);
  1775 	    PK11_FreeSlot(intSlot);
  1776 	    if (symKey== NULL) {
  1777 		return CKR_DEVICE_ERROR; /* sigh */
  1779 	    PK11_FreeSymKey(symKey);
  1783     switch(pPBEMechanism->mechanism) {
  1784 	case CKM_PBE_MD2_DES_CBC:
  1785 	case CKM_PBE_MD5_DES_CBC:
  1786 	case CKM_NETSCAPE_PBE_SHA1_DES_CBC:
  1787 	    pCryptoMechanism->mechanism = CKM_DES_CBC;
  1788 	    goto have_crypto_mechanism;
  1789 	case CKM_NETSCAPE_PBE_SHA1_TRIPLE_DES_CBC:
  1790 	case CKM_NETSCAPE_PBE_SHA1_FAULTY_3DES_CBC:
  1791 	case CKM_PBE_SHA1_DES3_EDE_CBC:
  1792 	case CKM_PBE_SHA1_DES2_EDE_CBC:
  1793 	    pCryptoMechanism->mechanism = CKM_DES3_CBC;
  1794 have_crypto_mechanism:
  1795 	    pCryptoMechanism->pParameter = PORT_Alloc(iv_len);
  1796 	    pCryptoMechanism->ulParameterLen = (CK_ULONG)iv_len;
  1797 	    if(pCryptoMechanism->pParameter == NULL) {
  1798 		return CKR_HOST_MEMORY;
  1800 	    PORT_Memcpy((unsigned char *)(pCryptoMechanism->pParameter),
  1801 			(unsigned char *)(pPBEparams->pInitVector),
  1802 			iv_len);
  1803 	    break;
  1804 	case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC4:
  1805 	case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC4:
  1806 	case CKM_PBE_SHA1_RC4_40:
  1807 	case CKM_PBE_SHA1_RC4_128:
  1808 	    pCryptoMechanism->mechanism = CKM_RC4;
  1809 	    pCryptoMechanism->ulParameterLen = 0;
  1810 	    pCryptoMechanism->pParameter = CK_NULL_PTR;
  1811 	    break;
  1812 	case CKM_NETSCAPE_PBE_SHA1_40_BIT_RC2_CBC:
  1813 	case CKM_PBE_SHA1_RC2_40_CBC:
  1814 	    rc2_key_len = 40;
  1815 	    goto have_key_len;
  1816 	case CKM_NETSCAPE_PBE_SHA1_128_BIT_RC2_CBC:
  1817 	    rc2_key_len = 128;
  1818 have_key_len:
  1819 	    pCryptoMechanism->mechanism = CKM_RC2_CBC;
  1820 	    pCryptoMechanism->ulParameterLen = (CK_ULONG)
  1821 						sizeof(CK_RC2_CBC_PARAMS);
  1822 	    pCryptoMechanism->pParameter = (CK_RC2_CBC_PARAMS_PTR)
  1823 				PORT_ZAlloc(sizeof(CK_RC2_CBC_PARAMS));
  1824 	    if(pCryptoMechanism->pParameter == NULL) {
  1825 		return CKR_HOST_MEMORY;
  1827 	    rc2_params = (CK_RC2_CBC_PARAMS_PTR)pCryptoMechanism->pParameter;
  1828 	    PORT_Memcpy((unsigned char *)rc2_params->iv,
  1829 	    		(unsigned char *)pPBEparams->pInitVector,
  1830 	    		iv_len);
  1831 	    rc2_params->ulEffectiveBits = rc2_key_len;
  1832 	    break;
  1833 	default:
  1834 	    return CKR_MECHANISM_INVALID;
  1837     return CKR_OK;
  1840 /* Make a Key type to an appropriate signing/verification mechanism */
  1841 CK_MECHANISM_TYPE
  1842 PK11_MapSignKeyType(KeyType keyType)
  1844     switch (keyType) {
  1845     case rsaKey:
  1846 	return CKM_RSA_PKCS;
  1847     case fortezzaKey:
  1848     case dsaKey:
  1849 	return CKM_DSA;
  1850     case ecKey:
  1851 	return CKM_ECDSA;
  1852     case dhKey:
  1853     default:
  1854 	break;
  1856     return CKM_INVALID_MECHANISM;
  1859 CK_MECHANISM_TYPE
  1860 pk11_mapWrapKeyType(KeyType keyType)
  1862     switch (keyType) {
  1863     case rsaKey:
  1864 	return CKM_RSA_PKCS;
  1865     /* Add fortezza?? */
  1866     default:
  1867 	break;
  1869     return CKM_INVALID_MECHANISM;
  1872 SECOidTag 
  1873 PK11_FortezzaMapSig(SECOidTag algTag)
  1875     switch (algTag) {
  1876     case SEC_OID_MISSI_KEA_DSS:
  1877     case SEC_OID_MISSI_DSS:
  1878     case SEC_OID_MISSI_DSS_OLD:
  1879     case SEC_OID_MISSI_KEA_DSS_OLD:
  1880     case SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST:
  1881 	return SEC_OID_ANSIX9_DSA_SIGNATURE;
  1882     default:
  1883 	break;
  1885     return algTag;

mercurial