]>
Commit | Line | Data |
---|---|---|
bc4e831c | 1 | /* |
fecb3aae | 2 | * Copyright 2017-2022 The OpenSSL Project Authors. All Rights Reserved. |
bc4e831c | 3 | * |
0e9725bc | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
bc4e831c PS |
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 | ||
ae4186b0 DMSP |
10 | #ifndef OSSL_CRYPTO_S390X_ARCH_H |
11 | # define OSSL_CRYPTO_S390X_ARCH_H | |
bc4e831c PS |
12 | |
13 | # ifndef __ASSEMBLER__ | |
14 | ||
f38edcab PS |
15 | void s390x_kimd(const unsigned char *in, size_t len, unsigned int fc, |
16 | void *param); | |
17 | void s390x_klmd(const unsigned char *in, size_t inlen, unsigned char *out, | |
18 | size_t outlen, unsigned int fc, void *param); | |
96530eea PS |
19 | void s390x_km(const unsigned char *in, size_t len, unsigned char *out, |
20 | unsigned int fc, void *param); | |
39f5b069 PS |
21 | void s390x_kmac(const unsigned char *in, size_t len, unsigned int fc, |
22 | void *param); | |
dacd2a87 PS |
23 | void s390x_kmo(const unsigned char *in, size_t len, unsigned char *out, |
24 | unsigned int fc, void *param); | |
74d38a86 PS |
25 | void s390x_kmf(const unsigned char *in, size_t len, unsigned char *out, |
26 | unsigned int fc, void *param); | |
96530eea PS |
27 | void s390x_kma(const unsigned char *aad, size_t alen, const unsigned char *in, |
28 | size_t len, unsigned char *out, unsigned int fc, void *param); | |
e382f507 PS |
29 | int s390x_pcc(unsigned int fc, void *param); |
30 | int s390x_kdsa(unsigned int fc, void *param, const unsigned char *in, | |
31 | size_t len); | |
96530eea | 32 | |
19bd1fa1 PS |
33 | void s390x_flip_endian32(unsigned char dst[32], const unsigned char src[32]); |
34 | void s390x_flip_endian64(unsigned char dst[64], const unsigned char src[64]); | |
35 | ||
c1e48c51 P |
36 | int s390x_x25519_mul(unsigned char u_dst[32], |
37 | const unsigned char u_src[32], | |
38 | const unsigned char d_src[32]); | |
39 | int s390x_x448_mul(unsigned char u_dst[56], | |
40 | const unsigned char u_src[56], | |
41 | const unsigned char d_src[56]); | |
42 | int s390x_ed25519_mul(unsigned char x_dst[32], | |
43 | unsigned char y_dst[32], | |
44 | const unsigned char x_src[32], | |
45 | const unsigned char y_src[32], | |
46 | const unsigned char d_src[32]); | |
47 | int s390x_ed448_mul(unsigned char x_dst[57], | |
48 | unsigned char y_dst[57], | |
49 | const unsigned char x_src[57], | |
50 | const unsigned char y_src[57], | |
51 | const unsigned char d_src[57]); | |
52 | ||
bc4e831c PS |
53 | /* |
54 | * The field elements of OPENSSL_s390xcap_P are the 64-bit words returned by | |
55 | * the STFLE instruction followed by the 64-bit word pairs returned by | |
56 | * instructions' QUERY functions. If STFLE returns fewer data or an instruction | |
57 | * is not supported, the corresponding field elements are zero. | |
58 | */ | |
59 | struct OPENSSL_s390xcap_st { | |
60 | unsigned long long stfle[4]; | |
61 | unsigned long long kimd[2]; | |
62 | unsigned long long klmd[2]; | |
63 | unsigned long long km[2]; | |
64 | unsigned long long kmc[2]; | |
65 | unsigned long long kmac[2]; | |
66 | unsigned long long kmctr[2]; | |
67 | unsigned long long kmo[2]; | |
68 | unsigned long long kmf[2]; | |
69 | unsigned long long prno[2]; | |
70 | unsigned long long kma[2]; | |
e382f507 PS |
71 | unsigned long long pcc[2]; |
72 | unsigned long long kdsa[2]; | |
bc4e831c PS |
73 | }; |
74 | ||
37816ef5 JC |
75 | #if defined(__GNUC__) && defined(__linux) |
76 | __attribute__ ((visibility("hidden"))) | |
77 | #endif | |
bc4e831c PS |
78 | extern struct OPENSSL_s390xcap_st OPENSSL_s390xcap_P; |
79 | ||
f39ad8dc | 80 | /* Max number of 64-bit words currently returned by STFLE */ |
dd6b2706 | 81 | # define S390X_STFLE_MAX 3 |
f39ad8dc | 82 | |
bc4e831c | 83 | /* convert facility bit number or function code to bit mask */ |
dd6b2706 | 84 | # define S390X_CAPBIT(i) (1ULL << (63 - (i) % 64)) |
bc4e831c PS |
85 | |
86 | # endif | |
87 | ||
88 | /* OPENSSL_s390xcap_P offsets [bytes] */ | |
dd6b2706 P |
89 | # define S390X_STFLE 0x00 |
90 | # define S390X_KIMD 0x20 | |
91 | # define S390X_KLMD 0x30 | |
92 | # define S390X_KM 0x40 | |
93 | # define S390X_KMC 0x50 | |
94 | # define S390X_KMAC 0x60 | |
95 | # define S390X_KMCTR 0x70 | |
96 | # define S390X_KMO 0x80 | |
97 | # define S390X_KMF 0x90 | |
98 | # define S390X_PRNO 0xa0 | |
99 | # define S390X_KMA 0xb0 | |
100 | # define S390X_PCC 0xc0 | |
101 | # define S390X_KDSA 0xd0 | |
bc4e831c PS |
102 | |
103 | /* Facility Bit Numbers */ | |
dd6b2706 P |
104 | # define S390X_MSA 17 /* message-security-assist */ |
105 | # define S390X_STCKF 25 /* store-clock-fast */ | |
106 | # define S390X_MSA5 57 /* message-security-assist-ext. 5 */ | |
107 | # define S390X_MSA3 76 /* message-security-assist-ext. 3 */ | |
108 | # define S390X_MSA4 77 /* message-security-assist-ext. 4 */ | |
109 | # define S390X_VX 129 /* vector */ | |
110 | # define S390X_VXD 134 /* vector packed decimal */ | |
111 | # define S390X_VXE 135 /* vector enhancements 1 */ | |
112 | # define S390X_MSA8 146 /* message-security-assist-ext. 8 */ | |
113 | # define S390X_MSA9 155 /* message-security-assist-ext. 9 */ | |
bc4e831c PS |
114 | |
115 | /* Function Codes */ | |
116 | ||
117 | /* all instructions */ | |
dd6b2706 | 118 | # define S390X_QUERY 0 |
bc4e831c PS |
119 | |
120 | /* kimd/klmd */ | |
dd6b2706 P |
121 | # define S390X_SHA_1 1 |
122 | # define S390X_SHA_256 2 | |
123 | # define S390X_SHA_512 3 | |
124 | # define S390X_SHA3_224 32 | |
125 | # define S390X_SHA3_256 33 | |
126 | # define S390X_SHA3_384 34 | |
127 | # define S390X_SHA3_512 35 | |
524f1261 UM |
128 | # define S390X_KECCAK_224 32 |
129 | # define S390X_KECCAK_256 33 | |
130 | # define S390X_KECCAK_384 34 | |
131 | # define S390X_KECCAK_512 35 | |
dd6b2706 P |
132 | # define S390X_SHAKE_128 36 |
133 | # define S390X_SHAKE_256 37 | |
134 | # define S390X_GHASH 65 | |
bc4e831c PS |
135 | |
136 | /* km/kmc/kmac/kmctr/kmo/kmf/kma */ | |
dd6b2706 P |
137 | # define S390X_AES_128 18 |
138 | # define S390X_AES_192 19 | |
139 | # define S390X_AES_256 20 | |
bc4e831c | 140 | |
f39ad8dc | 141 | /* km */ |
dd6b2706 P |
142 | # define S390X_XTS_AES_128 50 |
143 | # define S390X_XTS_AES_256 52 | |
f39ad8dc | 144 | |
bc4e831c | 145 | /* prno */ |
dd6b2706 P |
146 | # define S390X_SHA_512_DRNG 3 |
147 | # define S390X_TRNG 114 | |
bc4e831c | 148 | |
e382f507 | 149 | /* pcc */ |
dd6b2706 P |
150 | # define S390X_SCALAR_MULTIPLY_P256 64 |
151 | # define S390X_SCALAR_MULTIPLY_P384 65 | |
152 | # define S390X_SCALAR_MULTIPLY_P521 66 | |
19bd1fa1 PS |
153 | # define S390X_SCALAR_MULTIPLY_ED25519 72 |
154 | # define S390X_SCALAR_MULTIPLY_ED448 73 | |
155 | # define S390X_SCALAR_MULTIPLY_X25519 80 | |
156 | # define S390X_SCALAR_MULTIPLY_X448 81 | |
e382f507 PS |
157 | |
158 | /* kdsa */ | |
dd6b2706 P |
159 | # define S390X_ECDSA_VERIFY_P256 1 |
160 | # define S390X_ECDSA_VERIFY_P384 2 | |
161 | # define S390X_ECDSA_VERIFY_P521 3 | |
162 | # define S390X_ECDSA_SIGN_P256 9 | |
163 | # define S390X_ECDSA_SIGN_P384 10 | |
164 | # define S390X_ECDSA_SIGN_P521 11 | |
19bd1fa1 PS |
165 | # define S390X_EDDSA_VERIFY_ED25519 32 |
166 | # define S390X_EDDSA_VERIFY_ED448 36 | |
167 | # define S390X_EDDSA_SIGN_ED25519 40 | |
168 | # define S390X_EDDSA_SIGN_ED448 44 | |
e382f507 | 169 | |
96530eea | 170 | /* Register 0 Flags */ |
dd6b2706 P |
171 | # define S390X_DECRYPT 0x80 |
172 | # define S390X_KMA_LPC 0x100 | |
173 | # define S390X_KMA_LAAD 0x200 | |
174 | # define S390X_KMA_HS 0x400 | |
175 | # define S390X_KDSA_D 0x80 | |
96530eea | 176 | |
bc4e831c | 177 | #endif |