• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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