Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ option(ENABLE_SM4_CE "Enable SM4 ARM CE assembly implementation" OFF)
option(ENABLE_SM9_ARM64 "Enable SM9_Z256 ARMv8 assembly" OFF)
option(ENABLE_GMUL_ARM64 "Enable GF(2^128) Multiplication AArch64 assembly" OFF)

option(ENABLE_SM2_LOONGARCH64 "Enable SM2_Z256 LoongArch assembly" OFF)

option(ENABLE_SM4_AVX2 "Enable SM4 AVX2 8x implementation" OFF)
option(ENABLE_SM4_AESNI "Enable SM4 AES-NI (4x) implementation" OFF)
Expand Down Expand Up @@ -272,6 +273,13 @@ if (ENABLE_SM2_AMD64)
list(APPEND src src/sm2_z256_amd64.S)
endif()

if (ENABLE_SM2_LOONGARCH64)
message(STATUS "ENABLE_SM2_LOONGARCH64 is ON")
add_definitions(-DENABLE_SM2_LOONGARCH64)
enable_language(ASM)
list(APPEND src src/sm2_z256_loong64.S)
endif()

if (ENABLE_SM2_NEON)
message(STATUS "ENABLE_SM2_NEON is ON")
add_definitions(-DENABLE_SM2_NEON)
Expand Down
16 changes: 8 additions & 8 deletions src/sm2_z256.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ const uint64_t SM2_Z256_NEG_P[4] = {
1, ((uint64_t)1 << 32) - 1, 0, ((uint64_t)1 << 32),
};

#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_modp_add(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b)
{
uint64_t c;
Expand Down Expand Up @@ -480,7 +480,7 @@ const uint64_t SM2_Z256_P_PRIME[4] = {
// mont(1) (mod p) = 2^256 mod p = 2^256 - p
const uint64_t *SM2_Z256_MODP_MONT_ONE = SM2_Z256_NEG_P;

#if defined(ENABLE_SM2_ARM64) || defined(ENABLE_SM2_AMD64)
#if defined(ENABLE_SM2_ARM64) || defined(ENABLE_SM2_AMD64) || defined(ENABLE_SM2_LOONGARCH64)
// src/sm2_z256_armv8.S
#elif defined(ENABLE_SM2_Z256_NEON)
#include <arm_neon.h>
Expand Down Expand Up @@ -811,7 +811,7 @@ const uint64_t SM2_Z256_NEG_N[4] = {
0xac440bf6c62abedd, 0x8dfc2094de39fad4, 0x0000000000000000, 0x0000000100000000,
};

#if !defined(ENABLE_SM2_ARM64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_modn_add(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b)
{
uint64_t c;
Expand Down Expand Up @@ -867,7 +867,7 @@ const uint64_t *sm2_z256_order_minus_one(void) {
const uint64_t *SM2_Z256_MODN_MONT_ONE = SM2_Z256_NEG_N;


#if !defined(ENABLE_SM2_ARM64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_modn_mont_mul(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b)
{
sm2_z512_t z;
Expand Down Expand Up @@ -916,7 +916,7 @@ void sm2_z256_modn_mul(sm2_z256_t r, const sm2_z256_t a, const sm2_z256_t b)
sm2_z256_modn_from_mont(r, r);
}

#if !defined(ENABLE_SM2_ARM64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_modn_mont_sqr(sm2_z256_t r, const sm2_z256_t a)
{
sm2_z256_modn_mont_mul(r, a, a);
Expand Down Expand Up @@ -1019,7 +1019,7 @@ void sm2_z256_modn_inv(sm2_z256_t r, const sm2_z256_t a)
}


#if !defined(ENABLE_SM2_ARM64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_LOONGARCH64)

// mont(mont(a), 1) = aR * 1 * R^-1 (mod n) = a (mod p)
void sm2_z256_modn_from_mont(sm2_z256_t r, const sm2_z256_t a)
Expand Down Expand Up @@ -1148,7 +1148,7 @@ int sm2_z256_point_get_xy(const SM2_Z256_POINT *P, uint64_t x[4], uint64_t y[4])
return 1;
}

#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_point_dbl(SM2_Z256_POINT *R, const SM2_Z256_POINT *A)
{
const uint64_t *X1 = A->X;
Expand Down Expand Up @@ -1474,7 +1474,7 @@ void sm2_z256_point_copy_affine(SM2_Z256_POINT *R, const SM2_Z256_AFFINE_POINT *
sm2_z256_copy(R->Z, SM2_Z256_MODP_MONT_ONE);
}

#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64)
#if !defined(ENABLE_SM2_ARM64) && !defined(ENABLE_SM2_AMD64) && !defined(ENABLE_SM2_LOONGARCH64)
void sm2_z256_point_add_affine(SM2_Z256_POINT *r, const SM2_Z256_POINT *a, const SM2_Z256_AFFINE_POINT *b)
{
sm2_z256_t U2, S2;
Expand Down
Loading