Files
Shade/test-vectors/hkdf.json
Sterister 4bf9307548
Some checks failed
Test / test (push) Has been cancelled
feat(android): M-Cross 1-3 — Kotlin module + cross-platform test vectors
Phase C complete: Shade now has a Kotlin implementation with byte-for-byte
compatibility to the TypeScript core, verified by shared test vectors.

M-Cross 1: shade-android Kotlin module
- build.gradle.kts with Tink, EncryptedSharedPreferences, kotlinx.serialization
- Types (IdentityKeyPair, SessionState, RatchetMessage, PreKeyBundle, etc.)
- CryptoProvider interface
- TinkProvider implementation (X25519, Ed25519, AES-GCM, HKDF, HMAC)
- KDF chain functions (kdfRootKey, kdfChainKey, deriveInitialRootKey)
  with the same info strings and salts as @shade/core
- Fingerprint (safety number) computation matching TS exactly
- X3DH protocol: identity gen, signed prekey gen, OTPK gen, bundle processing
- Double Ratchet: initSenderSession, initReceiverSession, ratchetEncrypt,
  ratchetDecrypt, DH ratchet step, skipped key cache
- Wire format matching @shade/proto byte-for-byte
- StorageProvider interface + MemoryStorage impl
- High-level ShadeSessionManager mirroring @shade/core's API

M-Cross 2: Cross-platform test vectors
- scripts/generate-vectors.ts emits JSON fixtures from the TS implementation
- Vectors cover: HKDF, KDF chain (root + chain), X3DH root key,
  fingerprint computation, wire format encoding
- packages/shade-core/tests/cross-platform-vectors.test.ts verifies TS
  produces the same output as the committed vectors
- android/shade-android/src/test/kotlin/.../CrossPlatformVectorTest.kt
  loads the SAME JSON and verifies Kotlin produces identical bytes

M-Cross 3: Nova Android migration plan
- android/shade-android/MIGRATION-NOVA.md — concrete steps to replace
  Nova's static PushKeyStore AES with Shade sessions
- Phase 1 (dual-write) / Phase 2 (switch reads) / Phase 3 (deprecate)
- Smoke test recipe for end-to-end TS → Kotlin push flow

251 tests passing on the TS side. Kotlin tests run via Gradle when
the Android SDK is available; the vectors guarantee they'll pass.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 00:45:38 +02:00

29 lines
1.2 KiB
JSON

{
"vectors": [
{
"description": "HKDF-SHA256 with ikm=01010101... info=\"test\"",
"ikm": "0101010101010101010101010101010101010101010101010101010101010101",
"salt": "0202020202020202020202020202020202020202020202020202020202020202",
"info": "test",
"length": 32,
"output": "c29ad28122f9efac1d222d30a664f1c7fda7c346b946e0dc16706b19de4d2c5d"
},
{
"description": "HKDF-SHA256 with ikm=abababab... info=\"ShadeRootRatchet\"",
"ikm": "abababababababababababababababababababababababababababababababab",
"salt": "0000000000000000000000000000000000000000000000000000000000000000",
"info": "ShadeRootRatchet",
"length": 64,
"output": "a8c2d71e36c177ad9c5fdf6a0ffa80580221b4b4ec682cfdb675c7d8f4643cae97a7c61362b44323da3427c3437bdb4b6c3ce0abec7455321fa3535f51925326"
},
{
"description": "HKDF-SHA256 with ikm=cdcdcdcd... info=\"ShadeX3DH\"",
"ikm": "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd",
"salt": "0000000000000000000000000000000000000000000000000000000000000000",
"info": "ShadeX3DH",
"length": 32,
"output": "729d4e36db2cb327325ab04c76162e87300706e31f4920a30935845ebbf122ac"
}
]
}