1.text 2 3.type __KeccakF1600,@function 4.align 32 5__KeccakF1600: 6 stg %r14,8*14(%r15) 7 lg %r0,160(%r2) 8 lg %r1,168(%r2) 9 lg %r5,176(%r2) 10 lg %r6,184(%r2) 11 lg %r7,192(%r2) 12 larl %r4,iotas 13 j .Loop 14 15.align 16 16.Loop: 17 lg %r8,0(%r2) 18 lg %r9,48(%r2) 19 lg %r10,96(%r2) 20 lg %r11,144(%r2) 21 22 xgr %r0,%r8 23 xg %r1,8(%r2) 24 xg %r5,16(%r2) 25 xg %r6,24(%r2) 26 lgr %r12,%r7 27 xg %r7,32(%r2) 28 29 xg %r0,40(%r2) 30 xgr %r1,%r9 31 xg %r5,56(%r2) 32 xg %r6,64(%r2) 33 xg %r7,72(%r2) 34 35 xg %r0,80(%r2) 36 xg %r1,88(%r2) 37 xgr %r5,%r10 38 xg %r6,104(%r2) 39 xg %r7,112(%r2) 40 41 xg %r0,120(%r2) 42 xg %r1,128(%r2) 43 xg %r5,136(%r2) 44 xgr %r6,%r11 45 xg %r7,152(%r2) 46 47 lgr %r13,%r5 48 rllg %r5,%r5,1 49 xgr %r5,%r0 # D[1] = ROL64(C[2], 1) ^ C[0] 50 51 rllg %r0,%r0,1 52 xgr %r0,%r6 # D[4] = ROL64(C[0], 1) ^ C[3] 53 54 rllg %r6,%r6,1 55 xgr %r6,%r1 # D[2] = ROL64(C[3], 1) ^ C[1] 56 57 rllg %r1,%r1,1 58 xgr %r1,%r7 # D[0] = ROL64(C[1], 1) ^ C[4] 59 60 rllg %r7,%r7,1 61 xgr %r7,%r13 # D[3] = ROL64(C[4], 1) ^ C[2] 62 xgr %r9,%r5 63 xgr %r10,%r6 64 xgr %r11,%r7 65 rllg %r9,%r9,44 66 xgr %r12,%r0 67 rllg %r10,%r10,43 68 xgr %r8,%r1 69 70 lgr %r13,%r9 71 ogr %r9,%r10 72 rllg %r11,%r11,21 73 xgr %r9,%r8 # C[0] ^ ( C[1] | C[2]) 74 rllg %r12,%r12,14 75 xg %r9,0(%r4) 76 la %r4,8(%r4) 77 stg %r9,0(%r3) # R[0][0] = C[0] ^ ( C[1] | C[2]) ^ iotas[i] 78 79 lgr %r14,%r12 80 ngr %r12,%r11 81 lghi %r9,-1 # no 'not' instruction :-( 82 xgr %r12,%r10 # C[2] ^ ( C[4] & C[3]) 83 xgr %r10,%r9 # not %r10 84 stg %r12,16(%r3) # R[0][2] = C[2] ^ ( C[4] & C[3]) 85 ogr %r10,%r11 86 xgr %r10,%r13 # C[1] ^ (~C[2] | C[3]) 87 88 ngr %r13,%r8 89 stg %r10,8(%r3) # R[0][1] = C[1] ^ (~C[2] | C[3]) 90 xgr %r13,%r14 # C[4] ^ ( C[1] & C[0]) 91 ogr %r14,%r8 92 stg %r13,32(%r3) # R[0][4] = C[4] ^ ( C[1] & C[0]) 93 xgr %r14,%r11 # C[3] ^ ( C[4] | C[0]) 94 stg %r14,24(%r3) # R[0][3] = C[3] ^ ( C[4] | C[0]) 95 96 97 lg %r8,24(%r2) 98 lg %r12,176(%r2) 99 lg %r11,128(%r2) 100 lg %r9,72(%r2) 101 lg %r10,80(%r2) 102 103 xgr %r8,%r7 104 xgr %r12,%r6 105 rllg %r8,%r8,28 106 xgr %r11,%r5 107 rllg %r12,%r12,61 108 xgr %r9,%r0 109 rllg %r11,%r11,45 110 xgr %r10,%r1 111 112 lgr %r13,%r8 113 ogr %r8,%r12 114 rllg %r9,%r9,20 115 xgr %r8,%r11 # C[3] ^ (C[0] | C[4]) 116 rllg %r10,%r10,3 117 stg %r8,64(%r3) # R[1][3] = C[3] ^ (C[0] | C[4]) 118 119 lgr %r14,%r9 120 ngr %r9,%r13 121 lghi %r8,-1 # no 'not' instruction :-( 122 xgr %r9,%r12 # C[4] ^ (C[1] & C[0]) 123 xgr %r12,%r8 # not %r12 124 stg %r9,72(%r3) # R[1][4] = C[4] ^ (C[1] & C[0]) 125 126 ogr %r12,%r11 127 xgr %r12,%r10 # C[2] ^ (~C[4] | C[3]) 128 129 ngr %r11,%r10 130 stg %r12,56(%r3) # R[1][2] = C[2] ^ (~C[4] | C[3]) 131 xgr %r11,%r14 # C[1] ^ (C[3] & C[2]) 132 ogr %r14,%r10 133 stg %r11,48(%r3) # R[1][1] = C[1] ^ (C[3] & C[2]) 134 xgr %r14,%r13 # C[0] ^ (C[1] | C[2]) 135 stg %r14,40(%r3) # R[1][0] = C[0] ^ (C[1] | C[2]) 136 137 138 lg %r10,104(%r2) 139 lg %r11,152(%r2) 140 lg %r9,56(%r2) 141 lg %r12,160(%r2) 142 lg %r8,8(%r2) 143 144 xgr %r10,%r7 145 xgr %r11,%r0 146 rllg %r10,%r10,25 147 xgr %r9,%r6 148 rllg %r11,%r11,8 149 xgr %r12,%r1 150 rllg %r9,%r9,6 151 xgr %r8,%r5 152 153 lgr %r13,%r10 154 ngr %r10,%r11 155 rllg %r12,%r12,18 156 xgr %r10,%r9 # C[1] ^ ( C[2] & C[3]) 157 lghi %r14,-1 # no 'not' instruction :-( 158 stg %r10,88(%r3) # R[2][1] = C[1] ^ ( C[2] & C[3]) 159 160 xgr %r11,%r14 # not %r11 161 lgr %r14,%r12 162 ngr %r12,%r11 163 rllg %r8,%r8,1 164 xgr %r12,%r13 # C[2] ^ ( C[4] & ~C[3]) 165 ogr %r13,%r9 166 stg %r12,96(%r3) # R[2][2] = C[2] ^ ( C[4] & ~C[3]) 167 xgr %r13,%r8 # C[0] ^ ( C[2] | C[1]) 168 169 ngr %r9,%r8 170 stg %r13,80(%r3) # R[2][0] = C[0] ^ ( C[2] | C[1]) 171 xgr %r9,%r14 # C[4] ^ ( C[1] & C[0]) 172 ogr %r8,%r14 173 stg %r9,112(%r3) # R[2][4] = C[4] ^ ( C[1] & C[0]) 174 xgr %r8,%r11 # ~C[3] ^ ( C[0] | C[4]) 175 stg %r8,104(%r3) # R[2][3] = ~C[3] ^ ( C[0] | C[4]) 176 177 178 lg %r10,88(%r2) 179 lg %r11,136(%r2) 180 lg %r9,40(%r2) 181 lg %r12,184(%r2) 182 lg %r8,32(%r2) 183 184 xgr %r10,%r5 185 xgr %r11,%r6 186 rllg %r10,%r10,10 187 xgr %r9,%r1 188 rllg %r11,%r11,15 189 xgr %r12,%r7 190 rllg %r9,%r9,36 191 xgr %r8,%r0 192 rllg %r12,%r12,56 193 194 lgr %r13,%r10 195 ogr %r10,%r11 196 lghi %r14,-1 # no 'not' instruction :-( 197 xgr %r10,%r9 # C[1] ^ ( C[2] | C[3]) 198 xgr %r11,%r14 # not %r11 199 stg %r10,128(%r3) # R[3][1] = C[1] ^ ( C[2] | C[3]) 200 201 lgr %r14,%r12 202 ogr %r12,%r11 203 rllg %r8,%r8,27 204 xgr %r12,%r13 # C[2] ^ ( C[4] | ~C[3]) 205 ngr %r13,%r9 206 stg %r12,136(%r3) # R[3][2] = C[2] ^ ( C[4] | ~C[3]) 207 xgr %r13,%r8 # C[0] ^ ( C[2] & C[1]) 208 209 ogr %r9,%r8 210 stg %r13,120(%r3) # R[3][0] = C[0] ^ ( C[2] & C[1]) 211 xgr %r9,%r14 # C[4] ^ ( C[1] | C[0]) 212 ngr %r8,%r14 213 stg %r9,152(%r3) # R[3][4] = C[4] ^ ( C[1] | C[0]) 214 xgr %r8,%r11 # ~C[3] ^ ( C[0] & C[4]) 215 stg %r8,144(%r3) # R[3][3] = ~C[3] ^ ( C[0] & C[4]) 216 217 218 xg %r6,16(%r2) 219 xg %r7,64(%r2) 220 xg %r5,168(%r2) 221 xg %r0,112(%r2) 222 xgr %r3,%r2 # xchg %r3,%r2 223 rllg %r6,%r6,62 224 xg %r1,120(%r2) 225 rllg %r7,%r7,55 226 xgr %r2,%r3 227 rllg %r5,%r5,2 228 xgr %r3,%r2 229 rllg %r0,%r0,39 230 lgr %r13,%r6 231 ngr %r6,%r7 232 lghi %r14,-1 # no 'not' instruction :-( 233 xgr %r6,%r5 # C[4] ^ ( C[0] & C[1]) 234 xgr %r7,%r14 # not %r7 235 stg %r6,192(%r2) # R[4][4] = C[4] ^ ( C[0] & C[1]) 236 237 lgr %r14,%r0 238 ngr %r0,%r7 239 rllg %r1,%r1,41 240 xgr %r0,%r13 # C[0] ^ ( C[2] & ~C[1]) 241 ogr %r13,%r5 242 stg %r0,160(%r2) # R[4][0] = C[0] ^ ( C[2] & ~C[1]) 243 xgr %r13,%r1 # C[3] ^ ( C[0] | C[4]) 244 245 ngr %r5,%r1 246 stg %r13,184(%r2) # R[4][3] = C[3] ^ ( C[0] | C[4]) 247 xgr %r5,%r14 # C[2] ^ ( C[4] & C[3]) 248 ogr %r1,%r14 249 stg %r5,176(%r2) # R[4][2] = C[2] ^ ( C[4] & C[3]) 250 xgr %r1,%r7 # ~C[1] ^ ( C[2] | C[3]) 251 252 lgr %r7,%r6 # harmonize with the loop top 253 lgr %r6,%r13 254 stg %r1,168(%r2) # R[4][1] = ~C[1] ^ ( C[2] | C[3]) 255 256 tmll %r4,255 257 jnz .Loop 258 259 lg %r14,8*14(%r15) 260 br %r14 261.size __KeccakF1600,.-__KeccakF1600 262.type KeccakF1600,@function 263.align 32 264KeccakF1600: 265.LKeccakF1600: 266 lghi %r1,-360 267 stmg %r6,%r15,8*6(%r15) 268 lgr %r0,%r15 269 la %r15,0(%r1,%r15) 270 stg %r0,0(%r15) 271 272 lghi %r8,-1 # no 'not' instruction :-( 273 lghi %r9,-1 274 lghi %r10,-1 275 lghi %r11,-1 276 lghi %r12,-1 277 lghi %r13,-1 278 xg %r8,8(%r2) 279 xg %r9,16(%r2) 280 xg %r10,64(%r2) 281 xg %r11,96(%r2) 282 xg %r12,136(%r2) 283 xg %r13,160(%r2) 284 stmg %r8,%r9,8(%r2) 285 stg %r10,64(%r2) 286 stg %r11,96(%r2) 287 stg %r12,136(%r2) 288 stg %r13,160(%r2) 289 290 la %r3,160(%r15) 291 292 bras %r14,__KeccakF1600 293 294 lghi %r8,-1 # no 'not' instruction :-( 295 lghi %r9,-1 296 lghi %r10,-1 297 lghi %r11,-1 298 lghi %r12,-1 299 lghi %r13,-1 300 xg %r8,8(%r2) 301 xg %r9,16(%r2) 302 xg %r10,64(%r2) 303 xg %r11,96(%r2) 304 xg %r12,136(%r2) 305 xg %r13,160(%r2) 306 stmg %r8,%r9,8(%r2) 307 stg %r10,64(%r2) 308 stg %r11,96(%r2) 309 stg %r12,136(%r2) 310 stg %r13,160(%r2) 311 312 lmg %r6,%r15,360+6*8(%r15) 313 br %r14 314.size KeccakF1600,.-KeccakF1600 315.globl SHA3_absorb 316.type SHA3_absorb,@function 317.align 32 318SHA3_absorb: 319 lghi %r1,-360 320 stmg %r5,%r15,8*5(%r15) 321 lgr %r0,%r15 322 la %r15,0(%r1,%r15) 323 stg %r0,0(%r15) 324 325 lghi %r8,-1 # no 'not' instruction :-( 326 lghi %r9,-1 327 lghi %r10,-1 328 lghi %r11,-1 329 lghi %r12,-1 330 lghi %r13,-1 331 xg %r8,8(%r2) 332 xg %r9,16(%r2) 333 xg %r10,64(%r2) 334 xg %r11,96(%r2) 335 xg %r12,136(%r2) 336 xg %r13,160(%r2) 337 stmg %r8,%r9,8(%r2) 338 stg %r10,64(%r2) 339 stg %r11,96(%r2) 340 stg %r12,136(%r2) 341 stg %r13,160(%r2) 342 343.Loop_absorb: 344 clgr %r4,%r5 345 jl .Ldone_absorb 346 347 srlg %r5,%r5,3 348 la %r1,0(%r2) 349 350.Lblock_absorb: 351 lrvg %r0,0(%r3) 352 la %r3,8(%r3) 353 xg %r0,0(%r1) 354 aghi %r4,-8 355 stg %r0,0(%r1) 356 la %r1,8(%r1) 357 brct %r5,.Lblock_absorb 358 359 stmg %r3,%r4,360+3*8(%r15) 360 la %r3,160(%r15) 361 bras %r14,__KeccakF1600 362 lmg %r3,%r5,360+3*8(%r15) 363 j .Loop_absorb 364 365.align 16 366.Ldone_absorb: 367 lghi %r8,-1 # no 'not' instruction :-( 368 lghi %r9,-1 369 lghi %r10,-1 370 lghi %r11,-1 371 lghi %r12,-1 372 lghi %r13,-1 373 xg %r8,8(%r2) 374 xg %r9,16(%r2) 375 xg %r10,64(%r2) 376 xg %r11,96(%r2) 377 xg %r12,136(%r2) 378 xg %r13,160(%r2) 379 stmg %r8,%r9,8(%r2) 380 stg %r10,64(%r2) 381 stg %r11,96(%r2) 382 stg %r12,136(%r2) 383 stg %r13,160(%r2) 384 385 lgr %r2,%r4 # return value 386 387 lmg %r6,%r15,360+6*8(%r15) 388 br %r14 389.size SHA3_absorb,.-SHA3_absorb 390.globl SHA3_squeeze 391.type SHA3_squeeze,@function 392.align 32 393SHA3_squeeze: 394 srlg %r5,%r5,3 395 stg %r14,2*8(%r15) 396 lghi %r14,8 397 stg %r5,5*8(%r15) 398 la %r1,0(%r2) 399 400 j .Loop_squeeze 401 402.align 16 403.Loop_squeeze: 404 clgr %r4,%r14 405 jl .Ltail_squeeze 406 407 lrvg %r0,0(%r1) 408 la %r1,8(%r1) 409 stg %r0,0(%r3) 410 la %r3,8(%r3) 411 aghi %r4,-8 # len -= 8 412 jz .Ldone_squeeze 413 414 brct %r5,.Loop_squeeze # bsz-- 415 416 stmg %r3,%r4,3*8(%r15) 417 bras %r14,.LKeccakF1600 418 lmg %r3,%r5,3*8(%r15) 419 lghi %r14,8 420 la %r1,0(%r2) 421 j .Loop_squeeze 422 423.Ltail_squeeze: 424 lg %r0,0(%r1) 425.Loop_tail_squeeze: 426 stc %r0,0(%r3) 427 la %r3,1(%r3) 428 srlg %r0,%r0,8 429 brct %r4,.Loop_tail_squeeze 430 431.Ldone_squeeze: 432 lg %r14,2*8(%r15) 433 br %r14 434.size SHA3_squeeze,.-SHA3_squeeze 435.align 256 436 .quad 0,0,0,0,0,0,0,0 437.type iotas,@object 438iotas: 439 .quad 0x0000000000000001 440 .quad 0x0000000000008082 441 .quad 0x800000000000808a 442 .quad 0x8000000080008000 443 .quad 0x000000000000808b 444 .quad 0x0000000080000001 445 .quad 0x8000000080008081 446 .quad 0x8000000000008009 447 .quad 0x000000000000008a 448 .quad 0x0000000000000088 449 .quad 0x0000000080008009 450 .quad 0x000000008000000a 451 .quad 0x000000008000808b 452 .quad 0x800000000000008b 453 .quad 0x8000000000008089 454 .quad 0x8000000000008003 455 .quad 0x8000000000008002 456 .quad 0x8000000000000080 457 .quad 0x000000000000800a 458 .quad 0x800000008000000a 459 .quad 0x8000000080008081 460 .quad 0x8000000000008080 461 .quad 0x0000000080000001 462 .quad 0x8000000080008008 463.size iotas,.-iotas 464.asciz "Keccak-1600 absorb and squeeze for s390x, CRYPTOGAMS by <appro@openssl.org>" 465