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 | Dibaca | FE2C1233-8366-4814-8EB0-01DE32100BEA |
Pasangan 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 |
Pencari Sambungan Cepat menggunakan karakteristik berikut.
Nama | Dienkripsi | Izin | UUID |
---|---|---|---|
Revisi Firmware | Tidak | Dibaca | 0x2A26 |
Karakteristik: ID Model
Karakteristik ini memungkinkan Pencari Kerja membaca ID model sesuai kebutuhan, di luar saat perangkat sedang beriklan dalam mode dapat ditemukan. Fungsi ini akan selalu menampilkan data berikut:
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0–2 | uint24 |
ID Model | di waktu/bulan/tempat/tanggal tertentu |
Karakteristik: Pasangan Berbasis Kunci
Karakteristik ini mengontrol prosedur Penyambungan Berbasis Kunci. Dalam prosedur ini, tingkat kepercayaan tertentu ditetapkan dengan memverifikasi bahwa Pencari Kerja dan Penyedia memiliki kunci yang dibagikan sebelumnya. Kuncinya berbeda pada setiap kasus:
Kasus 1: Kunci yang dibagikan sebelumnya didasarkan pada pasangan kunci publik/pribadi anti-spoofing, dan pasangan kunci publik/pribadi Pencari Kerja sendiri yang akan berubah untuk setiap upaya penyambungan.
- Penyedia dalam mode penyambungan.
- Pencari Kerja memverifikasi bahwa Penyedia memiliki kunci pribadi anti-spoofing.
Perhatikan bahwa saat dalam mode penyambungan, Penyedia tentu saja juga dapat menyambungkan dengan cara yang biasa, misalnya, untuk menyambungkan dengan perangkat yang tidak mendukung Sambungan 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 memverifikasi bahwa satu sama lain memiliki kunci akun.
Karena kedua kasus tersebut sangat mirip, kecuali menggunakan pre-shared key, keduanya akan digabungkan dalam prosedur.
Format Data
Lihat prosedur tentang 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 Kerja.
Oktet | Jenis data | Deskripsi | Nilai | Wajib? |
---|---|---|---|---|
0 | uint8 |
Jenis pesan | 0x00 = Permintaan Penyambungan Berbasis Kunci |
Wajib |
1 | uint8 |
Bendera
|
bervariasi | Wajib |
2 - 7 | uint48 |
Memenuhi salah satu ketentuan berikut:
|
bervariasi | Wajib |
8-13 tahun | uint48 |
Alamat BR/EDR Pencari Kerja | bervariasi | Hanya ada jika Flags Bit 1 atau 3 ditetapkan |
n—15 | Nilai acak (garam) | 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 |
Bendera
|
bervariasi | Wajib |
2 - 7 | uint48 |
Memenuhi salah satu ketentuan berikut:
|
bervariasi | Wajib |
8 | uint8 |
Grup pesan | bervariasi | Wajib jika Bit Tanda 0 ditetapkan |
9 | uint8 |
Kode pesan | bervariasi | Wajib jika Bit Tanda 0 ditetapkan |
10 | uint8 |
Tergantung pada Tanda:
|
bervariasi | Wajib jika Bit Flag 0 atau 1 ditetapkan |
11 - n | Data tambahan | bervariasi | Opsional | |
n—15 | Nilai acak (garam) | bervariasi | Wajib |
Tabel 1.2.2: Permintaan Mentah (tipe 0x10). Didekripsi dari Permintaan Terenkripsi di Tabel 1.1.
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0 | uint8 |
Jenis pesan | 0x01 = Respons Penyambungan Berbasis Tombol |
1 - 6 | uint48 |
Alamat publik (BR/EDR) penyedia | bervariasi |
7 - 15 | Nilai acak (garam) | bervariasi |
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, yang dikirim oleh Penyedia kepada Pencari Kerja melalui pemberitahuan.
Karakteristik: Kunci sandi
Karakteristik ini digunakan selama prosedur Penyambungan Berbasis Kunci.
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0 - 15 | uint128 |
Pemblokiran 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 (garam) | bervariasi |
Tabel 2.2: Blok Kunci Sandi Mentah. Versi Tabel 2.1 yang didekripsi.
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 (terenkripsi) | bervariasi |
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 bonding (umum):
- Sebelum mendekripsi, pastikan bahwa rahasia bersama digunakan untuk mendekripsi permintaan kunci sandi dari langkah 12. Jika langkah ini tidak berhasil menggunakan rahasia ini, abaikan penulisan ini dan keluar.
- Pada tahap ini, rahasia bersama (K dalam prosedur) tidak akan digunakan lagi untuk penyambungan ini. Setiap permintaan yang dienkripsi dengan kunci ini tanpa memulai ulang prosedur harus ditolak.
- Untuk Penyedia yang memerlukan bonding (umum):
- Pastikan nilai yang didekripsi diawali dengan
0x04
. Jika tidak, abaikan tulis dan berhenti. - Periksa apakah daftar Kunci Akun yang dipertahankan memiliki ruang untuk nilai baru.
- Jika tidak, hapus nilai yang paling lama digunakan dari daftar.
- Tambahkan nilai baru ke daftar.
Kunci Akun dalam daftar digunakan selama Penyambungan Berbasis Kunci.
Karakteristik: Revisi Firmware
Karakteristik ini memungkinkan Pencari Kerja membaca revisi firmware Penyedia sesuai kebutuhan. Kode ini akan selalu menampilkan data berikut:
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0 - var | utf8s |
Kode revisi firmware | bervariasi |
Ini harus dienkapsulasi ke string utf8 tunggal meskipun ada lebih dari satu firmware (misalnya 3 firmware untuk bud kiri, bud kanan, dan case.) di Penyedia. Penyedia juga bisa menampilkan string spesifik untuk kasus khusus:
update status: jika Penyedia sedang mengupdate ke firmware baru. Atau, Penyedia bisa menampilkan versi firmware bertahap.
status-abnormal: jika Penyedia dalam keadaan tidak normal. Misalnya, kode tersebut tidak berfungsi karena update firmware gagal. Nilai ini akan menyebabkan Pencari Kerja menampilkan pesan yang memberi tahu pengguna bahwa pesan tersebut harus diperbarui 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
Karakteristik: Data Tambahan
Layanan ini harus memiliki karakteristik berikut.
Karakteristik Layanan Sambungan Cepat | Dienkripsi | Izin | UUID |
---|---|---|---|
Data | Tidak | Tulis dan beri tahu | FE2C1237-8366-4814-8EB0-01DE32100BEA |
Karakteristik Layanan Sambungan Cepat lama (target tidak digunakan lagi pada 1/1/2021) | Dienkripsi | Izin | UUID |
---|---|---|---|
Data | Tidak | Tulis dan beri tahu | 0x1237 |
Sebelum menulis atau memberitahukan karakteristik ini, harus ada
handshake melalui FE2C1234-8366-4814-8EB0-01DE32100BEA
karakteristik untuk memiliki
rahasia bersama. AES-CTR akan digunakan untuk mengenkripsi data yang mengalir melalui
karakteristik ini, yang algoritmanya ditentukan di bawah ini. Mode ini lebih
aman di seluruh data yang melampaui satu blok 16 byte. HMAC-SHA256 akan digunakan untuk
memastikan integritas data, yang juga didefinisikan di bawah ini.
Oktet | Deskripsi | Nilai |
---|---|---|
0 - 7 | 8 byte pertama dari HMAC-SHA256. | bervariasi |
8 - 15 | Nonce, yang digunakan oleh enkripsi AES-CTR. | bervariasi |
16 - var | Data terenkripsi. | bervariasi |
Tabel 3.1: Paket Data, yang dikirim oleh Penyedia kepada Pencari Kerja melalui pemberitahuan atau dikirim oleh Pencari Kerja ke Penyedia melalui surat.
Oktet | Jenis data | Deskripsi | Nilai |
---|---|---|---|
0 - var | byte array |
Data | bervariasi, mendekodenya sesuai dengan ID Data Tabel 1.2.2:
|
Tabel 3.2: Data mentah. Didekripsi dari data terenkripsi pada 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:
- Membuat 8 byte acak secara kriptografi untuk Nonce.
Mengenkripsi 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 bisa kurang dari 16 byte.
Lakukan concat(encryptedBlock[0], encryptedBlock[1],...) untuk membuat Data yang Terenkripsi.
Buat 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 dimulai dari langkah 4 dalam prosedur.
- opad adalah padding luar berukuran 64 byte, yang terdiri dari byte berulang bernilai
0x5C
. - ipad adalah padding dalam berukuran 64 byte, yang terdiri dari byte berulang dengan nilai
0x36
.
Ambil 8 byte pertama dari HMAC-SHA256 sebagai awalan Paket data.
Setelah mendapatkan permintaan tulis, Penyedia Sambungan Cepat harus melakukan hal berikut:
- Verifikasi integritas data dengan memeriksa 8 byte pertama HMAC-SHA256.
Dekripsi Data terenkripsi menggunakan AES-CTR, dengan
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
di mana
- terenkripsiBlock[i] adalah blok 16-byte yang dimulai dari encryption_data[i * 16]. Blok terakhir bisa kurang dari 16 byte.
- Kunci AES dibuat atau diidentifikasi dari handshake, misalnya
- dalam alur penamaan 1, nama tersebut berasal dari ECDH, dan tidak akan digunakan lagi untuk pasangan ini. Setiap permintaan yang datang terenkripsi dengan kunci ini tanpa memulai ulang prosedur harus ditolak.
- dalam alur penamaan 2, ini adalah kunci akun.
Jalankan concat(clearBlock[0], clearBlock[1],...) untuk membuat data mentah.