ลักษณะเฉพาะ
บริการจับคู่ด่วน
ผู้ให้บริการจับคู่ด่วนต้องมีบริการ GATT ต่อไปนี้
บริการ | UUID |
---|---|
บริการจับคู่ด่วน | 0xFE2C |
บริการนี้จะมีลักษณะดังต่อไปนี้
ลักษณะเฉพาะของบริการจับคู่ด่วน | มีการเข้ารหัส | สิทธิ์ | UUID |
---|---|---|---|
รหัสโมเดล | ไม่ได้ | อ่านแล้ว | FE2C1233-8366-4814-8EB0-01DE32100BEA |
การจับคู่ตามคีย์ | ไม่ได้ | เขียนและแจ้งเตือน | FE2C1234-8366-4814-8EB0-01DE32100BEA |
พาสคีย์ | ไม่ได้ | เขียนและแจ้งเตือน | FE2C1235-8366-4814-8EB0-01DE32100BEA |
คีย์บัญชี | ไม่ได้ | เขียน | FE2C1236-8366-4814-8EB0-01DE32100BEA |
บริการข้อมูลอุปกรณ์
ผู้ให้บริการจับคู่ด่วนควรรองรับบริการข้อมูลอุปกรณ์ด้วย
บริการ | UUID |
---|---|
บริการข้อมูลอุปกรณ์ | 0x180A |
ผู้ค้นหาจับคู่ด่วนจะใช้ลักษณะดังต่อไปนี้
ชื่อ | มีการเข้ารหัส | สิทธิ์ | UUID |
---|---|---|---|
การแก้ไขเฟิร์มแวร์ | ไม่ได้ | อ่านแล้ว | 0x2A26 |
ลักษณะ: รหัสรุ่น
ลักษณะเฉพาะนี้ช่วยให้ Seeker อ่านรหัสโมเดลได้ตามต้องการ นอกเหนือจากเมื่ออุปกรณ์โฆษณาอยู่ในโหมดที่ค้นพบได้ โดยควรแสดงผลข้อมูลต่อไปนี้เสมอ
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 - 2 | uint24 |
รหัสโมเดล | แปรเปลี่ยน |
ลักษณะ: การจับคู่ตามคีย์
ลักษณะเฉพาะนี้จะควบคุมขั้นตอนการจับคู่ตามคีย์ ในกระบวนการนี้ จะมีการสร้างความไว้วางใจในระดับหนึ่งโดยยืนยันว่าทั้ง Seeker และผู้ให้บริการเป็นเจ้าของคีย์ที่แชร์ล่วงหน้า คีย์จะแตกต่างกันในแต่ละกรณี ดังนี้
กรณีที่ 1: คีย์ที่แชร์ล่วงหน้าอิงตามคู่คีย์สาธารณะ/ส่วนตัวที่ป้องกันการปลอมแปลง และคู่คีย์สาธารณะ/ส่วนตัวของ Seeker เองซึ่งจะเปลี่ยนแปลงทุกครั้งที่มีการจับคู่
- ผู้ให้บริการอยู่ในโหมดการจับคู่
- Seeker จะตรวจสอบว่าผู้ให้บริการมีคีย์ส่วนตัวในการป้องกันการปลอมแปลงแล้วหรือไม่
โปรดทราบว่าเมื่ออยู่ในโหมดการจับคู่ ผู้ให้บริการอาจจับคู่หลักสูตรด้วยวิธีปกติ เช่น ใช้ในการจับคู่กับอุปกรณ์ที่ไม่รองรับการจับคู่ด้วยคีย์ของการจับคู่ด่วน
กรณีที่ 2: คีย์ที่แชร์ล่วงหน้าเป็นหนึ่งในคีย์บัญชี
- ผู้ให้บริการมักไม่ได้อยู่ในโหมดการจับคู่ (แต่นี่ไม่ใช่ข้อกำหนด ผู้ให้บริการควรรองรับการใช้คีย์บัญชีแม้ว่าจะอยู่ในโหมดการจับคู่)
- ผู้ขอและผู้ให้บริการจะตรวจสอบว่าอีกฝ่ายมีคีย์บัญชี
เนื่องจากทั้ง 2 กรณีนี้มีความคล้ายคลึงกันอย่างมาก เว้นแต่จะมีการใช้คีย์ที่แชร์ล่วงหน้า กรณีเหล่านี้จึงรวมเข้าด้วยกันในขั้นตอน
รูปแบบข้อมูล
ดูขั้นตอนเกี่ยวกับวิธีใช้แต่ละรูปแบบ
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า | บังคับหรือไม่ |
---|---|---|---|---|
0-15 | uint128 |
คำขอที่เข้ารหัส | แปรเปลี่ยน | บังคับ |
16-79 ปี | คีย์สาธารณะ | แปรเปลี่ยน | ไม่บังคับ |
ตารางที่ 1.1: คำขอที่เข้ารหัสซึ่งเขียนขึ้นตามลักษณะเฉพาะของ Seeker
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า | บังคับหรือไม่ |
---|---|---|---|---|
0 | uint8 |
ประเภทข้อความ | 0x00 = คำขอจับคู่ตามคีย์ |
บังคับ |
1 | uint8 |
การตั้งค่าสถานะ
|
หลากหลาย | บังคับ |
2 - 7 | uint48 |
ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
|
หลากหลาย | บังคับ |
8-13 ปี | uint48 |
ที่อยู่ BR/EDR ของผู้ร้องขอ | หลากหลาย | แสดงในกรณีที่มีการตั้งค่า Flag Bit 1 หรือ 3 เท่านั้น |
n - 15 | ค่าแบบสุ่ม (Salt) | หลากหลาย | บังคับ |
ตารางที่ 1.2.1: คำขอดิบ (ประเภท 0x00) ถอดรหัสจากคำขอที่เข้ารหัสแล้วใน ตารางที่ 1.1
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า | บังคับหรือไม่ |
---|---|---|---|---|
0 | uint8 |
ประเภทข้อความ | 0x10 = คำขอการดำเนินการ |
บังคับ |
1 | uint8 |
การตั้งค่าสถานะ
|
หลากหลาย | บังคับ |
2 - 7 | uint48 |
ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
|
หลากหลาย | บังคับ |
8 | uint8 |
กลุ่มข้อความ | หลากหลาย | บังคับหากมีการตั้งค่า Flag Bit 0 |
9 | uint8 |
รหัสข้อความ | หลากหลาย | บังคับหากมีการตั้งค่า Flag Bit 0 |
10 | uint8 |
ขึ้นอยู่กับ Flag:
|
หลากหลาย | บังคับหากมีการตั้งค่าแฟล็กบิต 0 หรือ 1 |
11 - n | ข้อมูลเพิ่มเติม | หลากหลาย | ไม่บังคับ | |
n - 15 | ค่าแบบสุ่ม (Salt) | หลากหลาย | บังคับ |
ตารางที่ 1.2.2: คำขอดิบ (ประเภท 0x10) ถอดรหัสจากคำขอที่เข้ารหัสแล้วใน ตารางที่ 1.1
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 | uint8 |
ประเภทข้อความ | 0x01 = การตอบกลับการจับคู่ตามคีย์ |
1-6 ปี | uint48 |
ที่อยู่สาธารณะ (BR/EDR) ของผู้ให้บริการ | หลากหลาย |
7-15 ปี | ค่าแบบสุ่ม (Salt) | หลากหลาย |
ตารางที่ 1.3: คำตอบที่เป็นข้อมูลดิบ ได้รับการเข้ารหัสเพื่อสร้างคำตอบที่เข้ารหัสใน ตารางที่ 1.4
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0-15 ปี | uint128 |
การตอบกลับที่เข้ารหัส | หลากหลาย |
ตารางที่ 1.4: คำตอบที่เข้ารหัสซึ่งผู้ให้บริการส่งไปยังผู้ร้องขอผ่านการแจ้งเตือน
ลักษณะ: พาสคีย์
ลักษณะนี้จะใช้ระหว่างขั้นตอน การจับคู่ตามคีย์
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0-15 | uint128 |
บล็อกพาสคีย์ที่เข้ารหัส | หลากหลาย |
ตารางที่ 2.1: บล็อกพาสคีย์ที่เข้ารหัส ดูขั้นตอนการจับคู่ตามคีย์การใช้งาน
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 | uint8 |
ประเภทข้อความ | ข้อใดข้อหนึ่ง:
|
1 - 3 | unit32 |
พาสคีย์ 6 หลัก | หลากหลาย |
4-15 ปี | ค่าแบบสุ่ม (Salt) | หลากหลาย |
ตารางที่ 2.2: การบล็อกพาสคีย์ดิบ ตารางที่ 2.1 เวอร์ชันที่ถอดรหัสแล้ว
ลักษณะเฉพาะ: คีย์บัญชี
หลังจากจับคู่แล้ว ผู้ค้นหาการจับคู่ด่วนจะเขียนคีย์บัญชีไปยังผู้ให้บริการจับคู่ด่วน
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0-15 | uint128 |
คีย์บัญชี (เข้ารหัสแล้ว) | หลากหลาย |
เมื่อได้รับคําขอการเขียน ผู้ให้บริการจับคู่ด่วนจะต้องดําเนินการต่อไปนี้
- ถอดรหัสคีย์บัญชีโดยใช้ข้อมูลลับที่ใช้ร่วมกันซึ่งสร้างมาจากขั้นตอนที่ 4 ในขั้นตอน
- สำหรับผู้ให้บริการที่ต้องมีการผูกมัด (ทั่วไป) ให้ทำดังนี้
- ก่อนถอดรหัส ให้ตรวจสอบว่ามีการใช้ข้อมูลลับที่แชร์เพื่อถอดรหัสคำขอพาสคีย์จากขั้นตอนที่ 12 หากไม่ผ่านขั้นตอนนี้โดยใช้ ข้อมูลลับนี้ ก็ไม่ต้องสนใจการเขียนและออก
- ณ จุดนี้จะไม่มีการใช้ข้อมูลลับที่ใช้ร่วมกัน (K ในกระบวนการนี้) อีกครั้งสำหรับการจับคู่นี้ คำขอใดๆ ที่เข้ารหัสด้วยคีย์นี้โดยไม่รีสตาร์ทขั้นตอนควรถูกปฏิเสธ
- สำหรับผู้ให้บริการที่ต้องมีการผูกมัด (ทั่วไป) ให้ทำดังนี้
- ตรวจสอบว่าค่าที่ถอดรหัสขึ้นต้นด้วย
0x04
หากไม่ ก็ไม่ต้องสนใจ การเขียนนี้แล้วปิด - ตรวจสอบว่ารายการคีย์บัญชีที่มีอยู่มีพื้นที่สำหรับค่าใหม่หรือไม่
- หากไม่ ให้ลบค่าที่ใช้ล่าสุดออกจากรายการ
- เพิ่มค่าใหม่ลงในรายการ
คีย์บัญชีในรายการจะใช้ระหว่างการจับคู่ตามคีย์
ลักษณะ: การแก้ไขเฟิร์มแวร์
ลักษณะเฉพาะนี้ช่วยให้ Seeker อ่านการแก้ไขเฟิร์มแวร์ของผู้ให้บริการได้ตามต้องการ โดยควรส่งคืนข้อมูลต่อไปนี้เสมอ
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 - var | utf8s |
รหัสการแก้ไขเฟิร์มแวร์ | หลากหลาย |
ควรใส่ไว้ในสตริง utf8 เดียวแม้ว่าจะมีเฟิร์มแวร์มากกว่า 1 รายการ (เช่น เฟิร์มแวร์ 3 ตัวสำหรับหูฟังข้างซ้าย หูฟังข้างขวา และเคส) จากผู้ให้บริการ ผู้ให้บริการยังสามารถส่งคืนสตริงที่เฉพาะเจาะจงสำหรับกรณีพิเศษได้อีกด้วย ดังนี้
status-updating: ในกรณีที่ผู้ให้บริการกำลังอัปเดตเฟิร์มแวร์ใหม่ หรือผู้ให้บริการอาจส่งคืนเฟิร์มแวร์เวอร์ชันทดลองใช้ก็ได้
status-abnormal: หากผู้ให้บริการอยู่ในสถานะผิดปกติ เช่น อาจทำงานผิดพลาดเนื่องจากอัปเดตเฟิร์มแวร์ไม่สำเร็จ ค่านี้จะทำให้ Seeker แสดงข้อความที่แจ้งให้ผู้ใช้ทราบว่ามีการอัปเดตตอนนี้
ผู้ให้บริการควรจำกัดการเข้าถึงลักษณะการแก้ไขเฟิร์มแวร์เพื่อป้องกันการติดตามอุปกรณ์ ข้อจำกัดที่แนะนำ
- อุปกรณ์ที่เชื่อมโยงอยู่ควรมีสิทธิ์เข้าถึงได้ทุกเมื่อ
- ทุกอุปกรณ์ควรมีสิทธิ์เข้าถึงเมื่อค้นพบผู้ให้บริการได้
ลักษณะ: ข้อมูลเพิ่มเติม
โดยบริการนี้จะมีลักษณะดังต่อไปนี้
ลักษณะเฉพาะของบริการจับคู่ด่วน | มีการเข้ารหัส | สิทธิ์ | UUID |
---|---|---|---|
ข้อมูล | ไม่ได้ | เขียนและแจ้งเตือน | FE2C1237-8366-4814-8EB0-01DE32100BEA |
ลักษณะเฉพาะของบริการจับคู่ด่วนแบบเก่า (เป้าหมายจะเลิกใช้งานในวันที่ 1/1/2021) | มีการเข้ารหัส | สิทธิ์ | UUID |
---|---|---|---|
ข้อมูล | ไม่ได้ | เขียนและแจ้งเตือน | 0x1237 |
ก่อนที่จะเขียนหรือแจ้งเตือนเกี่ยวกับลักษณะนี้ จะต้องมีการแฮนด์เชคผ่านลักษณะเฉพาะ FE2C1234-8366-4814-8EB0-01DE32100BEA
เพื่อให้มีความลับร่วมกัน จะมีการใช้ AES-CTR เพื่อเข้ารหัสข้อมูลที่ไหลผ่านลักษณะนี้ ซึ่งเป็นอัลกอริทึมที่กำหนดด้านล่างนี้ โหมดนี้จะปลอดภัยยิ่งขึ้นในข้อมูลที่ขยายเกินบล็อกขนาด 16 ไบต์เดี่ยวๆ ระบบจะใช้ HMAC-SHA256
เพื่อตรวจสอบความสมบูรณ์ของข้อมูล ตามที่ระบุไว้ด้านล่างเช่นเดียวกัน
อ็อกเท็ต | คำอธิบาย | ค่า |
---|---|---|
0-7 ปี | 8 ไบต์แรกของ HMAC-SHA256 | หลากหลาย |
8-15 ปี | Nonce ที่ใช้โดยการเข้ารหัส AES-CTR | หลากหลาย |
16 - var | ข้อมูลที่เข้ารหัส | หลากหลาย |
ตารางที่ 3.1: แพ็กเก็ตข้อมูลที่ผู้ให้บริการส่งไปยังผู้ร้องขอผ่านการแจ้งเตือนหรือผู้ที่ค้นหาไปยังผู้ให้บริการผ่านการเขียน
อ็อกเท็ต | ประเภทข้อมูล | คำอธิบาย | ค่า |
---|---|---|---|
0 - var | byte array |
ข้อมูล | แตกต่างกันไป ให้ถอดรหัสตามรหัสข้อมูลของตารางที่ 1.2.2
|
ตารางที่ 3.2: ข้อมูลดิบ ถอดรหัสจากข้อมูลที่เข้ารหัสใน ตารางที่ 3.1
เมื่อมีการขอการแจ้งเตือน (เช่น ขอชื่อที่ปรับเปลี่ยนในแบบของคุณผ่าน Bit 2 ในตารางที่ 1.2.1) ผู้ให้บริการจับคู่ด่วนจะต้องดำเนินการดังนี้
- สร้าง 8 ไบต์แบบเข้ารหัสแบบสุ่มสำหรับ Nonce
เข้ารหัสข้อมูลโดยใช้ AES-CTR ซึ่งบล็อกขนาด 16 ไบต์แต่ละบล็อกสร้างขึ้นโดยใช้
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
ที่ไหน
- คีย์ AES คือข้อมูลลับที่ใช้ร่วมกันในขั้นตอนที่ 4 ในขั้นตอน
- clearBlock[i] คือบล็อกขนาด 16 ไบต์ที่เริ่มจาก data[i * 16] การบล็อกล่าสุดต้องมีขนาดไม่เกิน 16 ไบต์
เรียกใช้ Concat(encryptedBlock[0], encryptedBlock[1],...) เพื่อสร้างข้อมูลที่เข้ารหัส
สร้าง HMAC-SHA256 โดย
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
ที่ไหน
- K สร้างขึ้นโดย Concat(shared_secret, ZEROs ขนาด 48 ไบต์) ส่วนshared_secret มาจากขั้นตอนที่ 4 ใน procedure
- opad คือระยะห่างจากขอบด้านนอก 64 ไบต์ซึ่งประกอบด้วยไบต์ซ้ำที่มีค่า
0x5C
- ipad คือระยะห่างจากขอบด้านใน 64 ไบต์ซึ่งประกอบด้วยไบต์ซ้ำที่มีค่า
0x36
ให้นำ 8 ไบต์แรกจาก HMAC-SHA256 เป็นคำนำหน้าของแพ็กเก็ตข้อมูล
เมื่อได้รับคําขอการเขียน ผู้ให้บริการจับคู่ด่วนจะต้องดําเนินการต่อไปนี้
- ยืนยันความสมบูรณ์ของข้อมูลโดยตรวจสอบ 8 ไบต์แรกของ HMAC-SHA256
ถอดรหัสข้อมูลที่เข้ารหัสโดยใช้ AES-CTR โดยการบล็อกแต่ละรายการสร้างขึ้นโดยใช้
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
ที่ไหน
- encryptedBlock[i] คือบล็อกแบบ 16 ไบต์ที่เริ่มต้นจาก encrypted_data[i * 16] บล็อกสุดท้ายต้องมีขนาดไม่เกิน 16 ไบต์
- มีการสร้างหรือระบุคีย์ AES จากแฮนด์เชค เช่น
- ในขั้นตอนที่ 1 ตั้งชื่อว่ามาจาก ECDH และระบบจะไม่นำมาใช้กับการจับคู่นี้อีก คำขอใดๆ ที่เข้ารหัสด้วยคีย์นี้โดยไม่ได้เริ่มขั้นตอนใหม่ควรถูกปฏิเสธ
- ในขั้นตอนการตั้งชื่อที่ 2 นี่คือคีย์บัญชี
เรียกใช้ Concat(clearBlock[0], clearBlock[1],...) เพื่อสร้างข้อมูลดิบ