des_s390.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Cryptographic API.
  4. *
  5. * s390 implementation of the DES Cipher Algorithm.
  6. *
  7. * Copyright IBM Corp. 2003, 2011
  8. * Author(s): Thomas Spatzier
  9. * Jan Glauber ([email protected])
  10. */
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/cpufeature.h>
  14. #include <linux/crypto.h>
  15. #include <linux/fips.h>
  16. #include <linux/mutex.h>
  17. #include <crypto/algapi.h>
  18. #include <crypto/internal/des.h>
  19. #include <crypto/internal/skcipher.h>
  20. #include <asm/cpacf.h>
  21. #define DES3_KEY_SIZE (3 * DES_KEY_SIZE)
  22. static u8 *ctrblk;
  23. static DEFINE_MUTEX(ctrblk_lock);
  24. static cpacf_mask_t km_functions, kmc_functions, kmctr_functions;
  25. struct s390_des_ctx {
  26. u8 iv[DES_BLOCK_SIZE];
  27. u8 key[DES3_KEY_SIZE];
  28. };
  29. static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
  30. unsigned int key_len)
  31. {
  32. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  33. int err;
  34. err = crypto_des_verify_key(tfm, key);
  35. if (err)
  36. return err;
  37. memcpy(ctx->key, key, key_len);
  38. return 0;
  39. }
  40. static int des_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key,
  41. unsigned int key_len)
  42. {
  43. return des_setkey(crypto_skcipher_tfm(tfm), key, key_len);
  44. }
  45. static void s390_des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  46. {
  47. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  48. cpacf_km(CPACF_KM_DEA, ctx->key, out, in, DES_BLOCK_SIZE);
  49. }
  50. static void s390_des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  51. {
  52. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  53. cpacf_km(CPACF_KM_DEA | CPACF_DECRYPT,
  54. ctx->key, out, in, DES_BLOCK_SIZE);
  55. }
  56. static struct crypto_alg des_alg = {
  57. .cra_name = "des",
  58. .cra_driver_name = "des-s390",
  59. .cra_priority = 300,
  60. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  61. .cra_blocksize = DES_BLOCK_SIZE,
  62. .cra_ctxsize = sizeof(struct s390_des_ctx),
  63. .cra_module = THIS_MODULE,
  64. .cra_u = {
  65. .cipher = {
  66. .cia_min_keysize = DES_KEY_SIZE,
  67. .cia_max_keysize = DES_KEY_SIZE,
  68. .cia_setkey = des_setkey,
  69. .cia_encrypt = s390_des_encrypt,
  70. .cia_decrypt = s390_des_decrypt,
  71. }
  72. }
  73. };
  74. static int ecb_desall_crypt(struct skcipher_request *req, unsigned long fc)
  75. {
  76. struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  77. struct s390_des_ctx *ctx = crypto_skcipher_ctx(tfm);
  78. struct skcipher_walk walk;
  79. unsigned int nbytes, n;
  80. int ret;
  81. ret = skcipher_walk_virt(&walk, req, false);
  82. while ((nbytes = walk.nbytes) != 0) {
  83. /* only use complete blocks */
  84. n = nbytes & ~(DES_BLOCK_SIZE - 1);
  85. cpacf_km(fc, ctx->key, walk.dst.virt.addr,
  86. walk.src.virt.addr, n);
  87. ret = skcipher_walk_done(&walk, nbytes - n);
  88. }
  89. return ret;
  90. }
  91. static int cbc_desall_crypt(struct skcipher_request *req, unsigned long fc)
  92. {
  93. struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  94. struct s390_des_ctx *ctx = crypto_skcipher_ctx(tfm);
  95. struct skcipher_walk walk;
  96. unsigned int nbytes, n;
  97. int ret;
  98. struct {
  99. u8 iv[DES_BLOCK_SIZE];
  100. u8 key[DES3_KEY_SIZE];
  101. } param;
  102. ret = skcipher_walk_virt(&walk, req, false);
  103. if (ret)
  104. return ret;
  105. memcpy(param.iv, walk.iv, DES_BLOCK_SIZE);
  106. memcpy(param.key, ctx->key, DES3_KEY_SIZE);
  107. while ((nbytes = walk.nbytes) != 0) {
  108. /* only use complete blocks */
  109. n = nbytes & ~(DES_BLOCK_SIZE - 1);
  110. cpacf_kmc(fc, &param, walk.dst.virt.addr,
  111. walk.src.virt.addr, n);
  112. memcpy(walk.iv, param.iv, DES_BLOCK_SIZE);
  113. ret = skcipher_walk_done(&walk, nbytes - n);
  114. }
  115. return ret;
  116. }
  117. static int ecb_des_encrypt(struct skcipher_request *req)
  118. {
  119. return ecb_desall_crypt(req, CPACF_KM_DEA);
  120. }
  121. static int ecb_des_decrypt(struct skcipher_request *req)
  122. {
  123. return ecb_desall_crypt(req, CPACF_KM_DEA | CPACF_DECRYPT);
  124. }
  125. static struct skcipher_alg ecb_des_alg = {
  126. .base.cra_name = "ecb(des)",
  127. .base.cra_driver_name = "ecb-des-s390",
  128. .base.cra_priority = 400, /* combo: des + ecb */
  129. .base.cra_blocksize = DES_BLOCK_SIZE,
  130. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  131. .base.cra_module = THIS_MODULE,
  132. .min_keysize = DES_KEY_SIZE,
  133. .max_keysize = DES_KEY_SIZE,
  134. .setkey = des_setkey_skcipher,
  135. .encrypt = ecb_des_encrypt,
  136. .decrypt = ecb_des_decrypt,
  137. };
  138. static int cbc_des_encrypt(struct skcipher_request *req)
  139. {
  140. return cbc_desall_crypt(req, CPACF_KMC_DEA);
  141. }
  142. static int cbc_des_decrypt(struct skcipher_request *req)
  143. {
  144. return cbc_desall_crypt(req, CPACF_KMC_DEA | CPACF_DECRYPT);
  145. }
  146. static struct skcipher_alg cbc_des_alg = {
  147. .base.cra_name = "cbc(des)",
  148. .base.cra_driver_name = "cbc-des-s390",
  149. .base.cra_priority = 400, /* combo: des + cbc */
  150. .base.cra_blocksize = DES_BLOCK_SIZE,
  151. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  152. .base.cra_module = THIS_MODULE,
  153. .min_keysize = DES_KEY_SIZE,
  154. .max_keysize = DES_KEY_SIZE,
  155. .ivsize = DES_BLOCK_SIZE,
  156. .setkey = des_setkey_skcipher,
  157. .encrypt = cbc_des_encrypt,
  158. .decrypt = cbc_des_decrypt,
  159. };
  160. /*
  161. * RFC2451:
  162. *
  163. * For DES-EDE3, there is no known need to reject weak or
  164. * complementation keys. Any weakness is obviated by the use of
  165. * multiple keys.
  166. *
  167. * However, if the first two or last two independent 64-bit keys are
  168. * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
  169. * same as DES. Implementers MUST reject keys that exhibit this
  170. * property.
  171. *
  172. * In fips mode additionally check for all 3 keys are unique.
  173. *
  174. */
  175. static int des3_setkey(struct crypto_tfm *tfm, const u8 *key,
  176. unsigned int key_len)
  177. {
  178. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  179. int err;
  180. err = crypto_des3_ede_verify_key(tfm, key);
  181. if (err)
  182. return err;
  183. memcpy(ctx->key, key, key_len);
  184. return 0;
  185. }
  186. static int des3_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key,
  187. unsigned int key_len)
  188. {
  189. return des3_setkey(crypto_skcipher_tfm(tfm), key, key_len);
  190. }
  191. static void des3_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  192. {
  193. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  194. cpacf_km(CPACF_KM_TDEA_192, ctx->key, dst, src, DES_BLOCK_SIZE);
  195. }
  196. static void des3_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  197. {
  198. struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
  199. cpacf_km(CPACF_KM_TDEA_192 | CPACF_DECRYPT,
  200. ctx->key, dst, src, DES_BLOCK_SIZE);
  201. }
  202. static struct crypto_alg des3_alg = {
  203. .cra_name = "des3_ede",
  204. .cra_driver_name = "des3_ede-s390",
  205. .cra_priority = 300,
  206. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  207. .cra_blocksize = DES_BLOCK_SIZE,
  208. .cra_ctxsize = sizeof(struct s390_des_ctx),
  209. .cra_module = THIS_MODULE,
  210. .cra_u = {
  211. .cipher = {
  212. .cia_min_keysize = DES3_KEY_SIZE,
  213. .cia_max_keysize = DES3_KEY_SIZE,
  214. .cia_setkey = des3_setkey,
  215. .cia_encrypt = des3_encrypt,
  216. .cia_decrypt = des3_decrypt,
  217. }
  218. }
  219. };
  220. static int ecb_des3_encrypt(struct skcipher_request *req)
  221. {
  222. return ecb_desall_crypt(req, CPACF_KM_TDEA_192);
  223. }
  224. static int ecb_des3_decrypt(struct skcipher_request *req)
  225. {
  226. return ecb_desall_crypt(req, CPACF_KM_TDEA_192 | CPACF_DECRYPT);
  227. }
  228. static struct skcipher_alg ecb_des3_alg = {
  229. .base.cra_name = "ecb(des3_ede)",
  230. .base.cra_driver_name = "ecb-des3_ede-s390",
  231. .base.cra_priority = 400, /* combo: des3 + ecb */
  232. .base.cra_blocksize = DES_BLOCK_SIZE,
  233. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  234. .base.cra_module = THIS_MODULE,
  235. .min_keysize = DES3_KEY_SIZE,
  236. .max_keysize = DES3_KEY_SIZE,
  237. .setkey = des3_setkey_skcipher,
  238. .encrypt = ecb_des3_encrypt,
  239. .decrypt = ecb_des3_decrypt,
  240. };
  241. static int cbc_des3_encrypt(struct skcipher_request *req)
  242. {
  243. return cbc_desall_crypt(req, CPACF_KMC_TDEA_192);
  244. }
  245. static int cbc_des3_decrypt(struct skcipher_request *req)
  246. {
  247. return cbc_desall_crypt(req, CPACF_KMC_TDEA_192 | CPACF_DECRYPT);
  248. }
  249. static struct skcipher_alg cbc_des3_alg = {
  250. .base.cra_name = "cbc(des3_ede)",
  251. .base.cra_driver_name = "cbc-des3_ede-s390",
  252. .base.cra_priority = 400, /* combo: des3 + cbc */
  253. .base.cra_blocksize = DES_BLOCK_SIZE,
  254. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  255. .base.cra_module = THIS_MODULE,
  256. .min_keysize = DES3_KEY_SIZE,
  257. .max_keysize = DES3_KEY_SIZE,
  258. .ivsize = DES_BLOCK_SIZE,
  259. .setkey = des3_setkey_skcipher,
  260. .encrypt = cbc_des3_encrypt,
  261. .decrypt = cbc_des3_decrypt,
  262. };
  263. static unsigned int __ctrblk_init(u8 *ctrptr, u8 *iv, unsigned int nbytes)
  264. {
  265. unsigned int i, n;
  266. /* align to block size, max. PAGE_SIZE */
  267. n = (nbytes > PAGE_SIZE) ? PAGE_SIZE : nbytes & ~(DES_BLOCK_SIZE - 1);
  268. memcpy(ctrptr, iv, DES_BLOCK_SIZE);
  269. for (i = (n / DES_BLOCK_SIZE) - 1; i > 0; i--) {
  270. memcpy(ctrptr + DES_BLOCK_SIZE, ctrptr, DES_BLOCK_SIZE);
  271. crypto_inc(ctrptr + DES_BLOCK_SIZE, DES_BLOCK_SIZE);
  272. ctrptr += DES_BLOCK_SIZE;
  273. }
  274. return n;
  275. }
  276. static int ctr_desall_crypt(struct skcipher_request *req, unsigned long fc)
  277. {
  278. struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  279. struct s390_des_ctx *ctx = crypto_skcipher_ctx(tfm);
  280. u8 buf[DES_BLOCK_SIZE], *ctrptr;
  281. struct skcipher_walk walk;
  282. unsigned int n, nbytes;
  283. int ret, locked;
  284. locked = mutex_trylock(&ctrblk_lock);
  285. ret = skcipher_walk_virt(&walk, req, false);
  286. while ((nbytes = walk.nbytes) >= DES_BLOCK_SIZE) {
  287. n = DES_BLOCK_SIZE;
  288. if (nbytes >= 2*DES_BLOCK_SIZE && locked)
  289. n = __ctrblk_init(ctrblk, walk.iv, nbytes);
  290. ctrptr = (n > DES_BLOCK_SIZE) ? ctrblk : walk.iv;
  291. cpacf_kmctr(fc, ctx->key, walk.dst.virt.addr,
  292. walk.src.virt.addr, n, ctrptr);
  293. if (ctrptr == ctrblk)
  294. memcpy(walk.iv, ctrptr + n - DES_BLOCK_SIZE,
  295. DES_BLOCK_SIZE);
  296. crypto_inc(walk.iv, DES_BLOCK_SIZE);
  297. ret = skcipher_walk_done(&walk, nbytes - n);
  298. }
  299. if (locked)
  300. mutex_unlock(&ctrblk_lock);
  301. /* final block may be < DES_BLOCK_SIZE, copy only nbytes */
  302. if (nbytes) {
  303. cpacf_kmctr(fc, ctx->key, buf, walk.src.virt.addr,
  304. DES_BLOCK_SIZE, walk.iv);
  305. memcpy(walk.dst.virt.addr, buf, nbytes);
  306. crypto_inc(walk.iv, DES_BLOCK_SIZE);
  307. ret = skcipher_walk_done(&walk, 0);
  308. }
  309. return ret;
  310. }
  311. static int ctr_des_crypt(struct skcipher_request *req)
  312. {
  313. return ctr_desall_crypt(req, CPACF_KMCTR_DEA);
  314. }
  315. static struct skcipher_alg ctr_des_alg = {
  316. .base.cra_name = "ctr(des)",
  317. .base.cra_driver_name = "ctr-des-s390",
  318. .base.cra_priority = 400, /* combo: des + ctr */
  319. .base.cra_blocksize = 1,
  320. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  321. .base.cra_module = THIS_MODULE,
  322. .min_keysize = DES_KEY_SIZE,
  323. .max_keysize = DES_KEY_SIZE,
  324. .ivsize = DES_BLOCK_SIZE,
  325. .setkey = des_setkey_skcipher,
  326. .encrypt = ctr_des_crypt,
  327. .decrypt = ctr_des_crypt,
  328. .chunksize = DES_BLOCK_SIZE,
  329. };
  330. static int ctr_des3_crypt(struct skcipher_request *req)
  331. {
  332. return ctr_desall_crypt(req, CPACF_KMCTR_TDEA_192);
  333. }
  334. static struct skcipher_alg ctr_des3_alg = {
  335. .base.cra_name = "ctr(des3_ede)",
  336. .base.cra_driver_name = "ctr-des3_ede-s390",
  337. .base.cra_priority = 400, /* combo: des3 + ede */
  338. .base.cra_blocksize = 1,
  339. .base.cra_ctxsize = sizeof(struct s390_des_ctx),
  340. .base.cra_module = THIS_MODULE,
  341. .min_keysize = DES3_KEY_SIZE,
  342. .max_keysize = DES3_KEY_SIZE,
  343. .ivsize = DES_BLOCK_SIZE,
  344. .setkey = des3_setkey_skcipher,
  345. .encrypt = ctr_des3_crypt,
  346. .decrypt = ctr_des3_crypt,
  347. .chunksize = DES_BLOCK_SIZE,
  348. };
  349. static struct crypto_alg *des_s390_algs_ptr[2];
  350. static int des_s390_algs_num;
  351. static struct skcipher_alg *des_s390_skciphers_ptr[6];
  352. static int des_s390_skciphers_num;
  353. static int des_s390_register_alg(struct crypto_alg *alg)
  354. {
  355. int ret;
  356. ret = crypto_register_alg(alg);
  357. if (!ret)
  358. des_s390_algs_ptr[des_s390_algs_num++] = alg;
  359. return ret;
  360. }
  361. static int des_s390_register_skcipher(struct skcipher_alg *alg)
  362. {
  363. int ret;
  364. ret = crypto_register_skcipher(alg);
  365. if (!ret)
  366. des_s390_skciphers_ptr[des_s390_skciphers_num++] = alg;
  367. return ret;
  368. }
  369. static void des_s390_exit(void)
  370. {
  371. while (des_s390_algs_num--)
  372. crypto_unregister_alg(des_s390_algs_ptr[des_s390_algs_num]);
  373. while (des_s390_skciphers_num--)
  374. crypto_unregister_skcipher(des_s390_skciphers_ptr[des_s390_skciphers_num]);
  375. if (ctrblk)
  376. free_page((unsigned long) ctrblk);
  377. }
  378. static int __init des_s390_init(void)
  379. {
  380. int ret;
  381. /* Query available functions for KM, KMC and KMCTR */
  382. cpacf_query(CPACF_KM, &km_functions);
  383. cpacf_query(CPACF_KMC, &kmc_functions);
  384. cpacf_query(CPACF_KMCTR, &kmctr_functions);
  385. if (cpacf_test_func(&km_functions, CPACF_KM_DEA)) {
  386. ret = des_s390_register_alg(&des_alg);
  387. if (ret)
  388. goto out_err;
  389. ret = des_s390_register_skcipher(&ecb_des_alg);
  390. if (ret)
  391. goto out_err;
  392. }
  393. if (cpacf_test_func(&kmc_functions, CPACF_KMC_DEA)) {
  394. ret = des_s390_register_skcipher(&cbc_des_alg);
  395. if (ret)
  396. goto out_err;
  397. }
  398. if (cpacf_test_func(&km_functions, CPACF_KM_TDEA_192)) {
  399. ret = des_s390_register_alg(&des3_alg);
  400. if (ret)
  401. goto out_err;
  402. ret = des_s390_register_skcipher(&ecb_des3_alg);
  403. if (ret)
  404. goto out_err;
  405. }
  406. if (cpacf_test_func(&kmc_functions, CPACF_KMC_TDEA_192)) {
  407. ret = des_s390_register_skcipher(&cbc_des3_alg);
  408. if (ret)
  409. goto out_err;
  410. }
  411. if (cpacf_test_func(&kmctr_functions, CPACF_KMCTR_DEA) ||
  412. cpacf_test_func(&kmctr_functions, CPACF_KMCTR_TDEA_192)) {
  413. ctrblk = (u8 *) __get_free_page(GFP_KERNEL);
  414. if (!ctrblk) {
  415. ret = -ENOMEM;
  416. goto out_err;
  417. }
  418. }
  419. if (cpacf_test_func(&kmctr_functions, CPACF_KMCTR_DEA)) {
  420. ret = des_s390_register_skcipher(&ctr_des_alg);
  421. if (ret)
  422. goto out_err;
  423. }
  424. if (cpacf_test_func(&kmctr_functions, CPACF_KMCTR_TDEA_192)) {
  425. ret = des_s390_register_skcipher(&ctr_des3_alg);
  426. if (ret)
  427. goto out_err;
  428. }
  429. return 0;
  430. out_err:
  431. des_s390_exit();
  432. return ret;
  433. }
  434. module_cpu_feature_match(S390_CPU_FEATURE_MSA, des_s390_init);
  435. module_exit(des_s390_exit);
  436. MODULE_ALIAS_CRYPTO("des");
  437. MODULE_ALIAS_CRYPTO("des3_ede");
  438. MODULE_LICENSE("GPL");
  439. MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");