mechanism.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103
  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. * mechanism.c
  6. *
  7. * This file implements the NSSCKFWMechanism type and methods.
  8. */
  9. #ifndef CK_T
  10. #include "ck.h"
  11. #endif /* CK_T */
  12. /*
  13. * NSSCKFWMechanism
  14. *
  15. * -- create/destroy --
  16. * nssCKFWMechanism_Create
  17. * nssCKFWMechanism_Destroy
  18. *
  19. * -- implement public accessors --
  20. * nssCKFWMechanism_GetMDMechanism
  21. * nssCKFWMechanism_GetParameter
  22. *
  23. * -- private accessors --
  24. *
  25. * -- module fronts --
  26. * nssCKFWMechanism_GetMinKeySize
  27. * nssCKFWMechanism_GetMaxKeySize
  28. * nssCKFWMechanism_GetInHardware
  29. * nssCKFWMechanism_GetCanEncrypt
  30. * nssCKFWMechanism_GetCanDecrypt
  31. * nssCKFWMechanism_GetCanDigest
  32. * nssCKFWMechanism_GetCanSign
  33. * nssCKFWMechanism_GetCanSignRecover
  34. * nssCKFWMechanism_GetCanVerify
  35. * nssCKFWMechanism_GetCanGenerate
  36. * nssCKFWMechanism_GetCanGenerateKeyPair
  37. * nssCKFWMechanism_GetCanUnwrap
  38. * nssCKFWMechanism_GetCanWrap
  39. * nssCKFWMechanism_GetCanDerive
  40. * nssCKFWMechanism_EncryptInit
  41. * nssCKFWMechanism_DecryptInit
  42. * nssCKFWMechanism_DigestInit
  43. * nssCKFWMechanism_SignInit
  44. * nssCKFWMechanism_VerifyInit
  45. * nssCKFWMechanism_SignRecoverInit
  46. * nssCKFWMechanism_VerifyRecoverInit
  47. * nssCKFWMechanism_GenerateKey
  48. * nssCKFWMechanism_GenerateKeyPair
  49. * nssCKFWMechanism_GetWrapKeyLength
  50. * nssCKFWMechanism_WrapKey
  51. * nssCKFWMechanism_UnwrapKey
  52. * nssCKFWMechanism_DeriveKey
  53. */
  54. struct NSSCKFWMechanismStr {
  55. NSSCKMDMechanism *mdMechanism;
  56. NSSCKMDToken *mdToken;
  57. NSSCKFWToken *fwToken;
  58. NSSCKMDInstance *mdInstance;
  59. NSSCKFWInstance *fwInstance;
  60. };
  61. /*
  62. * nssCKFWMechanism_Create
  63. *
  64. */
  65. NSS_IMPLEMENT NSSCKFWMechanism *
  66. nssCKFWMechanism_Create(
  67. NSSCKMDMechanism *mdMechanism,
  68. NSSCKMDToken *mdToken,
  69. NSSCKFWToken *fwToken,
  70. NSSCKMDInstance *mdInstance,
  71. NSSCKFWInstance *fwInstance)
  72. {
  73. NSSCKFWMechanism *fwMechanism;
  74. fwMechanism = nss_ZNEW(NULL, NSSCKFWMechanism);
  75. if (!fwMechanism) {
  76. return (NSSCKFWMechanism *)NULL;
  77. }
  78. fwMechanism->mdMechanism = mdMechanism;
  79. fwMechanism->mdToken = mdToken;
  80. fwMechanism->fwToken = fwToken;
  81. fwMechanism->mdInstance = mdInstance;
  82. fwMechanism->fwInstance = fwInstance;
  83. return fwMechanism;
  84. }
  85. /*
  86. * nssCKFWMechanism_Destroy
  87. *
  88. */
  89. NSS_IMPLEMENT void
  90. nssCKFWMechanism_Destroy(
  91. NSSCKFWMechanism *fwMechanism)
  92. {
  93. /* destroy any fw resources held by nssCKFWMechanism (currently none) */
  94. if (fwMechanism->mdMechanism->Destroy) {
  95. /* destroys it's parent as well */
  96. fwMechanism->mdMechanism->Destroy(
  97. fwMechanism->mdMechanism,
  98. fwMechanism,
  99. fwMechanism->mdInstance,
  100. fwMechanism->fwInstance);
  101. }
  102. /* if the Destroy function wasn't supplied, then the mechanism is 'static',
  103. * and there is nothing to destroy */
  104. return;
  105. }
  106. /*
  107. * nssCKFWMechanism_GetMDMechanism
  108. *
  109. */
  110. NSS_IMPLEMENT NSSCKMDMechanism *
  111. nssCKFWMechanism_GetMDMechanism(
  112. NSSCKFWMechanism *fwMechanism)
  113. {
  114. return fwMechanism->mdMechanism;
  115. }
  116. /*
  117. * nssCKFWMechanism_GetMinKeySize
  118. *
  119. */
  120. NSS_IMPLEMENT CK_ULONG
  121. nssCKFWMechanism_GetMinKeySize(
  122. NSSCKFWMechanism *fwMechanism,
  123. CK_RV *pError)
  124. {
  125. if (!fwMechanism->mdMechanism->GetMinKeySize) {
  126. return 0;
  127. }
  128. return fwMechanism->mdMechanism->GetMinKeySize(fwMechanism->mdMechanism,
  129. fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken,
  130. fwMechanism->mdInstance, fwMechanism->fwInstance, pError);
  131. }
  132. /*
  133. * nssCKFWMechanism_GetMaxKeySize
  134. *
  135. */
  136. NSS_IMPLEMENT CK_ULONG
  137. nssCKFWMechanism_GetMaxKeySize(
  138. NSSCKFWMechanism *fwMechanism,
  139. CK_RV *pError)
  140. {
  141. if (!fwMechanism->mdMechanism->GetMaxKeySize) {
  142. return 0;
  143. }
  144. return fwMechanism->mdMechanism->GetMaxKeySize(fwMechanism->mdMechanism,
  145. fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken,
  146. fwMechanism->mdInstance, fwMechanism->fwInstance, pError);
  147. }
  148. /*
  149. * nssCKFWMechanism_GetInHardware
  150. *
  151. */
  152. NSS_IMPLEMENT CK_BBOOL
  153. nssCKFWMechanism_GetInHardware(
  154. NSSCKFWMechanism *fwMechanism,
  155. CK_RV *pError)
  156. {
  157. if (!fwMechanism->mdMechanism->GetInHardware) {
  158. return CK_FALSE;
  159. }
  160. return fwMechanism->mdMechanism->GetInHardware(fwMechanism->mdMechanism,
  161. fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken,
  162. fwMechanism->mdInstance, fwMechanism->fwInstance, pError);
  163. }
  164. /*
  165. * the following are determined automatically by which of the cryptographic
  166. * functions are defined for this mechanism.
  167. */
  168. /*
  169. * nssCKFWMechanism_GetCanEncrypt
  170. *
  171. */
  172. NSS_EXTERN CK_BBOOL
  173. nssCKFWMechanism_GetCanEncrypt(
  174. NSSCKFWMechanism *fwMechanism,
  175. CK_RV *pError)
  176. {
  177. if (!fwMechanism->mdMechanism->EncryptInit) {
  178. return CK_FALSE;
  179. }
  180. return CK_TRUE;
  181. }
  182. /*
  183. * nssCKFWMechanism_GetCanDecrypt
  184. *
  185. */
  186. NSS_EXTERN CK_BBOOL
  187. nssCKFWMechanism_GetCanDecrypt(
  188. NSSCKFWMechanism *fwMechanism,
  189. CK_RV *pError)
  190. {
  191. if (!fwMechanism->mdMechanism->DecryptInit) {
  192. return CK_FALSE;
  193. }
  194. return CK_TRUE;
  195. }
  196. /*
  197. * nssCKFWMechanism_GetCanDigest
  198. *
  199. */
  200. NSS_EXTERN CK_BBOOL
  201. nssCKFWMechanism_GetCanDigest(
  202. NSSCKFWMechanism *fwMechanism,
  203. CK_RV *pError)
  204. {
  205. if (!fwMechanism->mdMechanism->DigestInit) {
  206. return CK_FALSE;
  207. }
  208. return CK_TRUE;
  209. }
  210. /*
  211. * nssCKFWMechanism_GetCanSign
  212. *
  213. */
  214. NSS_EXTERN CK_BBOOL
  215. nssCKFWMechanism_GetCanSign(
  216. NSSCKFWMechanism *fwMechanism,
  217. CK_RV *pError)
  218. {
  219. if (!fwMechanism->mdMechanism->SignInit) {
  220. return CK_FALSE;
  221. }
  222. return CK_TRUE;
  223. }
  224. /*
  225. * nssCKFWMechanism_GetCanSignRecover
  226. *
  227. */
  228. NSS_EXTERN CK_BBOOL
  229. nssCKFWMechanism_GetCanSignRecover(
  230. NSSCKFWMechanism *fwMechanism,
  231. CK_RV *pError)
  232. {
  233. if (!fwMechanism->mdMechanism->SignRecoverInit) {
  234. return CK_FALSE;
  235. }
  236. return CK_TRUE;
  237. }
  238. /*
  239. * nssCKFWMechanism_GetCanVerify
  240. *
  241. */
  242. NSS_EXTERN CK_BBOOL
  243. nssCKFWMechanism_GetCanVerify(
  244. NSSCKFWMechanism *fwMechanism,
  245. CK_RV *pError)
  246. {
  247. if (!fwMechanism->mdMechanism->VerifyInit) {
  248. return CK_FALSE;
  249. }
  250. return CK_TRUE;
  251. }
  252. /*
  253. * nssCKFWMechanism_GetCanVerifyRecover
  254. *
  255. */
  256. NSS_EXTERN CK_BBOOL
  257. nssCKFWMechanism_GetCanVerifyRecover(
  258. NSSCKFWMechanism *fwMechanism,
  259. CK_RV *pError)
  260. {
  261. if (!fwMechanism->mdMechanism->VerifyRecoverInit) {
  262. return CK_FALSE;
  263. }
  264. return CK_TRUE;
  265. }
  266. /*
  267. * nssCKFWMechanism_GetCanGenerate
  268. *
  269. */
  270. NSS_EXTERN CK_BBOOL
  271. nssCKFWMechanism_GetCanGenerate(
  272. NSSCKFWMechanism *fwMechanism,
  273. CK_RV *pError)
  274. {
  275. if (!fwMechanism->mdMechanism->GenerateKey) {
  276. return CK_FALSE;
  277. }
  278. return CK_TRUE;
  279. }
  280. /*
  281. * nssCKFWMechanism_GetCanGenerateKeyPair
  282. *
  283. */
  284. NSS_EXTERN CK_BBOOL
  285. nssCKFWMechanism_GetCanGenerateKeyPair(
  286. NSSCKFWMechanism *fwMechanism,
  287. CK_RV *pError)
  288. {
  289. if (!fwMechanism->mdMechanism->GenerateKeyPair) {
  290. return CK_FALSE;
  291. }
  292. return CK_TRUE;
  293. }
  294. /*
  295. * nssCKFWMechanism_GetCanUnwrap
  296. *
  297. */
  298. NSS_EXTERN CK_BBOOL
  299. nssCKFWMechanism_GetCanUnwrap(
  300. NSSCKFWMechanism *fwMechanism,
  301. CK_RV *pError)
  302. {
  303. if (!fwMechanism->mdMechanism->UnwrapKey) {
  304. return CK_FALSE;
  305. }
  306. return CK_TRUE;
  307. }
  308. /*
  309. * nssCKFWMechanism_GetCanWrap
  310. *
  311. */
  312. NSS_EXTERN CK_BBOOL
  313. nssCKFWMechanism_GetCanWrap(
  314. NSSCKFWMechanism *fwMechanism,
  315. CK_RV *pError)
  316. {
  317. if (!fwMechanism->mdMechanism->WrapKey) {
  318. return CK_FALSE;
  319. }
  320. return CK_TRUE;
  321. }
  322. /*
  323. * nssCKFWMechanism_GetCanDerive
  324. *
  325. */
  326. NSS_EXTERN CK_BBOOL
  327. nssCKFWMechanism_GetCanDerive(
  328. NSSCKFWMechanism *fwMechanism,
  329. CK_RV *pError)
  330. {
  331. if (!fwMechanism->mdMechanism->DeriveKey) {
  332. return CK_FALSE;
  333. }
  334. return CK_TRUE;
  335. }
  336. /*
  337. * These are the actual crypto operations
  338. */
  339. /*
  340. * nssCKFWMechanism_EncryptInit
  341. * Start an encryption session.
  342. */
  343. NSS_EXTERN CK_RV
  344. nssCKFWMechanism_EncryptInit(
  345. NSSCKFWMechanism *fwMechanism,
  346. CK_MECHANISM *pMechanism,
  347. NSSCKFWSession *fwSession,
  348. NSSCKFWObject *fwObject)
  349. {
  350. NSSCKFWCryptoOperation *fwOperation;
  351. NSSCKMDCryptoOperation *mdOperation;
  352. NSSCKMDSession *mdSession;
  353. NSSCKMDObject *mdObject;
  354. CK_RV error = CKR_OK;
  355. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  356. NSSCKFWCryptoOperationState_EncryptDecrypt);
  357. if (fwOperation) {
  358. return CKR_OPERATION_ACTIVE;
  359. }
  360. if (!fwMechanism->mdMechanism->EncryptInit) {
  361. return CKR_FUNCTION_FAILED;
  362. }
  363. mdSession = nssCKFWSession_GetMDSession(fwSession);
  364. mdObject = nssCKFWObject_GetMDObject(fwObject);
  365. mdOperation = fwMechanism->mdMechanism->EncryptInit(
  366. fwMechanism->mdMechanism,
  367. fwMechanism,
  368. pMechanism,
  369. mdSession,
  370. fwSession,
  371. fwMechanism->mdToken,
  372. fwMechanism->fwToken,
  373. fwMechanism->mdInstance,
  374. fwMechanism->fwInstance,
  375. mdObject,
  376. fwObject,
  377. &error);
  378. if (!mdOperation) {
  379. goto loser;
  380. }
  381. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  382. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  383. fwMechanism->mdInstance, fwMechanism->fwInstance,
  384. NSSCKFWCryptoOperationType_Encrypt, &error);
  385. if (fwOperation) {
  386. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  387. NSSCKFWCryptoOperationState_EncryptDecrypt);
  388. }
  389. loser:
  390. return error;
  391. }
  392. /*
  393. * nssCKFWMechanism_DecryptInit
  394. * Start an encryption session.
  395. */
  396. NSS_EXTERN CK_RV
  397. nssCKFWMechanism_DecryptInit(
  398. NSSCKFWMechanism *fwMechanism,
  399. CK_MECHANISM *pMechanism,
  400. NSSCKFWSession *fwSession,
  401. NSSCKFWObject *fwObject)
  402. {
  403. NSSCKFWCryptoOperation *fwOperation;
  404. NSSCKMDCryptoOperation *mdOperation;
  405. NSSCKMDSession *mdSession;
  406. NSSCKMDObject *mdObject;
  407. CK_RV error = CKR_OK;
  408. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  409. NSSCKFWCryptoOperationState_EncryptDecrypt);
  410. if (fwOperation) {
  411. return CKR_OPERATION_ACTIVE;
  412. }
  413. if (!fwMechanism->mdMechanism->DecryptInit) {
  414. return CKR_FUNCTION_FAILED;
  415. }
  416. mdSession = nssCKFWSession_GetMDSession(fwSession);
  417. mdObject = nssCKFWObject_GetMDObject(fwObject);
  418. mdOperation = fwMechanism->mdMechanism->DecryptInit(
  419. fwMechanism->mdMechanism,
  420. fwMechanism,
  421. pMechanism,
  422. mdSession,
  423. fwSession,
  424. fwMechanism->mdToken,
  425. fwMechanism->fwToken,
  426. fwMechanism->mdInstance,
  427. fwMechanism->fwInstance,
  428. mdObject,
  429. fwObject,
  430. &error);
  431. if (!mdOperation) {
  432. goto loser;
  433. }
  434. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  435. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  436. fwMechanism->mdInstance, fwMechanism->fwInstance,
  437. NSSCKFWCryptoOperationType_Decrypt, &error);
  438. if (fwOperation) {
  439. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  440. NSSCKFWCryptoOperationState_EncryptDecrypt);
  441. }
  442. loser:
  443. return error;
  444. }
  445. /*
  446. * nssCKFWMechanism_DigestInit
  447. * Start an encryption session.
  448. */
  449. NSS_EXTERN CK_RV
  450. nssCKFWMechanism_DigestInit(
  451. NSSCKFWMechanism *fwMechanism,
  452. CK_MECHANISM *pMechanism,
  453. NSSCKFWSession *fwSession)
  454. {
  455. NSSCKFWCryptoOperation *fwOperation;
  456. NSSCKMDCryptoOperation *mdOperation;
  457. NSSCKMDSession *mdSession;
  458. CK_RV error = CKR_OK;
  459. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  460. NSSCKFWCryptoOperationState_Digest);
  461. if (fwOperation) {
  462. return CKR_OPERATION_ACTIVE;
  463. }
  464. if (!fwMechanism->mdMechanism->DigestInit) {
  465. return CKR_FUNCTION_FAILED;
  466. }
  467. mdSession = nssCKFWSession_GetMDSession(fwSession);
  468. mdOperation = fwMechanism->mdMechanism->DigestInit(
  469. fwMechanism->mdMechanism,
  470. fwMechanism,
  471. pMechanism,
  472. mdSession,
  473. fwSession,
  474. fwMechanism->mdToken,
  475. fwMechanism->fwToken,
  476. fwMechanism->mdInstance,
  477. fwMechanism->fwInstance,
  478. &error);
  479. if (!mdOperation) {
  480. goto loser;
  481. }
  482. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  483. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  484. fwMechanism->mdInstance, fwMechanism->fwInstance,
  485. NSSCKFWCryptoOperationType_Digest, &error);
  486. if (fwOperation) {
  487. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  488. NSSCKFWCryptoOperationState_Digest);
  489. }
  490. loser:
  491. return error;
  492. }
  493. /*
  494. * nssCKFWMechanism_SignInit
  495. * Start an encryption session.
  496. */
  497. NSS_EXTERN CK_RV
  498. nssCKFWMechanism_SignInit(
  499. NSSCKFWMechanism *fwMechanism,
  500. CK_MECHANISM *pMechanism,
  501. NSSCKFWSession *fwSession,
  502. NSSCKFWObject *fwObject)
  503. {
  504. NSSCKFWCryptoOperation *fwOperation;
  505. NSSCKMDCryptoOperation *mdOperation;
  506. NSSCKMDSession *mdSession;
  507. NSSCKMDObject *mdObject;
  508. CK_RV error = CKR_OK;
  509. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  510. NSSCKFWCryptoOperationState_SignVerify);
  511. if (fwOperation) {
  512. return CKR_OPERATION_ACTIVE;
  513. }
  514. if (!fwMechanism->mdMechanism->SignInit) {
  515. return CKR_FUNCTION_FAILED;
  516. }
  517. mdSession = nssCKFWSession_GetMDSession(fwSession);
  518. mdObject = nssCKFWObject_GetMDObject(fwObject);
  519. mdOperation = fwMechanism->mdMechanism->SignInit(
  520. fwMechanism->mdMechanism,
  521. fwMechanism,
  522. pMechanism,
  523. mdSession,
  524. fwSession,
  525. fwMechanism->mdToken,
  526. fwMechanism->fwToken,
  527. fwMechanism->mdInstance,
  528. fwMechanism->fwInstance,
  529. mdObject,
  530. fwObject,
  531. &error);
  532. if (!mdOperation) {
  533. goto loser;
  534. }
  535. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  536. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  537. fwMechanism->mdInstance, fwMechanism->fwInstance,
  538. NSSCKFWCryptoOperationType_Sign, &error);
  539. if (fwOperation) {
  540. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  541. NSSCKFWCryptoOperationState_SignVerify);
  542. }
  543. loser:
  544. return error;
  545. }
  546. /*
  547. * nssCKFWMechanism_VerifyInit
  548. * Start an encryption session.
  549. */
  550. NSS_EXTERN CK_RV
  551. nssCKFWMechanism_VerifyInit(
  552. NSSCKFWMechanism *fwMechanism,
  553. CK_MECHANISM *pMechanism,
  554. NSSCKFWSession *fwSession,
  555. NSSCKFWObject *fwObject)
  556. {
  557. NSSCKFWCryptoOperation *fwOperation;
  558. NSSCKMDCryptoOperation *mdOperation;
  559. NSSCKMDSession *mdSession;
  560. NSSCKMDObject *mdObject;
  561. CK_RV error = CKR_OK;
  562. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  563. NSSCKFWCryptoOperationState_SignVerify);
  564. if (fwOperation) {
  565. return CKR_OPERATION_ACTIVE;
  566. }
  567. if (!fwMechanism->mdMechanism->VerifyInit) {
  568. return CKR_FUNCTION_FAILED;
  569. }
  570. mdSession = nssCKFWSession_GetMDSession(fwSession);
  571. mdObject = nssCKFWObject_GetMDObject(fwObject);
  572. mdOperation = fwMechanism->mdMechanism->VerifyInit(
  573. fwMechanism->mdMechanism,
  574. fwMechanism,
  575. pMechanism,
  576. mdSession,
  577. fwSession,
  578. fwMechanism->mdToken,
  579. fwMechanism->fwToken,
  580. fwMechanism->mdInstance,
  581. fwMechanism->fwInstance,
  582. mdObject,
  583. fwObject,
  584. &error);
  585. if (!mdOperation) {
  586. goto loser;
  587. }
  588. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  589. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  590. fwMechanism->mdInstance, fwMechanism->fwInstance,
  591. NSSCKFWCryptoOperationType_Verify, &error);
  592. if (fwOperation) {
  593. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  594. NSSCKFWCryptoOperationState_SignVerify);
  595. }
  596. loser:
  597. return error;
  598. }
  599. /*
  600. * nssCKFWMechanism_SignRecoverInit
  601. * Start an encryption session.
  602. */
  603. NSS_EXTERN CK_RV
  604. nssCKFWMechanism_SignRecoverInit(
  605. NSSCKFWMechanism *fwMechanism,
  606. CK_MECHANISM *pMechanism,
  607. NSSCKFWSession *fwSession,
  608. NSSCKFWObject *fwObject)
  609. {
  610. NSSCKFWCryptoOperation *fwOperation;
  611. NSSCKMDCryptoOperation *mdOperation;
  612. NSSCKMDSession *mdSession;
  613. NSSCKMDObject *mdObject;
  614. CK_RV error = CKR_OK;
  615. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  616. NSSCKFWCryptoOperationState_SignVerify);
  617. if (fwOperation) {
  618. return CKR_OPERATION_ACTIVE;
  619. }
  620. if (!fwMechanism->mdMechanism->SignRecoverInit) {
  621. return CKR_FUNCTION_FAILED;
  622. }
  623. mdSession = nssCKFWSession_GetMDSession(fwSession);
  624. mdObject = nssCKFWObject_GetMDObject(fwObject);
  625. mdOperation = fwMechanism->mdMechanism->SignRecoverInit(
  626. fwMechanism->mdMechanism,
  627. fwMechanism,
  628. pMechanism,
  629. mdSession,
  630. fwSession,
  631. fwMechanism->mdToken,
  632. fwMechanism->fwToken,
  633. fwMechanism->mdInstance,
  634. fwMechanism->fwInstance,
  635. mdObject,
  636. fwObject,
  637. &error);
  638. if (!mdOperation) {
  639. goto loser;
  640. }
  641. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  642. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  643. fwMechanism->mdInstance, fwMechanism->fwInstance,
  644. NSSCKFWCryptoOperationType_SignRecover, &error);
  645. if (fwOperation) {
  646. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  647. NSSCKFWCryptoOperationState_SignVerify);
  648. }
  649. loser:
  650. return error;
  651. }
  652. /*
  653. * nssCKFWMechanism_VerifyRecoverInit
  654. * Start an encryption session.
  655. */
  656. NSS_EXTERN CK_RV
  657. nssCKFWMechanism_VerifyRecoverInit(
  658. NSSCKFWMechanism *fwMechanism,
  659. CK_MECHANISM *pMechanism,
  660. NSSCKFWSession *fwSession,
  661. NSSCKFWObject *fwObject)
  662. {
  663. NSSCKFWCryptoOperation *fwOperation;
  664. NSSCKMDCryptoOperation *mdOperation;
  665. NSSCKMDSession *mdSession;
  666. NSSCKMDObject *mdObject;
  667. CK_RV error = CKR_OK;
  668. fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession,
  669. NSSCKFWCryptoOperationState_SignVerify);
  670. if (fwOperation) {
  671. return CKR_OPERATION_ACTIVE;
  672. }
  673. if (!fwMechanism->mdMechanism->VerifyRecoverInit) {
  674. return CKR_FUNCTION_FAILED;
  675. }
  676. mdSession = nssCKFWSession_GetMDSession(fwSession);
  677. mdObject = nssCKFWObject_GetMDObject(fwObject);
  678. mdOperation = fwMechanism->mdMechanism->VerifyRecoverInit(
  679. fwMechanism->mdMechanism,
  680. fwMechanism,
  681. pMechanism,
  682. mdSession,
  683. fwSession,
  684. fwMechanism->mdToken,
  685. fwMechanism->fwToken,
  686. fwMechanism->mdInstance,
  687. fwMechanism->fwInstance,
  688. mdObject,
  689. fwObject,
  690. &error);
  691. if (!mdOperation) {
  692. goto loser;
  693. }
  694. fwOperation = nssCKFWCryptoOperation_Create(mdOperation,
  695. mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken,
  696. fwMechanism->mdInstance, fwMechanism->fwInstance,
  697. NSSCKFWCryptoOperationType_VerifyRecover, &error);
  698. if (fwOperation) {
  699. nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation,
  700. NSSCKFWCryptoOperationState_SignVerify);
  701. }
  702. loser:
  703. return error;
  704. }
  705. /*
  706. * nssCKFWMechanism_GenerateKey
  707. */
  708. NSS_EXTERN NSSCKFWObject *
  709. nssCKFWMechanism_GenerateKey(
  710. NSSCKFWMechanism *fwMechanism,
  711. CK_MECHANISM_PTR pMechanism,
  712. NSSCKFWSession *fwSession,
  713. CK_ATTRIBUTE_PTR pTemplate,
  714. CK_ULONG ulAttributeCount,
  715. CK_RV *pError)
  716. {
  717. NSSCKMDSession *mdSession;
  718. NSSCKMDObject *mdObject;
  719. NSSCKFWObject *fwObject = NULL;
  720. NSSArena *arena;
  721. if (!fwMechanism->mdMechanism->GenerateKey) {
  722. *pError = CKR_FUNCTION_FAILED;
  723. return (NSSCKFWObject *)NULL;
  724. }
  725. arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError);
  726. if (!arena) {
  727. if (CKR_OK == *pError) {
  728. *pError = CKR_GENERAL_ERROR;
  729. }
  730. return (NSSCKFWObject *)NULL;
  731. }
  732. mdSession = nssCKFWSession_GetMDSession(fwSession);
  733. mdObject = fwMechanism->mdMechanism->GenerateKey(
  734. fwMechanism->mdMechanism,
  735. fwMechanism,
  736. pMechanism,
  737. mdSession,
  738. fwSession,
  739. fwMechanism->mdToken,
  740. fwMechanism->fwToken,
  741. fwMechanism->mdInstance,
  742. fwMechanism->fwInstance,
  743. pTemplate,
  744. ulAttributeCount,
  745. pError);
  746. if (!mdObject) {
  747. return (NSSCKFWObject *)NULL;
  748. }
  749. fwObject = nssCKFWObject_Create(arena, mdObject,
  750. fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError);
  751. return fwObject;
  752. }
  753. /*
  754. * nssCKFWMechanism_GenerateKeyPair
  755. */
  756. NSS_EXTERN CK_RV
  757. nssCKFWMechanism_GenerateKeyPair(
  758. NSSCKFWMechanism *fwMechanism,
  759. CK_MECHANISM_PTR pMechanism,
  760. NSSCKFWSession *fwSession,
  761. CK_ATTRIBUTE_PTR pPublicKeyTemplate,
  762. CK_ULONG ulPublicKeyAttributeCount,
  763. CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
  764. CK_ULONG ulPrivateKeyAttributeCount,
  765. NSSCKFWObject **fwPublicKeyObject,
  766. NSSCKFWObject **fwPrivateKeyObject)
  767. {
  768. NSSCKMDSession *mdSession;
  769. NSSCKMDObject *mdPublicKeyObject;
  770. NSSCKMDObject *mdPrivateKeyObject;
  771. NSSArena *arena;
  772. CK_RV error = CKR_OK;
  773. if (!fwMechanism->mdMechanism->GenerateKeyPair) {
  774. return CKR_FUNCTION_FAILED;
  775. }
  776. arena = nssCKFWToken_GetArena(fwMechanism->fwToken, &error);
  777. if (!arena) {
  778. if (CKR_OK == error) {
  779. error = CKR_GENERAL_ERROR;
  780. }
  781. return error;
  782. }
  783. mdSession = nssCKFWSession_GetMDSession(fwSession);
  784. error = fwMechanism->mdMechanism->GenerateKeyPair(
  785. fwMechanism->mdMechanism,
  786. fwMechanism,
  787. pMechanism,
  788. mdSession,
  789. fwSession,
  790. fwMechanism->mdToken,
  791. fwMechanism->fwToken,
  792. fwMechanism->mdInstance,
  793. fwMechanism->fwInstance,
  794. pPublicKeyTemplate,
  795. ulPublicKeyAttributeCount,
  796. pPrivateKeyTemplate,
  797. ulPrivateKeyAttributeCount,
  798. &mdPublicKeyObject,
  799. &mdPrivateKeyObject);
  800. if (CKR_OK != error) {
  801. return error;
  802. }
  803. *fwPublicKeyObject = nssCKFWObject_Create(arena, mdPublicKeyObject,
  804. fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error);
  805. if (!*fwPublicKeyObject) {
  806. return error;
  807. }
  808. *fwPrivateKeyObject = nssCKFWObject_Create(arena, mdPrivateKeyObject,
  809. fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error);
  810. return error;
  811. }
  812. /*
  813. * nssCKFWMechanism_GetWrapKeyLength
  814. */
  815. NSS_EXTERN CK_ULONG
  816. nssCKFWMechanism_GetWrapKeyLength(
  817. NSSCKFWMechanism *fwMechanism,
  818. CK_MECHANISM_PTR pMechanism,
  819. NSSCKFWSession *fwSession,
  820. NSSCKFWObject *fwWrappingKeyObject,
  821. NSSCKFWObject *fwKeyObject,
  822. CK_RV *pError)
  823. {
  824. NSSCKMDSession *mdSession;
  825. NSSCKMDObject *mdWrappingKeyObject;
  826. NSSCKMDObject *mdKeyObject;
  827. if (!fwMechanism->mdMechanism->WrapKey) {
  828. *pError = CKR_FUNCTION_FAILED;
  829. return (CK_ULONG)0;
  830. }
  831. mdSession = nssCKFWSession_GetMDSession(fwSession);
  832. mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject);
  833. mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject);
  834. return fwMechanism->mdMechanism->GetWrapKeyLength(
  835. fwMechanism->mdMechanism,
  836. fwMechanism,
  837. pMechanism,
  838. mdSession,
  839. fwSession,
  840. fwMechanism->mdToken,
  841. fwMechanism->fwToken,
  842. fwMechanism->mdInstance,
  843. fwMechanism->fwInstance,
  844. mdWrappingKeyObject,
  845. fwWrappingKeyObject,
  846. mdKeyObject,
  847. fwKeyObject,
  848. pError);
  849. }
  850. /*
  851. * nssCKFWMechanism_WrapKey
  852. */
  853. NSS_EXTERN CK_RV
  854. nssCKFWMechanism_WrapKey(
  855. NSSCKFWMechanism *fwMechanism,
  856. CK_MECHANISM_PTR pMechanism,
  857. NSSCKFWSession *fwSession,
  858. NSSCKFWObject *fwWrappingKeyObject,
  859. NSSCKFWObject *fwKeyObject,
  860. NSSItem *wrappedKey)
  861. {
  862. NSSCKMDSession *mdSession;
  863. NSSCKMDObject *mdWrappingKeyObject;
  864. NSSCKMDObject *mdKeyObject;
  865. if (!fwMechanism->mdMechanism->WrapKey) {
  866. return CKR_FUNCTION_FAILED;
  867. }
  868. mdSession = nssCKFWSession_GetMDSession(fwSession);
  869. mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject);
  870. mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject);
  871. return fwMechanism->mdMechanism->WrapKey(
  872. fwMechanism->mdMechanism,
  873. fwMechanism,
  874. pMechanism,
  875. mdSession,
  876. fwSession,
  877. fwMechanism->mdToken,
  878. fwMechanism->fwToken,
  879. fwMechanism->mdInstance,
  880. fwMechanism->fwInstance,
  881. mdWrappingKeyObject,
  882. fwWrappingKeyObject,
  883. mdKeyObject,
  884. fwKeyObject,
  885. wrappedKey);
  886. }
  887. /*
  888. * nssCKFWMechanism_UnwrapKey
  889. */
  890. NSS_EXTERN NSSCKFWObject *
  891. nssCKFWMechanism_UnwrapKey(
  892. NSSCKFWMechanism *fwMechanism,
  893. CK_MECHANISM_PTR pMechanism,
  894. NSSCKFWSession *fwSession,
  895. NSSCKFWObject *fwWrappingKeyObject,
  896. NSSItem *wrappedKey,
  897. CK_ATTRIBUTE_PTR pTemplate,
  898. CK_ULONG ulAttributeCount,
  899. CK_RV *pError)
  900. {
  901. NSSCKMDSession *mdSession;
  902. NSSCKMDObject *mdObject;
  903. NSSCKMDObject *mdWrappingKeyObject;
  904. NSSCKFWObject *fwObject = NULL;
  905. NSSArena *arena;
  906. if (!fwMechanism->mdMechanism->UnwrapKey) {
  907. /* we could simulate UnwrapKey using Decrypt and Create object, but
  908. * 1) it's not clear that would work well, and 2) the low level token
  909. * may want to restrict unwrap key for a reason, so just fail it it
  910. * can't be done */
  911. *pError = CKR_FUNCTION_FAILED;
  912. return (NSSCKFWObject *)NULL;
  913. }
  914. arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError);
  915. if (!arena) {
  916. if (CKR_OK == *pError) {
  917. *pError = CKR_GENERAL_ERROR;
  918. }
  919. return (NSSCKFWObject *)NULL;
  920. }
  921. mdSession = nssCKFWSession_GetMDSession(fwSession);
  922. mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject);
  923. mdObject = fwMechanism->mdMechanism->UnwrapKey(
  924. fwMechanism->mdMechanism,
  925. fwMechanism,
  926. pMechanism,
  927. mdSession,
  928. fwSession,
  929. fwMechanism->mdToken,
  930. fwMechanism->fwToken,
  931. fwMechanism->mdInstance,
  932. fwMechanism->fwInstance,
  933. mdWrappingKeyObject,
  934. fwWrappingKeyObject,
  935. wrappedKey,
  936. pTemplate,
  937. ulAttributeCount,
  938. pError);
  939. if (!mdObject) {
  940. return (NSSCKFWObject *)NULL;
  941. }
  942. fwObject = nssCKFWObject_Create(arena, mdObject,
  943. fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError);
  944. return fwObject;
  945. }
  946. /*
  947. * nssCKFWMechanism_DeriveKey
  948. */
  949. NSS_EXTERN NSSCKFWObject *
  950. nssCKFWMechanism_DeriveKey(
  951. NSSCKFWMechanism *fwMechanism,
  952. CK_MECHANISM_PTR pMechanism,
  953. NSSCKFWSession *fwSession,
  954. NSSCKFWObject *fwBaseKeyObject,
  955. CK_ATTRIBUTE_PTR pTemplate,
  956. CK_ULONG ulAttributeCount,
  957. CK_RV *pError)
  958. {
  959. NSSCKMDSession *mdSession;
  960. NSSCKMDObject *mdObject;
  961. NSSCKMDObject *mdBaseKeyObject;
  962. NSSCKFWObject *fwObject = NULL;
  963. NSSArena *arena;
  964. if (!fwMechanism->mdMechanism->DeriveKey) {
  965. *pError = CKR_FUNCTION_FAILED;
  966. return (NSSCKFWObject *)NULL;
  967. }
  968. arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError);
  969. if (!arena) {
  970. if (CKR_OK == *pError) {
  971. *pError = CKR_GENERAL_ERROR;
  972. }
  973. return (NSSCKFWObject *)NULL;
  974. }
  975. mdSession = nssCKFWSession_GetMDSession(fwSession);
  976. mdBaseKeyObject = nssCKFWObject_GetMDObject(fwBaseKeyObject);
  977. mdObject = fwMechanism->mdMechanism->DeriveKey(
  978. fwMechanism->mdMechanism,
  979. fwMechanism,
  980. pMechanism,
  981. mdSession,
  982. fwSession,
  983. fwMechanism->mdToken,
  984. fwMechanism->fwToken,
  985. fwMechanism->mdInstance,
  986. fwMechanism->fwInstance,
  987. mdBaseKeyObject,
  988. fwBaseKeyObject,
  989. pTemplate,
  990. ulAttributeCount,
  991. pError);
  992. if (!mdObject) {
  993. return (NSSCKFWObject *)NULL;
  994. }
  995. fwObject = nssCKFWObject_Create(arena, mdObject,
  996. fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError);
  997. return fwObject;
  998. }