내 기기 찾기 네트워크 액세서리 사양

v1.3

내 기기 찾기 네트워크 (FMDN) 액세서리 사양은 저전력 블루투스 (BLE) 기기를 추적하는 엔드 투 엔드 암호화 방식을 정의합니다. 이 페이지에서는 빠른 페어링 사양의 확장 프로그램인 FMDN을 설명합니다. 제공업체는 FMDN과 호환되는 기기를 보유하고 있고 이러한 기기에 위치 추적을 사용 설정하려는 경우 이 확장 프로그램을 사용 설정해야 합니다.

GATT 사양

추가 일반 속성 (GATT) 특성은 다음 의미 체계를 사용하여 빠른 페어링 서비스에 추가해야 합니다.

빠른 페어링 서비스 특성 암호화됨 권한 UUID
비콘 작업 아니요 읽기, 쓰기 및 알림 FE2C1238-8366-4814-8EB0-01DE32100BEA

표 1: FMDN의 빠른 페어링 서비스 특성

인증

이 확장 프로그램에 필요한 작업은 쓰기 작업으로 수행되며 챌린지-응답 메커니즘으로 보호됩니다. 작업을 실행하기 전에 Seeker는 표 1의 특성에서 읽기 작업을 실행해야 하며, 이로 인해 다음 형식의 버퍼가 생성됩니다.

옥텟 데이터 유형 설명
0 uint8 프로토콜 주 버전 번호 0x01
1 ~ 8 바이트 배열 일회성 무작위 임시값 다름

각 읽기 작업에서 발생하는 nonce가 달라야 하며, 단일 nonce는 단일 작업에만 유효해야 합니다. nonce는 작업이 실패하더라도 무효화되어야 합니다.

그러면 Seeker가 후속 쓰기 요청에 사용할 일회성 인증 키를 계산합니다. 인증 키는 표 2~5에 설명된 대로 계산됩니다. 요청되는 작업에 따라 Seeker는 다음 키 중 하나 이상에 관한 지식을 증명합니다.

운영

특성에 기록되는 데이터의 형식은 표 2~5에 나와 있습니다. 각 작업에 대해서는 이 섹션의 뒷부분에서 자세히 설명합니다.

옥텟 데이터 유형 설명
0 uint8 데이터 ID
  • 0x00: 비콘 매개변수 읽기
  • 0x01: 프로비저닝 상태 읽기
  • 0x02: 임시 ID 키 설정
  • 0x03: 임시 ID 키 삭제
1 uint8 데이터 길이 다름
2~9명 바이트 배열 일회성 인증 키 HMAC-SHA256(account key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data)의 처음 8바이트
10 - var 바이트 배열 추가 데이터
  • 0x00: 해당 사항 없음
  • 0x01: 해당 사항 없음
  • 0x02: 임시 ID 키인 32바이트, 계정 키로 암호화된 AES-ECB-128. 제공업체에 이미 임시 ID 키가 설정되어 있으면 SHA256(current ephemeral identity key || the last nonce read from the characteristic)의 처음 8바이트도 전송합니다.
  • 0x03: SHA256(ephemeral identity key || the last nonce read from the characteristic)의 처음 8바이트

표 2: 비콘 프로비저닝 요청

옥텟 데이터 유형 설명
0 uint8 데이터 ID 0x04: 사용자 동의 후 임시 ID 키 읽기
1 uint8 데이터 길이 0x08
2~9명 바이트 배열 일회성 인증 키 HMAC-SHA256(recovery key, protocol major version number || the last nonce read from the characteristic || data ID || data length)의 처음 8바이트

표 3: 비콘 프로비저닝 키 복구 요청

옥텟 데이터 유형 설명
0 uint8 데이터 ID
  • 0x05: 링
  • 0x06: 벨소리 상태 읽기
1 uint8 데이터 길이 다름
2~9명 바이트 배열 일회성 인증 키 HMAC-SHA256(ring key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data)의 처음 8바이트
10 - var 바이트 배열 추가 데이터
  • 0x05: 벨소리 상태, 벨소리 울림 기간, 벨소리 볼륨을 나타내는 4바이트.
  • 0x06: 해당 사항 없음

표 4: 전화벨 울리기 요청

옥텟 데이터 유형 설명
0 uint8 데이터 ID
  • 0x07: 원치 않는 추적 보호 모드 활성화
  • 0x08: 원치 않는 추적 보호 모드 비활성화
1 uint8 데이터 길이 다름
2~9명 바이트 배열 일회성 인증 키 HMAC-SHA256(unwanted tracking protection key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data)의 처음 8바이트
10 - var 바이트 배열 추가 데이터
  • 0x07: 1바이트의 제어 플래그(선택사항)
  • 0x08: SHA256(ephemeral identity key || the last nonce read from the characteristic)의 처음 8바이트

표 5: 원치 않는 추적 보호 요청

쓰기에 성공하면 표 6에 표시된 것처럼 알림이 트리거됩니다.

데이터 ID가 0x05: Ring state change가 아닌 알림은 알림을 트리거하는 쓰기 트랜잭션이 완료되기 전, 즉 쓰기 요청에 관한 응답 PDU가 전송되기 전에 전송되어야 합니다.

옥텟 데이터 유형 설명
0 uint8 데이터 ID
  • 0x00: 비콘 매개변수 읽기
  • 0x01: 프로비저닝 상태 읽기
  • 0x02: 임시 ID 키 설정
  • 0x03: 임시 ID 키 삭제
  • 0x04: 사용자 동의 후 임시 ID 키 읽기
  • 0x05: 벨소리 상태 변경
  • 0x06: 벨소리 상태 읽기
  • 0x07: 원치 않는 추적 보호 모드 활성화
  • 0x08: 원치 않는 추적 보호 모드 비활성화
1 uint8 데이터 길이 다름
2~9명 바이트 배열 인증 작업별 세부정보
10 - var 바이트 배열 추가 데이터
  • 0x00: 전송 전력, 클록 값, 암호화 방법 및 벨소리 기능을 나타내는 8바이트, 계정 키로 암호화된 AES-ECB-128 (0 패딩)
  • 0x01: 프로비저닝 상태를 나타내는 1바이트, 해당되는 경우 현재 임시 ID (20 또는 32바이트)
  • 0x04: 임시 ID 키인 32바이트, 계정 키로 암호화된 AES-ECB-128
  • 0x05: 변경사항의 새 상태와 트리거를 나타내는 4바이트
  • 0x06: 벨이 울리는 구성요소 및 벨소리가 울리는 데 남은 데시초 수를 나타내는 3바이트
  • 다른 데이터 ID에서 빈 추가 데이터를 사용함

표 6: 비콘 서비스 응답

표 7에는 작업에서 반환할 수 있는 GATT 오류 코드가 나열되어 있습니다.

코드 설명 Notes
0x80 인증되지 않음 인증이 실패하면 쓰기 요청에 대한 응답으로 반환됩니다 (이전 nonce가 사용된 경우 포함).
0x81 값이 올바르지 않습니다. 잘못된 값이 제공되거나 수신된 데이터에 예상치 못한 바이트 수가 포함되면 반환됩니다.
0x82 사용자 동의 없음 기기가 페어링 모드가 아닌 경우 데이터 ID 0x04: 사용자 동의와 함께 임시 ID 키 읽기를 포함하는 쓰기 요청에 대한 응답으로 반환됩니다.

표 7: GATT 오류 코드

비콘의 매개변수 읽기

시커는 데이터 ID가 0x00인 표 2의 요청으로 구성된 특성에 쓰기 작업을 실행하여 제공자에게 비콘의 매개변수를 쿼리할 수 있습니다. 제공자는 제공된 일회성 인증 키가 기기에 저장된 계정 키와 일치하는지 확인합니다.

확인에 실패하면 제공자가 인증되지 않은 오류를 반환합니다.

성공하면 제공자는 데이터 ID가 0x00인 테이블 6의 응답으로 알립니다. 제공자는 다음과 같이 데이터 세그먼트를 구성합니다.

옥텟 데이터 유형 설명
0 uint8 보정된 전력 0m에서 수신한 보정된 전력입니다([-100, 20] 범위의 값). 1dBm 분해능의 부호 있는 정수로 표시됩니다.
1~4명 uint32 클럭 값 초 단위의 현재 시계 값 (big 엔디안)입니다.
5 uint8 곡선 선택 암호화에 사용되는 타원 곡선:
  • 0x00 (기본값): SECP160R1
  • 0x01: SECP256R1 (확장 광고 필요)
6 uint8 구성요소 벨이 울릴 수 있는 구성요소의 수:
  • 0x00: 기기에서 벨이 울릴 수 없음을 나타냅니다.
  • 0x01: 단일 구성요소만 벨을 울 수 있음을 나타냅니다.
  • 0x02: 두 구성요소(왼쪽 및 오른쪽 이어폰)가 독립적으로 울릴 수 있음을 나타냅니다.
  • 0x03: 3개의 구성요소(왼쪽 및 오른쪽 이어폰, 케이스)가 독립적으로 벨을 울릴 수 있음을 나타냅니다.
7 uint8 벨소리 기능 지원되는 옵션은 다음과 같습니다.
  • 0x00: 벨소리 볼륨을 선택할 수 없습니다.
  • 0x01: 벨소리 볼륨을 선택할 수 있습니다. 설정된 경우 제공자는 벨 울리기 작동에 표시된 대로 3개의 볼륨 수준을 수락하고 처리해야 합니다.
8~15 바이트 배열 패딩 AES 암호화에는 패딩이 없습니다.

데이터는 요청을 인증하는 데 사용된 계정 키로 AES-ECB-128 암호화되어야 합니다.

인증 세그먼트는 HMAC-SHA256(account key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data after encryption || 0x01)의 처음 8바이트로 정의됩니다.

비콘의 프로비저닝 상태 읽기

시커는 데이터 ID가 0x01인 표 2의 요청으로 구성된 특성에 쓰기 작업을 실행하여 제공자에게 비콘의 프로비저닝 상태를 쿼리할 수 있습니다. 제공자는 제공된 일회성 인증 키가 기기에 저장된 계정 키와 일치하는지 확인합니다.

확인에 실패하면 Provider는 인증되지 않은 오류를 반환합니다.

성공하면 제공자는 테이블 6의 데이터 ID 0x01 응답을 통해 알립니다. 제공자는 다음과 같이 데이터 세그먼트를 구성합니다.

옥텟 데이터 유형 설명
0 uint8 프로비저닝 상태 다음 값을 포함하는 비트마스크:
  • 비트 1 (0x01): 기기에 임시 ID 키가 설정된 경우 설정합니다.
  • 비트 2 (0x02): 제공된 일회용 인증 키가 소유자 계정 키와 일치하면 설정합니다.
1~20개 또는 32개 바이트 배열 현재 임시 식별자 20 또는 32바이트(사용 중인 암호화 방법에 따라 다름)이며, 기기에 설정된 현재 임시 ID를 나타냅니다.

인증 세그먼트는 HMAC-SHA256(account key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data || 0x01)의 처음 8바이트로 정의됩니다.

임시 ID 키 설정

프로비저닝되지 않은 제공업체를 FMDN 비콘으로 프로비저닝하거나 이미 프로비저닝된 제공업체의 임시 ID 키를 변경하기 위해 Seeker는 데이터 ID가 0x02인 표 2의 요청으로 구성된 특성에 대한 쓰기 작업을 실행합니다. 제공업체가 다음을 확인합니다.

  • 제공된 일회성 인증 키가 소유자 계정 키와 일치합니다.
  • 임시 ID 키의 해시가 제공된 경우 해시된 임시 ID 키는 현재 임시 ID 키와 일치합니다.
  • 임시 ID 키의 해시가 제공되지 않은 경우 제공업체가 이미 FMDN 비콘으로 프로비저닝하지 않았는지 확인합니다.

확인에 실패하면 Provider는 인증되지 않은 오류를 반환합니다.

성공하면 AES-ECB-128이 임시 ID 키를 복구하고 일치하는 계정 키를 사용해 이 키를 복호화합니다. 키는 기기에서 유지되어야 하며, 이 시점부터 제공자는 FMDN 프레임 광고를 시작해야 합니다. 새 임시 ID 키는 BLE 연결이 종료된 직후에 적용됩니다. 제공자는 테이블 6의 응답에서 데이터 ID 0x02로 통지합니다.

인증 세그먼트는 HMAC-SHA256(account key, protocol major version number || the last nonce read from the characteristic || data ID || data length || 0x01)의 처음 8바이트로 정의됩니다.

임시 ID 키 삭제

제공자의 비콘 부분을 프로비저닝 해제하기 위해 탐색자는 특성에 대한 쓰기 작업을 실행합니다. 이 작업은 데이터 ID가 0x03인 표 2의 요청으로 구성됩니다. 제공업체가 다음을 확인합니다.

  • 제공된 일회성 인증 키가 소유자 계정 키와 일치합니다.
  • 해싱된 임시 ID 키가 현재 임시 ID 키와 일치합니다.

제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 인증되지 않은 오류를 반환합니다.

성공하면 제공자가 키를 잊어버리고 FMDN 프레임 광고를 중단합니다. 제공자는 테이블 6의 응답과 데이터 ID 0x03으로 통지합니다. 인증 세그먼트는 HMAC-SHA256(account key, protocol major version number || the last nonce read from the characteristic || data ID || data length || 0x01)의 처음 8바이트로 정의됩니다.

사용자 동의를 받은 임시 ID 키 읽기

키는 Seeker에 의해서만 로컬로 저장되므로 이 옵션은 분실된 키를 복구하는 데만 사용할 수 있습니다. 따라서 이 기능은 기기가 페어링 모드이거나 기기에서 실제 버튼을 누른 후 제한된 시간 동안 (사용자 동의로 간주됨)에만 사용할 수 있습니다.

탐색자가 일반 텍스트 키를 복구할 수 있으려면 복구 키를 백엔드에 저장해야 하지만 EIK 자체를 저장하지는 않습니다.

EIK를 읽기 위해 Seeker는 데이터 ID가 0x04인 표 3의 요청으로 구성된 특성에 대한 쓰기 작업을 수행합니다. 제공업체는 다음을 확인합니다.

  • 해싱된 복구 키가 예상 복구 키와 일치합니다.
  • 기기가 EIK 복구 모드입니다.

확인에 실패하면 Provider는 인증되지 않은 오류를 반환합니다.

기기가 페어링 모드가 아닌 경우 제공자는 사용자 동의 없음 오류를 반환합니다.

성공하면 제공자는 테이블 6의 응답과 데이터 ID 0x04를 통해 알립니다.

인증 세그먼트는 HMAC-SHA256(recovery key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data || 0x01)의 처음 8바이트로 정의됩니다.

벨소리 울리기 작업

시커는 특성에 쓰기 작업을 실행하여 사운드를 재생하도록 제공자에 요청할 수 있습니다. 이 작업은 데이터 ID가 0x05인 표 4의 요청으로 구성됩니다. 제공자는 다음과 같이 데이터 세그먼트를 구성합니다.

옥텟 데이터 유형 설명
0 uint8 벨소리 울리기 작업 다음 값을 포함하는 비트마스크:
  • 비트 1 (0x01): 오른쪽 벨소리 울림
  • 비트 2 (0x02): 왼쪽 벨소리 울림
  • 비트 3 (0x04): Ring 케이스
  • 0xFF: 모든 구성요소의 벨소리 울림
  • 0x00: 벨소리 중지
1 - 2 uint16 시간 초과 제한 시간(데시초)입니다. 0은 아니어야 하며 10분과 같거나 길어서는 안 됩니다.
제공업체는 이 값을 사용하여 스스로 음소거하기 전에 벨이 울리는 시간을 결정합니다. 기기의 구성요소에서 이미 벨이 울리고 있는 경우 제한 시간은 이미 적용 중인 제한 시간을 재정의합니다.

링 작업을 0x00으로 설정하면 제한 시간이 무시됩니다.
3 uint8 볼륨
  • 0x00: 기본값
  • 0x01: 낮음
  • 0x02: 중간
  • 0x03: 높음
이러한 값의 정확한 의미는 구현에 따라 다릅니다.

요청을 받은 제공업체는 다음 사항을 확인합니다.

  • 제공된 일회성 인증 키가 링 키와 일치합니다.
  • 요청된 상태가 울릴 수 있는 구성요소와 일치합니다.

제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 인증되지 않은 오류를 반환합니다. 그러나 제공자에 원치 않는 추적 보호가 활성화되어 있고 원치 않는 추적 보호 요청 트리거에 벨소리 건너뛰기 인증 플래그가 사용 설정되어 있다면 제공자는 검사를 건너뛰어야 합니다. 인증 데이터는 Seeker에서 제공해야 하지만 임의의 값으로 설정할 수 있습니다.

벨소리가 시작되거나 종료되면 표 6에 표시된 대로 데이터 ID가 0x05인 알림이 전송됩니다. 알림의 내용은 다음과 같이 정의됩니다.

옥텟 데이터 유형 설명
0 uint8 벨소리 상태
  • 0x00: 시작됨
  • 0x01: 시작 또는 중지 실패 (요청된 모든 구성요소가 범위를 벗어남)
  • 0x02: 중지됨 (시간 초과)
  • 0x03: 중지됨 (버튼 누르기)
  • 0x04: 중지됨 (GATT 요청)
1 uint8 벨소리 울림 구성요소 요청에 정의된 대로 현재 울리는 구성요소의 비트마스크입니다.
2~3 uint16 시간 초과 벨이 울리는 데 걸리는 남은 시간(데시초)입니다. 기기에서 벨이 울리지 않으면 0x0000을 반환해야 합니다.

인증 세그먼트는 HMAC-SHA256(ring key, protocol major version number || the nonce used to initiate the ringing command || data ID || data length || additional data || 0x01)의 처음 8바이트로 정의됩니다.

벨 울림 중지 또는 벨 울림 중지 요청이 수신되었을 때 기기가 이미 요청된 벨소리 상태에 있다면 제공자는 벨 울림 상태 또는 0x00: 시작됨 또는 0x04: 중지됨 (GATT 요청)으로 알림을 전송해야 합니다. 이 요청은 기존 상태의 매개변수를 재정의하므로 벨소리가 울리는 시간을 연장할 수 있습니다.

제공자에 실제 버튼이 있는 경우 (또는 터치 감지가 사용 설정된 경우) 벨소리가 활성화된 상태에서 버튼을 누르면 벨이 울리는 기능을 중지해야 합니다.

비콘의 벨소리 상태 가져오기

비콘의 벨소리가 울리는 상태를 가져오기 위해 Seeker는 특성에 대한 쓰기 작업을 수행합니다. 이 작업은 데이터 ID가 0x06인 표 4의 요청으로 구성됩니다. 제공업체는 제공된 일회성 인증 키가 링 키와 일치하는지 확인합니다.

제공자가 FMDN 비콘으로 프로비저닝되지 않았거나 확인에 실패하면 제공자가 인증되지 않은 오류를 반환합니다.

성공하면 제공자는 테이블 6의 응답에서 데이터 ID가 0x06임을 알립니다. 제공자는 다음과 같이 데이터 세그먼트를 구성합니다.

옥텟 데이터 유형 설명
0 uint8 벨소리 울림 구성요소 벨이 울리는 요청에 정의된 대로 구성요소의 벨소리가 울리고 있습니다.
1 - 2 uint16 시간 초과 벨이 울리는 데 걸리는 남은 시간(데시초)입니다. 기기가 울리지 않으면 0x0000이 반환되어야 합니다.

인증 세그먼트는 HMAC-SHA256 (ring key, protocol major version number || the last nonce read from the characteristic || data ID || data length || additional data || 0x01)의 처음 8바이트로 정의됩니다.

원치 않는 추적 보호 모드

원치 않는 추적 보호 모드는 모든 클라이언트가 서버 통신 없이 악용 기기를 식별할 수 있도록 고안되었습니다. 기본적으로 제공업체는 ID 순환에 설명된 대로 모든 식별자를 순환해야 합니다. 내 기기 찾기 서비스는 내 기기 찾기 네트워크를 통해 원치 않는 추적 보호 모드 활성화 요청을 전달할 수 있습니다. 이렇게 하면 서비스에서 제공자가 일시적으로 고정 MAC 주소를 사용하도록 하여 클라이언트가 기기를 감지하고 가능한 원치 않는 추적에 관해 사용자에게 경고할 수 있습니다.

비콘의 원치 않는 추적 보호 모드를 활성화하거나 비활성화하기 위해 시커는 특성에 대한 쓰기 작업을 실행합니다. 이 작업은 데이터 ID가 각각 0x07 또는 0x08인 표 5의 요청으로 구성됩니다.

원치 않는 추적 보호 모드를 사용 설정하는 경우

제공자는 다음과 같이 데이터 세그먼트를 구성합니다.

옥텟 데이터 유형 설명
0 uint8 제어 플래그
  • 0x01: 벨소리 인증을 건너뜁니다. 이 옵션을 설정하면 원치 않는 추적 보호 모드에서 전화 수신 요청이 인증되지 않습니다.
설정된 플래그가 없으면 (바이트가 모두 0인 경우) 데이터 섹션을 완전히 생략하고 빈 데이터 섹션을 전송하는 것이 유효합니다.
플래그는 원치 않는 추적 보호 모드가 비활성화될 때까지만 적용됩니다.

제공업체가 제공된 일회성 인증 키가 원치 않는 추적 보호 키와 일치하는지 확인합니다. 제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 인증되지 않은 오류를 반환합니다.

원치 않는 추적 보호 모드가 활성화되면 비콘은 MAC 비공개 주소 순환 빈도를 24시간당 1회로 줄여야 합니다. 공지된 임시 식별자는 평소와 같이 순환해야 합니다. 프레임 유형은 0x41로 설정해야 합니다. 상태는 해싱된 플래그 섹션에도 반영됩니다.

원치 않는 추적 보호 모드를 사용 중지하는 경우

제공업체가 다음을 확인합니다.

  • 제공된 일회용 인증 키가 원치 않는 추적 보호 키와 일치합니다.
  • 해싱된 임시 ID 키가 현재 임시 ID 키와 일치합니다.

제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 제공업체는 인증되지 않은 오류를 반환합니다.

원치 않는 추적 보호 모드가 비활성화되면 비콘은 임시 식별자 순환과 동기화된 정상 속도로 MAC 주소를 다시 회전하기 시작해야 합니다. 프레임 유형은 0x40으로 다시 설정해야 합니다. 상태는 해싱된 플래그 섹션에도 반영됩니다.

성공하면 제공자는 테이블 6의 데이터 ID 0x07 또는 0x08 응답을 통해 알립니다.

인증 세그먼트는 HMAC-SHA256(unwanted tracking protection key, protocol major version number || the last nonce read from the characteristic || data ID || data length || 0x01)의 처음 8바이트로 정의됩니다.

공지된 프레임

프로비저닝 후 제공업체는 최소 2초마다 한 번씩 FMDN 프레임을 알려야 합니다. 빠른 페어링 프레임이 공지되는 경우 제공자는 일반 빠른 페어링 광고 내에 FMDN 프레임을 인터리빙해야 합니다. 예를 들어 제공업체는 2초마다 빠른 페어링 광고 7개와 FMDN 광고 1개를 광고해야 합니다.

FMDN 프레임에는 크라우드소싱 네트워크에 기여하는 모든 지원 클라이언트에서 위치 보고서를 암호화하는 데 사용되는 공개 키가 포함되어 있습니다. 두 가지 유형의 타원 곡선 키를 사용할 수 있습니다. 기존 BLE 4 프레임에 맞는 160비트 키 또는 확장된 광고 기능이 있는 BLE 5가 필요한 256비트 키입니다. 제공업체의 구현에 따라 사용되는 곡선이 결정됩니다.

FMDN 프레임은 다음과 같이 구성됩니다.

옥텟 설명
0 0x02 길이
1 0x01 데이터 유형 값에 플래그 지정
2 0x06 신고 데이터
3 0x18 또는 0x19 길이
4 0x16 서비스 데이터 데이터 유형 값
5 0xAA 16비트 서비스 UUID
6 0xFE ...
7 0x40 또는 0x41 원치 않는 추적 보호 모드 표시가 있는 FMDN 프레임 유형
8~27일 20바이트 임시 식별자
28 해싱된 플래그

표 8: 160비트 곡선을 지원하는 FMDN 프레임

표 9는 256비트 곡선의 바이트 오프셋과 값을 보여줍니다.

옥텟 설명
0 0x02 길이
1 0x01 데이터 유형 값에 플래그 지정
2 0x06 신고 데이터
3 0x24 또는 0x25 길이
4 0x16 서비스 데이터 데이터 유형 값
5 0xAA 16비트 서비스 UUID
6 0xFE ...
7 0x40 또는 0x41 원치 않는 추적 보호 모드 표시가 있는 FMDN 프레임 유형
8~39 32바이트 임시 식별자
40 해싱된 플래그

표 9: 256비트 곡선을 지원하는 FMDN 프레임

EID (임시 식별자) 계산

임의 ID는 임시 ID 키로 다음 데이터 구조를 암호화하는 AES-ECB-256에 의해 생성됩니다.

옥텟 필드 설명
0~10 패딩 값 = 0xFF
11 K 회전 기간 지수
12~15 TS[0]~TS[3] 32비트 big-endian 형식의 비콘 시간 카운터입니다. K 하위 비트가 지워집니다.
만 16~26세 패딩 값 = 0x00
27 K 회전 기간 지수
28 - 31 TS[0]~TS[3] 32비트 big-endian 형식의 비콘 시간 카운터입니다. K 하위 비트가 지워집니다.

표 10: 의사 난수 구성

이 계산의 결과는 r'로 표시된 256비트 숫자입니다.

나머지 계산에서는 타원 곡선 암호화 연산에 SECP160R1 또는 SECP256R1가 사용됩니다. 곡선 정의는 다음에 참조할 Fp, n, G를 정의하는 SEC 2: 권장 타원 곡선 도메인 매개변수를 참조하세요.

이제 r = r' mod n를 계산하여 r'가 유한 필드 Fp에 투영됩니다. 마지막으로, 사용 중인 공개 키를 나타내는 곡선 위의 한 지점인 R = r * G를 계산합니다. 비콘은 Rx 좌표인 Rx를 임시 식별자로 알립니다.

해싱된 플래그

해시된 플래그 필드는 다음과 같이 계산됩니다. 비트는 가장 중요한 것부터 중요하지 않은 것까지 참조됩니다.

  • 비트 0~4: 예약됨 (0으로 설정).
  • 비트 5~6은 다음과 같이 기기의 배터리 잔량을 나타냅니다.
    • 00: 배터리 잔량 표시가 지원되지 않음
    • 01: 배터리 수준 보통
    • 10: 배터리 잔량 낮음
    • 11: 배터리 잔량 매우 낮음 (곧 배터리 교체 필요)
  • 비트 7은 비콘이 원치 않는 추적 보호 모드인 경우 1로 설정되고 그렇지 않은 경우에는 0으로 설정됩니다.

이 바이트의 최종 값을 생성하기 위해 SHA256(r)의 최하위 바이트로 xor 처리됩니다.

r은 곡선 크기에 맞게 정렬되어야 합니다. 표현이 160비트 또는 256비트보다 짧으면 0을 최상위 비트로 추가합니다. 또는 표현이 160비트 또는 256비트보다 크면 최상위 비트를 잘라야 합니다.

비콘이 배터리 수준 표시를 지원하지 않고 원치 않는 추적 보호 모드가 아닌 경우에는 광고에서 이 바이트를 완전히 생략할 수 있습니다.

EID를 통한 암호화

m 메시지를 암호화하기 위해 비콘에서 Rx를 읽은 시사자는 다음을 수행합니다.

  1. EID 계산 섹션에 정의된 대로 Fp에서 랜덤 숫자 s를 선택합니다.
  2. S = s * G를 계산합니다.
  3. 곡선 방정식에 대입하고 가능한 결과에서 임의의 Ry 값을 선택하여 R = (Rx, Ry)를 계산합니다.
  4. 256비트 AES 키 k = HKDF-SHA256((s * R)x)를 계산합니다. 여기서 (s * R)x는 곡선 곱셈 결과의 x 좌표입니다. 솔트가 지정되지 않았습니다.
  5. URxLRx를 각각 big-endian 형식으로 Rx의 상위 및 하위 80비트로 가정합니다. 비슷한 방식으로 SUSxLSx를 정의합니다.
  6. nonce = LRx || LSx를 계산합니다.
  7. (m’, tag) = AES-EAX-256-ENC(k, nonce, m)를 계산합니다.
  8. 신뢰할 수 없는 원격 서비스를 통해 소유자에게 (URx, Sx, m’, tag)를 전송합니다.

EID로 암호화된 값의 복호화

EIK와 순환 기간 지수를 가진 소유자의 클라이언트는 다음과 같이 메시지를 복호화합니다.

  1. URx가 주어지면 URx의 기반이 되는 비콘 시간 카운터 값을 가져옵니다. 이는 소유자의 클라이언트가 최근과 가까운 미래의 비콘 시간 카운터 값의 Rx 값을 계산하면 됩니다.
  2. URx의 기반이 되는 비콘 시간 카운터 값이 주어지면 EID 계산 섹션에 정의된 대로 예상된 r 값을 계산합니다.
  3. R = r * G를 계산하고 측정자가 제공한 URx 값과 일치하는지 확인합니다.
  4. 곡선 방정식에 대입하고 가능한 결과에서 임의의 Sy 값을 선택하여 S = (Sx, Sy)를 계산합니다.
  5. k = HKDF-SHA256((r * S)x)를 계산합니다. 여기서 (r * S)x은 곡선 곱셈 결과의 x 좌표입니다.
  6. nonce = LRx || LSx를 계산합니다.
  7. m = AES-EAX-256-DEC(k, nonce, m’, tag)를 계산합니다.

ID 순환

FMDN 프레임을 광고하는 데는 확인 가능 (RPA) 또는 확인 불가능 (NRPA) BLE 주소를 사용해야 합니다. RPA는 LE 오디오 (LEA) 기기에 필요하며 결합을 사용하지 않는 로케이터 태그를 제외하고 다른 기기에 권장됩니다.

빠른 페어링 광고, FMDN 광고, 해당 BLE 주소는 동시에 순환해야 합니다. 회전은 평균 1,024초마다 발생해야 합니다. 비콘이 새 식별자 광고를 시작하는 정확한 지점은 기간 내에서 무작위로 지정되어야 합니다.

회전 시간을 무작위 지정하는 데 권장되는 방법은 다음 예상 회전 시간 (무작위 지정이 적용되지 않은 경우)과 1~204초 범위의 임의의 양수 시간 계수로 설정하는 것입니다.

기기가 원치 않는 추적 보호 모드일 때 FMDN 광고의 BLE 주소는 고정되어야 하지만, 검색 불가능한 FP 광고의 RPA (예: 빠른 페어링)는 계속 순환해야 합니다. 다른 프로토콜에 다른 주소를 사용할 수 있습니다.

정전 복구

임시 식별자의 해결은 광고 시점의 클록 값과 밀접하게 연결되어 있으므로 전력 손실이 발생하는 경우 제공자가 클록 값을 복구할 수 있어야 합니다. 제공자는 현재 클록 값을 하루에 한 번 이상 비휘발성 메모리에 기록하고, 부팅 시 제공자는 NVM을 확인하여 초기화할 값이 있는지 확인하는 것이 좋습니다. 임시 식별자의 리졸버는 합당한 클록 드리프트와 이러한 유형의 전력 손실 복구를 모두 허용하기에 충분한 시간 동안 확인을 구현합니다.

해결 시간 기간이 제한되므로 제공자는 클록 드리프트를 최소화하기 위해 여전히 최선을 다해야 합니다. 하나 이상의 클록 동기화 메서드를 추가로 구현해야 합니다 (검색할 수 없는 빠른 페어링 프레임을 광고하거나 메시지 스트림을 구현).

빠른 페어링 구현 가이드라인

이 섹션에서는 FMDN을 지원하는 제공업체에 관한 빠른 페어링 구현의 특별한 측면을 설명합니다.

로케이터 태그 관련 가이드라인

  • 제공업체가 페어링되었지만 FMDN이 5분 이내에 프로비저닝되지 않은 경우 (또는 기기가 페어링되었지만 FMDN 프로비저닝되지 않은 동안 OTA 업데이트가 적용된 경우) 제공자는 공장 출고 시 구성으로 되돌려 저장된 계정 키를 삭제해야 합니다.
  • 제공자가 페어링된 후에는 FMDN이 프로비저닝되거나 5분이 경과할 때까지 MAC 주소를 변경하면 안 됩니다.
  • 임시 ID 키가 기기에서 삭제되면 기기는 초기화를 실행하고 저장된 계정 키도 삭제해야 합니다.
  • 제공자는 일반적인 블루투스 페어링 시도를 거부하고 빠른 페어링 페어링만 수락해야 합니다.
  • 제공자에는 사용자가 기기를 초기화하지 않고도 광고를 일시적으로 중지할 수 있는 메커니즘 (예: 여러 버튼 조합 누르기)이 포함되어야 합니다.
  • 전원 공급이 중단되면 기기는 다음번 비콘 매개변수 읽기 호출까지 검색할 수 없는 빠른 페어링 프레임을 알려야 합니다. 이를 통해 Seeker는 기기를 감지하고 상당한 클록 드리프트가 발생하더라도 클록을 동기화할 수 있습니다.
  • 검색할 수 없는 빠른 페어링 프레임을 광고하는 경우 UI 표시를 사용 설정하면 안 됩니다.
  • 검색 가능한 빠른 페어링 프레임은 제공업체가 FMDN에 프로비저닝된 동안에는 알리면 안 됩니다.
  • 제공업체는 인증되지 않은 방식으로 식별 정보를 노출해서는 안 됩니다 (예: 이름 또는 식별자).

기존 블루투스 기기별 가이드라인

이 섹션에서는 FMDN을 지원하는 기존 블루투스 기기의 특별한 측면을 설명합니다.

이미 페어링된 기기의 FMDN 프로비저닝

제공자가 Seeker와 페어링할 때 항상 FMDN에 프로비저닝하는 것은 아니지만, 그후에는 잠시 프로비저닝됩니다. 이 경우 제공업체에 GATT 연결을 설정하는 데 필요한 최신 BLE MAC 주소가 없을 수 있습니다. 제공자는 Seeker가 이미 페어링된 상태에서 BLE 주소를 가져올 수 있도록 다음 방법 중 하나 이상을 지원해야 합니다.

  • 제공자는 Seeker가 BLE 검색을 통해 BLE 주소를 찾을 수 있도록 빠른 페어링 계정 데이터를 주기적으로 알릴 수 있습니다.
    이 접근 방식은 메시지 스트림을 구현하지 않는 제공업체에 적합합니다.
  • 제공자는 기본 블루투스를 통해 빠른 페어링 메시지 스트림을 통해 이 데이터를 제공할 수 있습니다.
    이 접근 방식은 블루투스를 통해 Seeker에 연결되어 있는 동안 빠른 페어링 프레임을 광고하지 않는 제공자에 적합합니다.

두 접근 방식을 모두 지원하면 사용자가 FMDN에 대해 기기를 프로비저닝할 수 있는 가능성이 높아집니다.

빠른 페어링 메시지 스트림

제공자는 빠른 페어링 메시지 스트림을 구현하고 이를 사용하여 탐색자에게 기기 정보에 관해 알릴 수 있습니다. 메시지 스트림을 구현하면 이 섹션에 설명된 대로 특정 기능이 사용 설정됩니다.

제공자는 메시지 스트림 RFCOMM 채널이 설정될 때마다 한 번씩 기기 정보 메시지를 보내야 합니다.

펌웨어 버전 (기기 정보 코드 0x09) 및 추적 기능

펌웨어 업데이트로 제공자에게 FMDN 지원이 추가되면 연결된 탐색자는 사용자에게 이를 알리고 프로비저닝할 것을 제안할 수 있습니다. 그렇지 않으면 사용자가 수동으로 블루투스 기기 목록으로 이동하여 FMDN 프로비저닝을 시작해야 합니다.

이를 허용하려면 제공자가 펌웨어 버전 속성 (코드 0x09)을 사용하여 펌웨어 버전을 나타내는 문자열 값을 보고해야 합니다. 또한 제공자는 펌웨어 업데이트로 인한 기능 변경을 Seeker에 알리는 프로토콜을 지원해야 합니다.

옥텟 데이터 유형 설명
0 uint8 기기 정보 이벤트 0x03
1 uint8 펌웨어 버전 0x09
2~3 uint16 추가 데이터 길이 다름
var 바이트 배열 버전 문자열 다름

표 11: 기기 정보 이벤트: 업데이트된 펌웨어 버전

기능 업데이트 요청 (0x0601)을 수신하면 제공업체는 FMDN 추적 지원을 사용 설정한 경우 표 12와 같이 응답해야 합니다.

옥텟 데이터 유형 설명
0 uint8 기기 기능 동기화 이벤트 0x06
1 uint8 FMDN 추적 0x03
2~3 uint16 추가 데이터 길이 0x0007
4 uint8 FMDN 프로비저닝 상태 0x00(프로비저닝되지 않은 경우), 0x01(어떤 계정에서든 프로비저닝한 경우)
5 - 10 바이트 배열 기기의 현재 BLE MAC 주소 다름

표 12: 기기 기능 동기화 이벤트: 추가된 추적 기능

현재 임시 식별자 (기기 정보 코드 0x0B)

제공자는 현재 임시 식별자 (코드 0x0B)를 사용하여 제공자가 FMDN에 프로비저닝된 경우 현재 EID 및 클록 값을 보고하고, 클록 드리프트 (예: 배터리 소모)가 발생하는 경우 시커를 동기화할 수 있습니다. 그러지 않으면 Seeker가 이 목적으로 더 비싸고 덜 안정적인 연결을 시작합니다.

옥텟 데이터 유형 설명
0 uint8 기기 정보 이벤트 0x03
1 uint8 현재 임시 식별자 0x00억
2~3 uint16 추가 데이터 길이 0x0018 또는 0x0024
4~7번 바이트 배열 클럭 값 예: 0x13F9EA80
8~19명 또는 31명 바이트 배열 현재 EID 예: 0x1122334455667788990011223344556677889900

표 13: 기기 정보 이벤트: 시계 동기화

초기화

초기화를 지원하는 기기의 경우 초기화가 실행되면 제공업체는 비커닝을 중지하고 임시 ID 키와 소유자의 계정 키를 포함하여 저장된 모든 계정 키를 완전 삭제해야 합니다.

초기화 후 (수동 또는 프로그래매틱) 제공업체는 사용자가 기기를 삭제한 직후 페어링 흐름이 시작되는 것을 방지하기 위해 빠른 페어링 광고를 즉시 시작해서는 안 됩니다.

원치 않는 추적 방지

인증된 FMDN 기기는 원치 않는 위치 추적기 감지(DULT)에 관한 크로스 플랫폼 사양 구현 버전의 요구사항도 충족해야 합니다.

DULT 사양 준수를 위한 FMDN 관련 가이드라인:

  • 모든 FMDN 호환 기기는 근처 기기 콘솔에 등록되어 있어야 하고 '내 기기 찾기' 기능이 활성화되어 있어야 합니다.
  • 기기는 액세서리 정보 작업 및 비소유자 제어를 비롯하여 DULT 사양의 구현 버전에 정의된 액세서리 비소유자 서비스 및 특성을 구현해야 합니다.
  • DULT 사양에 정의된 대로 이전 버전과의 호환성 기간 동안에는 이 문서에 정의된 것처럼 공지된 프레임이 변경되지 않습니다.
  • 이 문서에 정의된 '원치 않는 추적 보호 모드'는 DULT 사양에서 정의된 '분리된 상태'에 매핑됩니다.
  • 액세서리 정보 명령 코드 구현을 위한 가이드라인:
    • Get_Product_Data는 콘솔에서 제공하는 모델 ID를 반환해야 하며 8바이트 요구사항에 맞게 0으로 패딩됩니다. 예를 들어 모델 ID 0xFFFFFF는 0x00000000000FFFFFF로 반환됩니다.
    • Get_Manufacturer_Name 및 Get_Model_Name은 콘솔에 제공된 값과 일치해야 합니다.
    • Get_Accessory_Category는 기기 유형에 더 적합한 다른 카테고리가 없는 경우 일반적인 '위치 추적기' 값을 반환할 수 있습니다.
    • Get_Accessory_Capabilities는 BLE 식별자 조회와 벨 울림 지원을 나타내야 합니다.
    • Get_Network_ID는 Google의 식별자 (0x02)를 반환해야 합니다.
  • Get_Identifier 명령 코드 구현을 위한 가이드라인:
    • 작업은 사용자가 버튼을 여러 번 눌러야 하는 '식별' 모드를 활성화한 후 5분 동안만 유효한 응답을 반환해야 합니다. 시각적 신호 또는 오디오 신호는 사용자에게 제공업체가 해당 모드에 진입했음을 나타내야 합니다. 해당 모드를 활성화하기 위한 모델별 안내는 인증 요구사항으로 Google에 제공되어야 하며 안내를 업데이트하거나 수정하기 최소 10일 전에 제공해야 합니다.
    • 응답은 현재 임시 식별자의 처음 10바이트와 HMAC-SHA256(recovery key, the truncated current ephemeral identifier)의 처음 8바이트로 구성됩니다.
  • Sound_Start 명령 코드 구현을 위한 가이드라인:
    • 이 명령어는 사용 가능한 모든 구성요소에서 벨소리를 트리거합니다.
    • 지원되는 최대 볼륨을 사용해야 합니다.
    • 권장 통화 시간은 12초입니다.
  • 로케이터 태그에는 사용자가 기기를 초기화하지 않고도 광고를 일시적으로 중지할 수 있는 메커니즘 (예: 여러 버튼 조합 누르기)이 포함되어야 합니다.
    • 사용 중지 안내는 공개적으로 사용 가능한 URL에 문서화되어야 하며 인증 요구사항으로 Google에 제공되어야 하며 안내를 업데이트하거나 수정하기 최소 10일 전에 제공해야 합니다.
    • URL은 현지화를 지원해야 합니다. 클라이언트에 따라 언어는 쿼리 매개변수 ('hl=en')로 제공되거나 'accept-language' HTTP 헤더를 사용하여 제공됩니다.

전환 가능한 프로토콜 가이드라인

  • 한 번에 하나의 프로토콜만 사용해야 합니다. 기기에서 동시에 작동할 수 있는 네트워크가 두 개 이상이어서는 안 됩니다. 이 요구사항은 서로 다른 프로토콜 간에 민감한 사용자 데이터가 섞이지 않도록 하는 데 필요합니다.
  • 사용자가 다른 네트워크로 기기를 다시 설정할 수 있도록 기기에 하드 재설정 워크플로를 통합하는 것이 좋습니다.
  • 기기를 네트워크로 업데이트하는 프로세스는 사용자 친화적이고 네트워크 간에 공평해야 합니다. 사용자는 네트워크 중 하나를 우선시하지 않고 사용하려는 네트워크를 선택할 수 있어야 합니다. 이 흐름은 Google팀의 승인을 받아야 합니다.

펌웨어 업데이트

OTA 업데이트의 프로세스와 배포는 파트너가 자체 모바일 또는 웹 앱 워크플로를 사용하여 관리해야 합니다.

호환성

내 기기 찾기 네트워크를 사용하려면 위치 서비스 및 블루투스가 사용 설정되어 있어야 합니다. 이동통신 서비스 또는 인터넷 연결이 필요합니다. Android 9 이상에서 작동하며 특정 국가에서 연령 요건을 충족하는 사용자를 대상으로 합니다.

변경 로그

FMDN 버전 날짜 댓글
v1 사전 체험판을 위한 FMDN 사양의 최초 버전입니다.
v1.1 Feb 2023
  • 원치 않는 추적 보호 모드에 관한 일반 텍스트 표시가 추가되었습니다.
  • 원치 않는 추적 보호 모드에서 전화벨이 울리는 요청의 인증을 건너뛸 수 있는 옵션이 추가되었습니다.
v1.2 2023년 4월
  • 소유자의 AK 정의를 업데이트했습니다.
  • 위치 검색기 태그의 전력 손실 복구를 위한 권장사항을 추가했습니다.
  • MAC 주소 무작위 지정에 관한 명확한 설명을 추가했습니다.
  • 원치 않는 추적 보호 모드에서 MAC 주소 순환에 관한 설명을 추가했습니다.
  • 위치 검색기 태그를 비활성화하는 방법에 대한 가이드라인이 추가되었습니다.
v1.3 2023년 12월
  • 위치 검색기 태그로 노출되는 정보를 식별하는 방법에 관한 명확한 설명을 추가했습니다.
  • 원치 않는 추적 방지 사양을 구현하기 위한 요구사항이 추가되었습니다.
  • 전환 가능한 프로토콜 기기에 관한 가이드라인이 추가되었습니다.