Ein Kryptomodul entlastet den Prozessor

Sicherheit ohne Performance-Einbuße

13. Dezember 2006, 10:54 Uhr | Thomas Brinker und Sebastian Heß
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Sicherheit ohne Performance-Einbuße

 

01  #include <stdio.h>
02  #include <unistd.h>
03  #include <fcntl.h>
04  #include <sys/ioctl.h>
05  #include <crypto/cryptodev.h>
06
07  int main (void)
08  {
09     unsigned char* in = (unsigned char*)
        "md5 crypto testing string";
10     unsigned char out[16];
11     int i, fd, cfd;
12     struct session_op sess;
13     struct crypt_op cryp;
14
15     fd = open("/dev/crypto", O_RDWR, 0);
16     ioctl(fd, CRIOGET, &cfd);
17     fcntl(cfd, F_SETFD, 1);
18
19     /* Variablen mit passenden Werten*/
20     /* einer  MD5-Sitzung belegen */
21     sess.cipher = 0;
22     sess.mac = CRYPTO_MD5;
23     sess.mackeylen = 16;
24     sess.mackey = 0;
25     ioctl(cfd, CIOCGSESSION, &sess);
26
27     cryp.ses = sess.ses;
28     cryp.len = strlen(in);
29     cryp.src = in;
30     cryp.dst = out;
31     cryp.iv = 0;
32     cryp.op = COP_ENCRYPT;
33
34     /* Do the MD5 */
35     ioctl(cfd, CIOCCRYPT, &cryp);
36
37     //out beinhaltet nun MD5-Summe
38
39     return 0;
40  }
Listing 1. Benutzung von OCF zur Erzeugung der MD5-Summe. Nachdem einige benötigte Variablen angelegt wurden, wird die Pseudo-Datei /dev/crypto geöffnet.

Steuerung über Open Cryptographic Framework

Wie in modernen Betriebssystemen üblich, soll der Zugriff auf die Hardware möglichst abstrakt und generisch erfolgen. Mit dem Open Cryptographic Framework (OCF), das ursprünglich für OpenBSD entwickelt wurde, steht ein Framework aus zwei Schichten zur Verfügung. Die oberste Schicht, die die Anwendungen direkt anspricht, besteht aus einem „character device“ – dem so genannten „cryptodev“. Bei „cryptodev“ handelt es sich um eine Pseudodatei. Mit Zugriff auf diese Datei wird OCF gesteuert. Alle Einstellungsmöglichkeiten des OCF sind dem Benutzer über das „cryptodev“ zugänglich. Die Anwendungsschicht validiert alle Eingaben des Nutzers, um eine fehlerhafte Verwendung des OCF zu verhindern.

Die Treiberschicht liegt unter der Anwendungsschicht und steuert direkt die Hardware. OCF für Linux enthält bereits Unterstützung für verschiedene Kryptographiemodule. Aktivitäten wie das Einstellen der DMAs oder das Programmieren der Hardware-Register erfolgen vollständig in dieser Treiberschicht. Listing 1 zeigt beispielhaft die Benutzung von OCF zur Erzeugung der MD5-Summe. Nachdem einige benötigte Variablen angelegt wurden, wird die Pseudo-Datei /dev/crypto geöffnet. Ab Zeile 21 werden dann die Variablen mit passenden Werten für eine MD5-Sitzung gefüllt. Der ioctl-Befehl in Zeile 25 legt die Session dann an. Die Sessionnummer wird dabei in das Feld sess.ses geschrieben. Im nächsten Schritt werden die Daten mit der Session verknüpft (Zeile 27). Der ioctl-Befehl in Zeile 35 führt dann die Operation aus. Es werden nur Zeiger auf die Daten übergeben, eine Kopie wird nicht erzeugt.

OCF muss aber nicht direkt von der Applikation aus bedient werden. In den meisten Fällen wird eine Library zwischengeschaltet, die als Bindeglied zwischen Applikation und Treiber dient. Diese Aufgabe kann unter anderem auch von OpenSSL übernommen werden (siehe Bild 2). Zum Zeitpunkt der Compilation von OpenSSL muss lediglich angegeben werden, dass OCF verfügbar ist. Alle Befehle, die sich an die Hardware auslagern lassen, werden von OpenSSL dann über OCF an die Hardware weitergegeben. Die Applikation bemerkt davon nichts – die kryptographischen Funktionen bleiben unverändert. Auch bereits vorhandene Applikationen können davon profitieren, ohne dass Anpassungen notwendig sind. Es muss lediglich sichergestellt werden, dass auf eine OpenSSL-Version zugegriffen wird, die OCF unterstützt.

Die meisten Standard-Netzwerkanwendungen nutzen zur Ver- bzw. Entschlüsselung eine Library, oftmals OpenSSL, seltener libtomcrypt. So können zum Beispiel Websites mit dem Secure Socket Layer (SSL) geschützt werden, ohne dass der Prozessor sehr viel stärker belastet wird, weil das Webserver-Programm auf die OpenSSL zurückgreift. Weitere Möglichkeiten bietet die Secure Shell (SSH). SSH baut eine Telnet-ähnliche Verbindung auf. Alle Daten inklusive der Passwörter werden verschlüsselt und damit sicher versendet. Mit SSH lassen sich aber auch ganze Datenströme verschlüsselt übertragen, wie es zum Beispiel das Secure-Copy-Program (scp) macht.

6220502_02.jpg
Bild 2. Die kryptographischen Berechnungen werden von der Library über OCF an die Hardware ausgelagert. Funktionen, die die Hardware nicht unterstützt, werden vom Software Fallback abgefangen.

  1. Sicherheit ohne Performance-Einbuße
  2. Krypto-Hardware spielt bei großen Datenblöcken Vorteile voll aus
  3. Sicherheit ohne Performance-Einbuße

Jetzt kostenfreie Newsletter bestellen!