Home | History | Annotate | Line # | Download | only in riscv64
sm4-riscv64-zvksed.S revision 1.1
      1 #include <machine/asm.h>
      2 .text
      3 .p2align 3
      4 .globl rv64i_zvksed_sm4_set_encrypt_key
      5 .type rv64i_zvksed_sm4_set_encrypt_key,@function
      6 rv64i_zvksed_sm4_set_encrypt_key:
      7     .word 0xc1027057
      8 
      9     # Load the user key
     10     .word 33906823
     11     .word 1242865879
     12 
     13     # Load the FK.
     14     la t0, FK
     15     .word 33743111
     16 
     17     # Generate round keys.
     18     .word 772866263
     19     .word 2249204215 # rk[0:3]
     20     .word 2251334263 # rk[4:7]
     21     .word 2252415735 # rk[8:11]
     22     .word 2253497207 # rk[12:15]
     23     .word 2254578679 # rk[16:19]
     24     .word 2255660151 # rk[20:23]
     25     .word 2256741623 # rk[24:27]
     26     .word 2257823095 # rk[28:31]
     27 
     28     # Store round keys
     29     .word 33939879 # rk[0:3]
     30     addi a1, a1, 16
     31     .word 33940007 # rk[4:7]
     32     addi a1, a1, 16
     33     .word 33940135 # rk[8:11]
     34     addi a1, a1, 16
     35     .word 33940263 # rk[12:15]
     36     addi a1, a1, 16
     37     .word 33940391 # rk[16:19]
     38     addi a1, a1, 16
     39     .word 33940519 # rk[20:23]
     40     addi a1, a1, 16
     41     .word 33940647 # rk[24:27]
     42     addi a1, a1, 16
     43     .word 33940775 # rk[28:31]
     44 
     45     li a0, 1
     46     ret
     47 .size rv64i_zvksed_sm4_set_encrypt_key,.-rv64i_zvksed_sm4_set_encrypt_key
     48 .p2align 3
     49 .globl rv64i_zvksed_sm4_set_decrypt_key
     50 .type rv64i_zvksed_sm4_set_decrypt_key,@function
     51 rv64i_zvksed_sm4_set_decrypt_key:
     52     .word 0xc1027057
     53 
     54     # Load the user key
     55     .word 33906823
     56     .word 1242865879
     57 
     58     # Load the FK.
     59     la t0, FK
     60     .word 33743111
     61 
     62     # Generate round keys.
     63     .word 772866263
     64     .word 2249204215 # rk[0:3]
     65     .word 2251334263 # rk[4:7]
     66     .word 2252415735 # rk[8:11]
     67     .word 2253497207 # rk[12:15]
     68     .word 2254578679 # rk[16:19]
     69     .word 2255660151 # rk[20:23]
     70     .word 2256741623 # rk[24:27]
     71     .word 2257823095 # rk[28:31]
     72 
     73     # Store round keys in reverse order
     74     addi a1, a1, 12
     75     li t1, -4
     76     .word 174449959 # rk[31:28]
     77     addi a1, a1, 16
     78     .word 174449831 # rk[27:24]
     79     addi a1, a1, 16
     80     .word 174449703 # rk[23:20]
     81     addi a1, a1, 16
     82     .word 174449575 # rk[19:16]
     83     addi a1, a1, 16
     84     .word 174449447 # rk[15:12]
     85     addi a1, a1, 16
     86     .word 174449319 # rk[11:8]
     87     addi a1, a1, 16
     88     .word 174449191 # rk[7:4]
     89     addi a1, a1, 16
     90     .word 174449063 # rk[3:0]
     91 
     92     li a0, 1
     93     ret
     94 .size rv64i_zvksed_sm4_set_decrypt_key,.-rv64i_zvksed_sm4_set_decrypt_key
     95 .p2align 3
     96 .globl rv64i_zvksed_sm4_encrypt
     97 .type rv64i_zvksed_sm4_encrypt,@function
     98 rv64i_zvksed_sm4_encrypt:
     99     .word 0xc1027057
    100 
    101     # Order of elements was adjusted in set_encrypt_key()
    102     .word 33972487 # rk[0:3]
    103     addi a2, a2, 16
    104     .word 33972615 # rk[4:7]
    105     addi a2, a2, 16
    106     .word 33972743 # rk[8:11]
    107     addi a2, a2, 16
    108     .word 33972871 # rk[12:15]
    109     addi a2, a2, 16
    110     .word 33972999 # rk[16:19]
    111     addi a2, a2, 16
    112     .word 33973127 # rk[20:23]
    113     addi a2, a2, 16
    114     .word 33973255 # rk[24:27]
    115     addi a2, a2, 16
    116     .word 33973383 # rk[28:31]
    117 
    118     # Load input data
    119     .word 33906823
    120     .word 1242865879
    121 
    122     # Encrypt with all keys
    123     .word 2787647735
    124     .word 2788696311
    125     .word 2789744887
    126     .word 2790793463
    127     .word 2791842039
    128     .word 2792890615
    129     .word 2793939191
    130     .word 2794987767
    131 
    132     # Save the ciphertext (in reverse element order)
    133     .word 1242865879
    134     li t0, -4
    135     addi a1, a1, 12
    136     .word 173400231
    137 
    138     ret
    139 .size rv64i_zvksed_sm4_encrypt,.-rv64i_zvksed_sm4_encrypt
    140 .p2align 3
    141 .globl rv64i_zvksed_sm4_decrypt
    142 .type rv64i_zvksed_sm4_decrypt,@function
    143 rv64i_zvksed_sm4_decrypt:
    144     .word 0xc1027057
    145 
    146     # Order of elements was adjusted in set_decrypt_key()
    147     .word 33973383 # rk[31:28]
    148     addi a2, a2, 16
    149     .word 33973255 # rk[27:24]
    150     addi a2, a2, 16
    151     .word 33973127 # rk[23:20]
    152     addi a2, a2, 16
    153     .word 33972999 # rk[19:16]
    154     addi a2, a2, 16
    155     .word 33972871 # rk[15:11]
    156     addi a2, a2, 16
    157     .word 33972743 # rk[11:8]
    158     addi a2, a2, 16
    159     .word 33972615 # rk[7:4]
    160     addi a2, a2, 16
    161     .word 33972487 # rk[3:0]
    162 
    163     # Load input data
    164     .word 33906823
    165     .word 1242865879
    166 
    167     # Encrypt with all keys
    168     .word 2794987767
    169     .word 2793939191
    170     .word 2792890615
    171     .word 2791842039
    172     .word 2790793463
    173     .word 2789744887
    174     .word 2788696311
    175     .word 2787647735
    176 
    177     # Save the ciphertext (in reverse element order)
    178     .word 1242865879
    179     li t0, -4
    180     addi a1, a1, 12
    181     .word 173400231
    182 
    183     ret
    184 .size rv64i_zvksed_sm4_decrypt,.-rv64i_zvksed_sm4_decrypt
    185 # Family Key (little-endian 32-bit chunks)
    186 .p2align 3
    187 FK:
    188     .word 0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC
    189 .size FK,.-FK
    190