1323a6bf1SMichael Ellerman/* 2323a6bf1SMichael Ellerman * SHA-1 implementation for PowerPC. 3323a6bf1SMichael Ellerman * 4323a6bf1SMichael Ellerman * Copyright (C) 2005 Paul Mackerras <paulus@samba.org> 5323a6bf1SMichael Ellerman */ 6323a6bf1SMichael Ellerman 7323a6bf1SMichael Ellerman#include <asm/ppc_asm.h> 8323a6bf1SMichael Ellerman#include <asm/asm-offsets.h> 9323a6bf1SMichael Ellerman 10323a6bf1SMichael Ellerman/* 11323a6bf1SMichael Ellerman * We roll the registers for T, A, B, C, D, E around on each 12323a6bf1SMichael Ellerman * iteration; T on iteration t is A on iteration t+1, and so on. 13323a6bf1SMichael Ellerman * We use registers 7 - 12 for this. 14323a6bf1SMichael Ellerman */ 15323a6bf1SMichael Ellerman#define RT(t) ((((t)+5)%6)+7) 16323a6bf1SMichael Ellerman#define RA(t) ((((t)+4)%6)+7) 17323a6bf1SMichael Ellerman#define RB(t) ((((t)+3)%6)+7) 18323a6bf1SMichael Ellerman#define RC(t) ((((t)+2)%6)+7) 19323a6bf1SMichael Ellerman#define RD(t) ((((t)+1)%6)+7) 20323a6bf1SMichael Ellerman#define RE(t) ((((t)+0)%6)+7) 21323a6bf1SMichael Ellerman 22323a6bf1SMichael Ellerman/* We use registers 16 - 31 for the W values */ 23323a6bf1SMichael Ellerman#define W(t) (((t)%16)+16) 24323a6bf1SMichael Ellerman 25323a6bf1SMichael Ellerman#define LOADW(t) \ 26323a6bf1SMichael Ellerman lwz W(t),(t)*4(r4) 27323a6bf1SMichael Ellerman 28323a6bf1SMichael Ellerman#define STEPD0_LOAD(t) \ 29323a6bf1SMichael Ellerman andc r0,RD(t),RB(t); \ 30323a6bf1SMichael Ellerman and r6,RB(t),RC(t); \ 31323a6bf1SMichael Ellerman rotlwi RT(t),RA(t),5; \ 32323a6bf1SMichael Ellerman or r6,r6,r0; \ 33323a6bf1SMichael Ellerman add r0,RE(t),r15; \ 34323a6bf1SMichael Ellerman add RT(t),RT(t),r6; \ 35323a6bf1SMichael Ellerman add r14,r0,W(t); \ 36323a6bf1SMichael Ellerman lwz W((t)+4),((t)+4)*4(r4); \ 37323a6bf1SMichael Ellerman rotlwi RB(t),RB(t),30; \ 38323a6bf1SMichael Ellerman add RT(t),RT(t),r14 39323a6bf1SMichael Ellerman 40323a6bf1SMichael Ellerman#define STEPD0_UPDATE(t) \ 41323a6bf1SMichael Ellerman and r6,RB(t),RC(t); \ 42323a6bf1SMichael Ellerman andc r0,RD(t),RB(t); \ 43323a6bf1SMichael Ellerman rotlwi RT(t),RA(t),5; \ 44323a6bf1SMichael Ellerman rotlwi RB(t),RB(t),30; \ 45323a6bf1SMichael Ellerman or r6,r6,r0; \ 46323a6bf1SMichael Ellerman add r0,RE(t),r15; \ 47323a6bf1SMichael Ellerman xor r5,W((t)+4-3),W((t)+4-8); \ 48323a6bf1SMichael Ellerman add RT(t),RT(t),r6; \ 49323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 50323a6bf1SMichael Ellerman add r0,r0,W(t); \ 51323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4),r5; \ 52323a6bf1SMichael Ellerman add RT(t),RT(t),r0; \ 53323a6bf1SMichael Ellerman rotlwi W((t)+4),W((t)+4),1 54323a6bf1SMichael Ellerman 55323a6bf1SMichael Ellerman#define STEPD1(t) \ 56323a6bf1SMichael Ellerman xor r6,RB(t),RC(t); \ 57323a6bf1SMichael Ellerman rotlwi RT(t),RA(t),5; \ 58323a6bf1SMichael Ellerman rotlwi RB(t),RB(t),30; \ 59323a6bf1SMichael Ellerman xor r6,r6,RD(t); \ 60323a6bf1SMichael Ellerman add r0,RE(t),r15; \ 61323a6bf1SMichael Ellerman add RT(t),RT(t),r6; \ 62323a6bf1SMichael Ellerman add r0,r0,W(t); \ 63323a6bf1SMichael Ellerman add RT(t),RT(t),r0 64323a6bf1SMichael Ellerman 65323a6bf1SMichael Ellerman#define STEPD1_UPDATE(t) \ 66323a6bf1SMichael Ellerman xor r6,RB(t),RC(t); \ 67323a6bf1SMichael Ellerman rotlwi RT(t),RA(t),5; \ 68323a6bf1SMichael Ellerman rotlwi RB(t),RB(t),30; \ 69323a6bf1SMichael Ellerman xor r6,r6,RD(t); \ 70323a6bf1SMichael Ellerman add r0,RE(t),r15; \ 71323a6bf1SMichael Ellerman xor r5,W((t)+4-3),W((t)+4-8); \ 72323a6bf1SMichael Ellerman add RT(t),RT(t),r6; \ 73323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 74323a6bf1SMichael Ellerman add r0,r0,W(t); \ 75323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4),r5; \ 76323a6bf1SMichael Ellerman add RT(t),RT(t),r0; \ 77323a6bf1SMichael Ellerman rotlwi W((t)+4),W((t)+4),1 78323a6bf1SMichael Ellerman 79323a6bf1SMichael Ellerman#define STEPD2_UPDATE(t) \ 80323a6bf1SMichael Ellerman and r6,RB(t),RC(t); \ 81323a6bf1SMichael Ellerman and r0,RB(t),RD(t); \ 82323a6bf1SMichael Ellerman rotlwi RT(t),RA(t),5; \ 83323a6bf1SMichael Ellerman or r6,r6,r0; \ 84323a6bf1SMichael Ellerman rotlwi RB(t),RB(t),30; \ 85323a6bf1SMichael Ellerman and r0,RC(t),RD(t); \ 86323a6bf1SMichael Ellerman xor r5,W((t)+4-3),W((t)+4-8); \ 87323a6bf1SMichael Ellerman or r6,r6,r0; \ 88323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4-16),W((t)+4-14); \ 89323a6bf1SMichael Ellerman add r0,RE(t),r15; \ 90323a6bf1SMichael Ellerman add RT(t),RT(t),r6; \ 91323a6bf1SMichael Ellerman add r0,r0,W(t); \ 92323a6bf1SMichael Ellerman xor W((t)+4),W((t)+4),r5; \ 93323a6bf1SMichael Ellerman add RT(t),RT(t),r0; \ 94323a6bf1SMichael Ellerman rotlwi W((t)+4),W((t)+4),1 95323a6bf1SMichael Ellerman 96323a6bf1SMichael Ellerman#define STEP0LD4(t) \ 97323a6bf1SMichael Ellerman STEPD0_LOAD(t); \ 98323a6bf1SMichael Ellerman STEPD0_LOAD((t)+1); \ 99323a6bf1SMichael Ellerman STEPD0_LOAD((t)+2); \ 100323a6bf1SMichael Ellerman STEPD0_LOAD((t)+3) 101323a6bf1SMichael Ellerman 102323a6bf1SMichael Ellerman#define STEPUP4(t, fn) \ 103323a6bf1SMichael Ellerman STEP##fn##_UPDATE(t); \ 104323a6bf1SMichael Ellerman STEP##fn##_UPDATE((t)+1); \ 105323a6bf1SMichael Ellerman STEP##fn##_UPDATE((t)+2); \ 106323a6bf1SMichael Ellerman STEP##fn##_UPDATE((t)+3) 107323a6bf1SMichael Ellerman 108323a6bf1SMichael Ellerman#define STEPUP20(t, fn) \ 109323a6bf1SMichael Ellerman STEPUP4(t, fn); \ 110323a6bf1SMichael Ellerman STEPUP4((t)+4, fn); \ 111323a6bf1SMichael Ellerman STEPUP4((t)+8, fn); \ 112323a6bf1SMichael Ellerman STEPUP4((t)+12, fn); \ 113323a6bf1SMichael Ellerman STEPUP4((t)+16, fn) 114323a6bf1SMichael Ellerman 115323a6bf1SMichael Ellerman_GLOBAL(powerpc_sha_transform) 116*27777890STony Breeds PPC_STLU r1,-INT_FRAME_SIZE(r1) 117323a6bf1SMichael Ellerman SAVE_8GPRS(14, r1) 118323a6bf1SMichael Ellerman SAVE_10GPRS(22, r1) 119323a6bf1SMichael Ellerman 120323a6bf1SMichael Ellerman /* Load up A - E */ 121323a6bf1SMichael Ellerman lwz RA(0),0(r3) /* A */ 122323a6bf1SMichael Ellerman lwz RB(0),4(r3) /* B */ 123323a6bf1SMichael Ellerman lwz RC(0),8(r3) /* C */ 124323a6bf1SMichael Ellerman lwz RD(0),12(r3) /* D */ 125323a6bf1SMichael Ellerman lwz RE(0),16(r3) /* E */ 126323a6bf1SMichael Ellerman 127323a6bf1SMichael Ellerman LOADW(0) 128323a6bf1SMichael Ellerman LOADW(1) 129323a6bf1SMichael Ellerman LOADW(2) 130323a6bf1SMichael Ellerman LOADW(3) 131323a6bf1SMichael Ellerman 132323a6bf1SMichael Ellerman lis r15,0x5a82 /* K0-19 */ 133323a6bf1SMichael Ellerman ori r15,r15,0x7999 134323a6bf1SMichael Ellerman STEP0LD4(0) 135323a6bf1SMichael Ellerman STEP0LD4(4) 136323a6bf1SMichael Ellerman STEP0LD4(8) 137323a6bf1SMichael Ellerman STEPUP4(12, D0) 138323a6bf1SMichael Ellerman STEPUP4(16, D0) 139323a6bf1SMichael Ellerman 140323a6bf1SMichael Ellerman lis r15,0x6ed9 /* K20-39 */ 141323a6bf1SMichael Ellerman ori r15,r15,0xeba1 142323a6bf1SMichael Ellerman STEPUP20(20, D1) 143323a6bf1SMichael Ellerman 144323a6bf1SMichael Ellerman lis r15,0x8f1b /* K40-59 */ 145323a6bf1SMichael Ellerman ori r15,r15,0xbcdc 146323a6bf1SMichael Ellerman STEPUP20(40, D2) 147323a6bf1SMichael Ellerman 148323a6bf1SMichael Ellerman lis r15,0xca62 /* K60-79 */ 149323a6bf1SMichael Ellerman ori r15,r15,0xc1d6 150323a6bf1SMichael Ellerman STEPUP4(60, D1) 151323a6bf1SMichael Ellerman STEPUP4(64, D1) 152323a6bf1SMichael Ellerman STEPUP4(68, D1) 153323a6bf1SMichael Ellerman STEPUP4(72, D1) 154323a6bf1SMichael Ellerman lwz r20,16(r3) 155323a6bf1SMichael Ellerman STEPD1(76) 156323a6bf1SMichael Ellerman lwz r19,12(r3) 157323a6bf1SMichael Ellerman STEPD1(77) 158323a6bf1SMichael Ellerman lwz r18,8(r3) 159323a6bf1SMichael Ellerman STEPD1(78) 160323a6bf1SMichael Ellerman lwz r17,4(r3) 161323a6bf1SMichael Ellerman STEPD1(79) 162323a6bf1SMichael Ellerman 163323a6bf1SMichael Ellerman lwz r16,0(r3) 164323a6bf1SMichael Ellerman add r20,RE(80),r20 165323a6bf1SMichael Ellerman add RD(0),RD(80),r19 166323a6bf1SMichael Ellerman add RC(0),RC(80),r18 167323a6bf1SMichael Ellerman add RB(0),RB(80),r17 168323a6bf1SMichael Ellerman add RA(0),RA(80),r16 169323a6bf1SMichael Ellerman mr RE(0),r20 170323a6bf1SMichael Ellerman stw RA(0),0(r3) 171323a6bf1SMichael Ellerman stw RB(0),4(r3) 172323a6bf1SMichael Ellerman stw RC(0),8(r3) 173323a6bf1SMichael Ellerman stw RD(0),12(r3) 174323a6bf1SMichael Ellerman stw RE(0),16(r3) 175323a6bf1SMichael Ellerman 176323a6bf1SMichael Ellerman REST_8GPRS(14, r1) 177323a6bf1SMichael Ellerman REST_10GPRS(22, r1) 178*27777890STony Breeds addi r1,r1,INT_FRAME_SIZE 179323a6bf1SMichael Ellerman blr 180