[카테고리:] 미분류

  • secp256k1.h와 secp256k1.c

    개요

    secp256k1.h와 secp256k1.c는 비트코인 코어 프로젝트에서 개발한 타원곡선 암호화 라이브러리의 핵심 파일입니다[1]. 이 라이브러리는 secp256k1 타원곡선에서의 암호화 연산을 최적화하여 구현한 C 라이브러리로, 비트코인과 같은 암호화폐에서 디지털 서명 및 키 생성에 사용됩니다[2]. 이 문서에서는 두 파일의 구조, 주요 기능, 그리고 내부 구현에 대해 자세히 알아보겠습니다.

    secp256k1.h 파일 분석

    파일 목적

    secp256k1.h는 라이브러리의 공개 API를 정의하는 헤더 파일입니다[1]. 이 파일은 라이브러리를 사용하는 외부 애플리케이션이 접근할 수 있는 모든 함수, 구조체, 상수를 선언합니다[3].

    주요 구조체

    secp256k1.h에는 다음과 같은 주요 구조체가 정의되어 있습니다:

    1. secp256k1_context_struct: 라이브러리의 컨텍스트를 저장하는 불투명(opaque) 구조체로, 부작용 채널 누출로부터 보호하기 위한 무작위화 데이터를 저장합니다[3].
    2. secp256k1_pubkey: 유효한 공개키를 저장하는 불투명 구조체로, 64바이트 크기입니다[3].
    3. secp256k1_ecdsa_signature: ECDSA 서명을 저장하는 불투명 구조체로, 64바이트 크기입니다[3].
    typedef struct secp256k1_context_struct secp256k1_context;
    
    typedef struct secp256k1_pubkey {
        unsigned char data[64];
    } secp256k1_pubkey;
    
    typedef struct secp256k1_ecdsa_signature {
        unsigned char data[64];
    } secp256k1_ecdsa_signature;

    주요 함수 그룹

    secp256k1.h에 선언된 함수들은 다음과 같은 그룹으로 분류할 수 있습니다:

    1. 컨텍스트 관리 함수:
    • secp256k1_context_create: 새 컨텍스트 생성[3]
    • secp256k1_context_clone: 컨텍스트 복제[3]
    • secp256k1_context_destroy: 컨텍스트 소멸[3]
    • secp256k1_context_randomize: 부작용 채널 보호를 위한 컨텍스트 무작위화[3]
    1. 공개키 관련 함수:
    • secp256k1_ec_pubkey_parse: 직렬화된 공개키 파싱[3]
    • secp256k1_ec_pubkey_serialize: 공개키 직렬화[3]
    • secp256k1_ec_pubkey_cmp: 공개키 비교[3]
    • secp256k1_ec_pubkey_create: 비밀키로부터 공개키 생성[3]
    1. ECDSA 서명 관련 함수:
    • secp256k1_ecdsa_signature_parse_der: DER 형식 서명 파싱[3]
    • secp256k1_ecdsa_signature_parse_compact: 컴팩트 형식 서명 파싱[3]
    • secp256k1_ecdsa_signature_serialize_der: DER 형식으로 서명 직렬화[3]
    • secp256k1_ecdsa_signature_serialize_compact: 컴팩트 형식으로 서명 직렬화[3]
    • secp256k1_ecdsa_sign: 메시지 해시에 서명[3]
    • secp256k1_ecdsa_verify: 서명 검증[3]
    1. 키 조작 함수:
    • secp256k1_ec_seckey_verify: 비밀키 유효성 검증[3]
    • secp256k1_ec_seckey_negate: 비밀키 부정[3]
    • secp256k1_ec_pubkey_negate: 공개키 부정[3]
    • secp256k1_ec_seckey_tweak_add: 비밀키에 스칼라 값 더하기[3]
    • secp256k1_ec_pubkey_tweak_add: 공개키에 스칼라 값 더하기[3]
    • secp256k1_ec_seckey_tweak_mul: 비밀키에 스칼라 값 곱하기[3]
    • secp256k1_ec_pubkey_tweak_mul: 공개키에 스칼라 값 곱하기[3]

    상수 및 플래그

    secp256k1.h는 다양한 상수와 플래그를 정의합니다:

    #define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT)
    #define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY)
    #define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN)
    #define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION)
    #define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION)

    이러한 플래그들은 컨텍스트 생성 및 공개키 직렬화 시 사용됩니다[3].

    secp256k1.c 파일 분석

    파일 목적

    secp256k1.c는 secp256k1.h에 선언된 공개 API 함수들의 실제 구현을 담고 있는 소스 파일입니다[4]. 이 파일은 다양한 내부 구현 파일들을 포함하여 전체 라이브러리의 기능을 통합합니다[4].

    주요 구현 세부사항

    1. 컨텍스트 구조체 구현:
       struct secp256k1_context_struct {
           secp256k1_ecmult_gen_context ecmult_gen_ctx;
           secp256k1_callback illegal_callback;
           secp256k1_callback error_callback;
           int declassify;
       };

    이 구조체는 타원곡선 곱셈 컨텍스트, 콜백 함수, 그리고 디클래시파이 플래그를 포함합니다[4].

    1. 인자 검증 매크로:
       #define ARG_CHECK(cond) do { \
           if (EXPECT(!(cond), 0)) { \
               secp256k1_callback_call(&ctx->illegal_callback, #cond); \
               return 0; \
           } \
       } while(0)

    이 매크로는 함수 인자의 유효성을 검사하고, 조건이 충족되지 않으면 콜백을 호출합니다[4].

    1. 정적 컨텍스트:
       static const secp256k1_context secp256k1_context_static_ = {
           { 0 },
           { secp256k1_default_illegal_callback_fn, 0 },
           { secp256k1_default_error_callback_fn, 0 },
           0
       };
       const secp256k1_context * const secp256k1_context_static = &secp256k1_context_static_;

    이 정적 컨텍스트는 제한된 기능만 제공하며, 주로 자체 테스트와 함께 사용됩니다[4].

    주요 함수 구현

    1. secp256k1_ecdsa_sign:
      이 함수는 메시지 해시에 ECDSA 서명을 생성합니다[4]. 내부적으로 secp256k1_ecdsa_sign_inner 함수를 호출하여 실제 서명 작업을 수행합니다[4].
    2. secp256k1_ecdsa_verify:
      이 함수는 ECDSA 서명의 유효성을 검증합니다[4]. 서명의 s 값이 낮은 형태인지 확인하고, 공개키를 로드한 후 서명을 검증합니다[4].
    3. nonce_function_rfc6979:
      이 함수는 RFC6979에 따라 결정론적 논스를 생성합니다[4]. 이는 동일한 메시지와 키에 대해 항상 동일한 논스를 생성하여 무작위성 문제로 인한 보안 취약점을 방지합니다[4].
    4. secp256k1_ec_pubkey_create:
      이 함수는 비밀키로부터 공개키를 생성합니다[4]. 내부적으로 secp256k1_ec_pubkey_create_helper 함수를 호출하여 실제 생성 작업을 수행합니다[4].

    내부 구현 구조

    secp256k1 라이브러리는 모듈식 구조로 설계되어 있으며, 다음과 같은 주요 구현 파일들을 포함합니다:

    필드 연산 구현

    필드 연산은 secp256k1 곡선의 유한체 상에서의 산술 연산을 구현합니다[5]:

    1. field_impl.h: 필드 연산의 일반적인 인터페이스를 정의합니다[5].
    2. field_5x52_impl.h: 64비트 아키텍처를 위한 5×52 비트 표현을 사용한 필드 연산 구현입니다[5][6].
    3. field_10x26_impl.h: 32비트 아키텍처를 위한 10×26 비트 표현을 사용한 필드 연산 구현입니다[5][6].

    스칼라 연산 구현

    스칼라 연산은 secp256k1 곡선의 그룹 위수에 대한 모듈로 연산을 구현합니다[7][8]:

    1. scalar_impl.h: 스칼라 연산의 일반적인 인터페이스를 정의합니다[7].
    2. scalar_4x64_impl.h: 64비트 아키텍처를 위한 4×64 비트 표현을 사용한 스칼라 연산 구현입니다[7][8].
    3. scalar_8x32_impl.h: 32비트 아키텍처를 위한 8×32 비트 표현을 사용한 스칼라 연산 구현입니다[7].

    그룹 연산 구현

    그룹 연산은 타원곡선 위의 점 연산을 구현합니다[9]:

    1. group_impl.h: 타원곡선 점 연산(덧셈, 두 배, 부정 등)을 구현합니다[9].
    2. ecmult_impl.h: 일반적인 점 스칼라 곱셈을 구현합니다[9][10].
    3. ecmult_gen_impl.h: 기준점(제너레이터)에 대한 스칼라 곱셈을 최적화하여 구현합니다[9][10].
    4. ecmult_const_impl.h: 상수 시간 점 스칼라 곱셈을 구현합니다[9].

    최적화 기법

    secp256k1 라이브러리는 다양한 최적화 기법을 사용하여 성능을 향상시킵니다:

    1. 내부 구조 최적화: 필드 연산에서 5×52 비트(64비트 아키텍처용) 또는 10×26 비트(32비트 아키텍처용) 표현을 사용하여 오버플로우를 최소화하고 성능을 향상시킵니다[6].
    2. 엔도모피즘 최적화: secp256k1 곡선은 특별한 엔도모피즘 속성을 가지고 있어, 스칼라 곱셈 연산을 약 30% 가속화할 수 있습니다[11]. 이는 scalar_split_lambda 함수를 통해 구현됩니다[7].
    3. 윈도우 방식 곱셈: 점 스칼라 곱셈에서 윈도우 방식을 사용하여 사전 계산된 테이블을 활용함으로써 성능을 향상시킵니다[9].
    4. 상수 시간 구현: 부작용 채널 공격을 방지하기 위해 많은 연산이 상수 시간으로 구현되어 있습니다[12].

    모듈 시스템

    secp256k1 라이브러리는 선택적으로 활성화할 수 있는 여러 모듈을 제공합니다:

    1. recovery: 서명으로부터 공개키를 복구하는 기능을 제공합니다[12][13].
    2. ecdh: 타원곡선 디피-헬만 키 교환 기능을 제공합니다[12][13].
    3. schnorrsig: BIP-340에 따른 슈노르 서명 기능을 제공합니다[12][13].
    4. extrakeys: 추가적인 키 관리 기능을 제공합니다[4].
    5. ellswift: BIP-324에 따른 ElligatorSwift 키 교환 기능을 제공합니다[5].

    이러한 모듈들은 컴파일 시 ENABLE_MODULE_XXX 플래그를 통해 활성화할 수 있습니다[4].

    빌드 및 컴파일 옵션

    secp256k1 라이브러리는 다양한 빌드 옵션을 제공합니다:

    1. 필드 구현 선택:
    • 64비트 아키텍처에서는 5×52 비트 표현이 기본값입니다[6].
    • 32비트 아키텍처에서는 10×26 비트 표현이 기본값입니다[6].
    1. 최적화 옵션:
    • ECMULT_WINDOW_SIZE: 점 곱셈에 사용되는 윈도우 크기를 설정합니다[14].
    • ECMULT_GEN_PREC_BITS: 기준점 곱셈의 정밀도 비트를 설정합니다[14].
    1. 모듈 활성화:
    • ENABLE_MODULE_RECOVERY: 공개키 복구 모듈을 활성화합니다[15][16].
    • ENABLE_MODULE_ECDH: ECDH 모듈을 활성화합니다[4][16].
    • ENABLE_MODULE_SCHNORRSIG: 슈노르 서명 모듈을 활성화합니다[4][16].
    1. 실험적 기능:
    • SECP_BUNDLED_EXPERIMENTAL: 실험적 모듈을 활성화합니다[17][16].

    결론

    secp256k1.h와 secp256k1.c는 비트코인과 같은 암호화폐에서 사용되는 고성능 타원곡선 암호화 라이브러리의 핵심 파일입니다[1][2]. 이 라이브러리는 secp256k1 곡선에서의 ECDSA 서명 생성 및 검증, 키 생성, 직렬화 등의 기능을 제공하며, 다양한 최적화 기법을 통해 뛰어난 성능을 발휘합니다[12][13].

    라이브러리는 모듈식 구조로 설계되어 있어 필요에 따라 추가 기능을 선택적으로 활성화할 수 있으며, 다양한 아키텍처에서 최적의 성능을 발휘할 수 있도록 여러 구현 방식을 제공합니다[5][6]. 또한 상수 시간 구현과 같은 보안 기능을 통해 부작용 채널 공격에 대한 보호를 제공합니다[12].

    이러한 특성들로 인해 secp256k1 라이브러리는 암호화폐 시스템뿐만 아니라 높은 성능과 보안이 요구되는 다양한 암호화 애플리케이션에서 널리 사용되고 있습니다[2][12].

    출처
    [1] secp256k1/include/secp256k1.h at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/include/secp256k1.h
    [2] bitcoin-core/secp256k1: Optimized C library for EC … – GitHub https://github.com/bitcoin-core/secp256k1
    [3] secp256k1 library building for C++ – Bitcoin Stack Exchange https://bitcoin.stackexchange.com/questions/115642/secp256k1-library-building-for-c
    [4] Secp256k1 in secp256k1 – Rust https://tidelabs.github.io/tidechain/secp256k1/struct.Secp256k1.html
    [5] [PDF] Implementation of PSEC-KEM (secp256r1 and secp256k1) on … https://cse.iitkgp.ac.in/~debdeep/osscrypto/psec/downloads/PSEC-KEM_prime.pdf
    [6] GitHub – ludbb/secp256k1-py: Python FFI bindings for secp256k1 :dizzy: https://github.com/ludbb/secp256k1-py
    [7] secp256k1 – PyPI https://pypi.org/project/secp256k1/
    [8] secp256k1-zkp on Pypi https://libraries.io/pypi/secp256k1-zkp
    [9] Crate bitcoinsecp256k1_scalarCopy item path https://docs.rs/bitcoinsecp256k1-scalar/latest/bitcoinsecp256k1_scalar/
    [10] How to compile Secp256K1 .a static library for different architectures https://github.com/bitcoin-core/secp256k1/issues/1109
    [11] secp256k1/src at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/tree/master/src
    [12] README ¶ https://pkg.go.dev/github.com/ltcmweb/secp256k1
    [13] libsecp256k1 https://packages.guix.gnu.org/packages/libsecp256k1/
    [14] [PDF] Speed Optimizations in Bitcoin Key Recovery Attacks https://eprint.iacr.org/2016/103.pdf
    [15] damus http://git.jb55.com/damus/file/nostrdb/secp256k1.h.html
    [16] Using secp256k1 with wolfSSL: A Step-by-Step Guide https://wolfssl.com/using-secp256k1-with-wolfssl-a-step-by-step-guide
    [17] q9f/secp256k1.cr – GitHub https://github.com/q9f/secp256k1.cr
    [18] Failed to compile with secp256k1 library – Stack Overflow https://stackoverflow.com/questions/70462459/failed-to-compile-with-secp256k1-library
    [19] Secp256k1 – bitcoin-s https://bitcoin-s.org/docs/next/secp256k1/secp256k1
    [20] Secp256k1 – River https://river.com/learn/terms/s/secp256k1/
    [21] Documentation ¶ https://pkg.go.dev/gitlab.com/yawning/secp256k1-voi/secec
    [22] bitcoin-core-secp256k1 on CocoaPods https://libraries.io/cocoapods/bitcoin-core-secp256k1
    [23] secp256k1/src/secp256k1.c at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/src/secp256k1.c
    [24] GitHub – qdrvm/libsecp256k1: Optimized C library for EC operations on curve secp256k1 https://github.com/qdrvm/libsecp256k1
    [25] Trying to attack SECP256K1 (2025) – LinkedIn https://www.linkedin.com/pulse/trying-attack-secp256k1-2025-sebastian-arango-vergara-s3fyc
    [26] Secp256k1 – Bitcoin Wiki https://en.bitcoin.it/wiki/Secp256k1
    [27] secp256k1 package – github.com/decred/dcrd/dcrec/secp256k1/v4 https://pkg.go.dev/github.com/decred/dcrd/dcrec/secp256k1/v4
    [28] secp256k1/src/scalar_4x64_impl.h at master · bitcoin-core/secp256k1 https://github.com/bitcoin-core/secp256k1/blob/master/src/scalar_4x64_impl.h
    [29] What is the difference between secp256k1_ecmult_gen and secp256k1_ecmult? https://bitcoin.stackexchange.com/questions/103060/what-is-the-difference-between-secp256k1-ecmult-gen-and-secp256k1-ecmult
    [30] GitHub – demining/Endomorphism-Secp256k1: Speed up secp256k1 with endomorphism https://github.com/demining/Endomorphism-Secp256k1