특성

빠른 페어링 서비스

빠른 페어링 제공자는 다음과 같은 GATT 서비스를 보유해야 합니다.

서비스 UUID
빠른 페어링 서비스 0xFE2C

이 서비스는 다음과 같은 특성을 지닙니다.

빠른 페어링 서비스 특성 암호화됨 권한 UUID
모델 ID 아니요 읽기 FE2C1233-8366-4814-8EB0-01DE32100BEA
키 기반 페어링 아니요 작성 및 알림 FE2C1234-8366-4814-8EB0-01DE32100BEA
패스키 아니요 작성 및 알림 FE2C1235-8366-4814-8EB0-01DE32100BEA
계정 키 아니요 쓰기 FE2C1236-8366-4814-8EB0-01DE32100BEA

기기 정보 서비스

빠른 페어링 제공자는 기기 정보 서비스도 지원해야 합니다.

서비스 UUID
기기 정보 서비스 0x180A

빠른 페어링 탐색은 다음과 같은 특성을 사용합니다.

이름 암호화됨 권한 UUID
펌웨어 버전 아니요 읽기 0x2A26

특성: 모델 ID

이 특성을 통해 Seeker는 필요에 따라 외부에서 모델 ID를 읽을 수 있습니다. 기기가 검색 가능 모드로 광고할 때. 항상 다음 데이터가 포함됩니다.

옥텟 데이터 유형 설명
0~2 uint24 모델 ID 다양한 가격

특성: 키 기반 페어링

이 특성은 키 기반 페어링 절차를 제어합니다. 이 절차에서는 특정 수준의 신뢰가 설정된 경우 탐색자가 해당 사용자와 제공자가 둘 다 사전 공유 키를 소유하고 있습니다. 키는 다음과 같습니다.

  • 사례 1: 사전 공유 키가 스푸핑 방지 공개/비공개 키를 기반으로 함 공개 키/비공개 키 쌍과 같은 새로운 키 쌍과 페어링 시도 중.

    • 제공업체가 페어링 모드입니다.
    • 탐색자가 제공자가 개인 키 스푸핑 방지 비공개 키.

    페어링 모드에 있을 때 제공자는 물론 빠른 연결 속도를 지원하지 않는 기기와 페어링할 수 있습니다. 페어링의 키 기반 페어링.

  • 사례 2: 사전 공유 키가 계정 키 중 하나입니다.

    • 제공자는 일반적으로 페어링 모드가 아닙니다. (하지만 이것은 요구 사항 - 제공자는 페어링 모드로 전환)
    • 탐색자와 제공자가 서로 다른 사람이 계정 키

두 경우 모두 사전 공유 키가 사용되는 경우를 제외하고는 매우 유사하기 때문에 절차에서 결합됩니다.

데이터 형식

각 형식이 사용되는 방법은 절차를 참고하세요.

옥텟 데이터 유형 설명 필수 여부
0~15 uint128 암호화된 요청 다양한 가격 필수
16~79 공개 키 다양한 가격 선택사항

표 1.1: 탐색자가 특성에 작성한 암호화된 요청

옥텟 데이터 유형 설명 필수 여부
0 uint8 메시지 유형 0x00 = 키 기반 페어링 요청 필수
1 uint8 플래그
  • 비트 0 (MSB): 지원 중단되었으며 Seeker가 무시합니다.
  • 비트 1: 1. 탐색자가 제공자가 결합을 시작해야 한다고 요청하고 이 요청에 탐색자의 BR/EDR 주소가 포함되어 있습니다. 그 이외의 경우에는 0입니다.
  • 비트 2: 1. 탐색자가 제공자에게 기존 이름을 알려달라고 요청하는 경우. 그 이외의 경우에는 0입니다.
  • 비트 3: 계정 키 소급 쓰기용인 경우 1. 그 이외의 경우에는 0입니다.
  • 비트 4~7은 향후 사용을 위해 예약되어 있으므로 무시됩니다.
다름 필수
2~7 uint48 다음 중 하나를 선택합니다.
  • 제공업체의 현재 BLE 주소
  • 제공업체의 공개 주소
다름 필수
8~13 uint48 탐색자의 BR/EDR 주소 다름 플래그 비트 1 또는 3이 설정된 경우에만 있습니다.
n - 15 임의의 값 (솔트) 다름 필수

표 1.2.1: 원시 요청 (유형 0x00). 암호화된 데이터 파일에서 해독됨 표 1.1의 요청

옥텟 데이터 유형 설명 필수 여부
0 uint8 메시지 유형 0x10 = 작업 요청 필수
1 uint8 플래그
  • 비트 0 (MSB): 기기 작업이면 1, 그렇지 않으면 0입니다.
  • 비트 1: 1(그 뒤에 추가 데이터 특성이 오면 1, 그렇지 않으면 0).
  • 비트 2~7은 나중에 사용할 수 있도록 예약되어 있으므로 무시됩니다.
다름 필수
2~7 uint48 다음 중 하나를 선택합니다.
  • 제공업체의 현재 BLE 주소
  • 제공업체의 공개 주소
다름 필수
8 uint8 메시지 그룹 다름 플래그 비트 0을 설정하는 경우 필수
9 uint8 메시지 코드 다름 플래그 비트 0을 설정하는 경우 필수
10 uint8 플래그에 따라 다름:
  • 비트 0이 설정됨: 추가 데이터 길이, 6 미만
  • 비트 1이 설정됨: 데이터 ID
다름 플래그 비트 0 또는 1을 설정하는 경우 필수
11 - n 추가 데이터 다름 선택사항
n - 15 임의의 값 (솔트) 다름 필수

표 1.2.2: 원시 요청 (유형 0x10). 암호화된 데이터 파일에서 해독됨 표 1.1의 요청

옥텟 데이터 유형 설명
0 uint8 메시지 유형 0x01 = 키 기반 페어링 응답
1~6 uint48 제공업체의 공개 (BR/EDR) 주소 다름
7~15 임의의 값 (솔트) 다름

표 1.3: 원시 응답 암호화하여 표 1.4.

옥텟 데이터 유형 설명
0~15 uint128 암호화된 응답 다름

표 1.4: 제공자가 있습니다.

특성: 패스키

이 특성은 키 기반 페어링 중에 있습니다.

옥텟 데이터 유형 설명
0~15 uint128 암호화된 패스키 블록 다름

표 2.1: 암호화된 패스키 블록 자세한 내용은 키 기반 페어링 절차(사용 시)

옥텟 데이터 유형 설명
0 uint8 메시지 유형 다음 중 하나:
  • 0x02 = 탐색자의 패스키
  • 0x03 = 제공업체의 패스키
1~3 unit32 6자리 패스키 다름
4~15명 임의의 값 (솔트) 다름

표 2.2: 원시 패스키 블록. 표 2.1의 복호화된 버전

특성: 계정 키

페어링이 완료되면 빠른 페어링 탐색자가 빠른 페어링에 계정 키를 기록합니다. 제공업체.

옥텟 데이터 유형 설명
0~15 uint128 계정 키 (암호화됨) 다름

쓰기 요청을 받으면 빠른 페어링 제공자는 다음을 실행해야 합니다.

  1. 이 문서의 4단계에서 생성된 공유 비밀번호를 사용하여 계정 키를 절차를 검토하세요.
    • 결합이 필요한 제공업체의 경우 (일반): <ph type="x-smartling-placeholder">
        </ph>
      • 복호화하기 전에 공유 보안 비밀이 패스키 요청을 전송합니다. 이 단계를 통과하지 못한 경우 이 쓰기를 무시하고 종료합니다.
    • 이 시점에서는 공유 보안 비밀 (절차에서 K)이 사용되지 않습니다. 한 번 더 할 수 있습니다. 이 키로 암호화된 모든 요청은 는 거부되어야 합니다.
  2. 복호화된 값이 0x04로 시작하는지 확인합니다. 그렇지 않은 경우 그대로 두고 종료합니다
  3. 보관된 계정 키 목록에 새 키를 추가할 공간이 있는지 확인 값으로 사용됩니다.
  4. 그렇지 않은 경우 가장 오래전에 사용한 값을 목록에서 삭제합니다.
  5. 목록에 새 값을 추가합니다.

목록에 있는 계정 키는 키 기반 페어링 중에 사용됩니다.

특성: 펌웨어 수정

이 특성으로 인해 Seeker는 시스템의 펌웨어 버전을 읽고 제공업체. 항상 다음 데이터가 반환되어야 합니다.

옥텟 데이터 유형 설명
0 - var utf8s 펌웨어 버전 코드 다름

두 개 이상의 문자열이 있는 경우에도 단일 utf8 문자열로 캡슐화되어야 합니다. 제공업체의 펌웨어 (예: 왼쪽 이어폰, 오른쪽 이어폰, 케이스용 펌웨어 3개) 제공자는 특별한 경우의 특정 문자열을 반환할 수도 있습니다.

  1. status-updating: 제공업체가 현재 새 펌웨어로 업데이트하는 경우입니다. 또는 제공업체가 스테이징된 펌웨어 버전을 반환할 수 있습니다.

  2. status-abnormal: 제공업체가 비정상 상태인 경우. 예를 들어 펌웨어 업데이트에 실패하여 오작동했습니다. 이 값을 사용하면 지금 업데이트해야 한다고 사용자에게 알리는 메시지를 표시합니다.

제공업체는 펌웨어 수정 버전 특성에 대한 액세스를 할 수 있습니다. 추천 제한사항:

  • 연결된 기기는 언제든지 액세스할 수 있어야 함
  • 공급자가 검색 가능한 경우 모든 기기에서 액세스할 수 있어야 합니다.

특성: 추가 데이터

이 서비스는 다음과 같은 특성을 지닙니다.

빠른 페어링 서비스 특성 암호화됨 권한 UUID
데이터 아니요 작성 및 알림 FE2C1237-8366-4814-8EB0-01DE32100BEA
이전 빠른 페어링 서비스 특성 (2021년 1월 1일에 지원 중단 예정) 암호화됨 권한 UUID
데이터 아니요 작성 및 알림 0x1237

이 특성에 대해 작성하거나 통지하기 전에 특성 FE2C1234-8366-4814-8EB0-01DE32100BEA을 통해 핸드셰이크 공유 보안 비밀일 수 있습니다 AES-CTR은 이 세그먼트를 통해 전송되는 데이터를 암호화하는 데 사용됩니다. 이 특성의 알고리즘은 아래에 정의되어 있습니다. 이 모드는 단일 16바이트 블록을 넘어서는 모든 데이터에 대해 보안을 유지합니다. HMAC-SHA256은 데이터 무결성을 보장하는 데 사용될 수 있습니다.

옥텟 설명
0 - 7 HMAC-SHA256의 처음 8바이트 다름
8~15 nonce: AES-CTR 암호화에 사용됩니다. 다름
16 - var 암호화된 데이터. 다름

표 3.1: 공급자가 작성을 통해 탐색자가 제공자에게 통지하거나 전송해야 합니다.

옥텟 데이터 유형 설명
0 - var byte array 데이터 다를 경우 표 1.2.2의 데이터 ID에 따라 디코딩합니다.
  • 0x01(맞춤설정된 이름): utf8s

표 3.2: 원시 데이터 암호화된 데이터에서 복호화된 데이터는 표 3.1.

알림을 요청한 경우 (예: 표 1.2.1) 빠른 페어링 제공자는 다음을 수행해야 합니다.

  1. Nonce에 대해 암호학적으로 임의 8바이트를 생성합니다.
  2. AES-CTR을 사용하여 데이터를 암호화합니다. 각 16바이트 블록은 AES-CTR을 사용하여

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    어디서

    1. AES 키는 절차 4단계의 공유 비밀번호입니다.
    2. clearBlock[i] 는 data[i * 16]에서 시작하는 16바이트 블록입니다. 마지막 16바이트 미만일 수 있습니다
  3. concat(encryptedBlock[0], encryptionBlock[1],...)을 실행하여 암호화된 데이터.

  4. HMAC-SHA256 생성 방법

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    어디서

    1. K는 concat(shared_secret, 48바이트 ZEROs)에 의해 생성되고, shared_secret은 프로시저의 4단계에 있습니다.
    2. opad는 값이 있는 반복되는 바이트로 구성된 64바이트 외부 패딩입니다. 0x5C
    3. 아이패드는 값이 반복되는 바이트로 구성된 64바이트 내부 패딩입니다. 0x36
  5. HMAC-SHA256에서 처음 8바이트를 Data 패킷을 참조하세요.

쓰기 요청을 받으면 빠른 페어링 제공자는 다음을 실행해야 합니다.

  1. 첫 8바이트를 확인하여 데이터의 무결성을 확인합니다. HMAC-SHA256
  2. AES-CTR을 사용하여 암호화된 데이터를 복호화합니다. 각 블록은 AES-CTR을 사용하여 생성됩니다.

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    어디서

    1. encryptionBlock[i] 은 encryption_data[i * 16]의 16바이트 블록 시작입니다. 마지막 블록은 16바이트 미만일 수 있습니다.
    2. AES 키는 핸드셰이크에서 생성 또는 식별됩니다. 예: <ph type="x-smartling-placeholder">
        </ph>
      1. ECDH에서 가져온 것이기 때문에 이름 지정 흐름 1에 이 페어링에 다시 사용됩니다. 암호화되어 전송되는 모든 요청은 이 키를 사용하여 초기화해야 하는 경우 거부되었습니다.
      2. 이름 지정 절차 2에서는 계정 키입니다.
  3. concat(clearBlock[0], clearBlock[1],...)을 실행하여 원시 데이터를 생성합니다.