Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * SHA-1 implementation for PowerPC.
0004  *
0005  * Copyright (C) 2005 Paul Mackerras <paulus@samba.org>
0006  */
0007 
0008 #include <asm/ppc_asm.h>
0009 #include <asm/asm-offsets.h>
0010 #include <asm/asm-compat.h>
0011 
0012 #ifdef __BIG_ENDIAN__
0013 #define LWZ(rt, d, ra)  \
0014     lwz rt,d(ra)
0015 #else
0016 #define LWZ(rt, d, ra)  \
0017     li  rt,d;   \
0018     lwbrx   rt,rt,ra
0019 #endif
0020 
0021 /*
0022  * We roll the registers for T, A, B, C, D, E around on each
0023  * iteration; T on iteration t is A on iteration t+1, and so on.
0024  * We use registers 7 - 12 for this.
0025  */
0026 #define RT(t)   ((((t)+5)%6)+7)
0027 #define RA(t)   ((((t)+4)%6)+7)
0028 #define RB(t)   ((((t)+3)%6)+7)
0029 #define RC(t)   ((((t)+2)%6)+7)
0030 #define RD(t)   ((((t)+1)%6)+7)
0031 #define RE(t)   ((((t)+0)%6)+7)
0032 
0033 /* We use registers 16 - 31 for the W values */
0034 #define W(t)    (((t)%16)+16)
0035 
0036 #define LOADW(t)                \
0037     LWZ(W(t),(t)*4,r4)
0038 
0039 #define STEPD0_LOAD(t)              \
0040     andc    r0,RD(t),RB(t);     \
0041     and r6,RB(t),RC(t);     \
0042     rotlwi  RT(t),RA(t),5;          \
0043     or  r6,r6,r0;           \
0044     add r0,RE(t),r15;           \
0045     add RT(t),RT(t),r6;     \
0046     add r14,r0,W(t);            \
0047     LWZ(W((t)+4),((t)+4)*4,r4); \
0048     rotlwi  RB(t),RB(t),30;         \
0049     add RT(t),RT(t),r14
0050 
0051 #define STEPD0_UPDATE(t)            \
0052     and r6,RB(t),RC(t);     \
0053     andc    r0,RD(t),RB(t);     \
0054     rotlwi  RT(t),RA(t),5;          \
0055     rotlwi  RB(t),RB(t),30;         \
0056     or  r6,r6,r0;           \
0057     add r0,RE(t),r15;           \
0058     xor r5,W((t)+4-3),W((t)+4-8);       \
0059     add RT(t),RT(t),r6;     \
0060     xor W((t)+4),W((t)+4-16),W((t)+4-14);   \
0061     add r0,r0,W(t);         \
0062     xor W((t)+4),W((t)+4),r5;           \
0063     add RT(t),RT(t),r0;     \
0064     rotlwi  W((t)+4),W((t)+4),1
0065 
0066 #define STEPD1(t)               \
0067     xor r6,RB(t),RC(t);     \
0068     rotlwi  RT(t),RA(t),5;          \
0069     rotlwi  RB(t),RB(t),30;         \
0070     xor r6,r6,RD(t);            \
0071     add r0,RE(t),r15;           \
0072     add RT(t),RT(t),r6;     \
0073     add r0,r0,W(t);         \
0074     add RT(t),RT(t),r0
0075 
0076 #define STEPD1_UPDATE(t)                \
0077     xor r6,RB(t),RC(t);     \
0078     rotlwi  RT(t),RA(t),5;          \
0079     rotlwi  RB(t),RB(t),30;         \
0080     xor r6,r6,RD(t);            \
0081     add r0,RE(t),r15;           \
0082     xor r5,W((t)+4-3),W((t)+4-8);       \
0083     add RT(t),RT(t),r6;     \
0084     xor W((t)+4),W((t)+4-16),W((t)+4-14);   \
0085     add r0,r0,W(t);         \
0086     xor W((t)+4),W((t)+4),r5;           \
0087     add RT(t),RT(t),r0;     \
0088     rotlwi  W((t)+4),W((t)+4),1
0089 
0090 #define STEPD2_UPDATE(t)            \
0091     and r6,RB(t),RC(t);     \
0092     and r0,RB(t),RD(t);     \
0093     rotlwi  RT(t),RA(t),5;          \
0094     or  r6,r6,r0;           \
0095     rotlwi  RB(t),RB(t),30;         \
0096     and r0,RC(t),RD(t);     \
0097     xor r5,W((t)+4-3),W((t)+4-8);   \
0098     or  r6,r6,r0;           \
0099     xor W((t)+4),W((t)+4-16),W((t)+4-14);   \
0100     add r0,RE(t),r15;           \
0101     add RT(t),RT(t),r6;     \
0102     add r0,r0,W(t);         \
0103     xor W((t)+4),W((t)+4),r5;       \
0104     add RT(t),RT(t),r0;     \
0105     rotlwi  W((t)+4),W((t)+4),1
0106 
0107 #define STEP0LD4(t)             \
0108     STEPD0_LOAD(t);             \
0109     STEPD0_LOAD((t)+1);         \
0110     STEPD0_LOAD((t)+2);         \
0111     STEPD0_LOAD((t)+3)
0112 
0113 #define STEPUP4(t, fn)              \
0114     STEP##fn##_UPDATE(t);           \
0115     STEP##fn##_UPDATE((t)+1);       \
0116     STEP##fn##_UPDATE((t)+2);       \
0117     STEP##fn##_UPDATE((t)+3)
0118 
0119 #define STEPUP20(t, fn)             \
0120     STEPUP4(t, fn);             \
0121     STEPUP4((t)+4, fn);         \
0122     STEPUP4((t)+8, fn);         \
0123     STEPUP4((t)+12, fn);            \
0124     STEPUP4((t)+16, fn)
0125 
0126 _GLOBAL(powerpc_sha_transform)
0127     PPC_STLU r1,-INT_FRAME_SIZE(r1)
0128     SAVE_GPRS(14, 31, r1)
0129 
0130     /* Load up A - E */
0131     lwz RA(0),0(r3) /* A */
0132     lwz RB(0),4(r3) /* B */
0133     lwz RC(0),8(r3) /* C */
0134     lwz RD(0),12(r3)    /* D */
0135     lwz RE(0),16(r3)    /* E */
0136 
0137     LOADW(0)
0138     LOADW(1)
0139     LOADW(2)
0140     LOADW(3)
0141 
0142     lis r15,0x5a82  /* K0-19 */
0143     ori r15,r15,0x7999
0144     STEP0LD4(0)
0145     STEP0LD4(4)
0146     STEP0LD4(8)
0147     STEPUP4(12, D0)
0148     STEPUP4(16, D0)
0149 
0150     lis r15,0x6ed9  /* K20-39 */
0151     ori r15,r15,0xeba1
0152     STEPUP20(20, D1)
0153 
0154     lis r15,0x8f1b  /* K40-59 */
0155     ori r15,r15,0xbcdc
0156     STEPUP20(40, D2)
0157 
0158     lis r15,0xca62  /* K60-79 */
0159     ori r15,r15,0xc1d6
0160     STEPUP4(60, D1)
0161     STEPUP4(64, D1)
0162     STEPUP4(68, D1)
0163     STEPUP4(72, D1)
0164     lwz r20,16(r3)
0165     STEPD1(76)
0166     lwz r19,12(r3)
0167     STEPD1(77)
0168     lwz r18,8(r3)
0169     STEPD1(78)
0170     lwz r17,4(r3)
0171     STEPD1(79)
0172 
0173     lwz r16,0(r3)
0174     add r20,RE(80),r20
0175     add RD(0),RD(80),r19
0176     add RC(0),RC(80),r18
0177     add RB(0),RB(80),r17
0178     add RA(0),RA(80),r16
0179     mr  RE(0),r20
0180     stw RA(0),0(r3)
0181     stw RB(0),4(r3)
0182     stw RC(0),8(r3)
0183     stw RD(0),12(r3)
0184     stw RE(0),16(r3)
0185 
0186     REST_GPRS(14, 31, r1)
0187     addi    r1,r1,INT_FRAME_SIZE
0188     blr