Third-Party & Supply Chain Evidence

Evidence of vendor assessments, sub-processor management, dependency security scanning, and supply chain controls

Public

Status: pre-launch. This evidence reflects implemented code and deployed infrastructure. Provii is not yet serving end-user production traffic, so production operational metrics and audit history are not yet available.

Third-Party Dependencies & Vendor Management Evidence

Document Version: 1.0 Date: 2025-11-08 Author: Maelstrom AI Control Scope: UC-070, UC-144 through UC-148 (Vendor/Supply Chain Management)


Executive Summary

This document provides evidence of Maelstrom AI’s third-party dependencies, vendor relationships, and supply chain security controls. The evidence demonstrates:

  • Complete vendor inventory (critical cloud providers, development tools, package registries)
  • dependency tracking across Rust, JavaScript/TypeScript, Android, and iOS ecosystems
  • SLSA Level 3 supply chain security implementation
  • Automated security scanning via Dependabot, cargo audit, and npm audit
  • License compliance with open source dependencies
  • Signed commits and verified builds designed to ensure artifact integrity

Table of Contents

  1. Critical Third-Party Vendors
  2. Rust Dependencies (Cargo)
  3. JavaScript/TypeScript Dependencies (npm)
  4. Mobile Dependencies
  5. Supply Chain Security
  6. Dependency Security Scanning
  7. License Compliance
  8. Sub-Processors & Data Processing
  9. Control Mapping

Critical Third-Party Vendors

1. Cloudflare (Critical - Complete Service Dependency)

Services Used:

  • Cloudflare Workers (serverless compute)
  • Cloudflare KV (key-value storage)
  • Cloudflare Durable Objects (stateful compute)
  • Cloudflare Workers Assets (static site serving)
  • Cloudflare Workers Logs (structured console.log JSON shipped to Grafana Loki)
  • Cloudflare DDoS Protection
  • Cloudflare Secrets Store

Criticality: HIGH - Complete infrastructure dependency

Security Assessment:

  • ✅ SOC 2 Type II certified
  • ✅ ISO 27001 certified
  • ✅ Enterprise SLA (99.99% uptime)
  • ✅ Regular security audits published
  • ✅ GDPR-compliant data processing

Contract Terms:

  • Data Processing Agreement in place
  • Security and privacy provisions
  • Incident notification requirements
  • Right to audit

Monitoring:

  • status.cloudflare.com for outages
  • Security advisories reviewed
  • Annual contract review

Evidence:

  • provii-verifier/wrangler.toml - Production configuration
  • provii-issuer/worker/wrangler.toml - Issuer service configuration
  • /trust/security/supplier-management.md - Vendor management documentation

Data Flows:

  • Verifier API: Challenge storage (5-minute TTL, enforced by KV expiration_ttl at provii-verifier/src/routes/challenge.rs:854), audit logs (90-day retention, enforced by KV expiration_ttl(7_776_000) at provii-verifier/src/routes/csp_report.rs:293, which comments “TTL: 90 days matching audit log retention”; critical security event logs are retained for up to 365 days)
  • Issuer API: Encrypted credential issuance, officer authentication
  • All services: IP address logging (90-day retention for abuse prevention, hashed via HMAC-SHA-256 keyed by PII_HASH_KEY before persistence; critical security event logs are retained for up to 365 days)

2. GitHub (Critical - Development Dependency)

Services Used:

  • GitHub source control (Git hosting)
  • GitHub Actions (CI/CD pipelines)
  • GitHub Packages (artifact hosting)
  • GitHub Advanced Security (Dependabot, CodeQL, secret scanning)
  • GitHub Container Registry

Criticality: HIGH - Development and deployment dependency

Security Assessment:

  • ✅ SOC 2 Type II certified
  • ✅ GitHub Advanced Security features enabled
  • ✅ Bug bounty program
  • ✅ Regular security updates
  • ✅ SLSA Level 3 build infrastructure

Contract Terms:

  • GitHub Enterprise Cloud agreement
  • Data Protection Addendum
  • Security features included

Monitoring:

  • GitHub status page
  • Security advisories
  • Dependabot alerts

Evidence:

  • provii-verifier/.github/workflows/ci.yml - CI pipeline
  • provii-agegate/.github/workflows/secure-build.yml - SLSA Level 3 build
  • provii-mobile-sdk/.github/workflows/secure-build.yml - Secure build pipeline
  • provii-agegate/.github/dependabot.yml - Dependency scanning
  • provii-issuer/.github/dependabot.yml - Dependabot config

3. npm Registry (Medium - JavaScript Build Tooling)

Services Used:

  • npm package registry (build-time development dependencies for TypeScript repos)
  • npm provenance (SLSA attestations for internal build artefacts)

Criticality: MEDIUM - Build-time dependency resolution for TypeScript services and tooling

provii-agegate ships via CDN only (cdn.provii.app). There is no npm package for provii-agegate. npm is used as a build-time dependency manager for the TypeScript projects (admin-portal, provii-management, provii-docs, provii-agegate build toolchain) but not as a distribution channel for the browser SDK.

Security Assessment:

  • SRI hashes on CDN-served provii-agegate bundles
  • npm audit integration for build-time dependencies
  • Hermetic builds with package-lock.json
  • 2FA required for npm publishing (internal tooling only)

Supply Chain Controls:

  • Hermetic builds with package-lock.json
  • SLSA Level 3 provenance generation
  • Sigstore keyless signing for CDN bundles
  • SRI hash generation for browser bundles

Evidence:

  • provii-agegate/.github/workflows/secure-build.yml - CDN publish and SRI hash generation

4. Crates.io (Medium - Rust Package Registry)

Services Used:

  • Rust crate registry (dependency resolution)

Criticality: MEDIUM - Build-time dependency only

Security Assessment:

  • ✅ cargo audit integration
  • ✅ Cargo.lock hermetic builds
  • ✅ Crate verification

Supply Chain Controls:

  • All Rust projects use Cargo.lock for deterministic builds
  • cargo audit runs in CI/CD (deny warnings)
  • cargo deny for license compliance

Evidence:

  • provii-verifier/.github/workflows/ci.yml - Lines 74-85 (cargo audit)
  • provii-issuer/.github/workflows/security-audit.yml - security scanning

5. CocoaPods / Swift Package Manager (Low - iOS Dependency Management)

Services Used:

  • CocoaPods registry (YubiKit dependency)

Dependencies:

  • YubiKit (YubiKey hardware authentication)

Criticality: LOW - Single optional hardware authentication dependency

Evidence:

  • provii/ios/Podfile - iOS dependency specification

6. Maven Central / Google Maven (Low - Android Dependency Management)

Services Used:

  • Maven Central (Android libraries)
  • Google Maven (AndroidX, Compose)

Criticality: LOW - Standard Android development dependencies

Evidence:

  • provii/android/app/build.gradle.kts - Android dependency specification

Rust Dependencies (Cargo)

Core Cryptographic Dependencies

Critical Zero knowledge Proof Libraries:

File: provii-crypto/Cargo.toml

# Core cryptography dependencies
bellman = { version = "0.14", default-features = false, features = ["groth16"] }
bls12_381 = "0.8"
jubjub = "0.10"
redjubjub = "0.8"
blake2 = "0.10"
blake2s_simd = "1.0"
sha2 = "0.10"
secp256k1 = "0.31.1"
blstrs = "0.7"

# Zero-knowledge proof utilities
ff = "0.13"
group = "0.13"
rand_core = "0.6"
rand = "0.8"
subtle = "2.6"
zcash_proofs = { version = "0.24", default-features = false }
zcash_primitives = { version = "0.24", default-features = false }
sapling-crypto = { version = "0.5", default-features = false, features = ["circuit"] }

Security Properties:

  • All cryptographic libraries are widely-audited open source projects
  • bellman: Groth16 zk-SNARK implementation (used by Zcash, extensively audited)
  • bls12_381: BLS12-381 elliptic curve (IETF standard)
  • jubjub: Twisted Edwards curve (Zcash Sapling protocol)
  • redjubjub: Schnorr signatures on Jubjub curve

License: All MIT OR Apache-2.0 (permissive, no copyleft)

Verifier API Dependencies

File: provii-verifier/Cargo.toml

Core Runtime:

worker = "=0.6.1"  # Cloudflare Workers runtime
worker-kv = "=0.9.0"  # KV storage client
getrandom = { version = "0.2", features = ["js"] }  # WASM-compatible RNG

Cryptography:

sha2 = "0.10"
blake2 = "0.10"
blake3 = "1.5"
base64 = "0.22"
hmac = "0.12"
zeroize = { version = "1.7", features = ["derive"] }
argon2 = { version = "0.5", features = ["std"] }

Serialization:

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
prost = "0.12"  # Protocol Buffers

Lints Configuration (Lines 111-133):

[lints.rust]
unsafe_code = "forbid"  # No unsafe Rust allowed
missing_docs = "warn"

[lints.clippy]
unwrap_used = "warn"
expect_used = "warn"
panic = "warn"

This demonstrates secure coding practices enforcement at the compiler level.

Issuer API Dependencies

File: provii-issuer/worker/Cargo.toml

WebAuthn Support:

p256 = { version = "0.13", features = ["ecdsa"] }  # P-256 ECDSA
ecdsa = { version = "0.16", features = ["verifying", "der"] }

Key Derivation:

hkdf = "0.12"  # HMAC-based Key Derivation Function
aes-gcm = "0.10"  # Envelope encryption for signing keys
argon2 = { version = "0.5", features = ["std"] }  # API key hashing

Compression:

flate2 = { version = "1", default-features = false, features = ["rust_backend"] }

Wallet SDK Dependencies

File: provii-mobile-sdk/Cargo.toml

Cross-Platform FFI:

uniffi = { version = "0.29", features = ["cli"] }  # Foreign Function Interface
uniffi_build = { version = "0.29", features = ["build"] }

Networking (HTTP/3):

quinn = "=0.11.7"  # QUIC implementation
h3 = "=0.0.8"  # HTTP/3
h3-quinn = "=0.0.10"  # HTTP/3 over QUIC
rustls = { version = "0.23", default-features = false, features = ["ring"] }
webpki-roots = "0.26"  # Root CA certificates

Parallel Proving:

rayon = "1.11"  # Thread pool for parallel proof generation

JavaScript/TypeScript Dependencies (npm)

provii-agegate Browser SDK

File: provii-agegate/package.json

Production Dependencies:

{
  "dependencies": {
    "qrcode": "^1.5.4",  // QR code generation
    "zod": "^3.25.64"    // Runtime type validation
  }
}

Development Dependencies (Lines 45-78):

Security Tools:

"eslint-plugin-security": "^3.0.1",      // Security linting
"eslint-plugin-sonarjs": "^3.0.2",       // Code quality
"@stryker-mutator/core": "^9.0.1",       // Mutation testing
"@playwright/test": "^1.53.0"            // E2E testing

Build Tools:

"esbuild": "^0.25.5",                    // Fast bundler
"typescript": "^5.8.3",                  // Type safety
"terser": "^5.42.0"                      // Minification

Testing:

"jest": "^29.7.0",                       // Unit testing
"fast-check": "^4.3.0"                   // Property-based testing

OpenAPI:

"openapi-typescript": "^7.8.0",          // Type generation from OpenAPI spec
"openapi-typescript-fetch": "^2.2.0"     // Type-safe API client

Total Dependencies: 79 (2 production, 77 development)


Mobile Dependencies

Android Dependencies

File: provii/android/app/build.gradle.kts

Core Android Libraries (Lines 135-151):

// Core Android
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")

// Compose (UI framework)
implementation(platform("androidx.compose:compose-bom:2024.02.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
implementation("com.google.android.material:material:1.11.0")

Security (Lines 161-163):

implementation("androidx.security:security-crypto:1.1.0-alpha06")  // EncryptedSharedPreferences
implementation("androidx.biometric:biometric:1.1.0")  // Biometric authentication

Camera & QR (Lines 165-172):

implementation("androidx.camera:camera-camera2:1.3.1")
implementation("androidx.camera:camera-lifecycle:1.3.1")
implementation("androidx.camera:camera-view:1.3.1")
implementation("com.google.mlkit:barcode-scanning:17.2.0")  // Google ML Kit
implementation("com.google.zxing:core:3.5.3")  // QR code generation

YubiKey Support (Lines 174-177):

implementation("com.yubico.yubikit:android:2.8.0")  // Core Android module
implementation("com.yubico.yubikit:yubiotp:2.8.0")  // OTP module

Dependency Injection (Lines 156-159):

implementation("com.google.dagger:hilt-android:2.48")
ksp("com.google.dagger:hilt-compiler:2.48")

Networking (Lines 179-181):

implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.squareup.retrofit2:retrofit:2.9.0")

Image Loading (Lines 186-188):

implementation("io.coil-kt:coil-compose:2.5.0")  // Image loading
implementation("io.coil-kt:coil-svg:2.5.0")  // SVG support

Total Android Dependencies: ~40 libraries

iOS Dependencies

File: provii/ios/Podfile

CocoaPods Dependencies:

platform :ios, '17.0'

pod 'YubiKit'  # YubiKey hardware authentication (Lightning + NFC)

Build Configuration (Lines 34-60):

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '17.0'
      config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

Total iOS Dependencies: 1 CocoaPod (YubiKit), rest are Apple frameworks


Supply Chain Security

SLSA Level 3 Implementation

Evidence:

  • /trust/developers/supply-chain-security.mdx
  • provii-agegate/.github/workflows/secure-build.yml
  • provii-mobile-sdk/.github/workflows/secure-build.yml

SLSA Requirements Implementation:

RequirementStatusEvidence
Build as CodeAll workflows in .github/workflows/
Ephemeral EnvironmentGitHub-hosted runners (fresh per build)
Isolated BuildsNo privileged access, minimal permissions
Hermetic BuildsCargo.lock, package-lock.json enforced
Signed ProvenanceSLSA provenance via slsa-github-generator
Non-falsifiableSigned with GitHub OIDC tokens
Two-person Review⚠️Not applicable for sole-operator; signed provenance and hermetic builds provide compensating controls

Hermetic Build Verification

provii-agegate (Lines 48-54 in secure-build.yml):

- name: Verify package-lock.json exists (hermetic build requirement)
  run: |
    if [[ ! -f package-lock.json ]]; then
      echo "❌ package-lock.json missing - required for reproducible builds"
      exit 1
    fi
    echo "✅ package-lock.json present"

provii-mobile-sdk (Lines 50-56 in secure-build.yml):

- name: Verify Cargo.lock exists (hermetic build requirement)
  run: |
    if [[ ! -f Cargo.lock ]]; then
      echo "❌ Cargo.lock missing - required for reproducible builds"
      exit 1
    fi
    echo "✅ Cargo.lock present"

Cryptographic Signing (Sigstore)

provii-agegate (Lines 196-236 in secure-build.yml):

- name: Install Cosign
  uses: sigstore/cosign-installer@v3
  with:
    cosign-release: v2.4.1

- name: Sign npm tarball
  env:
    COSIGN_EXPERIMENTAL: "true"
  run: |
    TARBALL=$(ls provii-agegate-*.tgz)
    cosign sign-blob \
      --bundle "${TARBALL}.cosign-bundle" \
      "${TARBALL}"

- name: Sign browser bundle
  env:
    COSIGN_EXPERIMENTAL: "true"
  run: |
    cosign sign-blob \
      --bundle dist/agegate.browser.js.cosign-bundle \
      dist/agegate.browser.js

Properties:

  • Keyless signing (no long-lived keys to leak)
  • OIDC-based authentication via GitHub
  • Signatures logged in Rekor transparency log
  • Non-repudiable cryptographic proof of origin

SLSA Provenance Generation

provii-agegate (Lines 254-267 in secure-build.yml):

provenance:
  name: Generate SLSA Provenance
  uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
  with:
    base64-subjects: "${{ needs.sign-artifacts.outputs.hashes }}"
    provenance-name: "provii-agegate.intoto.jsonl"
    upload-assets: true
    private-repository: true

provii-mobile-sdk (Lines 480-492 in secure-build.yml):

provenance:
  uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
  with:
    base64-subjects: "${{ needs.sign-artifacts.outputs.hashes }}"
    provenance-name: "provii-mobile-sdk.intoto.jsonl"
    upload-assets: true

Provenance Includes:

  • Build command and environment variables
  • Source repository and commit SHA
  • Builder identity (GitHub Actions)
  • All input materials (dependencies with hashes)
  • Output artifact hashes

SRI Hash Generation (Browser Bundles)

provii-agegate (Lines 132-145 in secure-build.yml):

- name: Generate SRI hash for browser bundle
  run: |
    # Generate SHA-384 SRI hash (standard for CDN integrity)
    SRI_HASH=$(openssl dgst -sha384 -binary dist/agegate.browser.js | openssl base64 -A)
    echo "sha384-${SRI_HASH}" > dist/agegate.browser.js.sri
    
    echo "✅ SRI hash generated:"
    cat dist/agegate.browser.js.sri

- name: Generate checksums for all artifacts
  run: |
    cd dist
    sha256sum *.js *.cjs *.d.ts > CHECKSUMS.txt
    cat CHECKSUMS.txt

This allows browsers to verify integrity:

<script 
  src="https://cdn.provii.app/sdk/provii-agegate/v0.1.1/agegate.browser.js"
  integrity="sha384-..." 
  crossorigin="anonymous"></script>

Dependency Security Scanning

Dependabot Configuration

provii-agegate (provii-agegate/.github/dependabot.yml):

version: 2
updates:
  - package-ecosystem: npm
    directory: "/"
    schedule: { interval: weekly }
    open-pull-requests-limit: 10
    commit-message: { prefix: "build:" }

provii-issuer (provii-issuer/.github/dependabot.yml):

Rust Dependencies (Lines 3-43):

- package-ecosystem: "cargo"
  directory: "/worker"
  schedule:
    interval: "weekly"
    day: "monday"
    time: "02:00"
  open-pull-requests-limit: 10
  reviewers:
    - "provii-security-team"
  commit-message:
    prefix: "deps"
    prefix-development: "deps-dev"
  labels:
    - "dependencies"
    - "rust"
    - "security"
  ignore:
    # Ignore major version updates for critical deps
    - dependency-name: "worker"
      update-types: ["version-update:semver-major"]
    - dependency-name: "wasm-bindgen"
      update-types: ["version-update:semver-major"]
  groups:
    crypto:
      patterns:
        - "sha*"
        - "blake2"
        - "hmac"
        - "aes-gcm"
        - "bls12_381"
        - "jubjub"

GitHub Actions (Lines 88-98):

- package-ecosystem: "github-actions"
  directory: "/"
  schedule:
    interval: "weekly"
    day: "monday"
  open-pull-requests-limit: 5
  labels:
    - "dependencies"
    - "github-actions"
    - "ci-cd"

cargo audit Integration

provii-verifier CI (provii-verifier/.github/workflows/ci.yml, Lines 74-85):

security:
  name: Security Audit
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    
    - name: Install cargo-audit
      run: cargo install cargo-audit
    
    - name: Run security audit
      run: cargo audit

provii-issuer Security Audit (provii-issuer/.github/workflows/security-audit.yml):

Daily Scheduled Scans (Lines 9-11):

schedule:
  # Run daily at 2 AM UTC
  - cron: '0 2 * * *'

Scanning (Lines 18-47):

cargo-audit:
  name: Cargo Audit - Dependency Vulnerabilities
  steps:
    - name: Install cargo-audit
      run: cargo install cargo-audit --locked
    
    - name: Run cargo audit
      run: |
        cd worker
        cargo audit --deny warnings --deny unmaintained --deny unsound --deny yanked
      continue-on-error: false

License Compliance (Lines 49-62):

cargo-deny:
  name: Cargo Deny - License & Security Compliance
  steps:
    - name: Install cargo-deny
      uses: taiki-e/install-action@cargo-deny
    
    - name: Run cargo deny
      run: |
        cd worker
        cargo deny check --hide-inclusion-graph

Dependency Review (Lines 64-76):

dependency-review:
  name: Dependency Review
  if: github.event_name == 'pull_request'
  steps:
    - name: Dependency Review
      uses: actions/dependency-review-action@v4
      with:
        fail-on-severity: high
        deny-licenses: GPL-3.0, AGPL-3.0

Trivy Vulnerability Scanner (Lines 78-98):

rust-security-scan:
  steps:
    - name: Run Trivy vulnerability scanner
      uses: aquasecurity/trivy-action@master
      with:
        scan-type: 'fs'
        scan-ref: 'worker'
        format: 'sarif'
        output: 'trivy-results.sarif'
        severity: 'CRITICAL,HIGH'
    
    - name: Upload Trivy results to GitHub Security
      uses: github/codeql-action/upload-sarif@v3
      with:
        sarif_file: 'trivy-results.sarif'

CodeQL Analysis (Lines 100-117):

codeql-analysis:
  steps:
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: 'rust'
    
    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3

npm audit Integration

provii-agegate secure-build (Lines 59-60):

- name: Run security audit
  run: npm audit --audit-level high

Fails the build if any high-severity vulnerabilities are found.


License Compliance

Rust Crates License Policy

File: provii-crypto/Cargo.toml (Line 25)

license = "MIT OR Apache-2.0"

All Maelstrom AI Rust crates use dual licensing:

  • MIT License (permissive, allows commercial use)
  • Apache License 2.0 (permissive, includes patent grant)

Third-party Rust dependencies are predominantly:

  • MIT OR Apache-2.0 (bellman, bls12_381, jubjub, etc.)
  • MIT (serde, tokio, anyhow, thiserror)
  • Apache-2.0 (some cryptographic libraries)

Enforcement: cargo deny checks for GPL-3.0, AGPL-3.0 violations (Lines 74-76 in security-audit.yml):

with:
  fail-on-severity: high
  deny-licenses: GPL-3.0, AGPL-3.0

JavaScript License Policy

provii-agegate uses MIT license for production dependencies:

  • qrcode: MIT
  • zod: MIT

Development dependencies are not distributed, so licensing is more permissive.

Mobile License Compliance

Android:

  • AndroidX: Apache 2.0
  • Jetpack Compose: Apache 2.0
  • YubiKit: Apache 2.0
  • All Google libraries: Apache 2.0

iOS:

  • YubiKit: Apache 2.0
  • Apple frameworks: Proprietary (included with Xcode)

No GPL/AGPL dependencies in production builds.


Sub-Processors & Data Processing

The canonical sub-processor roster, complete with per-processor data-flow tables, DPA references, audit rights, and transfer mechanisms, is maintained at /legal/sub-processors (version 1.1, effective 14 April 2026). This section summarises the production sub-processors engaged for the age verification platform and the docs interactive sandbox. It is reconciled against the canonical list on every management review.

Infrastructure sub-processors

Cloudflare, Inc. operates as a data processor and handles hashed source IP addresses (HMAC-SHA-256 keyed by PII_HASH_KEY), challenge nonces (ephemeral), pseudonymous session identifiers, sandbox credential identifiers with docs-sbx-* and mwallet-sbx-* prefixes, request and response bodies traversing the Workers runtime, and audit and security telemetry events.

FieldDetail
Data locationCloudflare global edge network; traffic served from the data centre nearest the requester
GDPR complianceCloudflare master Data Processing Addendum, EU SCCs (Decision 2021/914, Module 2), UK IDTA for UK transfers
Security certificationsSOC 2 Type II, ISO 27001, ISO 27018, PCI DSS Level 1 for relevant services
EncryptionTLS 1.3 in transit, AES-256-GCM at rest

Mobile attestation sub-processors

Apple Inc. operates the App Attest service as a data processor for the attestation result returned to Provii. It handles Apple-issued attestation public key, attestation receipt, app bundle identifier, and key identifier. It does not receive an Apple ID, device serial number, IDFA, or email address. Its purpose is to mitigate credential cloning and emulator abuse on the iOS Provii wallet at issuance.

FieldDetail
Data locationApple-operated infrastructure
GDPR complianceApple Developer Program Licence Agreement with Schedule 2 (DPA)
PurposeHardware-backed attestation for iOS wallet at issuance

Google LLC operates the Play Integrity API as a data processor for the attestation verdict returned to Provii. It handles the Play Integrity verdict (app integrity, device integrity, licence verdict, Play Protect verdict), nonce supplied by provii-issuer, package name, and certificate hash. It does not receive a Google account identifier, advertising identifier, or precise location. Its purpose is to mitigate credential cloning, repackaging attacks, and emulator abuse on the Android Provii wallet at issuance.

FieldDetail
Data locationGoogle global infrastructure
GDPR complianceGoogle Play Developer Distribution Agreement with Data Processing and Security Terms
PurposeDevice-integrity attestation for Android wallet at issuance

Transactional email sub-processors

Resend, Inc. operates as a data processor for transactional email. It handles the recipient email address, recipient display name where present, email body (HTML and plain text), and sender address. It does not receive age verification data, wallet identifiers, attestations, or children’s data. It is used for low-volume transactional email tied to administrator and verifier onboarding; it is not used for marketing.

FieldDetail
Data locationPrimarily US-based infrastructure
GDPR complianceResend DPA with EU SCCs for transfers out of the EEA
Security certificationsSOC 2 Type II

Authentication sub-processors

Silverhand Inc., operator of Logto, acts as a data processor for administrator authentication. It handles the administrator email address, Logto user identifier, organisation membership, role assignments, MFA factor metadata (TOTP seed reference, WebAuthn credential identifier, phone number for SMS OTP where enabled), session and refresh tokens, and sign-in events. It does not receive wallet data, age verification data, or children’s data. It provides OAuth 2.0 and OpenID Connect for the Provii administrator surface (admin-portal) and officer authentication in provii-issuer; end-user wallet flows do not interact with Logto.

FieldDetail
Data locationLogto hosted tenant at auth.provii.app
GDPR complianceLogto DPA with EU SCCs
PurposeAdministrator and officer identity provider

Development tools (not production sub-processors of end-user personal data)

GitHub acts as a development tool rather than a production sub-processor of end-user personal data. It handles source code, CI/CD logs, build artefacts, and administrator sign-in events for the GitHub organisation. It does not receive age verification data, wallet identifiers, attestations, or children’s data. It is tracked under UC-070 and UC-144 (vendor and supply-chain management) rather than UC-147 (sub-processor management).

FieldDetail
Data locationUnited States (GitHub.com)
GDPR complianceGitHub Enterprise Cloud Data Protection Addendum with Standard Contractual Clauses
Security certificationsSOC 2 Type II
Data retentionIndefinite (version control)

Package Registry Sub-Processors

npm Registry:

  • Data Processed. Published packages (public)
  • Data Location. United States
  • Purpose. Public package distribution only
  • No PII. Only package metadata and code

Crates.io:

  • Data Processed. Published crates (public)
  • Data Location. United States
  • Purpose. Public package distribution only
  • No PII. Only package metadata and code

Maven Central / Google Maven:

  • Data Processed. Build-time dependencies only
  • No Runtime Data. Used during development only

Cryptographic Key Management

Cloudflare Secrets Store:

  • Data Stored. Master Encryption Keys (MEK), API keys, HMAC keys
  • Encryption. Hardware Security Modules (HSMs)
  • Access Control. Service bindings only (no human access)
  • Rotation. Automated key rotation with versioning

Evidence: provii-verifier/wrangler.toml (Lines 126-164):

[[secrets_store_secrets]]
binding = "VERIFIER_MEK"
store_id = "<redacted: internal Cloudflare Secrets Store resource ID>"
secret_name = "VERIFIER_MEK"

[[secrets_store_secrets]]
binding = "VERIFIER_MEK_V1"
store_id = "<redacted: internal Cloudflare Secrets Store resource ID>"
secret_name = "VERIFIER_MEK_V1"

# Supports key rotation with multiple versions active

Control Mapping

UC-070: Vendor Management

Control Requirement: Maintain inventory of third-party vendors and assess their security posture.

Evidence:

  1. Vendor Inventory: Complete inventory documented above (Cloudflare, GitHub, npm, crates.io, etc.)
  2. Security Assessment: SOC 2 / ISO 27001 certifications verified for critical vendors
  3. Contract Review: DPAs and security clauses documented in supplier-management.md
  4. Monitoring: Status pages monitored, security advisories reviewed

Reference: /trust/security/supplier-management.md

UC-144: Supply Chain Security Policy

Control Requirement: Implement supply chain security measures to prevent unauthorized modifications.

Evidence:

  1. SLSA Level 3: Hermetic builds, signed provenance, ephemeral environments
  2. Signed Commits: Sigstore keyless signing on all releases
  3. Provenance: in-toto attestations for all artifacts
  4. Transparency: Rekor transparency log entries

Reference: /trust/developers/supply-chain-security.mdx

UC-145: Dependency Vulnerability Scanning

Control Requirement: Regularly scan dependencies for known vulnerabilities.

Evidence:

  1. Automated Scanning: Dependabot (weekly), cargo audit (CI/CD), npm audit (CI/CD)
  2. Daily Scans: Security-audit.yml runs daily at 2 AM UTC
  3. Trivy: Filesystem vulnerability scanning
  4. CodeQL: Static analysis for security issues
  5. Fail on High: Builds fail if high-severity vulnerabilities detected

Files:

  • provii-issuer/.github/workflows/security-audit.yml
  • provii-agegate/.github/workflows/secure-build.yml (Lines 59-60)
  • provii-verifier/.github/workflows/ci.yml (Lines 74-85)

UC-146: License Compliance

Control Requirement: Ensure third-party dependencies comply with licensing requirements.

Evidence:

  1. License Policy: All Maelstrom AI code dual-licensed MIT OR Apache-2.0
  2. Dependency Licenses: Predominantly MIT/Apache-2.0 (permissive)
  3. GPL Denial: cargo deny explicitly rejects GPL-3.0, AGPL-3.0
  4. Dependency Review: GitHub dependency review action checks licences on PRs

Files:

  • provii-crypto/Cargo.toml (Line 25)
  • provii-issuer/.github/workflows/security-audit.yml (Lines 49-62, 74-76)

UC-147: Sub-Processor Management

Control Requirement: Maintain list of sub-processors and ensure GDPR compliance.

Evidence:

The canonical sub-processor roster is maintained at /legal/sub-processors (version 1.1, effective 14 April 2026), which carries a completeness attestation and names the source-code sweep that backs it. As of that attestation, five sub-processors are engaged in production:

#Sub-processorPurpose
1Cloudflare, Inc.Edge compute, KV, Durable Objects, R2, Workers Logs, Cloudflare managed challenge, Super Bot Fight Mode, WAF, Secrets Store, DNS
2Apple Inc. (App Attest service)Hardware-backed attestation for the iOS Provii wallet at issuance
3Google LLC (Play Integrity API)Device-integrity attestation for the Android Provii wallet at issuance
4Resend, Inc.Transactional email delivery for administrator and verifier onboarding
5Silverhand Inc. (Logto)OAuth 2.0 and OpenID Connect identity provider for the administrator surface and officer authentication in provii-issuer

GitHub is a development tool rather than a production sub-processor for end-user personal data; it is covered separately under UC-070 and UC-144 as a supply chain vendor.

Stripe remains a planned payment processor, not live in production. It will be added to the canonical list when the billing integration lands, with 30 days’ advance notice to controllers as required under SCC Module 2 Clause 9(a) Option 2.

Supporting artefacts:

ArtefactLocation
Canonical sub-processor list/legal/sub-processors version 1.1
Data Processing AddendaCloudflare master DPA with EU SCCs and UK IDTA, Apple Developer Program Schedule 2 DPA, Google Play Developer Data Processing and Security Terms, Resend DPA, Logto DPA
Data flows and retentionROPA and per-sub-processor tables at /legal/sub-processors
Transparency disclosuresPrivacy Policy and DPIA
Change notification30 days’ advance notice mechanism documented at /legal/sub-processors#notification-of-changes

Reference: “Sub-Processors & Data Processing” section above (this document) and /legal/sub-processors (canonical).

UC-148: Artifact Verification

Control Requirement: Provide mechanisms for users to verify integrity of distributed artifacts.

Evidence:

  1. Checksums: SHA256 checksums for all artifacts
  2. Signatures: Sigstore signatures with keyless signing
  3. SRI Hashes: Subresource Integrity hashes for browser bundles
  4. Provenance: SLSA provenance attestations (in-toto format)
  5. Verification Guide: Complete documentation for end users

Files:

  • /trust/developers/artifact-verification.mdx
  • provii-agegate/.github/workflows/secure-build.yml (Lines 132-161, 196-236)

Gap Analysis

Current State: Strong

Strengths:

  1. SLSA Level 3 supply chain security implemented
  2. Automated dependency scanning (Dependabot, cargo audit, npm audit)
  3. Keyless cryptographic signing with Sigstore
  4. Hermetic builds with locked dependencies
  5. provenance generation
  6. License compliance enforcement
  7. Vendor security assessment documented
  8. Sub-processor DPAs in place

⚠️ Areas for Enhancement:

  1. Branch Protection: Two-person review is not feasible for a sole operator and is accepted as a structural limitation; signed provenance and hermetic builds are in place as compensating controls
  2. SBOM Generation: Software Bill of Materials not yet automated
  3. VEX Documents: Vulnerability Exploitability eXchange not implemented
  4. Bit-for-bit Reproducibility: Not yet achieved (SOURCE_DATE_EPOCH not set)
  5. Dependency Review Policy: No formal policy document (relies on automated tools)

Recommendations

Short-term (1-3 months):

  1. Generate SBOMs during build process (CycloneDX or SPDX format)
  2. Document formal dependency review policy

Medium-term (3-6 months):

  1. Implement VEX documents for vulnerability disclosure
  2. Achieve bit-for-bit reproducible builds
  3. Automate license compliance reporting
  4. Implement runtime attestation verification

Long-term (6-12 months):

  1. Migrate to hermetic container-based builds
  2. Implement automated vulnerability patching
  3. Establish vendor security reassessment schedule
  4. Create public transparency report for dependencies

Conclusion

Maelstrom AI has implemented third-party dependency management and supply chain security controls that meet or exceed industry best practices:

  1. Complete Vendor Inventory: All critical vendors documented with security assessments
  2. Dependency Tracking: tracking across 4 ecosystems (Rust, JavaScript, Android, iOS)
  3. Supply Chain Security: SLSA Level 3 implementation (two-person review accepted as sole-operator limitation; compensating controls in place)
  4. Automated Scanning: Daily vulnerability scans, weekly dependency updates
  5. Cryptographic Signing: Keyless signing with Sigstore, non-falsifiable provenance
  6. License Compliance: Enforced via automated tools (cargo deny, dependency review)
  7. Sub-Processor Management: DPAs in place, data flows documented

Controls UC-070, UC-144, UC-145, UC-146, UC-147, UC-148 are substantially addressed, with the enhancement opportunities noted above.


Document metadata:

FieldValue
Critical third-party vendors documented in this file6 (Cloudflare, GitHub, npm, Crates.io, CocoaPods, Maven Central / Google Maven)
Production sub-processors per canonical list5 (Cloudflare, Apple App Attest, Google Play Integrity, Resend, Logto/Silverhand), see /legal/sub-processors v1.1
Rust dependenciesApproximately 100 crates across provii-crypto, provii-verifier, provii-issuer, provii-mobile-sdk
JavaScript dependencies79 packages (provii-agegate)
Android dependenciesApproximately 40 libraries
iOS dependencies1 CocoaPod (YubiKit)
Evidence files analysedMore than 15 configuration files, 6 CI/CD workflows, 3 documentation files
Lines of evidence reviewedMore than 2,000 lines of configuration and workflow code
Next review date2026-11-21 (quarterly review schedule)

End of Document