Lowent 매뉴얼←↑→

p256 — NIST P-256 곡선과 ECDSA 검증

소스
lib/p256.low
층
L0 — 순수 계산(호출자의 뒷받침)
권한
없음

타원곡선 y² = x³ − 3x + b 위의 점 산술과, 그 위에 선 ECDSA 서명 검증이다. TLS 1.3 의 ecdsa_secp256r1_sha256 이 이 곡선을 쓴다.

무엇을 약속하고 무엇을 하지 않나

감사받지 않았다. 검증용 smul 은 스칼라 비트로 분기한다 — 검증에서 그 스칼라는 공개 정보라 괜찮다. 비밀 스칼라(개인키 · 논스)에는 smul_ct 를 쓴다 — 걸음마다 두 배와 덧셈을 둘 다 하고 쓸지 말지를 분기가 아니라 마스크로 고른다. 그 약속은 비밀에 의존하는 분기와 메모리 접근이 없다 는 데까지이고, 캐시 계층 · 전력 · 전자기는 약속하지 않는다. 점 압축 해제와 P-384 · P-521 은 없다.

왜 이 곡선인가. 공개 CA 가 실제로 발급하고 브라우저가 실제로 받아들이는 것이 P-256 과 RSA 다. ed25519 가 수학적으로 더 깔끔하지만 공개 웹에서는 통하지 않는다 — 수학이 아니라 생태계가 정한다. 서명 생성은 ecdsa 가 이 모듈 위에서 한다.

op하는 일
limbs조각 수(16 = 256 비트)
msub · madd모듈러 뺄셈 · 덧셈
minv모듈러 역원(페르마 거듭제곱)
pmul몽고메리 곱(bigint 의 것을 재사용)
make_r2R² mod p — 몽고메리 영역으로 들어가는 상수
pdbl · padd야코비 좌표 점 두 배 · 점 덧셈
is_zero무한원점인가
smul스칼라 곱 [k]P — 공개 스칼라용
smul_ct스칼라 곱 — 비밀 스칼라용, 분기 없이 마스크로 고른다
ecdsa_verify서명 (r, s) 가 해시 e 와 공개키에 맞는가

표 50.1 — p256 의 op

곡선 상수(p · n · Gx · Gy)는 호출자가 넘긴다.

왜 야코비 좌표인가 — 역원을 미루려고. 아핀 좌표의 점 덧셈은 매번 모듈러 역원을 요구하고, 역원은 곱보다 수백 배 비싸다. 야코비 좌표는 분모를 좌표 안에 들고 다녀 역원을 맨 끝 한 번으로 미룬다. 같은 이유로 ed25519 는 확장 좌표를 쓰는데, 그쪽 덧셈 공식은 완비라 예외 갈래가 없고 여기는 있다(같은 점이면 다른 식). 그 갈래가 padd 안에 있다.

확인하는 것 — NIST CAVP 의 P-256/SHA-256 서명 검증 벡터 양성 2 · 음성 8, 파이썬 참조 곡선과의 체 · 스칼라곱 대조, VM·네이티브 일치. 서명 검증 시험에 음성이 없으면 “언제나 참” 을 걸러내지 못한다 — 양성만 있는 검증 시험은 검증하지 않는다.