• Keine Ergebnisse gefunden

Bevor die genaue Funktionsweise des Crypto-Compilers erläutert wird, soll in diesem Abschnitt der generelle Aufbau des Crypto-Compilers beschrieben werden (siehe Abbildung 4.1). Der Compiler lässt sich in die drei Komponenten Frontend,Crypto-FrameworkundBackendunterteilen.

Der Crypto-Compiler wurde unter anderem im Rahmen mehrerer Abschlussar-beiten an der Technischen Universität Harburg umgesetzt [81] [75] [79].

4.2.1 Crypto-Framework

Das Crypto-Framework ist unabhängig vom Rest des Compilers und kann ohne Front- und Backend verwendet werden. Es bildet den Kern des Compilers und stellt C++Klassen bereit, um Protokolle, die auf zahlentheoretischen Problemen basieren, leichter implementieren zu können. Sobald die Klassen instanziiert sind, werden sie alsCrypto-Objektebezeichnet.

Crypto-Objekte

Crypto-Objekte können entweder vom Programmierer oder durch das Frontend erzeugt werden. Zurzeit sind zehn Typen von Crypto-Objekten implementiert, um die Protokolle in Kapitel 3 sowie weitaus komplexere Protokolle beschrei-ben zu können. Für die Schilderung der Funktionalität soll an dieser Stelle auf die Erläuterung der Eingabesprache in Kapitel 4.3 verwiesen werden, da jedes Sprachelement der Eingabesprache auf ein Crypto-Objekt abgebildet wird.

Konzept 4.2

Parser

Lexer

Datei String Token Lexem

Compiler-Frontend

Crypto-Objekte

Config Group Var VarAssign Hom

Sigma ZPK Check Block Print

Bignum ECC PBC

Random Hash

Module

Repo-sitory

Crypto-Framework Direkter Framework Zugriff

Code-Collector Compiler

*.c

Datei Mapping auf Zielsprache

Ausführung Interpreter Compiler-Backend / CM-Framework

Abbildung 4.1:Aufbau des Crypto-Compilers.

Kapitel 4 CRYPTO-COMPILER

Crypto-Objekte sind von anderen Crypto-Objekten abhängig. Beispielsweise enthält ein Crypto-Objekt, welches eine Variable abstrahiert, eine Referenz auf ein Crypto-Objekt, das eine Gruppe modelliert. Problematisch ist das Löschen von Crypto-Objekten. Es kommt zu einem Speicherleck, wenn z. B. das Gruppen-Objekt gelöscht wird und das Variablen-Gruppen-Objekt noch existiert.

Zur Vermeidung besitzt jedes Crypto-Objekt einenReferenzzähler. Referenziert ein Crypto-Objekt ein anderes Crypto-Objekt, wird der Referenzzähler des zwei-ten Objektes erhöht. Beim Löschen eines Crypto-Objektes wird der Referenz-zähler aller referenzierter Objekte um eins dekrementiert. Ist der ReferenzReferenz-zähler Null, wird das Objekt automatisch entfernt. Durch dieses Konzept konnte ein ein-facher Garbage Collector realisiert und die Gefahr von Speicherlecks reduziert werden [95].

Alle entweder durch den Programmierer oder den Parser erzeugten Crypto-Objekte werden imRepositorygespeichert. Da jedes Crypto-Objekt über eine eindeutige ID verfügt, kann später direkt durch den Programmierer auf die Crypto-Objekte zugegriffen werden.

Module

Die Funktionalität der Crypto-Objekte basiert auf fünf austauschbaren Kompo-nenten, denModulen. Während die Schnittstelle der Module zum Rest des Crypto-Frameworks fest definiert ist, ist die Funktionalität der Module austauschbar.

Dadurch wird eine maximale Flexibilität gewährleistet.

1. Bignum: In der Regel übersteigt bei kryptographischen Protokollen die Bitlänge der Zahlen die Wortbreite des Prozessors (typischerweise 32 oder64 Bit). Aus diesem Grund müssen die arithmetischen Langzahlope-rationen wie z. B. Addition oder Multiplikation vor der Ausführung in mehrere Teiloperationen zerlegt werden. Das Bignum-Modul abstrahiert diese Langzahloperationen. Daneben stellt es weitere Funktionalitäten wie z. B. Primzahltests zur Verfügung.

Das Bignum-Modul basiert auf der MPIR Bibliothek [71]. Die Bibliothek unterstützt eine Vielzahl von Hardware-Plattformen und enthält hoch-optimierten Code für eine Vielzahl von Prozessorarchitekturen.

2. ECC: Basierend auf dem Bignum-Modul wurde im Rahmen einer Studien-arbeit die Bibliothek „SimpleECC“ zur Verwendung elliptischer Kurven in C/C++Projekten entwickelt [79]. Das ECC-Modul (Elliptic Curve Crypto-graphy Modul) agiert als Schnittstelle zwischen dem Crypto-Framework und der SimpleECC Bibliothek.

3. PBC: Das Modul (Pairing Based Cryptography Modul) stellt PBC-Operationen für Pairing Crypto-Objekte zur Verfügung. Das Modul abs-trahiert in erster Linie die Funktionalität der libPBC Bibliothek [14].

Konzept 4.2

4. Hash: Nicht-interaktive Sigmaprotokolle erfordern die Implementierung von Hashfunktionen. Das Hash-Modul stellt eine einheitliche Schnittstelle zur Verwendung kryptographischer Hashfunktionen bereit. Im Rahmen dieser Arbeit sind die Hashfunktionen der OpenSSL-Bibliothek MD4, MD5, SHA-1, SHA-224, SHA-256, SHA-384 und SHA-512 implementiert [130].

5. Random: Das Random-Modul stellt eine einheitliche Schnittstelle zur Ge-nerierung von Zufallszahlen zur Verfügung. Neben Funktionen, um fallszahlen aus beliebigen Intervallen zu erzeugen, kann die Art der Zu-fallszahlen (Primzahlen, sichere Primzahlen etc.) gewählt werden. Das Random-Modul basiert auf dem Pseudozufallszahlengenerator der MPIR Bibliothek. Der Generator wird mit einem Wert (Seed) initialisiert und liefert daraufhin (Pseudo-) Zufallszahlen für das Crypto-Framework. Der Seed kann entweder durch das Betriebssystem oder durch eine spezielle Smartcard erzeugt werden. Die Erzeugung des Seeds durch die Smartcard, hat den Vorteil, dass „echte“ Zufallszahlen als Seed verwendet werden können [154].

4.2.2 Compiler-Frontend

Das Frontend des Compilers besteht aus Lexer und Parser und erweitert das Crypto-Framework dahingehend, dass Crypto-Objekte automatisch durch eine Eingabesprache erzeugt werden können.

Lexer

Der Lexer fasst Symbole aus einem Eingabebuffer zu Lexeme und Token zusam-men und übergibt sie an den Parser. Die Daten werden dabei entweder aus einer ASCII-Datei oder einem String gelesen und in den Eingabebuffer geschrieben.

Der Lexer entfernt Kommentare, sowie alle Zeichen, die keinerlei semantische Bedeutung haben, wie z. B. Leerzeichen, Tabulatoren und Zeilenumbrüche.

Der Lexer testet den Strom von Zeichen aus dem Eingabebuffer auf Bezeich-ner, Schlüsselwörter, Zahlen, Zeichenketten in Anführungszeichen und sonstige Zeichenketten.

Bezeichner: Zur eindeutigen Identifikation von Objekten in der Eingabe-sprache (z. B. Variablen) dienen Bezeichner, die aus Groß-/Kleinbuchsta-ben (A-Zunda-z), Zahlen (0-9) und dem Unterstrich (_) bestehen dürfen.

Ein Bezeichner darf nicht mit einer Zahl beginnen.

Kapitel 4 CRYPTO-COMPILER

Schlüsselwörter: Schlüsselwörter wie z. B.ConfigParamoderexporthaben in der Eingabesprache eine bestimmte Bedeutung und dürfen nicht als Bezeichner verwendet werden.

Zahlen: Zahlen werden entweder in dezimaler oder hexadezimaler Notati-on angegeben, wobei hexadezimale Zahlen das Präfix0xhaben müssen.

Zur Darstellung negativer Zahlen kann das Minuszeichen (-) verwendet werden. Die Größe einer Zahl ist nur durch den zur Verfügung stehenden Arbeitsspeicher begrenzt.

Zeichenketten: Der Lexer unterscheidet zwischen Zeichenketten in Anfüh-rungszeichen und normalen Zeichenketten. Der erste Fall beschreibt eine beliebige Folge von ASCII Zeichen, die durch”begrenzt wird. Normale Zeichenketten dürfen dagegen nur Groß-/Kleinbuchstaben, Ziffern und den Unterstrich enthalten.

In dieser Arbeit wird das Programm GNU Flex verwendet, um den Lexer zu erstellen [139]. Die Beschreibung des Lexers erfolgt in Form von regulären Aus-drücken (Typ-3 Grammatik). Nach Satz 4.1.3 ist die Laufzeit des Lexers damit linear.

Parser

Die manuelle Programmierung ist bei einer umfangreichen Eingabesprache, wie sie in dieser Arbeit verwendet wird, sehr komplex und fehleranfällig. Änderungen an der Grammatik führen zu aufwendigen Änderungen am Parser. Aus diesem Grund wird Bison, ein Parsergenerator eingesetzt, der aus einer kontextfrei-en Grammatik einkontextfrei-en LR-Parser gkontextfrei-eneriert [165]. Standardmäßig erzeugt Bison LALR(1)-Parser, aber aufgrund von Mehrdeutigkeiten in der Grammatik wird ein GLR-Parser generiert (siehe Kapitel 4.3).

Während des Parsens fordert der Parser vom Lexer Token an. Kann der Parser eine Grammatikregel anwenden, kommuniziert der Parser mit dem Crypto-Framework, um z. B. neue Crypto-Objekte anzulegen. Neben der Grammatik überprüft der Parser weitere Bedingungen45(siehe Kapitel 4.3).

4.2.3 Compiler-Backend

Soll die Funktionalität der Crypto-Objekte in eine Zielsprache übersetzt werden, ist das Compiler-Backend notwendig. Die Funktionalität der Crypto-Objekte wird durch das Backend als plattformunabhängiger Zwischencode in einer Da-tenstruktur beschrieben, der dann in einer beliebigen Zielsprache ausgegeben

45z. B. ob ein Bezeichner bereits verwendet wurde.

Eingabesprache 4.3

werden kann. Neben dem Compiler-Modus unterstützt der Crypto-Compiler einenInterpreter-Modus. In diesem Modus wird die Funktionalität der Crypto-Objekte direkt ausgeführt und nicht wie im Compiler-Modus nur aufgesammelt.

Dadurch kann der Crypto-Compiler interaktiv verwendet werden.

Das Backend im Crypto-Compiler wird durch dasCMF (Code Management Frame-work)realisiert, dass ein eigenständiges Projekt darstellt und in Kapitel 4.4 be-schrieben wird.