• 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
16#include "hitls_build.h"
17#ifdef HITLS_CRYPTO_CHACHA20
18
19.text
20
21.macro CHA64_SET_WDATA
22    mov WINPUT0, WSIG01
23    lsr XINPUT1, XSIG01, #32
24    mov WINPUT2, WSIG02
25    lsr XINPUT3, XSIG02, #32
26
27    mov WINPUT4, WKEY01
28    lsr XINPUT5, XKEY01, #32
29    mov WINPUT6, WKEY02
30    lsr XINPUT7, XKEY02, #32
31
32    mov WINPUT8, WKEY03
33    lsr XINPUT9, XKEY03, #32
34    mov WINPUT10, WKEY04
35    lsr XINPUT11, XKEY04, #32
36
37    mov WINPUT12, WCOUN1
38    lsr XINPUT13, XCOUN1, #32             // 0
39    mov WINPUT14, WCOUN2
40    lsr XINPUT15, XCOUN2, #32
41.endm
42
43.macro CHA64_ROUND_END
44    add WINPUT0, WINPUT0, WSIG01              // Sum of the upper 32 bits and lower 32 bits.
45    add XINPUT1, XINPUT1, XSIG01, lsr#32
46    add WINPUT2, WINPUT2, WSIG02
47    add XINPUT3, XINPUT3, XSIG02, lsr#32
48    add WINPUT4, WINPUT4, WKEY01
49    add XINPUT5, XINPUT5, XKEY01, lsr#32
50    add WINPUT6, WINPUT6, WKEY02
51    add XINPUT7, XINPUT7, XKEY02, lsr#32
52    add WINPUT8, WINPUT8, WKEY03
53    add XINPUT9, XINPUT9, XKEY03, lsr#32
54    add WINPUT10, WINPUT10, WKEY04
55    add XINPUT11, XINPUT11, XKEY04, lsr#32
56    add WINPUT12, WINPUT12, WCOUN1
57    add XINPUT13, XINPUT13, XCOUN1, lsr#32
58    add WINPUT14, WINPUT14, WCOUN2
59    add XINPUT15, XINPUT15, XCOUN2, lsr#32
60
61    add XINPUT0, XINPUT0, XINPUT1, lsl#32      // Combination of upper 32 bits and lower 32 bits.
62    add XINPUT2, XINPUT2, XINPUT3, lsl#32      // Combination of upper 32 bits and lower 32 bits.
63    ldp XINPUT1, XINPUT3, [REGINC], #16        // Load input.
64
65    add XINPUT4, XINPUT4, XINPUT5, lsl#32      // Combination of upper 32 bits and lower 32 bits.
66    add XINPUT6, XINPUT6, XINPUT7, lsl#32      // Combination of upper 32 bits and lower 32 bits.
67    ldp XINPUT5, XINPUT7, [REGINC], #16        // Load input.
68
69    add XINPUT8, XINPUT8, XINPUT9, lsl#32      // Combination of upper 32 bits and lower 32 bits.
70    add XINPUT10, XINPUT10, XINPUT11, lsl#32   // Combination of upper 32 bits and lower 32 bits.
71    ldp XINPUT9, XINPUT11, [REGINC], #16       // Load input.
72
73    add XINPUT12, XINPUT12, XINPUT13, lsl#32      // Combination of upper 32 bits and lower 32 bits.
74    add XINPUT14, XINPUT14, XINPUT15, lsl#32      // Combination of upper 32 bits and lower 32 bits.
75    ldp XINPUT13, XINPUT15, [REGINC], #16         // Load input.
76
77#ifdef  HITLS_BIG_ENDIAN                          // Special processing is required in big-endian mode.
78    rev XINPUT0, XINPUT0
79    rev XINPUT2, XINPUT2
80    rev XINPUT4, XINPUT4
81    rev XINPUT6, XINPUT6
82    rev XINPUT8, XINPUT8
83    rev XINPUT10, XINPUT10
84    rev XINPUT12, XINPUT12
85    rev XINPUT14, XINPUT14
86#endif
87.endm
88
89.macro CHA64_WRITE_BACK
90    eor XINPUT0, XINPUT0, XINPUT1
91    eor XINPUT2, XINPUT2, XINPUT3
92    eor XINPUT4, XINPUT4, XINPUT5
93    eor XINPUT6, XINPUT6, XINPUT7
94    eor XINPUT8, XINPUT8, XINPUT9
95    stp XINPUT0, XINPUT2, [REGOUT], #16           // Write data.
96    eor XINPUT10, XINPUT10, XINPUT11
97    stp XINPUT4, XINPUT6, [REGOUT], #16
98    eor XINPUT12, XINPUT12, XINPUT13
99    eor XINPUT14, XINPUT14, XINPUT15
100    stp XINPUT8, XINPUT10, [REGOUT], #16
101    stp XINPUT12, XINPUT14, [REGOUT], #16
102.endm
103
104#endif