Silabs 21Q2 saugus BLE įrenginys Apsaugos laboratorija

BLE saugos laboratorijos vadovas

Šioje laboratorijoje pamatysite, kaip sukurti saugesnį BLE įrenginį. Pradėsime nuo pabaigosview apie tai, kaip naudotis kai kuriomis kamino funkcijomis ir pereikite prie bendrų patarimų apie saugesnio ryšio būdus. Galiausiai pamatysime, kaip naudoti įrenginio sertifikatus per BLE, kad išorinis įrenginys būtų autentiškas.

Darbo pradžia

„Bluetooth“ sampprograma, kurią kursite, yra skirta naudoti su įkrovos įkrovikliu. Jei dirbate su visiškai nauju EFR32MG21B, jis neturės įkrovos programos. Iš anksto sukurtą įkrovos įkroviklį galite rasti platformoje\bootloader\sample-apps\bootloader-storage-internalsingle\efr32mg21a010f1024im32-brd4181a savo SDK aplanką.

  1. Pradėkite nuo soc-tuščios sample programa. Šis sample programa naudojama kaip šablonas ir yra geras atspirties taškas bet kuriai BLE programai.
    1. Iš Simplicity Studio atidarykite Silicon Labs Project Wizard File meniu -> naujas.
    2. Pasirinkite BRD4181C ir spustelėkite mygtuką „Kitas“.
    3. Spustelėkite žymimąjį laukelį „Bluetooth (9)“, esantį po technologijos tipas.
    4. Pažymėkite „Bluetooth – SoC Empty“, tada spustelėkite „Kitas“.
    5. Spustelėkite mygtuką „Baigti“.
  2. Dabar galite pridėti keletą charakteristikų, kad pamatytumėte, kaip apsaugotos ir neapsaugotos savybės traktuojamos skirtingai.
    1. Atidarykite projekto slcp file dukart spustelėdami jį Project Explorer lange
    2. Pažymėkite skirtuką „PROGRAMINĖS ĮRANGOS KOMPONENTAI“ ir atidarykite GATT konfigūravimo įrankį, kaip parodyta toliau: Ir naudokite toliau pateiktą importavimo įrankį, kad importuotumėte gatt_configuration.btconf file iš pateiktoje medžiagoje esančio serverio aplanko.GATT duomenų bazėje yra pritaikyta paslauga, vadinama „Training“, kai kurie duomenys yra apsaugoti, o dalis – ne. Tai leidžia palyginti, kas nutinka bandant pasiekti apsaugotą ir neapsaugotą charakteristiką. Tai greitas būdas sukurti įrenginį su labai elementaria apsauga.
  3. Naudosime nuoseklųjį prievadą, norėdami spausdinti į konsolę Simplicity Studio ir stebėti, kas vyksta programoje. Lengviausias būdas rasti šiuos komponentus yra ieškoti jų dialogo lange PROGRAMINĖS ĮRANGOS KOMPONENTAI, kaip parodyta:
      1. Įdiekite IO Stream USART komponentą
      2. Įdiekite IO Stream Retarget STDIO komponentą
      3. Įdiekite standartinį I/O komponentą
      4. Įdiekite žurnalo komponentą
      5. Atidarykite plokštės valdymo komponentą ir įjunkite „Įgalinti virtualų COM UART“
      6. Dešiniuoju pelės mygtuku spustelėkite adapterį skydelyje „Debug adapters“ ir pasirinkite „Launch Console“. Pasirinkite skirtuką „Serial 1“ ir perkelkite žymeklį į konsolės lango teksto įvesties lauką ir paspauskite Enter, kad pažadintumėte konsolę.
  4. Sukurkite vietinį kintamąjį sl_bt_on_event(), esančiame app.c, kad išsaugotumėte ryšio rankenėlę. Kintamasis turi būti statinis, nes ši funkcija iškviečiama kiekvieną kartą, kai kaminas pakelia įvykį, ir norime, kad reikšmė būtų pastovi. Ryšio rankena bus naudojama vėliaulaboratorijos skyrius.
  5. Įterpkite kai kuriuos „app_log()“ teiginius įvykiams, kad pamatytumėte, kada esame prisijungę, saugos režimus ir kt
      1. Įtraukite app_log.h antraštę file
      2. sl_bt_evt_connection_opened – atspausdinkite jungties rankenėlę ir išsaugokite ryšio rankenėlę. Jei sujungimo rankena yra 0xFF, ryšio tarp prijungtų įrenginių nėra. Pakeiskite esamą įvykių tvarkyklę, kad ji atrodytų maždaug taip:
      3. sl_bt_evt_connection_parameters – saugos režimas. Tai daroma tam, kad galėtumėte matyti, kada pasikeičia saugos režimas. Saugos režimų numeracija skiriasi, kai saugos režimas 1, išvardijamas reikšme 0 ir pan. Prie programos pridėkite šią įvykių tvarkyklę:
      4. sl_bt_evt_connection_closed_id. Ši įvykių tvarkyklė modifikuota, kad būtų atnaujinta ryšio rankena. Reikšmė 0xFF naudojama norint nurodyti, kad nėra aktyvaus ryšio. Komanda app_log() naudojama ryšio nutraukimo priežasčiai išspausdinti, būsenos kodų sąrašas yra čia. Pakeiskite esamą įvykių tvarkyklę, kad ji atrodytų maždaug taip:
  6. Sukurkite ir paleiskite projektą. Šiuo metu vykdysime sampprogramėlę, kad pamatytumėte, kaip ji veikia be jokių pakeitimų, be GATT duomenų bazės.
  7. Prisijunkite prie EFRConnect mobiliosios programos taip:
      1. Bakstelėkite „Bluetooth“ naršyklės piktogramą.
      2. Bakstelėkite piktogramą „Prisijungti“ įrenginyje, pavadintame „Training“.
  8. Perskaitykite neapsaugotą charakteristiką taip:
      1. Palieskite nuorodą „Daugiau informacijos“ po nežinoma paslauga, kurios UUID a815944e-da1e-9d2a- 02e2-a8d15e2430a0.
      2. Perskaitykite neapsaugotą charakteristiką UUID f9e91a44-ca91-4aba-1c33-fd43ca270b4c paliesdami piktogramą „Skaityti“. Jokių staigmenų čia nėra. Kadangi charakteristika niekaip neapsaugota, ji bus siunčiama paprastu tekstu.
  9. Dabar perskaitykite apsaugotą charakteristiką UUID d4261dbb-dcd0-daab-ec95-deec088d532b. Jūsų mobilusis telefonas turėtų paraginti susieti ir prisijungti. Pranešimas gali skirtis priklausomai nuo jūsų mobiliojo OS. Priėmę užklausą susieti, konsolėje turėtumėte pateikti tokį pranešimą: Pastaba: A priede šio vadovo pabaigoje pateikiama įvesties/išvesties galimybių ir susiejimo metodų santrauka. B priede apibendrinami „Bluetooth“ saugos režimai.

Apsaugos tvarkyklės konfigūracija

Saugos tvarkyklė yra „Bluetooth“ krūvos dalis, kuri nustato, kurios saugos funkcijos naudojamos. Šios funkcijos apima „man-in-the-middle“ (MITM) apsaugą, LE Secure ryšius (dar žinomas kaip ECDH), reikalaujančius patvirtinimo, kad būtų galima susieti ir kt. Apsaugos tvarkyklė taip pat tvarko įvesties / išvesties galimybes, kurios naudojamos norint nustatyti, kuris metodas naudojamas poravimui. /bonding (santrauką rasite A priede). Šiame skyriuje pamatysite paprastą sąranką.

  1. Nustatykite SM su norima konfigūracija. Šios laboratorijos techninė įranga leidžia lengvai rodyti prieigos raktą konsolėje. Norint įjungti MITM apsaugą, būtina įvesti slaptažodį. Pridėkite šį kodą prie sl_bt_system_boot_id įvykių tvarkyklės. Tai įgalina „man-in-the-middle“ ir informuoja nuotolinį įrenginį, kad turime galimybę rodyti prieigos raktą, bet tai ir viskas.
  2. Kad pulte būtų rodomas prieigos raktas, reikalinga įvykių tvarkytuvė, kaip parodyta toliau:
  3. Nustatykite sujungimo režimą, maksimalų sujungimų skaičių ir kt. Norėdami pradėti, naudokite šį kodą:Šie nustatymai gali būti naudojami siekiant apriboti užpuoliko galimybę užmegzti ryšį su jūsų įrenginiu. Jei jūsų gaminyje turi būti tik vienas vartotojas, galite apriboti maksimalų obligacijų skaičių iki 1. Tinkama vieta pridėti šiuos iškvietimus yra įvykių tvarkytuvėje sl_bt_system_boot_id. Šiuo metu neįjungsime sujungimo, kad likusi laboratorija veiktų sklandžiau, tačiau nustatome surišimo politiką, leidžiančią tik vieną ryšį. Šių API dokumentaciją rasite čia ir čia.
  4. Pridėkite sl_bt_evt_sm_bonded_id ir sl_bt_evt_sm_bonding_failed_id įvykių tvarkykles. Šiuo metu pagrindinis šių įvykių panaudojimas yra informacinis, tačiau vėliau laboratorijoje pridėsite funkcijų.
  5. Sukurkite ir blykstelėkite į tikslinę lentą. Prisijunkite prie EFRConnect ir perskaitykite apsaugotą charakteristiką, kaip anksčiau. Šį kartą konsolėje pamatysite prieigos raktą. Įveskite šį slaptažodį savo mobiliajame telefone, kai būsite paraginti.
  6. Išbandykite sujungimo patvirtinimą. Ši funkcija suteikia vartotojui galimybę reikalauti, kad surišimo užklausos būtų patvirtintos. Taip programa gali valdyti, su kokiais lygiaverčiais įrenginiais ji jungiasi. Viena iš galimybių – reikalauti, kad vartotojas paspaustų mygtuką prieš leisdamas susieti.
    1. Mobiliajame telefone atidarykite Bluetooth nustatymus ir nuimkite ryšį su EFR32 įrenginiu. Mobiliųjų telefonų diegimas skiriasi, todėl šis veiksmas gali būti nereikalingas. Jei „Bluetooth“ nustatymuose nematote „Mokymo“ įrenginio, tiesiog pereikite prie kito veiksmo.
    2. Programinės įrangos komponentuose įdiekite vieną paprasto mygtukų tvarkyklės egzempliorių.
    3. Įtraukite antraštę file sl_simple_button_instances.h programoje app.c
    4. Pridėkite įvykio sl_bt_evt_sm_bonding_confirm_id tvarkyklę. Pagrindinė šio įvykių tvarkyklės užduotis yra informuoti vartotoją, kad nuotolinis įrenginys prašo naujo ryšio.
    5. Pridėkite atgalinio skambučio funkciją, skirtą paprastam mygtukų tvarkytuvui, kad siųstų signalą į „Bluetooth“ krūvą, nurodantį, kad mygtukas buvo paspaustas. Tai pakeičia numatytąjį atgalinį skambutį, kuris tiesiog grįžta.
    6. Pridėkite išorinį signalo įvykių tvarkyklę. Šis įvykis iškeliamas reaguojant į signalo gavimą, pvz., ankstesniame žingsnyje. Išorinis signalo įvykis bus naudojamas surišimui patvirtinti.
    7. Pakeiskite iškvietimą į sl_bt_sm_configure, kad reikalautumėte susiejimo patvirtinimo, pvz.,
    8. Atkurti ir blykst.
    9. Prisijunkite prie EFRConnect ir perskaitykite apsaugotą charakteristiką, kaip anksčiau. Dabar konsolėje pamatysite tokį pranešimą:Paspauskite PB0, kad patvirtintumėte sujungimą. Dabar konsolėje bus rodomas slaptažodis, kurį reikia įvesti mobiliajame telefone, kad būtų galima susieti. Įveskite prieigos raktą, kad užbaigtumėte sujungimo procesą.

 

Patarimas: įvykių tvarkyklėje naudokite numatytąjį didžiąją ir mažąją raidę, kad išspausdintumėte pranešimą, kai dėklas siunčia įvykį, kuris nėra tvarkomas. Stackas gali bandyti pasakyti ką nors svarbaus.

Be pagrindų

Šiuo metu jūs pažengėte į priekįtage iš saugos funkcijų, kurias gali pasiūlyti mūsų rinkinys. Dabar patobulinkime diegimą išmintingai naudodami turimas funkcijas. Toliau nurodyti veiksmai yra neprivalomi ir nepriklausomi vienas nuo kito. Galite sukurti ir po kiekvieno išmirksėti, kad pamatytumėte elgseną arba išbandytumėte juos visus kartu.

  1. Atjunkite, kai nepavyko užmegzti ryšio. Tai gera vieta aptikti grėsmes. Jei nuotolinis įrenginys nepalaiko šifravimo / autentifikavimo arba tiesiog neturi tinkamų raktų, tai gali būti įsilaužėlis. Taigi, nutraukime ryšį. Pabandykite įtraukti iškvietimą į sl_bt_connection_close() įvykyje sl_bt_sm_bonding_failed_id. API dokumentuojama čia.Galite išbandyti šią funkciją įvesdami neteisingą prieigos kodą.
  2. Leidžiama klijuoti tik tam tikru laiku. Tai apriboja laiką, per kurį užpuolikas turi užmegzti ryšį, ir suteikia galimybę naudoti funkciją „leisti tik susietus ryšius“. Dizaineris gali pasirinkti, kaip įjungti arba išjungti surišimo režimą. Demonstravimo tikslais įjungsime „sąrankos režimą“ su PB1 ir naudosime laikmatį, kad jį išjungtume po 30 sekundžių.
    1. Įdiekite antrąjį paprasto mygtuko sąsajos atvejį. Tai leis naudoti PB1.
    2. Modifikuokite atgalinį skambutį, kad į krūvą būtų išsiųstas kitas signalas, kad įjungtumėte / išjungtumėte susiejimą. Rezultatas turėtų atrodyti maždaug taip:
    3. Modifikuokite išorinio signalo įvykių tvarkyklę, kad ji apdorotų šį naują signalą. Rezultatas turėtų būti toks:
    4. Pridėkite įvykio tvarkyklę įvykiui sl_bt_evt_system_soft_timer_id. Tai bus naudojama sąrankos režimui išjungti.
    5. Šis kodas gali būti naudojamas norint įjungti ryšio režimą ir leisti visus ryšius arba išjungti surišimo režimą ir leisti jungtis tik iš sujungtų įrenginių:
    6. Į sl_bt_system_boot_id įvykių tvarkyklę pridėkite šį iškvietimą
    7. Sukurkite projektą ir perkelkite jį į įrenginį.
    8. Pabandykite prisijungti prie įrenginio naudodami EFRConnect. Ryšys turėtų nepavykti.
    9. Dabar pabandykite paspausti PB1 prieš prisijungdami prie EFRConnect. Šį kartą ryšys bus sėkmingas. Po 30 sekundžių konsolėje pamatysite pranešimą, nurodantį, kad įrenginys išeina iš sąrankos režimo. Tai reiškia, kad surišimo režimas dabar išjungtas.
  3. Padidinkite saugumą užmezgant ryšį. Kadangi saugumas yra neprivalomas, turėtume kuo greičiau prašyti užšifruoto ryšio, o ne pasikliauti GATT charakteristikomis. API dokumentuojama čia. Tinkama vieta iškviesti šią API yra įvykyje sl_bt_evt_connection_opened_id. Ryšio rankena pasiekiama ryšio kintamajame.

Saugi tapatybė

Dabar, kai turime saugesnį „Bluetooth“ įrenginį, galime pagerinti autentifikavimo veiksmą. Jau matėte, kaip patikrinti saugų saugyklos įrenginių tapatybę naudodami komandų eilutę ankstesnėse mokymo laboratorijose. Šiame skyriuje pamatysime, kaip vienas BLE įrenginys gali patikrinti kito BLE įrenginio tapatybę pateikdamas užklausą jo sertifikato grandinėje ir išsiųsdamas iššūkį. Visos saugios saugyklos dalys turi savo įrenginio sertifikatą ir paketo sertifikatą. Gamyklos ir šakniniai sertifikatai yra užkoduoti kliento programoje, kad būtų galima patikrinti visą sertifikatų grandinę. Daugiau informacijos apie saugią tapatybę rasite AN1268.

  1. Apibrėžkite visuotinį buferį įrenginio atestacijos parašui saugoti, kaip nurodyta toliau:
  2. Nustatykite saugos tvarkyklės konfigūraciją, kad būtų naudojamas JustWorks susiejimas. Tai daroma taip, kad ryšys būtų užšifruotas. Praktiškai turėtų būti naudojama MITM apsauga, bet kad laboratorija būtų paprasta, naudosime JustWorks. Pakeiskite skambutį į sl_bt_sm_configure į šį:Taip pat pakomentuokite iškvietimą setup_mode(true) įvykių tvarkyklėje system_boot.
  3. Atidarykite helpers.c iš pateiktos medžiagos ir nukopijuokite turinį į app.c. Šios atgalinio skambučio funkcijos atlieka tokias užduotis kaip sertifikatų segmentavimas, kad juos būtų galima siųsti per BLE, tikrina sertifikatų grandinę ir generuoja / tikrina iššūkį.
  4. Būtina nustatyti maksimalų perdavimo vieneto (MTU) dydį, kad sertifikatus būtų galima segmentuoti ir surinkti iš naujo. Apibrėžkite visuotinį kintamąjį, kad išsaugotumėte MTU, kaip parodyta čia:Tada pridėkite įvykių tvarkyklę prie GATT MTU apsikeitimo įvykio, kaip parodyta toliau:
  5. Yra trys vartotojo duomenų charakteristikos, kurias galima nuskaityti. Šios charakteristikos naudojamos perduodant įrenginio sertifikatą, partijos sertifikatą ir iššūkį. Šioms vartotojo skaitymo užklausoms apdoroti naudojama atgalinio skambinimo funkcija. Pridėkite tvarkyklę, kad iškviestumėte šią funkciją, kaip parodyta toliau:Atgalinis skambutis naudoja MTU nuo 2 veiksmo, kad segmentuotų ir prireikus išsiųstų sertifikatus. Ji taip pat tvarko pasirašyto iššūkio siuntimą.
  6. Klientas siunčia iššūkį, atsitiktinį skaičių, kurį turi pasirašyti serveris, parašydamas vieną iš GATT charakteristikų. Dėl šios priežasties programa turi turėti vartotojo rašymo užklausos įvykio tvarkyklę, kaip nurodyta toliau:
  7. Pridėkite saugaus tapatybės palaikymą files į projektą:
    1. app_se_manager_macro.h, app_se_manager_secure_identity.c ir app_se_secure_identity.h iš pateiktos medžiagos į projektą. Šie files yra keletas pagalbinių funkcijų, skirtų tokioms užduotims kaip sertifikato dydžio nustatymas, įrenginio viešojo rakto gavimas ir iššūkio pasirašymas.
    2. Įtraukite app_se_manager_secure_identity.h į app.c.
  8. Importuokite pateiktą gatt_configuration-attest.btconf iš pateiktos medžiagos. Ši GATT duomenų bazė vadinama saugiu atestavimu, kurią sudaro keturios charakteristikos, kurios bus naudojamos mūsų įrenginio tapatybei patikrinti. Tai apima įrenginio sertifikatą, paketo sertifikatą, iššūkį ir atsakymą.
  9. Klientas, naudojamas modeliuoti įrenginiui, pvz., šliuzui, pateikiamas kaip visas projektas, nes jį sukurti yra sudėtingiau. Apskritai kliento veikla yra tokia:
    1. Nuskaito įrenginius, reklamuojančius saugaus atestavimo paslaugą, ir prie jų prisijungia.
    2. Atranda GATT duomenų bazės paslaugas ir charakteristikas.
    3. Nuskaito įrenginio ir paketų sertifikatus ir patikrina sertifikatų grandinę naudodamas gamyklinį ir šakninį sertifikatą, kurį išsaugojo „flash“.
    4. Siunčia atsitiktinį iššūkį serveriui.
    5. Bandoma patikrinti atsakymą į iššūkį.
    6. Jei nepavyksta patvirtinti, nutraukiamas ryšys.
  10. Sukurkite ir perkelkite serverio projektą į savo serverį WSTK / radijo plokštę.
  11. Importuokite kliento projektą iš kliento aplanko pateiktoje medžiagoje. Sukurkite ir perkelkite kliento projektą į savo kliento WSTK / radijo plokštę.
  12. Paspauskite „Reset“ kliento WSTK ir atidarykite serijos konsolę. Klientas pradeda ieškoti įrenginių, reklamuojančių mūsų saugią tapatybės paslaugą, ir prisijungs, kai ją suras.
  13. Klientas parodys kai kuriuos pranešimus, rodančius, kad jis rado serverį su norima paslauga ir būsenos pranešimus apie sertifikatų grandinės patikrinimą.
  14. Jei patvirtinimas bus sėkmingas, klientas sugeneruos atsitiktinį skaičių, vadinamą iššūkiu, ir išsiųs jį į serverį. Serveris pasirašys iššūkį savo saugiai laikomu privačiu įrenginio raktu ir parašu grąžins klientui, tai vadinama iššūkio atsakymu. Tada klientas naudoja viešąjį raktą anksčiau gautame įrenginio sertifikate, kad patikrintų parašą. Tai daroma siekiant patvirtinti, kad serveris tikrai turi privatų raktą, kurį jis teigė turįs. Jei iššūkis patikrintas teisingai, rodomas pranešimas apie tai; kitu atveju ryšys nutraukiamas ir parodomas pranešimas, paaiškinantis kodėl.
  15. Dabar išsiųskite negaliojantį sertifikatą, kad patvirtintumėte, jog patvirtinimas tikrai veikia. Galite modifikuoti user_read_request_cb(), kad sugadintumėte sertifikato duomenis arba iššūkio atsakymą.

A priedas – I/O galimybės ir susiejimo metodai
B priedas – Apsaugos režimai ir lygiai

1 saugos režimas yra vienintelis režimas, palaikomas „Bluetooth Low Energy“ „Silicon Labs“ krūvoje. Lygiai yra tokie:

  • 1 lygis be apsaugos
  • 2 lygio neautentifikuotas susiejimas su šifravimu
  • 3 lygio autentifikuotas susiejimas su šifravimu
  • 4 lygio autentifikuoti saugūs ryšiai su stipriu šifravimu (ECDH raktų keitimas)

 

Dokumentai / Ištekliai

Silabs 21Q2 saugus BLE įrenginys Apsaugos laboratorija [pdf] Naudotojo vadovas
21Q2 saugus BLE įrenginys Saugos laboratorija, saugus BLE įrenginys Saugos laboratorija, Apsaugos laboratorija

Nuorodos

Palikite komentarą

Jūsų el. pašto adresas nebus skelbiamas. Privalomi laukai pažymėti *