#include <machine/asm.h>
.text
.p2align 3
.globl rv64i_zvksed_sm4_set_encrypt_key
.type rv64i_zvksed_sm4_set_encrypt_key,@function
rv64i_zvksed_sm4_set_encrypt_key:
    .word 0xc1027057

    # Load the user key
    .word 33906823
    .word 1242865879

    # Load the FK.
    la t0, FK
    .word 33743111

    # Generate round keys.
    .word 772866263
    .word 2249204215 # rk[0:3]
    .word 2251334263 # rk[4:7]
    .word 2252415735 # rk[8:11]
    .word 2253497207 # rk[12:15]
    .word 2254578679 # rk[16:19]
    .word 2255660151 # rk[20:23]
    .word 2256741623 # rk[24:27]
    .word 2257823095 # rk[28:31]

    # Store round keys
    .word 33939879 # rk[0:3]
    addi a1, a1, 16
    .word 33940007 # rk[4:7]
    addi a1, a1, 16
    .word 33940135 # rk[8:11]
    addi a1, a1, 16
    .word 33940263 # rk[12:15]
    addi a1, a1, 16
    .word 33940391 # rk[16:19]
    addi a1, a1, 16
    .word 33940519 # rk[20:23]
    addi a1, a1, 16
    .word 33940647 # rk[24:27]
    addi a1, a1, 16
    .word 33940775 # rk[28:31]

    li a0, 1
    ret
.size rv64i_zvksed_sm4_set_encrypt_key,.-rv64i_zvksed_sm4_set_encrypt_key
.p2align 3
.globl rv64i_zvksed_sm4_set_decrypt_key
.type rv64i_zvksed_sm4_set_decrypt_key,@function
rv64i_zvksed_sm4_set_decrypt_key:
    .word 0xc1027057

    # Load the user key
    .word 33906823
    .word 1242865879

    # Load the FK.
    la t0, FK
    .word 33743111

    # Generate round keys.
    .word 772866263
    .word 2249204215 # rk[0:3]
    .word 2251334263 # rk[4:7]
    .word 2252415735 # rk[8:11]
    .word 2253497207 # rk[12:15]
    .word 2254578679 # rk[16:19]
    .word 2255660151 # rk[20:23]
    .word 2256741623 # rk[24:27]
    .word 2257823095 # rk[28:31]

    # Store round keys in reverse order
    addi a1, a1, 12
    li t1, -4
    .word 174449959 # rk[31:28]
    addi a1, a1, 16
    .word 174449831 # rk[27:24]
    addi a1, a1, 16
    .word 174449703 # rk[23:20]
    addi a1, a1, 16
    .word 174449575 # rk[19:16]
    addi a1, a1, 16
    .word 174449447 # rk[15:12]
    addi a1, a1, 16
    .word 174449319 # rk[11:8]
    addi a1, a1, 16
    .word 174449191 # rk[7:4]
    addi a1, a1, 16
    .word 174449063 # rk[3:0]

    li a0, 1
    ret
.size rv64i_zvksed_sm4_set_decrypt_key,.-rv64i_zvksed_sm4_set_decrypt_key
.p2align 3
.globl rv64i_zvksed_sm4_encrypt
.type rv64i_zvksed_sm4_encrypt,@function
rv64i_zvksed_sm4_encrypt:
    .word 0xc1027057

    # Order of elements was adjusted in set_encrypt_key()
    .word 33972487 # rk[0:3]
    addi a2, a2, 16
    .word 33972615 # rk[4:7]
    addi a2, a2, 16
    .word 33972743 # rk[8:11]
    addi a2, a2, 16
    .word 33972871 # rk[12:15]
    addi a2, a2, 16
    .word 33972999 # rk[16:19]
    addi a2, a2, 16
    .word 33973127 # rk[20:23]
    addi a2, a2, 16
    .word 33973255 # rk[24:27]
    addi a2, a2, 16
    .word 33973383 # rk[28:31]

    # Load input data
    .word 33906823
    .word 1242865879

    # Encrypt with all keys
    .word 2787647735
    .word 2788696311
    .word 2789744887
    .word 2790793463
    .word 2791842039
    .word 2792890615
    .word 2793939191
    .word 2794987767

    # Save the ciphertext (in reverse element order)
    .word 1242865879
    li t0, -4
    addi a1, a1, 12
    .word 173400231

    ret
.size rv64i_zvksed_sm4_encrypt,.-rv64i_zvksed_sm4_encrypt
.p2align 3
.globl rv64i_zvksed_sm4_decrypt
.type rv64i_zvksed_sm4_decrypt,@function
rv64i_zvksed_sm4_decrypt:
    .word 0xc1027057

    # Order of elements was adjusted in set_decrypt_key()
    .word 33973383 # rk[31:28]
    addi a2, a2, 16
    .word 33973255 # rk[27:24]
    addi a2, a2, 16
    .word 33973127 # rk[23:20]
    addi a2, a2, 16
    .word 33972999 # rk[19:16]
    addi a2, a2, 16
    .word 33972871 # rk[15:11]
    addi a2, a2, 16
    .word 33972743 # rk[11:8]
    addi a2, a2, 16
    .word 33972615 # rk[7:4]
    addi a2, a2, 16
    .word 33972487 # rk[3:0]

    # Load input data
    .word 33906823
    .word 1242865879

    # Encrypt with all keys
    .word 2794987767
    .word 2793939191
    .word 2792890615
    .word 2791842039
    .word 2790793463
    .word 2789744887
    .word 2788696311
    .word 2787647735

    # Save the ciphertext (in reverse element order)
    .word 1242865879
    li t0, -4
    addi a1, a1, 12
    .word 173400231

    ret
.size rv64i_zvksed_sm4_decrypt,.-rv64i_zvksed_sm4_decrypt
# Family Key (little-endian 32-bit chunks)
.p2align 3
FK:
    .word 0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC
.size FK,.-FK
