Chapter 16

Channel Sounding: 위상과 왕복 시간으로 거리 재기

신호 세기(RSSI)로 거리를 어림하던 방식은 손으로 가리기만 해도 몇 미터씩 틀린다. Bluetooth 6.0의 Channel Sounding(CS)은 두 가지를 직접 잰다. 패킷이 갔다 오는 시간, 그리고 여러 주파수에서 돌아온 전파의 위상이다. 그리고 두 기기만 아는 난수로 채널 순서와 접근 주소를 매번 바꿔, 엉뚱한 기기가 끼어들기 어렵게 한다. 이 장은 그 난수 생성을 사양의 예제 데이터로 한 바이트씩 재현한다.

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개다.

스텝 모드교환재는 것지원
0CS_SYNC 주고받기두 기기의 주파수 오차. 개시자(initiator)가 이후 스텝을 보정한다필수
1CS_SYNC 주고받기왕복 시간(RTT)필수
2CS 톤 주고받기위상 회전(위상 기반 거리, PBR)필수
3CS_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

프로시저 한 번의 거리 측정 서브이벤트 서브이벤트 1 서브이벤트 2 … 연결 이벤트에 맞춰 들어간다 스텝 0 0 주 2 주 2 부 3 주 2 주 2 … 모드 0: 주파수 오차 맞추기 주 모드(예: 2 = 톤, 위상) 사이에 가끔 부 모드(예: 3 = RTT + 톤) 스텝마다 CS 채널(79개 중 72개 사용, 1 MHz 간격)이 바뀌고, 순서와 끼울 자리는 두 기기가 같은 CS DRBG로 정한다
그림 16-1. CS 측정의 구조. 한 번의 측정(프로시저)은 연결 이벤트에 맞춰 들어가는 서브이벤트들로 나뉘고, 서브이벤트는 스텝으로 나뉜다. 서브이벤트는 모드 0 스텝(주파수 오차 보정)으로 시작해 주 모드 스텝을 이어 가고, 가끔 부 모드 스텝을 끼운다. 스텝마다 다른 CS 채널을 쓰며, 채널 순서와 부 모드를 끼울 자리는 두 기기가 같은 난수 생성기(CS DRBG)로 정한다.

시간과 위상으로 거리 재기

왕복 시간(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는 산에 소리치고 메아리가 올 때까지 시간을 재는 것이다. 정확하지만 시계가 아주 좋아야 한다. 위상은 연못에 일정한 간격으로 물결을 보내고 돌아온 물결의 마루가 어디쯤인지 보는 것이다. 물결 간격보다 작은 차이도 보이지만, 몇 번째 물결인지는 모른다. 그래서 둘을 같이 쓴다.

SIMULATOR

거리 → RTT와 채널별 왕복 위상

채널 2부터 Δf 간격으로 20개 채널의 왕복 위상(0~2π). 거리가 늘면 기울기가 가팔라진다.

왕복 비행 시간—
이웃 채널 위상 차 Δφ—
위상으로 구한 거리—
모호 거리 c/(2Δf)—
잡음·다중 경로가 없는 이상적인 계산이다. 해볼 것: 거리를 150 m 넘게 올리면 위상 방식의 답이 0 근처로 되돌아간다(Δf = 1 MHz). Δf를 키우면 모호 거리가 줄어든다. 그래서 위상만으로는 “몇 번째 반복인지”를 알 수 없고 RTT가 필요하다.

RTT 측정과 ToA·ToD 보고 정확도: [Vol 6] Part H §3.1 · 위상 측정과 PCT: §3.3·§4.6 · 거리 계산 식은 물리 관계(사양 밖)

두 기기가 같은 난수를: CS DRBG

CS의 채널 순서, 접근 주소, 부 모드 위치, 톤 연장 슬롯, 안테나 순서, 사운딩 시퀀스 마커는 모두 CS DRBG가 정한다. 두 기기가 같은 씨앗에서 같은 난수를 만들기 때문에 미리 합의 없이도 같은 순서로 움직이고, 씨앗을 모르는 기기는 다음 채널이나 접근 주소를 맞힐 수 없다.

  1. CS 보안 시작: 암호화된 연결 위에서 두 기기가 각자 CS_IV 64비트, CS_IN 32비트, CS_PV 64비트를 보내고, 주변 기기(Peripheral) 쪽을 앞에 붙여 128·64·128비트 값을 만든다.
  2. 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한다.
  3. CS_DRBG: 128비트 = e(K, V + 카운터). V의 오른쪽 네 바이트가 카운터 칸이다. 옥텟 0 = Transaction_Counter, 옥텟 1 = Transaction_ID(표 4.16의 거래 종류), 옥텟 2~3 = Step_Counter(지금 스텝 번호를 더함).
  4. 거래 종류마다 128비트에서 앞(최상위)부터 필요한 만큼 꺼내 쓰고, 모자라면 남은 비트를 버리고 Transaction_Counter를 올려 새 블록을 만든다. 새 프로시저마다 f9(0, K, V)로 되돌림 방지(backtracking resistance)를 한다.
Transaction_ID무엇을 정하나
0x00모드 0이 아닌 스텝의 채널 순서(#3b·#3c)
0x01모드 0 스텝의 채널 순서(#3a)
0x02부 모드 끼워 넣을 위치
0x03톤 연장 슬롯 유무
0x04안테나 경로 순서
0x05CS 접근 주소 후보
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).

SIMULATOR

CS DRBG 재현 ([Vol 6] Part C §8.1.1 Set 1의 입력)

거래 종류
사양 예와 비교—
입력은 사양 예 그대로다: CS_IV = E10BC28A0BFDDFE9 ‖ 3E7F5186E0CA0B3B, CS_IN = 9FF477C1 ‖ 8673840D, CS_PV = C980DEDF9882ED44 ‖ 64A674967868F143, 채널 맵 0x1FFFFC(2~20번). 해볼 것: ① 모드 0 채널, 스텝 0 → “11 7 14 18 …”. ② 그 밖의 채널은 스텝 3에서 처음 뽑힌다(사양 예의 첫 모드 2 스텝) → “6 12 5 10 …”. ③ 접근 주소, 스텝 0·1·2 → 점수와 고른 주소, 트레일러. 스텝을 바꾸면 Step_Counter 칸만 바뀌는데도 출력 전체가 달라진다.

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이다. 무엇이 접근 주소가 될까?

같을 때의 규칙.

점수가 같으면 쌍의 두 번째(s1, s3)를 고른다. 사양 예도 F079BC3A이고, 최상위 비트가 1이라 트레일러는 0101이다.

후보 순서·점수식·같을 때 규칙: [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의 방어는 층으로 쌓여 있다.

판단은 결국 응용의 몫이다. 거리 하나로 잠금을 풀기보다, 여러 프로시저의 일관성과 감지 지표, 다른 인증 요소를 함께 쓰는 것이 권장되는 설계다.

조기 응답 감지(위상·진폭 기반)와 요구: [Vol 6] Part H §3.5~§3.5.4 · 사운딩 시퀀스 마커: §2.4 · 랜덤 시퀀스: §2.5

핵심 정리

  1. CS 채널은 2,402 + k MHz(k = 0~78) 중 72개(2~22, 26~76). 모드 0 주파수 보정, 1 RTT, 2 위상, 3 둘 다.
  2. 거리 = c × 왕복 시간 ÷ 2, 위상 방식은 d = c·Δφ ÷ (4πΔf), Δf = 1 MHz면 약 150 m마다 반복.
  3. CS DRBG: h9 = f8(씨앗) → f9, 출력 = e(K, V + 카운터). 카운터 칸은 Transaction_Counter·ID·Step_Counter.
  4. hr1은 치우칠 수 있으면 8비트를 더 뽑고, cr1은 피셔-예이츠 섞기.
  5. 접근 주소는 자기상관 점수가 낮은 후보(같으면 두 번째), 트레일러는 최상위 비트 0이면 1010.

확인 퀴즈

CS 채널 인덱스 24의 주파수와 사용 여부는?

2,402 + 24 = 2,426 MHz. 23~25는 Table 1.1에서 허용되지 않는다.

왕복 시간이 비행만으로 20 ns다. 거리는 약?

c × 20 ns ÷ 2 ≈ 0.3 m/ns × 20 ÷ 2 = 3.0 m.

CS DRBG nonce V에서 스텝마다 바뀌는 칸은?

Part E Table 3.3. 옥텟 0은 Transaction_Counter, 1은 Transaction_ID, 2~3은 Step_Counter, 4~15는 고정.

hr1(19)에서 첫 바이트가 0x6C였다. 무엇이 일어나나?

T = 2052, T mod 256 = 4 < 9. 사양 예는 다음 바이트 0xE1로 ⌊(256·225·19 + 2052) ÷ 65536⌋ = 16을 얻는다.