Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     27 
     28 #include <cryptoutil.h>
     29 
     30 /*
     31  * Get the key generation mechanism for the given mechanism.
     32  *
     33  * All mechanisms in PKCS #11 v2.20 are listed here.
     34  */
     35 CK_RV
     36 pkcs11_mech2keygen(CK_MECHANISM_TYPE mech_type, CK_MECHANISM_TYPE *gen_mech)
     37 {
     38 	switch (mech_type) {
     39 
     40 	case CKM_RSA_PKCS_KEY_PAIR_GEN:
     41 	case CKM_RSA_PKCS:
     42 	case CKM_RSA_9796:
     43 	case CKM_RSA_X_509:
     44 	case CKM_MD2_RSA_PKCS:
     45 	case CKM_MD5_RSA_PKCS:
     46 	case CKM_SHA1_RSA_PKCS:
     47 	case CKM_SHA256_RSA_PKCS:
     48 	case CKM_SHA384_RSA_PKCS:
     49 	case CKM_SHA512_RSA_PKCS:
     50 	case CKM_SHA256_RSA_PKCS_PSS:
     51 	case CKM_SHA384_RSA_PKCS_PSS:
     52 	case CKM_SHA512_RSA_PKCS_PSS:
     53 	case CKM_RIPEMD128_RSA_PKCS:
     54 	case CKM_RIPEMD160_RSA_PKCS:
     55 	case CKM_RSA_PKCS_OAEP:
     56 		*gen_mech = CKM_RSA_PKCS_KEY_PAIR_GEN;
     57 		break;
     58 
     59 	case CKM_RSA_X9_31_KEY_PAIR_GEN:
     60 	case CKM_RSA_X9_31:
     61 	case CKM_SHA1_RSA_X9_31:
     62 		*gen_mech = CKM_RSA_X9_31_KEY_PAIR_GEN;
     63 		break;
     64 
     65 	case CKM_RSA_PKCS_PSS:
     66 	case CKM_SHA1_RSA_PKCS_PSS:
     67 		*gen_mech = CKM_RSA_PKCS_KEY_PAIR_GEN;
     68 		break;
     69 
     70 	case CKM_DH_PKCS_PARAMETER_GEN:
     71 		*gen_mech = CKM_DH_PKCS_PARAMETER_GEN;
     72 		break;
     73 
     74 	case CKM_DSA_KEY_PAIR_GEN:
     75 	case CKM_DSA:
     76 	case CKM_DSA_SHA1:
     77 		*gen_mech = CKM_DSA_KEY_PAIR_GEN;
     78 		break;
     79 
     80 	case CKM_DSA_PARAMETER_GEN:
     81 		*gen_mech = CKM_DSA_PARAMETER_GEN;
     82 		break;
     83 
     84 	case CKM_FORTEZZA_TIMESTAMP:
     85 		*gen_mech = CKM_DSA_KEY_PAIR_GEN;
     86 		break;
     87 
     88 	case CKM_DH_PKCS_KEY_PAIR_GEN:
     89 	case CKM_DH_PKCS_DERIVE:
     90 		*gen_mech = CKM_DH_PKCS_KEY_PAIR_GEN;
     91 		break;
     92 
     93 	case CKM_ECDSA:
     94 	case CKM_ECDSA_SHA1:
     95 	case CKM_EC_KEY_PAIR_GEN:
     96 	case CKM_ECDH1_DERIVE:
     97 	case CKM_ECDH1_COFACTOR_DERIVE:
     98 	case CKM_ECMQV_DERIVE:
     99 		*gen_mech = CKM_EC_KEY_PAIR_GEN;
    100 		break;
    101 
    102 	case CKM_X9_42_DH_KEY_PAIR_GEN:
    103 	case CKM_X9_42_DH_DERIVE:
    104 	case CKM_X9_42_DH_HYBRID_DERIVE:
    105 	case CKM_X9_42_MQV_DERIVE:
    106 		*gen_mech = CKM_X9_42_DH_KEY_PAIR_GEN;
    107 		break;
    108 
    109 	case CKM_X9_42_DH_PARAMETER_GEN:
    110 		*gen_mech = CKM_X9_42_DH_PARAMETER_GEN;
    111 		break;
    112 
    113 	case CKM_KEA_KEY_PAIR_GEN:
    114 	case CKM_KEA_KEY_DERIVE:
    115 		*gen_mech = CKM_KEA_KEY_PAIR_GEN;
    116 		break;
    117 
    118 	case CKM_MD2:
    119 	case CKM_MD2_HMAC:
    120 	case CKM_MD2_HMAC_GENERAL:
    121 	case CKM_MD5:
    122 	case CKM_MD5_HMAC:
    123 	case CKM_MD5_HMAC_GENERAL:
    124 	case CKM_SHA_1:
    125 	case CKM_SHA_1_HMAC:
    126 	case CKM_SHA_1_HMAC_GENERAL:
    127 	case CKM_SHA256:
    128 	case CKM_SHA256_HMAC:
    129 	case CKM_SHA256_HMAC_GENERAL:
    130 	case CKM_SHA384:
    131 	case CKM_SHA384_HMAC:
    132 	case CKM_SHA384_HMAC_GENERAL:
    133 	case CKM_SHA512:
    134 	case CKM_SHA512_HMAC:
    135 	case CKM_SHA512_HMAC_GENERAL:
    136 	case CKM_GENERIC_SECRET_KEY_GEN:
    137 	case CKM_FASTHASH:
    138 	case CKM_PKCS5_PBKD2:
    139 	case CKM_PBA_SHA1_WITH_SHA1_HMAC:
    140 		*gen_mech = CKM_GENERIC_SECRET_KEY_GEN;
    141 		break;
    142 
    143 	case CKM_SSL3_MD5_MAC:
    144 	case CKM_SSL3_SHA1_MAC:
    145 	case CKM_SSL3_PRE_MASTER_KEY_GEN:
    146 	case CKM_SSL3_MASTER_KEY_DERIVE:
    147 	case CKM_SSL3_KEY_AND_MAC_DERIVE:
    148 	case CKM_SSL3_MASTER_KEY_DERIVE_DH:
    149 		*gen_mech = CKM_SSL3_PRE_MASTER_KEY_GEN;
    150 		break;
    151 
    152 	case CKM_TLS_PRE_MASTER_KEY_GEN:
    153 	case CKM_TLS_MASTER_KEY_DERIVE:
    154 	case CKM_TLS_KEY_AND_MAC_DERIVE:
    155 	case CKM_TLS_MASTER_KEY_DERIVE_DH:
    156 	case CKM_TLS_PRF:
    157 		*gen_mech = CKM_TLS_PRE_MASTER_KEY_GEN;
    158 		break;
    159 
    160 	case CKM_WTLS_PRE_MASTER_KEY_GEN:
    161 	case CKM_WTLS_MASTER_KEY_DERIVE:
    162 	case CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC:
    163 	case CKM_WTLS_PRF:
    164 	case CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE:
    165 	case CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE:
    166 		*gen_mech = CKM_WTLS_PRE_MASTER_KEY_GEN;
    167 		break;
    168 
    169 	case CKM_CONCATENATE_BASE_AND_KEY:
    170 	case CKM_CONCATENATE_BASE_AND_DATA:
    171 	case CKM_CONCATENATE_DATA_AND_BASE:
    172 	case CKM_XOR_BASE_AND_DATA:
    173 	case CKM_EXTRACT_KEY_FROM_KEY:
    174 	case CKM_RIPEMD128:
    175 	case CKM_RIPEMD128_HMAC:
    176 	case CKM_RIPEMD128_HMAC_GENERAL:
    177 	case CKM_RIPEMD160:
    178 	case CKM_RIPEMD160_HMAC:
    179 	case CKM_RIPEMD160_HMAC_GENERAL:
    180 	case CKM_SHA1_KEY_DERIVATION:
    181 	case CKM_SHA256_KEY_DERIVATION:
    182 	case CKM_SHA384_KEY_DERIVATION:
    183 	case CKM_SHA512_KEY_DERIVATION:
    184 	case CKM_MD5_KEY_DERIVATION:
    185 	case CKM_MD2_KEY_DERIVATION:
    186 	/* not sure the following 2 should be CKK_DES or not */
    187 	case CKM_KEY_WRAP_LYNKS: /* wrap/unwrap secret key w/ DES key */
    188 	case CKM_KEY_WRAP_SET_OAEP:  /* wrap/unwarp DES key w/ RSA key */
    189 		*gen_mech = CKM_GENERIC_SECRET_KEY_GEN;
    190 		break;
    191 
    192 	case CKM_RC2_KEY_GEN:
    193 	case CKM_RC2_ECB:
    194 	case CKM_RC2_CBC:
    195 	case CKM_RC2_MAC:
    196 	case CKM_RC2_MAC_GENERAL:
    197 	case CKM_RC2_CBC_PAD:
    198 	case CKM_PBE_SHA1_RC2_128_CBC:
    199 	case CKM_PBE_SHA1_RC2_40_CBC:
    200 		*gen_mech = CKM_RC2_KEY_GEN;
    201 		break;
    202 
    203 	case CKM_RC4_KEY_GEN:
    204 	case CKM_RC4:
    205 	case CKM_PBE_SHA1_RC4_128:
    206 	case CKM_PBE_SHA1_RC4_40:
    207 		*gen_mech = CKM_RC4_KEY_GEN;
    208 		break;
    209 
    210 	case CKM_DES_KEY_GEN:
    211 	case CKM_DES_ECB:
    212 	case CKM_DES_CBC:
    213 	case CKM_DES_MAC:
    214 	case CKM_DES_MAC_GENERAL:
    215 	case CKM_DES_CBC_PAD:
    216 	case CKM_PBE_MD2_DES_CBC:
    217 	case CKM_PBE_MD5_DES_CBC:
    218 	case CKM_DES_OFB64:
    219 	case CKM_DES_OFB8:
    220 	case CKM_DES_CFB64:
    221 	case CKM_DES_CFB8:
    222 	case CKM_DES_ECB_ENCRYPT_DATA:
    223 	case CKM_DES_CBC_ENCRYPT_DATA:
    224 		*gen_mech = CKM_DES_KEY_GEN;
    225 		break;
    226 
    227 	case CKM_DES2_KEY_GEN:
    228 	case CKM_PBE_SHA1_DES2_EDE_CBC:
    229 		*gen_mech = CKM_DES2_KEY_GEN;
    230 		break;
    231 
    232 	case CKM_DES3_KEY_GEN:
    233 	case CKM_DES3_ECB:
    234 	case CKM_DES3_CBC:
    235 	case CKM_DES3_MAC:
    236 	case CKM_DES3_MAC_GENERAL:
    237 	case CKM_DES3_CBC_PAD:
    238 	case CKM_PBE_SHA1_DES3_EDE_CBC:
    239 	case CKM_DES3_ECB_ENCRYPT_DATA:
    240 	case CKM_DES3_CBC_ENCRYPT_DATA:
    241 		*gen_mech = CKM_DES3_KEY_GEN;
    242 		break;
    243 
    244 	case CKM_CAST_KEY_GEN:
    245 	case CKM_CAST_ECB:
    246 	case CKM_CAST_CBC:
    247 	case CKM_CAST_MAC:
    248 	case CKM_CAST_MAC_GENERAL:
    249 	case CKM_CAST_CBC_PAD:
    250 	case CKM_PBE_MD5_CAST_CBC:
    251 		*gen_mech = CKM_CAST_KEY_GEN;
    252 		break;
    253 
    254 	case CKM_CAST3_KEY_GEN:
    255 	case CKM_CAST3_ECB:
    256 	case CKM_CAST3_CBC:
    257 	case CKM_CAST3_MAC:
    258 	case CKM_CAST3_MAC_GENERAL:
    259 	case CKM_CAST3_CBC_PAD:
    260 	case CKM_PBE_MD5_CAST3_CBC:
    261 		*gen_mech = CKM_CAST3_KEY_GEN;
    262 		break;
    263 
    264 	case CKM_CAST128_KEY_GEN:
    265 	case CKM_CAST128_ECB:
    266 	case CKM_CAST128_CBC:
    267 	case CKM_CAST128_MAC:
    268 	case CKM_CAST128_MAC_GENERAL:
    269 	case CKM_CAST128_CBC_PAD:
    270 	case CKM_PBE_MD5_CAST128_CBC:
    271 	case CKM_PBE_SHA1_CAST128_CBC:
    272 		*gen_mech = CKM_CAST128_KEY_GEN;
    273 		break;
    274 
    275 	case CKM_RC5_KEY_GEN:
    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 		*gen_mech = CKM_RC5_KEY_GEN;
    282 		break;
    283 
    284 	case CKM_IDEA_KEY_GEN:
    285 	case CKM_IDEA_ECB:
    286 	case CKM_IDEA_CBC:
    287 	case CKM_IDEA_MAC:
    288 	case CKM_IDEA_MAC_GENERAL:
    289 	case CKM_IDEA_CBC_PAD:
    290 		*gen_mech = CKM_IDEA_KEY_GEN;
    291 		break;
    292 
    293 	case CKM_SKIPJACK_KEY_GEN:
    294 	case CKM_SKIPJACK_ECB64:
    295 	case CKM_SKIPJACK_CBC64:
    296 	case CKM_SKIPJACK_OFB64:
    297 	case CKM_SKIPJACK_CFB64:
    298 	case CKM_SKIPJACK_CFB32:
    299 	case CKM_SKIPJACK_CFB16:
    300 	case CKM_SKIPJACK_CFB8:
    301 	case CKM_SKIPJACK_WRAP:
    302 	case CKM_SKIPJACK_PRIVATE_WRAP:
    303 	case CKM_SKIPJACK_RELAYX:
    304 		*gen_mech = CKM_SKIPJACK_KEY_GEN;
    305 		break;
    306 
    307 	case CKM_BATON_KEY_GEN:
    308 	case CKM_BATON_ECB128:
    309 	case CKM_BATON_ECB96:
    310 	case CKM_BATON_CBC128:
    311 	case CKM_BATON_COUNTER:
    312 	case CKM_BATON_SHUFFLE:
    313 	case CKM_BATON_WRAP:
    314 		*gen_mech = CKM_BATON_KEY_GEN;
    315 		break;
    316 
    317 	case CKM_JUNIPER_KEY_GEN:
    318 	case CKM_JUNIPER_ECB128:
    319 	case CKM_JUNIPER_CBC128:
    320 	case CKM_JUNIPER_COUNTER:
    321 	case CKM_JUNIPER_SHUFFLE:
    322 	case CKM_JUNIPER_WRAP:
    323 		*gen_mech = CKM_JUNIPER_KEY_GEN;
    324 		break;
    325 
    326 	case CKM_CDMF_KEY_GEN:
    327 	case CKM_CDMF_ECB:
    328 	case CKM_CDMF_CBC:
    329 	case CKM_CDMF_MAC:
    330 	case CKM_CDMF_MAC_GENERAL:
    331 	case CKM_CDMF_CBC_PAD:
    332 		*gen_mech = CKM_CDMF_KEY_GEN;
    333 		break;
    334 
    335 	case CKM_AES_KEY_GEN:
    336 	case CKM_AES_ECB:
    337 	case CKM_AES_CBC:
    338 	case CKM_AES_MAC:
    339 	case CKM_AES_MAC_GENERAL:
    340 	case CKM_AES_CBC_PAD:
    341 	case CKM_AES_ECB_ENCRYPT_DATA:
    342 	case CKM_AES_CBC_ENCRYPT_DATA:
    343 		*gen_mech = CKM_AES_KEY_GEN;
    344 		break;
    345 
    346 	case CKM_BLOWFISH_KEY_GEN:
    347 	case CKM_BLOWFISH_CBC:
    348 		*gen_mech = CKM_BLOWFISH_KEY_GEN;
    349 		break;
    350 
    351 	case CKM_TWOFISH_KEY_GEN:
    352 	case CKM_TWOFISH_CBC:
    353 		*gen_mech = CKM_TWOFISH_KEY_GEN;
    354 		break;
    355 
    356 	default:
    357 		return (CKR_MECHANISM_INVALID);
    358 		break;
    359 	}
    360 
    361 	return (CKR_OK);
    362 }
    363