aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/crypto/crypt_s390.h
diff options
context:
space:
mode:
authorJan Glauber <jan.glauber@de.ibm.com>2007-02-05 15:18:14 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2007-02-05 15:18:14 -0500
commit86aa9fc2456d8a662f299a70bdb70987209170f0 (patch)
tree39708583852c0b311dcb662ba9f29c412c303f67 /arch/s390/crypto/crypt_s390.h
parent347d59d7e9739ff2acbaa751b6225ecb335c3f29 (diff)
[S390] move crypto options and some cleanup.
This patch moves the config options for the s390 crypto instructions to the standard "Hardware crypto devices" menu. In addition some cleanup has been done: use a flag for supported keylengths, add a warning about machien limitation, return ENOTSUPP in case the hardware has no support, remove superfluous printks and update email addresses. Signed-off-by: Jan Glauber <jan.glauber@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/crypto/crypt_s390.h')
-rw-r--r--arch/s390/crypto/crypt_s390.h280
1 files changed, 138 insertions, 142 deletions
diff --git a/arch/s390/crypto/crypt_s390.h b/arch/s390/crypto/crypt_s390.h
index 2b137089f625..2b92c2fd12d4 100644
--- a/arch/s390/crypto/crypt_s390.h
+++ b/arch/s390/crypto/crypt_s390.h
@@ -3,8 +3,9 @@
3 * 3 *
4 * Support for s390 cryptographic instructions. 4 * Support for s390 cryptographic instructions.
5 * 5 *
6 * Copyright (C) 2003 IBM Deutschland GmbH, IBM Corporation 6 * Copyright IBM Corp. 2003,2007
7 * Author(s): Thomas Spatzier (tspat@de.ibm.com) 7 * Author(s): Thomas Spatzier
8 * Jan Glauber (jan.glauber@de.ibm.com)
8 * 9 *
9 * This program is free software; you can redistribute it and/or modify it 10 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the Free 11 * under the terms of the GNU General Public License as published by the Free
@@ -32,7 +33,8 @@ enum crypt_s390_operations {
32 CRYPT_S390_KMAC = 0x0500 33 CRYPT_S390_KMAC = 0x0500
33}; 34};
34 35
35/* function codes for KM (CIPHER MESSAGE) instruction 36/*
37 * function codes for KM (CIPHER MESSAGE) instruction
36 * 0x80 is the decipher modifier bit 38 * 0x80 is the decipher modifier bit
37 */ 39 */
38enum crypt_s390_km_func { 40enum crypt_s390_km_func {
@@ -51,7 +53,8 @@ enum crypt_s390_km_func {
51 KM_AES_256_DECRYPT = CRYPT_S390_KM | 0x14 | 0x80, 53 KM_AES_256_DECRYPT = CRYPT_S390_KM | 0x14 | 0x80,
52}; 54};
53 55
54/* function codes for KMC (CIPHER MESSAGE WITH CHAINING) 56/*
57 * function codes for KMC (CIPHER MESSAGE WITH CHAINING)
55 * instruction 58 * instruction
56 */ 59 */
57enum crypt_s390_kmc_func { 60enum crypt_s390_kmc_func {
@@ -70,7 +73,8 @@ enum crypt_s390_kmc_func {
70 KMC_AES_256_DECRYPT = CRYPT_S390_KMC | 0x14 | 0x80, 73 KMC_AES_256_DECRYPT = CRYPT_S390_KMC | 0x14 | 0x80,
71}; 74};
72 75
73/* function codes for KIMD (COMPUTE INTERMEDIATE MESSAGE DIGEST) 76/*
77 * function codes for KIMD (COMPUTE INTERMEDIATE MESSAGE DIGEST)
74 * instruction 78 * instruction
75 */ 79 */
76enum crypt_s390_kimd_func { 80enum crypt_s390_kimd_func {
@@ -79,7 +83,8 @@ enum crypt_s390_kimd_func {
79 KIMD_SHA_256 = CRYPT_S390_KIMD | 2, 83 KIMD_SHA_256 = CRYPT_S390_KIMD | 2,
80}; 84};
81 85
82/* function codes for KLMD (COMPUTE LAST MESSAGE DIGEST) 86/*
87 * function codes for KLMD (COMPUTE LAST MESSAGE DIGEST)
83 * instruction 88 * instruction
84 */ 89 */
85enum crypt_s390_klmd_func { 90enum crypt_s390_klmd_func {
@@ -88,7 +93,8 @@ enum crypt_s390_klmd_func {
88 KLMD_SHA_256 = CRYPT_S390_KLMD | 2, 93 KLMD_SHA_256 = CRYPT_S390_KLMD | 2,
89}; 94};
90 95
91/* function codes for KMAC (COMPUTE MESSAGE AUTHENTICATION CODE) 96/*
97 * function codes for KMAC (COMPUTE MESSAGE AUTHENTICATION CODE)
92 * instruction 98 * instruction
93 */ 99 */
94enum crypt_s390_kmac_func { 100enum crypt_s390_kmac_func {
@@ -98,229 +104,219 @@ enum crypt_s390_kmac_func {
98 KMAC_TDEA_192 = CRYPT_S390_KMAC | 3 104 KMAC_TDEA_192 = CRYPT_S390_KMAC | 3
99}; 105};
100 106
101/* status word for s390 crypto instructions' QUERY functions */ 107/**
102struct crypt_s390_query_status { 108 * crypt_s390_km:
103 u64 high; 109 * @func: the function code passed to KM; see crypt_s390_km_func
104 u64 low; 110 * @param: address of parameter block; see POP for details on each func
105}; 111 * @dest: address of destination memory area
106 112 * @src: address of source memory area
107/* 113 * @src_len: length of src operand in bytes
114 *
108 * Executes the KM (CIPHER MESSAGE) operation of the CPU. 115 * Executes the KM (CIPHER MESSAGE) operation of the CPU.
109 * @param func: the function code passed to KM; see crypt_s390_km_func 116 *
110 * @param param: address of parameter block; see POP for details on each func 117 * Returns -1 for failure, 0 for the query func, number of processed
111 * @param dest: address of destination memory area 118 * bytes for encryption/decryption funcs
112 * @param src: address of source memory area
113 * @param src_len: length of src operand in bytes
114 * @returns < zero for failure, 0 for the query func, number of processed bytes
115 * for encryption/decryption funcs
116 */ 119 */
117static inline int 120static inline int crypt_s390_km(long func, void *param,
118crypt_s390_km(long func, void* param, u8* dest, const u8* src, long src_len) 121 u8 *dest, const u8 *src, long src_len)
119{ 122{
120 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK; 123 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK;
121 register void* __param asm("1") = param; 124 register void *__param asm("1") = param;
122 register const u8* __src asm("2") = src; 125 register const u8 *__src asm("2") = src;
123 register long __src_len asm("3") = src_len; 126 register long __src_len asm("3") = src_len;
124 register u8* __dest asm("4") = dest; 127 register u8 *__dest asm("4") = dest;
125 int ret; 128 int ret;
126 129
127 asm volatile( 130 asm volatile(
128 "0: .insn rre,0xb92e0000,%3,%1 \n" /* KM opcode */ 131 "0: .insn rre,0xb92e0000,%3,%1 \n" /* KM opcode */
129 "1: brc 1,0b \n" /* handle partial completion */ 132 "1: brc 1,0b \n" /* handle partial completion */
130 " ahi %0,%h7\n" 133 " la %0,0\n"
131 "2: ahi %0,%h8\n" 134 "2:\n"
132 "3:\n" 135 EX_TABLE(0b,2b) EX_TABLE(1b,2b)
133 EX_TABLE(0b,3b) EX_TABLE(1b,2b)
134 : "=d" (ret), "+a" (__src), "+d" (__src_len), "+a" (__dest) 136 : "=d" (ret), "+a" (__src), "+d" (__src_len), "+a" (__dest)
135 : "d" (__func), "a" (__param), "0" (-EFAULT), 137 : "d" (__func), "a" (__param), "0" (-1) : "cc", "memory");
136 "K" (ENOSYS), "K" (-ENOSYS + EFAULT) : "cc", "memory");
137 if (ret < 0) 138 if (ret < 0)
138 return ret; 139 return ret;
139 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len; 140 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len;
140} 141}
141 142
142/* 143/**
144 * crypt_s390_kmc:
145 * @func: the function code passed to KM; see crypt_s390_kmc_func
146 * @param: address of parameter block; see POP for details on each func
147 * @dest: address of destination memory area
148 * @src: address of source memory area
149 * @src_len: length of src operand in bytes
150 *
143 * Executes the KMC (CIPHER MESSAGE WITH CHAINING) operation of the CPU. 151 * Executes the KMC (CIPHER MESSAGE WITH CHAINING) operation of the CPU.
144 * @param func: the function code passed to KM; see crypt_s390_kmc_func 152 *
145 * @param param: address of parameter block; see POP for details on each func 153 * Returns -1 for failure, 0 for the query func, number of processed
146 * @param dest: address of destination memory area 154 * bytes for encryption/decryption funcs
147 * @param src: address of source memory area
148 * @param src_len: length of src operand in bytes
149 * @returns < zero for failure, 0 for the query func, number of processed bytes
150 * for encryption/decryption funcs
151 */ 155 */
152static inline int 156static inline int crypt_s390_kmc(long func, void *param,
153crypt_s390_kmc(long func, void* param, u8* dest, const u8* src, long src_len) 157 u8 *dest, const u8 *src, long src_len)
154{ 158{
155 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK; 159 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK;
156 register void* __param asm("1") = param; 160 register void *__param asm("1") = param;
157 register const u8* __src asm("2") = src; 161 register const u8 *__src asm("2") = src;
158 register long __src_len asm("3") = src_len; 162 register long __src_len asm("3") = src_len;
159 register u8* __dest asm("4") = dest; 163 register u8 *__dest asm("4") = dest;
160 int ret; 164 int ret;
161 165
162 asm volatile( 166 asm volatile(
163 "0: .insn rre,0xb92f0000,%3,%1 \n" /* KMC opcode */ 167 "0: .insn rre,0xb92f0000,%3,%1 \n" /* KMC opcode */
164 "1: brc 1,0b \n" /* handle partial completion */ 168 "1: brc 1,0b \n" /* handle partial completion */
165 " ahi %0,%h7\n" 169 " la %0,0\n"
166 "2: ahi %0,%h8\n" 170 "2:\n"
167 "3:\n" 171 EX_TABLE(0b,2b) EX_TABLE(1b,2b)
168 EX_TABLE(0b,3b) EX_TABLE(1b,2b)
169 : "=d" (ret), "+a" (__src), "+d" (__src_len), "+a" (__dest) 172 : "=d" (ret), "+a" (__src), "+d" (__src_len), "+a" (__dest)
170 : "d" (__func), "a" (__param), "0" (-EFAULT), 173 : "d" (__func), "a" (__param), "0" (-1) : "cc", "memory");
171 "K" (ENOSYS), "K" (-ENOSYS + EFAULT) : "cc", "memory");
172 if (ret < 0) 174 if (ret < 0)
173 return ret; 175 return ret;
174 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len; 176 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len;
175} 177}
176 178
177/* 179/**
180 * crypt_s390_kimd:
181 * @func: the function code passed to KM; see crypt_s390_kimd_func
182 * @param: address of parameter block; see POP for details on each func
183 * @src: address of source memory area
184 * @src_len: length of src operand in bytes
185 *
178 * Executes the KIMD (COMPUTE INTERMEDIATE MESSAGE DIGEST) operation 186 * Executes the KIMD (COMPUTE INTERMEDIATE MESSAGE DIGEST) operation
179 * of the CPU. 187 * of the CPU.
180 * @param func: the function code passed to KM; see crypt_s390_kimd_func 188 *
181 * @param param: address of parameter block; see POP for details on each func 189 * Returns -1 for failure, 0 for the query func, number of processed
182 * @param src: address of source memory area 190 * bytes for digest funcs
183 * @param src_len: length of src operand in bytes
184 * @returns < zero for failure, 0 for the query func, number of processed bytes
185 * for digest funcs
186 */ 191 */
187static inline int 192static inline int crypt_s390_kimd(long func, void *param,
188crypt_s390_kimd(long func, void* param, const u8* src, long src_len) 193 const u8 *src, long src_len)
189{ 194{
190 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK; 195 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK;
191 register void* __param asm("1") = param; 196 register void *__param asm("1") = param;
192 register const u8* __src asm("2") = src; 197 register const u8 *__src asm("2") = src;
193 register long __src_len asm("3") = src_len; 198 register long __src_len asm("3") = src_len;
194 int ret; 199 int ret;
195 200
196 asm volatile( 201 asm volatile(
197 "0: .insn rre,0xb93e0000,%1,%1 \n" /* KIMD opcode */ 202 "0: .insn rre,0xb93e0000,%1,%1 \n" /* KIMD opcode */
198 "1: brc 1,0b \n" /* handle partial completion */ 203 "1: brc 1,0b \n" /* handle partial completion */
199 " ahi %0,%h6\n" 204 " la %0,0\n"
200 "2: ahi %0,%h7\n" 205 "2:\n"
201 "3:\n" 206 EX_TABLE(0b,2b) EX_TABLE(1b,2b)
202 EX_TABLE(0b,3b) EX_TABLE(1b,2b)
203 : "=d" (ret), "+a" (__src), "+d" (__src_len) 207 : "=d" (ret), "+a" (__src), "+d" (__src_len)
204 : "d" (__func), "a" (__param), "0" (-EFAULT), 208 : "d" (__func), "a" (__param), "0" (-1) : "cc", "memory");
205 "K" (ENOSYS), "K" (-ENOSYS + EFAULT) : "cc", "memory");
206 if (ret < 0) 209 if (ret < 0)
207 return ret; 210 return ret;
208 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len; 211 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len;
209} 212}
210 213
211/* 214/**
215 * crypt_s390_klmd:
216 * @func: the function code passed to KM; see crypt_s390_klmd_func
217 * @param: address of parameter block; see POP for details on each func
218 * @src: address of source memory area
219 * @src_len: length of src operand in bytes
220 *
212 * Executes the KLMD (COMPUTE LAST MESSAGE DIGEST) operation of the CPU. 221 * Executes the KLMD (COMPUTE LAST MESSAGE DIGEST) operation of the CPU.
213 * @param func: the function code passed to KM; see crypt_s390_klmd_func 222 *
214 * @param param: address of parameter block; see POP for details on each func 223 * Returns -1 for failure, 0 for the query func, number of processed
215 * @param src: address of source memory area 224 * bytes for digest funcs
216 * @param src_len: length of src operand in bytes
217 * @returns < zero for failure, 0 for the query func, number of processed bytes
218 * for digest funcs
219 */ 225 */
220static inline int 226static inline int crypt_s390_klmd(long func, void *param,
221crypt_s390_klmd(long func, void* param, const u8* src, long src_len) 227 const u8 *src, long src_len)
222{ 228{
223 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK; 229 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK;
224 register void* __param asm("1") = param; 230 register void *__param asm("1") = param;
225 register const u8* __src asm("2") = src; 231 register const u8 *__src asm("2") = src;
226 register long __src_len asm("3") = src_len; 232 register long __src_len asm("3") = src_len;
227 int ret; 233 int ret;
228 234
229 asm volatile( 235 asm volatile(
230 "0: .insn rre,0xb93f0000,%1,%1 \n" /* KLMD opcode */ 236 "0: .insn rre,0xb93f0000,%1,%1 \n" /* KLMD opcode */
231 "1: brc 1,0b \n" /* handle partial completion */ 237 "1: brc 1,0b \n" /* handle partial completion */
232 " ahi %0,%h6\n" 238 " la %0,0\n"
233 "2: ahi %0,%h7\n" 239 "2:\n"
234 "3:\n" 240 EX_TABLE(0b,2b) EX_TABLE(1b,2b)
235 EX_TABLE(0b,3b) EX_TABLE(1b,2b)
236 : "=d" (ret), "+a" (__src), "+d" (__src_len) 241 : "=d" (ret), "+a" (__src), "+d" (__src_len)
237 : "d" (__func), "a" (__param), "0" (-EFAULT), 242 : "d" (__func), "a" (__param), "0" (-1) : "cc", "memory");
238 "K" (ENOSYS), "K" (-ENOSYS + EFAULT) : "cc", "memory");
239 if (ret < 0) 243 if (ret < 0)
240 return ret; 244 return ret;
241 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len; 245 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len;
242} 246}
243 247
244/* 248/**
249 * crypt_s390_kmac:
250 * @func: the function code passed to KM; see crypt_s390_klmd_func
251 * @param: address of parameter block; see POP for details on each func
252 * @src: address of source memory area
253 * @src_len: length of src operand in bytes
254 *
245 * Executes the KMAC (COMPUTE MESSAGE AUTHENTICATION CODE) operation 255 * Executes the KMAC (COMPUTE MESSAGE AUTHENTICATION CODE) operation
246 * of the CPU. 256 * of the CPU.
247 * @param func: the function code passed to KM; see crypt_s390_klmd_func 257 *
248 * @param param: address of parameter block; see POP for details on each func 258 * Returns -1 for failure, 0 for the query func, number of processed
249 * @param src: address of source memory area 259 * bytes for digest funcs
250 * @param src_len: length of src operand in bytes
251 * @returns < zero for failure, 0 for the query func, number of processed bytes
252 * for digest funcs
253 */ 260 */
254static inline int 261static inline int crypt_s390_kmac(long func, void *param,
255crypt_s390_kmac(long func, void* param, const u8* src, long src_len) 262 const u8 *src, long src_len)
256{ 263{
257 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK; 264 register long __func asm("0") = func & CRYPT_S390_FUNC_MASK;
258 register void* __param asm("1") = param; 265 register void *__param asm("1") = param;
259 register const u8* __src asm("2") = src; 266 register const u8 *__src asm("2") = src;
260 register long __src_len asm("3") = src_len; 267 register long __src_len asm("3") = src_len;
261 int ret; 268 int ret;
262 269
263 asm volatile( 270 asm volatile(
264 "0: .insn rre,0xb91e0000,%1,%1 \n" /* KLAC opcode */ 271 "0: .insn rre,0xb91e0000,%1,%1 \n" /* KLAC opcode */
265 "1: brc 1,0b \n" /* handle partial completion */ 272 "1: brc 1,0b \n" /* handle partial completion */
266 " ahi %0,%h6\n" 273 " la %0,0\n"
267 "2: ahi %0,%h7\n" 274 "2:\n"
268 "3:\n" 275 EX_TABLE(0b,2b) EX_TABLE(1b,2b)
269 EX_TABLE(0b,3b) EX_TABLE(1b,2b)
270 : "=d" (ret), "+a" (__src), "+d" (__src_len) 276 : "=d" (ret), "+a" (__src), "+d" (__src_len)
271 : "d" (__func), "a" (__param), "0" (-EFAULT), 277 : "d" (__func), "a" (__param), "0" (-1) : "cc", "memory");
272 "K" (ENOSYS), "K" (-ENOSYS + EFAULT) : "cc", "memory");
273 if (ret < 0) 278 if (ret < 0)
274 return ret; 279 return ret;
275 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len; 280 return (func & CRYPT_S390_FUNC_MASK) ? src_len - __src_len : __src_len;
276} 281}
277 282
278/** 283/**
284 * crypt_s390_func_available:
285 * @func: the function code of the specific function; 0 if op in general
286 *
279 * Tests if a specific crypto function is implemented on the machine. 287 * Tests if a specific crypto function is implemented on the machine.
280 * @param func: the function code of the specific function; 0 if op in general 288 *
281 * @return 1 if func available; 0 if func or op in general not available 289 * Returns 1 if func available; 0 if func or op in general not available
282 */ 290 */
283static inline int 291static inline int crypt_s390_func_available(int func)
284crypt_s390_func_available(int func)
285{ 292{
293 unsigned char status[16];
286 int ret; 294 int ret;
287 295
288 struct crypt_s390_query_status status = { 296 switch (func & CRYPT_S390_OP_MASK) {
289 .high = 0, 297 case CRYPT_S390_KM:
290 .low = 0 298 ret = crypt_s390_km(KM_QUERY, &status, NULL, NULL, 0);
291 }; 299 break;
292 switch (func & CRYPT_S390_OP_MASK){ 300 case CRYPT_S390_KMC:
293 case CRYPT_S390_KM: 301 ret = crypt_s390_kmc(KMC_QUERY, &status, NULL, NULL, 0);
294 ret = crypt_s390_km(KM_QUERY, &status, NULL, NULL, 0); 302 break;
295 break; 303 case CRYPT_S390_KIMD:
296 case CRYPT_S390_KMC: 304 ret = crypt_s390_kimd(KIMD_QUERY, &status, NULL, 0);
297 ret = crypt_s390_kmc(KMC_QUERY, &status, NULL, NULL, 0); 305 break;
298 break; 306 case CRYPT_S390_KLMD:
299 case CRYPT_S390_KIMD: 307 ret = crypt_s390_klmd(KLMD_QUERY, &status, NULL, 0);
300 ret = crypt_s390_kimd(KIMD_QUERY, &status, NULL, 0); 308 break;
301 break; 309 case CRYPT_S390_KMAC:
302 case CRYPT_S390_KLMD: 310 ret = crypt_s390_kmac(KMAC_QUERY, &status, NULL, 0);
303 ret = crypt_s390_klmd(KLMD_QUERY, &status, NULL, 0); 311 break;
304 break; 312 default:
305 case CRYPT_S390_KMAC: 313 return 0;
306 ret = crypt_s390_kmac(KMAC_QUERY, &status, NULL, 0);
307 break;
308 default:
309 ret = 0;
310 return ret;
311 }
312 if (ret >= 0){
313 func &= CRYPT_S390_FUNC_MASK;
314 func &= 0x7f; //mask modifier bit
315 if (func < 64){
316 ret = (status.high >> (64 - func - 1)) & 0x1;
317 } else {
318 ret = (status.low >> (128 - func - 1)) & 0x1;
319 }
320 } else {
321 ret = 0;
322 } 314 }
323 return ret; 315 if (ret < 0)
316 return 0;
317 func &= CRYPT_S390_FUNC_MASK;
318 func &= 0x7f; /* mask modifier bit */
319 return (status[func >> 3] & (0x80 >> (func & 7))) != 0;
324} 320}
325 321
326#endif // _CRYPTO_ARCH_S390_CRYPT_S390_H 322#endif /* _CRYPTO_ARCH_S390_CRYPT_S390_H */