Karakteristik
Layanan Sambungan Cepat
Penyedia Sambungan Cepat harus memiliki layanan GATT berikut.
| Layanan | UUID |
|---|---|
| Layanan Sambungan Cepat | 0xFE2C |
Layanan ini harus memiliki karakteristik berikut.
| Karakteristik Layanan Sambungan Cepat | Dienkripsi | Izin | UUID |
|---|---|---|---|
| ID Model | Tidak | Baca | FE2C1233-8366-4814-8EB0-01DE32100BEA |
| Penyambungan Berbasis Kunci | Tidak | Tulis dan beri tahu | FE2C1234-8366-4814-8EB0-01DE32100BEA |
| Kunci sandi | Tidak | Tulis dan beri 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 |
Fast Pair Seeker 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. Fungsi ini harus selalu menampilkan data berikut:
| Oktet | 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 Seeker dan Provider sama-sama memiliki kunci yang dibagikan sebelumnya. Kuncinya berbeda dalam setiap kasus:
Kasus 1: Pre-shared key didasarkan pada pasangan kunci publik/pribadi anti-spoofing, dan pasangan kunci publik/pribadi milik Seeker 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 menyambungkan 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 bahkan saat dalam mode penyambungan.)
- Pencari dan Penyedia masing-masing memverifikasi bahwa pihak lain memiliki kunci akun.
Karena kedua kasus tersebut sangat mirip, kecuali untuk pre-shared key yang digunakan, keduanya digabungkan dalam prosedur.
Format Data
Lihat prosedur untuk mengetahui cara penggunaan setiap format.
| Oktet | 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, yang ditulis ke karakteristik oleh Pencari.
| Oktet | Jenis data | Deskripsi | Nilai | Wajib? |
|---|---|---|---|---|
| 0 | uint8 |
Jenis pesan | 0x00 = Permintaan Penyambungan Berbasis Kunci |
Wajib |
| 1 | uint8 |
Flag
|
bervariasi | Wajib |
| 2 - 7 | uint48 |
Salah satu dari:
|
bervariasi | Wajib |
| 8 - 13 | uint48 |
Alamat BR/EDR Seeker | berbeda-beda | Hanya ada jika Bit 1 atau 3 Flag ditetapkan |
| n - 15 | Nilai acak (salt) | bervariasi | Wajib |
Tabel 1.2.1: Permintaan Mentah (jenis 0x00). Didekripsi dari Permintaan Terenkripsi di Tabel 1.1.
| Oktet | Jenis data | Deskripsi | Nilai | Wajib? |
|---|---|---|---|---|
| 0 | uint8 |
Jenis pesan | 0x10 = Permintaan Tindakan |
Wajib |
| 1 | uint8 |
Flag
|
berbeda-beda | Wajib |
| 2 - 7 | uint48 |
Salah satu dari:
|
bervariasi | Wajib |
| 8 | uint8 |
Grup pesan | bervariasi | Wajib jika Bit Flag 0 ditetapkan |
| 9 | uint8 |
Kode pesan | berbeda-beda | Wajib jika Bit Flag 0 ditetapkan |
| 10 | uint8 |
Bergantung pada Flag:
|
bervariasi | Wajib jika Bit 0 atau 1 Flag ditetapkan |
| 11 - n | Tambahan data | berbeda-beda | Opsional | |
| n - 15 | Nilai acak (salt) | bervariasi | Wajib |
Tabel 1.2.2: Permintaan Mentah (jenis 0x10). Didekripsi dari Permintaan Terenkripsi di Tabel 1.1.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 | uint8 |
Jenis pesan | 0x01 = Respons Penyambungan Berbasis Kunci |
| 1 - 6 | uint48 |
Alamat publik (BR/EDR) penyedia | bervariasi |
| 7 - 15 | Nilai acak (salt) | berbeda-beda |
Tabel 1.3: Respons Mentah. Dienkripsi untuk menghasilkan Respons Terenkripsi di Tabel 1.4.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 -15 | uint128 |
Respons Terenkripsi | bervariasi |
Tabel 1.4: Respons Terenkripsi, dikirim oleh Penyedia kepada Pencari melalui pemberitahuan.
Karakteristik: Kunci sandi
Karakteristik ini digunakan selama prosedur Penyambungan Berbasis Kunci.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 - 15 | uint128 |
Blok kunci sandi terenkripsi | bervariasi |
Tabel 2.1: Blok Kunci Sandi Terenkripsi. Lihat prosedur Penyambungan Berbasis Kunci untuk penggunaan.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 | uint8 |
Jenis pesan | Salah satu dari:
|
| 1 - 3 | unit32 |
Kunci sandi 6 digit | bervariasi |
| 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.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 - 15 | uint128 |
Kunci akun (dienkripsi) | berbeda-beda |
Setelah mendapatkan permintaan tulis, Penyedia Sambungan Cepat harus melakukan hal berikut:
- Dekripsi kunci akun menggunakan rahasia bersama yang dihasilkan dari langkah 4 dalam
prosedur.
- Untuk Penyedia yang memerlukan pengikatan (umum):
- Sebelum mendekripsi, pastikan rahasia bersama digunakan untuk mendekripsi permintaan kunci sandi dari langkah 12. Jika langkah ini belum lulus 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 dan dienkripsi dengan kunci ini tanpa memulai ulang prosedur harus ditolak.
- Untuk Penyedia yang memerlukan pengikatan (umum):
- Pastikan nilai yang didekripsi dimulai dengan
0x04atau0xFF. 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:- Anggap ini sebagai sesi penyambungan sementara dan jangan lakukan operasi apa pun.
- Hal ini dapat terjadi dengan alur Menulis kunci akun secara retroaktif.
- Jangan simpan kunci, dan jangan gunakan dalam daftar Kunci Akun, enkripsi, atau penghitungan MAC.
- Penghapusan ikatan dipicu oleh peristiwa atau waktu tunggu khusus fitur. Untuk Berbagi Audio LE, sangat disarankan untuk menghapus ikatan BLE dan kunci link 10 menit setelah sesi sementara terputus.
- Jika nilainya adalah
Kunci Akun dalam daftar digunakan selama Sambungan Berbasis Kunci.
Karakteristik: Revisi Firmware
Karakteristik ini memungkinkan Pencari membaca revisi firmware Penyedia sesuai kebutuhan. Respons harus selalu menampilkan data berikut:
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 - var | utf8s |
Kode revisi firmware | bervariasi |
Firmware harus dienkapsulasi ke dalam satu string utf8 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:
status-updating: jika Penyedia saat ini sedang mengupdate ke firmware baru. Atau, Penyedia dapat menampilkan versi firmware yang di-stage.
status-abnormal: jika Penyedia dalam status tidak normal. Misalnya, perangkat 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 terikat harus memiliki akses kapan saja
- perangkat apa pun harus memiliki akses saat Penyedia dapat ditemukan
Jika Penyedia mendukung Hub Pencari, diperlukan penerapan tambahan. Lihat Update Firmware Hub Pencari untuk mengetahui detailnya.
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 (ditargetkan untuk tidak digunakan lagi pada 1/1/2021) | Dienkripsi | Izin | UUID |
|---|---|---|---|
| Data | Tidak | Tulis dan beri tahu | 0x1237 |
Sebelum menulis atau memberi tahu 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.
| Oktet | Deskripsi | Nilai |
|---|---|---|
| 0 - 7 | 8 byte pertama HMAC-SHA256. | bervariasi |
| 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.
| Oktet | Jenis data | Deskripsi | Nilai |
|---|---|---|---|
| 0 - var | byte array |
Data | bervariasi, dekodekan sesuai dengan ID Data Tabel 1.2.2:
|
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:
- Buat 8 byte acak secara kriptografis untuk Nonce.
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
- Kunci AES adalah rahasia bersama dari langkah 4 dalam prosedur.
- clearBlock[i] adalah blok 16 byte yang dimulai dari data[i * 16]. Blok terakhir dapat berukuran kurang dari 16 byte.
Lakukan concat(encryptedBlock[0], encryptedBlock[1],...) untuk membuat Data Terenkripsi.
Membuat HMAC-SHA256 dengan
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))di mana
- K dihasilkan oleh concat(shared_secret, 48-byte ZEROs), shared_secret berasal dari langkah 4 dalam prosedur.
- opad adalah padding luar 64 byte, yang terdiri dari byte berulang yang bernilai
0x5C. - ipad adalah padding dalam 64 byte, yang terdiri dari byte berulang yang bernilai
0x36.
Ambil 8 byte pertama dari HMAC-SHA256 sebagai awalan Paket data.
Setelah mendapatkan permintaan tulis, Penyedia Sambungan Cepat akan melakukan hal berikut:
- Verifikasi integritas data dengan memeriksa 8 byte pertama HMAC-SHA256.
Mendekripsi Data terenkripsi menggunakan AES-CTR, dengan setiap blok dibuat menggunakan
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))di mana
- encryptedBlock[i] adalah blok 16 byte yang dimulai dari encrypted_data[i * 16]. Blok terakhir bisa kurang dari 16 byte.
- Kunci AES dibuat atau diidentifikasi dari handshake, misalnya,
- 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.
- di alur penamaan 2, kuncinya adalah kunci akun.
Lakukan concat(clearBlock[0], clearBlock[1],...) untuk membuat data mentah.