2 * Copyright 2010-2022 The OpenSSL Project Authors. All Rights Reserved.
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
15 #include "internal/cryptlib.h"
16 #include "crypto/ctype.h"
17 #include "s390x_arch.h"
19 #if defined(OPENSSL_SYS_LINUX) && !defined(FIPS_MODULE)
20 # include <sys/types.h>
21 # include <sys/stat.h>
23 # include <asm/zcrypt.h>
24 # include <sys/ioctl.h>
28 #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
29 # if __GLIBC_PREREQ(2, 16)
30 # include <sys/auxv.h>
31 # if defined(HWCAP_S390_STFLE) && defined(HWCAP_S390_VX)
32 # define OSSL_IMPLEMENT_GETAUXVAL
39 #define STR(S) STR_(S)
41 #define TOK_FUNC(NAME) \
43 " " STR(NAME) " : %" STR(LEN) "[^:] : " \
44 "%" STR(LEN) "s %" STR(LEN) "s ", \
45 tok[0], tok[1], tok[2]) == 2) { \
47 off = (tok[0][0] == '~') ? 1 : 0; \
48 if (sscanf(tok[0] + off, "%llx", &cap->NAME[0]) != 1) \
51 cap->NAME[0] = ~cap->NAME[0]; \
53 off = (tok[1][0] == '~') ? 1 : 0; \
54 if (sscanf(tok[1] + off, "%llx", &cap->NAME[1]) != 1) \
57 cap->NAME[1] = ~cap->NAME[1]; \
60 #define TOK_CPU(NAME) \
62 " %" STR(LEN) "s %" STR(LEN) "s ", \
63 tok[0], tok[1]) == 1 \
64 && !strcmp(tok[0], #NAME)) { \
65 memcpy(cap, &NAME, sizeof(*cap)); \
68 #ifndef OSSL_IMPLEMENT_GETAUXVAL
69 static sigjmp_buf ill_jmp;
70 static void ill_handler(int sig)
72 siglongjmp(ill_jmp, sig);
75 void OPENSSL_vx_probe(void);
78 static const char *env;
79 static int parse_env(struct OPENSSL_s390xcap_st *cap, int *cex);
81 void OPENSSL_s390x_facilities(void);
82 void OPENSSL_s390x_functions(void);
84 struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P;
87 static int probe_cex(void);
91 __attribute__ ((visibility("hidden")))
93 void OPENSSL_s390x_cleanup(void);
96 __attribute__ ((visibility("hidden")))
98 void OPENSSL_s390x_cleanup(void)
100 if (OPENSSL_s390xcex != -1) {
101 (void)close(OPENSSL_s390xcex);
102 OPENSSL_s390xcex = -1;
107 #if defined(__GNUC__) && defined(__linux)
108 __attribute__ ((visibility("hidden")))
110 void OPENSSL_cpuid_setup(void)
112 struct OPENSSL_s390xcap_st cap;
115 if (OPENSSL_s390xcap_P.stfle[0])
118 /* set a bit that will not be tested later */
119 OPENSSL_s390xcap_P.stfle[0] |= S390X_CAPBIT(0);
121 #if defined(OSSL_IMPLEMENT_GETAUXVAL)
123 const unsigned long hwcap = getauxval(AT_HWCAP);
125 /* protection against missing store-facility-list-extended */
126 if (hwcap & HWCAP_S390_STFLE)
127 OPENSSL_s390x_facilities();
129 /* protection against disabled vector facility */
130 if (!(hwcap & HWCAP_S390_VX)) {
131 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
132 | S390X_CAPBIT(S390X_VXD)
133 | S390X_CAPBIT(S390X_VXE));
139 struct sigaction ill_act, oact_ill, oact_fpe;
141 memset(&ill_act, 0, sizeof(ill_act));
142 ill_act.sa_handler = ill_handler;
143 sigfillset(&ill_act.sa_mask);
144 sigdelset(&ill_act.sa_mask, SIGILL);
145 sigdelset(&ill_act.sa_mask, SIGFPE);
146 sigdelset(&ill_act.sa_mask, SIGTRAP);
148 sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
149 sigaction(SIGILL, &ill_act, &oact_ill);
150 sigaction(SIGFPE, &ill_act, &oact_fpe);
152 /* protection against missing store-facility-list-extended */
153 if (sigsetjmp(ill_jmp, 1) == 0)
154 OPENSSL_s390x_facilities();
156 /* protection against disabled vector facility */
157 if ((OPENSSL_s390xcap_P.stfle[2] & S390X_CAPBIT(S390X_VX))
158 && (sigsetjmp(ill_jmp, 1) == 0)) {
161 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
162 | S390X_CAPBIT(S390X_VXD)
163 | S390X_CAPBIT(S390X_VXE));
166 sigaction(SIGFPE, &oact_fpe, NULL);
167 sigaction(SIGILL, &oact_ill, NULL);
168 sigprocmask(SIG_SETMASK, &oset, NULL);
172 env = getenv("OPENSSL_s390xcap");
174 if (!parse_env(&cap, &cex))
179 OPENSSL_s390xcap_P.stfle[0] &= cap.stfle[0];
180 OPENSSL_s390xcap_P.stfle[1] &= cap.stfle[1];
181 OPENSSL_s390xcap_P.stfle[2] &= cap.stfle[2];
184 OPENSSL_s390x_functions(); /* check OPENSSL_s390xcap_P.stfle */
187 OPENSSL_s390xcap_P.kimd[0] &= cap.kimd[0];
188 OPENSSL_s390xcap_P.kimd[1] &= cap.kimd[1];
189 OPENSSL_s390xcap_P.klmd[0] &= cap.klmd[0];
190 OPENSSL_s390xcap_P.klmd[1] &= cap.klmd[1];
191 OPENSSL_s390xcap_P.km[0] &= cap.km[0];
192 OPENSSL_s390xcap_P.km[1] &= cap.km[1];
193 OPENSSL_s390xcap_P.kmc[0] &= cap.kmc[0];
194 OPENSSL_s390xcap_P.kmc[1] &= cap.kmc[1];
195 OPENSSL_s390xcap_P.kmac[0] &= cap.kmac[0];
196 OPENSSL_s390xcap_P.kmac[1] &= cap.kmac[1];
197 OPENSSL_s390xcap_P.kmctr[0] &= cap.kmctr[0];
198 OPENSSL_s390xcap_P.kmctr[1] &= cap.kmctr[1];
199 OPENSSL_s390xcap_P.kmo[0] &= cap.kmo[0];
200 OPENSSL_s390xcap_P.kmo[1] &= cap.kmo[1];
201 OPENSSL_s390xcap_P.kmf[0] &= cap.kmf[0];
202 OPENSSL_s390xcap_P.kmf[1] &= cap.kmf[1];
203 OPENSSL_s390xcap_P.prno[0] &= cap.prno[0];
204 OPENSSL_s390xcap_P.prno[1] &= cap.prno[1];
205 OPENSSL_s390xcap_P.kma[0] &= cap.kma[0];
206 OPENSSL_s390xcap_P.kma[1] &= cap.kma[1];
207 OPENSSL_s390xcap_P.pcc[0] &= cap.pcc[0];
208 OPENSSL_s390xcap_P.pcc[1] &= cap.pcc[1];
209 OPENSSL_s390xcap_P.kdsa[0] &= cap.kdsa[0];
210 OPENSSL_s390xcap_P.kdsa[1] &= cap.kdsa[1];
215 OPENSSL_s390xcex = -1;
217 OPENSSL_s390xcex = open("/dev/z90crypt", O_RDWR | O_CLOEXEC);
218 if (probe_cex() == 1)
219 OPENSSL_atexit(OPENSSL_s390x_cleanup);
225 static int probe_cex(void)
227 struct ica_rsa_modexpo me;
228 const unsigned char inval[16] = {
232 const unsigned char modulus[16] = {
236 unsigned char res[16];
240 me.inputdata = (unsigned char *)inval;
241 me.inputdatalength = sizeof(inval);
242 me.outputdata = (unsigned char *)res;
243 me.outputdatalength = sizeof(res);
244 me.b_key = (unsigned char *)inval;
245 me.n_modulus = (unsigned char *)modulus;
247 if (ioctl(OPENSSL_s390xcex, ICARSAMODEXPO, &me) == -1) {
248 (void)close(OPENSSL_s390xcex);
249 OPENSSL_s390xcex = -1;
257 static int parse_env(struct OPENSSL_s390xcap_st *cap, int *cex)
261 * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
265 * z900 (2000) - z/Architecture POP SA22-7832-00
266 * Facility detection would fail on real hw (no STFLE).
268 static const struct OPENSSL_s390xcap_st z900 = {
269 /*.stfle = */{0ULL, 0ULL, 0ULL, 0ULL},
270 /*.kimd = */{0ULL, 0ULL},
271 /*.klmd = */{0ULL, 0ULL},
272 /*.km = */{0ULL, 0ULL},
273 /*.kmc = */{0ULL, 0ULL},
274 /*.kmac = */{0ULL, 0ULL},
275 /*.kmctr = */{0ULL, 0ULL},
276 /*.kmo = */{0ULL, 0ULL},
277 /*.kmf = */{0ULL, 0ULL},
278 /*.prno = */{0ULL, 0ULL},
279 /*.kma = */{0ULL, 0ULL},
280 /*.pcc = */{0ULL, 0ULL},
281 /*.kdsa = */{0ULL, 0ULL},
285 * z990 (2003) - z/Architecture POP SA22-7832-02
286 * Implements MSA. Facility detection would fail on real hw (no STFLE).
288 static const struct OPENSSL_s390xcap_st z990 = {
289 /*.stfle = */{S390X_CAPBIT(S390X_MSA),
291 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
292 | S390X_CAPBIT(S390X_SHA_1),
294 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
295 | S390X_CAPBIT(S390X_SHA_1),
297 /*.km = */{S390X_CAPBIT(S390X_QUERY),
299 /*.kmc = */{S390X_CAPBIT(S390X_QUERY),
301 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
303 /*.kmctr = */{0ULL, 0ULL},
304 /*.kmo = */{0ULL, 0ULL},
305 /*.kmf = */{0ULL, 0ULL},
306 /*.prno = */{0ULL, 0ULL},
307 /*.kma = */{0ULL, 0ULL},
308 /*.pcc = */{0ULL, 0ULL},
309 /*.kdsa = */{0ULL, 0ULL},
313 * z9 (2005) - z/Architecture POP SA22-7832-04
314 * Implements MSA and MSA1.
316 static const struct OPENSSL_s390xcap_st z9 = {
317 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
318 | S390X_CAPBIT(S390X_STCKF),
320 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
321 | S390X_CAPBIT(S390X_SHA_1)
322 | S390X_CAPBIT(S390X_SHA_256),
324 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
325 | S390X_CAPBIT(S390X_SHA_1)
326 | S390X_CAPBIT(S390X_SHA_256),
328 /*.km = */{S390X_CAPBIT(S390X_QUERY)
329 | S390X_CAPBIT(S390X_AES_128),
331 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
332 | S390X_CAPBIT(S390X_AES_128),
334 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
336 /*.kmctr = */{0ULL, 0ULL},
337 /*.kmo = */{0ULL, 0ULL},
338 /*.kmf = */{0ULL, 0ULL},
339 /*.prno = */{0ULL, 0ULL},
340 /*.kma = */{0ULL, 0ULL},
341 /*.pcc = */{0ULL, 0ULL},
342 /*.kdsa = */{0ULL, 0ULL},
346 * z10 (2008) - z/Architecture POP SA22-7832-06
347 * Implements MSA and MSA1-2.
349 static const struct OPENSSL_s390xcap_st z10 = {
350 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
351 | S390X_CAPBIT(S390X_STCKF),
353 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
354 | S390X_CAPBIT(S390X_SHA_1)
355 | S390X_CAPBIT(S390X_SHA_256)
356 | S390X_CAPBIT(S390X_SHA_512),
358 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
359 | S390X_CAPBIT(S390X_SHA_1)
360 | S390X_CAPBIT(S390X_SHA_256)
361 | S390X_CAPBIT(S390X_SHA_512),
363 /*.km = */{S390X_CAPBIT(S390X_QUERY)
364 | S390X_CAPBIT(S390X_AES_128)
365 | S390X_CAPBIT(S390X_AES_192)
366 | S390X_CAPBIT(S390X_AES_256),
368 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
369 | S390X_CAPBIT(S390X_AES_128)
370 | S390X_CAPBIT(S390X_AES_192)
371 | S390X_CAPBIT(S390X_AES_256),
373 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
375 /*.kmctr = */{0ULL, 0ULL},
376 /*.kmo = */{0ULL, 0ULL},
377 /*.kmf = */{0ULL, 0ULL},
378 /*.prno = */{0ULL, 0ULL},
379 /*.kma = */{0ULL, 0ULL},
380 /*.pcc = */{0ULL, 0ULL},
381 /*.kdsa = */{0ULL, 0ULL},
385 * z196 (2010) - z/Architecture POP SA22-7832-08
386 * Implements MSA and MSA1-4.
388 static const struct OPENSSL_s390xcap_st z196 = {
389 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
390 | S390X_CAPBIT(S390X_STCKF),
391 S390X_CAPBIT(S390X_MSA3)
392 | S390X_CAPBIT(S390X_MSA4),
394 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
395 | S390X_CAPBIT(S390X_SHA_1)
396 | S390X_CAPBIT(S390X_SHA_256)
397 | S390X_CAPBIT(S390X_SHA_512),
398 S390X_CAPBIT(S390X_GHASH)},
399 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
400 | S390X_CAPBIT(S390X_SHA_1)
401 | S390X_CAPBIT(S390X_SHA_256)
402 | S390X_CAPBIT(S390X_SHA_512),
404 /*.km = */{S390X_CAPBIT(S390X_QUERY)
405 | S390X_CAPBIT(S390X_AES_128)
406 | S390X_CAPBIT(S390X_AES_192)
407 | S390X_CAPBIT(S390X_AES_256)
408 | S390X_CAPBIT(S390X_XTS_AES_128)
409 | S390X_CAPBIT(S390X_XTS_AES_256),
411 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
412 | S390X_CAPBIT(S390X_AES_128)
413 | S390X_CAPBIT(S390X_AES_192)
414 | S390X_CAPBIT(S390X_AES_256),
416 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
417 | S390X_CAPBIT(S390X_AES_128)
418 | S390X_CAPBIT(S390X_AES_192)
419 | S390X_CAPBIT(S390X_AES_256),
421 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
422 | S390X_CAPBIT(S390X_AES_128)
423 | S390X_CAPBIT(S390X_AES_192)
424 | S390X_CAPBIT(S390X_AES_256),
426 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
427 | S390X_CAPBIT(S390X_AES_128)
428 | S390X_CAPBIT(S390X_AES_192)
429 | S390X_CAPBIT(S390X_AES_256),
431 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
432 | S390X_CAPBIT(S390X_AES_128)
433 | S390X_CAPBIT(S390X_AES_192)
434 | S390X_CAPBIT(S390X_AES_256),
436 /*.prno = */{0ULL, 0ULL},
437 /*.kma = */{0ULL, 0ULL},
438 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
440 /*.kdsa = */{0ULL, 0ULL},
444 * zEC12 (2012) - z/Architecture POP SA22-7832-09
445 * Implements MSA and MSA1-4.
447 static const struct OPENSSL_s390xcap_st zEC12 = {
448 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
449 | S390X_CAPBIT(S390X_STCKF),
450 S390X_CAPBIT(S390X_MSA3)
451 | S390X_CAPBIT(S390X_MSA4),
453 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
454 | S390X_CAPBIT(S390X_SHA_1)
455 | S390X_CAPBIT(S390X_SHA_256)
456 | S390X_CAPBIT(S390X_SHA_512),
457 S390X_CAPBIT(S390X_GHASH)},
458 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
459 | S390X_CAPBIT(S390X_SHA_1)
460 | S390X_CAPBIT(S390X_SHA_256)
461 | S390X_CAPBIT(S390X_SHA_512),
463 /*.km = */{S390X_CAPBIT(S390X_QUERY)
464 | S390X_CAPBIT(S390X_AES_128)
465 | S390X_CAPBIT(S390X_AES_192)
466 | S390X_CAPBIT(S390X_AES_256)
467 | S390X_CAPBIT(S390X_XTS_AES_128)
468 | S390X_CAPBIT(S390X_XTS_AES_256),
470 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
471 | S390X_CAPBIT(S390X_AES_128)
472 | S390X_CAPBIT(S390X_AES_192)
473 | S390X_CAPBIT(S390X_AES_256),
475 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
476 | S390X_CAPBIT(S390X_AES_128)
477 | S390X_CAPBIT(S390X_AES_192)
478 | S390X_CAPBIT(S390X_AES_256),
480 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
481 | S390X_CAPBIT(S390X_AES_128)
482 | S390X_CAPBIT(S390X_AES_192)
483 | S390X_CAPBIT(S390X_AES_256),
485 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
486 | S390X_CAPBIT(S390X_AES_128)
487 | S390X_CAPBIT(S390X_AES_192)
488 | S390X_CAPBIT(S390X_AES_256),
490 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
491 | S390X_CAPBIT(S390X_AES_128)
492 | S390X_CAPBIT(S390X_AES_192)
493 | S390X_CAPBIT(S390X_AES_256),
495 /*.prno = */{0ULL, 0ULL},
496 /*.kma = */{0ULL, 0ULL},
497 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
499 /*.kdsa = */{0ULL, 0ULL},
503 * z13 (2015) - z/Architecture POP SA22-7832-10
504 * Implements MSA and MSA1-5.
506 static const struct OPENSSL_s390xcap_st z13 = {
507 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
508 | S390X_CAPBIT(S390X_STCKF)
509 | S390X_CAPBIT(S390X_MSA5),
510 S390X_CAPBIT(S390X_MSA3)
511 | S390X_CAPBIT(S390X_MSA4),
512 S390X_CAPBIT(S390X_VX),
514 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
515 | S390X_CAPBIT(S390X_SHA_1)
516 | S390X_CAPBIT(S390X_SHA_256)
517 | S390X_CAPBIT(S390X_SHA_512),
518 S390X_CAPBIT(S390X_GHASH)},
519 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
520 | S390X_CAPBIT(S390X_SHA_1)
521 | S390X_CAPBIT(S390X_SHA_256)
522 | S390X_CAPBIT(S390X_SHA_512),
524 /*.km = */{S390X_CAPBIT(S390X_QUERY)
525 | S390X_CAPBIT(S390X_AES_128)
526 | S390X_CAPBIT(S390X_AES_192)
527 | S390X_CAPBIT(S390X_AES_256)
528 | S390X_CAPBIT(S390X_XTS_AES_128)
529 | S390X_CAPBIT(S390X_XTS_AES_256),
531 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
532 | S390X_CAPBIT(S390X_AES_128)
533 | S390X_CAPBIT(S390X_AES_192)
534 | S390X_CAPBIT(S390X_AES_256),
536 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
537 | S390X_CAPBIT(S390X_AES_128)
538 | S390X_CAPBIT(S390X_AES_192)
539 | S390X_CAPBIT(S390X_AES_256),
541 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
542 | S390X_CAPBIT(S390X_AES_128)
543 | S390X_CAPBIT(S390X_AES_192)
544 | S390X_CAPBIT(S390X_AES_256),
546 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
547 | S390X_CAPBIT(S390X_AES_128)
548 | S390X_CAPBIT(S390X_AES_192)
549 | S390X_CAPBIT(S390X_AES_256),
551 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
552 | S390X_CAPBIT(S390X_AES_128)
553 | S390X_CAPBIT(S390X_AES_192)
554 | S390X_CAPBIT(S390X_AES_256),
556 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
557 | S390X_CAPBIT(S390X_SHA_512_DRNG),
559 /*.kma = */{0ULL, 0ULL},
560 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
562 /*.kdsa = */{0ULL, 0ULL},
566 * z14 (2017) - z/Architecture POP SA22-7832-11
567 * Implements MSA and MSA1-8.
569 static const struct OPENSSL_s390xcap_st z14 = {
570 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
571 | S390X_CAPBIT(S390X_STCKF)
572 | S390X_CAPBIT(S390X_MSA5),
573 S390X_CAPBIT(S390X_MSA3)
574 | S390X_CAPBIT(S390X_MSA4),
575 S390X_CAPBIT(S390X_VX)
576 | S390X_CAPBIT(S390X_VXD)
577 | S390X_CAPBIT(S390X_VXE)
578 | S390X_CAPBIT(S390X_MSA8),
580 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
581 | S390X_CAPBIT(S390X_SHA_1)
582 | S390X_CAPBIT(S390X_SHA_256)
583 | S390X_CAPBIT(S390X_SHA_512)
584 | S390X_CAPBIT(S390X_SHA3_224)
585 | S390X_CAPBIT(S390X_SHA3_256)
586 | S390X_CAPBIT(S390X_SHA3_384)
587 | S390X_CAPBIT(S390X_SHA3_512)
588 | S390X_CAPBIT(S390X_SHAKE_128)
589 | S390X_CAPBIT(S390X_SHAKE_256),
590 S390X_CAPBIT(S390X_GHASH)},
591 /*.klmd = */{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),
602 /*.km = */{S390X_CAPBIT(S390X_QUERY)
603 | S390X_CAPBIT(S390X_AES_128)
604 | S390X_CAPBIT(S390X_AES_192)
605 | S390X_CAPBIT(S390X_AES_256)
606 | S390X_CAPBIT(S390X_XTS_AES_128)
607 | S390X_CAPBIT(S390X_XTS_AES_256),
609 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
610 | S390X_CAPBIT(S390X_AES_128)
611 | S390X_CAPBIT(S390X_AES_192)
612 | S390X_CAPBIT(S390X_AES_256),
614 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
615 | S390X_CAPBIT(S390X_AES_128)
616 | S390X_CAPBIT(S390X_AES_192)
617 | S390X_CAPBIT(S390X_AES_256),
619 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
620 | S390X_CAPBIT(S390X_AES_128)
621 | S390X_CAPBIT(S390X_AES_192)
622 | S390X_CAPBIT(S390X_AES_256),
624 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
625 | S390X_CAPBIT(S390X_AES_128)
626 | S390X_CAPBIT(S390X_AES_192)
627 | S390X_CAPBIT(S390X_AES_256),
629 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
630 | S390X_CAPBIT(S390X_AES_128)
631 | S390X_CAPBIT(S390X_AES_192)
632 | S390X_CAPBIT(S390X_AES_256),
634 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
635 | S390X_CAPBIT(S390X_SHA_512_DRNG),
636 S390X_CAPBIT(S390X_TRNG)},
637 /*.kma = */{S390X_CAPBIT(S390X_QUERY)
638 | S390X_CAPBIT(S390X_AES_128)
639 | S390X_CAPBIT(S390X_AES_192)
640 | S390X_CAPBIT(S390X_AES_256),
642 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
644 /*.kdsa = */{0ULL, 0ULL},
648 * z15 (2019) - z/Architecture POP SA22-7832-12
649 * Implements MSA and MSA1-9.
651 static const struct OPENSSL_s390xcap_st z15 = {
652 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
653 | S390X_CAPBIT(S390X_STCKF)
654 | S390X_CAPBIT(S390X_MSA5),
655 S390X_CAPBIT(S390X_MSA3)
656 | S390X_CAPBIT(S390X_MSA4),
657 S390X_CAPBIT(S390X_VX)
658 | S390X_CAPBIT(S390X_VXD)
659 | S390X_CAPBIT(S390X_VXE)
660 | S390X_CAPBIT(S390X_MSA8)
661 | S390X_CAPBIT(S390X_MSA9),
663 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
664 | S390X_CAPBIT(S390X_SHA_1)
665 | S390X_CAPBIT(S390X_SHA_256)
666 | S390X_CAPBIT(S390X_SHA_512)
667 | S390X_CAPBIT(S390X_SHA3_224)
668 | S390X_CAPBIT(S390X_SHA3_256)
669 | S390X_CAPBIT(S390X_SHA3_384)
670 | S390X_CAPBIT(S390X_SHA3_512)
671 | S390X_CAPBIT(S390X_SHAKE_128)
672 | S390X_CAPBIT(S390X_SHAKE_256),
673 S390X_CAPBIT(S390X_GHASH)},
674 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
675 | S390X_CAPBIT(S390X_SHA_1)
676 | S390X_CAPBIT(S390X_SHA_256)
677 | S390X_CAPBIT(S390X_SHA_512)
678 | S390X_CAPBIT(S390X_SHA3_224)
679 | S390X_CAPBIT(S390X_SHA3_256)
680 | S390X_CAPBIT(S390X_SHA3_384)
681 | S390X_CAPBIT(S390X_SHA3_512)
682 | S390X_CAPBIT(S390X_SHAKE_128)
683 | S390X_CAPBIT(S390X_SHAKE_256),
685 /*.km = */{S390X_CAPBIT(S390X_QUERY)
686 | S390X_CAPBIT(S390X_AES_128)
687 | S390X_CAPBIT(S390X_AES_192)
688 | S390X_CAPBIT(S390X_AES_256)
689 | S390X_CAPBIT(S390X_XTS_AES_128)
690 | S390X_CAPBIT(S390X_XTS_AES_256),
692 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
693 | S390X_CAPBIT(S390X_AES_128)
694 | S390X_CAPBIT(S390X_AES_192)
695 | S390X_CAPBIT(S390X_AES_256),
697 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
698 | S390X_CAPBIT(S390X_AES_128)
699 | S390X_CAPBIT(S390X_AES_192)
700 | S390X_CAPBIT(S390X_AES_256),
702 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
703 | S390X_CAPBIT(S390X_AES_128)
704 | S390X_CAPBIT(S390X_AES_192)
705 | S390X_CAPBIT(S390X_AES_256),
707 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
708 | S390X_CAPBIT(S390X_AES_128)
709 | S390X_CAPBIT(S390X_AES_192)
710 | S390X_CAPBIT(S390X_AES_256),
712 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
713 | S390X_CAPBIT(S390X_AES_128)
714 | S390X_CAPBIT(S390X_AES_192)
715 | S390X_CAPBIT(S390X_AES_256),
717 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
718 | S390X_CAPBIT(S390X_SHA_512_DRNG),
719 S390X_CAPBIT(S390X_TRNG)},
720 /*.kma = */{S390X_CAPBIT(S390X_QUERY)
721 | S390X_CAPBIT(S390X_AES_128)
722 | S390X_CAPBIT(S390X_AES_192)
723 | S390X_CAPBIT(S390X_AES_256),
725 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
726 S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P256)
727 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P384)
728 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P521)
729 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED25519)
730 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED448)
731 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X25519)
732 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X448)},
733 /*.kdsa = */{S390X_CAPBIT(S390X_QUERY)
734 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P256)
735 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P384)
736 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P521)
737 | S390X_CAPBIT(S390X_ECDSA_SIGN_P256)
738 | S390X_CAPBIT(S390X_ECDSA_SIGN_P384)
739 | S390X_CAPBIT(S390X_ECDSA_SIGN_P521)
740 | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED25519)
741 | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED448)
742 | S390X_CAPBIT(S390X_EDDSA_SIGN_ED25519)
743 | S390X_CAPBIT(S390X_EDDSA_SIGN_ED448),
748 * z16 (2022) - z/Architecture POP
749 * Implements MSA and MSA1-9 (same as z15).
751 static const struct OPENSSL_s390xcap_st z16 = z15;
753 char *tok_begin, *tok_end, *buff, tok[S390X_STFLE_MAX][LEN + 1];
756 buff = malloc(strlen(env) + 1);
761 memset(cap, ~0, sizeof(*cap));
764 tok_begin = buff + strspn(buff, ";");
765 strtok(tok_begin, ";");
766 tok_end = strtok(NULL, ";");
768 while (tok_begin != NULL) {
770 if ((n = sscanf(tok_begin,
771 " stfle : %" STR(LEN) "[^:] : "
772 "%" STR(LEN) "[^:] : %" STR(LEN) "s ",
773 tok[0], tok[1], tok[2]))) {
774 for (i = 0; i < n; i++) {
775 off = (tok[i][0] == '~') ? 1 : 0;
776 if (sscanf(tok[i] + off, "%llx", &cap->stfle[i]) != 1)
779 cap->stfle[i] = ~cap->stfle[i];
783 /* query function tokens */
784 else if TOK_FUNC(kimd)
785 else if TOK_FUNC(klmd)
787 else if TOK_FUNC(kmc)
788 else if TOK_FUNC(kmac)
789 else if TOK_FUNC(kmctr)
790 else if TOK_FUNC(kmo)
791 else if TOK_FUNC(kmf)
792 else if TOK_FUNC(prno)
793 else if TOK_FUNC(kma)
794 else if TOK_FUNC(pcc)
795 else if TOK_FUNC(kdsa)
797 /* CPU model tokens */
798 else if TOK_CPU(z900)
799 else if TOK_CPU(z990)
802 else if TOK_CPU(z196)
803 else if TOK_CPU(zEC12)
809 /* nocex to deactivate cex support */
810 else if (sscanf(tok_begin, " %" STR(LEN) "s %" STR(LEN) "s ",
812 && !strcmp(tok[0], "nocex")) {
816 /* whitespace(ignored) or invalid tokens */
818 while (*tok_begin != '\0') {
819 if (!ossl_isspace(*tok_begin))
826 tok_end = strtok(NULL, ";");