xref: /freebsd/crypto/openssl/crypto/s390xcap.c (revision b077aed3)
1e71b7053SJung-uk Kim /*
234252e89SJung-uk Kim  * Copyright 2010-2022 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim  */
9e71b7053SJung-uk Kim 
101f13597dSJung-uk Kim #include <stdio.h>
111f13597dSJung-uk Kim #include <stdlib.h>
121f13597dSJung-uk Kim #include <string.h>
131f13597dSJung-uk Kim #include <setjmp.h>
141f13597dSJung-uk Kim #include <signal.h>
15e71b7053SJung-uk Kim #include "internal/cryptlib.h"
16*b077aed3SPierre Pronchery #include "crypto/ctype.h"
17e71b7053SJung-uk Kim #include "s390x_arch.h"
181f13597dSJung-uk Kim 
19*b077aed3SPierre Pronchery #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
20*b077aed3SPierre Pronchery # if __GLIBC_PREREQ(2, 16)
21*b077aed3SPierre Pronchery #  include <sys/auxv.h>
22*b077aed3SPierre Pronchery #  if defined(HWCAP_S390_STFLE) && defined(HWCAP_S390_VX)
23*b077aed3SPierre Pronchery #   define OSSL_IMPLEMENT_GETAUXVAL
24*b077aed3SPierre Pronchery #  endif
25*b077aed3SPierre Pronchery # endif
26*b077aed3SPierre Pronchery #endif
27*b077aed3SPierre Pronchery 
28*b077aed3SPierre Pronchery #define LEN     128
29*b077aed3SPierre Pronchery #define STR_(S) #S
30*b077aed3SPierre Pronchery #define STR(S)  STR_(S)
31*b077aed3SPierre Pronchery 
32*b077aed3SPierre Pronchery #define TOK_FUNC(NAME)                                                  \
33*b077aed3SPierre Pronchery     (sscanf(tok_begin,                                                  \
34*b077aed3SPierre Pronchery             " " STR(NAME) " : %" STR(LEN) "[^:] : "                     \
35*b077aed3SPierre Pronchery             "%" STR(LEN) "s %" STR(LEN) "s ",                           \
36*b077aed3SPierre Pronchery             tok[0], tok[1], tok[2]) == 2) {                             \
37*b077aed3SPierre Pronchery                                                                         \
38*b077aed3SPierre Pronchery         off = (tok[0][0] == '~') ? 1 : 0;                               \
39*b077aed3SPierre Pronchery         if (sscanf(tok[0] + off, "%llx", &cap->NAME[0]) != 1)           \
40*b077aed3SPierre Pronchery             goto ret;                                                   \
41*b077aed3SPierre Pronchery         if (off)                                                        \
42*b077aed3SPierre Pronchery             cap->NAME[0] = ~cap->NAME[0];                               \
43*b077aed3SPierre Pronchery                                                                         \
44*b077aed3SPierre Pronchery         off = (tok[1][0] == '~') ? 1 : 0;                               \
45*b077aed3SPierre Pronchery         if (sscanf(tok[1] + off, "%llx", &cap->NAME[1]) != 1)           \
46*b077aed3SPierre Pronchery             goto ret;                                                   \
47*b077aed3SPierre Pronchery         if (off)                                                        \
48*b077aed3SPierre Pronchery             cap->NAME[1] = ~cap->NAME[1];                               \
49*b077aed3SPierre Pronchery     }
50*b077aed3SPierre Pronchery 
51*b077aed3SPierre Pronchery #define TOK_CPU(NAME)                                                   \
52*b077aed3SPierre Pronchery     (sscanf(tok_begin,                                                  \
53*b077aed3SPierre Pronchery             " %" STR(LEN) "s %" STR(LEN) "s ",                          \
54*b077aed3SPierre Pronchery             tok[0], tok[1]) == 1                                        \
55*b077aed3SPierre Pronchery      && !strcmp(tok[0], #NAME)) {                                       \
56*b077aed3SPierre Pronchery             memcpy(cap, &NAME, sizeof(*cap));                           \
57*b077aed3SPierre Pronchery     }
58*b077aed3SPierre Pronchery 
59*b077aed3SPierre Pronchery #ifndef OSSL_IMPLEMENT_GETAUXVAL
601f13597dSJung-uk Kim static sigjmp_buf ill_jmp;
ill_handler(int sig)616f9291ceSJung-uk Kim static void ill_handler(int sig)
626f9291ceSJung-uk Kim {
636f9291ceSJung-uk Kim     siglongjmp(ill_jmp, sig);
646f9291ceSJung-uk Kim }
651f13597dSJung-uk Kim 
66e71b7053SJung-uk Kim void OPENSSL_vx_probe(void);
67*b077aed3SPierre Pronchery #endif
68*b077aed3SPierre Pronchery 
69*b077aed3SPierre Pronchery static const char *env;
70*b077aed3SPierre Pronchery static int parse_env(struct OPENSSL_s390xcap_st *cap);
71*b077aed3SPierre Pronchery 
72*b077aed3SPierre Pronchery void OPENSSL_s390x_facilities(void);
73*b077aed3SPierre Pronchery void OPENSSL_s390x_functions(void);
74e71b7053SJung-uk Kim 
75e71b7053SJung-uk Kim struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P;
761f13597dSJung-uk Kim 
7734252e89SJung-uk Kim #if defined(__GNUC__) && defined(__linux)
7834252e89SJung-uk Kim __attribute__ ((visibility("hidden")))
7934252e89SJung-uk Kim #endif
OPENSSL_cpuid_setup(void)801f13597dSJung-uk Kim void OPENSSL_cpuid_setup(void)
811f13597dSJung-uk Kim {
82*b077aed3SPierre Pronchery     struct OPENSSL_s390xcap_st cap;
831f13597dSJung-uk Kim 
84e71b7053SJung-uk Kim     if (OPENSSL_s390xcap_P.stfle[0])
856f9291ceSJung-uk Kim         return;
861f13597dSJung-uk Kim 
87e71b7053SJung-uk Kim     /* set a bit that will not be tested later */
88e71b7053SJung-uk Kim     OPENSSL_s390xcap_P.stfle[0] |= S390X_CAPBIT(0);
891f13597dSJung-uk Kim 
90*b077aed3SPierre Pronchery #if defined(OSSL_IMPLEMENT_GETAUXVAL)
91*b077aed3SPierre Pronchery     {
92*b077aed3SPierre Pronchery         const unsigned long hwcap = getauxval(AT_HWCAP);
93*b077aed3SPierre Pronchery 
94*b077aed3SPierre Pronchery         /* protection against missing store-facility-list-extended */
95*b077aed3SPierre Pronchery         if (hwcap & HWCAP_S390_STFLE)
96*b077aed3SPierre Pronchery             OPENSSL_s390x_facilities();
97*b077aed3SPierre Pronchery 
98*b077aed3SPierre Pronchery         /* protection against disabled vector facility */
99*b077aed3SPierre Pronchery         if (!(hwcap & HWCAP_S390_VX)) {
100*b077aed3SPierre Pronchery             OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
101*b077aed3SPierre Pronchery                                              | S390X_CAPBIT(S390X_VXD)
102*b077aed3SPierre Pronchery                                              | S390X_CAPBIT(S390X_VXE));
103*b077aed3SPierre Pronchery         }
104*b077aed3SPierre Pronchery     }
105*b077aed3SPierre Pronchery #else
106*b077aed3SPierre Pronchery     {
107*b077aed3SPierre Pronchery         sigset_t oset;
108*b077aed3SPierre Pronchery         struct sigaction ill_act, oact_ill, oact_fpe;
109*b077aed3SPierre Pronchery 
1101f13597dSJung-uk Kim         memset(&ill_act, 0, sizeof(ill_act));
1111f13597dSJung-uk Kim         ill_act.sa_handler = ill_handler;
1121f13597dSJung-uk Kim         sigfillset(&ill_act.sa_mask);
1131f13597dSJung-uk Kim         sigdelset(&ill_act.sa_mask, SIGILL);
114e71b7053SJung-uk Kim         sigdelset(&ill_act.sa_mask, SIGFPE);
1151f13597dSJung-uk Kim         sigdelset(&ill_act.sa_mask, SIGTRAP);
116*b077aed3SPierre Pronchery 
1171f13597dSJung-uk Kim         sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
118da327cd2SJung-uk Kim         sigaction(SIGILL, &ill_act, &oact_ill);
119da327cd2SJung-uk Kim         sigaction(SIGFPE, &ill_act, &oact_fpe);
1201f13597dSJung-uk Kim 
1211f13597dSJung-uk Kim         /* protection against missing store-facility-list-extended */
1221f13597dSJung-uk Kim         if (sigsetjmp(ill_jmp, 1) == 0)
1231f13597dSJung-uk Kim             OPENSSL_s390x_facilities();
1241f13597dSJung-uk Kim 
125e71b7053SJung-uk Kim         /* protection against disabled vector facility */
126e71b7053SJung-uk Kim         if ((OPENSSL_s390xcap_P.stfle[2] & S390X_CAPBIT(S390X_VX))
127e71b7053SJung-uk Kim             && (sigsetjmp(ill_jmp, 1) == 0)) {
128e71b7053SJung-uk Kim             OPENSSL_vx_probe();
129e71b7053SJung-uk Kim         } else {
130e71b7053SJung-uk Kim             OPENSSL_s390xcap_P.stfle[2] &= ~(S390X_CAPBIT(S390X_VX)
131e71b7053SJung-uk Kim                                              | S390X_CAPBIT(S390X_VXD)
132e71b7053SJung-uk Kim                                              | S390X_CAPBIT(S390X_VXE));
133e71b7053SJung-uk Kim         }
134e71b7053SJung-uk Kim 
135da327cd2SJung-uk Kim         sigaction(SIGFPE, &oact_fpe, NULL);
136da327cd2SJung-uk Kim         sigaction(SIGILL, &oact_ill, NULL);
1371f13597dSJung-uk Kim         sigprocmask(SIG_SETMASK, &oset, NULL);
1381f13597dSJung-uk Kim     }
139*b077aed3SPierre Pronchery #endif
140*b077aed3SPierre Pronchery 
141*b077aed3SPierre Pronchery     env = getenv("OPENSSL_s390xcap");
142*b077aed3SPierre Pronchery     if (env != NULL) {
143*b077aed3SPierre Pronchery         if (!parse_env(&cap))
144*b077aed3SPierre Pronchery             env = NULL;
145*b077aed3SPierre Pronchery     }
146*b077aed3SPierre Pronchery 
147*b077aed3SPierre Pronchery     if (env != NULL) {
148*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.stfle[0] &= cap.stfle[0];
149*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.stfle[1] &= cap.stfle[1];
150*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.stfle[2] &= cap.stfle[2];
151*b077aed3SPierre Pronchery     }
152*b077aed3SPierre Pronchery 
153*b077aed3SPierre Pronchery     OPENSSL_s390x_functions(); /* check OPENSSL_s390xcap_P.stfle */
154*b077aed3SPierre Pronchery 
155*b077aed3SPierre Pronchery     if (env != NULL) {
156*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kimd[0] &= cap.kimd[0];
157*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kimd[1] &= cap.kimd[1];
158*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.klmd[0] &= cap.klmd[0];
159*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.klmd[1] &= cap.klmd[1];
160*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.km[0] &= cap.km[0];
161*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.km[1] &= cap.km[1];
162*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmc[0] &= cap.kmc[0];
163*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmc[1] &= cap.kmc[1];
164*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmac[0] &= cap.kmac[0];
165*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmac[1] &= cap.kmac[1];
166*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmctr[0] &= cap.kmctr[0];
167*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmctr[1] &= cap.kmctr[1];
168*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmo[0] &= cap.kmo[0];
169*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmo[1] &= cap.kmo[1];
170*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmf[0] &= cap.kmf[0];
171*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kmf[1] &= cap.kmf[1];
172*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.prno[0] &= cap.prno[0];
173*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.prno[1] &= cap.prno[1];
174*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kma[0] &= cap.kma[0];
175*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kma[1] &= cap.kma[1];
176*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.pcc[0] &= cap.pcc[0];
177*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.pcc[1] &= cap.pcc[1];
178*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kdsa[0] &= cap.kdsa[0];
179*b077aed3SPierre Pronchery         OPENSSL_s390xcap_P.kdsa[1] &= cap.kdsa[1];
180*b077aed3SPierre Pronchery     }
181*b077aed3SPierre Pronchery }
182*b077aed3SPierre Pronchery 
parse_env(struct OPENSSL_s390xcap_st * cap)183*b077aed3SPierre Pronchery static int parse_env(struct OPENSSL_s390xcap_st *cap)
184*b077aed3SPierre Pronchery {
185*b077aed3SPierre Pronchery     /*-
186*b077aed3SPierre Pronchery      * CPU model data
187*b077aed3SPierre Pronchery      * (only the STFLE- and QUERY-bits relevant to libcrypto are set)
188*b077aed3SPierre Pronchery      */
189*b077aed3SPierre Pronchery 
190*b077aed3SPierre Pronchery     /*-
191*b077aed3SPierre Pronchery      * z900 (2000) - z/Architecture POP SA22-7832-00
192*b077aed3SPierre Pronchery      * Facility detection would fail on real hw (no STFLE).
193*b077aed3SPierre Pronchery      */
194*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z900 = {
195*b077aed3SPierre Pronchery         /*.stfle  = */{0ULL, 0ULL, 0ULL, 0ULL},
196*b077aed3SPierre Pronchery         /*.kimd   = */{0ULL, 0ULL},
197*b077aed3SPierre Pronchery         /*.klmd   = */{0ULL, 0ULL},
198*b077aed3SPierre Pronchery         /*.km     = */{0ULL, 0ULL},
199*b077aed3SPierre Pronchery         /*.kmc    = */{0ULL, 0ULL},
200*b077aed3SPierre Pronchery         /*.kmac   = */{0ULL, 0ULL},
201*b077aed3SPierre Pronchery         /*.kmctr  = */{0ULL, 0ULL},
202*b077aed3SPierre Pronchery         /*.kmo    = */{0ULL, 0ULL},
203*b077aed3SPierre Pronchery         /*.kmf    = */{0ULL, 0ULL},
204*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
205*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
206*b077aed3SPierre Pronchery         /*.pcc    = */{0ULL, 0ULL},
207*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
208*b077aed3SPierre Pronchery     };
209*b077aed3SPierre Pronchery 
210*b077aed3SPierre Pronchery     /*-
211*b077aed3SPierre Pronchery      * z990 (2003) - z/Architecture POP SA22-7832-02
212*b077aed3SPierre Pronchery      * Implements MSA. Facility detection would fail on real hw (no STFLE).
213*b077aed3SPierre Pronchery      */
214*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z990 = {
215*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA),
216*b077aed3SPierre Pronchery                        0ULL, 0ULL, 0ULL},
217*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
218*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1),
219*b077aed3SPierre Pronchery                        0ULL},
220*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
221*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1),
222*b077aed3SPierre Pronchery                        0ULL},
223*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY),
224*b077aed3SPierre Pronchery                        0ULL},
225*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY),
226*b077aed3SPierre Pronchery                        0ULL},
227*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY),
228*b077aed3SPierre Pronchery                        0ULL},
229*b077aed3SPierre Pronchery         /*.kmctr  = */{0ULL, 0ULL},
230*b077aed3SPierre Pronchery         /*.kmo    = */{0ULL, 0ULL},
231*b077aed3SPierre Pronchery         /*.kmf    = */{0ULL, 0ULL},
232*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
233*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
234*b077aed3SPierre Pronchery         /*.pcc    = */{0ULL, 0ULL},
235*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
236*b077aed3SPierre Pronchery     };
237*b077aed3SPierre Pronchery 
238*b077aed3SPierre Pronchery     /*-
239*b077aed3SPierre Pronchery      * z9 (2005) - z/Architecture POP SA22-7832-04
240*b077aed3SPierre Pronchery      * Implements MSA and MSA1.
241*b077aed3SPierre Pronchery      */
242*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z9 = {
243*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
244*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF),
245*b077aed3SPierre Pronchery                        0ULL, 0ULL, 0ULL},
246*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
247*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
248*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256),
249*b077aed3SPierre Pronchery                        0ULL},
250*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
251*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
252*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256),
253*b077aed3SPierre Pronchery                        0ULL},
254*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
255*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128),
256*b077aed3SPierre Pronchery                        0ULL},
257*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
258*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128),
259*b077aed3SPierre Pronchery                        0ULL},
260*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY),
261*b077aed3SPierre Pronchery                        0ULL},
262*b077aed3SPierre Pronchery         /*.kmctr  = */{0ULL, 0ULL},
263*b077aed3SPierre Pronchery         /*.kmo    = */{0ULL, 0ULL},
264*b077aed3SPierre Pronchery         /*.kmf    = */{0ULL, 0ULL},
265*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
266*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
267*b077aed3SPierre Pronchery         /*.pcc    = */{0ULL, 0ULL},
268*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
269*b077aed3SPierre Pronchery     };
270*b077aed3SPierre Pronchery 
271*b077aed3SPierre Pronchery     /*-
272*b077aed3SPierre Pronchery      * z10 (2008) - z/Architecture POP SA22-7832-06
273*b077aed3SPierre Pronchery      * Implements MSA and MSA1-2.
274*b077aed3SPierre Pronchery      */
275*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z10 = {
276*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
277*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF),
278*b077aed3SPierre Pronchery                        0ULL, 0ULL, 0ULL},
279*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
280*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
281*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
282*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
283*b077aed3SPierre Pronchery                        0ULL},
284*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
285*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
286*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
287*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
288*b077aed3SPierre Pronchery                        0ULL},
289*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
290*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
291*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
292*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
293*b077aed3SPierre Pronchery                        0ULL},
294*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
295*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
296*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
297*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
298*b077aed3SPierre Pronchery                        0ULL},
299*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY),
300*b077aed3SPierre Pronchery                        0ULL},
301*b077aed3SPierre Pronchery         /*.kmctr  = */{0ULL, 0ULL},
302*b077aed3SPierre Pronchery         /*.kmo    = */{0ULL, 0ULL},
303*b077aed3SPierre Pronchery         /*.kmf    = */{0ULL, 0ULL},
304*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
305*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
306*b077aed3SPierre Pronchery         /*.pcc    = */{0ULL, 0ULL},
307*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
308*b077aed3SPierre Pronchery     };
309*b077aed3SPierre Pronchery 
310*b077aed3SPierre Pronchery     /*-
311*b077aed3SPierre Pronchery      * z196 (2010) - z/Architecture POP SA22-7832-08
312*b077aed3SPierre Pronchery      * Implements MSA and MSA1-4.
313*b077aed3SPierre Pronchery      */
314*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z196 = {
315*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
316*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF),
317*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_MSA3)
318*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA4),
319*b077aed3SPierre Pronchery                        0ULL, 0ULL},
320*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
321*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
322*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
323*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
324*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_GHASH)},
325*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
326*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
327*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
328*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
329*b077aed3SPierre Pronchery                        0ULL},
330*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
331*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
332*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
333*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256)
334*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_128)
335*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_256),
336*b077aed3SPierre Pronchery                        0ULL},
337*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
338*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
339*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
340*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
341*b077aed3SPierre Pronchery                        0ULL},
342*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY)
343*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
344*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
345*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
346*b077aed3SPierre Pronchery                        0ULL},
347*b077aed3SPierre Pronchery         /*.kmctr  = */{S390X_CAPBIT(S390X_QUERY)
348*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
349*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
350*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
351*b077aed3SPierre Pronchery                        0ULL},
352*b077aed3SPierre Pronchery         /*.kmo    = */{S390X_CAPBIT(S390X_QUERY)
353*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
354*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
355*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
356*b077aed3SPierre Pronchery                        0ULL},
357*b077aed3SPierre Pronchery         /*.kmf    = */{S390X_CAPBIT(S390X_QUERY)
358*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
359*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
360*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
361*b077aed3SPierre Pronchery                        0ULL},
362*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
363*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
364*b077aed3SPierre Pronchery         /*.pcc    = */{S390X_CAPBIT(S390X_QUERY),
365*b077aed3SPierre Pronchery                        0ULL},
366*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
367*b077aed3SPierre Pronchery     };
368*b077aed3SPierre Pronchery 
369*b077aed3SPierre Pronchery     /*-
370*b077aed3SPierre Pronchery      * zEC12 (2012) - z/Architecture POP SA22-7832-09
371*b077aed3SPierre Pronchery      * Implements MSA and MSA1-4.
372*b077aed3SPierre Pronchery      */
373*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st zEC12 = {
374*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
375*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF),
376*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_MSA3)
377*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA4),
378*b077aed3SPierre Pronchery                        0ULL, 0ULL},
379*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
380*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
381*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
382*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
383*b077aed3SPierre Pronchery                    S390X_CAPBIT(S390X_GHASH)},
384*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
385*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
386*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
387*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
388*b077aed3SPierre Pronchery                        0ULL},
389*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
390*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
391*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
392*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256)
393*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_128)
394*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_256),
395*b077aed3SPierre Pronchery                        0ULL},
396*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
397*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
398*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
399*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
400*b077aed3SPierre Pronchery                        0ULL},
401*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY)
402*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
403*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
404*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
405*b077aed3SPierre Pronchery                        0ULL},
406*b077aed3SPierre Pronchery         /*.kmctr  = */{S390X_CAPBIT(S390X_QUERY)
407*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
408*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
409*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
410*b077aed3SPierre Pronchery                        0ULL},
411*b077aed3SPierre Pronchery         /*.kmo    = */{S390X_CAPBIT(S390X_QUERY)
412*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
413*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
414*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
415*b077aed3SPierre Pronchery                        0ULL},
416*b077aed3SPierre Pronchery         /*.kmf    = */{S390X_CAPBIT(S390X_QUERY)
417*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
418*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
419*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
420*b077aed3SPierre Pronchery                        0ULL},
421*b077aed3SPierre Pronchery         /*.prno   = */{0ULL, 0ULL},
422*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
423*b077aed3SPierre Pronchery         /*.pcc    = */{S390X_CAPBIT(S390X_QUERY),
424*b077aed3SPierre Pronchery                        0ULL},
425*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
426*b077aed3SPierre Pronchery     };
427*b077aed3SPierre Pronchery 
428*b077aed3SPierre Pronchery     /*-
429*b077aed3SPierre Pronchery      * z13 (2015) - z/Architecture POP SA22-7832-10
430*b077aed3SPierre Pronchery      * Implements MSA and MSA1-5.
431*b077aed3SPierre Pronchery      */
432*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z13 = {
433*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
434*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF)
435*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA5),
436*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_MSA3)
437*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA4),
438*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_VX),
439*b077aed3SPierre Pronchery                        0ULL},
440*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
441*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
442*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
443*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
444*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_GHASH)},
445*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
446*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
447*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
448*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512),
449*b077aed3SPierre Pronchery                        0ULL},
450*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
451*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
452*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
453*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256)
454*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_128)
455*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_256),
456*b077aed3SPierre Pronchery                        0ULL},
457*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
458*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
459*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
460*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
461*b077aed3SPierre Pronchery                        0ULL},
462*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY)
463*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
464*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
465*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
466*b077aed3SPierre Pronchery                        0ULL},
467*b077aed3SPierre Pronchery         /*.kmctr  = */{S390X_CAPBIT(S390X_QUERY)
468*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
469*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
470*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
471*b077aed3SPierre Pronchery                        0ULL},
472*b077aed3SPierre Pronchery         /*.kmo    = */{S390X_CAPBIT(S390X_QUERY)
473*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
474*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
475*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
476*b077aed3SPierre Pronchery                        0ULL},
477*b077aed3SPierre Pronchery         /*.kmf    = */{S390X_CAPBIT(S390X_QUERY)
478*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
479*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
480*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
481*b077aed3SPierre Pronchery                        0ULL},
482*b077aed3SPierre Pronchery         /*.prno   = */{S390X_CAPBIT(S390X_QUERY)
483*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512_DRNG),
484*b077aed3SPierre Pronchery                        0ULL},
485*b077aed3SPierre Pronchery         /*.kma    = */{0ULL, 0ULL},
486*b077aed3SPierre Pronchery         /*.pcc    = */{S390X_CAPBIT(S390X_QUERY),
487*b077aed3SPierre Pronchery                        0ULL},
488*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
489*b077aed3SPierre Pronchery     };
490*b077aed3SPierre Pronchery 
491*b077aed3SPierre Pronchery     /*-
492*b077aed3SPierre Pronchery      * z14 (2017) - z/Architecture POP SA22-7832-11
493*b077aed3SPierre Pronchery      * Implements MSA and MSA1-8.
494*b077aed3SPierre Pronchery      */
495*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z14 = {
496*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
497*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF)
498*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA5),
499*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_MSA3)
500*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA4),
501*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_VX)
502*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_VXD)
503*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_VXE)
504*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA8),
505*b077aed3SPierre Pronchery                        0ULL},
506*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
507*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
508*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
509*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512)
510*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_224)
511*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_256)
512*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_384)
513*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_512)
514*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_128)
515*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_256),
516*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_GHASH)},
517*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
518*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
519*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
520*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512)
521*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_224)
522*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_256)
523*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_384)
524*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_512)
525*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_128)
526*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_256),
527*b077aed3SPierre Pronchery                        0ULL},
528*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
529*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
530*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
531*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256)
532*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_128)
533*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_256),
534*b077aed3SPierre Pronchery                        0ULL},
535*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
536*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
537*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
538*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
539*b077aed3SPierre Pronchery                        0ULL},
540*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY)
541*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
542*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
543*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
544*b077aed3SPierre Pronchery                        0ULL},
545*b077aed3SPierre Pronchery         /*.kmctr  = */{S390X_CAPBIT(S390X_QUERY)
546*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
547*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
548*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
549*b077aed3SPierre Pronchery                        0ULL},
550*b077aed3SPierre Pronchery         /*.kmo    = */{S390X_CAPBIT(S390X_QUERY)
551*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
552*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
553*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
554*b077aed3SPierre Pronchery                        0ULL},
555*b077aed3SPierre Pronchery         /*.kmf    = */{S390X_CAPBIT(S390X_QUERY)
556*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
557*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
558*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
559*b077aed3SPierre Pronchery                        0ULL},
560*b077aed3SPierre Pronchery         /*.prno   = */{S390X_CAPBIT(S390X_QUERY)
561*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512_DRNG),
562*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_TRNG)},
563*b077aed3SPierre Pronchery         /*.kma    = */{S390X_CAPBIT(S390X_QUERY)
564*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
565*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
566*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
567*b077aed3SPierre Pronchery                        0ULL},
568*b077aed3SPierre Pronchery         /*.pcc    = */{S390X_CAPBIT(S390X_QUERY),
569*b077aed3SPierre Pronchery                        0ULL},
570*b077aed3SPierre Pronchery         /*.kdsa   = */{0ULL, 0ULL},
571*b077aed3SPierre Pronchery     };
572*b077aed3SPierre Pronchery 
573*b077aed3SPierre Pronchery     /*-
574*b077aed3SPierre Pronchery      * z15 (2019) - z/Architecture POP SA22-7832-12
575*b077aed3SPierre Pronchery      * Implements MSA and MSA1-9.
576*b077aed3SPierre Pronchery      */
577*b077aed3SPierre Pronchery     static const struct OPENSSL_s390xcap_st z15 = {
578*b077aed3SPierre Pronchery         /*.stfle  = */{S390X_CAPBIT(S390X_MSA)
579*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_STCKF)
580*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA5),
581*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_MSA3)
582*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA4),
583*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_VX)
584*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_VXD)
585*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_VXE)
586*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA8)
587*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_MSA9),
588*b077aed3SPierre Pronchery                        0ULL},
589*b077aed3SPierre Pronchery         /*.kimd   = */{S390X_CAPBIT(S390X_QUERY)
590*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
591*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
592*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512)
593*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_224)
594*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_256)
595*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_384)
596*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_512)
597*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_128)
598*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_256),
599*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_GHASH)},
600*b077aed3SPierre Pronchery         /*.klmd   = */{S390X_CAPBIT(S390X_QUERY)
601*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_1)
602*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_256)
603*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512)
604*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_224)
605*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_256)
606*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_384)
607*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA3_512)
608*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_128)
609*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHAKE_256),
610*b077aed3SPierre Pronchery                        0ULL},
611*b077aed3SPierre Pronchery         /*.km     = */{S390X_CAPBIT(S390X_QUERY)
612*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
613*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
614*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256)
615*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_128)
616*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_XTS_AES_256),
617*b077aed3SPierre Pronchery                        0ULL},
618*b077aed3SPierre Pronchery         /*.kmc    = */{S390X_CAPBIT(S390X_QUERY)
619*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
620*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
621*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
622*b077aed3SPierre Pronchery                        0ULL},
623*b077aed3SPierre Pronchery         /*.kmac   = */{S390X_CAPBIT(S390X_QUERY)
624*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
625*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
626*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
627*b077aed3SPierre Pronchery                        0ULL},
628*b077aed3SPierre Pronchery         /*.kmctr  = */{S390X_CAPBIT(S390X_QUERY)
629*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
630*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
631*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
632*b077aed3SPierre Pronchery                        0ULL},
633*b077aed3SPierre Pronchery         /*.kmo    = */{S390X_CAPBIT(S390X_QUERY)
634*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
635*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
636*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
637*b077aed3SPierre Pronchery                        0ULL},
638*b077aed3SPierre Pronchery         /*.kmf    = */{S390X_CAPBIT(S390X_QUERY)
639*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
640*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
641*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
642*b077aed3SPierre Pronchery                        0ULL},
643*b077aed3SPierre Pronchery         /*.prno   = */{S390X_CAPBIT(S390X_QUERY)
644*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SHA_512_DRNG),
645*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_TRNG)},
646*b077aed3SPierre Pronchery         /*.kma    = */{S390X_CAPBIT(S390X_QUERY)
647*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_128)
648*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_192)
649*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_AES_256),
650*b077aed3SPierre Pronchery                        0ULL},
651*b077aed3SPierre Pronchery         /*.pcc    = */{S390X_CAPBIT(S390X_QUERY),
652*b077aed3SPierre Pronchery                        S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P256)
653*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P384)
654*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_P521)
655*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED25519)
656*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_ED448)
657*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X25519)
658*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_SCALAR_MULTIPLY_X448)},
659*b077aed3SPierre Pronchery         /*.kdsa   = */{S390X_CAPBIT(S390X_QUERY)
660*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_VERIFY_P256)
661*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_VERIFY_P384)
662*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_VERIFY_P521)
663*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_SIGN_P256)
664*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_SIGN_P384)
665*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_ECDSA_SIGN_P521)
666*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED25519)
667*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_EDDSA_VERIFY_ED448)
668*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_EDDSA_SIGN_ED25519)
669*b077aed3SPierre Pronchery                        | S390X_CAPBIT(S390X_EDDSA_SIGN_ED448),
670*b077aed3SPierre Pronchery                        0ULL},
671*b077aed3SPierre Pronchery     };
672*b077aed3SPierre Pronchery 
673*b077aed3SPierre Pronchery     char *tok_begin, *tok_end, *buff, tok[S390X_STFLE_MAX][LEN + 1];
674*b077aed3SPierre Pronchery     int rc, off, i, n;
675*b077aed3SPierre Pronchery 
676*b077aed3SPierre Pronchery     buff = malloc(strlen(env) + 1);
677*b077aed3SPierre Pronchery     if (buff == NULL)
678*b077aed3SPierre Pronchery         return 0;
679*b077aed3SPierre Pronchery 
680*b077aed3SPierre Pronchery     rc = 0;
681*b077aed3SPierre Pronchery     memset(cap, ~0, sizeof(*cap));
682*b077aed3SPierre Pronchery     strcpy(buff, env);
683*b077aed3SPierre Pronchery 
684*b077aed3SPierre Pronchery     tok_begin = buff + strspn(buff, ";");
685*b077aed3SPierre Pronchery     strtok(tok_begin, ";");
686*b077aed3SPierre Pronchery     tok_end = strtok(NULL, ";");
687*b077aed3SPierre Pronchery 
688*b077aed3SPierre Pronchery     while (tok_begin != NULL) {
689*b077aed3SPierre Pronchery         /* stfle token */
690*b077aed3SPierre Pronchery         if ((n = sscanf(tok_begin,
691*b077aed3SPierre Pronchery                         " stfle : %" STR(LEN) "[^:] : "
692*b077aed3SPierre Pronchery                         "%" STR(LEN) "[^:] : %" STR(LEN) "s ",
693*b077aed3SPierre Pronchery                         tok[0], tok[1], tok[2]))) {
694*b077aed3SPierre Pronchery             for (i = 0; i < n; i++) {
695*b077aed3SPierre Pronchery                 off = (tok[i][0] == '~') ? 1 : 0;
696*b077aed3SPierre Pronchery                 if (sscanf(tok[i] + off, "%llx", &cap->stfle[i]) != 1)
697*b077aed3SPierre Pronchery                     goto ret;
698*b077aed3SPierre Pronchery                 if (off)
699*b077aed3SPierre Pronchery                     cap->stfle[i] = ~cap->stfle[i];
700*b077aed3SPierre Pronchery             }
701*b077aed3SPierre Pronchery         }
702*b077aed3SPierre Pronchery 
703*b077aed3SPierre Pronchery         /* query function tokens */
704*b077aed3SPierre Pronchery         else if TOK_FUNC(kimd)
705*b077aed3SPierre Pronchery         else if TOK_FUNC(klmd)
706*b077aed3SPierre Pronchery         else if TOK_FUNC(km)
707*b077aed3SPierre Pronchery         else if TOK_FUNC(kmc)
708*b077aed3SPierre Pronchery         else if TOK_FUNC(kmac)
709*b077aed3SPierre Pronchery         else if TOK_FUNC(kmctr)
710*b077aed3SPierre Pronchery         else if TOK_FUNC(kmo)
711*b077aed3SPierre Pronchery         else if TOK_FUNC(kmf)
712*b077aed3SPierre Pronchery         else if TOK_FUNC(prno)
713*b077aed3SPierre Pronchery         else if TOK_FUNC(kma)
714*b077aed3SPierre Pronchery         else if TOK_FUNC(pcc)
715*b077aed3SPierre Pronchery         else if TOK_FUNC(kdsa)
716*b077aed3SPierre Pronchery 
717*b077aed3SPierre Pronchery         /* CPU model tokens */
718*b077aed3SPierre Pronchery         else if TOK_CPU(z900)
719*b077aed3SPierre Pronchery         else if TOK_CPU(z990)
720*b077aed3SPierre Pronchery         else if TOK_CPU(z9)
721*b077aed3SPierre Pronchery         else if TOK_CPU(z10)
722*b077aed3SPierre Pronchery         else if TOK_CPU(z196)
723*b077aed3SPierre Pronchery         else if TOK_CPU(zEC12)
724*b077aed3SPierre Pronchery         else if TOK_CPU(z13)
725*b077aed3SPierre Pronchery         else if TOK_CPU(z14)
726*b077aed3SPierre Pronchery         else if TOK_CPU(z15)
727*b077aed3SPierre Pronchery 
728*b077aed3SPierre Pronchery         /* whitespace(ignored) or invalid tokens */
729*b077aed3SPierre Pronchery         else {
730*b077aed3SPierre Pronchery             while (*tok_begin != '\0') {
731*b077aed3SPierre Pronchery                 if (!ossl_isspace(*tok_begin))
732*b077aed3SPierre Pronchery                     goto ret;
733*b077aed3SPierre Pronchery                 tok_begin++;
734*b077aed3SPierre Pronchery             }
735*b077aed3SPierre Pronchery         }
736*b077aed3SPierre Pronchery 
737*b077aed3SPierre Pronchery         tok_begin = tok_end;
738*b077aed3SPierre Pronchery         tok_end = strtok(NULL, ";");
739*b077aed3SPierre Pronchery     }
740*b077aed3SPierre Pronchery 
741*b077aed3SPierre Pronchery     rc = 1;
742*b077aed3SPierre Pronchery ret:
743*b077aed3SPierre Pronchery     free(buff);
744*b077aed3SPierre Pronchery     return rc;
745*b077aed3SPierre Pronchery }
746