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 "internal/ctype.h"
17 #include "s390x_arch.h"
21 #define STR(S) STR_(S)
23 #define TOK_FUNC(NAME) \
25 " " STR(NAME) " : %" STR(LEN) "[^:] : " \
26 "%" STR(LEN) "s %" STR(LEN) "s ", \
27 tok[0], tok[1], tok[2]) == 2) { \
29 off = (tok[0][0] == '~') ? 1 : 0; \
30 if (sscanf(tok[0] + off, "%llx", &cap->NAME[0]) != 1) \
33 cap->NAME[0] = ~cap->NAME[0]; \
35 off = (tok[1][0] == '~') ? 1 : 0; \
36 if (sscanf(tok[1] + off, "%llx", &cap->NAME[1]) != 1) \
39 cap->NAME[1] = ~cap->NAME[1]; \
42 #define TOK_CPU(NAME) \
44 " %" STR(LEN) "s %" STR(LEN) "s ", \
45 tok[0], tok[1]) == 1 \
46 && !strcmp(tok[0], #NAME)) { \
47 memcpy(cap, &NAME, sizeof(*cap)); \
50 static sigjmp_buf ill_jmp
;
51 static void ill_handler(int sig
)
53 siglongjmp(ill_jmp
, sig
);
56 static const char *env
;
57 static int parse_env(struct OPENSSL_s390xcap_st
*cap
);
59 void OPENSSL_s390x_facilities(void);
60 void OPENSSL_s390x_functions(void);
61 void OPENSSL_vx_probe(void);
63 struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P
;
65 void OPENSSL_cpuid_setup(void)
68 struct sigaction ill_act
, oact_ill
, oact_fpe
;
69 struct OPENSSL_s390xcap_st cap
;
71 if (OPENSSL_s390xcap_P
.stfle
[0])
74 /* set a bit that will not be tested later */
75 OPENSSL_s390xcap_P
.stfle
[0] |= S390X_CAPBIT(0);
77 env
= getenv("OPENSSL_s390xcap");
83 memset(&ill_act
, 0, sizeof(ill_act
));
84 ill_act
.sa_handler
= ill_handler
;
85 sigfillset(&ill_act
.sa_mask
);
86 sigdelset(&ill_act
.sa_mask
, SIGILL
);
87 sigdelset(&ill_act
.sa_mask
, SIGFPE
);
88 sigdelset(&ill_act
.sa_mask
, SIGTRAP
);
89 sigprocmask(SIG_SETMASK
, &ill_act
.sa_mask
, &oset
);
90 sigaction(SIGILL
, &ill_act
, &oact_ill
);
91 sigaction(SIGFPE
, &ill_act
, &oact_fpe
);
93 /* protection against missing store-facility-list-extended */
94 if (sigsetjmp(ill_jmp
, 1) == 0)
95 OPENSSL_s390x_facilities();
98 OPENSSL_s390xcap_P
.stfle
[0] &= cap
.stfle
[0];
99 OPENSSL_s390xcap_P
.stfle
[1] &= cap
.stfle
[1];
100 OPENSSL_s390xcap_P
.stfle
[2] &= cap
.stfle
[2];
103 /* protection against disabled vector facility */
104 if ((OPENSSL_s390xcap_P
.stfle
[2] & S390X_CAPBIT(S390X_VX
))
105 && (sigsetjmp(ill_jmp
, 1) == 0)) {
108 OPENSSL_s390xcap_P
.stfle
[2] &= ~(S390X_CAPBIT(S390X_VX
)
109 | S390X_CAPBIT(S390X_VXD
)
110 | S390X_CAPBIT(S390X_VXE
));
113 sigaction(SIGFPE
, &oact_fpe
, NULL
);
114 sigaction(SIGILL
, &oact_ill
, NULL
);
115 sigprocmask(SIG_SETMASK
, &oset
, NULL
);
117 OPENSSL_s390x_functions();
120 OPENSSL_s390xcap_P
.kimd
[0] &= cap
.kimd
[0];
121 OPENSSL_s390xcap_P
.kimd
[1] &= cap
.kimd
[1];
122 OPENSSL_s390xcap_P
.klmd
[0] &= cap
.klmd
[0];
123 OPENSSL_s390xcap_P
.klmd
[1] &= cap
.klmd
[1];
124 OPENSSL_s390xcap_P
.km
[0] &= cap
.km
[0];
125 OPENSSL_s390xcap_P
.km
[1] &= cap
.km
[1];
126 OPENSSL_s390xcap_P
.kmc
[0] &= cap
.kmc
[0];
127 OPENSSL_s390xcap_P
.kmc
[1] &= cap
.kmc
[1];
128 OPENSSL_s390xcap_P
.kmac
[0] &= cap
.kmac
[0];
129 OPENSSL_s390xcap_P
.kmac
[1] &= cap
.kmac
[1];
130 OPENSSL_s390xcap_P
.kmctr
[0] &= cap
.kmctr
[0];
131 OPENSSL_s390xcap_P
.kmctr
[1] &= cap
.kmctr
[1];
132 OPENSSL_s390xcap_P
.kmo
[0] &= cap
.kmo
[0];
133 OPENSSL_s390xcap_P
.kmo
[1] &= cap
.kmo
[1];
134 OPENSSL_s390xcap_P
.kmf
[0] &= cap
.kmf
[0];
135 OPENSSL_s390xcap_P
.kmf
[1] &= cap
.kmf
[1];
136 OPENSSL_s390xcap_P
.prno
[0] &= cap
.prno
[0];
137 OPENSSL_s390xcap_P
.prno
[1] &= cap
.prno
[1];
138 OPENSSL_s390xcap_P
.kma
[0] &= cap
.kma
[0];
139 OPENSSL_s390xcap_P
.kma
[1] &= cap
.kma
[1];
140 OPENSSL_s390xcap_P
.pcc
[0] &= cap
.pcc
[0];
141 OPENSSL_s390xcap_P
.pcc
[1] &= cap
.pcc
[1];
142 OPENSSL_s390xcap_P
.kdsa
[0] &= cap
.kdsa
[0];
143 OPENSSL_s390xcap_P
.kdsa
[1] &= cap
.kdsa
[1];
147 static int parse_env(struct OPENSSL_s390xcap_st
*cap
)
151 * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
155 * z900 (2000) - z/Architecture POP SA22-7832-00
156 * Facility detection would fail on real hw (no STFLE).
158 static const struct OPENSSL_s390xcap_st z900
= {
159 /*.stfle = */{0ULL, 0ULL, 0ULL, 0ULL},
160 /*.kimd = */{0ULL, 0ULL},
161 /*.klmd = */{0ULL, 0ULL},
162 /*.km = */{0ULL, 0ULL},
163 /*.kmc = */{0ULL, 0ULL},
164 /*.kmac = */{0ULL, 0ULL},
165 /*.kmctr = */{0ULL, 0ULL},
166 /*.kmo = */{0ULL, 0ULL},
167 /*.kmf = */{0ULL, 0ULL},
168 /*.prno = */{0ULL, 0ULL},
169 /*.kma = */{0ULL, 0ULL},
170 /*.pcc = */{0ULL, 0ULL},
171 /*.kdsa = */{0ULL, 0ULL},
175 * z990 (2003) - z/Architecture POP SA22-7832-02
176 * Implements MSA. Facility detection would fail on real hw (no STFLE).
178 static const struct OPENSSL_s390xcap_st z990
= {
179 /*.stfle = */{S390X_CAPBIT(S390X_MSA
),
181 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
182 | S390X_CAPBIT(S390X_SHA_1
),
184 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
185 | S390X_CAPBIT(S390X_SHA_1
),
187 /*.km = */{S390X_CAPBIT(S390X_QUERY
),
189 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
),
191 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
),
193 /*.kmctr = */{0ULL, 0ULL},
194 /*.kmo = */{0ULL, 0ULL},
195 /*.kmf = */{0ULL, 0ULL},
196 /*.prno = */{0ULL, 0ULL},
197 /*.kma = */{0ULL, 0ULL},
198 /*.pcc = */{0ULL, 0ULL},
199 /*.kdsa = */{0ULL, 0ULL},
203 * z9 (2005) - z/Architecture POP SA22-7832-04
204 * Implements MSA and MSA1.
206 static const struct OPENSSL_s390xcap_st z9
= {
207 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
208 | S390X_CAPBIT(S390X_STCKF
),
210 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
211 | S390X_CAPBIT(S390X_SHA_1
)
212 | S390X_CAPBIT(S390X_SHA_256
),
214 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
215 | S390X_CAPBIT(S390X_SHA_1
)
216 | S390X_CAPBIT(S390X_SHA_256
),
218 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
219 | S390X_CAPBIT(S390X_AES_128
),
221 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
222 | S390X_CAPBIT(S390X_AES_128
),
224 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
),
226 /*.kmctr = */{0ULL, 0ULL},
227 /*.kmo = */{0ULL, 0ULL},
228 /*.kmf = */{0ULL, 0ULL},
229 /*.prno = */{0ULL, 0ULL},
230 /*.kma = */{0ULL, 0ULL},
231 /*.pcc = */{0ULL, 0ULL},
232 /*.kdsa = */{0ULL, 0ULL},
236 * z10 (2008) - z/Architecture POP SA22-7832-06
237 * Implements MSA and MSA1-2.
239 static const struct OPENSSL_s390xcap_st z10
= {
240 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
241 | S390X_CAPBIT(S390X_STCKF
),
243 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
244 | S390X_CAPBIT(S390X_SHA_1
)
245 | S390X_CAPBIT(S390X_SHA_256
)
246 | S390X_CAPBIT(S390X_SHA_512
),
248 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
249 | S390X_CAPBIT(S390X_SHA_1
)
250 | S390X_CAPBIT(S390X_SHA_256
)
251 | S390X_CAPBIT(S390X_SHA_512
),
253 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
254 | S390X_CAPBIT(S390X_AES_128
)
255 | S390X_CAPBIT(S390X_AES_192
)
256 | S390X_CAPBIT(S390X_AES_256
),
258 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
259 | S390X_CAPBIT(S390X_AES_128
)
260 | S390X_CAPBIT(S390X_AES_192
)
261 | S390X_CAPBIT(S390X_AES_256
),
263 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
),
265 /*.kmctr = */{0ULL, 0ULL},
266 /*.kmo = */{0ULL, 0ULL},
267 /*.kmf = */{0ULL, 0ULL},
268 /*.prno = */{0ULL, 0ULL},
269 /*.kma = */{0ULL, 0ULL},
270 /*.pcc = */{0ULL, 0ULL},
271 /*.kdsa = */{0ULL, 0ULL},
275 * z196 (2010) - z/Architecture POP SA22-7832-08
276 * Implements MSA and MSA1-4.
278 static const struct OPENSSL_s390xcap_st z196
= {
279 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
280 | S390X_CAPBIT(S390X_STCKF
),
281 S390X_CAPBIT(S390X_MSA3
)
282 | S390X_CAPBIT(S390X_MSA4
),
284 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
285 | S390X_CAPBIT(S390X_SHA_1
)
286 | S390X_CAPBIT(S390X_SHA_256
)
287 | S390X_CAPBIT(S390X_SHA_512
),
288 S390X_CAPBIT(S390X_GHASH
)},
289 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
290 | S390X_CAPBIT(S390X_SHA_1
)
291 | S390X_CAPBIT(S390X_SHA_256
)
292 | S390X_CAPBIT(S390X_SHA_512
),
294 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
295 | S390X_CAPBIT(S390X_AES_128
)
296 | S390X_CAPBIT(S390X_AES_192
)
297 | S390X_CAPBIT(S390X_AES_256
)
298 | S390X_CAPBIT(S390X_XTS_AES_128
)
299 | S390X_CAPBIT(S390X_XTS_AES_256
),
301 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
302 | S390X_CAPBIT(S390X_AES_128
)
303 | S390X_CAPBIT(S390X_AES_192
)
304 | S390X_CAPBIT(S390X_AES_256
),
306 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
)
307 | S390X_CAPBIT(S390X_AES_128
)
308 | S390X_CAPBIT(S390X_AES_192
)
309 | S390X_CAPBIT(S390X_AES_256
),
311 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY
)
312 | S390X_CAPBIT(S390X_AES_128
)
313 | S390X_CAPBIT(S390X_AES_192
)
314 | S390X_CAPBIT(S390X_AES_256
),
316 /*.kmo = */{S390X_CAPBIT(S390X_QUERY
)
317 | S390X_CAPBIT(S390X_AES_128
)
318 | S390X_CAPBIT(S390X_AES_192
)
319 | S390X_CAPBIT(S390X_AES_256
),
321 /*.kmf = */{S390X_CAPBIT(S390X_QUERY
)
322 | S390X_CAPBIT(S390X_AES_128
)
323 | S390X_CAPBIT(S390X_AES_192
)
324 | S390X_CAPBIT(S390X_AES_256
),
326 /*.prno = */{0ULL, 0ULL},
327 /*.kma = */{0ULL, 0ULL},
328 /*.pcc = */{S390X_CAPBIT(S390X_QUERY
),
330 /*.kdsa = */{0ULL, 0ULL},
334 * zEC12 (2012) - z/Architecture POP SA22-7832-09
335 * Implements MSA and MSA1-4.
337 static const struct OPENSSL_s390xcap_st zEC12
= {
338 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
339 | S390X_CAPBIT(S390X_STCKF
),
340 S390X_CAPBIT(S390X_MSA3
)
341 | S390X_CAPBIT(S390X_MSA4
),
343 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
344 | S390X_CAPBIT(S390X_SHA_1
)
345 | S390X_CAPBIT(S390X_SHA_256
)
346 | S390X_CAPBIT(S390X_SHA_512
),
347 S390X_CAPBIT(S390X_GHASH
)},
348 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
349 | S390X_CAPBIT(S390X_SHA_1
)
350 | S390X_CAPBIT(S390X_SHA_256
)
351 | S390X_CAPBIT(S390X_SHA_512
),
353 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
354 | S390X_CAPBIT(S390X_AES_128
)
355 | S390X_CAPBIT(S390X_AES_192
)
356 | S390X_CAPBIT(S390X_AES_256
)
357 | S390X_CAPBIT(S390X_XTS_AES_128
)
358 | S390X_CAPBIT(S390X_XTS_AES_256
),
360 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
361 | S390X_CAPBIT(S390X_AES_128
)
362 | S390X_CAPBIT(S390X_AES_192
)
363 | S390X_CAPBIT(S390X_AES_256
),
365 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
)
366 | S390X_CAPBIT(S390X_AES_128
)
367 | S390X_CAPBIT(S390X_AES_192
)
368 | S390X_CAPBIT(S390X_AES_256
),
370 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY
)
371 | S390X_CAPBIT(S390X_AES_128
)
372 | S390X_CAPBIT(S390X_AES_192
)
373 | S390X_CAPBIT(S390X_AES_256
),
375 /*.kmo = */{S390X_CAPBIT(S390X_QUERY
)
376 | S390X_CAPBIT(S390X_AES_128
)
377 | S390X_CAPBIT(S390X_AES_192
)
378 | S390X_CAPBIT(S390X_AES_256
),
380 /*.kmf = */{S390X_CAPBIT(S390X_QUERY
)
381 | S390X_CAPBIT(S390X_AES_128
)
382 | S390X_CAPBIT(S390X_AES_192
)
383 | S390X_CAPBIT(S390X_AES_256
),
385 /*.prno = */{0ULL, 0ULL},
386 /*.kma = */{0ULL, 0ULL},
387 /*.pcc = */{S390X_CAPBIT(S390X_QUERY
),
389 /*.kdsa = */{0ULL, 0ULL},
393 * z13 (2015) - z/Architecture POP SA22-7832-10
394 * Implements MSA and MSA1-5.
396 static const struct OPENSSL_s390xcap_st z13
= {
397 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
398 | S390X_CAPBIT(S390X_STCKF
)
399 | S390X_CAPBIT(S390X_MSA5
),
400 S390X_CAPBIT(S390X_MSA3
)
401 | S390X_CAPBIT(S390X_MSA4
),
402 S390X_CAPBIT(S390X_VX
),
404 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
405 | S390X_CAPBIT(S390X_SHA_1
)
406 | S390X_CAPBIT(S390X_SHA_256
)
407 | S390X_CAPBIT(S390X_SHA_512
),
408 S390X_CAPBIT(S390X_GHASH
)},
409 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
410 | S390X_CAPBIT(S390X_SHA_1
)
411 | S390X_CAPBIT(S390X_SHA_256
)
412 | S390X_CAPBIT(S390X_SHA_512
),
414 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
415 | S390X_CAPBIT(S390X_AES_128
)
416 | S390X_CAPBIT(S390X_AES_192
)
417 | S390X_CAPBIT(S390X_AES_256
)
418 | S390X_CAPBIT(S390X_XTS_AES_128
)
419 | S390X_CAPBIT(S390X_XTS_AES_256
),
421 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
422 | S390X_CAPBIT(S390X_AES_128
)
423 | S390X_CAPBIT(S390X_AES_192
)
424 | S390X_CAPBIT(S390X_AES_256
),
426 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
)
427 | S390X_CAPBIT(S390X_AES_128
)
428 | S390X_CAPBIT(S390X_AES_192
)
429 | S390X_CAPBIT(S390X_AES_256
),
431 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY
)
432 | S390X_CAPBIT(S390X_AES_128
)
433 | S390X_CAPBIT(S390X_AES_192
)
434 | S390X_CAPBIT(S390X_AES_256
),
436 /*.kmo = */{S390X_CAPBIT(S390X_QUERY
)
437 | S390X_CAPBIT(S390X_AES_128
)
438 | S390X_CAPBIT(S390X_AES_192
)
439 | S390X_CAPBIT(S390X_AES_256
),
441 /*.kmf = */{S390X_CAPBIT(S390X_QUERY
)
442 | S390X_CAPBIT(S390X_AES_128
)
443 | S390X_CAPBIT(S390X_AES_192
)
444 | S390X_CAPBIT(S390X_AES_256
),
446 /*.prno = */{S390X_CAPBIT(S390X_QUERY
)
447 | S390X_CAPBIT(S390X_SHA_512_DRNG
),
449 /*.kma = */{0ULL, 0ULL},
450 /*.pcc = */{S390X_CAPBIT(S390X_QUERY
),
452 /*.kdsa = */{0ULL, 0ULL},
456 * z14 (2017) - z/Architecture POP SA22-7832-11
457 * Implements MSA and MSA1-8.
459 static const struct OPENSSL_s390xcap_st z14
= {
460 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
461 | S390X_CAPBIT(S390X_STCKF
)
462 | S390X_CAPBIT(S390X_MSA5
),
463 S390X_CAPBIT(S390X_MSA3
)
464 | S390X_CAPBIT(S390X_MSA4
),
465 S390X_CAPBIT(S390X_VX
)
466 | S390X_CAPBIT(S390X_VXD
)
467 | S390X_CAPBIT(S390X_VXE
)
468 | S390X_CAPBIT(S390X_MSA8
),
470 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
471 | S390X_CAPBIT(S390X_SHA_1
)
472 | S390X_CAPBIT(S390X_SHA_256
)
473 | S390X_CAPBIT(S390X_SHA_512
)
474 | S390X_CAPBIT(S390X_SHA3_224
)
475 | S390X_CAPBIT(S390X_SHA3_256
)
476 | S390X_CAPBIT(S390X_SHA3_384
)
477 | S390X_CAPBIT(S390X_SHA3_512
)
478 | S390X_CAPBIT(S390X_SHAKE_128
)
479 | S390X_CAPBIT(S390X_SHAKE_256
),
480 S390X_CAPBIT(S390X_GHASH
)},
481 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
482 | S390X_CAPBIT(S390X_SHA_1
)
483 | S390X_CAPBIT(S390X_SHA_256
)
484 | S390X_CAPBIT(S390X_SHA_512
)
485 | S390X_CAPBIT(S390X_SHA3_224
)
486 | S390X_CAPBIT(S390X_SHA3_256
)
487 | S390X_CAPBIT(S390X_SHA3_384
)
488 | S390X_CAPBIT(S390X_SHA3_512
)
489 | S390X_CAPBIT(S390X_SHAKE_128
)
490 | S390X_CAPBIT(S390X_SHAKE_256
),
492 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
493 | S390X_CAPBIT(S390X_AES_128
)
494 | S390X_CAPBIT(S390X_AES_192
)
495 | S390X_CAPBIT(S390X_AES_256
)
496 | S390X_CAPBIT(S390X_XTS_AES_128
)
497 | S390X_CAPBIT(S390X_XTS_AES_256
),
499 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
500 | S390X_CAPBIT(S390X_AES_128
)
501 | S390X_CAPBIT(S390X_AES_192
)
502 | S390X_CAPBIT(S390X_AES_256
),
504 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
)
505 | S390X_CAPBIT(S390X_AES_128
)
506 | S390X_CAPBIT(S390X_AES_192
)
507 | S390X_CAPBIT(S390X_AES_256
),
509 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY
)
510 | S390X_CAPBIT(S390X_AES_128
)
511 | S390X_CAPBIT(S390X_AES_192
)
512 | S390X_CAPBIT(S390X_AES_256
),
514 /*.kmo = */{S390X_CAPBIT(S390X_QUERY
)
515 | S390X_CAPBIT(S390X_AES_128
)
516 | S390X_CAPBIT(S390X_AES_192
)
517 | S390X_CAPBIT(S390X_AES_256
),
519 /*.kmf = */{S390X_CAPBIT(S390X_QUERY
)
520 | S390X_CAPBIT(S390X_AES_128
)
521 | S390X_CAPBIT(S390X_AES_192
)
522 | S390X_CAPBIT(S390X_AES_256
),
524 /*.prno = */{S390X_CAPBIT(S390X_QUERY
)
525 | S390X_CAPBIT(S390X_SHA_512_DRNG
),
526 S390X_CAPBIT(S390X_TRNG
)},
527 /*.kma = */{S390X_CAPBIT(S390X_QUERY
)
528 | S390X_CAPBIT(S390X_AES_128
)
529 | S390X_CAPBIT(S390X_AES_192
)
530 | S390X_CAPBIT(S390X_AES_256
),
532 /*.pcc = */{S390X_CAPBIT(S390X_QUERY
),
534 /*.kdsa = */{0ULL, 0ULL},
538 * z15 (2019) - z/Architecture POP SA22-7832-12
539 * Implements MSA and MSA1-9.
541 static const struct OPENSSL_s390xcap_st z15
= {
542 /*.stfle = */{S390X_CAPBIT(S390X_MSA
)
543 | S390X_CAPBIT(S390X_STCKF
)
544 | S390X_CAPBIT(S390X_MSA5
),
545 S390X_CAPBIT(S390X_MSA3
)
546 | S390X_CAPBIT(S390X_MSA4
),
547 S390X_CAPBIT(S390X_VX
)
548 | S390X_CAPBIT(S390X_VXD
)
549 | S390X_CAPBIT(S390X_VXE
)
550 | S390X_CAPBIT(S390X_MSA8
),
552 /*.kimd = */{S390X_CAPBIT(S390X_QUERY
)
553 | S390X_CAPBIT(S390X_SHA_1
)
554 | S390X_CAPBIT(S390X_SHA_256
)
555 | S390X_CAPBIT(S390X_SHA_512
)
556 | S390X_CAPBIT(S390X_SHA3_224
)
557 | S390X_CAPBIT(S390X_SHA3_256
)
558 | S390X_CAPBIT(S390X_SHA3_384
)
559 | S390X_CAPBIT(S390X_SHA3_512
)
560 | S390X_CAPBIT(S390X_SHAKE_128
)
561 | S390X_CAPBIT(S390X_SHAKE_256
),
562 S390X_CAPBIT(S390X_GHASH
)},
563 /*.klmd = */{S390X_CAPBIT(S390X_QUERY
)
564 | S390X_CAPBIT(S390X_SHA_1
)
565 | S390X_CAPBIT(S390X_SHA_256
)
566 | S390X_CAPBIT(S390X_SHA_512
)
567 | S390X_CAPBIT(S390X_SHA3_224
)
568 | S390X_CAPBIT(S390X_SHA3_256
)
569 | S390X_CAPBIT(S390X_SHA3_384
)
570 | S390X_CAPBIT(S390X_SHA3_512
)
571 | S390X_CAPBIT(S390X_SHAKE_128
)
572 | S390X_CAPBIT(S390X_SHAKE_256
),
574 /*.km = */{S390X_CAPBIT(S390X_QUERY
)
575 | S390X_CAPBIT(S390X_AES_128
)
576 | S390X_CAPBIT(S390X_AES_192
)
577 | S390X_CAPBIT(S390X_AES_256
)
578 | S390X_CAPBIT(S390X_XTS_AES_128
)
579 | S390X_CAPBIT(S390X_XTS_AES_256
),
581 /*.kmc = */{S390X_CAPBIT(S390X_QUERY
)
582 | S390X_CAPBIT(S390X_AES_128
)
583 | S390X_CAPBIT(S390X_AES_192
)
584 | S390X_CAPBIT(S390X_AES_256
),
586 /*.kmac = */{S390X_CAPBIT(S390X_QUERY
)
587 | S390X_CAPBIT(S390X_AES_128
)
588 | S390X_CAPBIT(S390X_AES_192
)
589 | S390X_CAPBIT(S390X_AES_256
),
591 /*.kmctr = */{S390X_CAPBIT(S390X_QUERY
)
592 | S390X_CAPBIT(S390X_AES_128
)
593 | S390X_CAPBIT(S390X_AES_192
)
594 | S390X_CAPBIT(S390X_AES_256
),
596 /*.kmo = */{S390X_CAPBIT(S390X_QUERY
)
597 | S390X_CAPBIT(S390X_AES_128
)
598 | S390X_CAPBIT(S390X_AES_192
)
599 | S390X_CAPBIT(S390X_AES_256
),
601 /*.kmf = */{S390X_CAPBIT(S390X_QUERY
)
602 | S390X_CAPBIT(S390X_AES_128
)
603 | S390X_CAPBIT(S390X_AES_192
)
604 | S390X_CAPBIT(S390X_AES_256
),
606 /*.prno = */{S390X_CAPBIT(S390X_QUERY
)
607 | S390X_CAPBIT(S390X_SHA_512_DRNG
),
608 S390X_CAPBIT(S390X_TRNG
)},
609 /*.kma = */{S390X_CAPBIT(S390X_QUERY
)
610 | S390X_CAPBIT(S390X_AES_128
)
611 | S390X_CAPBIT(S390X_AES_192
)
612 | S390X_CAPBIT(S390X_AES_256
),
614 /*.pcc = */{S390X_CAPBIT(S390X_QUERY
)
615 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P256
)
616 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P384
)
617 | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P521
),
619 /*.kdsa = */{S390X_CAPBIT(S390X_QUERY
)
620 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P256
)
621 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P384
)
622 | S390X_CAPBIT(S390X_ECDSA_VERIFY_P521
)
623 | S390X_CAPBIT(S390X_ECDSA_SIGN_P256
)
624 | S390X_CAPBIT(S390X_ECDSA_SIGN_P384
)
625 | S390X_CAPBIT(S390X_ECDSA_SIGN_P521
),
629 char *tok_begin
, *tok_end
, *buff
, tok
[S390X_STFLE_MAX
][LEN
+ 1];
632 buff
= malloc(strlen(env
) + 1);
637 memset(cap
, ~0, sizeof(*cap
));
640 tok_begin
= buff
+ strspn(buff
, ";");
641 strtok(tok_begin
, ";");
642 tok_end
= strtok(NULL
, ";");
644 while (tok_begin
!= NULL
) {
646 if ((n
= sscanf(tok_begin
,
647 " stfle : %" STR(LEN
) "[^:] : "
648 "%" STR(LEN
) "[^:] : %" STR(LEN
) "s ",
649 tok
[0], tok
[1], tok
[2]))) {
650 for (i
= 0; i
< n
; i
++) {
651 off
= (tok
[i
][0] == '~') ? 1 : 0;
652 if (sscanf(tok
[i
] + off
, "%llx", &cap
->stfle
[i
]) != 1)
655 cap
->stfle
[i
] = ~cap
->stfle
[i
];
659 /* query function tokens */
660 else if TOK_FUNC(kimd
)
661 else if TOK_FUNC(klmd
)
663 else if TOK_FUNC(kmc
)
664 else if TOK_FUNC(kmac
)
665 else if TOK_FUNC(kmctr
)
666 else if TOK_FUNC(kmo
)
667 else if TOK_FUNC(kmf
)
668 else if TOK_FUNC(prno
)
669 else if TOK_FUNC(kma
)
670 else if TOK_FUNC(pcc
)
671 else if TOK_FUNC(kdsa
)
673 /* CPU model tokens */
674 else if TOK_CPU(z900
)
675 else if TOK_CPU(z990
)
678 else if TOK_CPU(z196
)
679 else if TOK_CPU(zEC12
)
684 /* whitespace(ignored) or invalid tokens */
686 while (*tok_begin
!= '\0') {
687 if (!ossl_isspace(*tok_begin
))
694 tok_end
= strtok(NULL
, ";");