{"id":49313660,"url":"https://github.com/d-date/arctic-workshop-2026","last_synced_at":"2026-04-26T14:03:30.855Z","repository":{"id":337555098,"uuid":"1143230105","full_name":"d-date/arctic-workshop-2026","owner":"d-date","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-10T08:57:27.000Z","size":44424,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-10T09:50:12.294Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/d-date.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-27T10:21:14.000Z","updated_at":"2026-02-10T09:20:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/d-date/arctic-workshop-2026","commit_stats":null,"previous_names":["d-date/arctic-workshop-2026"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/d-date/arctic-workshop-2026","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-date%2Farctic-workshop-2026","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-date%2Farctic-workshop-2026/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-date%2Farctic-workshop-2026/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-date%2Farctic-workshop-2026/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/d-date","download_url":"https://codeload.github.com/d-date/arctic-workshop-2026/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/d-date%2Farctic-workshop-2026/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32299644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-26T14:03:23.129Z","updated_at":"2026-04-26T14:03:30.845Z","avatar_url":"https://github.com/d-date.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ARCTIC Conference 2026 Workshop: Pseudo ID Verifier\n\nA hands-on iOS workshop for building a simulated ISO 18013-5 compliant mobile ID verification system.\n\n## Overview\n\nIn this workshop, participants will build **PseudoIDVerifier**, an iOS app that demonstrates the core concepts of mobile identity verification using two iPhones:\n\n- **Reader Phone** (Verifier): Initiates verification sessions and receives identity data\n- **Presentment Phone** (Holder): Presents credentials with selective disclosure and biometric approval\n\n### The Ideal Flow: NFC Tap → BLE Data Transfer\n\nISO 18013-5 and Apple's ID Verifier API define the following flow:\n\n```\n         Reader Phone                              Presentment Phone\n          (Verifier)                                   (Holder)\n    ┌──────────────────┐                        ┌──────────────────┐\n    │                  │                        │                  │\n[1] │  \"Tap to Verify\" │       NFC TAP          │  NFC Tag Ready   │\n    │  NFC Session     │◄══════════════════════►│  (HCE)           │\n    │                  │    DeviceEngagement     │                  │\n    │                  │    (CBOR + BLE UUID)    │                  │\n    ├──────────────────┤                        ├──────────────────┤\n    │                  │                        │                  │\n[2] │  BLE Connect     │◄═══ BLE Connection ═══►│  BLE Peripheral  │\n    │  (Central)       │    using UUID from NFC  │                  │\n    │                  │                        │                  │\n[3] │  Send Request    │═══ DeviceRequest ═════►│  Show Request    │\n    │  (CBOR)          │                        │  (Disclosure UI) │\n    │                  │                        │                  │\n[4] │                  │                        │  Face ID Auth     │\n    │                  │                        │  Touch ID Auth    │\n    │                  │                        │                  │\n[5] │  Receive         │◄══ DeviceResponse ════│  Send Response   │\n    │  (CBOR + mdoc)   │                        │  (filtered mdoc) │\n    │                  │                        │                  │\n[6] │  CBOR Decode     │                        │                  │\n    │  Display Key-Values   │                        │                  │\n    └──────────────────┘                        └──────────────────┘\n```\n\n### iOS Technical Constraints: Why NFC Tap Cannot Be Reproduced\n\n**Step [1] NFC TAP** in the flow above cannot be implemented in third-party apps:\n\n| Feature | Status on iOS | This Workshop |\n|---------|---------------|---------------|\n| NFC Tag **Reading** (Reader) | Possible with `NFCNDEFReaderSession` | Reference implementation provided |\n| NFC Tag **Emulation** (Holder) | HCE available since iOS 18.2 via NFC \u0026 SE Platform, but requires entitlement request to Apple; unclear if general developers can obtain approval | **Substituted with direct BLE connection** |\n| `CardSession` (iOS 17.4+) | EEA only / payment use only | Out of scope |\n| Apple ID Verifier API | `ProximityReader` framework / dedicated entitlement required | Concepts explained |\n\n**Why Apple's ID Verifier API works:**\n1. Reader side: `ProximityReader` performs NFC polling via Enhanced Contactless Polling (ECP)\n2. Holder side: Apple Wallet returns `DeviceEngagement` as an NDEF tag at the system level\n3. Both are Apple's proprietary implementation -- cannot be reproduced by third parties\n\n### Actual Flow in This Workshop\n\nInstead of NFC tag emulation, we use direct BLE connection:\n\n```\n         Reader Phone                              Presentment Phone\n          (Verifier)                                   (Holder)\n    ┌──────────────────┐                        ┌──────────────────┐\n    │                  │                        │                  │\n[1] │  \"Tap to Verify\" │                        │ \"Present ID\"     │\n    │  BLE Scanning    │                        │  BLE Advertising │\n    │                  │                        │                  │\n[2] │  BLE Connect     │◄═══ BLE Connection ═══►│  BLE Peripheral  │\n    │  (Central)       │                        │                  │\n    │                  │                        │                  │\n[3] │  Send Request    │═══ DeviceRequest ═════►│  Show Request    │\n    │  (CBOR)          │                        │  (Disclosure UI) │\n    │                  │                        │                  │\n[4] │                  │                        │  Face ID Auth     │\n    │                  │                        │                  │\n[5] │  Receive         │◄══ DeviceResponse ════│  Send Response   │\n    │  (CBOR + mdoc)   │                        │  (filtered mdoc) │\n    │                  │                        │                  │\n[6] │  CBOR Decode     │                        │                  │\n    │  Display Key-Values   │                        │                  │\n    └──────────────────┘                        └──────────────────┘\n```\n\n\u003e All steps other than NFC tag emulation (BLE connection, CBOR encoding/decoding,\n\u003e selective attribute disclosure, biometric authentication) are implemented in compliance with ISO 18013-5.\n\n## Project Structure\n\n```\narctic-workshop-2026/\n├── initial/                    # Starter project with TODOs\n│   └── PseudoIDVerifier/\n│       └── PseudoIDVerifier/\n│           ├── Models/         # Data structures\n│           ├── Services/       # Core functionality (TODOs here)\n│           └── Views/          # SwiftUI views\n├── completed/                  # Reference implementation\n│   └── PseudoIDVerifier/\n│       └── PseudoIDVerifier/\n│           ├── Models/\n│           ├── Services/       # Fully implemented\n│           └── Views/\n└── Documentation.docc/         # Step-by-step tutorials\n```\n\n## Getting Started\n\n### Prerequisites\n\n- Xcode 15.0 or later\n- Two iPhones running iOS 17.0+\n- Apple Developer account (for device testing)\n\n### Setup\n\n1. Clone this repository\n2. Open `initial/PseudoIDVerifier/PseudoIDVerifier.xcodeproj` in Xcode\n3. Update the bundle identifier and signing team\n4. Build and run on two devices\n\n### Workshop Flow\n\n1. **Understanding mDL** - Learn ISO 18013-5 data structures\n2. **CBOR Encoding** - Implement binary serialization\n3. **NFC Handshake** - Understand device engagement (includes learning iOS constraints)\n4. **BLE Transport** - Build the communication layer\n5. **Selective Disclosure** - Implement privacy-preserving data sharing\n6. **Biometric Authentication** - Add Face ID/Touch ID approval\n7. **Integration Testing** - Test the complete flow\n\n## Documentation\n\nOpen the DocC documentation in Xcode:\n\n```bash\ncd Documentation.docc\nopen ../initial/PseudoIDVerifier/PseudoIDVerifier.xcodeproj\n# Product \u003e Build Documentation\n```\n\nOr read the markdown files directly in `Documentation.docc/`.\n\n## Key Concepts\n\n### ISO 18013-5\n\nThis workshop simulates the ISO 18013-5 standard for mobile driving licenses (mDL):\n\n- **mdoc**: Mobile document containing identity attributes\n- **IssuerSigned**: Attributes signed by the credential issuer\n- **DeviceSigned**: Proof that the device holds the credential\n- **Selective Disclosure**: Share only requested attributes\n- **DeviceEngagement**: Connection establishment data (CBOR-encoded)\n\n### Architecture\n\n| Component | Description |\n|-----------|-------------|\n| `MDoc` | Mobile document data structure |\n| `CBORService` | CBOR encoding/decoding |\n| `BLEService` | Bluetooth communication (Central \u0026 Peripheral) |\n| `NFCService` | NFC handover (Reader-side reference implementation / iOS HCE constraint) |\n| `AuthenticationService` | Biometric approval (Face ID / Touch ID) |\n| `CryptoService` | ECDSA signing, ECDH key agreement |\n\n### Communication Flow\n\n1. Reader starts BLE scanning (Tap to Pay style UI)\n2. Holder starts BLE advertising\n3. Devices connect over BLE\n4. Reader sends `DeviceRequest` (CBOR)\n5. Holder shows selective disclosure request to user\n6. User approves with Face ID / Touch ID\n7. Holder sends `DeviceResponse` with filtered mdoc (CBOR)\n8. Reader decodes CBOR and displays verified key-value attributes\n\n## iOS Technical Constraints\n\nThis workshop teaches **what is and isn't possible** on iOS for NFC-BLE identity verification:\n\n### What This Workshop Implements (Fully Functional)\n\n- BLE Central/Peripheral communication\n- CBOR encoding/decoding per ISO 18013-5\n- mdoc data structures (IssuerSigned, DeviceSigned)\n- Selective disclosure filtering\n- Face ID / Touch ID biometric approval\n- DeviceRequest / DeviceResponse protocol\n\n### What iOS Cannot Do (Explained in Documentation)\n\n- **NFC Tag Emulation (HCE)** — Available since iOS 18.2 but requires entitlement request; general developer availability uncertain\n- **`ProximityReader` without entitlement** — requires Apple contract\n- **Cross-app NFC tag emulation** — no public API exists\n\n### Related Apple Technologies (Explained in Documentation)\n\n- **Apple ID Verifier API** (`ProximityReader` framework)\n- **Enhanced Contactless Polling** (ECP)\n- **NFC \u0026 SE Platform** (iOS 18.2+ for HCE, requires entitlement request)\n- **`CardSession`** (iOS 17.4+, EEA only)\n\n## Files to Complete\n\nIn the `initial/` project, look for `fatalError(\"TODO:\")` comments:\n\n- `Services/CBORService.swift` - CBOR encoding/decoding\n- `Services/BLEService.swift` - BLE communication\n- `Services/NFCService.swift` - NFC handover (Reader-side reference implementation)\n- `Services/AuthenticationService.swift` - Biometric auth\n\n## Resources\n\n- [ISO 18013-5 Standard](https://www.iso.org/standard/69084.html)\n- [Apple CoreBluetooth](https://developer.apple.com/documentation/corebluetooth)\n- [Apple CoreNFC](https://developer.apple.com/documentation/corenfc)\n- [Apple ProximityReader (ID Verifier)](https://developer.apple.com/documentation/proximityreader)\n- [Apple LocalAuthentication](https://developer.apple.com/documentation/localauthentication)\n- [SwiftCBOR Library](https://github.com/valpackett/SwiftCBOR)\n\n## License\n\nMIT License - See LICENSE file for details.\n\n---\n\n**ARCTIC Conference 2026** - Building the Future of Digital Identity\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd-date%2Farctic-workshop-2026","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fd-date%2Farctic-workshop-2026","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fd-date%2Farctic-workshop-2026/lists"}