aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/030-authenticated-document-peer.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-24 17:14:54 +0100
committereunhhu <[email protected]>2026-09-24 17:14:54 +0100
commitb1ce1927022d374198441afafeb27199fc8a052a (patch)
tree6021f175f4c67ed03b44240eaa2f90d846f12f6f /docs/research/030-authenticated-document-peer.md
parentd34f9426d5317a1948f12f229439946728bc342a (diff)
downloadpure-b1ce1927022d374198441afafeb27199fc8a052a.tar.gz
pure-b1ce1927022d374198441afafeb27199fc8a052a.zip
Establish native micro runtime checkpoint
Diffstat (limited to 'docs/research/030-authenticated-document-peer.md')
-rw-r--r--docs/research/030-authenticated-document-peer.md85
1 files changed, 85 insertions, 0 deletions
diff --git a/docs/research/030-authenticated-document-peer.md b/docs/research/030-authenticated-document-peer.md
new file mode 100644
index 0000000..1ff569d
--- /dev/null
+++ b/docs/research/030-authenticated-document-peer.md
@@ -0,0 +1,85 @@
+# 030 — 같은 문서 작업을 인증된 Pure 피어로 연결
+
+2026-09-24. Linux AArch64, C17/GCC 14.2, OpenSSL 3. 첫 공개 체크포인트의 중간 결과다.
+기존 [`editor.pure`](../../prototypes/connections/examples/editor.pure)를 문서 CLI·HTTP·GTK 창과
+**같은** 준비·실행 코어에서 선택형 TLS 피어로 실행했다. 기본 빌드에는 TLS가 들어가지 않는다.
+
+## 실제 경로와 제거한 전송
+
+`pure-document-peer`는 TLS 1.3/TCP의 상호 인증, 인증서 SAN 이름 확인, `pure-doc/1`
+ALPN 뒤에 자체 이진 메시지를 사용한다. 이미 구현한 scalar 피어의 소켓·TLS 부분을
+[`tls-link.c`](../../prototypes/common/tls-link.c)로 분리해 두 피어가 재사용한다.
+코어의 [`runtime.c`](../../prototypes/connections/runtime.c), 저장소, `editor.pure`는
+문서 CLI와 같다. 전송 코드는 선택 빌드의 호스트에만 있다.
+
+서버가 보내는 40 B hello는 `PDOC`, 버전 1, 예약 3 B, **원본 .pure 소스** SHA-256이다.
+네이티브 클라이언트는 자신이 준비한 소스와 같은지 작업 전에 확인한다. 이는 현재의
+엄격한 호환성 검사이며 인증 수단은 아니다. 인증은 TLS 인증서가 담당한다. 같은 의미라도
+공백이 다른 소스는 불일치하며, 별도 외부 클라이언트는 인증을 통과하면 정의 검사 없이
+이 공개 형식을 직접 구현할 수 있다.
+
+요청은 14 B 고정 머리, 1~64 B 키, 선택한 본문 순서다. 머리는 작업 종류 1 B,
+키 길이 1 B, 기대 버전 big-endian 8 B, 본문 길이 big-endian 4 B이다. 작업 종류의
+하위 7비트는 읽기 `1` 또는 쓰기 `2`, 최상위 비트는 **응답 본문을 소비함**을 뜻한다.
+응답은 상태 1 B, 결과 버전 big-endian 8 B, **논리적 결과 길이** big-endian 4 B,
+요청한 경우에만 결과 본문이다. 따라서 응답 본문을 원하지 않는 네이티브 편집 명령도
+프로그램이 산출한 길이를 받지만 그 바이트는 전송받지 않는다. 읽기 명령은 본문을 요청한다.
+
+쓰기 수신에서는 길이·예산·키를 확인해 실행 코어의 작업과 입력 영역을 **본문을 읽기
+전에** 예약한다. TLS 평문을 그 입력 영역에 직접 채운 뒤 한 번 공개한다. 송신에서는
+완료 결과가 대여한 범위를 TLS로 나눠 보낸 뒤 작업을 해제한다. 별도의 문서 전체
+프레임 버퍼는 없다. OpenSSL 내부 버퍼, 커널 버퍼와 저장소의 파일 재작성 비용까지
+없앤다는 뜻은 아니다. 본문이 잘리면 작업을 실행하지 않고 해제한다.
+
+1 MiB 삽입을 네이티브 피어에서 호출하면 프로그램의 논리적 응답 크기는 1 MiB지만
+그 호출은 응답 본문을 소비하지 않아 **TLS 앱 데이터에서 본문 1,048,576 B를 생략**한다.
+같은 세션의 Python 클라이언트가 본문을 요청한 경우에는 전부 받았고, 다음 요청도 같은
+세션에서 해석됐다. 이 수치는 이 형식의 바이트 차이이며 지연·CPU 우위 측정은 아니다.
+
+## 재현과 비용
+
+`make -C prototypes/connections document-peer`로 선택 빌드한다. 인증서 준비와 실제
+C↔C·Python↔C 시나리오는 `make -C prototypes/connections check-document-peer`로
+재현한다. [일반 빌드의 실제 TLS 결과](../../prototypes/connections/results/2026-09-24-document-peer/peer-flow.json)와
+[ASan/UBSan 결과](../../prototypes/connections/results/2026-09-24-document-peer/peer-sanitized.json)는
+상호 인증 거부, 서버 이름·ALPN 불일치, 정의 불일치, 지속 연결의 생성·읽기·충돌,
+CLI와 교차 편집, 1 MiB 분할 수신·대여 응답, C 피어의 1 MiB 업로드,
+잘린·잘못된·초과 본문, 유휴 기한, 재시작 후 전체 복원을 통과했다.
+계측 빌드에서 OpenSSL 라이브러리 자체는 ASan으로 재빌드하지 않았다.
+공통 TLS 코드로 전환한 기존 scalar 피어의 인증·기한·재접속
+[회귀](../../prototypes/connections/results/2026-09-24-document-peer/scalar-refactor.json)도 다시 통과했다.
+기존 생성된 Zig 산출물에 새 C 코드를 링크해 확인했으며, 이 환경에는 Zig 0.15.2가
+없어 전체 scalar 앱 재생성 빌드는 이번 검증에서 실행하지 못했다.
+문서 경로는 별도 빈 `build/checkpoint-clean` 디렉터리에서도 전체 기본 빌드와 피어를
+다시 만든 뒤 [기본 릴리스 검사](../../prototypes/connections/results/2026-09-24-document-peer/clean-release.log),
+[선택형 피어 검사](../../prototypes/connections/results/2026-09-24-document-peer/clean-peer.log)를
+통과했다.
+
+같은 호스트의 [ELF 섹션](../../prototypes/connections/results/2026-09-24-document-peer/size.txt),
+[파일 크기](../../prototypes/connections/results/2026-09-24-document-peer/file-sizes.txt),
+[직접 동적 의존성](../../prototypes/connections/results/2026-09-24-document-peer/dynamic.txt),
+[선택 빌드 예산 검사](../../prototypes/connections/results/2026-09-24-document-peer/peer-budget.json),
+[소스·실행물 해시](../../prototypes/connections/results/2026-09-24-document-peer/hashes.txt)를
+따로 남겼다.
+
+| 선택 구성 | 코드 섹션 `text` | 확인한 실제 비용 |
+|---|---:|---|
+| 실행 코어 아카이브 | 5,932 B | 기존 6 KiB 예산 검사 그대로 통과 |
+| 기본 문서 CLI | 35,807 B | libc 직접 의존 |
+| 기본 HTTP 호환 서버 | 42,761 B | libc 직접 의존 |
+| **선택형 문서 TLS 피어** | **46,878 B** | stripped 68,312 B; libssl·libcrypto·libc 직접 의존 |
+
+선택형 서버 프로세스의 `/proc` RSS는 연결 전 **7,840 KiB**, 서로 다른 두 1 MiB
+문서를 처리한 뒤 **9,488 KiB**였다. 여기에는 선택한 TLS 라이브러리와 호스트 비용이
+포함된다. ASan 빌드의 22,592/31,632 KiB는 검증 전용이다. 기본 코어가 작다는
+사실을 이 전체 수치 대신 내세우지 않는다. UI는 별도 선택 구성이고 이전 GTK 문서
+창의 44 MiB RSS도 여전히 남아 있다.
+
+## 아직 해결하지 않은 계약
+
+서버는 한 시점에 연결 하나와 작업 슬롯 하나만 처리한다. 호출 다중화, 느린 연결 사이의
+공정성, 재시도 식별자·중복 실행 억제, 키별 권한, 일반 앱 형식 협상, QUIC, 인터넷 환경의
+실패·부하·지연 검증은 없다. 각 요청의 TLS 읽기·쓰기에는 현재 5초 절대 기한이 있다.
+응답이 끊긴 쓰기는 이미 저장됐을 수 있으므로 클라이언트는 재시도 전에 읽어 확인해야 한다.
+저장소는 변경이 작아도 파일 전체를 다시 기록한다. 이 경로는 실용 문서 작업의 연결을
+검증하지만 Kitex급 성능이나 임베디드급 **전체 앱** 메모리를 입증하지 않는다.