s390xcap.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. /*
  2. * Copyright 2010-2023 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <setjmp.h>
  13. #include <signal.h>
  14. #include "internal/cryptlib.h"
  15. #include "crypto/ctype.h"
  16. #include "s390x_arch.h"
  17. #if defined(OPENSSL_SYS_LINUX) && !defined(FIPS_MODULE)
  18. # include <sys/types.h>
  19. # include <sys/stat.h>
  20. # include <fcntl.h>
  21. # include <asm/zcrypt.h>
  22. # include <sys/ioctl.h>
  23. # include <unistd.h>
  24. #endif
  25. #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
  26. # if __GLIBC_PREREQ(2, 16)
  27. # include <sys/auxv.h>
  28. # if defined(HWCAP_S390_STFLE) && defined(HWCAP_S390_VX)
  29. # define OSSL_IMPLEMENT_GETAUXVAL
  30. # endif
  31. # endif
  32. #endif
  33. #define LEN 128
  34. #define STR_(S) #S
  35. #define STR(S) STR_(S)
  36. #define TOK_FUNC(NAME) \
  37. (sscanf(tok_begin, \
  38. " " STR(NAME) " : %" STR(LEN) "[^:] : " \
  39. "%" STR(LEN) "s %" STR(LEN) "s ", \
  40. tok[0], tok[1], tok[2]) == 2) { \
  41. \
  42. off = (tok[0][0] == '~') ? 1 : 0; \
  43. if (sscanf(tok[0] + off, "%llx", &cap->NAME[0]) != 1) \
  44. goto ret; \
  45. if (off) \
  46. cap->NAME[0] = ~cap->NAME[0]; \
  47. \
  48. off = (tok[1][0] == '~') ? 1 : 0; \
  49. if (sscanf(tok[1] + off, "%llx", &cap->NAME[1]) != 1) \
  50. goto ret; \
  51. if (off) \
  52. cap->NAME[1] = ~cap->NAME[1]; \
  53. }
  54. #define TOK_CPU_ALIAS(NAME, STRUCT_NAME) \
  55. (sscanf(tok_begin, \
  56. " %" STR(LEN) "s %" STR(LEN) "s ", \
  57. tok[0], tok[1]) == 1 \
  58. && !strcmp(tok[0], #NAME)) { \
  59. memcpy(cap, &STRUCT_NAME, sizeof(*cap)); \
  60. }
  61. #define TOK_CPU(NAME) TOK_CPU_ALIAS(NAME, NAME)
  62. #ifndef OSSL_IMPLEMENT_GETAUXVAL
  63. static sigjmp_buf ill_jmp;
  64. static void ill_handler(int sig)
  65. {
  66. siglongjmp(ill_jmp, sig);
  67. }
  68. void OPENSSL_vx_probe(void);
  69. #endif
  70. static const char *env;
  71. static int parse_env(struct OPENSSL_s390xcap_st *cap, int *cex);
  72. void OPENSSL_s390x_facilities(void);
  73. void OPENSSL_s390x_functions(void);
  74. struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P;
  75. #ifdef S390X_MOD_EXP
  76. int OPENSSL_s390xcex;
  77. int OPENSSL_s390xcex_nodev;
  78. #if defined(__GNUC__)
  79. __attribute__ ((visibility("hidden")))
  80. #endif
  81. void OPENSSL_s390x_cleanup(void);
  82. #if defined(__GNUC__)
  83. __attribute__ ((visibility("hidden")))
  84. #endif
  85. void OPENSSL_s390x_cleanup(void)
  86. {
  87. if (OPENSSL_s390xcex != -1) {
  88. (void)close(OPENSSL_s390xcex);
  89. OPENSSL_s390xcex = -1;
  90. }
  91. }
  92. #endif
  93. #if defined(__GNUC__) && defined(__linux)
  94. __attribute__ ((visibility("hidden")))
  95. #endif
  96. void OPENSSL_cpuid_setup(void)
  97. {
  98. struct OPENSSL_s390xcap_st cap;
  99. int cex = 1;
  100. if (OPENSSL_s390xcap_P.stfle[0])
  101. return;
  102. /* set a bit that will not be tested later */
  103. OPENSSL_s390xcap_P.stfle[0] |= S390X_CAPBIT(0);
  104. #if defined(OSSL_IMPLEMENT_GETAUXVAL)
  105. {
  106. const unsigned long hwcap = getauxval(AT_HWCAP);
  107. /* protection against missing store-facility-list-extended */
  108. if (hwcap & HWCAP_S390_STFLE)
  109. OPENSSL_s390x_facilities();
  110. /* protection against disabled vector facility */
  111. if (!(hwcap & HWCAP_S390_VX)) {
  112. OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
  113. | S390X_CAPBIT(S390X_VXD)
  114. | S390X_CAPBIT(S390X_VXE));
  115. }
  116. }
  117. #else
  118. {
  119. sigset_t oset;
  120. struct sigaction ill_act, oact_ill, oact_fpe;
  121. memset(&ill_act, 0, sizeof(ill_act));
  122. ill_act.sa_handler = ill_handler;
  123. sigfillset(&ill_act.sa_mask);
  124. sigdelset(&ill_act.sa_mask, SIGILL);
  125. sigdelset(&ill_act.sa_mask, SIGFPE);
  126. sigdelset(&ill_act.sa_mask, SIGTRAP);
  127. sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
  128. sigaction(SIGILL, &ill_act, &oact_ill);
  129. sigaction(SIGFPE, &ill_act, &oact_fpe);
  130. /* protection against missing store-facility-list-extended */
  131. if (sigsetjmp(ill_jmp, 1) == 0)
  132. OPENSSL_s390x_facilities();
  133. /* protection against disabled vector facility */
  134. if ((OPENSSL_s390xcap_P.stfle[2] & S390X_CAPBIT(S390X_VX))
  135. && (sigsetjmp(ill_jmp, 1) == 0)) {
  136. OPENSSL_vx_probe();
  137. } else {
  138. OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
  139. | S390X_CAPBIT(S390X_VXD)
  140. | S390X_CAPBIT(S390X_VXE));
  141. }
  142. sigaction(SIGFPE, &oact_fpe, NULL);
  143. sigaction(SIGILL, &oact_ill, NULL);
  144. sigprocmask(SIG_SETMASK, &oset, NULL);
  145. }
  146. #endif
  147. env = getenv("OPENSSL_s390xcap");
  148. if (env != NULL) {
  149. if (!parse_env(&cap, &cex))
  150. env = NULL;
  151. }
  152. if (env != NULL) {
  153. OPENSSL_s390xcap_P.stfle[0] &= cap.stfle[0];
  154. OPENSSL_s390xcap_P.stfle[1] &= cap.stfle[1];
  155. OPENSSL_s390xcap_P.stfle[2] &= cap.stfle[2];
  156. }
  157. OPENSSL_s390x_functions(); /* check OPENSSL_s390xcap_P.stfle */
  158. if (env != NULL) {
  159. OPENSSL_s390xcap_P.kimd[0] &= cap.kimd[0];
  160. OPENSSL_s390xcap_P.kimd[1] &= cap.kimd[1];
  161. OPENSSL_s390xcap_P.klmd[0] &= cap.klmd[0];
  162. OPENSSL_s390xcap_P.klmd[1] &= cap.klmd[1];
  163. OPENSSL_s390xcap_P.km[0] &= cap.km[0];
  164. OPENSSL_s390xcap_P.km[1] &= cap.km[1];
  165. OPENSSL_s390xcap_P.kmc[0] &= cap.kmc[0];
  166. OPENSSL_s390xcap_P.kmc[1] &= cap.kmc[1];
  167. OPENSSL_s390xcap_P.kmac[0] &= cap.kmac[0];
  168. OPENSSL_s390xcap_P.kmac[1] &= cap.kmac[1];
  169. OPENSSL_s390xcap_P.kmctr[0] &= cap.kmctr[0];
  170. OPENSSL_s390xcap_P.kmctr[1] &= cap.kmctr[1];
  171. OPENSSL_s390xcap_P.kmo[0] &= cap.kmo[0];
  172. OPENSSL_s390xcap_P.kmo[1] &= cap.kmo[1];
  173. OPENSSL_s390xcap_P.kmf[0] &= cap.kmf[0];
  174. OPENSSL_s390xcap_P.kmf[1] &= cap.kmf[1];
  175. OPENSSL_s390xcap_P.prno[0] &= cap.prno[0];
  176. OPENSSL_s390xcap_P.prno[1] &= cap.prno[1];
  177. OPENSSL_s390xcap_P.kma[0] &= cap.kma[0];
  178. OPENSSL_s390xcap_P.kma[1] &= cap.kma[1];
  179. OPENSSL_s390xcap_P.pcc[0] &= cap.pcc[0];
  180. OPENSSL_s390xcap_P.pcc[1] &= cap.pcc[1];
  181. OPENSSL_s390xcap_P.kdsa[0] &= cap.kdsa[0];
  182. OPENSSL_s390xcap_P.kdsa[1] &= cap.kdsa[1];
  183. }
  184. #ifdef S390X_MOD_EXP
  185. if (cex == 0) {
  186. OPENSSL_s390xcex = -1;
  187. } else {
  188. OPENSSL_s390xcex = open("/dev/z90crypt", O_RDWR | O_CLOEXEC);
  189. OPENSSL_atexit(OPENSSL_s390x_cleanup);
  190. }
  191. OPENSSL_s390xcex_nodev = 0;
  192. #endif
  193. }
  194. static int parse_env(struct OPENSSL_s390xcap_st *cap, int *cex)
  195. {
  196. /*-
  197. * CPU model data
  198. * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
  199. */
  200. /*-
  201. * z900 (2000) - z/Architecture POP SA22-7832-00
  202. * Facility detection would fail on real hw (no STFLE).
  203. */
  204. static const struct OPENSSL_s390xcap_st z900 = {
  205. /*.stfle = */{0ULL, 0ULL, 0ULL, 0ULL},
  206. /*.kimd = */{0ULL, 0ULL},
  207. /*.klmd = */{0ULL, 0ULL},
  208. /*.km = */{0ULL, 0ULL},
  209. /*.kmc = */{0ULL, 0ULL},
  210. /*.kmac = */{0ULL, 0ULL},
  211. /*.kmctr = */{0ULL, 0ULL},
  212. /*.kmo = */{0ULL, 0ULL},
  213. /*.kmf = */{0ULL, 0ULL},
  214. /*.prno = */{0ULL, 0ULL},
  215. /*.kma = */{0ULL, 0ULL},
  216. /*.pcc = */{0ULL, 0ULL},
  217. /*.kdsa = */{0ULL, 0ULL},
  218. };
  219. /*-
  220. * z990 (2003) - z/Architecture POP SA22-7832-02
  221. * Implements MSA. Facility detection would fail on real hw (no STFLE).
  222. */
  223. static const struct OPENSSL_s390xcap_st z990 = {
  224. /*.stfle = */{S390X_CAPBIT(S390X_MSA),
  225. 0ULL, 0ULL, 0ULL},
  226. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  227. | S390X_CAPBIT(S390X_SHA_1),
  228. 0ULL},
  229. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  230. | S390X_CAPBIT(S390X_SHA_1),
  231. 0ULL},
  232. /*.km = */{S390X_CAPBIT(S390X_QUERY),
  233. 0ULL},
  234. /*.kmc = */{S390X_CAPBIT(S390X_QUERY),
  235. 0ULL},
  236. /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
  237. 0ULL},
  238. /*.kmctr = */{0ULL, 0ULL},
  239. /*.kmo = */{0ULL, 0ULL},
  240. /*.kmf = */{0ULL, 0ULL},
  241. /*.prno = */{0ULL, 0ULL},
  242. /*.kma = */{0ULL, 0ULL},
  243. /*.pcc = */{0ULL, 0ULL},
  244. /*.kdsa = */{0ULL, 0ULL},
  245. };
  246. /*-
  247. * z9 (2005) - z/Architecture POP SA22-7832-04
  248. * Implements MSA and MSA1.
  249. */
  250. static const struct OPENSSL_s390xcap_st z9 = {
  251. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  252. | S390X_CAPBIT(S390X_STCKF),
  253. 0ULL, 0ULL, 0ULL},
  254. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  255. | S390X_CAPBIT(S390X_SHA_1)
  256. | S390X_CAPBIT(S390X_SHA_256),
  257. 0ULL},
  258. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  259. | S390X_CAPBIT(S390X_SHA_1)
  260. | S390X_CAPBIT(S390X_SHA_256),
  261. 0ULL},
  262. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  263. | S390X_CAPBIT(S390X_AES_128),
  264. 0ULL},
  265. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  266. | S390X_CAPBIT(S390X_AES_128),
  267. 0ULL},
  268. /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
  269. 0ULL},
  270. /*.kmctr = */{0ULL, 0ULL},
  271. /*.kmo = */{0ULL, 0ULL},
  272. /*.kmf = */{0ULL, 0ULL},
  273. /*.prno = */{0ULL, 0ULL},
  274. /*.kma = */{0ULL, 0ULL},
  275. /*.pcc = */{0ULL, 0ULL},
  276. /*.kdsa = */{0ULL, 0ULL},
  277. };
  278. /*-
  279. * z10 (2008) - z/Architecture POP SA22-7832-06
  280. * Implements MSA and MSA1-2.
  281. */
  282. static const struct OPENSSL_s390xcap_st z10 = {
  283. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  284. | S390X_CAPBIT(S390X_STCKF),
  285. 0ULL, 0ULL, 0ULL},
  286. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  287. | S390X_CAPBIT(S390X_SHA_1)
  288. | S390X_CAPBIT(S390X_SHA_256)
  289. | S390X_CAPBIT(S390X_SHA_512),
  290. 0ULL},
  291. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  292. | S390X_CAPBIT(S390X_SHA_1)
  293. | S390X_CAPBIT(S390X_SHA_256)
  294. | S390X_CAPBIT(S390X_SHA_512),
  295. 0ULL},
  296. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  297. | S390X_CAPBIT(S390X_AES_128)
  298. | S390X_CAPBIT(S390X_AES_192)
  299. | S390X_CAPBIT(S390X_AES_256),
  300. 0ULL},
  301. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  302. | S390X_CAPBIT(S390X_AES_128)
  303. | S390X_CAPBIT(S390X_AES_192)
  304. | S390X_CAPBIT(S390X_AES_256),
  305. 0ULL},
  306. /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
  307. 0ULL},
  308. /*.kmctr = */{0ULL, 0ULL},
  309. /*.kmo = */{0ULL, 0ULL},
  310. /*.kmf = */{0ULL, 0ULL},
  311. /*.prno = */{0ULL, 0ULL},
  312. /*.kma = */{0ULL, 0ULL},
  313. /*.pcc = */{0ULL, 0ULL},
  314. /*.kdsa = */{0ULL, 0ULL},
  315. };
  316. /*-
  317. * z196 (2010) - z/Architecture POP SA22-7832-08
  318. * Implements MSA and MSA1-4.
  319. */
  320. static const struct OPENSSL_s390xcap_st z196 = {
  321. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  322. | S390X_CAPBIT(S390X_STCKF),
  323. S390X_CAPBIT(S390X_MSA3)
  324. | S390X_CAPBIT(S390X_MSA4),
  325. 0ULL, 0ULL},
  326. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  327. | S390X_CAPBIT(S390X_SHA_1)
  328. | S390X_CAPBIT(S390X_SHA_256)
  329. | S390X_CAPBIT(S390X_SHA_512),
  330. S390X_CAPBIT(S390X_GHASH)},
  331. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  332. | S390X_CAPBIT(S390X_SHA_1)
  333. | S390X_CAPBIT(S390X_SHA_256)
  334. | S390X_CAPBIT(S390X_SHA_512),
  335. 0ULL},
  336. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  337. | S390X_CAPBIT(S390X_AES_128)
  338. | S390X_CAPBIT(S390X_AES_192)
  339. | S390X_CAPBIT(S390X_AES_256)
  340. | S390X_CAPBIT(S390X_XTS_AES_128)
  341. | S390X_CAPBIT(S390X_XTS_AES_256),
  342. 0ULL},
  343. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  344. | S390X_CAPBIT(S390X_AES_128)
  345. | S390X_CAPBIT(S390X_AES_192)
  346. | S390X_CAPBIT(S390X_AES_256),
  347. 0ULL},
  348. /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
  349. | S390X_CAPBIT(S390X_AES_128)
  350. | S390X_CAPBIT(S390X_AES_192)
  351. | S390X_CAPBIT(S390X_AES_256),
  352. 0ULL},
  353. /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
  354. | S390X_CAPBIT(S390X_AES_128)
  355. | S390X_CAPBIT(S390X_AES_192)
  356. | S390X_CAPBIT(S390X_AES_256),
  357. 0ULL},
  358. /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
  359. | S390X_CAPBIT(S390X_AES_128)
  360. | S390X_CAPBIT(S390X_AES_192)
  361. | S390X_CAPBIT(S390X_AES_256),
  362. 0ULL},
  363. /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
  364. | S390X_CAPBIT(S390X_AES_128)
  365. | S390X_CAPBIT(S390X_AES_192)
  366. | S390X_CAPBIT(S390X_AES_256),
  367. 0ULL},
  368. /*.prno = */{0ULL, 0ULL},
  369. /*.kma = */{0ULL, 0ULL},
  370. /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
  371. 0ULL},
  372. /*.kdsa = */{0ULL, 0ULL},
  373. };
  374. /*-
  375. * zEC12 (2012) - z/Architecture POP SA22-7832-09
  376. * Implements MSA and MSA1-4.
  377. */
  378. static const struct OPENSSL_s390xcap_st zEC12 = {
  379. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  380. | S390X_CAPBIT(S390X_STCKF),
  381. S390X_CAPBIT(S390X_MSA3)
  382. | S390X_CAPBIT(S390X_MSA4),
  383. 0ULL, 0ULL},
  384. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  385. | S390X_CAPBIT(S390X_SHA_1)
  386. | S390X_CAPBIT(S390X_SHA_256)
  387. | S390X_CAPBIT(S390X_SHA_512),
  388. S390X_CAPBIT(S390X_GHASH)},
  389. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  390. | S390X_CAPBIT(S390X_SHA_1)
  391. | S390X_CAPBIT(S390X_SHA_256)
  392. | S390X_CAPBIT(S390X_SHA_512),
  393. 0ULL},
  394. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  395. | S390X_CAPBIT(S390X_AES_128)
  396. | S390X_CAPBIT(S390X_AES_192)
  397. | S390X_CAPBIT(S390X_AES_256)
  398. | S390X_CAPBIT(S390X_XTS_AES_128)
  399. | S390X_CAPBIT(S390X_XTS_AES_256),
  400. 0ULL},
  401. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  402. | S390X_CAPBIT(S390X_AES_128)
  403. | S390X_CAPBIT(S390X_AES_192)
  404. | S390X_CAPBIT(S390X_AES_256),
  405. 0ULL},
  406. /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
  407. | S390X_CAPBIT(S390X_AES_128)
  408. | S390X_CAPBIT(S390X_AES_192)
  409. | S390X_CAPBIT(S390X_AES_256),
  410. 0ULL},
  411. /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
  412. | S390X_CAPBIT(S390X_AES_128)
  413. | S390X_CAPBIT(S390X_AES_192)
  414. | S390X_CAPBIT(S390X_AES_256),
  415. 0ULL},
  416. /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
  417. | S390X_CAPBIT(S390X_AES_128)
  418. | S390X_CAPBIT(S390X_AES_192)
  419. | S390X_CAPBIT(S390X_AES_256),
  420. 0ULL},
  421. /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
  422. | S390X_CAPBIT(S390X_AES_128)
  423. | S390X_CAPBIT(S390X_AES_192)
  424. | S390X_CAPBIT(S390X_AES_256),
  425. 0ULL},
  426. /*.prno = */{0ULL, 0ULL},
  427. /*.kma = */{0ULL, 0ULL},
  428. /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
  429. 0ULL},
  430. /*.kdsa = */{0ULL, 0ULL},
  431. };
  432. /*-
  433. * z13 (2015) - z/Architecture POP SA22-7832-10
  434. * Implements MSA and MSA1-5.
  435. */
  436. static const struct OPENSSL_s390xcap_st z13 = {
  437. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  438. | S390X_CAPBIT(S390X_STCKF)
  439. | S390X_CAPBIT(S390X_MSA5),
  440. S390X_CAPBIT(S390X_MSA3)
  441. | S390X_CAPBIT(S390X_MSA4),
  442. S390X_CAPBIT(S390X_VX),
  443. 0ULL},
  444. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  445. | S390X_CAPBIT(S390X_SHA_1)
  446. | S390X_CAPBIT(S390X_SHA_256)
  447. | S390X_CAPBIT(S390X_SHA_512),
  448. S390X_CAPBIT(S390X_GHASH)},
  449. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  450. | S390X_CAPBIT(S390X_SHA_1)
  451. | S390X_CAPBIT(S390X_SHA_256)
  452. | S390X_CAPBIT(S390X_SHA_512),
  453. 0ULL},
  454. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  455. | S390X_CAPBIT(S390X_AES_128)
  456. | S390X_CAPBIT(S390X_AES_192)
  457. | S390X_CAPBIT(S390X_AES_256)
  458. | S390X_CAPBIT(S390X_XTS_AES_128)
  459. | S390X_CAPBIT(S390X_XTS_AES_256),
  460. 0ULL},
  461. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  462. | S390X_CAPBIT(S390X_AES_128)
  463. | S390X_CAPBIT(S390X_AES_192)
  464. | S390X_CAPBIT(S390X_AES_256),
  465. 0ULL},
  466. /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
  467. | S390X_CAPBIT(S390X_AES_128)
  468. | S390X_CAPBIT(S390X_AES_192)
  469. | S390X_CAPBIT(S390X_AES_256),
  470. 0ULL},
  471. /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
  472. | S390X_CAPBIT(S390X_AES_128)
  473. | S390X_CAPBIT(S390X_AES_192)
  474. | S390X_CAPBIT(S390X_AES_256),
  475. 0ULL},
  476. /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
  477. | S390X_CAPBIT(S390X_AES_128)
  478. | S390X_CAPBIT(S390X_AES_192)
  479. | S390X_CAPBIT(S390X_AES_256),
  480. 0ULL},
  481. /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
  482. | S390X_CAPBIT(S390X_AES_128)
  483. | S390X_CAPBIT(S390X_AES_192)
  484. | S390X_CAPBIT(S390X_AES_256),
  485. 0ULL},
  486. /*.prno = */{S390X_CAPBIT(S390X_QUERY)
  487. | S390X_CAPBIT(S390X_SHA_512_DRNG),
  488. 0ULL},
  489. /*.kma = */{0ULL, 0ULL},
  490. /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
  491. 0ULL},
  492. /*.kdsa = */{0ULL, 0ULL},
  493. };
  494. /*-
  495. * z14 (2017) - z/Architecture POP SA22-7832-11
  496. * Implements MSA and MSA1-8.
  497. */
  498. static const struct OPENSSL_s390xcap_st z14 = {
  499. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  500. | S390X_CAPBIT(S390X_STCKF)
  501. | S390X_CAPBIT(S390X_MSA5),
  502. S390X_CAPBIT(S390X_MSA3)
  503. | S390X_CAPBIT(S390X_MSA4),
  504. S390X_CAPBIT(S390X_VX)
  505. | S390X_CAPBIT(S390X_VXD)
  506. | S390X_CAPBIT(S390X_VXE)
  507. | S390X_CAPBIT(S390X_MSA8),
  508. 0ULL},
  509. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  510. | S390X_CAPBIT(S390X_SHA_1)
  511. | S390X_CAPBIT(S390X_SHA_256)
  512. | S390X_CAPBIT(S390X_SHA_512)
  513. | S390X_CAPBIT(S390X_SHA3_224)
  514. | S390X_CAPBIT(S390X_SHA3_256)
  515. | S390X_CAPBIT(S390X_SHA3_384)
  516. | S390X_CAPBIT(S390X_SHA3_512)
  517. | S390X_CAPBIT(S390X_SHAKE_128)
  518. | S390X_CAPBIT(S390X_SHAKE_256),
  519. S390X_CAPBIT(S390X_GHASH)},
  520. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  521. | S390X_CAPBIT(S390X_SHA_1)
  522. | S390X_CAPBIT(S390X_SHA_256)
  523. | S390X_CAPBIT(S390X_SHA_512)
  524. | S390X_CAPBIT(S390X_SHA3_224)
  525. | S390X_CAPBIT(S390X_SHA3_256)
  526. | S390X_CAPBIT(S390X_SHA3_384)
  527. | S390X_CAPBIT(S390X_SHA3_512)
  528. | S390X_CAPBIT(S390X_SHAKE_128)
  529. | S390X_CAPBIT(S390X_SHAKE_256),
  530. 0ULL},
  531. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  532. | S390X_CAPBIT(S390X_AES_128)
  533. | S390X_CAPBIT(S390X_AES_192)
  534. | S390X_CAPBIT(S390X_AES_256)
  535. | S390X_CAPBIT(S390X_XTS_AES_128)
  536. | S390X_CAPBIT(S390X_XTS_AES_256),
  537. 0ULL},
  538. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  539. | S390X_CAPBIT(S390X_AES_128)
  540. | S390X_CAPBIT(S390X_AES_192)
  541. | S390X_CAPBIT(S390X_AES_256),
  542. 0ULL},
  543. /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
  544. | S390X_CAPBIT(S390X_AES_128)
  545. | S390X_CAPBIT(S390X_AES_192)
  546. | S390X_CAPBIT(S390X_AES_256),
  547. 0ULL},
  548. /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
  549. | S390X_CAPBIT(S390X_AES_128)
  550. | S390X_CAPBIT(S390X_AES_192)
  551. | S390X_CAPBIT(S390X_AES_256),
  552. 0ULL},
  553. /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
  554. | S390X_CAPBIT(S390X_AES_128)
  555. | S390X_CAPBIT(S390X_AES_192)
  556. | S390X_CAPBIT(S390X_AES_256),
  557. 0ULL},
  558. /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
  559. | S390X_CAPBIT(S390X_AES_128)
  560. | S390X_CAPBIT(S390X_AES_192)
  561. | S390X_CAPBIT(S390X_AES_256),
  562. 0ULL},
  563. /*.prno = */{S390X_CAPBIT(S390X_QUERY)
  564. | S390X_CAPBIT(S390X_SHA_512_DRNG),
  565. S390X_CAPBIT(S390X_TRNG)},
  566. /*.kma = */{S390X_CAPBIT(S390X_QUERY)
  567. | S390X_CAPBIT(S390X_AES_128)
  568. | S390X_CAPBIT(S390X_AES_192)
  569. | S390X_CAPBIT(S390X_AES_256),
  570. 0ULL},
  571. /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
  572. 0ULL},
  573. /*.kdsa = */{0ULL, 0ULL},
  574. };
  575. /*-
  576. * z15 (2019) - z/Architecture POP SA22-7832-12
  577. * Implements MSA and MSA1-9.
  578. */
  579. static const struct OPENSSL_s390xcap_st z15 = {
  580. /*.stfle = */{S390X_CAPBIT(S390X_MSA)
  581. | S390X_CAPBIT(S390X_STCKF)
  582. | S390X_CAPBIT(S390X_MSA5),
  583. S390X_CAPBIT(S390X_MSA3)
  584. | S390X_CAPBIT(S390X_MSA4),
  585. S390X_CAPBIT(S390X_VX)
  586. | S390X_CAPBIT(S390X_VXD)
  587. | S390X_CAPBIT(S390X_VXE)
  588. | S390X_CAPBIT(S390X_MSA8)
  589. | S390X_CAPBIT(S390X_MSA9),
  590. 0ULL},
  591. /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
  592. | S390X_CAPBIT(S390X_SHA_1)
  593. | S390X_CAPBIT(S390X_SHA_256)
  594. | S390X_CAPBIT(S390X_SHA_512)
  595. | S390X_CAPBIT(S390X_SHA3_224)
  596. | S390X_CAPBIT(S390X_SHA3_256)
  597. | S390X_CAPBIT(S390X_SHA3_384)
  598. | S390X_CAPBIT(S390X_SHA3_512)
  599. | S390X_CAPBIT(S390X_SHAKE_128)
  600. | S390X_CAPBIT(S390X_SHAKE_256),
  601. S390X_CAPBIT(S390X_GHASH)},
  602. /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
  603. | S390X_CAPBIT(S390X_SHA_1)
  604. | S390X_CAPBIT(S390X_SHA_256)
  605. | S390X_CAPBIT(S390X_SHA_512)
  606. | S390X_CAPBIT(S390X_SHA3_224)
  607. | S390X_CAPBIT(S390X_SHA3_256)
  608. | S390X_CAPBIT(S390X_SHA3_384)
  609. | S390X_CAPBIT(S390X_SHA3_512)
  610. | S390X_CAPBIT(S390X_SHAKE_128)
  611. | S390X_CAPBIT(S390X_SHAKE_256),
  612. 0ULL},
  613. /*.km = */{S390X_CAPBIT(S390X_QUERY)
  614. | S390X_CAPBIT(S390X_AES_128)
  615. | S390X_CAPBIT(S390X_AES_192)
  616. | S390X_CAPBIT(S390X_AES_256)
  617. | S390X_CAPBIT(S390X_XTS_AES_128)
  618. | S390X_CAPBIT(S390X_XTS_AES_256),
  619. 0ULL},
  620. /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
  621. | S390X_CAPBIT(S390X_AES_128)
  622. | S390X_CAPBIT(S390X_AES_192)
  623. | S390X_CAPBIT(S390X_AES_256),
  624. 0ULL},
  625. /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
  626. | S390X_CAPBIT(S390X_AES_128)
  627. | S390X_CAPBIT(S390X_AES_192)
  628. | S390X_CAPBIT(S390X_AES_256),
  629. 0ULL},
  630. /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
  631. | S390X_CAPBIT(S390X_AES_128)
  632. | S390X_CAPBIT(S390X_AES_192)
  633. | S390X_CAPBIT(S390X_AES_256),
  634. 0ULL},
  635. /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
  636. | S390X_CAPBIT(S390X_AES_128)
  637. | S390X_CAPBIT(S390X_AES_192)
  638. | S390X_CAPBIT(S390X_AES_256),
  639. 0ULL},
  640. /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
  641. | S390X_CAPBIT(S390X_AES_128)
  642. | S390X_CAPBIT(S390X_AES_192)
  643. | S390X_CAPBIT(S390X_AES_256),
  644. 0ULL},
  645. /*.prno = */{S390X_CAPBIT(S390X_QUERY)
  646. | S390X_CAPBIT(S390X_SHA_512_DRNG),
  647. S390X_CAPBIT(S390X_TRNG)},
  648. /*.kma = */{S390X_CAPBIT(S390X_QUERY)
  649. | S390X_CAPBIT(S390X_AES_128)
  650. | S390X_CAPBIT(S390X_AES_192)
  651. | S390X_CAPBIT(S390X_AES_256),
  652. 0ULL},
  653. /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
  654. S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P256)
  655. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P384)
  656. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P521)
  657. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED25519)
  658. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED448)
  659. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X25519)
  660. | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X448)},
  661. /*.kdsa = */{S390X_CAPBIT(S390X_QUERY)
  662. | S390X_CAPBIT(S390X_ECDSA_VERIFY_P256)
  663. | S390X_CAPBIT(S390X_ECDSA_VERIFY_P384)
  664. | S390X_CAPBIT(S390X_ECDSA_VERIFY_P521)
  665. | S390X_CAPBIT(S390X_ECDSA_SIGN_P256)
  666. | S390X_CAPBIT(S390X_ECDSA_SIGN_P384)
  667. | S390X_CAPBIT(S390X_ECDSA_SIGN_P521)
  668. | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED25519)
  669. | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED448)
  670. | S390X_CAPBIT(S390X_EDDSA_SIGN_ED25519)
  671. | S390X_CAPBIT(S390X_EDDSA_SIGN_ED448),
  672. 0ULL},
  673. };
  674. /*-
  675. * z16 (2022) - z/Architecture POP
  676. * Implements MSA and MSA1-9 (same as z15, no need to repeat).
  677. */
  678. char *tok_begin, *tok_end, *buff, tok[S390X_STFLE_MAX][LEN + 1];
  679. int rc, off, i, n;
  680. buff = malloc(strlen(env) + 1);
  681. if (buff == NULL)
  682. return 0;
  683. rc = 0;
  684. memset(cap, ~0, sizeof(*cap));
  685. strcpy(buff, env);
  686. tok_begin = buff + strspn(buff, ";");
  687. strtok(tok_begin, ";");
  688. tok_end = strtok(NULL, ";");
  689. while (tok_begin != NULL) {
  690. /* stfle token */
  691. if ((n = sscanf(tok_begin,
  692. " stfle : %" STR(LEN) "[^:] : "
  693. "%" STR(LEN) "[^:] : %" STR(LEN) "s ",
  694. tok[0], tok[1], tok[2]))) {
  695. for (i = 0; i < n; i++) {
  696. off = (tok[i][0] == '~') ? 1 : 0;
  697. if (sscanf(tok[i] + off, "%llx", &cap->stfle[i]) != 1)
  698. goto ret;
  699. if (off)
  700. cap->stfle[i] = ~cap->stfle[i];
  701. }
  702. }
  703. /* query function tokens */
  704. else if TOK_FUNC(kimd)
  705. else if TOK_FUNC(klmd)
  706. else if TOK_FUNC(km)
  707. else if TOK_FUNC(kmc)
  708. else if TOK_FUNC(kmac)
  709. else if TOK_FUNC(kmctr)
  710. else if TOK_FUNC(kmo)
  711. else if TOK_FUNC(kmf)
  712. else if TOK_FUNC(prno)
  713. else if TOK_FUNC(kma)
  714. else if TOK_FUNC(pcc)
  715. else if TOK_FUNC(kdsa)
  716. /* CPU model tokens */
  717. else if TOK_CPU(z900)
  718. else if TOK_CPU(z990)
  719. else if TOK_CPU(z9)
  720. else if TOK_CPU(z10)
  721. else if TOK_CPU(z196)
  722. else if TOK_CPU(zEC12)
  723. else if TOK_CPU(z13)
  724. else if TOK_CPU(z14)
  725. else if TOK_CPU(z15)
  726. else if TOK_CPU_ALIAS(z16, z15)
  727. /* nocex to deactivate cex support */
  728. else if (sscanf(tok_begin, " %" STR(LEN) "s %" STR(LEN) "s ",
  729. tok[0], tok[1]) == 1
  730. && !strcmp(tok[0], "nocex")) {
  731. *cex = 0;
  732. }
  733. /* whitespace(ignored) or invalid tokens */
  734. else {
  735. while (*tok_begin != '\0') {
  736. if (!ossl_isspace(*tok_begin))
  737. goto ret;
  738. tok_begin++;
  739. }
  740. }
  741. tok_begin = tok_end;
  742. tok_end = strtok(NULL, ";");
  743. }
  744. rc = 1;
  745. ret:
  746. free(buff);
  747. return rc;
  748. }