PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/security/nss/lib/pk11wrap/pk11mech.c

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