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