Ⅰ. 서론
2018월 3월 구글이 72큐비트 양자컴퓨터를 개발하면서, 양자 컴퓨터의 연구 및 개발이 빠른 규모로 발전하고 있다. 하지만 이러한 양자 컴퓨팅 기술이 암호에 적용되면 Shor 알고리즘[1]을 통해 인수 분해, 이산로그에 기반한 공개키 암호 시스템이 다항시간 내에 풀리게 된다. 이에 따라, NIST(National Institute of Standards and Technology)에서는 2016년 양자내성암호 공모사업[2](PKE/KEM, 전자서명)을 시작하였다. 현재 3라운드 후보자에 대해 평가과정이 진행되고 있으며, 3라운드 후보자의 대부분은 격자기반 암호로서, 계산의 효율성, 비교적 짧은 키 길이, 빠른 속도를 제공하여 Highend 컴퓨터뿐만 아니라 제한적인 임베디드 환경에서도 실제 적용이 가능한 장점이 존재한다.
대표적인 격자기반 암호는 LWE(Learning With Errors)와 LWR(Learning With Rounding)에 기반하여 안전성을 보장한다. 게다가 키 길이를 효율적으로 줄이고, 256-bit 단위의 안전성을 제공하기 위해서 Module-LWE, Module-LWR 구조가 연구되었다. 실제 3라운드 후보자 중 Crystal-KYBER, Crystal-DILITHIUM은 Module-LWE 구조이며, SABER는 Module-LWR구조이다. 특히 SABER는 기존의 이항분포나 가우시안분포에서 에러를 추출하는 LWE 구조와 달리 단순히 Rounding을 적용하여 안전성을 제공한다. 게다가 SABER의 모듈러스는 213이므로 구현 시 추가적인 리덕션이 요구되지 않으며, 가장 연산 부하가 큰 다항식 곱셈에 대해 이를 빠르게 수행할 수 있는 곱셈 방법론인 Toom-Cook 알고리즘을 활용하여 빠른 처리 속도를 제공한다.
ARMv8-A series는 현재 자율주행, 핸드폰, 태블릿에 널리 사용되는 High-end MCU이다. AR Mv8-A series는 64-bit ARM 프로세서와 병렬처리가 가능한 NEON 엔진을 지원한다. ARM 프로세서는 NEON 엔진과 달리 병렬처리를 지원하지 않지만, 시프트 연산에 대한 사이클을 숨길 수 있는 배럴 시프터를 지원한다. NEON 엔진은 128-bit 벡터 레지스터 내에서 8-bit, 16-bit, 32-bit, 64-bit 단위로 병렬처리가 가능하다. 따라서 최적화 구현을 통해 연산 집약적인 암호알고리즘의 성능 향상우 효율적이다. 게다가 ARM과 NEON은 독립적인 모듈로 존재하여, 서로 연산을 각자 수행한다. 이를 통해 ARM과 NEON의 각 구현의 인터리빙을 통해 ARM 연산들의 지연시간을 NEON 연산의 부하로 숨길 수 있다. 위와 같은 장점들로 ARM/NEON 프로세서를 활용한 다양한 암호 최적화 연구( [3],[4],[5])가 존재하지만, 아직 양자내성암호에 대해서는 미진하다. 게다가 대부분의 양자내성암호의 연구결과는 ARM Cortex-M4 환경에서만 수행하였다.
본 논문에서는 처음으로 ARMv8-A Series에서 ARM/NEON 프로세서를 활용하여 SABER의 핵심 연산인 다항식 곱셈 Toom-Cook 알고리즘의 평가와 보간 단계의 최적화 구현 방안을 제시한다. 제안하는 방법을 통해 레퍼런스 구현보다 평가과정에서는 약 3.5배, 보간과정에서는 약 5배 성능향상을 달성하였다. 본 논문의 구성은 다음과 같다. 2장에서는 Toom-Cook 알고리즘과 ARM/NEON 프로세서의 자세한 설명을 제공한다. 3장에서는 기존 ARM/NEON 프로세서의 관련 연구들을 살펴보고, 4장에서는 Toom-Cook 알고리즘의 평가 및 보간 단계의 최적화 방법을 제안한다. 5장에서는 성능 측정 결과를 제시하고 마지막으로 결론과 향후 계획으로 본 논문을 마무리한다.
Ⅱ. Background
2.1 Toom-Cook 알고리즘
SABER에서는 가장 핵심 연산인 256차 다항식 곱셈 연산을 Toom-Cook 알고리즘을 통해 수행한다. Toom-Cook 알고리즘은 n차 다항식 곱셈 시 복잡도인 O(n2)에서 이를 O(nlog7/log4 )의 복잡도를 낮춰 단순 곱셈보다 더욱 빠른 속도로 곱셈 연산을 처리한다. SABER에서는 Toom-Cook 4-way를 사용하여 256차 다항식을 4개로 분할하며, 나머지 Took-Cook 알고리즘의 과정은 평가, 점 별 곱셈, 보간 과정을 통해 다항식 곱셈을 수행한다.
2.1.1 평가
평가과정에서는 연산이 비교적 간단한 각 포인트에 대하여 결과값을 구한다. SABER에서는 ToomCook-4way를 사용하였으므로, 하나의 256차 다항식 A에 대해 A(x)=a3x3+a2x2+a1x+a0로 표현될 수 있다. 마찬가지로 다항식 B(x)도 위와 같이 표현될 수 있으며, 두 다항식을 곱한 C(x)는 6차 다항식으로 총 7개의 계수를 요구한다. 따라서 SABER의 Toom-Cook 알고리즘에서의 평가과정은 7개의 점에 대한 결과값이 요구된다. 각 포인트에 대한 결과값을 구하는 평가과정은 행렬의 곱으로 나타낼 수 있으며, 하나의 다항식에 대한 평가과정은 Fig. 1과 같다.
Fig. 1. Evaluation in Toom-Cook Algorithm
2.1.2 점별 곱셈
위의 평가과정을 통해 총 7개 포인트에 대한 결과값을 저장한 두 다항식 A, B에 대해 63차 다항식 7개가 생성된다. 점별 곱셈 과정은 각 포인트에 대한 결과값을 저장하고 있는 두 다항식을 곱해주는 과정이며, 예를 들어 C(0)=A(0)*B(0)를 구하는 과정이다. 이때 Karatsuba-2way를 사용한다. Karatsuba를 사용하면 Operand-Scanning 곱셈을 사용하는 것보다 한 번의 곱셈 연산을 줄일 수 있으며 Karatsuba 곱셈 과정은 Fig. 2와 같다. Karatsuba-2way를 사용하므로 16차 다항식에서의 곱셈은 Operand Scanning 방법을 통해 수행된다. 결과적으로 점별 곱셈 과정은 총 16차 다항식 7X9=63번의 Operand Scanning 연산량을 가지고 있다.
Fig. 2. Karatsuba Multiplication
2.1.3 보간
점별 곱셈을 수행하여 총 7개 포인트의 곱셈 값에 대한 결과값이 저장된다. 마지막으로 보간과정은 점별 곱셈을 수행한 C(0), C(1), C(-1), 64C(1/2), 64C(-1/2), C(2), C(inf)를 통해 최종적으로 두 다항식 A,B의 곱셈 결과인 C의 계수인 c6, c5, c4, c3, c2, c1, c0를 구하는 과정이다. 위의 과정은 행렬의 곱셈으로 표현할 수 있으며 Fig. 3과 같다. 단순 행렬 곱셈을 수행함으로써, 다항식 C의 7개 계수를 모두 구할 수 있다. 하지만 평가과정에서는 256차 다항식을 64차 다항식 4개로 분할하였지만, 보간과정에서는 256차 다항식을 7개로 분할하므로, 구현상에서 평가과정은 독립적으로 결과값이 배열에 저장되지만, 보간과정은 Overlap 과정과 Accumlator가 요구된다.
Fig. 3. Interpolation in Toom-Cook Algorithm
2.2 ARMv8 Microcontrolle
ARMv8 A Series는 64-bit ARM 프로세서와 병렬처리가 가능한 NEON 엔진을 지원한다. 64-bit ARM 프로세서에서는 배럴 시프터와 x0-x30까지의 64-bit 레지스터를 지원하며, ARM에서 사용할 수 있는 A64 명령어 집합[6]을 지원한다. NEON에서는 병렬처리를 수행할 수 있는 v0-v31까지의 128-bit 벡터 레지스터와 ASIMD 명령어 집합 [7]을 지원한다. 128-bit 벡터 레지스터 내에서는 8-bit, 16-bit, 32-bit, 64-bit 단위로 핸들링이 가능하다. 게다가 ARM/NEON은 독립적인 모듈로 연산을 수행하여 ARM과 NEON의 각 구현을 단순히 합치게 되면 ARM과 NEON의 실행시간의 합이지만, ARM/NEON 프로세서의 인터리빙 적인 접근은 ARM 연산들의 지연시간을 NEON 오버헤드로 숨길 수 있어 효과적으로 성능향상이 가능하다. Table. 1은 본 논문에서 사용하는 A64, ASIMD 명령어들의 설명과 Clock Cycles를 나타낸다.
Table 1. Summary of A64 and ASIMD Instruction Set in ARMv8-A Series [6], [7]
Ⅲ. Related Wor
본 장에서는 임베디드 환경에서 양자내성암호의 연구결과를 소개한다. AFRICA CRYPTO 2019[8]에서는 ARM Cortex-M4 환경에서 KYBER에 대한 메모리 최적화 및 고속 구현을 제시하였다. 특히 KYBER에서 핵심 연산인 NTT(Number Transform Theory)에 대해 타겟 장비에서 지원하는 벡터 DSP 명령어를 사용한 최적화 기술을 소개하였다. 게다가 메모리 최적화를 적용하여 SABER가 요구하는 메모리 사용량의 절반만을 필요로 하였으며, 제안한 모든 구현이 Constant–time이므로 타이밍 공격에 대한 안전성을 제공하였다.
CHES 2020 [9]에서는 ARM Cortex-M4와 AVX2 환경에서 Toom-Cook 알고리즘의 최적화 구현 연구가 소개되었다. Toom-Cook 알고리즘에서 Lazy 보간과 Pre-computation 최적화 방법을 제안하였다. 이를 임베디드 환경인 ARM Cortex-M4에 적용하고 16차 다항식 곱셈에 대한 메모리 최적화 방법도 제시하였다. 결과적으로 이전 연구보다 메모리 사용량을 2.6KB에서 5.7KB까지 효율적으로 감소시켰다.
CHES 2021 [10]에서는 ARM Cortex-M3, ARM Cortex-M4에서 Crystal-Dilithium의 메모리 최적화 및 고속 구현을 제안하였다. Crystal-Dilithium의 핵심 연산인 NTT 연산을 최적화하였으며, NTT, NTT^-1에서 20% 성능을 향상시켜 전체적으로 이전 연구보다 KeyGen에서 7%, Sign에서 15%, Verify에서 9% 성능 향상을 달성하였다.
임베디드 환경에서 양자내성암호의 최적화 구현 연구들은 대부분 ARM Cortex-M4 환경에서 최적화를 수행하였다. 하지만 최근 ARM Cortex-A Series는 모바일, 태블릿, 자율주행에서 널리 사용되고 더욱 강력한 NEON 엔진까지 지원하여 다양한 암호 최적화 연구가 활발히 수행되고 있다. 본 논문에서는 최초로 ARM Cortex-A Series(ARMv8)에서 ARM/NEON 프로세서를 활용한 Toom-Cook 알고리즘의 평가 및 보간 단계의 최적화 구현 방법을 소개한다.
Ⅳ. Toom-Cook 알고리즘 최적화
4.1 평가
본 절에서는 Toom-Cook 알고리즘의 평가과정에 대한 ARM/NEON 프로세서를 활용한 최적화 방법을 소개한다. 먼저 ARM 프로세서에서의 병렬 최적화 방법을 소개하고 그 다음 NEON 엔진에서의 병렬 최적화 방법을 소개한다. 마지막으로 ARM/NEON의 각 구현을 인터리빙하여 효율적으로 ARM 명령어에 대한 지연시간을 NEON 명령어로 숨기는 방법을 소개한다. Table 2는 ARM/NEON 프로세서의 각 구현에서 레지스터 스케쥴링을 보여준다.
Table 2. Summary of Register Scheduling
4.1.1 Optimization in ARM Processor
ARM Cortex-A series에서 64-bit ARM 프로세서는 병렬처리를 지원하지 않는다. 하지만 Toom-Cook 알고리즘의 평가과정에서는 2의 파워승 곱셈, 덧셈, 뺄셈 연산으로 구성되어있다. 또한 SABER의 모듈러스 Q는 213이다. 따라서 우리는 64-bit ARM 프로세서에서 4개 계수에 대한 병렬처리 방법을 소개한다.
제안하는 ARM 프로세서에서 Toom-Cook 알고리즘 평가과정의 전체과정은 Fig. 4와 같다. 1~4단계는 a3, a2, a1, a0에서 각각 4개의 계수를 ARM 레지스터에 로드한다. 5~13단계는 A(1), A(-1)을 구하는 과정이다. 이때 뺄셈에 경우에는 Borrow가 발생할 수 있어 병렬적으로 처리하기 위해서는 A-B가 아닌 P+A-B로 계산하여 발생할 수 있는 Borrow를 제거한다.
Fig. 4. Evaluation Implementation in ARM Processor
14~16단계는 계산이 완료된 A(1), A(-1) 값을 메모리에 저장한다. 17~26단계는 8A(1/2), 8A(-1/2)를 계산하는 과정이다. 이때 2의 파워승 곱셈은 배럴 시프터를 사용하여 연산에 대한 클럭 사이클을 소모하지 않는다. 마찬가지로 뺄셈에서는 Borrow를 제거하기 위해 A-B가 아닌 P+A-B로 연산을 처리한다. 이를 통해 병렬적으로 뺄셈이 가능하다. 27~28단계는 8A(1/2), 8A(-1/2)의 결과값을 메모리에 저장한다.
29~33단계는 A(2)를 계산하는 과정이며, 마찬가지로 2의 파워승 곱셈에서는 배럴 시프터를 사용한다. 마지막으로 34~36단계에서는 A(2)와 A(inf) 값을 메모리에 저장한다. 위의 과정을 통해 a3, a2, a1, a0의 다항식에서 4개의 계수에 대한 Toom-Cook 알고리즘의 평가과정이 처리된다.
4.1.2 Optimization in NEON Engine
NEON 엔진에서는 128-bit 내에서 8-bit, 16-bit, 32-bit, 64-bit 단위로 병렬처리가 가능하고, SABER의 모듈러스 Q=213이므로 8개 계수에 대한 병렬처리 방법을 제안한다. NEON 엔진을 활용한 Toom-Cook 알고리즘의 평가과정의 전체과정은 Fig. 5와 같다. 16-bit 단위로 병렬처리를 하므로 lane은 8h로 계산된다.
Fig. 5. Evaluation Implementation in NEON Engine
1~4단계는 a3, a2, a1, a0에서 각각 8개의 계수를 벡터 레지스터들에 로드한다. 5~10단계는 A(1), A(-1)을 계산하는 과정으로, ARM 프로세서와 달리 NEON 엔진에서는 자동으로 병렬처리가 가능하므로 Borrow에 대해 고려할 필요가 없다. 11~13단계는 계산이 완료된 A(1), A(-1) 값을 메모리에 로드한다.
14~22단계에서는 8A(1/2), 8A(-1/2)를 계산하는 과정으로, v27, v28, v29에는 3, 2, 1이 16-bit 단위로 채워져 있다. USHL 명령어를 통해 병렬적으로 8, 4, 2의 곱셈이 처리된다. 23~24단계에서는 8A(1/2), 8A(-1/2)의 결과값이 메모리에 저장된다. 25~31단계는 A(2)를 계산하는 과정이다. 마찬가지로 USHL 명령어를 통해 병렬적으로 2의 파워승 곱셈이 수행된다. 마지막으로 32~34단계는 8A(2), A(inf)의 결과값이 메모리에 저장된다. 위의 과정을 통해 a3, a2, a1, a0의 64개의 계수를 갖는 다항식에서 8개 계수에 대한 평가과정 처리가 완료된다.
4.1.3 Optimization in ARM/NEON Processor
우리는 평가과정에서 ARM/NEON의 인터리빙 구현을 제안한다. ARM/NEON의 인터리빙 구현은 Fig. 6와 같으며, 인터리빙 구현을 통해 ARM 계산에 대한 지연시간이 NEON 오버헤드로 효율적으로 숨겨진다. ARM에서는 4개의 계수에 대한 평가과정에 대해 병렬 처리하였으며, NEON에서는 8개의 계수에 대한 평가과정에 대해 병렬처리를 하였다. 우리는 인터리빙 구현을 통해 12개의 계수에 대해 병렬처리가 수행되며, 이때 ARM에서 처리되는 4개의 계수에 대한 평가과정에서의 연산 지연시간이 NEON으로 숨겨져 효과적으로 성능이 향상된다. 위의 과정을 5번 반복하고 마지막은 4개의 계수에 대해 ARM에서 평가과정을 처리하게 되면 64개의 계수를 갖는 a3, a2, a1, a0의 평가과정이 완료된다. 마찬가지로 다항식 B(x)도 위와 같은 과정을 통해 평가과정을 수행한다.
Fig. 6. Interleaving Approach
4.2 보간
보간과정에서는 NEON을 활용하여 8개의 계수를 동시에 처리하고 메모리 접근을 최소화하는 구현 방법을 소개한다. 제안하는 보간과정의 구현을 위한 레지스터 스케쥴링은 Fig. 7과 같다. x10~x16, x20~x26은 값을 로드하기 위해 주소값을 저장하고 있는 레지스터이며, x1~x8은 결과값을 저장하기 위한 주소 값을 저장하고 있는 레지스터이다.
Fig. 7. Register Scheduling for Interpolation in Toom-Cook Algorithm
v0-v13은 각 8개의 계수를 저장하기 위한 벡터 레지스터이며, 나머지는 변수값을 저장하고 있는 레지스터이다. 기존 레퍼런스 구현에서는 for문을 돌면서 0~63까지 수행하여 0~447차의 계수의 결과값을 계산하고 64~127까지 수행하여 64~511차의 계수의 결과값을 계산하여 두 값을 더함으로써 최종 결과값이 반환된다. 하지만 임베디드 환경에서는 모든 값을 레지스터 내에 임시 저장을 할 수 없으므로, 위와 같은 구현은 많은 메모리 사용량을 요구한다.
따라서 우리는 임베디드 환경에서 메모리 사용량을 최소화하는 구현을 제시한다. 제안하는 방법은 Fig. 8과 같다. 128차 결과값인 C(0) … C(inf)를 64개의 계수로 나누어 행렬 곱셈을 처리하고 바로 그 결과값들을 더하여 최종 결과값을 구함으로써 Accumulaotr에 대한 메모리 접근 부하를 최소화하였다. 제안하는 구현은 레퍼런스 구현과 비교하여 320번의 메모리 사용을 줄일 수 있다.
Fig. 8. Proposed Optimization of Interpolation in Toom-Cook Algorithm
제안하는 구현의 코드는 Fig. 9와 같다. 1~35단계는 레퍼런스 구현에서의 for 64~127단계에서 8개의 계수에 대한 보간과정을 병렬처리하는 단계이다. 1~35단계와 마찬가지로 for 0~63단계에 대한 8개 계수에 대한 보간과정을 병렬처리 후, 36~41단계를 통해 바로 두 개의 결과값에 대해 덧셈을 수행함으로써, 추가적인 메모리 접근 없이 최종 결과값이 반환된다. 42~49단계는 보간의 최종 결과값에 대해 메모리에 저장하는 단계이다. 위는 8개의 계수에 대한 병렬처리 과정으로 총 8번 위의 과정을 반복하게 되면 보간과정이 완료된다.
Fig. 9. Interpolation Implementation in NEON Engine
Ⅴ. 성능 측정
본 절에서는 제안하는 Toom-Cook 알고리즘의 평가 및 보간과정에 대한 성능 측정 결과를 제안한다. 우리는 라즈베리파이 4B 환경에서 성능을 측정하였으며, 라즈베리파이 4B는 4개의 코어 ARM Cortex-A72(ARMv8)과 4GB 내장 메모리를 탑재하고 있다. 우리의 타겟장비는 우분투 20.04 운영체제가 설치되어있으며, VS Codium 개발환경 내 AArch64-gnu-gcc 컴파일러를 통해 성능을 측정하였다. 또한, ARMv8 환경에서 이전 연구결과가 존재하지 않아 레퍼런스 구현과의 성능을 비교하였으며, 레퍼런스 구현은 C로 구현되어있고 사이클 측정 결과는 –O2 최적화 옵션을 적용하였다.
성능 측정 결과는 Table 3과 같다. 평가과정은 두 개의 다항식 A, B에 관한 결과의 클럭 사이클을 측정하였다. 평가과정에서는 ARM/NEON 인터리빙 구현과 8개 계수에 대한 병렬처리 기법을 통해 레퍼런스 구현보다 약 3.5배 향상되었다. 게다가 보간과정에서는 8개 계수에 대한 병렬처리 기법과 메모리 접근 부하를 최소화하여 레퍼런스 구현보다 약 5배 향상된 결과를 달성하였다. SABER에서 가장 성능 부하가 큰 부분은 행렬 곱셈으로 제안하는 방법을 통해 SABER 전체적으로는 더 큰 성능향상이 기대된다.
Table 3. Comparison of performance between reference implementation and our work
Ⅵ. 결론
양자 컴퓨팅 환경의 발전으로, 기존 공개키 암호의 안전성이 깨지면서, 양자내성암호의 중요성이 강조되고 있다. 특히 양자내성암호 중 격자기반 암호는 빠른 속도를 제공하여 실제 임베디드 환경에서도 적용하다. 게다가 ARMv8은 저전력과 고효율의 장점으로 앞으로도 임베디드 SoC로서 널리 활용될 것으로 기대된다. 하지만 임베디드 환경에서 양자내성암호의 최적화 구현연구 대부분은 ARM Cortex-M4 환경에서 수행하였다. 본 논문에서는 최초로 ARMv8 환경에서 NIST PQC SABER의 핵심 연산인 다항식 곱셈 Toom-Cook 알고리즘에 대한 최적화 구현 방법을 제안하였다. 제안하는 방법을 통해 평가 및 보간 과정에서 레퍼런스 구현보다 3.5배, 5배의 성능 향상을 달성하였다. 향후 Toom-Cook 알고리즘의 Karatsuba 곱셈 및 NTT 곱셈에 대한 최적화 구현을 연구할 계획이다.
References
- Peter W. Shor, "Polynomial-time algorithm for prime factorization and discrete logarithms on a quatum computer", SIAM review, vol. 41, no. 2, pp. 303-332, Oct. 1997 https://doi.org/10.1137/S0036144598347011
- NIST PQC Standardization "https://csrc.nist.gov/projects/post-quantum-cryptography", 2021. 4. 15
- Hwajeong Seo, Taehwan Park, Shinwook Heo, Gyuwon Seo, Bongjin Bae, Zhi Hu, Lu Zhou, Yasuyuki Nogami, Youwen Zhu, Howon Kim, "Parallel Implementations of LEA, Revisited", WISA, 10144, pp. 318-330, Aug. 2016
- Hwajeong Seo, Kyuhwang An, Hyeokdong Kwon, Taehwan Park, Zhi Hu and Howon Kim, "Parallel Implementations of CHAM", WISA, 11402, pp. 93-104, Aug. 2018
- Hwajeong Seo, Taehwan Park, Janghyun Ji, Zhi Hu, and Howon Kim, "ARM/NEON Co-design of Multiplication/Squaring", WISA, 10763, pp. 72-84, Aug. 2017
- ARMv8 A64 Instruction set, "https://developer.arm.com/documentation/ddi0596/2020-12/Base-Instructions", 2021. 4. 15
- ARMv8 ASIMD Instruction set, "https://developer.arm.com/documentation/ddi0596/2020-12/SIMD-FP-Instructions", 2021. 4. 15
- Leon Botros, Matthias J. Kannwischer, Peter Schwabe, "Memory-Efficient High-Speed Implementation of Kyber on Cortex-M4", AFRICACRYPTO, vol. 11627, pp 209-228, July. 2019
- Jose Maria Bermudo Mera, Angshuman Karmakar, and Ingrid Verbauwhede, ""Time-memory trade-off in Toom-Cook multiplication: an application to module-lattice based cryptography", CHES, vol. 2020, no. 2, pp. 222-244, Sep. 2020,
- Denisa O. C. Greconici, Matthias J. Kannwischer and Daan Sprenkels, "Compact Dilithium Implementations on Cortex-M3 and Cortex-M4", CHES, vol. 2021, no. 1, pp. 1-24, Sep. 2021