메시지 인증 코드
메시지 스트림은 오디오 전환을 구성하는 데 사용됩니다(오디오 전환 메시지 참고). 이러한 중요한 구성의 경우 제공자는 메시지가 탐색기의 다른 앱이 아닌 GMSCore (빠른 페어링 모듈)에 의해 전송되는지 확인해야 합니다.
MAC (메시지 인증 코드) 생성
FP Seeker는 HMAC-SHA256을 사용하여 기기 구성 메시지의 메시지 인증 코드를 추가합니다. 메시지의 MAC은 다음의 처음 8바이트로 구성됩니다.
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
어디서
- K는 concat(계정 키, 48바이트 0)으로 생성됩니다.
- message는 메시지 스트림의 추가 데이터입니다.
- nonce는 concat(session_nonce, message_nonce)로 생성됩니다. 세션 nonce와 메시지 nonce는 다음 섹션에 정의되어 있습니다.
- opad는
0x5C값이 반복되는 바이트로 구성된 64바이트의 외부 패딩입니다. - ipad는
0x36값이 반복되는 바이트로 구성된 64바이트의 내부 패딩입니다.
세션 nonce 및 메시지 nonce
재전송 공격을 방지하려면 제공자는 nonce가 반복되지 않도록 해야 합니다. 제공자와 시커 모두에서 시계 또는 카운터 동기화를 유지하는 것은 간단하지 않으므로 제공자는 연결 중에 모든 메시지와 공유되는 세션 nonce(연결당)를 생성하고 시커는 각 메시지에 대해 무작위로 생성되는 메시지 nonce(메시지당)를 생성합니다. 각 메시지의 MAC을 생성하는 nonce는 세션 nonce와 메시지 nonce의 조합입니다(예: concat(session_nonce, message_nonce)).
기기 정보 이벤트 그룹에 세션 nonce를 추가합니다.
| 메시지 그룹 이름 | 값 |
|---|---|
| 기기 정보 이벤트 | 0x03 |
| 메시지 코드 이름 | 값 |
|---|---|
| 세션 nonce | 0x0A |
세션 nonce는 메시지 스트림이 연결될 때 생성되어 시커에게 전송되어야 합니다.
| 옥텟 | 데이터 유형 | 설명 | 값 |
|---|---|---|---|
| 0 | uint8 | 기기 정보 이벤트 | 0x03 |
| 1 | uint8 | 세션 nonce | 0x0A |
| 2~3개 | uint16 | 추가 데이터 길이 | 0x0008 |
| 4 - 11 | 세션 nonce | 다름 |
MAC이 필요한 경우 메시지를 전송하기 위해 탐색기는 메시지와 함께 메시지 nonce와 MAC을 전송합니다.
| 옥텟 | 데이터 유형 | 설명 | 값 |
|---|---|---|---|
| 0 | uint8 | 메시지 그룹 | 다름 |
| 1 | uint8 | 메시지 코드 | 다름 |
| 2~3개 | uint16 | 추가 데이터 길이(추가 데이터 길이 + 16) | 다름 |
| 4 - n | 추가 데이터 | 다름 | |
| n + 1 - n + 8 | 메시지 nonce | 다름 | |
| n + 9 - n + 16 | 메시지 인증 코드 | 다름 |
MAC (메시지 인증 코드) 확인
메시지 인증 코드가 포함된 메시지를 수신하면 제공자는 생성 함수와 동일한 함수를 사용하여 이를 확인해야 합니다. 즉, 수신된 MAC은
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
각 항목의 의미는 다음과 같습니다.
- K는
concat(account key, 48-byte ZEROs)에 의해 생성되고 제공자는 저장된 모든 계정 키를 순회하여 MAC을 확인해야 합니다. - message는 메시지 스트림의 추가 데이터 (메시지 nonce 및 MAC 제외)입니다.
MAC이 올바르면 제공자는 메시지의 안내를 따라야 합니다. 그렇지 않으면 제공자는 오류 이유(0x3 - 잘못된 메시지 인증 코드로 인해 허용되지 않음)와 함께 NAK를 전송해야 합니다.