Lowent 매뉴얼←↑→

der — DER 최소 파서

소스
lib/der.low
층
L0 — 순수 계산
권한
없음

X.509 인증서 바이트에서 공개키가 어디서 시작해 몇 바이트인지 알려 주고, PKCS#8 개인키 파일에서 EC 스칼라의 자리를 찾는다. 그 키로 서명을 검증하는 것은 p256 · rsa · ed25519 의 일이다.

PKI 가 아니다

체인 검증 · CA 신뢰 저장소 · 이름 대조 · 유효기간 · 폐기 · 확장(Extensions) — 하나도 하지 않는다. 그러므로 이것만으로 “이 인증서를 믿어도 되는가” 에 답할 수 없다. 부르는 쪽이 공개키를 고정(pinning) 하거나 자기 규칙으로 판단해야 한다. 반쯤 지은 PKI 는 없는 것보다 나쁘다 — 믿을 수 있다고 착각하게 만든다.

길이는 상대가 쓴 것이다. DER 의 모든 길이 필드는 공격자가 정한다. 그래서 이 파서는 셋을 지킨다 — 어떤 길이도 버퍼를 넘으면 즉시 실패한다(0 을 답한다). 긴 형식 길이는 4 바이트까지만 받는다. 재귀를 하지 않는다(깊이는 부르는 쪽이 정하는 반복이다). 모든 실패는 0 이다 — 예외가 아니라 값이다.

op하는 일
tag_atoff 위치의 태그 바이트
value_off · value_len그 TLV 의 값이 시작하는 자리 · 길이
next_off다음 형제 TLV 의 자리
is_spki이 자리가 SubjectPublicKeyInfo 모양인가
find_spki인증서 안에서 SPKI 를 찾는다
alg_oid_off · alg_oid_len알고리즘 OID 의 자리 · 길이
key_off · key_len공개키 비트열의 자리 · 길이
rsa_n_off · rsa_n_len · rsa_eRSA 키 안의 모듈러스 · 지수
p8_alg_off · p8_inner_off · p8_inner_lenPKCS#8 의 알고리즘 · 안쪽 키의 자리 · 길이
ec_priv_off · ec_priv_lenEC 개인키(스칼라)의 자리 · 길이

표 50.1 — der 의 op

자리로 세지 않고 모양으로 찾는다. SPKI 는 인증서의 여섯째이거나 일곱째 필드다 — version 이 있느냐에 따라 다르다. 자리로 세면 옛 인증서에서 조용히 어긋난다. 그래서 is_spki 는 SEQUENCE { SEQUENCE { OID … }, BIT STRING } 이라는 모양을 본다. 세는 것은 앞이 바뀌면 틀리고, 알아보는 것은 틀리지 않는다.

확인하는 것 — 파싱 결과를 눈으로 보지 않는다. RFC 8448 §3 의 실제 인증서에서 키를 꺼내 그 핸드셰이크의 CertificateVerify 서명을 검증한다. 파싱이 한 바이트라도 밀리면 서명이 맞지 않는다. 음성 둘(서명 · 전사 각 1 비트)도 본다. “꺼낸 값이 그럴듯한가” 를 사람이 보는 검사는 검사가 아니다.