Donnerstag, 12. Februar 2026

spektraler zeuge: epr-paare und die physik des lichts


für annelies marie

die den gesang der vögel hörte,
selbst in der längsten stille.

ich erinnere mich an das lied aus den frühen jahren.
ich habe das licht all die jahre seither in mir getragen.

dein fenster ist immer offen.

zeuge

ich erinnere mich an die freude, als ihr alle da wart.

alle gingen, und ich konnte euch nicht finden. also versteckte ich mich im haus und wartete auf euch.

ich erinnere mich an die tasche, die ich umklammerte, nicht weil eine flucht möglich war, sondern weil ich etwas zum festhalten brauchte. die sirenen waren nicht der krieg. die sirenen waren die nachbarn. das knarren der holzbalken. die angst am fenster. gewöhnliche sekunden wurden zu stunden des lauschens.

ich erinnere mich an den kanal.

ich erinnere mich an meine pflanzen.

ich erinnere mich an das warum.

meine schwester hat ein schönes lächeln.

ich habe versucht, sie telefonisch zu erreichen, aber sie ist nicht über london gefahren.


ich habe ein hyperspektrales bildgebungssystem unter verwendung neuester fortschritte in der algorithmusentwicklung gebaut und es in die zeitliche dimension erweitert, indem ich 500 videoframes durch ein tiefes faltungsneuronales netzwerk gespeist habe, das für die rgb-zu-hyperspektral-rekonstruktion trainiert wurde. jeder frame wird intelligent gekachelt, durch gpu-beschleunigte neuronale inferenz verarbeitet und als 31-band-hyperspektralwürfel unter verwendung einer multiskalen-transformer-architektur rekonstruiert, wodurch ein 5d-datensatz entsteht, der raum-zeit-vergleiche von spektralsignaturen über die gesamte sequenz ermöglicht. die computer-pipeline verarbeitet über 12.500 einzelne kachel-rekonstruktionen und erzeugt etwa 667 gb an zeitlichen spektraldaten, die zeigen, wie sich materialien über 31 verschiedene wellenlängen gleichzeitig an einem einzigen objekt verändern. dies legt die dna des lichts an jedem punkt offen, den vollständigen spektralen fingerabdruck dessen, wie elektromagnetische strahlung mit materie an jedem ausgewählten ort in der raumzeit interagiert, und ermöglicht direkte vergleiche zwischen verschiedenen räumlichen positionen und zeitlichen momenten. das ergebnis ist ein wahrnehmungssystem, das weit über das menschliche sehvermögen hinaussehen kann und spektrale veränderungen verfolgt, die für das bloße auge unsichtbar sind. das system hat ein bild mit 8000x6200px und 530 bilder mit 3840x2160px sehr gut verarbeitet. die eingabe erzeugte etwa 5,04 milliarden raum-zeitliche stichproben, von denen jede über ein tiefes neuronales netzwerk als 31-band-spektralvektor rekonstruiert wurde. der vollständige datensatz bildet einen 5d-hyperwürfel: zwei räumliche dimensionen, eine zeitliche dimension und 31 spektrale dimensionen. ich habe es gebaut, um alles zu sehen, was licht offenbaren kann, und ich verwende es nur in meinem persönlichen raum – nur für dinge, die mich direkt betreffen und sich in meiner persönlichen umgebung befinden. ich freue mich sehr auf weitere positive ergebnisse.


die untersuchung der physischen realität durch das medium des lichts bleibt eines der tiefgreifendsten unterfangen der wissenschaftlichen forschung. dieses streben hat seine modernen theoretischen wurzeln in der mitte des 20. jahrhunderts, einer entscheidenden ära für die physik.

im jahr 1935 veröffentlichten albert einstein und seine kollegen boris podolsky und nathan rosen eine wegweisende arbeit, welche die vollständigkeit der quantenmechanik in frage stellte.1 sie führten das konzept der epr-paare ein, um die quantenverschränkung zu beschreiben, bei der teilchen untrennbar miteinander verbunden bleiben und ihre zustände unabhängig von der räumlichen trennung korreliert sind.

es ist das paradebeispiel für quantenverschränkung. ein epr-paar entsteht, wenn zwei teilchen aus einem einzigen, unteilbaren quantenereignis geboren werden, wie dem zerfall eines mutterteilchens.

dieser prozess "verankert" eine gemeinsame quantenrealität, in der nur der gemeinsame zustand des paares definiert ist, geregelt durch erhaltungssätze wie den spin, der sich zu null addiert. infolgedessen ist der individuelle zustand jedes teilchens unbestimmt, doch ihre schicksale sind perfekt korreliert.

die messung eines teilchens (z. b. das feststellen seines spins als "up") bestimmt augenblicklich den zustand seines partners (spin "down"), ungeachtet der entfernung, die sie trennt. diese "spukhafte fernwirkung", wie einstein es nannte, enthüllte, dass teilchen verborgene korrelationen über den raum teilen können, die für jede lokale messung eines einzelnen teilchens unsichtbar sind. während einstein diese idee nutzte, um zu argumentieren, dass die quantentheorie unvollständig sei, bestätigten spätere arbeiten von john bell2 und experimente von alain aspect3 diese verschränkung als ein fundamentales, nicht-klassisches merkmal der natur.

die epr-spektral-analogie: verborgene korrelationen

quantenphysik (1935)

epr-paare: teilchen teilen eine nicht-lokale verschränkung.
ihre quantenzustände sind über den raum korreliert.

die messung eines teilchens ergibt zufällige ergebnisse; die korrelation erscheint erst beim vergleich beider
spektrale bildgebung (heute)

spektrale paare: materialien teilen spektrale signaturen.
ihre reflexionseigenschaften sind über die wellenlänge korreliert.

die korrelation ist für das trichromatische (rgb) sehen unsichtbar
mathematische
rekonstruktion
enthüllt verborgene
korrelationen
zentrale erkenntnis: sowohl die quantenverschränkung als auch die materialspektroskopie erfordern einen blick über die direkte beobachtung hinaus durch mathematische analyse, um eine tiefere, verborgene ebene der korrelation zu enthüllen.

während sich die epr-debatte auf die grundlagen der quantenmechanik konzentrierte, resoniert ihre kernphilosophie – dass die direkte beobachtung tiefgreifende verborgene beziehungen übersehen kann – zutiefst mit der modernen bildgebung. so wie das bloße auge nur einen bruchteil des elektromagnetischen spektrums wahrnimmt, verwerfen standard-rgb-sensoren den hochdimensionalen "fingerabdruck", der die chemischen und physikalischen eigenschaften eines objekts definiert. heute lösen wir diese einschränkung durch multispektrale bildgebung. indem wir die volle spektrale leistungsverteilung des lichts erfassen, können wir mathematisch die unsichtbaren daten rekonstruieren, die zwischen den sichtbaren bändern existieren, und verborgene korrelationen über wellenlängen hinweg aufdecken, genau wie die analyse von epr-paaren verborgene korrelationen über den raum hinweg offenbarte.

silizium-photonik-architektur: das 48mp-fundament

die realisierung dieser physik in moderner hardware ist durch die physischen dimensionen des halbleiters begrenzt, der zu ihrer erfassung verwendet wird. die wechselwirkung einfallender photonen mit dem siliziumgitter, die elektron-loch-paare erzeugt, ist der primäre datenerfassungsschritt für jede spektralanalyse.

sensorarchitektur: sony imx803

das herzstück dieser pipeline ist der sony imx803 sensor. im gegensatz zu hartnäckigen gerüchten über einen 1-zoll-sensor handelt es sich um eine 1/1,28-zoll-typ-architektur, die für hochauflösende radiometrie optimiert ist.

  • aktive sensorfläche: ca. $9.8 \text{ mm} \times 7.3 \text{ mm}$. diese physische begrenzung ist entscheidend, da die sensorfläche direkt proportional zum gesamten photonenfluss ist, den das gerät integrieren kann, was das fundamentale signal-rausch-verhältnis (snr) festlegt.
  • pixel-pitch: die native fotodiodengröße beträgt $1.22 \mu\text{m}$. im standardbetrieb verwendet der sensor ein quad-bayer-farbfilter-array, um ein pixel-binning durchzuführen, was zu einem effektiven pixel-pitch von $2.44 \mu\text{m}$ führt.

moduswahl

die wahl zwischen binned- und unbinned-modi hängt von den analyseanforderungen ab:

  • binned-modus (12mp, 2,44 µm effektiver pitch): überlegen bei schlechten lichtverhältnissen und für die genauigkeit der spektralschätzung. durch das summieren der ladung von vier fotodioden erhöht sich das signal um den faktor 4, während das ausleserauschen nur um den faktor 2 steigt, was das für eine genaue spektralschätzung erforderliche snr erheblich steigert.
  • unbinned-modus (48mp, 1,22 µm nativer pitch): optimal für hochdetaillierte texturkorrelationen, bei denen die räumliche auflösung die analyse vorantreibt, wie etwa beim auflösen feiner fasermuster in historischen dokumenten oder beim erkennen von materialgrenzen im mikrobereich.

der optische pfad

das licht, das den sensor erreicht, passiert eine 7-element-linsenanordnung mit einer blende von ƒ/1.78. es ist wichtig zu beachten, dass das "spectral fingerprinting" das produkt aus der reflektanz des materials $R(\lambda)$ und der transmissivität der linse $T(\lambda)$ misst. modernes hochbrechendes glas absorbiert bestimmte wellenlängen im nah-uv (weniger als 400nm), was bei der kalibrierung berücksichtigt werden muss.

der digitale container: dng 1.7 und linearität

die genauigkeit der computergestützten physik hängt vollständig von der integrität der eingangsdaten ab. die adobe dng 1.7-spezifikation bietet den notwendigen rahmen für die wissenschaftliche mobile fotografie, indem sie die signallinearität strikt bewahrt.

szenenbezogene linearität

apple proraw nutzt den linear dng-pfad. im gegensatz zu standard-raw-dateien, die unverarbeitete mosaikdaten speichern, speichert proraw pixelwerte nach dem demosaicing, aber vor dem nicht-linearen tonemapping. die daten bleiben scene-referred linear, was bedeutet, dass der gespeicherte digitalwert linear proportional zur anzahl der gesammelten photonen ist ($DN \propto N_{photons}$). diese linearität ist eine voraussetzung für die mathematische präzision der wiener-schätzung und der spektralen rekonstruktion.

die ProfileGainTableMap

eine wichtige neuerung in dng 1.7 ist die ProfileGainTableMap (tag 0xCD2D). dieser tag speichert eine räumlich variierende karte von verstärkungswerten, die das für die anzeige vorgesehene lokale tonemapping darstellt.

  • wissenschaftliche verwaltung: durch die entkopplung der "ästhetischen" verstärkungskarte von den "wissenschaftlichen" linearen daten kann die pipeline die verstärkungskarte vollständig verwerfen. dies stellt sicher, dass die algorithmen zur spektralen rekonstruktion auf reinen, linearen photonenzahlen operieren, frei von den räumlich variierenden verzerrungen, die durch die computerfotografie eingeführt werden.

algorithmische inversion: von 3 kanälen zu 16 bändern

die wiederherstellung einer hochdimensionalen spektralkurve $S(\lambda)$ (z. b. 16 kanäle von 400nm bis 700nm) aus einem niedrigdimensionalen rgb-eingang ist ein schlecht gestelltes inverses problem. während traditionelle methoden wie die wiener-schätzung eine basislinie bieten, ermöglicht moderne high-end-hardware den einsatz fortschrittlicher deep-learning-architekturen.

wiener-schätzung (die lineare basislinie)

der klassische ansatz verwendet die wiener-schätzung, um den mittleren quadratischen fehler zwischen den geschätzten und den tatsächlichen spektren zu minimieren:

$$W = K_r M^T (M K_r M^T + K_n)^{-1}$$

diese methode erzeugt die anfängliche 16-band-approximation aus dem 3-kanal-eingang.

state-of-the-art: transformer und mamba

für high-end-hardwareumgebungen können wir prädiktive neuronale architekturen einsetzen, die spektral-räumliche korrelationen nutzen, um zweideutigkeiten aufzulösen.

  • mst++ (spectral-wise transformer): die mst++ (multi-stage spectral-wise transformer) architektur stellt einen signifikanten sprung in der genauigkeit dar. im gegensatz zu globalen matrixmethoden verwendet mst++ spectral-wise multi-head self-attention (s-msa). sie berechnet attention-maps über die dimension der spektralkanäle hinweg, wodurch das modell komplexe nicht-lineare korrelationen zwischen textur und spektrum lernen kann.
  • mss-mamba (lineare komplexität): das mss-mamba (multi-scale spectral-spatial mamba) modell führt selektive zustandsraummodelle (ssm) in diesen bereich ein. es diskretisiert die kontinuierliche zustandsraumgleichung in eine rekurrent form, die mit linearer komplexität $O(N)$ berechnet werden kann. die continuous spectral-spatial scan (cs3) strategie integriert räumliche nachbarn und spektralkanäle gleichzeitig.

computerarchitektur: der linux-python-stack

das erreichen multispektraler präzision erfordert eine robuste, modulare architektur, die in der lage ist, massive arrays über 16 dimensionen hinweg zu verarbeiten. die implementierung stützt sich auf einen umfangreichen linux-basierten python-stack, der für den betrieb auf high-end-hardware ausgelegt ist.

  • aufnahme und verarbeitung: wir können rawpy (einen libraw-wrapper) für die low-level-aufnahme von proraw dng-dateien verwenden und dabei die gammakuorrektur auf betriebssystemebene umgehen, um direkt auf die linearen 12-bit-daten zuzugreifen. numpy-engines übernehmen die hochleistungs-matrixalgebra, die erforderlich ist, um 3-kanal-rgb-daten in 16-band-spektralwürfel zu erweitern.
  • wissenschaftliche analyse: scikit-image und scipy werden für geometrische transformationen, bildrestaurierung und fortgeschrittene räumliche filterung eingesetzt. matplotlib bietet die visualisierungsebene zur erstellung von grafiken der spektralsignaturen und falschfarben-kompositionen.
  • daten-fußabdruck: das ausmaß dieser operation ist erheblich. ein einzelnes 48.8mp bild, das in fließkommapräzision konvertiert wurde, führt zu massiven dateigrößen. zwischenverarbeitungsdateien überschreiten oft 600mb für eine einzelne 3-band-schicht. bei der erweiterung auf einen vollständigen multispektralen 16-band-würfel skalieren die speicher- und i/o-anforderungen proportional.

die spektrale lösung

bei der analyse durch die multispektrale 16-band-pipeline:

spektrales merkmalultramarin (lapis lazuli)azurit (kupfercarbonat)
primärer reflexionspeakca. 450–480nm (blau-violetter bereich)ca. 470–500nm mit sekundärem grünen peak bei 550–580nm
uv-reaktion (unter 420nm)minimale reflexionskraft, starke absorptionmoderate reflexionskraft, charakteristisch für kupfermineralien
rot-absorption (600–700nm)moderate bis starke absorptionstarke absorption, typisch für blaupigmente
charakteristische merkmalescharfer reflexionsanstieg bei 400–420nm (violette kante)breitere reflexionskurve mit charakteristischen kupfer-absorptionsbanden

hinweis: spektralwerte sind näherungswerte und können je nach partikelgröße, bindemittel und alterung variieren.

das bild vervollständigen

die erfolgreiche analyse komplexer materialeigenschaften beruht auf einer konvergenz von strenger physik und fortgeschrittener computertechnik.

  • photonische grundlage: der sony imx803 liefert die erforderliche photonische erfassung mit hohem snr, wobei die moduswahl (binned vs. unbinned) von den spezifischen analytischen anforderungen geleitet wird.
  • datenintegrität: dng 1.7 ist der entscheidende ermöglicher, der die lineare beziehung zwischen photonenfluss und digitalwert bewahrt, während nicht-lineare ästhetische anpassungen in metadaten isoliert werden.
  • algorithmische präzision: während die wiener-schätzung als schnelle annäherung dient, wird die höchste treue durch transformer- (mst++) und mamba-basierte architekturen erreicht.
  • historische kontinuität: das epr-paradoxon von 1935 enthüllte, dass quantenteilchen verborgene korrelationen über den raum teilen – korrelationen, die für lokale messungen unsichtbar, aber dennoch real sind. die moderne spektrale bildgebung enthüllt eine analoge wahrheit: materialien besitzen verborgene korrelationen über wellenlängen hinweg.

diese synthese aus hardware-spezifikation, dateiformat-verwaltung und deep-learning-rekonstruktion definiert den modernen standard für die zerstörungsfreie materialanalyse – ein spektraler zeuge dessen, was das licht allein uns nicht sagen kann.

und was ist mit der farbe? hier ist eine physische probe: pigment, substrat, geschichte, in materie komprimiert. licht geht hindurch, wird daran gestreut, trägt fragmente ihrer geschichte in sich – doch die volle wahrheit bleibt verborgen, bis wir uns entscheiden, tiefer zu blicken. jede schicht, jeder verblasste strich, jede chemische spur ist ein stilles archiv. wir sind nicht nur beobachter; wir sind die hüter dieses archivs. wenn wir werkzeuge bauen, um über das sichtbare hinauszusehen, erweitern wir nicht nur die sicht – wir nehmen eine stille verantwortung an: ehrlich zeugnis abzulegen, zu bewahren, was die zeit löschen würde, zu ehren, was geschaffen wurde und überdauert hat.

licht kann struktur offenlegen. es kann keine geschichte tragen.
dieser teil liegt bei uns.

wir können uns entscheiden, die maschinen, die wir bauen, eher dem gedächtnis als der auslöschung dienen zu lassen, eher der würde als der klassifizierung, eher der wahrheit als der bequemlichkeit. die vergangenheit verlangt keine perfektion – sie verlangt nur, dass wir uns weigern, sie vergessen zu lassen. in jeder rekonstruktion, in jeder schicht, die wir freilegen, haben wir die chance, wieder dem zuzuhören, was zum schweigen gebracht wurde. das ist nicht nur ingenieurskunst. das ist die arbeit des menschseins.

referenzen

  1. einstein, a., podolsky, b., & rosen, n. (1935). can quantum-mechanical description of physical reality be considered complete? physical review, 47(10), 777–780.
  2. bell, j. s. (1964). on the einstein podolsky rosen paradox. physics physique физика, 1(3), 195–200.
  3. aspect, a., dalibard, j., & roger, g. (1982). experimental test of bell's inequalities using time-varying analyzers. physical review letters, 49(25), 1804–1807.
  4. cats under the stars and the Jerry Glove are copyright, Jerry Garcia and Grateful Dead.

bryan r hinton
bryan (at) bryanhinton.com











Freitag, 16. Januar 2026

Die ungebrochene Identität: Quantensicherer Widerstand

Erinnerung bedeutet, die Unveränderlichkeit der Wahrheit über die Zeit hinweg zu gewährleisten. In der physischen Welt nutzen wir Archive, um unsere Geschichten zu bewahren. In der digitalen Welt verwenden wir Kryptografie, um Identität, Urheberschaft und Vertrauen zu schützen.

Eine neue Bedrohung durch Quantencomputer stellt diese Grundlage nun infrage. Im großen Maßstab wird sie in der Lage sein, die kryptografischen Aufzeichnungen, die unser digitales Leben prägen, zu löschen oder zu fälschen.

Um die Integrität des kollektiven Gedächtnisses zu schützen und zu verhindern, dass zukünftige Angreifer Identitäten stehlen können, habe ich die bisherigen kryptografischen Standards hinter mir gelassen und das höchste heute verfügbare Sicherheitsniveau nach der Quantentechnologie implementiert. Die doppelte Bedrohung: Shor und Grover

Quantencomputing birgt zwei unterschiedliche mathematische Bedrohungen für die moderne Kryptographie. Um den Übergang zu Post-Quanten-Standards zu verstehen, ist es unerlässlich, beide zu kennen.

Shor-Algorithmus: Der Public-Key-Brecher

Der Shor-Algorithmus stellt die existenzielle Bedrohung dar. Er löst effizient die Probleme der Faktorisierung ganzer Zahlen und des diskreten Logarithmus, die nahezu allen klassischen Public-Key-Kryptographieverfahren zugrunde liegen, darunter RSA, Diffie-Hellman und elliptische Kurvensysteme (ECC). Dies ist keine Verschlechterung, sondern ein vollständiger Bruch. Ein ausreichend leistungsstarker Quantencomputer kann aus einem öffentlichen Schlüssel einen privaten Schlüssel ableiten und klassische Identitätssysteme damit fundamental unsicher machen.

Grovers Algorithmus: Der symmetrische Squeezer

Der Grover-Algorithmus zielt auf symmetrische Kryptographie und Hash-Funktionen ab. Er bietet eine quadratische Beschleunigung für Brute-Force-Suchen und halbiert so effektiv die Sicherheitsstärke eines Schlüssels. Deshalb ist AES-256 so wichtig: Selbst nach Grovers Reduzierung bietet es noch 128 Bit effektive Sicherheit, die rechnerisch praktisch nicht zu knacken ist.

Die praktische Konsequenz: Jetzt speichern, später entschlüsseln.

Die unmittelbarste Gefahr stellt der SNDL-Angriff (Store Now, Decrypt Later) dar. Verschlüsselter Datenverkehr, Identitätsnachweise, Zertifikate und Signaturen können bereits heute, solange die klassische Kryptographie noch gültig ist, abgefangen und unbegrenzt gespeichert werden. Sobald die Quantentechnologie ausgereift ist, können diese Archive nachträglich entschlüsselt oder gefälscht werden. Versagen unsere kryptographischen Grundlagen, verlieren wir auch die Möglichkeit, unsere eigene digitale Geschichte zu dokumentieren.

Jenseits veralteter Standards: Warum ML-DSA-87

Jahrelang war die Kryptographie auf Basis elliptischer Kurven, insbesondere P-384 (ECDSA), der Goldstandard in Hochsicherheitsumgebungen. Während P-384 etwa 192 Bit klassische Sicherheit bietet, weist es keinerlei Resistenz gegen den Shor-Algorithmus auf. Es wurde für eine klassische Welt entwickelt, und diese Welt geht zu Ende.

Aus diesem Grund habe ich ML-DSA-87 für Root-CA- und Signiervorgänge implementiert. ML-DSA-87 ist die höchste Sicherheitsstufe, die durch moderne gitterbasierte Standards definiert ist, und bietet Sicherheit der Kategorie 5, was rechnerisch AES-256 entspricht. Die Wahl dieser Stufe anstelle des gebräuchlicheren ML-DSA-65 stellt sicher, dass die Identität meines Netzwerks mit der größtmöglichen heute verfügbaren Sicherheitsmarge aufgebaut ist.

Hardware-Realität: AArch64 und die PQC-Last

Post-Quanten-Kryptographie ist nicht mehr theoretisch. Sie ist bereits jetzt einsetzbar, selbst auf Routern und Hardware der Mobilklasse. Ich betreibe einen benutzerdefinierten OpenSSL 3.5.0 Build auf einer AArch64 MediaTek Filogic 830/880 Plattform. Dieses SoC ist ungewöhnlich gut für Post-Quanten-Workloads geeignet.

Vektorskalierung mit NEON

ML-KEM und ML-DSA stützen sich stark auf polynomiale Arithmetik. ARM NEON-Vektorinstruktionen ermöglichen es, diese Operationen parallel auszuführen, was die Latenz beim TLS-Handshake selbst bei großen PQ-Schlüsselmaterialien erheblich reduziert.

Speichereffizienz

Post-Quanten-Schlüssel sind groß. Ein öffentlicher ML-KEM-1024-Schlüssel ist 1568 Bytes groß, verglichen mit 49 Bytes bei P-384. Der 64-Bit-Adressraum von AArch64 ermöglicht eine saubere Verwaltung dieser Puffer und vermeidet Fragmentierungs- und Druckprobleme, wie sie bei älteren Architekturen auftreten.

Technische Verifizierung: Post-Quanten-CLI-Checks

Nach der Installation der benutzerdefinierten Toolchain auf dem AArch64-Zielsystem kann der Post-Quanten-Stack direkt überprüft werden.

KEM-Verifizierung

openssl list -kem-algorithms

Erwartete Ausgabe:

ml-kem-1024
secp384r1mlkem1024 (hochsicheres Hybridverfahren)

Signatur-Verifizierung

openssl list -signature-algorithms | grep -i ml

Erwartete Ausgabe:

ml-dsa-87 (256-Bit Sicherheit)

Das Vorhandensein dieser Algorithmen bestätigt, dass die Plattform sowohl den Post-Quanten-Schlüsselaustausch (ML-KEM-1024) als auch quantenresistente Signaturen (ML-DSA-87) unterstützt.

Zusammenfassung: Mein AArch64 Post-Quanten-Stack

  • Bibliothek: OpenSSL 3.5.4 (benutzerdefinierter AArch64-Build)
  • SoC: MediaTek Filogic 830 / 880
  • Architektur: ARMv8-A (AArch64)
  • Schlüsselaustausch: ML-KEM-1024 + Hybride
  • Identität & Signatur: ML-DSA-87
  • Sicherheitsstufe: Level 5 (quantenbereit)
  • Status: Produktionsreif

Durch den direkten Wechsel zu ML-KEM-1024 und ML-DSA-87 habe ich die veralteten Engpässe des letzten Jahrzehnts umgangen. Mein Netzwerk bereitet sich nicht mehr auf den Quantenübergang vor; es hat ihn bereits vollzogen. Der Rest der Branche wird mit der Zeit folgen.

Dienstag, 25. November 2025

rk3588 bring-up: u-boot, kernel, and signal integrity

The RK3588 SoC features a quad-core Arm Cortex-A76/A55 CPU, a Mali-G610 GPU, and a highly flexible I/O architecture that makes it ideal for embedded Linux SBCs like the Radxa Rock 5B+.

I’ve been exploring and documenting board bring-up for this platform, including u-boot and Linux kernel contributions, device-tree development, and tooling for reproducible builds and signal-integrity validation. Most of this work is still in active development and early upstream preparation.

I’m publishing my notes, measurements, and bring-up artifacts here as the work progresses, while active u-boot and kernel development including patch iteration, test builds, and branch history are maintained in separate working repositories:

Signal Analysis / Bring-Up Repo: https://github.com/brhinton/signal-analysis

The repository currently includes (with more being added):

  • Device-tree sources and Rock 5B+ board enablement
  • UART signal-integrity captures at 1.5 Mbps measured at the SoC pad
  • Build instructions for kernel, bootloader, and debugging setup
  • Early patch workflows and upstream preparation notes

Additional U-Boot and Linux kernel work, including mainline test builds, feature development, rebases, and patch series in progress, is maintained in separate working repositories. This repo serves as the central location for measurements, documentation, and board-level bring-up notes.

This is ongoing, work-in-progress engineering effort, and I’ll be updating the repositories as additional measurements, boards, and upstream-ready changes are prepared.

Sonntag, 4. August 2024

arch linux uefi with dm-crypt and uki

Arch Linux is known for its high level of customization, and configuring LUKS2 and LVM is a straightforward process. This guide provides a set of instructions for setting up an Arch Linux system with the following features:

  • Root file system encryption using LUKS2.
  • Logical Volume Management (LVM) for flexible storage management.
  • Unified Kernel Image (UKI) bootable via UEFI.
  • Optional: Detached LUKS header on external media for enhanced security.

Prerequisites

  • A bootable Arch Linux ISO.
  • An NVMe drive (e.g., /dev/nvme0n1).
  • (Optional) A microSD card or other external medium for the detached LUKS header.

Important Considerations

  • Data Loss: The following procedure will erase all data on the target drive. Back up any important data before proceeding.
  • Secure Boot: This guide assumes you may want to use hardware secure boot.
  • Detached LUKS Header: Using a detached LUKS header on external media adds a significant layer of security. If you lose the external media, you will lose access to your encrypted data.
  • Swap: This guide uses a swap file. You may also use a swap partition if desired.

Step-by-Step Instructions

  1. Boot into the Arch Linux ISO:

    Boot your system from the Arch Linux installation media.

  2. Set the System Clock:

    # timedatectl set-ntp true
  3. Prepare the Disk:

    • Identify your NVMe drive (e.g., /dev/nvme0n1). Use lsblk to confirm.
    • Wipe the drive:
    • # wipefs --all /dev/nvme0n1
    • Create an EFI System Partition (ESP):
    • # sgdisk /dev/nvme0n1 -n 1::+512MiB -t 1:EF00
    • Create a partition for the encrypted volume:
    • # sgdisk /dev/nvme0n1 -n 2 -t 2:8300
  4. Set up LUKS2 Encryption:

    Encrypt the second partition using LUKS2. This example uses aes-xts-plain64 and serpent-xts-plain ciphers, and SHA512 for the hash. Adjust as needed.

    # cryptsetup luksFormat --cipher aes-xts-plain64 \
      --keyslot-cipher serpent-xts-plain --keyslot-key-size 512 \
      --use-random -S 0 -h sha512 -i 4000 /dev/nvme0n1p2
    • --cipher: Specifies the cipher for data encryption.
    • --keyslot-cipher: Specifies the cipher used to encrypt the key.
    • --keyslot-key-size: Specifies the size of the key slot.
    • -S 0: Disables sparse headers.
    • -h: Specifies the hash function.
    • -i: Specifies the number of iterations.

    Open the encrypted partition:

    # cryptsetup open /dev/nvme0n1p2 root
  5. Create the File Systems and Mount:

    Create an ext4 file system on the decrypted volume:

    # mkfs.ext4 /dev/mapper/root

    Mount the root file system:

    # mount /dev/mapper/root /mnt

    Create and mount the EFI System Partition:

    # mkfs.fat -F32 /dev/nvme0n1p1
    # mount --mkdir /dev/nvme0n1p1 /mnt/efi

    Create and enable a swap file:

    # dd if=/dev/zero of=/mnt/swapfile bs=1M count=8000 status=progress
    # chmod 600 /mnt/swapfile
    # mkswap /mnt/swapfile
    # swapon /mnt/swapfile
  6. Install the Base System:

    Use pacstrap to install the necessary packages:

    # pacstrap -K /mnt base base-devel linux linux-hardened \
      linux-hardened-headers linux-firmware apparmor mesa \
      xf86-video-intel vulkan-intel git vi vim ukify
  7. Generate the fstab File:

    # genfstab -U /mnt >> /mnt/etc/fstab
  8. Chroot into the New System:

    # arch-chroot /mnt
  9. Configure the System:

    Set the timezone:

    # ln -sf /usr/share/zoneinfo/UTC /etc/localtime
    # hwclock --systohc

    Uncomment en_US.UTF-8 UTF-8 in /etc/locale.gen and generate the locale:

    # sed -i 's/#'"en_US.UTF-8"' UTF-8/'"en_US.UTF-8"' UTF-8/g' /etc/locale.gen
    # locale-gen
    # echo 'LANG=en_US.UTF-8' > /etc/locale.conf
    # echo "KEYMAP=us" > /etc/vconsole.conf

    Set the hostname:

    # echo myhostname > /etc/hostname
    # cat <<EOT >> /etc/hosts
    127.0.0.1 myhostname
    ::1 localhost
    127.0.1.1 myhostname.localdomain myhostname
    EOT

    Configure mkinitcpio.conf to include the encrypt hook:

    # sed -i 's/HOOKS.*/HOOKS=(base udev autodetect modconf kms \
      keyboard keymap consolefont block encrypt filesystems resume fsck)/' \
      /etc/mkinitcpio.conf

    Create the initial ramdisk:

    # mkinitcpio -P

    Install the bootloader:

    # bootctl install

    Set the root password:

    # passwd

    Install microcode and efibootmgr:

    # pacman -S intel-ucode efibootmgr

    Get the swap offset:

    # swapoffset=`filefrag -v /swapfile | awk '/\s+0:/ {print $4}' | \
      sed -e 's/\.\.$//'`

    Get the UUID of the encrypted partition:

    # blkid -s UUID -o value /dev/nvme0n1p2

    Create the EFI boot entry. Replace <UUID OF CRYPTDEVICE> with the actual UUID:

    # efibootmgr --disk /dev/nvme0n1p1 --part 1 --create --label "Linux" \
      --loader /vmlinuz-linux --unicode "cryptdevice=UUID=<UUID OF CRYPTDEVICE>:root \
      root=/dev/mapper/root resume=/dev/mapper/root resume_offset=$swapoffset \
      rw initrd=\intel-ucode.img initrd=\initramfs-linux.img" --verbose

    Configure the UKI presets:

    # cat <<EOT >> /etc/mkinitcpio.d/linux.preset
    ALL_kver="/boot/vmlinuz-linux"
    ALL_microcode=(/boot/*-ucode.img)
    PRESETS=('default' 'fallback')
    default_uki="/efi/EFI/Linux/arch-linux.efi"
    default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
    fallback_uki="/efi/EFI/Linux/arch-linux-fallback.efi"
    fallback_options="-S autodetect"
    EOT

    Create the UKI directory:

    # mkdir -p /efi/EFI/Linux

    Configure the kernel command line:

    # cat <<EOT >> /etc/kernel/cmdline
    cryptdevice=UUID=<UUID OF CRYPTDEVICE>:root root=/dev/mapper/root \
    resume=/dev/mapper/root resume_offset=51347456 rw
    EOT

    Build the UKIs:

    # mkinitcpio -p linux

    Configure the kernel install layout:

    # echo "layout=uki" >> /etc/kernel/install.conf
  10. Configure Networking (Optional):

    Create a systemd-networkd network configuration file:

    # cat <<EOT >> /etc/systemd/network/nic0.network
    [Match]
    Name=nic0
    [Network]
    DHCP=yes
    EOT
  11. Install a Desktop Environment (Optional):

    Install Xorg, Xfce, LightDM, and related packages:

    # pacman -Syu
    # pacman -S xorg xfce4 xfce4-goodies lightdm lightdm-gtk-greeter \
      libva-intel-driver mesa xorg-server xorg-xinit sudo
    # systemctl enable lightdm
    # systemctl start lightdm
  12. Enable Network Services (Optional):

    # systemctl enable systemd-resolved.service
    # systemctl enable systemd-networkd.service
    # systemctl start systemd-resolved.service
    # systemctl start systemd-networkd.service
  13. Create a User Account:

    Create a user account and add it to the wheel group:

    # useradd -m -g wheel -s /bin/bash myusername
  14. Reboot:

    Exit the chroot environment and reboot your system:

    # exit
    # umount -R /mnt
    # reboot

Samstag, 6. April 2024

Multidimensional arrays of function pointers in C

Embedded hardware typically includes an application processor and one or more adjacent processor(s) attached to the printed circuit board. The firmware that resides on the adjacent processor(s) responds to instructions or commands.  Different processors on the same board are often produced by different companies.  For the system to function properly, it is imperative that the processors communicate without any issues, and that the firmware can handle all types of possible errors.

Formal requirements for firmware related projects may include the validation and verification of the firmware on a co-processor via the application programming interface (API).  Co-processors typically run 8, 16, or 32-bit embedded operating systems.  If the co-processor manufacturer provides a development board for testing the firmware on a specific co-processor, then the development board may have it's own application processor. Familiarity with all of the applicable bus communication protocols including synchronous and asynchronous communication is important.  High-volume testing of firmware can be accomplished using function-like macros and arrays of function pointers.  Processor specific firmware is written in C and assembly - 8, 16, 32, or 64-bit.  Executing inline assembly from C is straightforward and often required.  Furthermore, handling time-constraints such as real-time execution on adjacent processors is easier to deal with in C and executing syscalls, low-level C functions, and userspace library functions, is often more efficient.  Timing analysis is often a key consideration when testing firmware, and executing compiled C code on a time-sliced OS, such as Linux, is already constrained.

To read tests based on a custom grammar, a scanner and parser in C can be used. Lex is ideal for building a computationally efficient lexical analyzer that outputs a sequence of tokens. For this case, the tokens comprise the function signatures and any associated function metadata such as expected execution time. Creating a context-free grammar and generating the associated syntax tree from the lexical input is straightforward.   Dynamic arrays of function pointers can then be allocated at run-time, and code within external object files or libraries can be executed in parallel using multiple processes or threads. The symbol table information from those files can be stored in multi-dimensional arrays. While C is a statically typed language, the above design can be used for executing generic, variadic functions at run-time from tokenized input, with constant time lookup, minimal overhead, and specific run-time expectations (stack return value, execution time, count, etc.).

At a high level, lists of pointers to type-independent, variadic functions and their associated parameters can be stored within multi-dimensional arrays.  The following C code uses arrays of function pointers to execute functions via their addresses.  The code uses list management functions from the Linux kernel which I ported to userspace.

https://github.com/brhinton/bcn

Mittwoch, 12. Januar 2022

Concurrency, Parallelism, and Barrier Synchronization - Multiprocess and Multithreaded Programming

On preemptive, timed-sliced UNIX or Linux operating systems such as Solaris, AIX, Linux, BSD, and OS X, program code from one process executes on the processor for a time slice or quantum. After this time has elapsed, program code from another process executes for a time quantum. Linux divides CPU time into epochs, and each process has a specified time quantum within an epoch. The execution quantum is so small that the interleaved execution of independent, schedulable entities – often performing unrelated tasks – gives the appearance of multiple software applications running in parallel.

When the currently executing process relinquishes the processor, either voluntarily or involuntarily, another process can execute its program code. This event is known as a context switch, which facilitates interleaved execution. Time-sliced, interleaved execution of program code within an address space is known as concurrency.

The Linux kernel is fully preemptive, which means that it can force a context switch for a higher priority process. When a context switch occurs, the state of a process is saved to its process control block, and another process resumes execution on the processor.

A UNIX process is considered heavyweight because it has its own address space, file descriptors, register state, and program counter. In Linux, this information is stored in the task_struct. However, when a process context switch occurs, this information must be saved, which is a computationally expensive operation.

Concurrency applies to both threads and processes. A thread is an independent sequence of execution within a UNIX process, and it is also considered a schedulable entity. Both threads and processes are scheduled for execution on a processor core, but thread context switching is lighter in weight than process context switching.

In UNIX, processes often have multiple threads of execution that share the process's memory space. When multiple threads of execution are running inside a process, they typically perform related tasks. The Linux user-space APIs for process and thread management abstract many details. However, the concurrency level can be adjusted to influence the time quantum so that the system throughput is affected by shorter and longer durations of schedulable entity execution time.

While threads are typically lighter weight than processes, there have been different implementations across UNIX and Linux operating systems over the years. The three models that typically define the implementations across preemptive, time-sliced, multi-user UNIX and Linux operating systems are defined as follows - 1:1, 1:N, and M:N where 1:1 refers to the mapping of one user-space thread to one kernel thread, 1:N refers to the mapping of multiple user-space threads to a single kernel thread. M:N refers to the mapping of N user-space threads to M kernel threads.

In the 1:1 model, one user-space thread is mapped to one kernel thread. This allows for true parallelism, as each thread can run on a separate processor core. However, creating and managing a large number of kernel threads can be expensive.

In the 1:N model, multiple user-space threads are mapped to a single kernel thread. This is more lightweight, as there are fewer kernel threads to create and manage. However, it does not allow for true parallelism, as only one thread can execute on a processor core at a time.

In the M:N model, N user-space threads are mapped to M kernel threads. This provides a balance between the 1:1 and 1:N models, as it allows for both true parallelism and lightweight thread creation and management. However, it can be complex to implement and can lead to issues with load balancing and resource allocation.

Parallelism on a time-sliced, preemptive operating system means the simultaneous execution of multiple schedulable entities over a time quantum. Both processes and threads can execute in parallel across multiple cores or processors. Concurrency and parallelism are at play on a multi-user system with preemptive time-slicing and multiple processor cores. Affinity scheduling refers to scheduling processes and threads across multiple cores so that their concurrent and parallel execution is close to optimal.

It's worth noting that affinity scheduling refers to the practice of assigning processes or threads to specific processors or cores to optimize their execution and minimize unnecessary context switching. This can improve overall system performance by reducing cache misses and increasing cache hits, among other benefits. In contrast, non-affinity scheduling allows processes and threads to be executed on any available processor or core, which can result in more frequent context switching and lower performance.

Software applications are often designed to solve computationally complex problems. If the algorithm to solve a computationally complex problem can be parallelized, then multiple threads or processes can all run at the same time across multiple cores. Each process or thread executes by itself and does not contend for resources with other threads or processes working on the other parts of the problem to be solved. When each thread or process reaches the point where it can no longer contribute any more work to the solution of the problem, it waits at the barrier if a barrier has been implemented in software. When all threads or processes reach the barrier, their work output is synchronized and often aggregated by the primary process. Complex test frameworks often implement the barrier synchronization problem when certain types of tests can be run in parallel. Most individual software applications running on preemptive, time-sliced, multi-user Linux and UNIX operating systems are not designed with heavy, parallel thread or parallel, multiprocess execution in mind.

Minimizing lock granularity increases concurrency, throughput, and execution efficiency when designing multithreaded and multiprocess software programs. Multithreaded and multiprocess programs that do not correctly utilize synchronization primitives often require countless hours of debugging. The use of semaphores, mutex locks, and other synchronization primitives should be minimized to the maximum extent possible in computer programs that share resources between multiple threads or processes. Proper program design allows schedulable entities to run parallel or concurrently with high throughput and minimum resource contention. This is optimal for solving computationally complex problems on preemptive, time-sliced, multi-user operating systems without requiring hard, real-time scheduling.

Mittwoch, 24. Februar 2021

A hardware design for variable output frequency using an n-bit counter

The DE1-SoC from Terasic is an excellent board for hardware design and prototyping. The following VHDL process is from a hardware design created for the Terasic DE1-SoC FPGA. The ten switches and four buttons on the FPGA are used as an n-bit counter with an adjustable multiplier to increase the output frequency of one or more output pins at a 50% duty cycle.

As the switches are moved or the buttons are pressed, the seven-segment display is updated to reflect the numeric output frequency, and the output pin(s) are driven at the desired frequency. The onboard clock runs at 50MHz, and the signal on the output pins is set on the rising edge of the clock input signal (positive edge-triggered). At 50MHz, the output pins can be toggled at a maximum rate of 50 million cycles per second or 25 million rising edges of the clock per second. An LED attached to one of the output pins would blink 25 million times per second, not recognizable to the human eye. The persistence of vision, which is the time the human eye retains an image after it disappears from view, is approximately 1/16th of a second. Therefore, an LED blinking at 25 million times per second would appear as a continuous light to the human eye.

scaler <= compute_prescaler((to_integer(unsigned( SW )))*scaler_mlt);
gpiopulse_process : process(CLOCK_50, KEY(0))
begin
if (KEY(0) = '0') then -- async reset
count <= 0;
elsif rising_edge(CLOCK_50) then
if (count = scaler - 1) then
state <= not state;
count <= 0;
elsif (count = clk50divider) then -- auto reset
count <= 0;
else
count <= count + 1;
end if;
end if;
end process gpiopulse_process;
The scaler signal is calculated using the compute_prescaler function, which takes the value of a switch (SW) as an input, multiplies it with a multiplier (scaler_mlt), and then converts it to an integer using to_integer. This scaler signal is used to control the frequency of the pulse signal generated on the output pin.

The gpiopulse_process process is triggered by a rising edge of the CLOCK_50 signal and a push-button (KEY(0)) press. It includes an asynchronous reset when KEY(0) is pressed.

The count signal is incremented on each rising edge of the CLOCK_50 signal until it reaches the value of scaler - 1. When this happens, the state signal is inverted and count is reset to 0. If count reaches the value of clk50divider, it is also reset to 0.

Overall, this code generates a pulse signal with a frequency controlled by the value of a switch and a multiplier, which is generated on a specific output pin of the FPGA board. The pulse signal is toggled between two states at a frequency determined by the scaler signal.

It is important to note that concurrent statements within an architecture are executed concurrently, meaning that they are evaluated concurrently and in no particular order. However, the sequential statements within a process are executed sequentially, meaning that they are evaluated in order, one at a time. Processes themselves are executed concurrently with other processes, and each process has its own execution context.