<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
 xml:base="https://www.secure-platform.eu"
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:dcterms="http://purl.org/dc/terms/"
 xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
>

<channel>
<title>Secure Platforms</title>
<link>https://www.secure-platform.eu/feed.xml</link>
<description></description>
<pubDate>Mon, 26 Oct 2026 18:26:10 +0000</pubDate>

<item>
<title>What are Application Specific Processors?</title>
<link>https://www.secure-platform.eu/hardware/2026/10/26/application-specific-processors.html</link>
<description>What application-specific processors are, how they are built from an existing program, and why they are more secure in their domain.</description>
<author>Dominik Meyer</author>
<guid isPermaLink="true">https://www.secure-platform.eu/hardware/2026/10/26/application-specific-processors.html</guid>
<pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
<content:encoded>
&#x3C;p&#x3E;
    A processor is the central computing element of any computer, IoT device, or
    Embedded System. It holds very fast but also very small memory called
    registers and executes small instructions divided into:
&#x3C;/p&#x3E;
    &#x3C;ul&#x3E;
        &#x3C;li&#x3E;Arithmetic operations on registers (+,-, *, /, or, and, xor, ...)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Control Flow Operations (decide where to execute next)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Memory Operations (moving data from the registers to main memory and vice versa)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Processor Status Operations (managing security features like MMU, Processor Modes).&#x3C;/li&#x3E;
    &#x3C;/ul&#x3E;
&#x3C;p&#x3E;
    The register file and the instructions of a processor build its Instruction Set Architecture (ISA).
    Many Instructions form a program (the Software running on the processor).
&#x3C;/p&#x3E;

&#x3C;p&#x3E;
    Processors are built as general-purpose machines, so they can solve any problem, but not always
    very fast nor very efficient. Also, most programs only use a very small subset of the available
    instructions and registers.
&#x3C;/p&#x3E;

&#x3C;p&#x3E;
Application Specific Processors (ASPs) have been around in research for a long time.
In general, they are optimized or adapted processors for a specific application domain.
Domains are full application areas but also just one application.
&#x3C;/p&#x3E;
&#x3C;p&#x3E;
&#x3C;em&#x3E;In contrast to typical general-purpose processors they are faster, more efficient,
  or more secure in their specific application domain.&#x3C;/em&#x3E; &#x3C;/p&#x3E;

&#x3C;h2&#x3E;ASP Categories&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
    Today they divide into two broad categories:
&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Executing Software&#x3C;/strong&#x3E;
            &#x3C;p&#x3E;
                ASPs in this category are sometimes also called Application Specific Instruction Set Processors (ASIPs).
                These ASPs are based on available/ existing Instruction Set Architectures (ISAs), e.g. RISC-V, x86, or Armv7.
                Their ISA is extended to support a specific application area better.


                Typical application areas for
                these ASPs are&#x3C;/p&#x3E;
                &#x3C;ul&#x3E;
                    &#x3C;li&#x3E;Cryptography&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;Video Encoding/Decoding&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;Vector Calculation&#x3C;/li&#x3E;
                &#x3C;/ul&#x3E;
                &#x3C;p&#x3E;
                There are two very important points to highlight for this category of
                processors:
                &#x3C;/p&#x3E;

                &#x3C;ul&#x3E;
                    &#x3C;li&#x3E;&#x3C;em&#x3E;The goals of this category of ASPs are computing performance and efficiency.&#x3C;/em&#x3E;&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;&#x3C;em&#x3E;As every standard processor this category executes software.&#x3C;/em&#x3E;&#x3C;/li&#x3E;
                &#x3C;/ul&#x3E;

    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Pure Hardware&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            This category of ASPs is very new, and the approach behind it is very different.
            Instead of extending existing ISAs, this approach generates ASPs from scratch, taking
            existing ISAs only as a guideline. Even the programs are converted from software
            to hardware, e.g. as a hardware implemented Finite State Machine (FSM).
        &#x3C;/p&#x3E;

        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;&#x3C;em&#x3E;The goals of this category of ASPs are structural elimination to increase trustworthiness and security&#x3C;/em&#x3E;&#x3C;/li&#x3E;
            &#x3C;li&#x3E;&#x3C;em&#x3E;It does &#x3C;strong&#x3E;not&#x3C;/strong&#x3E; run software but executes the application purely in hardware&#x3C;/em&#x3E;&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;

    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h2&#x3E;ASP Implementation/ Production&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
    Both categories of ASPs have two different implementation or production kinds.
&#x3C;/p&#x3E;
&#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
    &#x3C;img width=&#x22;80%&#x22; src=&#x22;/Images/asp-implementation.png&#x22;&#x3E;
    &#x3C;figcaption&#x3E;
        &#x3C;span class=&#x22;pill ai-generated&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; aria-hidden=&#x22;true&#x22;&#x3E;&#x3C;path d=&#x22;M12 2.5l2.1 7.4 7.4 2.1-7.4 2.1-2.1 7.4-2.1-7.4-7.4-2.1 7.4-2.1L12 2.5z&#x22;/&#x3E;&#x3C;/svg&#x3E;
            AI-generated image
        &#x3C;/span&#x3E;
    &#x3C;/figcaption&#x3E;
&#x3C;/figure&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Application Specific Integrated Circuits (ASICs)&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            ASICs are the typical way of implementing/ producing hardware. A
            hardware design, e.g. for a processor, is provided to a chip
            factory and after some optimization to that specific production
            process some thousands Integrated Circuits (IC) are produced.
        &#x3C;/p&#x3E;
        &#x3C;em&#x3E;Advantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Cheap per IC for a large amount&#x3C;/li&#x3E;
            &#x3C;li&#x3E;ICs are able to run at high clock rates&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
        &#x3C;em&#x3E;Disadvantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Expensive for small batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Long production times&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No updates after production (ICs are fixed)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Field Programmable Gate Arrays (FPGAs)&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            FPGAs are often used in prototyping. They are specially
            designed ASICs, which support hardware being configured
            to it after production. Most of the design steps for
            ASICs and FPGAs are the same, except the last step,
            mapping a hardware design to the implementing technology.
            Most FPGAs can be reconfigured many times.
        &#x3C;/p&#x3E;
        &#x3C;em&#x3E;Advantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Cheap for small batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Fast configuration times (seconds)&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Reconfigurable, so updates to hardware possible&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
        &#x3C;em&#x3E;Disadvantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;More expensive compared to ICs for large batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Limited maximum clock rate (&#x26;lt; 1 GHz in general)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;


&#x3C;h2&#x3E;Pure Hardware ASPs&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
    This article focuses on the second category of ASPs. It will provide
    an overview on how they are developed, where they can be of use, and
    how they improve the security and efficiency of computing systems.
&#x3C;/p&#x3E;

&#x3C;h3&#x3E;From Software to Hardware&#x3C;/h3&#x3E;
&#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
    &#x3C;img src=&#x22;/Images/asp-development-flow.png&#x22;&#x3E;
    &#x3C;figcaption&#x3E;
        &#x3C;span class=&#x22;pill ai-assisted&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; aria-hidden=&#x22;true&#x22;&#x3E;&#x3C;path d=&#x22;M12 2.5l2.1 7.4 7.4 2.1-7.4 2.1-2.1 7.4-2.1-7.4-7.4-2.1 7.4-2.1L12 2.5z&#x22;/&#x3E;&#x3C;/svg&#x3E;
            AI-assisted image
        &#x3C;/span&#x3E;
    &#x3C;/figcaption&#x3E;
&#x3C;/figure&#x3E;
&#x3C;p&#x3E;
    The image above shows the design flow of a pure hardware ASP.
&#x3C;/p&#x3E;
&#x3C;ol&#x3E;
    &#x3C;li&#x3E;The development starts with an application written in a high-level programming language like C or C++.
        Rust might also be a possibility in the future but is not supported right now. &#x3C;br/&#x3E;
        A compiler like &#x3C;em&#x3E;GCC&#x3C;/em&#x3E; or &#x3C;em&#x3E;clang&#x3C;/em&#x3E; compiles all source files of this application
        to RISC-V assembler files. Assembler code is a human-readable form of a processor&#x27;s instructions.
        &#x3C;div class=&#x22;split c-asm&#x22;&#x3E;
        &#x3C;div class=&#x22;visual&#x22;&#x3E;
            &#x3C;p&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;C&#x3C;/span&#x3E;&#x3C;/p&#x3E;
            &#x3C;div class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;f&#x22;&#x3E;sum&#x3C;/span&#x3E;(&#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; *p, &#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; n) {
  &#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; s = 0;
  &#x3C;span class=&#x22;k&#x22;&#x3E;while&#x3C;/span&#x3E; (n &#x26;gt; 0) {
    s += *p++;
    n--;
  }
  &#x3C;span class=&#x22;k&#x22;&#x3E;return&#x3C;/span&#x3E; s;
}&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        &#x3C;div class=&#x22;mid&#x22;&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;GCC / CLANG &#x26;#8594;&#x3C;/span&#x3E;&#x3C;/div&#x3E;
        &#x3C;div class=&#x22;visual&#x22;&#x3E;
            &#x3C;p&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;RISC-V ASSEMBLY&#x3C;/span&#x3E;&#x3C;/p&#x3E;
            &#x3C;div class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;sum:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;mv&#x3C;/span&#x3E;    a5, zero      &#x3C;span class=&#x22;c&#x22;&#x3E;# s = 0&#x3C;/span&#x3E;
&#x3C;span class=&#x22;k&#x22;&#x3E;loop:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;ble&#x3C;/span&#x3E;   a1, zero, end &#x3C;span class=&#x22;c&#x22;&#x3E;# n &#x26;gt; 0?&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;lw&#x3C;/span&#x3E;    t0, 0(a0)     &#x3C;span class=&#x22;c&#x22;&#x3E;# *p&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;add&#x3C;/span&#x3E;   a5, a5, t0    &#x3C;span class=&#x22;c&#x22;&#x3E;# s += *p&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;addi&#x3C;/span&#x3E;  a0, a0, 4     &#x3C;span class=&#x22;c&#x22;&#x3E;# p++&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;addi&#x3C;/span&#x3E;  a1, a1, -1    &#x3C;span class=&#x22;c&#x22;&#x3E;# n--&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;j&#x3C;/span&#x3E;     loop
&#x3C;span class=&#x22;k&#x22;&#x3E;end:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;mv&#x3C;/span&#x3E;    a0, a5
    &#x3C;span class=&#x22;f&#x22;&#x3E;ret&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        This step is nothing new and compilers have done it for the past decades.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;
        This step is the important one. The tool &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; analyzes the RISC-V assembly. &#x3C;br/&#x3E;
        On a software-based processor a program does not start from zero. Before
        it starts executing, its initial data has to be moved to main memory. On a PC
        that is the operating system&#x27;s job, on an embedded device the startup code.
        &#x3C;br/&#x3E;
        &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; extracts memory information from all the assembly
        files and builds a memory layout starting at a given start address. It also
        removes dead code from the assembly files. Dead code is instructions
        that the program&#x27;s normal control flow never reaches. Dead code happens
        if the program uses only a subset of a library&#x27;s functions.
        &#x3C;br/&#x3E;
        The output of this stage is the memory layout and the pure instruction flow
        of the program.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;
        In another step &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; converts the instruction flow into
        a Finite State Machine (FSM).
        &#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 640 552&#x22; xmlns=&#x22;http://www.w3.org/2000/svg&#x22; role=&#x22;img&#x22;
                 aria-label=&#x22;Finite state machine generated from the sum() assembly: eight states, one operation each&#x22;&#x3E;
              &#x3C;defs&#x3E;
                &#x3C;linearGradient id=&#x22;fsmbg&#x22; x1=&#x22;0&#x22; y1=&#x22;0&#x22; x2=&#x22;1&#x22; y2=&#x22;1&#x22;&#x3E;
                  &#x3C;stop offset=&#x22;0&#x22; stop-color=&#x22;#11203a&#x22;/&#x3E;
                  &#x3C;stop offset=&#x22;1&#x22; stop-color=&#x22;#0b1626&#x22;/&#x3E;
                &#x3C;/linearGradient&#x3E;
                &#x3C;marker id=&#x22;arr&#x22; viewBox=&#x22;0 0 10 10&#x22; refX=&#x22;8.5&#x22; refY=&#x22;5&#x22; markerWidth=&#x22;6.5&#x22; markerHeight=&#x22;6.5&#x22; orient=&#x22;auto-start-reverse&#x22;&#x3E;
                  &#x3C;path d=&#x22;M0 0L10 5L0 10z&#x22; fill=&#x22;#9AA0A8&#x22;/&#x3E;
                &#x3C;/marker&#x3E;
              &#x3C;/defs&#x3E;

              &#x3C;rect x=&#x22;0&#x22; y=&#x22;0&#x22; width=&#x22;640&#x22; height=&#x22;552&#x22; fill=&#x22;url(#fsmbg)&#x22;/&#x3E;

              &#x3C;!-- transitions --&#x3E;
              &#x3C;g stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22; fill=&#x22;none&#x22;&#x3E;
                &#x3C;path d=&#x22;M33 64 H58&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 88 V121&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 172 V205&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 256 V289&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 340 V373&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 424 V457&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M290 148 H367&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M485 172 V205&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M485 256 V273&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M60 484 H28 V148 H57&#x22; stroke-linejoin=&#x22;round&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
              &#x3C;/g&#x3E;

              &#x3C;!-- start --&#x3E;
              &#x3C;circle cx=&#x22;28&#x22; cy=&#x22;64&#x22; r=&#x22;5&#x22; fill=&#x22;#F2EDE0&#x22;/&#x3E;

              &#x3C;!-- halt (accept state) --&#x3E;
              &#x3C;circle cx=&#x22;485&#x22; cy=&#x22;300&#x22; r=&#x22;21&#x22; fill=&#x22;none&#x22; stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22;/&#x3E;
              &#x3C;circle cx=&#x22;485&#x22; cy=&#x22;300&#x22; r=&#x22;16&#x22; fill=&#x22;none&#x22; stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22;/&#x3E;

              &#x3C;!-- edge labels --&#x3E;
              &#x3C;g font-family=&#x22;ui-monospace, SFMono-Regular, Menlo, Consolas, monospace&#x22; fill=&#x22;#F2EDE0&#x22; opacity=&#x22;0.85&#x22;&#x3E;
                &#x3C;text x=&#x22;185&#x22; y=&#x22;194&#x22; font-size=&#x22;11&#x22;&#x3E;a1 &#x26;gt; 0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;328&#x22; y=&#x22;138&#x22; font-size=&#x22;11&#x22; text-anchor=&#x22;middle&#x22;&#x3E;a1 &#x26;le; 0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;16&#x22; y=&#x22;316&#x22; font-size=&#x22;10.5&#x22; text-anchor=&#x22;middle&#x22; transform=&#x22;rotate(-90 16 316)&#x22;&#x3E;j loop&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;28&#x22; y=&#x22;46&#x22; font-size=&#x22;10&#x22; text-anchor=&#x22;middle&#x22; opacity=&#x22;0.7&#x22;&#x3E;start&#x3C;/text&#x3E;
              &#x3C;/g&#x3E;

              &#x3C;!-- states --&#x3E;
              &#x3C;g font-family=&#x22;ui-monospace, SFMono-Regular, Menlo, Consolas, monospace&#x22;&#x3E;
                &#x3C;rect x=&#x22;60&#x22; y=&#x22;40&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;58&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;76&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a5&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := zero&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;124&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;#E0A83C&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;142&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S1&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;160&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a1 &#x26;le; 0 ?&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;208&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;226&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S2&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;244&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;t0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := M[a0]&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;292&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;310&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S3&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;328&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a5&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a5 + t0&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;376&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;394&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S4&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;412&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a0 + 4&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;460&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;478&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S5&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;496&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a1&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a1 - 1&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;370&#x22; y=&#x22;124&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;382&#x22; y=&#x22;142&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S6&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;485&#x22; y=&#x22;160&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a5&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;370&#x22; y=&#x22;208&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;382&#x22; y=&#x22;226&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S7&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;485&#x22; y=&#x22;244&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E;return&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;
              &#x3C;/g&#x3E;
            &#x3C;/svg&#x3E;
        &#x3C;/figure&#x3E;
        The memory layout is copied in front of the FSM in the form of memory stores.
        So, before starting the program, the FSM itself moves the required initial
        data to memory and self-initializes.&#x3C;br/&#x3E;
        Converting the FSM to a hardware description language like VHDL is
        straightforward for any digital hardware engineer or even an AI today.
        The description is then merged into a System-on-Chip (SoC) framework
        which provides required peripherals like memory bus, interrupt management,
        and input/output. The explanation of a SoC framework is part of a future article.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;The last step is running the synthesis, placement and routing, and mapping flow of the FPGA or ASIC targeted.&#x3C;/li&#x3E;
&#x3C;/ol&#x3E;

&#x3C;h3&#x3E;Advantages&#x3C;/h3&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Structural Elimination&#x3C;/strong&#x3E;
        A general-purpose processor runs any program, including one an attacker
        injects. The ASP runs only the single application it was built for. A
        buffer-overflow attack works by redirecting the processor to run
        attacker code, the ASP has no way to start running code it wasn&#x2019;t built
        with. There is nothing to land on. &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;No speculative execution&#x3C;/strong&#x3E;
        Modern processors guess ahead to run faster, and that guessing is what
        makes side channels like Spectre possible. The FSM just steps through
        states in a fixed order &#x2014; it never guesses, so that class of leak has no
        mechanism.
    &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;Determinism&#x3C;/strong&#x3E;
        On a processor with an OS, how long an operation takes varies with what else is
        running. On the ASP the same input always takes the same number of cycles. A
        real-time deadline is a fixed number, not an average.
    &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;Efficiency&#x3C;/strong&#x3E;
        The post&#x2019;s intro already said a program uses only a small subset of the
        available instructions and registers. A general-purpose processor still
        pays for the whole set, a full register file, a decoder for the entire ISA,
        a branch unit. The ASP builds only what the application actually uses.
        Less hardware, less power, less space.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h3&#x3E;Some Application Areas&#x3C;/h3&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Cryptographic engines&#x3C;/strong&#x3E;
        Cryptographic algorithms are in general fixed and known.
        The processor just needs to execute them. ASPs can protect
        against side-channel attacks by providing a constant-time behavior by
        construction. This supports Smart cards, secure elements, and HSMs.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Secure boot&#x3C;/strong&#x3E;
        The ASP can be considered as a coprocessor sitting next to a general-purpose processor,
        similar to a Secure Element (SE) or Trusted Platform Module (TPM) and do additional
        verification of system initialization step. An ASP might even replace part of the
        SE or TPM functionality.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Military / defense systems&#x3C;/strong&#x3E;
        Defense systems must be sovereign and hardened. With an ASP the software
        stack is the one application itself, no OS to compromise, no general-purpose core
        to exploit, and a small state machine that can be verified.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Autonomous Drone Control&#x3C;/strong&#x3E;
    Autonomous drones run a fixed flight-control application far from the operator.
    That application is exactly one thing: read sensors, compute the control loop,
    drive the motors. An ASP executes it deterministically, with guaranteed cycle
    times and no general-purpose code path that could be hijacked, a compromise in
    the communication or AI software cannot become a takeover of the flight control.
&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h2&#x3E;The publications behind this post&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
The work behind this post is available in the
&#x3C;a href=&#x22;/asp-research.html&#x22;&#x3E;publications&#x3C;/a&#x3E;:
&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2019hdl&#x22;&#x3E;&#x3C;em&#x3E;HDL FSM Code Generation Using a MIPS-based Assembler&#x3C;/em&#x3E;&#x3C;/a&#x3E;, ISIE 2019&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2021&#x22;&#x3E;&#x3C;em&#x3E;A Modern Approach to Application Specific Processors for Improving the Security of Embedded Devices&#x3C;/em&#x3E;&#x3C;/a&#x3E;, IECON 2021&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2026&#x22;&#x3E;&#x3C;em&#x3E;Hardware-Enabled Sovereignty: Securing Military Systems Through a Novel and Resilient Defense Architecture&#x3C;/em&#x3E;&#x3C;/a&#x3E;, CyCon 2026&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2026trust&#x22;&#x3E;&#x3C;em&#x3E;Trustworthiness by Structural Elimination&#x3C;/em&#x3E;&#x3C;/a&#x3E;, FDL 2026&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;p&#x3E;
    A processor is the central computing element of any computer, IoT device, or
    Embedded System. It holds very fast but also very small memory called
    registers and executes small instructions divided into:
&#x3C;/p&#x3E;
    &#x3C;ul&#x3E;
        &#x3C;li&#x3E;Arithmetic operations on registers (+,-, *, /, or, and, xor, ...)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Control Flow Operations (decide where to execute next)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Memory Operations (moving data from the registers to main memory and vice versa)&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Processor Status Operations (managing security features like MMU, Processor Modes).&#x3C;/li&#x3E;
    &#x3C;/ul&#x3E;
&#x3C;p&#x3E;
    The register file and the instructions of a processor build its Instruction Set Architecture (ISA).
    Many Instructions form a program (the Software running on the processor).
&#x3C;/p&#x3E;

&#x3C;p&#x3E;
    Processors are built as general-purpose machines, so they can solve any problem, but not always
    very fast nor very efficient. Also, most programs only use a very small subset of the available
    instructions and registers.
&#x3C;/p&#x3E;

&#x3C;p&#x3E;
Application Specific Processors (ASPs) have been around in research for a long time.
In general, they are optimized or adapted processors for a specific application domain.
Domains are full application areas but also just one application.
&#x3C;/p&#x3E;
&#x3C;p&#x3E;
&#x3C;em&#x3E;In contrast to typical general-purpose processors they are faster, more efficient,
  or more secure in their specific application domain.&#x3C;/em&#x3E; &#x3C;/p&#x3E;

&#x3C;h2&#x3E;ASP Categories&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
    Today they divide into two broad categories:
&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Executing Software&#x3C;/strong&#x3E;
            &#x3C;p&#x3E;
                ASPs in this category are sometimes also called Application Specific Instruction Set Processors (ASIPs).
                These ASPs are based on available/ existing Instruction Set Architectures (ISAs), e.g. RISC-V, x86, or Armv7.
                Their ISA is extended to support a specific application area better.


                Typical application areas for
                these ASPs are&#x3C;/p&#x3E;
                &#x3C;ul&#x3E;
                    &#x3C;li&#x3E;Cryptography&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;Video Encoding/Decoding&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;Vector Calculation&#x3C;/li&#x3E;
                &#x3C;/ul&#x3E;
                &#x3C;p&#x3E;
                There are two very important points to highlight for this category of
                processors:
                &#x3C;/p&#x3E;

                &#x3C;ul&#x3E;
                    &#x3C;li&#x3E;&#x3C;em&#x3E;The goals of this category of ASPs are computing performance and efficiency.&#x3C;/em&#x3E;&#x3C;/li&#x3E;
                    &#x3C;li&#x3E;&#x3C;em&#x3E;As every standard processor this category executes software.&#x3C;/em&#x3E;&#x3C;/li&#x3E;
                &#x3C;/ul&#x3E;

    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Pure Hardware&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            This category of ASPs is very new, and the approach behind it is very different.
            Instead of extending existing ISAs, this approach generates ASPs from scratch, taking
            existing ISAs only as a guideline. Even the programs are converted from software
            to hardware, e.g. as a hardware implemented Finite State Machine (FSM).
        &#x3C;/p&#x3E;

        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;&#x3C;em&#x3E;The goals of this category of ASPs are structural elimination to increase trustworthiness and security&#x3C;/em&#x3E;&#x3C;/li&#x3E;
            &#x3C;li&#x3E;&#x3C;em&#x3E;It does &#x3C;strong&#x3E;not&#x3C;/strong&#x3E; run software but executes the application purely in hardware&#x3C;/em&#x3E;&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;

    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h2&#x3E;ASP Implementation/ Production&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
    Both categories of ASPs have two different implementation or production kinds.
&#x3C;/p&#x3E;
&#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
    &#x3C;img width=&#x22;80%&#x22; src=&#x22;/Images/asp-implementation.png&#x22;&#x3E;
    &#x3C;figcaption&#x3E;
        &#x3C;span class=&#x22;pill ai-generated&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; aria-hidden=&#x22;true&#x22;&#x3E;&#x3C;path d=&#x22;M12 2.5l2.1 7.4 7.4 2.1-7.4 2.1-2.1 7.4-2.1-7.4-7.4-2.1 7.4-2.1L12 2.5z&#x22;/&#x3E;&#x3C;/svg&#x3E;
            AI-generated image
        &#x3C;/span&#x3E;
    &#x3C;/figcaption&#x3E;
&#x3C;/figure&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Application Specific Integrated Circuits (ASICs)&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            ASICs are the typical way of implementing/ producing hardware. A
            hardware design, e.g. for a processor, is provided to a chip
            factory and after some optimization to that specific production
            process some thousands Integrated Circuits (IC) are produced.
        &#x3C;/p&#x3E;
        &#x3C;em&#x3E;Advantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Cheap per IC for a large amount&#x3C;/li&#x3E;
            &#x3C;li&#x3E;ICs are able to run at high clock rates&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
        &#x3C;em&#x3E;Disadvantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Expensive for small batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Long production times&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No updates after production (ICs are fixed)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Field Programmable Gate Arrays (FPGAs)&#x3C;/strong&#x3E;
        &#x3C;p&#x3E;
            FPGAs are often used in prototyping. They are specially
            designed ASICs, which support hardware being configured
            to it after production. Most of the design steps for
            ASICs and FPGAs are the same, except the last step,
            mapping a hardware design to the implementing technology.
            Most FPGAs can be reconfigured many times.
        &#x3C;/p&#x3E;
        &#x3C;em&#x3E;Advantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Cheap for small batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Fast configuration times (seconds)&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Reconfigurable, so updates to hardware possible&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
        &#x3C;em&#x3E;Disadvantages&#x3C;/em&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;More expensive compared to ICs for large batches&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Limited maximum clock rate (&#x26;lt; 1 GHz in general)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;


&#x3C;h2&#x3E;Pure Hardware ASPs&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
    This article focuses on the second category of ASPs. It will provide
    an overview on how they are developed, where they can be of use, and
    how they improve the security and efficiency of computing systems.
&#x3C;/p&#x3E;

&#x3C;h3&#x3E;From Software to Hardware&#x3C;/h3&#x3E;
&#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
    &#x3C;img src=&#x22;/Images/asp-development-flow.png&#x22;&#x3E;
    &#x3C;figcaption&#x3E;
        &#x3C;span class=&#x22;pill ai-assisted&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; aria-hidden=&#x22;true&#x22;&#x3E;&#x3C;path d=&#x22;M12 2.5l2.1 7.4 7.4 2.1-7.4 2.1-2.1 7.4-2.1-7.4-7.4-2.1 7.4-2.1L12 2.5z&#x22;/&#x3E;&#x3C;/svg&#x3E;
            AI-assisted image
        &#x3C;/span&#x3E;
    &#x3C;/figcaption&#x3E;
&#x3C;/figure&#x3E;
&#x3C;p&#x3E;
    The image above shows the design flow of a pure hardware ASP.
&#x3C;/p&#x3E;
&#x3C;ol&#x3E;
    &#x3C;li&#x3E;The development starts with an application written in a high-level programming language like C or C++.
        Rust might also be a possibility in the future but is not supported right now. &#x3C;br/&#x3E;
        A compiler like &#x3C;em&#x3E;GCC&#x3C;/em&#x3E; or &#x3C;em&#x3E;clang&#x3C;/em&#x3E; compiles all source files of this application
        to RISC-V assembler files. Assembler code is a human-readable form of a processor&#x27;s instructions.
        &#x3C;div class=&#x22;split c-asm&#x22;&#x3E;
        &#x3C;div class=&#x22;visual&#x22;&#x3E;
            &#x3C;p&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;C&#x3C;/span&#x3E;&#x3C;/p&#x3E;
            &#x3C;div class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;f&#x22;&#x3E;sum&#x3C;/span&#x3E;(&#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; *p, &#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; n) {
  &#x3C;span class=&#x22;k&#x22;&#x3E;int&#x3C;/span&#x3E; s = 0;
  &#x3C;span class=&#x22;k&#x22;&#x3E;while&#x3C;/span&#x3E; (n &#x26;gt; 0) {
    s += *p++;
    n--;
  }
  &#x3C;span class=&#x22;k&#x22;&#x3E;return&#x3C;/span&#x3E; s;
}&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        &#x3C;div class=&#x22;mid&#x22;&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;GCC / CLANG &#x26;#8594;&#x3C;/span&#x3E;&#x3C;/div&#x3E;
        &#x3C;div class=&#x22;visual&#x22;&#x3E;
            &#x3C;p&#x3E;&#x3C;span class=&#x22;pill idle&#x22;&#x3E;RISC-V ASSEMBLY&#x3C;/span&#x3E;&#x3C;/p&#x3E;
            &#x3C;div class=&#x22;code&#x22;&#x3E;&#x3C;pre&#x3E;&#x3C;code&#x3E;&#x3C;span class=&#x22;k&#x22;&#x3E;sum:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;mv&#x3C;/span&#x3E;    a5, zero      &#x3C;span class=&#x22;c&#x22;&#x3E;# s = 0&#x3C;/span&#x3E;
&#x3C;span class=&#x22;k&#x22;&#x3E;loop:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;ble&#x3C;/span&#x3E;   a1, zero, end &#x3C;span class=&#x22;c&#x22;&#x3E;# n &#x26;gt; 0?&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;lw&#x3C;/span&#x3E;    t0, 0(a0)     &#x3C;span class=&#x22;c&#x22;&#x3E;# *p&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;add&#x3C;/span&#x3E;   a5, a5, t0    &#x3C;span class=&#x22;c&#x22;&#x3E;# s += *p&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;addi&#x3C;/span&#x3E;  a0, a0, 4     &#x3C;span class=&#x22;c&#x22;&#x3E;# p++&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;addi&#x3C;/span&#x3E;  a1, a1, -1    &#x3C;span class=&#x22;c&#x22;&#x3E;# n--&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;j&#x3C;/span&#x3E;     loop
&#x3C;span class=&#x22;k&#x22;&#x3E;end:&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;f&#x22;&#x3E;mv&#x3C;/span&#x3E;    a0, a5
    &#x3C;span class=&#x22;f&#x22;&#x3E;ret&#x3C;/span&#x3E;&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        &#x3C;/div&#x3E;
        This step is nothing new and compilers have done it for the past decades.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;
        This step is the important one. The tool &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; analyzes the RISC-V assembly. &#x3C;br/&#x3E;
        On a software-based processor a program does not start from zero. Before
        it starts executing, its initial data has to be moved to main memory. On a PC
        that is the operating system&#x27;s job, on an embedded device the startup code.
        &#x3C;br/&#x3E;
        &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; extracts memory information from all the assembly
        files and builds a memory layout starting at a given start address. It also
        removes dead code from the assembly files. Dead code is instructions
        that the program&#x27;s normal control flow never reaches. Dead code happens
        if the program uses only a subset of a library&#x27;s functions.
        &#x3C;br/&#x3E;
        The output of this stage is the memory layout and the pure instruction flow
        of the program.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;
        In another step &#x3C;em&#x3E;asm2fsm&#x3C;/em&#x3E; converts the instruction flow into
        a Finite State Machine (FSM).
        &#x3C;figure class=&#x22;post-hero&#x22;&#x3E;
            &#x3C;svg viewBox=&#x22;0 0 640 552&#x22; xmlns=&#x22;http://www.w3.org/2000/svg&#x22; role=&#x22;img&#x22;
                 aria-label=&#x22;Finite state machine generated from the sum() assembly: eight states, one operation each&#x22;&#x3E;
              &#x3C;defs&#x3E;
                &#x3C;linearGradient id=&#x22;fsmbg&#x22; x1=&#x22;0&#x22; y1=&#x22;0&#x22; x2=&#x22;1&#x22; y2=&#x22;1&#x22;&#x3E;
                  &#x3C;stop offset=&#x22;0&#x22; stop-color=&#x22;#11203a&#x22;/&#x3E;
                  &#x3C;stop offset=&#x22;1&#x22; stop-color=&#x22;#0b1626&#x22;/&#x3E;
                &#x3C;/linearGradient&#x3E;
                &#x3C;marker id=&#x22;arr&#x22; viewBox=&#x22;0 0 10 10&#x22; refX=&#x22;8.5&#x22; refY=&#x22;5&#x22; markerWidth=&#x22;6.5&#x22; markerHeight=&#x22;6.5&#x22; orient=&#x22;auto-start-reverse&#x22;&#x3E;
                  &#x3C;path d=&#x22;M0 0L10 5L0 10z&#x22; fill=&#x22;#9AA0A8&#x22;/&#x3E;
                &#x3C;/marker&#x3E;
              &#x3C;/defs&#x3E;

              &#x3C;rect x=&#x22;0&#x22; y=&#x22;0&#x22; width=&#x22;640&#x22; height=&#x22;552&#x22; fill=&#x22;url(#fsmbg)&#x22;/&#x3E;

              &#x3C;!-- transitions --&#x3E;
              &#x3C;g stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22; fill=&#x22;none&#x22;&#x3E;
                &#x3C;path d=&#x22;M33 64 H58&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 88 V121&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 172 V205&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 256 V289&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 340 V373&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M175 424 V457&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M290 148 H367&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M485 172 V205&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M485 256 V273&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
                &#x3C;path d=&#x22;M60 484 H28 V148 H57&#x22; stroke-linejoin=&#x22;round&#x22; marker-end=&#x22;url(#arr)&#x22;/&#x3E;
              &#x3C;/g&#x3E;

              &#x3C;!-- start --&#x3E;
              &#x3C;circle cx=&#x22;28&#x22; cy=&#x22;64&#x22; r=&#x22;5&#x22; fill=&#x22;#F2EDE0&#x22;/&#x3E;

              &#x3C;!-- halt (accept state) --&#x3E;
              &#x3C;circle cx=&#x22;485&#x22; cy=&#x22;300&#x22; r=&#x22;21&#x22; fill=&#x22;none&#x22; stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22;/&#x3E;
              &#x3C;circle cx=&#x22;485&#x22; cy=&#x22;300&#x22; r=&#x22;16&#x22; fill=&#x22;none&#x22; stroke=&#x22;#9AA0A8&#x22; stroke-width=&#x22;1.5&#x22;/&#x3E;

              &#x3C;!-- edge labels --&#x3E;
              &#x3C;g font-family=&#x22;ui-monospace, SFMono-Regular, Menlo, Consolas, monospace&#x22; fill=&#x22;#F2EDE0&#x22; opacity=&#x22;0.85&#x22;&#x3E;
                &#x3C;text x=&#x22;185&#x22; y=&#x22;194&#x22; font-size=&#x22;11&#x22;&#x3E;a1 &#x26;gt; 0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;328&#x22; y=&#x22;138&#x22; font-size=&#x22;11&#x22; text-anchor=&#x22;middle&#x22;&#x3E;a1 &#x26;le; 0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;16&#x22; y=&#x22;316&#x22; font-size=&#x22;10.5&#x22; text-anchor=&#x22;middle&#x22; transform=&#x22;rotate(-90 16 316)&#x22;&#x3E;j loop&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;28&#x22; y=&#x22;46&#x22; font-size=&#x22;10&#x22; text-anchor=&#x22;middle&#x22; opacity=&#x22;0.7&#x22;&#x3E;start&#x3C;/text&#x3E;
              &#x3C;/g&#x3E;

              &#x3C;!-- states --&#x3E;
              &#x3C;g font-family=&#x22;ui-monospace, SFMono-Regular, Menlo, Consolas, monospace&#x22;&#x3E;
                &#x3C;rect x=&#x22;60&#x22; y=&#x22;40&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;58&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S0&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;76&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a5&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := zero&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;124&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;#E0A83C&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;142&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S1&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;160&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a1 &#x26;le; 0 ?&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;208&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;226&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S2&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;244&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;t0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := M[a0]&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;292&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;310&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S3&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;328&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a5&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a5 + t0&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;376&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;394&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S4&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;412&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a0 + 4&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;60&#x22; y=&#x22;460&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;72&#x22; y=&#x22;478&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S5&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;175&#x22; y=&#x22;496&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a1&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a1 - 1&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;370&#x22; y=&#x22;124&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;382&#x22; y=&#x22;142&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S6&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;485&#x22; y=&#x22;160&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#ffd479&#x22;&#x3E;a0&#x3C;/tspan&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E; := a5&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;

                &#x3C;rect x=&#x22;370&#x22; y=&#x22;208&#x22; width=&#x22;230&#x22; height=&#x22;48&#x22; rx=&#x22;10&#x22; fill=&#x22;#0f1e36&#x22; stroke=&#x22;rgba(255,255,255,0.18)&#x22;/&#x3E;
                &#x3C;text x=&#x22;382&#x22; y=&#x22;226&#x22; font-size=&#x22;10&#x22; fill=&#x22;#5f7098&#x22;&#x3E;S7&#x3C;/text&#x3E;
                &#x3C;text x=&#x22;485&#x22; y=&#x22;244&#x22; font-size=&#x22;13.5&#x22; text-anchor=&#x22;middle&#x22;&#x3E;&#x3C;tspan fill=&#x22;#c6d4ef&#x22;&#x3E;return&#x3C;/tspan&#x3E;&#x3C;/text&#x3E;
              &#x3C;/g&#x3E;
            &#x3C;/svg&#x3E;
        &#x3C;/figure&#x3E;
        The memory layout is copied in front of the FSM in the form of memory stores.
        So, before starting the program, the FSM itself moves the required initial
        data to memory and self-initializes.&#x3C;br/&#x3E;
        Converting the FSM to a hardware description language like VHDL is
        straightforward for any digital hardware engineer or even an AI today.
        The description is then merged into a System-on-Chip (SoC) framework
        which provides required peripherals like memory bus, interrupt management,
        and input/output. The explanation of a SoC framework is part of a future article.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;The last step is running the synthesis, placement and routing, and mapping flow of the FPGA or ASIC targeted.&#x3C;/li&#x3E;
&#x3C;/ol&#x3E;

&#x3C;h3&#x3E;Advantages&#x3C;/h3&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Structural Elimination&#x3C;/strong&#x3E;
        A general-purpose processor runs any program, including one an attacker
        injects. The ASP runs only the single application it was built for. A
        buffer-overflow attack works by redirecting the processor to run
        attacker code, the ASP has no way to start running code it wasn&#x2019;t built
        with. There is nothing to land on. &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;No speculative execution&#x3C;/strong&#x3E;
        Modern processors guess ahead to run faster, and that guessing is what
        makes side channels like Spectre possible. The FSM just steps through
        states in a fixed order &#x2014; it never guesses, so that class of leak has no
        mechanism.
    &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;Determinism&#x3C;/strong&#x3E;
        On a processor with an OS, how long an operation takes varies with what else is
        running. On the ASP the same input always takes the same number of cycles. A
        real-time deadline is a fixed number, not an average.
    &#x3C;/li&#x3E;

    &#x3C;li&#x3E;&#x3C;strong&#x3E;Efficiency&#x3C;/strong&#x3E;
        The post&#x2019;s intro already said a program uses only a small subset of the
        available instructions and registers. A general-purpose processor still
        pays for the whole set, a full register file, a decoder for the entire ISA,
        a branch unit. The ASP builds only what the application actually uses.
        Less hardware, less power, less space.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h3&#x3E;Some Application Areas&#x3C;/h3&#x3E;
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Cryptographic engines&#x3C;/strong&#x3E;
        Cryptographic algorithms are in general fixed and known.
        The processor just needs to execute them. ASPs can protect
        against side-channel attacks by providing a constant-time behavior by
        construction. This supports Smart cards, secure elements, and HSMs.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Secure boot&#x3C;/strong&#x3E;
        The ASP can be considered as a coprocessor sitting next to a general-purpose processor,
        similar to a Secure Element (SE) or Trusted Platform Module (TPM) and do additional
        verification of system initialization step. An ASP might even replace part of the
        SE or TPM functionality.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Military / defense systems&#x3C;/strong&#x3E;
        Defense systems must be sovereign and hardened. With an ASP the software
        stack is the one application itself, no OS to compromise, no general-purpose core
        to exploit, and a small state machine that can be verified.
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Autonomous Drone Control&#x3C;/strong&#x3E;
    Autonomous drones run a fixed flight-control application far from the operator.
    That application is exactly one thing: read sensors, compute the control loop,
    drive the motors. An ASP executes it deterministically, with guaranteed cycle
    times and no general-purpose code path that could be hijacked, a compromise in
    the communication or AI software cannot become a takeover of the flight control.
&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;h2&#x3E;The publications behind this post&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
The work behind this post is available in the
&#x3C;a href=&#x22;/asp-research.html&#x22;&#x3E;publications&#x3C;/a&#x3E;:
&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2019hdl&#x22;&#x3E;&#x3C;em&#x3E;HDL FSM Code Generation Using a MIPS-based Assembler&#x3C;/em&#x3E;&#x3C;/a&#x3E;, ISIE 2019&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2021&#x22;&#x3E;&#x3C;em&#x3E;A Modern Approach to Application Specific Processors for Improving the Security of Embedded Devices&#x3C;/em&#x3E;&#x3C;/a&#x3E;, IECON 2021&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2026&#x22;&#x3E;&#x3C;em&#x3E;Hardware-Enabled Sovereignty: Securing Military Systems Through a Novel and Resilient Defense Architecture&#x3C;/em&#x3E;&#x3C;/a&#x3E;, CyCon 2026&#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;a href=&#x22;/asp-research.html#meyer2026trust&#x22;&#x3E;&#x3C;em&#x3E;Trustworthiness by Structural Elimination&#x3C;/em&#x3E;&#x3C;/a&#x3E;, FDL 2026&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;
</content:encoded>
</item>
<item>
<title>Open source &#x26;ne; sovereignty</title>
<link>https://www.secure-platform.eu/sovereignty/2026/06/10/oss-sovereignty.html</link>
<description>Open source moves the dependency from a vendor SLA to a maintainer inbox. It does not remove it. Sovereignty is about the structure of the dependency, not the license text.</description>
<author>Dominik Meyer</author>
<guid isPermaLink="true">https://www.secure-platform.eu/sovereignty/2026/06/10/oss-sovereignty.html</guid>
<pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
<content:encoded>
&#x3C;p&#x3E;While attending the 18th International Conference on Cyber Conflict (CyCon 2026) in
    Tallinn, 26&#x26;ndash;29 May 2026 I had many discussions about improving
    &#x3C;em&#x3E;Digital Sovereignty&#x3C;/em&#x3E; by using Open-Source Software (OSS).
    The reasons I kept hearing were the standard ones:
    &#x3C;ul&#x3E;
        &#x3C;li&#x3E;freedom from vendor lockin&#x3C;/li&#x3E;
        &#x3C;li&#x3E;no license fees&#x3C;/li&#x3E;
        &#x3C;li&#x3E;IT-Security&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Adaptability&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Auditability&#x3C;/li&#x3E;
    &#x3C;/ul&#x3E;
    These are the right reasons for a first step.
    They are not, on their own, sovereignty.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;What is Open-Source Software&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
Open-Source Software (OSS) is a Software whose Source-Code is
available under an Open-Source License as approved by the
Open Source Initiative (OSI). Typical building blocks of
an Open-Source License are:
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;The right to&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Use, study, copy, modify, create derivatives&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Redistribute (original or modified)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Conditions&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Preserve copyright and license notices (attribution)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Disclaimer&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;no warranty of any kind&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No liability for damages&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No endorsement, no trademark rights granted&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No sublicensing (usually)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;
No clause obligates the author to keep the software alive.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Why using OSS is the way to go&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
    OSS is an important building block of digital sovereignty.
    The rights given by an open-source license support many
    important aspects of digital sovereignty.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;Adaptability&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
You are not forced to accept the update cycle and the development
goals of the upstream project. If they do not fit your requirements,
you can modify the software yourself or fork it &#x2014; provided you
have the competence and the resources to maintain the result.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;Auditability&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Verification that software does not contain backdoors or kill-switches
is very important for digital sovereignty. Access to the source code is
the requirement for verification.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;IT-Security&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Many people auditing the source code improves the IT-Security of
an application &#x2014; if there are many people auditing it.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;No Vendor Lock-In&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Vendor lock-in means that the vendor holds the off-switch. Prices,
end-of-life decisions, and legal compulsion can all be turned
against you. The only document that obligates the vendor to keep
providing the software is the service-level agreement (SLA).
An open-source license contains no such obligation.
&#x3C;/p&#x3E;
&#x3C;p&#x3E;
    Note what all of the above has in common. It is about what
    you are permitted to do. A license grants permission.
    It does not do the work.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Why OSS is not enough&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
Under a proprietary license, keeping the software working is
a contractual obligation of the vendor. Patches, updates,
and support are delivered because the SLA says so.
Under an open-source license, none of that is covered by
anything. And the license does not just stay silent. It
actively disclaims every warranty and every liability.
&#x3C;/p&#x3E;

&#x3C;h3&#x3E;The work&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Running a piece of software is not one action. It is a
continuous process of tracking upstream changes, applying
patches, testing, releasing, and reacting to vulnerability
reports. A full software lifecycle management is required.
The license tells you that you may do all of this.
It does not tell you who will do it.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;The maintainers&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
In practice, the work is done by a handful of maintainers.
Many of them are volunteers; many work for companies whose
goals are not yours. You can read the code and inspect the
process, but goodwill is not a schedule, and an inbox
is not a SLA.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;The takeover&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Maintainers leave. When they do, you must find someone
to take over &#x2014; or become that person. In 2015 the
maintainer of the small npm package left-pad deleted it
from the registry. There was no vendor to call and no
contract to enforce. The package simply stopped existing
until someone else picked it up.
&#x3C;/p&#x3E;
&#x3C;h2&#x3E;Digital Sovereignty&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
There is a way out of this. You buy the work back.
Companies sell maintenance, patches, and support for
open-source components, and that is a legitimate model.
But notice what it is. You have replaced one vendor SLA
with another. You have not removed the dependency.
You have changed the contract.
&#x3C;/p&#x3E;

&#x3C;p&#x3E;While attending the 18th International Conference on Cyber Conflict (CyCon 2026) in
    Tallinn, 26&#x26;ndash;29 May 2026 I had many discussions about improving
    &#x3C;em&#x3E;Digital Sovereignty&#x3C;/em&#x3E; by using Open-Source Software (OSS).
    The reasons I kept hearing were the standard ones:
    &#x3C;ul&#x3E;
        &#x3C;li&#x3E;freedom from vendor lockin&#x3C;/li&#x3E;
        &#x3C;li&#x3E;no license fees&#x3C;/li&#x3E;
        &#x3C;li&#x3E;IT-Security&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Adaptability&#x3C;/li&#x3E;
        &#x3C;li&#x3E;Auditability&#x3C;/li&#x3E;
    &#x3C;/ul&#x3E;
    These are the right reasons for a first step.
    They are not, on their own, sovereignty.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;What is Open-Source Software&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
Open-Source Software (OSS) is a Software whose Source-Code is
available under an Open-Source License as approved by the
Open Source Initiative (OSI). Typical building blocks of
an Open-Source License are:
&#x3C;ul&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;The right to&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Use, study, copy, modify, create derivatives&#x3C;/li&#x3E;
            &#x3C;li&#x3E;Redistribute (original or modified)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Conditions&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;Preserve copyright and license notices (attribution)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
    &#x3C;li&#x3E;&#x3C;strong&#x3E;Disclaimer&#x3C;/strong&#x3E;
        &#x3C;ul&#x3E;
            &#x3C;li&#x3E;no warranty of any kind&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No liability for damages&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No endorsement, no trademark rights granted&#x3C;/li&#x3E;
            &#x3C;li&#x3E;No sublicensing (usually)&#x3C;/li&#x3E;
        &#x3C;/ul&#x3E;
    &#x3C;/li&#x3E;
&#x3C;/ul&#x3E;
No clause obligates the author to keep the software alive.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Why using OSS is the way to go&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
    OSS is an important building block of digital sovereignty.
    The rights given by an open-source license support many
    important aspects of digital sovereignty.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;Adaptability&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
You are not forced to accept the update cycle and the development
goals of the upstream project. If they do not fit your requirements,
you can modify the software yourself or fork it &#x2014; provided you
have the competence and the resources to maintain the result.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;Auditability&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Verification that software does not contain backdoors or kill-switches
is very important for digital sovereignty. Access to the source code is
the requirement for verification.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;IT-Security&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Many people auditing the source code improves the IT-Security of
an application &#x2014; if there are many people auditing it.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;No Vendor Lock-In&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Vendor lock-in means that the vendor holds the off-switch. Prices,
end-of-life decisions, and legal compulsion can all be turned
against you. The only document that obligates the vendor to keep
providing the software is the service-level agreement (SLA).
An open-source license contains no such obligation.
&#x3C;/p&#x3E;
&#x3C;p&#x3E;
    Note what all of the above has in common. It is about what
    you are permitted to do. A license grants permission.
    It does not do the work.
&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Why OSS is not enough&#x3C;/h2&#x3E;

&#x3C;p&#x3E;
Under a proprietary license, keeping the software working is
a contractual obligation of the vendor. Patches, updates,
and support are delivered because the SLA says so.
Under an open-source license, none of that is covered by
anything. And the license does not just stay silent. It
actively disclaims every warranty and every liability.
&#x3C;/p&#x3E;

&#x3C;h3&#x3E;The work&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Running a piece of software is not one action. It is a
continuous process of tracking upstream changes, applying
patches, testing, releasing, and reacting to vulnerability
reports. A full software lifecycle management is required.
The license tells you that you may do all of this.
It does not tell you who will do it.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;The maintainers&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
In practice, the work is done by a handful of maintainers.
Many of them are volunteers; many work for companies whose
goals are not yours. You can read the code and inspect the
process, but goodwill is not a schedule, and an inbox
is not a SLA.
&#x3C;/p&#x3E;
&#x3C;h3&#x3E;The takeover&#x3C;/h3&#x3E;
&#x3C;p&#x3E;
Maintainers leave. When they do, you must find someone
to take over &#x2014; or become that person. In 2015 the
maintainer of the small npm package left-pad deleted it
from the registry. There was no vendor to call and no
contract to enforce. The package simply stopped existing
until someone else picked it up.
&#x3C;/p&#x3E;
&#x3C;h2&#x3E;Digital Sovereignty&#x3C;/h2&#x3E;
&#x3C;p&#x3E;
There is a way out of this. You buy the work back.
Companies sell maintenance, patches, and support for
open-source components, and that is a legitimate model.
But notice what it is. You have replaced one vendor SLA
with another. You have not removed the dependency.
You have changed the contract.
&#x3C;/p&#x3E;
</content:encoded>
</item>
<item>
<title>When Security Undermines Sovereignty</title>
<link>https://www.secure-platform.eu/security/2026/06/01/when-security-undermines-sovereignty.html</link>
<description>At CyCon 2026 we presented our work on hardware-enabled sovereignty. The core argument: standard cyber defense tooling trades sovereignty for security, and for long-lived critical systems that trade must be made deliberately in the hardware, not in another software layer.</description>
<author>Dominik Meyer</author>
<guid isPermaLink="true">https://www.secure-platform.eu/security/2026/06/01/when-security-undermines-sovereignty.html</guid>
<pubDate>Mon,  1 Jun 2026 00:00:00 +0000</pubDate>
<content:encoded>&#x3C;p&#x3E;At the 18th International Conference on Cyber Conflict (CyCon 2026) in Tallinn, 26&#x26;ndash;29 May 2026, my co-authors Rishab Somu, Ankur Jayaraj,
    and I presented our work on hardware-enabled sovereignty for military systems. One argument from the paper stands on its own,
    and it applies far beyond the military context we framed it in.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;The standard toolkit is the problem&#x3C;/h2&#x3E;

&#x3C;p&#x3E;In practice, critical systems today are protected by a stack of software services: endpoint detection and response, intrusion detection,
    cloud-based threat intelligence. None of these is a bad idea on its own. But they all do the same thing: they move part of the system&#x27;s
    security outside the operator&#x27;s own control.&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
  &#x3C;li&#x3E;Cloud integration means the security of your system depends on infrastructure you do not control, in jurisdictions you cannot audit.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;Every additional agent expands the attack surface of the very system it is supposed to protect.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;On classified systems, such integrations are often not allowed at all &#x26;mdash; the connection itself would compromise the classification level.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;p&#x3E;In practice, every security decision on a critical system is also a sovereignty decision &#x26;mdash; whether anyone treats it as one or not.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Then there is the timescale. Military and industrial systems are not refreshed every three years; they are built for ten to twenty years of
    operation. You cannot protect a system that has to run for two decades with tools whose providers may not exist in five.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;More security tooling means less sovereignty&#x3C;/h2&#x3E;

&#x3C;p&#x3E;For a system built for decades, the trade cannot be ignored. Piling on more tools makes it more resilient against known attacks &#x26;mdash; and
    less sovereign against the threats that matter most for long-lived systems: withdrawal, coercion, dependency. Every additional external
    dependency is a sovereignty leak: a path by which a vendor, a jurisdiction, or an attacker can reach into the system&#x27;s operation.&#x3C;/p&#x3E;

&#x3C;p&#x3E;More security or more sovereignty is a decision someone has to make. In practice it is usually made implicitly, one procurement at a
    time, one integration at a time &#x26;mdash; and a trade made that way is hard to reverse once a system is deployed. Where sovereignty is a
    requirement for the system, that decision has to be made deliberately and in the architecture: the security properties of the system are
    defined by the hardware it runs on, not by what is layered onto it.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Sovereignty, enabled by hardware&#x3C;/h2&#x3E;

&#x3C;p&#x3E;In the paper we demonstrate this with SOSA, the Sovereign Sensor and Actuator: a network sensor whose core is an application-specific
    processor SoC on FPGA. The core implements exactly the functionality the sensor requires, and nothing else. So the attack surface is not
    reduced by filtering or patching &#x26;mdash; it is reduced by absence. Only what the application requires is ever built, and what is not
    built cannot be exploited.&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
  &#x3C;li&#x3E;The components integrate independently into existing systems, without cloud dependencies.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;The minimal core is resilient against a wide range of attacks.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;We validated the approach with a working implementation adapted to a naval combat management system.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;p&#x3E;The same principle runs through our broader ASP research: trustworthiness by structural elimination. You do not add verification on top of
    a system; you build only what the application requires. That is what sovereignty means at the hardware layer.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;The takeaway&#x3C;/h2&#x3E;

&#x3C;p&#x3E;Sovereignty is often treated as a policy promise: a statement in a procurement document, a framework, a mandate. A promise does not make
    a system sovereign. Architecture does &#x26;mdash; sovereignty is a property the hardware gives the system, and no software layer can restore
    it once it is lost.&#x3C;/p&#x3E;

&#x3C;p&#x3E;For any system that must stay operational for the next twenty years, the trade between security and sovereignty has to be made somewhere:
    deliberately, in the architecture &#x26;mdash; or by default, one dependency at a time. In the silicon, or in the mandate.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The full paper is available in the &#x3C;a href=&#x22;/asp-research.html#meyer2026&#x22;&#x3E;publications&#x3C;/a&#x3E;: &#x3C;em&#x3E;Hardware-Enabled Sovereignty: Securing Military Systems Through a Novel and Resilient Defense Architecture&#x3C;/em&#x3E;, CyCon 2026.&#x3C;/p&#x3E;
&#x3C;p&#x3E;At the 18th International Conference on Cyber Conflict (CyCon 2026) in Tallinn, 26&#x26;ndash;29 May 2026, my co-authors Rishab Somu, Ankur Jayaraj,
    and I presented our work on hardware-enabled sovereignty for military systems. One argument from the paper stands on its own,
    and it applies far beyond the military context we framed it in.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;The standard toolkit is the problem&#x3C;/h2&#x3E;

&#x3C;p&#x3E;In practice, critical systems today are protected by a stack of software services: endpoint detection and response, intrusion detection,
    cloud-based threat intelligence. None of these is a bad idea on its own. But they all do the same thing: they move part of the system&#x27;s
    security outside the operator&#x27;s own control.&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
  &#x3C;li&#x3E;Cloud integration means the security of your system depends on infrastructure you do not control, in jurisdictions you cannot audit.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;Every additional agent expands the attack surface of the very system it is supposed to protect.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;On classified systems, such integrations are often not allowed at all &#x26;mdash; the connection itself would compromise the classification level.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;p&#x3E;In practice, every security decision on a critical system is also a sovereignty decision &#x26;mdash; whether anyone treats it as one or not.&#x3C;/p&#x3E;

&#x3C;p&#x3E;Then there is the timescale. Military and industrial systems are not refreshed every three years; they are built for ten to twenty years of
    operation. You cannot protect a system that has to run for two decades with tools whose providers may not exist in five.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;More security tooling means less sovereignty&#x3C;/h2&#x3E;

&#x3C;p&#x3E;For a system built for decades, the trade cannot be ignored. Piling on more tools makes it more resilient against known attacks &#x26;mdash; and
    less sovereign against the threats that matter most for long-lived systems: withdrawal, coercion, dependency. Every additional external
    dependency is a sovereignty leak: a path by which a vendor, a jurisdiction, or an attacker can reach into the system&#x27;s operation.&#x3C;/p&#x3E;

&#x3C;p&#x3E;More security or more sovereignty is a decision someone has to make. In practice it is usually made implicitly, one procurement at a
    time, one integration at a time &#x26;mdash; and a trade made that way is hard to reverse once a system is deployed. Where sovereignty is a
    requirement for the system, that decision has to be made deliberately and in the architecture: the security properties of the system are
    defined by the hardware it runs on, not by what is layered onto it.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;Sovereignty, enabled by hardware&#x3C;/h2&#x3E;

&#x3C;p&#x3E;In the paper we demonstrate this with SOSA, the Sovereign Sensor and Actuator: a network sensor whose core is an application-specific
    processor SoC on FPGA. The core implements exactly the functionality the sensor requires, and nothing else. So the attack surface is not
    reduced by filtering or patching &#x26;mdash; it is reduced by absence. Only what the application requires is ever built, and what is not
    built cannot be exploited.&#x3C;/p&#x3E;

&#x3C;ul&#x3E;
  &#x3C;li&#x3E;The components integrate independently into existing systems, without cloud dependencies.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;The minimal core is resilient against a wide range of attacks.&#x3C;/li&#x3E;
  &#x3C;li&#x3E;We validated the approach with a working implementation adapted to a naval combat management system.&#x3C;/li&#x3E;
&#x3C;/ul&#x3E;

&#x3C;p&#x3E;The same principle runs through our broader ASP research: trustworthiness by structural elimination. You do not add verification on top of
    a system; you build only what the application requires. That is what sovereignty means at the hardware layer.&#x3C;/p&#x3E;

&#x3C;h2&#x3E;The takeaway&#x3C;/h2&#x3E;

&#x3C;p&#x3E;Sovereignty is often treated as a policy promise: a statement in a procurement document, a framework, a mandate. A promise does not make
    a system sovereign. Architecture does &#x26;mdash; sovereignty is a property the hardware gives the system, and no software layer can restore
    it once it is lost.&#x3C;/p&#x3E;

&#x3C;p&#x3E;For any system that must stay operational for the next twenty years, the trade between security and sovereignty has to be made somewhere:
    deliberately, in the architecture &#x26;mdash; or by default, one dependency at a time. In the silicon, or in the mandate.&#x3C;/p&#x3E;

&#x3C;p&#x3E;The full paper is available in the &#x3C;a href=&#x22;/asp-research.html#meyer2026&#x22;&#x3E;publications&#x3C;/a&#x3E;: &#x3C;em&#x3E;Hardware-Enabled Sovereignty: Securing Military Systems Through a Novel and Resilient Defense Architecture&#x3C;/em&#x3E;, CyCon 2026.&#x3C;/p&#x3E;
</content:encoded>
</item>
</channel>
</rss>