Skip to content

v1.1.0 — 계산 잎을 자리에 가두고, 암호를 OpenSSL 옆에 세운다

Choose a tag to compare

@rubidus-api rubidus-api released this 24 Sep 14:34
· 68 commits to main since this release

무엇이 바뀌었나

이 판은 암호 처리량과 어휘의 범위, 둘을 고친다.

⚠ 깨지는 변경 — 계산 잎은 call_builtin 뒤에서만 선다

전역 어휘가 199 까지 왔고, 늘어난 것은 대부분 «한 프로그램이 한 번 쓰는» 낱말이었다.
그래서 계산 잎 열다섯을 자리로 가뒀다:

rem 전
let n u64 be sha256 msg out .

rem 후
let n u64 be call_builtin sha256 msg out .
  • 가둔 이름: clmul_lo clmul_hi aes_round aes_round_last aes_ctr ghash
    chacha20 poly1305 aes_gcm chacha_poly sha256 sha384 sha512
    crc32 hash_bytes rng_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)과 같거나 빠르다.

무엇이 그렇게 만들었나:

  1. 여덟 덩이를 엮는다 — aesenc 는 답이 나오기까지 네 사이클이라, 한 덩이를 직렬로 돌리면
    파이프라인이 비어 있다. 독립인 카운터 블록 여덟을 엮으면 그 구멍이 메워진다.
  2. 축약을 캐리 없는 곱셈 둘로 — H 를 미리 나눠 두고 몽고메리 꼴로. GHASH 82 → 6,491 MB/s.
  3. 폭 — ChaCha20 은 AVX2 여덟 블록(89 → 2,439), Poly1305 은 AVX2 네 블록(331 → 4,787).
  4. 흐름과 누산을 한 바퀴에(AES-GCM) — 지난 덩이를 누산하며 이번 덩이를 흘린다.
  5. 한 판을 여는 값을 없앴다 — 메시지마다 키 스케줄을 다시 펴고 있었다(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 — 표면은 조용히 바뀌지 않지만, 바뀔 수는 있다.