유한체 위 일반 타원 곡선 암호화를 위한 오픈 소스 VHDL IP, 부채널 저항성 강조
요약
IPECC는 유한체 위 일반 타원 곡선 암호화를 위한 오픈 소스 VHDL IP 블록입니다. SRAM 기반 FPGA 및 ASIC 흐름에 사용 가능하며, 특히 부채널 공격 방어 대책을 강조하여 설계되었습니다. Co-Z 산술과 다층 방어 기법을 적용해 높은 보안성과 효율성을 제공합니다.
핵심 포인트
- 유한체 위 타원 곡선 암호화를 위한 VHDL IP 블록입니다.
- FPGA 및 ASIC 모두에 사용 가능하며, 특히 부채널 공격 방어에 중점을 두었습니다.
- Co-Z 산술을 사용하여 논리 영역을 줄이고 성능 저하를 막았습니다.
- 다양한 부채널 방어 기법(주소 마스킹, 블라인딩 등)을 제공하여 보안성을 높였습니다.
IPECC: 유한체 위 일반 타원 곡선 암호화를 위한 오픈 소스 VHDL IP로, 부채널 저항성을 강조
Copyright (C) 2023
저자: Karim KHALFALLAH (mailto:[email protected]), Ryad BENADJILA (mailto:[email protected])
기여자: Adrian THILLARD, Emmanuel PROUFF
서론
IPECC는 소형 Weierstrass 형태로 정의된 유한체 위 타원 곡선에서 스칼라 곱셈 $[k]P$ 계산을 수행하는 하드웨어 IP 블록입니다. IPECC는 주로 SRAM 기반 FPGA(Xilinx 및 Intel-Altera 모두)를 위해 개발되었지만, 어떠한 제한 없이 ASIC 흐름의 입력으로도 사용될 수 있습니다.
코드와 본문의 나머지 부분에서 nn로 표시되는 소수 $p$의 크기는 암호학적 보안 수준을 정의합니다. 정의상 암호 계산에 사용되는 모든 큰 숫자는 nn비트 길이입니다. 매개변수 nn는 설계자가 합성 시점에 정적으로 정의하며, 임의의 정수 값으로 선택할 수 있습니다. 이를 위해서는 고유한 HDL 상수 값을 편집하기만 하면 됩니다. 제한은 오직 대상 회로/파트의 논리 및 메모리 자원에 의해서만 발생하는데, 이는 IP가 소비하는 논리와 메모리의 양이 nn의 값에 따라 명확하게 증가하기 때문입니다. 동적 소수 크기라는 선택적 기능은 큰 숫자의 크기를 동적으로 설정할 수 있게 해주며, 단 이 크기는 매개변수 nn으로 정적으로 설정된 값을 넘지 않아야 합니다 (이 경우 단순히 허용되는 최대 크기가 됩니다).
IPECC는 학술 연구뿐만 아니라 상업적 목적으로도 사용되도록 의도되었습니다.
- 최종 제품을 목표로 할 때, 이 IP는 Co-Z 산술에 의존하여 논리 영역(logic area)을 거의 절반으로 줄이면서도 처리량(throughput)이나 지연 시간(latency)에 영향을 주지 않아 매우 우수한 성능을 보일 것입니다. 부채널 공격(side-channel attacks) 방어 대책은 다층 방어 (defense-in-depth)의 관점으로 설계되었는데, 이는 보안이 단 하나의 고유한 방어 대책에 의존하는 것이 아니라 오히려 여러 겹의 방어 계층을 적용하는 것에 기반해야 함을 의미합니다. 따라서 모든 방어 대책은 합성 시간(synthesis time)에 하드웨어로 잠겨서 견고하고 안전한 구현을 강제할 수도 있고, 설계자가 소프트웨어적으로 비활성화할 수 있도록 남겨둘 수도 있습니다. 사용 가능한 부채널 방어 대책에는 double-and-add-always, $ ext{R}_0/ ext{R}_1$ 지점의 주소 마스킹 (address-masking, 또는 anti address-bit DPA 또는 ADPA), 민감한 중간 지점 좌표의 주소 셔플링 (address-shuffling), 블라인딩 (blinding, 개인 지수(private exponent)에 대한 무작위화), Z-마스킹 (Z-masking, 무작위화된 투영 좌표(projective coordinates)), 그리고 곡선 동형 무작위화 (curve isomorphic randomization)가 있습니다.
스칼라 곱셈은 계산 중 예외 상황(예: 지점 덧셈 수행 시 중간 지점이 같거나 반대가 되는 경우)이 발생하지 않는 한 상수 시간 (constant-time)으로 보장됩니다. IPECC는 자체 TRNG를 포함하고 있습니다.
- 학술 연구 목적으로, IPECC는 부채널 및 오류 공격의 실현 가능성과 효율성을 분석할 수 있는 강력하고 다재다능한 테스트베드를 제공합니다. 모든 대응책은 선택 사항이 되며, 합성 시간 또는 소프트웨어 구성을 통해 동적(즉, 런타임)으로 활성화하거나 완전히 제거할 수 있습니다. 반대로, 누출 측정 및 감지, 신호 대 잡음비 측정, 또는 능동 스트레스 테스트/섭동을 허용하기 위해 대응책의 일부 또는 전체 사용을 강제하는 것이 간단합니다. 디버그 기능은 중단점 설정과 단계별 실행을 허용합니다. 원격 장치(예: 오실로스코프/EM 주입 프로브)로 트리거-아웃 신호 생성이 가능하여, 특정 명령어, 연산 또는 계산의 명확한 격리, 패턴 감지 및 단계별 누출 감지를 할 수 있게 합니다.
IPECC 아키텍처는 매우 간단하며 부분 재프로그래밍이 가능합니다. 이는 임베디드 소프트웨어 루틴의 마이크로코드 실행에 부분적으로 기반하고 있어, 새로운 대응책을 구현하거나 새로운 공격 시나리오를 테스트하려는 경우 쉽게 편집할 수 있기 때문입니다.
IPECC는 완전히 합성 가능한 VHDL로 작성되었습니다. 높은 수준의 설명 접근 방식이 채택되었으며, 곱셈기-누산기(multiplier-accumulators)를 제외하고는 공급업체 종속적인 하드웨어 매크로의 명시적 인스턴스화가 없습니다. 이 경우 DSP 블록이라고 불리는 FPGA의 블랙박스 인스턴스화를 사용합니다.
IPECC는 AXI-lite 인터페이스(32비트/64비트 호환)로 패키징되어 있어, SoC-FPGA 설계나 ASIC 프로토타이핑과 같은 모든 ARM 또는 RISC-V 생태계 내부에 쉽게 플러그 앤 플레이 통합할 수 있습니다. 이는 소수의 제어 및 상태 레지스터와 선택적 비동기 인터럽트 생성 기능을 통해 쉽게 프로그래밍됩니다. 몽고메리 표현(Montgomery representation)에 관련된 사전 계산은 필드 소수 $p$의 새 값이 전송될 때 하드웨어에 의해 자동으로 수행되며, 소프트웨어로부터 추가적인 연산을 필요로 하지 않습니다.
소프트웨어 드라이버가 IPECC를 libecc 소프트웨어 라이브러리 프로젝트(github.com/libecc/libecc)와 연결하는 데 제공됩니다. libecc 프로젝트와 함께, IPECC는 모든 포인트 레벨 계산의 하드웨어 가속기를 제공하며, SoC 프로토타이핑 및 설계를 위한 EC-DSA 또는 ECDH와 같은 ECC 프로토콜을 구현하는 포괄적이고 고도로 안전한 솔루션을 제공합니다.
IPECC는 GPLv2 라이선스로 배포되며 ANSSI의 GitHub에서 https://github.com/ANSSI-FR/IPECC를 통해 다운로드할 수 있습니다.
주요 특징 (Highlights)
IPECC의 주요 기능은 다음과 같습니다:
-
완전 합성 가능하며, 모든 FPGA 벤더/파트 및 ASIC과 완벽하게 호환됩니다.
-
하드웨어 리소스 외에는 보안 크기에 제한이 없습니다.
-
모든 AMBA 기반 시스템과 호환되는 매우 간단한 AXI-lite 인터페이스를 가집니다.
-
사용 가능한 카운터메저(Countermeasures):
-
내장형 (Built-in)
-
포인트 검증: 가장 첫 번째 및 가장 마지막 연산으로 수행됩니다.
-
Anti-address bit DPA: 중간 포인트 좌표에 추가적인 셔플링 레이어를 적용합니다.
-
좌표 마스킹 (Z-masking)
-
상수 시간(Constant time) (예외가 발생하지 않는 경우)
-
-
선택적 (Optional)
-
스칼라 블라인딩 ($k' = k + ext{$ imes$} q$) : $ ext{$ imes$}$의 설정 가능한 크기($ ext{``nn''}$까지)를 가집니다.
-
각 스칼라 비트 처리 간 메모리 셔플링
-
곡선 동형화 무작위화 (Curve isomorphic randomization)
-
-
-
Co-Z 산술을 통한 실리콘 면적 감소
-
사용자 정의 가능한 Montgomery 승수(Montgomery multipliers) 개수
-
Montgomery 승수당 사용자 정의 가능한 곱셈기-누산기(multiplier-accumulators) 개수
-
내장형 TRNG 설계 (ES-TRNG from KU-Leuven, CHES'2018)
-
Montgomery 상수 자동 계산
-
선택적 동적으로 변경 가능한 대수(large numbers)/보안 매개변수 크기
-
선택적 GALS (Montgomery 승수가 자체 속도 향상 클럭 도메인을 갖는 경우)
하드웨어
하드웨어 doc/ipecc.pdf에 대한 문서는 아직 진행 중이지만, 부록에 튜토리얼이 포함되어 있으며 Xilinx Zynq-7000 FPGA를 대상으로 합니다.
(Digilent의 보드 Arty Z7-10이 튜토리얼의 하드웨어 지원으로 사용되지만, 설명된 모든 내용은 Zynq-UltraScale+ 회로에 직접 적용할 수 있습니다.)
이 튜토리얼에는 IP 커스터마이징, Vivado에서의 RTL 시뮬레이션 및 합성, 그리고 베어메탈(bare-metal) 소프트웨어와 임베디드 Linux 기반의 테스트 애플리케이션을 통해 IP를 구동하는 내용이 포함되어 있습니다.
또한 이 튜토리얼은 IP의 다양한 기능과 부채널 대응책(side-channel countermeasures)을 발견할 수 있는 좋은 시작점입니다.
소프트웨어
IPECC 드라이버
IPECC와 함께 제공되는 소프트웨어는 주로 driver 폴더에 있는 드라이버로 구성되어 있습니다. 메인 드라이버는 driver/hw_accelerator_driver_ipecc.c에 있으며, 커브 파라미터 설정, 포인트 배각(points doubling), 덧셈(addition), 부정(negation), 스칼라 곱셈(scalar multiplication), 비교(comparison) 등의 API를 driver/hw_accelerator_driver.h에 노출합니다.
driver/hw_accelerator_driver_ipecc_platform.c에는 플랫폼 적응(platform adherence)이 포함되어 있습니다: 이 드라이버는 독립 실행형 모드(즉, IP를 물리적 주소에 직접 매핑하는 방식)로 컴파일되거나, DEVMEM (/dev/mem) 매핑 또는 UIO 매핑을 사용하는 Linux 호환 모드로 컴파일될 수 있습니다 (User IO 인터페이스에 대한 자세한 정보는 여기를 참조하십시오).
driver/test_driver.c 파일에는 다양한 API에 대한 IP의 기본 테스트가 포함되어 있습니다. 이를 컴파일하려면 make 명령을 사용해야 합니다 (Zynq 플랫폼을 대상으로 하려면 arm-linux-gnueabihf-gcc 또는 이에 상응하는 컴파일러가 필요하며, 환경 변수 ARM_CC를 사용하여 컴파일러를 수정하십시오). 이 과정을 통해 각 플랫폼에 대해 세 개의 바이너리인 test_standalone, test_devmem, 그리고 test_uio가 컴파일되어야 합니다.
마지막으로, driver/hw_accelerator_driver_socket_emul.c에 에뮬레이션 드라이버도 제공합니다.
이 소프트웨어 계층은 TCP 소켓을 사용하여 Python 서버와 통신하며, 이 서버는 '실제 하드웨어'가 제공하는 API, 즉 점(point) 연산을 에뮬레이션하여 제공합니다. 이 아이디어는 실제 하드웨어가 없더라도 하드웨어 API를 사용하는 프로그램을 구현하고 디버깅할 수 있는 간단한 방법을 갖도록 하는 것입니다.
Python 서버는 driver/emulator_server/hw_driver_socket_emul_server.py에 있으며, 명령줄에서 직접 실행할 수 있습니다:
$ python3 driver/emulator_server/hw_driver_socket_emul_server.py
[+] IPECC 하드웨어 에뮬레이터 시작됨, 127.0.0.1:8080에서 대기 중
...
이 명령어는 localhost:8080에서 리스닝 모드로 소켓을 열고 '클라이언트' 연결을 기다립니다. make emulator 타겟을 사용하여 driver/test_driver.c 테스트 파일을 에뮬레이션 모드로 컴파일하는 것이 가능합니다. 이렇게 하면 일반 PC에서 서버 클라이언트로 실행할 수 있는 test_emul 바이너리가 컴파일됩니다:
./test_emul
드라이버 테스트에 오신 것을 환영합니다!
참고1: 드라이버는 IPECC와 함께 프로덕션 사용 준비가 되어 있지만, 디버그 기능은 핵심 기능에 주로 초점을 맞추었기 때문에 아직 작업 중입니다. 더 구체적으로 말하면, 브레이크포인트 및 IP 내부 메모리 덤핑, 그리고 TRNG 디버깅은 완전히 구현되거나 테스트되지 않았습니다. 이는 향후 업데이트에서 통합될 예정입니다.
참고: 해당 드라이버는 Zynq 32비트 플랫폼의 32비트 IP와 함께 32비트 모드에서 완전히 테스트되었습니다. 다른 모드(32비트 또는 64비트 소프트웨어와 32비트 또는 64비트 IP 매트릭스)는 작업 진행 중입니다. 비록 모든 모드에서 소프트웨어와 하드웨어를 컴파일할 준비가 되었지만, AXI 인터페이스 버스 폭과의 일부 종속성을 고려해야 합니다(이는 버스 컨트롤러가 메모리 접근을 분할하는 방식과 관련이 있습니다). IPECC 저장소는 모든 테스트 케이스가 커버되고 검증되면 업데이트될 것입니다.
libecc와의 IPECC 통합
IPECC와 그 드라이버는 libecc 프로젝트에 통합되어, 여기서 모든 곡선 연산이 하드웨어 가속으로 대체되었습니다. 이는 다양한 타원 곡선을 기반으로 하는 서명 방식 및 ECDH를 지원하는 완전한 ECC 라이브러리에서 하드웨어 가속의 사용을 보여줍니다.
IPECC로 libecc를 테스트하려면, 저장소를 클론하고 전용 IPECC 브랜치로 체크아웃하십시오:
$ git clone https://github.com/libecc/libecc
$ cd libecc
$ git checkout IPECC
그런 다음 드라이버를 가져오십시오(이것은 현재 저장소를 클론하고 IPECC 드라이버를 src/curve 폴더에 배치합니다):
$ make install_hw_driver
그다음, 기본 플랫폼을 선택하여 하드웨어 가속으로 라이브러리를 컴파일할 수 있습니다:
$ make clean && CC=arm-linux-gnueabihf-gcc \
EXTRA_CFLAGS="-Wall -Wextra -O3 -g3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -static" \
VERBOSE=1 USE_EC_HW=1 USE_EC_HW_DEVMEM=1 USE_EC_HW_LOCKING=1 BLINDING=1 make
...
참고로, USE_EC_HW=1은 하드웨어 가속기(hardware accelerator)를 선택하며 (이는 libecc에서 하드웨어 가속 백엔드를 활성화하는 데 필수적입니다), 그리고 USE_EC_HW_DEVMEM=1은 DEVMEM 백엔드를 선택합니다 (독립 모드에서는 USE_EC_HW_STANDALONE=1, UIO의 경우 USE_EC_HW_UIO=1, Python 서버를 사용하는 소켓 에뮬레이션의 경우 USE_EC_HW_SOCKET_EMUL=1을 사용할 수 있습니다). 또한, Zynq 플랫폼의 경우 CC 컴파일러를 arm-linux-gnueabihf-gcc로 재정의하고 (대상에 따라 필요에 맞게 조정하십시오), 플랫폼에 필요한 추가 CFLAGS를 추가합니다 (라이브러리 종속성 문제를 방지하기 위한 -static 바이너리 컴파일 포함). 마지막으로, 하드웨어 접근 중 스레드 안전성을 위해 USE_EC_HW_LOCKING=1을 사용합니다. 이 플래그는 멀티스레딩에 필수적입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기