2 * Copyright 2010-2023 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(__GLIBC__) && defined(__GLIBC_PREREQ)
20 # if __GLIBC_PREREQ(2, 16)
21 # include <sys/auxv.h>
22 # if defined(HWCAP_S390_STFLE) && defined(HWCAP_S390_VX)
23 # define OSSL_IMPLEMENT_GETAUXVAL
30 #define STR(S) STR_(S)
32 #define TOK_FUNC(NAME) \
34 " " STR(NAME) " : %" STR(LEN) "[^:] : " \
35 "%" STR(LEN) "s %" STR(LEN) "s ", \
36 tok[0], tok[1], tok[2]) == 2) { \
38 off = (tok[0][0] == '~') ? 1 : 0; \
39 if (sscanf(tok[0] + off, "%llx", &cap->NAME[0]) != 1) \
42 cap->NAME[0] = ~cap->NAME[0]; \
44 off = (tok[1][0] == '~') ? 1 : 0; \
45 if (sscanf(tok[1] + off, "%llx", &cap->NAME[1]) != 1) \
48 cap->NAME[1] = ~cap->NAME[1]; \
51 #define TOK_CPU_ALIAS(NAME, STRUCT_NAME) \
53 " %" STR(LEN) "s %" STR(LEN) "s ", \
54 tok[0], tok[1]) == 1 \
55 && !strcmp(tok[0], #NAME)) { \
56 memcpy(cap, &STRUCT_NAME, sizeof(*cap)); \
59 #define TOK_CPU(NAME) TOK_CPU_ALIAS(NAME, NAME)
61 #ifndef OSSL_IMPLEMENT_GETAUXVAL
62 static sigjmp_buf ill_jmp;
63 static void ill_handler(int sig)
65 siglongjmp(ill_jmp, sig);
68 void OPENSSL_vx_probe(void);
71 static const char *env;
72 static int parse_env(struct OPENSSL_s390xcap_st *cap);
74 void OPENSSL_s390x_facilities(void);
75 void OPENSSL_s390x_functions(void);
77 struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P;
79 #if defined(__GNUC__) && defined(__linux)
80 __attribute__ ((visibility("hidden")))
82 void OPENSSL_cpuid_setup(void)
84 struct OPENSSL_s390xcap_st cap;
86 if (OPENSSL_s390xcap_P.stfle[0])
89 /* set a bit that will not be tested later */
90 OPENSSL_s390xcap_P.stfle[0] |= S390X_CAPBIT(0);
92 #if defined(OSSL_IMPLEMENT_GETAUXVAL)
94 const unsigned long hwcap = getauxval(AT_HWCAP);
96 /* protection against missing store-facility-list-extended */
97 if (hwcap & HWCAP_S390_STFLE)
98 OPENSSL_s390x_facilities();
100 /* protection against disabled vector facility */
101 if (!(hwcap & HWCAP_S390_VX)) {
102 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
103 | S390X_CAPBIT(S390X_VXD)
104 | S390X_CAPBIT(S390X_VXE));
110 struct sigaction ill_act, oact_ill, oact_fpe;
112 memset(&ill_act, 0, sizeof(ill_act));
113 ill_act.sa_handler = ill_handler;
114 sigfillset(&ill_act.sa_mask);
115 sigdelset(&ill_act.sa_mask, SIGILL);
116 sigdelset(&ill_act.sa_mask, SIGFPE);
117 sigdelset(&ill_act.sa_mask, SIGTRAP);
119 sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
120 sigaction(SIGILL, &ill_act, &oact_ill);
121 sigaction(SIGFPE, &ill_act, &oact_fpe);
123 /* protection against missing store-facility-list-extended */
124 if (sigsetjmp(ill_jmp, 1) == 0)
125 OPENSSL_s390x_facilities();
127 /* protection against disabled vector facility */
128 if ((OPENSSL_s390xcap_P.stfle[2] & S390X_CAPBIT(S390X_VX))
129 && (sigsetjmp(ill_jmp, 1) == 0)) {
132 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
133 | S390X_CAPBIT(S390X_VXD)
134 | S390X_CAPBIT(S390X_VXE));
137 sigaction(SIGFPE, &oact_fpe, NULL);
138 sigaction(SIGILL, &oact_ill, NULL);
139 sigprocmask(SIG_SETMASK, &oset, NULL);
143 env = getenv("OPENSSL_s390xcap");
145 if (!parse_env(&cap))
150 OPENSSL_s390xcap_P.stfle[0] &= cap.stfle[0];
151 OPENSSL_s390xcap_P.stfle[1] &= cap.stfle[1];
152 OPENSSL_s390xcap_P.stfle[2] &= cap.stfle[2];
155 OPENSSL_s390x_functions(); /* check OPENSSL_s390xcap_P.stfle */
158 OPENSSL_s390xcap_P.kimd[0] &= cap.kimd[0];
159 OPENSSL_s390xcap_P.kimd[1] &= cap.kimd[1];
160 OPENSSL_s390xcap_P.klmd[0] &= cap.klmd[0];
161 OPENSSL_s390xcap_P.klmd[1] &= cap.klmd[1];
162 OPENSSL_s390xcap_P.km[0] &= cap.km[0];
163 OPENSSL_s390xcap_P.km[1] &= cap.km[1];
164 OPENSSL_s390xcap_P.kmc[0] &= cap.kmc[0];
165 OPENSSL_s390xcap_P.kmc[1] &= cap.kmc[1];
166 OPENSSL_s390xcap_P.kmac[0] &= cap.kmac[0];
167 OPENSSL_s390xcap_P.kmac[1] &= cap.kmac[1];
168 OPENSSL_s390xcap_P.kmctr[0] &= cap.kmctr[0];
169 OPENSSL_s390xcap_P.kmctr[1] &= cap.kmctr[1];
170 OPENSSL_s390xcap_P.kmo[0] &= cap.kmo[0];
171 OPENSSL_s390xcap_P.kmo[1] &= cap.kmo[1];
172 OPENSSL_s390xcap_P.kmf[0] &= cap.kmf[0];
173 OPENSSL_s390xcap_P.kmf[1] &= cap.kmf[1];
174 OPENSSL_s390xcap_P.prno[0] &= cap.prno[0];
175 OPENSSL_s390xcap_P.prno[1] &= cap.prno[1];
176 OPENSSL_s390xcap_P.kma[0] &= cap.kma[0];
177 OPENSSL_s390xcap_P.kma[1] &= cap.kma[1];
178 OPENSSL_s390xcap_P.pcc[0] &= cap.pcc[0];
179 OPENSSL_s390xcap_P.pcc[1] &= cap.pcc[1];
180 OPENSSL_s390xcap_P.kdsa[0] &= cap.kdsa[0];
181 OPENSSL_s390xcap_P.kdsa[1] &= cap.kdsa[1];
185 static int parse_env(struct OPENSSL_s390xcap_st *cap)
189 * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
193 * z900 (2000) - z/Architecture POP SA22-7832-00
194 * Facility detection would fail on real hw (no STFLE).
196 static const struct OPENSSL_s390xcap_st z900 = {
197 /*.stfle = */{0ULL, 0ULL, 0ULL, 0ULL},
198 /*.kimd = */{0ULL, 0ULL},
199 /*.klmd = */{0ULL, 0ULL},
200 /*.km = */{0ULL, 0ULL},
201 /*.kmc = */{0ULL, 0ULL},
202 /*.kmac = */{0ULL, 0ULL},
203 /*.kmctr = */{0ULL, 0ULL},
204 /*.kmo = */{0ULL, 0ULL},
205 /*.kmf = */{0ULL, 0ULL},
206 /*.prno = */{0ULL, 0ULL},
207 /*.kma = */{0ULL, 0ULL},
208 /*.pcc = */{0ULL, 0ULL},
209 /*.kdsa = */{0ULL, 0ULL},
213 * z990 (2003) - z/Architecture POP SA22-7832-02
214 * Implements MSA. Facility detection would fail on real hw (no STFLE).
216 static const struct OPENSSL_s390xcap_st z990 = {
217 /*.stfle = */{S390X_CAPBIT(S390X_MSA),
219 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
220 | S390X_CAPBIT(S390X_SHA_1),
222 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
223 | S390X_CAPBIT(S390X_SHA_1),
225 /*.km = */{S390X_CAPBIT(S390X_QUERY),
227 /*.kmc = */{S390X_CAPBIT(S390X_QUERY),
229 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
231 /*.kmctr = */{0ULL, 0ULL},
232 /*.kmo = */{0ULL, 0ULL},
233 /*.kmf = */{0ULL, 0ULL},
234 /*.prno = */{0ULL, 0ULL},
235 /*.kma = */{0ULL, 0ULL},
236 /*.pcc = */{0ULL, 0ULL},
237 /*.kdsa = */{0ULL, 0ULL},
241 * z9 (2005) - z/Architecture POP SA22-7832-04
242 * Implements MSA and MSA1.
244 static const struct OPENSSL_s390xcap_st z9 = {
245 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
246 | S390X_CAPBIT(S390X_STCKF),
248 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
249 | S390X_CAPBIT(S390X_SHA_1)
250 | S390X_CAPBIT(S390X_SHA_256),
252 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
253 | S390X_CAPBIT(S390X_SHA_1)
254 | S390X_CAPBIT(S390X_SHA_256),
256 /*.km = */{S390X_CAPBIT(S390X_QUERY)
257 | S390X_CAPBIT(S390X_AES_128),
259 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
260 | S390X_CAPBIT(S390X_AES_128),
262 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
264 /*.kmctr = */{0ULL, 0ULL},
265 /*.kmo = */{0ULL, 0ULL},
266 /*.kmf = */{0ULL, 0ULL},
267 /*.prno = */{0ULL, 0ULL},
268 /*.kma = */{0ULL, 0ULL},
269 /*.pcc = */{0ULL, 0ULL},
270 /*.kdsa = */{0ULL, 0ULL},
274 * z10 (2008) - z/Architecture POP SA22-7832-06
275 * Implements MSA and MSA1-2.
277 static const struct OPENSSL_s390xcap_st z10 = {
278 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
279 | S390X_CAPBIT(S390X_STCKF),
281 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
282 | S390X_CAPBIT(S390X_SHA_1)
283 | S390X_CAPBIT(S390X_SHA_256)
284 | S390X_CAPBIT(S390X_SHA_512),
286 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
287 | S390X_CAPBIT(S390X_SHA_1)
288 | S390X_CAPBIT(S390X_SHA_256)
289 | S390X_CAPBIT(S390X_SHA_512),
291 /*.km = */{S390X_CAPBIT(S390X_QUERY)
292 | S390X_CAPBIT(S390X_AES_128)
293 | S390X_CAPBIT(S390X_AES_192)
294 | S390X_CAPBIT(S390X_AES_256),
296 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
297 | S390X_CAPBIT(S390X_AES_128)
298 | S390X_CAPBIT(S390X_AES_192)
299 | S390X_CAPBIT(S390X_AES_256),
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 * z196 (2010) - z/Architecture POP SA22-7832-08
314 * Implements MSA and MSA1-4.
316 static const struct OPENSSL_s390xcap_st z196 = {
317 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
318 | S390X_CAPBIT(S390X_STCKF),
319 S390X_CAPBIT(S390X_MSA3)
320 | S390X_CAPBIT(S390X_MSA4),
322 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
323 | S390X_CAPBIT(S390X_SHA_1)
324 | S390X_CAPBIT(S390X_SHA_256)
325 | S390X_CAPBIT(S390X_SHA_512),
326 S390X_CAPBIT(S390X_GHASH)},
327 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
328 | S390X_CAPBIT(S390X_SHA_1)
329 | S390X_CAPBIT(S390X_SHA_256)
330 | S390X_CAPBIT(S390X_SHA_512),
332 /*.km = */{S390X_CAPBIT(S390X_QUERY)
333 | S390X_CAPBIT(S390X_AES_128)
334 | S390X_CAPBIT(S390X_AES_192)
335 | S390X_CAPBIT(S390X_AES_256)
336 | S390X_CAPBIT(S390X_XTS_AES_128)
337 | S390X_CAPBIT(S390X_XTS_AES_256),
339 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
340 | S390X_CAPBIT(S390X_AES_128)
341 | S390X_CAPBIT(S390X_AES_192)
342 | S390X_CAPBIT(S390X_AES_256),
344 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
345 | S390X_CAPBIT(S390X_AES_128)
346 | S390X_CAPBIT(S390X_AES_192)
347 | S390X_CAPBIT(S390X_AES_256),
349 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
350 | S390X_CAPBIT(S390X_AES_128)
351 | S390X_CAPBIT(S390X_AES_192)
352 | S390X_CAPBIT(S390X_AES_256),
354 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
355 | S390X_CAPBIT(S390X_AES_128)
356 | S390X_CAPBIT(S390X_AES_192)
357 | S390X_CAPBIT(S390X_AES_256),
359 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
360 | S390X_CAPBIT(S390X_AES_128)
361 | S390X_CAPBIT(S390X_AES_192)
362 | S390X_CAPBIT(S390X_AES_256),
364 /*.prno = */{0ULL, 0ULL},
365 /*.kma = */{0ULL, 0ULL},
366 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
368 /*.kdsa = */{0ULL, 0ULL},
372 * zEC12 (2012) - z/Architecture POP SA22-7832-09
373 * Implements MSA and MSA1-4.
375 static const struct OPENSSL_s390xcap_st zEC12 = {
376 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
377 | S390X_CAPBIT(S390X_STCKF),
378 S390X_CAPBIT(S390X_MSA3)
379 | S390X_CAPBIT(S390X_MSA4),
381 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
382 | S390X_CAPBIT(S390X_SHA_1)
383 | S390X_CAPBIT(S390X_SHA_256)
384 | S390X_CAPBIT(S390X_SHA_512),
385 S390X_CAPBIT(S390X_GHASH)},
386 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
387 | S390X_CAPBIT(S390X_SHA_1)
388 | S390X_CAPBIT(S390X_SHA_256)
389 | S390X_CAPBIT(S390X_SHA_512),
391 /*.km = */{S390X_CAPBIT(S390X_QUERY)
392 | S390X_CAPBIT(S390X_AES_128)
393 | S390X_CAPBIT(S390X_AES_192)
394 | S390X_CAPBIT(S390X_AES_256)
395 | S390X_CAPBIT(S390X_XTS_AES_128)
396 | S390X_CAPBIT(S390X_XTS_AES_256),
398 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
399 | S390X_CAPBIT(S390X_AES_128)
400 | S390X_CAPBIT(S390X_AES_192)
401 | S390X_CAPBIT(S390X_AES_256),
403 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
404 | S390X_CAPBIT(S390X_AES_128)
405 | S390X_CAPBIT(S390X_AES_192)
406 | S390X_CAPBIT(S390X_AES_256),
408 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
409 | S390X_CAPBIT(S390X_AES_128)
410 | S390X_CAPBIT(S390X_AES_192)
411 | S390X_CAPBIT(S390X_AES_256),
413 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
414 | S390X_CAPBIT(S390X_AES_128)
415 | S390X_CAPBIT(S390X_AES_192)
416 | S390X_CAPBIT(S390X_AES_256),
418 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
419 | S390X_CAPBIT(S390X_AES_128)
420 | S390X_CAPBIT(S390X_AES_192)
421 | S390X_CAPBIT(S390X_AES_256),
423 /*.prno = */{0ULL, 0ULL},
424 /*.kma = */{0ULL, 0ULL},
425 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
427 /*.kdsa = */{0ULL, 0ULL},
431 * z13 (2015) - z/Architecture POP SA22-7832-10
432 * Implements MSA and MSA1-5.
434 static const struct OPENSSL_s390xcap_st z13 = {
435 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
436 | S390X_CAPBIT(S390X_STCKF)
437 | S390X_CAPBIT(S390X_MSA5),
438 S390X_CAPBIT(S390X_MSA3)
439 | S390X_CAPBIT(S390X_MSA4),
440 S390X_CAPBIT(S390X_VX),
442 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
443 | S390X_CAPBIT(S390X_SHA_1)
444 | S390X_CAPBIT(S390X_SHA_256)
445 | S390X_CAPBIT(S390X_SHA_512),
446 S390X_CAPBIT(S390X_GHASH)},
447 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
448 | S390X_CAPBIT(S390X_SHA_1)
449 | S390X_CAPBIT(S390X_SHA_256)
450 | S390X_CAPBIT(S390X_SHA_512),
452 /*.km = */{S390X_CAPBIT(S390X_QUERY)
453 | S390X_CAPBIT(S390X_AES_128)
454 | S390X_CAPBIT(S390X_AES_192)
455 | S390X_CAPBIT(S390X_AES_256)
456 | S390X_CAPBIT(S390X_XTS_AES_128)
457 | S390X_CAPBIT(S390X_XTS_AES_256),
459 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
460 | S390X_CAPBIT(S390X_AES_128)
461 | S390X_CAPBIT(S390X_AES_192)
462 | S390X_CAPBIT(S390X_AES_256),
464 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
465 | S390X_CAPBIT(S390X_AES_128)
466 | S390X_CAPBIT(S390X_AES_192)
467 | S390X_CAPBIT(S390X_AES_256),
469 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
470 | S390X_CAPBIT(S390X_AES_128)
471 | S390X_CAPBIT(S390X_AES_192)
472 | S390X_CAPBIT(S390X_AES_256),
474 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
475 | S390X_CAPBIT(S390X_AES_128)
476 | S390X_CAPBIT(S390X_AES_192)
477 | S390X_CAPBIT(S390X_AES_256),
479 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
480 | S390X_CAPBIT(S390X_AES_128)
481 | S390X_CAPBIT(S390X_AES_192)
482 | S390X_CAPBIT(S390X_AES_256),
484 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
485 | S390X_CAPBIT(S390X_SHA_512_DRNG),
487 /*.kma = */{0ULL, 0ULL},
488 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
490 /*.kdsa = */{0ULL, 0ULL},
494 * z14 (2017) - z/Architecture POP SA22-7832-11
495 * Implements MSA and MSA1-8.
497 static const struct OPENSSL_s390xcap_st z14 = {
498 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
499 | S390X_CAPBIT(S390X_STCKF)
500 | S390X_CAPBIT(S390X_MSA5),
501 S390X_CAPBIT(S390X_MSA3)
502 | S390X_CAPBIT(S390X_MSA4),
503 S390X_CAPBIT(S390X_VX)
504 | S390X_CAPBIT(S390X_VXD)
505 | S390X_CAPBIT(S390X_VXE)
506 | S390X_CAPBIT(S390X_MSA8),
508 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
509 | S390X_CAPBIT(S390X_SHA_1)
510 | S390X_CAPBIT(S390X_SHA_256)
511 | S390X_CAPBIT(S390X_SHA_512)
512 | S390X_CAPBIT(S390X_SHA3_224)
513 | S390X_CAPBIT(S390X_SHA3_256)
514 | S390X_CAPBIT(S390X_SHA3_384)
515 | S390X_CAPBIT(S390X_SHA3_512)
516 | S390X_CAPBIT(S390X_SHAKE_128)
517 | S390X_CAPBIT(S390X_SHAKE_256),
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)
523 | S390X_CAPBIT(S390X_SHA3_224)
524 | S390X_CAPBIT(S390X_SHA3_256)
525 | S390X_CAPBIT(S390X_SHA3_384)
526 | S390X_CAPBIT(S390X_SHA3_512)
527 | S390X_CAPBIT(S390X_SHAKE_128)
528 | S390X_CAPBIT(S390X_SHAKE_256),
530 /*.km = */{S390X_CAPBIT(S390X_QUERY)
531 | S390X_CAPBIT(S390X_AES_128)
532 | S390X_CAPBIT(S390X_AES_192)
533 | S390X_CAPBIT(S390X_AES_256)
534 | S390X_CAPBIT(S390X_XTS_AES_128)
535 | S390X_CAPBIT(S390X_XTS_AES_256),
537 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
538 | S390X_CAPBIT(S390X_AES_128)
539 | S390X_CAPBIT(S390X_AES_192)
540 | S390X_CAPBIT(S390X_AES_256),
542 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
543 | S390X_CAPBIT(S390X_AES_128)
544 | S390X_CAPBIT(S390X_AES_192)
545 | S390X_CAPBIT(S390X_AES_256),
547 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
548 | S390X_CAPBIT(S390X_AES_128)
549 | S390X_CAPBIT(S390X_AES_192)
550 | S390X_CAPBIT(S390X_AES_256),
552 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
553 | S390X_CAPBIT(S390X_AES_128)
554 | S390X_CAPBIT(S390X_AES_192)
555 | S390X_CAPBIT(S390X_AES_256),
557 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
558 | S390X_CAPBIT(S390X_AES_128)
559 | S390X_CAPBIT(S390X_AES_192)
560 | S390X_CAPBIT(S390X_AES_256),
562 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
563 | S390X_CAPBIT(S390X_SHA_512_DRNG),
564 S390X_CAPBIT(S390X_TRNG)},
565 /*.kma = */{S390X_CAPBIT(S390X_QUERY)
566 | S390X_CAPBIT(S390X_AES_128)
567 | S390X_CAPBIT(S390X_AES_192)
568 | S390X_CAPBIT(S390X_AES_256),
570 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
572 /*.kdsa = */{0ULL, 0ULL},
576 * z15 (2019) - z/Architecture POP SA22-7832-12
577 * Implements MSA and MSA1-9.
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),
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),
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),
620 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
621 | S390X_CAPBIT(S390X_AES_128)
622 | S390X_CAPBIT(S390X_AES_192)
623 | S390X_CAPBIT(S390X_AES_256),
625 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
626 | S390X_CAPBIT(S390X_AES_128)
627 | S390X_CAPBIT(S390X_AES_192)
628 | S390X_CAPBIT(S390X_AES_256),
630 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
631 | S390X_CAPBIT(S390X_AES_128)
632 | S390X_CAPBIT(S390X_AES_192)
633 | S390X_CAPBIT(S390X_AES_256),
635 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
636 | S390X_CAPBIT(S390X_AES_128)
637 | S390X_CAPBIT(S390X_AES_192)
638 | S390X_CAPBIT(S390X_AES_256),
640 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
641 | S390X_CAPBIT(S390X_AES_128)
642 | S390X_CAPBIT(S390X_AES_192)
643 | S390X_CAPBIT(S390X_AES_256),
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),
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),
676 * z16 (2022) - z/Architecture POP
677 * Implements MSA and MSA1-9 (same as z15, no need to repeat).
680 char *tok_begin, *tok_end, *buff, tok[S390X_STFLE_MAX][LEN + 1];
683 buff = malloc(strlen(env) + 1);
688 memset(cap, ~0, sizeof(*cap));
691 tok_begin = buff + strspn(buff, ";");
692 strtok(tok_begin, ";");
693 tok_end = strtok(NULL, ";");
695 while (tok_begin != NULL) {
697 if ((n = sscanf(tok_begin,
698 " stfle : %" STR(LEN) "[^:] : "
699 "%" STR(LEN) "[^:] : %" STR(LEN) "s ",
700 tok[0], tok[1], tok[2]))) {
701 for (i = 0; i < n; i++) {
702 off = (tok[i][0] == '~') ? 1 : 0;
703 if (sscanf(tok[i] + off, "%llx", &cap->stfle[i]) != 1)
706 cap->stfle[i] = ~cap->stfle[i];
710 /* query function tokens */
711 else if TOK_FUNC(kimd)
712 else if TOK_FUNC(klmd)
714 else if TOK_FUNC(kmc)
715 else if TOK_FUNC(kmac)
716 else if TOK_FUNC(kmctr)
717 else if TOK_FUNC(kmo)
718 else if TOK_FUNC(kmf)
719 else if TOK_FUNC(prno)
720 else if TOK_FUNC(kma)
721 else if TOK_FUNC(pcc)
722 else if TOK_FUNC(kdsa)
724 /* CPU model tokens */
725 else if TOK_CPU(z900)
726 else if TOK_CPU(z990)
729 else if TOK_CPU(z196)
730 else if TOK_CPU(zEC12)
734 else if TOK_CPU_ALIAS(z16, z15)
736 /* whitespace(ignored) or invalid tokens */
738 while (*tok_begin != '\0') {
739 if (!ossl_isspace(*tok_begin))
746 tok_end = strtok(NULL, ";");