BitBastelei #144 – Samsung Galaxy S3: Root & Cyanogenmod

BitBastelei #144 - Samsung Galaxy S3: Root & Cyanogenmod

(45 MB) 00:15:16

2015-04-12 10:00 🛈

Samsung Galaxy S3 unter Linux rooten und mit Cyanogenmod ausstatten

USB-Debugging aktivieren: http://www.giga.de/extra/android-spezials/specials/was-ist-usb-debugging-und-wie-laesst-es-sich-aktivieren/
EFS sichern: http://www.handy-faq.de/forum/samsung_galaxy_s3_forum/228151-samsung_galaxy_s3_efs_backup_imei_sichern.html

Nvidia/X.org: OpenGL-Fehler bei einigen Spielen

Vor kurzem mussten die mehr als 10 Jahre alten Grafikkarten meines Rechners einem neueren Modell weichen. Schneller, weniger Strom und – das Wichtigste – ich kann wieder die aktuelle Treibergeneration nutzen. Die Umrüstung ist unter Linux ja kein Problem: Umstecken, den alten Nvidia 340 „Legacy“-Treiber gegen einen aktuellen 346er ersetzen und fertig ist. Dank nvidia-settings sind die Monitore schnell sortiert und der 3D-Test glxgears zeigt trotz Rendering auf 4 Monitoren zugleich solide 60 Frames (aka vsync-Maximum). Auch Videobearbeitung und Co reagieren solide. Also schnell die Arbeit fertig gemacht und eine Runde zocken. Oder auch nicht.

X Error of failed request: BadAlloc (insufficient resources for operation)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)

so lautete die Meldung, welche ich beim Starten von RTCW:ET erhielt. Na gut, eventuell ja was daran kaputt, also graben wir mal UT99 aus. Nichts. UT2004? Nichts. $randomgame in wine? Nichts. WTH?

Genervt klicke ich mich durch meinen Game-Ordner und bleibe bei OpenTTD und ArmagetronAD hängen. Beide funktionieren fehlerfrei und dürfen nun den Feierabend versüßen. Die nächsten Tage blieb keine Zeit für Spiele.

Heute konnte ich mich dem Problem nochmal genauer annehmen und mein Kopf machte soeben Bekanntschaft mit der Tischkante. Wer aufgepasst hat wird feststellen: Nur binär vertriebene Spiele machten das Problem, Open-Source Games laufen. Kein Wunder, denn letztere werden – egal wie alt – passend zum System kompiliert. 64Bit. Die Binärspiele hingegen laufen – wie auch wine – im 32 Bit Modus und greifen entsprechend auf die Kompatibilitätslibraries zurück…die ich natürlich nicht aktualisiert hab. Also schnell die lib32-nvidia-340xx-libgl gegen die aktuelle lib32-nvidia-libgl getauscht und voilà: Auch die Binärblobs können auf wundersame Weise wieder 3D. Doh‘!

Powershell über Aufgabenplanung (oder Batch) starten

Bild: https://adlerweb.info/blog/wp-content/uploads/2015/03/logpurgetask-279×300.pngMit der Powershell hat Microsoft zwar keine angenehm zu verwendende, aber immerhin sehr mächtige Konsole geschaffen, welche es ermöglicht eine Vielzahl an Aufgaben unter Windows über Scripte zu steuern. Ein Wichtiger Punkt bei der Automatisierung ist natürlich auch das zeitgesteuerte Ausführen –  im Windows-Jargon „Aufgabenplanung“ bzw. früher „Geplanter Task“. Leider lassen sich Powershell-Scripte nicht direkt als Programm ausführen, daher muss man etwas tricksen: Als Programmname gibt man „C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe“ ein – ja, 1.0 ist korrekt, auch neuere Powershell-Versionen sind in diesem Ordner zu finden. Der Pfad zum eigentlichen Script wird als Argument „-File“ hinterlegt – Anführungszeichen bei Bedarf natürlich nicht vergessen. Schon können Scripte zeitgesteuert – oder durch einen der anderen möglichen Trigger – gestartet werden. Die „üblichen“ Fallstricke der Aufgabenplanung (Berechtigungen, lauf ohne Anmeldung, etc) sind natürlich wie immer zu beachten.

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -File "C:\Program Files (x86)\LogPurge\LogPurge.ps1"

SSL-Zertifikate mit SHA256 erstellen

Mit OpenSSL kann man sich schnell einen Zertifikatsantrag zusammenstellen – hat man mit diesem ein Zertifikat beantragt kann man so z.B. Webseiten per HTTPS ausliefern. Leider musste ich feststellen, dass auf einigen Systemen noch SHA1 für die Authentifizierung verwendet wird. Dies ist schon etwas länger auf der Abschlussliste, da sich Zweifel an der Sicherheit mehren. Besser ist es für diesen Message Authentication Code (MAC) einen neueren Hashfunktion wie z.B. den Nachfolger SHA-2 zu verwenden. Der Befehl zum Erstellen eines neuen Keys mit Request lautet:

openssl req -sha256 -new -newkey rsa:4096 -nodes -keyout yourdomain.key -out yourdomain.csr

Will man sein bestehendes Zertifikat ummodeln kann man auch

openssl req -new -sha256 -key your-private.key -out your-domain.csr

BitNotice #87 – LSA Revisited – Netzwerkdosen Anschließen

BitNotice #87 - LSA Revisited - Netzwerkdosen Anschließen

(124 MB) 00:05:02

2015-04-10 19:21 🛈

In meinem letzten LSA/Netzwerk-Tutorial hatte ich alles an einem Patchpanel gezeigt und lediglich erwähnt, dass Dosen fast identisch sind. Nun, ich habe eine Dose und eine Kamera, also schauen wir uns nochmal schnell an, wie man eine Netzwerkdose (mehr oder weniger) professionell installiert.

[powerpress]

Automatische Kicad BZR-Builds unter Gentoo

KiCad ist ein neuer, mächtiger Editor zum Entwurf von Schaltungen. Leider ist die letzte mehr-oder-weiniger-Stable, welche unter Gentoo im Portage-Tree verfügbar ist, von 2013 und lässt einige nette Funktionen vermissen. Wer mehr möchte greift üblicherweise direkt auf den Entwicklungszweig zurück, welcher in einem BZR-Repository bereitsteht. Für auf Debian und Redhat basierende Distributionen gibt es ein Installationsscript, welches sich um alle Voraussetzungen und den Build-Prozess kümmert. Für Gentoo stehen Ebuilds im Displacer-Overlay bereit. Da die Overlays bei mir nicht sauber funktionierten habe ich nebenbei™ das offizielle Script um die Gentoo-Deps erweitert. Nicht schön, aber macht das Leben leichter. Kompletter Code mit patchfile ist drüben bei gist verfügbar.

#!/bin/bash -e
# Install KiCad from source onto either:
#  -> a Ubuntu/Debian/Mint or
#  -> a Red Hat
#  -> a Gentoo
# compatible linux system.
#
# The "install_prerequisites" step is the only "distro dependent" one.  That step could be modified
# for other linux distros.
#
# There are 3 package groups in a KiCad install:
# 1) Compiled source code in the form of executable programs.
# 2) User manuals and other documentation typically as *.pdf files.
# 3) a) Schematic parts, b) layout footprints, and c) 3D models for footprints.
#
# To achieve 1) source is checked out from its repo and compiled by this script then executables
#  are installed using CMake.
# To achieve 2) documentation is checked out from its repo and installed using CMake.
# TO achieve 3a) and 3c) they are checked out from their repos and installed using CMake.
# To achieve 3b) a global fp-lib-table is put into your home directory which points to
#  http://github.com/KiCad.  No actual footprints are installed locally, internet access is used
#  during program operation to fetch footprints from github as if it was a remote drive in the cloud.
#  If you want to install those same KiCad footprints locally, you may run a separate script
#  named library-repos-install.sh found in this same directory.  That script requires that "git" be on
#  your system whereas this script does not.  The footprints require some means to download them and
#  bzr-git seems not up to the task.  wget or curl would also work.


# Since bash is invoked with -e by the first line of this script, all the steps in this script
# must succeed otherwise bash will abort at the first non-zero error code.  Therefore any script
# functions must be crafted to anticipate numerous conditions, such that no command fails unless it
# is a serious situation.


# Set where the 3 source trees will go, use a full path
WORKING_TREES=~/kicad_sources

STABLE=5054             # a sensible mix of features and stability
TESTING=last:1          # the most recent

# Set this to STABLE or TESTING or other known revision number:
REVISION=$TESTING

# For info on revision syntax:
# $ bzr help revisionspec


# CMake Options
OPTS="$OPTS -DBUILD_GITHUB_PLUGIN=ON"       # needed by $STABLE revision

# Python scripting, uncomment only one to enable:

# Basic python scripting: gives access to wizards like footprint wizards (recommended)
# be sure you have python 2.7 installed
#OPTS="$OPTS -DKICAD_SCRIPTING=ON"

# More advanced python scripting: gives access to wizards like footprint wizards and creates a python module
# to edit board files (.kicad_pcb files) outside kicad, by python scripts
#OPTS="$OPTS -DKICAD_SCRIPTING=ON -DKICAD_SCRIPTING_MODULES=ON"

# Most advanced python scripting: you can execute python scripts inside Pcbnew to edit the current loaded board
# mainly for advanced users
#OPTS="$OPTS -DKICAD_SCRIPTING=ON -DKICAD_SCRIPTING_MODULES=ON -DKICAD_SCRIPTING_WXPYTHON=ON"

# Use https under bazaar to retrieve repos because this does not require a
# launchpad.net account.  Whereas lp: requires a launchpad account.
# https results in read only access.
REPOS=https://code.launchpad.net

# This branch is a bzr/launchpad import of the Git repository
# at https://github.com/KiCad/kicad-library.git.
# It has schematic parts and 3D models in it.
LIBS_REPO=$REPOS/~kicad-product-committers/kicad/library

SRCS_REPO=$REPOS/~kicad-product-committers/kicad/product
DOCS_REPO=$REPOS/~kicad-developers/kicad/doc


usage()
{
    echo ""
    echo " usage:"
    echo ""
    echo "./kicad-install.sh "
    echo "    where  is one of:"
    echo "      --install-or-update     (does full installation or update.)"
    echo "      --remove-sources        (removes source trees for another attempt.)"
    echo "      --uninstall-libraries   (removes KiCad supplied libraries.)"
    echo "      --uninstall-kicad       (uninstalls all of KiCad but leaves source trees.)"
    echo ""
    echo "example:"
    echo '    $ ./kicad-install.sh --install-or-update'
}


install_prerequisites()
{
    # Find a package manager, PM
    PM=$( command -v yum || command -v apt-get || command -v emerge )

    # assume all these Debian, Mint, Ubuntu systems have same prerequisites
    if [ "$(expr match "$PM" '.*\(apt-get\)')" == "apt-get" ]; then
        #echo "debian compatible system"
        prerequisite_list="
            bzr
            bzrtools
            build-essential
            cmake
            cmake-curses-gui
            debhelper
            doxygen
            grep
            libbz2-dev
            libcairo2-dev
            libglew-dev
            libssl-dev
            libwxgtk3.0-dev
       "

        for p in ${prerequisite_list}
        do
            sudo apt-get install $p || exit 1
        done

        # Only install the scripting prerequisites if required.
        if [ "$(expr match "$OPTS" '.*\(-DKICAD_SCRIPTING=ON\)')" == "-DKICAD_SCRIPTING=ON" ]; then
        #echo "KICAD_SCRIPTING=ON"
            scripting_prerequisites="
                python-dev
                python-wxgtk3.0-dev
                swig
            "

            for sp in ${scripting_prerequisites}
            do
                sudo apt-get install $sp || exit 1
            done
        fi

    # assume all yum systems have same prerequisites
    elif [ "$(expr match "$PM" '.*\(yum\)')" == "yum" ]; then
        #echo "red hat compatible system"
        # Note: if you find this list not to be accurate, please submit a patch:
        sudo yum groupinstall "Development Tools" || exit 1

        prerequisite_list="
            bzr
            bzrtools
            bzip2-libs
            bzip2-devel
            cmake
            cmake-gui
            doxygen
            cairo-devel
            glew-devel
            grep
            openssl-devel
            wxGTK3-devel
        "

        for p in ${prerequisite_list}
        do
            sudo yum install $p || exit 1
        done

        echo "Checking wxGTK version. Maybe you have to symlink /usr/bin/wx-config-3.0 to /usr/bin/wx-config"
        V=`wx-config --version | cut -f 1 -d '.'` || echo "Error running wx-config."
        if [ $V -lt 3 ]
        then
            echo "Error: wx-config is reporting version prior to 3"
            exit
        else
            echo "All ok"
        fi
        # Only install the scripting prerequisites if required.
        if [ "$(expr match "$OPTS" '.*\(-DKICAD_SCRIPTING=ON\)')" == "-DKICAD_SCRIPTING=ON" ]; then
        #echo "KICAD_SCRIPTING=ON"
            scripting_prerequisites="
                swig
                wxPython
            "

            for sp in ${scripting_prerequisites}
            do
                sudo yum install $sp || exit 1
            done
        fi

    # assume all emerge systems have same prerequisites
    elif [ "$(expr match "$PM" '.*\(emerge\)')" == "emerge" ]; then
        #echo "gentoo compatible system"
        # Note: there is no check for correct USE yet
        # Note: if you find this list not to be accurate, please submit a patch:

        SUDO='sudo'
        V=`whoami` 
        if [ "$V" == "root" ]; then
            SUDO=''
        else
            echo "Not running as root, trying to use sudo."
            V=`sudo emerge --version` || exit 1
        fi

        prerequisite_list="
            sudo
            bzr
            bzip2
            cmake
            doxygen
            cairo
            glew
            grep
            openssl
            wxGTK:3.0
        "

        inst=""
        for p in ${prerequisite_list}
        do
            inst="$inst $p"
        done
        $SUDO emerge -nv $inst || exit 1

        echo "Checking wxGTK version."
        V=`wx-config --version | cut -f 1 -d '.'` || echo "Error running wx-config."
        if [ $V -lt 3 ]
        then
            echo "Error: wx-config is reporting version prior to 3. If version 3 was just installed you most likely need to run \"eselect wxwidgets set gtk2-unicode-3.0\""
            exit
        else
            echo "All ok"
        fi
        # Only install the scripting prerequisites if required.
        if [ "$(expr match "$OPTS" '.*\(-DKICAD_SCRIPTING=ON\)')" == "-DKICAD_SCRIPTING=ON" ]; then
        #echo "KICAD_SCRIPTING=ON"
            scripting_prerequisites="
                swig
                wxpython
            "

            for sp in ${scripting_prerequisites}
            do
                inst="$inst $p"
            done
            $SUDO emerge -nv $inst || exit 1
        fi
    else
        echo
        echo "Incompatible System. Neither 'yum', 'apt-get' nor 'emerge' found. Not possible to continue."
        echo
        exit 1
    fi

    # ensure bzr name and email are set.  No message since bzr prints an excellent diagnostic.
    bzr whoami || {
        echo "WARNING: You have not set bzr whoami, so I will set a dummy."
        export BZR_EMAIL="Kicad Build "
    }
}


rm_build_dir()
{
    local dir="$1"

    echo "removing directory $dir"

    if [ -e "$dir/install_manifest.txt" ]; then
        # this file is often created as root, so remove as root
        sudo rm "$dir/install_manifest.txt" 2> /dev/null
    fi

    if [ -d "$dir" ]; then
        rm -rf "$dir"
    fi
}


cmake_uninstall()
{
    # assume caller set the CWD, and is only telling us about it in $1
    local dir="$1"

    cwd=`pwd`
    if [ "$cwd" != "$dir" ]; then
        echo "missing dir $dir"
    elif [ ! -e install_manifest.txt  ]; then
        echo
        echo "Missing file $dir/install_manifest.txt."
    else
        echo "uninstalling from $dir"
        sudo make uninstall
        sudo rm install_manifest.txt
    fi
}


# Function set_env_var
# sets an environment variable globally.
set_env_var()
{
    local var=$1
    local val=$2

    if [ -d /etc/profile.d ]; then
        if [ ! -e /etc/profile.d/kicad.sh ] || ! grep "$var" /etc/profile.d/kicad.sh >> /dev/null; then
            echo
            echo "Adding environment variable $var to file /etc/profile.d/kicad.sh"
            echo "Please logout and back in after this script completes for environment"
            echo "variable to get set into environment."
            sudo sh -c "echo export $var=$val >> /etc/profile.d/kicad.sh"
        fi

    elif [ -e /etc/environment ]; then
        if ! grep "$var" /etc/environment >> /dev/null; then
            echo
            echo "Adding environment variable $var to file /etc/environment"
            echo "Please reboot after this script completes for environment variable to get set into environment."
            sudo sh -c "echo $var=$val >> /etc/environment"
        fi
    fi
}


install_or_update()
{
    echo "step 1) installing pre-requisites"
    install_prerequisites


    echo "step 2) make $WORKING_TREES if it does not exist"
    if [ ! -d "$WORKING_TREES" ]; then
        sudo mkdir -p "$WORKING_TREES"
        echo " mark $WORKING_TREES as owned by me"
        sudo chown -R `whoami` "$WORKING_TREES"
    fi
    cd $WORKING_TREES


    echo "step 3) checking out the source code from launchpad repo..."
    if [ ! -d "$WORKING_TREES/kicad.bzr" ]; then
        bzr checkout -r $REVISION $SRCS_REPO kicad.bzr
        echo " source repo to local working tree."
    else
        cd kicad.bzr
        bzr up -r $REVISION
        echo " local source working tree updated."
        cd ../
    fi

    echo "step 4) checking out the schematic parts and 3D library repo."
    if [ ! -d "$WORKING_TREES/kicad-lib.bzr" ]; then
        bzr checkout $LIBS_REPO kicad-lib.bzr
        echo ' kicad-lib checked out.'
    else
        cd kicad-lib.bzr
        bzr up
        echo ' kicad-lib repo updated.'
        cd ../
    fi

    echo "step 5) checking out the documentation from launchpad repo..."
    if [ ! -d "$WORKING_TREES/kicad-doc.bzr" ]; then
        bzr checkout $DOCS_REPO kicad-doc.bzr
        echo " docs checked out."
    else
        cd kicad-doc.bzr
        bzr up
        echo " docs working tree updated."
        cd ../
    fi


    echo "step 6) compiling source code..."
    cd kicad.bzr
    if [ ! -d "build" ]; then
        mkdir build && cd build
        cmake $OPTS ../ || exit 1
    else
        cd build
        # Although a "make clean" is sometimes needed, more often than not it slows down the update
        # more than it is worth.  Do it manually if you need to in this directory.
        # make clean
    fi
    make -j4 || exit 1
    echo " kicad compiled."


    echo "step 7) installing KiCad program files..."
    sudo make install
    echo " kicad program files installed."


    echo "step 8) installing libraries..."
    cd ../../kicad-lib.bzr
    rm_build_dir build
    mkdir build && cd build
    cmake ../
    sudo make install
    echo " kicad-lib.bzr installed."


    echo "step 9) as non-root, install global fp-lib-table if none already installed..."
    # install ~/fp-lib-table
    if [ ! -e ~/fp-lib-table ]; then
        make  install_github_fp-lib-table
        echo " global fp-lib-table installed."
    fi


    echo "step 10) installing documentation..."
    cd ../../kicad-doc.bzr
    rm_build_dir build
    mkdir build && cd build
    cmake ../
    sudo make install
    echo " kicad-doc.bzr installed."

    echo "step 11) check for environment variables..."
    if [ -z "${KIGITHUB}" ]; then
        set_env_var KIGITHUB https://github.com/KiCad
    fi

    echo
    echo 'All KiCad "--install-or-update" steps completed, you are up to date.'
    echo
}


if [ $# -eq 1 -a "$1" == "--remove-sources" ]; then
    echo "deleting $WORKING_TREES"
    rm_build_dir "$WORKING_TREES/kicad.bzr/build"
    rm_build_dir "$WORKING_TREES/kicad-lib.bzr/build"
    rm_build_dir "$WORKING_TREES/kicad-doc.bzr/build"
    rm -rf "$WORKING_TREES"
    exit
fi


if [ $# -eq 1 -a "$1" == "--install-or-update" ]; then
    install_or_update
    exit
fi


if [ $# -eq 1 -a "$1" == "--uninstall-libraries" ]; then
    cd "$WORKING_TREES/kicad-lib.bzr/build"
    cmake_uninstall "$WORKING_TREES/kicad-lib.bzr/build"
    exit
fi


if [ $# -eq 1 -a "$1" == "--uninstall-kicad" ]; then
    cd "$WORKING_TREES/kicad.bzr/build"
    cmake_uninstall "$WORKING_TREES/kicad.bzr/build"

    cd "$WORKING_TREES/kicad-lib.bzr/build"
    cmake_uninstall "$WORKING_TREES/kicad-lib.bzr/build"

    # this may fail since "uninstall" support is a recent feature of this repo:
    cd "$WORKING_TREES/kicad-doc.bzr/build"
    cmake_uninstall "$WORKING_TREES/kicad-doc.bzr/build"

    exit
fi


usage

BitBastelei #143 – SMC Managed Switch: 12V-Umbau

BitBastelei #143 - SMC Managed Switch: 12V-Umbau

(91 MB) 00:17:09

2015-04-05 10:00 🛈

Die Zentrale meines heimischen Netzwerks bildet ein managed-Switch der Firma SMC, welcher entsprechend 24/7 Daten umherschaufelt. Wäre doch praktisch diesen direkt vom 12V Solarsystem versorgen zu können, oder?

Unattended-Installation: Adobe DWG TrueView

Adobe DWG TrueView ist kostenfrei und erlaubt es diverse CAD-Formate zu lesen. Besonders interessant, wenn man als Projektbeteiligter Baupläne o.Ä. prüfen soll, jedoch nicht im Besitz der (nicht ganz günstigen) Vollversion ist. Ich selbst nutze eine Softwareverteilung und hatte entsprechend nicht vor per Hand herumzuklicken. Der befehl zur Installation ohne Benutzereingriff lautet:

"SetupDWGTrueView2016_ENU_64bit\Setup.exe" /w /t /l /qb setup.ini

Die Setup.exe erhält man in dem man den offiziellen Installer startet und den Beginn des Assistenten abwartet – nun sind die entpackten Dateien in c:\autodesk\ zu finden.

Mit dem Code oben erhält man einen Fortschrittsbalken – leider mit abbrechen-Funktion. Wer seinen Nutzern nucht traut die Finger vom „bösen Button“ zu lassen kann statt /qb nur /q verwenden, so erscheint weder Fortschritt noch Abbrechen auf dem Bildschirm und die Installation läuft komplett im Hintergrund ab.

Nutzer der Softwareverteilung OPSI finden ein passendes Script in der Wiki.

[Linux] Der Zufall und warum Cryptofunktionen manchmal ewig dauern

Wer schon einmal auf einem Embedded-System wie Router oder einer VM versucht hat einen geheimen Schlüssel unter Linux zu erzeugen wird das kennen: Es dauert ewig. Schuld daran ist nicht nur die meist spartanische Leistung des Prozessors, sondern auch die Art, mit welcher Linux seine Zufallsdaten erzeugt.

Wie Zufällig darf es denn sein?

Holen wir mal etwas aus: Viele Verschlüsselungen benötigen – beispielsweise zur Erstellung von Schlüsseln – Zufallswerte. Leider ist ein PC mit seinen An-Aus recht vorhersagbar und das genaue Gegenteil von Zufall. Um trotzdem verschlüsseln zu können kommen Pseudozufallsgeneratoren zum Einsatz. Diese verwenden meist schlecht vorhersagbare Quellen um eine hohe Qualität der Zufallszahlen zu erreichen – also eine Zahl, deren Herleitung man möglichst später nicht mehr nachvollziehen kann. Quelle kann Beispielsweise das Rauschen eines Gerätes, vergleichbar mit einem zu laut eingestellten Eingangs einer Soundkarte, sein.

Von vollen und von leeren Pools

Unter Linux kümmert sich der Kernel selbst um die Sammlung dieses Zufalls, diesen verwaltet er im Entropiepool. Üblicherweise werden maximal 4096 Bit vorgehalten, den aktuellen Füllstand kann man unter /proc/sys/kernel/random/entropy_avail einsehen. Um Zufallszahlen zu erhalten gibt es nun zwei Geräte mit den selben Aufgaben, aber wichtigen Unterschieden:

/dev/random stellt die Daten aus dem Pool zur Verfügung und dabei sicher, dass die Daten eine gewisse Qualität haben. Das bedeutet allerdings auch, dass – wenn die 4096bit aufgebraucht sind – das Lesen so lange pausiert wird, bis neue Zufallswerte vorliegen. Das ist Ideal für Verschlüsselungen und andere kritische Bereiche in denen sensible Daten behandelt werden sollen. Gleichzeitig heißt es auch, dass Systeme mit geringer Nutzung entsprechend lange zum Lesen benötigen. Häufig wird empfohlen für Fesplatten- oder Netzlast zu sorgen oder Maus und Tastatur intensiv zu nutzen um zusätzlichen Zufall zu generieren, ob dies tatsächlich auch für den Linux RNG hilft oder nur einen Placeboeffekt darstellt ist mir nicht bekannt.

/dev/urandom stellt die selben Daten bereit, blockiert allerdings nicht. Hierbei macht man sich eine Eigenheit eines Zufalls zu Nutze: Die Zufallswerte sind nicht wie ein Treibstoff, der durch Nutzung verbrannt wird, sondern eher das geschriebene Wort eines Füllers. Ist die Quelle des Zufalls langsam erschöpft, also die Tinte fast leer, sieht das Geschriebene nicht mehr schön aus, ist aber immer noch deutlich besser als Nichts. Je länger man jedoch mit leerer Patrone schreibt, desto schlechter wird das Ergenis. Aber zurück: Ist der Pool also leer werden die übrigen Daten nochmal in die Mangel genommen und neu gemischt um zumindest irgendwas zu haben. Ganz nach dem Motto: Egal wie, es kommt etwas raus. Die Qualität der herauspurzelnden Werte ist – wie oben schon angerissen – nicht garantiert, vor allem bei leerem Pool und wenig Aktivität steigt die Gefahr, dass die Werte nachvollziehbar werden. Für wichtige Crypto sollte man urandom entsprechend nicht benutzen, reicht aber „etwas Zufall“ aus – beispielsweise um Werte für ein Spiel oder das testen einer Festplatte zu erhalten – ist man hier richtig und kann viel Zeit sparen. Auch kann es als „letzter Ausweg“ genutzt werden, wenn Zeit wichtiger ist als Sicherheit – oder soll der Kunde des Onlineshops mehrere Minuten beim Laden warten, weil grade der Pool leer ist?

Programmdiktatur

Während man als Programmierer die Wahl zwischen den Qualitäten hat ist man als Nutzer meist den Entscheidungen des Programmierers ausgeliefert. Dies macht auch meist Sinn, beispielsweise wenn das Cryptoprotokoll auf dem blockierenden /dev/random beharrt. Arbeitet man jedoch beispielsweise auf einem Testsystem und muss hunderte Schlüssel erzeugen, die ohnehin nur unwichtige Testdaten verarbeiten, wäre ein umschalten auf /dev/urandom hilfreich. Sicher, man könnte den Symlink verbiegen, aber wirklich schön ist das nicht.

Mittelweg Füllhilfen

Eine Lösung kann ein zusätzlicher Zufallsgenerator sein, welcher als weitere Quelle die Füllung des Entropiepools beschleunigen kann. Eine Möglichkeit ist es – wenn vorhanden – die Hardware zu bemühen. Viele aktuelle Rechner haben einen Zusallsgenerator eingebaut, beispielsweise unterstützen Intel-CPUs mit DRNG entsprechende funktionen oder auch das vielfach verbaute TPM-Modul kann hierzu verwendet werden. Nutzer von QEmu können mit virtio_rng auch virtuelle Rechner versorgen. Nutzbar machen lässt sich dies über den rngd, welcher als Dienst gestartet die Vermittlung übernimmt und meist in einem Paket namens rng-tools o.Ä. zu finden ist. Die Gefahr, dass die Hardwareimplementierung eine Lücke hat besteht natürlich immer, denn diese Quellen sind meist fest verdrahtet und Lücken im Algorithmus können nicht „weggepatched“ werden. Auch liegen die Details der Implementierung häufig nicht offen, sodass die Qualität der Zahlen nicht prüfbar ist. Um hier zumindest ein grundsätzliches Fallnetz zu ziehen wird rngd in der Standardeinstellung nur anteilmäßig zur Generierung der Zahlen genutzt.

Steht keine Hardware zur Verfügung, beispielsweise in vielen VM-Umgebungen, ist es auch in Software möglich. Der bekannteste Vertreter ist hierbei haveged. Hierbei wird sich zu nutze gemacht, dass der Prozessor intern einige Operationen durchführt, welche nicht vorhersagbar erscheinen. Der Vorteil: Diese Quelle ist auf jedem Rechner verfügbar – vom normalen PC bis hin zum kleinsten Router. Problem: Nicht jeder Prozessor ist „gleich zufällig“, ob die Qualität also hoch ist lässt sich nur schwer bestimmen.

Pest oder Cholera?

Welchen Weg man wählt, dass muss man für sich selbst entscheiden. Lange Wartezeiten ergeben zwar meist eine höhere Sicherheit, aber in der heutigen Zeit zählen all zu oft andere Werte. Viele Nutzer sind nicht bereit ihen Komfort für Sicherheit zu opfern. Ein Hardware-RNG kann – wenn vorhanden und man der Quelle genug vertraut – eine große Hilfe sein. Auch Software ist als Ausweg eine Option. Am Ende lässt sich Zufall jedoch nie testen, die Qualität der einzelnene Lösungen ist also nur schwer zu bewerten. Am Ende ist es meist eine gute Idee mehrere Quellen zu nutzen und so den Zufall des Zufalls nicht ganz dem Zufall zu überlassen.

Nerd Inside