Karakteristik

Layanan Sambungan Cepat

Penyedia Sambungan Cepat harus memiliki layanan GATT berikut.

Layanan UUID
Layanan Sambungan Cepat 0xFE2C

Layanan ini akan memiliki karakteristik berikut.

Karakteristik Layanan Sambungan Cepat Dienkripsi Izin UUID
ID Model Tidak Baca FE2C1233-8366-4814-8EB0-01DE32100BEA
Penyambungan Berbasis Kunci Tidak Menulis dan memberi tahu FE2C1234-8366-4814-8EB0-01DE32100BEA
Kunci sandi Tidak Menulis dan memberi tahu FE2C1235-8366-4814-8EB0-01DE32100BEA
Kunci Akun Tidak Tulis FE2C1236-8366-4814-8EB0-01DE32100BEA

Layanan Informasi Perangkat

Penyedia Sambungan Cepat juga harus mendukung Layanan Informasi Perangkat.

Layanan UUID
Layanan Informasi Perangkat 0x180A

Pencari Sambungan Cepat menggunakan karakteristik berikut.

Nama Dienkripsi Izin UUID
Revisi Firmware Tidak Baca 0x2A26

Karakteristik: ID Model

Karakteristik ini memungkinkan Seeker membaca ID model sesuai kebutuhan, di luar saat perangkat beriklan dalam mode dapat ditemukan. Respons harus selalu menampilkan data berikut:

Octet Jenis data Deskripsi Nilai
0 - 2 uint24 ID Model di waktu/bulan/tempat/tanggal tertentu

Karakteristik: Penyambungan Berbasis Kunci

Karakteristik ini mengontrol prosedur Penyambungan Berbasis Kunci. Dalam prosedur ini, tingkat kepercayaan tertentu dibuat dengan memverifikasi bahwa Pencari dan Penyedia sama-sama memiliki kunci yang telah dibagikan sebelumnya. Kuncinya berbeda di setiap kasus:

  • Kasus 1: Pre-shared key didasarkan pada pasangan kunci publik/pribadi anti-spoofing, dan pasangan kunci publik/pribadi milik Seeker sendiri yang akan berubah untuk setiap upaya penyambungan.

    • Penyedia dalam mode penyambungan.
    • Pencari memverifikasi bahwa Penyedia memiliki kunci pribadi anti-spoofing.

    Perhatikan bahwa saat dalam mode penyambungan, Penyedia juga dapat melakukan penyambungan dengan cara biasa, misalnya, untuk menyambungkan dengan perangkat yang tidak mendukung Penyambungan Berbasis Kunci Sambungan Cepat.

  • Kasus 2: Pre-shared key adalah salah satu kunci akun.

    • Penyedia biasanya tidak dalam mode penyambungan. (Namun, ini bukan persyaratan—Penyedia harus mendukung penggunaan kunci akun meskipun dalam mode penyambungan.)
    • Pencari dan Penyedia masing-masing memverifikasi bahwa pihak lain memiliki kunci akun.

Karena kedua kasus sangat mirip, kecuali kunci yang dibagikan sebelumnya yang digunakan, keduanya digabungkan dalam prosedur.

Format Data

Lihat prosedur tentang cara penggunaan setiap format.

Octet Jenis data Deskripsi Nilai Wajib?
0 - 15 uint128 Permintaan Terenkripsi di waktu/bulan/tempat/tanggal tertentu Wajib
16 - 79 Kunci Publik di waktu/bulan/tempat/tanggal tertentu Opsional

Tabel 1.1: Permintaan Terenkripsi, ditulis ke karakteristik oleh Seeker.

Octet Jenis data Deskripsi Nilai Wajib?
0 uint8 Jenis pesan 0x00 = Permintaan Penyambungan Berbasis Kunci Wajib
1 uint8 Bendera
  • Bit 0 (MSB): tidak digunakan lagi dan diabaikan oleh Seeker.
  • Bit 1: 1 jika Seeker meminta agar Penyedia memulai penggabungan, dan permintaan ini berisi alamat BR/EDR Seeker. 0 sebaliknya.
  • Bit 2: 1 jika Pencari meminta agar Penyedia memberi tahu nama yang ada. 0 sebaliknya.
  • Bit 3: 1 jika ini untuk Menulis kunci akun secara retroaktif. 0 sebaliknya.
  • Bit 4 - 7 dicadangkan untuk penggunaan pada masa mendatang, dan akan diabaikan.
berbeda-beda Wajib
2 - 7 uint48 Salah satu dari:
  • Alamat BLE penyedia saat ini
  • Alamat publik penyedia
berbeda-beda Wajib
8 - 13 uint48 Alamat BR/EDR Pencari berbeda-beda Hanya ada jika Bit 1 atau 3 Flag ditetapkan
n - 15 Nilai acak (salt) berbeda-beda Wajib

Tabel 1.2.1: Permintaan Mentah (jenis 0x00). Didekripsi dari Permintaan Terenkripsi di Tabel 1.1.

Octet Jenis data Deskripsi Nilai Wajib?
0 uint8 Jenis pesan 0x10 = Permintaan Tindakan Wajib
1 uint8 Bendera berbeda-beda Wajib
2 - 7 uint48 Salah satu dari:
  • Alamat BLE penyedia saat ini
  • Alamat publik penyedia
berbeda-beda Wajib
8 uint8 Grup pesan berbeda-beda Wajib jika Bit 0 Flag ditetapkan
9 uint8 Kode pesan berbeda-beda Wajib jika Bit 0 Flag ditetapkan
10 uint8 Bergantung pada Flag:
  • Bit 0 disetel: Panjang data tambahan, kurang dari 6
  • Bit 1 ditetapkan: ID Data
berbeda-beda Wajib jika Bit 0 atau 1 Flag ditetapkan
11 - n Tambahan data berbeda-beda Opsional
n - 15 Nilai acak (salt) berbeda-beda Wajib

Tabel 1.2.2: Permintaan Mentah (jenis 0x10). Didekripsi dari Permintaan Terenkripsi di Tabel 1.1.

Octet Jenis data Deskripsi Nilai
0 uint8 Jenis pesan 0x01 = Respons Penyambungan Berbasis Kunci
1 - 6 uint48 Alamat publik (BR/EDR) penyedia berbeda-beda
7 - 15 Nilai acak (salt) berbeda-beda

Tabel 1.3: Respons Mentah. Dienkripsi untuk menghasilkan Respons Terenkripsi di Tabel 1.4.

Octet Jenis data Deskripsi Nilai
0 -15 uint128 Respons Terenkripsi berbeda-beda

Tabel 1.4: Respons Terenkripsi, dikirim oleh Penyedia kepada Pencari melalui pemberitahuan.

Karakteristik: Kunci sandi

Karakteristik ini digunakan selama prosedur Penyandingan Berbasis Kunci

Octet Jenis data Deskripsi Nilai
0 - 15 uint128 Blok kunci sandi terenkripsi berbeda-beda

Tabel 2.1: Blok Kunci Sandi Terenkripsi. Lihat prosedur Penyambungan Berbasis Kunci untuk penggunaan.

Octet Jenis data Deskripsi Nilai
0 uint8 Jenis pesan Salah satu dari:
  • 0x02 = Kunci Sandi Pencari
  • 0x03 = Kunci Sandi Penyedia
1 - 3 unit32 Kunci sandi 6 digit berbeda-beda
4 - 15 Nilai acak (salt) berbeda-beda

Tabel 2.2: Blok Kunci Sandi Mentah. Versi yang didekripsi dari Tabel 2.1.

Karakteristik: Kunci Akun

Setelah penyambungan, Pencari Sambungan Cepat akan menulis Kunci Akun ke Penyedia Sambungan Cepat.

Octet Jenis data Deskripsi Nilai
0 - 15 uint128 Kunci akun (dienkripsi) berbeda-beda

Setelah mendapatkan permintaan tulis, Penyedia Sambungan Cepat akan melakukan hal berikut:

  1. Dekripsi kunci akun menggunakan rahasia bersama yang dihasilkan dari langkah 4 dalam prosedur.
    • Untuk Penyedia yang memerlukan pengikatan (umum):
      • Sebelum mendekripsi, verifikasi bahwa rahasia bersama digunakan untuk mendekripsi permintaan kunci sandi dari langkah 12. Jika langkah ini belum berhasil menggunakan secret ini, abaikan penulisan ini dan keluar.
    • Pada tahap ini, rahasia bersama (K dalam prosedur) tidak akan digunakan lagi untuk penyambungan ini. Setiap permintaan yang masuk dienkripsi dengan kunci ini tanpa memulai ulang prosedur harus ditolak.
  2. Pastikan nilai yang didekripsi dimulai dengan 0x04 atau 0xFF. Jika tidak, abaikan penulisan ini dan keluar.
    • Jika nilainya adalah 0x04:
      • Periksa apakah daftar Kunci Akun yang dipertahankan memiliki ruang untuk nilai baru.
      • Jika tidak, hapus nilai yang paling jarang digunakan dari daftar.
      • Tambahkan nilai baru ke daftar.
    • Jika nilainya adalah 0xFF:
      • Perlakukan ini sebagai sesi penyambungan sementara dan jangan lakukan operasi apa pun.
      • Hal ini dapat terjadi dengan alur Menulis kunci akun secara retroaktif.
      • Jangan menyimpan kunci, dan jangan menggunakannya dalam daftar Kunci Akun, enkripsi, atau penghitungan MAC.
      • Penghapusan ikatan dipicu oleh peristiwa atau waktu tunggu khusus fitur. Untuk Berbagi Audio LE, sebaiknya hapus pengaitan BLE dan kunci link 10 menit setelah sesi sementara terputus.

Kunci Akun dalam daftar digunakan selama Penyandingan Berbasis Kunci.

Karakteristik: Revisi Firmware

Karakteristik ini memungkinkan Seeker membaca revisi firmware Provider sesuai kebutuhan. Respons harus selalu menampilkan data berikut:

Octet Jenis data Deskripsi Nilai
0 - var utf8s Kode revisi firmware berbeda-beda

String harus dienkapsulasi ke dalam satu string UTF-8 meskipun ada lebih dari satu firmware (misalnya, 3 firmware untuk earbud kiri, earbud kanan, dan casing) di Penyedia. Penyedia juga dapat menampilkan string tertentu untuk kasus khusus:

  1. status-updating: jika Penyedia saat ini sedang mengupdate ke firmware baru. Atau, Penyedia dapat menampilkan versi firmware bertahap.

  2. status-abnormal: jika Penyedia dalam status tidak normal. Misalnya, perangkat tersebut tidak berfungsi karena update firmware gagal. Nilai ini akan menyebabkan Seeker menampilkan pesan untuk memberi tahu pengguna bahwa aplikasi harus diupdate sekarang.

Penyedia harus membatasi akses ke karakteristik Revisi Firmware untuk mencegah pelacakan perangkat. Pembatasan yang disarankan:

  • perangkat yang disambungkan harus memiliki akses kapan saja
  • perangkat apa pun harus memiliki akses saat Penyedia dapat ditemukan

Karakteristik: Data Tambahan

Layanan ini akan memiliki karakteristik berikut.

Karakteristik Layanan Sambungan Cepat Dienkripsi Izin UUID
Data Tidak Menulis dan memberi tahu FE2C1237-8366-4814-8EB0-01DE32100BEA
Karakteristik Layanan Sambungan Cepat lama (target akan dihentikan pada 1/1/2021) Dienkripsi Izin UUID
Data Tidak Menulis dan memberi tahu 0x1237

Sebelum menulis atau mengirimkan notifikasi ke karakteristik ini, harus ada handshake melalui karakteristik FE2C1234-8366-4814-8EB0-01DE32100BEA untuk memiliki rahasia bersama. AES-CTR akan digunakan untuk mengenkripsi data yang mengalir melalui karakteristik ini, yang algoritmanya ditentukan di bawah. Mode ini lebih aman untuk data yang melampaui satu blok 16 byte. HMAC-SHA256 akan digunakan untuk memastikan integritas data, yang juga ditentukan di bawah.

Octet Deskripsi Nilai
0 - 7 8 byte pertama HMAC-SHA256. berbeda-beda
8 - 15 Nonce, digunakan oleh enkripsi AES-CTR. berbeda-beda
16 - var Data terenkripsi. berbeda-beda

Tabel 3.1: Paket Data, dikirim oleh Penyedia ke Pencari melalui pemberitahuan atau dikirim oleh Pencari ke Penyedia melalui penulisan.

Octet Jenis data Deskripsi Nilai
0 - var byte array Data bervariasi, dekode sesuai dengan ID Data Tabel 1.2.2:
  • 0x01(nama yang dipersonalisasi): utf8s

Tabel 3.2: Data mentah. Didekripsi dari data terenkripsi di Tabel 3.1.

Saat notifikasi diminta (misalnya, meminta nama yang dipersonalisasi melalui Bit 2 di Tabel 1.2.1), Penyedia Sambungan Cepat harus melakukan hal berikut:

  1. Buat 8 byte acak kriptografis untuk Nonce.
  2. Enkripsi data menggunakan AES-CTR, dengan setiap blok 16 byte dibuat menggunakan

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

    di mana

    1. Kunci AES adalah rahasia bersama dari langkah 4 dalam prosedur.
    2. clearBlock[i] adalah blok 16 byte yang dimulai dari data[i * 16]. Blok terakhir dapat berukuran kurang dari 16 byte.
  3. Lakukan concat(encryptedBlock[0], encryptedBlock[1],...) untuk membuat Data Terenkripsi.

  4. Membuat HMAC-SHA256 dengan

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

    di mana

    1. K dibuat dengan concat(shared_secret, 48-byte ZEROs), shared_secret berasal dari langkah 4 dalam prosedur.
    2. opad adalah padding luar 64 byte, yang terdiri dari byte berulang dengan nilai 0x5C.
    3. ipad adalah padding dalam 64 byte, yang terdiri dari byte berulang dengan nilai 0x36.
  5. Ambil 8 byte pertama dari HMAC-SHA256 sebagai awalan paket Data.

Setelah mendapatkan permintaan tulis, Penyedia Sambungan Cepat akan melakukan hal berikut:

  1. Verifikasi integritas data dengan memeriksa 8 byte pertama HMAC-SHA256.
  2. Mendekripsi Data terenkripsi menggunakan AES-CTR, dengan setiap blok dibuat menggunakan

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

    di mana

    1. encryptedBlock[i] adalah blok 16 byte yang dimulai dari encrypted_data[i * 16]. Blok terakhir bisa kurang dari 16 byte.
    2. Kunci AES dibuat atau diidentifikasi dari handshake, misalnya,
      1. dalam alur penamaan 1, berasal dari ECDH, dan tidak akan digunakan lagi untuk penyambungan ini. Setiap permintaan yang masuk terenkripsi dengan kunci ini tanpa memulai ulang prosedur harus ditolak.
      2. di alur penamaan 2, ini adalah kunci akun.
  3. Lakukan concat(clearBlock[0], clearBlock[1],...) untuk membuat data mentah.