1/* 2 * This file is part of the openHiTLS project. 3 * 4 * openHiTLS is licensed under the Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * 8 * http://license.coscl.org.cn/MulanPSL2 9 * 10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13 * See the Mulan PSL v2 for more details. 14 */ 15#include "hitls_build.h" 16#ifdef HITLS_CRYPTO_SM4 17 18#include "crypt_arm.h" 19 20#define VTMP0 V8 21#define VTMP1 V9 22#define VTMP2 V10 23 24#define DATA0 V16 25 26#define MaskV v26 27#define TAHMatV v27 28#define TALMatV v28 29#define ATAHMatV v29 30#define ATALMatV v30 31#define ANDMaskV v31 32 33#define MaskQ q26 34#define TAHMatQ q27 35#define TALMatQ q28 36#define ATAHMatQ q29 37#define ATALMatQ q30 38#define ANDMaskQ q31 39 40.section .rodata 41.align 4 42#ifdef HITLS_BIG_ENDIAN 43 .qtmp0: 44 .quad 0x0101010101010101,0x0101010101010187 45.Lsbox_magic: 46 .quad 0x0306090c0f020508,0x0b0e0104070a0d00 47 .quad 0x22581a6002783a40,0x62185a2042387a00 48 .quad 0xc10bb67c4a803df7,0x15df62a89e54e923 49 .quad 0x1407c6d56c7fbead,0xb9aa6b78c1d21300 50 .quad 0xe383c1a1fe9edcbc,0x6404462679195b3b 51 .quad 0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f 52#else 53 .qtmp0: 54 .quad 0x0101010101010187,0x0101010101010101 55.Lsbox_magic: 56 .quad 0x0b0e0104070a0d00,0x0306090c0f020508 57 .quad 0x62185a2042387a00,0x22581a6002783a40 58 .quad 0x15df62a89e54e923,0xc10bb67c4a803df7 59 .quad 0xb9aa6b78c1d21300,0x1407c6d56c7fbead 60 .quad 0x6404462679195b3b,0xe383c1a1fe9edcbc 61 .quad 0x0f0f0f0f0f0f0f0f,0x0f0f0f0f0f0f0f0f 62#endif 63 64.Lck: 65 .long 0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269 66 .long 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9 67 .long 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249 68 .long 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9 69 .long 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229 70 .long 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299 71 .long 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209 72 .long 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279 73.Lfk: 74 .long 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc 75.Lshuffles: 76 .long 0x07060504, 0x0B0A0908, 0x0F0E0D0C, 0x03020100 77 78#ifndef HITLS_BIG_ENDIAN 79 #define REV32_EQ(DST, SRC) \ 80 rev32 DST.16b,DST.16b ; 81 82#else 83 #define REV32_EQ(DST, SRC) \ 84 /*rev32 eq is null in armeb */ ; 85 86#endif 87 88.macro LOAD_SBOX_MATRIX 89 adrp x15,.Lsbox_magic 90 add x15,x15,:lo12:.Lsbox_magic 91 ldr MaskQ, [x15] 92 ldr TAHMatQ, [x15, #16] 93 ldr TALMatQ, [x15, #32] 94 ldr ATAHMatQ, [x15, #48] 95 ldr ATALMatQ, [x15, #64] 96 ldr ANDMaskQ, [x15, #80] 97.endm 98 99/* matrix multiplication Mat*x = (lowerMat*x) ^ (higherMat*x) */ 100#define MUL_MATRIX(X, HIGHERMAT, LOWERMAT, TMP) \ 101 ushr TMP.16b, X.16b, 4 ; \ 102 and X.16b, X.16b, ANDMaskV.16b ; \ 103 tbl X.16b, {LOWERMAT.16b}, X.16b ; \ 104 tbl TMP.16b, {HIGHERMAT.16b}, TMP.16b ; \ 105 eor X.16b, X.16b, TMP.16b ; 106 107 108.arch armv8-a+crypto 109.text 110#define USER_KEY x0 111#define ROUND_KEY1 x1 112#define ENC1 w2 113 114#define POINTER1 x5 115#define SCHEDULES x6 116#define WTMP w7 117#define ROUND_KEY2 w8 118 119#define V_KEY v5 120#define V_FK v6 121#define V_MAP v7 122 123/* 124 * void vpsm4_ex_set_key(const unsigned char *userKey, SM4_KEY *key, int enc); 125 * generate sm4 rounk key context 126 * USER_KEY => userKey; 127 * ROUND_KEY1 => key ; 128 * if encryption:ENC=>enc 129 */ 130.type vpsm4_ex_set_key,%function 131.align 4 132vpsm4_ex_set_key: 133AARCH64_PACIASP 134 ld1 {V_KEY.4s},[USER_KEY] 135 LOAD_SBOX_MATRIX 136 REV32_EQ(V_KEY,V_KEY) 137 138 adrp POINTER1,.Lshuffles 139 add POINTER1,POINTER1,:lo12:.Lshuffles 140 ld1 {V_MAP.4s},[POINTER1] 141 adrp POINTER1,.Lfk 142 add POINTER1,POINTER1,:lo12:.Lfk 143 ld1 {V_FK.4s},[POINTER1] 144 eor V_KEY.16b,V_KEY.16b,V_FK.16b 145 mov SCHEDULES,#32 146 adrp POINTER1,.Lck 147 add POINTER1,POINTER1,:lo12:.Lck 148 movi VTMP0.16b,#64 149 cbnz ENC1,1f 150 add ROUND_KEY1,ROUND_KEY1,124 1511: // loop 152 mov WTMP,V_KEY.s[1] 153 ldr ROUND_KEY2,[POINTER1],#4 154 eor ROUND_KEY2,ROUND_KEY2,WTMP 155 mov WTMP,V_KEY.s[2] 156 eor ROUND_KEY2,ROUND_KEY2,WTMP 157 mov WTMP,V_KEY.s[3] 158 eor ROUND_KEY2,ROUND_KEY2,WTMP 159 160 /* optimize sbox using AESE instruction */ 161 mov DATA0.s[0],ROUND_KEY2 162 tbl VTMP0.16b, {DATA0.16b}, MaskV.16b 163 MUL_MATRIX(VTMP0, TAHMatV, TALMatV, VTMP2) 164 eor VTMP1.16b, VTMP1.16b, VTMP1.16b 165 aese VTMP0.16b,VTMP1.16b 166 MUL_MATRIX(VTMP0, ATAHMatV, ATALMatV, VTMP2) 167 mov WTMP,VTMP0.s[0] 168 169 /* linear transformation */ 170 eor ROUND_KEY2,WTMP,WTMP,ror #19 171 eor ROUND_KEY2,ROUND_KEY2,WTMP,ror #9 172 mov WTMP,V_KEY.s[0] 173 eor ROUND_KEY2,ROUND_KEY2,WTMP 174 mov V_KEY.s[0],ROUND_KEY2 175 cbz ENC1,2f 176 str ROUND_KEY2,[ROUND_KEY1],#4 177 b 3f 1782: // set encrypt key 179 str ROUND_KEY2,[ROUND_KEY1],#-4 1803: // final 181 tbl V_KEY.16b,{V_KEY.16b},V_MAP.16b 182 subs SCHEDULES,SCHEDULES,#1 183 b.ne 1b 184 /*clear register for temp key */ 185 eor V_KEY.16b, V_KEY.16b, V_KEY.16b 186 eor ROUND_KEY2, ROUND_KEY2, ROUND_KEY2 187AARCH64_AUTIASP 188 ret 189.size vpsm4_ex_set_key,.-vpsm4_ex_set_key 190 191/* 192 * void Vpsm4SetEncryptKey(const unsigned char *userKey, SM4_KEY *key); 193 * generate SM4 encrypt round KEY context 194 * x0 => userKey; x1 => key 195 */ 196.globl Vpsm4SetEncryptKey 197.type Vpsm4SetEncryptKey,%function 198.align 5 199Vpsm4SetEncryptKey: 200AARCH64_PACIASP 201 stp x29,x30,[sp,#-16]! 202 mov w2,1 203 bl vpsm4_ex_set_key 204 ldp x29,x30,[sp],#16 205AARCH64_AUTIASP 206 ret 207.size Vpsm4SetEncryptKey,.-Vpsm4SetEncryptKey 208 209/* 210 * void Vpsm4SetDecryptKey(const unsigned char *userKey, SM4_KEY *key); 211 * generate SM4 decryption round KEY context 212 * x0 => userKey; x1 => key 213 */ 214.globl Vpsm4SetDecryptKey 215.type Vpsm4SetDecryptKey,%function 216.align 5 217Vpsm4SetDecryptKey: 218AARCH64_PACIASP 219 stp x29,x30,[sp,#-16]! 220 mov w2,0 221 bl vpsm4_ex_set_key 222 ldp x29,x30,[sp],#16 223AARCH64_AUTIASP 224 ret 225.size Vpsm4SetDecryptKey,.-Vpsm4SetDecryptKey 226 227#endif 228