ลักษณะเฉพาะ

บริการจับคู่ด่วน

ผู้ให้บริการการจับคู่ด่วนต้องมีบริการ 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

Fast Pair Seeker ใช้ลักษณะต่อไปนี้

ชื่อ มีการเข้ารหัส สิทธิ์ UUID
การแก้ไขเฟิร์มแวร์ ไม่ใช่ อ่าน 0x2A26

ลักษณะ: รหัสรุ่น

ลักษณะนี้ช่วยให้ Seeker อ่านรหัสโมเดลได้ตามต้องการนอกเหนือจากกรณีที่อุปกรณ์โฆษณาในโหมดที่ค้นพบได้ โดยควรแสดงผลข้อมูลต่อไปนี้เสมอ

อ็อกเท็ต ประเภทข้อมูล คำอธิบาย ค่า
0 - 2 uint24 รหัสโมเดล แปรเปลี่ยน

ลักษณะ: การจับคู่ตามคีย์

ลักษณะนี้ควบคุมขั้นตอนการจับคู่ตามคีย์ ในขั้นตอนนี้ จะมีการสร้างระดับความน่าเชื่อถือโดยการยืนยันว่าทั้งผู้ขอและ ผู้ให้บริการมีคีย์ที่แชร์ล่วงหน้า คีย์จะแตกต่างกันไปในแต่ละกรณี ดังนี้

  • กรณีที่ 1: คีย์ที่แชร์ล่วงหน้าอิงตามคู่คีย์สาธารณะ/ส่วนตัวป้องกันการปลอมแปลง และคู่คีย์สาธารณะ/ส่วนตัวของ Seeker เองซึ่งจะเปลี่ยนไปในแต่ละ ความพยายามในการจับคู่

    • ผู้ให้บริการอยู่ในโหมดการจับคู่
    • ผู้ค้นหาจะยืนยันว่าผู้ให้บริการมีคีย์ส่วนตัวที่ป้องกันการปลอมแปลง

    โปรดทราบว่าเมื่ออยู่ในโหมดการจับคู่ ผู้ให้บริการอาจจับคู่ด้วยวิธีปกติได้เช่นกัน เช่น จับคู่กับอุปกรณ์ที่ไม่รองรับการจับคู่ตามคีย์ของการจับคู่ด่วน

  • กรณีที่ 2: คีย์ที่แชร์ล่วงหน้าเป็นหนึ่งในคีย์บัญชี

    • โดยปกติแล้วผู้ให้บริการจะไม่ได้อยู่ในโหมดการจับคู่ (แต่ไม่จำเป็น ผู้ให้บริการควรสนับสนุนการใช้คีย์บัญชีแม้จะอยู่ในโหมดการจับคู่)
    • ผู้ค้นหาและผู้ให้บริการจะยืนยันว่าอีกฝ่ายมีคีย์บัญชี

เนื่องจากทั้ง 2 กรณีมีความคล้ายคลึงกันมาก ยกเว้นคีย์ที่แชร์ล่วงหน้าที่ใช้ จึงรวมไว้ในขั้นตอน

รูปแบบข้อมูล

ดูขั้นตอนเกี่ยวกับวิธีใช้แต่ละรูปแบบ

Octet ประเภทข้อมูล คำอธิบาย ค่า บังคับหรือไม่
0-15 uint128 คำขอที่เข้ารหัส แปรเปลี่ยน บังคับ
16 - 79 คีย์สาธารณะ แปรเปลี่ยน ไม่บังคับ

ตารางที่ 1.1: คำขอที่เข้ารหัสซึ่งเขียนลงในลักษณะเฉพาะโดย Seeker

Octet ประเภทข้อมูล คำอธิบาย ค่า บังคับหรือไม่
0 uint8 ประเภทของข้อความ 0x00 = คำขอจับคู่ที่อิงตามคีย์ บังคับ
1 uint8 แฟล็ก
  • บิตที่ 0 (MSB): เลิกใช้งานแล้วและ Seeker จะไม่สนใจ
  • บิต 1: 1 หาก Seeker ขอให้ Provider เริ่มต้นการเชื่อมโยง และคำขอนี้มีที่อยู่ BR/EDR ของ Seeker ไม่เช่นนั้นจะเป็น 0
  • บิต 2: 1 หากผู้ขอต้องการให้ผู้ให้บริการแจ้งชื่อที่มีอยู่ ไม่เช่นนั้นจะแสดงผลเป็น 0
  • บิต 3: 1 หากใช้สำหรับการเขียนคีย์บัญชีย้อนหลัง ไม่เช่นนั้นจะเป็น 0
  • บิตที่ 4-7 สงวนไว้สำหรับการใช้งานในอนาคต และควรละเว้น
แตกต่างกันไป บังคับ
2 - 7 uint48 โดยทำอย่างใดอย่างหนึ่งต่อไปนี้
  • ที่อยู่ BLE ปัจจุบันของผู้ให้บริการ
  • ที่อยู่สาธารณะของผู้ให้บริการ
แตกต่างกันไป บังคับ
8 - 13 uint48 ที่อยู่ BR/EDR ของ Seeker แตกต่างกันไป แสดงเฉพาะเมื่อตั้งค่าบิตแฟล็ก 1 หรือ 3
n - 15 ค่าแบบสุ่ม (Salt) แตกต่างกันไป บังคับ

ตาราง 1.2.1: คำขอแบบดิบ (ประเภท 0x00) ถอดรหัสจากคำขอที่เข้ารหัส ใน ตาราง 1.1

อ็อกเท็ต ประเภทข้อมูล คำอธิบาย ค่า บังคับหรือไม่
0 uint8 ประเภทของข้อความ 0x10 = คำขอให้ดำเนินการ บังคับ
1 uint8 แฟล็ก แตกต่างกันไป บังคับ
2 - 7 uint48 โดยทำอย่างใดอย่างหนึ่งต่อไปนี้
  • ที่อยู่ BLE ปัจจุบันของผู้ให้บริการ
  • ที่อยู่สาธารณะของผู้ให้บริการ
แตกต่างกันไป บังคับ
8 uint8 กลุ่มข้อความ แตกต่างกันไป ต้องระบุหากตั้งค่าบิต 0 ของ Flags
9 uint8 รหัสข้อความ แตกต่างกันไป ต้องระบุหากตั้งค่าบิต 0 ของ Flags
10 uint8 ขึ้นอยู่กับฟีเจอร์ที่เปิดใช้:
  • ตั้งค่าบิต 0: ความยาวข้อมูลเพิ่มเติม น้อยกว่า 6
  • มีการตั้งค่าบิต 1: รหัสข้อมูล
แตกต่างกันไป ต้องระบุหากตั้งค่าบิตแฟล็กเป็น 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: การตอบกลับที่เข้ารหัสซึ่งผู้ให้บริการส่งไปยังผู้ค้นหาผ่านการแจ้งเตือน

ลักษณะเฉพาะ: พาสคีย์

ลักษณะนี้ใช้ในระหว่างขั้นตอน การจับคู่ตามคีย์

Octet ประเภทข้อมูล คำอธิบาย ค่า
0-15 uint128 บล็อกพาสคีย์ที่เข้ารหัส แตกต่างกันไป

ตารางที่ 2.1: บล็อกพาสคีย์ที่เข้ารหัส ดูขั้นตอนการจับคู่ตามคีย์สำหรับการใช้งาน

อ็อกเท็ต ประเภทข้อมูล คำอธิบาย ค่า
0 uint8 ประเภทของข้อความ หนึ่งใน
  • 0x02 = พาสคีย์ของ Seeker
  • 0x03 = พาสคีย์ของผู้ให้บริการ
1 - 3 unit32 พาสคีย์ 6 หลัก แตกต่างกันไป
4 - 15 ค่าแบบสุ่ม (Salt) แตกต่างกันไป

ตารางที่ 2.2: บล็อกรหัสผ่านโดยตรง เวอร์ชันที่ถอดรหัสแล้วของ ตาราง 2.1

ลักษณะ: คีย์บัญชี

หลังจากจับคู่แล้ว Fast Pair Seeker จะเขียนคีย์บัญชีไปยัง Fast Pair Provider

อ็อกเท็ต ประเภทข้อมูล คำอธิบาย ค่า
0-15 uint128 คีย์บัญชี (เข้ารหัส) แตกต่างกันไป

เมื่อได้รับคำขอเขียน ผู้ให้บริการจับคู่ด่วนจะต้องดำเนินการต่อไปนี้

  1. ถอดรหัสคีย์บัญชีโดยใช้ข้อมูลลับที่ใช้ร่วมกันซึ่งสร้างจากขั้นตอนที่ 4 ในกระบวนการ
    • สำหรับผู้ให้บริการที่ต้องมีการประกัน (พบบ่อย)
      • ก่อนถอดรหัส ให้ตรวจสอบว่าใช้ Shared Secret เพื่อถอดรหัส คำขอพาสคีย์จากขั้นตอนที่ 12 หากขั้นตอนนี้ไม่ผ่านโดยใช้ secret นี้ ให้ข้ามการเขียนนี้และออก
    • เมื่อถึงขั้นตอนนี้ ระบบจะไม่ใช้ข้อมูลลับที่ใช้ร่วมกัน (K ในขั้นตอน) อีกสำหรับการจับคู่นี้ คำขอใดๆ ที่เข้ามาซึ่งเข้ารหัสด้วยคีย์นี้โดยไม่เริ่มกระบวนการใหม่ควรถูกปฏิเสธ
  2. ตรวจสอบว่าค่าที่ถอดรหัสขึ้นต้นด้วย 0x04 หรือ 0xFF หากไม่ ให้ละเว้นการเขียนนี้และออก
    • หากค่าเป็น 0x04 ให้ทำดังนี้
      • ตรวจสอบว่ารายการคีย์บัญชีที่เก็บไว้มีพื้นที่สำหรับค่าใหม่หรือไม่
      • หากไม่ ให้ลบค่าที่ใช้ล่าสุดออกจากรายการ
      • เพิ่มค่าใหม่ลงในรายการ
    • หากค่าเป็น 0xFF ให้ทำดังนี้
      • ถือว่านี่เป็นเซสชันการจับคู่ชั่วคราวและไม่ต้องดำเนินการใดๆ
      • ซึ่งอาจเกิดขึ้นได้ในขั้นตอนการเขียนคีย์บัญชีย้อนหลัง
      • อย่าจัดเก็บคีย์ และอย่าใช้คีย์ในรายการคีย์บัญชี การเข้ารหัส หรือการคำนวณ MAC
      • การนำอุปกรณ์ออกจะเกิดขึ้นเมื่อมีเหตุการณ์หรือการหมดเวลาที่เฉพาะเจาะจงของฟีเจอร์ สำหรับการแชร์เสียง LE ขอแนะนำอย่างยิ่งให้นำการเชื่อมโยง BLE และคีย์ลิงก์ออกหลังจากเซสชันชั่วคราวตัดการเชื่อมต่อเป็นเวลา 10 นาที

ระบบจะใช้คีย์บัญชีในรายการระหว่างการจับคู่ตามคีย์

ลักษณะ: การแก้ไขเฟิร์มแวร์

ลักษณะนี้ช่วยให้ Seeker อ่านการแก้ไขเฟิร์มแวร์ของผู้ให้บริการได้ตามต้องการ โดยควรแสดงข้อมูลต่อไปนี้เสมอ

อ็อกเท็ต ประเภทข้อมูล คำอธิบาย ค่า
0 - var utf8s รหัสการแก้ไขเฟิร์มแวร์ แตกต่างกันไป

ควรห่อหุ้มเป็นสตริง UTF8 รายการเดียวแม้ว่าจะมีเฟิร์มแวร์มากกว่า 1 รายการ (เช่น เฟิร์มแวร์ 3 รายการสำหรับหูฟังข้างซ้าย หูฟังข้างขวา และเคส) ในผู้ให้บริการ นอกจากนี้ ผู้ให้บริการยังส่งคืนสตริงที่เฉพาะเจาะจงสำหรับกรณีพิเศษได้ด้วย

  1. status-updating: หากผู้ให้บริการกำลังอัปเดตเป็นเฟิร์มแวร์ใหม่ หรือผู้ให้บริการอาจแสดงผลเวอร์ชันของเฟิร์มแวร์ที่จัดเตรียมไว้

  2. status-abnormal: หากผู้ให้บริการอยู่ในสถานะผิดปกติ เช่น อุปกรณ์ทำงานผิดปกติเนื่องจากการอัปเดตเฟิร์มแวร์ไม่สำเร็จ ค่านี้จะทำให้ Seeker แสดงข้อความเพื่อแจ้งให้ผู้ใช้ทราบว่าต้องอัปเดตทันที

ผู้ให้บริการควรจำกัดสิทธิ์เข้าถึงลักษณะเฉพาะของการแก้ไขเฟิร์มแวร์เพื่อป้องกันการติดตามอุปกรณ์ ข้อจำกัดที่แนะนำ

  • อุปกรณ์ที่เชื่อมโยงควรมีสิทธิ์เข้าถึงได้ทุกเมื่อ
  • อุปกรณ์ใดก็ตามควรมีสิทธิ์เข้าถึงเมื่อผู้ให้บริการค้นพบได้

หากผู้ให้บริการรองรับศูนย์การค้นหา คุณจะต้องติดตั้งใช้งานเพิ่มเติม ดูรายละเอียดได้ที่การอัปเดตเฟิร์มแวร์ของศูนย์การค้นหา

ลักษณะ: ข้อมูลเพิ่มเติม

บริการนี้จะมีลักษณะดังต่อไปนี้

ลักษณะเฉพาะของบริการจับคู่ด่วน มีการเข้ารหัส สิทธิ์ UUID
ข้อมูล ไม่ใช่ เขียนและแจ้งเตือน FE2C1237-8366-4814-8EB0-01DE32100BEA
ลักษณะบริการการจับคู่ด่วนเวอร์ชันเดิม (กำหนดเลิกใช้งานในวันที่ 1/1/2021) มีการเข้ารหัส สิทธิ์ UUID
ข้อมูล ไม่ใช่ เขียนและแจ้งเตือน 0x1237

ก่อนที่จะเขียนหรือแจ้งลักษณะนี้ จะต้องมีการ แฮนด์เชคผ่านลักษณะ FE2C1234-8366-4814-8EB0-01DE32100BEA เพื่อให้มี คีย์ลับที่ใช้ร่วมกัน ระบบจะใช้ AES-CTR เพื่อเข้ารหัสข้อมูลที่ไหลผ่านลักษณะนี้ ซึ่งมีการกำหนดอัลกอริทึมไว้ด้านล่าง โหมดนี้ปลอดภัยกว่าสำหรับข้อมูลที่ขยายเกินบล็อกขนาด 16 ไบต์บล็อกเดียว ระบบจะใช้ HMAC-SHA256 เพื่อรับประกันความสมบูรณ์ของข้อมูล ซึ่งกำหนดไว้ด้านล่างด้วย

Octet คำอธิบาย ค่า
0 - 7 8 ไบต์แรกของ HMAC-SHA256 แตกต่างกันไป
8 - 15 Nonce ที่ใช้โดยการเข้ารหัส AES-CTR แตกต่างกันไป
16 - var ข้อมูลที่เข้ารหัส แตกต่างกันไป

ตาราง 3.1: กลุ่มข้อมูลที่ผู้ให้บริการส่งไปยังผู้ค้นหาผ่าน การแจ้งเตือน หรือที่ผู้ค้นหาส่งไปยังผู้ให้บริการผ่านการเขียน

Octet ประเภทข้อมูล คำอธิบาย ค่า
0 - var byte array ข้อมูล แตกต่างกัน ให้ถอดรหัสตามรหัสข้อมูลของตาราง 1.2.2:
  • 0x01(personalized name): utf8s

ตารางที่ 3.2: ข้อมูลดิบ ถอดรหัสจากข้อมูลที่เข้ารหัสใน ตารางที่ 3.1

เมื่อมีการขอการแจ้งเตือน (เช่น ขอชื่อที่ปรับเปลี่ยนในแบบของคุณผ่านบิต 2 ในตาราง 1.2.1) ผู้ให้บริการจับคู่ด่วนจะต้องดำเนินการดังต่อไปนี้

  1. สร้าง Nonce แบบสุ่มขนาด 8 ไบต์ที่เข้ารหัสลับ
  2. เข้ารหัสข้อมูลโดยใช้ AES-CTR โดยที่แต่ละบล็อกขนาด 16 ไบต์จะสร้างขึ้นโดยใช้

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

    ที่ไหน

    1. คีย์ AES คือคีย์ลับที่แชร์จากขั้นตอนที่ 4 ในกระบวนการ
    2. clearBlock[i] คือบล็อกขนาด 16 ไบต์ที่เริ่มต้นจาก data[i * 16] บล็อกสุดท้ายอาจมีขนาดน้อยกว่า 16 ไบต์
  3. เรียกใช้ concat(encryptedBlock[0], encryptedBlock[1],...) เพื่อสร้าง ข้อมูลที่เข้ารหัส

  4. สร้าง HMAC-SHA256 โดย

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

    ที่ไหน

    1. K สร้างขึ้นโดย concat(shared_secret, 48-byte ZEROs) โดยที่ shared_secret มาจากขั้นตอนที่ 4 ในกระบวนการ
    2. opad คือการเพิ่มพื้นที่ว่างด้านนอก 64 ไบต์ ซึ่งประกอบด้วยไบต์ที่ซ้ำกันซึ่งมีค่า 0x5C
    3. ipad คือระยะห่างจากขอบด้านใน 64 ไบต์ ซึ่งประกอบด้วยไบต์ซ้ำๆ ที่มีค่า 0x36
  5. ใช้ 8 ไบต์แรกจาก HMAC-SHA256 เป็นคำนำหน้าของ Data packet

เมื่อได้รับคำขอเขียน ผู้ให้บริการการจับคู่ด่วนจะต้องดำเนินการต่อไปนี้

  1. ยืนยันความสมบูรณ์ของข้อมูลโดยตรวจสอบ 8 ไบต์แรกของ HMAC-SHA256
  2. ถอดรหัสข้อมูลที่เข้ารหัสโดยใช้ AES-CTR ซึ่งแต่ละบล็อกจะสร้างขึ้นโดยใช้

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

    ที่ไหน

    1. encryptedBlock[i] คือบล็อกขนาด 16 ไบต์ที่เริ่มต้นจาก encrypted_data[i * 16] บล็อกสุดท้ายอาจมีขนาดน้อยกว่า 16 ไบต์
    2. สร้างหรือระบุคีย์ AES จากแฮนด์เชค เช่น
      1. ในขั้นตอนการตั้งชื่อ 1 จะมาจาก ECDH และจะไม่ ใช้สำหรับการจับคู่นี้อีก คำขอที่เข้ารหัส ด้วยคีย์นี้โดยไม่ได้รีสตาร์ทกระบวนการควรถูกปฏิเสธ
      2. ในขั้นตอนการตั้งชื่อ 2 จะเป็นคีย์บัญชี
  3. ดำเนินการ concat(clearBlock[0], clearBlock[1],...) เพื่อสร้างข้อมูลดิบ