v1.3
내 기기 찾기 네트워크 (FMDN) 액세서리 사양은 비콘 블루투스 저에너지 (BLE) 기기 추적을 위한 엔드 투 엔드 암호화된 접근 방식을 정의합니다. 이 페이지에서는 FMDN을 빠른 페어링 사양의 확장 프로그램으로 설명합니다. 제공업체는 FMDN과 호환되는 기기가 있고 해당 기기의 위치 추적을 사용 설정하려는 경우 이 확장 프로그램을 사용 설정해야 합니다.
GATT 사양
다음 시맨틱을 사용하여 Fast Pair 서비스에 추가 일반 속성 (GATT) 특성을 추가해야 합니다.
빠른 페어링 서비스 특성 | 암호화됨 | 권한 | UUID |
---|---|---|---|
비콘 작업 | 아니요 | 읽기, 쓰기, 알림 | FE2C1238-8366-4814-8EB0-01DE32100BEA |
표 1: FMDN의 빠른 페어링 서비스 특성
인증
이 확장 프로그램에 필요한 작업은 챌린지-응답 메커니즘으로 보호되는 쓰기 작업으로 실행됩니다. 어떤 작업을 실행하기 전에 시커는 표 1의 특성에서 읽기 작업을 실행해야 하며, 이로 인해 다음 형식의 버퍼가 생성됩니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 프로토콜 메이저 버전 번호 | 0x01 |
1 ~ 8 | 바이트 배열 | 일회성 무작위 nonce | 다름 |
각 읽기 작업은 서로 다른 nonce를 생성해야 하며 단일 nonce는 단일 작업에 대해서만 유효해야 합니다. 작업이 실패하더라도 nonce를 무효화해야 합니다.
그런 다음 시커는 후속 쓰기 요청에 사용할 일회성 인증 키를 계산합니다. 인증 키는 표 2~5에 설명된 대로 계산됩니다. 요청되는 작업에 따라 시커는 다음 키 중 하나 이상에 대한 지식을 증명합니다.
계정 키: Fast Pair 사양에 정의된 16바이트 Fast Pair 계정 키입니다.
소유자 계정 키: 제공업체는 시커가 비콘 작업 특성에 처음 액세스할 때 기존 계정 키 중 하나를 소유자 계정 키로 선택합니다. 제공업체를 초기화할 때까지 선택한 소유자 계정 키는 변경할 수 없습니다. 무료 계정 키 슬롯이 부족할 때 공급업체는 소유자 계정 키를 삭제해서는 안 됩니다.
처음 페어링할 때 이미 FMDN을 지원하거나 초기화 후 페어링할 때 지원하는 제공업체는 첫 번째 계정 키를 선택합니다. 이는 시커가 페어링 중에 프로비저닝 상태를 읽을 때 유일한 기존 계정 키이기 때문입니다.
이미 페어링된 후 (예: 펌웨어 업데이트를 통해) FMDN 지원을 받는 제공업체는 기존 계정 키를 선택할 수 있습니다. 업데이트를 실행한 사용자가 제공업체의 현재 소유자라고 가정하면, 펌웨어 업데이트 후 비콘 작업 특성에서 프로비저닝 상태를 읽는 데 사용되는 첫 번째 계정 키를 선택하는 것이 좋습니다.
일시적 ID 키 (EIK): FMDN 프로비저닝 프로세스를 실행할 때 시커가 무작위로 선택하는 32바이트 키입니다. 이 키는 위치 보고서를 엔드 투 엔드 암호화하는 데 사용되는 암호화 키를 파생하는 데 사용됩니다. 시커는 백엔드에 이를 공개하지 않습니다.
복구 키:
SHA256(ephemeral identity key || 0x01)
로 정의되며 처음 8바이트로 잘립니다. 키는 백엔드에 저장되며 사용자가 기기의 버튼을 눌러 동의하면 시커가 이를 사용하여 EIK를 복구할 수 있습니다.링 키:
SHA256(ephemeral identity key || 0x02)
로 정의되며 처음 8바이트로 잘립니다. 키는 백엔드에 저장되며 시커는 기기를 울리기 위해서만 이를 사용할 수 있습니다.원치 않는 추적 보호 키:
SHA256(ephemeral identity key || 0x03)
로 정의되며 처음 8바이트로 잘립니다. 이 키는 백엔드에 저장되며 탐색자가 원치 않는 추적 보호 모드를 활성화하는 데만 사용할 수 있습니다.
운영
특성에 쓰여진 데이터의 형식은 표 2~5에 나와 있습니다. 각 작업은 이 섹션의 뒷부분에서 자세히 설명합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 데이터 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 | 바이트 배열 | 추가 데이터 |
|
표 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 |
|
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 | 바이트 배열 | 추가 데이터 |
|
표 4: 벨소리 요청
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 데이터 ID |
|
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 | 바이트 배열 | 추가 데이터 |
|
표 5: 원치 않는 추적 보호 요청
쓰기에 성공하면 표 6에 나와 있는 대로 알림이 트리거됩니다.
0x05: 벨소리 상태 변경이 아닌 데이터 ID가 있는 알림은 알림을 트리거하는 쓰기 트랜잭션이 완료되기 전에, 즉 쓰기 요청에 대한 응답 PDU가 전송되기 전에 전송해야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 데이터 ID |
|
1 | uint8 | 데이터 길이 | 다름 |
2~9 | 바이트 배열 | 인증 | 작업별 세부정보 |
10 - var | 바이트 배열 | 추가 데이터 |
|
표 6: 비콘 서비스 응답
표 7에는 작업에서 반환할 수 있는 GATT 오류 코드가 나와 있습니다.
코드 | 설명 | 참고 |
---|---|---|
0x80 | 인증되지 않음 | 인증에 실패할 때 (이전 nonce가 사용된 경우 포함) 쓰기 요청에 대한 응답으로 반환됩니다. |
0x81 | 값이 올바르지 않습니다. | 잘못된 값이 제공되거나 수신된 데이터에 예상치 못한 바이트 수가 포함된 경우 반환됩니다. |
0x82 | 사용자 동의 없음 | 기기가 페어링 모드가 아닐 때 데이터 ID 0x04: 사용자 동의로 임시 ID 키 읽기가 있는 쓰기 요청에 대한 응답으로 반환됩니다. |
표 7: GATT 오류 코드
비콘의 매개변수 읽기
검색자는 데이터 ID 0x00의 표 2의 요청으로 구성된 특성에 대한 쓰기 작업을 실행하여 제공업체에 비콘의 매개변수를 쿼리할 수 있습니다. 제공된 일회성 인증 키가 기기에 저장된 계정 키와 일치하는지 확인합니다.
인증에 실패하면 제공업체에서 인증되지 않은 오류를 반환합니다.
성공하면 공급업체는 데이터 ID 0x00이 포함된 표 6의 응답으로 알립니다. 제공업체는 다음과 같이 데이터 세그먼트를 구성합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 보정된 전원 | 0m에서 수신된 보정된 전력([-100, 20] 범위의 값)입니다. 1dBm 해상도로 부호 있는 정수로 표시됩니다. |
1~4명 | uint32 | 시계 값 | 현재 시계 값 (초, 빅엔디언)입니다. |
5 | uint8 | 커브 선택 | 암호화에 사용되는 타원 곡선입니다.
|
6 | uint8 | 구성요소 | 울릴 수 있는 구성요소 수:
|
7 | uint8 | 벨소리 기능 | 지원되는 옵션은 다음과 같습니다.
|
8~15 | 바이트 배열 | 패딩 | AES 암호화를 위한 0 패딩 |
데이터는 요청 인증에 사용된 계정 키로 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의 요청으로 구성된 특성에 쓰기 작업을 실행하여 공급자에게 비콘의 프로비저닝 상태를 쿼리할 수 있습니다. 제공된 일회성 인증 키가 기기에 저장된 계정 키와 일치하는지 공급자가 확인합니다.
인증에 실패하면 제공업체에서 인증되지 않은 오류를 반환합니다.
성공하면 공급업체는 데이터 ID 0x01이 포함된 표 6의 응답으로 알립니다. 제공업체는 다음과 같이 데이터 세그먼트를 구성합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 프로비저닝 상태 | 다음 값을 갖는 비트 마스크입니다.
|
1~20 또는 32 | 바이트 배열 | 현재 일시적인 식별자 | 기기에 설정된 경우 비콘에서 광고하는 현재 임시 ID를 나타내는 20바이트 또는 32바이트(사용 중인 암호화 방법에 따라 다름)입니다. |
인증 세그먼트는 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 키를 변경하려면 시커가 데이터 ID 0x02의 표 2 요청으로 구성된 특성에 쓰기 작업을 실행합니다. 제공업체는 다음을 확인합니다.
- 제공된 일회성 인증 키가 소유자 계정 키와 일치합니다.
- 임시 ID 키의 해시가 제공된 경우 해싱된 임시 ID 키가 현재 임시 ID 키와 일치합니다.
- 일시적인 ID 키의 해시가 제공되지 않은 경우 제공업체가 아직 FMDN 비콘으로 프로비저닝되지 않았는지 확인합니다.
인증에 실패하면 제공업체에서 인증되지 않은 오류를 반환합니다.
성공하면 일시적인 ID 키가 일치하는 계정 키를 사용하여 AES-ECB-128로 복호화하여 복구됩니다. 키는 기기에 유지되어야 하며, 이 시점부터 제공업체는 FMDN 프레임을 광고하기 시작해야 합니다. 새 임시 ID 키는 BLE 연결이 종료된 직후 적용됩니다. 공급업체는 데이터 ID 0x02가 포함된 표 6의 응답으로 알립니다.
인증 세그먼트는 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 프레임 광고를 중지합니다.
공급업체는 데이터 ID 0x03이 포함된 표 6의 응답으로 알립니다.
인증 세그먼트는 HMAC-SHA256(account key, protocol major version number || the last nonce read
from the characteristic || data ID || data length || 0x01)
의 처음 8바이트로 정의됩니다.
사용자 동의로 임시 ID 키 읽기
이 옵션은 키가 검색자에 의해 로컬에만 저장되므로 분실한 키를 복구하는 데만 사용할 수 있습니다. 따라서 이 기능은 기기가 페어링 모드이거나 기기에서 물리적 버튼을 누른 후 일정 시간 동안만 사용할 수 있습니다 (사용자 동의가 필요함).
시커는 일반 텍스트 키를 복구할 수 있도록 백엔드에 복구 키를 저장해야 하지만 EIK 자체는 저장하지 않습니다.
EIK를 읽으려면 시커가 데이터 ID 0x04의 테이블 3 요청으로 구성된 특성에 대한 쓰기 작업을 실행합니다. 제공업체는 다음 사항을 확인합니다.
- 해싱된 복구 키가 예상 복구 키와 일치합니다.
- 기기가 EIK 복구 모드입니다.
인증에 실패하면 제공업체에서 인증되지 않은 오류를 반환합니다.
기기가 페어링 모드가 아니면 제공업체는 사용자 동의 없음 오류를 반환합니다.
성공하면 공급업체는 데이터 ID 0x04가 포함된 표 6의 응답으로 알립니다.
인증 세그먼트는 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 - 2 | uint16 | 제한 시간 | 제한 시간(데시초)입니다. 0이 아니어야 하며 10분에 상응하는 값보다 커서는 안 됩니다. 제공업체는 이 값을 사용하여 음소거되기 전에 벨이 울리는 시간을 결정합니다. 기기의 구성요소가 이미 울리고 있는 경우 시간 제한이 이미 적용된 시간 제한을 재정의합니다. 링 작업이 0x00으로 설정된 경우 시간 제한은 무시됩니다. |
3 | uint8 | 볼륨 |
|
요청을 받은 공급자는 다음을 확인합니다.
- 제공된 일회성 인증 키가 링 키와 일치합니다.
- 요청된 상태가 울릴 수 있는 구성요소와 일치합니다.
제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 인증되지 않은 오류가 반환됩니다. 그러나 제공업체에 원치 않는 추적 보호가 활성화되어 있고 원치 않는 추적 보호 요청을 트리거할 때 벨소리 재생 인증 건너뛰기 플래그가 사용 설정된 경우 제공업체는 이 검사를 건너뛰어야 합니다. 인증 데이터는 여전히 검색자가 제공해야 하지만 임의의 값으로 설정할 수 있습니다.
벨소리가 시작되거나 종료되면 표 6에 표시된 대로 데이터 ID 0x05와 함께 알림이 전송됩니다. 알림의 콘텐츠는 다음과 같이 정의됩니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 벨이 울리는 상태 |
|
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 요청)을 포함하는 알림을 전송해야 합니다. 이 요청은 기존 상태의 매개변수를 재정의하므로 벨소리 길이를 연장할 수 있습니다.
제공업체에 물리적 버튼이 있거나 터치 감지가 사용 설정된 경우 벨소리가 울리는 동안 버튼을 누르면 벨소리가 울리는 기능이 중지되어야 합니다.
비콘의 벨소리 상태 가져오기
비콘의 벨소리 상태를 가져오기 위해 시커는 데이터 ID가 0x06인 테이블 4의 요청으로 구성된 특성에 대한 쓰기 작업을 실행합니다. 제공된 일회성 인증 키가 링 키와 일치하는지 확인합니다.
제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 제공업체는 인증되지 않은 오류를 반환합니다.
성공하면 공급업체는 데이터 ID 0x06이 포함된 테이블 6의 응답으로 알립니다. 제공업체는 다음과 같이 데이터 세그먼트를 구성합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
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 | 제어 플래그 |
이 플래그는 원치 않는 추적 보호 모드가 비활성화될 때까지만 적용됩니다. |
제공업체는 제공된 일회성 인증 키가 원치 않는 추적 보호 키와 일치하는지 확인합니다. 제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 인증되지 않은 오류가 반환됩니다.
원치 않는 추적 보호 모드가 활성화되면 비콘은 MAC 비공개 주소 순환 빈도를 24시간당 한 번으로 줄여야 합니다. 광고된 임시 식별자는 평소와 같이 계속 순환해야 합니다. 프레임 유형은 0x41로 설정해야 합니다. 이 상태는 해싱된 플래그 섹션에도 반영됩니다.
원치 않는 추적 보호 모드를 사용 중지하는 경우
제공업체는 다음을 확인합니다.
- 제공된 일회성 인증 키가 원치 않는 추적 보호 키와 일치합니다.
- 해싱된 임시 ID 키가 현재 임시 ID 키와 일치합니다.
제공업체가 FMDN 비콘으로 프로비저닝되지 않았거나 인증에 실패하면 제공업체는 인증되지 않은 오류를 반환합니다.
원치 않는 추적 보호 모드가 비활성화되면 비콘은 일시적 식별자 회전과 동기화되어 MAC 주소를 정상 속도로 다시 회전하기 시작해야 합니다. 프레임 유형을 0x40으로 다시 설정해야 합니다. 이 상태는 해싱된 플래그 섹션에도 반영됩니다.
성공하면 공급자는 데이터 ID 0x07 또는 0x08이 포함된 표 6의 응답으로 알립니다.
인증 세그먼트는 HMAC-SHA256(unwanted tracking protection key, protocol major version number ||
the last nonce read from the characteristic || data ID || data length ||
0x01)
의 처음 8바이트로 정의됩니다.
광고된 프레임
프로비저닝 후에는 제공업체가 FMDN 프레임을 2초마다 한 번 이상 광고해야 합니다. 빠른 페어링 프레임이 광고되는 경우 제공업체는 일반 빠른 페어링 광고 내에 FMDN 프레임을 삽입해야 합니다. 예를 들어 제공업체는 2초마다 빠른 페어링 광고 7개와 FMDN 광고 1개를 광고해야 합니다.
FMDN 광고의 전도 블루투스 송신 전력은 0dBm 이상으로 설정해야 합니다.
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 키로 다음 데이터 구조를 AES-ECB-256 암호화하여 랜덤이 생성됩니다.
옥텟 | 필드 | 설명 |
---|---|---|
0~10 | 패딩 | 값 = 0xFF |
11 | K | 순환 주기 지수 |
12~15명 | TS[0]...TS[3] | 비콘 시간 카운터(32비트 big-endian 형식) 가장 낮은 K비트가 0으로 설정됩니다. |
16~26세 | 패딩 | 값 = 0x00 |
27 | K | 순환 주기 지수 |
28 - 31 | TS[0]...TS[3] | 비콘 시간 카운터(32비트 big-endian 형식) 가장 낮은 K비트가 0으로 설정됩니다. |
표 10: 가우시안 난수 생성.
이 계산의 결과는 256비트 숫자(r'
)입니다.
나머지 계산에서는 SECP160R1
또는 SECP256R1
가 타원 곡선 암호화 작업에 사용됩니다. 다음에 참조되는 Fp
, n
, G
를 정의하는
SEC 2: 권장되는 타원 곡선 도메인 매개변수의 곡선 정의를 참고하세요.
이제 r = r' mod n
를 계산하여 r'
가 유한 필드 Fp
에 투영됩니다.
마지막으로 사용 중인 공개 키를 나타내는 곡선의 점인 R = r * G
를 계산합니다. 비콘은 R
의 x
좌표인 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
를 읽은 상태)가 다음을 실행합니다.
- EID 계산 섹션에 정의된 대로
Fp
에서 랜덤 숫자s
를 선택합니다. S = s * G
를 계산합니다.- 곡선 방정식에 대입하고 가능한 결과 중에서 임의의
Ry
값을 선택하여R = (Rx, Ry)
를 계산합니다. - 256비트 AES 키
k = HKDF-SHA256((s * R)x)
를 계산합니다. 여기서(s * R)x
는 곡선 곱셈 결과의x
좌표입니다. 솔트가 지정되지 않았습니다. URx
및LRx
는 각각 빅엔디언 형식의Rx
의 상위 80비트와 하위 80비트입니다. 마찬가지로S
에USx
및LSx
를 정의합니다.nonce = LRx || LSx
를 계산합니다.(m’, tag) = AES-EAX-256-ENC(k, nonce, m)
를 계산합니다.- 신뢰할 수 없는 원격 서비스를 통해 소유자에게
(URx, Sx, m’, tag)
를 전송합니다.
EID로 암호화된 값 복호화
EIK와 순환 기간 지수를 보유한 소유자의 클라이언트는 다음과 같이 메시지를 복호화합니다.
URx
가 주어지면URx
의 기반이 되는 비콘 시간 카운터 값을 가져옵니다. 이는 소유자의 클라이언트가 최근 과거 및 가까운 미래의 비콘 시간 카운터 값에 대한Rx
값을 계산하여 수행할 수 있습니다.URx
의 기반이 되는 비콘 시간 카운터 값을 고려하여 EID 계산 섹션에 정의된 대로r
의 예상 값을 계산합니다.R = r * G
를 계산하고 시이터가 제공한URx
값과 일치하는지 확인합니다.- 곡선 방정식에 대입하고 가능한 결과 중에서 임의의
Sy
값을 선택하여S = (Sx, Sy)
를 계산합니다. k = HKDF-SHA256((r * S)x)
를 계산합니다. 여기서(r * S)x
는 곡선 곱셈 결과의x
좌표입니다.nonce = LRx || LSx
를 계산합니다.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을 지원하는 제공업체의 빠른 페어링 구현의 특수한 측면을 설명합니다.
위치 추적 태그별 가이드라인
- 제공업체가 페어링되었지만 5분 이내에 FMDN이 프로비저닝되지 않은 경우 (또는 기기가 페어링되었지만 FMDN이 프로비저닝되지 않은 상태에서 OTA 업데이트가 적용된 경우) 제공업체는 초기 구성으로 되돌리고 저장된 계정 키를 삭제해야 합니다.
- 제공업체가 페어링된 후에는 FMDN이 프로비저닝될 때까지 또는 5분이 지나기 전까지 MAC 주소를 변경해서는 안 됩니다.
- 기기에서 일회용 ID 키가 삭제되면 기기는 초기화되고 저장된 계정 키도 삭제됩니다.
- 제공업체는 일반 블루투스 페어링 시도를 거부하고 빠른 페어링 페어링만 수락해야 합니다.
- 제공업체는 사용자가 기기를 초기화하지 않고도 일시적으로 광고를 중지할 수 있는 메커니즘 (예: 버튼 조합 누르기)을 포함해야 합니다.
- 전원이 꺼진 후 기기는 비콘 매개변수 읽기를 다음에 호출할 때까지 검색 불가능한 빠른 페어링 프레임을 광고해야 합니다. 이렇게 하면 상당한 시계 오류가 발생하더라도 시커가 기기를 감지하고 시계를 동기화할 수 있습니다.
- 검색할 수 없는 빠른 페어링 프레임을 광고할 때는 UI 표시를 사용 설정해서는 안 됩니다.
- 제공업체가 FMDN에 프로비저닝되는 동안에는 검색 가능한 빠른 페어링 프레임을 광고해서는 안 됩니다.
- 제공업체는 인증되지 않은 방식으로 식별 정보 (예: 이름 또는 식별자)를 노출해서는 안 됩니다.
기존 블루투스 기기별 가이드라인
이 섹션에서는 FMDN을 지원하는 기존 블루투스 기기의 특수한 측면을 설명합니다.
이미 페어링된 기기의 FMDN 프로비저닝
제공업체는 시커와 페어링할 때 항상 FMDN에 프로비저닝되지는 않으며 그 후 잠시 후에 프로비저닝됩니다. 이 경우 제공업체에 GATT 연결을 설정하는 데 필요한 최신 BLE MAC 주소가 없을 수 있습니다. 이미 페어링된 상태에서 탐색기가 BLE 주소를 가져오는 데 사용할 수 있는 다음 방법 중 하나 이상을 제공자에서 지원해야 합니다.
- 제공업체는 탐색자가 BLE 스캔을 통해 BLE 주소를 찾을 수 있는 빠른 페어링 계정 데이터를 주기적으로 광고할 수 있습니다.
이 접근 방식은 메시지 스트림을 구현하지 않는 제공업체에 적합합니다. - 제공업체는 기존 블루투스를 통해 빠른 페어링 메시지 스트림을 통해 이 데이터를 제공할 수 있습니다.
이 접근 방식은 블루투스를 통해 검색기에 연결되어 있는 동안 빠른 페어링 프레임을 광고하지 않는 제공업체에 적합합니다.
두 가지 접근 방식을 모두 지원하면 사용자가 FMDN용으로 기기를 프로비저닝할 가능성이 높아집니다.
빠른 페어링 메시지 스트림
제공업체는 빠른 페어링 메시지 스트림을 구현하고 이를 사용하여 기기 정보를 탐색자에게 알릴 수 있습니다. 메시지 스트림을 구현하면 이 섹션에 설명된 대로 특정 기능을 사용할 수 있습니다.
제공업체는 메시지 스트림 RFCOMM 채널이 설정될 때마다 한 번 기기 정보 메시지를 전송해야 합니다.
펌웨어 버전 (기기 정보 코드 0x09) 및 추적 기능
펌웨어 업데이트로 인해 제공업체에 FMDN 지원이 추가되면 연결된 검색자가 사용자에게 이를 알리고 프로비저닝을 제안할 수 있습니다. 그러지 않으면 사용자가 FMDN 프로비저닝을 시작하기 위해 블루투스 기기 목록으로 수동으로 이동해야 합니다.
이를 허용하려면 제공업체가 펌웨어 버전 속성 (코드 0x09)을 사용하여 펌웨어 버전을 나타내는 문자열 값을 보고해야 합니다. 또한 제공업체는 펌웨어 업데이트로 인한 기능 변경사항을 검색자에게 알리는 프로토콜을 지원해야 합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
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 및 시계 값을 보고하고, 시계 오류 (예: 배터리 소모로 인한 오류)가 발생할 경우 시커를 동기화할 수 있습니다. 그러지 않으면 시커는 이 목적으로 더 비싸고 안정성이 떨어지는 연결을 시작합니다.
옥텟 | 데이터 유형 | 설명 | 값 |
---|---|---|---|
0 | uint8 | 기기 정보 이벤트 | 0x03 |
1 | uint8 | 현재 일시적인 식별자 | 0x0B |
2~3개 | uint16 | 추가 데이터 길이 | 0x0018 또는 0x0024 |
4 - 7 | 바이트 배열 | 시계 값 | 예: 0x13F9EA80 |
8~19 또는 31 | 바이트 배열 | 현재 EID | 예: 0x1122334455667788990011223344556677889900 |
표 13: 기기 정보 이벤트: 시계 동기화
초기화
초기화를 지원하는 기기의 경우: 초기화가 실행되면 제공업체는 비콘 전송을 중지하고 일시적인 ID 키와 소유자의 계정 키를 비롯한 저장된 모든 계정 키를 삭제해야 합니다.
수동 또는 프로그래매틱 초기화 후에는 사용자가 기기를 삭제한 직후에 페어링 흐름이 시작되지 않도록 제공업체가 즉시 빠른 페어링을 광고하면 안 됩니다.
원치 않는 추적 방지
인증된 FMDN 기기는 원치 않는 위치 추적기 감지 (DULT)를 위한 크로스 플랫폼 사양의 구현 버전 요구사항도 충족해야 합니다.
DULT 사양을 준수하기 위한 FMDN 관련 가이드라인:
- FMDN 호환 기기는 Nearby Device Console에 등록되어 있어야 하며 '내 기기 찾기' 기능이 활성화되어 있어야 합니다.
- 기기는 액세서리 정보 작업 및 비소유자 제어를 비롯하여 DULT 사양의 구현 버전에 정의된 액세서리 비소유자 서비스 및 특성을 구현해야 합니다.
- DULT 사양에 정의된 하위 호환성 기간에는 이 문서에 정의된 광고 프레임이 변경되지 않습니다.
- 이 문서에 정의된 '원치 않는 추적 보호 모드'는 DULT 사양에 정의된 '분리된 상태'에 매핑됩니다.
- 액세서리 정보 opcode를 구현하기 위한 가이드라인은 다음과 같습니다.
- Get_Product_Data는 콘솔에서 제공한 모델 ID를 반환해야 하며, 8바이트 요구사항에 맞게 0으로 채워야 합니다. 예를 들어 모델 ID 0xFFFFFF는 0x0000000000FFFFFF로 반환됩니다.
- Get_Manufacturer_Name 및 Get_Model_Name은 콘솔에 제공된 값과 일치해야 합니다.
- 기기 유형에 더 적합한 다른 카테고리가 없는 경우 Get_Accessory_Category는 일반 '위치 추적기' 값을 반환할 수 있습니다.
- Get_Accessory_Capabilities는 벨소리 지원과 BLE 식별자 조회를 나타내야 합니다.
- Get_Network_ID는 Google의 식별자 (0x02)를 반환해야 합니다.
- Get_Identifier opcode 구현을 위한 가이드라인은 다음과 같습니다.
- 이 작업은 사용자가 버튼 누르기 조합이 필요한 '식별' 모드를 활성화한 후 5분 동안만 유효한 응답을 반환해야 합니다. 시각적 또는 청각적 신호를 통해 사용자에게 제공업체가 해당 모드로 전환되었음을 알려야 합니다. 이 모드를 활성화하기 위한 모델별 안내는 인증 요건으로 Google에 제공되어야 하며, 안내를 업데이트하거나 수정하기 최소 10일 전에 제공해야 합니다.
- 응답은 현재 임시 식별자의 처음 10바이트와
HMAC-SHA256(recovery key, the truncated current ephemeral identifier)
의 처음 8바이트로 구성됩니다.
- NFC를 통한 식별자를 구현하기 위한 가이드라인은 다음과 같습니다.
- URL로
find-my.googleapis.com/lookup
을 사용합니다. e
매개변수로 Get_Identifier에 대해 생성된 것과 동일한 응답을 사용합니다(16진수로 인코딩됨).pid
매개변수로 Get_Product_Data에 생성된 것과 동일한 응답을 사용합니다(16진수로 인코딩됨).
- URL로
- 기기에 소리 생성기가 포함되어 있고 벨소리 기능을 지원해야 합니다. DULT 사양에 따라 소리 제작기는 ISO 532-1:2017에 정의된 대로 최대 60폰 피크 음량으로 소리를 내야 합니다.
- Sound_Start opcode 구현 가이드라인은 다음과 같습니다.
- 이 명령어는 사용 가능한 모든 구성요소에서 벨소리를 트리거해야 합니다.
- 지원되는 최대 볼륨을 사용해야 합니다.
- 권장되는 벨소리 길이는 12초입니다.
- 위치 추적기 태그에는 사용자가 기기를 초기화하지 않고도 일시적으로 광고를 중지할 수 있는 메커니즘 (예: 버튼 조합 누르기)이 포함되어야 합니다.
- 사용 중지 안내는 공개적으로 제공되는 URL에 문서화되어야 하며, 인증 요건으로 Google에 제공되고 안내를 업데이트하거나 수정하기 최소 10일 전에 제공되어야 합니다.
- URL은 현지화를 지원해야 합니다. 언어는 클라이언트에 따라 쿼리 매개변수 ('hl=ko')로 제공되거나 'accept-language' HTTP 헤더를 사용하여 제공됩니다.
전환 가능한 프로토콜 가이드라인
- 한 번에 하나의 프로토콜만 사용해야 합니다. 기기에서 동시에 두 개 이상의 네트워크가 작동할 수 없는지 확인합니다. 이 요구사항은 다양한 프로토콜 간에 민감한 사용자 데이터가 혼합되지 않도록 하기 위해 필요합니다.
- 사용자가 다른 네트워크로 기기를 다시 설정할 수 있는 하드 리셋 워크플로를 기기에 통합하는 것이 좋습니다.
- 기기를 네트워크로 업데이트하는 프로세스는 사용자 친화적이고 네트워크 간에 공평해야 합니다. 사용자는 특정 네트워크를 선호하지 않고도 사용할 네트워크를 선택할 수 있어야 합니다. 이 절차는 Google팀의 승인을 받아야 합니다.
펌웨어 업데이트
OTA 업데이트의 프로세스와 배포는 파트너가 자체 모바일 또는 웹 앱 워크플로를 사용하여 관리해야 합니다.
빠른 페어링은 사용 가능한 OTA 업데이트를 알리는 알림을 사용자에게 전송하는 기능을 지원합니다. 이 메커니즘을 사용하려면 다음 단계를 따르세요.
- Nearby Device Console에서 최신 펌웨어 버전을 업데이트해야 합니다.
- 호환 앱은 Nearby Device Console에서 설정해야 합니다. 펌웨어 업데이트 인텐트를 지원해야 합니다.
- 제공업체는 펌웨어 버전 GATT 특성을 구현해야 합니다.
추적을 방지하려면 펌웨어 버전 특성에 대한 액세스를 제한해야 합니다. 시커는 먼저 프로비저닝 상태를 읽고 이 사양에 정의된 대로 인증 키를 제공한 다음에야 펌웨어 버전을 읽습니다. 이는 동일한 연결을 통해 이루어집니다. 펌웨어 버전을 읽으려고 시도했는데 제공업체가 결합되어 있지 않거나 동일한 연결을 통해 인증된 작업이 완료되지 않았다면 제공업체는 인증되지 않은 오류를 반환해야 합니다.
호환성
내 기기 찾기 네트워크를 사용하려면 위치 서비스 및 블루투스가 사용 설정되어 있어야 합니다. 이동통신 서비스 또는 인터넷 연결이 필요합니다. Android 9 이상에서 작동하며 특정 국가에서는 연령 요건을 충족하는 사용자를 대상으로 합니다.
변경 로그
FMDN 버전 | 날짜 | 댓글 |
---|---|---|
v1 | 사전 체험을 위한 FMDN 사양의 초기 버전입니다. | |
v1.1 | Feb 2023 |
|
v1.2 | 2023년 4월 |
|
v1.3 | 2023년 12월 |
|