1/* 2 * SHA-1 implementation for PowerPC. 3 * 4 * Copyright (C) 2005 Paul Mackerras <paulus@samba.org> 5 */ 6 7#include <asm/ppc_asm.h> 8#include <asm/asm-offsets.h> 9 10#ifdef __BIG_ENDIAN__ 11#define LWZ(rt, d, ra) \ 12 lwz rt,d(ra) 13#else 14#define LWZ(rt, d, ra) \ 15 li rt,d; \ 16 lwbrx rt,rt,ra 17#endif 18 19/* 20 * We roll the registers for T, A, B, C, D, E around on each 21 * iteration; T on iteration t is A on iteration t+1, and so on. 22 * We use registers 7 - 12 for this. 23 */ 24#define RT(t) ((((t)+5)%6)+7) 25#define RA(t) ((((t)+4)%6)+7) 26#define RB(t) ((((t)+3)%6)+7) 27#define RC(t) ((((t)+2)%6)+7) 28#define RD(t) ((((t)+1)%6)+7) 29#define RE(t) ((((t)+0)%6)+7) 30 31/* We use registers 16 - 31 for the W values */ 32#define W(t) (((t)%16)+16) 33 34#define LOADW(t) \ 35 LWZ(W(t),(t)*4,r4) 36 37#define STEPD0_LOAD(t) \ 38 andc r0,RD(t),RB(t); \ 39 and r6,RB(t),RC(t); \ 40 rotlwi RT(t),RA(t),5; \ 41 or r6,r6,r0; \ 42 add r0,RE(t),r15; \ 43 add RT(t),RT(t),r6; \ 44 add r14,r0,W(t); \ 45 LWZ(W((t)+4),((t)+4)*4,r4); \ 46 rotlwi RB(t),RB(t),30; \ 47 add RT(t),RT(t),r14 48 49#define STEPD0_UPDATE(t) \ 50 and r6,RB(t),RC(t); \ 51 andc r0,RD(t),RB(t); \ 52 rotlwi RT(t),RA(t),5; \ 53 rotlwi RB(t),RB(t),30; \ 54 or r6,r6,r0; \ 55 add r0,RE(t),r15; \ 56 xor r5,W((t)+4-3),W((t)+4-8); \ 57 add RT(t),RT(t),r6; \ 58 xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 59 add r0,r0,W(t); \ 60 xor W((t)+4),W((t)+4),r5; \ 61 add RT(t),RT(t),r0; \ 62 rotlwi W((t)+4),W((t)+4),1 63 64#define STEPD1(t) \ 65 xor r6,RB(t),RC(t); \ 66 rotlwi RT(t),RA(t),5; \ 67 rotlwi RB(t),RB(t),30; \ 68 xor r6,r6,RD(t); \ 69 add r0,RE(t),r15; \ 70 add RT(t),RT(t),r6; \ 71 add r0,r0,W(t); \ 72 add RT(t),RT(t),r0 73 74#define STEPD1_UPDATE(t) \ 75 xor r6,RB(t),RC(t); \ 76 rotlwi RT(t),RA(t),5; \ 77 rotlwi RB(t),RB(t),30; \ 78 xor r6,r6,RD(t); \ 79 add r0,RE(t),r15; \ 80 xor r5,W((t)+4-3),W((t)+4-8); \ 81 add RT(t),RT(t),r6; \ 82 xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 83 add r0,r0,W(t); \ 84 xor W((t)+4),W((t)+4),r5; \ 85 add RT(t),RT(t),r0; \ 86 rotlwi W((t)+4),W((t)+4),1 87 88#define STEPD2_UPDATE(t) \ 89 and r6,RB(t),RC(t); \ 90 and r0,RB(t),RD(t); \ 91 rotlwi RT(t),RA(t),5; \ 92 or r6,r6,r0; \ 93 rotlwi RB(t),RB(t),30; \ 94 and r0,RC(t),RD(t); \ 95 xor r5,W((t)+4-3),W((t)+4-8); \ 96 or r6,r6,r0; \ 97 xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 98 add r0,RE(t),r15; \ 99 add RT(t),RT(t),r6; \ 100 add r0,r0,W(t); \ 101 xor W((t)+4),W((t)+4),r5; \ 102 add RT(t),RT(t),r0; \ 103 rotlwi W((t)+4),W((t)+4),1 104 105#define STEP0LD4(t) \ 106 STEPD0_LOAD(t); \ 107 STEPD0_LOAD((t)+1); \ 108 STEPD0_LOAD((t)+2); \ 109 STEPD0_LOAD((t)+3) 110 111#define STEPUP4(t, fn) \ 112 STEP##fn##_UPDATE(t); \ 113 STEP##fn##_UPDATE((t)+1); \ 114 STEP##fn##_UPDATE((t)+2); \ 115 STEP##fn##_UPDATE((t)+3) 116 117#define STEPUP20(t, fn) \ 118 STEPUP4(t, fn); \ 119 STEPUP4((t)+4, fn); \ 120 STEPUP4((t)+8, fn); \ 121 STEPUP4((t)+12, fn); \ 122 STEPUP4((t)+16, fn) 123 124_GLOBAL(powerpc_sha_transform) 125 PPC_STLU r1,-INT_FRAME_SIZE(r1) 126 SAVE_8GPRS(14, r1) 127 SAVE_10GPRS(22, r1) 128 129 /* Load up A - E */ 130 lwz RA(0),0(r3) /* A */ 131 lwz RB(0),4(r3) /* B */ 132 lwz RC(0),8(r3) /* C */ 133 lwz RD(0),12(r3) /* D */ 134 lwz RE(0),16(r3) /* E */ 135 136 LOADW(0) 137 LOADW(1) 138 LOADW(2) 139 LOADW(3) 140 141 lis r15,0x5a82 /* K0-19 */ 142 ori r15,r15,0x7999 143 STEP0LD4(0) 144 STEP0LD4(4) 145 STEP0LD4(8) 146 STEPUP4(12, D0) 147 STEPUP4(16, D0) 148 149 lis r15,0x6ed9 /* K20-39 */ 150 ori r15,r15,0xeba1 151 STEPUP20(20, D1) 152 153 lis r15,0x8f1b /* K40-59 */ 154 ori r15,r15,0xbcdc 155 STEPUP20(40, D2) 156 157 lis r15,0xca62 /* K60-79 */ 158 ori r15,r15,0xc1d6 159 STEPUP4(60, D1) 160 STEPUP4(64, D1) 161 STEPUP4(68, D1) 162 STEPUP4(72, D1) 163 lwz r20,16(r3) 164 STEPD1(76) 165 lwz r19,12(r3) 166 STEPD1(77) 167 lwz r18,8(r3) 168 STEPD1(78) 169 lwz r17,4(r3) 170 STEPD1(79) 171 172 lwz r16,0(r3) 173 add r20,RE(80),r20 174 add RD(0),RD(80),r19 175 add RC(0),RC(80),r18 176 add RB(0),RB(80),r17 177 add RA(0),RA(80),r16 178 mr RE(0),r20 179 stw RA(0),0(r3) 180 stw RB(0),4(r3) 181 stw RC(0),8(r3) 182 stw RD(0),12(r3) 183 stw RE(0),16(r3) 184 185 REST_8GPRS(14, r1) 186 REST_10GPRS(22, r1) 187 addi r1,r1,INT_FRAME_SIZE 188 blr 189