feat(applet): StepUpApplet derives session keys on SELECT when armed
After AUTH1 parks StepUpSK in SessionContext, the reader issues SELECT to the Step-Up AID per spec §10.2. StepUpApplet.select() now picks up the parked SK, derives StepUpSKDevice / StepUpSKReader via the §8.4.3 HKDF (already implemented in AliroCrypto.deriveStepUpSessionKeys), and stages both in transient CLEAR_ON_DESELECT fields for the ENVELOPE (M1C.1) and EXCHANGE (M1B.1) handlers. Introduces CryptoSingletons -- a lazy package-private holder for the single AliroCrypto instance shared between AliroApplet and StepUpApplet. Saves ~352 B of transient (kdfWorkbuf + hkdfPrevT + expandScratch) versus a per-applet duplicate. Java Card forbids new in <clinit> so the singleton uses lazy null-check init. Opt 1 prelude per docs/plans/2026-06-11-step-up-implementation-v2.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package com.dangerousthings.aliro;
|
||||
|
||||
/**
|
||||
* Lazy holders for crypto objects shared between {@link AliroApplet} and
|
||||
* {@link StepUpApplet}. Both applets live in the same package and only one
|
||||
* is selected at a time, so the shared instances are safe — Java Card runs
|
||||
* one applet at a time and the JCRE serializes APDU dispatch.
|
||||
*
|
||||
* <p>Java Card forbids {@code new} in {@code <clinit>}, so the getter lazy-
|
||||
* creates on first call. Subsequent calls return the cached instance. The
|
||||
* combined transient footprint of one shared {@link AliroCrypto} is roughly
|
||||
* 352 B (kdfWorkbuf 64 + hkdfPrevT 32 + expandScratch 256); without this
|
||||
* sharing each applet would allocate its own.
|
||||
*/
|
||||
final class CryptoSingletons {
|
||||
|
||||
private static AliroCrypto aliroCrypto;
|
||||
|
||||
private CryptoSingletons() { }
|
||||
|
||||
/** Returns the process-wide {@link AliroCrypto} instance. Allocates on
|
||||
* first call; cheap thereafter. */
|
||||
static AliroCrypto getAliroCrypto() {
|
||||
if (aliroCrypto == null) {
|
||||
aliroCrypto = new AliroCrypto();
|
||||
}
|
||||
return aliroCrypto;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user