2 * Copyright 2010-2018 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(NAME) \
53 " %" STR(LEN) "s %" STR(LEN) "s ", \
54 tok[0], tok[1]) == 1 \
55 && !strcmp(tok[0], #NAME)) { \
56 memcpy(cap, &NAME, sizeof(*cap)); \
59 #ifndef OSSL_IMPLEMENT_GETAUXVAL
60 static sigjmp_buf ill_jmp;
61 static void ill_handler(int sig)
63 siglongjmp(ill_jmp, sig);
66 void OPENSSL_vx_probe(void);
69 static const char *env;
70 static int parse_env(struct OPENSSL_s390xcap_st *cap);
72 void OPENSSL_s390x_facilities(void);
73 void OPENSSL_s390x_functions(void);
75 struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P;
77 #if defined(__GNUC__) && defined(__linux)
78 __attribute__ ((visibility("hidden")))
80 void OPENSSL_cpuid_setup(void)
82 struct OPENSSL_s390xcap_st cap;
84 if (OPENSSL_s390xcap_P.stfle[0])
87 /* set a bit that will not be tested later */
88 OPENSSL_s390xcap_P.stfle[0] |= S390X_CAPBIT(0);
90 #if defined(OSSL_IMPLEMENT_GETAUXVAL)
92 const unsigned long hwcap = getauxval(AT_HWCAP);
94 /* protection against missing store-facility-list-extended */
95 if (hwcap & HWCAP_S390_STFLE)
96 OPENSSL_s390x_facilities();
98 /* protection against disabled vector facility */
99 if (!(hwcap & HWCAP_S390_VX)) {
100 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
101 | S390X_CAPBIT(S390X_VXD)
102 | S390X_CAPBIT(S390X_VXE));
108 struct sigaction ill_act, oact_ill, oact_fpe;
110 memset(&ill_act, 0, sizeof(ill_act));
111 ill_act.sa_handler = ill_handler;
112 sigfillset(&ill_act.sa_mask);
113 sigdelset(&ill_act.sa_mask, SIGILL);
114 sigdelset(&ill_act.sa_mask, SIGFPE);
115 sigdelset(&ill_act.sa_mask, SIGTRAP);
117 sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
118 sigaction(SIGILL, &ill_act, &oact_ill);
119 sigaction(SIGFPE, &ill_act, &oact_fpe);
121 /* protection against missing store-facility-list-extended */
122 if (sigsetjmp(ill_jmp, 1) == 0)
123 OPENSSL_s390x_facilities();
125 /* protection against disabled vector facility */
126 if ((OPENSSL_s390xcap_P.stfle[2] & S390X_CAPBIT(S390X_VX))
127 && (sigsetjmp(ill_jmp, 1) == 0)) {
130 OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
131 | S390X_CAPBIT(S390X_VXD)
132 | S390X_CAPBIT(S390X_VXE));
135 sigaction(SIGFPE, &oact_fpe, NULL);
136 sigaction(SIGILL, &oact_ill, NULL);
137 sigprocmask(SIG_SETMASK, &oset, NULL);
141 env = getenv("OPENSSL_s390xcap");
143 if (!parse_env(&cap))
148 OPENSSL_s390xcap_P.stfle[0] &= cap.stfle[0];
149 OPENSSL_s390xcap_P.stfle[1] &= cap.stfle[1];
150 OPENSSL_s390xcap_P.stfle[2] &= cap.stfle[2];
153 OPENSSL_s390x_functions(); /* check OPENSSL_s390xcap_P.stfle */
156 OPENSSL_s390xcap_P.kimd[0] &= cap.kimd[0];
157 OPENSSL_s390xcap_P.kimd[1] &= cap.kimd[1];
158 OPENSSL_s390xcap_P.klmd[0] &= cap.klmd[0];
159 OPENSSL_s390xcap_P.klmd[1] &= cap.klmd[1];
160 OPENSSL_s390xcap_P.km[0] &= cap.km[0];
161 OPENSSL_s390xcap_P.km[1] &= cap.km[1];
162 OPENSSL_s390xcap_P.kmc[0] &= cap.kmc[0];
163 OPENSSL_s390xcap_P.kmc[1] &= cap.kmc[1];
164 OPENSSL_s390xcap_P.kmac[0] &= cap.kmac[0];
165 OPENSSL_s390xcap_P.kmac[1] &= cap.kmac[1];
166 OPENSSL_s390xcap_P.kmctr[0] &= cap.kmctr[0];
167 OPENSSL_s390xcap_P.kmctr[1] &= cap.kmctr[1];
168 OPENSSL_s390xcap_P.kmo[0] &= cap.kmo[0];
169 OPENSSL_s390xcap_P.kmo[1] &= cap.kmo[1];
170 OPENSSL_s390xcap_P.kmf[0] &= cap.kmf[0];
171 OPENSSL_s390xcap_P.kmf[1] &= cap.kmf[1];
172 OPENSSL_s390xcap_P.prno[0] &= cap.prno[0];
173 OPENSSL_s390xcap_P.prno[1] &= cap.prno[1];
174 OPENSSL_s390xcap_P.kma[0] &= cap.kma[0];
175 OPENSSL_s390xcap_P.kma[1] &= cap.kma[1];
176 OPENSSL_s390xcap_P.pcc[0] &= cap.pcc[0];
177 OPENSSL_s390xcap_P.pcc[1] &= cap.pcc[1];
178 OPENSSL_s390xcap_P.kdsa[0] &= cap.kdsa[0];
179 OPENSSL_s390xcap_P.kdsa[1] &= cap.kdsa[1];
183 static int parse_env(struct OPENSSL_s390xcap_st *cap)
187 * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
191 * z900 (2000) - z/Architecture POP SA22-7832-00
192 * Facility detection would fail on real hw (no STFLE).
194 static const struct OPENSSL_s390xcap_st z900 = {
195 /*.stfle = */{0ULL, 0ULL, 0ULL, 0ULL},
196 /*.kimd = */{0ULL, 0ULL},
197 /*.klmd = */{0ULL, 0ULL},
198 /*.km = */{0ULL, 0ULL},
199 /*.kmc = */{0ULL, 0ULL},
200 /*.kmac = */{0ULL, 0ULL},
201 /*.kmctr = */{0ULL, 0ULL},
202 /*.kmo = */{0ULL, 0ULL},
203 /*.kmf = */{0ULL, 0ULL},
204 /*.prno = */{0ULL, 0ULL},
205 /*.kma = */{0ULL, 0ULL},
206 /*.pcc = */{0ULL, 0ULL},
207 /*.kdsa = */{0ULL, 0ULL},
211 * z990 (2003) - z/Architecture POP SA22-7832-02
212 * Implements MSA. Facility detection would fail on real hw (no STFLE).
214 static const struct OPENSSL_s390xcap_st z990 = {
215 /*.stfle = */{S390X_CAPBIT(S390X_MSA),
217 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
218 | S390X_CAPBIT(S390X_SHA_1),
220 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
221 | S390X_CAPBIT(S390X_SHA_1),
223 /*.km = */{S390X_CAPBIT(S390X_QUERY),
225 /*.kmc = */{S390X_CAPBIT(S390X_QUERY),
227 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
229 /*.kmctr = */{0ULL, 0ULL},
230 /*.kmo = */{0ULL, 0ULL},
231 /*.kmf = */{0ULL, 0ULL},
232 /*.prno = */{0ULL, 0ULL},
233 /*.kma = */{0ULL, 0ULL},
234 /*.pcc = */{0ULL, 0ULL},
235 /*.kdsa = */{0ULL, 0ULL},
239 * z9 (2005) - z/Architecture POP SA22-7832-04
240 * Implements MSA and MSA1.
242 static const struct OPENSSL_s390xcap_st z9 = {
243 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
244 | S390X_CAPBIT(S390X_STCKF),
246 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
247 | S390X_CAPBIT(S390X_SHA_1)
248 | S390X_CAPBIT(S390X_SHA_256),
250 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
251 | S390X_CAPBIT(S390X_SHA_1)
252 | S390X_CAPBIT(S390X_SHA_256),
254 /*.km = */{S390X_CAPBIT(S390X_QUERY)
255 | S390X_CAPBIT(S390X_AES_128),
257 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
258 | S390X_CAPBIT(S390X_AES_128),
260 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
262 /*.kmctr = */{0ULL, 0ULL},
263 /*.kmo = */{0ULL, 0ULL},
264 /*.kmf = */{0ULL, 0ULL},
265 /*.prno = */{0ULL, 0ULL},
266 /*.kma = */{0ULL, 0ULL},
267 /*.pcc = */{0ULL, 0ULL},
268 /*.kdsa = */{0ULL, 0ULL},
272 * z10 (2008) - z/Architecture POP SA22-7832-06
273 * Implements MSA and MSA1-2.
275 static const struct OPENSSL_s390xcap_st z10 = {
276 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
277 | S390X_CAPBIT(S390X_STCKF),
279 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
280 | S390X_CAPBIT(S390X_SHA_1)
281 | S390X_CAPBIT(S390X_SHA_256)
282 | S390X_CAPBIT(S390X_SHA_512),
284 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
285 | S390X_CAPBIT(S390X_SHA_1)
286 | S390X_CAPBIT(S390X_SHA_256)
287 | S390X_CAPBIT(S390X_SHA_512),
289 /*.km = */{S390X_CAPBIT(S390X_QUERY)
290 | S390X_CAPBIT(S390X_AES_128)
291 | S390X_CAPBIT(S390X_AES_192)
292 | S390X_CAPBIT(S390X_AES_256),
294 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
295 | S390X_CAPBIT(S390X_AES_128)
296 | S390X_CAPBIT(S390X_AES_192)
297 | S390X_CAPBIT(S390X_AES_256),
299 /*.kmac = */{S390X_CAPBIT(S390X_QUERY),
301 /*.kmctr = */{0ULL, 0ULL},
302 /*.kmo = */{0ULL, 0ULL},
303 /*.kmf = */{0ULL, 0ULL},
304 /*.prno = */{0ULL, 0ULL},
305 /*.kma = */{0ULL, 0ULL},
306 /*.pcc = */{0ULL, 0ULL},
307 /*.kdsa = */{0ULL, 0ULL},
311 * z196 (2010) - z/Architecture POP SA22-7832-08
312 * Implements MSA and MSA1-4.
314 static const struct OPENSSL_s390xcap_st z196 = {
315 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
316 | S390X_CAPBIT(S390X_STCKF),
317 S390X_CAPBIT(S390X_MSA3)
318 | S390X_CAPBIT(S390X_MSA4),
320 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
321 | S390X_CAPBIT(S390X_SHA_1)
322 | S390X_CAPBIT(S390X_SHA_256)
323 | S390X_CAPBIT(S390X_SHA_512),
324 S390X_CAPBIT(S390X_GHASH)},
325 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
326 | S390X_CAPBIT(S390X_SHA_1)
327 | S390X_CAPBIT(S390X_SHA_256)
328 | S390X_CAPBIT(S390X_SHA_512),
330 /*.km = */{S390X_CAPBIT(S390X_QUERY)
331 | S390X_CAPBIT(S390X_AES_128)
332 | S390X_CAPBIT(S390X_AES_192)
333 | S390X_CAPBIT(S390X_AES_256)
334 | S390X_CAPBIT(S390X_XTS_AES_128)
335 | S390X_CAPBIT(S390X_XTS_AES_256),
337 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
338 | S390X_CAPBIT(S390X_AES_128)
339 | S390X_CAPBIT(S390X_AES_192)
340 | S390X_CAPBIT(S390X_AES_256),
342 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
343 | S390X_CAPBIT(S390X_AES_128)
344 | S390X_CAPBIT(S390X_AES_192)
345 | S390X_CAPBIT(S390X_AES_256),
347 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
348 | S390X_CAPBIT(S390X_AES_128)
349 | S390X_CAPBIT(S390X_AES_192)
350 | S390X_CAPBIT(S390X_AES_256),
352 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
353 | S390X_CAPBIT(S390X_AES_128)
354 | S390X_CAPBIT(S390X_AES_192)
355 | S390X_CAPBIT(S390X_AES_256),
357 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
358 | S390X_CAPBIT(S390X_AES_128)
359 | S390X_CAPBIT(S390X_AES_192)
360 | S390X_CAPBIT(S390X_AES_256),
362 /*.prno = */{0ULL, 0ULL},
363 /*.kma = */{0ULL, 0ULL},
364 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
366 /*.kdsa = */{0ULL, 0ULL},
370 * zEC12 (2012) - z/Architecture POP SA22-7832-09
371 * Implements MSA and MSA1-4.
373 static const struct OPENSSL_s390xcap_st zEC12 = {
374 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
375 | S390X_CAPBIT(S390X_STCKF),
376 S390X_CAPBIT(S390X_MSA3)
377 | S390X_CAPBIT(S390X_MSA4),
379 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
380 | S390X_CAPBIT(S390X_SHA_1)
381 | S390X_CAPBIT(S390X_SHA_256)
382 | S390X_CAPBIT(S390X_SHA_512),
383 S390X_CAPBIT(S390X_GHASH)},
384 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
385 | S390X_CAPBIT(S390X_SHA_1)
386 | S390X_CAPBIT(S390X_SHA_256)
387 | S390X_CAPBIT(S390X_SHA_512),
389 /*.km = */{S390X_CAPBIT(S390X_QUERY)
390 | S390X_CAPBIT(S390X_AES_128)
391 | S390X_CAPBIT(S390X_AES_192)
392 | S390X_CAPBIT(S390X_AES_256)
393 | S390X_CAPBIT(S390X_XTS_AES_128)
394 | S390X_CAPBIT(S390X_XTS_AES_256),
396 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
397 | S390X_CAPBIT(S390X_AES_128)
398 | S390X_CAPBIT(S390X_AES_192)
399 | S390X_CAPBIT(S390X_AES_256),
401 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
402 | S390X_CAPBIT(S390X_AES_128)
403 | S390X_CAPBIT(S390X_AES_192)
404 | S390X_CAPBIT(S390X_AES_256),
406 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
407 | S390X_CAPBIT(S390X_AES_128)
408 | S390X_CAPBIT(S390X_AES_192)
409 | S390X_CAPBIT(S390X_AES_256),
411 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
412 | S390X_CAPBIT(S390X_AES_128)
413 | S390X_CAPBIT(S390X_AES_192)
414 | S390X_CAPBIT(S390X_AES_256),
416 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
417 | S390X_CAPBIT(S390X_AES_128)
418 | S390X_CAPBIT(S390X_AES_192)
419 | S390X_CAPBIT(S390X_AES_256),
421 /*.prno = */{0ULL, 0ULL},
422 /*.kma = */{0ULL, 0ULL},
423 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
425 /*.kdsa = */{0ULL, 0ULL},
429 * z13 (2015) - z/Architecture POP SA22-7832-10
430 * Implements MSA and MSA1-5.
432 static const struct OPENSSL_s390xcap_st z13 = {
433 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
434 | S390X_CAPBIT(S390X_STCKF)
435 | S390X_CAPBIT(S390X_MSA5),
436 S390X_CAPBIT(S390X_MSA3)
437 | S390X_CAPBIT(S390X_MSA4),
438 S390X_CAPBIT(S390X_VX),
440 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
441 | S390X_CAPBIT(S390X_SHA_1)
442 | S390X_CAPBIT(S390X_SHA_256)
443 | S390X_CAPBIT(S390X_SHA_512),
444 S390X_CAPBIT(S390X_GHASH)},
445 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
446 | S390X_CAPBIT(S390X_SHA_1)
447 | S390X_CAPBIT(S390X_SHA_256)
448 | S390X_CAPBIT(S390X_SHA_512),
450 /*.km = */{S390X_CAPBIT(S390X_QUERY)
451 | S390X_CAPBIT(S390X_AES_128)
452 | S390X_CAPBIT(S390X_AES_192)
453 | S390X_CAPBIT(S390X_AES_256)
454 | S390X_CAPBIT(S390X_XTS_AES_128)
455 | S390X_CAPBIT(S390X_XTS_AES_256),
457 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
458 | S390X_CAPBIT(S390X_AES_128)
459 | S390X_CAPBIT(S390X_AES_192)
460 | S390X_CAPBIT(S390X_AES_256),
462 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
463 | S390X_CAPBIT(S390X_AES_128)
464 | S390X_CAPBIT(S390X_AES_192)
465 | S390X_CAPBIT(S390X_AES_256),
467 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
468 | S390X_CAPBIT(S390X_AES_128)
469 | S390X_CAPBIT(S390X_AES_192)
470 | S390X_CAPBIT(S390X_AES_256),
472 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
473 | S390X_CAPBIT(S390X_AES_128)
474 | S390X_CAPBIT(S390X_AES_192)
475 | S390X_CAPBIT(S390X_AES_256),
477 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
478 | S390X_CAPBIT(S390X_AES_128)
479 | S390X_CAPBIT(S390X_AES_192)
480 | S390X_CAPBIT(S390X_AES_256),
482 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
483 | S390X_CAPBIT(S390X_SHA_512_DRNG),
485 /*.kma = */{0ULL, 0ULL},
486 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
488 /*.kdsa = */{0ULL, 0ULL},
492 * z14 (2017) - z/Architecture POP SA22-7832-11
493 * Implements MSA and MSA1-8.
495 static const struct OPENSSL_s390xcap_st z14 = {
496 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
497 | S390X_CAPBIT(S390X_STCKF)
498 | S390X_CAPBIT(S390X_MSA5),
499 S390X_CAPBIT(S390X_MSA3)
500 | S390X_CAPBIT(S390X_MSA4),
501 S390X_CAPBIT(S390X_VX)
502 | S390X_CAPBIT(S390X_VXD)
503 | S390X_CAPBIT(S390X_VXE)
504 | S390X_CAPBIT(S390X_MSA8),
506 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
507 | S390X_CAPBIT(S390X_SHA_1)
508 | S390X_CAPBIT(S390X_SHA_256)
509 | S390X_CAPBIT(S390X_SHA_512)
510 | S390X_CAPBIT(S390X_SHA3_224)
511 | S390X_CAPBIT(S390X_SHA3_256)
512 | S390X_CAPBIT(S390X_SHA3_384)
513 | S390X_CAPBIT(S390X_SHA3_512)
514 | S390X_CAPBIT(S390X_SHAKE_128)
515 | S390X_CAPBIT(S390X_SHAKE_256),
516 S390X_CAPBIT(S390X_GHASH)},
517 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
518 | S390X_CAPBIT(S390X_SHA_1)
519 | S390X_CAPBIT(S390X_SHA_256)
520 | S390X_CAPBIT(S390X_SHA_512)
521 | S390X_CAPBIT(S390X_SHA3_224)
522 | S390X_CAPBIT(S390X_SHA3_256)
523 | S390X_CAPBIT(S390X_SHA3_384)
524 | S390X_CAPBIT(S390X_SHA3_512)
525 | S390X_CAPBIT(S390X_SHAKE_128)
526 | S390X_CAPBIT(S390X_SHAKE_256),
528 /*.km = */{S390X_CAPBIT(S390X_QUERY)
529 | S390X_CAPBIT(S390X_AES_128)
530 | S390X_CAPBIT(S390X_AES_192)
531 | S390X_CAPBIT(S390X_AES_256)
532 | S390X_CAPBIT(S390X_XTS_AES_128)
533 | S390X_CAPBIT(S390X_XTS_AES_256),
535 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
536 | S390X_CAPBIT(S390X_AES_128)
537 | S390X_CAPBIT(S390X_AES_192)
538 | S390X_CAPBIT(S390X_AES_256),
540 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
541 | S390X_CAPBIT(S390X_AES_128)
542 | S390X_CAPBIT(S390X_AES_192)
543 | S390X_CAPBIT(S390X_AES_256),
545 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
546 | S390X_CAPBIT(S390X_AES_128)
547 | S390X_CAPBIT(S390X_AES_192)
548 | S390X_CAPBIT(S390X_AES_256),
550 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
551 | S390X_CAPBIT(S390X_AES_128)
552 | S390X_CAPBIT(S390X_AES_192)
553 | S390X_CAPBIT(S390X_AES_256),
555 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
556 | S390X_CAPBIT(S390X_AES_128)
557 | S390X_CAPBIT(S390X_AES_192)
558 | S390X_CAPBIT(S390X_AES_256),
560 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
561 | S390X_CAPBIT(S390X_SHA_512_DRNG),
562 S390X_CAPBIT(S390X_TRNG)},
563 /*.kma = */{S390X_CAPBIT(S390X_QUERY)
564 | S390X_CAPBIT(S390X_AES_128)
565 | S390X_CAPBIT(S390X_AES_192)
566 | S390X_CAPBIT(S390X_AES_256),
568 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
570 /*.kdsa = */{0ULL, 0ULL},
574 * z15 (2019) - z/Architecture POP SA22-7832-12
575 * Implements MSA and MSA1-9.
577 static const struct OPENSSL_s390xcap_st z15 = {
578 /*.stfle = */{S390X_CAPBIT(S390X_MSA)
579 | S390X_CAPBIT(S390X_STCKF)
580 | S390X_CAPBIT(S390X_MSA5),
581 S390X_CAPBIT(S390X_MSA3)
582 | S390X_CAPBIT(S390X_MSA4),
583 S390X_CAPBIT(S390X_VX)
584 | S390X_CAPBIT(S390X_VXD)
585 | S390X_CAPBIT(S390X_VXE)
586 | S390X_CAPBIT(S390X_MSA8)
587 | S390X_CAPBIT(S390X_MSA9),
589 /*.kimd = */{S390X_CAPBIT(S390X_QUERY)
590 | S390X_CAPBIT(S390X_SHA_1)
591 | S390X_CAPBIT(S390X_SHA_256)
592 | S390X_CAPBIT(S390X_SHA_512)
593 | S390X_CAPBIT(S390X_SHA3_224)
594 | S390X_CAPBIT(S390X_SHA3_256)
595 | S390X_CAPBIT(S390X_SHA3_384)
596 | S390X_CAPBIT(S390X_SHA3_512)
597 | S390X_CAPBIT(S390X_SHAKE_128)
598 | S390X_CAPBIT(S390X_SHAKE_256),
599 S390X_CAPBIT(S390X_GHASH)},
600 /*.klmd = */{S390X_CAPBIT(S390X_QUERY)
601 | S390X_CAPBIT(S390X_SHA_1)
602 | S390X_CAPBIT(S390X_SHA_256)
603 | S390X_CAPBIT(S390X_SHA_512)
604 | S390X_CAPBIT(S390X_SHA3_224)
605 | S390X_CAPBIT(S390X_SHA3_256)
606 | S390X_CAPBIT(S390X_SHA3_384)
607 | S390X_CAPBIT(S390X_SHA3_512)
608 | S390X_CAPBIT(S390X_SHAKE_128)
609 | S390X_CAPBIT(S390X_SHAKE_256),
611 /*.km = */{S390X_CAPBIT(S390X_QUERY)
612 | S390X_CAPBIT(S390X_AES_128)
613 | S390X_CAPBIT(S390X_AES_192)
614 | S390X_CAPBIT(S390X_AES_256)
615 | S390X_CAPBIT(S390X_XTS_AES_128)
616 | S390X_CAPBIT(S390X_XTS_AES_256),
618 /*.kmc = */{S390X_CAPBIT(S390X_QUERY)
619 | S390X_CAPBIT(S390X_AES_128)
620 | S390X_CAPBIT(S390X_AES_192)
621 | S390X_CAPBIT(S390X_AES_256),
623 /*.kmac = */{S390X_CAPBIT(S390X_QUERY)
624 | S390X_CAPBIT(S390X_AES_128)
625 | S390X_CAPBIT(S390X_AES_192)
626 | S390X_CAPBIT(S390X_AES_256),
628 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY)
629 | S390X_CAPBIT(S390X_AES_128)
630 | S390X_CAPBIT(S390X_AES_192)
631 | S390X_CAPBIT(S390X_AES_256),
633 /*.kmo = */{S390X_CAPBIT(S390X_QUERY)
634 | S390X_CAPBIT(S390X_AES_128)
635 | S390X_CAPBIT(S390X_AES_192)
636 | S390X_CAPBIT(S390X_AES_256),
638 /*.kmf = */{S390X_CAPBIT(S390X_QUERY)
639 | S390X_CAPBIT(S390X_AES_128)
640 | S390X_CAPBIT(S390X_AES_192)
641 | S390X_CAPBIT(S390X_AES_256),
643 /*.prno = */{S390X_CAPBIT(S390X_QUERY)
644 | S390X_CAPBIT(S390X_SHA_512_DRNG),
645 S390X_CAPBIT(S390X_TRNG)},
646 /*.kma = */{S390X_CAPBIT(S390X_QUERY)
647 | S390X_CAPBIT(S390X_AES_128)
648 | S390X_CAPBIT(S390X_AES_192)
649 | S390X_CAPBIT(S390X_AES_256),
651 /*.pcc = */{S390X_CAPBIT(S390X_QUERY),
652 S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P256)
653 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P384)
654 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P521)
655 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED25519)
656 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED448)
657 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X25519)
658 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X448)},
659 /*.kdsa = */{S390X_CAPBIT(S390X_QUERY)
660 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P256)
661 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P384)
662 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P521)
663 | S390X_CAPBIT(S390X_ECDSA_SIGN_P256)
664 | S390X_CAPBIT(S390X_ECDSA_SIGN_P384)
665 | S390X_CAPBIT(S390X_ECDSA_SIGN_P521)
666 | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED25519)
667 | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED448)
668 | S390X_CAPBIT(S390X_EDDSA_SIGN_ED25519)
669 | S390X_CAPBIT(S390X_EDDSA_SIGN_ED448),
673 char *tok_begin, *tok_end, *buff, tok[S390X_STFLE_MAX][LEN + 1];
676 buff = malloc(strlen(env) + 1);
681 memset(cap, ~0, sizeof(*cap));
684 tok_begin = buff + strspn(buff, ";");
685 strtok(tok_begin, ";");
686 tok_end = strtok(NULL, ";");
688 while (tok_begin != NULL) {
690 if ((n = sscanf(tok_begin,
691 " stfle : %" STR(LEN) "[^:] : "
692 "%" STR(LEN) "[^:] : %" STR(LEN) "s ",
693 tok[0], tok[1], tok[2]))) {
694 for (i = 0; i < n; i++) {
695 off = (tok[i][0] == '~') ? 1 : 0;
696 if (sscanf(tok[i] + off, "%llx", &cap->stfle[i]) != 1)
699 cap->stfle[i] = ~cap->stfle[i];
703 /* query function tokens */
704 else if TOK_FUNC(kimd)
705 else if TOK_FUNC(klmd)
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)
717 /* CPU model tokens */
718 else if TOK_CPU(z900)
719 else if TOK_CPU(z990)
722 else if TOK_CPU(z196)
723 else if TOK_CPU(zEC12)
728 /* whitespace(ignored) or invalid tokens */
730 while (*tok_begin != '\0') {
731 if (!ossl_isspace(*tok_begin))
738 tok_end = strtok(NULL, ";");