aboutsummaryrefslogtreecommitdiffstats
path: root/docs/research/030-authenticated-document-peer.md
blob: 6e1fa23320976d93224c54e158b4c580574b0310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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`](../../core/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급 성능이나 임베디드급 **전체 앱** 메모리를 입증하지 않는다.