zcrypt_ccamisc.c 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright IBM Corp. 2019
  4. * Author(s): Harald Freudenberger <freude@linux.ibm.com>
  5. * Ingo Franzki <ifranzki@linux.ibm.com>
  6. *
  7. * Collection of CCA misc functions used by zcrypt and pkey
  8. */
  9. #define KMSG_COMPONENT "zcrypt"
  10. #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/slab.h>
  14. #include <linux/random.h>
  15. #include <asm/zcrypt.h>
  16. #include <asm/pkey.h>
  17. #include "ap_bus.h"
  18. #include "zcrypt_api.h"
  19. #include "zcrypt_debug.h"
  20. #include "zcrypt_msgtype6.h"
  21. #include "zcrypt_ccamisc.h"
  22. /* Size of parameter block used for all cca requests/replies */
  23. #define PARMBSIZE 512
  24. /* Size of vardata block used for some of the cca requests/replies */
  25. #define VARDATASIZE 4096
  26. struct cca_info_list_entry {
  27. struct list_head list;
  28. u16 cardnr;
  29. u16 domain;
  30. struct cca_info info;
  31. };
  32. /* a list with cca_info_list_entry entries */
  33. static LIST_HEAD(cca_info_list);
  34. static DEFINE_SPINLOCK(cca_info_list_lock);
  35. /*
  36. * Simple check if the token is a valid CCA secure AES data key
  37. * token. If keybitsize is given, the bitsize of the key is
  38. * also checked. Returns 0 on success or errno value on failure.
  39. */
  40. int cca_check_secaeskeytoken(debug_info_t *dbg, int dbflvl,
  41. const u8 *token, int keybitsize)
  42. {
  43. struct secaeskeytoken *t = (struct secaeskeytoken *)token;
  44. #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
  45. if (t->type != TOKTYPE_CCA_INTERNAL) {
  46. if (dbg)
  47. DBF("%s token check failed, type 0x%02x != 0x%02x\n",
  48. __func__, (int)t->type, TOKTYPE_CCA_INTERNAL);
  49. return -EINVAL;
  50. }
  51. if (t->version != TOKVER_CCA_AES) {
  52. if (dbg)
  53. DBF("%s token check failed, version 0x%02x != 0x%02x\n",
  54. __func__, (int)t->version, TOKVER_CCA_AES);
  55. return -EINVAL;
  56. }
  57. if (keybitsize > 0 && t->bitsize != keybitsize) {
  58. if (dbg)
  59. DBF("%s token check failed, bitsize %d != %d\n",
  60. __func__, (int)t->bitsize, keybitsize);
  61. return -EINVAL;
  62. }
  63. #undef DBF
  64. return 0;
  65. }
  66. EXPORT_SYMBOL(cca_check_secaeskeytoken);
  67. /*
  68. * Simple check if the token is a valid CCA secure AES cipher key
  69. * token. If keybitsize is given, the bitsize of the key is
  70. * also checked. If checkcpacfexport is enabled, the key is also
  71. * checked for the export flag to allow CPACF export.
  72. * Returns 0 on success or errno value on failure.
  73. */
  74. int cca_check_secaescipherkey(debug_info_t *dbg, int dbflvl,
  75. const u8 *token, int keybitsize,
  76. int checkcpacfexport)
  77. {
  78. struct cipherkeytoken *t = (struct cipherkeytoken *)token;
  79. bool keybitsizeok = true;
  80. #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
  81. if (t->type != TOKTYPE_CCA_INTERNAL) {
  82. if (dbg)
  83. DBF("%s token check failed, type 0x%02x != 0x%02x\n",
  84. __func__, (int)t->type, TOKTYPE_CCA_INTERNAL);
  85. return -EINVAL;
  86. }
  87. if (t->version != TOKVER_CCA_VLSC) {
  88. if (dbg)
  89. DBF("%s token check failed, version 0x%02x != 0x%02x\n",
  90. __func__, (int)t->version, TOKVER_CCA_VLSC);
  91. return -EINVAL;
  92. }
  93. if (t->algtype != 0x02) {
  94. if (dbg)
  95. DBF("%s token check failed, algtype 0x%02x != 0x02\n",
  96. __func__, (int)t->algtype);
  97. return -EINVAL;
  98. }
  99. if (t->keytype != 0x0001) {
  100. if (dbg)
  101. DBF("%s token check failed, keytype 0x%04x != 0x0001\n",
  102. __func__, (int)t->keytype);
  103. return -EINVAL;
  104. }
  105. if (t->plfver != 0x00 && t->plfver != 0x01) {
  106. if (dbg)
  107. DBF("%s token check failed, unknown plfver 0x%02x\n",
  108. __func__, (int)t->plfver);
  109. return -EINVAL;
  110. }
  111. if (t->wpllen != 512 && t->wpllen != 576 && t->wpllen != 640) {
  112. if (dbg)
  113. DBF("%s token check failed, unknown wpllen %d\n",
  114. __func__, (int)t->wpllen);
  115. return -EINVAL;
  116. }
  117. if (keybitsize > 0) {
  118. switch (keybitsize) {
  119. case 128:
  120. if (t->wpllen != (t->plfver ? 640 : 512))
  121. keybitsizeok = false;
  122. break;
  123. case 192:
  124. if (t->wpllen != (t->plfver ? 640 : 576))
  125. keybitsizeok = false;
  126. break;
  127. case 256:
  128. if (t->wpllen != 640)
  129. keybitsizeok = false;
  130. break;
  131. default:
  132. keybitsizeok = false;
  133. break;
  134. }
  135. if (!keybitsizeok) {
  136. if (dbg)
  137. DBF("%s token check failed, bitsize %d\n",
  138. __func__, keybitsize);
  139. return -EINVAL;
  140. }
  141. }
  142. if (checkcpacfexport && !(t->kmf1 & KMF1_XPRT_CPAC)) {
  143. if (dbg)
  144. DBF("%s token check failed, XPRT_CPAC bit is 0\n",
  145. __func__);
  146. return -EINVAL;
  147. }
  148. #undef DBF
  149. return 0;
  150. }
  151. EXPORT_SYMBOL(cca_check_secaescipherkey);
  152. /*
  153. * Simple check if the token is a valid CCA secure ECC private
  154. * key token. Returns 0 on success or errno value on failure.
  155. */
  156. int cca_check_sececckeytoken(debug_info_t *dbg, int dbflvl,
  157. const u8 *token, u32 keysize,
  158. int checkcpacfexport)
  159. {
  160. struct eccprivkeytoken *t = (struct eccprivkeytoken *)token;
  161. #define DBF(...) debug_sprintf_event(dbg, dbflvl, ##__VA_ARGS__)
  162. if (t->type != TOKTYPE_CCA_INTERNAL_PKA) {
  163. if (dbg)
  164. DBF("%s token check failed, type 0x%02x != 0x%02x\n",
  165. __func__, (int)t->type, TOKTYPE_CCA_INTERNAL_PKA);
  166. return -EINVAL;
  167. }
  168. if (t->len > keysize) {
  169. if (dbg)
  170. DBF("%s token check failed, len %d > keysize %u\n",
  171. __func__, (int)t->len, keysize);
  172. return -EINVAL;
  173. }
  174. if (t->secid != 0x20) {
  175. if (dbg)
  176. DBF("%s token check failed, secid 0x%02x != 0x20\n",
  177. __func__, (int)t->secid);
  178. return -EINVAL;
  179. }
  180. if (checkcpacfexport && !(t->kutc & 0x01)) {
  181. if (dbg)
  182. DBF("%s token check failed, XPRTCPAC bit is 0\n",
  183. __func__);
  184. return -EINVAL;
  185. }
  186. #undef DBF
  187. return 0;
  188. }
  189. EXPORT_SYMBOL(cca_check_sececckeytoken);
  190. /*
  191. * Allocate consecutive memory for request CPRB, request param
  192. * block, reply CPRB and reply param block and fill in values
  193. * for the common fields. Returns 0 on success or errno value
  194. * on failure.
  195. */
  196. static int alloc_and_prep_cprbmem(size_t paramblen,
  197. u8 **p_cprb_mem,
  198. struct CPRBX **p_req_cprb,
  199. struct CPRBX **p_rep_cprb)
  200. {
  201. u8 *cprbmem;
  202. size_t cprbplusparamblen = sizeof(struct CPRBX) + paramblen;
  203. struct CPRBX *preqcblk, *prepcblk;
  204. /*
  205. * allocate consecutive memory for request CPRB, request param
  206. * block, reply CPRB and reply param block
  207. */
  208. cprbmem = kcalloc(2, cprbplusparamblen, GFP_KERNEL);
  209. if (!cprbmem)
  210. return -ENOMEM;
  211. preqcblk = (struct CPRBX *)cprbmem;
  212. prepcblk = (struct CPRBX *)(cprbmem + cprbplusparamblen);
  213. /* fill request cprb struct */
  214. preqcblk->cprb_len = sizeof(struct CPRBX);
  215. preqcblk->cprb_ver_id = 0x02;
  216. memcpy(preqcblk->func_id, "T2", 2);
  217. preqcblk->rpl_msgbl = cprbplusparamblen;
  218. if (paramblen) {
  219. preqcblk->req_parmb =
  220. ((u8 __user *)preqcblk) + sizeof(struct CPRBX);
  221. preqcblk->rpl_parmb =
  222. ((u8 __user *)prepcblk) + sizeof(struct CPRBX);
  223. }
  224. *p_cprb_mem = cprbmem;
  225. *p_req_cprb = preqcblk;
  226. *p_rep_cprb = prepcblk;
  227. return 0;
  228. }
  229. /*
  230. * Free the cprb memory allocated with the function above.
  231. * If the scrub value is not zero, the memory is filled
  232. * with zeros before freeing (useful if there was some
  233. * clear key material in there).
  234. */
  235. static void free_cprbmem(void *mem, size_t paramblen, int scrub)
  236. {
  237. if (scrub)
  238. memzero_explicit(mem, 2 * (sizeof(struct CPRBX) + paramblen));
  239. kfree(mem);
  240. }
  241. /*
  242. * Helper function to prepare the xcrb struct
  243. */
  244. static inline void prep_xcrb(struct ica_xcRB *pxcrb,
  245. u16 cardnr,
  246. struct CPRBX *preqcblk,
  247. struct CPRBX *prepcblk)
  248. {
  249. memset(pxcrb, 0, sizeof(*pxcrb));
  250. pxcrb->agent_ID = 0x4341; /* 'CA' */
  251. pxcrb->user_defined = (cardnr == 0xFFFF ? AUTOSELECT : cardnr);
  252. pxcrb->request_control_blk_length =
  253. preqcblk->cprb_len + preqcblk->req_parml;
  254. pxcrb->request_control_blk_addr = (void __user *)preqcblk;
  255. pxcrb->reply_control_blk_length = preqcblk->rpl_msgbl;
  256. pxcrb->reply_control_blk_addr = (void __user *)prepcblk;
  257. }
  258. /*
  259. * Generate (random) CCA AES DATA secure key.
  260. */
  261. int cca_genseckey(u16 cardnr, u16 domain,
  262. u32 keybitsize, u8 *seckey)
  263. {
  264. int i, rc, keysize;
  265. int seckeysize;
  266. u8 *mem, *ptr;
  267. struct CPRBX *preqcblk, *prepcblk;
  268. struct ica_xcRB xcrb;
  269. struct kgreqparm {
  270. u8 subfunc_code[2];
  271. u16 rule_array_len;
  272. struct lv1 {
  273. u16 len;
  274. char key_form[8];
  275. char key_length[8];
  276. char key_type1[8];
  277. char key_type2[8];
  278. } lv1;
  279. struct lv2 {
  280. u16 len;
  281. struct keyid {
  282. u16 len;
  283. u16 attr;
  284. u8 data[SECKEYBLOBSIZE];
  285. } keyid[6];
  286. } lv2;
  287. } __packed * preqparm;
  288. struct kgrepparm {
  289. u8 subfunc_code[2];
  290. u16 rule_array_len;
  291. struct lv3 {
  292. u16 len;
  293. u16 keyblocklen;
  294. struct {
  295. u16 toklen;
  296. u16 tokattr;
  297. u8 tok[];
  298. /* ... some more data ... */
  299. } keyblock;
  300. } lv3;
  301. } __packed * prepparm;
  302. /* get already prepared memory for 2 cprbs with param block each */
  303. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  304. if (rc)
  305. return rc;
  306. /* fill request cprb struct */
  307. preqcblk->domain = domain;
  308. /* fill request cprb param block with KG request */
  309. preqparm = (struct kgreqparm __force *)preqcblk->req_parmb;
  310. memcpy(preqparm->subfunc_code, "KG", 2);
  311. preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
  312. preqparm->lv1.len = sizeof(struct lv1);
  313. memcpy(preqparm->lv1.key_form, "OP ", 8);
  314. switch (keybitsize) {
  315. case PKEY_SIZE_AES_128:
  316. case PKEY_KEYTYPE_AES_128: /* older ioctls used this */
  317. keysize = 16;
  318. memcpy(preqparm->lv1.key_length, "KEYLN16 ", 8);
  319. break;
  320. case PKEY_SIZE_AES_192:
  321. case PKEY_KEYTYPE_AES_192: /* older ioctls used this */
  322. keysize = 24;
  323. memcpy(preqparm->lv1.key_length, "KEYLN24 ", 8);
  324. break;
  325. case PKEY_SIZE_AES_256:
  326. case PKEY_KEYTYPE_AES_256: /* older ioctls used this */
  327. keysize = 32;
  328. memcpy(preqparm->lv1.key_length, "KEYLN32 ", 8);
  329. break;
  330. default:
  331. ZCRYPT_DBF_ERR("%s unknown/unsupported keybitsize %d\n",
  332. __func__, keybitsize);
  333. rc = -EINVAL;
  334. goto out;
  335. }
  336. memcpy(preqparm->lv1.key_type1, "AESDATA ", 8);
  337. preqparm->lv2.len = sizeof(struct lv2);
  338. for (i = 0; i < 6; i++) {
  339. preqparm->lv2.keyid[i].len = sizeof(struct keyid);
  340. preqparm->lv2.keyid[i].attr = (i == 2 ? 0x30 : 0x10);
  341. }
  342. preqcblk->req_parml = sizeof(struct kgreqparm);
  343. /* fill xcrb struct */
  344. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  345. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  346. rc = zcrypt_send_cprb(&xcrb);
  347. if (rc) {
  348. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, errno %d\n",
  349. __func__, (int)cardnr, (int)domain, rc);
  350. goto out;
  351. }
  352. /* check response returncode and reasoncode */
  353. if (prepcblk->ccp_rtcode != 0) {
  354. ZCRYPT_DBF_ERR("%s secure key generate failure, card response %d/%d\n",
  355. __func__,
  356. (int)prepcblk->ccp_rtcode,
  357. (int)prepcblk->ccp_rscode);
  358. rc = -EIO;
  359. goto out;
  360. }
  361. /* process response cprb param block */
  362. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  363. prepcblk->rpl_parmb = (u8 __user *)ptr;
  364. prepparm = (struct kgrepparm *)ptr;
  365. /* check length of the returned secure key token */
  366. seckeysize = prepparm->lv3.keyblock.toklen
  367. - sizeof(prepparm->lv3.keyblock.toklen)
  368. - sizeof(prepparm->lv3.keyblock.tokattr);
  369. if (seckeysize != SECKEYBLOBSIZE) {
  370. ZCRYPT_DBF_ERR("%s secure token size mismatch %d != %d bytes\n",
  371. __func__, seckeysize, SECKEYBLOBSIZE);
  372. rc = -EIO;
  373. goto out;
  374. }
  375. /* check secure key token */
  376. rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
  377. prepparm->lv3.keyblock.tok, 8 * keysize);
  378. if (rc) {
  379. rc = -EIO;
  380. goto out;
  381. }
  382. /* copy the generated secure key token */
  383. memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
  384. out:
  385. free_cprbmem(mem, PARMBSIZE, 0);
  386. return rc;
  387. }
  388. EXPORT_SYMBOL(cca_genseckey);
  389. /*
  390. * Generate an CCA AES DATA secure key with given key value.
  391. */
  392. int cca_clr2seckey(u16 cardnr, u16 domain, u32 keybitsize,
  393. const u8 *clrkey, u8 *seckey)
  394. {
  395. int rc, keysize, seckeysize;
  396. u8 *mem, *ptr;
  397. struct CPRBX *preqcblk, *prepcblk;
  398. struct ica_xcRB xcrb;
  399. struct cmreqparm {
  400. u8 subfunc_code[2];
  401. u16 rule_array_len;
  402. char rule_array[8];
  403. struct lv1 {
  404. u16 len;
  405. u8 clrkey[];
  406. } lv1;
  407. /* followed by struct lv2 */
  408. } __packed * preqparm;
  409. struct lv2 {
  410. u16 len;
  411. struct keyid {
  412. u16 len;
  413. u16 attr;
  414. u8 data[SECKEYBLOBSIZE];
  415. } keyid;
  416. } __packed * plv2;
  417. struct cmrepparm {
  418. u8 subfunc_code[2];
  419. u16 rule_array_len;
  420. struct lv3 {
  421. u16 len;
  422. u16 keyblocklen;
  423. struct {
  424. u16 toklen;
  425. u16 tokattr;
  426. u8 tok[];
  427. /* ... some more data ... */
  428. } keyblock;
  429. } lv3;
  430. } __packed * prepparm;
  431. /* get already prepared memory for 2 cprbs with param block each */
  432. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  433. if (rc)
  434. return rc;
  435. /* fill request cprb struct */
  436. preqcblk->domain = domain;
  437. /* fill request cprb param block with CM request */
  438. preqparm = (struct cmreqparm __force *)preqcblk->req_parmb;
  439. memcpy(preqparm->subfunc_code, "CM", 2);
  440. memcpy(preqparm->rule_array, "AES ", 8);
  441. preqparm->rule_array_len =
  442. sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
  443. switch (keybitsize) {
  444. case PKEY_SIZE_AES_128:
  445. case PKEY_KEYTYPE_AES_128: /* older ioctls used this */
  446. keysize = 16;
  447. break;
  448. case PKEY_SIZE_AES_192:
  449. case PKEY_KEYTYPE_AES_192: /* older ioctls used this */
  450. keysize = 24;
  451. break;
  452. case PKEY_SIZE_AES_256:
  453. case PKEY_KEYTYPE_AES_256: /* older ioctls used this */
  454. keysize = 32;
  455. break;
  456. default:
  457. ZCRYPT_DBF_ERR("%s unknown/unsupported keybitsize %d\n",
  458. __func__, keybitsize);
  459. rc = -EINVAL;
  460. goto out;
  461. }
  462. preqparm->lv1.len = sizeof(struct lv1) + keysize;
  463. memcpy(preqparm->lv1.clrkey, clrkey, keysize);
  464. plv2 = (struct lv2 *)(((u8 *)preqparm) + sizeof(*preqparm) + keysize);
  465. plv2->len = sizeof(struct lv2);
  466. plv2->keyid.len = sizeof(struct keyid);
  467. plv2->keyid.attr = 0x30;
  468. preqcblk->req_parml = sizeof(*preqparm) + keysize + sizeof(*plv2);
  469. /* fill xcrb struct */
  470. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  471. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  472. rc = zcrypt_send_cprb(&xcrb);
  473. if (rc) {
  474. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  475. __func__, (int)cardnr, (int)domain, rc);
  476. goto out;
  477. }
  478. /* check response returncode and reasoncode */
  479. if (prepcblk->ccp_rtcode != 0) {
  480. ZCRYPT_DBF_ERR("%s clear key import failure, card response %d/%d\n",
  481. __func__,
  482. (int)prepcblk->ccp_rtcode,
  483. (int)prepcblk->ccp_rscode);
  484. rc = -EIO;
  485. goto out;
  486. }
  487. /* process response cprb param block */
  488. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  489. prepcblk->rpl_parmb = (u8 __user *)ptr;
  490. prepparm = (struct cmrepparm *)ptr;
  491. /* check length of the returned secure key token */
  492. seckeysize = prepparm->lv3.keyblock.toklen
  493. - sizeof(prepparm->lv3.keyblock.toklen)
  494. - sizeof(prepparm->lv3.keyblock.tokattr);
  495. if (seckeysize != SECKEYBLOBSIZE) {
  496. ZCRYPT_DBF_ERR("%s secure token size mismatch %d != %d bytes\n",
  497. __func__, seckeysize, SECKEYBLOBSIZE);
  498. rc = -EIO;
  499. goto out;
  500. }
  501. /* check secure key token */
  502. rc = cca_check_secaeskeytoken(zcrypt_dbf_info, DBF_ERR,
  503. prepparm->lv3.keyblock.tok, 8 * keysize);
  504. if (rc) {
  505. rc = -EIO;
  506. goto out;
  507. }
  508. /* copy the generated secure key token */
  509. if (seckey)
  510. memcpy(seckey, prepparm->lv3.keyblock.tok, SECKEYBLOBSIZE);
  511. out:
  512. free_cprbmem(mem, PARMBSIZE, 1);
  513. return rc;
  514. }
  515. EXPORT_SYMBOL(cca_clr2seckey);
  516. /*
  517. * Derive proteced key from an CCA AES DATA secure key.
  518. */
  519. int cca_sec2protkey(u16 cardnr, u16 domain,
  520. const u8 *seckey, u8 *protkey, u32 *protkeylen,
  521. u32 *protkeytype)
  522. {
  523. int rc;
  524. u8 *mem, *ptr;
  525. struct CPRBX *preqcblk, *prepcblk;
  526. struct ica_xcRB xcrb;
  527. struct uskreqparm {
  528. u8 subfunc_code[2];
  529. u16 rule_array_len;
  530. struct lv1 {
  531. u16 len;
  532. u16 attr_len;
  533. u16 attr_flags;
  534. } lv1;
  535. struct lv2 {
  536. u16 len;
  537. u16 attr_len;
  538. u16 attr_flags;
  539. u8 token[]; /* cca secure key token */
  540. } lv2;
  541. } __packed * preqparm;
  542. struct uskrepparm {
  543. u8 subfunc_code[2];
  544. u16 rule_array_len;
  545. struct lv3 {
  546. u16 len;
  547. u16 attr_len;
  548. u16 attr_flags;
  549. struct cpacfkeyblock {
  550. u8 version; /* version of this struct */
  551. u8 flags[2];
  552. u8 algo;
  553. u8 form;
  554. u8 pad1[3];
  555. u16 len;
  556. u8 key[64]; /* the key (len bytes) */
  557. u16 keyattrlen;
  558. u8 keyattr[32];
  559. u8 pad2[1];
  560. u8 vptype;
  561. u8 vp[32]; /* verification pattern */
  562. } ckb;
  563. } lv3;
  564. } __packed * prepparm;
  565. /* get already prepared memory for 2 cprbs with param block each */
  566. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  567. if (rc)
  568. return rc;
  569. /* fill request cprb struct */
  570. preqcblk->domain = domain;
  571. /* fill request cprb param block with USK request */
  572. preqparm = (struct uskreqparm __force *)preqcblk->req_parmb;
  573. memcpy(preqparm->subfunc_code, "US", 2);
  574. preqparm->rule_array_len = sizeof(preqparm->rule_array_len);
  575. preqparm->lv1.len = sizeof(struct lv1);
  576. preqparm->lv1.attr_len = sizeof(struct lv1) - sizeof(preqparm->lv1.len);
  577. preqparm->lv1.attr_flags = 0x0001;
  578. preqparm->lv2.len = sizeof(struct lv2) + SECKEYBLOBSIZE;
  579. preqparm->lv2.attr_len = sizeof(struct lv2)
  580. - sizeof(preqparm->lv2.len) + SECKEYBLOBSIZE;
  581. preqparm->lv2.attr_flags = 0x0000;
  582. memcpy(preqparm->lv2.token, seckey, SECKEYBLOBSIZE);
  583. preqcblk->req_parml = sizeof(struct uskreqparm) + SECKEYBLOBSIZE;
  584. /* fill xcrb struct */
  585. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  586. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  587. rc = zcrypt_send_cprb(&xcrb);
  588. if (rc) {
  589. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  590. __func__, (int)cardnr, (int)domain, rc);
  591. goto out;
  592. }
  593. /* check response returncode and reasoncode */
  594. if (prepcblk->ccp_rtcode != 0) {
  595. ZCRYPT_DBF_ERR("%s unwrap secure key failure, card response %d/%d\n",
  596. __func__,
  597. (int)prepcblk->ccp_rtcode,
  598. (int)prepcblk->ccp_rscode);
  599. if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
  600. rc = -EBUSY;
  601. else
  602. rc = -EIO;
  603. goto out;
  604. }
  605. if (prepcblk->ccp_rscode != 0) {
  606. ZCRYPT_DBF_WARN("%s unwrap secure key warning, card response %d/%d\n",
  607. __func__,
  608. (int)prepcblk->ccp_rtcode,
  609. (int)prepcblk->ccp_rscode);
  610. }
  611. /* process response cprb param block */
  612. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  613. prepcblk->rpl_parmb = (u8 __user *)ptr;
  614. prepparm = (struct uskrepparm *)ptr;
  615. /* check the returned keyblock */
  616. if (prepparm->lv3.ckb.version != 0x01 &&
  617. prepparm->lv3.ckb.version != 0x02) {
  618. ZCRYPT_DBF_ERR("%s reply param keyblock version mismatch 0x%02x\n",
  619. __func__, (int)prepparm->lv3.ckb.version);
  620. rc = -EIO;
  621. goto out;
  622. }
  623. /* copy the translated protected key */
  624. switch (prepparm->lv3.ckb.len) {
  625. case 16 + 32:
  626. /* AES 128 protected key */
  627. if (protkeytype)
  628. *protkeytype = PKEY_KEYTYPE_AES_128;
  629. break;
  630. case 24 + 32:
  631. /* AES 192 protected key */
  632. if (protkeytype)
  633. *protkeytype = PKEY_KEYTYPE_AES_192;
  634. break;
  635. case 32 + 32:
  636. /* AES 256 protected key */
  637. if (protkeytype)
  638. *protkeytype = PKEY_KEYTYPE_AES_256;
  639. break;
  640. default:
  641. ZCRYPT_DBF_ERR("%s unknown/unsupported keylen %d\n",
  642. __func__, prepparm->lv3.ckb.len);
  643. rc = -EIO;
  644. goto out;
  645. }
  646. memcpy(protkey, prepparm->lv3.ckb.key, prepparm->lv3.ckb.len);
  647. if (protkeylen)
  648. *protkeylen = prepparm->lv3.ckb.len;
  649. out:
  650. free_cprbmem(mem, PARMBSIZE, 0);
  651. return rc;
  652. }
  653. EXPORT_SYMBOL(cca_sec2protkey);
  654. /*
  655. * AES cipher key skeleton created with CSNBKTB2 with these flags:
  656. * INTERNAL, NO-KEY, AES, CIPHER, ANY-MODE, NOEX-SYM, NOEXAASY,
  657. * NOEXUASY, XPRTCPAC, NOEX-RAW, NOEX-DES, NOEX-AES, NOEX-RSA
  658. * used by cca_gencipherkey() and cca_clr2cipherkey().
  659. */
  660. static const u8 aes_cipher_key_skeleton[] = {
  661. 0x01, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x00,
  662. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  663. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  664. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  665. 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  666. 0x00, 0x02, 0x00, 0x01, 0x02, 0xc0, 0x00, 0xff,
  667. 0x00, 0x03, 0x08, 0xc8, 0x00, 0x00, 0x00, 0x00 };
  668. #define SIZEOF_SKELETON (sizeof(aes_cipher_key_skeleton))
  669. /*
  670. * Generate (random) CCA AES CIPHER secure key.
  671. */
  672. int cca_gencipherkey(u16 cardnr, u16 domain, u32 keybitsize, u32 keygenflags,
  673. u8 *keybuf, u32 *keybufsize)
  674. {
  675. int rc;
  676. u8 *mem, *ptr;
  677. struct CPRBX *preqcblk, *prepcblk;
  678. struct ica_xcRB xcrb;
  679. struct gkreqparm {
  680. u8 subfunc_code[2];
  681. u16 rule_array_len;
  682. char rule_array[2 * 8];
  683. struct {
  684. u16 len;
  685. u8 key_type_1[8];
  686. u8 key_type_2[8];
  687. u16 clear_key_bit_len;
  688. u16 key_name_1_len;
  689. u16 key_name_2_len;
  690. u16 user_data_1_len;
  691. u16 user_data_2_len;
  692. /* u8 key_name_1[]; */
  693. /* u8 key_name_2[]; */
  694. /* u8 user_data_1[]; */
  695. /* u8 user_data_2[]; */
  696. } vud;
  697. struct {
  698. u16 len;
  699. struct {
  700. u16 len;
  701. u16 flag;
  702. /* u8 kek_id_1[]; */
  703. } tlv1;
  704. struct {
  705. u16 len;
  706. u16 flag;
  707. /* u8 kek_id_2[]; */
  708. } tlv2;
  709. struct {
  710. u16 len;
  711. u16 flag;
  712. u8 gen_key_id_1[SIZEOF_SKELETON];
  713. } tlv3;
  714. struct {
  715. u16 len;
  716. u16 flag;
  717. /* u8 gen_key_id_1_label[]; */
  718. } tlv4;
  719. struct {
  720. u16 len;
  721. u16 flag;
  722. /* u8 gen_key_id_2[]; */
  723. } tlv5;
  724. struct {
  725. u16 len;
  726. u16 flag;
  727. /* u8 gen_key_id_2_label[]; */
  728. } tlv6;
  729. } kb;
  730. } __packed * preqparm;
  731. struct gkrepparm {
  732. u8 subfunc_code[2];
  733. u16 rule_array_len;
  734. struct {
  735. u16 len;
  736. } vud;
  737. struct {
  738. u16 len;
  739. struct {
  740. u16 len;
  741. u16 flag;
  742. u8 gen_key[]; /* 120-136 bytes */
  743. } tlv1;
  744. } kb;
  745. } __packed * prepparm;
  746. struct cipherkeytoken *t;
  747. /* get already prepared memory for 2 cprbs with param block each */
  748. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  749. if (rc)
  750. return rc;
  751. /* fill request cprb struct */
  752. preqcblk->domain = domain;
  753. preqcblk->req_parml = sizeof(struct gkreqparm);
  754. /* prepare request param block with GK request */
  755. preqparm = (struct gkreqparm __force *)preqcblk->req_parmb;
  756. memcpy(preqparm->subfunc_code, "GK", 2);
  757. preqparm->rule_array_len = sizeof(uint16_t) + 2 * 8;
  758. memcpy(preqparm->rule_array, "AES OP ", 2 * 8);
  759. /* prepare vud block */
  760. preqparm->vud.len = sizeof(preqparm->vud);
  761. switch (keybitsize) {
  762. case 128:
  763. case 192:
  764. case 256:
  765. break;
  766. default:
  767. ZCRYPT_DBF_ERR("%s unknown/unsupported keybitsize %d\n",
  768. __func__, keybitsize);
  769. rc = -EINVAL;
  770. goto out;
  771. }
  772. preqparm->vud.clear_key_bit_len = keybitsize;
  773. memcpy(preqparm->vud.key_type_1, "TOKEN ", 8);
  774. memset(preqparm->vud.key_type_2, ' ', sizeof(preqparm->vud.key_type_2));
  775. /* prepare kb block */
  776. preqparm->kb.len = sizeof(preqparm->kb);
  777. preqparm->kb.tlv1.len = sizeof(preqparm->kb.tlv1);
  778. preqparm->kb.tlv1.flag = 0x0030;
  779. preqparm->kb.tlv2.len = sizeof(preqparm->kb.tlv2);
  780. preqparm->kb.tlv2.flag = 0x0030;
  781. preqparm->kb.tlv3.len = sizeof(preqparm->kb.tlv3);
  782. preqparm->kb.tlv3.flag = 0x0030;
  783. memcpy(preqparm->kb.tlv3.gen_key_id_1,
  784. aes_cipher_key_skeleton, SIZEOF_SKELETON);
  785. preqparm->kb.tlv4.len = sizeof(preqparm->kb.tlv4);
  786. preqparm->kb.tlv4.flag = 0x0030;
  787. preqparm->kb.tlv5.len = sizeof(preqparm->kb.tlv5);
  788. preqparm->kb.tlv5.flag = 0x0030;
  789. preqparm->kb.tlv6.len = sizeof(preqparm->kb.tlv6);
  790. preqparm->kb.tlv6.flag = 0x0030;
  791. /* patch the skeleton key token export flags inside the kb block */
  792. if (keygenflags) {
  793. t = (struct cipherkeytoken *)preqparm->kb.tlv3.gen_key_id_1;
  794. t->kmf1 |= (u16)(keygenflags & 0x0000FF00);
  795. t->kmf1 &= (u16)~(keygenflags & 0x000000FF);
  796. }
  797. /* prepare xcrb struct */
  798. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  799. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  800. rc = zcrypt_send_cprb(&xcrb);
  801. if (rc) {
  802. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  803. __func__, (int)cardnr, (int)domain, rc);
  804. goto out;
  805. }
  806. /* check response returncode and reasoncode */
  807. if (prepcblk->ccp_rtcode != 0) {
  808. ZCRYPT_DBF_ERR("%s cipher key generate failure, card response %d/%d\n",
  809. __func__,
  810. (int)prepcblk->ccp_rtcode,
  811. (int)prepcblk->ccp_rscode);
  812. rc = -EIO;
  813. goto out;
  814. }
  815. /* process response cprb param block */
  816. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  817. prepcblk->rpl_parmb = (u8 __user *)ptr;
  818. prepparm = (struct gkrepparm *)ptr;
  819. /* do some plausibility checks on the key block */
  820. if (prepparm->kb.len < 120 + 5 * sizeof(uint16_t) ||
  821. prepparm->kb.len > 136 + 5 * sizeof(uint16_t)) {
  822. ZCRYPT_DBF_ERR("%s reply with invalid or unknown key block\n",
  823. __func__);
  824. rc = -EIO;
  825. goto out;
  826. }
  827. /* and some checks on the generated key */
  828. rc = cca_check_secaescipherkey(zcrypt_dbf_info, DBF_ERR,
  829. prepparm->kb.tlv1.gen_key,
  830. keybitsize, 1);
  831. if (rc) {
  832. rc = -EIO;
  833. goto out;
  834. }
  835. /* copy the generated vlsc key token */
  836. t = (struct cipherkeytoken *)prepparm->kb.tlv1.gen_key;
  837. if (keybuf) {
  838. if (*keybufsize >= t->len)
  839. memcpy(keybuf, t, t->len);
  840. else
  841. rc = -EINVAL;
  842. }
  843. *keybufsize = t->len;
  844. out:
  845. free_cprbmem(mem, PARMBSIZE, 0);
  846. return rc;
  847. }
  848. EXPORT_SYMBOL(cca_gencipherkey);
  849. /*
  850. * Helper function, does a the CSNBKPI2 CPRB.
  851. */
  852. static int _ip_cprb_helper(u16 cardnr, u16 domain,
  853. const char *rule_array_1,
  854. const char *rule_array_2,
  855. const char *rule_array_3,
  856. const u8 *clr_key_value,
  857. int clr_key_bit_size,
  858. u8 *key_token,
  859. int *key_token_size)
  860. {
  861. int rc, n;
  862. u8 *mem, *ptr;
  863. struct CPRBX *preqcblk, *prepcblk;
  864. struct ica_xcRB xcrb;
  865. struct rule_array_block {
  866. u8 subfunc_code[2];
  867. u16 rule_array_len;
  868. char rule_array[];
  869. } __packed * preq_ra_block;
  870. struct vud_block {
  871. u16 len;
  872. struct {
  873. u16 len;
  874. u16 flag; /* 0x0064 */
  875. u16 clr_key_bit_len;
  876. } tlv1;
  877. struct {
  878. u16 len;
  879. u16 flag; /* 0x0063 */
  880. u8 clr_key[]; /* clear key value bytes */
  881. } tlv2;
  882. } __packed * preq_vud_block;
  883. struct key_block {
  884. u16 len;
  885. struct {
  886. u16 len;
  887. u16 flag; /* 0x0030 */
  888. u8 key_token[]; /* key skeleton */
  889. } tlv1;
  890. } __packed * preq_key_block;
  891. struct iprepparm {
  892. u8 subfunc_code[2];
  893. u16 rule_array_len;
  894. struct {
  895. u16 len;
  896. } vud;
  897. struct {
  898. u16 len;
  899. struct {
  900. u16 len;
  901. u16 flag; /* 0x0030 */
  902. u8 key_token[]; /* key token */
  903. } tlv1;
  904. } kb;
  905. } __packed * prepparm;
  906. struct cipherkeytoken *t;
  907. int complete = strncmp(rule_array_2, "COMPLETE", 8) ? 0 : 1;
  908. /* get already prepared memory for 2 cprbs with param block each */
  909. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  910. if (rc)
  911. return rc;
  912. /* fill request cprb struct */
  913. preqcblk->domain = domain;
  914. preqcblk->req_parml = 0;
  915. /* prepare request param block with IP request */
  916. preq_ra_block = (struct rule_array_block __force *)preqcblk->req_parmb;
  917. memcpy(preq_ra_block->subfunc_code, "IP", 2);
  918. preq_ra_block->rule_array_len = sizeof(uint16_t) + 2 * 8;
  919. memcpy(preq_ra_block->rule_array, rule_array_1, 8);
  920. memcpy(preq_ra_block->rule_array + 8, rule_array_2, 8);
  921. preqcblk->req_parml = sizeof(struct rule_array_block) + 2 * 8;
  922. if (rule_array_3) {
  923. preq_ra_block->rule_array_len += 8;
  924. memcpy(preq_ra_block->rule_array + 16, rule_array_3, 8);
  925. preqcblk->req_parml += 8;
  926. }
  927. /* prepare vud block */
  928. preq_vud_block = (struct vud_block __force *)
  929. (preqcblk->req_parmb + preqcblk->req_parml);
  930. n = complete ? 0 : (clr_key_bit_size + 7) / 8;
  931. preq_vud_block->len = sizeof(struct vud_block) + n;
  932. preq_vud_block->tlv1.len = sizeof(preq_vud_block->tlv1);
  933. preq_vud_block->tlv1.flag = 0x0064;
  934. preq_vud_block->tlv1.clr_key_bit_len = complete ? 0 : clr_key_bit_size;
  935. preq_vud_block->tlv2.len = sizeof(preq_vud_block->tlv2) + n;
  936. preq_vud_block->tlv2.flag = 0x0063;
  937. if (!complete)
  938. memcpy(preq_vud_block->tlv2.clr_key, clr_key_value, n);
  939. preqcblk->req_parml += preq_vud_block->len;
  940. /* prepare key block */
  941. preq_key_block = (struct key_block __force *)
  942. (preqcblk->req_parmb + preqcblk->req_parml);
  943. n = *key_token_size;
  944. preq_key_block->len = sizeof(struct key_block) + n;
  945. preq_key_block->tlv1.len = sizeof(preq_key_block->tlv1) + n;
  946. preq_key_block->tlv1.flag = 0x0030;
  947. memcpy(preq_key_block->tlv1.key_token, key_token, *key_token_size);
  948. preqcblk->req_parml += preq_key_block->len;
  949. /* prepare xcrb struct */
  950. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  951. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  952. rc = zcrypt_send_cprb(&xcrb);
  953. if (rc) {
  954. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  955. __func__, (int)cardnr, (int)domain, rc);
  956. goto out;
  957. }
  958. /* check response returncode and reasoncode */
  959. if (prepcblk->ccp_rtcode != 0) {
  960. ZCRYPT_DBF_ERR("%s CSNBKPI2 failure, card response %d/%d\n",
  961. __func__,
  962. (int)prepcblk->ccp_rtcode,
  963. (int)prepcblk->ccp_rscode);
  964. rc = -EIO;
  965. goto out;
  966. }
  967. /* process response cprb param block */
  968. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  969. prepcblk->rpl_parmb = (u8 __user *)ptr;
  970. prepparm = (struct iprepparm *)ptr;
  971. /* do some plausibility checks on the key block */
  972. if (prepparm->kb.len < 120 + 3 * sizeof(uint16_t) ||
  973. prepparm->kb.len > 136 + 3 * sizeof(uint16_t)) {
  974. ZCRYPT_DBF_ERR("%s reply with invalid or unknown key block\n",
  975. __func__);
  976. rc = -EIO;
  977. goto out;
  978. }
  979. /* do not check the key here, it may be incomplete */
  980. /* copy the vlsc key token back */
  981. t = (struct cipherkeytoken *)prepparm->kb.tlv1.key_token;
  982. memcpy(key_token, t, t->len);
  983. *key_token_size = t->len;
  984. out:
  985. free_cprbmem(mem, PARMBSIZE, 0);
  986. return rc;
  987. }
  988. /*
  989. * Build CCA AES CIPHER secure key with a given clear key value.
  990. */
  991. int cca_clr2cipherkey(u16 card, u16 dom, u32 keybitsize, u32 keygenflags,
  992. const u8 *clrkey, u8 *keybuf, u32 *keybufsize)
  993. {
  994. int rc;
  995. u8 *token;
  996. int tokensize;
  997. u8 exorbuf[32];
  998. struct cipherkeytoken *t;
  999. /* fill exorbuf with random data */
  1000. get_random_bytes(exorbuf, sizeof(exorbuf));
  1001. /* allocate space for the key token to build */
  1002. token = kmalloc(MAXCCAVLSCTOKENSIZE, GFP_KERNEL);
  1003. if (!token)
  1004. return -ENOMEM;
  1005. /* prepare the token with the key skeleton */
  1006. tokensize = SIZEOF_SKELETON;
  1007. memcpy(token, aes_cipher_key_skeleton, tokensize);
  1008. /* patch the skeleton key token export flags */
  1009. if (keygenflags) {
  1010. t = (struct cipherkeytoken *)token;
  1011. t->kmf1 |= (u16)(keygenflags & 0x0000FF00);
  1012. t->kmf1 &= (u16)~(keygenflags & 0x000000FF);
  1013. }
  1014. /*
  1015. * Do the key import with the clear key value in 4 steps:
  1016. * 1/4 FIRST import with only random data
  1017. * 2/4 EXOR the clear key
  1018. * 3/4 EXOR the very same random data again
  1019. * 4/4 COMPLETE the secure cipher key import
  1020. */
  1021. rc = _ip_cprb_helper(card, dom, "AES ", "FIRST ", "MIN3PART",
  1022. exorbuf, keybitsize, token, &tokensize);
  1023. if (rc) {
  1024. ZCRYPT_DBF_ERR("%s clear key import 1/4 with CSNBKPI2 failed, rc=%d\n",
  1025. __func__, rc);
  1026. goto out;
  1027. }
  1028. rc = _ip_cprb_helper(card, dom, "AES ", "ADD-PART", NULL,
  1029. clrkey, keybitsize, token, &tokensize);
  1030. if (rc) {
  1031. ZCRYPT_DBF_ERR("%s clear key import 2/4 with CSNBKPI2 failed, rc=%d\n",
  1032. __func__, rc);
  1033. goto out;
  1034. }
  1035. rc = _ip_cprb_helper(card, dom, "AES ", "ADD-PART", NULL,
  1036. exorbuf, keybitsize, token, &tokensize);
  1037. if (rc) {
  1038. ZCRYPT_DBF_ERR("%s clear key import 3/4 with CSNBKPI2 failed, rc=%d\n",
  1039. __func__, rc);
  1040. goto out;
  1041. }
  1042. rc = _ip_cprb_helper(card, dom, "AES ", "COMPLETE", NULL,
  1043. NULL, keybitsize, token, &tokensize);
  1044. if (rc) {
  1045. ZCRYPT_DBF_ERR("%s clear key import 4/4 with CSNBKPI2 failed, rc=%d\n",
  1046. __func__, rc);
  1047. goto out;
  1048. }
  1049. /* copy the generated key token */
  1050. if (keybuf) {
  1051. if (tokensize > *keybufsize)
  1052. rc = -EINVAL;
  1053. else
  1054. memcpy(keybuf, token, tokensize);
  1055. }
  1056. *keybufsize = tokensize;
  1057. out:
  1058. kfree(token);
  1059. return rc;
  1060. }
  1061. EXPORT_SYMBOL(cca_clr2cipherkey);
  1062. /*
  1063. * Derive proteced key from CCA AES cipher secure key.
  1064. */
  1065. int cca_cipher2protkey(u16 cardnr, u16 domain, const u8 *ckey,
  1066. u8 *protkey, u32 *protkeylen, u32 *protkeytype)
  1067. {
  1068. int rc;
  1069. u8 *mem, *ptr;
  1070. struct CPRBX *preqcblk, *prepcblk;
  1071. struct ica_xcRB xcrb;
  1072. struct aureqparm {
  1073. u8 subfunc_code[2];
  1074. u16 rule_array_len;
  1075. u8 rule_array[8];
  1076. struct {
  1077. u16 len;
  1078. u16 tk_blob_len;
  1079. u16 tk_blob_tag;
  1080. u8 tk_blob[66];
  1081. } vud;
  1082. struct {
  1083. u16 len;
  1084. u16 cca_key_token_len;
  1085. u16 cca_key_token_flags;
  1086. u8 cca_key_token[]; /* 64 or more */
  1087. } kb;
  1088. } __packed * preqparm;
  1089. struct aurepparm {
  1090. u8 subfunc_code[2];
  1091. u16 rule_array_len;
  1092. struct {
  1093. u16 len;
  1094. u16 sublen;
  1095. u16 tag;
  1096. struct cpacfkeyblock {
  1097. u8 version; /* version of this struct */
  1098. u8 flags[2];
  1099. u8 algo;
  1100. u8 form;
  1101. u8 pad1[3];
  1102. u16 keylen;
  1103. u8 key[64]; /* the key (keylen bytes) */
  1104. u16 keyattrlen;
  1105. u8 keyattr[32];
  1106. u8 pad2[1];
  1107. u8 vptype;
  1108. u8 vp[32]; /* verification pattern */
  1109. } ckb;
  1110. } vud;
  1111. struct {
  1112. u16 len;
  1113. } kb;
  1114. } __packed * prepparm;
  1115. int keytoklen = ((struct cipherkeytoken *)ckey)->len;
  1116. /* get already prepared memory for 2 cprbs with param block each */
  1117. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  1118. if (rc)
  1119. return rc;
  1120. /* fill request cprb struct */
  1121. preqcblk->domain = domain;
  1122. /* fill request cprb param block with AU request */
  1123. preqparm = (struct aureqparm __force *)preqcblk->req_parmb;
  1124. memcpy(preqparm->subfunc_code, "AU", 2);
  1125. preqparm->rule_array_len =
  1126. sizeof(preqparm->rule_array_len)
  1127. + sizeof(preqparm->rule_array);
  1128. memcpy(preqparm->rule_array, "EXPT-SK ", 8);
  1129. /* vud, tk blob */
  1130. preqparm->vud.len = sizeof(preqparm->vud);
  1131. preqparm->vud.tk_blob_len = sizeof(preqparm->vud.tk_blob)
  1132. + 2 * sizeof(uint16_t);
  1133. preqparm->vud.tk_blob_tag = 0x00C2;
  1134. /* kb, cca token */
  1135. preqparm->kb.len = keytoklen + 3 * sizeof(uint16_t);
  1136. preqparm->kb.cca_key_token_len = keytoklen + 2 * sizeof(uint16_t);
  1137. memcpy(preqparm->kb.cca_key_token, ckey, keytoklen);
  1138. /* now fill length of param block into cprb */
  1139. preqcblk->req_parml = sizeof(struct aureqparm) + keytoklen;
  1140. /* fill xcrb struct */
  1141. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  1142. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  1143. rc = zcrypt_send_cprb(&xcrb);
  1144. if (rc) {
  1145. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  1146. __func__, (int)cardnr, (int)domain, rc);
  1147. goto out;
  1148. }
  1149. /* check response returncode and reasoncode */
  1150. if (prepcblk->ccp_rtcode != 0) {
  1151. ZCRYPT_DBF_ERR("%s unwrap secure key failure, card response %d/%d\n",
  1152. __func__,
  1153. (int)prepcblk->ccp_rtcode,
  1154. (int)prepcblk->ccp_rscode);
  1155. if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
  1156. rc = -EBUSY;
  1157. else
  1158. rc = -EIO;
  1159. goto out;
  1160. }
  1161. if (prepcblk->ccp_rscode != 0) {
  1162. ZCRYPT_DBF_WARN("%s unwrap secure key warning, card response %d/%d\n",
  1163. __func__,
  1164. (int)prepcblk->ccp_rtcode,
  1165. (int)prepcblk->ccp_rscode);
  1166. }
  1167. /* process response cprb param block */
  1168. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  1169. prepcblk->rpl_parmb = (u8 __user *)ptr;
  1170. prepparm = (struct aurepparm *)ptr;
  1171. /* check the returned keyblock */
  1172. if (prepparm->vud.ckb.version != 0x01 &&
  1173. prepparm->vud.ckb.version != 0x02) {
  1174. ZCRYPT_DBF_ERR("%s reply param keyblock version mismatch 0x%02x\n",
  1175. __func__, (int)prepparm->vud.ckb.version);
  1176. rc = -EIO;
  1177. goto out;
  1178. }
  1179. if (prepparm->vud.ckb.algo != 0x02) {
  1180. ZCRYPT_DBF_ERR("%s reply param keyblock algo mismatch 0x%02x != 0x02\n",
  1181. __func__, (int)prepparm->vud.ckb.algo);
  1182. rc = -EIO;
  1183. goto out;
  1184. }
  1185. /* copy the translated protected key */
  1186. switch (prepparm->vud.ckb.keylen) {
  1187. case 16 + 32:
  1188. /* AES 128 protected key */
  1189. if (protkeytype)
  1190. *protkeytype = PKEY_KEYTYPE_AES_128;
  1191. break;
  1192. case 24 + 32:
  1193. /* AES 192 protected key */
  1194. if (protkeytype)
  1195. *protkeytype = PKEY_KEYTYPE_AES_192;
  1196. break;
  1197. case 32 + 32:
  1198. /* AES 256 protected key */
  1199. if (protkeytype)
  1200. *protkeytype = PKEY_KEYTYPE_AES_256;
  1201. break;
  1202. default:
  1203. ZCRYPT_DBF_ERR("%s unknown/unsupported keylen %d\n",
  1204. __func__, prepparm->vud.ckb.keylen);
  1205. rc = -EIO;
  1206. goto out;
  1207. }
  1208. memcpy(protkey, prepparm->vud.ckb.key, prepparm->vud.ckb.keylen);
  1209. if (protkeylen)
  1210. *protkeylen = prepparm->vud.ckb.keylen;
  1211. out:
  1212. free_cprbmem(mem, PARMBSIZE, 0);
  1213. return rc;
  1214. }
  1215. EXPORT_SYMBOL(cca_cipher2protkey);
  1216. /*
  1217. * Derive protected key from CCA ECC secure private key.
  1218. */
  1219. int cca_ecc2protkey(u16 cardnr, u16 domain, const u8 *key,
  1220. u8 *protkey, u32 *protkeylen, u32 *protkeytype)
  1221. {
  1222. int rc;
  1223. u8 *mem, *ptr;
  1224. struct CPRBX *preqcblk, *prepcblk;
  1225. struct ica_xcRB xcrb;
  1226. struct aureqparm {
  1227. u8 subfunc_code[2];
  1228. u16 rule_array_len;
  1229. u8 rule_array[8];
  1230. struct {
  1231. u16 len;
  1232. u16 tk_blob_len;
  1233. u16 tk_blob_tag;
  1234. u8 tk_blob[66];
  1235. } vud;
  1236. struct {
  1237. u16 len;
  1238. u16 cca_key_token_len;
  1239. u16 cca_key_token_flags;
  1240. u8 cca_key_token[];
  1241. } kb;
  1242. } __packed * preqparm;
  1243. struct aurepparm {
  1244. u8 subfunc_code[2];
  1245. u16 rule_array_len;
  1246. struct {
  1247. u16 len;
  1248. u16 sublen;
  1249. u16 tag;
  1250. struct cpacfkeyblock {
  1251. u8 version; /* version of this struct */
  1252. u8 flags[2];
  1253. u8 algo;
  1254. u8 form;
  1255. u8 pad1[3];
  1256. u16 keylen;
  1257. u8 key[]; /* the key (keylen bytes) */
  1258. /* u16 keyattrlen; */
  1259. /* u8 keyattr[32]; */
  1260. /* u8 pad2[1]; */
  1261. /* u8 vptype; */
  1262. /* u8 vp[32]; verification pattern */
  1263. } ckb;
  1264. } vud;
  1265. /* followed by a key block */
  1266. } __packed * prepparm;
  1267. int keylen = ((struct eccprivkeytoken *)key)->len;
  1268. /* get already prepared memory for 2 cprbs with param block each */
  1269. rc = alloc_and_prep_cprbmem(PARMBSIZE, &mem, &preqcblk, &prepcblk);
  1270. if (rc)
  1271. return rc;
  1272. /* fill request cprb struct */
  1273. preqcblk->domain = domain;
  1274. /* fill request cprb param block with AU request */
  1275. preqparm = (struct aureqparm __force *)preqcblk->req_parmb;
  1276. memcpy(preqparm->subfunc_code, "AU", 2);
  1277. preqparm->rule_array_len =
  1278. sizeof(preqparm->rule_array_len)
  1279. + sizeof(preqparm->rule_array);
  1280. memcpy(preqparm->rule_array, "EXPT-SK ", 8);
  1281. /* vud, tk blob */
  1282. preqparm->vud.len = sizeof(preqparm->vud);
  1283. preqparm->vud.tk_blob_len = sizeof(preqparm->vud.tk_blob)
  1284. + 2 * sizeof(uint16_t);
  1285. preqparm->vud.tk_blob_tag = 0x00C2;
  1286. /* kb, cca token */
  1287. preqparm->kb.len = keylen + 3 * sizeof(uint16_t);
  1288. preqparm->kb.cca_key_token_len = keylen + 2 * sizeof(uint16_t);
  1289. memcpy(preqparm->kb.cca_key_token, key, keylen);
  1290. /* now fill length of param block into cprb */
  1291. preqcblk->req_parml = sizeof(struct aureqparm) + keylen;
  1292. /* fill xcrb struct */
  1293. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  1294. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  1295. rc = zcrypt_send_cprb(&xcrb);
  1296. if (rc) {
  1297. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  1298. __func__, (int)cardnr, (int)domain, rc);
  1299. goto out;
  1300. }
  1301. /* check response returncode and reasoncode */
  1302. if (prepcblk->ccp_rtcode != 0) {
  1303. ZCRYPT_DBF_ERR("%s unwrap secure key failure, card response %d/%d\n",
  1304. __func__,
  1305. (int)prepcblk->ccp_rtcode,
  1306. (int)prepcblk->ccp_rscode);
  1307. if (prepcblk->ccp_rtcode == 8 && prepcblk->ccp_rscode == 2290)
  1308. rc = -EBUSY;
  1309. else
  1310. rc = -EIO;
  1311. goto out;
  1312. }
  1313. if (prepcblk->ccp_rscode != 0) {
  1314. ZCRYPT_DBF_WARN("%s unwrap secure key warning, card response %d/%d\n",
  1315. __func__,
  1316. (int)prepcblk->ccp_rtcode,
  1317. (int)prepcblk->ccp_rscode);
  1318. }
  1319. /* process response cprb param block */
  1320. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  1321. prepcblk->rpl_parmb = (u8 __user *)ptr;
  1322. prepparm = (struct aurepparm *)ptr;
  1323. /* check the returned keyblock */
  1324. if (prepparm->vud.ckb.version != 0x02) {
  1325. ZCRYPT_DBF_ERR("%s reply param keyblock version mismatch 0x%02x != 0x02\n",
  1326. __func__, (int)prepparm->vud.ckb.version);
  1327. rc = -EIO;
  1328. goto out;
  1329. }
  1330. if (prepparm->vud.ckb.algo != 0x81) {
  1331. ZCRYPT_DBF_ERR("%s reply param keyblock algo mismatch 0x%02x != 0x81\n",
  1332. __func__, (int)prepparm->vud.ckb.algo);
  1333. rc = -EIO;
  1334. goto out;
  1335. }
  1336. /* copy the translated protected key */
  1337. if (prepparm->vud.ckb.keylen > *protkeylen) {
  1338. ZCRYPT_DBF_ERR("%s prot keylen mismatch %d > buffersize %u\n",
  1339. __func__, prepparm->vud.ckb.keylen, *protkeylen);
  1340. rc = -EIO;
  1341. goto out;
  1342. }
  1343. memcpy(protkey, prepparm->vud.ckb.key, prepparm->vud.ckb.keylen);
  1344. *protkeylen = prepparm->vud.ckb.keylen;
  1345. if (protkeytype)
  1346. *protkeytype = PKEY_KEYTYPE_ECC;
  1347. out:
  1348. free_cprbmem(mem, PARMBSIZE, 0);
  1349. return rc;
  1350. }
  1351. EXPORT_SYMBOL(cca_ecc2protkey);
  1352. /*
  1353. * query cryptographic facility from CCA adapter
  1354. */
  1355. int cca_query_crypto_facility(u16 cardnr, u16 domain,
  1356. const char *keyword,
  1357. u8 *rarray, size_t *rarraylen,
  1358. u8 *varray, size_t *varraylen)
  1359. {
  1360. int rc;
  1361. u16 len;
  1362. u8 *mem, *ptr;
  1363. struct CPRBX *preqcblk, *prepcblk;
  1364. struct ica_xcRB xcrb;
  1365. struct fqreqparm {
  1366. u8 subfunc_code[2];
  1367. u16 rule_array_len;
  1368. char rule_array[8];
  1369. struct lv1 {
  1370. u16 len;
  1371. u8 data[VARDATASIZE];
  1372. } lv1;
  1373. u16 dummylen;
  1374. } __packed * preqparm;
  1375. size_t parmbsize = sizeof(struct fqreqparm);
  1376. struct fqrepparm {
  1377. u8 subfunc_code[2];
  1378. u8 lvdata[];
  1379. } __packed * prepparm;
  1380. /* get already prepared memory for 2 cprbs with param block each */
  1381. rc = alloc_and_prep_cprbmem(parmbsize, &mem, &preqcblk, &prepcblk);
  1382. if (rc)
  1383. return rc;
  1384. /* fill request cprb struct */
  1385. preqcblk->domain = domain;
  1386. /* fill request cprb param block with FQ request */
  1387. preqparm = (struct fqreqparm __force *)preqcblk->req_parmb;
  1388. memcpy(preqparm->subfunc_code, "FQ", 2);
  1389. memcpy(preqparm->rule_array, keyword, sizeof(preqparm->rule_array));
  1390. preqparm->rule_array_len =
  1391. sizeof(preqparm->rule_array_len) + sizeof(preqparm->rule_array);
  1392. preqparm->lv1.len = sizeof(preqparm->lv1);
  1393. preqparm->dummylen = sizeof(preqparm->dummylen);
  1394. preqcblk->req_parml = parmbsize;
  1395. /* fill xcrb struct */
  1396. prep_xcrb(&xcrb, cardnr, preqcblk, prepcblk);
  1397. /* forward xcrb with request CPRB and reply CPRB to zcrypt dd */
  1398. rc = zcrypt_send_cprb(&xcrb);
  1399. if (rc) {
  1400. ZCRYPT_DBF_ERR("%s zcrypt_send_cprb (cardnr=%d domain=%d) failed, rc=%d\n",
  1401. __func__, (int)cardnr, (int)domain, rc);
  1402. goto out;
  1403. }
  1404. /* check response returncode and reasoncode */
  1405. if (prepcblk->ccp_rtcode != 0) {
  1406. ZCRYPT_DBF_ERR("%s unwrap secure key failure, card response %d/%d\n",
  1407. __func__,
  1408. (int)prepcblk->ccp_rtcode,
  1409. (int)prepcblk->ccp_rscode);
  1410. rc = -EIO;
  1411. goto out;
  1412. }
  1413. /* process response cprb param block */
  1414. ptr = ((u8 *)prepcblk) + sizeof(struct CPRBX);
  1415. prepcblk->rpl_parmb = (u8 __user *)ptr;
  1416. prepparm = (struct fqrepparm *)ptr;
  1417. ptr = prepparm->lvdata;
  1418. /* check and possibly copy reply rule array */
  1419. len = *((u16 *)ptr);
  1420. if (len > sizeof(u16)) {
  1421. ptr += sizeof(u16);
  1422. len -= sizeof(u16);
  1423. if (rarray && rarraylen && *rarraylen > 0) {
  1424. *rarraylen = (len > *rarraylen ? *rarraylen : len);
  1425. memcpy(rarray, ptr, *rarraylen);
  1426. }
  1427. ptr += len;
  1428. }
  1429. /* check and possible copy reply var array */
  1430. len = *((u16 *)ptr);
  1431. if (len > sizeof(u16)) {
  1432. ptr += sizeof(u16);
  1433. len -= sizeof(u16);
  1434. if (varray && varraylen && *varraylen > 0) {
  1435. *varraylen = (len > *varraylen ? *varraylen : len);
  1436. memcpy(varray, ptr, *varraylen);
  1437. }
  1438. ptr += len;
  1439. }
  1440. out:
  1441. free_cprbmem(mem, parmbsize, 0);
  1442. return rc;
  1443. }
  1444. EXPORT_SYMBOL(cca_query_crypto_facility);
  1445. static int cca_info_cache_fetch(u16 cardnr, u16 domain, struct cca_info *ci)
  1446. {
  1447. int rc = -ENOENT;
  1448. struct cca_info_list_entry *ptr;
  1449. spin_lock_bh(&cca_info_list_lock);
  1450. list_for_each_entry(ptr, &cca_info_list, list) {
  1451. if (ptr->cardnr == cardnr && ptr->domain == domain) {
  1452. memcpy(ci, &ptr->info, sizeof(*ci));
  1453. rc = 0;
  1454. break;
  1455. }
  1456. }
  1457. spin_unlock_bh(&cca_info_list_lock);
  1458. return rc;
  1459. }
  1460. static void cca_info_cache_update(u16 cardnr, u16 domain,
  1461. const struct cca_info *ci)
  1462. {
  1463. int found = 0;
  1464. struct cca_info_list_entry *ptr;
  1465. spin_lock_bh(&cca_info_list_lock);
  1466. list_for_each_entry(ptr, &cca_info_list, list) {
  1467. if (ptr->cardnr == cardnr &&
  1468. ptr->domain == domain) {
  1469. memcpy(&ptr->info, ci, sizeof(*ci));
  1470. found = 1;
  1471. break;
  1472. }
  1473. }
  1474. if (!found) {
  1475. ptr = kmalloc(sizeof(*ptr), GFP_ATOMIC);
  1476. if (!ptr) {
  1477. spin_unlock_bh(&cca_info_list_lock);
  1478. return;
  1479. }
  1480. ptr->cardnr = cardnr;
  1481. ptr->domain = domain;
  1482. memcpy(&ptr->info, ci, sizeof(*ci));
  1483. list_add(&ptr->list, &cca_info_list);
  1484. }
  1485. spin_unlock_bh(&cca_info_list_lock);
  1486. }
  1487. static void cca_info_cache_scrub(u16 cardnr, u16 domain)
  1488. {
  1489. struct cca_info_list_entry *ptr;
  1490. spin_lock_bh(&cca_info_list_lock);
  1491. list_for_each_entry(ptr, &cca_info_list, list) {
  1492. if (ptr->cardnr == cardnr &&
  1493. ptr->domain == domain) {
  1494. list_del(&ptr->list);
  1495. kfree(ptr);
  1496. break;
  1497. }
  1498. }
  1499. spin_unlock_bh(&cca_info_list_lock);
  1500. }
  1501. static void __exit mkvp_cache_free(void)
  1502. {
  1503. struct cca_info_list_entry *ptr, *pnext;
  1504. spin_lock_bh(&cca_info_list_lock);
  1505. list_for_each_entry_safe(ptr, pnext, &cca_info_list, list) {
  1506. list_del(&ptr->list);
  1507. kfree(ptr);
  1508. }
  1509. spin_unlock_bh(&cca_info_list_lock);
  1510. }
  1511. /*
  1512. * Fetch cca_info values via query_crypto_facility from adapter.
  1513. */
  1514. static int fetch_cca_info(u16 cardnr, u16 domain, struct cca_info *ci)
  1515. {
  1516. int rc, found = 0;
  1517. size_t rlen, vlen;
  1518. u8 *rarray, *varray, *pg;
  1519. struct zcrypt_device_status_ext devstat;
  1520. memset(ci, 0, sizeof(*ci));
  1521. /* get first info from zcrypt device driver about this apqn */
  1522. rc = zcrypt_device_status_ext(cardnr, domain, &devstat);
  1523. if (rc)
  1524. return rc;
  1525. ci->hwtype = devstat.hwtype;
  1526. /* prep page for rule array and var array use */
  1527. pg = (u8 *)__get_free_page(GFP_KERNEL);
  1528. if (!pg)
  1529. return -ENOMEM;
  1530. rarray = pg;
  1531. varray = pg + PAGE_SIZE / 2;
  1532. rlen = vlen = PAGE_SIZE / 2;
  1533. /* QF for this card/domain */
  1534. rc = cca_query_crypto_facility(cardnr, domain, "STATICSA",
  1535. rarray, &rlen, varray, &vlen);
  1536. if (rc == 0 && rlen >= 10 * 8 && vlen >= 204) {
  1537. memcpy(ci->serial, rarray, 8);
  1538. ci->new_asym_mk_state = (char)rarray[4 * 8];
  1539. ci->cur_asym_mk_state = (char)rarray[5 * 8];
  1540. ci->old_asym_mk_state = (char)rarray[6 * 8];
  1541. if (ci->old_asym_mk_state == '2')
  1542. memcpy(ci->old_asym_mkvp, varray + 64, 16);
  1543. if (ci->cur_asym_mk_state == '2')
  1544. memcpy(ci->cur_asym_mkvp, varray + 84, 16);
  1545. if (ci->new_asym_mk_state == '3')
  1546. memcpy(ci->new_asym_mkvp, varray + 104, 16);
  1547. ci->new_aes_mk_state = (char)rarray[7 * 8];
  1548. ci->cur_aes_mk_state = (char)rarray[8 * 8];
  1549. ci->old_aes_mk_state = (char)rarray[9 * 8];
  1550. if (ci->old_aes_mk_state == '2')
  1551. memcpy(&ci->old_aes_mkvp, varray + 172, 8);
  1552. if (ci->cur_aes_mk_state == '2')
  1553. memcpy(&ci->cur_aes_mkvp, varray + 184, 8);
  1554. if (ci->new_aes_mk_state == '3')
  1555. memcpy(&ci->new_aes_mkvp, varray + 196, 8);
  1556. found++;
  1557. }
  1558. if (!found)
  1559. goto out;
  1560. rlen = vlen = PAGE_SIZE / 2;
  1561. rc = cca_query_crypto_facility(cardnr, domain, "STATICSB",
  1562. rarray, &rlen, varray, &vlen);
  1563. if (rc == 0 && rlen >= 13 * 8 && vlen >= 240) {
  1564. ci->new_apka_mk_state = (char)rarray[10 * 8];
  1565. ci->cur_apka_mk_state = (char)rarray[11 * 8];
  1566. ci->old_apka_mk_state = (char)rarray[12 * 8];
  1567. if (ci->old_apka_mk_state == '2')
  1568. memcpy(&ci->old_apka_mkvp, varray + 208, 8);
  1569. if (ci->cur_apka_mk_state == '2')
  1570. memcpy(&ci->cur_apka_mkvp, varray + 220, 8);
  1571. if (ci->new_apka_mk_state == '3')
  1572. memcpy(&ci->new_apka_mkvp, varray + 232, 8);
  1573. found++;
  1574. }
  1575. out:
  1576. free_page((unsigned long)pg);
  1577. return found == 2 ? 0 : -ENOENT;
  1578. }
  1579. /*
  1580. * Fetch cca information about a CCA queue.
  1581. */
  1582. int cca_get_info(u16 card, u16 dom, struct cca_info *ci, int verify)
  1583. {
  1584. int rc;
  1585. rc = cca_info_cache_fetch(card, dom, ci);
  1586. if (rc || verify) {
  1587. rc = fetch_cca_info(card, dom, ci);
  1588. if (rc == 0)
  1589. cca_info_cache_update(card, dom, ci);
  1590. }
  1591. return rc;
  1592. }
  1593. EXPORT_SYMBOL(cca_get_info);
  1594. /*
  1595. * Search for a matching crypto card based on the
  1596. * Master Key Verification Pattern given.
  1597. */
  1598. static int findcard(u64 mkvp, u16 *pcardnr, u16 *pdomain,
  1599. int verify, int minhwtype)
  1600. {
  1601. struct zcrypt_device_status_ext *device_status;
  1602. u16 card, dom;
  1603. struct cca_info ci;
  1604. int i, rc, oi = -1;
  1605. /* mkvp must not be zero, minhwtype needs to be >= 0 */
  1606. if (mkvp == 0 || minhwtype < 0)
  1607. return -EINVAL;
  1608. /* fetch status of all crypto cards */
  1609. device_status = kvcalloc(MAX_ZDEV_ENTRIES_EXT,
  1610. sizeof(struct zcrypt_device_status_ext),
  1611. GFP_KERNEL);
  1612. if (!device_status)
  1613. return -ENOMEM;
  1614. zcrypt_device_status_mask_ext(device_status);
  1615. /* walk through all crypto cards */
  1616. for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
  1617. card = AP_QID_CARD(device_status[i].qid);
  1618. dom = AP_QID_QUEUE(device_status[i].qid);
  1619. if (device_status[i].online &&
  1620. device_status[i].functions & 0x04) {
  1621. /* enabled CCA card, check current mkvp from cache */
  1622. if (cca_info_cache_fetch(card, dom, &ci) == 0 &&
  1623. ci.hwtype >= minhwtype &&
  1624. ci.cur_aes_mk_state == '2' &&
  1625. ci.cur_aes_mkvp == mkvp) {
  1626. if (!verify)
  1627. break;
  1628. /* verify: refresh card info */
  1629. if (fetch_cca_info(card, dom, &ci) == 0) {
  1630. cca_info_cache_update(card, dom, &ci);
  1631. if (ci.hwtype >= minhwtype &&
  1632. ci.cur_aes_mk_state == '2' &&
  1633. ci.cur_aes_mkvp == mkvp)
  1634. break;
  1635. }
  1636. }
  1637. } else {
  1638. /* Card is offline and/or not a CCA card. */
  1639. /* del mkvp entry from cache if it exists */
  1640. cca_info_cache_scrub(card, dom);
  1641. }
  1642. }
  1643. if (i >= MAX_ZDEV_ENTRIES_EXT) {
  1644. /* nothing found, so this time without cache */
  1645. for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
  1646. if (!(device_status[i].online &&
  1647. device_status[i].functions & 0x04))
  1648. continue;
  1649. card = AP_QID_CARD(device_status[i].qid);
  1650. dom = AP_QID_QUEUE(device_status[i].qid);
  1651. /* fresh fetch mkvp from adapter */
  1652. if (fetch_cca_info(card, dom, &ci) == 0) {
  1653. cca_info_cache_update(card, dom, &ci);
  1654. if (ci.hwtype >= minhwtype &&
  1655. ci.cur_aes_mk_state == '2' &&
  1656. ci.cur_aes_mkvp == mkvp)
  1657. break;
  1658. if (ci.hwtype >= minhwtype &&
  1659. ci.old_aes_mk_state == '2' &&
  1660. ci.old_aes_mkvp == mkvp &&
  1661. oi < 0)
  1662. oi = i;
  1663. }
  1664. }
  1665. if (i >= MAX_ZDEV_ENTRIES_EXT && oi >= 0) {
  1666. /* old mkvp matched, use this card then */
  1667. card = AP_QID_CARD(device_status[oi].qid);
  1668. dom = AP_QID_QUEUE(device_status[oi].qid);
  1669. }
  1670. }
  1671. if (i < MAX_ZDEV_ENTRIES_EXT || oi >= 0) {
  1672. if (pcardnr)
  1673. *pcardnr = card;
  1674. if (pdomain)
  1675. *pdomain = dom;
  1676. rc = (i < MAX_ZDEV_ENTRIES_EXT ? 0 : 1);
  1677. } else {
  1678. rc = -ENODEV;
  1679. }
  1680. kvfree(device_status);
  1681. return rc;
  1682. }
  1683. /*
  1684. * Search for a matching crypto card based on the Master Key
  1685. * Verification Pattern provided inside a secure key token.
  1686. */
  1687. int cca_findcard(const u8 *key, u16 *pcardnr, u16 *pdomain, int verify)
  1688. {
  1689. u64 mkvp;
  1690. int minhwtype = 0;
  1691. const struct keytoken_header *hdr = (struct keytoken_header *)key;
  1692. if (hdr->type != TOKTYPE_CCA_INTERNAL)
  1693. return -EINVAL;
  1694. switch (hdr->version) {
  1695. case TOKVER_CCA_AES:
  1696. mkvp = ((struct secaeskeytoken *)key)->mkvp;
  1697. break;
  1698. case TOKVER_CCA_VLSC:
  1699. mkvp = ((struct cipherkeytoken *)key)->mkvp0;
  1700. minhwtype = AP_DEVICE_TYPE_CEX6;
  1701. break;
  1702. default:
  1703. return -EINVAL;
  1704. }
  1705. return findcard(mkvp, pcardnr, pdomain, verify, minhwtype);
  1706. }
  1707. EXPORT_SYMBOL(cca_findcard);
  1708. int cca_findcard2(u32 **apqns, u32 *nr_apqns, u16 cardnr, u16 domain,
  1709. int minhwtype, int mktype, u64 cur_mkvp, u64 old_mkvp,
  1710. int verify)
  1711. {
  1712. struct zcrypt_device_status_ext *device_status;
  1713. u32 *_apqns = NULL, _nr_apqns = 0;
  1714. int i, card, dom, curmatch, oldmatch, rc = 0;
  1715. struct cca_info ci;
  1716. /* fetch status of all crypto cards */
  1717. device_status = kvcalloc(MAX_ZDEV_ENTRIES_EXT,
  1718. sizeof(struct zcrypt_device_status_ext),
  1719. GFP_KERNEL);
  1720. if (!device_status)
  1721. return -ENOMEM;
  1722. zcrypt_device_status_mask_ext(device_status);
  1723. /* allocate 1k space for up to 256 apqns */
  1724. _apqns = kmalloc_array(256, sizeof(u32), GFP_KERNEL);
  1725. if (!_apqns) {
  1726. kvfree(device_status);
  1727. return -ENOMEM;
  1728. }
  1729. /* walk through all the crypto apqnss */
  1730. for (i = 0; i < MAX_ZDEV_ENTRIES_EXT; i++) {
  1731. card = AP_QID_CARD(device_status[i].qid);
  1732. dom = AP_QID_QUEUE(device_status[i].qid);
  1733. /* check online state */
  1734. if (!device_status[i].online)
  1735. continue;
  1736. /* check for cca functions */
  1737. if (!(device_status[i].functions & 0x04))
  1738. continue;
  1739. /* check cardnr */
  1740. if (cardnr != 0xFFFF && card != cardnr)
  1741. continue;
  1742. /* check domain */
  1743. if (domain != 0xFFFF && dom != domain)
  1744. continue;
  1745. /* get cca info on this apqn */
  1746. if (cca_get_info(card, dom, &ci, verify))
  1747. continue;
  1748. /* current master key needs to be valid */
  1749. if (mktype == AES_MK_SET && ci.cur_aes_mk_state != '2')
  1750. continue;
  1751. if (mktype == APKA_MK_SET && ci.cur_apka_mk_state != '2')
  1752. continue;
  1753. /* check min hardware type */
  1754. if (minhwtype > 0 && minhwtype > ci.hwtype)
  1755. continue;
  1756. if (cur_mkvp || old_mkvp) {
  1757. /* check mkvps */
  1758. curmatch = oldmatch = 0;
  1759. if (mktype == AES_MK_SET) {
  1760. if (cur_mkvp && cur_mkvp == ci.cur_aes_mkvp)
  1761. curmatch = 1;
  1762. if (old_mkvp && ci.old_aes_mk_state == '2' &&
  1763. old_mkvp == ci.old_aes_mkvp)
  1764. oldmatch = 1;
  1765. } else {
  1766. if (cur_mkvp && cur_mkvp == ci.cur_apka_mkvp)
  1767. curmatch = 1;
  1768. if (old_mkvp && ci.old_apka_mk_state == '2' &&
  1769. old_mkvp == ci.old_apka_mkvp)
  1770. oldmatch = 1;
  1771. }
  1772. if (curmatch + oldmatch < 1)
  1773. continue;
  1774. }
  1775. /* apqn passed all filtering criterons, add to the array */
  1776. if (_nr_apqns < 256)
  1777. _apqns[_nr_apqns++] = (((u16)card) << 16) | ((u16)dom);
  1778. }
  1779. /* nothing found ? */
  1780. if (!_nr_apqns) {
  1781. kfree(_apqns);
  1782. rc = -ENODEV;
  1783. } else {
  1784. /* no re-allocation, simple return the _apqns array */
  1785. *apqns = _apqns;
  1786. *nr_apqns = _nr_apqns;
  1787. rc = 0;
  1788. }
  1789. kvfree(device_status);
  1790. return rc;
  1791. }
  1792. EXPORT_SYMBOL(cca_findcard2);
  1793. void __exit zcrypt_ccamisc_exit(void)
  1794. {
  1795. mkvp_cache_free();
  1796. }