Channel Sounding: 위상과 왕복 시간으로 거리 재기
신호 세기(RSSI)로 거리를 어림하던 방식은 손으로 가리기만 해도 몇 미터씩 틀린다. Bluetooth 6.0의 Channel Sounding(CS)은 두 가지를 직접 잰다. 패킷이 갔다 오는 시간, 그리고 여러 주파수에서 돌아온 전파의 위상이다. 그리고 두 기기만 아는 난수로 채널 순서와 접근 주소를 매번 바꿔, 엉뚱한 기기가 끼어들기 어렵게 한다. 이 장은 그 난수 생성을 사양의 예제 데이터로 한 바이트씩 재현한다.
- CS 채널 72개와 스텝 모드 0~3이 각각 무엇을 재는지 설명할 수 있다.
- 왕복 시간과 위상 차이에서 거리를 계산하고, 위상 방식의 모호 거리를 구할 수 있다.
- CS DRBG의 h9·f7·f8·f9와 nonce의 카운터 칸을 따라가 사양 예의 난수를 재현할 수 있다.
- hr1·cr1로 채널을 섞고, 자기상관 점수로 접근 주소를 고르는 규칙을 적용할 수 있다.
CS 채널과 스텝 모드
CS는 광고·데이터 채널 번호와 별개로 2,402~2,480 MHz를 1 MHz 간격으로 나눈 79개 채널(인덱스 0~78, 주파수 = 2,402 + k MHz)을 쓴다. 그중 0·1, 23~25, 77·78은 쓰지 않는다(Table 1.1). 23~25는 2,425~2,427 MHz로 광고 채널 38(2,426 MHz) 자리이고, 양 끝은 대역 가장자리다. 남는 것은 2~22와 26~76, 72개다.
| 스텝 모드 | 교환 | 재는 것 | 지원 |
|---|---|---|---|
| 0 | CS_SYNC 주고받기 | 두 기기의 주파수 오차. 개시자(initiator)가 이후 스텝을 보정한다 | 필수 |
| 1 | CS_SYNC 주고받기 | 왕복 시간(RTT) | 필수 |
| 2 | CS 톤 주고받기 | 위상 회전(위상 기반 거리, PBR) | 필수 |
| 3 | CS_SYNC + 톤 | RTT와 위상 둘 다 | 선택 |
한 번의 측정은 CS 프로시저이고, 프로시저는 연결 이벤트에 맞춰 들어가는 서브이벤트로, 서브이벤트는 스텝으로 나뉜다. 서브이벤트는 모드 0 스텝 몇 개로 시작하고, 이어서 주 모드(Main_Mode, 예: 2) 스텝을 여러 번 하다가 가끔 부 모드(Sub_Mode, 예: 3)를 끼워 넣는다. 무엇을 언제 끼울지도 아래 DRBG가 정한다.
CS 채널(Table 1.1): [Vol 6] Part H §1 · CS_SYNC 형식: §2 · 스텝 모드 0~3: §4.3.1~§4.3.4 · 서브이벤트 구조·Sub_Mode 끼우기: §4.4
시간과 위상으로 거리 재기
왕복 시간(RTT): 개시자가 보낸 CS_SYNC를 반사자(reflector)가 정해진 시간 뒤 돌려보낸다. 양쪽이 잰 도착·출발 시각(ToA·ToD)을 빼면 순수한 비행 시간이 남고, 거리는 c × 시간 ÷ 2다. 빛은 1 ns에 약 30 cm를 가므로, 왕복 1 ns 오차가 거리 15 cm 오차다.
위상 기반(PBR): 주파수 f의 톤이 거리 d를 왕복하면 위상이 4πfd/c만큼 돈다. 위상 하나는 2π마다 같은 값이라 거리를 모르지만, 두 주파수의 위상 차이 Δφ = 4πΔf·d/c 에서 d = c·Δφ ÷ (4πΔf)를 얻는다. Δf가 1 MHz면 c/(2Δf) ≈ 150 m마다 같은 답이 반복된다(모호 거리). 실제로는 수십 개 채널의 위상을 모아 기울기를 맞추고, RTT로 어느 반복인지 고른다. 두 방식의 결합은 구현의 몫이고 사양은 측정값과 그 정확도 요구만 정한다.
RTT는 산에 소리치고 메아리가 올 때까지 시간을 재는 것이다. 정확하지만 시계가 아주 좋아야 한다. 위상은 연못에 일정한 간격으로 물결을 보내고 돌아온 물결의 마루가 어디쯤인지 보는 것이다. 물결 간격보다 작은 차이도 보이지만, 몇 번째 물결인지는 모른다. 그래서 둘을 같이 쓴다.
거리 → RTT와 채널별 왕복 위상
채널 2부터 Δf 간격으로 20개 채널의 왕복 위상(0~2π). 거리가 늘면 기울기가 가팔라진다.
RTT 측정과 ToA·ToD 보고 정확도: [Vol 6] Part H §3.1 · 위상 측정과 PCT: §3.3·§4.6 · 거리 계산 식은 물리 관계(사양 밖)
두 기기가 같은 난수를: CS DRBG
CS의 채널 순서, 접근 주소, 부 모드 위치, 톤 연장 슬롯, 안테나 순서, 사운딩 시퀀스 마커는 모두 CS DRBG가 정한다. 두 기기가 같은 씨앗에서 같은 난수를 만들기 때문에 미리 합의 없이도 같은 순서로 움직이고, 씨앗을 모르는 기기는 다음 채널이나 접근 주소를 맞힐 수 없다.
- CS 보안 시작: 암호화된 연결 위에서 두 기기가 각자 CS_IV 64비트, CS_IN 32비트, CS_PV 64비트를 보내고, 주변 기기(Peripheral) 쪽을 앞에 붙여 128·64·128비트 값을 만든다.
- h9: SM = f8(CS_IV ‖ CS_IN ‖ CS_PV), 그다음 (K, V) = f9(SM, 0, 0). f8은 고정 키 00 01 … 0F로 f7(CBC-MAC 같은 사슬)을 두 번 돌려 256비트 씨앗을 만들고, f9는 V의 마지막 바이트를 1씩 올리며 AES를 두 번 돌려 SM과 XOR한다.
- CS_DRBG: 128비트 = e(K, V + 카운터). V의 오른쪽 네 바이트가 카운터 칸이다. 옥텟 0 = Transaction_Counter, 옥텟 1 = Transaction_ID(표 4.16의 거래 종류), 옥텟 2~3 = Step_Counter(지금 스텝 번호를 더함).
- 거래 종류마다 128비트에서 앞(최상위)부터 필요한 만큼 꺼내 쓰고, 모자라면 남은 비트를 버리고 Transaction_Counter를 올려 새 블록을 만든다. 새 프로시저마다 f9(0, K, V)로 되돌림 방지(backtracking resistance)를 한다.
| Transaction_ID | 무엇을 정하나 |
|---|---|
| 0x00 | 모드 0이 아닌 스텝의 채널 순서(#3b·#3c) |
| 0x01 | 모드 0 스텝의 채널 순서(#3a) |
| 0x02 | 부 모드 끼워 넣을 위치 |
| 0x03 | 톤 연장 슬롯 유무 |
| 0x04 | 안테나 경로 순서 |
| 0x05 | CS 접근 주소 후보 |
| 0x06·0x07 | 사운딩 시퀀스 마커 위치·신호 |
| 0x08 | 랜덤 시퀀스 |
| 0x09 | 되돌림 방지 |
hr1(R)은 0~R−1 범위의 난수다. 8비트 v를 꺼내 T = R·v로 두고, 하위 8비트가 256 mod R보다 작으면(치우칠 수 있는 경우) 8비트를 하나 더 꺼내 ⌊(256·v₂·R + T) ÷ 65536⌋, 아니면 ⌊T ÷ 256⌋. cr1은 i = 0부터 차례로 j = hr1(i+1)을 뽑아 i번 자리를 j번과 바꾸는 피셔-예이츠 섞기다(hr1(1)은 비트를 쓰지 않고 0).
CS DRBG 재현 ([Vol 6] Part C §8.1.1 Set 1의 입력)
CS DRBG(f7·f8·f9·h9·CS_DRBG·되돌림 방지·nonce 칸): [Vol 6] Part E §3.1~§3.2 · 거래 종류(Table 4.16)와 hr1: [Vol 6] Part H §4.8, §4.8.1 · cr1과 #3a: §4.1.2, §4.1.3 · 예제 데이터: [Vol 6] Part C §8.1.1 · CS 보안 시작: [Vol 6] Part B §5.1.23
접근 주소 고르기와 트레일러
RTT를 재는 스텝마다 DRBG 128비트에서 32비트 후보 넷(s0, s1, s2, s3)을 뽑는다. 앞의 둘은 개시자 → 반사자, 뒤의 둘은 반사자 → 개시자 방향 후보다. 각 쌍에서 자기상관 점수가 낮은 쪽을 고르고, 같으면 두 번째를 고른다. 점수는 k = 1, 2, 3칸 떨어진 비트끼리 다른 횟수 Cₖ로 |2C₁ − 31| + |2C₂ − 30| + |2C₃ − 29|. 자기 자신을 조금 밀어 겹쳤을 때 닮지 않을수록 점수가 낮고, 그래야 도착 시각을 날카롭게 잡을 수 있다.
CS_SYNC의 접근 주소 뒤에는 4비트 트레일러가 붙는다. 접근 주소의 최상위 비트(마지막으로 보내는 비트)가 0이면 1010, 1이면 0101. 끝까지 0과 1이 번갈아 나오게 해서 마지막 비트의 경계를 분명히 한다.
스텝 0의 반사자 후보 00B8C55D와 F079BC3A는 점수가 둘 다 16이다. 무엇이 접근 주소가 될까?
같을 때의 규칙.
후보 순서·점수식·같을 때 규칙: [Vol 6] Part H §2.2, §2.2.1 · 트레일러: §2.3 · 예: [Vol 6] Part C §8.1.1(스텝 0~2의 점수 12/8, 16/16, 6/8, 10/14, 10/12, 28/8)
보안: 무엇을 막도록 설계되었나
거리 측정은 “가까이 있으면 문이 열린다” 같은 결정에 쓰이므로, 실제보다 가깝게 보이도록 신호를 꾸며 내는 시도를 견뎌야 한다. CS의 방어는 층으로 쌓여 있다.
- 예측 불가: 채널 순서, 접근 주소, 사운딩 시퀀스 마커가 DRBG에서 나오므로 씨앗(CS 보안 시작은 암호화된 연결에서만)을 모르면 미리 응답을 만들 수 없다.
- RTT와 위상의 교차 확인: 두 방식이 서로 다른 물리량을 재므로 하나만 속이면 어긋난다.
- 조기 응답 감지: 사운딩·랜덤 시퀀스에 대해 위상·진폭 기반 감지 지표를 계산하고 그 성능 요구를 사양이 정한다(6.2에서 진폭 기반 추가). 기기는 결과를 NADM(Normalized Attack Detector Metric) 값으로 보고한다.
판단은 결국 응용의 몫이다. 거리 하나로 잠금을 풀기보다, 여러 프로시저의 일관성과 감지 지표, 다른 인증 요소를 함께 쓰는 것이 권장되는 설계다.
조기 응답 감지(위상·진폭 기반)와 요구: [Vol 6] Part H §3.5~§3.5.4 · 사운딩 시퀀스 마커: §2.4 · 랜덤 시퀀스: §2.5
핵심 정리
- CS 채널은 2,402 + k MHz(k = 0~78) 중 72개(2~22, 26~76). 모드 0 주파수 보정, 1 RTT, 2 위상, 3 둘 다.
- 거리 = c × 왕복 시간 ÷ 2, 위상 방식은 d = c·Δφ ÷ (4πΔf), Δf = 1 MHz면 약 150 m마다 반복.
- CS DRBG: h9 = f8(씨앗) → f9, 출력 = e(K, V + 카운터). 카운터 칸은 Transaction_Counter·ID·Step_Counter.
- hr1은 치우칠 수 있으면 8비트를 더 뽑고, cr1은 피셔-예이츠 섞기.
- 접근 주소는 자기상관 점수가 낮은 후보(같으면 두 번째), 트레일러는 최상위 비트 0이면 1010.
확인 퀴즈
CS 채널 인덱스 24의 주파수와 사용 여부는?
왕복 시간이 비행만으로 20 ns다. 거리는 약?
CS DRBG nonce V에서 스텝마다 바뀌는 칸은?
hr1(19)에서 첫 바이트가 0x6C였다. 무엇이 일어나나?