Zabezpieczanie kluczowych informacji w systemie mikroprocesorowym

| Technika

Projektując systemy elektroniczne, spotykamy się z potrzebą zapisywania danych w pamięci nieulotnej. Ustawienia parametrów pracy, aktualne stany liczników czy aktualny etap programu powinny być zapamiętywane i odtworzone po wyłączeniu zasilania. Teoretycznie problem nie jest skomplikowany – po to powstały pamięci EEPROM lub Flash, do których mamy dostęp z poziomu programu.

Zabezpieczanie kluczowych informacji w systemie mikroprocesorowym

Rys. 1. Obliczanie bitu parzystości

Każdą zmianę parametru możemy w takiej pamięci zapisać i odtwarzać, kiedy zajdzie potrzeba. Podczas wdrażania i testów tych rozwiązań pojawiają się jednak oczywiste problemy. Jeśli będziemy chcieli zapamiętywać stan zegarka po upływie każdej sekundy, okaże się, że najbardziej trwałe EEPROM-y przestaną działać po jednym dniu.

Nawet jeśli zapis ograniczymy tylko do minut, urządzenie popracuje tylko około 2 miesięcy. Gdy zdecydujemy się zapisywać dane jeszcze rzadziej - w przypadku wyłączenia zasilania stracimy część informacji. Wszelkie zakłócenia zewnętrzne mogą spowodować błędny zapis do pamięci i dalsze wadliwe działanie.

Przykład zegarka jest dość prosty i nie tak problematyczny - zawsze można sprawdzić na innym, jednak w przypadku liczników mediów, pomiaru paliwa, liczników kilometrów, skutki będą bardziej uciążliwe. W systemach wbudowanych zawsze musimy liczyć się z ograniczoną ilością zasobów, dlatego projektanci muszą stosować wiele metod ochrony. Kilka najpopularniejszych technik przedstawionych zostało poniżej.

Określanie zakresu i dublowanie danych

Jednym z najbardziej podstawowych sposobów, o których trzeba pamiętać, jest określanie zakresu danych. Jest to sposób zarówno prosty, jak i skuteczny. Dobrym przykładem jest pomiar czasu i zapisywanie danych w formacie sekundy - minuty - godziny - dni. Każdy z elementów składowych jest liczbą dodatnią, a pierwsze trzy nie mogą przekroczyć wartości 60.

Dodatkowym bardzo skutecznym zabezpieczeniem jest określenie dopuszczalnych zmian wartości. Jeśli aktualny czas jest zapamiętywany w pamięci nieulotnej co godzinę, to dopuszczalne zmiany w tej komórce wynoszą 1. Innym prostym sposobem zabezpieczania danych jest ich dublowanie.

Rys. 2. MAX809 w układzie detekcji spadku napięcia zasilania

Kluczowe dane możemy zapisać dwukrotnie, jednak problemem okaże się stwierdzenie, która z wersji jest tą właściwą. W celu określenia, który z zestawów jest prawidłowy, trzeba zastosować jeden z podanych dalej zabezpieczeń.

System z informacją nadmiarową - bit parzystości

Do prostej ochrony danych można zastosować bit parzystości. Przy zapisywaniu małej ilości informacji za pomocą jednego dodatkowego bitu możemy skontrolować poprawność ciągu. Bit parzystości najczęściej stosowany jest przy transmisji szeregowej, gdzie rezerwowany jest 1 bit dla 8 bitów danych.

Stosując tę samą regułę, możemy jednym bajtem kontrolnym zabezpieczyć 8 bajtów danych. Algorytm obliczania i sprawdzania poprawności danych może być zaimplementowany w bardzo prosty sposób (rys. 1). Stosowanie bitu parzystości jest jednak bardzo słabym rozwiązaniem i nie uchroni nas przed wieloma błędami.

Sumy kontrolne i CRC

Suma kontrolna jest to ogólne pojęcie stosowane do określenia działań polegających na matematycznym przetworzeniu danych i zapamiętaniu wyniku. W zbiorze algorytmów obliczania sum kontrolnych wyróżnić można: CRC, MD5, SHA-1, Adler32 czy Algorytm Luhna. Ostatni z nich stosowany jest np. w numerach NIP i PESEL.

Rys. 3. Najprostszy układ detekcji przejścia przez zero wykorzystujący zabezpieczenia ESD portów procesora

Najbardziej rozpowszechnionym algorytmem w systemach komputerowych jest cykliczny kod nadmiarowy (CRC). Obliczanie CRC polega na podzieleniu ciągu danych przez n-bitowy wielomian (znany dla odbiornika i nadajnika). Reszta z tego dzielenia w postaci liczby n-1 bitowej dołączana jest do paczki danych.

W systemach wbudowanych najczęściej stosuje się CRC8, CRC16 lub CRC32 w zależności od architektury procesora. Odbiorca po otrzymaniu pakietu danych może sprawdzić jego poprawność poprzez porównanie odebranego i obliczonego CRC. Najczęściej używane standardy CRC podane zostały w tabeli 1. Istnieje wiele sposobów obliczania sumy CRC i sprawdzania poprawności danych.

W zależności od tego, czy zależy nam na oszczędzaniu pamięci operacyjnej, czy pamięci programu, możemy wybrać obliczanie CRC w locie dla każdej porcji danych lub zastosować tablicę obliczonych wartości CRC. Wydajne algorytmy są już dostępne w domenie publicznej (na licencji Open Source) i większość standardowych bibliotek ma ich implementację.

BrownOutDetect

Wiele procesorów ma sprzętowe wykrywanie spadku napięcia. W popularnych procesorach rodziny Atmega za pomocą odpowiedniego ustawienie fuse-bitów możemy wymusić reset procesora poniżej wybranego napięcia. Dostępne są różne wartości od 2,7 do 4,8V.

Wymuszenie resetu procesora zabezpieczy układ przed nieprzewidywanym działaniem przy niskich napięciach zasilania. Mechanizm ten rozwiązuje jednak tylko częściowo problemy związane z ochroną danych. Resetowanie procesora przy niestabilnym zasilaniu w znacznej mierze zmniejsza prawdopodobieństwo przekłamania danych.

Rys. 4. Mechanizm zapisywania danych. A – 4,7 V próg napięcia układu MAX809, B – 4,2 V próg napięcia układu zasilania

W systemie, w którym występują dane krytyczne, chcielibyśmy uzyskać możliwość zapisywania danych jeszcze przed zresetowaniem procesora. Można w tym celu wykorzystać zewnętrzny układ detekcji i podłączyć go do wejścia przerwania. Przy procesorze zasilanym napięciem 5V można zastosować układ MAX809L, który wygeneruje przerwanie procesora (aktywny stan niski) przy napięciu zasilania 4,63V (rys. 2).

Pierwszymi rozkazami wykonywanymi w obsłudze przerwania powinno być odłączenie elementów o dużym poborze prądu, np. wyświetlacza. W zależności od poboru prądu w układzie, stopnia w zasilaczu, w którym podpięty zostanie detektor oraz zastosowanego kondensatora podtrzymującego uzyskamy dodatkowy czas na zapisanie danych.

Wykrywanie spadku zasilania w układach napięcia zmiennego

Im wcześniej wykryjemy zanik napięcia zasilającego, tym więcej mamy czasu na zapisanie kluczowych danych. Zgodnie z tą zasadą najlepszym punktem pomiaru będzie pierwszy stopień układu zasilania. Układy zasilane napięciem zmiennym oferują możliwość detekcji przejścia przez zero, jeśli napięcie zasilające zaniknie - układ detekcji przestanie generować sygnał.

Większość procesorów mających zabezpieczenia ESD pozwala na zastosowanie układu składającego się z kilku elementów nawet dla napięcia sieciowego 220 V. Wewnętrzne diody zabezpieczają piny procesora przed zniszczeniem przez wysokie napięcie. Należy pamiętać, że w układzie przedstawionym na rysunku 3 nie występuje separacja galwaniczna i napięcie zasilania jest podłączone bezpośrednio do procesora.

Zapisywanie znaczników w sekcjach power down

Tabela 1. Standardowe sumy CRC

Wykorzystując wykrywanie zaniku napięcia zasilania, mamy możliwość zapisania kluczowych danych przed wyłączeniem urządzenia. Ilość danych, jaka zostanie zapisana, zależy od wielu czynników przewidywalnych, jak pojemność kondensatora podtrzymującego, pobór prądu przez układ, oraz nieprzewidywalnych, np. stan kondensatora, temperatura. Mechanizm zapisywania danych został przedstawiony na rys. 4.

Na tym wykresie możemy wyróżnić 4 etapy – pierwszym jest zanik napięcia zasilania, który wystąpił na początku pomiaru. W punkcie A zadziałał układ MAX809 i wywołał przerwanie zewnętrze w procesorze. W punkcie B przestał działać układ zasilania i rozpoczęło się rozładowywanie kondensatora podtrzymującego. Ostatni etap wystąpił, kiedy napięcie zasilania osiągnęło wartość 2,7V i przestał działać rdzeń procesora.

W czasie pomiędzy wywołaniem przerwania (A) a wyłączeniem procesora (ok. 2,7V) układ powinien odciąć zbędne interfejsy oraz zapisać dane. Aby upewnić się, że zapis zakończył się pomyślnie, warto na początku i na końcu bloku zmiennych umieścić znaczniki. Znacznikami takimi może być zapisanie wartości 0×00 w pierwszej i ostatniej komórce sekcji danych. Odczytując tę flagę będziemy pewni, że operacja zapisu przebiegła pomyślnie.

Bartłomiej Grześkowiak