root/arch/sparc/crypto/des_asm.S

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

/* [<][>][^][v][top][bottom][index][help] */