ECC(타원곡선) 점연산 + ECDSA — bignum P3 위 keystone 후속
개요
libs/bignum.한선(임의정밀도 큰수, P3) 위에 실제
secp256k1(비트코인/
이더리움 서명곡선) 타원곡선 점연산과
ECDSA 서명/검증을 순수 한선씨로
구현. 교육/키스톤 목적(상수시간 아님). C 소스 무접촉, libs 신규 파일만.
무엇을 했는지
신규 libs/타원곡선.한선 (pkg/libs와 하드링크 자동 동기):
모듈러 산술: EC_모드, EC_모듈러역원(이진 확장유클리드 HAC 14.61)
점연산: EC_점덧셈/EC_점두배/EC_점스칼라곱(double-and-add), affine
곡선: EC_secp256k1, EC_토이곡선, EC_온커브검사
ECDSA: EC_ECDSA키생성, EC_서명, EC_검증
검증(전부 Python 독립구현 정확 일치):
토이곡선 y²=x³+2x+2 mod 17: 2G=(6,3), 3G=(10,6) ✅
secp256k1 2G/3G 좌표 4개 전부 Python·OpenSSL 대조 ✅
ECDSA 왕복: Q,r,s Python 일치 + 자기서명 검증=1(유효) ✅
위조방지: 변조 메시지 → 검증 -1(무효) ✅ (r+1 변조 케이스는 타임아웃 전 미출력)
성능 실측: 모듈러역원 ~0.3s, 점연산 ~1.5–2s, 스칼라곱(27비트) ~27s,
검증(2×256비트 스칼라곱) ~5–8분.
발견한 VM 함정 (후속 라이브러리 공통)
- 페르마 소정리 역원(a^(p-2))은 256비트 지수 반복이 배열힙 144M셀을 단
1회 호출로 소진(OOM) → 이진 확장유클리드로 교체.
- VM 배열/맵 힙은 자동 GC 없는 bump(배열1개≈4097셀, 맵1개≈1459셀).
메모리마커/복원(730/731),
맵힙마커/복원(734/735) 수동 회수. 점연산
함수를 반환 직전 마커복원+문자열재구성으로 "힙 중립"화.
- 매 스텝 문자열 직렬화는 문자열 핸들 상한(48만, exit43) 과소모 →
메모리마커() 정수조회로 배열힙 증가만 감시, 임계(1500만) 초과 시에만
직렬화하는 적응형 체크포인트.
관련 파일
/Users/ef/CrownyOS/crownyc/libs/타원곡선.한선 (신규, ≈21.5KB)
/Users/ef/CrownyOS/crownyc/docs/한선씨-P4보완-20260710/ECC검증.md (검증 로그)
- 기반(수정 없음):
libs/bignum.한선
- Python 오라클:
scratchpad/ecc/ref.py (OpenSSL 파싱 매개변수)
잔여 이슈
- 상수시간 아님(사이드채널). Jacobian 좌표 미구현(성능). Ed25519 별도 과제.
- 실 TLS/지갑 미연동, DER/compressed pubkey 직렬화 미구현.
- 검증이 유독 느림: u1/u2는 개인키가 작아도 항상 256비트 → 개선하려면
Jacobian+windowed NAF 필요(후속).