1e1051a39Sopenharmony_ci! Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved. 2e1051a39Sopenharmony_ci! 3e1051a39Sopenharmony_ci! Licensed under the Apache License 2.0 (the "License"). You may not use 4e1051a39Sopenharmony_ci! this file except in compliance with the License. You can obtain a copy 5e1051a39Sopenharmony_ci! in the file LICENSE in the source distribution or at 6e1051a39Sopenharmony_ci! https://www.openssl.org/source/license.html 7e1051a39Sopenharmony_ci! 8e1051a39Sopenharmony_ci! To expand the m4 macros: m4 -B 8192 des_enc.m4 > des_enc.S 9e1051a39Sopenharmony_ci! 10e1051a39Sopenharmony_ci! Global registers 1 to 5 are used. This is the same as done by the 11e1051a39Sopenharmony_ci! cc compiler. The UltraSPARC load/store little endian feature is used. 12e1051a39Sopenharmony_ci! 13e1051a39Sopenharmony_ci! Instruction grouping often refers to one CPU cycle. 14e1051a39Sopenharmony_ci! 15e1051a39Sopenharmony_ci! Assemble through gcc: gcc -c -mcpu=ultrasparc -o des_enc.o des_enc.S 16e1051a39Sopenharmony_ci! 17e1051a39Sopenharmony_ci! Assemble through cc: cc -c -xarch=v8plusa -o des_enc.o des_enc.S 18e1051a39Sopenharmony_ci! 19e1051a39Sopenharmony_ci! Performance improvement according to './apps/openssl speed des' 20e1051a39Sopenharmony_ci! 21e1051a39Sopenharmony_ci! 32-bit build: 22e1051a39Sopenharmony_ci! 23% faster than cc-5.2 -xarch=v8plus -xO5 23e1051a39Sopenharmony_ci! 115% faster than gcc-3.2.1 -m32 -mcpu=ultrasparc -O5 24e1051a39Sopenharmony_ci! 64-bit build: 25e1051a39Sopenharmony_ci! 50% faster than cc-5.2 -xarch=v9 -xO5 26e1051a39Sopenharmony_ci! 100% faster than gcc-3.2.1 -m64 -mcpu=ultrasparc -O5 27e1051a39Sopenharmony_ci! 28e1051a39Sopenharmony_ci 29e1051a39Sopenharmony_ci.ident "des_enc.m4 2.1" 30e1051a39Sopenharmony_ci.file "des_enc-sparc.S" 31e1051a39Sopenharmony_ci 32e1051a39Sopenharmony_ci#if defined(__SUNPRO_C) && defined(__sparcv9) 33e1051a39Sopenharmony_ci# define ABI64 /* They've said -xarch=v9 at command line */ 34e1051a39Sopenharmony_ci#elif defined(__GNUC__) && defined(__arch64__) 35e1051a39Sopenharmony_ci# define ABI64 /* They've said -m64 at command line */ 36e1051a39Sopenharmony_ci#endif 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ci#ifdef ABI64 39e1051a39Sopenharmony_ci .register %g2,#scratch 40e1051a39Sopenharmony_ci .register %g3,#scratch 41e1051a39Sopenharmony_ci# define FRAME -192 42e1051a39Sopenharmony_ci# define BIAS 2047 43e1051a39Sopenharmony_ci# define LDPTR ldx 44e1051a39Sopenharmony_ci# define STPTR stx 45e1051a39Sopenharmony_ci# define ARG0 128 46e1051a39Sopenharmony_ci# define ARGSZ 8 47e1051a39Sopenharmony_ci#else 48e1051a39Sopenharmony_ci# define FRAME -96 49e1051a39Sopenharmony_ci# define BIAS 0 50e1051a39Sopenharmony_ci# define LDPTR ld 51e1051a39Sopenharmony_ci# define STPTR st 52e1051a39Sopenharmony_ci# define ARG0 68 53e1051a39Sopenharmony_ci# define ARGSZ 4 54e1051a39Sopenharmony_ci#endif 55e1051a39Sopenharmony_ci 56e1051a39Sopenharmony_ci#define LOOPS 7 57e1051a39Sopenharmony_ci 58e1051a39Sopenharmony_ci#define global0 %g0 59e1051a39Sopenharmony_ci#define global1 %g1 60e1051a39Sopenharmony_ci#define global2 %g2 61e1051a39Sopenharmony_ci#define global3 %g3 62e1051a39Sopenharmony_ci#define global4 %g4 63e1051a39Sopenharmony_ci#define global5 %g5 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ci#define local0 %l0 66e1051a39Sopenharmony_ci#define local1 %l1 67e1051a39Sopenharmony_ci#define local2 %l2 68e1051a39Sopenharmony_ci#define local3 %l3 69e1051a39Sopenharmony_ci#define local4 %l4 70e1051a39Sopenharmony_ci#define local5 %l5 71e1051a39Sopenharmony_ci#define local7 %l6 72e1051a39Sopenharmony_ci#define local6 %l7 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci#define in0 %i0 75e1051a39Sopenharmony_ci#define in1 %i1 76e1051a39Sopenharmony_ci#define in2 %i2 77e1051a39Sopenharmony_ci#define in3 %i3 78e1051a39Sopenharmony_ci#define in4 %i4 79e1051a39Sopenharmony_ci#define in5 %i5 80e1051a39Sopenharmony_ci#define in6 %i6 81e1051a39Sopenharmony_ci#define in7 %i7 82e1051a39Sopenharmony_ci 83e1051a39Sopenharmony_ci#define out0 %o0 84e1051a39Sopenharmony_ci#define out1 %o1 85e1051a39Sopenharmony_ci#define out2 %o2 86e1051a39Sopenharmony_ci#define out3 %o3 87e1051a39Sopenharmony_ci#define out4 %o4 88e1051a39Sopenharmony_ci#define out5 %o5 89e1051a39Sopenharmony_ci#define out6 %o6 90e1051a39Sopenharmony_ci#define out7 %o7 91e1051a39Sopenharmony_ci 92e1051a39Sopenharmony_ci#define stub stb 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_cichangequote({,}) 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_ci 97e1051a39Sopenharmony_ci! Macro definitions: 98e1051a39Sopenharmony_ci 99e1051a39Sopenharmony_ci 100e1051a39Sopenharmony_ci! {ip_macro} 101e1051a39Sopenharmony_ci! 102e1051a39Sopenharmony_ci! The logic used in initial and final permutations is the same as in 103e1051a39Sopenharmony_ci! the C code. The permutations are done with a clever shift, xor, and 104e1051a39Sopenharmony_ci! technique. 105e1051a39Sopenharmony_ci! 106e1051a39Sopenharmony_ci! The macro also loads address sbox 1 to 5 to global 1 to 5, address 107e1051a39Sopenharmony_ci! sbox 6 to local6, and address sbox 8 to out3. 108e1051a39Sopenharmony_ci! 109e1051a39Sopenharmony_ci! Rotates the halves 3 left to bring the sbox bits in convenient positions. 110e1051a39Sopenharmony_ci! 111e1051a39Sopenharmony_ci! Loads key first round from address in parameter 5 to out0, out1. 112e1051a39Sopenharmony_ci! 113e1051a39Sopenharmony_ci! After the original LibDES initial permutation, the resulting left 114e1051a39Sopenharmony_ci! is in the variable initially used for right and vice versa. The macro 115e1051a39Sopenharmony_ci! implements the possibility to keep the halves in the original registers. 116e1051a39Sopenharmony_ci! 117e1051a39Sopenharmony_ci! parameter 1 left 118e1051a39Sopenharmony_ci! parameter 2 right 119e1051a39Sopenharmony_ci! parameter 3 result left (modify in first round) 120e1051a39Sopenharmony_ci! parameter 4 result right (use in first round) 121e1051a39Sopenharmony_ci! parameter 5 key address 122e1051a39Sopenharmony_ci! parameter 6 1/2 for include encryption/decryption 123e1051a39Sopenharmony_ci! parameter 7 1 for move in1 to in3 124e1051a39Sopenharmony_ci! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 125e1051a39Sopenharmony_ci! parameter 9 1 for load ks3 and ks2 to in4 and in3 126e1051a39Sopenharmony_ci 127e1051a39Sopenharmony_cidefine(ip_macro, { 128e1051a39Sopenharmony_ci 129e1051a39Sopenharmony_ci! {ip_macro} 130e1051a39Sopenharmony_ci! $1 $2 $4 $3 $5 $6 $7 $8 $9 131e1051a39Sopenharmony_ci 132e1051a39Sopenharmony_ci ld [out2+256], local1 133e1051a39Sopenharmony_ci srl $2, 4, local4 134e1051a39Sopenharmony_ci 135e1051a39Sopenharmony_ci xor local4, $1, local4 136e1051a39Sopenharmony_ci ifelse($7,1,{mov in1, in3},{nop}) 137e1051a39Sopenharmony_ci 138e1051a39Sopenharmony_ci ld [out2+260], local2 139e1051a39Sopenharmony_ci and local4, local1, local4 140e1051a39Sopenharmony_ci ifelse($8,1,{mov in3, in4},{}) 141e1051a39Sopenharmony_ci ifelse($8,2,{mov in4, in3},{}) 142e1051a39Sopenharmony_ci 143e1051a39Sopenharmony_ci ld [out2+280], out4 ! loop counter 144e1051a39Sopenharmony_ci sll local4, 4, local1 145e1051a39Sopenharmony_ci xor $1, local4, $1 146e1051a39Sopenharmony_ci 147e1051a39Sopenharmony_ci ld [out2+264], local3 148e1051a39Sopenharmony_ci srl $1, 16, local4 149e1051a39Sopenharmony_ci xor $2, local1, $2 150e1051a39Sopenharmony_ci 151e1051a39Sopenharmony_ci ifelse($9,1,{LDPTR KS3, in4},{}) 152e1051a39Sopenharmony_ci xor local4, $2, local4 153e1051a39Sopenharmony_ci nop !sethi %hi(DES_SPtrans), global1 ! sbox addr 154e1051a39Sopenharmony_ci 155e1051a39Sopenharmony_ci ifelse($9,1,{LDPTR KS2, in3},{}) 156e1051a39Sopenharmony_ci and local4, local2, local4 157e1051a39Sopenharmony_ci nop !or global1, %lo(DES_SPtrans), global1 ! sbox addr 158e1051a39Sopenharmony_ci 159e1051a39Sopenharmony_ci sll local4, 16, local1 160e1051a39Sopenharmony_ci xor $2, local4, $2 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ci srl $2, 2, local4 163e1051a39Sopenharmony_ci xor $1, local1, $1 164e1051a39Sopenharmony_ci 165e1051a39Sopenharmony_ci sethi %hi(16711680), local5 166e1051a39Sopenharmony_ci xor local4, $1, local4 167e1051a39Sopenharmony_ci 168e1051a39Sopenharmony_ci and local4, local3, local4 169e1051a39Sopenharmony_ci or local5, 255, local5 170e1051a39Sopenharmony_ci 171e1051a39Sopenharmony_ci sll local4, 2, local2 172e1051a39Sopenharmony_ci xor $1, local4, $1 173e1051a39Sopenharmony_ci 174e1051a39Sopenharmony_ci srl $1, 8, local4 175e1051a39Sopenharmony_ci xor $2, local2, $2 176e1051a39Sopenharmony_ci 177e1051a39Sopenharmony_ci xor local4, $2, local4 178e1051a39Sopenharmony_ci add global1, 768, global4 179e1051a39Sopenharmony_ci 180e1051a39Sopenharmony_ci and local4, local5, local4 181e1051a39Sopenharmony_ci add global1, 1024, global5 182e1051a39Sopenharmony_ci 183e1051a39Sopenharmony_ci ld [out2+272], local7 184e1051a39Sopenharmony_ci sll local4, 8, local1 185e1051a39Sopenharmony_ci xor $2, local4, $2 186e1051a39Sopenharmony_ci 187e1051a39Sopenharmony_ci srl $2, 1, local4 188e1051a39Sopenharmony_ci xor $1, local1, $1 189e1051a39Sopenharmony_ci 190e1051a39Sopenharmony_ci ld [$5], out0 ! key 7531 191e1051a39Sopenharmony_ci xor local4, $1, local4 192e1051a39Sopenharmony_ci add global1, 256, global2 193e1051a39Sopenharmony_ci 194e1051a39Sopenharmony_ci ld [$5+4], out1 ! key 8642 195e1051a39Sopenharmony_ci and local4, local7, local4 196e1051a39Sopenharmony_ci add global1, 512, global3 197e1051a39Sopenharmony_ci 198e1051a39Sopenharmony_ci sll local4, 1, local1 199e1051a39Sopenharmony_ci xor $1, local4, $1 200e1051a39Sopenharmony_ci 201e1051a39Sopenharmony_ci sll $1, 3, local3 202e1051a39Sopenharmony_ci xor $2, local1, $2 203e1051a39Sopenharmony_ci 204e1051a39Sopenharmony_ci sll $2, 3, local2 205e1051a39Sopenharmony_ci add global1, 1280, local6 ! address sbox 8 206e1051a39Sopenharmony_ci 207e1051a39Sopenharmony_ci srl $1, 29, local4 208e1051a39Sopenharmony_ci add global1, 1792, out3 ! address sbox 8 209e1051a39Sopenharmony_ci 210e1051a39Sopenharmony_ci srl $2, 29, local1 211e1051a39Sopenharmony_ci or local4, local3, $4 212e1051a39Sopenharmony_ci 213e1051a39Sopenharmony_ci or local2, local1, $3 214e1051a39Sopenharmony_ci 215e1051a39Sopenharmony_ci ifelse($6, 1, { 216e1051a39Sopenharmony_ci 217e1051a39Sopenharmony_ci ld [out2+284], local5 ! 0x0000FC00 used in the rounds 218e1051a39Sopenharmony_ci or local2, local1, $3 219e1051a39Sopenharmony_ci xor $4, out0, local1 220e1051a39Sopenharmony_ci 221e1051a39Sopenharmony_ci call .des_enc.1 222e1051a39Sopenharmony_ci and local1, 252, local1 223e1051a39Sopenharmony_ci 224e1051a39Sopenharmony_ci },{}) 225e1051a39Sopenharmony_ci 226e1051a39Sopenharmony_ci ifelse($6, 2, { 227e1051a39Sopenharmony_ci 228e1051a39Sopenharmony_ci ld [out2+284], local5 ! 0x0000FC00 used in the rounds 229e1051a39Sopenharmony_ci or local2, local1, $3 230e1051a39Sopenharmony_ci xor $4, out0, local1 231e1051a39Sopenharmony_ci 232e1051a39Sopenharmony_ci call .des_dec.1 233e1051a39Sopenharmony_ci and local1, 252, local1 234e1051a39Sopenharmony_ci 235e1051a39Sopenharmony_ci },{}) 236e1051a39Sopenharmony_ci}) 237e1051a39Sopenharmony_ci 238e1051a39Sopenharmony_ci 239e1051a39Sopenharmony_ci! {rounds_macro} 240e1051a39Sopenharmony_ci! 241e1051a39Sopenharmony_ci! The logic used in the DES rounds is the same as in the C code, 242e1051a39Sopenharmony_ci! except that calculations for sbox 1 and sbox 5 begin before 243e1051a39Sopenharmony_ci! the previous round is finished. 244e1051a39Sopenharmony_ci! 245e1051a39Sopenharmony_ci! In each round one half (work) is modified based on key and the 246e1051a39Sopenharmony_ci! other half (use). 247e1051a39Sopenharmony_ci! 248e1051a39Sopenharmony_ci! In this version we do two rounds in a loop repeated 7 times 249e1051a39Sopenharmony_ci! and two rounds separately. 250e1051a39Sopenharmony_ci! 251e1051a39Sopenharmony_ci! One half has the bits for the sboxes in the following positions: 252e1051a39Sopenharmony_ci! 253e1051a39Sopenharmony_ci! 777777xx555555xx333333xx111111xx 254e1051a39Sopenharmony_ci! 255e1051a39Sopenharmony_ci! 88xx666666xx444444xx222222xx8888 256e1051a39Sopenharmony_ci! 257e1051a39Sopenharmony_ci! The bits for each sbox are xor-ed with the key bits for that box. 258e1051a39Sopenharmony_ci! The above xx bits are cleared, and the result used for lookup in 259e1051a39Sopenharmony_ci! the sbox table. Each sbox entry contains the 4 output bits permuted 260e1051a39Sopenharmony_ci! into 32 bits according to the P permutation. 261e1051a39Sopenharmony_ci! 262e1051a39Sopenharmony_ci! In the description of DES, left and right are switched after 263e1051a39Sopenharmony_ci! each round, except after last round. In this code the original 264e1051a39Sopenharmony_ci! left and right are kept in the same register in all rounds, meaning 265e1051a39Sopenharmony_ci! that after the 16 rounds the result for right is in the register 266e1051a39Sopenharmony_ci! originally used for left. 267e1051a39Sopenharmony_ci! 268e1051a39Sopenharmony_ci! parameter 1 first work (left in first round) 269e1051a39Sopenharmony_ci! parameter 2 first use (right in first round) 270e1051a39Sopenharmony_ci! parameter 3 enc/dec 1/-1 271e1051a39Sopenharmony_ci! parameter 4 loop label 272e1051a39Sopenharmony_ci! parameter 5 key address register 273e1051a39Sopenharmony_ci! parameter 6 optional address for key next encryption/decryption 274e1051a39Sopenharmony_ci! parameter 7 not empty for include retl 275e1051a39Sopenharmony_ci! 276e1051a39Sopenharmony_ci! also compares in2 to 8 277e1051a39Sopenharmony_ci 278e1051a39Sopenharmony_cidefine(rounds_macro, { 279e1051a39Sopenharmony_ci 280e1051a39Sopenharmony_ci! {rounds_macro} 281e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 282e1051a39Sopenharmony_ci 283e1051a39Sopenharmony_ci xor $2, out0, local1 284e1051a39Sopenharmony_ci 285e1051a39Sopenharmony_ci ld [out2+284], local5 ! 0x0000FC00 286e1051a39Sopenharmony_ci ba $4 287e1051a39Sopenharmony_ci and local1, 252, local1 288e1051a39Sopenharmony_ci 289e1051a39Sopenharmony_ci .align 32 290e1051a39Sopenharmony_ci 291e1051a39Sopenharmony_ci$4: 292e1051a39Sopenharmony_ci ! local6 is address sbox 6 293e1051a39Sopenharmony_ci ! out3 is address sbox 8 294e1051a39Sopenharmony_ci ! out4 is loop counter 295e1051a39Sopenharmony_ci 296e1051a39Sopenharmony_ci ld [global1+local1], local1 297e1051a39Sopenharmony_ci xor $2, out1, out1 ! 8642 298e1051a39Sopenharmony_ci xor $2, out0, out0 ! 7531 299e1051a39Sopenharmony_ci ! fmovs %f0, %f0 ! fxor used for alignment 300e1051a39Sopenharmony_ci 301e1051a39Sopenharmony_ci srl out1, 4, local0 ! rotate 4 right 302e1051a39Sopenharmony_ci and out0, local5, local3 ! 3 303e1051a39Sopenharmony_ci ! fmovs %f0, %f0 304e1051a39Sopenharmony_ci 305e1051a39Sopenharmony_ci ld [$5+$3*8], local7 ! key 7531 next round 306e1051a39Sopenharmony_ci srl local3, 8, local3 ! 3 307e1051a39Sopenharmony_ci and local0, 252, local2 ! 2 308e1051a39Sopenharmony_ci ! fmovs %f0, %f0 309e1051a39Sopenharmony_ci 310e1051a39Sopenharmony_ci ld [global3+local3],local3 ! 3 311e1051a39Sopenharmony_ci sll out1, 28, out1 ! rotate 312e1051a39Sopenharmony_ci xor $1, local1, $1 ! 1 finished, local1 now sbox 7 313e1051a39Sopenharmony_ci 314e1051a39Sopenharmony_ci ld [global2+local2], local2 ! 2 315e1051a39Sopenharmony_ci srl out0, 24, local1 ! 7 316e1051a39Sopenharmony_ci or out1, local0, out1 ! rotate 317e1051a39Sopenharmony_ci 318e1051a39Sopenharmony_ci ldub [out2+local1], local1 ! 7 (and 0xFC) 319e1051a39Sopenharmony_ci srl out1, 24, local0 ! 8 320e1051a39Sopenharmony_ci and out1, local5, local4 ! 4 321e1051a39Sopenharmony_ci 322e1051a39Sopenharmony_ci ldub [out2+local0], local0 ! 8 (and 0xFC) 323e1051a39Sopenharmony_ci srl local4, 8, local4 ! 4 324e1051a39Sopenharmony_ci xor $1, local2, $1 ! 2 finished local2 now sbox 6 325e1051a39Sopenharmony_ci 326e1051a39Sopenharmony_ci ld [global4+local4],local4 ! 4 327e1051a39Sopenharmony_ci srl out1, 16, local2 ! 6 328e1051a39Sopenharmony_ci xor $1, local3, $1 ! 3 finished local3 now sbox 5 329e1051a39Sopenharmony_ci 330e1051a39Sopenharmony_ci ld [out3+local0],local0 ! 8 331e1051a39Sopenharmony_ci and local2, 252, local2 ! 6 332e1051a39Sopenharmony_ci add global1, 1536, local5 ! address sbox 7 333e1051a39Sopenharmony_ci 334e1051a39Sopenharmony_ci ld [local6+local2], local2 ! 6 335e1051a39Sopenharmony_ci srl out0, 16, local3 ! 5 336e1051a39Sopenharmony_ci xor $1, local4, $1 ! 4 finished 337e1051a39Sopenharmony_ci 338e1051a39Sopenharmony_ci ld [local5+local1],local1 ! 7 339e1051a39Sopenharmony_ci and local3, 252, local3 ! 5 340e1051a39Sopenharmony_ci xor $1, local0, $1 ! 8 finished 341e1051a39Sopenharmony_ci 342e1051a39Sopenharmony_ci ld [global5+local3],local3 ! 5 343e1051a39Sopenharmony_ci xor $1, local2, $1 ! 6 finished 344e1051a39Sopenharmony_ci subcc out4, 1, out4 345e1051a39Sopenharmony_ci 346e1051a39Sopenharmony_ci ld [$5+$3*8+4], out0 ! key 8642 next round 347e1051a39Sopenharmony_ci xor $1, local7, local2 ! sbox 5 next round 348e1051a39Sopenharmony_ci xor $1, local1, $1 ! 7 finished 349e1051a39Sopenharmony_ci 350e1051a39Sopenharmony_ci srl local2, 16, local2 ! sbox 5 next round 351e1051a39Sopenharmony_ci xor $1, local3, $1 ! 5 finished 352e1051a39Sopenharmony_ci 353e1051a39Sopenharmony_ci ld [$5+$3*16+4], out1 ! key 8642 next round again 354e1051a39Sopenharmony_ci and local2, 252, local2 ! sbox5 next round 355e1051a39Sopenharmony_ci! next round 356e1051a39Sopenharmony_ci xor $1, local7, local7 ! 7531 357e1051a39Sopenharmony_ci 358e1051a39Sopenharmony_ci ld [global5+local2], local2 ! 5 359e1051a39Sopenharmony_ci srl local7, 24, local3 ! 7 360e1051a39Sopenharmony_ci xor $1, out0, out0 ! 8642 361e1051a39Sopenharmony_ci 362e1051a39Sopenharmony_ci ldub [out2+local3], local3 ! 7 (and 0xFC) 363e1051a39Sopenharmony_ci srl out0, 4, local0 ! rotate 4 right 364e1051a39Sopenharmony_ci and local7, 252, local1 ! 1 365e1051a39Sopenharmony_ci 366e1051a39Sopenharmony_ci sll out0, 28, out0 ! rotate 367e1051a39Sopenharmony_ci xor $2, local2, $2 ! 5 finished local2 used 368e1051a39Sopenharmony_ci 369e1051a39Sopenharmony_ci srl local0, 8, local4 ! 4 370e1051a39Sopenharmony_ci and local0, 252, local2 ! 2 371e1051a39Sopenharmony_ci ld [local5+local3], local3 ! 7 372e1051a39Sopenharmony_ci 373e1051a39Sopenharmony_ci srl local0, 16, local5 ! 6 374e1051a39Sopenharmony_ci or out0, local0, out0 ! rotate 375e1051a39Sopenharmony_ci ld [global2+local2], local2 ! 2 376e1051a39Sopenharmony_ci 377e1051a39Sopenharmony_ci srl out0, 24, local0 378e1051a39Sopenharmony_ci ld [$5+$3*16], out0 ! key 7531 next round 379e1051a39Sopenharmony_ci and local4, 252, local4 ! 4 380e1051a39Sopenharmony_ci 381e1051a39Sopenharmony_ci and local5, 252, local5 ! 6 382e1051a39Sopenharmony_ci ld [global4+local4], local4 ! 4 383e1051a39Sopenharmony_ci xor $2, local3, $2 ! 7 finished local3 used 384e1051a39Sopenharmony_ci 385e1051a39Sopenharmony_ci and local0, 252, local0 ! 8 386e1051a39Sopenharmony_ci ld [local6+local5], local5 ! 6 387e1051a39Sopenharmony_ci xor $2, local2, $2 ! 2 finished local2 now sbox 3 388e1051a39Sopenharmony_ci 389e1051a39Sopenharmony_ci srl local7, 8, local2 ! 3 start 390e1051a39Sopenharmony_ci ld [out3+local0], local0 ! 8 391e1051a39Sopenharmony_ci xor $2, local4, $2 ! 4 finished 392e1051a39Sopenharmony_ci 393e1051a39Sopenharmony_ci and local2, 252, local2 ! 3 394e1051a39Sopenharmony_ci ld [global1+local1], local1 ! 1 395e1051a39Sopenharmony_ci xor $2, local5, $2 ! 6 finished local5 used 396e1051a39Sopenharmony_ci 397e1051a39Sopenharmony_ci ld [global3+local2], local2 ! 3 398e1051a39Sopenharmony_ci xor $2, local0, $2 ! 8 finished 399e1051a39Sopenharmony_ci add $5, $3*16, $5 ! enc add 8, dec add -8 to key pointer 400e1051a39Sopenharmony_ci 401e1051a39Sopenharmony_ci ld [out2+284], local5 ! 0x0000FC00 402e1051a39Sopenharmony_ci xor $2, out0, local4 ! sbox 1 next round 403e1051a39Sopenharmony_ci xor $2, local1, $2 ! 1 finished 404e1051a39Sopenharmony_ci 405e1051a39Sopenharmony_ci xor $2, local2, $2 ! 3 finished 406e1051a39Sopenharmony_ci bne $4 407e1051a39Sopenharmony_ci and local4, 252, local1 ! sbox 1 next round 408e1051a39Sopenharmony_ci 409e1051a39Sopenharmony_ci! two rounds more: 410e1051a39Sopenharmony_ci 411e1051a39Sopenharmony_ci ld [global1+local1], local1 412e1051a39Sopenharmony_ci xor $2, out1, out1 413e1051a39Sopenharmony_ci xor $2, out0, out0 414e1051a39Sopenharmony_ci 415e1051a39Sopenharmony_ci srl out1, 4, local0 ! rotate 416e1051a39Sopenharmony_ci and out0, local5, local3 417e1051a39Sopenharmony_ci 418e1051a39Sopenharmony_ci ld [$5+$3*8], local7 ! key 7531 419e1051a39Sopenharmony_ci srl local3, 8, local3 420e1051a39Sopenharmony_ci and local0, 252, local2 421e1051a39Sopenharmony_ci 422e1051a39Sopenharmony_ci ld [global3+local3],local3 423e1051a39Sopenharmony_ci sll out1, 28, out1 ! rotate 424e1051a39Sopenharmony_ci xor $1, local1, $1 ! 1 finished, local1 now sbox 7 425e1051a39Sopenharmony_ci 426e1051a39Sopenharmony_ci ld [global2+local2], local2 427e1051a39Sopenharmony_ci srl out0, 24, local1 428e1051a39Sopenharmony_ci or out1, local0, out1 ! rotate 429e1051a39Sopenharmony_ci 430e1051a39Sopenharmony_ci ldub [out2+local1], local1 431e1051a39Sopenharmony_ci srl out1, 24, local0 432e1051a39Sopenharmony_ci and out1, local5, local4 433e1051a39Sopenharmony_ci 434e1051a39Sopenharmony_ci ldub [out2+local0], local0 435e1051a39Sopenharmony_ci srl local4, 8, local4 436e1051a39Sopenharmony_ci xor $1, local2, $1 ! 2 finished local2 now sbox 6 437e1051a39Sopenharmony_ci 438e1051a39Sopenharmony_ci ld [global4+local4],local4 439e1051a39Sopenharmony_ci srl out1, 16, local2 440e1051a39Sopenharmony_ci xor $1, local3, $1 ! 3 finished local3 now sbox 5 441e1051a39Sopenharmony_ci 442e1051a39Sopenharmony_ci ld [out3+local0],local0 443e1051a39Sopenharmony_ci and local2, 252, local2 444e1051a39Sopenharmony_ci add global1, 1536, local5 ! address sbox 7 445e1051a39Sopenharmony_ci 446e1051a39Sopenharmony_ci ld [local6+local2], local2 447e1051a39Sopenharmony_ci srl out0, 16, local3 448e1051a39Sopenharmony_ci xor $1, local4, $1 ! 4 finished 449e1051a39Sopenharmony_ci 450e1051a39Sopenharmony_ci ld [local5+local1],local1 451e1051a39Sopenharmony_ci and local3, 252, local3 452e1051a39Sopenharmony_ci xor $1, local0, $1 453e1051a39Sopenharmony_ci 454e1051a39Sopenharmony_ci ld [global5+local3],local3 455e1051a39Sopenharmony_ci xor $1, local2, $1 ! 6 finished 456e1051a39Sopenharmony_ci cmp in2, 8 457e1051a39Sopenharmony_ci 458e1051a39Sopenharmony_ci ifelse($6,{}, {}, {ld [out2+280], out4}) ! loop counter 459e1051a39Sopenharmony_ci xor $1, local7, local2 ! sbox 5 next round 460e1051a39Sopenharmony_ci xor $1, local1, $1 ! 7 finished 461e1051a39Sopenharmony_ci 462e1051a39Sopenharmony_ci ld [$5+$3*8+4], out0 463e1051a39Sopenharmony_ci srl local2, 16, local2 ! sbox 5 next round 464e1051a39Sopenharmony_ci xor $1, local3, $1 ! 5 finished 465e1051a39Sopenharmony_ci 466e1051a39Sopenharmony_ci and local2, 252, local2 467e1051a39Sopenharmony_ci! next round (two rounds more) 468e1051a39Sopenharmony_ci xor $1, local7, local7 ! 7531 469e1051a39Sopenharmony_ci 470e1051a39Sopenharmony_ci ld [global5+local2], local2 471e1051a39Sopenharmony_ci srl local7, 24, local3 472e1051a39Sopenharmony_ci xor $1, out0, out0 ! 8642 473e1051a39Sopenharmony_ci 474e1051a39Sopenharmony_ci ldub [out2+local3], local3 475e1051a39Sopenharmony_ci srl out0, 4, local0 ! rotate 476e1051a39Sopenharmony_ci and local7, 252, local1 477e1051a39Sopenharmony_ci 478e1051a39Sopenharmony_ci sll out0, 28, out0 ! rotate 479e1051a39Sopenharmony_ci xor $2, local2, $2 ! 5 finished local2 used 480e1051a39Sopenharmony_ci 481e1051a39Sopenharmony_ci srl local0, 8, local4 482e1051a39Sopenharmony_ci and local0, 252, local2 483e1051a39Sopenharmony_ci ld [local5+local3], local3 484e1051a39Sopenharmony_ci 485e1051a39Sopenharmony_ci srl local0, 16, local5 486e1051a39Sopenharmony_ci or out0, local0, out0 ! rotate 487e1051a39Sopenharmony_ci ld [global2+local2], local2 488e1051a39Sopenharmony_ci 489e1051a39Sopenharmony_ci srl out0, 24, local0 490e1051a39Sopenharmony_ci ifelse($6,{}, {}, {ld [$6], out0}) ! key next encryption/decryption 491e1051a39Sopenharmony_ci and local4, 252, local4 492e1051a39Sopenharmony_ci 493e1051a39Sopenharmony_ci and local5, 252, local5 494e1051a39Sopenharmony_ci ld [global4+local4], local4 495e1051a39Sopenharmony_ci xor $2, local3, $2 ! 7 finished local3 used 496e1051a39Sopenharmony_ci 497e1051a39Sopenharmony_ci and local0, 252, local0 498e1051a39Sopenharmony_ci ld [local6+local5], local5 499e1051a39Sopenharmony_ci xor $2, local2, $2 ! 2 finished local2 now sbox 3 500e1051a39Sopenharmony_ci 501e1051a39Sopenharmony_ci srl local7, 8, local2 ! 3 start 502e1051a39Sopenharmony_ci ld [out3+local0], local0 503e1051a39Sopenharmony_ci xor $2, local4, $2 504e1051a39Sopenharmony_ci 505e1051a39Sopenharmony_ci and local2, 252, local2 506e1051a39Sopenharmony_ci ld [global1+local1], local1 507e1051a39Sopenharmony_ci xor $2, local5, $2 ! 6 finished local5 used 508e1051a39Sopenharmony_ci 509e1051a39Sopenharmony_ci ld [global3+local2], local2 510e1051a39Sopenharmony_ci srl $1, 3, local3 511e1051a39Sopenharmony_ci xor $2, local0, $2 512e1051a39Sopenharmony_ci 513e1051a39Sopenharmony_ci ifelse($6,{}, {}, {ld [$6+4], out1}) ! key next encryption/decryption 514e1051a39Sopenharmony_ci sll $1, 29, local4 515e1051a39Sopenharmony_ci xor $2, local1, $2 516e1051a39Sopenharmony_ci 517e1051a39Sopenharmony_ci ifelse($7,{}, {}, {retl}) 518e1051a39Sopenharmony_ci xor $2, local2, $2 519e1051a39Sopenharmony_ci}) 520e1051a39Sopenharmony_ci 521e1051a39Sopenharmony_ci 522e1051a39Sopenharmony_ci! {fp_macro} 523e1051a39Sopenharmony_ci! 524e1051a39Sopenharmony_ci! parameter 1 right (original left) 525e1051a39Sopenharmony_ci! parameter 2 left (original right) 526e1051a39Sopenharmony_ci! parameter 3 1 for optional store to [in0] 527e1051a39Sopenharmony_ci! parameter 4 1 for load input/output address to local5/7 528e1051a39Sopenharmony_ci! 529e1051a39Sopenharmony_ci! The final permutation logic switches the halves, meaning that 530e1051a39Sopenharmony_ci! left and right ends up the registers originally used. 531e1051a39Sopenharmony_ci 532e1051a39Sopenharmony_cidefine(fp_macro, { 533e1051a39Sopenharmony_ci 534e1051a39Sopenharmony_ci! {fp_macro} 535e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 536e1051a39Sopenharmony_ci 537e1051a39Sopenharmony_ci ! initially undo the rotate 3 left done after initial permutation 538e1051a39Sopenharmony_ci ! original left is received shifted 3 right and 29 left in local3/4 539e1051a39Sopenharmony_ci 540e1051a39Sopenharmony_ci sll $2, 29, local1 541e1051a39Sopenharmony_ci or local3, local4, $1 542e1051a39Sopenharmony_ci 543e1051a39Sopenharmony_ci srl $2, 3, $2 544e1051a39Sopenharmony_ci sethi %hi(0x55555555), local2 545e1051a39Sopenharmony_ci 546e1051a39Sopenharmony_ci or $2, local1, $2 547e1051a39Sopenharmony_ci or local2, %lo(0x55555555), local2 548e1051a39Sopenharmony_ci 549e1051a39Sopenharmony_ci srl $2, 1, local3 550e1051a39Sopenharmony_ci sethi %hi(0x00ff00ff), local1 551e1051a39Sopenharmony_ci xor local3, $1, local3 552e1051a39Sopenharmony_ci or local1, %lo(0x00ff00ff), local1 553e1051a39Sopenharmony_ci and local3, local2, local3 554e1051a39Sopenharmony_ci sethi %hi(0x33333333), local4 555e1051a39Sopenharmony_ci sll local3, 1, local2 556e1051a39Sopenharmony_ci 557e1051a39Sopenharmony_ci xor $1, local3, $1 558e1051a39Sopenharmony_ci 559e1051a39Sopenharmony_ci srl $1, 8, local3 560e1051a39Sopenharmony_ci xor $2, local2, $2 561e1051a39Sopenharmony_ci xor local3, $2, local3 562e1051a39Sopenharmony_ci or local4, %lo(0x33333333), local4 563e1051a39Sopenharmony_ci and local3, local1, local3 564e1051a39Sopenharmony_ci sethi %hi(0x0000ffff), local1 565e1051a39Sopenharmony_ci sll local3, 8, local2 566e1051a39Sopenharmony_ci 567e1051a39Sopenharmony_ci xor $2, local3, $2 568e1051a39Sopenharmony_ci 569e1051a39Sopenharmony_ci srl $2, 2, local3 570e1051a39Sopenharmony_ci xor $1, local2, $1 571e1051a39Sopenharmony_ci xor local3, $1, local3 572e1051a39Sopenharmony_ci or local1, %lo(0x0000ffff), local1 573e1051a39Sopenharmony_ci and local3, local4, local3 574e1051a39Sopenharmony_ci sethi %hi(0x0f0f0f0f), local4 575e1051a39Sopenharmony_ci sll local3, 2, local2 576e1051a39Sopenharmony_ci 577e1051a39Sopenharmony_ci ifelse($4,1, {LDPTR INPUT, local5}) 578e1051a39Sopenharmony_ci xor $1, local3, $1 579e1051a39Sopenharmony_ci 580e1051a39Sopenharmony_ci ifelse($4,1, {LDPTR OUTPUT, local7}) 581e1051a39Sopenharmony_ci srl $1, 16, local3 582e1051a39Sopenharmony_ci xor $2, local2, $2 583e1051a39Sopenharmony_ci xor local3, $2, local3 584e1051a39Sopenharmony_ci or local4, %lo(0x0f0f0f0f), local4 585e1051a39Sopenharmony_ci and local3, local1, local3 586e1051a39Sopenharmony_ci sll local3, 16, local2 587e1051a39Sopenharmony_ci 588e1051a39Sopenharmony_ci xor $2, local3, local1 589e1051a39Sopenharmony_ci 590e1051a39Sopenharmony_ci srl local1, 4, local3 591e1051a39Sopenharmony_ci xor $1, local2, $1 592e1051a39Sopenharmony_ci xor local3, $1, local3 593e1051a39Sopenharmony_ci and local3, local4, local3 594e1051a39Sopenharmony_ci sll local3, 4, local2 595e1051a39Sopenharmony_ci 596e1051a39Sopenharmony_ci xor $1, local3, $1 597e1051a39Sopenharmony_ci 598e1051a39Sopenharmony_ci ! optional store: 599e1051a39Sopenharmony_ci 600e1051a39Sopenharmony_ci ifelse($3,1, {st $1, [in0]}) 601e1051a39Sopenharmony_ci 602e1051a39Sopenharmony_ci xor local1, local2, $2 603e1051a39Sopenharmony_ci 604e1051a39Sopenharmony_ci ifelse($3,1, {st $2, [in0+4]}) 605e1051a39Sopenharmony_ci 606e1051a39Sopenharmony_ci}) 607e1051a39Sopenharmony_ci 608e1051a39Sopenharmony_ci 609e1051a39Sopenharmony_ci! {fp_ip_macro} 610e1051a39Sopenharmony_ci! 611e1051a39Sopenharmony_ci! Does initial permutation for next block mixed with 612e1051a39Sopenharmony_ci! final permutation for current block. 613e1051a39Sopenharmony_ci! 614e1051a39Sopenharmony_ci! parameter 1 original left 615e1051a39Sopenharmony_ci! parameter 2 original right 616e1051a39Sopenharmony_ci! parameter 3 left ip 617e1051a39Sopenharmony_ci! parameter 4 right ip 618e1051a39Sopenharmony_ci! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 619e1051a39Sopenharmony_ci! 2: mov in4 to in3 620e1051a39Sopenharmony_ci! 621e1051a39Sopenharmony_ci! also adds -8 to length in2 and loads loop counter to out4 622e1051a39Sopenharmony_ci 623e1051a39Sopenharmony_cidefine(fp_ip_macro, { 624e1051a39Sopenharmony_ci 625e1051a39Sopenharmony_ci! {fp_ip_macro} 626e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 627e1051a39Sopenharmony_ci 628e1051a39Sopenharmony_ci define({temp1},{out4}) 629e1051a39Sopenharmony_ci define({temp2},{local3}) 630e1051a39Sopenharmony_ci 631e1051a39Sopenharmony_ci define({ip1},{local1}) 632e1051a39Sopenharmony_ci define({ip2},{local2}) 633e1051a39Sopenharmony_ci define({ip4},{local4}) 634e1051a39Sopenharmony_ci define({ip5},{local5}) 635e1051a39Sopenharmony_ci 636e1051a39Sopenharmony_ci ! $1 in local3, local4 637e1051a39Sopenharmony_ci 638e1051a39Sopenharmony_ci ld [out2+256], ip1 639e1051a39Sopenharmony_ci sll out5, 29, temp1 640e1051a39Sopenharmony_ci or local3, local4, $1 641e1051a39Sopenharmony_ci 642e1051a39Sopenharmony_ci srl out5, 3, $2 643e1051a39Sopenharmony_ci ifelse($5,2,{mov in4, in3}) 644e1051a39Sopenharmony_ci 645e1051a39Sopenharmony_ci ld [out2+272], ip5 646e1051a39Sopenharmony_ci srl $4, 4, local0 647e1051a39Sopenharmony_ci or $2, temp1, $2 648e1051a39Sopenharmony_ci 649e1051a39Sopenharmony_ci srl $2, 1, temp1 650e1051a39Sopenharmony_ci xor temp1, $1, temp1 651e1051a39Sopenharmony_ci 652e1051a39Sopenharmony_ci and temp1, ip5, temp1 653e1051a39Sopenharmony_ci xor local0, $3, local0 654e1051a39Sopenharmony_ci 655e1051a39Sopenharmony_ci sll temp1, 1, temp2 656e1051a39Sopenharmony_ci xor $1, temp1, $1 657e1051a39Sopenharmony_ci 658e1051a39Sopenharmony_ci and local0, ip1, local0 659e1051a39Sopenharmony_ci add in2, -8, in2 660e1051a39Sopenharmony_ci 661e1051a39Sopenharmony_ci sll local0, 4, local7 662e1051a39Sopenharmony_ci xor $3, local0, $3 663e1051a39Sopenharmony_ci 664e1051a39Sopenharmony_ci ld [out2+268], ip4 665e1051a39Sopenharmony_ci srl $1, 8, temp1 666e1051a39Sopenharmony_ci xor $2, temp2, $2 667e1051a39Sopenharmony_ci ld [out2+260], ip2 668e1051a39Sopenharmony_ci srl $3, 16, local0 669e1051a39Sopenharmony_ci xor $4, local7, $4 670e1051a39Sopenharmony_ci xor temp1, $2, temp1 671e1051a39Sopenharmony_ci xor local0, $4, local0 672e1051a39Sopenharmony_ci and temp1, ip4, temp1 673e1051a39Sopenharmony_ci and local0, ip2, local0 674e1051a39Sopenharmony_ci sll temp1, 8, temp2 675e1051a39Sopenharmony_ci xor $2, temp1, $2 676e1051a39Sopenharmony_ci sll local0, 16, local7 677e1051a39Sopenharmony_ci xor $4, local0, $4 678e1051a39Sopenharmony_ci 679e1051a39Sopenharmony_ci srl $2, 2, temp1 680e1051a39Sopenharmony_ci xor $1, temp2, $1 681e1051a39Sopenharmony_ci 682e1051a39Sopenharmony_ci ld [out2+264], temp2 ! ip3 683e1051a39Sopenharmony_ci srl $4, 2, local0 684e1051a39Sopenharmony_ci xor $3, local7, $3 685e1051a39Sopenharmony_ci xor temp1, $1, temp1 686e1051a39Sopenharmony_ci xor local0, $3, local0 687e1051a39Sopenharmony_ci and temp1, temp2, temp1 688e1051a39Sopenharmony_ci and local0, temp2, local0 689e1051a39Sopenharmony_ci sll temp1, 2, temp2 690e1051a39Sopenharmony_ci xor $1, temp1, $1 691e1051a39Sopenharmony_ci sll local0, 2, local7 692e1051a39Sopenharmony_ci xor $3, local0, $3 693e1051a39Sopenharmony_ci 694e1051a39Sopenharmony_ci srl $1, 16, temp1 695e1051a39Sopenharmony_ci xor $2, temp2, $2 696e1051a39Sopenharmony_ci srl $3, 8, local0 697e1051a39Sopenharmony_ci xor $4, local7, $4 698e1051a39Sopenharmony_ci xor temp1, $2, temp1 699e1051a39Sopenharmony_ci xor local0, $4, local0 700e1051a39Sopenharmony_ci and temp1, ip2, temp1 701e1051a39Sopenharmony_ci and local0, ip4, local0 702e1051a39Sopenharmony_ci sll temp1, 16, temp2 703e1051a39Sopenharmony_ci xor $2, temp1, local4 704e1051a39Sopenharmony_ci sll local0, 8, local7 705e1051a39Sopenharmony_ci xor $4, local0, $4 706e1051a39Sopenharmony_ci 707e1051a39Sopenharmony_ci srl $4, 1, local0 708e1051a39Sopenharmony_ci xor $3, local7, $3 709e1051a39Sopenharmony_ci 710e1051a39Sopenharmony_ci srl local4, 4, temp1 711e1051a39Sopenharmony_ci xor local0, $3, local0 712e1051a39Sopenharmony_ci 713e1051a39Sopenharmony_ci xor $1, temp2, $1 714e1051a39Sopenharmony_ci and local0, ip5, local0 715e1051a39Sopenharmony_ci 716e1051a39Sopenharmony_ci sll local0, 1, local7 717e1051a39Sopenharmony_ci xor temp1, $1, temp1 718e1051a39Sopenharmony_ci 719e1051a39Sopenharmony_ci xor $3, local0, $3 720e1051a39Sopenharmony_ci xor $4, local7, $4 721e1051a39Sopenharmony_ci 722e1051a39Sopenharmony_ci sll $3, 3, local5 723e1051a39Sopenharmony_ci and temp1, ip1, temp1 724e1051a39Sopenharmony_ci 725e1051a39Sopenharmony_ci sll temp1, 4, temp2 726e1051a39Sopenharmony_ci xor $1, temp1, $1 727e1051a39Sopenharmony_ci 728e1051a39Sopenharmony_ci ifelse($5,1,{LDPTR KS2, in4}) 729e1051a39Sopenharmony_ci sll $4, 3, local2 730e1051a39Sopenharmony_ci xor local4, temp2, $2 731e1051a39Sopenharmony_ci 732e1051a39Sopenharmony_ci ! reload since used as temporary: 733e1051a39Sopenharmony_ci 734e1051a39Sopenharmony_ci ld [out2+280], out4 ! loop counter 735e1051a39Sopenharmony_ci 736e1051a39Sopenharmony_ci srl $3, 29, local0 737e1051a39Sopenharmony_ci ifelse($5,1,{add in4, 120, in4}) 738e1051a39Sopenharmony_ci 739e1051a39Sopenharmony_ci ifelse($5,1,{LDPTR KS1, in3}) 740e1051a39Sopenharmony_ci srl $4, 29, local7 741e1051a39Sopenharmony_ci 742e1051a39Sopenharmony_ci or local0, local5, $4 743e1051a39Sopenharmony_ci or local2, local7, $3 744e1051a39Sopenharmony_ci 745e1051a39Sopenharmony_ci}) 746e1051a39Sopenharmony_ci 747e1051a39Sopenharmony_ci 748e1051a39Sopenharmony_ci 749e1051a39Sopenharmony_ci! {load_little_endian} 750e1051a39Sopenharmony_ci! 751e1051a39Sopenharmony_ci! parameter 1 address 752e1051a39Sopenharmony_ci! parameter 2 destination left 753e1051a39Sopenharmony_ci! parameter 3 destination right 754e1051a39Sopenharmony_ci! parameter 4 temporary 755e1051a39Sopenharmony_ci! parameter 5 label 756e1051a39Sopenharmony_ci 757e1051a39Sopenharmony_cidefine(load_little_endian, { 758e1051a39Sopenharmony_ci 759e1051a39Sopenharmony_ci! {load_little_endian} 760e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 761e1051a39Sopenharmony_ci 762e1051a39Sopenharmony_ci ! first in memory to rightmost in register 763e1051a39Sopenharmony_ci 764e1051a39Sopenharmony_ci$5: 765e1051a39Sopenharmony_ci ldub [$1+3], $2 766e1051a39Sopenharmony_ci 767e1051a39Sopenharmony_ci ldub [$1+2], $4 768e1051a39Sopenharmony_ci sll $2, 8, $2 769e1051a39Sopenharmony_ci or $2, $4, $2 770e1051a39Sopenharmony_ci 771e1051a39Sopenharmony_ci ldub [$1+1], $4 772e1051a39Sopenharmony_ci sll $2, 8, $2 773e1051a39Sopenharmony_ci or $2, $4, $2 774e1051a39Sopenharmony_ci 775e1051a39Sopenharmony_ci ldub [$1+0], $4 776e1051a39Sopenharmony_ci sll $2, 8, $2 777e1051a39Sopenharmony_ci or $2, $4, $2 778e1051a39Sopenharmony_ci 779e1051a39Sopenharmony_ci 780e1051a39Sopenharmony_ci ldub [$1+3+4], $3 781e1051a39Sopenharmony_ci 782e1051a39Sopenharmony_ci ldub [$1+2+4], $4 783e1051a39Sopenharmony_ci sll $3, 8, $3 784e1051a39Sopenharmony_ci or $3, $4, $3 785e1051a39Sopenharmony_ci 786e1051a39Sopenharmony_ci ldub [$1+1+4], $4 787e1051a39Sopenharmony_ci sll $3, 8, $3 788e1051a39Sopenharmony_ci or $3, $4, $3 789e1051a39Sopenharmony_ci 790e1051a39Sopenharmony_ci ldub [$1+0+4], $4 791e1051a39Sopenharmony_ci sll $3, 8, $3 792e1051a39Sopenharmony_ci or $3, $4, $3 793e1051a39Sopenharmony_ci$5a: 794e1051a39Sopenharmony_ci 795e1051a39Sopenharmony_ci}) 796e1051a39Sopenharmony_ci 797e1051a39Sopenharmony_ci 798e1051a39Sopenharmony_ci! {load_little_endian_inc} 799e1051a39Sopenharmony_ci! 800e1051a39Sopenharmony_ci! parameter 1 address 801e1051a39Sopenharmony_ci! parameter 2 destination left 802e1051a39Sopenharmony_ci! parameter 3 destination right 803e1051a39Sopenharmony_ci! parameter 4 temporary 804e1051a39Sopenharmony_ci! parameter 4 label 805e1051a39Sopenharmony_ci! 806e1051a39Sopenharmony_ci! adds 8 to address 807e1051a39Sopenharmony_ci 808e1051a39Sopenharmony_cidefine(load_little_endian_inc, { 809e1051a39Sopenharmony_ci 810e1051a39Sopenharmony_ci! {load_little_endian_inc} 811e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 812e1051a39Sopenharmony_ci 813e1051a39Sopenharmony_ci ! first in memory to rightmost in register 814e1051a39Sopenharmony_ci 815e1051a39Sopenharmony_ci$5: 816e1051a39Sopenharmony_ci ldub [$1+3], $2 817e1051a39Sopenharmony_ci 818e1051a39Sopenharmony_ci ldub [$1+2], $4 819e1051a39Sopenharmony_ci sll $2, 8, $2 820e1051a39Sopenharmony_ci or $2, $4, $2 821e1051a39Sopenharmony_ci 822e1051a39Sopenharmony_ci ldub [$1+1], $4 823e1051a39Sopenharmony_ci sll $2, 8, $2 824e1051a39Sopenharmony_ci or $2, $4, $2 825e1051a39Sopenharmony_ci 826e1051a39Sopenharmony_ci ldub [$1+0], $4 827e1051a39Sopenharmony_ci sll $2, 8, $2 828e1051a39Sopenharmony_ci or $2, $4, $2 829e1051a39Sopenharmony_ci 830e1051a39Sopenharmony_ci ldub [$1+3+4], $3 831e1051a39Sopenharmony_ci add $1, 8, $1 832e1051a39Sopenharmony_ci 833e1051a39Sopenharmony_ci ldub [$1+2+4-8], $4 834e1051a39Sopenharmony_ci sll $3, 8, $3 835e1051a39Sopenharmony_ci or $3, $4, $3 836e1051a39Sopenharmony_ci 837e1051a39Sopenharmony_ci ldub [$1+1+4-8], $4 838e1051a39Sopenharmony_ci sll $3, 8, $3 839e1051a39Sopenharmony_ci or $3, $4, $3 840e1051a39Sopenharmony_ci 841e1051a39Sopenharmony_ci ldub [$1+0+4-8], $4 842e1051a39Sopenharmony_ci sll $3, 8, $3 843e1051a39Sopenharmony_ci or $3, $4, $3 844e1051a39Sopenharmony_ci$5a: 845e1051a39Sopenharmony_ci 846e1051a39Sopenharmony_ci}) 847e1051a39Sopenharmony_ci 848e1051a39Sopenharmony_ci 849e1051a39Sopenharmony_ci! {load_n_bytes} 850e1051a39Sopenharmony_ci! 851e1051a39Sopenharmony_ci! Loads 1 to 7 bytes little endian 852e1051a39Sopenharmony_ci! Remaining bytes are zeroed. 853e1051a39Sopenharmony_ci! 854e1051a39Sopenharmony_ci! parameter 1 address 855e1051a39Sopenharmony_ci! parameter 2 length 856e1051a39Sopenharmony_ci! parameter 3 destination register left 857e1051a39Sopenharmony_ci! parameter 4 destination register right 858e1051a39Sopenharmony_ci! parameter 5 temp 859e1051a39Sopenharmony_ci! parameter 6 temp2 860e1051a39Sopenharmony_ci! parameter 7 label 861e1051a39Sopenharmony_ci! parameter 8 return label 862e1051a39Sopenharmony_ci 863e1051a39Sopenharmony_cidefine(load_n_bytes, { 864e1051a39Sopenharmony_ci 865e1051a39Sopenharmony_ci! {load_n_bytes} 866e1051a39Sopenharmony_ci! $1 $2 $5 $6 $7 $8 $7 $8 $9 867e1051a39Sopenharmony_ci 868e1051a39Sopenharmony_ci$7.0: call .+8 869e1051a39Sopenharmony_ci sll $2, 2, $6 870e1051a39Sopenharmony_ci 871e1051a39Sopenharmony_ci add %o7,$7.jmp.table-$7.0,$5 872e1051a39Sopenharmony_ci 873e1051a39Sopenharmony_ci add $5, $6, $5 874e1051a39Sopenharmony_ci mov 0, $4 875e1051a39Sopenharmony_ci 876e1051a39Sopenharmony_ci ld [$5], $5 877e1051a39Sopenharmony_ci 878e1051a39Sopenharmony_ci jmp %o7+$5 879e1051a39Sopenharmony_ci mov 0, $3 880e1051a39Sopenharmony_ci 881e1051a39Sopenharmony_ci$7.7: 882e1051a39Sopenharmony_ci ldub [$1+6], $5 883e1051a39Sopenharmony_ci sll $5, 16, $5 884e1051a39Sopenharmony_ci or $3, $5, $3 885e1051a39Sopenharmony_ci$7.6: 886e1051a39Sopenharmony_ci ldub [$1+5], $5 887e1051a39Sopenharmony_ci sll $5, 8, $5 888e1051a39Sopenharmony_ci or $3, $5, $3 889e1051a39Sopenharmony_ci$7.5: 890e1051a39Sopenharmony_ci ldub [$1+4], $5 891e1051a39Sopenharmony_ci or $3, $5, $3 892e1051a39Sopenharmony_ci$7.4: 893e1051a39Sopenharmony_ci ldub [$1+3], $5 894e1051a39Sopenharmony_ci sll $5, 24, $5 895e1051a39Sopenharmony_ci or $4, $5, $4 896e1051a39Sopenharmony_ci$7.3: 897e1051a39Sopenharmony_ci ldub [$1+2], $5 898e1051a39Sopenharmony_ci sll $5, 16, $5 899e1051a39Sopenharmony_ci or $4, $5, $4 900e1051a39Sopenharmony_ci$7.2: 901e1051a39Sopenharmony_ci ldub [$1+1], $5 902e1051a39Sopenharmony_ci sll $5, 8, $5 903e1051a39Sopenharmony_ci or $4, $5, $4 904e1051a39Sopenharmony_ci$7.1: 905e1051a39Sopenharmony_ci ldub [$1+0], $5 906e1051a39Sopenharmony_ci ba $8 907e1051a39Sopenharmony_ci or $4, $5, $4 908e1051a39Sopenharmony_ci 909e1051a39Sopenharmony_ci .align 4 910e1051a39Sopenharmony_ci 911e1051a39Sopenharmony_ci$7.jmp.table: 912e1051a39Sopenharmony_ci .word 0 913e1051a39Sopenharmony_ci .word $7.1-$7.0 914e1051a39Sopenharmony_ci .word $7.2-$7.0 915e1051a39Sopenharmony_ci .word $7.3-$7.0 916e1051a39Sopenharmony_ci .word $7.4-$7.0 917e1051a39Sopenharmony_ci .word $7.5-$7.0 918e1051a39Sopenharmony_ci .word $7.6-$7.0 919e1051a39Sopenharmony_ci .word $7.7-$7.0 920e1051a39Sopenharmony_ci}) 921e1051a39Sopenharmony_ci 922e1051a39Sopenharmony_ci 923e1051a39Sopenharmony_ci! {store_little_endian} 924e1051a39Sopenharmony_ci! 925e1051a39Sopenharmony_ci! parameter 1 address 926e1051a39Sopenharmony_ci! parameter 2 source left 927e1051a39Sopenharmony_ci! parameter 3 source right 928e1051a39Sopenharmony_ci! parameter 4 temporary 929e1051a39Sopenharmony_ci 930e1051a39Sopenharmony_cidefine(store_little_endian, { 931e1051a39Sopenharmony_ci 932e1051a39Sopenharmony_ci! {store_little_endian} 933e1051a39Sopenharmony_ci! $1 $2 $3 $4 $5 $6 $7 $8 $9 934e1051a39Sopenharmony_ci 935e1051a39Sopenharmony_ci ! rightmost in register to first in memory 936e1051a39Sopenharmony_ci 937e1051a39Sopenharmony_ci$5: 938e1051a39Sopenharmony_ci and $2, 255, $4 939e1051a39Sopenharmony_ci stub $4, [$1+0] 940e1051a39Sopenharmony_ci 941e1051a39Sopenharmony_ci srl $2, 8, $4 942e1051a39Sopenharmony_ci and $4, 255, $4 943e1051a39Sopenharmony_ci stub $4, [$1+1] 944e1051a39Sopenharmony_ci 945e1051a39Sopenharmony_ci srl $2, 16, $4 946e1051a39Sopenharmony_ci and $4, 255, $4 947e1051a39Sopenharmony_ci stub $4, [$1+2] 948e1051a39Sopenharmony_ci 949e1051a39Sopenharmony_ci srl $2, 24, $4 950e1051a39Sopenharmony_ci stub $4, [$1+3] 951e1051a39Sopenharmony_ci 952e1051a39Sopenharmony_ci 953e1051a39Sopenharmony_ci and $3, 255, $4 954e1051a39Sopenharmony_ci stub $4, [$1+0+4] 955e1051a39Sopenharmony_ci 956e1051a39Sopenharmony_ci srl $3, 8, $4 957e1051a39Sopenharmony_ci and $4, 255, $4 958e1051a39Sopenharmony_ci stub $4, [$1+1+4] 959e1051a39Sopenharmony_ci 960e1051a39Sopenharmony_ci srl $3, 16, $4 961e1051a39Sopenharmony_ci and $4, 255, $4 962e1051a39Sopenharmony_ci stub $4, [$1+2+4] 963e1051a39Sopenharmony_ci 964e1051a39Sopenharmony_ci srl $3, 24, $4 965e1051a39Sopenharmony_ci stub $4, [$1+3+4] 966e1051a39Sopenharmony_ci 967e1051a39Sopenharmony_ci$5a: 968e1051a39Sopenharmony_ci 969e1051a39Sopenharmony_ci}) 970e1051a39Sopenharmony_ci 971e1051a39Sopenharmony_ci 972e1051a39Sopenharmony_ci! {store_n_bytes} 973e1051a39Sopenharmony_ci! 974e1051a39Sopenharmony_ci! Stores 1 to 7 bytes little endian 975e1051a39Sopenharmony_ci! 976e1051a39Sopenharmony_ci! parameter 1 address 977e1051a39Sopenharmony_ci! parameter 2 length 978e1051a39Sopenharmony_ci! parameter 3 source register left 979e1051a39Sopenharmony_ci! parameter 4 source register right 980e1051a39Sopenharmony_ci! parameter 5 temp 981e1051a39Sopenharmony_ci! parameter 6 temp2 982e1051a39Sopenharmony_ci! parameter 7 label 983e1051a39Sopenharmony_ci! parameter 8 return label 984e1051a39Sopenharmony_ci 985e1051a39Sopenharmony_cidefine(store_n_bytes, { 986e1051a39Sopenharmony_ci 987e1051a39Sopenharmony_ci! {store_n_bytes} 988e1051a39Sopenharmony_ci! $1 $2 $5 $6 $7 $8 $7 $8 $9 989e1051a39Sopenharmony_ci 990e1051a39Sopenharmony_ci$7.0: call .+8 991e1051a39Sopenharmony_ci sll $2, 2, $6 992e1051a39Sopenharmony_ci 993e1051a39Sopenharmony_ci add %o7,$7.jmp.table-$7.0,$5 994e1051a39Sopenharmony_ci 995e1051a39Sopenharmony_ci add $5, $6, $5 996e1051a39Sopenharmony_ci 997e1051a39Sopenharmony_ci ld [$5], $5 998e1051a39Sopenharmony_ci 999e1051a39Sopenharmony_ci jmp %o7+$5 1000e1051a39Sopenharmony_ci nop 1001e1051a39Sopenharmony_ci 1002e1051a39Sopenharmony_ci$7.7: 1003e1051a39Sopenharmony_ci srl $3, 16, $5 1004e1051a39Sopenharmony_ci and $5, 0xff, $5 1005e1051a39Sopenharmony_ci stub $5, [$1+6] 1006e1051a39Sopenharmony_ci$7.6: 1007e1051a39Sopenharmony_ci srl $3, 8, $5 1008e1051a39Sopenharmony_ci and $5, 0xff, $5 1009e1051a39Sopenharmony_ci stub $5, [$1+5] 1010e1051a39Sopenharmony_ci$7.5: 1011e1051a39Sopenharmony_ci and $3, 0xff, $5 1012e1051a39Sopenharmony_ci stub $5, [$1+4] 1013e1051a39Sopenharmony_ci$7.4: 1014e1051a39Sopenharmony_ci srl $4, 24, $5 1015e1051a39Sopenharmony_ci stub $5, [$1+3] 1016e1051a39Sopenharmony_ci$7.3: 1017e1051a39Sopenharmony_ci srl $4, 16, $5 1018e1051a39Sopenharmony_ci and $5, 0xff, $5 1019e1051a39Sopenharmony_ci stub $5, [$1+2] 1020e1051a39Sopenharmony_ci$7.2: 1021e1051a39Sopenharmony_ci srl $4, 8, $5 1022e1051a39Sopenharmony_ci and $5, 0xff, $5 1023e1051a39Sopenharmony_ci stub $5, [$1+1] 1024e1051a39Sopenharmony_ci$7.1: 1025e1051a39Sopenharmony_ci and $4, 0xff, $5 1026e1051a39Sopenharmony_ci 1027e1051a39Sopenharmony_ci 1028e1051a39Sopenharmony_ci ba $8 1029e1051a39Sopenharmony_ci stub $5, [$1] 1030e1051a39Sopenharmony_ci 1031e1051a39Sopenharmony_ci .align 4 1032e1051a39Sopenharmony_ci 1033e1051a39Sopenharmony_ci$7.jmp.table: 1034e1051a39Sopenharmony_ci 1035e1051a39Sopenharmony_ci .word 0 1036e1051a39Sopenharmony_ci .word $7.1-$7.0 1037e1051a39Sopenharmony_ci .word $7.2-$7.0 1038e1051a39Sopenharmony_ci .word $7.3-$7.0 1039e1051a39Sopenharmony_ci .word $7.4-$7.0 1040e1051a39Sopenharmony_ci .word $7.5-$7.0 1041e1051a39Sopenharmony_ci .word $7.6-$7.0 1042e1051a39Sopenharmony_ci .word $7.7-$7.0 1043e1051a39Sopenharmony_ci}) 1044e1051a39Sopenharmony_ci 1045e1051a39Sopenharmony_ci 1046e1051a39Sopenharmony_cidefine(testvalue,{1}) 1047e1051a39Sopenharmony_ci 1048e1051a39Sopenharmony_cidefine(register_init, { 1049e1051a39Sopenharmony_ci 1050e1051a39Sopenharmony_ci! For test purposes: 1051e1051a39Sopenharmony_ci 1052e1051a39Sopenharmony_ci sethi %hi(testvalue), local0 1053e1051a39Sopenharmony_ci or local0, %lo(testvalue), local0 1054e1051a39Sopenharmony_ci 1055e1051a39Sopenharmony_ci ifelse($1,{},{}, {mov local0, $1}) 1056e1051a39Sopenharmony_ci ifelse($2,{},{}, {mov local0, $2}) 1057e1051a39Sopenharmony_ci ifelse($3,{},{}, {mov local0, $3}) 1058e1051a39Sopenharmony_ci ifelse($4,{},{}, {mov local0, $4}) 1059e1051a39Sopenharmony_ci ifelse($5,{},{}, {mov local0, $5}) 1060e1051a39Sopenharmony_ci ifelse($6,{},{}, {mov local0, $6}) 1061e1051a39Sopenharmony_ci ifelse($7,{},{}, {mov local0, $7}) 1062e1051a39Sopenharmony_ci ifelse($8,{},{}, {mov local0, $8}) 1063e1051a39Sopenharmony_ci 1064e1051a39Sopenharmony_ci mov local0, local1 1065e1051a39Sopenharmony_ci mov local0, local2 1066e1051a39Sopenharmony_ci mov local0, local3 1067e1051a39Sopenharmony_ci mov local0, local4 1068e1051a39Sopenharmony_ci mov local0, local5 1069e1051a39Sopenharmony_ci mov local0, local7 1070e1051a39Sopenharmony_ci mov local0, local6 1071e1051a39Sopenharmony_ci mov local0, out0 1072e1051a39Sopenharmony_ci mov local0, out1 1073e1051a39Sopenharmony_ci mov local0, out2 1074e1051a39Sopenharmony_ci mov local0, out3 1075e1051a39Sopenharmony_ci mov local0, out4 1076e1051a39Sopenharmony_ci mov local0, out5 1077e1051a39Sopenharmony_ci mov local0, global1 1078e1051a39Sopenharmony_ci mov local0, global2 1079e1051a39Sopenharmony_ci mov local0, global3 1080e1051a39Sopenharmony_ci mov local0, global4 1081e1051a39Sopenharmony_ci mov local0, global5 1082e1051a39Sopenharmony_ci 1083e1051a39Sopenharmony_ci}) 1084e1051a39Sopenharmony_ci 1085e1051a39Sopenharmony_ci.section ".text" 1086e1051a39Sopenharmony_ci 1087e1051a39Sopenharmony_ci .align 32 1088e1051a39Sopenharmony_ci 1089e1051a39Sopenharmony_ci.des_enc: 1090e1051a39Sopenharmony_ci 1091e1051a39Sopenharmony_ci ! key address in3 1092e1051a39Sopenharmony_ci ! loads key next encryption/decryption first round from [in4] 1093e1051a39Sopenharmony_ci 1094e1051a39Sopenharmony_ci rounds_macro(in5, out5, 1, .des_enc.1, in3, in4, retl) 1095e1051a39Sopenharmony_ci 1096e1051a39Sopenharmony_ci 1097e1051a39Sopenharmony_ci .align 32 1098e1051a39Sopenharmony_ci 1099e1051a39Sopenharmony_ci.des_dec: 1100e1051a39Sopenharmony_ci 1101e1051a39Sopenharmony_ci ! implemented with out5 as first parameter to avoid 1102e1051a39Sopenharmony_ci ! register exchange in ede modes 1103e1051a39Sopenharmony_ci 1104e1051a39Sopenharmony_ci ! key address in4 1105e1051a39Sopenharmony_ci ! loads key next encryption/decryption first round from [in3] 1106e1051a39Sopenharmony_ci 1107e1051a39Sopenharmony_ci rounds_macro(out5, in5, -1, .des_dec.1, in4, in3, retl) 1108e1051a39Sopenharmony_ci 1109e1051a39Sopenharmony_ci 1110e1051a39Sopenharmony_ci 1111e1051a39Sopenharmony_ci! void DES_encrypt1(data, ks, enc) 1112e1051a39Sopenharmony_ci! ******************************* 1113e1051a39Sopenharmony_ci 1114e1051a39Sopenharmony_ci .align 32 1115e1051a39Sopenharmony_ci .global DES_encrypt1 1116e1051a39Sopenharmony_ci .type DES_encrypt1,#function 1117e1051a39Sopenharmony_ci 1118e1051a39Sopenharmony_ciDES_encrypt1: 1119e1051a39Sopenharmony_ci 1120e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1121e1051a39Sopenharmony_ci 1122e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1123e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1124e1051a39Sopenharmony_ci1: call .+8 1125e1051a39Sopenharmony_ci add %o7,global1,global1 1126e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1127e1051a39Sopenharmony_ci 1128e1051a39Sopenharmony_ci ld [in0], in5 ! left 1129e1051a39Sopenharmony_ci cmp in2, 0 ! enc 1130e1051a39Sopenharmony_ci 1131e1051a39Sopenharmony_ci be .encrypt.dec 1132e1051a39Sopenharmony_ci ld [in0+4], out5 ! right 1133e1051a39Sopenharmony_ci 1134e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1135e1051a39Sopenharmony_ci ! parameter 7 1 for move in1 to in3 1136e1051a39Sopenharmony_ci ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 1137e1051a39Sopenharmony_ci 1138e1051a39Sopenharmony_ci ip_macro(in5, out5, in5, out5, in3, 0, 1, 1) 1139e1051a39Sopenharmony_ci 1140e1051a39Sopenharmony_ci rounds_macro(in5, out5, 1, .des_encrypt1.1, in3, in4) ! in4 not used 1141e1051a39Sopenharmony_ci 1142e1051a39Sopenharmony_ci fp_macro(in5, out5, 1) ! 1 for store to [in0] 1143e1051a39Sopenharmony_ci 1144e1051a39Sopenharmony_ci ret 1145e1051a39Sopenharmony_ci restore 1146e1051a39Sopenharmony_ci 1147e1051a39Sopenharmony_ci.encrypt.dec: 1148e1051a39Sopenharmony_ci 1149e1051a39Sopenharmony_ci add in1, 120, in3 ! use last subkey for first round 1150e1051a39Sopenharmony_ci 1151e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1152e1051a39Sopenharmony_ci ! parameter 7 1 for move in1 to in3 1153e1051a39Sopenharmony_ci ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 1154e1051a39Sopenharmony_ci 1155e1051a39Sopenharmony_ci ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include dec, ks in4 1156e1051a39Sopenharmony_ci 1157e1051a39Sopenharmony_ci fp_macro(out5, in5, 1) ! 1 for store to [in0] 1158e1051a39Sopenharmony_ci 1159e1051a39Sopenharmony_ci ret 1160e1051a39Sopenharmony_ci restore 1161e1051a39Sopenharmony_ci 1162e1051a39Sopenharmony_ci.DES_encrypt1.end: 1163e1051a39Sopenharmony_ci .size DES_encrypt1,.DES_encrypt1.end-DES_encrypt1 1164e1051a39Sopenharmony_ci 1165e1051a39Sopenharmony_ci 1166e1051a39Sopenharmony_ci! void DES_encrypt2(data, ks, enc) 1167e1051a39Sopenharmony_ci!********************************* 1168e1051a39Sopenharmony_ci 1169e1051a39Sopenharmony_ci ! encrypts/decrypts without initial/final permutation 1170e1051a39Sopenharmony_ci 1171e1051a39Sopenharmony_ci .align 32 1172e1051a39Sopenharmony_ci .global DES_encrypt2 1173e1051a39Sopenharmony_ci .type DES_encrypt2,#function 1174e1051a39Sopenharmony_ci 1175e1051a39Sopenharmony_ciDES_encrypt2: 1176e1051a39Sopenharmony_ci 1177e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1178e1051a39Sopenharmony_ci 1179e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1180e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1181e1051a39Sopenharmony_ci1: call .+8 1182e1051a39Sopenharmony_ci add %o7,global1,global1 1183e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1184e1051a39Sopenharmony_ci 1185e1051a39Sopenharmony_ci ! Set sbox address 1 to 6 and rotate halves 3 left 1186e1051a39Sopenharmony_ci ! Errors caught by destest? Yes. Still? *NO* 1187e1051a39Sopenharmony_ci 1188e1051a39Sopenharmony_ci !sethi %hi(DES_SPtrans), global1 ! address sbox 1 1189e1051a39Sopenharmony_ci 1190e1051a39Sopenharmony_ci !or global1, %lo(DES_SPtrans), global1 ! sbox 1 1191e1051a39Sopenharmony_ci 1192e1051a39Sopenharmony_ci add global1, 256, global2 ! sbox 2 1193e1051a39Sopenharmony_ci add global1, 512, global3 ! sbox 3 1194e1051a39Sopenharmony_ci 1195e1051a39Sopenharmony_ci ld [in0], out5 ! right 1196e1051a39Sopenharmony_ci add global1, 768, global4 ! sbox 4 1197e1051a39Sopenharmony_ci add global1, 1024, global5 ! sbox 5 1198e1051a39Sopenharmony_ci 1199e1051a39Sopenharmony_ci ld [in0+4], in5 ! left 1200e1051a39Sopenharmony_ci add global1, 1280, local6 ! sbox 6 1201e1051a39Sopenharmony_ci add global1, 1792, out3 ! sbox 8 1202e1051a39Sopenharmony_ci 1203e1051a39Sopenharmony_ci ! rotate 1204e1051a39Sopenharmony_ci 1205e1051a39Sopenharmony_ci sll in5, 3, local5 1206e1051a39Sopenharmony_ci mov in1, in3 ! key address to in3 1207e1051a39Sopenharmony_ci 1208e1051a39Sopenharmony_ci sll out5, 3, local7 1209e1051a39Sopenharmony_ci srl in5, 29, in5 1210e1051a39Sopenharmony_ci 1211e1051a39Sopenharmony_ci srl out5, 29, out5 1212e1051a39Sopenharmony_ci add in5, local5, in5 1213e1051a39Sopenharmony_ci 1214e1051a39Sopenharmony_ci add out5, local7, out5 1215e1051a39Sopenharmony_ci cmp in2, 0 1216e1051a39Sopenharmony_ci 1217e1051a39Sopenharmony_ci ! we use our own stackframe 1218e1051a39Sopenharmony_ci 1219e1051a39Sopenharmony_ci be .encrypt2.dec 1220e1051a39Sopenharmony_ci STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] 1221e1051a39Sopenharmony_ci 1222e1051a39Sopenharmony_ci ld [in3], out0 ! key 7531 first round 1223e1051a39Sopenharmony_ci mov LOOPS, out4 ! loop counter 1224e1051a39Sopenharmony_ci 1225e1051a39Sopenharmony_ci ld [in3+4], out1 ! key 8642 first round 1226e1051a39Sopenharmony_ci sethi %hi(0x0000FC00), local5 1227e1051a39Sopenharmony_ci 1228e1051a39Sopenharmony_ci call .des_enc 1229e1051a39Sopenharmony_ci mov in3, in4 1230e1051a39Sopenharmony_ci 1231e1051a39Sopenharmony_ci ! rotate 1232e1051a39Sopenharmony_ci sll in5, 29, in0 1233e1051a39Sopenharmony_ci srl in5, 3, in5 1234e1051a39Sopenharmony_ci sll out5, 29, in1 1235e1051a39Sopenharmony_ci add in5, in0, in5 1236e1051a39Sopenharmony_ci srl out5, 3, out5 1237e1051a39Sopenharmony_ci LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 1238e1051a39Sopenharmony_ci add out5, in1, out5 1239e1051a39Sopenharmony_ci st in5, [in0] 1240e1051a39Sopenharmony_ci st out5, [in0+4] 1241e1051a39Sopenharmony_ci 1242e1051a39Sopenharmony_ci ret 1243e1051a39Sopenharmony_ci restore 1244e1051a39Sopenharmony_ci 1245e1051a39Sopenharmony_ci 1246e1051a39Sopenharmony_ci.encrypt2.dec: 1247e1051a39Sopenharmony_ci 1248e1051a39Sopenharmony_ci add in3, 120, in4 1249e1051a39Sopenharmony_ci 1250e1051a39Sopenharmony_ci ld [in4], out0 ! key 7531 first round 1251e1051a39Sopenharmony_ci mov LOOPS, out4 ! loop counter 1252e1051a39Sopenharmony_ci 1253e1051a39Sopenharmony_ci ld [in4+4], out1 ! key 8642 first round 1254e1051a39Sopenharmony_ci sethi %hi(0x0000FC00), local5 1255e1051a39Sopenharmony_ci 1256e1051a39Sopenharmony_ci mov in5, local1 ! left expected in out5 1257e1051a39Sopenharmony_ci mov out5, in5 1258e1051a39Sopenharmony_ci 1259e1051a39Sopenharmony_ci call .des_dec 1260e1051a39Sopenharmony_ci mov local1, out5 1261e1051a39Sopenharmony_ci 1262e1051a39Sopenharmony_ci.encrypt2.finish: 1263e1051a39Sopenharmony_ci 1264e1051a39Sopenharmony_ci ! rotate 1265e1051a39Sopenharmony_ci sll in5, 29, in0 1266e1051a39Sopenharmony_ci srl in5, 3, in5 1267e1051a39Sopenharmony_ci sll out5, 29, in1 1268e1051a39Sopenharmony_ci add in5, in0, in5 1269e1051a39Sopenharmony_ci srl out5, 3, out5 1270e1051a39Sopenharmony_ci LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 1271e1051a39Sopenharmony_ci add out5, in1, out5 1272e1051a39Sopenharmony_ci st out5, [in0] 1273e1051a39Sopenharmony_ci st in5, [in0+4] 1274e1051a39Sopenharmony_ci 1275e1051a39Sopenharmony_ci ret 1276e1051a39Sopenharmony_ci restore 1277e1051a39Sopenharmony_ci 1278e1051a39Sopenharmony_ci.DES_encrypt2.end: 1279e1051a39Sopenharmony_ci .size DES_encrypt2, .DES_encrypt2.end-DES_encrypt2 1280e1051a39Sopenharmony_ci 1281e1051a39Sopenharmony_ci 1282e1051a39Sopenharmony_ci! void DES_encrypt3(data, ks1, ks2, ks3) 1283e1051a39Sopenharmony_ci! ************************************** 1284e1051a39Sopenharmony_ci 1285e1051a39Sopenharmony_ci .align 32 1286e1051a39Sopenharmony_ci .global DES_encrypt3 1287e1051a39Sopenharmony_ci .type DES_encrypt3,#function 1288e1051a39Sopenharmony_ci 1289e1051a39Sopenharmony_ciDES_encrypt3: 1290e1051a39Sopenharmony_ci 1291e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1292e1051a39Sopenharmony_ci 1293e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1294e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1295e1051a39Sopenharmony_ci1: call .+8 1296e1051a39Sopenharmony_ci add %o7,global1,global1 1297e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1298e1051a39Sopenharmony_ci 1299e1051a39Sopenharmony_ci ld [in0], in5 ! left 1300e1051a39Sopenharmony_ci add in2, 120, in4 ! ks2 1301e1051a39Sopenharmony_ci 1302e1051a39Sopenharmony_ci ld [in0+4], out5 ! right 1303e1051a39Sopenharmony_ci mov in3, in2 ! save ks3 1304e1051a39Sopenharmony_ci 1305e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1306e1051a39Sopenharmony_ci ! parameter 7 1 for mov in1 to in3 1307e1051a39Sopenharmony_ci ! parameter 8 1 for mov in3 to in4 1308e1051a39Sopenharmony_ci ! parameter 9 1 for load ks3 and ks2 to in4 and in3 1309e1051a39Sopenharmony_ci 1310e1051a39Sopenharmony_ci ip_macro(in5, out5, in5, out5, in3, 1, 1, 0, 0) 1311e1051a39Sopenharmony_ci 1312e1051a39Sopenharmony_ci call .des_dec 1313e1051a39Sopenharmony_ci mov in2, in3 ! preload ks3 1314e1051a39Sopenharmony_ci 1315e1051a39Sopenharmony_ci call .des_enc 1316e1051a39Sopenharmony_ci nop 1317e1051a39Sopenharmony_ci 1318e1051a39Sopenharmony_ci fp_macro(in5, out5, 1) 1319e1051a39Sopenharmony_ci 1320e1051a39Sopenharmony_ci ret 1321e1051a39Sopenharmony_ci restore 1322e1051a39Sopenharmony_ci 1323e1051a39Sopenharmony_ci.DES_encrypt3.end: 1324e1051a39Sopenharmony_ci .size DES_encrypt3,.DES_encrypt3.end-DES_encrypt3 1325e1051a39Sopenharmony_ci 1326e1051a39Sopenharmony_ci 1327e1051a39Sopenharmony_ci! void DES_decrypt3(data, ks1, ks2, ks3) 1328e1051a39Sopenharmony_ci! ************************************** 1329e1051a39Sopenharmony_ci 1330e1051a39Sopenharmony_ci .align 32 1331e1051a39Sopenharmony_ci .global DES_decrypt3 1332e1051a39Sopenharmony_ci .type DES_decrypt3,#function 1333e1051a39Sopenharmony_ci 1334e1051a39Sopenharmony_ciDES_decrypt3: 1335e1051a39Sopenharmony_ci 1336e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1337e1051a39Sopenharmony_ci 1338e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1339e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1340e1051a39Sopenharmony_ci1: call .+8 1341e1051a39Sopenharmony_ci add %o7,global1,global1 1342e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1343e1051a39Sopenharmony_ci 1344e1051a39Sopenharmony_ci ld [in0], in5 ! left 1345e1051a39Sopenharmony_ci add in3, 120, in4 ! ks3 1346e1051a39Sopenharmony_ci 1347e1051a39Sopenharmony_ci ld [in0+4], out5 ! right 1348e1051a39Sopenharmony_ci mov in2, in3 ! ks2 1349e1051a39Sopenharmony_ci 1350e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1351e1051a39Sopenharmony_ci ! parameter 7 1 for mov in1 to in3 1352e1051a39Sopenharmony_ci ! parameter 8 1 for mov in3 to in4 1353e1051a39Sopenharmony_ci ! parameter 9 1 for load ks3 and ks2 to in4 and in3 1354e1051a39Sopenharmony_ci 1355e1051a39Sopenharmony_ci ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 0) 1356e1051a39Sopenharmony_ci 1357e1051a39Sopenharmony_ci call .des_enc 1358e1051a39Sopenharmony_ci add in1, 120, in4 ! preload ks1 1359e1051a39Sopenharmony_ci 1360e1051a39Sopenharmony_ci call .des_dec 1361e1051a39Sopenharmony_ci nop 1362e1051a39Sopenharmony_ci 1363e1051a39Sopenharmony_ci fp_macro(out5, in5, 1) 1364e1051a39Sopenharmony_ci 1365e1051a39Sopenharmony_ci ret 1366e1051a39Sopenharmony_ci restore 1367e1051a39Sopenharmony_ci 1368e1051a39Sopenharmony_ci.DES_decrypt3.end: 1369e1051a39Sopenharmony_ci .size DES_decrypt3,.DES_decrypt3.end-DES_decrypt3 1370e1051a39Sopenharmony_ci 1371e1051a39Sopenharmony_ci! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc) 1372e1051a39Sopenharmony_ci! ***************************************************************** 1373e1051a39Sopenharmony_ci 1374e1051a39Sopenharmony_ci 1375e1051a39Sopenharmony_ci .align 32 1376e1051a39Sopenharmony_ci .global DES_ncbc_encrypt 1377e1051a39Sopenharmony_ci .type DES_ncbc_encrypt,#function 1378e1051a39Sopenharmony_ci 1379e1051a39Sopenharmony_ciDES_ncbc_encrypt: 1380e1051a39Sopenharmony_ci 1381e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1382e1051a39Sopenharmony_ci 1383e1051a39Sopenharmony_ci define({INPUT}, { [%sp+BIAS+ARG0+0*ARGSZ] }) 1384e1051a39Sopenharmony_ci define({OUTPUT}, { [%sp+BIAS+ARG0+1*ARGSZ] }) 1385e1051a39Sopenharmony_ci define({IVEC}, { [%sp+BIAS+ARG0+4*ARGSZ] }) 1386e1051a39Sopenharmony_ci 1387e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1388e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1389e1051a39Sopenharmony_ci1: call .+8 1390e1051a39Sopenharmony_ci add %o7,global1,global1 1391e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1392e1051a39Sopenharmony_ci 1393e1051a39Sopenharmony_ci cmp in5, 0 ! enc 1394e1051a39Sopenharmony_ci 1395e1051a39Sopenharmony_ci be .ncbc.dec 1396e1051a39Sopenharmony_ci STPTR in4, IVEC 1397e1051a39Sopenharmony_ci 1398e1051a39Sopenharmony_ci ! addr left right temp label 1399e1051a39Sopenharmony_ci load_little_endian(in4, in5, out5, local3, .LLE1) ! iv 1400e1051a39Sopenharmony_ci 1401e1051a39Sopenharmony_ci addcc in2, -8, in2 ! bytes missing when first block done 1402e1051a39Sopenharmony_ci 1403e1051a39Sopenharmony_ci bl .ncbc.enc.seven.or.less 1404e1051a39Sopenharmony_ci mov in3, in4 ! schedule 1405e1051a39Sopenharmony_ci 1406e1051a39Sopenharmony_ci.ncbc.enc.next.block: 1407e1051a39Sopenharmony_ci 1408e1051a39Sopenharmony_ci load_little_endian(in0, out4, global4, local3, .LLE2) ! block 1409e1051a39Sopenharmony_ci 1410e1051a39Sopenharmony_ci.ncbc.enc.next.block_1: 1411e1051a39Sopenharmony_ci 1412e1051a39Sopenharmony_ci xor in5, out4, in5 ! iv xor 1413e1051a39Sopenharmony_ci xor out5, global4, out5 ! iv xor 1414e1051a39Sopenharmony_ci 1415e1051a39Sopenharmony_ci ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 1416e1051a39Sopenharmony_ci ip_macro(in5, out5, in5, out5, in3, 0, 0, 2) 1417e1051a39Sopenharmony_ci 1418e1051a39Sopenharmony_ci.ncbc.enc.next.block_2: 1419e1051a39Sopenharmony_ci 1420e1051a39Sopenharmony_ci!// call .des_enc ! compares in2 to 8 1421e1051a39Sopenharmony_ci! rounds inlined for alignment purposes 1422e1051a39Sopenharmony_ci 1423e1051a39Sopenharmony_ci add global1, 768, global4 ! address sbox 4 since register used below 1424e1051a39Sopenharmony_ci 1425e1051a39Sopenharmony_ci rounds_macro(in5, out5, 1, .ncbc.enc.1, in3, in4) ! include encryption ks in3 1426e1051a39Sopenharmony_ci 1427e1051a39Sopenharmony_ci bl .ncbc.enc.next.block_fp 1428e1051a39Sopenharmony_ci add in0, 8, in0 ! input address 1429e1051a39Sopenharmony_ci 1430e1051a39Sopenharmony_ci ! If 8 or more bytes are to be encrypted after this block, 1431e1051a39Sopenharmony_ci ! we combine final permutation for this block with initial 1432e1051a39Sopenharmony_ci ! permutation for next block. Load next block: 1433e1051a39Sopenharmony_ci 1434e1051a39Sopenharmony_ci load_little_endian(in0, global3, global4, local5, .LLE12) 1435e1051a39Sopenharmony_ci 1436e1051a39Sopenharmony_ci ! parameter 1 original left 1437e1051a39Sopenharmony_ci ! parameter 2 original right 1438e1051a39Sopenharmony_ci ! parameter 3 left ip 1439e1051a39Sopenharmony_ci ! parameter 4 right ip 1440e1051a39Sopenharmony_ci ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 1441e1051a39Sopenharmony_ci ! 2: mov in4 to in3 1442e1051a39Sopenharmony_ci ! 1443e1051a39Sopenharmony_ci ! also adds -8 to length in2 and loads loop counter to out4 1444e1051a39Sopenharmony_ci 1445e1051a39Sopenharmony_ci fp_ip_macro(out0, out1, global3, global4, 2) 1446e1051a39Sopenharmony_ci 1447e1051a39Sopenharmony_ci store_little_endian(in1, out0, out1, local3, .SLE10) ! block 1448e1051a39Sopenharmony_ci 1449e1051a39Sopenharmony_ci ld [in3], out0 ! key 7531 first round next block 1450e1051a39Sopenharmony_ci mov in5, local1 1451e1051a39Sopenharmony_ci xor global3, out5, in5 ! iv xor next block 1452e1051a39Sopenharmony_ci 1453e1051a39Sopenharmony_ci ld [in3+4], out1 ! key 8642 1454e1051a39Sopenharmony_ci add global1, 512, global3 ! address sbox 3 since register used 1455e1051a39Sopenharmony_ci xor global4, local1, out5 ! iv xor next block 1456e1051a39Sopenharmony_ci 1457e1051a39Sopenharmony_ci ba .ncbc.enc.next.block_2 1458e1051a39Sopenharmony_ci add in1, 8, in1 ! output address 1459e1051a39Sopenharmony_ci 1460e1051a39Sopenharmony_ci.ncbc.enc.next.block_fp: 1461e1051a39Sopenharmony_ci 1462e1051a39Sopenharmony_ci fp_macro(in5, out5) 1463e1051a39Sopenharmony_ci 1464e1051a39Sopenharmony_ci store_little_endian(in1, in5, out5, local3, .SLE1) ! block 1465e1051a39Sopenharmony_ci 1466e1051a39Sopenharmony_ci addcc in2, -8, in2 ! bytes missing when next block done 1467e1051a39Sopenharmony_ci 1468e1051a39Sopenharmony_ci bpos .ncbc.enc.next.block 1469e1051a39Sopenharmony_ci add in1, 8, in1 1470e1051a39Sopenharmony_ci 1471e1051a39Sopenharmony_ci.ncbc.enc.seven.or.less: 1472e1051a39Sopenharmony_ci 1473e1051a39Sopenharmony_ci cmp in2, -8 1474e1051a39Sopenharmony_ci 1475e1051a39Sopenharmony_ci ble .ncbc.enc.finish 1476e1051a39Sopenharmony_ci nop 1477e1051a39Sopenharmony_ci 1478e1051a39Sopenharmony_ci add in2, 8, local1 ! bytes to load 1479e1051a39Sopenharmony_ci 1480e1051a39Sopenharmony_ci ! addr, length, dest left, dest right, temp, temp2, label, ret label 1481e1051a39Sopenharmony_ci load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB1, .ncbc.enc.next.block_1) 1482e1051a39Sopenharmony_ci 1483e1051a39Sopenharmony_ci ! Loads 1 to 7 bytes little endian to global4, out4 1484e1051a39Sopenharmony_ci 1485e1051a39Sopenharmony_ci 1486e1051a39Sopenharmony_ci.ncbc.enc.finish: 1487e1051a39Sopenharmony_ci 1488e1051a39Sopenharmony_ci LDPTR IVEC, local4 1489e1051a39Sopenharmony_ci store_little_endian(local4, in5, out5, local5, .SLE2) ! ivec 1490e1051a39Sopenharmony_ci 1491e1051a39Sopenharmony_ci ret 1492e1051a39Sopenharmony_ci restore 1493e1051a39Sopenharmony_ci 1494e1051a39Sopenharmony_ci 1495e1051a39Sopenharmony_ci.ncbc.dec: 1496e1051a39Sopenharmony_ci 1497e1051a39Sopenharmony_ci STPTR in0, INPUT 1498e1051a39Sopenharmony_ci cmp in2, 0 ! length 1499e1051a39Sopenharmony_ci add in3, 120, in3 1500e1051a39Sopenharmony_ci 1501e1051a39Sopenharmony_ci LDPTR IVEC, local7 ! ivec 1502e1051a39Sopenharmony_ci ble .ncbc.dec.finish 1503e1051a39Sopenharmony_ci mov in3, in4 ! schedule 1504e1051a39Sopenharmony_ci 1505e1051a39Sopenharmony_ci STPTR in1, OUTPUT 1506e1051a39Sopenharmony_ci mov in0, local5 ! input 1507e1051a39Sopenharmony_ci 1508e1051a39Sopenharmony_ci load_little_endian(local7, in0, in1, local3, .LLE3) ! ivec 1509e1051a39Sopenharmony_ci 1510e1051a39Sopenharmony_ci.ncbc.dec.next.block: 1511e1051a39Sopenharmony_ci 1512e1051a39Sopenharmony_ci load_little_endian(local5, in5, out5, local3, .LLE4) ! block 1513e1051a39Sopenharmony_ci 1514e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1515e1051a39Sopenharmony_ci ! parameter 7 1 for mov in1 to in3 1516e1051a39Sopenharmony_ci ! parameter 8 1 for mov in3 to in4 1517e1051a39Sopenharmony_ci 1518e1051a39Sopenharmony_ci ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include decryption ks in4 1519e1051a39Sopenharmony_ci 1520e1051a39Sopenharmony_ci fp_macro(out5, in5, 0, 1) ! 1 for input and output address to local5/7 1521e1051a39Sopenharmony_ci 1522e1051a39Sopenharmony_ci ! in2 is bytes left to be stored 1523e1051a39Sopenharmony_ci ! in2 is compared to 8 in the rounds 1524e1051a39Sopenharmony_ci 1525e1051a39Sopenharmony_ci xor out5, in0, out4 ! iv xor 1526e1051a39Sopenharmony_ci bl .ncbc.dec.seven.or.less 1527e1051a39Sopenharmony_ci xor in5, in1, global4 ! iv xor 1528e1051a39Sopenharmony_ci 1529e1051a39Sopenharmony_ci ! Load ivec next block now, since input and output address might be the same. 1530e1051a39Sopenharmony_ci 1531e1051a39Sopenharmony_ci load_little_endian_inc(local5, in0, in1, local3, .LLE5) ! iv 1532e1051a39Sopenharmony_ci 1533e1051a39Sopenharmony_ci store_little_endian(local7, out4, global4, local3, .SLE3) 1534e1051a39Sopenharmony_ci 1535e1051a39Sopenharmony_ci STPTR local5, INPUT 1536e1051a39Sopenharmony_ci add local7, 8, local7 1537e1051a39Sopenharmony_ci addcc in2, -8, in2 1538e1051a39Sopenharmony_ci 1539e1051a39Sopenharmony_ci bg .ncbc.dec.next.block 1540e1051a39Sopenharmony_ci STPTR local7, OUTPUT 1541e1051a39Sopenharmony_ci 1542e1051a39Sopenharmony_ci 1543e1051a39Sopenharmony_ci.ncbc.dec.store.iv: 1544e1051a39Sopenharmony_ci 1545e1051a39Sopenharmony_ci LDPTR IVEC, local4 ! ivec 1546e1051a39Sopenharmony_ci store_little_endian(local4, in0, in1, local5, .SLE4) 1547e1051a39Sopenharmony_ci 1548e1051a39Sopenharmony_ci.ncbc.dec.finish: 1549e1051a39Sopenharmony_ci 1550e1051a39Sopenharmony_ci ret 1551e1051a39Sopenharmony_ci restore 1552e1051a39Sopenharmony_ci 1553e1051a39Sopenharmony_ci.ncbc.dec.seven.or.less: 1554e1051a39Sopenharmony_ci 1555e1051a39Sopenharmony_ci load_little_endian_inc(local5, in0, in1, local3, .LLE13) ! ivec 1556e1051a39Sopenharmony_ci 1557e1051a39Sopenharmony_ci store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB1, .ncbc.dec.store.iv) 1558e1051a39Sopenharmony_ci 1559e1051a39Sopenharmony_ci 1560e1051a39Sopenharmony_ci.DES_ncbc_encrypt.end: 1561e1051a39Sopenharmony_ci .size DES_ncbc_encrypt, .DES_ncbc_encrypt.end-DES_ncbc_encrypt 1562e1051a39Sopenharmony_ci 1563e1051a39Sopenharmony_ci 1564e1051a39Sopenharmony_ci! void DES_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, enc) 1565e1051a39Sopenharmony_ci! ************************************************************************** 1566e1051a39Sopenharmony_ci 1567e1051a39Sopenharmony_ci 1568e1051a39Sopenharmony_ci .align 32 1569e1051a39Sopenharmony_ci .global DES_ede3_cbc_encrypt 1570e1051a39Sopenharmony_ci .type DES_ede3_cbc_encrypt,#function 1571e1051a39Sopenharmony_ci 1572e1051a39Sopenharmony_ciDES_ede3_cbc_encrypt: 1573e1051a39Sopenharmony_ci 1574e1051a39Sopenharmony_ci save %sp, FRAME, %sp 1575e1051a39Sopenharmony_ci 1576e1051a39Sopenharmony_ci define({KS1}, { [%sp+BIAS+ARG0+3*ARGSZ] }) 1577e1051a39Sopenharmony_ci define({KS2}, { [%sp+BIAS+ARG0+4*ARGSZ] }) 1578e1051a39Sopenharmony_ci define({KS3}, { [%sp+BIAS+ARG0+5*ARGSZ] }) 1579e1051a39Sopenharmony_ci 1580e1051a39Sopenharmony_ci sethi %hi(.PIC.DES_SPtrans-1f),global1 1581e1051a39Sopenharmony_ci or global1,%lo(.PIC.DES_SPtrans-1f),global1 1582e1051a39Sopenharmony_ci1: call .+8 1583e1051a39Sopenharmony_ci add %o7,global1,global1 1584e1051a39Sopenharmony_ci sub global1,.PIC.DES_SPtrans-.des_and,out2 1585e1051a39Sopenharmony_ci 1586e1051a39Sopenharmony_ci LDPTR [%fp+BIAS+ARG0+7*ARGSZ], local3 ! enc 1587e1051a39Sopenharmony_ci LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 1588e1051a39Sopenharmony_ci cmp local3, 0 ! enc 1589e1051a39Sopenharmony_ci 1590e1051a39Sopenharmony_ci be .ede3.dec 1591e1051a39Sopenharmony_ci STPTR in4, KS2 1592e1051a39Sopenharmony_ci 1593e1051a39Sopenharmony_ci STPTR in5, KS3 1594e1051a39Sopenharmony_ci 1595e1051a39Sopenharmony_ci load_little_endian(local4, in5, out5, local3, .LLE6) ! ivec 1596e1051a39Sopenharmony_ci 1597e1051a39Sopenharmony_ci addcc in2, -8, in2 ! bytes missing after next block 1598e1051a39Sopenharmony_ci 1599e1051a39Sopenharmony_ci bl .ede3.enc.seven.or.less 1600e1051a39Sopenharmony_ci STPTR in3, KS1 1601e1051a39Sopenharmony_ci 1602e1051a39Sopenharmony_ci.ede3.enc.next.block: 1603e1051a39Sopenharmony_ci 1604e1051a39Sopenharmony_ci load_little_endian(in0, out4, global4, local3, .LLE7) 1605e1051a39Sopenharmony_ci 1606e1051a39Sopenharmony_ci.ede3.enc.next.block_1: 1607e1051a39Sopenharmony_ci 1608e1051a39Sopenharmony_ci LDPTR KS2, in4 1609e1051a39Sopenharmony_ci xor in5, out4, in5 ! iv xor 1610e1051a39Sopenharmony_ci xor out5, global4, out5 ! iv xor 1611e1051a39Sopenharmony_ci 1612e1051a39Sopenharmony_ci LDPTR KS1, in3 1613e1051a39Sopenharmony_ci add in4, 120, in4 ! for decryption we use last subkey first 1614e1051a39Sopenharmony_ci nop 1615e1051a39Sopenharmony_ci 1616e1051a39Sopenharmony_ci ip_macro(in5, out5, in5, out5, in3) 1617e1051a39Sopenharmony_ci 1618e1051a39Sopenharmony_ci.ede3.enc.next.block_2: 1619e1051a39Sopenharmony_ci 1620e1051a39Sopenharmony_ci call .des_enc ! ks1 in3 1621e1051a39Sopenharmony_ci nop 1622e1051a39Sopenharmony_ci 1623e1051a39Sopenharmony_ci call .des_dec ! ks2 in4 1624e1051a39Sopenharmony_ci LDPTR KS3, in3 1625e1051a39Sopenharmony_ci 1626e1051a39Sopenharmony_ci call .des_enc ! ks3 in3 compares in2 to 8 1627e1051a39Sopenharmony_ci nop 1628e1051a39Sopenharmony_ci 1629e1051a39Sopenharmony_ci bl .ede3.enc.next.block_fp 1630e1051a39Sopenharmony_ci add in0, 8, in0 1631e1051a39Sopenharmony_ci 1632e1051a39Sopenharmony_ci ! If 8 or more bytes are to be encrypted after this block, 1633e1051a39Sopenharmony_ci ! we combine final permutation for this block with initial 1634e1051a39Sopenharmony_ci ! permutation for next block. Load next block: 1635e1051a39Sopenharmony_ci 1636e1051a39Sopenharmony_ci load_little_endian(in0, global3, global4, local5, .LLE11) 1637e1051a39Sopenharmony_ci 1638e1051a39Sopenharmony_ci ! parameter 1 original left 1639e1051a39Sopenharmony_ci ! parameter 2 original right 1640e1051a39Sopenharmony_ci ! parameter 3 left ip 1641e1051a39Sopenharmony_ci ! parameter 4 right ip 1642e1051a39Sopenharmony_ci ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 1643e1051a39Sopenharmony_ci ! 2: mov in4 to in3 1644e1051a39Sopenharmony_ci ! 1645e1051a39Sopenharmony_ci ! also adds -8 to length in2 and loads loop counter to out4 1646e1051a39Sopenharmony_ci 1647e1051a39Sopenharmony_ci fp_ip_macro(out0, out1, global3, global4, 1) 1648e1051a39Sopenharmony_ci 1649e1051a39Sopenharmony_ci store_little_endian(in1, out0, out1, local3, .SLE9) ! block 1650e1051a39Sopenharmony_ci 1651e1051a39Sopenharmony_ci mov in5, local1 1652e1051a39Sopenharmony_ci xor global3, out5, in5 ! iv xor next block 1653e1051a39Sopenharmony_ci 1654e1051a39Sopenharmony_ci ld [in3], out0 ! key 7531 1655e1051a39Sopenharmony_ci add global1, 512, global3 ! address sbox 3 1656e1051a39Sopenharmony_ci xor global4, local1, out5 ! iv xor next block 1657e1051a39Sopenharmony_ci 1658e1051a39Sopenharmony_ci ld [in3+4], out1 ! key 8642 1659e1051a39Sopenharmony_ci add global1, 768, global4 ! address sbox 4 1660e1051a39Sopenharmony_ci ba .ede3.enc.next.block_2 1661e1051a39Sopenharmony_ci add in1, 8, in1 1662e1051a39Sopenharmony_ci 1663e1051a39Sopenharmony_ci.ede3.enc.next.block_fp: 1664e1051a39Sopenharmony_ci 1665e1051a39Sopenharmony_ci fp_macro(in5, out5) 1666e1051a39Sopenharmony_ci 1667e1051a39Sopenharmony_ci store_little_endian(in1, in5, out5, local3, .SLE5) ! block 1668e1051a39Sopenharmony_ci 1669e1051a39Sopenharmony_ci addcc in2, -8, in2 ! bytes missing when next block done 1670e1051a39Sopenharmony_ci 1671e1051a39Sopenharmony_ci bpos .ede3.enc.next.block 1672e1051a39Sopenharmony_ci add in1, 8, in1 1673e1051a39Sopenharmony_ci 1674e1051a39Sopenharmony_ci.ede3.enc.seven.or.less: 1675e1051a39Sopenharmony_ci 1676e1051a39Sopenharmony_ci cmp in2, -8 1677e1051a39Sopenharmony_ci 1678e1051a39Sopenharmony_ci ble .ede3.enc.finish 1679e1051a39Sopenharmony_ci nop 1680e1051a39Sopenharmony_ci 1681e1051a39Sopenharmony_ci add in2, 8, local1 ! bytes to load 1682e1051a39Sopenharmony_ci 1683e1051a39Sopenharmony_ci ! addr, length, dest left, dest right, temp, temp2, label, ret label 1684e1051a39Sopenharmony_ci load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB2, .ede3.enc.next.block_1) 1685e1051a39Sopenharmony_ci 1686e1051a39Sopenharmony_ci.ede3.enc.finish: 1687e1051a39Sopenharmony_ci 1688e1051a39Sopenharmony_ci LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 1689e1051a39Sopenharmony_ci store_little_endian(local4, in5, out5, local5, .SLE6) ! ivec 1690e1051a39Sopenharmony_ci 1691e1051a39Sopenharmony_ci ret 1692e1051a39Sopenharmony_ci restore 1693e1051a39Sopenharmony_ci 1694e1051a39Sopenharmony_ci.ede3.dec: 1695e1051a39Sopenharmony_ci 1696e1051a39Sopenharmony_ci STPTR in0, INPUT 1697e1051a39Sopenharmony_ci add in5, 120, in5 1698e1051a39Sopenharmony_ci 1699e1051a39Sopenharmony_ci STPTR in1, OUTPUT 1700e1051a39Sopenharmony_ci mov in0, local5 1701e1051a39Sopenharmony_ci add in3, 120, in3 1702e1051a39Sopenharmony_ci 1703e1051a39Sopenharmony_ci STPTR in3, KS1 1704e1051a39Sopenharmony_ci cmp in2, 0 1705e1051a39Sopenharmony_ci 1706e1051a39Sopenharmony_ci ble .ede3.dec.finish 1707e1051a39Sopenharmony_ci STPTR in5, KS3 1708e1051a39Sopenharmony_ci 1709e1051a39Sopenharmony_ci LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local7 ! iv 1710e1051a39Sopenharmony_ci load_little_endian(local7, in0, in1, local3, .LLE8) 1711e1051a39Sopenharmony_ci 1712e1051a39Sopenharmony_ci.ede3.dec.next.block: 1713e1051a39Sopenharmony_ci 1714e1051a39Sopenharmony_ci load_little_endian(local5, in5, out5, local3, .LLE9) 1715e1051a39Sopenharmony_ci 1716e1051a39Sopenharmony_ci ! parameter 6 1/2 for include encryption/decryption 1717e1051a39Sopenharmony_ci ! parameter 7 1 for mov in1 to in3 1718e1051a39Sopenharmony_ci ! parameter 8 1 for mov in3 to in4 1719e1051a39Sopenharmony_ci ! parameter 9 1 for load ks3 and ks2 to in4 and in3 1720e1051a39Sopenharmony_ci 1721e1051a39Sopenharmony_ci ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 1) ! inc .des_dec ks3 in4 1722e1051a39Sopenharmony_ci 1723e1051a39Sopenharmony_ci call .des_enc ! ks2 in3 1724e1051a39Sopenharmony_ci LDPTR KS1, in4 1725e1051a39Sopenharmony_ci 1726e1051a39Sopenharmony_ci call .des_dec ! ks1 in4 1727e1051a39Sopenharmony_ci nop 1728e1051a39Sopenharmony_ci 1729e1051a39Sopenharmony_ci fp_macro(out5, in5, 0, 1) ! 1 for input and output address local5/7 1730e1051a39Sopenharmony_ci 1731e1051a39Sopenharmony_ci ! in2 is bytes left to be stored 1732e1051a39Sopenharmony_ci ! in2 is compared to 8 in the rounds 1733e1051a39Sopenharmony_ci 1734e1051a39Sopenharmony_ci xor out5, in0, out4 1735e1051a39Sopenharmony_ci bl .ede3.dec.seven.or.less 1736e1051a39Sopenharmony_ci xor in5, in1, global4 1737e1051a39Sopenharmony_ci 1738e1051a39Sopenharmony_ci load_little_endian_inc(local5, in0, in1, local3, .LLE10) ! iv next block 1739e1051a39Sopenharmony_ci 1740e1051a39Sopenharmony_ci store_little_endian(local7, out4, global4, local3, .SLE7) ! block 1741e1051a39Sopenharmony_ci 1742e1051a39Sopenharmony_ci STPTR local5, INPUT 1743e1051a39Sopenharmony_ci addcc in2, -8, in2 1744e1051a39Sopenharmony_ci add local7, 8, local7 1745e1051a39Sopenharmony_ci 1746e1051a39Sopenharmony_ci bg .ede3.dec.next.block 1747e1051a39Sopenharmony_ci STPTR local7, OUTPUT 1748e1051a39Sopenharmony_ci 1749e1051a39Sopenharmony_ci.ede3.dec.store.iv: 1750e1051a39Sopenharmony_ci 1751e1051a39Sopenharmony_ci LDPTR [%fp+BIAS+ARG0+6*ARGSZ], local4 ! ivec 1752e1051a39Sopenharmony_ci store_little_endian(local4, in0, in1, local5, .SLE8) ! ivec 1753e1051a39Sopenharmony_ci 1754e1051a39Sopenharmony_ci.ede3.dec.finish: 1755e1051a39Sopenharmony_ci 1756e1051a39Sopenharmony_ci ret 1757e1051a39Sopenharmony_ci restore 1758e1051a39Sopenharmony_ci 1759e1051a39Sopenharmony_ci.ede3.dec.seven.or.less: 1760e1051a39Sopenharmony_ci 1761e1051a39Sopenharmony_ci load_little_endian_inc(local5, in0, in1, local3, .LLE14) ! iv 1762e1051a39Sopenharmony_ci 1763e1051a39Sopenharmony_ci store_n_bytes(local7, in2, global4, out4, local3, local4, .SNB2, .ede3.dec.store.iv) 1764e1051a39Sopenharmony_ci 1765e1051a39Sopenharmony_ci 1766e1051a39Sopenharmony_ci.DES_ede3_cbc_encrypt.end: 1767e1051a39Sopenharmony_ci .size DES_ede3_cbc_encrypt,.DES_ede3_cbc_encrypt.end-DES_ede3_cbc_encrypt 1768e1051a39Sopenharmony_ci 1769e1051a39Sopenharmony_ci .align 256 1770e1051a39Sopenharmony_ci .type .des_and,#object 1771e1051a39Sopenharmony_ci .size .des_and,284 1772e1051a39Sopenharmony_ci 1773e1051a39Sopenharmony_ci.des_and: 1774e1051a39Sopenharmony_ci 1775e1051a39Sopenharmony_ci! This table is used for AND 0xFC when it is known that register 1776e1051a39Sopenharmony_ci! bits 8-31 are zero. Makes it possible to do three arithmetic 1777e1051a39Sopenharmony_ci! operations in one cycle. 1778e1051a39Sopenharmony_ci 1779e1051a39Sopenharmony_ci .byte 0, 0, 0, 0, 4, 4, 4, 4 1780e1051a39Sopenharmony_ci .byte 8, 8, 8, 8, 12, 12, 12, 12 1781e1051a39Sopenharmony_ci .byte 16, 16, 16, 16, 20, 20, 20, 20 1782e1051a39Sopenharmony_ci .byte 24, 24, 24, 24, 28, 28, 28, 28 1783e1051a39Sopenharmony_ci .byte 32, 32, 32, 32, 36, 36, 36, 36 1784e1051a39Sopenharmony_ci .byte 40, 40, 40, 40, 44, 44, 44, 44 1785e1051a39Sopenharmony_ci .byte 48, 48, 48, 48, 52, 52, 52, 52 1786e1051a39Sopenharmony_ci .byte 56, 56, 56, 56, 60, 60, 60, 60 1787e1051a39Sopenharmony_ci .byte 64, 64, 64, 64, 68, 68, 68, 68 1788e1051a39Sopenharmony_ci .byte 72, 72, 72, 72, 76, 76, 76, 76 1789e1051a39Sopenharmony_ci .byte 80, 80, 80, 80, 84, 84, 84, 84 1790e1051a39Sopenharmony_ci .byte 88, 88, 88, 88, 92, 92, 92, 92 1791e1051a39Sopenharmony_ci .byte 96, 96, 96, 96, 100, 100, 100, 100 1792e1051a39Sopenharmony_ci .byte 104, 104, 104, 104, 108, 108, 108, 108 1793e1051a39Sopenharmony_ci .byte 112, 112, 112, 112, 116, 116, 116, 116 1794e1051a39Sopenharmony_ci .byte 120, 120, 120, 120, 124, 124, 124, 124 1795e1051a39Sopenharmony_ci .byte 128, 128, 128, 128, 132, 132, 132, 132 1796e1051a39Sopenharmony_ci .byte 136, 136, 136, 136, 140, 140, 140, 140 1797e1051a39Sopenharmony_ci .byte 144, 144, 144, 144, 148, 148, 148, 148 1798e1051a39Sopenharmony_ci .byte 152, 152, 152, 152, 156, 156, 156, 156 1799e1051a39Sopenharmony_ci .byte 160, 160, 160, 160, 164, 164, 164, 164 1800e1051a39Sopenharmony_ci .byte 168, 168, 168, 168, 172, 172, 172, 172 1801e1051a39Sopenharmony_ci .byte 176, 176, 176, 176, 180, 180, 180, 180 1802e1051a39Sopenharmony_ci .byte 184, 184, 184, 184, 188, 188, 188, 188 1803e1051a39Sopenharmony_ci .byte 192, 192, 192, 192, 196, 196, 196, 196 1804e1051a39Sopenharmony_ci .byte 200, 200, 200, 200, 204, 204, 204, 204 1805e1051a39Sopenharmony_ci .byte 208, 208, 208, 208, 212, 212, 212, 212 1806e1051a39Sopenharmony_ci .byte 216, 216, 216, 216, 220, 220, 220, 220 1807e1051a39Sopenharmony_ci .byte 224, 224, 224, 224, 228, 228, 228, 228 1808e1051a39Sopenharmony_ci .byte 232, 232, 232, 232, 236, 236, 236, 236 1809e1051a39Sopenharmony_ci .byte 240, 240, 240, 240, 244, 244, 244, 244 1810e1051a39Sopenharmony_ci .byte 248, 248, 248, 248, 252, 252, 252, 252 1811e1051a39Sopenharmony_ci 1812e1051a39Sopenharmony_ci ! 5 numbers for initial/final permutation 1813e1051a39Sopenharmony_ci 1814e1051a39Sopenharmony_ci .word 0x0f0f0f0f ! offset 256 1815e1051a39Sopenharmony_ci .word 0x0000ffff ! 260 1816e1051a39Sopenharmony_ci .word 0x33333333 ! 264 1817e1051a39Sopenharmony_ci .word 0x00ff00ff ! 268 1818e1051a39Sopenharmony_ci .word 0x55555555 ! 272 1819e1051a39Sopenharmony_ci 1820e1051a39Sopenharmony_ci .word 0 ! 276 1821e1051a39Sopenharmony_ci .word LOOPS ! 280 1822e1051a39Sopenharmony_ci .word 0x0000FC00 ! 284 1823e1051a39Sopenharmony_ci 1824e1051a39Sopenharmony_ci .global DES_SPtrans 1825e1051a39Sopenharmony_ci .type DES_SPtrans,#object 1826e1051a39Sopenharmony_ci .size DES_SPtrans,2048 1827e1051a39Sopenharmony_ci.align 64 1828e1051a39Sopenharmony_ciDES_SPtrans: 1829e1051a39Sopenharmony_ci.PIC.DES_SPtrans: 1830e1051a39Sopenharmony_ci ! nibble 0 1831e1051a39Sopenharmony_ci .word 0x02080800, 0x00080000, 0x02000002, 0x02080802 1832e1051a39Sopenharmony_ci .word 0x02000000, 0x00080802, 0x00080002, 0x02000002 1833e1051a39Sopenharmony_ci .word 0x00080802, 0x02080800, 0x02080000, 0x00000802 1834e1051a39Sopenharmony_ci .word 0x02000802, 0x02000000, 0x00000000, 0x00080002 1835e1051a39Sopenharmony_ci .word 0x00080000, 0x00000002, 0x02000800, 0x00080800 1836e1051a39Sopenharmony_ci .word 0x02080802, 0x02080000, 0x00000802, 0x02000800 1837e1051a39Sopenharmony_ci .word 0x00000002, 0x00000800, 0x00080800, 0x02080002 1838e1051a39Sopenharmony_ci .word 0x00000800, 0x02000802, 0x02080002, 0x00000000 1839e1051a39Sopenharmony_ci .word 0x00000000, 0x02080802, 0x02000800, 0x00080002 1840e1051a39Sopenharmony_ci .word 0x02080800, 0x00080000, 0x00000802, 0x02000800 1841e1051a39Sopenharmony_ci .word 0x02080002, 0x00000800, 0x00080800, 0x02000002 1842e1051a39Sopenharmony_ci .word 0x00080802, 0x00000002, 0x02000002, 0x02080000 1843e1051a39Sopenharmony_ci .word 0x02080802, 0x00080800, 0x02080000, 0x02000802 1844e1051a39Sopenharmony_ci .word 0x02000000, 0x00000802, 0x00080002, 0x00000000 1845e1051a39Sopenharmony_ci .word 0x00080000, 0x02000000, 0x02000802, 0x02080800 1846e1051a39Sopenharmony_ci .word 0x00000002, 0x02080002, 0x00000800, 0x00080802 1847e1051a39Sopenharmony_ci ! nibble 1 1848e1051a39Sopenharmony_ci .word 0x40108010, 0x00000000, 0x00108000, 0x40100000 1849e1051a39Sopenharmony_ci .word 0x40000010, 0x00008010, 0x40008000, 0x00108000 1850e1051a39Sopenharmony_ci .word 0x00008000, 0x40100010, 0x00000010, 0x40008000 1851e1051a39Sopenharmony_ci .word 0x00100010, 0x40108000, 0x40100000, 0x00000010 1852e1051a39Sopenharmony_ci .word 0x00100000, 0x40008010, 0x40100010, 0x00008000 1853e1051a39Sopenharmony_ci .word 0x00108010, 0x40000000, 0x00000000, 0x00100010 1854e1051a39Sopenharmony_ci .word 0x40008010, 0x00108010, 0x40108000, 0x40000010 1855e1051a39Sopenharmony_ci .word 0x40000000, 0x00100000, 0x00008010, 0x40108010 1856e1051a39Sopenharmony_ci .word 0x00100010, 0x40108000, 0x40008000, 0x00108010 1857e1051a39Sopenharmony_ci .word 0x40108010, 0x00100010, 0x40000010, 0x00000000 1858e1051a39Sopenharmony_ci .word 0x40000000, 0x00008010, 0x00100000, 0x40100010 1859e1051a39Sopenharmony_ci .word 0x00008000, 0x40000000, 0x00108010, 0x40008010 1860e1051a39Sopenharmony_ci .word 0x40108000, 0x00008000, 0x00000000, 0x40000010 1861e1051a39Sopenharmony_ci .word 0x00000010, 0x40108010, 0x00108000, 0x40100000 1862e1051a39Sopenharmony_ci .word 0x40100010, 0x00100000, 0x00008010, 0x40008000 1863e1051a39Sopenharmony_ci .word 0x40008010, 0x00000010, 0x40100000, 0x00108000 1864e1051a39Sopenharmony_ci ! nibble 2 1865e1051a39Sopenharmony_ci .word 0x04000001, 0x04040100, 0x00000100, 0x04000101 1866e1051a39Sopenharmony_ci .word 0x00040001, 0x04000000, 0x04000101, 0x00040100 1867e1051a39Sopenharmony_ci .word 0x04000100, 0x00040000, 0x04040000, 0x00000001 1868e1051a39Sopenharmony_ci .word 0x04040101, 0x00000101, 0x00000001, 0x04040001 1869e1051a39Sopenharmony_ci .word 0x00000000, 0x00040001, 0x04040100, 0x00000100 1870e1051a39Sopenharmony_ci .word 0x00000101, 0x04040101, 0x00040000, 0x04000001 1871e1051a39Sopenharmony_ci .word 0x04040001, 0x04000100, 0x00040101, 0x04040000 1872e1051a39Sopenharmony_ci .word 0x00040100, 0x00000000, 0x04000000, 0x00040101 1873e1051a39Sopenharmony_ci .word 0x04040100, 0x00000100, 0x00000001, 0x00040000 1874e1051a39Sopenharmony_ci .word 0x00000101, 0x00040001, 0x04040000, 0x04000101 1875e1051a39Sopenharmony_ci .word 0x00000000, 0x04040100, 0x00040100, 0x04040001 1876e1051a39Sopenharmony_ci .word 0x00040001, 0x04000000, 0x04040101, 0x00000001 1877e1051a39Sopenharmony_ci .word 0x00040101, 0x04000001, 0x04000000, 0x04040101 1878e1051a39Sopenharmony_ci .word 0x00040000, 0x04000100, 0x04000101, 0x00040100 1879e1051a39Sopenharmony_ci .word 0x04000100, 0x00000000, 0x04040001, 0x00000101 1880e1051a39Sopenharmony_ci .word 0x04000001, 0x00040101, 0x00000100, 0x04040000 1881e1051a39Sopenharmony_ci ! nibble 3 1882e1051a39Sopenharmony_ci .word 0x00401008, 0x10001000, 0x00000008, 0x10401008 1883e1051a39Sopenharmony_ci .word 0x00000000, 0x10400000, 0x10001008, 0x00400008 1884e1051a39Sopenharmony_ci .word 0x10401000, 0x10000008, 0x10000000, 0x00001008 1885e1051a39Sopenharmony_ci .word 0x10000008, 0x00401008, 0x00400000, 0x10000000 1886e1051a39Sopenharmony_ci .word 0x10400008, 0x00401000, 0x00001000, 0x00000008 1887e1051a39Sopenharmony_ci .word 0x00401000, 0x10001008, 0x10400000, 0x00001000 1888e1051a39Sopenharmony_ci .word 0x00001008, 0x00000000, 0x00400008, 0x10401000 1889e1051a39Sopenharmony_ci .word 0x10001000, 0x10400008, 0x10401008, 0x00400000 1890e1051a39Sopenharmony_ci .word 0x10400008, 0x00001008, 0x00400000, 0x10000008 1891e1051a39Sopenharmony_ci .word 0x00401000, 0x10001000, 0x00000008, 0x10400000 1892e1051a39Sopenharmony_ci .word 0x10001008, 0x00000000, 0x00001000, 0x00400008 1893e1051a39Sopenharmony_ci .word 0x00000000, 0x10400008, 0x10401000, 0x00001000 1894e1051a39Sopenharmony_ci .word 0x10000000, 0x10401008, 0x00401008, 0x00400000 1895e1051a39Sopenharmony_ci .word 0x10401008, 0x00000008, 0x10001000, 0x00401008 1896e1051a39Sopenharmony_ci .word 0x00400008, 0x00401000, 0x10400000, 0x10001008 1897e1051a39Sopenharmony_ci .word 0x00001008, 0x10000000, 0x10000008, 0x10401000 1898e1051a39Sopenharmony_ci ! nibble 4 1899e1051a39Sopenharmony_ci .word 0x08000000, 0x00010000, 0x00000400, 0x08010420 1900e1051a39Sopenharmony_ci .word 0x08010020, 0x08000400, 0x00010420, 0x08010000 1901e1051a39Sopenharmony_ci .word 0x00010000, 0x00000020, 0x08000020, 0x00010400 1902e1051a39Sopenharmony_ci .word 0x08000420, 0x08010020, 0x08010400, 0x00000000 1903e1051a39Sopenharmony_ci .word 0x00010400, 0x08000000, 0x00010020, 0x00000420 1904e1051a39Sopenharmony_ci .word 0x08000400, 0x00010420, 0x00000000, 0x08000020 1905e1051a39Sopenharmony_ci .word 0x00000020, 0x08000420, 0x08010420, 0x00010020 1906e1051a39Sopenharmony_ci .word 0x08010000, 0x00000400, 0x00000420, 0x08010400 1907e1051a39Sopenharmony_ci .word 0x08010400, 0x08000420, 0x00010020, 0x08010000 1908e1051a39Sopenharmony_ci .word 0x00010000, 0x00000020, 0x08000020, 0x08000400 1909e1051a39Sopenharmony_ci .word 0x08000000, 0x00010400, 0x08010420, 0x00000000 1910e1051a39Sopenharmony_ci .word 0x00010420, 0x08000000, 0x00000400, 0x00010020 1911e1051a39Sopenharmony_ci .word 0x08000420, 0x00000400, 0x00000000, 0x08010420 1912e1051a39Sopenharmony_ci .word 0x08010020, 0x08010400, 0x00000420, 0x00010000 1913e1051a39Sopenharmony_ci .word 0x00010400, 0x08010020, 0x08000400, 0x00000420 1914e1051a39Sopenharmony_ci .word 0x00000020, 0x00010420, 0x08010000, 0x08000020 1915e1051a39Sopenharmony_ci ! nibble 5 1916e1051a39Sopenharmony_ci .word 0x80000040, 0x00200040, 0x00000000, 0x80202000 1917e1051a39Sopenharmony_ci .word 0x00200040, 0x00002000, 0x80002040, 0x00200000 1918e1051a39Sopenharmony_ci .word 0x00002040, 0x80202040, 0x00202000, 0x80000000 1919e1051a39Sopenharmony_ci .word 0x80002000, 0x80000040, 0x80200000, 0x00202040 1920e1051a39Sopenharmony_ci .word 0x00200000, 0x80002040, 0x80200040, 0x00000000 1921e1051a39Sopenharmony_ci .word 0x00002000, 0x00000040, 0x80202000, 0x80200040 1922e1051a39Sopenharmony_ci .word 0x80202040, 0x80200000, 0x80000000, 0x00002040 1923e1051a39Sopenharmony_ci .word 0x00000040, 0x00202000, 0x00202040, 0x80002000 1924e1051a39Sopenharmony_ci .word 0x00002040, 0x80000000, 0x80002000, 0x00202040 1925e1051a39Sopenharmony_ci .word 0x80202000, 0x00200040, 0x00000000, 0x80002000 1926e1051a39Sopenharmony_ci .word 0x80000000, 0x00002000, 0x80200040, 0x00200000 1927e1051a39Sopenharmony_ci .word 0x00200040, 0x80202040, 0x00202000, 0x00000040 1928e1051a39Sopenharmony_ci .word 0x80202040, 0x00202000, 0x00200000, 0x80002040 1929e1051a39Sopenharmony_ci .word 0x80000040, 0x80200000, 0x00202040, 0x00000000 1930e1051a39Sopenharmony_ci .word 0x00002000, 0x80000040, 0x80002040, 0x80202000 1931e1051a39Sopenharmony_ci .word 0x80200000, 0x00002040, 0x00000040, 0x80200040 1932e1051a39Sopenharmony_ci ! nibble 6 1933e1051a39Sopenharmony_ci .word 0x00004000, 0x00000200, 0x01000200, 0x01000004 1934e1051a39Sopenharmony_ci .word 0x01004204, 0x00004004, 0x00004200, 0x00000000 1935e1051a39Sopenharmony_ci .word 0x01000000, 0x01000204, 0x00000204, 0x01004000 1936e1051a39Sopenharmony_ci .word 0x00000004, 0x01004200, 0x01004000, 0x00000204 1937e1051a39Sopenharmony_ci .word 0x01000204, 0x00004000, 0x00004004, 0x01004204 1938e1051a39Sopenharmony_ci .word 0x00000000, 0x01000200, 0x01000004, 0x00004200 1939e1051a39Sopenharmony_ci .word 0x01004004, 0x00004204, 0x01004200, 0x00000004 1940e1051a39Sopenharmony_ci .word 0x00004204, 0x01004004, 0x00000200, 0x01000000 1941e1051a39Sopenharmony_ci .word 0x00004204, 0x01004000, 0x01004004, 0x00000204 1942e1051a39Sopenharmony_ci .word 0x00004000, 0x00000200, 0x01000000, 0x01004004 1943e1051a39Sopenharmony_ci .word 0x01000204, 0x00004204, 0x00004200, 0x00000000 1944e1051a39Sopenharmony_ci .word 0x00000200, 0x01000004, 0x00000004, 0x01000200 1945e1051a39Sopenharmony_ci .word 0x00000000, 0x01000204, 0x01000200, 0x00004200 1946e1051a39Sopenharmony_ci .word 0x00000204, 0x00004000, 0x01004204, 0x01000000 1947e1051a39Sopenharmony_ci .word 0x01004200, 0x00000004, 0x00004004, 0x01004204 1948e1051a39Sopenharmony_ci .word 0x01000004, 0x01004200, 0x01004000, 0x00004004 1949e1051a39Sopenharmony_ci ! nibble 7 1950e1051a39Sopenharmony_ci .word 0x20800080, 0x20820000, 0x00020080, 0x00000000 1951e1051a39Sopenharmony_ci .word 0x20020000, 0x00800080, 0x20800000, 0x20820080 1952e1051a39Sopenharmony_ci .word 0x00000080, 0x20000000, 0x00820000, 0x00020080 1953e1051a39Sopenharmony_ci .word 0x00820080, 0x20020080, 0x20000080, 0x20800000 1954e1051a39Sopenharmony_ci .word 0x00020000, 0x00820080, 0x00800080, 0x20020000 1955e1051a39Sopenharmony_ci .word 0x20820080, 0x20000080, 0x00000000, 0x00820000 1956e1051a39Sopenharmony_ci .word 0x20000000, 0x00800000, 0x20020080, 0x20800080 1957e1051a39Sopenharmony_ci .word 0x00800000, 0x00020000, 0x20820000, 0x00000080 1958e1051a39Sopenharmony_ci .word 0x00800000, 0x00020000, 0x20000080, 0x20820080 1959e1051a39Sopenharmony_ci .word 0x00020080, 0x20000000, 0x00000000, 0x00820000 1960e1051a39Sopenharmony_ci .word 0x20800080, 0x20020080, 0x20020000, 0x00800080 1961e1051a39Sopenharmony_ci .word 0x20820000, 0x00000080, 0x00800080, 0x20020000 1962e1051a39Sopenharmony_ci .word 0x20820080, 0x00800000, 0x20800000, 0x20000080 1963e1051a39Sopenharmony_ci .word 0x00820000, 0x00020080, 0x20020080, 0x20800000 1964e1051a39Sopenharmony_ci .word 0x00000080, 0x20820000, 0x00820080, 0x00000000 1965e1051a39Sopenharmony_ci .word 0x20000000, 0x20800080, 0x00020000, 0x00820080 1966e1051a39Sopenharmony_ci 1967