v1.1.0 — 계산 잎을 자리에 가두고, 암호를 OpenSSL 옆에 세운다
무엇이 바뀌었나
이 판은 암호 처리량과 어휘의 범위, 둘을 고친다.
⚠ 깨지는 변경 — 계산 잎은 call_builtin 뒤에서만 선다
전역 어휘가 199 까지 왔고, 늘어난 것은 대부분 «한 프로그램이 한 번 쓰는» 낱말이었다.
그래서 계산 잎 열다섯을 자리로 가뒀다:
rem 전
let n u64 be sha256 msg out .
rem 후
let n u64 be call_builtin sha256 msg out .
- 가둔 이름:
clmul_loclmul_hiaes_roundaes_round_lastaes_ctrghash
chacha20poly1305aes_gcmchacha_polysha256sha384sha512
crc32hash_bytesrng_next - 맨몸으로 부르면
E-BUILTIN-BARE, 닫힌 집합 밖의 이름이면E-BUILTIN-NAME. - 전역 어휘 199 → 185. 앞으로 계산 잎이 몇이 늘든 전역은 안 는다.
- 새 장치가 아니다 —
pipe … do take 3 … end의 닫힌 어휘와cast u8 x의 타입 자리가
이미 같은 규율을 쓴다: 자리가 정해져 있어 사용자 이름과 안 부딪친다. - 정본 §6.3.3 (1c)(1d) 에 적혀 있고 거부 예제가 붙어 있다.
암호 처리량
같은 상자에서 OpenSSL 과 나란히 잰 수다(Intel CC150 @3.5GHz, gcc, 정렬 판 셋의 각 열 최선).
★ 이 저장소의 크립토는 상수시간을 약속하지 않고 감사받지 않았다. 이 표의 쓸모는 회귀 기준선이다.
| 크기 | AES-128-GCM 전 | 후 | OpenSSL |
|---|---|---|---|
| 1 KiB | 153 | 1,234 | 2,019 |
| 16 KiB | 1,482 | 3,322 | 4,593 |
| 4 MiB | 303.7 | 3,680 | ~5,000 |
| 크기 | ChaCha20-Poly1305 전 | 후 | OpenSSL |
|---|---|---|---|
| 1 KiB | 536 | 1,007 | 1,753 |
| 16 KiB | 1,061 | 1,606 | 1,914 |
| 4 MiB | 68.6 | 1,574 | 2,059 |
잎 단독으로는 aes_ctr 가 5,490 MB/s 로 같은 상자 OpenSSL(5,449)과 같거나 빠르다.
무엇이 그렇게 만들었나:
- 여덟 덩이를 엮는다 —
aesenc는 답이 나오기까지 네 사이클이라, 한 덩이를 직렬로 돌리면
파이프라인이 비어 있다. 독립인 카운터 블록 여덟을 엮으면 그 구멍이 메워진다. - 축약을 캐리 없는 곱셈 둘로 — H 를 미리 나눠 두고 몽고메리 꼴로. GHASH 82 → 6,491 MB/s.
- 폭 — ChaCha20 은 AVX2 여덟 블록(89 → 2,439), Poly1305 은 AVX2 네 블록(331 → 4,787).
- 흐름과 누산을 한 바퀴에(AES-GCM) — 지난 덩이를 누산하며 이번 덩이를 흘린다.
- 한 판을 여는 값을 없앴다 — 메시지마다 키 스케줄을 다시 펴고 있었다(16,505 사이클).
CTR 은 평문이 0 이면 답이 곧AES_K(카운터)이므로 잎 두 번이면 된다.
이 하나로 1 KiB 가 여덟 배가 됐다.
새 낱말 넷 (전부 call_builtin 뒤)
chacha20 · poly1305 · aes_gcm · chacha_poly.
뜻은 모두 «있는 잎을 차례로 부른 것» 과 같고, 기계 판만 다르게 돈다 —
그래서 회귀 시험의 판정이 «따로 부른 것과 같은가» 하나로 환원된다.
--hw 가 폭과 지름길을 받는다
--hw none | auto | pclmul,aes,sse2,avx2,asm.
담는 범위는 빌드가 정하고, 담은 것이 둘 이상이면 시작할 때 한 번 골라 고정한다.
없는 기계에 담으라면 E-HW-TARGET 으로 거절한다 — 조용히 평범한 코드로 바꾸지 않는다.
확인한 것
- 골든 전량 통과 · 게이트 t3 통과
- NIST SP 800-38D GCM 벡터와 RFC 8439 (§2.3.2 · §2.5.2 · §2.8.2 · 변조 거절)가
none|sse2|avx2|aes|pclmul|auto여섯 모드와 VM 에서 모두 선다 - 낱말과 이 언어로 쓴 정의(
lib/aes.low·lib/chacha.low·lib/poly.low·lib/gcm.low)가
같은 답을 낸다 — 그 정의들은 지워지지 않았다
알려진 한계
- 상수시간을 약속하지 않고 감사받지 않았다.
- 기계 명령 경로는 x86-64 에서만 돈다. 다른 기계는 같은 답을 내는 셈 판으로 돈다.
- 호환성 epoch 는 여전히
provisional— 표면은 조용히 바뀌지 않지만, 바뀔 수는 있다.