Regional hardware provider activation (GOST / SM) — operator procedure
Status: Software composition DONE; production hardware proof requires operator-supplied hardware and a Stella Ops activation (OSK-P6, sprint SPRINT_20260718_009_Authority_operator_signing_key_lifecycle.md). Audience: operators standing up a regional (Russian GOST / Chinese SM) production signing deployment. Related: regional-signing.md (which tree signs and how registration works), hsm-pkcs11-deployment-health.md (PKCS#11 health/fail-closed), sm-remote-vendor-adapter-contract.md (the SM HTTP adapter contract — read-only reference; do not duplicate here), ADR-025 (operator-signed decisions; the SM_SOFT_ALLOWED verify-gate caveat).
Why this page exists
The regional signing holders are already delivered as plugins/libraries and composed into the production hosts and the regional CLI distributions — no rebuild is needed to obtain the wiring. What is not free is the hardware: a GOST PKCS#11 token or licensed CryptoPro host, and an OSCCA-certified SM HSM reachable through the SmRemote bridge. Those are procured, provisioned, and (for the licensed distribution builds) activated with Stella Ops. This page is the controlled hardware sign → verify → tamper procedure an operator runs to produce genuine production evidence, and it names exactly which knobs and credentials that requires.
The software providers (ru.openssl.gost, cn.sm.soft) are evaluation only. A signature they produce is never production proof — the environment/production guards refuse them outside Development/Testing (see regional-signing.md).
What already ships (no operator build)
The default-ALC ICryptoProvider registry composes the production holders when a regional profile is active and a certified backend is confirmed:
- GOST verification:
ru.bouncycastle.gost(managed, verify-only) — always registered forgost(src/__Libraries/StellaOps.Cryptography.HostProviders/RegionalCryptoRegistration.cs:134). - GOST production holder:
ru.pkcs11(PKCS#11 token) is registered in Staging/Production (RegionalCryptoRegistration.cs:157);ru.cryptopro.csp(CryptoPro CSP) is kept in the preference order when a distribution supplies it (RegionalCryptoRegistration.cs:162-163). - SM verification facade:
SmVerificationOnlyCryptoProvider(cn.sm.softhint, cannot sign even ifSM_SOFT_ALLOWEDis set) (RegionalCryptoRegistration.cs:197-198). - SM production holder:
cn.sm.remote.http(SmRemoteHttpProviderover a typedSmRemoteHttpClient) with the production probe/contract/key-mapping guards forced on (RegionalCryptoRegistration.cs:200-222). - CLI distributions:
CliRegionalCryptoComposition.AddDistributionProviders(src/Cli/StellaOps.Cli/CliRegionalCryptoComposition.cs:23) registers the GOST holders (AddBouncyCastleGostProvider/AddOpenSslGostProvider/AddPkcs11GostProvider/AddCryptoProGostProvider, lines 35-38, underSTELLAOPS_ENABLE_GOST) and the SM holders (AddSmSoftCryptoProvider/AddSmRemoteCryptoProvider, lines 42-43, underSTELLAOPS_ENABLE_SM), called once fromsrc/Cli/StellaOps.Cli/Program.cs:74.
All of the above live under src/__Libraries/StellaOps.Cryptography.Plugin.* and src/SmRemote/ — they are plugins/libraries, activated by composition/configuration, not by editing code.
Prerequisites (operator-supplied)
| Region | Required hardware / service | Provider id | Build/distribution flag |
|---|---|---|---|
| GOST (PKCS#11 token) | A PKCS#11 GOST HSM/token (e.g. Rutoken, JaCarta) with a provisioned GOST R 34.10-2012 keypair + certificate | ru.pkcs11 | portable production host (no special build) |
| GOST (CryptoPro CSP) | A licensed CryptoPro CSP host (Windows) with the operator’s GOST keypair in the CSP store | ru.cryptopro.csp | StellaOpsEnableCryptoPro=true build (STELLAOPS_ENABLE_GOST CLI distribution) |
| SM (OSCCA SM-HSM) | An OSCCA-certified SM HSM reachable via the SmRemote service (sm-hsm, sdf, or pkcs11 adapter kind) | cn.sm.remote.http | SmRemote service deployed (STELLAOPS_ENABLE_SM CLI distribution) |
Also required: network reachability + credentials for the token/HSM, a maintenance/rollback window (migrations are forward-only; recover by snapshot), and — for the licensed regional distribution builds — activation with Stella Ops (see Activation contact).
Configuration (production)
Set these on the signing hosts (Signer, Attestor) and the regional CLI. Verify every key against src/ before relying on it — config keys drift.
Select the profile and confirm the certified backend
# gost | sm (aliases russia | china normalize). Set on every signing-aware host.
STELLAOPS_CRYPTO_PROFILE=gost # or: StellaOps:Crypto:Profile
StellaOps:Crypto:CertifiedBackendConfirmed=true
Without CertifiedBackendConfirmed=true (or a profile alias that names the backend, e.g. gost-hsm, china-sm-hsm, russia-cryptopro), a regional profile in Staging/Production fails closed at startup and never falls back to ES256 — this is the sovereignty guarantee, not a bug (RegionalCryptoRegistration.cs:138-148,181-190).
GOST — PKCS#11 token (StellaOps:Crypto:Pkcs11:Keys[])
Per-key descriptor (src/__Libraries/StellaOps.Cryptography.Plugin.Pkcs11Gost/Pkcs11GostKeyOptions.cs):
| Key | Purpose |
|---|---|
KeyId | logical key id referenced by the signing-key entry |
Algorithm | GOST12-256 (default GostR3410_2012_256) or GOST12-512 |
LibraryPath | path to the vendor PKCS#11 .so/.dll |
SlotId / TokenLabel | token selector |
PrivateKeyLabel / PublicKeyLabel | on-token object labels |
UserPin or UserPinEnvironmentVariable | PIN (prefer the env-var indirection; never commit a PIN) |
CertificatePath / CertificatePem / CertificateThumbprint | public certificate the provider loads at startup (native token probing is deferred to first sign) |
CertificateStoreLocation / CertificateStoreName | Windows store lookup (CryptoPro/host-store keys) |
GOST — CryptoPro CSP
Bind StellaOps:Crypto:CryptoPro (CryptoProGostProviderOptions), build/deploy the host with StellaOpsEnableCryptoPro=true, and set the signing-key entry provider: "ru.cryptopro.csp".
SM — SmRemote HSM bridge (StellaOps:Crypto:SmRemote)
src/__Libraries/StellaOps.Cryptography.Sm.Contracts/SmRemoteProviderOptions.cs:
| Key | Production value |
|---|---|
BaseAddress | absolute URI of the SmRemote service (required; startup throws otherwise) |
RequireVendorAdapterContract | forced truein Production — a real vendor-adapter response is validated |
ExpectedAdapterKind | sm-hsm, sdf, or pkcs11 |
ExpectedContractVersion | defaults to sm-remote-vendor-adapter.v1 |
SkipProbe | forced falsein Production — the live probe cannot be skipped |
AllowImplicitKeyMapping | forced falsein Production — every logical key must be mapped explicitly |
Keys[] | { KeyId, RemoteKeyId } pairs mapping each logical key to a remote holder key |
The three forced flags are applied by the host PostConfigure (RegionalCryptoRegistration.cs:201-209); operator config cannot downgrade a Production SM host to a skipped/simulator-shaped probe. The SmRemote endpoint/response contract itself is specified in sm-remote-vendor-adapter-contract.md — follow it, do not re-derive it here.
Signing-key entries (Attestor)
Attestor:Signing:Keys[] = { keyId, provider, algorithm, providerKeyId }
# GOST PKCS#11 : provider "ru.pkcs11" algorithm "GOST12-256"
# GOST CryptoPro: provider "ru.cryptopro.csp" algorithm "GOST12-256"
# SM HSM : provider "cn.sm.remote.http" algorithm "SM2" providerKeyId = mapped RemoteKeyId
The controlled forcing run (sign → verify → tamper)
Run this against the real token/HSM, capturing raw command output as evidence. It mirrors the earlier software-token live proof (2026-07-16-regional-signing-live) but must be executed on certified hardware to count for OSK-P6.
- Bring up the regional stack with the certified backend mounted:
Confirm the host started (no fail-closed error) and the provider resolves:# GOST: docker-compose.compliance-russia.yml + docker-compose.crypto-provider.cryptopro.yml # SM: docker-compose.compliance-china.yml + docker-compose.crypto-provider.smremote.yml docker compose -f devops/compose/docker-compose.stella-ops.yml -f <region-overlay> -f <backend-overlay> up -dstella crypto profiles --detailslistsru.pkcs11/ru.cryptopro.csp/cn.sm.remote.httpas a signing-capable provider. - Sign a fixture artifact with the hardware provider and the mapped key:
Confirm the DSSE/JWSstella crypto sign --input artifact.tar.gz --provider gost-cryptopro --key-id <prod-key> # GOST stella crypto sign --input artifact.tar.gz --provider sm-remote --key-id <prod-key> # SMalgorithmIdisGOST12-256/SM2and thekeyidresolves to the enrolled hardware key (never ES256). - Verify the signature end-to-end:
Expect a pass with the regional algorithm reported.stella crypto verify --input artifact.tar.gz --signature <sig> --provider <same> --key-id <prod-key> - Tamper — flip one byte of the payload (keeping it valid JSON where applicable) and re-verify; expect a hard verification failure. A tamper that still verifies is a stop-the-line defect.
- Restore the stack to healthy and record the run.
Evidence to capture
- Provider-resolution output showing the certified provider (not a software token).
- Sign output with the regional
algorithmId+ hardwarekeyid. - Verify pass, then the tamper-induced verify failure.
- The token/HSM model + adapter kind, and confirmation
CertifiedBackendConfirmedwas set (or a backend-naming alias was used). No PINs/secrets in the evidence.
Store under docs/qa/feature-checks/runs/<date>-regional-hardware-<region>/ and link it from the sprint Execution Log.
Activation contact
The Russian GOST and Chinese SM regional holders ship as licensed plugins/libraries. Turning them on for production — obtaining the CryptoPro-enabled/regional distribution build, the vendor adapter, and the activation for a specific deployment — is a supported action, not a self-service console toggle. From the console the regional hardware provider blocks surface an honest activation note rather than dead-ending in inert controls (see the Cryptography Configuration page, system/cryptography).
To activate regional hardware providers, contact support@stella-ops.org.
(That address is the canonical Stella Ops crypto-support contact — see docs/modules/cli/guides/crypto/crypto-commands.md.)
