Chapter 09

BIG 보안과 BIS: 방송 코드에서 그룹 세션 키까지

Auracast 방송(1권 10장)은 연결도 페어링도 없다. 송신기 하나가 수백 개의 이어폰에 같은 소리를 뿌린다. 그런데 “우리 강의실 사람만 듣게” 하려면 어떻게 잠글까? 답은 사람이 아는 비밀 하나, 방송 코드다. 이 장은 그 문자열이 128비트 키가 되고, 패킷마다 다른 nonce가 되기까지를 따라가고, BIS마다 접근 주소를 만드는 규칙도 함께 계산한다.

방송 코드: 모두가 아는 하나의 비밀

연결이 있으면 두 기기가 키를 협상하지만(6·7장), 방송에는 돌아오는 신호가 없다. 그래서 키의 출발점을 사람이 미리 나눠 갖는다. 사양은 이것을 방송 코드(Broadcast_Code)라 하고, 화면에서는 “Bluetooth Privacy Code”라 부르라고 권한다. 강의실 칠판에 적힌 문자열, 공항 게이트의 QR 코드, 휴대폰 앱이 이어폰에 대신 넣어 주는 값이 모두 이것이다.

강의실 문의 번호 자물쇠

강의실 문 번호 자물쇠는 수강생 모두가 같은 번호를 안다. 누가 들어왔는지 하나하나 확인하지는 못하지만, 번호를 모르는 사람은 막는다. 매 학기 번호를 바꾸면 지난 학기 수강생은 못 들어온다. BIG 암호화가 딱 이 수준이다. 코드를 아는 모두가 들을 수 있고, 코드를 모르는 사람만 막는다.

화면 단계에서 방송 코드는 UTF-8로 4~16옥텟의 문자열이다. 그 아래 모든 단계에서는 128비트 값이고, 변환 규칙은 이렇다. 문자열을 UTF-8 바이트로 바꾼 뒤 가장 작은 바이트 자리부터 차례로 채우고, 남는 큰 쪽은 0으로 채운다. 사양의 예 “Børne House”(ø가 2바이트라 12옥텟)는 0x00000000_6573756F_4820656E_72B8C342가 된다. 거꾸로 읽으면 B(42) ø(C3 B8) r(72)…다. 보안을 위해 16옥텟을 쓰라고 권한다.

방송 코드의 정의·화면 용어·표현과 “Børne House” 예: [Vol 3] Part C §3.2.6 · BIG의 Broadcast_Code·GIV·GSKD: [Vol 6] Part B §4.4.6.10

세 번 걸러 그룹 세션 키로

방송 코드는 사람이 고른 값이라 그대로 키로 쓰기엔 고르지 않고, 다른 BIG에서도 같은 값이 나올 수 있다. 그래서 세 단계를 거친다. 7장의 h7·h6에, 링크 계층 보안 부분이 정의한 h8을 더한다.

IGLTK = h7(“BIG1”, Broadcast_Code) · GLTK = h6(IGLTK, “BIG2”) · GSK = h8(GLTK, GSKD, “BIG3”)
h8(K, S, keyID): IK = AES-CMACS(K), h8 = AES-CMACIK(keyID)

GLTK까지는 방송 코드만으로 정해지는 값이다. 마지막 단계의 GSKD(Group Session Key Diversifier, 128비트)는 송신기의 컨트롤러가 암호화된 BIG를 만들 때마다 새로 뽑아 BIGInfo에 실어 보낸다. 그래서 어제와 오늘 같은 방송 코드를 써도 그룹 세션 키는 다르다. 수신기는 주기적 광고의 BIGInfo에서 GSKD를 읽고, 호스트가 넣어 준 방송 코드와 합쳐 같은 GSK를 만든다(이 과정은 수신기의 컨트롤러 안에서 일어난다).

WORKBENCH

방송 코드 → GSK, 사양 샘플 그대로

코드 길이—
GSK—
사양 샘플과 비교—
처음 값은 [Vol 6] Part C §6의 샘플이다. 해볼 것: ① 결과가 GSK be2a16fc…와 같은지 보자. ② “새 BIG”을 누르면 같은 방송 코드에서 GLTK는 그대로이고 GSK만 바뀐다. ③ 코드를 “Børne Hous”로 한 글자 지우면 모든 단계가 바뀐다. ④ 17바이트 이상이면 화면 단계의 규칙 위반이다.
예측해 보기

학기 내내 같은 방송 코드를 쓰는 강의실 방송을 누군가 첫 주에 녹음해 두었다. 그는 코드를 모른다. 셋째 주에 코드를 알게 되었다면 첫 주 녹음을 풀 수 있을까?

GSK를 만드는 데 필요한 값 중 첫 주 녹음에 들어 있는 것은?

GSKD와 GIV는 BIGInfo에 평문으로 실린다. 코드만 알게 되면 그때의 GSK를 다시 계산할 수 있다. GSKD가 막는 것은 “다른 BIG의 키를 재사용”이지, “코드가 새면 과거가 풀림”이 아니다. 앞의 녹음을 지키려면 코드 자체를 자주 바꿔야 한다.

h8과 IGLTK·GLTK·GSK 유도, “BIG1~3”의 값: [Vol 6] Part E §1.1.1·§1.1.2 · h6·h7: [Vol 3] Part H §2.2.10·§2.2.11 · GSKD·GIV를 BIG마다 새로: [Vol 6] Part B §4.4.6.10 · 샘플: [Vol 6] Part C §6

방송 코드사람이 나눠 가짐 h7"BIG1" IGLTK h6"BIG2" GLTK h8"BIG3" GSK모든 BIS의 세션 키 GSKD (BIGInfo, BIG마다 새로) 여기까지는 방송 코드만 알면 누구나 같은 값 → → BIG마다 달라진다
그림 9-1. BIG 키의 유도. 방송 코드에서 h7과 h6으로 GLTK까지는 고정된 문자열("BIG1", "BIG2")만 쓰므로 같은 코드면 언제나 같은 값이다. 마지막 h8에 BIGInfo로 알리는 GSKD를 넣어, 같은 방송 코드를 다시 써도 BIG마다 다른 세션 키 GSK가 나온다.

BIS의 CCM: 무엇이 다른가

암호화 방식은 6장의 AES-CCM 그대로다. 달라지는 것은 재료뿐이다.

ACL (6장)BIS
키세션 키 SK = e(LTK, SKD)GSK
IVIV_P ‖ IV_C (암호화 시작 때 교환)GIV의 아래 32비트를 그 BIS의 접근 주소와 XOR
packetCounter새 PDU마다 +1bisPayloadCounter (BIG 이벤트마다 정해진 값)
directionBit센트럴 1, 페리페럴 0항상 1 (방송자)
MIC에서 가리는 헤더 비트NESN, SN, MDCSSN, CSTF
MIC 실패연결 끊김 (0x3D)동기 상실, 그 BIS를 더 받지 않음 (0x3D)

BIS마다 접근 주소가 다르므로 IV도 BIS마다 달라져, 같은 GSK와 같은 페이로드 카운터로도 nonce가 겹치지 않는다. 방송자가 하나뿐이니 방향 비트는 늘 1이다. BIG 제어 PDU(BIG 종료, 채널 맵 갱신)도 같은 방식으로, 자기 접근 주소로 IV를 만들어 암호화한다.

BIS의 nonce·IV·방향 비트: [Vol 6] Part E §2.1 · 가리는 비트(Table 2.3): §2.2 · BIS 세션 키 = GSK: §2.4 · BIS MIC 실패: §1

시드 접근 주소에서 BIS마다 접근 주소를

연결은 접근 주소를 CONNECT_IND로 알려 주지만, BIG는 BIGInfo에 시드 접근 주소(SAA) 하나만 싣는다. 수신기는 BIS 번호 n마다 다이버시파이어 D = (35·n + 42) mod 128을 구해 7비트를 정해진 자리에 흩어 놓은 다이버시파이어 워드 DW와 SAA를 XOR한다. n = 0은 BIG 제어 링크다. 덕분에 BIS가 31개여도 BIGInfo에는 4바이트만 있으면 된다.

DW[31:16] = D₀ D₀ D₀ D₀ D₀ D₀ D₁ D₆ · D₁ 0 D₅ D₄ 0 D₃ D₂ 0 · DW[15:0] = 0 · AA = SAA ⊕ DW

SAA는 무작위지만 조건이 있다. 비트 19 = 비트 15, 비트 22 = 비트 16 ≠ 비트 15, 비트 25 = 0, 비트 23 = 1. 이 조건과 DW의 모양 덕분에, 만들어진 BIS 접근 주소들이 일반 접근 주소 규칙(연속 0·1이 6개 이하, 전환 수 등)을 지키기 쉬워진다. 그래도 어긋나면 SAA를 다시 뽑는다.

CALCULATOR

SAA → BIS 접근 주소 (사양 표 5.1)

nDDW접근 주소사양 표 5.1
SAA 조건—
BIG 제어 링크 (n = 0)—
사양 샘플 SAA 0x78E52493의 31개 값과 BIG 제어 링크 0x7A412493을 검증 스크립트가 모두 맞춰 본다. 해볼 것: ① BIS 수를 31까지 올려 사양 표와 모두 같은지 보자. ② SAA의 비트 23을 0으로 바꾸면(78E52493 → 78652493, 둘째 바이트 E5 → 65) 조건 위반이 표시된다.

SAA 조건·D·DW 식(예: n = 1 → D = 77, DW = 0xFD060000): [Vol 6] Part B §2.1.2 · BIGInfo의 SeedAccessAddress: [Vol 6] Part B §4.4.6.10 · 샘플(31개 + 제어 링크): [Vol 6] Part C §5

핵심 정리

  1. 방송 코드: 화면에서는 UTF-8 4~16옥텟 문자열, 그 아래에서는 작은 바이트부터 채운 128비트 값.
  2. IGLTK = h7(“BIG1”, 코드), GLTK = h6(IGLTK, “BIG2”), GSK = h8(GLTK, GSKD, “BIG3”). GSKD는 암호화된 BIG마다 새로 뽑아 BIGInfo에 싣는다.
  3. 코드가 같아도 BIG마다 GSK가 다르지만, 코드가 새면 녹음된 과거 방송도 풀린다. 코드 자체를 자주 바꾼다.
  4. BIS의 CCM: 키 GSK, IV = GIV의 아래 32비트 ⊕ 접근 주소, 카운터 = bisPayloadCounter, 방향 비트 1, CSSN·CSTF 마스크.
  5. BIS 접근 주소 = SAA ⊕ DW(n), D = (35n + 42) mod 128. n = 0은 BIG 제어 링크.

확인 퀴즈

방송 코드 문자열 “AB”의 128비트 값은?

UTF-8 바이트(41, 42)를 가장 작은 바이트부터 채운다. 첫 글자 A(0x41)가 가장 작은 바이트다.

GSK 유도에서 BIG마다 달라지는 입력은?

GSKD는 컨트롤러가 암호화된 BIG마다 새로 만든다. 방송 코드는 사람이 정하고, GLTK는 코드만으로 정해진다.

BIS PDU의 CCM nonce에서 방향 비트는?

[Vol 6] Part E §2.1: Isochronous Broadcaster가 보내는 PDU는 1.

n = 1일 때 다이버시파이어 D는?

(35 × 1 + 42) mod 128 = 77 = 0b1001101. DW = 0xFD060000.