Beschreibung
Verfahren zum Betreiben eines Mikroprozessors und eine Mikro- prozessoranordnung
Die vorliegende Erfindung betrifft ein Verfahren zur Betreiben eines Mikroprozessors und eine Mikroprozessoranordnung gemäß der nebengeordneten Patentansprüche 1 und 9.
Bei Programmen in Sicherheitsanwendungen, die auf einem Mikroprozessor programmiert werden, besteht generell die Möglichkeit, durch Auswertung von Befehlsfolgen geheime Informationen, wie beispielsweise Schlüssel, auszuspähen.
Es gibt verschiedene Möglichkeiten derartige Schaltungen für Sicherheitsanwendungen anzugreifen. Bei sogenannten "Side- Channel-Attacks" wird beispielsweise die Stromaufnahme oder die elektromagnetische Emission der Schaltung erfaßt, wenn ein bestimmter Vorgang in der Schaltung abläuft . Aus dem zeitlichen Verlauf, insbesondere dem zeitlichen Bezug der
Stromaufnahme oder der elektromagnetischen Emission kann beispielsweise auf den verwendeten Schlüssel geschlossen werden.
Differential Power Analysis (DPA) ist ein bekanntes Angriffs- Szenario für Sicherheits-CPUs. Bei einem solchen Angriff wird eine Folge von Befehlen eines Programms und deren Auswirkungen in der Schaltung mittels statistischer Auswertungen der Kennlinien des Stromverbrauchs ermittelt. Aus diesen Auswertungen lassen sich detaillierte Rückschlüsse über das ausge- führte Programm gewinnen. Das Erfassen der elektromagnetischen Emission ist unter der Bezeichnung DEMA ("Differential Electro-Magnetic Analysis") bekannt.
Programme weisen immer mehrere Programm- bzw. Codesequenzen auf, die unabhängig voneinander sind und deren Reihenfolge in der Abarbeitung vertauschbar ist. Zum Schutz gegen oben genannte Art von Angriffen wurde bisher der Programmablauf
softwaremäßig zufallsgesteuert verändert. Hierbei wurden beispielsweise Befehlsfolgen durch Permutation vertauscht, redundante Befehlsfolgen eingefügt oder mehrere verschiedene Codesequenzen, die zum gleichen Ergebnis führen, eingeführt. Dies erfordert jedoch den Einsatz eines Zufallsgenerators, der nicht bestimmbare Zufallsbits generiert, die an entsprechenden Verzweigungspunkten innerhalb des Programms Software- mäßig ausgewertet werden, um beispielsweise bei einem Sprung- Befehl in die entsprechende Codesequenz zu verzweigen.
Ein weiteres Verfahren zum Schutz gegen diese Art von Angriffen ist eine zufallsgesteuerte Programmverzögerung, bei der Dummy-Codesequenzen, deren Ausführungsdauer mit Hilfe eines Zufallsgenerators bestimmt wird, in den laufenden Programmco- de eingefügt werden.
Ein aus der veröffentlichten WO/9963419 bekanntes Verfahren beschreibt die Ansteuerung eines "Wait-State-Anschlusses" einer Schaltung durch einen Zufallsgenerator, wobei in Abhän- gigkeit der durch den Zufallsgenerator erzeugten Zahl der Betrieb der Schaltung angehalten oder wieder aufgenommen wird und dadurch einheitliche Verarbeitungszyklen unterbunden werden.
Nachteilig bei den oben genannten Verfahren ist es, daß die Programmgröße zunimmt, die Laufzeit des Programms verlängert wird, die Performance sinkt und ein erhöhter Stromverbrauch zu verzeichnen ist.
Ausgehend von diesem Stand der Technik liegt der Erfindung die Aufgabe zugrunde, ein Verfahren zum Betreiben eines Mikroprozessors bzw. eine Mikroprozessoranordnung vorzusehen, mit denen eine ausreichende Sicherheit bei minimalem Programmaufwand gewährleistet ist.
Diese Aufgabe wird durch ein Verfahren bzw. eine Mikroprozessoranordnung gelöst, bei denen zumindest eine Programmver-
zweigung und/oder Programmverzögerung vorgesehen ist, die zur Modulation eines Programmablaufs Zufallsbit-gesteuert und als hardwarebasierender Befehl implementiert ist.
Da der Programmablauf durch die Reihenfolge der Befehle und deren bei der Ausführung benötigte Laufzeit bestimmt ist, wird die Modulation eines Programmablaufs in vorteilhafter Weise dadurch gesteuert, daß beispielsweise ein über einen Pseudo-Zufallsgenerator zufällig erzeugtes Bit mit einem er- zeugten nicht bestimmbaren Bit eines echten physikalischen
Zufallsgenerators zu einem Zufallsbit verknüpft wird, welches von den hardwarebasierenden Befehlen des Mikroprozessors genutzt wird, um zufällig Programmverzweigungen und/oder Pro- grammverzδgerungen auszuführen.
In vorteilhafter Weise werden Befehle eingeführt, die eine variable Ausführungszeit aufweisen, indem die Laufzeit der Befehle über die den Befehlen zugeordnete Parameter, die beispielsweise Operationszyklen angeben, zufällig verändert wer- den. Es können ebenso Befehle in den Programmablauf eingefügt werden, die eine Leer-Operation ausführen und keinen Einfluß auf das Ergebnis einer Codesequenz haben.
Zufallsgesteuerte Programmverzweigungen werden in vorteilhaf- ter Weise durch Sprung-Befehle mit mindestens einem Sprungziel realisiert . Der Sprung wird dabei in Abhängigkeit des Wertes eines Zufallsbits durchgeführt oder nicht durchgeführt. Bei einem Sprungbefehl mit mindestens zwei Sprungzielen, mit unter den Zieladressen unabhängig voneinander abzu- arbeitenden Codesequenzen, kann Zufallsbit-gesteuert die Reihenfolge der abzuarbeitenden Codesequenzen variiert werden. Die Zieladressen müssen nicht zwingend alle abgearbeitet werden, wenn sie das gleiche Ergebnis erzielen. Weisen diese Codesequenzen beispielsweise unterschiedliche Laufzeitprofile auf, ist das Zeitverhalten zur Erzielung eines Ergebnisses bei einem erneuten Programmdurchlauf nicht bestimmbar, so daß
die vorab beschriebenen Angriffsmethoden keine verwertbaren Informationen erzielen.
Nachfolgend wird die Erfindung anhand von Ausführungsbeispie- len näher erläutert .
Im nachfolgenden ersten Ausführungsbeispiel wird ein Sprungbefehl ("jumble") implementiert, wobei der Sprungbefehl ein Sprungziel spezifiziert:
Jumble <adressl>
code sequence 1 goto address 2 adressl:
code sequence 2 adress2 :
common code sequence
In Abhängigkeit des Wertes des Zufallsbits wird der Sprung ausgeführt oder nicht ausgeführt. Ist beispielsweise das Zufallsbit gesetzt, weist also den Wert "1" auf, wird die Sprung-Operation zu Adresse "adressl" ausgeführt, wo die Codesequenz 2 abgearbeitet wird und anschließend unter der Adresse "adress2" die gemeinsame Codesequenz "common code sequence" bearbeitet wird. Die Codesequenz 1 kann hier eine Dummy-Operation beinhalten, die keinen Einfluß auf das Ergeb- nis hat. Für den Fall, daß das Zufallsbit nicht gesetzt ist, also den Wert "0" aufweist, wird der Sprung zu Adresse "adressl" nicht ausgeführt, sondern der Programmablauf linear mit der Codesequenz "code sequence 1" und anschließendem Sprung zu Adresse "adress2" fortgesetzt.
Im nächsten Ausführungsbeispiel ist ein Sprungbefehl ("jumble") implementiert, wobei der Sprungbefehl in drei Sprungziele verzweigt :
Jumble <addrl>, <addr2>, <addr3>
addrl : code sequence 1 goto addr 4 addr2 : code sequence 2 goto addr 4 addr3 : code sequence 3 goto addr 4 addr4 : common code sequence
Die Reihenfolge der Abarbeitung der Codesequenzen "code sequence 1, code sequence 2 und code sequence 3" unter den Adressen "addrl, addr2 und addr3 " der Sprungziele kann vertauscht werden, da sie funktionell nicht voneinander abhängig sind. Die vom zu erzielenden Ergebnis gleichwertigen Codesequenzen müssen nicht zwingend alle abgearbeitet werden, so daß Zufallsbit-gesteuert eine Adresse angesprungen werden kann, unter der die entsprechende Codesequenz abgearbeitet wird und anschließend unter der Adresse "adress4" der Pro- grammablauf fortgesetzt wird. Dadurch, daß die Codesequenzen unterschiedliche Laufzeitverhalten aufweisen und bei jedem erneuten Programmdurchlauf an eine andere Adresse gesprungen wird, ist eine Analyse der durch Abhδrverfahren gewonnenen Daten nicht möglich. Auch die Zufallsbit-gesteuerte Reihen- folge bei einer notwendigen Abarbeitung aller Codesequenzen liefert keine verwertbaren Daten.
Das folgende Ausführungsbeispiel zeigt einen Sprungbefehl mit zwei möglichen Sprungzielen, der als Call-Befehl "jumblecall" implementiert ist und durch einen Sprung einen Kontextwechsel realisiert :
Jumblecall <addl>, <addr2>
some code
addrl : code sequence 1 return
some code
addr2 : code sequence 2 return
Zufallsbit-gesteuert kann in diesem Beispiel der Befehl entweder zu einem oder zu beiden Sprungzielen ausgeführt werden. Um nach Abarbeitung einer Codesequenz das Unterprogramm zu verlassen, wird ein Befehl "return" ausgeführt, der den vorherigen Kontext wieder herstellt .
Das folgenden Ausführungsbeispiel zeigen einen Befehl, der einen Leer-Operation "jumplenop" ausführt:
jumplenop <n>,<m>
Die Zufallsbit-gesteuerten Parameter <n> und <m> spezifizieren hier die Ober- und Untergrenze möglicher Operationszyklen, so daß eine variable Lauflänge des Befehls erzielt wird. Zur Erzielung einer variablen Ausführungszeit eines Befehls, wobei die Parameter einem beliebigen Befehl zugeordnet werden können, könnte auch lediglich ein Parameter als Obergrenze angegeben werden. Weisen die Parameter den Wert "0" auf, so wird der Befehl in einem optimalen Zeitraum durchgeführt . Weisen die Parameter einen von "0" verschiedenen Wert auf, werden bis zu <n> oder <m> Takte benötigt, um diesen Befehl auszuführen.
Der Befehl "jumpleadd" des nachfolgenden Ausführungsbeispiels ist ebenso für alle Befehle anwendbar:
jumpleadd R , Ry
Mit Hilfe dieses Befehls wird die Ausführungszeit ebenfalls zufällig verlängert.
Generell müssen die die Laufzeit eines Befehls bestimmenden Parameter nicht zwingend für jeden einzelnen Befehl spezifiziert werden. Diese Parameter können in einem Konfigurations- register hinterlegt werden, auf das über beispielsweise einen Konfigurationsbefehl "jumple_config <opl> <op2> zugegriffen wird.
Das vorab beschriebene Verfahren bezieht sich nicht nur auf die ausgeführten Beispiele. Sie sollen vielmehr verdeutlichen, daß Programmverzögerungen und Programmverzweigungen zur Modulation eines Programmablaufs in beliebiger Variation imp- lementiert werden können.