ลักษณะเฉพาะ

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

ผู้ให้บริการจับคู่ด่วนต้องมีบริการ 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 การตั้งค่าสถานะ
  • บิต 0 (MSB): เลิกใช้งานและละเว้นโดย Seeker
  • บิต 1: 1 หาก Seeker ขอให้ผู้ให้บริการเริ่มต้นการเชื่อมโยง และคำขอนี้มีที่อยู่ BR/EDR ของ Seeker หากไม่เช่นนั้น
  • บิต 2: 1 หากผู้ร้องขอขอให้ผู้ให้บริการแจ้งชื่อที่มีอยู่เดิม หากไม่เช่นนั้น
  • บิต 3: 1 หากนี่เป็นสิทธิ์สำหรับการเขียนคีย์บัญชีย้อนหลัง หากไม่เช่นนั้น
  • ส่วนบิต 4-7 ได้สงวนไว้สำหรับการใช้งานในอนาคตและจะไม่มีผลใดๆ
หลากหลาย บังคับ
2 - 7 uint48 ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
  • ที่อยู่ BLE ปัจจุบันของผู้ให้บริการ
  • ที่อยู่สาธารณะของผู้ให้บริการ
หลากหลาย บังคับ
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 ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
  • ที่อยู่ BLE ปัจจุบันของผู้ให้บริการ
  • ที่อยู่สาธารณะของผู้ให้บริการ
หลากหลาย บังคับ
8 uint8 กลุ่มข้อความ หลากหลาย บังคับหากมีการตั้งค่า Flag Bit 0
9 uint8 รหัสข้อความ หลากหลาย บังคับหากมีการตั้งค่า Flag Bit 0
10 uint8 ขึ้นอยู่กับ Flag:
  • มีการตั้งค่าบิต 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: คำตอบที่เข้ารหัสซึ่งผู้ให้บริการส่งไปยังผู้ร้องขอผ่านการแจ้งเตือน

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

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

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

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

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

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

ลักษณะเฉพาะ: คีย์บัญชี

หลังจากจับคู่แล้ว ผู้ค้นหาการจับคู่ด่วนจะเขียนคีย์บัญชีไปยังผู้ให้บริการจับคู่ด่วน

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

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

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

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

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

ลักษณะเฉพาะนี้ช่วยให้ 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 เพื่อตรวจสอบความสมบูรณ์ของข้อมูล ตามที่ระบุไว้ด้านล่างเช่นเดียวกัน

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

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

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

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

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

  1. สร้าง 8 ไบต์แบบเข้ารหัสแบบสุ่มสำหรับ Nonce
  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, ZEROs ขนาด 48 ไบต์) ส่วนshared_secret มาจากขั้นตอนที่ 4 ใน procedure
    2. opad คือระยะห่างจากขอบด้านนอก 64 ไบต์ซึ่งประกอบด้วยไบต์ซ้ำที่มีค่า 0x5C
    3. ipad คือระยะห่างจากขอบด้านใน 64 ไบต์ซึ่งประกอบด้วยไบต์ซ้ำที่มีค่า 0x36
  5. ให้นำ 8 ไบต์แรกจาก HMAC-SHA256 เป็นคำนำหน้าของแพ็กเก็ตข้อมูล

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

  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],...) เพื่อสร้างข้อมูลดิบ