eUICC Applet Development: Security and Architecture Considerations

Building Java Card applets is one thing. Building applets that live on eUICC silicon, alongside operator profiles and inside a telecom-context lifecycle, is another. The basics carry over — state machines, key roles, transactions, transient vs persistent storage — but the surrounding environment imposes its own constraints. This article walks through what changes when an applet is targeted at eUICC, and what an engineering team should expect. It is written from Ambimat’s own eUICC and secure-element engineering practice: Ambimat Electronics develops Java Card applets for eUICC and secure elements, and delivers them as a signed CAP file with source. Ambimat is not an SM-DP+ operator and does not run remote SIM provisioning infrastructure.

eSIM applet development is not eSIM app development

These two phrases are often used interchangeably, and they describe completely different engineering work. The distinction matters before anything else on this page makes sense.

  • eSIM app development means building a mobile or web application that manages eSIM profiles from the outside — a companion app that scans an activation QR code, calls an LPA or a subscription-management API, and lets a user download or switch a profile. It runs on the handset operating system, in ordinary application code.
  • eSIM or eUICC applet development means building code that runs inside the eUICC itself — a Java Card applet, compiled to a CAP file, installed into a Security Domain on the secure element, executing on the card's runtime environment behind the same tamper boundary that protects the operator's own credentials.

An eSIM app can be rewritten and redeployed in an afternoon. An applet is loaded under keys, subject to the platform's authorization rules, and constrained by profile lifecycle and available non-volatile memory. The rest of this article is about the second kind of work.

The eUICC environment

An eUICC is a Secure Element with a specific operating system and a defined set of behaviors around operator profiles. Concretely, that means:

  • The eUICC OS manages profiles — installing them, enabling and disabling them, deleting them.
  • The OS exposes a remote-management interface that operators use to provision and manage profiles.
  • The eUICC enforces isolation between profiles and between the platform and applet code.
  • Security Domains structure who can do what, with documented authorization rules.

Applets that live on this silicon need to compose with these behaviors — not against them.

Where applets sit

Applets on an eUICC live in one of several places, depending on the deployment:

  • Inside the operator profile container — applets that are part of a specific profile and only active when that profile is enabled.
  • In the issuer security domain — applets installed under the eUICC issuer's authority.
  • Under a service-provider security domain — applets owned by a non-operator party with delegated authority.
  • In the platform / OS layer — typically vendor-supplied, not application code.

The location of an applet has direct consequences for its lifecycle, its access to keys, and the parties with authority over it. Choosing the wrong location is one of the more common design mistakes.

Security domains, briefly

Global Platform's Security Domain model is the structure underneath applet authorization on eUICC. Each Security Domain has its own keys, controls who can install and update applets within it, and isolates its applets from those in other domains. Designing applets without a clear Security Domain story is a way to discover surprises during operator review.

Lifecycle on eUICC

Applet lifecycle on a generic Java Card environment is already non-trivial. On eUICC it's compounded by profile lifecycle:

  • What does it mean for an applet to be "loaded" if it lives inside a disabled profile?
  • Does an applet's persistent state survive profile enable/disable cycles?
  • What happens to applets when a profile is deleted?
  • How does applet update work in the presence of profile-level operations?

The right answer depends on where the applet lives (per the previous section) and what role it plays. Applets designed without thinking about profile lifecycle tend to behave correctly only on the happy path.

From source to an installed applet instance

Between "we wrote an applet" and "the applet is running on a deployed eUICC" there is a defined chain of artefacts. Naming them makes the effort estimable:

  • Compile to a CAP file. Java Card source is compiled and converted into a CAP (converted applet) file — the deployable unit. The target Java Card version is dictated by the platform, not by preference; GSMA-compliant consumer eUICCs and the ETSI release the platform implements both set floors here.
  • Load. The CAP file is transferred to the card as a load block, authorised under the keys of the Security Domain that will own it. This is a GlobalPlatform operation, not a file copy.
  • Install and instantiate. Loading places the executable module on the card; installation creates a selectable applet instance with its own AID and its own privileges. One loaded package can back several instances.
  • Personalise. The instance is given its per-device data — identity keys, counters, configuration — through a controlled, usually secure-channel-protected process. This is where "one applet build" becomes "a million distinct device identities".
  • Manage over the lifetime. Updates, key rotation, and eventual deletion all run back through the same authorisation model.
Applet lifecycle states on a GlobalPlatform card, and the eUICC profile lifecycle that sits above them Two independent lifecycles drawn on one figure. The upper track is the artefact chain and the GlobalPlatform card states: Java Card source is converted to a CAP file, delivered as a load block authorised under a Security Domain's keys, and becomes an Executable Load File in the LOADED state. Installing creates an application instance with its own AID in the INSTALLED state; making it selectable moves it to SELECTABLE, after which personalisation moves it into an application-specific state. An instance can be moved to LOCKED and back, and deletion removes either the instance or the Executable Load File. The lower track is the SGP.22 profile lifecycle: a profile on an eUICC is disabled or enabled, and can be deleted; only one profile is enabled at a time. An applet carried inside a profile is subject to both tracks at once. OFF-CARD ARTEFACTS Java Card source version set by platform CAP file the deployable unit load block authorised under SD keys crosses onto the card here ON-CARD STATES — GLOBALPLATFORM install make selectable personalise LOADED Executable Load File INSTALLED instance has an AID SELECTABLE reachable by SELECT APPLICATION-SPECIFIC e.g. PERSONALIZED — per-device data lock / unlock — reversible LOCKED delete — authorised, not a file removal deleted instance, or the whole load file ABOVE IT ON AN eUICC — PROFILE LIFECYCLE, SGP.22 disabled enable disable enabled one at a time profile deleted An applet carried inside a profile is subject to both tracks at once. Which of the two governs its state and its stored data is a design decision, not a default — see the questions in the previous section.
Standards-level applet lifecycle. The upper two tracks are GlobalPlatform card states and are independent of eSIM; the lower track is the SGP.22 profile lifecycle that an eUICC adds on top. Nothing here is specific to any toolchain or deployment — it is the state model the specifications define, drawn so the two axes can be seen at once. Read together with the questions above: the diagram shows where the two lifecycles meet, not what your applet should do when they do.

For an applet embedded in an operator profile rather than installed post-issuance, the same artefacts appear earlier: the load block is carried inside the profile package itself, so the applet arrives with the profile rather than being pushed to the card afterwards. That choice changes who has to be involved and when — which is usually the first thing worth settling in a project.

Trust boundaries to draw explicitly

  • Applet ↔ host firmware: a small, well-defined command interface; never an inferred trust relationship.
  • Applet ↔ other applets on the same SE: assume isolated unless explicitly configured.
  • Applet ↔ operator profile: if the applet lives inside a profile, define what it does when the profile changes state.
  • Applet ↔ remote management: applets sensitive to remote management commands should authenticate them, not just receive them.

Identity workflows on eUICC

For identity-bearing applets (the kind we mostly build), the eUICC environment changes how the workflow is structured:

  • Per-device identity keys live inside the applet's persistent storage.
  • Issuance happens through a controlled provisioning path coordinated with the eUICC issuer or service-provider domain.
  • Re-provisioning composes with profile lifecycle — applet state may need to survive profile changes that the device makes for unrelated reasons.
  • Attestation produced by the applet should be verifiable by the relying party even when the device's profile state has changed.

Common mistakes

  • Designing applets without a Security Domain plan, then discovering authorization surprises during integration.
  • Putting applet state in a place that disappears when an operator profile is disabled.
  • Treating remote-management commands as authenticated by default.
  • Building applets that depend on a specific eUICC OS quirk, making them fragile across vendors.
  • Not exercising profile enable/disable cycles in test, then discovering broken state in the field.

Building for review in a telecom context

An applet that's going to be reviewed by an operator security team has a higher bar than a generic Java Card applet:

  • Document Security Domain choices and the authority model.
  • Document profile lifecycle interaction explicitly.
  • Document what survives profile changes and what doesn't.
  • Show test vectors that exercise lifecycle transitions, not just the happy path.
  • Be explicit about vendor-specific dependencies and why you took them.

Where this fits

eUICC applet development sits inside a wider eSIM / eUICC capability picture. The eSIM / eUICC capability page describes the engineering scope; the Java Card article (link) covers the underlying applet patterns; the telecom integration page (link) covers how this work composes with operator collaboration.

Building applets for eUICC is not Java Card with a different filename. It's Java Card composed with profile lifecycle, security domains, and a telecom-context review process. Designing for that composition early saves a lot of late surprise.

What an eUICC applet engagement involves

Teams asking about applet development usually want to know what the work actually consists of before they can scope it. In broad terms:

  • Establishing the platform target. Which eUICC, which Java Card and GlobalPlatform versions, which ETSI release, and what the card issuer will and will not authorise. This constrains everything downstream.
  • Agreeing the Security Domain and authority model. Who owns the applet's lifecycle, whose keys load it, and what happens at profile switch. Deciding this late is the most common source of rework.
  • Designing the command interface and state model. A small, reviewable APDU surface; explicit transient versus persistent storage; transaction boundaries that survive power loss mid-operation.
  • Implementation and functional testing against the target platform, not only against a simulator — simulator-only behaviour is where interoperability surprises hide.
  • Personalisation and production-flow design, including how per-device keys are generated and injected.
  • Review material. Operator and issuer security teams ask for the authority model, the lifecycle interaction, and the failure behaviour in writing.

Ambimat's engineering team works at this layer — see the eSIM & eUICC engineering capability for scope, or start a technical discussion if you want to walk a specific applet design.

Conclusion

eUICC is the most realistic place for IoT-grade identity applets to live, and it imposes its own structure on the way applets are designed. Engineering teams that respect that structure — Security Domains, profile lifecycle, remote management, vendor independence — produce applets that survive operator review. Teams that don't tend to discover the structure during integration, when changes are most expensive.

FAQ

Should an applet live in the issuer Security Domain or a service-provider Security Domain?

It depends on who owns the applet's lifecycle. An applet owned by the eUICC issuer typically lives in the issuer SD; an applet owned by a service provider with delegated authority lives in its own SD.

Can applet state survive profile changes?

Depending on where the applet lives, yes — but only if it's designed to. Applets that depend on assumptions about profile state can be surprised by a profile disable.

How portable are eUICC applets across vendors?

Java Card portability gets you most of the way, but vendor-specific OS behaviors and Security Domain conventions can introduce friction. Documenting dependencies makes the friction visible early.

What language and runtime do eUICC applets use?

Java Card — applets run on the Java Card runtime inside the secure element, isolated from each other by the applet firewall.

How is an applet tested before it reaches production silicon?

Against the documented security domains and lifecycle states, with behaviour, key inventory, and trust boundaries written down so the applet can survive review.

eUICCJava CardAppletSecurity DomainProfile lifecycle

Related capability: eSIM / eUICC · Telecom Integration

Building eUICC applets for a connected product?

We're glad to walk Security Domain choices, lifecycle, and review material with engineering teams.

Request Technical Discussion