Lowent 매뉴얼←↑→

poly — Poly1305 한 번 쓰는 인증자

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

메시지를 16 바이트 블록으로 먹여 16 바이트 태그를 낸다. “이 바이트열을 이 키를 아는 누군가가 보냈다” 를 증언한다(RFC 8439 §2.5).

키는 메시지마다 새것이어야 한다

Poly1305 는 한 번 쓰는 인증자다. 같은 키로 두 메시지를 인증하면 키를 복원할 수 있고, 그때부터 위조할 수 있다. 그래서 aead 는 메시지마다 논스로 1 회용 키를 만들어 넘긴다(key_gen). 이 모듈을 직접 쓴다면 그 규율을 직접 진다. 상수 시간을 약속하지 않고(경계 검사와 멈춤이 있다) 감사받지 않았다. 태그 비교는 부르는 쪽의 몫이다 — 이른 반환 없이 비교한다(aead.unseal 이 하는 방식).

130 비트 산술을 26 비트 다섯 조각으로 나눠 u64 위에서 한다. 곱의 최대가 252 언저리라 u64 안에서 안전하다 — 자리 배치가 곧 안전 논증이고, 그래서 소스 머리에 그 수가 적혀 있다.

block 은 이 모듈이 말하는 뜻의 정의로 남는다. 다만 되풀이를 도는 자리는 aead 가 낱말 poly1305 로 부른다 — 상태의 자리가 같으므로(h 다섯 · r 다섯) setup 과 emit 은 그대로 언어에 있고, 가운데만 내려갔다(실측 331 → 1840 MB/s). 회귀 시험이 낱말과 block 의 되풀이를 같은 상태로 맞댄다.

op하는 일
setup키에서 상태(h 다섯 · r 다섯)를 세운다
block16 바이트 블록 하나를 먹인다. addhi 는 꽉 찬 블록이면 1
emit상태와 키로 태그 16 바이트를 낸다

표 50.1 — poly 의 op

addhi 가 인자인 까닭은 마지막 블록이 짧으면 최상위 1 비트를 다르게 놓아야 하기 때문이다. aead 는 pad16 으로 모든 블록을 꽉 채우므로 늘 1 을 넘긴다 — 패딩의 목적이 경우를 하나로 줄이는 것이라는 말이 여기서 실물이 된다.

확인하는 것 — RFC 8439 §2.5.2 태그 벡터와 VM·네이티브 일치. 짓지 않은 것 — 상수 시간 보장, 태그 비교, 키 재사용 감지, 이어 먹이는 상태의 직렬화.