1 1.1 christos #include "arm_arch.h" 2 1.1 christos 3 1.1.1.2 christos #if __ARM_MAX_ARCH__>=7 4 1.1 christos .text 5 1.1 christos .fpu neon 6 1.1 christos .code 32 7 1.1.1.2 christos #undef __thumb2__ 8 1.1.1.2 christos .globl gcm_init_v8 9 1.1 christos .type gcm_init_v8,%function 10 1.1 christos .align 4 11 1.1 christos gcm_init_v8: 12 1.1.1.2 christos vld1.64 {q9},[r1] @ load input H 13 1.1.1.2 christos vmov.i8 q11,#0xe1 14 1.1 christos vshl.i64 q11,q11,#57 @ 0xc2.0 15 1.1.1.2 christos vext.8 q3,q9,q9,#8 16 1.1 christos vshr.u64 q10,q11,#63 17 1.1 christos vdup.32 q9,d18[1] 18 1.1.1.2 christos vext.8 q8,q10,q11,#8 @ t0=0xc2....01 19 1.1 christos vshr.u64 q10,q3,#63 20 1.1 christos vshr.s32 q9,q9,#31 @ broadcast carry bit 21 1.1.1.2 christos vand q10,q10,q8 22 1.1 christos vshl.i64 q3,q3,#1 23 1.1.1.2 christos vext.8 q10,q10,q10,#8 24 1.1.1.2 christos vand q8,q8,q9 25 1.1.1.2 christos vorr q3,q3,q10 @ H<<<=1 26 1.1.1.2 christos veor q12,q3,q8 @ twisted H 27 1.1.1.2 christos vst1.64 {q12},[r0]! @ store Htable[0] 28 1.1 christos 29 1.1 christos @ calculate H^2 30 1.1.1.2 christos vext.8 q8,q12,q12,#8 @ Karatsuba pre-processing 31 1.1.1.2 christos .byte 0xa8,0x0e,0xa8,0xf2 @ pmull q0,q12,q12 32 1.1.1.2 christos veor q8,q8,q12 33 1.1.1.2 christos .byte 0xa9,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q12 34 1.1.1.2 christos .byte 0xa0,0x2e,0xa0,0xf2 @ pmull q1,q8,q8 35 1.1.1.2 christos 36 1.1.1.2 christos vext.8 q9,q0,q2,#8 @ Karatsuba post-processing 37 1.1.1.2 christos veor q10,q0,q2 38 1.1.1.2 christos veor q1,q1,q9 39 1.1.1.2 christos veor q1,q1,q10 40 1.1.1.2 christos .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase 41 1.1.1.2 christos 42 1.1.1.2 christos vmov d4,d3 @ Xh|Xm - 256-bit result 43 1.1.1.2 christos vmov d3,d0 @ Xm is rotated Xl 44 1.1.1.2 christos veor q0,q1,q10 45 1.1.1.2 christos 46 1.1.1.2 christos vext.8 q10,q0,q0,#8 @ 2nd phase 47 1.1.1.2 christos .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 48 1.1.1.2 christos veor q10,q10,q2 49 1.1.1.2 christos veor q14,q0,q10 50 1.1.1.2 christos 51 1.1.1.2 christos vext.8 q9,q14,q14,#8 @ Karatsuba pre-processing 52 1.1.1.2 christos veor q9,q9,q14 53 1.1.1.2 christos vext.8 q13,q8,q9,#8 @ pack Karatsuba pre-processed 54 1.1.1.2 christos vst1.64 {q13,q14},[r0]! @ store Htable[1..2] 55 1.1 christos bx lr 56 1.1 christos .size gcm_init_v8,.-gcm_init_v8 57 1.1.1.2 christos .globl gcm_gmult_v8 58 1.1 christos .type gcm_gmult_v8,%function 59 1.1 christos .align 4 60 1.1 christos gcm_gmult_v8: 61 1.1.1.2 christos vld1.64 {q9},[r0] @ load Xi 62 1.1.1.2 christos vmov.i8 q11,#0xe1 63 1.1.1.2 christos vld1.64 {q12,q13},[r1] @ load twisted H, ... 64 1.1 christos vshl.u64 q11,q11,#57 65 1.1 christos #ifndef __ARMEB__ 66 1.1 christos vrev64.8 q9,q9 67 1.1 christos #endif 68 1.1.1.2 christos vext.8 q3,q9,q9,#8 69 1.1 christos 70 1.1.1.2 christos .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.loXi.lo 71 1.1.1.2 christos veor q9,q9,q3 @ Karatsuba pre-processing 72 1.1.1.2 christos .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hiXi.hi 73 1.1.1.2 christos .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)(Xi.lo+Xi.hi) 74 1.1.1.2 christos 75 1.1.1.2 christos vext.8 q9,q0,q2,#8 @ Karatsuba post-processing 76 1.1.1.2 christos veor q10,q0,q2 77 1.1.1.2 christos veor q1,q1,q9 78 1.1.1.2 christos veor q1,q1,q10 79 1.1.1.2 christos .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction 80 1.1.1.2 christos 81 1.1.1.2 christos vmov d4,d3 @ Xh|Xm - 256-bit result 82 1.1.1.2 christos vmov d3,d0 @ Xm is rotated Xl 83 1.1.1.2 christos veor q0,q1,q10 84 1.1.1.2 christos 85 1.1.1.2 christos vext.8 q10,q0,q0,#8 @ 2nd phase of reduction 86 1.1.1.2 christos .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 87 1.1.1.2 christos veor q10,q10,q2 88 1.1.1.2 christos veor q0,q0,q10 89 1.1 christos 90 1.1 christos #ifndef __ARMEB__ 91 1.1 christos vrev64.8 q0,q0 92 1.1 christos #endif 93 1.1.1.2 christos vext.8 q0,q0,q0,#8 94 1.1.1.2 christos vst1.64 {q0},[r0] @ write out Xi 95 1.1 christos 96 1.1 christos bx lr 97 1.1 christos .size gcm_gmult_v8,.-gcm_gmult_v8 98 1.1.1.2 christos .globl gcm_ghash_v8 99 1.1 christos .type gcm_ghash_v8,%function 100 1.1 christos .align 4 101 1.1 christos gcm_ghash_v8: 102 1.1.1.2 christos vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so 103 1.1.1.2 christos vld1.64 {q0},[r0] @ load [rotated] Xi 104 1.1 christos @ "[rotated]" means that 105 1.1 christos @ loaded value would have 106 1.1 christos @ to be rotated in order to 107 1.1 christos @ make it appear as in 108 1.1.1.2 christos @ algorithm specification 109 1.1.1.2 christos subs r3,r3,#32 @ see if r3 is 32 or larger 110 1.1.1.2 christos mov r12,#16 @ r12 is used as post- 111 1.1 christos @ increment for input pointer; 112 1.1 christos @ as loop is modulo-scheduled 113 1.1 christos @ r12 is zeroed just in time 114 1.1.1.2 christos @ to preclude overstepping 115 1.1 christos @ inp[len], which means that 116 1.1 christos @ last block[s] are actually 117 1.1 christos @ loaded twice, but last 118 1.1 christos @ copy is not processed 119 1.1.1.2 christos vld1.64 {q12,q13},[r1]! @ load twisted H, ..., H^2 120 1.1.1.2 christos vmov.i8 q11,#0xe1 121 1.1.1.2 christos vld1.64 {q14},[r1] 122 1.1 christos moveq r12,#0 @ is it time to zero r12? 123 1.1.1.2 christos vext.8 q0,q0,q0,#8 @ rotate Xi 124 1.1.1.2 christos vld1.64 {q8},[r2]! @ load [rotated] I[0] 125 1.1 christos vshl.u64 q11,q11,#57 @ compose 0xc2.0 constant 126 1.1 christos #ifndef __ARMEB__ 127 1.1 christos vrev64.8 q8,q8 128 1.1 christos vrev64.8 q0,q0 129 1.1 christos #endif 130 1.1.1.2 christos vext.8 q3,q8,q8,#8 @ rotate I[0] 131 1.1.1.2 christos blo .Lodd_tail_v8 @ r3 was less than 32 132 1.1.1.2 christos vld1.64 {q9},[r2],r12 @ load [rotated] I[1] 133 1.1 christos #ifndef __ARMEB__ 134 1.1 christos vrev64.8 q9,q9 135 1.1 christos #endif 136 1.1.1.2 christos vext.8 q7,q9,q9,#8 137 1.1.1.2 christos veor q3,q3,q0 @ I[i]^=Xi 138 1.1.1.2 christos .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ HIi+1 139 1.1.1.2 christos veor q9,q9,q7 @ Karatsuba pre-processing 140 1.1.1.2 christos .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 141 1.1.1.2 christos b .Loop_mod2x_v8 142 1.1 christos 143 1.1 christos .align 4 144 1.1 christos .Loop_mod2x_v8: 145 1.1.1.2 christos vext.8 q10,q3,q3,#8 146 1.1.1.2 christos subs r3,r3,#32 @ is there more data? 147 1.1.1.2 christos .byte 0x86,0x0e,0xac,0xf2 @ pmull q0,q14,q3 @ H^2.loXi.lo 148 1.1 christos movlo r12,#0 @ is it time to zero r12? 149 1.1 christos 150 1.1.1.2 christos .byte 0xa2,0xae,0xaa,0xf2 @ pmull q5,q13,q9 151 1.1.1.2 christos veor q10,q10,q3 @ Karatsuba pre-processing 152 1.1.1.2 christos .byte 0x87,0x4e,0xad,0xf2 @ pmull2 q2,q14,q3 @ H^2.hiXi.hi 153 1.1.1.2 christos veor q0,q0,q4 @ accumulate 154 1.1.1.2 christos .byte 0xa5,0x2e,0xab,0xf2 @ pmull2 q1,q13,q10 @ (H^2.lo+H^2.hi)(Xi.lo+Xi.hi) 155 1.1.1.2 christos vld1.64 {q8},[r2],r12 @ load [rotated] I[i+2] 156 1.1.1.2 christos 157 1.1.1.2 christos veor q2,q2,q6 158 1.1.1.2 christos moveq r12,#0 @ is it time to zero r12? 159 1.1.1.2 christos veor q1,q1,q5 160 1.1.1.2 christos 161 1.1.1.2 christos vext.8 q9,q0,q2,#8 @ Karatsuba post-processing 162 1.1.1.2 christos veor q10,q0,q2 163 1.1.1.2 christos veor q1,q1,q9 164 1.1.1.2 christos vld1.64 {q9},[r2],r12 @ load [rotated] I[i+3] 165 1.1.1.2 christos #ifndef __ARMEB__ 166 1.1.1.2 christos vrev64.8 q8,q8 167 1.1.1.2 christos #endif 168 1.1.1.2 christos veor q1,q1,q10 169 1.1.1.2 christos .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction 170 1.1.1.2 christos 171 1.1.1.2 christos #ifndef __ARMEB__ 172 1.1.1.2 christos vrev64.8 q9,q9 173 1.1.1.2 christos #endif 174 1.1.1.2 christos vmov d4,d3 @ Xh|Xm - 256-bit result 175 1.1.1.2 christos vmov d3,d0 @ Xm is rotated Xl 176 1.1.1.2 christos vext.8 q7,q9,q9,#8 177 1.1.1.2 christos vext.8 q3,q8,q8,#8 178 1.1.1.2 christos veor q0,q1,q10 179 1.1.1.2 christos .byte 0x8e,0x8e,0xa8,0xf2 @ pmull q4,q12,q7 @ HIi+1 180 1.1.1.2 christos veor q3,q3,q2 @ accumulate q3 early 181 1.1.1.2 christos 182 1.1.1.2 christos vext.8 q10,q0,q0,#8 @ 2nd phase of reduction 183 1.1.1.2 christos .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 184 1.1.1.2 christos veor q3,q3,q10 185 1.1.1.2 christos veor q9,q9,q7 @ Karatsuba pre-processing 186 1.1.1.2 christos veor q3,q3,q0 187 1.1.1.2 christos .byte 0x8f,0xce,0xa9,0xf2 @ pmull2 q6,q12,q7 188 1.1.1.2 christos bhs .Loop_mod2x_v8 @ there was at least 32 more bytes 189 1.1.1.2 christos 190 1.1.1.2 christos veor q2,q2,q10 191 1.1.1.2 christos vext.8 q3,q8,q8,#8 @ re-construct q3 192 1.1.1.2 christos adds r3,r3,#32 @ re-construct r3 193 1.1.1.2 christos veor q0,q0,q2 @ re-construct q0 194 1.1.1.2 christos beq .Ldone_v8 @ is r3 zero? 195 1.1 christos .Lodd_tail_v8: 196 1.1.1.2 christos vext.8 q10,q0,q0,#8 197 1.1.1.2 christos veor q3,q3,q0 @ inp^=Xi 198 1.1.1.2 christos veor q9,q8,q10 @ q9 is rotated inp^Xi 199 1.1.1.2 christos 200 1.1.1.2 christos .byte 0x86,0x0e,0xa8,0xf2 @ pmull q0,q12,q3 @ H.loXi.lo 201 1.1.1.2 christos veor q9,q9,q3 @ Karatsuba pre-processing 202 1.1.1.2 christos .byte 0x87,0x4e,0xa9,0xf2 @ pmull2 q2,q12,q3 @ H.hiXi.hi 203 1.1.1.2 christos .byte 0xa2,0x2e,0xaa,0xf2 @ pmull q1,q13,q9 @ (H.lo+H.hi)(Xi.lo+Xi.hi) 204 1.1.1.2 christos 205 1.1.1.2 christos vext.8 q9,q0,q2,#8 @ Karatsuba post-processing 206 1.1.1.2 christos veor q10,q0,q2 207 1.1.1.2 christos veor q1,q1,q9 208 1.1.1.2 christos veor q1,q1,q10 209 1.1.1.2 christos .byte 0x26,0x4e,0xe0,0xf2 @ pmull q10,q0,q11 @ 1st phase of reduction 210 1.1.1.2 christos 211 1.1.1.2 christos vmov d4,d3 @ Xh|Xm - 256-bit result 212 1.1.1.2 christos vmov d3,d0 @ Xm is rotated Xl 213 1.1.1.2 christos veor q0,q1,q10 214 1.1.1.2 christos 215 1.1.1.2 christos vext.8 q10,q0,q0,#8 @ 2nd phase of reduction 216 1.1.1.2 christos .byte 0x26,0x0e,0xa0,0xf2 @ pmull q0,q0,q11 217 1.1.1.2 christos veor q10,q10,q2 218 1.1.1.2 christos veor q0,q0,q10 219 1.1 christos 220 1.1 christos .Ldone_v8: 221 1.1 christos #ifndef __ARMEB__ 222 1.1 christos vrev64.8 q0,q0 223 1.1 christos #endif 224 1.1.1.2 christos vext.8 q0,q0,q0,#8 225 1.1.1.2 christos vst1.64 {q0},[r0] @ write out Xi 226 1.1 christos 227 1.1.1.2 christos vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ 32-bit ABI says so 228 1.1 christos bx lr 229 1.1 christos .size gcm_ghash_v8,.-gcm_ghash_v8 230 1.1.1.2 christos .byte 71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 231 1.1.1.2 christos .align 2 232 1.1.1.2 christos .align 2 233 1.1.1.2 christos #endif 234