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