Abschlussbericht
Abschlussbericht
Abschlussbericht
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
BSI, Bonn<br />
IHP, Frankfurt (Oder)<br />
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Version 1.00<br />
13. Oktober 2011<br />
IHP: Prof. Dr. Peter Langendörfer / Frank Vater / Thomas Basmer / Oliver Stecklina<br />
BSI: Frank Gehring, Christian Wieschebrink
2<br />
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node
Inhaltsverzeichnis<br />
1 Einleitung 13<br />
1.1 Beschreibung des Gesamtsystems . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2 Hardware 15<br />
2.1 Beschreibung der Teilkomponenten . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.2 LEON2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.3 AMBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
2.4 Konfigurationsregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
2.5 Memory-Controller und Integration der Hardwarebeschleuniger . . . . . . . 18<br />
2.6 Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
2.7 Parallel I/O-Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
2.8 UART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
2.9 DSU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
2.10 Interrupt-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
2.11 Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
2.12 Memory-Like Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />
2.13 AES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
2.13.1 Arithmetische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
2.13.2 Algorithmusbeschreibung des AES . . . . . . . . . . . . . . . . . . . 24<br />
2.13.3 Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
2.14 ECC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
2.14.1 Arithmetische Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
2.14.2 Multiplizierer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
2.14.3 Reduktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
2.14.4 System-Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
2.14.5 Parameter im TSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
2.15 SHA-1 / PRNG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
2.15.1 Secure Hash Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
2.15.2 Pseudo Random Number Generator (PRNG) . . . . . . . . . . . . . 36<br />
2.15.3 Hardwarebeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
2.16 SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
2.17 Pads und Pins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
2.18 Vom VHDL zum ASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
2.19 Layoutgenerierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
2.20 Boardbeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
2.21 Systemtest und Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
2.22 Energie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
2.23 Debug- und Diagnoseschnittstellen . . . . . . . . . . . . . . . . . . . . . . . 44
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
3 Software 45<br />
3.1 Das Betriebssystem eCos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
3.1.1 eCos im Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
3.1.2 Hinzufügen von Komponenten . . . . . . . . . . . . . . . . . . . . . 48<br />
3.1.3 build-Prozess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
4 Softwarearchitektur des TSN 57<br />
4.1 Gerätetreiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
4.1.1 UART Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
4.1.2 SPI Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />
4.1.3 MMIO Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />
4.1.4 General Purpose Input/Output (GPIO) Treiber . . . . . . . . . . . . . 61<br />
4.2 Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
4.2.1 CryptAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
4.2.2 SensorAPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
4.3 Protokollstapel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
4.3.1 lightweight IP Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />
4.3.2 Point to Point Protocol (PPP) . . . . . . . . . . . . . . . . . . . . . . 66<br />
4.3.3 Bluetooth Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />
4.3.4 Sensor Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />
4.4 TSN Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
4.4.1 Bridge Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
4.4.2 Schlüsselaustausch Thread . . . . . . . . . . . . . . . . . . . . . . . 70<br />
4.4.3 Sensorik Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
4.4.4 Management Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
5 Simulation und Messergebnisse 73<br />
5.1 Ziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
5.2 Messaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73<br />
5.3 Messprogramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
5.4 Messungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />
5.5 Lebensdauertest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />
6 Future Work 77<br />
6.1 System-Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77<br />
6.1.1 Mikrokern-basierter TSN mit Security Compartments . . . . . . . . . 78<br />
6.1.2 Trusted Computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
6.1.3 TCP/IP Netzwerk-Stack . . . . . . . . . . . . . . . . . . . . . . . . . 90<br />
6.2 Optimiertes Hardwarekonzept . . . . . . . . . . . . . . . . . . . . . . . . . . 95<br />
6.2.1 Einfügen neuer Komponenten . . . . . . . . . . . . . . . . . . . . . 96<br />
6.2.2 Veränderungen an vorhandenen Komponenten . . . . . . . . . . . . 100<br />
6.2.3 Schutzkonzept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105<br />
6.3 Energieversorgung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
6.3.1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
6.3.2 Boardkomponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
6.3.3 Alternativen zur Energieversorgung aus Primärbatterien . . . . . . . 112<br />
Abkürzungsverzeichnis 115<br />
4
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Literaturverzeichnis 117<br />
5
Tabellenverzeichnis<br />
1.1 Eigenschaften des TSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.1 Signale eines Memory-Like Interface . . . . . . . . . . . . . . . . . . . . . . 22<br />
2.2 Struktur des Kontrollregisters . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
2.3 Adressen der SHA-1-Register . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
2.4 Simulation der Leistungsaufnahme für Einzelkomponenten und das Gesamtsystem<br />
bei 16 MHz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
3.1 Speichergrößen verschiedener Konfigurationen von eCos 3.0 . . . . . . . . 45<br />
4.1 Konfigurationskommandos des MMIO Treibers . . . . . . . . . . . . . . . . 61<br />
4.2 AT-Kommandos des Bluebear SP-S . . . . . . . . . . . . . . . . . . . . . . 68<br />
5.1 Messungen der Stromaufnahme für den AES . . . . . . . . . . . . . . . . . 76<br />
5.2 Messungen der Stromaufnahme für den ECC . . . . . . . . . . . . . . . . . 76<br />
6.1 Vergleich verschiedener Multiplizierer für Punktmultiplikation der ECC Komponente<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Abbildungsverzeichnis<br />
1.1 Anwendungsbeispiel des TSN . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
2.1 Blockschaltbild des TSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.2 Grafische Darstellung der fünfstufigen Pipeline des LEON2 (entnommen<br />
aus LEON2 Processor User’s Manual) [3] . . . . . . . . . . . . . . . . . . . 17<br />
2.3 Aufbau des AMBA-Bus-Systems im TSN . . . . . . . . . . . . . . . . . . . . 17<br />
2.4 Verwendung eines AES-Blocks mit einem memory-like Interface . . . . . . 19<br />
2.5 Schlüsseladdition für 128 Bit . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
2.6 Schematischer Aufbau der AES-Implementierung . . . . . . . . . . . . . . . 24<br />
2.7 Spaltenweise Generierung des nächsten Rundenschlüssels . . . . . . . . . 26<br />
2.8 Da das Ergebnis einer Multiplikation länger als die maximale Feldlänge ist,<br />
benötigt man einen Reduktionsschritt, der das Ergebnis innerhalb des Feldes<br />
reduziert. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
2.9 Blockschaltbild des 233-Bit-ECC-Beschleunigers. Ein 233 Bit breiter, von<br />
einer Controller-Einheit kontrollierter Bus verbindet die Rechen- und Registereinheiten.<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
2.10 Resultate der verschiedenen ECC-Beschleuniger-Schaltungen. Die Balken<br />
zeigen die benutzte Siliziumfläche. Die Linien entsprechen dem Energieverbrauch.<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
2.11 Ablauf der Signatur mit Hilfe von Soft- und Hardware . . . . . . . . . . . . . 33<br />
2.12 Blockschaltbild des SHA-1-Moduls . . . . . . . . . . . . . . . . . . . . . . . 37<br />
2.13 Gehäuse des TSN vom Typ QFP128 . . . . . . . . . . . . . . . . . . . . . . 40<br />
2.14 Test eines entwickelten Hardware-Modells . . . . . . . . . . . . . . . . . . . 41<br />
2.15 Layout des TSN-Chip nach der Verdrahtung. Insbesondere die Verdrahtung<br />
auf den beiden obersten Metallebenen (hier: gelb und braun) treten hervor 41<br />
2.16 Analyse der Leistungsaufnahme des Gesamtsystems (rot) sowie selektierter<br />
Einzelkomponenten. Der grüne Plot zeigt exemplarisch den deutlich erhöhten<br />
Stromverbrauch des ECC-Beschleunigers in seiner Aktivitätsphase. 43<br />
3.1 eCos-Systemarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
4.1 Softwarearchitektur des TSN . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />
4.2 SPI Chip Select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />
4.3 Die Protokollstapel des TSN . . . . . . . . . . . . . . . . . . . . . . . . . . . 65<br />
4.4 Zustandsautomat der Sensorüberwachung . . . . . . . . . . . . . . . . . . 71<br />
4.5 Management der TSN Threads . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
6.1 Auswirkung von Fehlern in Betriebssystemen ohne Security Compartments 79<br />
6.2 Schutz von Betriebssystemkomponenten durch Security Compartments . . 79
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
6.3 Aufteilung von Diensten und Services in monolithischen und µKern-Betriebssystemen<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
6.4 Integration des Sicherheitsmoduls in den Trusted Sensor Node (TSN) . . . 83<br />
6.5 Trusted Boot eines L4-basierten Systems mit Signatur-basierter Modulauthentifizierung<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />
6.6 Kryptographisch gesichertes Programmcode Update . . . . . . . . . . . . . 87<br />
6.7 Kategorisierung der Ansätze zur Verbesserung der TCP-Performanz in heterogenen<br />
Netzwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />
6.8 Anzahl der in den drahtlosen Kanal gesendeten Bytes in Abhängigkeit von<br />
der Anzahl der Übertragungswiederholungen im Medium Access Control<br />
(MAC) und der Bitfehlerrate (BER) . . . . . . . . . . . . . . . . . . . . . . . 95<br />
6.9 Datenrate in Abhängigkeit von der Paketgröße auf MAC bzw. Transmission<br />
Control Protocol (TCP) Ebene, und der Bitfehlerrate (BER) . . . . . . . . . 96<br />
6.10 Clockgating-Controller bestehend aus Latch und OR-Gatter . . . . . . . . . 97<br />
6.11 Finite-State-Machine mit 5 Zuständen . . . . . . . . . . . . . . . . . . . . . 98<br />
6.12 Zunahme der Leckströme bei Verkleinerung der Strukturgröße[1] . . . . . . 98<br />
6.13 Darstellung eines Power-Gating-Controllers . . . . . . . . . . . . . . . . . . 99<br />
6.14 Darstellung einer Power-Gating Architektur . . . . . . . . . . . . . . . . . . 99<br />
6.15 Veränderte Anbindung der kryptografischen Komponenten zwischen Memory-<br />
Controller und Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100<br />
6.16 BGA-Gehäuse (Unterseite) . . . . . . . . . . . . . . . . . . . . . . . . . . . 105<br />
6.17 TSN in einem offenen PQFP-128-Gehäuse . . . . . . . . . . . . . . . . . . 106<br />
6.18 Trägerplatine mit aufgebondeten ASICs . . . . . . . . . . . . . . . . . . . . 107<br />
6.19 Chip in einem BGA-Gehäuse . . . . . . . . . . . . . . . . . . . . . . . . . . 107<br />
6.20 Trägerplatine mit teilweise vergossenen Kondensatoren . . . . . . . . . . . 108<br />
6.21 Anbindung der Authentifizierungskomponente in den TSN . . . . . . . . . . 108<br />
6.22 Authentifizierung des Nutzers am TSN, um Man-In-The-Middle Attacken zu<br />
vermeiden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
6.23 Authentifizierung zwischen Nutzer und TSN zum Start einer neuen Session<br />
mit Schutz Replay-Attacken . . . . . . . . . . . . . . . . . . . . . . . . . . . 110<br />
10
Listings<br />
2.1 Beispielcode zum Ansprechen des AES am Memory-Controller . . . . . . . 22<br />
2.2 Unterfunktionen f und K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
2.3 Der Algorithmus von G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
3.1 Package–Verzeichnisbaum . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
3.2 Package–Defintion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
3.3 Package–Registration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
3.4 Device Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
3.5 Device IO Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51<br />
3.6 Application Skeleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55<br />
5.1 Code für maximalen Datendurchsatz des AES . . . . . . . . . . . . . . . . 74<br />
6.1 Schreibbefehl für die Verschlüsselung von Daten mit expliziten Adressen . 101<br />
6.2 Schreibbefehl für die Verschlüsselung von Daten auf eine Adresse . . . . . 101
1 Einleitung<br />
Drahtlose Sensornetze werden heute in vielen Bereichen, wie zum Beispiel der Industrieautomatisierung,<br />
Umweltdatenerfassung und Überwachung von Infrastrukturen eingesetzt.<br />
Aus Gründen des Schutzes vor Ausspähung von Betriebsgeheimnissen, Manipulation und<br />
Sabotage von Anlagen, zum Beispiel im Bereich der biologischen und chemischen Prozesstechnologie,<br />
aber auch im Bereich der Homeland Security, werden hohe Sicherheitsanforderungen<br />
an drahtlose Sensorknoten gestellt. Insbesondere die Verwendung des Mediums<br />
Luft macht diese Geräte leicht angreifbar, da kein physikalischer Zugang für das<br />
Abhören oder die Manipulation der Daten und Geräte benötigt wird. Dem Einsatz starker<br />
kryptographischer Mechanismen stehen jedoch im Regelfall die begrenzten Ressourcen<br />
der drahtlosen Sensorknoten entgegen.<br />
Im Rahmen des Projekts „Trusted Sensor Node“ (TSN) sollte ein vertrauenswürdiger Sensorknoten<br />
für das Bundesamt für Sicherheit in der Informationstechnik (BSI) entwickelt<br />
werden. Dieser Knoten fungiert als Bridge zwischen „einfachen“ Sensorknoten, die der<br />
Detektion von Ereignissen dienen, und einer Datensenke. Für die Kommunikation im Sensornetzwerk<br />
wird IEEE 802.15.4 eingesetzt. Die Kommunikation mit der Datensenke erfolgt<br />
auf Basis der Bluetooth-Technologie. Dieser TSN soll zudem die erste vertrauenswürdige<br />
Instanz in der Netzwerktopologie bilden. Deshalb wurde eine Unterstützung starker kryptographischer<br />
Verfahren durch entsprechende Hardwarebeschleuniger vorgesehen.<br />
IEEE 802.15.4<br />
iSense<br />
iSense<br />
IEEE 802.15.1<br />
TSN<br />
iSense<br />
Basestation<br />
iSense<br />
iSense<br />
Abbildung 1.1: Anwendungsbeispiel des TSN
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
1.1 Beschreibung des Gesamtsystems<br />
Der TSN-Knoten setzt sich zusammen aus einem Singlechip, welcher aus einem Prozessor<br />
und den Hardwarebeschleunigern besteht und den externen Komponenten wie Funkmodulen<br />
und zusätzlichem Speicher, die auf dem Board mit dem Core kombiniert werden.<br />
Der Knoten fungiert als Bridge zwischen Bluetooth und IEEE 802.15.4 (siehe Abbildung<br />
1.1). Um dies zu ermöglichen, muss der TSN mit zwei unterschiedlichen externen Radiomodulen<br />
ausgestattet sein. Neben diesen Funkmodulen müssen auch Sensoren und<br />
zusätzliche Speicher (RAM, Flash) an den TSN angeschlossen werden. Die notwendigen<br />
Schnittstellen sind in den TSN integriert. Das Blockschaltbild in Abbildung 2.1 verdeutlicht<br />
den Aufbau des Sensorknotens.<br />
Um die Sicherheitsanforderungen erfüllen zu können wurde der TSN abweichend vom<br />
LEON2-Referenz-Design [1] um Co-Prozessoren für AES, SHA-1/PRNG sowie ECC erweitert.<br />
Sie werden zum Ver- und Entschlüsseln von Daten sowie zur Signierung von<br />
Nachrichten eingesetzt. Die Zusatzmodule dienen somit einer sicheren Verarbeitung und<br />
Übertragung von Daten.<br />
Für die Anbindung externer Sensoren steht der Serial Peripheral Interface (SPI)-Master zur<br />
Verfügung. An diesen können bis zu drei SPI-Slave-Komponenten angeschlossen werden.<br />
Die vorgesehenen Radiomodule werden über zwei UART-Schnittstellen mit dem System<br />
verbunden. Der externe Speicher wird direkt an den Memory Controller angeschlossen.<br />
Tabelle 1.1 zeigt die Systemeigenschaften des TSN-ASICs. Er wird mit der IHP-eigenen<br />
0,25-µm-Technologie gefertigt.<br />
Fläche 30mm 2<br />
Signalpins 87<br />
Powerpins 24<br />
BIST/Scan-Ports 5<br />
Cache<br />
2x4kByte<br />
Maximale Taktfrequenz 16 MHz<br />
Corespannung 2,5 V<br />
Padspannung<br />
3,3 V<br />
Tabelle 1.1: Eigenschaften des TSN<br />
14
2 Hardware<br />
2.1 Beschreibung der Teilkomponenten<br />
Wie im Blockschaltbild (siehe Abbildung 2.1) zu erkennen ist, setzt sich der TSN aus verschiedenen<br />
Hardwarekomponenten zusammen. Diese werden in diesem Kapitel genauer<br />
erläutert.<br />
Programming<br />
Interface<br />
Sensors<br />
802.15.4<br />
Module<br />
D-Cache<br />
I-Cache<br />
Scanchain<br />
DSU<br />
SPI<br />
(Master)<br />
UART<br />
Bluetooth<br />
Module<br />
LEON2<br />
Processor<br />
Core<br />
AMBA AHB<br />
Bridge<br />
(Master)<br />
AMBA APB<br />
Memory Controller<br />
Intr<br />
Ctrl<br />
Timer<br />
GPIO<br />
Sensors<br />
AES<br />
ECC<br />
SHA1<br />
PRNG<br />
Flash<br />
RAM<br />
Abbildung 2.1: Blockschaltbild des TSN<br />
2.2 LEON2<br />
Das Herz des TSN bildet der LEON2, ein 32-Bit-RISC-Prozessor. Der Chip ist als VHDL-<br />
Modell von Gaisler Research [2] entwickelt worden und steht als „Open Source“-Komponente<br />
unter der Lesser GNU Public License (LGPL) [31] zur Verfügung.<br />
Als Grundlage dient die SPARC-V8-Architektur, die in IEEE 1754 beschrieben ist. Der Chip<br />
enthält separate Befehls- und Datencaches, Interrupt-Controller, Timer, Debug-Unterstüt-
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
zung und ein einfaches Powermanagement. Als zentrales Bussystem dient der AMBA-Bus<br />
[4], über den auch zusätzliche Peripherie angeschlossen werden kann.<br />
Der LEON2 besitzt eine fünfstufige Pipeline für die Befehlsverarbeitung (siehe Abbildung<br />
2.2) und in der vorliegenden Konfiguration einen Satz von 8 Register-Windows. Die Instruktions-Pipeline<br />
ist folgendermaßen aufgebaut:<br />
• Stufe 1: Instruktion holen (Fetch)<br />
Instruktion aus dem Instruktionscache oder über den Memory-Controller aus dem<br />
Speicher holen.<br />
• Stufe 2: Instruktion dekodieren (Decode)<br />
Instruktion wird dekodiert und die Operanden werden aus dem entsprechenden Register-Window<br />
gelesen.<br />
• Stufe 3: Instruktion ausführen (Execute)<br />
Operation der Arithmetisch-Logischen Einheit wird ausgeführt.<br />
• Stufe 4: Speicherzugriff (Memory)<br />
Ergebnisse aus der Stufe 3 werden in den Datencache zurückgeschrieben.<br />
• Stufe 5: Schreiben (Write)<br />
Ergebnisse der Operationen aus Stufe 3 werden in entsprechende Register-Windows<br />
zurückgeschrieben.<br />
Unter der Voraussetzung, dass sich die nötigen Daten im Cache befinden, wird ein Großteil<br />
der Instruktionen in einem Clockzyklus abgearbeitet. Ausgenommen hiervon sind die<br />
Jump-, Load- und Store-Operationen.<br />
In der Konfiguration des LEON2 besteht die Möglichkeit, einen Hardwaremultiplizierer in<br />
das Design zu integrieren. Dadurch werden die Multiplikationsoperationen beschleunigt.<br />
Die hierdurch beschleunigten Operationen würden, falls überhaupt, als Teil der kryptographischen<br />
Operationen benötigt. Da für diese bereits Hardwarebeschleuniger vorgesehen<br />
sind, wurde zur Minimierung der Chipfläche auf die Integration eines solchen Multiplizierers<br />
verzichtet.<br />
2.3 AMBA<br />
Der Advanced Microcontroller Bus Architecture (AMBA)-Bus wird zur Kommunikation der<br />
Komponenten auf einem Application Specific Integrated Circuit (ASIC) verwendet [4]. Er<br />
besteht in der Regel aus zwei Untersystemen, dem Advanced High-performance Bus<br />
(AHB) und dem Advanced Peripheral Bus (APB).<br />
Der AHB wird verwendet, um Komponenten mit hohen Datentransferraten zu verbinden.<br />
Prozessor, Speicher sowie gegebenenfalls Co-Prozessoren sind über diesen schnellen<br />
Datenbus angebunden.<br />
16
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 2.2: Grafische Darstellung der fünfstufigen Pipeline des LEON2<br />
(entnommen aus LEON2 Processor User’s Manual) [3]<br />
Der APB hingegen ist auf Energieeffizienz optimiert und besonders geeignet, langsame<br />
Peripherie, wie z.B. serielle Schnittstellen, in das System zu integrieren. Der AHB und der<br />
APB sind über eine Bridge miteinander verbunden. Durch das Hinzufügen des APB bleibt<br />
die hohe Leistungsfähigkeit des AMBA-Busses auch im Fall des Zugriffs auf langsame<br />
Komponenten erhalten.<br />
Der AHB im TSN (siehe Abbildung 2.3) enthält einen AHB-Master mit dem LEON2-Prozessor<br />
und zwei AHB-Slaves, den Memory-Controller sowie die APB-Bridge. Ein AHB-Master<br />
kann einen Zugriff auf den AHB initialisieren, während ein AHB-Slave nur auf Transaktionen<br />
(Lese- oder Schreibbefehl) reagieren kann.<br />
Prozessor mit<br />
Pipeline<br />
D-Cache I-Cache<br />
AHB-Master<br />
AHB<br />
AHB/APB-Bridge<br />
(AHB-Slave)<br />
Memory-Controller<br />
(AHB-Slave)<br />
UART<br />
SPI<br />
Abbildung 2.3: Aufbau des AMBA-Bus-Systems im TSN<br />
17
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
2.4 Konfigurationsregister<br />
Am APB sind die Konfigurations- und teilweise auch die Datenregister der Komponenten<br />
angeschlossen. Dazu gehören die Register für den Memory-Controller, für UART, SPI,<br />
PIO, Timer und den Interrupt-Controller.<br />
2.5 Memory-Controller und Integration der<br />
Hardwarebeschleuniger<br />
Der Memory-Controller übernimmt die wesentliche Aufgabe, alle Zugriffe auf die Speicherelemente<br />
zu koordinieren und durchzuführen. Das umfasst als Speicher- und speicherähnliche<br />
Elemente den Flash, den memory-mapped I/O sowie den SRAM.<br />
Unter „memory-mapped I/O“ versteht man den Zugriff auf Blöcke, die zwar ein Interface<br />
wie ein Speicher besitzen, dessen Funktionalität jedoch eine andere ist (z.B. Co-Prozessor<br />
zur Datenverarbeitung). Der I/O-Bereich wird so in den Arbeitsspeicher eingeblendet.<br />
Man kann ein neues Hardwaremodul mit einem proprietären Interface ausstatten, das von<br />
der jeweiligen Funktion der Hardwarekomponente bestimmt wird. Für den AES könnte<br />
das zum Beispiel bedeuten, dass die Schnittstelle einen Eingang für Clock und Reset<br />
sowie Eingänge mit einer Breite von 128 Bit für die Daten und weiteren 128 Bit für den<br />
Schlüssel hat. Der Ausgang für die Daten wäre ebenso 128 Bit breit. Dieses, zunächst<br />
nahe liegende, Interface ist jedoch nicht brauchbar, da es keine passende Hardware gibt,<br />
an die die Komponente angeschlossen werden kann.<br />
Es muss also ein etwas höherer Aufwand betrieben werden, um die neue Komponente mit<br />
der gleichen Schnittstelle wie von Speicherblöcken auszustatten. Diese Art der Schnittstelle<br />
wird „memory-like Interface“ genannt. Durch das vergleichsweise einfach ausgeführte<br />
Interface eines Speichers (Clock, Daten- und Adressbus, Read- und Write-Enable) ist<br />
diese Art der Anbindung weit verbreitet. Daher wurde für den AES, SHA-1 und den ECC<br />
ein solches Interface gewählt (siehe Abbildung 2.4). Prinzipiell ließen sich die Komponenten<br />
auch als SRAM anschließen. Das hat jedoch den Nachteil, dass dieser „cacheable“<br />
ist und somit oftmals bei Lesevorgängen auf den Cache zugegriffen wird anstelle eines<br />
direkten Lesezugriffs. Der Cache enthält an dieser Stelle jedoch veraltete Daten, da der<br />
Co-Prozessor die Daten modifiziert hat. So werden falsche Ergebnisse zurück geliefert.<br />
Mit der Verwendung von memory-mapped I/O wird das Problem vollständig umgangen.<br />
In der Ausgangskonfiguration erlaubt der LEON2 die Anbindung einer Komponente an<br />
den memory-mapped I/O. Dieses ist für den TSN nicht ausreichen, da AES, ECC und<br />
SHA-1 angeschlossen werden muss. Durch die Aufteilung des Adressbereich für memorymapped<br />
I/O in drei Unterbereiche wird der Anschluß aller Komponenten ermöglicht.<br />
Während memory-mapped I/O den nicht gepufferten Zugriff mittels Memory-Controller auf<br />
die Komponente meint, ist das memory-like Interface die Beschreibung der Schnittstelle.<br />
18
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Zu Konfigurationszwecken besitzt der Memory-Controller drei Konfigurationsregister. Mit<br />
dessen Hilfe werden die Wortbreite (8, 16 oder 32 Bit), Zugriffszeiten sowie Speichergrößen<br />
definiert. Alle Signale liegen jederzeit an den angeschlossenen Komponenten an. Einzige<br />
Ausnahme bildet hierbei das „Chip-Select“-Signal, welches exklusiv für jede Komponente<br />
ist. Anhand dieses Signals erkennt das Modul, ob es angesprochen wird. Unabhängig<br />
vom Memory-Controller agiert der Cache, welcher direkt mit dem Prozessor verbunden<br />
ist.<br />
CHIP_SELECT<br />
CLOCK<br />
Memory-Controller<br />
RESET<br />
WRITE<br />
RAM<br />
DATA_OUT<br />
ADDR<br />
DATA_IN<br />
AMBA-Bus<br />
AES<br />
DATA_OUT<br />
LEON2<br />
CHIP_SELECT<br />
Abbildung 2.4: Verwendung eines AES-Blocks mit einem memory-like Interface<br />
2.6 Speicher<br />
Der TSN verfügt über verschiedenartige Speicher. Der 4-KByte-Befehlscache und der 4-<br />
KByte-Datencache beschleunigen das System durch ihre direkte Anbindung an den Prozessor.<br />
Der TSN ist mit RAM ausgestattet, der auf dem Board untergebracht ist. Dessen<br />
Größe ist variabel zwischen 16 Kilobyte und 16 Megabyte. Derzeit ist das Board mit einem<br />
2-Megabyte-Modul bestückt.<br />
Der RAM ist über den Memory-Controller mit einer Wortbreite von 32 Bit an den schnellen<br />
AMBA-AHB-Bus angeschlossen. Zur Minimierung der Chipfläche wurde nur der Cache in<br />
den Chip integriert. Durch die Art der Ausführung des Memory-Controllers ist sichergestellt,<br />
dass der Zugriff auf den externen RAM genauso schnell ist, wie auf dem internen<br />
RAM. Aufgrund der beschränkten Anzahl an I/O-Pins (siehe Abschnitt 2.17) kann der externe<br />
Speicher nur mit 16 Bit Wortbreite angesprochen werden, so dass für das Schreiben<br />
und Lesen eines 32-Bit-Wortes jeweils zwei Zugriffe stattfinden müssen. Durch die Verwendung<br />
von Cache wird der Geschwindigkeitsnachteil im laufenden Betrieb so weit wie<br />
möglich kompensiert werden.<br />
Ein sicherer Speicher ist in der vorliegenden Entwicklungsstufe nicht das Entwurfsziel, da<br />
zunächst die Gesamtarchitektur des Systems geprüft werden soll. Um in späteren Entwicklungsstadien<br />
einen sicheren Speicher zu realisieren, genügt es nicht, den Speicher<br />
vollständig on-Chip auszuführen. Er wird vielmehr dadurch erreicht, dass alle Daten verschlüsselt<br />
abgelegt werden. Dies ist notwendig, um eine Abfrage des internen Speichers<br />
19
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
durch physikalische Angriffe zu verhindern. RAM-Strukturen sind besonders problematisch,<br />
da die Speicherelemente in einem gefertigten Design sehr gut zu identifizieren und,<br />
mit der richtigen Technik auch auslesbar sind.<br />
Eine Komponente zur Ansteuerung eines sicheren Speichers ermöglicht es auch, externen<br />
Speicher „sicher“ anzuschließen und lässt somit genügend Spielraum für die Speichererweiterung.<br />
2.7 Parallel I/O-Port<br />
Der Parallel I/O-Port ist ein bitweise programmierbarer I/O-Port (PIO). In der Basiskonfiguration<br />
des LEON2 werden alle 32 Bit nach außen geführt. Dabei werden die Pins für die<br />
Ports 0 bis 15 mit den UART-Ports sowie Konfigurationspins für den Bootvorgang geteilt<br />
um Pins einzusparen. Über ein Konfigurationsregister wird die jeweils gewünschte Funktion<br />
ausgewählt, also als Eingang oder Ausgang. Für den Fall, dass der Pin als Eingang<br />
agiert, kann der Wert, der am Pin von außen anliegt, über ein Register abgefragt werden.<br />
Ist der Pin als Ausgang konfiguriert, so muss der Wert am Ausgang gesetzt werden<br />
(logisch „0“ oder „1“).<br />
Durch das mögliche bitweise Ansprechen der Datenpins ist es auch möglich, Kommunikationsprotokolle<br />
in Software nachzubilden. Zum Beispiel sieht die aktuelle Umsetzung des<br />
TSN kein Modul für die I 2 C-Schnittstelle vor. Sollte sich die Notwendigkeit einer solchen<br />
ergeben, wird diese in Software, zu Lasten der gesamten Systemperformance, abgearbeitet.<br />
2.8 UART<br />
Die beiden Universal Asynchronous Receiver Transmitter (UART)-Komponenten sind Bestandteil<br />
des LEON2-Prozessors. Um Pins am Prozessor zu sparen, teilen sich die UARTs<br />
ihre Anschlüsse mit einigen PIO-Pins.<br />
Für die Datenübertragung muss der UART, der direkt an den APB angeschlossen ist, konfiguriert<br />
werden. Dabei können der UART-Takt, die Übertragungsrichtung und zahlreiche<br />
Sicherungsmechanismen eingestellt werden. Um Daten übertragen zu können, müssen<br />
diese in die entsprechenden Register geschrieben werden.<br />
Getestet wurden die UART-Schnittstellen, indem beide miteinander verbunden wurden.<br />
Abwechselnd wurden sie als Sender und Empfänger konfiguriert und Datenübertragungen<br />
initiiert.<br />
20
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
2.9 DSU<br />
Die Debug Support Unit (DSU) unterstützt die Fehlersuche und den Test des Systems.<br />
Sie ist integraler Bestandteil des LEON2-Prozessors und mit dem AMBA-AHB verbunden.<br />
Dies ermöglicht, den TSN in einen Debugmodus zu versetzen. Dabei wird der Prozessor<br />
angehalten, um Daten an jeder beliebigen Adresse lesen und schreiben zu können.<br />
2.10 Interrupt-Controller<br />
Der Interrupt-Controller dient als zentrale Instanz zur Signalisierung von Ausnahmezuständen.<br />
Ein Ausnahmezustand kann z. B. sein, dass in einem UART-Block Daten zur Abholung<br />
bereitstehen. Solange die CPU diese Daten nicht ausgelesen hat, können keine weiteren<br />
Daten empfangen werden. Daher ist es notwendig, die CPU über den Erhalt dieser Daten<br />
zu informieren und eine zügige Abarbeitung zu forcieren. Diese erfolgt durch das Auslösen<br />
eines Interrupts. Mittels des Interrupt-Controllers kann die CPU auswerten, welche<br />
Komponente den Interrupt ausgelöst hat und wie der Ausnahmezustand zu behandeln ist.<br />
2.11 Timer<br />
Die Timerkomponente besteht aus einem Prescaler und zwei Timern. Der Prescaler dient<br />
dazu, den Takt der Systemclock zu reduzieren. Die Timer dekrementieren einen vorher<br />
festgelegten Wert. Erreicht ein Timer den Wert „Null“, so wird mit Hilfe des Interrupt-<br />
Controllers ein Interrupt ausgelöst, den der Prozessor entsprechend beantworten muss.<br />
Dafür setzt der Prozessor zunächst den Interrupt zurück und signalisiert, dass der Interrupt<br />
bearbeitet wird. Anschließend wird eine vom Programmierer vorgegebene Softwareroutine<br />
abgearbeitet.<br />
2.12 Memory-Like Interface<br />
Die Schnittstellen des Advanced Encryption Standard (AES), Elliptic Curve Cryptography<br />
(ECC) und Secure Hash Algorithmus 1 (SHA-1) sind so ausgelegt, dass sie an den<br />
Memory-Controller angeschlossen werden können (siehe Tabelle 2.1).<br />
Das Listing 2.1 zeigt einen Beispielcode wie ein AES mit einem memory-like Interface<br />
in Software angesprochen wird. Die Funktion „writeReg“ hat als erstes Argument den zu<br />
schreibenden Wert und als zweites die Zieladresse. Es werden keine gesonderte Compilerbefehle<br />
benötigt, so dass auch keine Veränderungen am Compiler vorgenommen werden<br />
müssen.<br />
21
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
RESETN<br />
CLK<br />
CE<br />
OEN<br />
WE<br />
A [15 ... 0]<br />
d_in[31 ... 0]<br />
d_out[31 ... 0]<br />
ist ein low-aktiver Eingang. Es setzt das Modul zurück, in dem es die<br />
Register mit dem Startwert „0“ belegt. Die State-Machine geht in den<br />
Startzustand.<br />
ist der Eingang für das externe Taktsignal.<br />
ist ein low-aktiver Eingang. Er selektiert und aktiviert die Komponente.<br />
ist ein low-aktiver Eingang. Er wird während eines Lesezyklus auf aktiv<br />
gesetzt.<br />
ist der low-aktive Eingang, der einen Schreibzugriff signalisiert.<br />
ist der Adressbus. Dieser Eingang beinhaltet die Adressen der verschiedenen<br />
Register.<br />
ist ein 32 Bit Dateneingang. Er enthält die Daten, die in die adressierten<br />
Register geschrieben werden sollen.<br />
ist ein Datenausgang, der die Daten beinhaltet, die aus den Registern<br />
gelesen werden.<br />
Tabelle 2.1: Signale eines Memory-Like Interface<br />
// AES base address<br />
#define AESBASE 0x20200000 //memory mapped IO<br />
//Write key<br />
writeReg(0x2b7e1516, AESBASE + KEYBASE + 0);<br />
writeReg(0x28aed2a6, AESBASE + KEYBASE + 1);<br />
writeReg(0xabf71588, AESBASE + KEYBASE + 2);<br />
writeReg(0x09cf4f3c, AESBASE + KEYBASE + 3);<br />
writeReg(0x3243f6a8, AESBASE + DATABASE + ENCRYPTION + 0);<br />
writeReg(0x885a308d, AESBASE + DATABASE + ENCRYPTION + 0);<br />
writeReg(0x313198a2, AESBASE + DATABASE + ENCRYPTION + 0);<br />
writeReg(0xe0370734, AESBASE + DATABASE + ENCRYPTION + 0);<br />
//Wait 77 Clock cycles or for interrupt<br />
//READ_OUT<br />
Listing 2.1: Beispielcode zum Ansprechen des AES am Memory-Controller<br />
2.13 AES<br />
In symmetrischen Verschlüsselungsverfahren wird sowohl zur Verschlüsselung als auch<br />
zur Entschlüsselung der gleiche geheime Schlüssel benutzt. Ist einem Dritten dieser Schlüssel<br />
bekannt, so kann dieser den Kommunikationsprozess abhören und selbst verschlüsselte<br />
Datenpakete in Umlauf bringen. Ein bekanntes Beispiel für symmetrische Verschlüsselungsverfahren<br />
ist der DES-Algorithmus. Dieser wurde 2001 durch den AES abgelöst.<br />
Am häufigsten wird derzeit die 128-Bit-Version im Electronic Code Book (ECB)-Modus genutzt.<br />
Der ECB-Modus ist nicht rückgekoppelt, d.h. es wird jeder Datenblock unabhängig<br />
von anderen verarbeitet. So ist ein wahlfreier Zugriff auf verschlüsselte Blöcke möglich.<br />
Nachteilig ist, dass so gleiche Eingangsdaten zu gleichen Ausgangsdaten führen. Es gibt<br />
Anwendungsfälle, in denen der ECB-Modus nicht vermieden werden kann. Gehen z.B. in<br />
einem rückgekoppelten Modus wie Cipher Block Chaining (CBC) Datenpakete verloren, so<br />
22
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
ist das nachfolgende Datenpaket nicht mehr zu entschlüsseln. Insbesondere bei unzuverlässigen<br />
Verbindungen (wie Funk) ist daher der CBC-Modus nicht geeignet. In Systemen,<br />
die neben dem AES über eine CPU verfügen, können rückgekoppelte Modi so nachgebildet<br />
werden, dass zunächst die Verschlüsselung im AES-Coprozessor durchgeführt wird<br />
und anschließend die Operationen zur Rückkopplung in Software ausgeführt werden.<br />
2.13.1 Arithmetische Grundlagen<br />
Der Advanced Encryption Standard (AES) ist ein symmetrisches Verschlüsselungsverfahren.<br />
Im Gegensatz zu Stromchiffren, welche bit- oder byteorientiert arbeiten, werden beim<br />
AES jeweils Blöcke von 128 Bit (16 Byte) der Ver- oder Entschlüsselung unterzogen. Daher<br />
ist der AES eine Blockchiffre. Ein Datenblock wird in einer Matrix mit 4x4 Byte angeordnet<br />
(siehe Formel 2.1).<br />
⎡<br />
⎤<br />
32 88 31 e0<br />
3243f68a885a308d313198a2e0370734 ⇒ ⎢43 5a 31 37<br />
⎥<br />
⎣f6 30 98 07⎦ (2.1)<br />
8a 8d a2 34<br />
Nicht in jedem Fall wird die Länge eines zu verschlüsselnden Datenblocks (in Bit) einem<br />
ganzzahligen Vielfachen von 128 entsprechen. Hier müssen höhere Schichten durch die<br />
Auswahl geeigneter Padding-Algorithmen die tatsächliche Datenlänge an die geforderte<br />
Datenlänge anpassen.<br />
Durch das National Institute of Standards and Technology (NIST) [37] ist die Datenblocklänge<br />
von 128 Bit bei Schlüssellängen von 128, 192 sowie 256 Bit standardisiert. Dazu<br />
kommen Modi, die eine Kopplung zwischen verschiedenen Datenblöcken ermöglichen.<br />
Diese verhindern Attacken, bei denen einzelne Datenblöcke durch den Angreifer ausgetauscht<br />
werden. Ein grundlegender Unterschied zwischen den Versionen mit unterschiedlichen<br />
Schlüssellängen besteht in der Anwendung des Rundenschlüssels auf die Daten.<br />
Unabhängig von der Länge des Eingangsschlüssels werden in jeder AddKey-Operation<br />
der 128 Bit lange Datenblock mit einem 128 Bit langen Schlüsselteil verknüpft (siehe Abbildung<br />
2.5).<br />
Während für einen 128-Bit-Schlüssel jeweils der komplette Rundenschlüssel auf die 128<br />
Bit Daten angewendet wird, wird die Anwendung des 256-Bit-Schlüssels auf zwei Verarbeitungsrunden<br />
aufgeteilt. Bei jeder dieser Runden werden 128 Bit als Teilschlüssel verwendet.<br />
Ähnlich verhält es sich mit dem 192-Bit-Schlüssel. Die ersten 128 Bit des Rundenschlüssels<br />
werden auf die 128 Bit Daten angewandt. In der folgenden Runde wird<br />
zunächst aus dem Schlüssel der nächste Rundenschlüssel erzeugt. Anschließend werden<br />
die verbleibenden 64 Bit aus dem Initialschlüssel und die 64 Bit aus dem erzeugten<br />
Rundenschlüssel zusammen auf den 128-Bit-Datenblock angewendet. Aufgrund der Überlappungen<br />
eines Schlüssels auf mehrere Runden wird bei der Schlüssellänge von 192 Bit<br />
die Rundenzahl auf 12 und bei einem 256-Bit-Schlüssel auf 14 erhöht.<br />
23
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
128 Bit Datenpfad<br />
Runde n<br />
128 Bit<br />
128 Bit<br />
XOR<br />
Abbildung 2.5: Schlüsseladdition für 128 Bit<br />
Input key<br />
Calc<br />
key<br />
10 Rounds<br />
xor<br />
S-Box<br />
Shift<br />
row<br />
Mix<br />
Column<br />
Input data<br />
Output data<br />
Abbildung 2.6: Schematischer Aufbau der AES-Implementierung<br />
2.13.2 Algorithmusbeschreibung des AES<br />
Die Abbildung 2.6 zeigt schematisch den Ablauf der Verschlüsselung. Der Algorithmus wird<br />
für einen 128-Bit-Schlüssel in elf Runden auf die Daten angewendet. Jede dieser Runden<br />
besteht aus mehreren Teilschritten, wobei jeweils in der ersten und in der letzten Runde<br />
nicht alle Teilschritte ausgeführt werden. In den Beschreibungen der Teilschritte werden<br />
die Zeilen mit i (0 bis 3) sowie die Spalten mit j (0 bis 3) gekennzeichnet.<br />
• 1. Runde<br />
data=AddKey(data, key)<br />
• 2. Runde bis 10. Runde<br />
data=S-Box(data)<br />
data=ShiftRow(data)<br />
data=MixColumn(data)<br />
data=AddKey(data, key)<br />
• 11. Runde<br />
data=S-Box(data)<br />
data=ShiftRow(data)<br />
data=AddKey(data, key)<br />
24
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
AddKey<br />
Die Schlüsseladdition wird durch eine binäre XOR-Operation ausgeführt.<br />
S-Box Die Substitutions-Box (S-Box) ist eine nichtlineare Abbildung eines Bytes auf ein<br />
anderes. Dazu wird vom Eingangswert x in GF(2 8 ) das multiplikative Inverse x −1 (in Formel<br />
2.2 gilt: x −1 entspricht z0 bis z7) gebildet. Anschließend wird eine Matrixmultiplikation<br />
mit der vorgegebenen Matrix c ausgeführt und der Vektor (11000110) addiert (siehe Formel<br />
2.2). Die Ausführung der S-Box ist so gewählt, dass kein Bytewert auf sich selbst<br />
abgebildet wird, da dies ein potentieller Ansatzpunkt für Kryptoanalysen wäre. Da die S-<br />
Box-Transformation jeweils auf ein Byte angewendet wird, sind 16 dieser Transformationen<br />
pro Runde notwendig.<br />
⎡ ⎤ ⎡<br />
⎤ ⎡ ⎤ ⎡ ⎤<br />
y0 1 0 0 0 1 1 1 1 z0 1<br />
y1<br />
1 1 0 0 0 1 1 1<br />
z1<br />
1<br />
y2<br />
1 1 1 0 0 0 1 1<br />
z2<br />
0<br />
y3<br />
y4<br />
=<br />
1 1 1 1 0 0 0 1<br />
z3<br />
1 1 1 1 1 0 0 0<br />
z4<br />
+<br />
0<br />
0<br />
⎢y5<br />
⎥ ⎢0 1 1 1 1 1 0 0<br />
⎥ ⎢z5<br />
⎥ ⎢1<br />
⎥<br />
⎣y6⎦<br />
⎣0 0 1 1 1 1 1 0⎦<br />
⎣z6⎦<br />
⎣1⎦<br />
y7 0 0 0 1 1 1 1 1 z7 0<br />
(2.2)<br />
ShiftRow Die Bytes der Matrix rotieren in Abhängigkeit von der Zeilennummer i (i = 0 bis<br />
3) um i Stellen nach links (zyklisches Shiften, siehe Formel 2.3).<br />
⎡<br />
⎤ ⎡<br />
⎤<br />
00 01 02 03 00 01 02 03<br />
⎢10 11 12 13<br />
⎥<br />
⎣20 21 22 23⎦ ⇒ ⎢11 12 13 10<br />
⎥<br />
⎣22 23 20 21⎦ (2.3)<br />
30 31 32 33 33 30 31 32<br />
MixColumn Während die S-Box-Operation sich byteweise auswirkt, ist die MixColumn-<br />
Transformation eine Interaktion zwischen den 4 Bytes einer Spalte y0, j bis y3, j für j = 0<br />
bis 3 in GF(2 8 ). Dazu wird eine Matrixmultiplikation der Spalte j (j = 0 bis 3) mit der Matrix<br />
c ausgeführt (siehe Formel 2.4).<br />
⎡ ⎤ ⎡<br />
⎤ ⎡ ⎤<br />
y0, j 02 03 01 01 z0, j<br />
⎢y1, j<br />
⎥<br />
⎣y2, j⎦ ⇐ ⎢01 02 03 01<br />
⎥ ⎢z1, j<br />
⎥<br />
⎣01 01 02 03⎦<br />
⎣z2, j⎦ ∀j ∈ [0, 1, 2, 3] (2.4)<br />
y3, j 03 01 01 02 z3, j<br />
Schlüsselexpansion In jeder der elf Runden wird ein neuer Rundenschlüssel mit der<br />
Länge von 128 Bit benötigt. Der Schlüssel wird analog zu den Eingangsdaten auf eine<br />
4x4-Byte-Matrix abgebildet. Die Generierung eines neuen Rundenschlüssels besteht aus<br />
25
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
4 Teilschritten, in denen jeweils eine Spalte mit 4 Byte erzeugt wird. Gemäß Abbildung<br />
2.7 wird die erste Spalte des Folgeschlüssels durch die Ausführung einer Funktion F, die<br />
auf der S-Box basiert, auf die Spalte 3 sowie der XOR-Verknüpfung von F mit der Spalte<br />
0 gebildet. Die drei folgenden Spalten werden durch eine Addition der vorhergehenden<br />
Spalte mit der gleiche Spalte des vorhergehenden Schlüssels berechnet.<br />
Abbildung 2.7: Spaltenweise Generierung des nächsten Rundenschlüssels<br />
2.13.3 Implementierung<br />
Die im TSN genutzte Implementierung ver- und entschlüsselt Datenblöcke mit einer Länge<br />
von 128 Bit mit einem 128 Bit langen Schlüssel im ECB-Modus und ist auf niedrige bis<br />
mittlere Datenraten optimiert. Durch das 32-Bit-Dateninterface ist es notwendig, jeweils<br />
4 Datenblöcke á 32 Bit in das AES-Modul zu schreiben, um einen vollständigen 128-Bit-<br />
Datenblock zu erhalten. Vier weitere Schreiboperationen sind erforderlich, um den Schlüssel<br />
im AES-Modul abzulegen. Insgesamt werden so theoretisch nur 8 Adressen benötigt.<br />
Der zu Verfügung stehende Adressraum ist jedoch um einiges größer und wird auch ausgenutzt,<br />
um den notwendigen Kommandoblock und die dazugehörige Schreiboperation<br />
einzusparen. Dem AES-Modul muss mitgeteilt werden, ob die Daten zur Entschlüsselung<br />
oder zur Verschlüsselung abgeliefert wurden. Die Auswahl wird mit Hilfe eines Adressbits<br />
codiert. Die Daten zur Verschlüsselung werden beginnend mit der Adresse 0x90 und die<br />
Daten zur Entschlüsselung beginnend mit Adresse 0xA0 geschrieben. Für einen Datenblock<br />
werden insgesamt 78 Clocktakte benötigt, um die Daten zu ver- oder entschlüsseln.<br />
2.14 ECC<br />
Bei asymmetrischen Verschlüsselungsverfahren wird ein Schlüsselpaar, bestehend aus einem<br />
öffentlichen und einem privaten Schlüssel, eingesetzt. Der öffentliche Schlüssel des<br />
26
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Empfängers ist frei zugänglich (z.B. über dessen Homepage) und die Daten können hiermit<br />
verschlüsselt werden. Der private Schlüssel ist geheim zu halten. Mit diesem kann<br />
die Nachricht wieder entschlüsselt werden. Aus dem öffentlichen Schlüssel kann der private<br />
Schlüssel nicht mit vernünftigem Aufwand errechnet werden, so dass verschlüsselte<br />
Nachrichten ausschließlich mit dem privaten Schlüssel zugänglich sind. Eine alternative<br />
Anwendung von asymmetrischen Verschlüsselungsverfahren ist das Unterschreiben einer<br />
Nachricht mit dem privaten Schlüssel. Mit dem entsprechenden öffentlichen Schlüssel<br />
kann dann die Echtheit dieser Signatur überprüft werden, da davon ausgegangen werden<br />
kann, dass einzig der Besitzer des privaten Schlüssels diese Nachricht so verschlüsseln<br />
beziehungsweise digital unterschreiben konnte. Ein asymmetrisches Verschlüsselungsverfahren<br />
eignet sich nicht für größere Datenmengen. Der Berechnungsaufwand für die Verschlüsselung<br />
der gleichen Datenmenge liegt mehrere Größenordnungen über dem für ein<br />
symmetrisches Verschlüsselungsverfahren.<br />
Das derzeit populärste Verfahren ist die RSA-Verschlüsselung, benannt nach den drei Erfindern<br />
Rivest, Shamir und Adleman [44]. Die Elliptic Curve Cryptography (ECC) auf Basis<br />
elliptischer Kurven ist ein modernerer alternativer Verschlüsselungsansatz. Im Vergleich<br />
zum RSA bietet der ECC-Ansatz einen gleichwertigen Sicherheitsgrad bei wesentlich kürzeren<br />
Schlüssellängen. Soll zum Beispiel die Sicherheit von verschlüsselten Daten für<br />
die nächsten 20 Jahre gewahrt sein, ist empfohlen, für RSA 2048 Bit lange Schlüssel zu<br />
nutzen. Das ECC-Verfahren erreicht den gleichen Grad an Sicherheit schon mit 233 Bit<br />
langen Schlüsseln [29]. Kürzere Schlüssel sind besonders wichtig, wenn Kryptographie<br />
auf mobilen Geräten mit wenig Speicher und begrenzter Rechenstärke eingesetzt wird.<br />
2.14.1 Arithmetische Grundlagen<br />
ECC ist ein kryptographisches Verfahren, das mit 2-dimensionalen Punkten (x, y) auf einer<br />
elliptischen Kurve arbeitet. Die x- und y-Koordinaten sind Elemente eines finiten Feldes,<br />
des so genannten Basisfeldes. Auf den Punkten dieser Kurve sind algebraische Operationen,<br />
wie die Addition zweier Punkte definiert. Die wichtigste, kryptographisch eingesetzte<br />
Operation ist die k*P-Multiplikation, bei der ein Punkt mit einer ganzen Zahl multipliziert<br />
wird. Diese Operation ist recht einfach zu berechnen. Die Umkehroperation ist allerdings<br />
nicht in polynomineller Zeit zu lösen.<br />
Für das ECC-Verfahren eignen sich zwei Arten von generellen Basisfeldern: Restklassenfelder<br />
basierend auf einer großen Primzahl (GF(p)) und Restklassenfelder basierend auf<br />
erweiterten Binärfeldern (GF(2 m )). Beide Arten gelten als sicher. Geeignete Parameter<br />
wurden bereits von Standardisierungsgremien empfohlen. Für energie- und flächeneffiziente<br />
Implementierungen in Hardware eigenen sich insbesondere die binären Kurven, da<br />
deren Arithmetik eine vereinfachte Darstellung in Hardware (GF(2 m )) erlaubt. Desweiteren<br />
sind additive Operationen einfache XOR-Operationen und benötigen daher keine Überträge.<br />
Diese Eigenschaften begründen die Entscheidung, bei dem Design binäre Felder als<br />
Basisfeld zu nutzen.<br />
ECC-Operationen nutzen intensiv Operationen des Basisfelds. Zum Beispiel benötigt eine<br />
k*P-Multiplikation in (GF(2 233 )) etwa 1500 Feldmultiplikationen. Deshalb sind genaue<br />
27
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Untersuchungen der Operationen im Basisfeld für eine effiziente ECC-Implementierung<br />
unumgänglich. Bei den Betrachtungen der mathematischen Grundlagen im Basisfeld der<br />
elliptischen Kurve stellen sich insbesondere folgende Operationen als kritisch heraus:<br />
• Feldmultiplikation<br />
• modulare Reduktion.<br />
2.14.2 Multiplizierer<br />
Die Feldmultiplikation ist die mit Abstand aufwändigste Operation im Basisfeld. Eine 256-<br />
Bit-Multiplikation benötigt zum Beispiel je über 65000 XOR- und AND-Operationen, wenn<br />
sie nach der Methode der klassischen Schulmultiplikation ausgeführt würde. In der Literatur<br />
werden verbesserte Verfahren wie die klassische Karatsuba-Multiplikation und die iterative<br />
Karatsuba-Multiplikation vorgestellt [14]. Letztere verringert vor allem die Anzahl der<br />
notwendigen AND-Operationen (auf 6561) aber kaum die Anzahl der XOR-Operationen<br />
(62000). In dem Design wird eine rekursive Anwendung der iterativen Karatsuba-Methode<br />
(RAIK) [39], die auch die Anzahl der XOR-Operationen (auf unter 43000) reduzieren<br />
kann, genutzt. Bei den rekursiven Karatsuba-Methoden wird eine Multiplikation durch kleinere<br />
Multiplikationen mit kürzerer Bitlänge ersetzt, die dann wiederum mit der Karatsuba-<br />
Methode gelöst wird. Da festgestellt wurde, dass sich für kürzere Multiplikationen mit Bitlängen<br />
von unter 8 Bit eine weitere rekursive Zerlegung nach der Karatsuba-Methode nicht<br />
positiv auf den Gesamtaufwand auswirkt, werden für diese kurzen Multiplikationen andere<br />
Verfahren angewandt. Als Beispiel sei hier die klassische Schulmultiplikation genannt,<br />
wodurch der Gesamtaufwand für rekursive Multiplikation signifikant reduziert wird. Diese<br />
theoretischen Betrachtungen der polynominellen Multiplikation sind die Basis für eine effiziente<br />
Implementierung dieser Operation in Hardware, wie sie in dem Design realisiert<br />
wurden. Der Ansatz ist detaillierter in [45] diskutiert.<br />
2.14.3 Reduktion<br />
Die zweite kritische Operation ist die Reduktion. Diese Operation muss nach jeder Feldmultiplikation<br />
ausgeführt werden. Das ist begründet durch den finiten Charakter des Basisfeldes.<br />
Die Multiplikation zweier m Bit langen Faktoren ergibt ein 2m-1 Bit langes Produkt<br />
(siehe Abbildung 2.8). Da die Elemente des Feldes genau m Bit lang sind, muss zu dem<br />
2m-1 Bit langen Element ein in dem Feld äquivalentes Element mit der Länge m berechnet<br />
werden. Ein klassisches Verfahren für diese Operation ist die Division mit Rest durch das<br />
Generatorpolynom, wobei der Rest der Division das äquivalente Element darstellt.<br />
Ähnlich wie eine Division in „normalen“ Zahlensystemen ist auch die Division in GF(2 m )<br />
sehr komplex und deshalb nach jeder Feldmultiplikation nicht sinnvoll. In der Literatur werden<br />
Verfahren beschrieben, welche die Reduktion als eine einfache Abbildung mit konstantem<br />
Aufwand herausstellen. Diese Verfahren können sowohl in Software- als auch<br />
in Hardwareimplementierungen angewendet werden. Das Problem bei dieser Vorgehens-<br />
28
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
weise ist, dass für jedes Feld und damit für jede Schlüssellänge eine spezielle Abbildung<br />
generiert werden muss. Hier ergibt sich das Problem der Reduktion: Entweder man hat<br />
eine schnelle, effiziente Implementierung, die aber nur eine bestimmte Kurve unterstützt<br />
oder einen komplexen Algorithmus, der dann aber nicht an bestimmte Kurven gebunden<br />
ist.<br />
In dem Design wurde sich auf die Beschleunigung einer einzigen Kurve konzentriert. Ziel<br />
war es, eine möglichst schnelle und kleine Hardwarelösung für die ECC-Operation mit<br />
einer Bitbreite von 233 Bit zu realisieren. Hierfür kann das Reduktionspolynom direkt in<br />
dem Design verdrahtet werden. Die Reduktionsoperation benötigt somit 0,034 mm 2 Siliziumfläche,<br />
während eine flexible Lösung die Fläche und auch die letztendliche Laufzeit<br />
signifikant erhöht hätten.<br />
Die Kurve mit Operanden von 233 Bit ist seitens der NIST unter der Bezeichnung „B 233“<br />
standardisiert [13]. Diese Kurve wurde ausgewählt, da die Sicherheit in etwa der Sicherheit<br />
des eingesetzten, symmetrischen Verschlüsselungsverfahren AES entspricht [6a].<br />
Abbildung 2.8: Da das Ergebnis einer Multiplikation länger als die maximale<br />
Feldlänge ist, benötigt man einen Reduktionsschritt, der das<br />
Ergebnis innerhalb des Feldes reduziert.<br />
2.14.4 System-Design<br />
Im ECC-Design wurde eine Prozessorarchitektur gewählt, die der Transport-getriggerten<br />
Architektur (TTA) entspricht. Alle Funktionseinheiten (siehe Abbildung 2.9), also Multiplizierer<br />
(MUL), Addierer, Quadrierer (beides als Teil der Arithmetisch-Logischen-Unit (ALU))<br />
sowie Register (Register File) sind mit einem 233 Bit breiten Bus verbunden. Der Zugriff<br />
auf den Bus wird von einer zentralen Kontrollsteuerung (Controller) geregelt. In dieser Einheit<br />
befindet sich das fest verdrahtete Ausführungsprogramm der ECC-Einheit. Die Testbit-<br />
Einheit verbindet die ansonsten komplett getrennten Datenfluss- und Kontrollflussteile der<br />
Schaltung. Diese Testbit-Einheit überprüft, ob ein bestimmtes Bit auf dem Datenbus gesetzt<br />
wurde. Bei der TTA sind die Operationen der Funktionsblöcke durch den Bustransfer<br />
getriggert. Der Start einer Multiplikation wird beispielsweise aktiviert, wenn zwei Datenworte<br />
(die Faktoren) zum Multiplizierer transportiert wurden. Späteres Lesen vom Multiplizierer<br />
liefert dann automatisch das Produkt. Diese Art der Architektur ist sehr einfach, da<br />
Komponenten hinzugefügt oder entfernt werden können ohne andere Komponenten oder<br />
Kontrollstrukturen ändern zu müssen. Neben dieser Flexibilität erlaubt diese Architektur eine<br />
explizite Parallelität. In der Zeit, in der beispielsweise eine Multiplikation berechnet wird,<br />
können weitere Operationen, wie Additionen oder Registertransfer, ausgeführt werden.<br />
29
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Das Programm in der Kontrolleinheit führt die Punktmultiplikation entsprechend dem Lopez-Dahab-Algorithmus<br />
[32] aus. Dieser Algorithmus erlaubt die Ausführung einer EC<br />
Punktmultiplikation (ECPM) mit lediglich einer Division im Basisfeld. Diese eine Division<br />
wird mittels des Itoh-Tsujii-Ansatzes [22] berechnet. Durch den im Design vorhandenen<br />
schnellen Quadrierer und Multiplizierer ist dieser Algorithmus schneller und ressourcensparender<br />
als zum Beispiel der alternative erweiterte Euklidische Algorithmus. Die Algorithmen<br />
sind Teil des fest verdrahteten Programms in der Kontrolleinheit, die den Fluss der<br />
Daten zwischen den Rechen- und Registereinheiten steuert.<br />
Die Flexibilität des Designs bezüglich der Funktionseinheiten erlaubt es, eine praxisnahe<br />
„Design-Space-Exploration“ durchzuführen. Mittels dieser Exploration wird der Einfluss<br />
der Anzahl und der Geschwindigkeit der einzelnen Funktionseinheiten auf die Leistung<br />
des gesamten Systems ermittelt. Die Untersuchung ergab, dass die Geschwindigkeit der<br />
Feldmultiplikation die wichtigste Einflussgröße für die Leistung des Gesamtsystems darstellt.<br />
Mehrere Multipliziereinheiten können allerdings überraschenderweise die Leistung<br />
nicht entscheidend verbessern. Deshalb werden letztlich drei Designs für die 233-Bit-ECC-<br />
Beschleunigung näher untersucht. Deren wesentlicher Unterschied liegt in der Geschwindigkeit<br />
und damit der Größe des Feldmultiplizierers.<br />
Für eine Feldmultiplikation erfordert das schnellste und damit auch das größte Design drei<br />
Taktzyklen. Das mittelgroße Design benötigt neun und das kleinste 27 Taktzyklen. Die Gesamtzeit<br />
für eine ECPM beträgt 60 µs für das schnellste, 80 µs für das mittlere und 230<br />
µs für das kleinste Design. Die schnelleren beiden Designs gehören zu den schnellsten<br />
bisher veröffentlichten Implementierungen. Dabei ist die erforderliche Siliziumfläche von<br />
2,1 mm 2 für das größte bis zu 1,3 mm 2 für das kleinste Design im Vergleich zu anderen<br />
Implementierungen mit vergleichbarer Geschwindigkeit sehr gering. Die benötigte Energie<br />
der vorgestellten Designs für eine ECPM ist geringer als bei allen anderen bisher veröffentlichten<br />
Implementierungen. Entsprechend dem 233-Bit-Design wurden auch Designs<br />
für andere elliptische Kurven bis zu 571 Bit implementiert, vermessen und verglichen. Abbildung<br />
2.10 zeigt die verschiedene Flächen und Energieverbräuche für eine ECPM der<br />
untersuchten Designs von 163 bis 571 Bit.<br />
Für den TSN wurde die 233-Bit-Implementierung mit der mittleren Geschwindigkeit, d.h. 9<br />
Clockzyklen pro Feldmultiplikation, gewählt.<br />
Dies wird dadurch begründet, dass die 233-Bit-Implementierung das beste Verhältnis zwischen<br />
Fläche und Energie und Leistung (Geschwindigkeit) verspricht und dabei eine hohe<br />
Sicherheit bietet. Für eine noch höhere Sicherheit besteht die Möglichkeit der Nutzung<br />
größerer Schlüssellängen, wobei das entsprechend mehr Fläche in der Schaltung, mehr<br />
Berechnungszeit und auch mehr Stromverbrauch implizieren würde.<br />
Die 233-Bit-Implementierung wurde bereits in einem System-on-Chip (SoC) integriert, das<br />
neben einem eingebetteten 32-Bit-Prozessor Hardwareblöcke für die Verarbeitung von<br />
Netzwerkprotokollen und symmetrischer Verschlüsselung umfasst. Auf diesem Chip, der<br />
bereits im IHP in 0,25-µm-CMOS-Technologie gefertigt wurde, kann die Leistung des Hardwaredesigns<br />
gut mit einer alternativen Softwareimplementierung (MIRACL [47]), die auf<br />
dem eingebettetem Prozessor läuft, verglichen werden. Im Vergleich mit der Softwareim-<br />
30
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
plementierung ist die dedizierte Hardware hierbei 1000-mal schneller und benötigt insgesamt<br />
ein 500stel der Energie für eine 233-Bit-ECPM.<br />
Abbildung 2.9: Blockschaltbild des 233-Bit-ECC-Beschleunigers. Ein 233 Bit<br />
breiter, von einer Controller-Einheit kontrollierter Bus verbindet die<br />
Rechen- und Registereinheiten.<br />
Abbildung 2.10: Resultate der verschiedenen ECC-Beschleuniger-Schaltungen. Die<br />
Balken zeigen die benutzte Siliziumfläche. Die Linien entsprechen<br />
dem Energieverbrauch.<br />
2.14.5 Parameter im TSN<br />
Im TSN befindet sich eine Recheneinheit für die 233-Bit-Elliptische-Kurven-Punkt-Multiplikation<br />
im Feld (GF(2 233 )). Das Design der ECC-Recheneinheit entspricht derjenigen, die<br />
in Abbildung 2.9 dargestellt ist. Es beinhaltet:<br />
31
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
• Acht 233-Bit-Register, von denen vier von außen zugreifbar sind, die anderen vier<br />
sind für die interne Berechnung.<br />
• Eine Arithmetisch-Logische-Einheit (ALU), die die Addition und die Quadrierungsoperation<br />
ausführt. Beide Operationen können innerhalb eines Taktzyklus berechnet<br />
werden.<br />
• Einen Multiplizierer, der die Multiplikation im Basisfeld (GF(2 233 )) inklusive der Reduktion<br />
ausführt. Basierend auf den Ergebnissen der Design-Space-Exploration haben<br />
wir uns für das Design, welches neun Taktzyklen pro Multiplikation benötigt (also das<br />
4-Segment-Design), entschieden. Eine detaillierte Untersuchung des Multiplizierers<br />
kann in [14] gefunden werden.<br />
• Einen Controller und Testbit-Einheit, die den Datenfluss steuern. Das Programm<br />
selbst ist Teil des VHDL-Codes und ist optimiert auf die Busstruktur und den gewählten<br />
Multiplizierer.<br />
Sowohl die Quadrierungseinheit als auch der Multiplizierer führen automatisch und innerhalb<br />
eines Taktzyklus die fest verdrahtete Reduktionsoperation mit dem für das Feld standardisierten<br />
Reduktionspolynom (r(x) = x 233 + x 74 + 1) aus. Die Ausführung des Lopez-<br />
Dahab-Algorithmus benötigt<br />
• 232 mal 55 (12760) Taktzyklen für die Punktmultiplikation<br />
• 314 Taktzyklen für die Inversion im Basisfeld<br />
• 119 Taktzyklen für die Koordination und Bereitstellung des Ergebnisses,<br />
also insgesamt 13193 Taktzyklen. Die ECC-Punktmultiplikation wird gestartet, indem der<br />
Faktor k, die Koordinaten des Basispunktes x und y und der Parameter der Kurve b in<br />
die entsprechenden Register (siehe Anhang) geschrieben werden. Anschließend wird das<br />
32-Bit-Kommandowort, welches die Gesamtoperation startet an die Kontrolleinheit übergeben.<br />
2.15 SHA-1 / PRNG<br />
Das SHA-1-Modul ist nach den NIST-Standards FIPS 180-1 [34], FIPS 186-1 [35] und FIPS<br />
186-2 [36] aufgebaut. Der SHA-1 ist ein Teil des Digital Signature Standard (DSS), der eindeutige<br />
Hashwerte für einen Datenblock erzeugt. Anhand dieser kann man feststellen, ob<br />
ein Datenblock nachträglich verändert wurde oder nicht. Weiterhin kann die Komponente<br />
als Pseudozufallszahlengenerator (engl. Pseudo Random Number Generator (PRNG))<br />
verwendet werden. Derartige Zufallszahlen werden für viele kryptographische Algorithmen,<br />
wie zum Beispiel ElGamal, benötigt. In Abbildung 2.11 ist das Blockdiagramm des SHA-1-<br />
Moduls dargestellt. Der zugrunde liegende Algorithmus und die Funktionalität der Komponente<br />
werden in den folgenden Abschnitten genauer beschrieben. Die Implementierung<br />
des SHA-1 ist auf 32-Bit-Lese- und Schreibzugriffe ausgelegt. Für einen einfachen Zugriff<br />
32
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
wurde das Modul mit einer Schnittstelle mit einem memory-like Interface ausgestattet. Die<br />
Implementierung setzt nicht den kompletten SHA-1 um. Sie enthält nur die Funktion G,<br />
die den Hauptteil des Algorithmus darstellt. Die restlichen Funktionen, wie zum Beispiel<br />
Bitstuffing, werden sinnvollerweise in höheren Schichten umgesetzt.<br />
Software<br />
Split data into 512-Bit blocks;<br />
Bitstuffing for the last data block;<br />
Write and read controlregister;<br />
Write data to registers H0 to H4(160-bit KEY);<br />
Write data and W0 to W15 (512-bit data block);<br />
Function G<br />
Function K<br />
Function f<br />
Hardware<br />
Algorithm of G<br />
Software<br />
Read registers H0 to H4 (160-bit Signature of the data);<br />
Abbildung 2.11: Ablauf der Signatur mit Hilfe von Soft- und Hardware<br />
2.15.1 Secure Hash Algorithmus<br />
Für den SHA-1 werden die Daten, über die der Hashwert gebildet werden soll, in 512 Bit<br />
lange Blöcke zerlegt. Lässt sich das Datum nicht in ein Vielfaches von 512 zerlegen, muss<br />
der letzte Block aufgefüllt werden. Dies wird als „Bitstuffing“ bezeichnet. Zur Realisierung<br />
sind die letzten 64 Bit des letzten Datenblocks reserviert. Sie enthalten die Länge der zu<br />
signierenden Nachricht. Mit Hilfe dieses Wertes kann festgestellt werden, wie viele Bits des<br />
letzten Blocks nicht mehr für die Nachricht benötigt werden und aufgefüllt werden müssen.<br />
Das Auffüllen wird umgesetzt, indem nach dem letzten für die Nachricht relevanten Bit eine<br />
binäre „1“ eingeführt wird. Die restlichen Bitstellen werden mit „0“ belegt.<br />
Für die Integritätsprüfung mit Hilfe des SHA-1 gibt es zwei unterschiedliche Verfahren.<br />
Das erste Verfahren basiert darauf, dass beide Kommunikationspartner einen geheimen,<br />
frei gewählten Schlüssel kennen. Die zu signierende Nachricht wird dabei zunächst auf ein<br />
Vielfaches von 512 Bit vervollständigt und anschließend in 512 Bit lange Blöcke zerlegt.<br />
Diese werden dann blockweise an den SHA-1 übergeben. Neben den Datenblöcken benötigt<br />
der Algorithmus einen definierten Startwert. Dieser ist 160 Bit lang und wird als der<br />
geheime „Schlüssel“(KEY) bezeichnet. Er sollte nur den Kommunikationspartnern bekannt<br />
sein, da mit diesem eine eindeutige Signatur für die Daten erzeugt wird und diese auch<br />
verifiziert werden kann. Die erstellte Signatur wird mit den Daten übertragen. Der Empfänger<br />
führt ebenfalls den SHA-1 mit dem gleichen Schlüssel auf die empfangenen Daten<br />
aus. Wurden die Daten bei der Übertragung durch Dritte verändert, führt dies zu einer anderen<br />
Signatur. Derartige Veränderungen werden dann beim Vergleich beider Signaturen<br />
entdeckt. Um eine sichere Signierung der Daten zu gewährleisten, muss der Schlüssel<br />
für den SHA-1 zwischen den Kommunikationspartnern geheim übertragen werden. Dafür<br />
33
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
werden Schlüsselaustauschverfahren, wie zum Beispiel das Verfahren von ElGamal, benötigt.<br />
Mit deren Hilfe wird verhindert, dass Dritte unerlaubt in den Besitz des geheimen<br />
Schlüssels kommen.<br />
Die zweite Möglichkeit zur Signierung von Daten mittels SHA-1 besteht in der Nutzung des<br />
ECC als asymmetrisches Verfahren, so dass der Sender der Nachricht einen privaten und<br />
einen öffentlichen Schlüssel besitzt. Der private Schlüssel dient der Signierung durch den<br />
Absender und der öffentliche Schlüssel der Prüfung der Signatur durch den Empfänger.<br />
Dieses Verfahren wird als „ECDSA“ bezeichnet und ist unter ANSI X9.62 standardisiert.<br />
Hierbei fungiert der sogenannte „Key“ als standardisierter Initialisierungswert (h0 bis h4).<br />
Im Folgenden wird der Ablauf und der Aufbau des Secure-Hash-Algorithmus vorgestellt.<br />
Wie bereits erläutert, erhält der Algorithmus als Eingabe die zu signierenden Daten und<br />
den geheimen Schlüssel. Zu Beginn wird das „Bitstuffing“ für die zu signierenden Daten<br />
ausgeführt. Der letzte Block wird der oben beschriebenen Vorgehensweise nach mit einer<br />
„1“ und „0“ aufgefüllt. Diese Vorverarbeitung der Daten wird vorzugsweise in Software<br />
realisiert, da hier kaum eine Optimierung durch die Verwendung von Hardware erreicht<br />
werden kann. Im Anschluss wird der geheime 160-Bit-Schlüssel in die entsprechenden<br />
Register (H-Register) des SHA-1-Hardware-Moduls geschrieben. Dazu ist es notwendig,<br />
den Schlüssel in fünf 32-Bit-Blöcke zu unterteilen. Der Datenblock wird in sechzehn 32-Bit-<br />
Blöcke aufgeteilt und in die W-Register der Komponente geschrieben. Nachdem das letzte<br />
der W-Register geschrieben wurde, beginnt die SHA-1-Hardwarekomponente mit der Generierung<br />
der Signatur. Ist der Algorithmus nach 80 Taktzyklen abgeschlossen, kann der<br />
nächste Datenblock in die W-Register geschrieben werden. Dies wird für alle 512-Bit-Blöcke<br />
durchgeführt. Nachdem alle Daten die SHA-1-Komponente passiert haben, befindet<br />
sich in den H-Registern des Moduls die Signatur des Datenpakets. Diese kann nun ausgelesen<br />
werden, um zum Beispiel mit der Nachricht verschickt zu werden. Der innere Aufbau<br />
der Hardwarekomponenten umfasst drei Funktionen, die zur Generierung der Signatur benötigt<br />
werden. Bei diesen handelt es sich um die Funktionen f, K und G. In Abbildung 2.11<br />
ist der Aufbau des SHA-1 dargestellt mit der Unterteilung nach Soft- und Hardware.<br />
Die Arbeitsweise dieser drei Funktionen f, K und G steht in Abhängigkeit zur Anzahl der<br />
verstrichenen Taktzyklen. Die Funktion G stellt die Hauptfunktion des SHA-1 dar. Mit ihr<br />
wird aus dem eingegebenen 160-Bit-Schlüssel und dem 512 Bit langen Datenblock die<br />
Signatur erzeugt. Die Funktion K liefert in Abhängigkeit der aktuellen Laufzeit des Algorithmus<br />
eine Konstante, die in der Funktion G genutzt wird, um einen Teil der Zwischenergebnisse<br />
für die Signaturerzeugung zu generieren. Diese Zwischenergebnisse werden nach<br />
jedem Takt in den Registern A bis E abgelegt. Nach 80 Takten wird der Inhalt dieser Register<br />
in den H-Registern verrechnet. Diese enthalten dann die Signatur des Datenblocks.<br />
Die Funktion f erzeugt, ebenfalls in Abhängigkeit von der aktuellen Taktanzahl, einen Teil<br />
dieser Zwischenergebnisse und bezieht bei der Berechnung ihres neuen Wertes die Zwischenergebnisse<br />
in den Registern B, C und D des vorherigen Taktes ein. Listing 2.2 zeigt<br />
den Aufbau der Funktionen f und K.<br />
f(j) with 0
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
f(j,B,C,D)= (B and C) or (B and D) or (C and D) for 40
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Zu Beginn jedes der 80 Takte der Funktion G ermitteln die Funktionen f und K ihre Zwischenergebnisse.<br />
Als Ergebnis von K wird eine 32 Bit lange Konstante ausgegeben, die in<br />
Abhängigkeit der aktuellen Anzahl von Takten bestimmt wird. Die Funktion F ermittelt ihr<br />
32-Bit-Ergebnis aus der Verknüpfung der Werte aus den Registern B, C und D. Zu Beginn<br />
des Algorithmus enthalten diese, wie die H-Register auch, den geheimen Schlüssel und<br />
im weiteren Verlauf die Zwischenergebnisse der Signatur. Der Aufbau der Verknüpfung ist<br />
ebenfalls von der aktuellen Taktanzahl abhängig. Nachdem diese beiden Funktionen ihre<br />
Ergebnisse generiert haben, startet die Funktion G. Als erstes wird ein weiteres Zwischenergebnis<br />
in Abhängigkeit von der aktuellen Taktzahl ermittelt. Dieses entspricht entweder<br />
dem Inhalt des Registers W0 oder der XOR-Verknüpfung der Register W13, W8, W2 und<br />
W0 mit einer zusätzlichen Bitschiebeoperation des Ergebnisses nach links (in Richtung der<br />
höherwertigen Bits). Im Anschluss werden alle W-Register um ein Register nach rechts,<br />
das heißt in Richtung der niederwertigen Register, geschoben. Der Wert des Registers W0<br />
wird in dem Register W15 abgelegt.<br />
Aus all den bis zu diesem Zeitpunkt ermittelten Werten wird durch Addition der Ergebnisse<br />
das Zwischenergebnis eines Teilblocks der Signatur ermittelt. Dessen Wert setzt sich aus<br />
einer fünfmaligen Bitschiebeoperation des Registerinhalts von A nach links zusammen.<br />
Auf diesen Wert werden anschließend der Registerinhalt von E sowie die Ergebnisse von<br />
f, K und der Verknüpfung der drei W-Register addiert. Dieses Ergebnis wird später in dem<br />
Register A abgelegt. Zuvor werden die Inhalte der Register B bis E um ein Register nach<br />
links verschoben. Der neue Wert des Registers C wird zudem noch um 30 Bit nach links<br />
verschoben. Nun enthält das Register A den zuvor berechneten Wert.<br />
Nach 80 Takten werden die Zwischenergebnisse aus den Registern A bis E mit den Inhalten<br />
der H-Register addiert. Der Wert in Register B wird zudem noch um 30 Bit nach<br />
links verschoben. In den H-Registern steht nun die Signatur der bis dahin behandelten<br />
Datenblöcke. Die Signatur kann über Software aus den H-Registern ausgelesen werden.<br />
2.15.2 Pseudo Random Number Generator (PRNG)<br />
Es besteht die Möglichkeit, das SHA-1-Modul als Generator für Pseudozufallszahlen zu<br />
verwenden. Dies wird in FIPS 186-2 [36] genauer erläutert. Für die Generierung derartiger<br />
Zahlen mit Hilfe des Secure Hash Algorithmus ist es zu Beginn notwendig einen Schlüssel<br />
und einen Datenblock in die entsprechenden H- und W-Register des Moduls zu schreiben.<br />
Die Kombination aus Schlüssel und Daten bilden den Ausgangswert (Seed) für die<br />
Generierung der Pseudozufallszahl. Verwendet man stets den gleichen Seed, wird immer<br />
eine identische Folge von Zufallszahlen erzeugt. Aufgrund der Wiederholbarkeit nennt<br />
man diese Werte auch pseudozufällige Zahlen. Ist der Seed jedoch unbekannt, wirken die<br />
Ergebnisse des Algorithmus wie zufällig generierte Zahlen. Nach dem derzeitigen Kenntnisstand<br />
kann man nicht anhand dieser Zahlenfolgen auf den Seed schließen. Wurden<br />
alle Register mit den Ausgangswerten belegt, kann der Algorithmus gestartet werden. Am<br />
Ende jedes Durchlaufs steht eine Pseudozufallszahl von 160 Bit in den Registern H0 bis<br />
H4.<br />
36
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Möchte man die Komponente für die Generierung von Hashwerten und als PRNG verwenden,<br />
ist es notwendig, beim Wechsel zwischen beiden Funktionalitäten die Werte der H-<br />
und W-Register zu speichern. Darüber hinaus müssen bei der Wiederaufnahme der Funktionalität<br />
die gespeicherten Werte in die Register zurückgeschrieben werden. Für einen<br />
Wechsel von PRNG zu SHA-1 muss die letzte ermittelte Zufallszahl und der Inhalt aller W-<br />
Register gespeichert werden. Im Anschluss können der Schlüssel und der Datenblock für<br />
den SHA-1 in die Register geschrieben werden.<br />
Möchte man im Anschluss an einen SHA-1-Durchlauf wieder eine Pseudozufallszahl generieren,<br />
muss der Hashwert und der Inhalt der W-Register gespeichert werden. Dies ist<br />
nur dann notwendig, wenn im Folgenden ein Hashwert in Abhängigkeit von diesen Werten<br />
erzeugt werden soll. Ansonsten reicht es aus, die letzte generierte Zufallszahl in die H-<br />
Register zurück zu schreiben und auch den Inhalt der W-Register wieder so herzustellen,<br />
wie er vor dem Wechsel von PRNG auf SHA-1 war.<br />
2.15.3 Hardwarebeschreibung<br />
Das implementierte SHA-1-Modul, welches in Abbildung 2.12 gezeigt wird, besitzt ein Memory-Like-Interface<br />
und fünf 32-Bit-Register für den 160 Bit langen Schlüssel und den<br />
Hashwert. Weiterhin sind sechzehn 32-Bit-Register für den Datenblock und die Zwischenergebnisse<br />
vorhanden. Der Schlüssel und der Datenblock werden in 32-Bit-Blöcke aufgeteilt<br />
und in die Register geschrieben. Ein zusätzliches 8-Bit-Kontrollregister wird verwendet,<br />
um die Komponente zu konfigurieren und zu steuern. Im folgenden Abschnitt werden die<br />
verschiedenen Register genauer beschrieben.<br />
Abbildung 2.12: Blockschaltbild des SHA-1-Moduls<br />
W0 ... W15:<br />
Diese sechzehn 32-Bit-Register beinhalten den 512-Bit-Datenblock. Das Ergebnis des Algorithmus<br />
ist ein 160 Bit langer Hashwert für diesen Datenblock. Um diese Register lesen<br />
und schreiben zu können, muss man diese über die SHA-1-Basisadresse (0x20000000)<br />
plus einen Offset zwischen 0 und 15 adressieren. Nachdem das Register W15 geschrieben<br />
wurde, beginnt der SHA-1 automatisch mit der Generierung der Signatur.<br />
H0 ... H4:<br />
Diese fünf 32-Bit-Register enthalten den 160 Bit langen Schlüssel zu Beginn des Algorithmus<br />
und am Ende den Hashwert des Datenblocks. Adressiert werden diese Register über<br />
37
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
die SHA-1-Basisadresse plus einen Offset zwischen 16 und 20. Nachdem der Algorithmus<br />
durchlaufen wurde, ist ein entsprechendes Interruptflag im Kontrollregister gesetzt. Dieses<br />
wird über das Auslesen des Registers H0 zurückgesetzt.<br />
CTRL:<br />
Das 8-Bit-Kontrollregister beinhaltet Konfigurations- und Statusinformationen des SHA-1-<br />
Moduls (siehe Tabelle 2.2). Es wird über die SHA-1-Basisadresse plus einen Offset von 21<br />
adressiert.<br />
Bit Beschreibung<br />
7 run<br />
6 irpend<br />
5 reserved<br />
4 reserved<br />
3 reserved<br />
2 new block<br />
1 BRDYN<br />
0 reserved<br />
Tabelle 2.2: Struktur des Kontrollregisters<br />
Bit 1 (BRDYN) schaltet den BRYDN (Bus ready)-Port des SHA-1-Moduls zu. Wenn dieses<br />
Bit gesetzt wurde, wird der AMBA-Bus, an welchen die Komponente über den Memory<br />
Controller angeschlossen wurde, als besetzt angezeigt. BRYDN ist „0“ (aktiv), während<br />
der SHA-1 läuft.<br />
Bit 2 (new block) zeigt an, dass ein neuer Datenblock beginnt. In diesem Fall wird ein initialer<br />
Schlüssel, der in einigen Konstanten gespeichert ist, verwendet. Diese Funktionalität<br />
kann auch realisiert werden, in dem man den Schlüssel von außen in die entsprechenden<br />
Register schreibt. Werden keine neuen Daten in die H-Register geschrieben, wird<br />
der Hashwert des zuvor verwendeten Datenblocks als Ausgangspunkt für den nächsten<br />
Datenblock verwendet. Dadurch wird eine Abhängigkeit des Hashwertes von vorangegangenen<br />
Ergebnissen realisiert und es können Datenblöcke, die größer als 512 Bit sind,<br />
behandelt werden.<br />
Bit 6 (irpend) zeigt den anliegenden Interrupt, wenn der SHA-1 durchlaufen wurde. Um<br />
den Interrupt zurückzusetzen, kann dieses Bit überschrieben werden oder das Register<br />
H0 ausgelesen werden.<br />
Bit 7 (run) zeigt an, ob der Algorithmus noch läuft oder bereits beendet wurde. Dieses<br />
Bit wird auf „1“ gesetzt, nachdem Register W15 geschrieben und auf „0“, nachdem der<br />
gesamte Algorithmus durchlaufen wurde.<br />
Bit 6 und 7 darüber können die Werte von „Bus Ready“ und „Interrupt“ abgerufen werden.<br />
38
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Register Adresse<br />
W0 ... W15 SHA1_BASE + [0 ... 15]<br />
H0 ... H4 SHA1_BASE + [16 ... 20]<br />
CTRL SHA1_BASE + 21<br />
Tabelle 2.3: Adressen der SHA-1-Register<br />
2.16 SPI<br />
Das SPI wurde aus der „Synopsys DesignWare“-Bibliothek [51], die dem IHP zur Verfügung<br />
steht, übernommen. Es ist direkt mit dem APB verbunden. Das Interface besitzt drei<br />
„Chip-Select“-Pins mit denen jeweils eine SPI-Slave-Komponente angesprochen werden<br />
kann. Für die Datenübertragung stehen ein Data-Out- und ein Data-In-Pin zur Verfügung.<br />
Weiterhin gibt es einen Pin für den SPI-Takt, der die Geschwindigkeit der Datenübertragung<br />
festlegt.<br />
Der SPI-Master kann durch das Schreiben der entsprechenden Kontrollregister konfiguriert<br />
werden. Hierzu zählen das Einstellen des SPI-Takts, der aktiven Taktflanke und der<br />
Phasenverschiebung des Takts. Der SPI-Master wurde mit Hilfe einer einfachen, angeschlossenen<br />
Slavekomponente getestet. Zwischen dieser und dem Master wurden anschließend<br />
Datenübertragungen ausgeführt.<br />
2.17 Pads und Pins<br />
Die Pads sind die Kontaktfelder auf einem Chip, über die mit Hilfe von Bonddrähten die<br />
Verbindung zu den Pins eines Gehäuses geführt wird. Das hier verwendete QFP-Gehäuse<br />
(siehe Abbildung 2.13) besitzt 128 Pins, von denen 87 I/O-Pins und 24 Pins für die<br />
Spannungsversorgung. Die übrigen 17 Pins nicht belegt sind (siehe Abbildung 2.15). Hinsichtlich<br />
der Pinverteilung werden 26 Pins an der kurzen und 38 Pins an jeder langen<br />
Kante untergebracht.<br />
Über die Pins erfolgt die Kommunikation des TSN mit externen Komponenten. Insbesondere<br />
das Speicherinterface sowie UART und SPI sind über die Pins nach außen geführt.<br />
Außerdem gibt es eine Schnittstelle zur DSU sowie Pins für Testzwecke, um die Funktionsfähigkeit<br />
des Speichers zu überprüfen.<br />
Die Basiskonfiguration des LEON2 sieht vor, dass für das Speicherinterface alle 32 Datenleitungen<br />
nach außen geführt werden. In der vorliegenden Umsetzung ist die Anzahl der<br />
nach außen geführten Datenleitungen auf 16 reduziert worden, um nötige Siliziumfläche<br />
möglichst gering zu halten.<br />
39
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Für die Spannungsversorgung sind 24 Pins vorgesehen, die sich in je 8 Pins für die Corespannung,<br />
die Padspannung und die Masse aufteilen. Die Anzahl der Pins und deren<br />
Position für die Spannungsversorgung ist vom IHP-eigenen Testsystem vorgegeben.<br />
Um eine Interoperabilität mit anderen Chips zu gewährleisten, beträgt die Padspannung<br />
3,3 V. So liegt der Spannungswert für eine logische Null bei 0 V und für eine logische Eins<br />
bei 3,3 V. Die Werte entsprechen dem Standard von Low Voltage Transistor Transistor<br />
Logic (LVTTL). Die Corespannung beträgt 2,5 V und wird von der verwendeten Technologie<br />
vorgegeben.<br />
Abbildung 2.13: Gehäuse des TSN vom Typ QFP128<br />
2.18 Vom VHDL zum ASIC<br />
Die Generierung des ASIC aus dem VHDL ist ein mehrstufiger Prozess. Zunächst werden<br />
die Funktionen des Chips in einer Hochsprache beschrieben.<br />
VHDL bietet dafür die so genannte Verhaltensbeschreibung. Hierbei werden die entsprechenden<br />
Schnittstellen der Schaltung mit der Außenwelt und die Funktionalität des Systems<br />
beschrieben. Diese Form erinnert stark an die Programmierung in anderen Programmiersprachen<br />
wie C++, Java oder Python und macht es somit einfach für Entwickler im<br />
Bereich der digitalen Schaltungen solche zu beschreiben.<br />
Der nächste Schritt ist die funktionale Simulation, in der mittels einer Testbench die Hardwarebeschreibung<br />
in VHDL auf ihre Korrektheit geprüft wird. In einer Stimuli-Datei im<br />
VHDL-Format werden die Eingänge des simulierten Bausteins mit Werten belegt und nach<br />
Abschluss der Simulation liegen die Ausgangswerte an den Ausgangsports an. Die Abbildung<br />
2.14 zeigt den Aufbau für die funktionale Simulation einer Hardwarekomponente.<br />
Ist die Hardware korrekt beschrieben, erfolgt durch die Synthese der nächste Schritt zur<br />
Generierung des ASICs, die Umsetzung in eine Gatternetzliste. Dabei werden Informationen<br />
aus einer Zellbibliothek, bestehend aus den Grundgattern, mit der funktionalen<br />
40
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Beschreibung so verknüpft, dass die Gatternetzliste entsteht. Nach der Synthese muss<br />
erneut die Korrektheit der Datenverarbeitung in der Hardwarekomponente geprüft werden.<br />
Dieses erfolgt analog zur Prüfung in der Pre-Synthese-Simulation unter Zuhilfenahme einer<br />
Testbench (die i.d.R. die gleiche Testbench wie für die Pre-Synthese-Simulation ist).<br />
Neben dem funktionalen Test kann hier geprüft werden, ob die gewünschte Clockfrequenz<br />
erreicht wird.<br />
Abbildung 2.14: Test eines entwickelten Hardware-Modells<br />
Abbildung 2.15: Layout des TSN-Chip nach der Verdrahtung. Insbesondere die<br />
Verdrahtung auf den beiden obersten Metallebenen (hier: gelb und<br />
braun) treten hervor<br />
2.19 Layoutgenerierung<br />
In der Phase der Layoutgenerierung wird der Schritt von der Gatternetzliste, die lediglich<br />
aus Grundgattern besteht, zum eigentlichen Chip vollzogen. Zunächst werden die<br />
41
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Außenmaße festgelegt. In der Regel werden diese durch die Anordnung der Pads, dem<br />
sogenannten Padring, vorgeben. Dieser Padring muss so gestaltet sein, dass die Anzahl<br />
der Pads an jeder Kante der Pinanzahl an der Kante des Gehäuses entspricht. Anschließend<br />
werden die Black-Box-Komponenten manuell platziert. In diesem Fall sind das die<br />
Speicherblöcke für den Cache. Diese Black-Box-Komponenten sind vorgefertigte Instanzen,<br />
die bereits dem Layoutprozess unterzogen wurden und daher wie Bibliothekselemente<br />
verwendet werden. In der verbleibenden Fläche werden die Grundgatter platziert und<br />
anschließend der „Clock tree“ generiert. Dieser sorgt mit Hilfe von schnellen Treiberelementen<br />
dafür, dass das Clocksignal möglichst gleichmäßig auf dem Chip verteilt wird.<br />
Zudem bestimmt er später wesentlich die maximal mögliche Taktfrequenz mit. Die Verdrahtung<br />
ist der letzte Schritt in der Layoutgenerierung. Die Abbildung 2.15 zeigt den TSN nach<br />
der Verdrahtung. Dabei werden die Gatter über 5 Metallebenen miteinander verbunden.<br />
2.20 Boardbeschreibung<br />
Das Kernstück auf der Platine ist der TSN-Prozessor. Daneben wird externer Speicher<br />
in Form von RAM und Flash den ASIC vervollständigen. Als Sensorik sind Infrarot- und<br />
Beschleunigungssensoren vorgesehen, die mögliche Ortsveränderungen detektieren können.<br />
Zur Kommunikation mit weiteren Knoten und dem Server kommen ein Zigbee-Funkmodul<br />
nach dem IEEE-802.15.4-Standard sowie ein Bluetooth-Modul zum Einsatz.<br />
Überdies soll das Board eine Elektronik zur Bereitstellung der Spannungsversorgung besitzen.<br />
Dieses ist so gestaltet, dass entweder ein Brennstoffzellensystem, Batterien/Akkus<br />
oder gegebenenfalls ein Solarzellensystem zum Einsatz kommen kann.<br />
2.21 Systemtest und Software<br />
Wie in Abschnitt 2.18 beschrieben existiert für den TSN eine Testbench. Durch die Komplexität<br />
des Systems gibt es einen angepassten Aufbau.<br />
Die Testroutinen sind in der Programmiersprache C verfasst. Ein Cross-Compiler erzeugt<br />
ein ausführbares Programm, das in einem simulierten Speicher abgelegt wird. Dieser simulierte<br />
Speicher ist Teil der Testbench. Die CPU des TSN arbeitet das Programm regulär<br />
ab und wird damit in ihrer Funktion getestet.<br />
Zurzeit existieren einzelne Testroutinen in Software, die stapelweise abgearbeitet werden.<br />
Diese Testroutinen senden Daten an das zu testende Modul und werten im Anschluss<br />
die Ergebnisse aus. Für alle Komponenten (UART, SPI, AES, ECC, SHA-1) sind solche<br />
Prozeduren vorhanden. Ein Auszug der Testdaten befindet sich im Anhang. Die jeweiligen<br />
Testvektoren wurden den Standardisierungsdokumenten entnommen [34], [35], [36], [37].<br />
42
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
2.22 Energie<br />
Vor allem im Bereich von batteriebetriebenen Geräten ist es von Interesse, die voraussichtliche<br />
Leistungsaufnahme der Hardware bestimmen zu können. Das ermöglicht die<br />
Auswahl einer geeigneten Spannungsquelle, die weder unter- noch überdimensioniert ist.<br />
Eine schnelle, aber ungenaue Angabe der Leistungsaufnahme ist durch das Synthesetool<br />
möglich. Dieser Wert ist allerdings ausreichend, um die Anzahl der Pads für die Stromversorgung<br />
festzulegen (je Pad ca. 100 mA) sowie die Breite der stromzuführenden Leitungen<br />
zu bestimmen.<br />
Sinnvoller ist es, spezielle Programme einzusetzen, die die Leistungsaufnahme anhand<br />
der tatsächlichen Umschaltvorgänge der Gatter ermittelt. Die Abbildung 2.16 zeigt die Simulation<br />
des TSN mit der Aufgliederung in die einzelnen Komponenten. Die Aktivitätsphasen<br />
stechen jeweils durch erhöhte Leistungsaufnahme hervor. Ein Analysewerkzeug<br />
hilft die Leistungsaufnahme in jedem Clocktakt zu summieren, so dass, wie in Tabelle 2.4<br />
gezeigt, die exakte Leistungsaufnahme einer Operation (z.B. Hashwertberechnung oder<br />
Verschlüsselung) ermittelt werden kann. Die Leistung ist nach den einzelnen Komponenten<br />
aufgeschlüsselt. Durchschnittlich benötigt der TSN 95 mW, von denen 47 mW auf die<br />
CPU entfallen. Die verbleibende Leistung verteilt sich auf die Komponenten SHA-1, AES<br />
und ECC. Für die kryptographischen Funktionen sind jeweils die Leistungsaufnahme und<br />
Laufzeit in Tabelle 2.4 für eine typische Operation angegeben.<br />
Die tatsächliche Leistungsaufnahme kann abweichen, da die Pads Transistoren enthalten,<br />
die mit 2,5 V versorgt werden. Diese werden in der Simulation der Leistungsaufnahme<br />
nicht mit berücksichtigt.<br />
Abbildung 2.16: Analyse der Leistungsaufnahme des Gesamtsystems (rot) sowie<br />
selektierter Einzelkomponenten. Der grüne Plot zeigt exemplarisch<br />
den deutlich erhöhten Stromverbrauch des ECC-Beschleunigers in<br />
seiner Aktivitätsphase.<br />
43
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Komponente Leistungsaufnahme Laufzeit Taktanzahl<br />
SHA-1 8,12 mW 5.125 ns 82<br />
AES 3,94 mW 4.875 ns 78<br />
ECC 29 mW 822.875 ns 13.166<br />
LEON-Kern 47,2 mW ≈6,25 ms ≈100.000<br />
TSN-System (ohne Pads) 95 mW ≈6,25 ms ≈100.000<br />
Tabelle 2.4: Simulation der Leistungsaufnahme für Einzelkomponenten und das<br />
Gesamtsystem bei 16 MHz<br />
2.23 Debug- und Diagnoseschnittstellen<br />
Ein komplexes System, wie der TSN, lässt sich hinreichend simulieren, solange die Simulationen<br />
auf den Chip beschränkt sind. Eine Simulation mit extern angeschlossenen<br />
Modulen (z.B. den Radiomodulen) ist schwer umzusetzen. Für diesen Zweck müssten<br />
Verhaltensmodelle der externen Komponenten zur Verfügung stehen welche jedoch, bedingt<br />
durch ihre hohe Komplexität, nicht vorhanden sind. Anstelle derer nutzt man simple<br />
Modelle von externen Komponenten, die z.B. einfach Daten wieder zurücksenden.<br />
Darüber hinaus kann der Test eines komplexen Systems in der Simulation nie so umfassend<br />
sein, dass alle Komponenten exzessiv validiert werden. Die Simulationszeiten sind<br />
sehr lang, so dass eine ausführliche Simulation nach der Erstellung des Layouts bis zu<br />
mehrere Stunden in Anspruch nehmen kann, obwohl nur einige Millisekunden simuliert<br />
werden.<br />
Aufgrund der nicht vollständigen Simulation des ASICs in seiner Arbeitsumgebung ist es<br />
notwendig, Diagnoseschnittstellen, wie die in Abschnitt 2.23 beschriebene DSU, bereitzustellen.<br />
Das erleichtert die Fehlersuche bei Hardware- oder Softwareproblemen. Die Fehler<br />
in der Hardware können dann im nächsten Fertigungszyklus behoben werden.<br />
44
3 Software<br />
3.1 Das Betriebssystem eCos<br />
eCos ist ein frei verfügbares Betriebssystem für eingebettete Systeme mit Echtzeitanforderungen.<br />
Es wird unter einer angepassten GPL-Lizenz [33] verbreitet. Diese erlaubt die<br />
Integration eigener Module in eCos ohne die Verpflichtung, diese auch unter der GPL verbreiten<br />
zu müssen.<br />
In diesem Abschnitt geben wir zunächst einen kurzen Überblick über die Funktionsweise<br />
von eCos und den von der eCos User Community bereitgestellten Funktionsumfang. Anschließend<br />
beschreiben wir das Erstellen und Integrieren von neuen Funktionen. Im letzten<br />
Teil des Abschnittes wird die Toolchain und der build-Prozess von eCos erläutert.<br />
3.1.1 eCos im Detail<br />
Bei eCos handelt es sich um ein feingranular konfigurierbares Betriebssystem. Es bietet<br />
die Möglichkeit den Kern sehr spezifisch an die eigenen Anforderungen anzupassen.<br />
Hierbei wird der Anwender durch ein Konfigurationswerkzeug unterstützt. Für viele Anwendungsfälle<br />
existieren bereits Lösungen, die je nach Bedarf eingebunden werden können.<br />
Tabelle 3.1: Speichergrößen verschiedener Konfigurationen von eCos 3.0<br />
Speicherbedarf in kB<br />
Nr. Konfiguration Gesamt TCP/IP-Stack<br />
1 Standardumfang übersetzt ohne Optimierung 320,994<br />
2 Standardumfang optimiert auf Größe 175,094<br />
3 (2) mit Lightweigtht-TCP/IP-Stack 399,6 224,5<br />
4 (2) mit OpenBSD-TCP/IP-Stack 3624,3 3372,5<br />
5 Minimalkonfiguration optimiert auf Größe 52,722<br />
6 uIP-Stack 16,26<br />
In Tabelle 3.1 sind die Code- und Datenbereichsgrößen verschiedener Konfigurationen von<br />
eCos 3.0 angegeben. Anhand der Daten wird deutlich, wie entscheidend die Auswahl der<br />
richtigen Komponenten und Optionen ist, wenn insbesondere hinsichtlich des zur Verfügung<br />
stehenden Speicherplatzes optimiert werden muss. Der Ausgangspunkt des TSN ist<br />
die Konfiguration 3, welche dann entsprechend den Anforderungen erweitert wurde. Allerdings<br />
wird von Gaisler Research die Version 1.3 verwendet, so dass der Ausgangspunkt<br />
für den TSN etwas weniger Programmcode umfasst.
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Das Betriebssystem eCos ist vollständig in C implementiert, ist damit leicht erweiterbar<br />
und portierbar und bietet darüber hinaus eine C++-Schnittstelle.<br />
Basisprimitive<br />
eCos Applikationen können in mehrere Threads aufgeteilt werden, die nebenläufig ausgeführt<br />
werden. Jeder Thread besitzt einen eigenen Kontext, Stack und Priorität. Der Kern<br />
sorgt für eine nebenläufige Ausführung der Threads entsprechend ihrer Priorität. Hierbei<br />
kann zwischen einem Multi-Level- und einem Bitmap-Scheduler gewählt werden. Der<br />
Multi-Level-Scheduler erlaubt die Ausführung von mehreren Threads auf einem Prioritätslevel<br />
und wird für den TSN verwendet.<br />
Für die Kommunikation zwischen Threads werden verschiedene Primitive wie:<br />
• Flags,<br />
• Zähler,<br />
• Semaphore,<br />
• Mutexe mit Ereignisvariablen,<br />
• Mailbox,<br />
• Synchronisierte dynamische Speicherverwaltung und<br />
• Spinlocks<br />
bereitgestellt. Die Auswahl des Primitivs ist abhängig vom Anwendungsfall: Flags zum<br />
Beispiel benötigen sehr wenig Speicher, während Spinlocks ein atomares Sperren von<br />
gemeinsam genutzten Datenstrukturen bieten.<br />
Darüber hinaus enthält eCos bereits einen Hardware Abstraction Layer (HAL), über welchen<br />
der Kern ein einheitliches Interface zu den Hardware-Funktionen, wie Timer, Interrupts,<br />
Gerätetreiber usw. anbietet.<br />
Außerdem stellt eCos eines dynamisches Speichermanagement zur Verfügung. Eine statische<br />
Speicherkonfiguration des Systems ist somit nicht zwingend erforderlich. Der Speicherplatzbedarf<br />
kann zur Laufzeit an die Anforderungen angepasst werden.<br />
Netzwerkprotokoll-Stacks<br />
eCos bietet bereits eine breite Auswahl an Implementierungen des TCP/IP-Stacks. So<br />
kann zwischen einem FreeBSD, einem OpenBSD und einem lightweight TCPIP (lwIP)<br />
Stack gewählt werden. Die Stacks enthalten neben dem TCP/IPv4 Stack auch Implementierungen<br />
für IPv6, IPsec und verschiedene Routing Protokolle. Auf der Anwendungsschicht<br />
sind Implementierungen für SNMP, HTTP, (T)FTP und DHCP vorhanden.<br />
Die einzelnen Implementierungen unterscheiden sich hinsichtlich ihrer Schnittstellen bzw.<br />
Kompatibilität zu Programmschnittstellen anderer Betriebssysteme. So ist der lwIP-Stack<br />
46
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
auf Größe optimiert, jedoch vom Programmierinterface nicht kompatibel zu anderen Systemen.<br />
So stellt der lwIP-Stack eine eigenes API bereit, dass nicht kompatible zu POSIX<br />
ist. Bereits existierende Anwendungen müssen demzufolge für die Verwendung mit dem<br />
Stack angepasst werden. Für den TSN wurde jedoch aufgrund der geringen Größe und<br />
dem nicht Vorhandensein von alter Software der lwIP-Stack gewählt.<br />
Hardwareunterstützung<br />
Für eCos ist eine große Anzahl an Treibern für serielle Geräte, Ethernet-Controller und<br />
Flash sowie Anbindungen an PCMCIA, USB und PCI verfügbar.<br />
Anwendung<br />
Treiber<br />
API Bibliotheken<br />
Betriebssystemkern<br />
HAL<br />
GDB-Unterstützung<br />
Abbildung 3.1: eCos-Systemarchitektur<br />
Wie in der Systemarchitektur in Abbildung 3.1 dargestellt, bildet die HAL die unterste<br />
Schicht von eCos und stellt das Bindeglied zwischen den hardwareunabhängigen Teilen<br />
des Systems und der Hardware selbst dar. Im Konfigurationsprozess wird dies durch die<br />
Verwendung von Templates unterstützt. Ein Template bildet die Basis für eine Konfiguration<br />
und beinhaltet bereits die Auswahl der verwendeten Hardwareplattform. Anschließend<br />
können verschiedene Packages zu dieser Konfiguration hinzugefügt werden, wobei bei<br />
den Hardware-Treibern die Auswahl bereits auf die Zielplattform abgestimmt ist.<br />
Eine Portierung von eCos für den LEON-Prozessor (LEON2 und LEON3) inklusive Konfigurations-<br />
und Entwicklungswerkzeuge ist bei Gaisler Aeroflex[2] verfügbar. Bei dem Konfigurationswerkzeug<br />
handelt es sich um das Standard-Konfigurationswerkzeug von eCos.<br />
Bei den Entwicklungswerkzeugen handelt es sich um die GNU Compiler Collection, die<br />
als Cross-Compiler für die Zielplattform SPARC auf den Entwicklungsplattformen Linux,<br />
MinGW und Cygwin zur Verfügung steht. Die eCos-Quellen wurden vom Main-Branch bei<br />
der Version 1.0.8 abgespalten und können ebenfalls als Tarball bei Gaisler Aeroflex heruntergeladen<br />
werden.<br />
47
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
C-Standardbibliotheken<br />
eCos stellt eine uITRON- und eine POSIX-API [57], [42] zur Verfügung, welche die Portierung<br />
von Anwendungen, die diese Schnittstellen nutzen, erleichtert. Weiterhin ist eine vollständige,<br />
multitasking-sichere ISO-C-Standardbibliothek verfügbar. Die ISO-C-Bibliothek<br />
umfasst zahlreiche Funktionen für Dateiein- und -ausgabe, String-Manipulation und Internationalisierung.<br />
Darüber hinaus existieren Portierungen für Bibliotheken wie zlib, mathlib und OpenSSL.<br />
Leider ist die OpenSSL-Implementierung bei der für den TSN eingesetzten eCos-Version<br />
nicht vollständig, sondern bietet nur eine Untermenge der aktuellen OpenSSL-Funktionalität.<br />
Da insbesondere Implementierungen für die Krypto-Module (AES, SHA1, ECC)<br />
des LEON2-Prozessorkerns nicht vorhanden sind, wird die OpenSSL-Komponente aktuell<br />
nicht verwendet.<br />
3.1.2 Hinzufügen von Komponenten<br />
Beim Hinzufügen von neuen Funktionen in das eCos kann zwischen zwei verschiedenen<br />
Vorgehensweisen gewählt werden. Zum einen kann man die neue Funktionalität in die<br />
Applikation integrieren. In diesem Fall steht sie nur dieser Applikation zur Verfügung und<br />
kann nur schwer erneut genutzt werden. Diese Variante empfiehlt sich für spezielle Funktionen,<br />
die nur einmal genutzt werden sollen. Sie hat den Vorteil, dass hiermit ein schnelles<br />
Prototyping möglich ist und man auf keine APIs von eCos achten muss. Die zweite Vorgehensweise<br />
ist das Erstellen eines neuen Packages. In diesem Fall wird die Funktion in<br />
eCos integriert und kann mittels des Konfigurationswerkszeugs in verschiedene Applikationen<br />
integriert und innerhalb andere eCos-Module verwendet werden.<br />
In diesem Abschnitt wird das Erstellen eines neuen Packages beschrieben. Hierbei wird<br />
zunächst allgemein auf die notwendigen Schritte eingegangen. Im zweiten Teil wird das<br />
Treiber API von eCos, welches die Grundlage für viele neue Funktionen bildet, erläutert.<br />
Packages<br />
Das Hinzufügen eines neuen Packages gliedert sich im Wesentlichen in zwei Schritte:<br />
1. Einbinden in das Repository<br />
2. Registrieren in der eCos-DB<br />
Zunächst muss im Repository ein neues Verzeichnis für die Komponente angelegt werden.<br />
Hierzu wählt man im Verzeichnis packages ein Unterverzeichnis aus, welches die<br />
neue Komponente am besten charakterisiert. Dort legt man einen Verzeichnisbaum, wie<br />
in Listing 3.1 beschrieben, an.<br />
48
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
<br />
current<br />
cdl<br />
include<br />
src<br />
Listing 3.1: Package–Verzeichnisbaum<br />
Das Verzeichnis current gibt die Konfiguration an, in welche das Paket integriert wird.<br />
Hier wird im Rahmen des TSN-Projektes lediglich current verwendet. Darunter müssen<br />
die Verzeichnisse<br />
• cdl (enthält die Konfiguration für die eCos-DB),<br />
• include (enthält die öffentlichen Header des Paketes) und<br />
• src (enthält die Paketquellen)<br />
angelegt werden. Im Verzeichnis include kann ein beliebiger Baum eingehangen werden,<br />
der dann komplett in den build-Baum 1 von eCos kopiert wird. Die Paketquellen sollten<br />
ohne Unterverzeichnisse unter src abgelegt werden. Das Erstellen eines Makefiles<br />
ist nicht notwendig. Dies erfolgt automatisch beim build-Prozess. Die hierfür notwendigen<br />
Definitionen werden im Verzeichnis cdl vorgegeben.<br />
Im Verzeichnis cdl wird die Konfigurationsdatei für das Paket abgelegt. Sie ist zwingend<br />
erforderlich für das Registrieren der Komponente in der eCos DB. Listing 3.2 zeigt die<br />
Definition für einen seriellen Treiber für den LEON2 Prozessor.<br />
cdl_package CYGPKG_IO_SERIAL_SPARC_LEON {<br />
display "SPARC Leon2 serial device drivers"<br />
parent<br />
active_if<br />
active_if<br />
requires<br />
include_dir<br />
description<br />
CYGPKG_IO_SERIAL<br />
CYGPKG_IO_SERIAL<br />
CYGPKG_HAL_SPARC_LEON<br />
CYGPKG_ERROR<br />
cyg/io<br />
"This option enables the serial device drivers for<br />
the SPARC Leon2."<br />
}<br />
compile -library=libextras.a leon_ser.c<br />
Listing 3.2: Package–Defintion<br />
Hier kann angegeben werden, wie der Name des Pakets ist (im Beispiel CYPPKG_IO_<br />
SERIAL_SPARC_LEON). Dieser sollte eindeutig sein. Über das Schlüsselwort include_<br />
dir legt man fest, wo die Header im build-Baum zu finden sind. Für eine detailierte Beschreibung<br />
der Konfigurationsdatei sei an dieser Stelle auf [5] verwiesen.<br />
1 Eine genauer Beschreibung des build-Baumes erfolgt im Abschnitt 3.1.3.<br />
49
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Um das neue Paket letztendlich in der eCos-DB zu registrieren, muss es in die Datei<br />
ecos.db eingetragen werden. Listing 3.3 zeigt dies für das in Listing 3.2 eingeführte Beispiel.<br />
package CYGPKG_IO_SERIAL_SPARC_LEON {<br />
alias<br />
{"SPARC Leon2 serial device drivers"<br />
devs_serial_sparc_leon leon_serial_driver }<br />
hardware<br />
directory<br />
devs/serial/sparc/leon<br />
script<br />
ser_sparc_leon.cdl<br />
description "SPARC Leon2 serial device drivers"<br />
}<br />
Listing 3.3: Package–Registration<br />
Hardware-Treiber, wie in unserem Beispiel, müssen einem target zugewiesen werden.<br />
Hierfür muss der Paketname beim zugehörigen Target in die package-Liste aufgenommen<br />
werden. Das Aktivieren des Paketes erfolgt dann zusammen mit der Auswahl der<br />
Zielplattform.<br />
Treiber API<br />
eCos bietet für Treiber ein einheitliches API, so dass die Nutzung von verschiedenen Treibern<br />
analog erfolgt. Jeder Treiber bietet die folgenden Funktionen an:<br />
cyg_io_lookup() Diese Funktion empfängt einen Treibernamen, sucht den Namen in der<br />
Systemtreibertabelle und liefert der Anwendung eine Referenz (Handle) auf den Treiber<br />
zurück. Diese Referenz wird von den nachfolgend beschriebenen Methoden benötigt.<br />
cyg_io_get_config(), cyg_io_set_config() Die API-Aufrufe ermöglichen das Lesen und<br />
Schreiben von Konfigurationsdaten des Gerätetreibers.<br />
cyg_io_read(), cyg_io_write() Diese API-Aufrufe dienen dazu, Daten vom Treiber zu lesen<br />
bzw. an diesen zu übergeben.<br />
Beim Hinzufügen eines neuen Treibers, ob als Package oder in der Applikation, müssen<br />
diese Funktionen implementiert werden. Darüber hinaus muss der Gerätetreiber außerdem<br />
die folgenden Elemente definieren:<br />
• eine DEVTAB_ENTRY-Struktur und<br />
• eine DEVIO_TABLE-Struktur.<br />
Die DEVTAB_ENTRY-Struktur definiert den Namen und die Einsprungpunkte für die Initialisierungsroutinen<br />
des Treibers. Listing 3.4 zeigt die Definition für einen seriellen Gerätetreiber,<br />
der anschließend mittels cyg_io_lookup(¨/dev/ser0¨) angesprochen werden<br />
kann.<br />
50
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
DEVTAB_ENTRY(_leon_ser_io1,<br />
"/dev/ser0",<br />
0, // Does not depend on a lower level interface<br />
&cyg_io_serial_devio,<br />
_leon_ser_init,<br />
_leon_ser_lookup, // Serial driver may need initializing<br />
&_leon_ser_channel1<br />
);<br />
Listing 3.4: Device Table<br />
Die Initialisierungsfunktion _leon_ser_init() wird bei Starten des Systems aufgerufen.<br />
Der Treiber kann hier allgemeine Initialisierungen durchführen. Der Aufruf der Funktion<br />
_leon_ser_lookup() erfolgt bei der Anforderung des Treibers durch die Applikation.<br />
Weiterhin verweist die Struktur auf eine DEVIO_TABLE-Struktur, die die Einsprungpunkte<br />
der Treiberfunktionen enthält. Für einen seriellen Treiber sind dies zum Beispiel die Funktionen<br />
aus dem Listing 3.5.<br />
DEVIO_TABLE(cyg_io_serial_devio,<br />
serial_write,<br />
serial_read,<br />
serial_select,<br />
serial_get_config,<br />
serial_set_config<br />
);<br />
Listing 3.5: Device IO Table<br />
Die Funktionen serial_write() und serial_read() werden zur Datenübertragung<br />
an den bzw. vom Treiber verwendet. Mittels der Funktion serial_select() kann auf ein<br />
Ereignis, z.B. das Eintreffen von Daten, gewartet werden. Das Konfigurieren des Treibers<br />
erfolgt über die Funktionen serial_get_config() und serial_set_config().<br />
3.1.3 build-Prozess<br />
Das Erstellen einer eCos Applikation unterteilt sich in zwei Schritte. Im ersten Schritt muss<br />
eCos konfiguriert und übersetzt werden. Als Ergebnis wird eine Bibliothek erstellt, die im<br />
zweiten Schritt in die Zielapplikation eingebunden wird. Dieser Abschnitt enthält eine Beschreibung<br />
dieser Schritte, zuvor wird kurz auf die notwendige Toolchain eingegangen.<br />
Toolchain<br />
Der LEON2-Prozessor basiert auf der SPARC-Architektur, so dass die GnuTools für SPARC<br />
verwendet werden können. Beim Erstellen der Toolchain muss man zwischen den Entwicklungsplattformen<br />
unterscheiden. Während für Windows die Tools nahezu vollständig von<br />
[2] heruntergeladen werden können, müssen sie für Linux selbst erstellt werden.<br />
51
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Microsoft Windows Entwicklung Für die Entwicklung unter Microsoft Windows 2 muss<br />
die Cygwin Umgebung von RedHat [11] verwenden werden. Hierzu muss zunächst Cygwin<br />
inklusive der Entwicklungswerkzeuge (gcc, make, autoconf und automake) installiert werden.<br />
Anschließend kann die Toolchain entpackt werden, dies kann mittels des folgenden<br />
Kommandos erfolgen:<br />
cd /usr/local<br />
tar xjf /tmp/sparc-rtems-4.6.5-gcc-3.2.3-1.0.16-cygwin.tar.bz2<br />
Hierbei wird davon ausgegangen, dass das Paket zuvor in dem Verzeichnis c:\cygwin\<br />
tmp abgelegt wurde. Die Installation kann auch in ein anderes Verzeichnis erfolgen, jedoch<br />
gehen die folgenden Beschreibungen davon aus, dass sich der Compiler unter /usr/local<br />
befindet.<br />
Nach der Installation der Compiler-Suite muss das eCos Konfigurationstool configtool-<br />
-2.11-setup.exe installiert werden. Dieses kann ebenfalls unter [2] heruntergeladen<br />
werden. Das Tool wird als natives Windows-Programm angeboten, welches direkt installiert<br />
und anschließend über das Startmenü ausgeführt werden kann.<br />
Für das Übersetzen von eCos auf der Kommandozeile, ohne Nutzung des Configtools,<br />
wird ein Makefiles für cygwin-Umgebung bereitgestellt. Es befindet sich im Verzeichnis<br />
oberhalb der ecos-Quellen. Diese Makefile nutzt für den Aufbau der build-Trees und zum<br />
Überprüfen der Konfigurationsdatei das Kommandozeilentool ecosconfig. Dieses kann<br />
nicht direkt heruntergeladen, sondern muss manuell erstellt werden. Hierzu lädt man von<br />
eCosCentric [16] einen Snapshot ecos-trunk-full.tar.bz2 des ecos-CVS herunter.<br />
Anschließend ist dieses wie folgt zu übersetzen:<br />
mkdir /tmp/src<br />
cd /tmp/src<br />
tar xjf /tmp/ecos-trunk-full.tar.bz2<br />
cd ..<br />
mkdir build<br />
cd build<br />
../src/ecos/configure<br />
make<br />
cp host/tools/configtool/standalone/common/ecosconfig.exe \<br />
/usr/local/bin/<br />
Das Programm ecosconfig.exe wird von den IHP-Makefiles ohne Pfadangabe aufgerufen,<br />
so dass darauf zu achten ist, dass /usr/local/bin im Suchpfad enthalten ist.<br />
Linux Entwicklung Unter Linux muss zunächst die Toolchain erstellt werden. Hier zu ist<br />
unter [55] eine Anleitung zu finden. Als TARGET sollte sparc-elf verwendet werden.<br />
2 Die Beschreibungen zur Entwicklungsumgebung wurden ausschließlich unter Microsoft Windows XP Professional<br />
(Service Pack 3) getestet.<br />
52
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Nach der Installation der Toolchain muss das eCos Konfigurationstool installiert werden.<br />
Dieses kann wiederum bei Gaisler Aeroflex (ecosconfig.zip) heruntergeladen werden.<br />
Das zip-Archiv enthält sowohl die GUI- als auch die Kommandozeilenversion des Programmes.<br />
Für die GUI-Version ist die Bibliothek wxGTK-2.4.2 notwendig. Auf aktuellen<br />
Distributionen, z.B. debian lenny, ist meist eine neuere Version der Bibliothek installiert.<br />
Da das Programm jedoch direkt auf die Version 2.4.2 der Bibliothek verweist, empfiehlt<br />
es sich diese mit der korrekten Version aus den Quellen zu übersetzen und zusätzlich zu<br />
installieren.<br />
eCos konfigurieren und übersetzen<br />
In diesem Abschnitt wird das Konfigurieren und das Übersetzen von eCos beschrieben.<br />
Hierbei wird davon ausgegangen, dass die Toolchain unter /usr/local installiert ist und<br />
die eCos-Quellen vom IHP bezogen wurden. Das Wurzelverzeichnis der Quellen sollte die<br />
folgende Struktur aufweisen:<br />
apps Verzeichnis mit den Quellen der eCos Applikationen.<br />
cfg Verzeichnis mit den Konfigurationsdateien.<br />
ecos-rep-1.0.8 Verzeichnis mit den Quellen des eCos Betriebssystems.<br />
Makefile Globale Steuerungsdatei zum Erstellen von eCos.<br />
Im Verzeichnis cfg sollte eine Datei mit dem Namen tsn.ecc vorhanden sein. Hierbei<br />
handelt es sich um die Konfigurationsdatei für eCos. Um die Datei zu bearbeiten, muss<br />
das Programm configtool gestartet werden. Beim Start des Programms muss als Repository<br />
das Verzeichnis ecos-rep-1.0.8 angegeben werden. Anschließend kann über<br />
den Menüpunkt Datei/Öffnen die Konfiguration geladen werden. Es ist darauf zu achten,<br />
dass die Datei nach den Änderungen wieder unter cfg/tsn.ecc gespeichert werden<br />
muss.<br />
Anschließend kann eCos durch den Aufruf make übersetzt werden. Wurde die Konfiguration<br />
unter einem anderen Namen gespeichert, kann die neue Konfiguration mittels make<br />
TARGET= verwendet werden. Nach jeder Änderung an der Konfiguration<br />
ist eCos komplett neu zu übersetzen. Hierzu kann mittels make distclean das Kompilat<br />
gelöscht werden.<br />
Wurde die Toolchain in einem anderen Verzeichnis installiert, muss die Option Configuration/Global<br />
build options/Global command prefix entsprechend konfiguriert<br />
werden.<br />
Nach dem Übersetzen von eCos sollten die Verzeichnisse tsn_build und tsn_install<br />
vorhanden sein. Das Verzeichnis tsn_install enthält die Header und die Bibliotheken<br />
zum Erstellen von eCos Applikationen. Beim Verzeichnis tsn_build handelt es sich um<br />
den build-Tree von eCos.<br />
53
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Applikation erstellen<br />
In der, vom IHP erstellten, Verzeichnisstruktur werden Applikationen im Unterverzeichnis<br />
apps abgelegt. Hier existiert für jede Applikation ein separates Verzeichnis mit den<br />
Quellen und einem Makefile. Darüber hinaus wurde hier das Verzeichnis lib für Applikationsbibliotheken<br />
angelegt. Im Folgenden wird das Erstellen und Übersetzen einer<br />
eCos-Applikation für den TSN erläutert. Dies umfasst das Anpassen der Makefiles, die<br />
Vorstellung eines Skeleton 3 für eine einfache Applikation und das Erstellen einer Applikationsbibliothek.<br />
Basiskonfiguration Die Basiskonfiguration für die build-Umgebung wird in die Datei<br />
defs.mk eingetragen. Hierbei handelt es sich um ein Include für die Makefiles der Applikationen.<br />
Die Variablen haben hierbei die folgende Bedeutung:<br />
VPATH legt den Pfad zur Toolchain fest. Die Variable muss auf das Verzeichnis mit den<br />
Binaries, in der Regel bin, verweisen.<br />
PREFIX gibt den Prefix der Binaries an. Hier sollte der gleiche Prefix, wie für eCos verwendet<br />
werden. Unter Windows ist dies sparc-rtems- und unter Linux sparc-elf-.<br />
VERSION gibt den Namen der zu verwendenden Konfiguration an.<br />
Die Datei build.sh aus dem Verzeichnis apps muss nicht angepasst werden. Sie wird<br />
von den Makefiles zur Erstellung der build-Nummer 4 verwendet.<br />
Skeleton einer Applikationen Das Erstellen einer Applikation erfolgt durch den Aufruf<br />
von make im Applikationsverzeichnis. Anschließend sollte eine Datei mit dem gleichen<br />
Namen wie des Verzeichnisses vorhanden sein. Die Datei kann dann mittels grmon 5 auf<br />
die Zielhardware übertragen werden.<br />
Um eine neue Applikation zu erstellen, legt man unter apps ein neues Verzeichnis an und<br />
kopiert ein Makefile aus einem der anderen Applikationsverzeichnisse hinein. In dieser<br />
Datei sind anschließend die folgenden Variablen anzupassen:<br />
TARGET legt den Namen der Applikation fest, sollte identisch mit dem Verzeichnisnamen<br />
sein.<br />
OBJS enthält eine Auflistung aller Objektdateien des Programms.<br />
3 Grundgerüst, dass durch den Anwendungsprogrammierer aufgefüllt wird<br />
4 Bei der build-Nummer handelt es sich um die globale Variable build_ver die über das Include<br />
build.h eingebunden werden kann. Sie wird bei jedem Aufruf von make inkrementiert und mittels make<br />
distclean zurückgesetzt.<br />
5 Bei grmon handelt es sich um den General Debugging Monitor von Gaisler Aeroflex. Das Programm wird<br />
kommerziell über die Homepage von Gaisler (http:\\www.gaisler.com) mit einem Hardware-Dongle vertrieben.<br />
54
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
DEFINES enthält eine Auflistung von Defines, die dem Compiler übergeben werden sollen.<br />
Die Angabe muss ohne das Prefix -D erfolgen, dieses wird automatisch hinzugefügt.<br />
ULIBS enthält eine Liste von Bibliotheken, die mit in das Programm eingebunden werden<br />
sollen. Hierbei sind nicht die eCos Bibliotheken anzugeben.<br />
Im eCos des TSN wird keine main() Funktion unterstützt. Eine Applikation beginnt immer<br />
mit der Funktion cyg_user_start(). Listing 3.6 zeigt das Grundgerüst für eine TSN<br />
eCos Applikation.<br />
#include <br />
#include <br />
#include "build.h"<br />
static cyg_handle_t _simple_thread;<br />
static cyg_thread _thread_s;<br />
static char _stack[4096];<br />
static void _app_thread(cyg_addrword_t data)<br />
{<br />
diag_printf("\r\neCos Application (build %d)\r\n",<br />
(unsigned int) data);<br />
for (;;) {<br />
/* waiting forever */<br />
}<br />
}<br />
return;<br />
void cyg_user_start(void)<br />
{<br />
(9, _app_thread, (cyg_addrword_t) build_ver, "app",<br />
(void *) &_stack[0], 4096, &_simple_thread,<br />
&_thread_s);<br />
}<br />
cyg_thread_resume(_simple_thread);<br />
Listing 3.6: Application Skeleton<br />
Die Applikation des Skeleton startet einen neuen Thread mit der Priorität 9 und der Funktion<br />
_app_thread(). Als Argument wird ihr die externe Variable build_ver, die von dem<br />
Skript build.sh erzeugt wird, übergeben. Die Funktion gibt eine kurze Meldung auf der<br />
Debug-Konsole des LEON2 Prozessor aus und wartet anschließend in einer Endlosscheife.<br />
Bibliothek erstellen Erstellt man Funktionen, die in mehreren Applikationen genutzt<br />
werden sollen, kann es zweckmäßig sein, diese in eine Bibliothek auszulagern. Hierzu<br />
55
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
erstellt man unter apps ein Verzeichnis mit dem Namen der Bibliothek und darin die Verzeichnisse:<br />
include enthält die Header der Bibliothek und<br />
lib enthält die Quelltextdateien der Bibliothek.<br />
In das Verzeichnis libs wird ein Makefile aus einer bereits vorhandenen Bibliothek<br />
kopiert. Hier müssen, wie bei einer Applikation, die Variablen TARGET und OBJS angepasst<br />
werden. Es ist darauf zu achten, dass die Bibliothek keine Funktion mit dem Namen<br />
cyg_user_start() enthält.<br />
56
4 Softwarearchitektur des TSN<br />
Nach der Einführung in eCos wird in diesem Abschnitt die Softwarearchitektur des TSN im<br />
Detail vorgestellt. Als Basis für das System wird eCos mit einer minimalen Konfiguration<br />
gewählt. Darauf aufbauend wurden alle Services und Treiber hinzugefügt, die für den TSN<br />
benötigt werden. Abbildung 4.1 zeigt die Architektur im Überblick.<br />
Management Thread<br />
Application<br />
eCos<br />
Driver/Services<br />
Sensor<br />
Thread<br />
Sensor API<br />
Sensor<br />
Protocol<br />
Bridge<br />
Thread<br />
LwIP<br />
PPP<br />
KeyExchange<br />
Thread<br />
CryptAPI<br />
GPIO drv SPI drv UART drv<br />
MMIO drv<br />
TSN<br />
Hardware<br />
GPIO SPI UART<br />
ECC<br />
SHA1<br />
AES<br />
ext.<br />
Hardware<br />
PIR<br />
Sensor<br />
Accelerator<br />
Sensor<br />
802.15.4<br />
Radio<br />
Bluetooth<br />
Radio<br />
Abbildung 4.1: Softwarearchitektur des TSN<br />
Die Module des TSN lassen sich in zwei Funktionsgruppen unterteilen. Dies ist zum einen<br />
die Sensorik des Knotens. Hierzu gehört der Sensor-Thread und das SensorAPI inklusive<br />
der zugehörigen Treiber. Der zweite Teil umfasst das Sensor-Protokoll, den lwIP-Stack,<br />
PPP und das CryptAPI mit den zugehörigen Threads. Diese Funktionsgruppe ist für die<br />
Weiterleitung der Sensordaten aus dem 802.15.4 in ein TCP/IP-Netzwerk verantwortlich.<br />
Hierbei werden die Daten mittels des CryptAPI verschlüsselt. Die Schlüsselaushandlung<br />
übernimmt der KeyExchange-Thread. Für die Steuerung der Threads ist der Management-<br />
Thread verantwortlich.<br />
Bis auf den lwIP-Stack und PPP, welche bereits Bestandteil von eCos sind, wurden alle<br />
Komponenten der Architektur im Rahmen des TSN-Projektes implementiert. Hierbei wurden<br />
Frameworks und APIs erstellt, die entsprechend den letztendlichen Anforderungen an<br />
den TSN im Detail implementiert werden müssen.
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
4.1 Gerätetreiber<br />
Bei der Beschreibung von eCos im Kapitel 3.1 wurde bereits erwähnt, dass von Gaisler<br />
Aeroflex ein Portierung für den LEON2Prozessor erstellt wurde. Diese Portierung umfasst<br />
im Wesentlichen den HAL für den Prozessor. Im Rahmen des TSN-Projektes war es notwendig,<br />
zusätzliche Treiber für die Peripheriegeräte zu erstellen. Hierzu gehören Treiber<br />
für die seriellen Schnittstellen UART und SPI, für GPIO und für das memory-like Interface<br />
der kryptografischen Komponenten.<br />
Dieser Abschnitt enthält eine Beschreibung der im Rahmen des TSN-Projektes zu eCos<br />
hinzugefügten Treiber. eCos unterstützt eine Vielzahl zusätzlicher Peripheriegeräte für die<br />
bereits Treiber existieren. Eine Beschreibung dieser Treiber ist nicht Bestandteil dieses<br />
Abschnittes, hier sei auf die Dokumentation von eCos [15] verwiesen.<br />
4.1.1 UART Treiber<br />
Der LEON2-Prozessor verfügt, wie in Abbildung 2.1 dargestellt, über zwei UART-Schnittstellen.<br />
An eine dieser Schnittstellen wird das Bluetooth-Modul angeschlossen. Eine Erläuterung<br />
hierzu erfolgt im Abschnitt 4.3.3. Die Schnittstelle wird durch den PPP Netzwerk-<br />
Layer für die Übertragung der Netzwerkpakete an die Basisstation verwendet.<br />
In der Portierung von Gaisler Aeroflex wurde die UART1 als Diagnoseschnittstelle genutzt.<br />
Diese Schnittstelle kann über /dev/haldiag geöffnet und verwendet werden. Allerdings<br />
ist die Hardware nur eingeschränkt nutzbar, da Lesezugriffe das System blockieren und<br />
nicht beliebige Zeichen übertragen werden können. Aus diesem Grund kann der vorhandene<br />
Treiber nicht genutzt werden und wird daher durch einen neuen Treiber ersetzt, welcher<br />
das in Abschnitt 3.1.2 beschriebene Interface in vollem Umfang unterstützt.<br />
Die Implementierung des Treibers ist in den Quellen von eCos im Verzeichnis devs/serial/sparc/leon/<br />
zu finden. Das Package ist Bestandteil des LEON2-Hardware und<br />
kann nur zusammen mit dieser konfiguriert werden. Die Konfiguration des Treibers ist im<br />
eCos Configuration Tool unter<br />
I/O sub-system<br />
Serial device drivers<br />
SPARC Leon2 serial device drivers<br />
SPARC Leon2 serial CON1 port driver<br />
SPARC Leon2 serial CON2 port driver<br />
zu finden. Jede UART-Schnittstelle kann im Konfigurationswerkzeug separat aktiviert und<br />
deaktiviert werden. Darüber hinaus lässt sich festlegen, über welchen Verzeichniseintrag<br />
das Gerät angesprochen werden kann. Zusätzlich existiert eine Option für die Größe eines<br />
Zwischenpuffers. Dieser Puffer wird für den Interrupt-basierten Betrieb der Schnittstelle<br />
benötigt. Im Interrupt-Handler der Schnittstelle werden, bei Vorhandensein des Puffers, die<br />
58
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Daten vom Gerätespeicher in den Puffer kopiert. Die Anwendung liest die Daten in diesem<br />
Fall nur noch aus dem Puffer und nicht mehr direkt aus dem Gerätespeicher. Wenn der<br />
Puffer voll ist und weiterhin Daten eintreffen, werden diese verworfen. Die Verwendung<br />
eines Puffers hat den Vorteil, dass hierin wesentlich mehr Daten zwischengespeichert<br />
werden können als im Gerätespeicher und somit der Datenverlust reduziert werden kann.<br />
Über die Funktion serial_set_config() können die Parameter der Schnittstelle verändert<br />
werden. Hierbei unterstützt das API von eCos jedoch mehr Funktionen als die Hardware<br />
des LEON2. So können hierüber die folgenden Parameter verändert werden.<br />
• Baudrate<br />
• Parität (None, Even und Odd)<br />
• Flowcontrol<br />
Die Datenbreite (8 Bit) und die Anzahl der Stoppbits (1) ist nicht frei konfigurierbar. Eine<br />
andere Konfiguration dieser Parameter lässt die Hardware des LEON2 nicht zu.<br />
4.1.2 SPI Treiber<br />
Neben den, im Abschnitt 4.1.1 beschriebenen UART-Schnittstellen, verfügt der LEON2-<br />
Prozessor über eine SPI-Schnittstelle zum Anschluss von maximal drei Peripheriegeräten.<br />
Die Schnittstelle wird, wie in Abbildung 2.1 dargestellt, für die 802.15.4 Module und für den<br />
Beschleunigungssensor verwendet.<br />
Die von Gaisler Research zur Verfügung gestellten eCos Quellen beinhalten keinen SPI-<br />
Treiber. Die Implementierung musste vollständig im Rahmen des TSN-Projektes erfolgen.<br />
Als Basis für den Treiber wurde der generische IO-Treiber von eCos verwendet. Dieser<br />
stellt Funktionen zum Lesen und zum Schreiben von Daten und zum Konfigurieren der<br />
Schnittstelle bereit. Der Zugriff auf das Gerät erfolgt wiederum über ein zeichenorientiertes<br />
Gerät, welches mittels der Funktion cyg_io_lookup() angefordert werden kann.<br />
Anschließend kann die Applikation mit den Lese- und Schreibfunktionen Daten senden<br />
und empfangen. Das Einstellen der Schnittstellenparameter erfolgt mittels der Funktion<br />
cyg_io_set_config().<br />
Der SPI-Treiber ist im Verzeichnis devs/spi/sparc/leon/ in die eCos Quellen integriert.<br />
Die Konfiguration ist im Konfigurationswerkzeug unter den folgenden Einträgen zu<br />
finden:<br />
I/O sub-system<br />
SPI support<br />
Sparc LEON2 SPI drivers<br />
Enable support for SPI<br />
Enable Chip Select 0<br />
Device name for Sparc LEON2 SPI CS0<br />
Enable Chip Select 1<br />
Device name for Sparc LEON2 SPI CS1<br />
59
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Enable Chip Select 2<br />
Device name for Sparc LEON2 SPI CS2<br />
Das SPI-Modul unterstützt, wie in Abbildung 4.2 dargestellt, bis zu drei Slave-Geräte, die<br />
über das Chip Select Signal (CSn) adressiert werden. Der LEON2-Prozessor agiert immer<br />
als Master und legt fest, zu welchem Slave die Daten übertragen werden sollen. Ein SPI-<br />
Slave kann keinen Datentransfer initiieren, er kann nur auf Anforderungen des Masters<br />
reagieren 1 . Über den Eintrag Enable Chip Select n des Konfigurationswerkzeuges kann<br />
der Nutzer festlegen, ob ein Slave für diese Select Leitung existiert. Beim TSN werden nur<br />
CS0 und CS1 verwendet.<br />
Die Datenübertragung erfolgt über die Leitungen MISO (Master In Slave Out) und MOSI<br />
(Master Out Slave In). Mit jedem Takt auf der Clock Leitung CLK wird ein Bit vom Master<br />
an den Slave und ein Bit vom Slave an den Master übertragen.<br />
CLK<br />
MISO<br />
MOSI<br />
CS0<br />
SPI<br />
Slave 0<br />
SPI<br />
Master<br />
CLK<br />
MISO<br />
MOSI<br />
CS0<br />
CS1<br />
CS2<br />
CLK<br />
MISO<br />
MOSI<br />
CS1<br />
SPI<br />
Slave 1<br />
CLK<br />
MISO<br />
MOSI<br />
CS2<br />
SPI<br />
Slave 2<br />
Abbildung 4.2: SPI Chip Select<br />
4.1.3 MMIO Treiber<br />
Wie in [27] beschrieben, werden die kryptografischen Module des LEON2-Prozessors über<br />
ein Memory Mapped Input Output (MMIO) Interface eingebunden. Zugriffe auf die Module<br />
werden in Speicherschreib- und Speicherleseoperationen gekapselt. Die verschiedenen<br />
Einheiten/Register der Module sind jeweils an spezifischen Adressen im IO-Bereich des<br />
LEON2-Prozessors 2 eingeblendet.<br />
1 Zur Signalisierung vom SPI-Slave zum Master wird ein Pin des TSN als IRQ verwendet. Der Master kann<br />
nach dem Empfang des Interrupt den Status und die Nachricht beim Slave erfragen.<br />
2 Der virtuelle Speicher des LEON2 wird in mehrere Bereiche unterteilt, die jeweils eine andere Hardware-<br />
Einheit adressieren. Der IO-Bereich beginnt an der Adresse 0x20000000 und der physische RAM an<br />
Adresse 0x40000000.<br />
60
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Der Zugriff auf diese Bereiche erfolgt über den MMIO Treiber. Die Implementierung des<br />
Treibers befindet sich in dem Verzeichnis io/mmio und kann über die Option Memory<br />
mapped I/O device drivers konfiguriert werden. Da der Treiber zunächst nur einen strukturierten<br />
Zugriff auf einen beliebigen Speicherbereich bereitstellt, ist dieser nicht an die<br />
LEON2-Hardware und damit an das zugehörige Template gebunden.<br />
Eine Instanz des Treibers kann über /dev/memio/ angefordert werden.<br />
Ein direkter Zugriff auf /dev/memio ist nicht möglich, es ist immer die zusätzliche<br />
Angabe eines Instanznamens notwendig. Nach dem Anfordern der Instanz kann der Bereich<br />
mit den in Tabelle 4.1 beschriebenen Kommandos konfiguriert werden. Anschließend<br />
können mittels cyg_io_read() und cyg_io_write() Daten in Bereich geschrieben<br />
oder von dort gelesen werden.<br />
Der MMIO-Treiber bildet die Basis für die Zugriffe auf die kryptografischen Module des<br />
LEON2-Prozessors. Somit sind keine Treiber für die einzelnen Module notwendig. Das<br />
CryptAPI aus Abschnitt 4.2.1 greift über den MMIO Treiber direkt auf die kryptografischen<br />
Module der CPU zu.<br />
Kommando<br />
CYG_IO_CONFIG_MEMIO_ADRBASE<br />
CYG_IO_CONFIG_MEMIO_LENGTH<br />
CYG_IO_CONFIG_MEMIO_ENABLE_CACHE<br />
CYG_IO_CONFIG_MEMIO_CONTEXT<br />
CYG_IO_CONFIG_MEMIO_GET_ALL_INSTANCES<br />
Beschreibung<br />
Setzt die Basisadresse des Speicherbereichs<br />
Legt die Größe des<br />
Speicherbereichs fest<br />
Aktiviert das Caching der Daten<br />
Erlaubt das Setzen der Option<br />
Address, Length und Cache mit<br />
einem Aufruf<br />
Gibt ein Array auf alle im Treiber<br />
registrierten Bereiche zurück<br />
Tabelle 4.1: Konfigurationskommandos des MMIO Treibers<br />
4.1.4 General Purpose Input/Output (GPIO) Treiber<br />
Der LEON2 verfügt über 32 I/O Pins, welche in 16-Low und 16-High-Pins aufgeteilt werden.<br />
Die oberen 16 Pins (High-Pin) sind nur nutzbar, wenn der Speicherzugriff im 8-bit<br />
oder im 16-bit Modus erfolgt und der SD-Ram Controller nicht genutzt wird. Beim Leon-2<br />
des TSN sind die oberen 16 Pins für die Chip-interne Nutzung vorgesehen, so dass sie<br />
nicht aus dem Chip-Package geführt sind. In eCos können aus diesem Grund lediglich<br />
die unteren 16 Pins über das GPIO-Treiber Interface angesprochen werden. Die meisten<br />
der verfügbaren GPIOs werden für die UART-Schnittstellen des TSN verwendet und wäre<br />
nur verfügbar, wenn man auf diese Schnittstellen verzichtet [3]. Die freien GPIOs werden<br />
für die Anbindung des passiven Infrarotsensors und zum Steuern des Bluetooth-Moduls<br />
verwendet.<br />
Um eine einheitliche Nutzung der Schnittstelle zu gewährleisten, werden alle Pins durch<br />
einen Treiber verwaltet. Der Treiber ist Bestandteil des eCos-Kerns und kann über die Op-<br />
61
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
tion ”Enable gpio support” im Konfigurationswerkzeug aktiviert werden. Der Treiber bietet<br />
Funktionen zum Konfigurieren der GPIOs, zum Auslesen und des Setzen des Levels und<br />
zum Aktiviere sowie Deaktivieren eines Interrupts an.<br />
Mittels der Funktion hal_gpio_set_direc() kann die Richtung des GPIOs festgelegt<br />
werden. Ein GPIO kann als Ausgang oder als Eingang genutzt werden. Ist der GPIO als<br />
Eingang definiert, kann mittels der Funktion hal_gpio_get() das aktuelle Level des Pins<br />
erfragt werden. Das Setzen des Levels erfolgt mittels hal_gpio_set(). Das Auslesen<br />
und Setzen des GPIO-Levels ist jederzeit möglich.<br />
Der LEON2 Prozessor unterstützt bis zu vier Interrupt-Vektoren für seine 16 GPIO-Pins.<br />
Für das Konfigurieren des Interrupt-Handlers wird Funktion hal_gpio_cfg_irq() bereitgestellt.<br />
Die Funktion wählt einen freien Interrupt-Vektor aus und registiert die übergebene<br />
callback-Funktion. Sind bereits alle Interrupt-Vektoren belegt, wird ein Fehler zurückgegeben.<br />
Beim Konfigurieren des Interrupts kann zusätzlich festgelegt werden, ob der<br />
Interrupt bei einem Flankenwechsel (edge-triggered) oder bei einem bestimmten Level<br />
(level-triggered) auslösen soll. Über einen weiteren Parameter wird das Level festgelegt.<br />
Bei einem edge-triggered Interrupt legt das Level fest, ob dieser bei einer fallenden (lowlevel)<br />
oder steigenden Flanke (high-level) ausgelösen soll.<br />
Das Aktivieren des Interrupts erfolgt mittels der Funktion hal_gpio_enable_gpio().<br />
Nach der Ausführung dieser Funktion, wird der Interrupt-Hander aufgerufen, wenn ein der<br />
Konfiguration entsprechender Interrupt aufgetreten ist. Das Deaktivieren des Interrupt erfolgt<br />
mittels der Funktion hal_gpio_disable_gpio(). Zum Reaktivieren des Interrupts<br />
muss dieser nicht erneut konfiguriert werden. Stattdessen ist es ausreichend, wenn die<br />
Funktion hal_gpio_enable_gpio() aufgerufen wird.<br />
4.2 Services<br />
Neben den im Abschnitt 4.1 eingeführten Treibern, wurde eCos um zwei zusätzliche Services<br />
erweitert. Die Services können von beliebigen eCos Applikationen verwendet werden.<br />
Hierzu gehört das CryptAPI, über welches die Hardware-beschleunigten kryptografischen<br />
Funktionen des LEON2-Prozessor angeboten werden, und das SensorAPI, welches<br />
eine einheitliche Schnittstelle für die Sensorik des TSN bietet.<br />
Die beiden Services können über die Packages CryptAPI und SensorAPI ausgewählt werden.<br />
Da sie von Hardwarefunktionen des TSN abhängig sind, sind sie an die LEON2-<br />
Hardware gebunden. In der Konfiguration des TSN tsn.ecc sind beide Packages aktiviert.<br />
4.2.1 CryptAPI<br />
Das CryptAPI stellt eine einheitliche Schnittstelle auf die kryptografischen Module des LE-<br />
ON2-Prozessors bereit. Die Implementierung ist jedoch nicht auf die Hardware-Funktionen<br />
62
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
beschränkt. Das API wurde so definiert, dass zur Laufzeit zusätzliche Algorithmen hinzugefügt<br />
und wieder entfernt werden können. Im Rahmen des TSN-Projektes wurden die<br />
folgenden Algorithmen in das API integriert:<br />
• AES, Software-Implementierung des AES,<br />
• AES_HW, Treiber für die AES-Einheit des LEON2,<br />
• SHA1, Treiber für die SHA1-Einheit des LEON2,<br />
• PRNG, Pseudo-Zufallszahlen Generator auf Basis der SHA1-Einheit des LEON2,<br />
• ECC, Treiber für die ECC-Einheit des LEON2,<br />
• ECDSA, Implementierung von ECDSA nach ANSI X9.62 auf Basis der SHA1- und<br />
der ECC-Einheit des LEON2 und<br />
• EL-Gamal, Implementierung von EL-Gamal nach ANSI X9.63 auf Basis der ECC-<br />
Einheit des LEON2.<br />
Die Implementierung des API befindet sich in dem Verzeichnis services/crypt_api<br />
und ist im Konfigurationswerkzeug direkt unter dem Punkt CryptAPI zu finden. Für den<br />
AES Algorithmus wurden die beiden Modi Electronic Code Book (ECB) und Cipher Block<br />
Chaining (CBC) implementiert, die separat in dem Konfigurationswerkzeug ausgewählt<br />
werden können.<br />
Registrieren von Crypto-Algorithmen<br />
Einleitend wurde erwähnt, dass zur Laufzeit des TSN Algorithmen hinzugefügt und entfernt<br />
werden können. Hierfür stellt das API die beiden Funktionen crypt_api_register()<br />
und crypt_api_unregister() zur Verfügung. Beim Anmelden eines Algorithmus wird<br />
der Funktion ein Objekt vom Type crypt_api_alg_t übergeben. Dieses enthält die Parameter<br />
und Verweise auf die Implementierung des Algorithmus. Zu den Parametern gehört<br />
dessen Name, die Blockgröße und die Schlüsselgröße. Der Name muss eindeutig<br />
sein, da über diesen später eine Instanz des Algorithmus angefordert wird.<br />
Ein Algorithmus kann erst dann aus dem System entfernt werden, wenn keine weitere<br />
Instanz geöffnet ist. Ein genauere Erläuterung hierzu erfolgt im nächsten Abschnitt.<br />
CryptAPI-Verwendung<br />
Die Algorithmen des CryptAPI werden über ein einheitliches Interface aufgerufen, so dass<br />
in einer Applikation Algorithmen des gleichen Typs (Verschlüsselung, Hash oder Signatur)<br />
leicht gegeneinander ausgetauscht werden können.<br />
Für der Nutzung des Algorithmus muss mittels der Funktion crypt_api_lookup() die<br />
ID des Algorithmus ermittelt werden. Über diese ID kann mittels crypt_api_open() eine<br />
Instanz angefordert werden. Wenn eine Applikation eine Instanz angefordert hat, kann der<br />
Algorithmus nicht mehr entfernt werden, bis diese Instanz mittels crypt_api_close()<br />
freigegeben wird. Die Funktion crypt_api_open() gibt die Adresse eines Objektes vom<br />
63
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Typ crypt_api_ctx_t zurück. In diesem Objekt wird der aktuelle Zustand gespeichert.<br />
Damit ist es möglich, mehrere Instanzen eines Algorithmus zu öffnen und gleichzeitig zu<br />
nutzen. Die Funktion erwartet als Parameter den zu verwendenden Schlüssel. Um den<br />
Schlüssel zu tauschen ohne die Instanz freizugeben, kann die Funktion crypt_api_-<br />
reopen() verwendet werden. Sie setzt außerdem den internen Zustand des Algorithmus 3<br />
zurück.<br />
Die Ausführung der Crypto-Funktion wird mittels der Funktion crypt_api_transform()<br />
initiiert. Sie erwartet einen Crypto-Datencontainer für die Input- und die Output-Daten sowie<br />
für den Initialisierungsvektor. Abhängig vom Typ des Algorithmus bestimmt sich die<br />
Größe des jeweiligen Datencontainers bzw. ob dieser angegeben werden muss.<br />
Verwaltung von Crypto-Datencontainern<br />
Die Funktionen des CryptAPI erwarten die Daten in Form eines Crypto-Datencontainers,<br />
welcher durch die Struktur crypt_api_data_t beschrieben wird. Die Struktur enthält<br />
ein Element len, das die Größe des Bereiches angibt, und ein Element data, welches<br />
auf die Daten des Objektes verweist.<br />
Für das Anfordern und das Freigeben eines Crypto-Datencontainers werden die Funktionen<br />
crypt_api_alloc() und crypt_api_free() bereitgestellt.<br />
4.2.2 SensorAPI<br />
Der TSN verfügt mit dem Beschleunigungs- und dem passiven Infrarotsensor über zwei<br />
Sensorquellen, die eine Überwachung des eigenen Zustands gewährleisten sollen. Die<br />
Anbindung erfolgt, je nach Sensor, über SPI (Beschleunigungssensor) und über GPIO<br />
(PIR-Sensor). Im Rahmen des Projektes wurde für beide Sensoren Treiber entwickelt,<br />
die eine einfache Programmierschnittstelle für die Sensorik bereitstellt. Die Nutzung der<br />
Schnittstelle ist exemplarisch im Sensorik Thread, eine Beschreibung hierzu erfolgt im Abschnitt<br />
4.4.3, umgesetzt.<br />
4.3 Protokollstapel<br />
Dieser Abschnitt beschreibt die Protokollstapel des TSN. Der TSN agiert als Gateway zwischen<br />
zwei verschiedenen Netzwerken mit separaten Protokollstapeln und kommuniziert<br />
damit.<br />
1. mit der Basisstation und<br />
3 Bei Hash-Algorithmen ist ein crypt_api_reopen() nach jeder Signaturberechnung notwendig.<br />
64
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
2. mit den Sensorknoten.<br />
In Abbildung 4.3 sind die Protokollstapel des TSN dargestellt. Entsprechend der beiden<br />
Endpunkte sind zwei Stacks, die über den Bridge Thread mit einander verbunden sind,<br />
vorhanden. Das 802.15.4 Module stellt die Verbindung zu den Sensorknoten und das<br />
802.15.1 Modul die Verbindung zur Basisstation her.<br />
Bridge Thread<br />
PPP<br />
Thread<br />
BluezCfg<br />
Thread<br />
Sensor<br />
Protocol<br />
SPI<br />
802.15.4<br />
Module<br />
lwIP<br />
PPP<br />
UART<br />
802.15.1<br />
Module<br />
Abbildung 4.3: Die Protokollstapel des TSN<br />
Für die Kommunikation des TSN mit der Basisstation wurde gefordert, dass TCP als zuverlässiges<br />
Transportprotokoll verwendet werden soll. Hieraus ergibt sich die Verwendung von<br />
IP für die Umsetzung der Netzwerkschicht. In eCos existiert mit lwIP eine kleine und leichtgewichtige<br />
TCP/IP Implementierung, die im Rahmen des Projektes verwendet wird. Für<br />
die Datenübertragung gemäß 802.15.1 (Bluetooth) werden Bluebear-Module von Lesswire<br />
verwendet, die direkt über eine serielle Schnittstelle angesprochen werden können<br />
und damit den Bluetooth-Stack vollständig kapseln. Als Verbindungsschicht zwischen dem<br />
Bluetooth Module und dem TCP/IP-Stack wird PPP verwendet.<br />
Für die Kommunikation zwischen dem TSN und den Sensorknoten wurde die zum Einsatz<br />
kommende Funktechnik, hier IEEE 802.15.4, verbindlich festgelegt. Als Hardware wurden<br />
Module von Jennic ausgewählt, um eine möglichst einfache Kommunikation zu den Knoten<br />
zu ermöglichen. Die Module werden über SPI in eCos eingebunden, hierfür wird der<br />
in Abschnitt 4.1.2 beschriebene Treiber verwendet. Als Transport- und Netzwerkprotokoll<br />
wurde flooding iSense definiert.<br />
4.3.1 lightweight IP Stack<br />
Als TCP/IP Stack Implementierung kommt, der bereits angesprochene, lwIP-Stack zum<br />
Einsatz. Der Stack ist sehr klein und lässt sich auf wenige Protokoll des TCP/IP-Stacks<br />
begrenzen. Der Stack unterstützt die folgenden Protokolle:<br />
• IPv4 ( Internet Protokoll der Version 4),<br />
65
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
• TCP (Transmission Control Protocol),<br />
• UDP (User Datagram Protocol),<br />
• ARP (Address Resolution Protocol) und<br />
• ICMP (Internet Control Message Protocol).<br />
Die Protokolle DHCP und SLIP sind zwar Bestandteil der Implementierung werden jedoch<br />
im TSN nicht verwendet. Ebenso wird auf die Unterstützung von Ethernetgeräten verzichtet.<br />
4.3.2 Point to Point Protocol (PPP)<br />
Das PPP ist ebenfalls Bestandteil des lwIP-Package. Es wird benötigt, um die Datenpakete<br />
aus dem Netzwerkstack über die serielle Schnittstelle des Bluetooth Moduls zu übertragen.<br />
Der Einsatz von PPP ermöglicht eine standardisiert Anbindung an externe Systeme.<br />
Das PPP ist ein Schicht 2 Protokoll des OSI-Models. Auf der Schicht 1 werden vom PPP<br />
zeichenorientierte Geräte verwendet. Das lwIP-Modul nutzt hierfür eine serielle Schnittstelle<br />
von eCos. Die Schnittstelle muss bereits beim Konfigurieren des Systems festgelegt<br />
werden. Beim Initialisieren des PPP-Moduls wird die Schnittstelle dann automatisch mittels<br />
sio_open() geöffnet. Eine Rekonfigurierung zur Laufzeit ist nicht vorgesehen.<br />
Mittels PPP kann zusätzlich eine Authentifizierung in den TSN integriert werden. Bei jedem<br />
Verbindungsaufbau fordert der PPP-Server vom Client eine gültige Nutzernamen-<br />
Passwort-Kombination an. Darüber hinaus enthält PPP bereits Mechanismen für Keep Alive<br />
(LCP Echo) und zum Konfigurieren der Netzwerkparameter.<br />
4.3.3 Bluetooth Stack<br />
Die Kommunikation zur Basisstation erfolgt mittels Bluetooth IEEE 802.15.1. Um die Komplexität<br />
der Software auf dem TSN möglichst gering zu halten, wird für die Übertragung<br />
ein Bluetooth-Modul von Lesswire [30] genutzt. Das Modul kapselt den Bluetooth-Stack<br />
vollständig und bietet für die Kommunikation ein UART-Interface an.<br />
Im Folgenden wird das Modul kurz vorgestellt und die Integration in eCos beschrieben.<br />
Lesswire Module Bluebear SP-S<br />
In den TSN wird das Bluebear SP-S Module von Lesswire integriert. Das Modul bietet ein<br />
Serial Port Profile (SPP) zur Datenübertragung und zur Konfiguration an. Der Bluetooth-<br />
Stack wird vollständig durch das Modul gekapselt, so dass der Zugriff ausschließlich über<br />
die serielle Schnittstelle erfolgt. Das Modul verwendet das ISM Band (2,4 - 2,4835 GHz)<br />
womit eine theoretische Datenrate von 3 MBit/s möglich wäre. Die maximale Datenrate<br />
wird jedoch durch die serielle Schnittstelle auf 115 kBit/s begrenzt.<br />
66
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Das Modul unterstützt die Bluetooth-Protokolle Logical Link Control and Adaption Layer<br />
Protocol (L2CAP) und Service Discovery Protocol (SDP). Damit ist es zu jedem Bluetooth-<br />
Gerät, welches diese Protokolle anbietet und das SPP nutzt, kompatibel. Somit können für<br />
die Basisstation standardisierte bzw. marktübliche Geräte verwendet werden.<br />
Zur Sicherung der Bluetooth-Verbindung unterstützt das Modul einen Pin-geschützten Verbindungsaufbau<br />
und die 128-Bit-Verschlüsselung nach dem Bluetooth-Standard. Diese<br />
Verschlüsselung ist an SAFER+ angelehnt [46].<br />
Initialisierung und Datenübertragung<br />
Für die Datenübertragung wird die Schnittstelle UART0 des LEON2-Prozessor verwendet.<br />
Die Kommunikation mit der Schnittstelle erfolgt über den in Abschnitt 4.1.1 beschriebenen<br />
Treiber. Die Schnittstelle wird mit den folgenden Parametern konfiguriert:<br />
• 38400 baud,<br />
• 8 Datenbits,<br />
• 1 Stoppbit und<br />
• keine Parität.<br />
Der Zugriff auf die serielle Schnittstelle erfolgt über den PPP-Layer des TCP/IP-Stacks. Der<br />
PPP-Layer verwendet direkt read- und write-Funktionen des Treibers. Weitere Funktionen<br />
sind nicht notwendig.<br />
Wie in Abschnitt 4.3.2 beschrieben, wird die serielle Schnittstelle mittels der Funktion<br />
sio_open() geöffnet. Die Funktion gibt einen Zeiger auf ein Objekt vom Typ cyg_io_<br />
handle_t zurück. Über dieses kann anschließend die serielle Schnittstelle konfiguriert<br />
werden. Das Konfigurieren muss vor dem Öffnen der PPP-Verbindung erfolgen. Hierfür<br />
können die im Abschnitt 3.1.2 beschriebenen Funktionen verwendet werden. In der aktuellen<br />
Implementierung des TSN ist es nicht notwendig die Parameter der seriellen Schnittstelle<br />
zu ändern.<br />
Konfigurationsmodus<br />
Für das Setzen der Bluetooth-Parameter verfügt das Modul, wie einleitend erwähnt, über<br />
ein zusätzliches SPP. Für den Zugriff auf das Konfigurations-SPP muss die Datenverbindung<br />
unterbrochen und das Konfigurationsprofil geöffnet werden. Damit ist es möglich,<br />
dass Modul über die Basisstation zu konfigurieren.<br />
Zusätzlich kann das Konfigurieren über die serielle Schnittstelle erfolgen. Hierzu muss das<br />
Modul zuvor über einen I/O-Pin in den Konfigurationsmodus versetzt werden. Diese Leitung<br />
verbindet den Pin CONFMOD des Bluebear-Moduls mit einem GPIO des LEON2-Prozessors.<br />
Das Umschalten in den Konfigurationsmodus erfolgt durch einen Flankenwechsel<br />
67
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
auf der Leitung. Anschließend kann das Modul über AT-Kommandos konfiguriert werden.<br />
Über dieses Interface können die in Tabelle 4.2 beschriebenen Parameter gesetzt werden.<br />
Kommando<br />
Beschreibung<br />
AT name Bluetooth-Name<br />
AT pin<br />
Anzeigen und Setzen der Pin<br />
AT security Anzeigen und Ändern des Security-Modus<br />
AT setdefaults Rücksetzen auf default-Einstellungen<br />
AT slaveaddress MAC-Adresse<br />
AT uart Einstellen der UART-Parameter 4<br />
AT exit<br />
Neustarten des Moduls und übernehmen der Parameter<br />
Tabelle 4.2: AT-Kommandos des Bluebear SP-S<br />
Die aktuelle Version der Firmware des TSN das Konfigurieren des Bluebear-Moduls über<br />
die serielle Schnittstelle nicht möglich. Stattdessen wird eine statische Konfiguration verwendet.<br />
So ist die serielle Verbindung auf die Parameter 38.400 Baud 8N1 und die Pin auf<br />
1234 festgelegt. Änderungen können über die Basisstation vorgenommen werden. Hierbei<br />
ist jedoch zu achten, dass die Parameter der serielle Verbindung nicht geändert werden<br />
können, da sie fest mit der Implementierung der Firmware des TSN verknüpft sind.<br />
4.3.4 Sensor Protokoll<br />
Für die Kommunikation mit den Sensorknoten wird ein Protokoll entsprechend dem Standard<br />
IEEE 802.15.4 verwendet. Dieser Standard, der erstmals 2003 veröffentlicht wurde,<br />
umfasst die Spezifikation eines PHY-Layers und eines MAC-Layers des OSI-Referenzmodells.<br />
Im Jahr 2006 erschien eine revidierte Fassung, die Verbesserungen und Ergänzungen<br />
gegenüber dem Vorgänger enthält. In der Erweiterung aus dem Jahr 2007 werden<br />
zwei zusätzliche, alternative Physical Layer definiert [54].<br />
Auf der Vermittlungsschicht wird für 802.15.4 das ZigBee-Protokoll empfohlen, dieses soll<br />
eine Interoperabilität zwischen Komponenten verschiedener Hersteller gewährleisten. Im<br />
Rahmen des TSN-Projektes ist eine Kompatibilität zu den iSense-Knoten gewünscht. Die<br />
Knoten verwenden Module von Jennic, jedoch ohne die ZigBee-Erweiterung, so dass auf<br />
der Vermittlungsschicht ein proprietäres Protokoll verwendet wird.<br />
Da im Rahmen des Projektes die Koppelung des TSN mit den iSense-Knoten nicht möglich<br />
war, wurde eine proprietäre Implementierung für das Sensorprotokoll erstellt. Diese ist<br />
im User Manual des TSN dokumentiert. Sie erlaubt das Weiterleiten von den Daten der<br />
Sensorknoten und von Alarmnachrichten des TSN an eine Basisstation.<br />
4 Die Parameter beziehen sich nur auf SPP-Data. Für SPP-Config wird immer mit 115200 Baud 8N1 verwendet<br />
68
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
4.4 TSN Threads<br />
Bereits im Abschnitt 3.1.1 wurde erwähnt, dass unter eCos mehrere parallele Ausführungspfade<br />
implementiert werden können. Für den TSN wird dies für die verschiedenen<br />
Kernaufgaben empfohlen. So sollten neben dem Bridge- noch ein Schlüsselaustausch-,<br />
ein Sensorik- und ein Management-Thread erstellt werden.<br />
Dieser Abschnitt gibt einen kurzen Überblick über die vier mögliche Threads und beschreibt<br />
deren Funktionsweisen. Die im Rahmen des TSN-Projektes erstellten Applikationen<br />
implementiert nur einen Teil der Threads. Eine vollständige Implementierung ist noch<br />
zu erstellen, wenn die Integration des TSN in ein reales Sensornetz erfolgt.<br />
4.4.1 Bridge Thread<br />
Der Bridge Thread stellt die Verbindung zwischen den beiden Netzwerk-Stacks her. Er<br />
empfängt von den Sensorknoten die Sensordaten und leitet sie an die Basisstation weiter.<br />
Zusätzlich können Konfigurationsdaten bzw. neue Parameter von der Basisstation über die<br />
Bridge Applikation an die Sensorknoten verteilt werden.<br />
Darüber hinaus ist der Bridge Thread für die folgenden Funktionen verantwortlich:<br />
• Verbindungsaufbau zur Basisstation,<br />
• Ver- und Entschlüsseln der Sensordaten,<br />
• Überwachung der Sensorknoten und<br />
• Keep-Alive zur Basisstation.<br />
Der Verbindungsaufbau zur Basisstation ist immer nach dem Neustart des TSN bzw. des<br />
Kommunikationsmoduls notwendig. Hierbei erfolgt der Bluetooth-Verbindungsaufbau und<br />
die Einwahl bei der Basisstation mittels PPP. Zur Realisierung eines Keep-Alive ist dies in<br />
regelmäßigen Abständen notwendig. Das Keep-Alive signalisiert der Basisstation, das der<br />
TSN noch verfügbar ist. In einem initialen Schritt können hier für die Keep-Alive Nachrichten<br />
des Link Control Protocol (LCP) von PPP genutzt werden.<br />
Zusätzlich ist der TSN für die Überwachung der Sensorknoten verantwortlich. Hier wird,<br />
wie zur Basisstation, ein ständiges Keep-Alive durchgeführt. Ist ein Knoten nicht mehr<br />
erreichbar, wird dies der Basisstation gemeldet.<br />
69
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
4.4.2 Schlüsselaustausch Thread<br />
Der Schlüsselaustausch Thread ist für das Aushandeln von Schlüsseln verantwortlich. Im<br />
Rahmen des Projektes wurde eine Schlüsselaushandlung mittels Hashed Random Preloaded<br />
Subsets (HARPS) [43] für den TSN umgesetzt.<br />
4.4.3 Sensorik Thread<br />
Der Sensorik Thread ist für die Auswertung der Sensordaten des TSN zuständig. Der TSN<br />
verfügt mit dem Beschleunigungs- und dem passiven Infrarotsensor über zwei Sensorquellen.<br />
Die Sensorquellen werden über das im Abschnitt 4.2.2 beschriebene SensorAPI<br />
angesprochen.<br />
Die Sensoren liefern lediglich Rohdaten, die vom Sensorik Thread ausgewertet werden<br />
müssen. Der Thread entscheidet anhand der Konfiguration des TSN, welche Sensorwerte<br />
als zulässig bzw. als unzulässig gewertet werden sollen. Nach der Erkennung von unzulässigen<br />
Werten wird von einer versuchten Manipulation bzw. Gefährdung des TSN ausgegangen.<br />
Derartige Ereignisse müssen der Basisstation gemeldet werden. Zusätzlich sind<br />
geeignete Schutzmaßnahmen für den TSN zu ergreifen. Denkbar wäre das Löschen der<br />
vorgehaltenen Schlüssel.<br />
Um fehlerhafte Sensorwerte und damit Fehlalarme zu vermeiden, enthält der Sensorik<br />
Thread den in Abbildung 4.4 dargestellten Zustandsautomaten. Im Normalzustand werden<br />
die Sensordaten alle n Sekunden von den Sensoren erfragt. Entsprechen sie den<br />
Vorgaben, kehrt der Automat in den Startzustand zurück, d.h. der Thread schläft für n Sekunden.<br />
Liegt der Wert in der Nähe des unzulässigen Bereiches, geht der Thread in den<br />
Bereitschaftszustand über. In diesem Zustand werden die Sensordaten in einem geringeren<br />
Intervall erfasst. Kehren sie in den Normalbereich zurück, wird der Bereitschaftszustand<br />
wieder verlassen. Bleiben die Werte über einen längeren Zeitraum in diesem Grenzbereich,<br />
so wird dies ebenfalls als unzulässiger Bereich gewertet.<br />
Die Werte für den Übergang in den Bereitschaftszustand und die Verweildauer in diesem<br />
Zustand sollten, zusammen mit dem zulässigen und dem unzulässigen Wertebereich für<br />
de Sensordaten, Bestandteil der Sensorparameter sein. Es ist sinnvoll diese unabhängig<br />
von der Firmware des TSN zu speichern, um bei stark veränderten Umweltbedingungen<br />
TSNs mit verschiedenen Parametern einzusetzen.<br />
4.4.4 Management Thread<br />
Die Steuerung der TSN-Software wird von dem Management Thread übernommen. Hierbei<br />
handelt es sich auch um den Thread, der von der Funktion cyg_user_start() gestartet<br />
und initialisiert wird. Wie in Abbildung 4.5 dargestellt, übernimmt der Thread direkt<br />
die Steuerung des Bridge-, des Schlüsselaustausch- und des Sensorik Threads. Hierzu<br />
70
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Normal Status<br />
sleeping<br />
n secs<br />
clear<br />
OnAlert<br />
counter<br />
fetch<br />
sensor<br />
data<br />
not<br />
reached<br />
ok<br />
data<br />
OnAlert<br />
OnAlert<br />
Status<br />
count<br />
max<br />
Alarm<br />
reached<br />
Alarm Status<br />
Abbildung 4.4: Zustandsautomat der Sensorüberwachung<br />
gehört das Starten und das Initialisieren der Threads, sowie die Verwaltung der Konfigurationsdaten.<br />
Management<br />
Thread<br />
Config<br />
Data<br />
Bridge<br />
Thread<br />
KeyExchange<br />
Thread<br />
Sensor<br />
Thread<br />
Abbildung 4.5: Management der TSN Threads<br />
In der aktuellen Implementierung wird die Konfiguration zusammen mit der Firmware abgelegt.<br />
Wie bereits in anderen Abschnitten erwähnt, sollte hier in weiterführenden Arbeiten<br />
ein gesicherter Update-Prozess integriert werden. Der Management Thread hat über das<br />
CryptAPI Zugriff auf die Crypto-Komponenten des TSN und verfügt damit über die Voraussetzungen<br />
für einen integritäts- und authentizitätsgesicherten Update-Prozess.<br />
71
5 Simulation und Messergebnisse<br />
5.1 Ziel<br />
Dieser Abschnitt beschreibt die Simulation und die reale Messungen der Leistungsaufnahme<br />
des TSN. Ein Vergleich von Simulation und Realität ist notwendig, da sich beide i.d.R.<br />
oft unterscheiden. Eine Simulation kann viele Einflussfaktoren nicht berücksichtigen, die<br />
zwangsläufig in der Praxis auftreten.<br />
5.2 Messaufbau<br />
Zunächst wurde für die Messung eine Platine modifiziert. Die beiden notwendigen Spannungen<br />
von 2,5 V und 3,3 V werden nicht durch den, auf der Platine integrierten, Spannungswandler<br />
bereitgestellt, sondern separat eingespeist. Dies hat den Vorteil, dass der<br />
Strom für beide Spannungen exakt bestimmt werden kann. Die Spannungen werden von<br />
einem Dual SourceMeter 2636 von Keithley [25] bereit gestellt. Im genutzten Messbereich<br />
bis 100 mA beträgt die Abweichung weniger als 1µA.<br />
Die beiden Funkmodule wurden von ihrer Spannungsversorgung getrennt, da diese die<br />
Messung erheblich verfälschen würden. Mit 3,3 V werden neben den Pads des TSN der<br />
Speicher (SRAM, Flash), der Beschleunigungssensor und dem der Quarzoszillator versorgt.<br />
Die Spannung von 2,5 V liegt ausschließlich an der Corespannung des TSN und an der<br />
Power-On-LED an. Die Power-On-LED benötigt ca. 2 mA, so dass vom Messwert 2mA<br />
abgezogen werden müssen, um den Strom für den die Corespannung zu bestimmen.<br />
Im Resetzustand 1 arbeitet lediglich der Quarzoszillator, so kann der Strom bestimmt werden,<br />
den der Quarzoszillator benötigt. Dieser beträgt ca. 5,9 mA. Des Weiteren beträgt der<br />
Strom für den Core ca. 40,3 mA. In diesem Zustand befindet sich der Chip im Ruhezustand,<br />
nur das Taktsignal wird an jedes Register geführt. Der hohe Wert zeigt, dass es<br />
sinnvoll ist, bei späteren Optimierungen auf das Clock-Gating zu setzen oder die Anzahl<br />
der Register zu reduzieren (siehe Abschnitt 6.2).<br />
1 Der Resettaster ist dauerhaft gedrückt
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
5.3 Messprogramm<br />
Die Messung der Leistungsaufnahme wurde exemplarisch für die Verschlüsselungsalgorithmen<br />
AES und ECC durchgeführt. Um diese möglichst exakt zu bestimmen, wurde jeweils<br />
ein Assemblerprogramm geschrieben, dass den maximalen Datendurchsatz beider<br />
Komponenten ermöglicht. Das Listing 5.1 zeigt den Code für die Ansteuerung des AES.<br />
Initial wird der Schlüssel in die notwendigen Register geschrieben. Da dieser Vorgang nur<br />
einmalig erfolgt, wurde an der Stelle auf die Optimierung in Assembler verzichtet. Anschließend<br />
werden in einer Endlosschleife die zu verschlüsselnden Daten geschrieben, 70 Takte<br />
gewartet und die nun verschlüsselten Daten ausgelesen. Das Programm wird bei seiner<br />
erstmaligen Ausführung aus dem SRAM geladen. Danach wird das Programm aus dem<br />
Cache ausgeführt, so dass das Programm ohne jede Verzögerung abgearbeitet wird.<br />
Für die Bestimmung der Leistungsaufnahme des AES wird zunächst das AES-Programm<br />
wie in Listing 5.1 auf dem TSN zur Ausführung gebracht und dabei die Leistungsaufnahme<br />
ermittelt. Anschließend wird das Programm so modifiziert, dass die Zeile 27 auskommentiert<br />
und Zeile 29 einkommentiert wird. Die Änderung im Programm sorgt dafür, dass das<br />
AES seine Verschlüsselungsoperation nicht startet. Der gesamte Programmablauf entspricht<br />
der der Verschlüsselung, das letzte Datenwort wird jedoch nicht an die Adresse<br />
0x25C geschrieben. Das Schreiben an diese Adresse würde für den AES-Core bedeuten,<br />
die Verschlüsselung zu beginnen. Dieses Programm wird im folgenden mit „AES_dum“ 2<br />
bezeichnet Für den ECC wurde die Ansteuerung auf gleiche Art und Weise implementiert.<br />
1 //write Key<br />
2 //write key bits 127 downto 96<br />
3 *((unsigned int *) 0x20200210) = 0x2b7e1516;<br />
4 //write key bits 95 downto 64<br />
5 *((unsigned int *) 0x20200214) = 0x28aed2a6;<br />
6 //write key bits 63 downto 32<br />
7 *((unsigned int *) 0x20200218) = 0xabf71588;<br />
8 //write key bits 31 downto 0<br />
9 *((unsigned int *) 0x2020021C) = 0x09cf4f3c;<br />
10<br />
11 //endless loop<br />
12 for (;;)<br />
13 {<br />
14 //write data - optimized in asm<br />
15 asm (<br />
16 "!set global adress in register %o1\n"<br />
17 " sethi %hi(0x20200000), %o1\n"<br />
18 "!write first 32 bit\n"<br />
19 "!write upper 23 bits into register %o0"<br />
20 " sethi %hi(0x3243f400), %o0\n"<br />
21 "!write lower 9 bits into register %o0"<br />
22 " or %o0, 0x2a8, %o0\n"<br />
23 "!write content of register %o0 in AES reg"<br />
24 "!destination address will be calculated from value of %o1 + offset"<br />
25 " st %o0, [ %o1 + 0x250]\n"<br />
26 "!write next data bits\n"<br />
2 dum= Dummy Operation<br />
74
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
27 " sethi %hi(0x885a3000), %o0\n"<br />
28 " or %o0, 0x8d, %o0\n"<br />
29 " st %o0, [ %o1 + 0x254]\n"<br />
30 "!write next data bits\n"<br />
31 " sethi %hi(0x31319800), %o0\n"<br />
32 " or %o0, 0xa2, %o0\n"<br />
33 " st %o0, [ %o1 + 0x258]\n"<br />
34 "!write next data bits\n"<br />
35 " sethi %hi(0xe0370400), %o0\n"<br />
36 " or %o0, 0x334, %o0\n"<br />
37 "! use this line for a normal AES operation \n"<br />
38 " st %o0, [ %o1 + 0x25C]\n"<br />
39 "! use this line for switched off AES \n"<br />
40 "! st %o0, [ %o1 + 0x258]\n"<br />
41 "!wait until aes finished\n"<br />
42 " 70 x nop\n"<br />
43 "!read words from aes, aes base address is stored in %o1\n"<br />
44 "!store value in register %o0"<br />
45 " ld [ %o1 + 0x250], %o0\n"<br />
46 " ld [ %o1 + 0x254], %o0\n"<br />
47 " ld [ %o1 + 0x258], %o0\n"<br />
48 " ld [ %o1 + 0x25C], %o0\n"<br />
49 );<br />
50 }<br />
Listing 5.1: Code für maximalen Datendurchsatz des AES<br />
5.4 Messungen<br />
Der Messaufbau wurde wie in Abschnitt 5.2 beschrieben umgesetzt und die Programme<br />
auf dem TSN zur Ausführung gebracht. In Tabellen 5.1 und 5.2 zeigen jeweils Messungen<br />
für den realen Knoten sowie die Simulation.<br />
Zur Verifikation der Messergebnisse kann die Simulation der Leistungsaufnahme wie in<br />
Abschnitt 2.22 herangezogen werden. Die Simulationsergebnisse sind in den Tabellen mit<br />
ausgewiesen. Bei genauerer Betrachtung der Differenz in der Stromaufnahme bei Verschlüsselung<br />
und der Ausführung des Dummy-Programms, ist ersichtlich dass diese in<br />
der Simulation und der realen Messung fast den gleichen Wert haben.<br />
Die jeweilige Stromaufnahme wird durch die Differenz der Stromaufnahme beider Programme<br />
(also funktionsfähiges Programm und Dummy-Programm) ermittelt. Beim AES ist<br />
eine Stromaufnahme von 1,4 mA gemessen und eine Stromaufnahme von 1,3 mA simuliert<br />
worden. Beim ECC hingegen war die Abschätzung in der Simulation schlechter als<br />
tatsächlich gemessen. In der Simulation werden 10,87 mA ermittelt, während tatsächlich<br />
8,58 mA gemessen wurden.<br />
Der durchschnittliche Fehlbetrag in Simulation und Messung beträgt etwa 22 mA. Davon<br />
entfallen 2 mA auf die Power-On-LED. Die verbleibenden 20 mA müssen somit innerhalb<br />
75
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
des TSN verbraucht werden. Dafür kommen Pads und Cache in Frage. Beide werden in<br />
der Simulation bei der Bestimmung der Leistungsaufnahme nicht berücksichtigt, da für<br />
diese keine geeigneten Bibliotheksinformationen vorliegen.<br />
Programm VDDPad VDDCore<br />
AES auf TSN 11,20 mA 44,70 mA<br />
AES_dum auf TSN 11,17 mA 43,30 mA<br />
AES in Simulation - 21,0 mA<br />
AES_dum in Simulation - 19,7 mA<br />
Tabelle 5.1: Messungen der Stromaufnahme für den AES<br />
Programm VDDPad VDDCore<br />
ECC auf TSN 11,07 mA 49,09 mA<br />
ECC_dum auf TSN 11,11 mA 40,51 mA<br />
ECC in Simulation - 29,63 mA<br />
ECC_dum in Simulation - 18,76 mA<br />
Tabelle 5.2: Messungen der Stromaufnahme für den ECC<br />
5.5 Lebensdauertest<br />
Der Lebensdauertest wurde mit zwei verschiedenen Szenarien durchgespielt. Zunächst<br />
erfolgte die Stromversorgung über 3 NiMH-Akkus mit einer Kapazität von je 2700 mAh.<br />
Dabei wurde eine Laufzeit von ca. 20 Stunden für den TSN-Knoten ermittelt. Nach dieser<br />
Zeit war die Spannung an der belasteten Spannungsquelle auf 2,4 V eingebrochen, so<br />
dass auf der Platine integrierte Spannungswandler den unteren Arbeitspunkt erreicht hatte.<br />
Der zweite Test wurde mit einer Solarzellen-Akku-Kombination durchgeführt. Dabei wurde<br />
eine durchschnittliche Betriebsdauer von 16 Stunden ermittelt. Eine Aufladung des Akkus<br />
mit Hilfe der Solarzellen fand nicht statt, so dass bei Sonneneinstrahlung mit verlängerter<br />
Lebensdauer zu rechnen ist.<br />
76
6 Future Work<br />
In diesem Abschnitt wird eine Projektskizze vorgestellt, bei der das abgeschlossene TSN-<br />
Projekt die Grundlage bildet. In den einzelnen Abschnitten werden Optimierungen des TSN<br />
gezeigt. Dabei wird die Software und die Hardware betrachtet. Darüber hinaus werden<br />
Veränderungen am Board-Design und an der Energieversorgung vorgeschlagen.<br />
Im Überblick beziehen sich die Änderungsvorschläge auf:<br />
• die Einführung einer µKern-Architektur,<br />
• das Trusted Computing,<br />
• ein sicheres Code-Update auf Softwareebene,<br />
• die Veränderungen an vorhandener Hardware,<br />
• das Hinzufügen neuer Hardwarekomponenten,<br />
• die Nutzung eines Ball Grid Array (BGA)-Gehäuses für den ASIC,<br />
• die Verbesserungen im Board-Design und<br />
• das Aufzeigen alternativer Energieversorgungen.<br />
6.1 System-Architektur<br />
Bei der Erstellung der Softwarearchitektur für den TSN wurden, wenn möglich, Komponenten<br />
aus dem embedded Configurable operating system (eCos) verwendet. Dies hat<br />
den Vorteil, dass auf ein bereits funktionierendes System aufgebaut und die Softwareentwicklung<br />
auf die Peripheriekomponenten des TSN konzentriert werden konnte. Da eCos<br />
ein Betriebssystem für eingebettete Systeme ist, deckt es nicht alle Anforderungen an<br />
einen drahtlosen Sensorknoten wie den TSN ab.<br />
In diesem Abschnitt werden Software- und Hardware-Mechanismen vorgestellt, die die Sicherheit,<br />
die Verfügbarkeit und die Flexibilität des TSNs erhöhen. Insbesondere die Mechanismen<br />
zur Steigerung der Systemsicherheit sind integrale Bestandteile eines Betriebssystem<br />
und lassen sich nur mit großem Aufwand in eCos integrieren. Aus diesem Grund wird<br />
unter anderem ein alternatives Betriebssystem näher beleuchtet.
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
6.1.1 Mikrokern-basierter TSN mit Security Compartments<br />
Viele der aktuellen Betriebssysteme für eingebettete Systeme, z.B. eCos, µClinux, TinyOS<br />
oder Reflex, bestehen aus einen monolithischen Kern, der funktional in verschiedene Module<br />
unterteilt wird. Die Trennung der Module besteht hierbei jedoch nur auf der Programmiersprachenebene,<br />
zur Laufzeit existiert keine Trennung zwischen den Modulen.<br />
Ein monolithisches System hat im Wesentlichen die folgenden Nachteile:<br />
• Fehler einer Komponente bleiben nicht auf diese beschränkt<br />
• alle Daten des Knotens sind von jeder Komponente les- und schreibbar<br />
• ein dediziertes Wiederaufsetzen von einzelnen Modulen ist nicht möglich<br />
Aufgrund oben genannter Nachteile befürworten wir den Ansatz eines mikrokern-basierten<br />
Betriebssystems für eingebettete Systeme. Hierbei stellen wir zunächst das Konzept der<br />
„Security Compartments“ vor, welche die Grundlage für ein sicheres System bilden, jedoch<br />
nur von den wenigsten aktuellen eingebetteten Systemen unterstützt wird. Darauf<br />
aufbauend wird mit L4 eine Mikrokern-Architektur aufgezeigt, mit der die Sicherheit des<br />
TSN signifikant erhöht werden kann.<br />
Security Compartments<br />
Unter Security Compartments versteht man die Aufteilung der Systemressourcen auf voreinander<br />
geschützte Teilkomponenten. Diese Security Compartments werden dabei durch<br />
Protection Domains voreinander geschützt. Eine Protection Domain ist eine Menge von<br />
Zugriffsrechten zum Schutz von Ressourcen [12]. Jedes Compartment wird hierbei genau<br />
einer Domain zugeordnet. Allerdings können verschiedene Compartments einer Domain<br />
angehören. Zwei Security Compartments können daher nur dann miteinander kommunizieren,<br />
wenn ihre Protection Domains den Zugriff auf eine gemeinsame Ressource gestatten.<br />
Durch das Fehlen von Security Compartments in eingebetteten Systemen wirken sich<br />
lokale Fehler in den Komponenten auf das gesamte System aus. Wie in Abbildung 6.1<br />
dargestellt, kann z.B. ein Fehler in einem Treiber durch das Fehlen von Schutzbarrieren<br />
auch das Memory Management oder den Scheduler beeinflussen, so dass ein störungsfreier<br />
Betrieb des Gesamtsystems nicht mehr sichergestellt werden kann. Wie Abbildung<br />
6.2 verdeutlicht, können durch die Einführung von Security Compartments die verschiedenen<br />
Module voreinander geschützt werden, so dass die Auswirkungen eines Fehlers<br />
auf die betroffene Komponente begrenzt sind. Ein Compartment hat nur Zugriff auf einen<br />
bestimmten, ihm zugeteilten, Bereich des Systems.<br />
Die Unterteilung des Systems in verschiedene Security Compartments wird durch den<br />
Systemkern organisiert. Der Kern muss hierbei durch die Hardware unterstützt werden.<br />
So ist die Bereitstellung von verschiedenen Ausführungsmodi und von Zugriffsrechten auf<br />
78
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Service<br />
Service<br />
ISR<br />
Driver<br />
Driver<br />
Scheduler<br />
Service<br />
Service Task<br />
Task<br />
Memory<br />
Manager<br />
Abbildung 6.1: Auswirkung von Fehlern in Betriebssystemen ohne Security<br />
Compartments<br />
Service<br />
Service<br />
ISR<br />
Driver<br />
Driver<br />
Scheduler<br />
Service<br />
Service Task<br />
Task<br />
Memory<br />
Manager<br />
Abbildung 6.2: Schutz von Betriebssystemkomponenten durch Security<br />
Compartments<br />
79
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Speicherseiten zwingend erforderlich. Nahezu alle 32-Bit-Mikroprozessoren unterstützen<br />
mindestens zwei Ausführungsmodi, den SuperVisor- und User-Modus. Der aktuelle Ausführungsmodus<br />
wird im Statusregister des Prozessors abgelegt. Ein Wechsel vom unprivilegierten<br />
User-Modus in den privilegierten SuperVisor Modus ist nur über eine wohldefinierte<br />
Schnittstelle möglich.<br />
Jede Nutzer-Task wird in einem eigenen Security Compartment im User-Modus des Prozessors<br />
ausgeführt und kann nur über definierte Schnittstellen mit anderen Tasks kommunizieren.<br />
Sie erhalten dabei nur eine eingeschränkte Sicht auf die Systemressourcen.<br />
Ein beliebiger Zugriff ist hier nicht möglich. Durch die Ausführungen von Programmen und<br />
Diensten im User-Modus wird verhindert, dass Daten einer anderen Task gelesen oder<br />
geschrieben werden können. Fehler in einer Task beeinflussen nur diese und nicht das<br />
gesamte System. Zusätzlich kann nach einem schwerwiegenden Fehler die Task neu gestartet<br />
werden.<br />
Mikrokern-Systeme<br />
Durch eine weitere Unterteilung des Gesamtsystems in verschiedene Security Compartments<br />
können die Auswirkungen von Fehlern weiter verringert werden. Systeme mit einer<br />
sehr feingranularen Unterteilung und einem kleinen Kern bezeichnet man als Mikrokern-<br />
Systeme. Hierbei werden im Systemkern lediglich Funktionen umgesetzt, die zwingend im<br />
SuperVisor-Modus des Prozessors ausgeführt werden müssen.<br />
Der L4-Mikrokern basiert auf zwei Basiskonzepten: Threads und Adressräume. Für die Interadressraumkommunikation<br />
bietet der Kern zusätzlich Interprozesskommunikation (IPC)-<br />
Funktionen an. Alle weiteren Funktionen bauen auf diesen Basisfunktionen auf und werden<br />
weitestgehend im Userspace ausgeführt.<br />
Wie in Abbildung 6.3 dargestellt, werden Dienste und Treiber eines monolithischen Systemkerns<br />
in einem Mikrokern-basierten System in den User-Mode verlagert. Dies umfasst<br />
auch in weiten Teilen die Verwaltung von Hardwareressourcen. Interrupts werden vom<br />
Kern als IPC an die Treiber-Task zugestellt und die Memory-Mapped-IO-Bereiche werden<br />
in den Adressraum der Task eingeblendet.<br />
Ein wesentlicher Nachteil von Mikrokernen besteht in dem Leistungsverlust durch die<br />
große Anzahl an Adressraumwechseln. Bei jedem Umschalten des Adressraumes müssen<br />
Teile des Prozessors neu geladen werden. Insbesondere bei komplexen Systemen,<br />
wie einen Desktop- oder Server-System, wird dieser Leistungsverlust spürbar, so dass eine<br />
kommerzielle Nutzung von µKernen in derartigen Systemen heutzutage nicht existiert.<br />
Da ein eingebettetes System nur über eine überschaubare Anzahl an Threads verfügt,<br />
sind die Kosten für einen Adressraumwechsel weniger beeinträchtigend für das System.<br />
Die Threads umfassen bei einem µKern-basierten eingebetteten System lediglich Systemdienste.<br />
Nutzer-Threads (Applikationen) sind für die meisten Einsatzszenarien gar nicht<br />
oder nur in einer sehr geringen Anzahl notwendig. Gerade die Beschränkung auf Systemdienste<br />
führt dazu, dass der Einsatz von µKernen bei eingebetteten Systemen einen<br />
signifikanten Zuwachs an Systemsicherheit bei akzeptablen Performanceeinbußen bietet.<br />
80
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Task Task Task<br />
Network Stack, Filesystem<br />
Memory Manager, Scheduler<br />
Device Drivers, ISR, ...<br />
User-<br />
Mode<br />
SuperVisor-<br />
Mode<br />
Task<br />
Device Driver<br />
Network Stack<br />
File System<br />
IPC, Memory Management<br />
Hardware<br />
Hardware<br />
Abbildung 6.3: Aufteilung von Diensten und Services in monolithischen und<br />
µKern-Betriebssystemen<br />
L4-basierter Trusted Sensor Node<br />
L4 ist eine Mikrokern-Architektur entworfen und erstmals implementiert von Jochen Liedtke<br />
[52]. Aktuell existieren verschiedene Implementierungen (L4Ka::Pistachio [26], Fiasco<br />
[18], OKL4 [38]), die für den jeweiligen Einsatz- und Forschungszweck optimiert wurden.<br />
Ursprünglich für die x86-Architektur IA32 von Intel entwickelt, sind aktuell Portierungen für<br />
weitere Hardware-Plattformen (z.B. MIPS64, PPC, AMD64, Alpha, ARM) frei verfügbar.<br />
Der TSN verfügt über wenige Dienste, die bereits in der aktuellen Implementierung in Module<br />
ausgelagert wurden. Da eCos jedoch das Konzept der Security Compartments nicht<br />
unterstützt, werden diese Dienste in einem Adressraum zusammengefasst, so dass Fehler<br />
in einem Modul alle anderen Module beeinflussen bzw. sensitive Daten nicht wirksam<br />
geschützt werden können. Durch den Einsatz eines Mikrokerns, können die Module des<br />
TSN auf verschiedene Adressräume verteilt werden. Damit kann ein wirksamer Schutz<br />
zwischen den Diensten installiert werden, so dass eine sichere Speicherung von sensitiven<br />
Daten möglich wird. Darüber hinaus ermöglicht die Mikrokern-Technologie durch den<br />
Einsatz von Watchdog-Technologien die Überwachung und das Wiederherstellen von Systemdiensten.<br />
L4 ist aktuell nicht für die SPARC-Architektur verfügbar. Es gibt erste Ansätze für eine<br />
Portierung auf diese Plattform, die weitergeführt werden müssten. Die Auslagerung von<br />
Diensten in verschiedene Adressräume muss ebenfalls für den TSN umgesetzt werden. Es<br />
existieren bereits Frameworks wie z.B. L4Env[56], die viele Dienste eines Betriebssystems<br />
als L4-Tasks bereitstellen. Allerdings müssen die TSN-spezifischen Dienste, wie z.B. die<br />
Implementierung von HARPS, SPI oder die Tamper Detection auf die Plattform portiert<br />
werden.<br />
81
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
TSN-MMU<br />
Die LEON2-CPU des TSN verfügt über keine Memory Management Unit (MMU), so dass<br />
eine Implementierung von Security Compartments auf dieser Hardware nicht möglich ist.<br />
Eine MMU ist für die Übersetzung von virtuellen Adressen in physikalische Adressen verantwortlich<br />
und ermöglicht die Bereitstellung von virtuellen Adressräumen. Damit kann<br />
jedem Prozess ein einheitlicher virtueller Adressraum bereitgestellt werden. Es existiert<br />
jedoch ein Referenzdesign in VHDL für eine MMU der SPARC-V8-Architektur [49], die unter<br />
anderem über einen User- und einen SuperVisor-Modus sowie über Zugriffsflags für<br />
Speicherseiten verfügt.<br />
Es ist somit ohne größeren Implementierungsaufwand möglich den TSN um eine MMU zu<br />
erweitern. Es bleibt zu prüfen, in wieweit die Integration der MMU Auswirkungen auf den<br />
Platz- und den Energiebedarf des Chips hat. Beides kann bereits durch die Integration in<br />
die Simulationsumgebung des TSN bzw. in einen Field programmable Gate Array (FPGA)<br />
evaluiert werden.<br />
6.1.2 Trusted Computing<br />
Trusted Computing (TC) ist eine Technologie, die von der Trusted Computing Group (TCG)<br />
entwickelt und beworben wird [53]. TC bedeutet, dass die im Computersystem verwendete<br />
Hard- und Software sicher kontrolliert werden kann. Hierzu werden die Systeme mit einem<br />
zusätzlichen Sicherheitsmodul ausgestattet, welches mittels kryptographischer Verfahren<br />
die Authentizität, Integrität und die Vertrauenswürdigkeit der Hard- und der Software nachprüfbar<br />
macht. Für die Umsetzung ist ein sicheres Betriebssystem zwingend erforderlich,<br />
da die Überprüfung des Systems nicht vom Sicherheitsmodul sondern vom Betriebssystem<br />
initiiert werden muss.<br />
Sicherheitsmodul des TSN<br />
Das Sicherheitsmodul bietet mittels eines One Time Programmable (OTP)-Speicher einen<br />
sicheren Anker (Root Key) für eine vertrauenswürdige Authentifizierung, Identifizierung<br />
und Überprüfbarkeit des Systems. Es befindet sich zwischen dem AMBA-Bus und dem<br />
internen Flash und überwacht alle Zugriffe auf den Flashspeicher und hat Zugriff auf den<br />
Programmzähler des LEON2-Kerns. Damit besteht die Möglichkeit festzustellen, von welchem<br />
Programmmodul aus auf den Flashspeicher zugegriffen wird. Unerlaubte Zugriffe<br />
auf den Flash und den OTP können blockiert werden.<br />
Durch die Sicherung des internen Flashspeichers mittels des Sicherheitsmoduls kann dieser<br />
als Trusted Code Base verwendet werden. Der OTP-Speicher wird für die Speicherung<br />
von eindeutigen Identifikatoren verwendet. Eine genauere Beschreibung hierzu erfolgt in<br />
den nächsten Abschnitten.<br />
82
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Root Key im OTP Ein OTP-Speicher ist ein einmalig programmierbarer nicht flüchtiger<br />
Speicher und kann nach dem Fuse 1 -Prinzip programmiert werden. Nach der Fertigung<br />
haben alle Bits des Speichers den Wert „1“. Durch das Anlegen einer hohen Spannung<br />
(ca. 9,5V), können Bits auf „0“ gesetzt werden.<br />
Für den Root Key (K root ) des TSN wird ein OTP-Speicher verwendet. Dieser ist als direkt<br />
adressierbarer Bit-Vektor organisiert. Jedes einzelne Bit wird über eine separate Leitung<br />
mit dem Datenbus verbunden. Beim K root handelt es sich um ein ECC-Schlüsselpaar<br />
(K pub<br />
root , Kpriv root ), welches die Basis für die Schlüsselinfrastruktur des TSN bildet. Der K root<br />
wird bei der Initialisierung des TSN einmalig gespeichert und kann im Folgenden nicht<br />
mehr verändert werden. Die Schlüssel K pub<br />
root und Kpriv root werden über separate Datenbusse<br />
aus dem OTP-Speicher herausgeführt.<br />
Wie in Abbildung 6.4 dargestellt, ist der Datenbus von K pub<br />
root an den AMBA-Bus angeschlossen.<br />
Der Zugriff wird zwar durch das Sicherheitsmodul kontrolliert, aber die Abfrage<br />
von K pub<br />
root ist unbeschränkt möglich. Der Datenbus des Kpriv root ist mit dem ECC-Modul des<br />
TSN verbunden. Es existiert keine Verbindung zwischen dem K priv<br />
root im OTP und einem<br />
Systembus. Der Schlüssel kann nur über das Select-Signal Sel in den Schlüsselspeicher<br />
K der ECC-Komponente geladen werden. Ein direktes Auslesen von K und K priv<br />
root im OTP<br />
ist nicht vorgesehen. Damit ist auch kein Backup des Schlüssels möglich.<br />
AMBA<br />
LEON2<br />
PC<br />
Security Module<br />
P(x,y)<br />
ECC<br />
K<br />
Sel<br />
K priv<br />
root<br />
OTP<br />
K pub<br />
root<br />
internal<br />
Flash<br />
Abbildung 6.4: Integration des Sicherheitsmoduls in den TSN<br />
Das Einspielen von K root erfolgt über die DSU des LEON2. Damit ist der Vorgang nach<br />
dem Assembling des Chips möglich und kann ortsungebunden durchgeführt werden. Das<br />
Einspielen kann über die im Abschnitt 6.2.3 beschriebene Authentifizierungskomponente<br />
der DSU gesichert werden.<br />
Trusted Code Base (TCB) In einer späteren Version wird der TSN über zwei verschiedene<br />
Flash-Speicher verfügen. Ein Flash-Speicher kann Bestandteil des TSN-Die 2 sein.<br />
1 to fuse kommt aus dem Englischen und wird mit durchschmelzen übersetzt.<br />
2 Ein Die (engl. Plättchen) ist die Bezeichnung eines einzelnen ungehäusten Halbleiter-Chips.<br />
83
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Der interne Flash ist 64 kByte groß und über einen Flash-Controller an den AMBA-Bus angeschlossen.<br />
Zusätzlich verfügt der TSN über einen externen Flash der neben dem TSN<br />
Mikrocontroller auf dem Printed Circuit Board (PCB) 3 platziert ist. Die Größe des externen<br />
Flashs ist abhängig von den verwendeten Chips und beträgt im aktuellen Design 8 MByte.<br />
Durch die Integration des internen Flashs auf dem Die bietet sich dieser für die Speicherung<br />
von sensitiven Daten an. Eine manuelle Kontaktierung ist nur mit großem technischen<br />
Aufwand und nicht ohne Beschädigung des Chipgehäuses möglich. Damit kann eine Änderung<br />
des Inhaltes des Flashs ohne die Nutzung von TSN Komponenten weitestgehend<br />
ausgeschlossen werden. Zur Sicherung des Flash-Speichers gegen Veränderungen des<br />
Inhalts durch nicht autorisierten Programmtext wird in den TSN das Sicherheitsmodul integriert.<br />
Das Modul befindet sich, wie in Abbildung 6.4 dargestellt, zwischen dem AMBA-Bus<br />
und dem Flash-Controller. Zusätzlich kann das Sicherheitsmodul den Programm Counter<br />
(PC) des LEON2-Kerns auslesen. Dies ermöglicht die Bestimmung der aktuellen Programmstelle<br />
zum Zeitpunkt des Zugriffs. Der PC des LEON2-Kerns enthält die Adresse<br />
des Befehls, der aktuell ausgeführt wird. Da der LEON2-Kern auf der Load/Store-Architektur<br />
des SPARC basiert, kann der Zugriff auf den Flash nur durch eine Load/Store-Operation<br />
erfolgen.<br />
Ein schreibender Zugriff auf den Flash darf nur durch einen autorisierten Programmcode<br />
erfolgen. Dieser muss Bestandteil der TCB sein. Die TCB (der interne Flash) wird beim<br />
TSN immer auf einem festen Bereich des Adressraumes abgebildet. Alle Instruktionen der<br />
TCB müssen sich innerhalb dieses Bereiches befinden. Wird ein schreibender Zugriff auf<br />
dem Flash von einer anderen Speicheradresse ausgeführt, wird dieser Zugriff blockiert<br />
und ein None-Maskable Interrupt (NMI) 4 generiert.<br />
Trusted Boot Chain (TBC)<br />
Ausgehend von der im vorangegangenen Abschnitt beschriebenen TCB und dem K root<br />
lässt sich für den TSN, eine sichere Bootkette TBC, aufbauen. Bei einer TBC stellt, wie in<br />
Abbildung 6.5 dargestellt, jedes Programmmodul sicher, dass das im Folgenden zu ladende<br />
und auszuführende Modul vertrauenswürdig ist. Der Nachweis der Vertrauenswürdigkeit<br />
kann mittels kryptographischer Prüfsummen erfolgen. Dabei ist bei der Verwendung<br />
von internem Flash ein Hashwert ausreichend, bei der Verwendung von externem Flash<br />
muss auf eine Signatur zurückgegriffen werden.<br />
Die TBC wird beim ersten Einbringen der TSN-Software initialisiert. Hierzu wird der Programmtext<br />
in einzelne Module unterteilt und separat eingespielt. Beim Einspielen eines<br />
Moduls wird für das Modul mittels des K root oder eines davon abgeleiteten Schlüssels<br />
eine Signatur erstellt. Die Signatur wird im internen Flash abgelegt und kann somit von außen<br />
nicht verändert werden. Eine genaue Beschreibung hierzu erfolgt im Abschnitt 6.1.2.<br />
Da nicht allgemeingültig vorausgesagt werden kann, in welcher Form die TBC aufgebaut<br />
wird, kann im Rahmen des Projektes nur ein Framework für die TBC erstellt wer-<br />
3 Printed Circuit Board ist die englische Bezeichnung für eine gedruckte Leiterplatte.<br />
4 NMI sind Interrupts, die nicht von der CPU deaktiviert und damit zwingend behandelt werden müssen.<br />
84
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Drivers Services Task<br />
µKern<br />
Memory<br />
Manager<br />
Loader<br />
external Flash<br />
internal Flash<br />
Boot Loader<br />
Signatures<br />
Abbildung 6.5: Trusted Boot eines L4-basierten Systems mit Signatur-basierter<br />
Modulauthentifizierung<br />
den. Das Framework enthält den Initial Boot Loader (IBL) und das Module Verification<br />
Module (MVM). Beide sind Bestandteil der TCB, um sie gegen spätere nicht autorisierte<br />
Änderungen zu schützen.<br />
Initial Boot Loader (IBL) Der IBL enthält die ersten Instruktionen für den LEON2-Prozessor.<br />
Nach einem Reset springt der Prozessor zunächst an die Startadresse des IBL. Im<br />
Bootloader erfolgt das Initialisieren des Prozessor-Caches, des Systemspeichers und des<br />
AMBA-Buses. Anschließend können weitere Module für das System geladen werden. Da<br />
der IBL automatisch vom System gestartet wird und nicht geladen werden muss, kann dieser<br />
Programmcode nicht vor dem Ausführen authentifiziert werden. Aus diesem Grund ist<br />
der IBL zwingender Bestandteil der TCB, so dass schreibende Zugriffe kontrolliert werden<br />
können.<br />
Module Verification Module (MVM) Das MVM stellt ein Application Programming Interface<br />
(API) für die Authentifizierung und Verifizierung von Programmmodulen bereit. Es<br />
verwendet hierfür das in den LEON2-Prozessor integrierte Crypto-Modul und den K root<br />
aus dem OTP-Speicher. Durch die Verwendung des MVM wird sichergestellt, dass die<br />
Überprüfung der Module einheitlich und sicher durchgeführt wird. Das MVM ist als fester<br />
Bestandteil in die TCB integriert, um so den Schutz vor Manipulation des MVM zu gewährleisten.<br />
Abbildung 6.5 zeigt beispielhaft eine mögliche Trusted Boot Chain für ein L4-basiertes<br />
System. Das System startet zunächst den Initial Boot Loader aus der TCB. Dieser lädt<br />
anschließend den Mikrokern, den Speicher-Manager und den Loader-Thread aus dem externen<br />
Flash. Die Module werden durch den IBL mittels des MVM verifiziert. Hierzu wird<br />
die im internen Flash angelegte Signaturdatenbasis verwendet. Anschließend kann die<br />
Programmkontrolle vom IBL an den Mikrokern bzw. den Loader übergeben werden. Dieser<br />
kann danach weitere Module, z.B. Geräte-Treiber, Netzwerk-Stack und Applikationen<br />
85
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
nachladen. Das Verifizieren der zu ladenden Module erfolgt durch Funktionen des MVM<br />
und kann für alle weiteren Module durch den zuvor authentifizierten Loader durchgeführt<br />
werden.<br />
Secure Update<br />
Der TSN ist für einen langjährigen Einsatz im Outdoor-Umfeld konzipiert und muss über<br />
eine Remote-Update-Fähigkeit verfügen. Hierzu können die für die Übertragung der Sensordaten<br />
zur Verfügung gestellten Kommunikationskanäle genutzt werden. Die Nutzung der<br />
von außen zugänglichen Schnittstellen bedingt jedoch eine umfangreiche Absicherung des<br />
Prozesses, um zu verhindern, dass dieser nicht ohne vorherige Autorisierung durchgeführt<br />
wird.<br />
Um einen möglichst flexiblen Einsatz des TSN zu ermöglichen, ist es notwendig, dass sowohl<br />
die Konfigurationsdaten als auch der Programmcode aktualisiert werden können. Im<br />
Folgenden werden Software-technische Mechanismen zur Bereitstellung eines sicheren<br />
Update-Dienstes beschrieben. Hierbei wird zwischen dem Update der Konfigurationsdaten<br />
und des Programmtextes des TSN unterschieden.<br />
Konfigurationsupdate Für einen flexiblen Einsatz des TSN ist es sinnvoll, die Konfigurationsdaten<br />
von dem Programmcode zu trennen. Dadurch kann der TSN durch Anpassen<br />
der Konfiguration in verschiedenen Anwendungsgebieten mit unterschiedlichen Umgebungsbedingungen<br />
eingesetzt werden. Außerdem ergibt sich hierdurch die Möglichkeit,<br />
die Konfigurationsdaten und den TSN erst beim Rollout 5 zusammenzuführen.<br />
In der aktuellen Architektur wird die Trennung von Programmtext und Konfiguration bereits<br />
durch die Einführung einer separaten Konfigurationskomponente realisiert. Allerdings sind<br />
die Daten aktuell noch fest in diese Komponente integriert. Eine Separierung innerhalb<br />
dieser Komponente ist noch vorzunehmen. Die Konfigurationsdaten des TSN umfassen<br />
aktuell die folgenden Informationen:<br />
• Kommunikationsschlüssel,<br />
• Tamper-Parameter und<br />
• Netzwerkparameter.<br />
Wie bereits einleitend erwähnt, bietet es sich an, die von außen zugänglichen Kommunikationsverbindungen<br />
für das Update nutzen. Zur Absicherung des Prozesses müssen die<br />
Daten kryptographisch gesichert werden. Hierfür können die Krypto-Module und der K root<br />
des TSN verwendet werden.<br />
5 Rollout bezeichnet den Vorgang des Verteilens des Produktes beim Kunden bzw. der Inbetriebnahme im<br />
Einsatzszenario.<br />
86
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Programmcode Update Die angestrebte lange Einsatzzeit und die verschiedenen Einsatzszenarien<br />
machen es erforderlich, dass der Programmcode des TSN aktualisierbar<br />
ist. Hierbei muss zwischen einem Remote-Update und einem Update über die DSU unterschieden<br />
werden. Die Absicherung des DSU-Zugriffs wird im Abschnitt 6.2.3 beschrieben<br />
und soll hier nicht weiter betrachtet werden. Beim Remote-Update muss noch einmal zwischen<br />
einem Update des Programmtextes im externen Flash und einem Update der TCB<br />
im internen Flash unterschieden werden.<br />
Das Programmcode Update wird, wie in Abbildung 6.6 dargestellt, in zwei Schritte unterteilt.<br />
Als Ergebnis des ersten Schrittes (Store Data Fragments) wird die neue Firmware<br />
vollständig im externen Flash gesichert abgespeichert. Hierzu werden zunächst die einzelnen<br />
Fragmente der Firmware empfangen, authentifiziert und anschließend entschlüsselt.<br />
Für die Authentifizierung kann K pub<br />
prod 6 verwendet werden. Für die Entschlüsselung wird<br />
ein separater Schlüssel K upd genutzt. Eine genauere Erläuterung zu K upd erfolgt in den<br />
nächsten Absätzen. Da zwischen dem Empfangen der neuen Firmware und dem eigentlichen<br />
Einspielen ein längerer Zeitraum vergehen kann, wird die Firmware zusätzlich mittels<br />
K rand verschlüsselt im externen Flash abgelegt. Bei K rand handelt es sich um einen temporären<br />
Schlüssel, der mittels des Pseudozufallszahlengenerators erzeugt wird und damit<br />
nur dem TSN bekannt ist.<br />
internal<br />
Flash<br />
Signature<br />
Database<br />
Decrypt(K<br />
rand<br />
)<br />
priv<br />
Sign(K )<br />
root<br />
TCB<br />
Code Update<br />
external<br />
Flash<br />
Code Base<br />
Fragmented Update Data<br />
pub<br />
Verify(K prod)<br />
Decrypt(K upd )<br />
Encrypt(K rand)<br />
Store Data Fragments<br />
Update Area<br />
Abbildung 6.6: Kryptographisch gesichertes Programmcode Update<br />
Im zweiten Schritt (Code Update) wird die neue Firmware in den Programmtextspeicher<br />
des TSN übernommen und aktiviert. Hierzu muss die Firmware zunächst mittels K rand<br />
entschlüsselt werden. Anschließend müssen für die neuen Module die Signaturen mittels<br />
des K priv<br />
root berechnet werden. Da die Signaturen im internen Flash abgespeichert werden,<br />
ist hierfür ein vertrauenswürdiger Programmtext notwendig. Aus diesem Grund ist die<br />
Update-Funktion Bestandteil des MVM. Danach kann der neue Programmtext in die Code<br />
Base im externen Flash abgelegt werden.<br />
Der Programmtext muss bei der Übertragung mittels kryptographischer Mechanismen gesichert<br />
werden, so dass ein unautorisiertes Einspielen verhindert werden kann. Als Schlüssel<br />
sollte hier ein separater Update-Schlüssel K upd verwendet werden, da bei der Verwen-<br />
6 Schlüssel des Softwareherstellers.<br />
87
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
dung von K pub<br />
root der Programmtext für jeden TSN einzeln verschlüsselt werden muss. Der<br />
Schlüssel kann Bestandteil der Konfigurationsdaten sein oder zu einem späteren Zeitpunkt<br />
ausgehandelt werden. Für die Authentifizierung des Moduls muss der TSN über den öffentlichen<br />
Schlüssel der externen Update-Quelle K pub<br />
prod<br />
verfügen. Dieser Schlüssel kann<br />
ebenfalls über den Update-Prozess der Konfigurationsdaten aktualisiert werden.<br />
Ein Update des Programmtextes der TCB ist nur mittels der Funktionen aus der TCB möglich.<br />
Hierfür muss eine separate Update-Funktion integriert werden. Die Signatur der Module<br />
kann abhängig vom verwendeten Schlüssel entweder im internen oder im externen<br />
Flash abgelegt werden.<br />
Code Attestation Module<br />
Der Programmtext des TSN wird bei der Initialisierung oder bei einem Update des Systems<br />
im Flash-Speicher abgelegt. In der aktuellen Architektur wird davon ausgegangen, dass<br />
die Daten im Folgenden integer sind. Diese Annahme kann jedoch im realen Betrieb nur<br />
bedingt aufrecht erhalten werden. So können die Daten durch<br />
• Umwelteinflüsse,<br />
• Alterung der Flashzellen und<br />
• bösartige Angriffe auf den TSN<br />
verfälscht und manipuliert werden.<br />
Für einen sicheren Betrieb des TSN ist es zwingend erforderlich, dass die Integrität der<br />
im Flash gespeicherten Daten sichergestellt wird. Zwar wird beim Starten des Knoten die<br />
Integrität der Module überprüft, jedoch wird bei den angestrebten Einsatzszenarien von<br />
einer langen Laufzeit des Knotens ausgegangen. Damit würde die Überprüfung nur in<br />
sehr langen Abständen erfolgen. Zur Erfüllung der an den TSN gestellten Sicherheitsanforderungen<br />
ist eine regelmäßige Überprüfung des Programmtextes in kurzen Abständen<br />
zwingend erforderlich.<br />
Das im Abschnitt 6.1.2 vorgestellte Sicherheitsmodul verhindert unautorisierte Veränderungen<br />
an der TCB. Diese enthält jedoch nur eine kleinen Teil des Programmtextes, der<br />
nur beim Booten des Knotens bzw. beim Update ausgeführt wird. Außerdem werden hiermit<br />
keine Beschädigungen des Programmtextes durch Alterung der Flashzellen erkannt.<br />
Aus diesem Grund wird die Trusted Code Base um ein Code Attestation Module (CAM) erweitert.<br />
Um sicherstellen zu können, dass der Programmcode des TSN vertrauenswürdig<br />
ist und zyklisch überprüft wird und ferner die Überprüfung nicht umgangen werden kann,<br />
besteht das CAM aus zwei Teilen. Der erste Teil nutzt das MVM zur Überprüfung der Module.<br />
Hierbei werden analog zum Secure Boot die Signaturen der Module berechnet und<br />
mit der Signaturdatenbasis im internen Flash verglichen. Stimmen diese nicht überein,<br />
muss davon ausgegangen werden, dass der Programmcode beschädigt oder manipuliert<br />
wurde. In beiden Fällen sind geeignete Sicherheitsmaßnahmen einzuleiten. Der zweite<br />
88
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Teil des CAM sorgt für eine zyklische Ausführung der MVM-Funktionen. Hierzu wird die<br />
Trap-Behandlung des LEON2 erweitert. Beim Auftreten eines Trap 7 sichert der Prozessor<br />
seinen aktuellen Zustand in einem Register-Window und lädt den Inhalt des Trap Base Register<br />
(TBR) in den Programm Counter. Das TBR wird beim Initialisieren der CPU gesetzt<br />
und zeigt auf die Trap-Handler-Tabelle des Systems. Beim Einsatz des CAM wird das TBR<br />
mit einer Adresse aus der TCB initialisiert und für spätere Zugriffe gesperrt. Schreibende<br />
Zugriffe auf das TBR werden im Folgenden auf ein Schattenregister umgelegt, welches<br />
vom CAM nach der Ausführung der Code Attestation zur Behandlung des Traps genutzt<br />
wird und auf die Trap-Handler-Tabelle des Systems verweist.<br />
Secure Storage<br />
Dieser Abschnitt beschreibt mögliche weiterführende Sicherheitsmechanismen für den<br />
TSN. Hierbei wird insbesondere auf den Schutz der sensiblen Daten eingegangen. In den<br />
vorangegangenen Abschnitten wurde beschrieben, dass eine Sicherung der Konfiguration<br />
und des Programmcodes zwingend erforderlich ist. In beiden Fällen wird eine kryptographische<br />
Sicherung der Daten genutzt. Unter der Annahme, dass die verwendeten Verfahren<br />
sicher sind, wird damit die Gesamtsicherheit des Systems im Wesentlichen auf die sichere<br />
Verwahrung der Schlüssel reduziert.<br />
Die sichere Verwahrung von Schlüsseln in elektronischen Systemen ist ein nicht-triviales<br />
Problem. Zum einen benötigt das System Zugriff auf die Daten und zum anderen sollten<br />
die Daten nicht lesbar verwahrt werden. Im Folgenden werden zwei Mechanismen vorgestellt,<br />
die das Auslesen von sicherheitsrelevanten Informationen erschweren.<br />
Systemcluster Unter einem Systemcluster wird eine Menge von Systemen verstanden,<br />
bei dem die Systeme untereinander über ein Kommunikationsmittel verbunden sind und<br />
gegenseitig Daten austauschen können. In derartigen Clustern, kann das sensitive Material<br />
(z.B. die Schlüssel) verteilt gespeichert werden. Ein System des Clusters benötigt dann<br />
zusätzliche Daten von einem anderen System, um seine sensitiven Daten wiederherstellen<br />
zu können.<br />
Die Verwendung eines Systemclusters hat den Vorteil, dass mehrere Systeme nahezu<br />
gleichzeitig angegriffen werden müssen und, in Fehlerfällen, Redundanzen vorhanden<br />
sind, die eine Selbstheilung des Systems ermöglichen. Der Nachteil besteht darin, dass<br />
die Informationen nicht sofort zur Verfügung stehen, sondern zunächst eine Datenübertragung<br />
zu einem anderen Systemteilnehmer des Clusters notwendig ist.<br />
Autonome Systeme In einem autonomen System müssen alle für den Betrieb notwendigen<br />
Informationen im System selbst gespeichert werden. Hierbei bietet sich wiederum<br />
ein Aufteilen der Informationen an.<br />
7 Unter Trap ist ein Ausnahmezustand zu verstehen, der durch vordefinierte Ereignisse hervorgerufen wird.<br />
89
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Ein Schlüssel wird nicht als zusammenhängender Datenblock abgelegt, sondern über den<br />
Speicher des Systems verteilt. Zusätzlich muss an dieser Stelle dafür gesorgt werden,<br />
dass die Speicherorte möglichst zufällig gewählt werden und nicht von Dritten vorhergesagt<br />
werden können. Zudem darf es nicht möglich sein, die abgelegten Schlüssel direkt in<br />
einem Speicherauszug zu erkennen. Dies kann durch das Initialisieren des Speichers mit<br />
Zufallswerten verhindert werden.<br />
Gelingt es dem Angreifer den kompletten Speicher des Systems zu kopieren und ist ihm<br />
der Programmcode bekannt, erschweren diese Maßnahmen lediglich ein Kompromittieren<br />
des Systems.<br />
6.1.3 TCP/IP Netzwerk-Stack<br />
In der aktuellen Umsetzung des TSN wird für die Anbindung des Knotens an die Basisstation<br />
der lightweight Internet Protocol (lwIP)-Stack von eCos verwendet. Hierbei handelt es<br />
sich um eine schlanke TCP/IP-Implementierung, die insbesondere für den Einsatz in kleinen<br />
Systemen optimiert wurde. Hierbei wurde der TCP/IP-Stack mit einem Mindestmaß<br />
an Funktionalität umgesetzt.<br />
Der Einsatz eines lwIP hat den Vorteil, dass damit ein sehr kleines standardkonformes System<br />
erstellt werden kann. In diesem Abschnitt beschreiben wir denkbare Erweiterungen für<br />
den lwIP-Stack oder eines alternativen Stacks, um diesen an die aktuellen Anforderungen<br />
an drahtlose Sensornetzwerke anzupassen.<br />
IPv6<br />
Das Internet Protocol Version 4 (IPv4) ist auf einen Adressraum von vier Milliarden Adressen<br />
beschränkt. Aufgrund des stetigen Wachstums des Internets herrscht bereits heute eine<br />
Knappheit der Adressen. Laut aktuellen Schätzungen werden im Jahr 2011 die letzten<br />
IPv4 Adressen aufgebraucht sein [21]. Neben den Problemen, die sich durch den kleinen<br />
Adressraum ergeben, hat IPv4 noch weitere Nachteile, die sich nur durch Erweiterungen<br />
(z.B. IPsec) oder nur eingeschränkt lösen lassen (Mobile IP).<br />
Für viele der Probleme von IPv4 bietet das Nachfolgeprotokoll Internet Protocol Version<br />
6 (IPv6) eine Lösung. Eine detaillierte Beschreibung des Protokolls ist in [13] zu finden.<br />
Die wesentlichen Verbesserungen gegenüber IPv4 lassen sich wie folgt zusammenfassen:<br />
• Vergrößerung des Adressraums von 32 auf 128 Bit,<br />
• zustandslose und automatische Konfiguration von Netzwerkgeräten,<br />
• Mobile IP [24] sowie Vereinfachung von Umnummerierung [8] und Multihoming [9],<br />
• Integration von Sicherheitsmechanismen,<br />
90
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
• verbesserte Unterstützung von Quality of Service und Multicast sowie<br />
• Vereinfachung und Verbesserung des Protokollrahmens (Kopfdaten) 8<br />
Obwohl IPv6 sehr viele Vorteile gegenüber der Vorgängerversion hat, ist die Verbreitung<br />
des Protokolls aktuell noch sehr gering. Nur wenige Standorte im Internet verwenden bereits<br />
diese Version [20]. Dabei kommen oftmals auch Dual-Stack-Systeme 9 und Tunneling-<br />
Mechanismen 10 zum Einsatz. Der zögerliche Einsatz von IPv6 ist oftmals auf die Befürchtung<br />
von Inkompatibilitäten mit bestehenden Systemen zurückzuführen.<br />
Für ein eingebettetes System, wie den TSN, bietet sich der Einsatz von IPv6 an. Die eingesetzte<br />
Netzwerktopologie hat den Vorteil, dass die Sensorknoten zunächst nur über<br />
einen Gateway-Knoten (Basisstation) mit dem Internet kommunizieren. Hierdurch wird das<br />
Sensornetz gekapselt und Tunneling-Mechanismen, wie sie oftmals aktuell bei IPv6 zur<br />
Vermeidung von Inkompatibilitäten eingesetzt werden, lassen sich leicht integrieren. Die<br />
integrierten Sicherheits- und Konfigurationsmechanismen von IPv6 ermöglichen einen flexiblen<br />
Einsatz des TSN in den Szenarien mit hohen Sicherheitsanforderungen und wechselnden<br />
Umweltbedingungen.<br />
Die verwendete Version des lwIP von eCos unterstützt aktuell kein IPv6. Für den Einsatz<br />
von IPv6 auf dem TSN ist dieses Protokoll zu implementieren. Obwohl IPv6 aktuell nur<br />
wenig eingesetzt wird, existieren doch bereits zahlreiche Umsetzungen. Abhängig von den<br />
jeweiligen Lizenzen der Implementierung, deren Größe und Funktionsumfang sollte eine<br />
Implementierung ausgewählt und auf den TSN portiert werden.<br />
eTCP<br />
Das Ziel dieses Abschnittes ist es, kurz zu erläutern, welche Probleme bei der Verwendung<br />
von TCP bei drahtlosen Übertragungsstrecken auftreten und welche Gegenmaßnahmen<br />
getroffen werden können. Darüber hinaus soll geklärt werden, ob eine eventuell proprietäre<br />
eTCP-Lösung integriert werden kann.<br />
TCP Funktionalität Das TCP-Protokoll stellt höheren Schichten eine zuverlässige, verbindungsorientierte<br />
Kommunikation zur Verfügung. TCP selbst setzt jedoch auf dem unzuverlässigen<br />
datenpaketorientierten Protokoll IP auf. Um die oben genannten Eigenschaften<br />
gewährleisten zu können, verwendet das TCP folgenden Mechanismen:<br />
• Drei-Wege-Handshake zum Verbindungsaufbau, 4-Wege-Handshake zum Verbindungsabbau<br />
8 Durch die Unterteilung des Paketkopfes in Basis- und Extension-Header, kann die Paketverarbeitung auf<br />
den Zwischensystemen stark vereinfacht werden. Die Header werden hinsichtlich ihrer Relevanz für die<br />
Zwischensysteme sortiert, so dass nur ein geringerer Teil ausgewertet werden muss.<br />
9 Dual-Stack-System, sind System, die sowohl IPv4- als auch IPv6-Pakete verarbeiten können.<br />
10 Beim Tunneling werden IPv6-Pakete in IPv4-Pakete eingepackt und versendet.<br />
91
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
• Sequenznummern<br />
• Zwischenspeicher, um bei Paketüberholungen die richtige Reihenfolge wieder herstellen<br />
zu können<br />
• Acknowledgements und Timer um die erfolgreiche bzw. nicht erfolgreiche Übertragung<br />
eines Paketes zu signalisieren<br />
• Flusskontrolle zwischen Sender und Empfänger, indiziert durch die Information in<br />
den Acknowledgement Paketen, die anzeigt wie viele Bytes maximal empfangen werden<br />
können<br />
Zusätzlich realisiert TCP einen fairen Umgang mit Netzwerkressourcen. Die Anzahl der<br />
Bytes, die gleichzeitig gesendet werden dürfen, wird im Congestion Window gespeichert<br />
und schrittweise, beim Erhalt positiver Acknowledgements, erhöht (Slow Start). Beim Eintreffen<br />
von „Duplicate Acknowledgements“, die Übertragungsfehler, also Paketverluste indizieren,<br />
wird das Congestion Window jeweils halbiert.<br />
Die Literaturquellen in [10, 50] bieten sehr gute Einführungen in das TCP-Protokoll.<br />
TCP und drahtlose Übertragungskanäle In den vergangenen Jahren wurde die Performanz<br />
von TCP im Bereich drahtloser Netze intensiv untersucht. Der Grund hierfür ist<br />
der signifikante Leistungsverlust des TCP-Protokolls in heterogenen Netzen. Der Durchsatz,<br />
der über eine TCP-Verbindung erreicht werden kann, hängt stark von der Größe des<br />
Congestion Windows 11 ab. Dieses wird bei Paketverlusten immer halbiert, da das TCP<br />
diese Verluste immer als „Congestion“ also als Überlastung des Netzes interpretiert und<br />
aus Fairnessgründen folglich seine eigene Last reduziert. Dies geschieht insbesondere<br />
auch dann, wenn die Pakete auf der drahtlosen Übertragungsstrecke verloren gehen, z.B.<br />
wegen Interferenzen.<br />
Die verfolgten Lösungsansätze lassen sich in die folgenden drei Kategorien einteilen:<br />
1. End-to-End: Die verwendeten Maßnahmen betreffen die Datensenke und die Quelle,<br />
jedoch keine Zwischensysteme. Zum Einsatz kommen beispielsweise „selective acknowledgements“<br />
[23, 17], mit denen der Empfänger anzeigen kann, welche Pakete<br />
korrekt empfangen wurden. Eine andere Möglichkeit ist die „Explicit Loss Notification“<br />
[7], mit der angezeigt werden kann, dass „duplicate acknowledgements“ nicht<br />
durch Congestion sondern durch Paketverluste in der drahtlosen Verbindung verursacht<br />
wurden. Die TCP NEW Reno Variante [19] bleibt zur Verbesserung der TCP-<br />
Performanz im Fast Recovery Mode, falls nach einer Übertragungswiederholung das<br />
letzte korrekt empfangene Byte kleiner ist als das letzte gesendete. Hierdurch kann<br />
TCP NEW Reno einen Paketverlust pro Round Trip Time kompensieren.<br />
2. Split Connection: Hier werden Übertragungswiederholungen z.B. von der Basisstation<br />
durchgeführt, wenn diese die Pakete erhalten hat, die Pakete aber bei der Über-<br />
11 Das Congestion Window ist ein Hilfsmittel zur Vermeidung von Überlast im Netzwerk.<br />
92
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
tragung über den drahtlosen Kanal verloren gegangen sind. Hierfür müssen die „duplicate<br />
acknowledgements“ aus dem Datenstrom gefiltert werden [6].<br />
3. Link Layer: Diese Ansätze versuchen die TCP-Verbindungen völlig von der schlechten<br />
Übertragungsqualität auf dem drahtlosen Netzwerk zu entkoppeln (vgl. [28]).<br />
Hierfür werden Mechanismen wie Fragmentierung der TCP-Pakete, Erhöhung der<br />
Übertragungswiederholungen im MAC-Layer o.ä. verwendet.<br />
Abbildung 6.7 illustriert die hier skizzierten Ansätze. Dabei ist in allen Teilbildern links eine<br />
mobile Gegenstelle, mittig der Proxy zwischen mobilem Gerät und Internet und rechts die<br />
Basisstation dargestellt.<br />
Die Anwendbarkeit der Lösungsansätze hängt stark davon ab, ob alle an der Kommunikation<br />
beteiligten Geräte durch eine Instanz verwaltet werden. Nur dann sind Ansätze wie<br />
End-to-End bzw. Split-Connection überhaupt realisierbar. Trotzdem bleibt bei diesen Ansätzen<br />
der erhöhte Aufwand für die Adaption der TCP-Implementierungen bzw. der Zwischensysteme<br />
zu beachten. Die Veränderung des Link Layers, z.B. durch Erhöhen der<br />
Anzahl der Übertragungswiederholungen kann auf dem TSN-Knoten umgesetzt werden,<br />
ohne dass andere Systeme verändert werden müssten. Die in [28] veröffentlichten Untersuchungen<br />
haben gezeigt, dass die Anzahl der über den drahtlosen Kanal übertragenen<br />
Bytes unabhängig von der Anzahl der Übertragungswiederholungen im MAC ist (vgl. Abbildung<br />
6.8). Hieraus kann man schließen, dass das Auslösen der Übertragungswiederholung<br />
durch den MAC sehr viel effizienter ist, als eine entsprechende Reaktion im TCP.<br />
Dieses resultiert aus der Tatsache, dass weniger Header bearbeitet werden müssen. Auch<br />
eine Fragmentierung der TCP-Pakete auf MAC-Ebene ist, wegen der geringeren Headerinformationen<br />
deutlich effizienter als eine Fragmentierung auf TCP-Ebene (siehe Abbildung<br />
6.9).<br />
TSN und TCP Der voraussichtliche Einsatz des TSN als lokale Senke innerhalb eines<br />
drahtlosen Sensornetzes und als Bridge zu einem Einsatzzentrum hat einen deutlichen<br />
Einfluss auf die zu erwartenden Informationsflüsse, gerade weil TCP nur im Rahmen<br />
der Bridge-Funktionalität verwendet wird. Bei einem derartigen Netzwerkaufbau wird der<br />
Nachrichtenaustausch eher vom TSN zum Einsatzzentrum fließen, da in dieser Richtung,<br />
die erkannten Ereignisse zur Auswertung/Reaktion verbreitet werden müssen. Da aktuell<br />
keine Aktorik im Netzwerk vorhanden ist, werden in der Rückrichtung selten Daten fließen.<br />
Der Informationsfluss vom Einsatzzentrum zum TSN wird wahrscheinlich ausschließlich<br />
aus kurzen Konfigurationsnachrichten, mit denen Parameter verändert werden, bestehen.<br />
Bei dem hier vorliegenden Nachrichtenaustausch können die vom TCP ausgelösten Performanzprobleme<br />
vernachlässigt werden. Diese resultieren aus der Verringerung des Congestion<br />
Windows beim Eintreten von Übertragungsfehlern. Hierdurch wird der Durchsatz<br />
deutlich verringert. Da im TSN-Szenario nur geringe Datenmengen ausgetauscht werden,<br />
ist der maximale Datendurchsatz von geringer Bedeutung. Interessanter erscheint hier die<br />
Verzögerungszeit, die durch die Paketverluste ausgelöst wird. Um diese klein zu halten,<br />
sind wahrscheinlich Link-Layer-Ansätze zu bevorzugen. Eventuell wäre ein proprietäres<br />
verbindungsorientiertes Transportprotokoll dem TCP vorzuziehen, falls sehr kurze Verzö-<br />
93
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 6.7: Kategorisierung der Ansätze zur Verbesserung der TCP-Performanz<br />
in heterogenen Netzwerken<br />
94
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 6.8: Anzahl der in den drahtlosen Kanal gesendeten Bytes in<br />
Abhängigkeit von der Anzahl der Übertragungswiederholungen im<br />
MAC und der Bitfehlerrate (BER)<br />
gerungszeiten erreicht werden sollen. Damit ließe sich der relativ komplexe Verbindungsaufbau<br />
des TCP-Protokolls vermeiden.<br />
6.2 Optimiertes Hardwarekonzept<br />
In diesem Abschnitt werden die Möglichkeiten diskutiert, das Hardwarekonzept des TSN<br />
zu verbessern. Die Veränderungen sollen die Systemleistung, die benötigte Fläche, die<br />
Programmierung, die Sicherheit und den Energiebedarf des Knoten verbessern. Die Veränderungen<br />
beziehen sich darauf, vorhandene Komponenten zu verändern oder neue<br />
Komponenten hinzuzufügen.<br />
Zu Beginn des Abschnittes wird eine neue Komponente (Reset-Controller) sowie das Konzept<br />
des Clock-Gating und des Power-Gating vorgestellt. Im Anschluss werden mögliche<br />
Veränderungen an den bereits vorhandenen Komponenten AES, SHA1/PRNG, ECC,<br />
SPI, Speicheranbindung und LEON2-Registerfile diskutiert. Der letzte Abschnitt beschäftigt<br />
sich mit dem Schutzkonzept des TSN. In diesem werden Möglichkeiten aufgezeigt, die<br />
Sicherheit des Systems zu verbessern.<br />
95
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 6.9: Datenrate in Abhängigkeit von der Paketgröße auf MAC bzw. TCP<br />
Ebene, und der Bitfehlerrate (BER)<br />
6.2.1 Einfügen neuer Komponenten<br />
In diesem Abschnitt werden Komponenten vorgestellt, die zu dem bisherigen Entwurf hinzugefügt<br />
werden sollen. Eine davon verbessert die Stabilität (Reset-Controller) des Sensorknotens.<br />
Mit der Einführung des Clock-Gatings und eventuell des Power-Gatings verringert<br />
man den Energiebedarf des Systems.<br />
Reset-Controller<br />
Der TSN kann bisher nur im Ganzen über ein globales Reset-Signal neu gestartet werden.<br />
Nach diesem Reset ist eine Initialisierung aller Teilkomponenten des Systems nötig. Dies<br />
verbraucht zusätzliche Ressourcen wie Energie und Zeit.<br />
Im normalen Betrieb kann es aus Gründen der Betriebssicherheit oder zum Schutz von<br />
Daten notwendig werden, einzelne Teile des Systems neu zu starten. Detektiert ein Sensor<br />
einen möglichen Angriff, so kann die Software dafür sorgen, dass z.B. die Kryptokomponenten<br />
zurückgesetzt werden und dadurch keine sensiblen Daten mehr im Speicher<br />
enthalten sind. Um dies realisieren zu können, soll ein Reset-Controller in das System<br />
eingefügt werden. Mit diesem können, durch Software gesteuert, Bits gesetzt werden, die<br />
dann ein Reset einzelner Komponenten auslösen.<br />
Der Reset-Controller kann als Register, dessen einzelne Bit-Stellen mit den Reset-Signalen<br />
der verschiedenen Komponenten verbunden sind, an den Memory-Controller angeschlossen<br />
werden. Das Register kann beschrieben und gelesen werden. Es wird an allen Bit-<br />
Positionen mit „1“ initialisiert, da die Reset-Signale LOW-aktiv sind. Schreibt man an eine<br />
96
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Position eine „0“, wird die entsprechende Komponente neu gestartet und im Anschluss das<br />
Bit im Reset-Controller wieder auf „1“ gesetzt.<br />
Der Controller sollte als Memory-Mapped-I/O Komponente, analog zu den kryptografischen<br />
Modulen, in das System integriert werden. Dadurch kann das Lesen und Schreiben<br />
des Controllers durch einfache Speicherzugriffe realisiert werden.<br />
Einführen von Clock-Gating<br />
Der TSN verwendet in der aktuellen Version kein Clock-Gating, so dass das Clock-Signal<br />
stets zu jeder Zeit zu jeder Komponente weitergeleitet wird. Das Clock-Gating wird dazu<br />
benutzt, den Systemtakt an den Registern der Schaltung zu unterbrechen, um somit das<br />
interne Schalten der Flipflops zu verhindern und Energie zu sparen. Dieses Unterbrechen<br />
wird immer dann eingesetzt, wenn der aktuelle Zustand des Systems den Zugriff auf die<br />
Register nicht zulässt.<br />
Abbildung 6.10: Clockgating-Controller bestehend aus Latch und OR-Gatter<br />
Durch dieses Verfahren kann, wie bereits erwähnt, der Energieverbrauch des Systems gesenkt<br />
werden. Der Flächenbedarf vergrößert sich durch die zusätzliche Steuerlogik nicht<br />
wesentlich. Durch die Verwendung der Clock-Gating-Logik können andere Schaltungselemente,<br />
wie z.B. einige Multiplexer, verkleinert werden oder entfallen. Dadurch fällt der<br />
Hardwareoverhead nicht ins Gewicht. Das Syntheseprogramm 12 erkennt selbständig, welche<br />
Register gerade angesprochen werden können und welche nicht. Die Abbildung 6.10<br />
zeigt den Aufbau eines Clock-Gating-Elements. Am Eingang liegen die Systemclock sowie<br />
das „Clock Enable“ an, welches den Ausgang aktiviert, so dass das Signal der Systemclock<br />
an die angeschlossene Komponente weiter geleitet wird.<br />
Als Beispiel kann eine Finite State Machine (FSM) dienen (vgl. Abbildung 6.11). Diese hat<br />
mehrere Zustände mit „Reset“ als Startzustand. Danach geht die FSM in den Zustand „Register<br />
0“ über. In diesem Zustand kann ausschließlich das Register 0 geschrieben werden.<br />
Ein Zugriff auf Register 1 bis 3 ist nicht möglich. Im aktuellen Zustand wartet die FSM nun<br />
auf ein Ereignis auf dem Clocksignal, in der Regel eine steigende Flanke, sowie darauf,<br />
dass das Signal „WENB“ („Write ENaBle“) den Wert „0“ annimmt. Dabei wird der Wert<br />
am Dateneingang in das Register 0 übernommen. In einem herkömmlichen Design wird<br />
das Clocksignal stets an alle Register (0 bis 3) weitergeleitet, ohne dass Vorbedingungen<br />
eine Rolle spielen. Im hier gezeigten Beispiel ist sichtbar, dass die Register 1 bis 3 kein<br />
12 Ein Programm zur Erzeugung der Gatternetzliste aus dem VHDL-Code.<br />
97
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Clocksignal brauchen, wenn sich die FSM im Zustand „Register 0“ befindet, da die Register<br />
1 bis 3 den Wert am Eingang nicht übernehmen können. Das Synthesetool analysiert<br />
eine solche FSM und erkennt selbständig die Vorbedingungen, die erfüllt sein müssen,<br />
damit die Register den am Eingang liegenden Wert übernehmen. Für den Fall, dass die<br />
Vorbedingung nicht erfüllt wird, wird das Clocksignal nicht an das Register weitergeleitet,<br />
sondern bleibt auf „0“.<br />
Abbildung 6.11: Finite-State-Machine mit 5 Zuständen<br />
Einführen von Power-Gating<br />
Power-Gating bezeichnet eine Technologie bei der mit Hilfe von Leistungstransistoren einzelne<br />
Hardwarekomponenten von der Energieversorgung abgetrennt werden können. Die<br />
Verwendung des Power-Gatings soll den Energieverlust durch Leckströme reduzieren. In<br />
den typischen Einsatzszenarien von drahtlosen Sensornetzen sind viele Komponenten für<br />
lange Zeit inaktiv. In der inaktiven Phase, wird auf Grund der Leckströme, Energie verschwendet.<br />
Die Größe der Leckströme nimmt mit Abnahme der Strukturgrößen zu (vgl.<br />
Abbildung 6.12).<br />
Abbildung 6.12: Zunahme der Leckströme bei Verkleinerung der Strukturgröße[1]<br />
98
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Das IHP fertigt zur Zeit Halbleiter mit einer Strukturgröße von 0, 25µm. Bei dieser Technologie<br />
entfallen ca. 10% des Energieverbrauchs auf die Leckströme. Darüber hinaus werden<br />
am IHP Versuche unternommen, die Strukturgröße auf 0, 13µm zu verringern. Bei dieser<br />
Technologie entfallen dann bereits 25% des Energieverbrauchs auf die Leckströme (vgl.<br />
Abbildung 6.12). Diese beiden Werte zeigen, wie wichtig es ist, Leckströme im Bereich der<br />
eingebetteten Low-Power Systeme zu verringern.<br />
Um mit Hilfe von Power-Gates die Leckströme zu reduzieren, werden sie in die Energieversorgung<br />
der abzuschaltenden Teilblöcke eingebunden. Sie müssen die Hardware<br />
von der Versorgungsspannung und Masse trennen. Das An- und Abschalten der Power-<br />
Gates übernimmt ein Power-Gating-Controller. Dieser enthält einen eingebauten Timer,<br />
der nach Ablauf einer Zeitspanne die abgeschaltete Komponente automatisch reaktiviert.<br />
Das Schalten kann ebenso durch einen externen Interrupt veranlasst werden (vgl. Abbildung<br />
6.13). In Abbildung 6.14 ist der Aufbau der eben beschriebenen Power-Gating<br />
Architektur dargestellt.<br />
Abbildung 6.13: Darstellung eines Power-Gating-Controllers<br />
Abbildung 6.14 zeigt einen abschaltbaren Logikblock (Power-Gated Functional Block). Dieser<br />
kann über die Transistoren von der Versorgungsspannung und von der Masseleitung<br />
getrennt werden. Gesteuert wird dieser Schalter durch den Power-Gating-Controller. Dessen<br />
Aufbau ist in Abbildung 6.13 dargestellt.<br />
Abbildung 6.14: Darstellung einer Power-Gating Architektur<br />
Trennt man eine Komponente von der Energieversorgung verliert sie alle Daten der internen<br />
Register. Sind diese wichtig und werden nach dem Zuschalten wieder benötigt,<br />
99
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
müssen sie vor dem Abschalten gesichert werden. Dazu gibt es von allen wichtigen Registern<br />
ein Duplikat, das als nicht-flüchtiger Speicher ausgelegt ist. In diesem werden die<br />
wichtigen Inhalte gerettet und später wieder ausgelesen. Im TSN könnten damit alle Kryptokomponenten<br />
abgeschaltet werden. Zu beachten ist hierbei, dass Register, die Schlüssel<br />
enthalten, auf sichere Art 13 zwischengespeichert werden müssen. Darüber hinaus kann<br />
die DSU abgeschaltet werden, da diese nur zur Inbetriebnahme des TSN notwendig ist.<br />
6.2.2 Veränderungen an vorhandenen Komponenten<br />
In diesem Abschnitt werden Veränderungen an Komponenten zur Minimierung des Flächenund<br />
Energiebedarfs sowie zur Erhöhung der Performanz diskutiert. Die Veränderungen<br />
beziehen sich dabei in erster Linie auf die kryptografischen Komponenten AES, SHA1 und<br />
ECC. Weiterhin werden Verbesserungen am LEON2-Prozessor vorgestellt.<br />
In der aktuellen Implementierung belegt der TSN ca. 35mm 2 Siliziumfläche. Zwar ist der<br />
Prozessor sehr leistungsfähig, dennoch erscheint die Fläche recht groß. In Anbetracht der<br />
hohen Kosten pro Quadratmillimeter sollte angestrebt werden, die Fläche, ohne Einbußen<br />
an der Funktionsweise, zu verkleinern.<br />
Optimierung des AES<br />
Die AES-Komponente kann auf verschiedene Weise verbessert werden. Als erstes kann<br />
die Fläche reduziert werden, indem bei den Datenregistern auf den Reseteingang verzichtet<br />
wird. Der initiale Wert der Datenregister ist nach einem Neustart des TSN nicht von<br />
Bedeutung. Neben dem Einsatz von kleineren Flipflops ohne Reset kann der Resetpfad<br />
dementsprechend kleiner ausgeführt werden. Einige Treiberbausteine können entfallen.<br />
Memory Controller<br />
SHA1<br />
PRNG<br />
AES<br />
ECC<br />
RAM<br />
Abbildung 6.15: Veränderte Anbindung der kryptografischen Komponenten<br />
zwischen Memory-Controller und Speicher<br />
13 Das bedeutet, dass ein Zugriff durch Dritte nicht möglich ist.<br />
100
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Um weitere Fläche einzusparen, könnte bei der AES-Komponente ein Teil der Adresslogik<br />
entfernt werden. Bisher werden die Blöcke der zu verarbeitenden Nachricht in verschiedene<br />
Register geschrieben, die alle separat adressiert werden. Man kann die einzelnen<br />
Blöcke alle an eine Adresse schreiben und diese intern an die richtige Position des Registers<br />
legen. Der Nachteil dieser Methode ist, dass der Programmcode schlechter lesbar ist<br />
(vgl. Listings 6.1 und 6.2).<br />
...<br />
//AES write data word<br />
//write(Adress, value);<br />
//AES first word<br />
write_reg(0x20100000, 0x01234567);<br />
//AES second word<br />
write_reg(0x20100004, 0x89abcdef);<br />
//AES third word<br />
write_reg(0x20100008, 0xabbeabbe);<br />
//AES second word<br />
write_reg(0x2010000A, 0xc0dec0de);<br />
Listing 6.1: Schreibbefehl für die Verschlüsselung von Daten mit expliziten<br />
Adressen<br />
...<br />
//AES write data word<br />
//write(Adress, value);<br />
//AES first word<br />
write_reg(0x20100000, 0x01234567);<br />
//AES second word<br />
write_reg(0x20100000, 0x89abcdef);<br />
//AES third word<br />
write_reg(0x20100000, 0xabbeabbe);<br />
//AES second word<br />
write_reg(0x20100000, 0xc0dec0de);<br />
Listing 6.2: Schreibbefehl für die Verschlüsselung von Daten auf eine Adresse<br />
Optimierung des SHA1/PRNG<br />
Das SHA1/PRNG Modul wird verwendet, um den Hashwert über Daten zu bilden und um<br />
pseudozufällige Zahlen zu erzeugen. Möchte man Daten des TSN übertragen, geschieht<br />
dies über UART. Diese sind mit Radiomodulen oder seriellen Übertragungsleitungen verbunden.<br />
In der Regel werden Daten vor dem Senden signiert oder deren Signatur nach<br />
dem Empfang überprüft.<br />
101
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
In [41] wurde ein TCP-System evaluiert. Dabei wurde festgestellt, dass einfache Kopieroperationen<br />
einen Großteil der Systemlast ausmachen. Daher bietet es sich bei kopierintensiven<br />
Anwendungen an, diese zu optimieren, so dass die Anzahl an Kopieroperationen<br />
minimiert wird. Es wird versucht, die Daten mit einer einzigen Kopieroperation allen notwendigen<br />
Komponenten zur Verfügung zu stellen. Eine solche Vorgehensweise wird als<br />
„Single Copy Architecture“ bezeichnet.<br />
Am Beispiel des Sendens von Daten, über die der Hashwert gebildet wird, soll der bisherige<br />
Ablauf kurz erläutert und die Optimierung vorgestellt werden.<br />
Der LEON2-Prozessor lädt die Daten aus dem Speicher und überträgt diese anschließend<br />
an das SHA1/PRNG Modul. Nach der Erzeugung des Hashwertes, wird dieser vom Prozessor<br />
ausgelesen und mit den Daten an einen der UARTs zur Übertragung gesendet.<br />
Die Überprüfung eines Hashwertes erfolgt analog. Die empfangenen Daten werden durch<br />
den Prozessor von einem der UARTs gelesen. Anschließend werden die Daten in das<br />
SHA1/PRNG Modul geschrieben und der Hashwert ermittelt. Diese wird mit dem empfangenen<br />
Hash verglichen.<br />
Eine Optimierung kann erreicht werden, indem die SHA1/PRNG Komponente direkt an<br />
den Speicherbus angebunden wird (vgl. Abbildung 6.15). Dadurch vereinfacht sich das<br />
Senden und Empfangen „gehashter“ Daten erheblich. Der LEON2 lädt die Daten aus dem<br />
Speicher und überträgt sie an den UART. Dabei wird von den Daten der Hashwert durch<br />
den SHA-1 berechnet, da dieser permanent auf dem Speicherbus lauscht. Im Anschluss<br />
an die Kopieroperation (von Speicher nach UART) kann der Hashwert aus dem SHA1<br />
ausgelesen und ebenfalls übertragen werden. Beim Empfang gelangen die Daten beim<br />
Auslesen durch den Prozessor, über den Speicherbus, in das SHA1-Modul. In diesem wird<br />
direkt der Hashwert berechnet und kann anschließend mit dem empfangenen Hashwert<br />
verglichen werden.<br />
Durch diese Verlagerung des SHA1/PRNG Moduls kann die Systemlast 14 verringert und<br />
somit Energie gespart werden.<br />
Für eine weitere Optimierung kann auch hier die Adresslogik vereinfacht werden. Dies<br />
wurde bereits beim AES-Modul (vgl. 6.2.2) diskutiert. Das SHA1/PRNG-Modul erhält einen<br />
512-Bit langen Datenblock, der in sechzehn 32-Bit Teilblöcke unterteilt ist. Diese sind alle<br />
einzeln adressierbar und können separat ausgelesen und geschrieben werden. An dieser<br />
Stelle kann die Adressierung auf nur einen Teilblock reduziert werden. Die in diesen<br />
Teilblock geschriebenen Daten werden bei jedem Schreibzugriff einen Teilblock weitergeschoben.<br />
Das Auslesen erfolgt analog. Somit gelangen alle Daten in die vorgesehenen<br />
Register.<br />
Der 160-Bit Hashwert des Algorithmus ist ebenfalls in 32-Bit Teilblöcke gegliedert. Diese<br />
sind zudem einzeln adressierbar. Auch hier reicht die Adressierung eines Teilblocks, um<br />
die Daten lesen und schreiben zu können. Durch diese Veränderung kann die Adresslogik<br />
minimiert werden. Zur Zeit werden einundzwanzig 32-Bit Register und ein 8-Bit Kontrollregister<br />
adressiert. Bei einer Optimierung würde sich die Adresslogik nur noch auf drei<br />
14 Belastung des Prozessors und des Speichers<br />
102
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Register beschränken. Der Nachteil hierbei ist, genau wie beim AES, dass die entsprechende<br />
Software unübersichtlich und schlechter lesbar wird (vgl. Listing 6.1 und 6.2).<br />
Optimierung des ECC<br />
Das ECC-Modul unterstützt die Berechnung von Punktmultiplikationen auf elliptischen Kurven<br />
über erweiterten Binärfeldern (GF(2 m )). Die elliptische Kurve wird, gemäß dem NIST-<br />
Standard, über alle Punkte definiert, die die Gleichung<br />
y 2 + xy = x 3 + x 2 + b<br />
erfüllen. Auf dieser elliptische Kurve werden die kryptographischen Operationen ausgeführt.<br />
Das ECC-Modul bietet ebenfalls verschiedene Optimierungsansätze. Bisher ist es<br />
notwendig, vor der Durchführung einer Punktmultiplikation, den Kurvenparameter b zu<br />
schreiben, da dieser in Registern gehalten wird. Der ECC wird nur auf einer Kurve durchgeführt,<br />
die durch den Kurvenparameter b beschrieben wird. Der Parameter ist konstant<br />
und muss nicht verändert werden. Damit können diese Register entfallen und der Kurvenparameter<br />
b „festverdrahtet“ werden. Dies spart Fläche und Energie.<br />
Der ECC besitzt intern eine Quadriereinheit. Diese spezialisierte Einheit führt eine Quadrierung<br />
in nur einem Taktzyklus durch. Um Fläche einzusparen, könnte man diese entfernen<br />
und die Multiplikationseinheit des LEON2-Prozessors verwenden. Eine andere Möglichkeit<br />
wäre, den Quadrierer durch einen kleineren langsameren Multiplizierer zu ersetzen.<br />
Beide Varianten würden Fläche sparen, aber auf Kosten der Geschwindigkeit des Algorithmus<br />
gehen und werden daher nicht umgesetzt. Denn ein Multiplizierer benötigt mehr<br />
Taktzyklen als eine spezialisierte Quadrierereinheit, um die gleiche Berechnung auszuführen.<br />
Eine weitere Möglichkeit, Fläche und Energieverbrauch zu optimieren, ist die Größe des<br />
internen Multiplizierers anzupassen. In den Arbeiten ([45], [40]) werden verschiedene Multiplizierervarianten<br />
für das ECC Modul verglichen. Diese Gegenüberstellung ist auszugsweise<br />
in Tabelle 6.1 zusammengefasst. Die erste Spalte zeigt die Größe der Faktoren in<br />
Bit, die zweite zeigt die Anzahl der Segmente, in welche die Faktoren zerlegt werden.<br />
Die Anzahl der benötigten Takte für die Multiplikation ist in Spalte drei zu finden. Spalten<br />
vier und fünf zeigen die benötigte Fläche und den Energieverbrauch für den Multiplizierer.<br />
Letzterer wurde für eine Frequenz von 33 MHz simuliert und berücksichtigt nicht den<br />
Ruhestrom der Schaltung.<br />
Die momentan im TSN verwendete ECC Komponente enthält einen für 233-Bit Faktoren<br />
ausgelegten 4-Segment-Multiplizierer. Dieser ist in Tabelle 6.1 mit einem * gekennzeichnet.<br />
Die Größe des Multiplizierers ist in erster Linie von der Bitbreite der Faktoren abhängig,<br />
wie man in Tabelle 6.1 gut erkennen kann. Bei einer Erhöhung der Anzahl an Segmenten<br />
nimmt die Fläche des Multiplizierers ab und der Energieverbrauch zu. Bei einer Segmentierung<br />
der Multiplikation wird diese in mehrere kleinere Multiplikationen aufgeteilt. Dadurch<br />
müssen mehrere Teilmultiplikationen durchgeführt werden, wodurch die Anzahl der benötigten<br />
Takte und der Energieverbrauch zunimmt.<br />
103
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Tabelle 6.1: Vergleich verschiedener Multiplizierer für Punktmultiplikation der ECC<br />
Komponente<br />
Größe der Faktoren in Bit Segmente Takte Fläche in mm 2 Energieverbrauch in nW s<br />
163 2 3 0,79 4,31<br />
163 4 9 0,45 8,53<br />
163 8 27 0,35 14,99<br />
233 2 3 1,17 5,80<br />
233* 4 9 0,62 11,58<br />
233 8 27 0,44 18,47<br />
571 2 3 4,35 25,00<br />
571 4 9 2,10 38,30<br />
571 8 27 1,31 67,14<br />
Am Beispiel des 233-Bit Multiplizierers soll dies kurz genauer erläutert werden. Der 2-<br />
Segment-Multiplizierer benötigt drei Takte für die Multiplikation. Er belegt dabei eine Fläche<br />
von 1, 17mm 2 und verbraucht 5, 80nW s. Verdoppelt man die Anzahl der Segmente<br />
auf vier, verringert sich die benötigte Fläche um 0, 55mm 2 (47%). Der Energieverbrauch<br />
verdoppelt sich auf 11, 58nW s. Die Operation benötigt dann neun Takte. Unterteilt man<br />
die Multiplikation in acht Segmente, benötigt diese 27 Takte. Der Flächenbedarf verringert<br />
sich, im Vergleich zur 4-Segment-Version um 29% auf 0, 44mm 2 . Der Energieverbrauch<br />
erhöht sich um fast 7nW s auf 18, 47nW s. Daran kann man erkennen, dass entweder die<br />
Fläche oder der Energieverbrauch im Vergleich zum bisher eingesetzten Multiplizierer verbessert<br />
werden können. Der im TSN verwendete ECC besitzt jedoch bereits das beste<br />
Verhältnis zwischen Fläche, Energieverbrauch und Verarbeitungsgeschwindigkeit.<br />
Optimierung des SPI<br />
Die derzeit verwendete SPI-Komponente ist mit einer Fläche von 173.000µm 2 recht groß.<br />
Dies liegt darin begründet, dass es sich hierbei um eine Standardbibliothekskomponente<br />
handelt, die in weiten Teilen konfigurierbar ist. Diese Konfigurierbarkeit wird hier im wesentlichen<br />
nicht benötigt, so dass eine Eigenentwicklung deutliche Einsparung in der Fläche<br />
bringen kann.<br />
Optimierung der Clock-Select-Komponente<br />
Der LEON2-Prozessor ist mit einer Clock-Select-Komponente ausgestattet. Mit dieser ist<br />
es möglich, den Prozessor über verschiedene Quellen mit einem Takt zu versorgen und<br />
zwischen diesen umzuschalten. Der „Trusted Sensor Node“ verwendet jedoch nur einen<br />
Takt. Somit kann die Clock-Select-Komponente entfallen. Hierdurch reduziert sich die benötigte<br />
Fläche an Silizium im geringen Umfang weiter.<br />
104
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Realisierung des Registerfiles durch Speicher<br />
Das Registerfile 15 des LEON2-Prozessors besteht aus 8 Fenstern je 17 Register á 32 Bit.<br />
Jedes dieser enthält ein globales Register sowie 16 Register, die spezifisch dem einzelnen<br />
Fenster zugeordnet ist. Die 8 Fenster bilden einen zirkularen Stack (Details siehe [49]). Im<br />
„Trusted Sensor Node“ sind die Register durch insgesamt 4352 Flipflops realisiert. Diese<br />
haben einen hohen Energiebedarf. Darüber hinaus belegt das Registerfile eine Fläche<br />
von 3,1mm 2 . Man kann dieses Registerfile durch Static Random Access Memory (SRAM)<br />
ersetzen. Dieser ist kleiner und sparsamer als die Lösung mit Flipflops. Aus Sicht der Arbeitsgeschwindigkeit<br />
sind beide Versionen gleich schnell. Zur Umsetzung wird ein speziell<br />
angepasster Speicher (Triple-Port Memory) benötigt. Die Größe des RAMs lässt sich im<br />
Vorfeld schwer abschätzen, dürfte jedoch bei weniger als 1,5mm 2 liegen.<br />
6.2.3 Schutzkonzept<br />
Gehäuse und Platine<br />
Einfache physikalische Angriffe können verhindert werden, indem Schutzmaßnahmen ergriffen<br />
werden, so dass Datensignale nicht direkt auf der Platine abgreifbar sind. Beispielsweise<br />
können alle Signalleitungen in einer Multilayer-Platine innerhalb der inneren<br />
Schichten geführt werden. Dabei ist es sinnvoll alle Chips (LEON2, Flash, RAM) in BGA-<br />
Ausführung zu verwenden. Alle Pins sind als Lötpunkte unterhalb des ASICs ausgeführt,<br />
so dass einfache Messungen an den Pins der Chips nicht möglich sind (vgl. Abbildung<br />
6.16).<br />
15 Blockweise angeordnete Prozessorregister<br />
Abbildung 6.16: BGA-Gehäuse (Unterseite)<br />
105
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
BGA-Gehäuse sind noch an anderer Stelle von Vorteil: ein Standardgehäuse (wie z.B. das<br />
derzeit verwendete PQFP-128) enthält lediglich den Chip mit den Bonddrähten (vgl. Abbildung<br />
6.17). Ein BGA-Gehäuse, wie in Abbildung 6.19 dargestellt, ist eine Platine auf die<br />
der Chip gebondet wurde (vgl. Abbildung 6.18). Nach dem Aufbringen des Chips auf die<br />
kleine Trägerplatine, kann dieser mit einer Epoxydmasse vergossen werden (vgl. Abbildung<br />
6.20). Um einfachen Angriffen mit Hilfe einer Power-Analysis-Attacke vorzubeugen,<br />
kann es sinnvoll sein, auf der Trägerplatine Kondensatoren unterzubringen (vgl. Abbildung<br />
6.20) und diese ebenfalls mit zu vergießen. Je mehr und je größere Kondensatoren dafür<br />
verwendet werden, desto schwieriger ist es für einen Angreifer die Leistungsaufnahme<br />
des Chips in jedem einzelnen Clocktakt eindeutig zu identifizieren. Vielmehr wird die Leistungsaufnahme<br />
über mehrere Clocktakte „verschmiert“.<br />
Wie in Abbildung 6.18 ersichtlich, können auch mehrere ASICs auf einer Trägerplatine<br />
aufgebracht werden. Nach außen hin erscheint dieses als ein Komplettsystem.<br />
Abbildung 6.17: TSN in einem offenen PQFP-128-Gehäuse<br />
Authentifizierungskomponente<br />
Die Authentifizierungskomponente soll den TSN vor unberechtigten Zugriffen schützen.<br />
Dabei stellt die „Debug Support Unit“ (DSU) eine besondere Schwachstelle im System<br />
dar. Über sie erhält man vollständigen Zugriff auf alle wichtigen Inhalte des Sensorknotens.<br />
Mit Hilfe von Unterbrechungspunkten und anderen Debugmöglichkeiten kann das<br />
System umfangreich untersucht und manipuliert werden. Auf den Schutz dieser seriellen<br />
Schnittstelle sollte besonders geachtet werden.<br />
Ein weiteres Angriffsszenario stellt das unberechtigte Bewegen des Knotens, durch zum<br />
Beispiel Aufheben, dar. Im Falle einer unzulässigen Bewegung des TSN, die über den<br />
Beschleunigungssensor festgestellt wird, sollen sensible Daten gelöscht und das Arbeiten<br />
mit dem Knoten verhindert werden. Bei diesem Szenario ist es schwer, zwischen einem<br />
berechtigten und einem unberechtigten Bewegen des Knotens zu unterscheiden. Es kann<br />
durchaus nötig sein, dass aus Gründen eines veränderten Szenarios oder aufgrund von<br />
106
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 6.18: Trägerplatine mit aufgebondeten ASICs<br />
Abbildung 6.19: Chip in einem BGA-Gehäuse<br />
107
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Abbildung 6.20: Trägerplatine mit teilweise vergossenen Kondensatoren<br />
Wartungsarbeiten, der TSN bewegt werden muss. Dabei sollten sensible Daten natürlich<br />
erhalten bleiben.<br />
Zur Unterscheidung, ob das Bewegen des Knotens berechtigt oder unberechtigt durchgeführt,<br />
wird ein Autorisierungsmechanismus eingeführt. Dieser ist in Abb. 6.22 beschrieben<br />
und findet kontaktlos statt, so dass der Knoten dazu nicht bewegt werden braucht. Nach<br />
erfolgreicher Autorisierung, findet eine Authentifizierung statt (siehe Abb. 6.23). Erst wenn<br />
diese erfolgreich abgeschlossen wurde, ist der Zugang zur der Programmierschnittstelle<br />
freigegeben.<br />
Die im Folgenden vorgestellte Komponente besitzt die Möglichkeit, zwischen berechtigtem<br />
und unberechtigtem Zugriff zu unterscheiden und gegebenenfalls Schutzmaßnahmen zu<br />
aktivieren.<br />
Abbildung 6.21: Anbindung der Authentifizierungskomponente in den TSN<br />
108
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Die Authentifizierungskomponente wird zwischen die „Debug Support Unit“ und der Programmierschnittstelle<br />
eingebunden (vgl. Abbildung 6.21). Sie sperrt die Pins solange bis<br />
eine erfolgreiche Authentifizierung erfolgt ist. Um eine mögliche Deaktivierung oder Überbrückung<br />
zu verhindern, muss sie unbedingt in den TSN Chip integriert sein. Sie kann<br />
weiterhin bestimmte Schutzmechanismen, wie zum Beispiel das Sperren des Systems,<br />
das Löschen von Schlüsseln oder sensibler Software veranlassen, wenn eine Authentifizierung<br />
mehrfach fehlgeschlagen ist. Eine Alarmmeldung sollte in diesem Fall ebenfalls<br />
gesendet werden.<br />
Zur Authentifizierung kann der ECC und das SHA1/PRNG-Modul des Systems verwendet<br />
werden um ein „Challenge-Response-Protokoll“ zu realisieren. Der Nutzer, der auf<br />
die Programmierschnittstelle des TSN zugreifen möchte, teilt seinen Zugriffswunsch durch<br />
das Senden seiner Identifikationsnummer (UserID) der Authentifizierungskomponente mit<br />
(vgl. Abbildung 6.22). Danach erhält er vom TSN eine Zufallszahl(PRN) und signiert diese<br />
mit Hilfe seines privaten Schlüssels (KeyUsrPriv) und sendet das Paket an die Authentifizierungskomponente<br />
des TSN zurück. Der TSN prüft die Signatur mit dem öffentlichen<br />
Schlüssel des Nutzers (KeyUsrPubl) und anschließend die Daten. Ist das Ergebnis korrekt,<br />
so kann der TSN davon ausgehen, dass kein Dritter die Identifikationsnummer missbräuchlich<br />
verwendet hat. Die Signierung ist notwendig, um einer Man-in-the-Middle Attacke vorzubeugen.<br />
Die Authentifizierungskomponente besitzt also den öffentlichen Schlüssel des<br />
Nutzers, wenn dieser autorisiert ist, auf das System zuzugreifen. Dieser liegt, z.B. mit der<br />
zugehörigen Identifikationsnummer des Nutzers, im internen Flash.<br />
msc User authorization<br />
User<br />
TSN<br />
UserID<br />
UserID valid<br />
PRN<br />
Generate PRN<br />
Sign PRN with KeyUsrPriv<br />
(PRN)KeyUsrPriv<br />
Check signature<br />
with KeyUsrPubl<br />
and check PRN<br />
PRN valid<br />
Authentication protocol<br />
Abbildung 6.22: Authentifizierung des Nutzers am TSN, um Man-In-The-Middle<br />
Attacken zu vermeiden<br />
Im Anschluss wird der Authentifizierungstimer gestartet (vgl. Abbildung 6.23). Vor dessen<br />
Ablauf muss das Authentifizierungsprotokoll abgeschlossen 1<br />
sein. Jetzt erzeugt die Authen-<br />
109
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
tifizierungskomponente mit Hilfe des Pseudo Random Number Generator (PRNG) eine<br />
Zufallszahl (PRN) und signiert diese mit ihrem privaten Schlüssel (KeyTSNPriv). Diese<br />
Zufallszahl wird für jede Authentifizierung neu generiert, um Replay-Attacken zu verhindern.<br />
Diese signierte Zufallszahl wird an den Nutzer gesendet. Dieser überprüft die Signatur<br />
mit dem öffentlichen Schlüssel der Authentifizierungskomponente (KeyTSNPubl) und<br />
inkrementiert die empfangene Zahl. Im Anschluss wird diese mit dem privaten Schlüssel<br />
des Nutzers (KeyUsrPriv) signiert und zurück gesendet. Die Authentifizierungskomponente<br />
nutzt den öffentlichen Schlüssel des Nutzers (KeyUsrPubl), um die Signatur zu prüfen.<br />
Die empfangene inkrementierte Zahl wird mit dem vorab berechneten Ergebnis verglichen.<br />
Sind die Ergebnisse identisch ist der Nutzer berechtigt, die Schnittstellen für eine vordefinierte<br />
Dauer zu benutzen. Die Authentifizierung ist abgeschlossen und der Session Timer<br />
wird gestartet. Während das Protokoll in Abb. 6.22 Man-in-the-Middle-Attacken verhindert,<br />
ist das Protokoll in Abb. 6.23 dafür zuständig Replay-Attacken zu verhindern. Gegebenenfalls<br />
lassen sich beide Protokolle zusammenführen und so optimieren.<br />
msc Authentification protocol<br />
User<br />
TSN<br />
Authentification timer<br />
Generate PRN<br />
and sign it with<br />
KeyTSNPriv<br />
(PRN)KeyTSNPriv<br />
Check the signature<br />
with KeyTSNPubl<br />
Signature is valid<br />
increment PRN and<br />
sign it with<br />
KeyUsrPriv<br />
(PRN+1)KeyUsrPriv<br />
Check the signature with<br />
KeyUsrPubl and check<br />
the PRN<br />
Signature and PRN are valid<br />
Session timer<br />
Abbildung 6.23: Authentifizierung zwischen 1 Nutzer und TSN zum Start einer neuen<br />
Session mit Schutz Replay-Attacken<br />
Der „Trusted Sensor Node“ besitzt einen Bewegungssensor. Dieser registriert Bewegungen<br />
des Knotens. Um zu unterscheiden, ob der Knoten von berechtigten Personen bewegt<br />
wird soll eine Radio Frequenzy Identification (RFID) in die Authentifizierungskomponente<br />
integriert werden. Diese wird im Falle einer Bewegung des TSN aktiviert und versucht im<br />
Anschluss eine Authentifizierung eines in der Nähe befindlichen autorisierten Nutzers zu<br />
ermöglichen. Dieser Nutzer besitzt einen sogenannten RFID-TAG, der die Kommunikation<br />
und die nutzerseitigen Aufgaben einer Authentifizierung ermöglicht. Wird dieser innerhalb<br />
110
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
einer gegebenen Zeitspanne nicht empfangen, sperrt die Komponente oder löscht sensible<br />
Daten.<br />
Bei Verwendung einer RFID kann gegebenenfalls auf die Authentifizierung über die DSU<br />
verzichtet werden. Möchte man über die „Debug Support Unit“ mit dem TSN kommunizieren,<br />
kann zur Authentifizierung ebenfalls ein RFID-TAG verwendet werden. Mit diesem<br />
muss man sich, wie oben bereits beschrieben, an der Authentifizierungskomponente anmelden,<br />
um die DSU freizuschalten.<br />
RFIDs gibt es in verschiedenen Ausführungen. Bei diesen Modulen werden hochfrequente<br />
elektromagnetische Wellen erzeugt mit denen Energie und Daten übertragen werden. Abhängig<br />
vom verwendeten Radiostandard, beträgt die Übertragungsreichweite eines RFIDs<br />
wenige Zentimeter bis hin zu 100m. Für die Authentifizierung an einem Sensorknoten,<br />
sollte ein RFID-System mit geringer Sendeleistung verwendet werden. Dies erhöht die Sicherheit,<br />
da das Mithören durch potentielle Angreifer erschwert wird. Zudem verbraucht<br />
eine leistungsarme RFID Lösung weniger Energie, als Lösungen mit stärkeren Sendern.<br />
Man unterscheidet in der Regel zwei Gruppen von RFIDs: Die passiven und die aktiven<br />
Systeme. Die aktiven Module besitzen eine eigene Energieversorgung. Die passiven RFID<br />
Module werden über die Antenne ihres Funkmoduls mit Energie versorgt, wenn diese entsprechende<br />
Energie eines Senders empfängt.<br />
Der TSN soll auf minimale Leistungsaufnahme im Betrieb optimiert werden, so dass eine<br />
passive RFID-Lösung anzustreben ist.<br />
Reset-Controller<br />
Für den Fall, dass die externe Sensorik einen Angriff vermutet, können die kryptografischen<br />
Module in ihren Ausgangszustand zurückgesetzt werden. Einem potentiellen Angreifer<br />
soll es so nicht möglich sein, einen Schlüssel oder ähnlich schützenswerte Informationen<br />
auszulesen. Bei der SHA1/PRNG-Komponente müssen beispielsweise die Register<br />
W0 bis W15 zurückgesetzt werden. Diese Register enthalten Informationen, die die Basis<br />
zur Generierung einer Pseudozufallszahl bilden. Kennt ein Angreifer diesen Wert, so kann<br />
er die gleichen Pseudozufallszahlen generieren. Beim AES hingegen ist es ausreichend<br />
die vier 32-Bit-Register für den Schlüssel auf „Null“ zu setzen, so dass ein Angreifer den<br />
Schlüssel nicht benutzen kann. Ein direktes Auslesen des Schlüssels ist ohnehin nicht<br />
möglich. Es wäre dem Angreifer lediglich möglich, Daten mit dem gespeicherten Schlüssel<br />
zu ver- bzw. zu entschlüsseln, was durch das Löschen des Schlüssels wirksam verhindert<br />
wird.<br />
111
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
6.3 Energieversorgung<br />
6.3.1 Einführung<br />
Im Abschnitt 6.2 wurden Optimierungen, auch in Hinblick auf die Leistungsaufnahme, vorgeschlagen.<br />
Diese beziehen sich sich auf den LEON-Prozessor und die zusätzlichen Komponenten<br />
zur Unterstützung der kryptografischen Funktionen. Die folgenden Ausführungen<br />
dagegen beschäftigen sich mit Verbesserungen des gesamten Boarddesigns.<br />
6.3.2 Boardkomponenten<br />
Neben dem Prozessor befinden sich weitere Komponenten auf der Platine. Zusätzlich zur<br />
Spannungsregelung sind externe Komponenten, wie SRAM und nichtflüchtiger Speicher in<br />
Form von Flash nötig. Alle Bauelemente könnten einer Prüfung unterzogen werden, ob sie<br />
überhaupt notwendig sind und/oder gegebenenfalls durch energiesparendere Alternativen<br />
ersetzt werden können. Beispielsweise könnte der SRAM und der Flash durch einen sogenannten<br />
Non-Volatile Random-Access Memory (NVRAM) ersetzt werden. Dieser besteht<br />
aus einem SRAM, dessen Inhalt beim Abschalten der Versorgungsspannung durch einen<br />
internen Lithium-Ion-Akku (on-Chip) aufrecht erhalten wird. So könnte der Prozessor die<br />
Energieversorgung des SRAM ein- oder ausschalten. Ein Flash könnte unter Umständen<br />
entfallen. Zu beachten ist bei einer solchen Lösung, dass dafür spezielle Bauelemente notwendig<br />
sind, die deutlich teurer und schwerer zu beschaffen sind als Standardelemente.<br />
Grundsätzlich kann in Erwägung gezogen werden, dass der Prozessor die Spannungsversorgung<br />
für die einzelnen Komponenten auf dem Board ein- und ausschalten kann.<br />
Der Prozessor hat durch die Position als Boardkoordinator den Überblick, welche Komponenten<br />
aktuell benötigt werden oder nicht. Mit diesem Wissen kann der Prozessor die<br />
Energiezufuhr zum jeweiligen Modul (z.B. Funkmodul) unterbrechen oder wiederherstellen.<br />
6.3.3 Alternativen zur Energieversorgung aus Primärbatterien<br />
Vielfach wird die Lebensdauer von Sensorknoten durch die Energieversorgung begrenzt.<br />
Je nach Anwendungsfall kann die Lebensdauer von einigen Tagen bis zu einigen Wochen<br />
betragen. Die erste Möglichkeit ist, Systeme zu benutzen, deren Energiedichte bezogen<br />
auf Baugröße und -gewicht höher ist als bei Primärbatterien. In absehbarer Zeit können<br />
dafür Brennstoffzellen in Frage kommen, in welchen Wasserstoff und Sauerstoff derart<br />
mit einander reagieren, dass bei dem Vorgang elektrische Energie freigesetzt wird. Die<br />
zweite Möglichkeit, die Lebensdauer von Sensorknoten zu erhöhen ist die Gewinnung von<br />
elektrische Energie aus der Umgebung. Diese Energie kann entweder direkt genutzt oder<br />
in einem Akku oder großen Kondensator zwischengespeichert werden. Man bezeichnet<br />
diesen Vorgang als „Energy Harvesting“ und stellt, mit Ausnahme von Solarzellen, einen<br />
relativ jungen Forschungsbereich dar.<br />
112
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Mit den folgenden Verfahren ist es möglich, elektrische Energie aus der Umweltenergie<br />
umzuwandeln:<br />
• Induktive Wandler,<br />
• Kapazitive Wandler,<br />
• Thermoelektrische Wandler,<br />
• Piezoelektrische Wandler und<br />
• Solarzellen<br />
Allen o.g. Systemen ist gemein, dass diese in der Baugröße klein gehalten sind und damit<br />
für den Einsatz in Sensorknoten prädestiniert sind. Nachteilig ist jedoch, dass so nur geringe<br />
Leistungen erreicht werden und besondere Umgebungsbedingungen vorliegen müssen.<br />
Beispielsweise sind induktive und kapazitive Wandler auf Vibrationen angewiesen und<br />
sind auch auf eine sehr schmalbandige Resonanzfrequenz abgestimmt. Weicht die Vibration<br />
in ihrer Frequenz ab, so bricht die elektrische Leistung ein. Silizumbasierte Systeme<br />
können Leistungen von ca. 45nW bis 240µW liefern [48].<br />
Dies zeigt, dass aktuelle Systeme für „Energy Harvesting“ nicht in der Lage sein werden,<br />
leistungsstarke Sensorknoten, wie den TSN, mit ausreichend Energie zu beliefern.<br />
Mögliche Auswege, um einen solchen Sensorknoten dennoch mit Umgebungsenergie zu<br />
versorgen wären:<br />
• Erhöhung der Leistungsfähigkeit des Energy Harvesting Moduls,<br />
• Integration von weitreichenden Power-Save-Modi für Prozessor und Boardkomponenten,<br />
• Integration von Step-Up-Wandlern zur Spannungsversorgung aus geringen Eingangsspannungen,<br />
• Reduzierung der Boardkomponenten (z.B. Beschränkung auf ein Funkmodul) und<br />
• Reduzierung der Duty-Cycle<br />
Mögliche Partner zum Aufbau eines Systems mit Brennstoffzellen oder Energy-Harvesting-<br />
Komponenten könnten sein:<br />
• IZM Fraunhofer, Berlin<br />
• Imtek, Freiburg<br />
• Micropelt, Freiburg und<br />
• EnOcean, Oberhaching.<br />
113
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
Bevor Kooperationen zu den Partnern gesucht werden, sollte jedoch die Leistungsaufnahme<br />
grob abgeschätzt werden. Diese hängt jedoch stark vom Anwendungsfall ab. Ein nicht<br />
zu unterschätzender Vorteil ist, dass bei der Entwicklung eines Sensorknotens und der<br />
dazugehörigen Energieversorgung beides gut aufeinander abgestimmt werden kann.<br />
114
Abkürzungsverzeichnis<br />
AES Advanced Encryption Standard<br />
AHB Advanced High-performance Bus<br />
AMBA Advanced Microcontroller Bus Architecture<br />
APB Advanced Peripheral Bus<br />
API Application Programming Interface<br />
ASIC Application Specific Integrated Circuit<br />
BSI Bundesamt für Sicherheit in der Informationstechnik<br />
BGA Ball Grid Array<br />
CAM Code Attestation Module<br />
CBC Cipher Block Chaining<br />
DHCP Dynamic Host Configuration Protocol<br />
DES Data Encryption Standard<br />
DSS Digital Signature Standard<br />
DSU Debug Support Unit<br />
ECB Electronic Code Book<br />
ECC Elliptic Curve Cryptography<br />
ECDSA Elliptic Curve Digital Signature Algorithm<br />
eCos embedded Configurable operating system<br />
ECPM EC Punktmultiplikation<br />
FPGA Field programmable Gate Array<br />
FSM Finite State Machine<br />
GPIO General Purpose Input/Output<br />
HAL Hardware Abstraction Layer<br />
HARPS Hashed Random Preloaded Subsets<br />
HTTP Hypertext Transfer Protocol<br />
IBL Initial Boot Loader<br />
IPC Interprozesskommunikation<br />
IP Internet Protocol<br />
IPv4 Internet Protocol Version 4<br />
IPv6 Internet Protocol Version 6<br />
L2CAP Logical Link Control and Adaption Layer Protocol<br />
LCP Link Control Protocol<br />
LGPL Lesser GNU Public License<br />
LVTTL Low Voltage Transistor Transistor Logic<br />
lwIP lightweight Internet Protocol<br />
MAC Medium Access Control<br />
MMIO Memory Mapped Input Output<br />
MVM Module Verification Module<br />
MMU Memory Management Unit
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
NIST National Institute of Standards and Technology<br />
NMI None-Maskable Interrupt<br />
NVRAM Non-Volatile Random-Access Memory<br />
OSI Open Systems Interconnection<br />
OTP One Time Programmable<br />
PC Programm Counter<br />
PCB Printed Circuit Board<br />
PHY Physical Layers<br />
PRNG Pseudo Random Number Generator<br />
PPP Point-to-Point Protocol<br />
RAM Random Access Memory<br />
RFID Radio Frequenzy Identification<br />
SAFER Secure And Fast Encryption Routine<br />
SDP Service Discovery Protocol<br />
SHA-1 Secure Hash Algorithmus 1<br />
SNMP Simple Network Managment Protocol<br />
SoC System-on-Chip<br />
SPI Serial Peripheral Interface<br />
SPP Serial Port Profile<br />
SRAM Static Random Access Memory<br />
SSL Secure Sockets Layer<br />
TBC Trusted Boot Chain<br />
TBR Trap Base Register<br />
TC Trusted Computing<br />
TCP Transmission Control Protocol<br />
TCB Trusted Code Base<br />
TCG Trusted Computing Group<br />
(T)FTP (Trivial) File Transfer Protocol<br />
TSN Trusted Sensor Node<br />
UART Universal Asynchronous Receiver Transmitter<br />
VHDL Very High Speed Integrated Circuit Hardware Description Language<br />
116
Literaturverzeichnis<br />
[1] J. Abraham. Integrating Complex I/O in an SoC. Chip Design, 4, 2004.<br />
[2] Aeroflex Gaisler.<br />
http://www.gaisler.com/.<br />
[3] Aeroflex Gaisler. LEON2 Processor User’s Manual, 1.0.30 edition, 2005.<br />
[4] ARM Technology. AMBA Specification (Rev 2.0), 1999.<br />
[5] B. Veer and J. Dallaway. The eCos Component Writer’s Guide, 2001.<br />
http://ecos.sourceware.org/docs-latest/ref/ecos-ref.html.<br />
[6] A. Bakre and B. R. Badrinath. I-TCP: Indirect TCP for Mobile Hosts. In Proceedings<br />
of the 15th International Conference on Distributed Computing Systems (ICDCS),<br />
1995.<br />
[7] H. Balakrishnan, V. N. Padmanabhan, S. Seshan, and R. H. Katz. A comparison of<br />
Mechanisms improving TCP performance over Wireless Links. IEEE/ACM<br />
Transactions on Networking, 5(6), 1997.<br />
[8] T. Chown, S. Venaas, and A. Vijayabhaskar. IETF_RFC: RFC4076 - Renumbering<br />
for stateless DHCPv6. Website, 2005.<br />
http://tools.ietf.org/html/rfc4076.<br />
[9] T. Chown, S. Venaas, and A. Vijayabhaskar. IETF_RFC: RFC5533 - Level 3<br />
Multihoming Shim Protocol for IPv6. Website, 2005.<br />
http://tools.ietf.org/html/rfc5533.<br />
[10] E. Douglas Comer. Internetworking with TCP/IP, Vol.1: Principles, Protocols, and<br />
Architectures. Prentice Hall International, 4 edition, 2000.<br />
[11] GNU + Cygnus + Windows = cygwin.<br />
http://cygwin.com.<br />
[12] J. Daintith. protection domain. Website, 2004.<br />
http://www.encyclopedia.com/doc/1O11-protectiondomain.html.<br />
[13] S. Deering and R. Hinden. IETF_RFC: RFC2460 - Internet Protocol, Version 6<br />
(IPv6) Specification. Website, 1998.<br />
http://tools.ietf.org/html/rfc2460.
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
[14] Z. Dyka and P. Langendörfer. Area Efficient Hardware Implementation of Elliptic<br />
Curve Cryptography by Iteratively Applying Karatsuba’s Method. In DATE, 2005.<br />
[15] eCos Reference Manual, 2008.<br />
http://ecos.sourceware.org/docs-latest/ref/ecos-ref.html.<br />
[16] eCosCentric - eCos Snapshots.<br />
http://www.ecoscentric.com/devzone/snapshots.shtml.<br />
[17] K. Fall and S. Floyd. Simulation-based Comparisons of Tahoe, Reno, and SACK<br />
TCP. Website.<br />
http://www.icir.org/floyd/papers/sacks.pdf.<br />
[18] The Fiasco microkernel.<br />
http://os.inf.tu-dresden.de/fiasco/.<br />
[19] S. Floyd, T. Henderson, and A. Gurtov. IETF_RFC: RFC3782 - The NewReno<br />
Modification to TCP’s Fast Recovery Algorithm. Website, 2004.<br />
http://www.faqs.org/rfcs/rfc3782.html.<br />
[20] S.H. Gunderson. RIPE-57 Dubai: Global IPv6 statistics. Website, Oktober 2008.<br />
http://www.ripe.net/ripe/meetings/ripe-57/presentations/Coli<br />
tti-Global_IPv6_statistics_-_Measuring_the_current_state_of<br />
_IPv6_for_ordinary_users_.7gzD.pdf.<br />
[21] G. Huston. IPv4 Address Report. Website.<br />
http://www.potaroo.net/tools/ipv4/index.html.<br />
[22] T. Itoh and S. Tsujii. A Fast Algorithm for Computing Multiplicative Inverses in<br />
GF(2m) using Normal Bases. In Inf. Comput, 1988.<br />
[23] V. Jacobson and R. Braden. IETF_RFC: RFC1072 - TCP extensions for long-delay<br />
paths. Website, 1988.<br />
http://www.faqs.org/rfcs/rfc1072.html.<br />
[24] D. Johnson, J. Arkko, and C. Perkins. IETF_RFC: RFC3775 - Mobility support for<br />
IPv6. Website, 2004.<br />
http://tools.ietf.org/html/rfc3775.<br />
[25] Keithley. Datasheet Keithley Series 2600. Website, 2010.<br />
http://www.keithley.de/dataasset=50827.<br />
[26] L4ka::pistachio microkernel.<br />
http://l4ka.org/projects/pistachio/.<br />
[27] Dr. P. Langendörfer, F. Vater, S. Peter, G. Panic, and T. Basmer. Deliverable 1.1 und<br />
1.1a Trusted Sensor Node - Hardwareversion 1, 2009.<br />
118
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
[28] P. Langendörfer, M. Methfessel, H. Frankenfeldt, I. Babanskaja, I. Matthaei, and<br />
R. Kraemer. Shielding TCP from Wireless Link Errors: Retransmission Effort and<br />
Fragmentation. The Journal of Supercomputing (Kluwer), 23(3):245–260, 2002.<br />
[29] A. K. Lenstra and E. R. Verheul. Selecting Cryptographic Key Sizes. Journal of<br />
Cryptology: the journal of the International Association for Cryptologic Research,<br />
14(4):255–293, 2001.<br />
[30] Lesswire - leading in wireless worlds: Startseite.<br />
http://www.lesswire.de.<br />
[31] LGPL.<br />
http://www.gnu.org/licenses/lgpl.html.<br />
[32] J. López and R. Dahab. Fast multiplication on elliptic curves over gf(2m) without<br />
precomputation. In CHES, 1999.<br />
[33] Modified GPL for eCos.<br />
http://ecos.sourceware.org/license-overview.html.<br />
[34] NIST Computer Security Division. FIPS 180-1, 2001.<br />
[35] NIST Computer Security Division. FIPS 186-1, 2001.<br />
[36] NIST Computer Security Division. FIPS 186-2, 2001.<br />
[37] NIST Computer Security Division. FIPS 197: Advanced Encryption Standard, 2001.<br />
[38] Okl4-open kernel labs.<br />
http://www.ok-labs.com/.<br />
[39] S. Peter and P. Langendörfer. An efficient polynomial multiplier in gf(2m) and its<br />
application to ecc designs. In DATE, 2007.<br />
[40] S. Peter, P. Langendörfer, and K. Piotrowski. Flexible hardware reduction for elliptic<br />
curve cryptography in gf(2 m ). In Design, Automation and Test in Europe, April 16-20,<br />
2007, Nice, France, 2007.<br />
[41] S. Peter, M. Zessack, F. Vater, G. Panic, H. Frankenfeldt, and M. Methfessel. An<br />
Encryption-Enabled Network Protocol Accelerator. In Wired/Wireless Internet<br />
Communications, 6th International Conference, WWIC 2008, Tampere, Finland, May<br />
28-30, 2008, Proceedings, pages 79–91, 2008.<br />
[42] POSIX. IEEE Std 1003.2-1992 (POSIX.2).<br />
[43] M. Ramkumar and N. Memon. An Efficient Random Key Pre-distributin Scheme.<br />
IEEE Journal on Selected Areas of Communication, 23, 2005.<br />
119
<strong>Abschlussbericht</strong><br />
Trusted Sensor Node<br />
[44] R. L. Rivest, A. Shamir, and L. M. Adelman. A method for obtaining digital signatures<br />
and public key cryptosystems. Technical Report MIT/LCS/TM-82, Laboratory for<br />
Computer Science, Massachusetts Institute of Technology, Cambridge, 1977.<br />
[45] S. and P. Langendörfer. An efficient polynomial multiplier in gf(2 m ) and its application<br />
to ecc designs. In Design, Automation and Test in Europe, April 16-20, 2007, Nice,<br />
France, 2007.<br />
[46] Description of SAFER+.<br />
http://www.quadibloc.com/crypto/co040407.htm.<br />
[47] M. Scott. MIRACL—A Multiprecision Integer and Rational Arithmetic C/C++ Library,<br />
Version 5.0. Shamus Software Ltd, Dublin, Ireland, 2005.<br />
http://indigo.ie/~mscott.<br />
[48] C. Serre, A. Pérez-Rodríguez, N. Fondevilla, J.R. Morante, J. Montserrat, and<br />
J. Esteve. Vibrational Energy Scavenging with SI Technology Electromagnetic<br />
Inertial Microgenerators. In DTIP of MEMS & MOEMS, Stresa, Italy, 26-28 April<br />
2006, 2006.<br />
[49] The SPARC Architecture Manual, Version 8. Website, 1992.<br />
http://www.sparc.org.<br />
[50] W. R. Stevens. TCP/IP Illustrated I, 1993.<br />
http://www.uic.rsu.ru/doc/inet/tcp_stevens/tcp_bulk.htm.<br />
[51] Synopsys. DesignWare DW_apb_ssi Databook, July 2005.<br />
[52] System Architecture Group: About Us: People: Liedtke.<br />
http://i30www.ira.uka.de/aboutus/people/liedtke/nachruf.php.<br />
[53] TCG Specification Architecture Overview. Website, 2007.<br />
http://www.trustedcomputinggroup.org/resources/tcg_architect<br />
ure_overview_version_14.<br />
[54] IEEE 802.15 TG4.<br />
http://www.ieee802.org/15/pub/TG4.html.<br />
[55] Building a toolchain for use with eCos.<br />
http://ecos.sourceware.org/build-toolchain.html.<br />
[56] TUD Betriebssysteme L4Env.<br />
http://www.inf.tu-dresden.de/index.phpnode_id=1431.<br />
[57] uITRON.<br />
http://www.assoc.tron.org/spec/itron/mitron-400e.pdf.<br />
120