1#include <linux/linkage.h> 2#include <asm/visasm.h> 3 4#define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5)) 5 6#define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20))) 7 8#define RS1(x) (FPD_ENCODE(x) << 14) 9#define RS2(x) (FPD_ENCODE(x) << 0) 10#define RS3(x) (FPD_ENCODE(x) << 9) 11#define RD(x) (FPD_ENCODE(x) << 25) 12#define IMM5(x) ((x) << 0) 13 14#define DES_IP(a,b) \ 15 .word (F3F(2, 0x36, 0x134)|RS1(a)|RD(b)); 16#define DES_IIP(a,b) \ 17 .word (F3F(2, 0x36, 0x135)|RS1(a)|RD(b)); 18#define DES_KEXPAND(a,b,c) \ 19 .word (F3F(2, 0x36, 0x136)|RS1(a)|IMM5(b)|RD(c)); 20#define DES_ROUND(a,b,c,d) \ 21 .word (F3F(2, 0x19, 0x009)|RS1(a)|RS2(b)|RS3(c)|RD(d)); 22 23#define MOVXTOD_G1_F60 \ 24 .word 0xbbb02301 25#define MOVXTOD_G1_F62 \ 26 .word 0xbfb02301 27 28 .align 32 29ENTRY(des_sparc64_key_expand) 30 /* %o0=input_key, %o1=output_key */ 31 VISEntryHalf 32 ld [%o0 + 0x00], %f0 33 ld [%o0 + 0x04], %f1 34 DES_KEXPAND(0, 0, 0) 35 DES_KEXPAND(0, 1, 2) 36 DES_KEXPAND(2, 3, 6) 37 DES_KEXPAND(2, 2, 4) 38 DES_KEXPAND(6, 3, 10) 39 DES_KEXPAND(6, 2, 8) 40 DES_KEXPAND(10, 3, 14) 41 DES_KEXPAND(10, 2, 12) 42 DES_KEXPAND(14, 1, 16) 43 DES_KEXPAND(16, 3, 20) 44 DES_KEXPAND(16, 2, 18) 45 DES_KEXPAND(20, 3, 24) 46 DES_KEXPAND(20, 2, 22) 47 DES_KEXPAND(24, 3, 28) 48 DES_KEXPAND(24, 2, 26) 49 DES_KEXPAND(28, 1, 30) 50 std %f0, [%o1 + 0x00] 51 std %f2, [%o1 + 0x08] 52 std %f4, [%o1 + 0x10] 53 std %f6, [%o1 + 0x18] 54 std %f8, [%o1 + 0x20] 55 std %f10, [%o1 + 0x28] 56 std %f12, [%o1 + 0x30] 57 std %f14, [%o1 + 0x38] 58 std %f16, [%o1 + 0x40] 59 std %f18, [%o1 + 0x48] 60 std %f20, [%o1 + 0x50] 61 std %f22, [%o1 + 0x58] 62 std %f24, [%o1 + 0x60] 63 std %f26, [%o1 + 0x68] 64 std %f28, [%o1 + 0x70] 65 std %f30, [%o1 + 0x78] 66 retl 67 VISExitHalf 68ENDPROC(des_sparc64_key_expand) 69 70 .align 32 71ENTRY(des_sparc64_crypt) 72 /* %o0=key, %o1=input, %o2=output */ 73 VISEntry 74 ldd [%o1 + 0x00], %f32 75 ldd [%o0 + 0x00], %f0 76 ldd [%o0 + 0x08], %f2 77 ldd [%o0 + 0x10], %f4 78 ldd [%o0 + 0x18], %f6 79 ldd [%o0 + 0x20], %f8 80 ldd [%o0 + 0x28], %f10 81 ldd [%o0 + 0x30], %f12 82 ldd [%o0 + 0x38], %f14 83 ldd [%o0 + 0x40], %f16 84 ldd [%o0 + 0x48], %f18 85 ldd [%o0 + 0x50], %f20 86 ldd [%o0 + 0x58], %f22 87 ldd [%o0 + 0x60], %f24 88 ldd [%o0 + 0x68], %f26 89 ldd [%o0 + 0x70], %f28 90 ldd [%o0 + 0x78], %f30 91 DES_IP(32, 32) 92 DES_ROUND(0, 2, 32, 32) 93 DES_ROUND(4, 6, 32, 32) 94 DES_ROUND(8, 10, 32, 32) 95 DES_ROUND(12, 14, 32, 32) 96 DES_ROUND(16, 18, 32, 32) 97 DES_ROUND(20, 22, 32, 32) 98 DES_ROUND(24, 26, 32, 32) 99 DES_ROUND(28, 30, 32, 32) 100 DES_IIP(32, 32) 101 std %f32, [%o2 + 0x00] 102 retl 103 VISExit 104ENDPROC(des_sparc64_crypt) 105 106 .align 32 107ENTRY(des_sparc64_load_keys) 108 /* %o0=key */ 109 VISEntry 110 ldd [%o0 + 0x00], %f0 111 ldd [%o0 + 0x08], %f2 112 ldd [%o0 + 0x10], %f4 113 ldd [%o0 + 0x18], %f6 114 ldd [%o0 + 0x20], %f8 115 ldd [%o0 + 0x28], %f10 116 ldd [%o0 + 0x30], %f12 117 ldd [%o0 + 0x38], %f14 118 ldd [%o0 + 0x40], %f16 119 ldd [%o0 + 0x48], %f18 120 ldd [%o0 + 0x50], %f20 121 ldd [%o0 + 0x58], %f22 122 ldd [%o0 + 0x60], %f24 123 ldd [%o0 + 0x68], %f26 124 ldd [%o0 + 0x70], %f28 125 retl 126 ldd [%o0 + 0x78], %f30 127ENDPROC(des_sparc64_load_keys) 128 129 .align 32 130ENTRY(des_sparc64_ecb_crypt) 131 /* %o0=input, %o1=output, %o2=len */ 1321: ldd [%o0 + 0x00], %f32 133 add %o0, 0x08, %o0 134 DES_IP(32, 32) 135 DES_ROUND(0, 2, 32, 32) 136 DES_ROUND(4, 6, 32, 32) 137 DES_ROUND(8, 10, 32, 32) 138 DES_ROUND(12, 14, 32, 32) 139 DES_ROUND(16, 18, 32, 32) 140 DES_ROUND(20, 22, 32, 32) 141 DES_ROUND(24, 26, 32, 32) 142 DES_ROUND(28, 30, 32, 32) 143 DES_IIP(32, 32) 144 std %f32, [%o1 + 0x00] 145 subcc %o2, 0x08, %o2 146 bne,pt %icc, 1b 147 add %o1, 0x08, %o1 148 retl 149 nop 150ENDPROC(des_sparc64_ecb_crypt) 151 152 .align 32 153ENTRY(des_sparc64_cbc_encrypt) 154 /* %o0=input, %o1=output, %o2=len, %o3=IV */ 155 ldd [%o3 + 0x00], %f32 1561: ldd [%o0 + 0x00], %f34 157 fxor %f32, %f34, %f32 158 DES_IP(32, 32) 159 DES_ROUND(0, 2, 32, 32) 160 DES_ROUND(4, 6, 32, 32) 161 DES_ROUND(8, 10, 32, 32) 162 DES_ROUND(12, 14, 32, 32) 163 DES_ROUND(16, 18, 32, 32) 164 DES_ROUND(20, 22, 32, 32) 165 DES_ROUND(24, 26, 32, 32) 166 DES_ROUND(28, 30, 32, 32) 167 DES_IIP(32, 32) 168 std %f32, [%o1 + 0x00] 169 add %o0, 0x08, %o0 170 subcc %o2, 0x08, %o2 171 bne,pt %icc, 1b 172 add %o1, 0x08, %o1 173 retl 174 std %f32, [%o3 + 0x00] 175ENDPROC(des_sparc64_cbc_encrypt) 176 177 .align 32 178ENTRY(des_sparc64_cbc_decrypt) 179 /* %o0=input, %o1=output, %o2=len, %o3=IV */ 180 ldd [%o3 + 0x00], %f34 1811: ldd [%o0 + 0x00], %f36 182 DES_IP(36, 32) 183 DES_ROUND(0, 2, 32, 32) 184 DES_ROUND(4, 6, 32, 32) 185 DES_ROUND(8, 10, 32, 32) 186 DES_ROUND(12, 14, 32, 32) 187 DES_ROUND(16, 18, 32, 32) 188 DES_ROUND(20, 22, 32, 32) 189 DES_ROUND(24, 26, 32, 32) 190 DES_ROUND(28, 30, 32, 32) 191 DES_IIP(32, 32) 192 fxor %f32, %f34, %f32 193 std %f32, [%o1 + 0x00] 194 add %o0, 0x08, %o0 195 subcc %o2, 0x08, %o2 196 bne,pt %icc, 1b 197 add %o1, 0x08, %o1 198 retl 199 std %f36, [%o3 + 0x00] 200ENDPROC(des_sparc64_cbc_decrypt) 201 202 .align 32 203ENTRY(des3_ede_sparc64_crypt) 204 /* %o0=key, %o1=input, %o2=output */ 205 VISEntry 206 ldd [%o1 + 0x00], %f32 207 ldd [%o0 + 0x00], %f0 208 ldd [%o0 + 0x08], %f2 209 ldd [%o0 + 0x10], %f4 210 ldd [%o0 + 0x18], %f6 211 ldd [%o0 + 0x20], %f8 212 ldd [%o0 + 0x28], %f10 213 ldd [%o0 + 0x30], %f12 214 ldd [%o0 + 0x38], %f14 215 ldd [%o0 + 0x40], %f16 216 ldd [%o0 + 0x48], %f18 217 ldd [%o0 + 0x50], %f20 218 ldd [%o0 + 0x58], %f22 219 ldd [%o0 + 0x60], %f24 220 ldd [%o0 + 0x68], %f26 221 ldd [%o0 + 0x70], %f28 222 ldd [%o0 + 0x78], %f30 223 DES_IP(32, 32) 224 DES_ROUND(0, 2, 32, 32) 225 ldd [%o0 + 0x80], %f0 226 ldd [%o0 + 0x88], %f2 227 DES_ROUND(4, 6, 32, 32) 228 ldd [%o0 + 0x90], %f4 229 ldd [%o0 + 0x98], %f6 230 DES_ROUND(8, 10, 32, 32) 231 ldd [%o0 + 0xa0], %f8 232 ldd [%o0 + 0xa8], %f10 233 DES_ROUND(12, 14, 32, 32) 234 ldd [%o0 + 0xb0], %f12 235 ldd [%o0 + 0xb8], %f14 236 DES_ROUND(16, 18, 32, 32) 237 ldd [%o0 + 0xc0], %f16 238 ldd [%o0 + 0xc8], %f18 239 DES_ROUND(20, 22, 32, 32) 240 ldd [%o0 + 0xd0], %f20 241 ldd [%o0 + 0xd8], %f22 242 DES_ROUND(24, 26, 32, 32) 243 ldd [%o0 + 0xe0], %f24 244 ldd [%o0 + 0xe8], %f26 245 DES_ROUND(28, 30, 32, 32) 246 ldd [%o0 + 0xf0], %f28 247 ldd [%o0 + 0xf8], %f30 248 DES_IIP(32, 32) 249 DES_IP(32, 32) 250 DES_ROUND(0, 2, 32, 32) 251 ldd [%o0 + 0x100], %f0 252 ldd [%o0 + 0x108], %f2 253 DES_ROUND(4, 6, 32, 32) 254 ldd [%o0 + 0x110], %f4 255 ldd [%o0 + 0x118], %f6 256 DES_ROUND(8, 10, 32, 32) 257 ldd [%o0 + 0x120], %f8 258 ldd [%o0 + 0x128], %f10 259 DES_ROUND(12, 14, 32, 32) 260 ldd [%o0 + 0x130], %f12 261 ldd [%o0 + 0x138], %f14 262 DES_ROUND(16, 18, 32, 32) 263 ldd [%o0 + 0x140], %f16 264 ldd [%o0 + 0x148], %f18 265 DES_ROUND(20, 22, 32, 32) 266 ldd [%o0 + 0x150], %f20 267 ldd [%o0 + 0x158], %f22 268 DES_ROUND(24, 26, 32, 32) 269 ldd [%o0 + 0x160], %f24 270 ldd [%o0 + 0x168], %f26 271 DES_ROUND(28, 30, 32, 32) 272 ldd [%o0 + 0x170], %f28 273 ldd [%o0 + 0x178], %f30 274 DES_IIP(32, 32) 275 DES_IP(32, 32) 276 DES_ROUND(0, 2, 32, 32) 277 DES_ROUND(4, 6, 32, 32) 278 DES_ROUND(8, 10, 32, 32) 279 DES_ROUND(12, 14, 32, 32) 280 DES_ROUND(16, 18, 32, 32) 281 DES_ROUND(20, 22, 32, 32) 282 DES_ROUND(24, 26, 32, 32) 283 DES_ROUND(28, 30, 32, 32) 284 DES_IIP(32, 32) 285 286 std %f32, [%o2 + 0x00] 287 retl 288 VISExit 289ENDPROC(des3_ede_sparc64_crypt) 290 291 .align 32 292ENTRY(des3_ede_sparc64_load_keys) 293 /* %o0=key */ 294 VISEntry 295 ldd [%o0 + 0x00], %f0 296 ldd [%o0 + 0x08], %f2 297 ldd [%o0 + 0x10], %f4 298 ldd [%o0 + 0x18], %f6 299 ldd [%o0 + 0x20], %f8 300 ldd [%o0 + 0x28], %f10 301 ldd [%o0 + 0x30], %f12 302 ldd [%o0 + 0x38], %f14 303 ldd [%o0 + 0x40], %f16 304 ldd [%o0 + 0x48], %f18 305 ldd [%o0 + 0x50], %f20 306 ldd [%o0 + 0x58], %f22 307 ldd [%o0 + 0x60], %f24 308 ldd [%o0 + 0x68], %f26 309 ldd [%o0 + 0x70], %f28 310 ldd [%o0 + 0x78], %f30 311 ldd [%o0 + 0x80], %f32 312 ldd [%o0 + 0x88], %f34 313 ldd [%o0 + 0x90], %f36 314 ldd [%o0 + 0x98], %f38 315 ldd [%o0 + 0xa0], %f40 316 ldd [%o0 + 0xa8], %f42 317 ldd [%o0 + 0xb0], %f44 318 ldd [%o0 + 0xb8], %f46 319 ldd [%o0 + 0xc0], %f48 320 ldd [%o0 + 0xc8], %f50 321 ldd [%o0 + 0xd0], %f52 322 ldd [%o0 + 0xd8], %f54 323 ldd [%o0 + 0xe0], %f56 324 retl 325 ldd [%o0 + 0xe8], %f58 326ENDPROC(des3_ede_sparc64_load_keys) 327 328#define DES3_LOOP_BODY(X) \ 329 DES_IP(X, X) \ 330 DES_ROUND(0, 2, X, X) \ 331 DES_ROUND(4, 6, X, X) \ 332 DES_ROUND(8, 10, X, X) \ 333 DES_ROUND(12, 14, X, X) \ 334 DES_ROUND(16, 18, X, X) \ 335 ldd [%o0 + 0xf0], %f16; \ 336 ldd [%o0 + 0xf8], %f18; \ 337 DES_ROUND(20, 22, X, X) \ 338 ldd [%o0 + 0x100], %f20; \ 339 ldd [%o0 + 0x108], %f22; \ 340 DES_ROUND(24, 26, X, X) \ 341 ldd [%o0 + 0x110], %f24; \ 342 ldd [%o0 + 0x118], %f26; \ 343 DES_ROUND(28, 30, X, X) \ 344 ldd [%o0 + 0x120], %f28; \ 345 ldd [%o0 + 0x128], %f30; \ 346 DES_IIP(X, X) \ 347 DES_IP(X, X) \ 348 DES_ROUND(32, 34, X, X) \ 349 ldd [%o0 + 0x130], %f0; \ 350 ldd [%o0 + 0x138], %f2; \ 351 DES_ROUND(36, 38, X, X) \ 352 ldd [%o0 + 0x140], %f4; \ 353 ldd [%o0 + 0x148], %f6; \ 354 DES_ROUND(40, 42, X, X) \ 355 ldd [%o0 + 0x150], %f8; \ 356 ldd [%o0 + 0x158], %f10; \ 357 DES_ROUND(44, 46, X, X) \ 358 ldd [%o0 + 0x160], %f12; \ 359 ldd [%o0 + 0x168], %f14; \ 360 DES_ROUND(48, 50, X, X) \ 361 DES_ROUND(52, 54, X, X) \ 362 DES_ROUND(56, 58, X, X) \ 363 DES_ROUND(16, 18, X, X) \ 364 ldd [%o0 + 0x170], %f16; \ 365 ldd [%o0 + 0x178], %f18; \ 366 DES_IIP(X, X) \ 367 DES_IP(X, X) \ 368 DES_ROUND(20, 22, X, X) \ 369 ldd [%o0 + 0x50], %f20; \ 370 ldd [%o0 + 0x58], %f22; \ 371 DES_ROUND(24, 26, X, X) \ 372 ldd [%o0 + 0x60], %f24; \ 373 ldd [%o0 + 0x68], %f26; \ 374 DES_ROUND(28, 30, X, X) \ 375 ldd [%o0 + 0x70], %f28; \ 376 ldd [%o0 + 0x78], %f30; \ 377 DES_ROUND(0, 2, X, X) \ 378 ldd [%o0 + 0x00], %f0; \ 379 ldd [%o0 + 0x08], %f2; \ 380 DES_ROUND(4, 6, X, X) \ 381 ldd [%o0 + 0x10], %f4; \ 382 ldd [%o0 + 0x18], %f6; \ 383 DES_ROUND(8, 10, X, X) \ 384 ldd [%o0 + 0x20], %f8; \ 385 ldd [%o0 + 0x28], %f10; \ 386 DES_ROUND(12, 14, X, X) \ 387 ldd [%o0 + 0x30], %f12; \ 388 ldd [%o0 + 0x38], %f14; \ 389 DES_ROUND(16, 18, X, X) \ 390 ldd [%o0 + 0x40], %f16; \ 391 ldd [%o0 + 0x48], %f18; \ 392 DES_IIP(X, X) 393 394 .align 32 395ENTRY(des3_ede_sparc64_ecb_crypt) 396 /* %o0=key, %o1=input, %o2=output, %o3=len */ 3971: ldd [%o1 + 0x00], %f60 398 DES3_LOOP_BODY(60) 399 std %f60, [%o2 + 0x00] 400 subcc %o3, 0x08, %o3 401 bne,pt %icc, 1b 402 add %o2, 0x08, %o2 403 retl 404 nop 405ENDPROC(des3_ede_sparc64_ecb_crypt) 406 407 .align 32 408ENTRY(des3_ede_sparc64_cbc_encrypt) 409 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */ 410 ldd [%o4 + 0x00], %f60 4111: ldd [%o1 + 0x00], %f62 412 fxor %f60, %f62, %f60 413 DES3_LOOP_BODY(60) 414 std %f60, [%o2 + 0x00] 415 add %o1, 0x08, %o1 416 subcc %o3, 0x08, %o3 417 bne,pt %icc, 1b 418 add %o2, 0x08, %o2 419 retl 420 std %f60, [%o4 + 0x00] 421ENDPROC(des3_ede_sparc64_cbc_encrypt) 422 423 .align 32 424ENTRY(des3_ede_sparc64_cbc_decrypt) 425 /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */ 426 ldd [%o4 + 0x00], %f62 4271: ldx [%o1 + 0x00], %g1 428 MOVXTOD_G1_F60 429 DES3_LOOP_BODY(60) 430 fxor %f62, %f60, %f60 431 MOVXTOD_G1_F62 432 std %f60, [%o2 + 0x00] 433 add %o1, 0x08, %o1 434 subcc %o3, 0x08, %o3 435 bne,pt %icc, 1b 436 add %o2, 0x08, %o2 437 retl 438 stx %g1, [%o4 + 0x00] 439ENDPROC(des3_ede_sparc64_cbc_decrypt) 440