| 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.