Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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     /* %o0=input_key, %o1=output_key */
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     /* %o0=key, %o1=input, %o2=output */
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     /* %o0=key */
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     /* %o0=input, %o1=output, %o2=len */
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     /* %o0=input, %o1=output, %o2=len, %o3=IV */
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     /* %o0=input, %o1=output, %o2=len, %o3=IV */
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     /* %o0=key, %o1=input, %o2=output */
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     /* %o0=key */
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     /* %o0=key, %o1=input, %o2=output, %o3=len */
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     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
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     /* %o0=key, %o1=input, %o2=output, %o3=len, %o4=IV */
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)