0001
0002 #include <linux/linkage.h>
0003 #include <asm/visasm.h>
0004
0005 #include "opcodes.h"
0006
0007 .align 32
0008 ENTRY(des_sparc64_key_expand)
0009
0010 VISEntryHalf
0011 ld [%o0 + 0x00], %f0
0012 ld [%o0 + 0x04], %f1
0013 DES_KEXPAND(0, 0, 0)
0014 DES_KEXPAND(0, 1, 2)
0015 DES_KEXPAND(2, 3, 6)
0016 DES_KEXPAND(2, 2, 4)
0017 DES_KEXPAND(6, 3, 10)
0018 DES_KEXPAND(6, 2, 8)
0019 DES_KEXPAND(10, 3, 14)
0020 DES_KEXPAND(10, 2, 12)
0021 DES_KEXPAND(14, 1, 16)
0022 DES_KEXPAND(16, 3, 20)
0023 DES_KEXPAND(16, 2, 18)
0024 DES_KEXPAND(20, 3, 24)
0025 DES_KEXPAND(20, 2, 22)
0026 DES_KEXPAND(24, 3, 28)
0027 DES_KEXPAND(24, 2, 26)
0028 DES_KEXPAND(28, 1, 30)
0029 std %f0, [%o1 + 0x00]
0030 std %f2, [%o1 + 0x08]
0031 std %f4, [%o1 + 0x10]
0032 std %f6, [%o1 + 0x18]
0033 std %f8, [%o1 + 0x20]
0034 std %f10, [%o1 + 0x28]
0035 std %f12, [%o1 + 0x30]
0036 std %f14, [%o1 + 0x38]
0037 std %f16, [%o1 + 0x40]
0038 std %f18, [%o1 + 0x48]
0039 std %f20, [%o1 + 0x50]
0040 std %f22, [%o1 + 0x58]
0041 std %f24, [%o1 + 0x60]
0042 std %f26, [%o1 + 0x68]
0043 std %f28, [%o1 + 0x70]
0044 std %f30, [%o1 + 0x78]
0045 retl
0046 VISExitHalf
0047 ENDPROC(des_sparc64_key_expand)
0048
0049 .align 32
0050 ENTRY(des_sparc64_crypt)
0051
0052 VISEntry
0053 ldd [%o1 + 0x00], %f32
0054 ldd [%o0 + 0x00], %f0
0055 ldd [%o0 + 0x08], %f2
0056 ldd [%o0 + 0x10], %f4
0057 ldd [%o0 + 0x18], %f6
0058 ldd [%o0 + 0x20], %f8
0059 ldd [%o0 + 0x28], %f10
0060 ldd [%o0 + 0x30], %f12
0061 ldd [%o0 + 0x38], %f14
0062 ldd [%o0 + 0x40], %f16
0063 ldd [%o0 + 0x48], %f18
0064 ldd [%o0 + 0x50], %f20
0065 ldd [%o0 + 0x58], %f22
0066 ldd [%o0 + 0x60], %f24
0067 ldd [%o0 + 0x68], %f26
0068 ldd [%o0 + 0x70], %f28
0069 ldd [%o0 + 0x78], %f30
0070 DES_IP(32, 32)
0071 DES_ROUND(0, 2, 32, 32)
0072 DES_ROUND(4, 6, 32, 32)
0073 DES_ROUND(8, 10, 32, 32)
0074 DES_ROUND(12, 14, 32, 32)
0075 DES_ROUND(16, 18, 32, 32)
0076 DES_ROUND(20, 22, 32, 32)
0077 DES_ROUND(24, 26, 32, 32)
0078 DES_ROUND(28, 30, 32, 32)
0079 DES_IIP(32, 32)
0080 std %f32, [%o2 + 0x00]
0081 retl
0082 VISExit
0083 ENDPROC(des_sparc64_crypt)
0084
0085 .align 32
0086 ENTRY(des_sparc64_load_keys)
0087
0088 VISEntry
0089 ldd [%o0 + 0x00], %f0
0090 ldd [%o0 + 0x08], %f2
0091 ldd [%o0 + 0x10], %f4
0092 ldd [%o0 + 0x18], %f6
0093 ldd [%o0 + 0x20], %f8
0094 ldd [%o0 + 0x28], %f10
0095 ldd [%o0 + 0x30], %f12
0096 ldd [%o0 + 0x38], %f14
0097 ldd [%o0 + 0x40], %f16
0098 ldd [%o0 + 0x48], %f18
0099 ldd [%o0 + 0x50], %f20
0100 ldd [%o0 + 0x58], %f22
0101 ldd [%o0 + 0x60], %f24
0102 ldd [%o0 + 0x68], %f26
0103 ldd [%o0 + 0x70], %f28
0104 retl
0105 ldd [%o0 + 0x78], %f30
0106 ENDPROC(des_sparc64_load_keys)
0107
0108 .align 32
0109 ENTRY(des_sparc64_ecb_crypt)
0110
0111 1: ldd [%o0 + 0x00], %f32
0112 add %o0, 0x08, %o0
0113 DES_IP(32, 32)
0114 DES_ROUND(0, 2, 32, 32)
0115 DES_ROUND(4, 6, 32, 32)
0116 DES_ROUND(8, 10, 32, 32)
0117 DES_ROUND(12, 14, 32, 32)
0118 DES_ROUND(16, 18, 32, 32)
0119 DES_ROUND(20, 22, 32, 32)
0120 DES_ROUND(24, 26, 32, 32)
0121 DES_ROUND(28, 30, 32, 32)
0122 DES_IIP(32, 32)
0123 std %f32, [%o1 + 0x00]
0124 subcc %o2, 0x08, %o2
0125 bne,pt %icc, 1b
0126 add %o1, 0x08, %o1
0127 retl
0128 nop
0129 ENDPROC(des_sparc64_ecb_crypt)
0130
0131 .align 32
0132 ENTRY(des_sparc64_cbc_encrypt)
0133
0134 ldd [%o3 + 0x00], %f32
0135 1: ldd [%o0 + 0x00], %f34
0136 fxor %f32, %f34, %f32
0137 DES_IP(32, 32)
0138 DES_ROUND(0, 2, 32, 32)
0139 DES_ROUND(4, 6, 32, 32)
0140 DES_ROUND(8, 10, 32, 32)
0141 DES_ROUND(12, 14, 32, 32)
0142 DES_ROUND(16, 18, 32, 32)
0143 DES_ROUND(20, 22, 32, 32)
0144 DES_ROUND(24, 26, 32, 32)
0145 DES_ROUND(28, 30, 32, 32)
0146 DES_IIP(32, 32)
0147 std %f32, [%o1 + 0x00]
0148 add %o0, 0x08, %o0
0149 subcc %o2, 0x08, %o2
0150 bne,pt %icc, 1b
0151 add %o1, 0x08, %o1
0152 retl
0153 std %f32, [%o3 + 0x00]
0154 ENDPROC(des_sparc64_cbc_encrypt)
0155
0156 .align 32
0157 ENTRY(des_sparc64_cbc_decrypt)
0158
0159 ldd [%o3 + 0x00], %f34
0160 1: ldd [%o0 + 0x00], %f36
0161 DES_IP(36, 32)
0162 DES_ROUND(0, 2, 32, 32)
0163 DES_ROUND(4, 6, 32, 32)
0164 DES_ROUND(8, 10, 32, 32)
0165 DES_ROUND(12, 14, 32, 32)
0166 DES_ROUND(16, 18, 32, 32)
0167 DES_ROUND(20, 22, 32, 32)
0168 DES_ROUND(24, 26, 32, 32)
0169 DES_ROUND(28, 30, 32, 32)
0170 DES_IIP(32, 32)
0171 fxor %f32, %f34, %f32
0172 fsrc2 %f36, %f34
0173 std %f32, [%o1 + 0x00]
0174 add %o0, 0x08, %o0
0175 subcc %o2, 0x08, %o2
0176 bne,pt %icc, 1b
0177 add %o1, 0x08, %o1
0178 retl
0179 std %f36, [%o3 + 0x00]
0180 ENDPROC(des_sparc64_cbc_decrypt)
0181
0182 .align 32
0183 ENTRY(des3_ede_sparc64_crypt)
0184
0185 VISEntry
0186 ldd [%o1 + 0x00], %f32
0187 ldd [%o0 + 0x00], %f0
0188 ldd [%o0 + 0x08], %f2
0189 ldd [%o0 + 0x10], %f4
0190 ldd [%o0 + 0x18], %f6
0191 ldd [%o0 + 0x20], %f8
0192 ldd [%o0 + 0x28], %f10
0193 ldd [%o0 + 0x30], %f12
0194 ldd [%o0 + 0x38], %f14
0195 ldd [%o0 + 0x40], %f16
0196 ldd [%o0 + 0x48], %f18
0197 ldd [%o0 + 0x50], %f20
0198 ldd [%o0 + 0x58], %f22
0199 ldd [%o0 + 0x60], %f24
0200 ldd [%o0 + 0x68], %f26
0201 ldd [%o0 + 0x70], %f28
0202 ldd [%o0 + 0x78], %f30
0203 DES_IP(32, 32)
0204 DES_ROUND(0, 2, 32, 32)
0205 ldd [%o0 + 0x80], %f0
0206 ldd [%o0 + 0x88], %f2
0207 DES_ROUND(4, 6, 32, 32)
0208 ldd [%o0 + 0x90], %f4
0209 ldd [%o0 + 0x98], %f6
0210 DES_ROUND(8, 10, 32, 32)
0211 ldd [%o0 + 0xa0], %f8
0212 ldd [%o0 + 0xa8], %f10
0213 DES_ROUND(12, 14, 32, 32)
0214 ldd [%o0 + 0xb0], %f12
0215 ldd [%o0 + 0xb8], %f14
0216 DES_ROUND(16, 18, 32, 32)
0217 ldd [%o0 + 0xc0], %f16
0218 ldd [%o0 + 0xc8], %f18
0219 DES_ROUND(20, 22, 32, 32)
0220 ldd [%o0 + 0xd0], %f20
0221 ldd [%o0 + 0xd8], %f22
0222 DES_ROUND(24, 26, 32, 32)
0223 ldd [%o0 + 0xe0], %f24
0224 ldd [%o0 + 0xe8], %f26
0225 DES_ROUND(28, 30, 32, 32)
0226 ldd [%o0 + 0xf0], %f28
0227 ldd [%o0 + 0xf8], %f30
0228 DES_IIP(32, 32)
0229 DES_IP(32, 32)
0230 DES_ROUND(0, 2, 32, 32)
0231 ldd [%o0 + 0x100], %f0
0232 ldd [%o0 + 0x108], %f2
0233 DES_ROUND(4, 6, 32, 32)
0234 ldd [%o0 + 0x110], %f4
0235 ldd [%o0 + 0x118], %f6
0236 DES_ROUND(8, 10, 32, 32)
0237 ldd [%o0 + 0x120], %f8
0238 ldd [%o0 + 0x128], %f10
0239 DES_ROUND(12, 14, 32, 32)
0240 ldd [%o0 + 0x130], %f12
0241 ldd [%o0 + 0x138], %f14
0242 DES_ROUND(16, 18, 32, 32)
0243 ldd [%o0 + 0x140], %f16
0244 ldd [%o0 + 0x148], %f18
0245 DES_ROUND(20, 22, 32, 32)
0246 ldd [%o0 + 0x150], %f20
0247 ldd [%o0 + 0x158], %f22
0248 DES_ROUND(24, 26, 32, 32)
0249 ldd [%o0 + 0x160], %f24
0250 ldd [%o0 + 0x168], %f26
0251 DES_ROUND(28, 30, 32, 32)
0252 ldd [%o0 + 0x170], %f28
0253 ldd [%o0 + 0x178], %f30
0254 DES_IIP(32, 32)
0255 DES_IP(32, 32)
0256 DES_ROUND(0, 2, 32, 32)
0257 DES_ROUND(4, 6, 32, 32)
0258 DES_ROUND(8, 10, 32, 32)
0259 DES_ROUND(12, 14, 32, 32)
0260 DES_ROUND(16, 18, 32, 32)
0261 DES_ROUND(20, 22, 32, 32)
0262 DES_ROUND(24, 26, 32, 32)
0263 DES_ROUND(28, 30, 32, 32)
0264 DES_IIP(32, 32)
0265
0266 std %f32, [%o2 + 0x00]
0267 retl
0268 VISExit
0269 ENDPROC(des3_ede_sparc64_crypt)
0270
0271 .align 32
0272 ENTRY(des3_ede_sparc64_load_keys)
0273
0274 VISEntry
0275 ldd [%o0 + 0x00], %f0
0276 ldd [%o0 + 0x08], %f2
0277 ldd [%o0 + 0x10], %f4
0278 ldd [%o0 + 0x18], %f6
0279 ldd [%o0 + 0x20], %f8
0280 ldd [%o0 + 0x28], %f10
0281 ldd [%o0 + 0x30], %f12
0282 ldd [%o0 + 0x38], %f14
0283 ldd [%o0 + 0x40], %f16
0284 ldd [%o0 + 0x48], %f18
0285 ldd [%o0 + 0x50], %f20
0286 ldd [%o0 + 0x58], %f22
0287 ldd [%o0 + 0x60], %f24
0288 ldd [%o0 + 0x68], %f26
0289 ldd [%o0 + 0x70], %f28
0290 ldd [%o0 + 0x78], %f30
0291 ldd [%o0 + 0x80], %f32
0292 ldd [%o0 + 0x88], %f34
0293 ldd [%o0 + 0x90], %f36
0294 ldd [%o0 + 0x98], %f38
0295 ldd [%o0 + 0xa0], %f40
0296 ldd [%o0 + 0xa8], %f42
0297 ldd [%o0 + 0xb0], %f44
0298 ldd [%o0 + 0xb8], %f46
0299 ldd [%o0 + 0xc0], %f48
0300 ldd [%o0 + 0xc8], %f50
0301 ldd [%o0 + 0xd0], %f52
0302 ldd [%o0 + 0xd8], %f54
0303 ldd [%o0 + 0xe0], %f56
0304 retl
0305 ldd [%o0 + 0xe8], %f58
0306 ENDPROC(des3_ede_sparc64_load_keys)
0307
0308 #define DES3_LOOP_BODY(X) \
0309 DES_IP(X, X) \
0310 DES_ROUND(0, 2, X, X) \
0311 DES_ROUND(4, 6, X, X) \
0312 DES_ROUND(8, 10, X, X) \
0313 DES_ROUND(12, 14, X, X) \
0314 DES_ROUND(16, 18, X, X) \
0315 ldd [%o0 + 0xf0], %f16; \
0316 ldd [%o0 + 0xf8], %f18; \
0317 DES_ROUND(20, 22, X, X) \
0318 ldd [%o0 + 0x100], %f20; \
0319 ldd [%o0 + 0x108], %f22; \
0320 DES_ROUND(24, 26, X, X) \
0321 ldd [%o0 + 0x110], %f24; \
0322 ldd [%o0 + 0x118], %f26; \
0323 DES_ROUND(28, 30, X, X) \
0324 ldd [%o0 + 0x120], %f28; \
0325 ldd [%o0 + 0x128], %f30; \
0326 DES_IIP(X, X) \
0327 DES_IP(X, X) \
0328 DES_ROUND(32, 34, X, X) \
0329 ldd [%o0 + 0x130], %f0; \
0330 ldd [%o0 + 0x138], %f2; \
0331 DES_ROUND(36, 38, X, X) \
0332 ldd [%o0 + 0x140], %f4; \
0333 ldd [%o0 + 0x148], %f6; \
0334 DES_ROUND(40, 42, X, X) \
0335 ldd [%o0 + 0x150], %f8; \
0336 ldd [%o0 + 0x158], %f10; \
0337 DES_ROUND(44, 46, X, X) \
0338 ldd [%o0 + 0x160], %f12; \
0339 ldd [%o0 + 0x168], %f14; \
0340 DES_ROUND(48, 50, X, X) \
0341 DES_ROUND(52, 54, X, X) \
0342 DES_ROUND(56, 58, X, X) \
0343 DES_ROUND(16, 18, X, X) \
0344 ldd [%o0 + 0x170], %f16; \
0345 ldd [%o0 + 0x178], %f18; \
0346 DES_IIP(X, X) \
0347 DES_IP(X, X) \
0348 DES_ROUND(20, 22, X, X) \
0349 ldd [%o0 + 0x50], %f20; \
0350 ldd [%o0 + 0x58], %f22; \
0351 DES_ROUND(24, 26, X, X) \
0352 ldd [%o0 + 0x60], %f24; \
0353 ldd [%o0 + 0x68], %f26; \
0354 DES_ROUND(28, 30, X, X) \
0355 ldd [%o0 + 0x70], %f28; \
0356 ldd [%o0 + 0x78], %f30; \
0357 DES_ROUND(0, 2, X, X) \
0358 ldd [%o0 + 0x00], %f0; \
0359 ldd [%o0 + 0x08], %f2; \
0360 DES_ROUND(4, 6, X, X) \
0361 ldd [%o0 + 0x10], %f4; \
0362 ldd [%o0 + 0x18], %f6; \
0363 DES_ROUND(8, 10, X, X) \
0364 ldd [%o0 + 0x20], %f8; \
0365 ldd [%o0 + 0x28], %f10; \
0366 DES_ROUND(12, 14, X, X) \
0367 ldd [%o0 + 0x30], %f12; \
0368 ldd [%o0 + 0x38], %f14; \
0369 DES_ROUND(16, 18, X, X) \
0370 ldd [%o0 + 0x40], %f16; \
0371 ldd [%o0 + 0x48], %f18; \
0372 DES_IIP(X, X)
0373
0374 .align 32
0375 ENTRY(des3_ede_sparc64_ecb_crypt)
0376
0377 1: ldd [%o1 + 0x00], %f60
0378 DES3_LOOP_BODY(60)
0379 std %f60, [%o2 + 0x00]
0380 add %o1, 0x08, %o1
0381 subcc %o3, 0x08, %o3
0382 bne,pt %icc, 1b
0383 add %o2, 0x08, %o2
0384 retl
0385 nop
0386 ENDPROC(des3_ede_sparc64_ecb_crypt)
0387
0388 .align 32
0389 ENTRY(des3_ede_sparc64_cbc_encrypt)
0390
0391 ldd [%o4 + 0x00], %f60
0392 1: ldd [%o1 + 0x00], %f62
0393 fxor %f60, %f62, %f60
0394 DES3_LOOP_BODY(60)
0395 std %f60, [%o2 + 0x00]
0396 add %o1, 0x08, %o1
0397 subcc %o3, 0x08, %o3
0398 bne,pt %icc, 1b
0399 add %o2, 0x08, %o2
0400 retl
0401 std %f60, [%o4 + 0x00]
0402 ENDPROC(des3_ede_sparc64_cbc_encrypt)
0403
0404 .align 32
0405 ENTRY(des3_ede_sparc64_cbc_decrypt)
0406
0407 ldd [%o4 + 0x00], %f62
0408 1: ldx [%o1 + 0x00], %g1
0409 MOVXTOD_G1_F60
0410 DES3_LOOP_BODY(60)
0411 fxor %f62, %f60, %f60
0412 MOVXTOD_G1_F62
0413 std %f60, [%o2 + 0x00]
0414 add %o1, 0x08, %o1
0415 subcc %o3, 0x08, %o3
0416 bne,pt %icc, 1b
0417 add %o2, 0x08, %o2
0418 retl
0419 stx %g1, [%o4 + 0x00]
0420 ENDPROC(des3_ede_sparc64_cbc_decrypt)